11"use client" ;
22import React from "react" ;
3- import { PlotLineButton , ExportImageSettings , useCSSVariable } from "@/components/ui" ;
4- import ThemeSwitch from "@/components/ui/ThemeSwitch" ;
5- import './css/Navbar.css'
3+ import {
4+ ExportImageSettings ,
5+ PlotLineButton ,
6+ useCSSVariable ,
7+ } from "@/components/ui" ;
8+ import "./css/Navbar.css" ;
9+ import { useRef , useState } from "react" ;
10+ import { MdFlipCameraIos } from "react-icons/md" ;
11+ import { RiCloseLargeLine , RiMenu2Line } from "react-icons/ri" ;
612import { useShallow } from "zustand/shallow" ;
13+ import { Button } from "@/components/ui/button" ;
14+ import {
15+ Tooltip ,
16+ TooltipContent ,
17+ TooltipTrigger ,
18+ } from "@/components/ui/tooltip" ;
19+ import { cn } from "@/lib/utils" ;
720import { useGlobalStore , usePlotStore } from "@/utils/GlobalStates" ;
8- import { useState , useRef } from "react" ;
921import { Orthographic , Perspective } from "./Icons" ;
10- import { Button } from "@/components/ui/button"
11- import { cn } from "@/lib/utils"
12- import { MdFlipCameraIos } from "react-icons/md" ;
1322import PerformanceMode from "./PerformanceMode" ;
14- import {
15- Tooltip ,
16- TooltipContent ,
17- TooltipTrigger ,
18- } from "@/components/ui/tooltip"
19-
20-
21- // Custom rotating five-dots icon
22- const FiveDotsIcon : React . FC < { className ?: string } > = ( { className } ) => {
23- return (
24- < svg
25- viewBox = "0 0 100 100"
26- className = { className }
27- aria-hidden = "true"
28- focusable = "false"
29- >
30- { /* Grey, Red, Green, Gold, Pink arranged on a pentagon */ }
31- < circle cx = "50" cy = "20" r = "12" fill = "#9CA3AF" />
32- < circle cx = "78.53" cy = "40.73" r = "12" fill = "#EF4444" />
33- < circle cx = "67.63" cy = "74.27" r = "12" fill = "#10B981" />
34- < circle cx = "32.37" cy = "74.27" r = "12" fill = "#F59E0B" />
35- < circle cx = "21.47" cy = "40.73" r = "12" fill = "#EC4899" />
36- </ svg >
37- ) ;
38- } ;
3923
40- const Navbar = React . memo ( function Navbar ( ) {
41- const { isFlat, plotOn} = useGlobalStore (
42- useShallow ( state => ( {
43- isFlat : state . isFlat ,
44- plotOn : state . plotOn ,
45- } ) ) )
24+ const Navbar = React . memo ( function Navbar ( ) {
25+ const { isFlat, plotOn } = useGlobalStore (
26+ useShallow ( ( state ) => ( {
27+ isFlat : state . isFlat ,
28+ plotOn : state . plotOn ,
29+ } ) ) ,
30+ ) ;
4631
47- const { resetCamera, useOrtho, setResetCamera, setUseOrtho} = usePlotStore ( useShallow ( state => ( {
48- resetCamera : state . resetCamera ,
49- useOrtho : state . useOrtho ,
50- setResetCamera : state . setResetCamera ,
51- setUseOrtho : state . setUseOrtho
52- } ) ) )
32+ const { resetCamera, useOrtho, setResetCamera, setUseOrtho } = usePlotStore (
33+ useShallow ( ( state ) => ( {
34+ resetCamera : state . resetCamera ,
35+ useOrtho : state . useOrtho ,
36+ setResetCamera : state . setResetCamera ,
37+ setUseOrtho : state . setUseOrtho ,
38+ } ) ) ,
39+ ) ;
5340
54- const [ isOpen , setIsOpen ] = useState < boolean > ( true )
55- const navRef = useRef < HTMLElement | null > ( null )
56- const iconCol = useCSSVariable ( "--text-plot" )
57-
58- return (
59- < nav className = "navbar" ref = { navRef } >
60- < Tooltip delayDuration = { 500 } >
61- < TooltipTrigger asChild >
62- < Button
63- variant = "ghost"
64- size = "icon"
65- className = "navbar-trigger size-10"
66- aria-expanded = { isOpen }
67- onClick = { ( ) => setIsOpen ( ( prev ) => ! prev ) }
68- >
69- < FiveDotsIcon className = "navbar-trigger-icon rotating size-6" />
70- </ Button >
71- </ TooltipTrigger >
72- < TooltipContent side = "right" align = "start" >
73- { isOpen ? 'Close navigation' : 'Open navigation' }
74- </ TooltipContent >
75- </ Tooltip >
41+ const [ isOpen , setIsOpen ] = useState < boolean > ( true ) ;
42+ const navRef = useRef < HTMLElement | null > ( null ) ;
43+ const iconCol = useCSSVariable ( "--text-plot" ) ;
7644
77- < div className = { cn ( "navbar-content" , isOpen ? "open" : "closed" ) } >
78- { /* <LogoDrawer /> */ }
79- < div className = "navbar-left" >
80- { plotOn && < >
81-
82- < Tooltip delayDuration = { 500 } >
83- < TooltipTrigger asChild >
84- < Button
85- variant = "ghost"
86- size = "icon"
87- className = "size-10 cursor-pointer"
88- tabIndex = { 0 }
89- onClick = { ( ) => setResetCamera ( ! resetCamera ) }
90- >
91- < MdFlipCameraIos className = "size-8" />
92- </ Button >
93- </ TooltipTrigger >
94- < TooltipContent side = "right" align = "start" >
95- < span > Reset camera view</ span >
96- </ TooltipContent >
97- </ Tooltip >
98- < Button
99- variant = "ghost"
100- size = "icon"
101- className = "cursor-pointer"
102- onClick = { ( ) => setUseOrtho ( ! useOrtho ) }
103- >
104- { useOrtho ? < Orthographic color = { iconCol } className = "size-8" /> : < Perspective color = { iconCol } className = "size-8" /> }
105- </ Button >
45+ return (
46+ < nav className = "navbar" ref = { navRef } >
47+ < Tooltip delayDuration = { 500 } >
48+ < TooltipTrigger asChild >
49+ < Button
50+ variant = "ghost"
51+ size = "icon"
52+ className = "navbar-trigger size-10"
53+ aria-expanded = { isOpen }
54+ onClick = { ( ) => setIsOpen ( ( prev ) => ! prev ) }
55+ >
56+ { isOpen ? (
57+ < RiCloseLargeLine className = "size-4" />
58+ ) : (
59+ < RiMenu2Line className = "size-6" />
60+ ) }
61+ </ Button >
62+ </ TooltipTrigger >
63+ < TooltipContent side = "right" align = "start" >
64+ { isOpen ? "Close navigation" : "Open navigation" }
65+ </ TooltipContent >
66+ </ Tooltip >
10667
107- </ > }
68+ < div className = { cn ( "navbar-content" , isOpen ? "open" : "closed" ) } >
69+ { /* <LogoDrawer /> */ }
70+ < div className = "navbar-left" >
71+ { plotOn && (
72+ < >
73+ < Tooltip delayDuration = { 500 } >
74+ < TooltipTrigger asChild >
75+ < Button
76+ variant = "ghost"
77+ size = "icon"
78+ className = "size-10 cursor-pointer"
79+ tabIndex = { 0 }
80+ onClick = { ( ) =>
81+ setResetCamera ( ! resetCamera )
82+ }
83+ >
84+ < MdFlipCameraIos className = "size-8" />
85+ </ Button >
86+ </ TooltipTrigger >
87+ < TooltipContent side = "right" align = "start" >
88+ < span > Reset camera view</ span >
89+ </ TooltipContent >
90+ </ Tooltip >
91+ < Button
92+ variant = "ghost"
93+ size = "icon"
94+ className = "cursor-pointer"
95+ onClick = { ( ) => setUseOrtho ( ! useOrtho ) }
96+ >
97+ { useOrtho ? (
98+ < Orthographic
99+ color = { iconCol }
100+ className = "size-8"
101+ />
102+ ) : (
103+ < Perspective
104+ color = { iconCol }
105+ className = "size-8"
106+ />
107+ ) }
108+ </ Button >
109+ </ >
110+ ) }
108111
109- { plotOn && ! isFlat && < PlotLineButton /> }
110- { plotOn &&
111- < >
112- < ExportImageSettings />
113- < PerformanceMode />
114- </ >
115- }
116- </ div >
117- </ div >
118- </ nav >
119- ) ;
112+ { plotOn && ! isFlat && < PlotLineButton /> }
113+ { plotOn && (
114+ < >
115+ < ExportImageSettings />
116+ < PerformanceMode />
117+ </ >
118+ ) }
119+ </ div >
120+ </ div >
121+ </ nav >
122+ ) ;
120123} ) ;
121124
122- export default Navbar ;
125+ export default Navbar ;
0 commit comments