@@ -8,6 +8,7 @@ import LinkButton from './LinkButton'
88import routes from '../constants/routes'
99import userState from '../state/userState'
1010import { useRecoilValue } from 'recoil'
11+ import Tippy from '@tippyjs/react'
1112
1213function ServicesLink ( ) {
1314 const user = useRecoilValue ( userState )
@@ -66,30 +67,43 @@ function ServicesLink() {
6667 ]
6768
6869 return (
69- < li className = 'relative' >
70- < LinkButton onClick = { ( ) => setShowServicesMenu ( ! showServicesMenu ) } >
71- < div className = 'flex sm:flex-row-reverse items-center' >
72- Services
73- < IconCaretDown size = { 20 } className = { classNames ( 'ml-1 sm:ml-0 sm:mr-1 fill-current transform transition-transform' , { 'rotate-180' : showServicesMenu } ) } />
70+ < li >
71+ < Tippy
72+ placement = 'bottom-start'
73+ visible = { showServicesMenu }
74+ onClickOutside = { ( ) => setShowServicesMenu ( false ) }
75+ offset = { [ 0 , 10 ] }
76+ interactive = { true }
77+ arrow = { false }
78+ theme = 'bare'
79+ content = { (
80+ < ul className = 'w-full sm:w-[480px] grid grid-cols-2 gap-2 bg-gray-800 border border-gray-700 p-2 rounded text-white transition-all' >
81+ { services . filter ( ( { route } ) => canViewPage ( user , route ) ) . map ( ( { name, desc, icon : Icon , route } ) => (
82+ < li key = { name } >
83+ { showServicesMenu &&
84+ < RouterLink to = { route } className = { classNames ( 'group block p-4 rounded transition-colors hover:bg-gray-700 focus:bg-gray-700 space-y-2' , focusStyle ) } >
85+ < p className = 'font-bold text-white group-hover:text-indigo-300 group-focus:text-indigo-300' >
86+ < Icon size = { 18 } className = 'inline-block mb-1 mr-1' />
87+ { name }
88+ </ p >
89+ < p className = 'text-gray-300 text-sm group-hover:text-white group-focus:text-white' > { desc } </ p >
90+ </ RouterLink >
91+ }
92+ { ! showServicesMenu && < div className = 'h-[80px]' /> }
93+ </ li >
94+ ) ) }
95+ </ ul >
96+ ) }
97+ >
98+ < div >
99+ < LinkButton onClick = { ( ) => setShowServicesMenu ( ! showServicesMenu ) } >
100+ < div className = 'flex sm:flex-row-reverse items-center' >
101+ Services
102+ < IconCaretDown size = { 20 } className = { classNames ( 'ml-1 sm:ml-0 sm:mr-1 fill-current transform transition-transform' , { 'rotate-180' : showServicesMenu } ) } />
103+ </ div >
104+ </ LinkButton >
74105 </ div >
75- </ LinkButton >
76-
77- < ul className = { classNames ( 'w-full sm:w-[480px] grid grid-cols-2 gap-2 absolute top-0 pointer-events-none opacity-0 bg-gray-800 border border-gray-700 p-2 rounded text-white transition-all' , { '!top-10 z-50 opacity-100 filter drop-shadow-md !pointer-events-auto' : showServicesMenu } ) } >
78- { services . filter ( ( { route } ) => canViewPage ( user , route ) ) . map ( ( { name, desc, icon : Icon , route } ) => (
79- < li key = { name } >
80- { showServicesMenu &&
81- < RouterLink to = { route } className = { classNames ( 'group block p-4 rounded transition-colors hover:bg-gray-700 focus:bg-gray-700 space-y-2' , focusStyle ) } >
82- < p className = 'font-bold text-white group-hover:text-indigo-300 group-focus:text-indigo-300' >
83- < Icon size = { 18 } className = 'inline-block mb-1 mr-1' />
84- { name }
85- </ p >
86- < p className = 'text-gray-300 text-sm group-hover:text-white group-focus:text-white' > { desc } </ p >
87- </ RouterLink >
88- }
89- { ! showServicesMenu && < div className = 'h-[80px]' /> }
90- </ li >
91- ) ) }
92- </ ul >
106+ </ Tippy >
93107 </ li >
94108 )
95109}
0 commit comments