feat: ✨ add header, theme-toggle, button, dropdown-menu

by Sivritkin Dmitriy

1@@ -19,9 +19,12 @@
2     "typecheck": "tsc --noEmit --pretty"
3   },
4   "dependencies": {
5+    "@radix-ui/react-dropdown-menu": "^2.0.6",
6     "@radix-ui/react-icons": "^1.3.0",
7+    "@radix-ui/react-slot": "^1.0.2",
8     "class-variance-authority": "^0.7.0",
9     "clsx": "^2.1.1",
10+    "lucide-react": "^0.395.0",
11     "next": "14.2.4",
12     "next-themes": "^0.3.0",
13     "react": "^18",@@ -0,0 +1 @@
14+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-git-graph"><circle cx="5" cy="6" r="3"/><path d="M5 9v6"/><circle cx="5" cy="18" r="3"/><path d="M12 3v18"/><circle cx="19" cy="6" r="3"/><path d="M16 15.7A9 9 0 0 0 19 9"/></svg>@@ -2,7 +2,8 @@ import type { Metadata } from "next";
15 import { Rubik as FontSans } from "next/font/google";
16 import "./globals.css";
17 import { ThemeProvider } from "~/app/providers/theme";
18-import { cn } from "~/lib/utils";
19+import { cn } from "~/shared/lib/utils";
20+import { Header } from "~/components/header";
21 
22 const fontSans = FontSans({ subsets: ["latin"], variable: "--font-sans" });
23 
24@@ -32,6 +33,7 @@ export default function RootLayout({
25           disableTransitionOnChange
26         >
27           <div className="relative flex min-h-screen flex-col">
28+            <Header />
29             <main className="flex-1">{children}</main>
30           </div>
31         </ThemeProvider>@@ -0,0 +1,31 @@
32+import Link from "next/link";
33+import { ThemeToggle } from "~/components/theme-toggle";
34+import { GitHubLogoIcon } from "@radix-ui/react-icons";
35+import { Button } from "~/shared/ui/button";
36+import { GitGraphIcon } from "lucide-react";
37+
38+export const Header = () => {
39+  return (
40+    <header className="sticky top-0 h-16 border-b bg-background px-4 md:px-6">
41+      <div className="container flex h-full items-center justify-between gap-4">
42+        <nav className="flex flex-row items-center gap-6 text-lg text-xs font-medium md:gap-5 md:text-sm lg:gap-6">
43+          <Link
44+            href="/"
45+            className="flex items-center gap-2 text-lg font-semibold md:text-base"
46+          >
47+            <GitGraphIcon className="h-6 w-6" /> Commit Explorer
48+            <span className="sr-only">Commit Explorer</span>
49+          </Link>
50+        </nav>
51+        <div className="flex items-center gap-3">
52+          <Button variant="outline" size="icon" asChild>
53+            <Link href="https://github.com/velenyx/github-commit-explorer">
54+              <GitHubLogoIcon className="h-[1.2rem] w-[1.2rem]" />
55+            </Link>
56+          </Button>
57+          <ThemeToggle />
58+        </div>
59+      </div>
60+    </header>
61+  );
62+};@@ -0,0 +1,40 @@
63+"use client";
64+
65+import * as React from "react";
66+import { MoonIcon, SunIcon } from "lucide-react";
67+import { useTheme } from "next-themes";
68+
69+import { Button } from "~/shared/ui/button";
70+import {
71+  DropdownMenu,
72+  DropdownMenuContent,
73+  DropdownMenuItem,
74+  DropdownMenuTrigger,
75+} from "~/shared/ui/dropdown-menu";
76+
77+export const ThemeToggle = () => {
78+  const { setTheme } = useTheme();
79+
80+  return (
81+    <DropdownMenu>
82+      <DropdownMenuTrigger asChild>
83+        <Button variant="outline" size="icon">
84+          <SunIcon className="h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
85+          <MoonIcon className="absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />
86+          <span className="sr-only">Toggle theme</span>
87+        </Button>
88+      </DropdownMenuTrigger>
89+      <DropdownMenuContent align="end">
90+        <DropdownMenuItem onClick={() => setTheme("light")}>
91+          Light
92+        </DropdownMenuItem>
93+        <DropdownMenuItem onClick={() => setTheme("dark")}>
94+          Dark
95+        </DropdownMenuItem>
96+        <DropdownMenuItem onClick={() => setTheme("system")}>
97+          System
98+        </DropdownMenuItem>
99+      </DropdownMenuContent>
100+    </DropdownMenu>
101+  );
102+};@@ -0,0 +1,57 @@
103+import * as React from "react"
104+import { Slot } from "@radix-ui/react-slot"
105+import { cva, type VariantProps } from "class-variance-authority"
106+
107+import { cn } from "~/shared/lib/utils"
108+
109+const buttonVariants = cva(
110+  "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",
111+  {
112+    variants: {
113+      variant: {
114+        default:
115+          "bg-primary text-primary-foreground shadow hover:bg-primary/90",
116+        destructive:
117+          "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
118+        outline:
119+          "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
120+        secondary:
121+          "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
122+        ghost: "hover:bg-accent hover:text-accent-foreground",
123+        link: "text-primary underline-offset-4 hover:underline",
124+      },
125+      size: {
126+        default: "h-9 px-4 py-2",
127+        sm: "h-8 rounded-md px-3 text-xs",
128+        lg: "h-10 rounded-md px-8",
129+        icon: "h-9 w-9",
130+      },
131+    },
132+    defaultVariants: {
133+      variant: "default",
134+      size: "default",
135+    },
136+  }
137+)
138+
139+export interface ButtonProps
140+  extends React.ButtonHTMLAttributes<HTMLButtonElement>,
141+    VariantProps<typeof buttonVariants> {
142+  asChild?: boolean
143+}
144+
145+const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
146+  ({ className, variant, size, asChild = false, ...props }, ref) => {
147+    const Comp = asChild ? Slot : "button"
148+    return (
149+      <Comp
150+        className={cn(buttonVariants({ variant, size, className }))}
151+        ref={ref}
152+        {...props}
153+      />
154+    )
155+  }
156+)
157+Button.displayName = "Button"
158+
159+export { Button, buttonVariants }@@ -0,0 +1,205 @@
160+"use client"
161+
162+import * as React from "react"
163+import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"
164+import {
165+  CheckIcon,
166+  ChevronRightIcon,
167+  DotFilledIcon,
168+} from "@radix-ui/react-icons"
169+
170+import { cn } from "~/shared/lib/utils"
171+
172+const DropdownMenu = DropdownMenuPrimitive.Root
173+
174+const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger
175+
176+const DropdownMenuGroup = DropdownMenuPrimitive.Group
177+
178+const DropdownMenuPortal = DropdownMenuPrimitive.Portal
179+
180+const DropdownMenuSub = DropdownMenuPrimitive.Sub
181+
182+const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup
183+
184+const DropdownMenuSubTrigger = React.forwardRef<
185+  React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,
186+  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {
187+    inset?: boolean
188+  }
189+>(({ className, inset, children, ...props }, ref) => (
190+  <DropdownMenuPrimitive.SubTrigger
191+    ref={ref}
192+    className={cn(
193+      "flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent",
194+      inset && "pl-8",
195+      className
196+    )}
197+    {...props}
198+  >
199+    {children}
200+    <ChevronRightIcon className="ml-auto h-4 w-4" />
201+  </DropdownMenuPrimitive.SubTrigger>
202+))
203+DropdownMenuSubTrigger.displayName =
204+  DropdownMenuPrimitive.SubTrigger.displayName
205+
206+const DropdownMenuSubContent = React.forwardRef<
207+  React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,
208+  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>
209+>(({ className, ...props }, ref) => (
210+  <DropdownMenuPrimitive.SubContent
211+    ref={ref}
212+    className={cn(
213+      "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
214+      className
215+    )}
216+    {...props}
217+  />
218+))
219+DropdownMenuSubContent.displayName =
220+  DropdownMenuPrimitive.SubContent.displayName
221+
222+const DropdownMenuContent = React.forwardRef<
223+  React.ElementRef<typeof DropdownMenuPrimitive.Content>,
224+  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>
225+>(({ className, sideOffset = 4, ...props }, ref) => (
226+  <DropdownMenuPrimitive.Portal>
227+    <DropdownMenuPrimitive.Content
228+      ref={ref}
229+      sideOffset={sideOffset}
230+      className={cn(
231+        "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md",
232+        "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
233+        className
234+      )}
235+      {...props}
236+    />
237+  </DropdownMenuPrimitive.Portal>
238+))
239+DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName
240+
241+const DropdownMenuItem = React.forwardRef<
242+  React.ElementRef<typeof DropdownMenuPrimitive.Item>,
243+  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {
244+    inset?: boolean
245+  }
246+>(({ className, inset, ...props }, ref) => (
247+  <DropdownMenuPrimitive.Item
248+    ref={ref}
249+    className={cn(
250+      "relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
251+      inset && "pl-8",
252+      className
253+    )}
254+    {...props}
255+  />
256+))
257+DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName
258+
259+const DropdownMenuCheckboxItem = React.forwardRef<
260+  React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,
261+  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>
262+>(({ className, children, checked, ...props }, ref) => (
263+  <DropdownMenuPrimitive.CheckboxItem
264+    ref={ref}
265+    className={cn(
266+      "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
267+      className
268+    )}
269+    checked={checked}
270+    {...props}
271+  >
272+    <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
273+      <DropdownMenuPrimitive.ItemIndicator>
274+        <CheckIcon className="h-4 w-4" />
275+      </DropdownMenuPrimitive.ItemIndicator>
276+    </span>
277+    {children}
278+  </DropdownMenuPrimitive.CheckboxItem>
279+))
280+DropdownMenuCheckboxItem.displayName =
281+  DropdownMenuPrimitive.CheckboxItem.displayName
282+
283+const DropdownMenuRadioItem = React.forwardRef<
284+  React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,
285+  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>
286+>(({ className, children, ...props }, ref) => (
287+  <DropdownMenuPrimitive.RadioItem
288+    ref={ref}
289+    className={cn(
290+      "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
291+      className
292+    )}
293+    {...props}
294+  >
295+    <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
296+      <DropdownMenuPrimitive.ItemIndicator>
297+        <DotFilledIcon className="h-4 w-4 fill-current" />
298+      </DropdownMenuPrimitive.ItemIndicator>
299+    </span>
300+    {children}
301+  </DropdownMenuPrimitive.RadioItem>
302+))
303+DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName
304+
305+const DropdownMenuLabel = React.forwardRef<
306+  React.ElementRef<typeof DropdownMenuPrimitive.Label>,
307+  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {
308+    inset?: boolean
309+  }
310+>(({ className, inset, ...props }, ref) => (
311+  <DropdownMenuPrimitive.Label
312+    ref={ref}
313+    className={cn(
314+      "px-2 py-1.5 text-sm font-semibold",
315+      inset && "pl-8",
316+      className
317+    )}
318+    {...props}
319+  />
320+))
321+DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName
322+
323+const DropdownMenuSeparator = React.forwardRef<
324+  React.ElementRef<typeof DropdownMenuPrimitive.Separator>,
325+  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>
326+>(({ className, ...props }, ref) => (
327+  <DropdownMenuPrimitive.Separator
328+    ref={ref}
329+    className={cn("-mx-1 my-1 h-px bg-muted", className)}
330+    {...props}
331+  />
332+))
333+DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName
334+
335+const DropdownMenuShortcut = ({
336+  className,
337+  ...props
338+}: React.HTMLAttributes<HTMLSpanElement>) => {
339+  return (
340+    <span
341+      className={cn("ml-auto text-xs tracking-widest opacity-60", className)}
342+      {...props}
343+    />
344+  )
345+}
346+DropdownMenuShortcut.displayName = "DropdownMenuShortcut"
347+
348+export {
349+  DropdownMenu,
350+  DropdownMenuTrigger,
351+  DropdownMenuContent,
352+  DropdownMenuItem,
353+  DropdownMenuCheckboxItem,
354+  DropdownMenuRadioItem,
355+  DropdownMenuLabel,
356+  DropdownMenuSeparator,
357+  DropdownMenuShortcut,
358+  DropdownMenuGroup,
359+  DropdownMenuPortal,
360+  DropdownMenuSub,
361+  DropdownMenuSubContent,
362+  DropdownMenuSubTrigger,
363+  DropdownMenuRadioGroup,
364+}@@ -12,7 +12,7 @@ __metadata:
365   languageName: node
366   linkType: hard
367 
368-"@babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.24.1":
369+"@babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.24.1":
370   version: 7.24.7
371   resolution: "@babel/runtime@npm:7.24.7"
372   dependencies:
373@@ -63,6 +63,44 @@ __metadata:
374   languageName: node
375   linkType: hard
376 
377+"@floating-ui/core@npm:^1.0.0":
378+  version: 1.6.2
379+  resolution: "@floating-ui/core@npm:1.6.2"
380+  dependencies:
381+    "@floating-ui/utils": "npm:^0.2.0"
382+  checksum: 10c0/db2621dc682e7f043d6f118d087ae6a6bfdacf40b26ede561760dd53548c16e2e7c59031e013e37283801fa307b55e6de65bf3b316b96a054e4a6a7cb937c59e
383+  languageName: node
384+  linkType: hard
385+
386+"@floating-ui/dom@npm:^1.0.0":
387+  version: 1.6.5
388+  resolution: "@floating-ui/dom@npm:1.6.5"
389+  dependencies:
390+    "@floating-ui/core": "npm:^1.0.0"
391+    "@floating-ui/utils": "npm:^0.2.0"
392+  checksum: 10c0/ebdc14806f786e60df8e7cc2c30bf9cd4d75fe734f06d755588bbdef2f60d0a0f21dffb14abdc58dea96e5577e2e366feca6d66ba962018efd1bc91a3ece4526
393+  languageName: node
394+  linkType: hard
395+
396+"@floating-ui/react-dom@npm:^2.0.0":
397+  version: 2.1.0
398+  resolution: "@floating-ui/react-dom@npm:2.1.0"
399+  dependencies:
400+    "@floating-ui/dom": "npm:^1.0.0"
401+  peerDependencies:
402+    react: ">=16.8.0"
403+    react-dom: ">=16.8.0"
404+  checksum: 10c0/9ee44dfeb27f585fb1e0114cbe37c72ff5d34149900f4f3013f6b0abf8c3365eab13286c360f97fbe0c44bb91a745e7a4c18b82d111990b45a7a7796dc55e461
405+  languageName: node
406+  linkType: hard
407+
408+"@floating-ui/utils@npm:^0.2.0":
409+  version: 0.2.2
410+  resolution: "@floating-ui/utils@npm:0.2.2"
411+  checksum: 10c0/b2becdcafdf395af1641348da0031ff1eaad2bc60c22e14bd3abad4acfe2c8401e03097173d89a2f646a99b75819a78ef21ebb2572cab0042a56dd654b0065cd
412+  languageName: node
413+  linkType: hard
414+
415 "@humanwhocodes/config-array@npm:^0.11.14":
416   version: 0.11.14
417   resolution: "@humanwhocodes/config-array@npm:0.11.14"
418@@ -279,6 +317,190 @@ __metadata:
419   languageName: node
420   linkType: hard
421 
422+"@radix-ui/primitive@npm:1.0.1":
423+  version: 1.0.1
424+  resolution: "@radix-ui/primitive@npm:1.0.1"
425+  dependencies:
426+    "@babel/runtime": "npm:^7.13.10"
427+  checksum: 10c0/912216455537db3ca77f3e7f70174fb2b454fbd4a37a0acb7cfadad9ab6131abdfb787472242574460a3c301edf45738340cc84f6717982710082840fde7d916
428+  languageName: node
429+  linkType: hard
430+
431+"@radix-ui/react-arrow@npm:1.0.3":
432+  version: 1.0.3
433+  resolution: "@radix-ui/react-arrow@npm:1.0.3"
434+  dependencies:
435+    "@babel/runtime": "npm:^7.13.10"
436+    "@radix-ui/react-primitive": "npm:1.0.3"
437+  peerDependencies:
438+    "@types/react": "*"
439+    "@types/react-dom": "*"
440+    react: ^16.8 || ^17.0 || ^18.0
441+    react-dom: ^16.8 || ^17.0 || ^18.0
442+  peerDependenciesMeta:
443+    "@types/react":
444+      optional: true
445+    "@types/react-dom":
446+      optional: true
447+  checksum: 10c0/c931f6d7e0bac50fd1654a0303a303aff74a68a13a33a851a43a7c88677b53a92ca6557920b9105144a3002f899ce888437d20ddd7803a5c716edac99587626d
448+  languageName: node
449+  linkType: hard
450+
451+"@radix-ui/react-collection@npm:1.0.3":
452+  version: 1.0.3
453+  resolution: "@radix-ui/react-collection@npm:1.0.3"
454+  dependencies:
455+    "@babel/runtime": "npm:^7.13.10"
456+    "@radix-ui/react-compose-refs": "npm:1.0.1"
457+    "@radix-ui/react-context": "npm:1.0.1"
458+    "@radix-ui/react-primitive": "npm:1.0.3"
459+    "@radix-ui/react-slot": "npm:1.0.2"
460+  peerDependencies:
461+    "@types/react": "*"
462+    "@types/react-dom": "*"
463+    react: ^16.8 || ^17.0 || ^18.0
464+    react-dom: ^16.8 || ^17.0 || ^18.0
465+  peerDependenciesMeta:
466+    "@types/react":
467+      optional: true
468+    "@types/react-dom":
469+      optional: true
470+  checksum: 10c0/cefa56383d7451ca79e4bd5a29aaeef6c205a04297213efd149aaead82fc8cde4fb8298e20e6b3613e5696e43f814fb4489805428f6604834fb31f73c6725fa8
471+  languageName: node
472+  linkType: hard
473+
474+"@radix-ui/react-compose-refs@npm:1.0.1":
475+  version: 1.0.1
476+  resolution: "@radix-ui/react-compose-refs@npm:1.0.1"
477+  dependencies:
478+    "@babel/runtime": "npm:^7.13.10"
479+  peerDependencies:
480+    "@types/react": "*"
481+    react: ^16.8 || ^17.0 || ^18.0
482+  peerDependenciesMeta:
483+    "@types/react":
484+      optional: true
485+  checksum: 10c0/be06f8dab35b5a1bffa7a5982fb26218ddade1acb751288333e3b89d7b4a7dfb5a6371be83876dac0ec2ebe0866d295e8618b778608e1965342986ea448040ec
486+  languageName: node
487+  linkType: hard
488+
489+"@radix-ui/react-context@npm:1.0.1":
490+  version: 1.0.1
491+  resolution: "@radix-ui/react-context@npm:1.0.1"
492+  dependencies:
493+    "@babel/runtime": "npm:^7.13.10"
494+  peerDependencies:
495+    "@types/react": "*"
496+    react: ^16.8 || ^17.0 || ^18.0
497+  peerDependenciesMeta:
498+    "@types/react":
499+      optional: true
500+  checksum: 10c0/3de5761b32cc70cd61715527f29d8c699c01ab28c195ced972ccbc7025763a373a68f18c9f948c7a7b922e469fd2df7fee5f7536e3f7bad44ffc06d959359333
501+  languageName: node
502+  linkType: hard
503+
504+"@radix-ui/react-direction@npm:1.0.1":
505+  version: 1.0.1
506+  resolution: "@radix-ui/react-direction@npm:1.0.1"
507+  dependencies:
508+    "@babel/runtime": "npm:^7.13.10"
509+  peerDependencies:
510+    "@types/react": "*"
511+    react: ^16.8 || ^17.0 || ^18.0
512+  peerDependenciesMeta:
513+    "@types/react":
514+      optional: true
515+  checksum: 10c0/b1a45b4d1d5070ca3b5864b920f6c6210c962bdb519abb62b38b1baef9d06737dc3d8ecdb61860b7504a735235a539652f5977c7299ec021da84e6b0f64d988a
516+  languageName: node
517+  linkType: hard
518+
519+"@radix-ui/react-dismissable-layer@npm:1.0.5":
520+  version: 1.0.5
521+  resolution: "@radix-ui/react-dismissable-layer@npm:1.0.5"
522+  dependencies:
523+    "@babel/runtime": "npm:^7.13.10"
524+    "@radix-ui/primitive": "npm:1.0.1"
525+    "@radix-ui/react-compose-refs": "npm:1.0.1"
526+    "@radix-ui/react-primitive": "npm:1.0.3"
527+    "@radix-ui/react-use-callback-ref": "npm:1.0.1"
528+    "@radix-ui/react-use-escape-keydown": "npm:1.0.3"
529+  peerDependencies:
530+    "@types/react": "*"
531+    "@types/react-dom": "*"
532+    react: ^16.8 || ^17.0 || ^18.0
533+    react-dom: ^16.8 || ^17.0 || ^18.0
534+  peerDependenciesMeta:
535+    "@types/react":
536+      optional: true
537+    "@types/react-dom":
538+      optional: true
539+  checksum: 10c0/7e4308867aecfb07b506330c1964d94a52247ab9453725613cd326762aa13e483423c250f107219c131b0449600eb8d1576ce3159c2b96e8c978f75e46062cb2
540+  languageName: node
541+  linkType: hard
542+
543+"@radix-ui/react-dropdown-menu@npm:^2.0.6":
544+  version: 2.0.6
545+  resolution: "@radix-ui/react-dropdown-menu@npm:2.0.6"
546+  dependencies:
547+    "@babel/runtime": "npm:^7.13.10"
548+    "@radix-ui/primitive": "npm:1.0.1"
549+    "@radix-ui/react-compose-refs": "npm:1.0.1"
550+    "@radix-ui/react-context": "npm:1.0.1"
551+    "@radix-ui/react-id": "npm:1.0.1"
552+    "@radix-ui/react-menu": "npm:2.0.6"
553+    "@radix-ui/react-primitive": "npm:1.0.3"
554+    "@radix-ui/react-use-controllable-state": "npm:1.0.1"
555+  peerDependencies:
556+    "@types/react": "*"
557+    "@types/react-dom": "*"
558+    react: ^16.8 || ^17.0 || ^18.0
559+    react-dom: ^16.8 || ^17.0 || ^18.0
560+  peerDependenciesMeta:
561+    "@types/react":
562+      optional: true
563+    "@types/react-dom":
564+      optional: true
565+  checksum: 10c0/525cab53547d2ce2904518b1f66b62179d656c57c8d6dd7dbe863cc05025d8bad535f44011e2735b07fc500579c3d64d89a9a39593d4c8f91f31052d75b729e1
566+  languageName: node
567+  linkType: hard
568+
569+"@radix-ui/react-focus-guards@npm:1.0.1":
570+  version: 1.0.1
571+  resolution: "@radix-ui/react-focus-guards@npm:1.0.1"
572+  dependencies:
573+    "@babel/runtime": "npm:^7.13.10"
574+  peerDependencies:
575+    "@types/react": "*"
576+    react: ^16.8 || ^17.0 || ^18.0
577+  peerDependenciesMeta:
578+    "@types/react":
579+      optional: true
580+  checksum: 10c0/d5fd4e5aa9d9a87c8ad490b3b4992d6f1d9eddf18e56df2a2bcf8744c4332b275d73377fd193df3e6ba0ad9608dc497709beca5c64de2b834d5f5350b3c9a272
581+  languageName: node
582+  linkType: hard
583+
584+"@radix-ui/react-focus-scope@npm:1.0.4":
585+  version: 1.0.4
586+  resolution: "@radix-ui/react-focus-scope@npm:1.0.4"
587+  dependencies:
588+    "@babel/runtime": "npm:^7.13.10"
589+    "@radix-ui/react-compose-refs": "npm:1.0.1"
590+    "@radix-ui/react-primitive": "npm:1.0.3"
591+    "@radix-ui/react-use-callback-ref": "npm:1.0.1"
592+  peerDependencies:
593+    "@types/react": "*"
594+    "@types/react-dom": "*"
595+    react: ^16.8 || ^17.0 || ^18.0
596+    react-dom: ^16.8 || ^17.0 || ^18.0
597+  peerDependenciesMeta:
598+    "@types/react":
599+      optional: true
600+    "@types/react-dom":
601+      optional: true
602+  checksum: 10c0/2fce0bafcab4e16cf4ed7560bda40654223f3d0add6b231e1c607433030c14e6249818b444b7b58ee7a6ff6bbf8e192c9c81d22c3a5c88c2daade9d1f881b5be
603+  languageName: node
604+  linkType: hard
605+
606 "@radix-ui/react-icons@npm:^1.3.0":
607   version: 1.3.0
608   resolution: "@radix-ui/react-icons@npm:1.3.0"
609@@ -288,6 +510,296 @@ __metadata:
610   languageName: node
611   linkType: hard
612 
613+"@radix-ui/react-id@npm:1.0.1":
614+  version: 1.0.1
615+  resolution: "@radix-ui/react-id@npm:1.0.1"
616+  dependencies:
617+    "@babel/runtime": "npm:^7.13.10"
618+    "@radix-ui/react-use-layout-effect": "npm:1.0.1"
619+  peerDependencies:
620+    "@types/react": "*"
621+    react: ^16.8 || ^17.0 || ^18.0
622+  peerDependenciesMeta:
623+    "@types/react":
624+      optional: true
625+  checksum: 10c0/e2859ca58bea171c956098ace7ecf615cf9432f58a118b779a14720746b3adcf0351c36c75de131548672d3cd290ca238198acbd33b88dc4706f98312e9317ad
626+  languageName: node
627+  linkType: hard
628+
629+"@radix-ui/react-menu@npm:2.0.6":
630+  version: 2.0.6
631+  resolution: "@radix-ui/react-menu@npm:2.0.6"
632+  dependencies:
633+    "@babel/runtime": "npm:^7.13.10"
634+    "@radix-ui/primitive": "npm:1.0.1"
635+    "@radix-ui/react-collection": "npm:1.0.3"
636+    "@radix-ui/react-compose-refs": "npm:1.0.1"
637+    "@radix-ui/react-context": "npm:1.0.1"
638+    "@radix-ui/react-direction": "npm:1.0.1"
639+    "@radix-ui/react-dismissable-layer": "npm:1.0.5"
640+    "@radix-ui/react-focus-guards": "npm:1.0.1"
641+    "@radix-ui/react-focus-scope": "npm:1.0.4"
642+    "@radix-ui/react-id": "npm:1.0.1"
643+    "@radix-ui/react-popper": "npm:1.1.3"
644+    "@radix-ui/react-portal": "npm:1.0.4"
645+    "@radix-ui/react-presence": "npm:1.0.1"
646+    "@radix-ui/react-primitive": "npm:1.0.3"
647+    "@radix-ui/react-roving-focus": "npm:1.0.4"
648+    "@radix-ui/react-slot": "npm:1.0.2"
649+    "@radix-ui/react-use-callback-ref": "npm:1.0.1"
650+    aria-hidden: "npm:^1.1.1"
651+    react-remove-scroll: "npm:2.5.5"
652+  peerDependencies:
653+    "@types/react": "*"
654+    "@types/react-dom": "*"
655+    react: ^16.8 || ^17.0 || ^18.0
656+    react-dom: ^16.8 || ^17.0 || ^18.0
657+  peerDependenciesMeta:
658+    "@types/react":
659+      optional: true
660+    "@types/react-dom":
661+      optional: true
662+  checksum: 10c0/06926fa59cb8f5614f2e1a085ea1cbf09631ae28fb6e5d6e6d2a0a84d24979e3aca311cdb19dfdb254c1823ff85fd5250c29d4463f8f7622dd523e35df3fce1d
663+  languageName: node
664+  linkType: hard
665+
666+"@radix-ui/react-popper@npm:1.1.3":
667+  version: 1.1.3
668+  resolution: "@radix-ui/react-popper@npm:1.1.3"
669+  dependencies:
670+    "@babel/runtime": "npm:^7.13.10"
671+    "@floating-ui/react-dom": "npm:^2.0.0"
672+    "@radix-ui/react-arrow": "npm:1.0.3"
673+    "@radix-ui/react-compose-refs": "npm:1.0.1"
674+    "@radix-ui/react-context": "npm:1.0.1"
675+    "@radix-ui/react-primitive": "npm:1.0.3"
676+    "@radix-ui/react-use-callback-ref": "npm:1.0.1"
677+    "@radix-ui/react-use-layout-effect": "npm:1.0.1"
678+    "@radix-ui/react-use-rect": "npm:1.0.1"
679+    "@radix-ui/react-use-size": "npm:1.0.1"
680+    "@radix-ui/rect": "npm:1.0.1"
681+  peerDependencies:
682+    "@types/react": "*"
683+    "@types/react-dom": "*"
684+    react: ^16.8 || ^17.0 || ^18.0
685+    react-dom: ^16.8 || ^17.0 || ^18.0
686+  peerDependenciesMeta:
687+    "@types/react":
688+      optional: true
689+    "@types/react-dom":
690+      optional: true
691+  checksum: 10c0/a38c374ec65dd8d7c604af7151e96faec1743828d859dc4892e720c1803a7e1562add26aec2ddf2091defae4e15d989c028032ea481419e38c4693b3f12545c3
692+  languageName: node
693+  linkType: hard
694+
695+"@radix-ui/react-portal@npm:1.0.4":
696+  version: 1.0.4
697+  resolution: "@radix-ui/react-portal@npm:1.0.4"
698+  dependencies:
699+    "@babel/runtime": "npm:^7.13.10"
700+    "@radix-ui/react-primitive": "npm:1.0.3"
701+  peerDependencies:
702+    "@types/react": "*"
703+    "@types/react-dom": "*"
704+    react: ^16.8 || ^17.0 || ^18.0
705+    react-dom: ^16.8 || ^17.0 || ^18.0
706+  peerDependenciesMeta:
707+    "@types/react":
708+      optional: true
709+    "@types/react-dom":
710+      optional: true
711+  checksum: 10c0/fed32f8148b833fe852fb5e2f859979ffdf2fb9a9ef46583b9b52915d764ad36ba5c958a64e61d23395628ccc09d678229ee94cd112941e8fe2575021f820c29
712+  languageName: node
713+  linkType: hard
714+
715+"@radix-ui/react-presence@npm:1.0.1":
716+  version: 1.0.1
717+  resolution: "@radix-ui/react-presence@npm:1.0.1"
718+  dependencies:
719+    "@babel/runtime": "npm:^7.13.10"
720+    "@radix-ui/react-compose-refs": "npm:1.0.1"
721+    "@radix-ui/react-use-layout-effect": "npm:1.0.1"
722+  peerDependencies:
723+    "@types/react": "*"
724+    "@types/react-dom": "*"
725+    react: ^16.8 || ^17.0 || ^18.0
726+    react-dom: ^16.8 || ^17.0 || ^18.0
727+  peerDependenciesMeta:
728+    "@types/react":
729+      optional: true
730+    "@types/react-dom":
731+      optional: true
732+  checksum: 10c0/90780618b265fe794a8f1ddaa5bfd3c71a1127fa79330a14d32722e6265b44452a9dd36efe4e769129d33e57f979f6b8713e2cbf2e2755326aa3b0f337185b6e
733+  languageName: node
734+  linkType: hard
735+
736+"@radix-ui/react-primitive@npm:1.0.3":
737+  version: 1.0.3
738+  resolution: "@radix-ui/react-primitive@npm:1.0.3"
739+  dependencies:
740+    "@babel/runtime": "npm:^7.13.10"
741+    "@radix-ui/react-slot": "npm:1.0.2"
742+  peerDependencies:
743+    "@types/react": "*"
744+    "@types/react-dom": "*"
745+    react: ^16.8 || ^17.0 || ^18.0
746+    react-dom: ^16.8 || ^17.0 || ^18.0
747+  peerDependenciesMeta:
748+    "@types/react":
749+      optional: true
750+    "@types/react-dom":
751+      optional: true
752+  checksum: 10c0/67a66ff8898a5e7739eda228ab6f5ce808858da1dce967014138d87e72b6bbfc93dc1467c706d98d1a2b93bf0b6e09233d1a24d31c78227b078444c1a69c42be
753+  languageName: node
754+  linkType: hard
755+
756+"@radix-ui/react-roving-focus@npm:1.0.4":
757+  version: 1.0.4
758+  resolution: "@radix-ui/react-roving-focus@npm:1.0.4"
759+  dependencies:
760+    "@babel/runtime": "npm:^7.13.10"
761+    "@radix-ui/primitive": "npm:1.0.1"
762+    "@radix-ui/react-collection": "npm:1.0.3"
763+    "@radix-ui/react-compose-refs": "npm:1.0.1"
764+    "@radix-ui/react-context": "npm:1.0.1"
765+    "@radix-ui/react-direction": "npm:1.0.1"
766+    "@radix-ui/react-id": "npm:1.0.1"
767+    "@radix-ui/react-primitive": "npm:1.0.3"
768+    "@radix-ui/react-use-callback-ref": "npm:1.0.1"
769+    "@radix-ui/react-use-controllable-state": "npm:1.0.1"
770+  peerDependencies:
771+    "@types/react": "*"
772+    "@types/react-dom": "*"
773+    react: ^16.8 || ^17.0 || ^18.0
774+    react-dom: ^16.8 || ^17.0 || ^18.0
775+  peerDependenciesMeta:
776+    "@types/react":
777+      optional: true
778+    "@types/react-dom":
779+      optional: true
780+  checksum: 10c0/61e3ddfd1647e64fba855434ff41e8e7ba707244fe8841f78c450fbdce525383b64259279475615d030dbf1625cbffd8eeebee72d91bf6978794f5dbcf887fc0
781+  languageName: node
782+  linkType: hard
783+
784+"@radix-ui/react-slot@npm:1.0.2, @radix-ui/react-slot@npm:^1.0.2":
785+  version: 1.0.2
786+  resolution: "@radix-ui/react-slot@npm:1.0.2"
787+  dependencies:
788+    "@babel/runtime": "npm:^7.13.10"
789+    "@radix-ui/react-compose-refs": "npm:1.0.1"
790+  peerDependencies:
791+    "@types/react": "*"
792+    react: ^16.8 || ^17.0 || ^18.0
793+  peerDependenciesMeta:
794+    "@types/react":
795+      optional: true
796+  checksum: 10c0/3af6ea4891e6fa8091e666802adffe7718b3cd390a10fa9229a5f40f8efded9f3918ea01b046103d93923d41cc32119505ebb6bde76cad07a87b6cf4f2119347
797+  languageName: node
798+  linkType: hard
799+
800+"@radix-ui/react-use-callback-ref@npm:1.0.1":
801+  version: 1.0.1
802+  resolution: "@radix-ui/react-use-callback-ref@npm:1.0.1"
803+  dependencies:
804+    "@babel/runtime": "npm:^7.13.10"
805+  peerDependencies:
806+    "@types/react": "*"
807+    react: ^16.8 || ^17.0 || ^18.0
808+  peerDependenciesMeta:
809+    "@types/react":
810+      optional: true
811+  checksum: 10c0/331b432be1edc960ca148637ae6087220873ee828ceb13bd155926ef8f49e862812de5b379129f6aaefcd11be53715f3237e6caa9a33d9c0abfff43f3ba58938
812+  languageName: node
813+  linkType: hard
814+
815+"@radix-ui/react-use-controllable-state@npm:1.0.1":
816+  version: 1.0.1
817+  resolution: "@radix-ui/react-use-controllable-state@npm:1.0.1"
818+  dependencies:
819+    "@babel/runtime": "npm:^7.13.10"
820+    "@radix-ui/react-use-callback-ref": "npm:1.0.1"
821+  peerDependencies:
822+    "@types/react": "*"
823+    react: ^16.8 || ^17.0 || ^18.0
824+  peerDependenciesMeta:
825+    "@types/react":
826+      optional: true
827+  checksum: 10c0/29b069dbf09e48bca321af6272574ad0fc7283174e7d092731a10663fe00c0e6b4bde5e1b5ea67725fe48dcbe8026e7ff0d69d42891c62cbb9ca408498171fbe
828+  languageName: node
829+  linkType: hard
830+
831+"@radix-ui/react-use-escape-keydown@npm:1.0.3":
832+  version: 1.0.3
833+  resolution: "@radix-ui/react-use-escape-keydown@npm:1.0.3"
834+  dependencies:
835+    "@babel/runtime": "npm:^7.13.10"
836+    "@radix-ui/react-use-callback-ref": "npm:1.0.1"
837+  peerDependencies:
838+    "@types/react": "*"
839+    react: ^16.8 || ^17.0 || ^18.0
840+  peerDependenciesMeta:
841+    "@types/react":
842+      optional: true
843+  checksum: 10c0/3c94c78902dcb40b60083ee2184614f45c95a189178f52d89323b467bd04bcf5fdb1bc4d43debecd7f0b572c3843c7e04edbcb56f40a4b4b43936fb2770fb8ad
844+  languageName: node
845+  linkType: hard
846+
847+"@radix-ui/react-use-layout-effect@npm:1.0.1":
848+  version: 1.0.1
849+  resolution: "@radix-ui/react-use-layout-effect@npm:1.0.1"
850+  dependencies:
851+    "@babel/runtime": "npm:^7.13.10"
852+  peerDependencies:
853+    "@types/react": "*"
854+    react: ^16.8 || ^17.0 || ^18.0
855+  peerDependenciesMeta:
856+    "@types/react":
857+      optional: true
858+  checksum: 10c0/13cd0c38395c5838bc9a18238020d3bcf67fb340039e6d1cbf438be1b91d64cf6900b78121f3dc9219faeb40dcc7b523ce0f17e4a41631655690e5a30a40886a
859+  languageName: node
860+  linkType: hard
861+
862+"@radix-ui/react-use-rect@npm:1.0.1":
863+  version: 1.0.1
864+  resolution: "@radix-ui/react-use-rect@npm:1.0.1"
865+  dependencies:
866+    "@babel/runtime": "npm:^7.13.10"
867+    "@radix-ui/rect": "npm:1.0.1"
868+  peerDependencies:
869+    "@types/react": "*"
870+    react: ^16.8 || ^17.0 || ^18.0
871+  peerDependenciesMeta:
872+    "@types/react":
873+      optional: true
874+  checksum: 10c0/94c5ab31dfd3678c0cb77a30025e82b3a287577c1a8674b0d703a36d27434bc9c59790e0bebf57ed153f0b8e0d8c3b9675fc9787b9eac525a09abcda8fa9e7eb
875+  languageName: node
876+  linkType: hard
877+
878+"@radix-ui/react-use-size@npm:1.0.1":
879+  version: 1.0.1
880+  resolution: "@radix-ui/react-use-size@npm:1.0.1"
881+  dependencies:
882+    "@babel/runtime": "npm:^7.13.10"
883+    "@radix-ui/react-use-layout-effect": "npm:1.0.1"
884+  peerDependencies:
885+    "@types/react": "*"
886+    react: ^16.8 || ^17.0 || ^18.0
887+  peerDependenciesMeta:
888+    "@types/react":
889+      optional: true
890+  checksum: 10c0/b109a4b3781781c4dc641a1173f0a6fcb0b0f7b2d7cdba5848a46070c9fb4e518909a46c20a3c2efbc78737c64859c59ead837f2940e8c8394d1c503ef58773b
891+  languageName: node
892+  linkType: hard
893+
894+"@radix-ui/rect@npm:1.0.1":
895+  version: 1.0.1
896+  resolution: "@radix-ui/rect@npm:1.0.1"
897+  dependencies:
898+    "@babel/runtime": "npm:^7.13.10"
899+  checksum: 10c0/4c5159661340acc31b11e1f2ebd87a1521d39bfa287544dd2cd75b399539a4b625d38a1501c90ceae21fcca18ed164b0c3735817ff140ae334098192c110e571
900+  languageName: node
901+  linkType: hard
902+
903 "@rushstack/eslint-patch@npm:^1.3.3":
904   version: 1.10.3
905   resolution: "@rushstack/eslint-patch@npm:1.10.3"
906@@ -542,6 +1054,15 @@ __metadata:
907   languageName: node
908   linkType: hard
909 
910+"aria-hidden@npm:^1.1.1":
911+  version: 1.2.4
912+  resolution: "aria-hidden@npm:1.2.4"
913+  dependencies:
914+    tslib: "npm:^2.0.0"
915+  checksum: 10c0/8abcab2e1432efc4db415e97cb3959649ddf52c8fc815d7384f43f3d3abf56f1c12852575d00df9a8927f421d7e0712652dd5f8db244ea57634344e29ecfc74a
916+  languageName: node
917+  linkType: hard
918+
919 "aria-query@npm:^5.3.0":
920   version: 5.3.0
921   resolution: "aria-query@npm:5.3.0"
922@@ -1039,6 +1560,13 @@ __metadata:
923   languageName: node
924   linkType: hard
925 
926+"detect-node-es@npm:^1.1.0":
927+  version: 1.1.0
928+  resolution: "detect-node-es@npm:1.1.0"
929+  checksum: 10c0/e562f00de23f10c27d7119e1af0e7388407eb4b06596a25f6d79a360094a109ff285de317f02b090faae093d314cf6e73ac3214f8a5bb3a0def5bece94557fbe
930+  languageName: node
931+  linkType: hard
932+
933 "didyoumean@npm:^1.2.2":
934   version: 1.2.2
935   resolution: "didyoumean@npm:1.2.2"
936@@ -1733,6 +2261,13 @@ __metadata:
937   languageName: node
938   linkType: hard
939 
940+"get-nonce@npm:^1.0.0":
941+  version: 1.0.1
942+  resolution: "get-nonce@npm:1.0.1"
943+  checksum: 10c0/2d7df55279060bf0568549e1ffc9b84bc32a32b7541675ca092dce56317cdd1a59a98dcc4072c9f6a980779440139a3221d7486f52c488e69dc0fd27b1efb162
944+  languageName: node
945+  linkType: hard
946+
947 "get-symbol-description@npm:^1.0.2":
948   version: 1.0.2
949   resolution: "get-symbol-description@npm:1.0.2"
950@@ -1757,14 +2292,17 @@ __metadata:
951   version: 0.0.0-use.local
952   resolution: "github-commit-explorer@workspace:."
953   dependencies:
954+    "@radix-ui/react-dropdown-menu": "npm:^2.0.6"
955     "@radix-ui/react-icons": "npm:^1.3.0"
956+    "@radix-ui/react-slot": "npm:^1.0.2"
957     "@types/node": "npm:^20"
958     "@types/react": "npm:^18"
959     "@types/react-dom": "npm:^18"
960     class-variance-authority: "npm:^0.7.0"
961     clsx: "npm:^2.1.1"
962     eslint: "npm:^8"
963     eslint-config-next: "npm:14.2.4"
964+    lucide-react: "npm:^0.395.0"
965     next: "npm:14.2.4"
966     next-themes: "npm:^0.3.0"
967     postcss: "npm:^8"
968@@ -2047,6 +2585,15 @@ __metadata:
969   languageName: node
970   linkType: hard
971 
972+"invariant@npm:^2.2.4":
973+  version: 2.2.4
974+  resolution: "invariant@npm:2.2.4"
975+  dependencies:
976+    loose-envify: "npm:^1.0.0"
977+  checksum: 10c0/5af133a917c0bcf65e84e7f23e779e7abc1cd49cb7fdc62d00d1de74b0d8c1b5ee74ac7766099fb3be1b05b26dfc67bab76a17030d2fe7ea2eef867434362dfc
978+  languageName: node
979+  linkType: hard
980+
981 "ip-address@npm:^9.0.5":
982   version: 9.0.5
983   resolution: "ip-address@npm:9.0.5"
984@@ -2512,7 +3059,7 @@ __metadata:
985   languageName: node
986   linkType: hard
987 
988-"loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0":
989+"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0":
990   version: 1.4.0
991   resolution: "loose-envify@npm:1.4.0"
992   dependencies:
993@@ -2530,6 +3077,15 @@ __metadata:
994   languageName: node
995   linkType: hard
996 
997+"lucide-react@npm:^0.395.0":
998+  version: 0.395.0
999+  resolution: "lucide-react@npm:0.395.0"
1000+  peerDependencies:
1001+    react: ^16.5.1 || ^17.0.0 || ^18.0.0
1002+  checksum: 10c0/e3ae8865da0e20514e6058f908c9b0686b9117e63c53ea42bdcdbc45e87a09054be35b4698c8f185dbd57fd110e6730c9c308b50e99f7170f498372b5fbac772
1003+  languageName: node
1004+  linkType: hard
1005+
1006 "make-fetch-happen@npm:^13.0.0":
1007   version: 13.0.1
1008   resolution: "make-fetch-happen@npm:13.0.1"
1009@@ -3314,6 +3870,58 @@ __metadata:
1010   languageName: node
1011   linkType: hard
1012 
1013+"react-remove-scroll-bar@npm:^2.3.3":
1014+  version: 2.3.6
1015+  resolution: "react-remove-scroll-bar@npm:2.3.6"
1016+  dependencies:
1017+    react-style-singleton: "npm:^2.2.1"
1018+    tslib: "npm:^2.0.0"
1019+  peerDependencies:
1020+    "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0
1021+    react: ^16.8.0 || ^17.0.0 || ^18.0.0
1022+  peerDependenciesMeta:
1023+    "@types/react":
1024+      optional: true
1025+  checksum: 10c0/4e32ee04bf655a8bd3b4aacf6ffc596ae9eb1b9ba27eef83f7002632ee75371f61516ae62250634a9eae4b2c8fc6f6982d9b182de260f6c11841841e6e2e7515
1026+  languageName: node
1027+  linkType: hard
1028+
1029+"react-remove-scroll@npm:2.5.5":
1030+  version: 2.5.5
1031+  resolution: "react-remove-scroll@npm:2.5.5"
1032+  dependencies:
1033+    react-remove-scroll-bar: "npm:^2.3.3"
1034+    react-style-singleton: "npm:^2.2.1"
1035+    tslib: "npm:^2.1.0"
1036+    use-callback-ref: "npm:^1.3.0"
1037+    use-sidecar: "npm:^1.1.2"
1038+  peerDependencies:
1039+    "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0
1040+    react: ^16.8.0 || ^17.0.0 || ^18.0.0
1041+  peerDependenciesMeta:
1042+    "@types/react":
1043+      optional: true
1044+  checksum: 10c0/4952657e6a7b9d661d4ad4dfcef81b9c7fa493e35164abff99c35c0b27b3d172ef7ad70c09416dc44dd14ff2e6b38a5ec7da27e27e90a15cbad36b8fd2fd8054
1045+  languageName: node
1046+  linkType: hard
1047+
1048+"react-style-singleton@npm:^2.2.1":
1049+  version: 2.2.1
1050+  resolution: "react-style-singleton@npm:2.2.1"
1051+  dependencies:
1052+    get-nonce: "npm:^1.0.0"
1053+    invariant: "npm:^2.2.4"
1054+    tslib: "npm:^2.0.0"
1055+  peerDependencies:
1056+    "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0
1057+    react: ^16.8.0 || ^17.0.0 || ^18.0.0
1058+  peerDependenciesMeta:
1059+    "@types/react":
1060+      optional: true
1061+  checksum: 10c0/6d66f3bdb65e1ec79089f80314da97c9a005087a04ee034255a5de129a4c0d9fd0bf99fa7bf642781ac2dc745ca687aae3de082bd8afdd0d117bc953241e15ad
1062+  languageName: node
1063+  linkType: hard
1064+
1065 "react@npm:^18":
1066   version: 18.3.1
1067   resolution: "react@npm:18.3.1"
1068@@ -3950,7 +4558,7 @@ __metadata:
1069   languageName: node
1070   linkType: hard
1071 
1072-"tslib@npm:^2.4.0":
1073+"tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.4.0":
1074   version: 2.6.3
1075   resolution: "tslib@npm:2.6.3"
1076   checksum: 10c0/2598aef53d9dbe711af75522464b2104724d6467b26a60f2bdac8297d2b5f1f6b86a71f61717384aa8fd897240467aaa7bcc36a0700a0faf751293d1331db39a
1077@@ -4091,6 +4699,37 @@ __metadata:
1078   languageName: node
1079   linkType: hard
1080 
1081+"use-callback-ref@npm:^1.3.0":
1082+  version: 1.3.2
1083+  resolution: "use-callback-ref@npm:1.3.2"
1084+  dependencies:
1085+    tslib: "npm:^2.0.0"
1086+  peerDependencies:
1087+    "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0
1088+    react: ^16.8.0 || ^17.0.0 || ^18.0.0
1089+  peerDependenciesMeta:
1090+    "@types/react":
1091+      optional: true
1092+  checksum: 10c0/d232c37160fe3970c99255da19b5fb5299fb5926a5d6141d928a87feb47732c323d29be2f8137d3b1e5499c70d284cd1d9cfad703cc58179db8be24d7dd8f1f2
1093+  languageName: node
1094+  linkType: hard
1095+
1096+"use-sidecar@npm:^1.1.2":
1097+  version: 1.1.2
1098+  resolution: "use-sidecar@npm:1.1.2"
1099+  dependencies:
1100+    detect-node-es: "npm:^1.1.0"
1101+    tslib: "npm:^2.0.0"
1102+  peerDependencies:
1103+    "@types/react": ^16.9.0 || ^17.0.0 || ^18.0.0
1104+    react: ^16.8.0 || ^17.0.0 || ^18.0.0
1105+  peerDependenciesMeta:
1106+    "@types/react":
1107+      optional: true
1108+  checksum: 10c0/89f0018fd9aee1fc17c85ac18c4bf8944d460d453d0d0e04ddbc8eaddf3fa591e9c74a1f8a438a1bff368a7a2417fab380bdb3df899d2194c4375b0982736de0
1109+  languageName: node
1110+  linkType: hard
1111+
1112 "util-deprecate@npm:^1.0.2":
1113   version: 1.0.2
1114   resolution: "util-deprecate@npm:1.0.2"