Refine admin menu tooltip interaction

This commit is contained in:
Sam Becker 2025-04-25 09:02:18 -05:00
parent 1863c28f9f
commit e5aaab285d
5 changed files with 45 additions and 35 deletions

View File

@ -97,7 +97,7 @@ export default function AdminAppMenu({
{photosCountNeedSync} {photosCountNeedSync}
</span> </span>
<InsightsIndicatorDot <InsightsIndicatorDot
className="inline-block translate-y-[1px]" className="inline-block translate-y-[-1px]"
size="small" size="small"
/> />
</>, </>,
@ -201,7 +201,7 @@ export default function AdminAppMenu({
className="translate-x-[1px] translate-y-[1px]" className="translate-x-[1px] translate-y-[1px]"
size={13} size={13}
/> />
:<IconLock : <IconLock
size={16} size={16}
className="translate-x-[1px] translate-y-[0.5px]" className="translate-x-[1px] translate-y-[0.5px]"
narrow narrow

View File

@ -12,7 +12,7 @@ import { GRID_HOMEPAGE_ENABLED } from './config';
import AdminAppMenu from '@/admin/AdminAppMenu'; import AdminAppMenu from '@/admin/AdminAppMenu';
import Spinner from '@/components/Spinner'; import Spinner from '@/components/Spinner';
import clsx from 'clsx/lite'; import clsx from 'clsx/lite';
import { useState } from 'react'; import { useState, useRef, useEffect } from 'react';
export type SwitcherSelection = 'feed' | 'grid' | 'admin'; export type SwitcherSelection = 'feed' | 'grid' | 'admin';
@ -29,19 +29,31 @@ export default function AppViewSwitcher({
setIsCommandKOpen, setIsCommandKOpen,
} = useAppState(); } = useAppState();
const hasAdminMenuOpenedOnce = useRef(false);
const [isAdminMenuOpen, setIsAdminMenuOpen] = useState(false); const [isAdminMenuOpen, setIsAdminMenuOpen] = useState(false);
useEffect(() => {
if (isAdminMenuOpen) {
hasAdminMenuOpenedOnce.current = true;
} else if (hasAdminMenuOpenedOnce.current) {
// Blur admin menu button to avoid tooltip on dismiss
setTimeout(() => {
if (document.activeElement instanceof HTMLElement) {
document.activeElement.blur();
}
}, 50);
}
}, [isAdminMenuOpen]);
const renderItemFeed = const renderItemFeed =
<SwitcherItem <SwitcherItem
icon={<IconFeed includeTitle={false} className="translate-x-[-0.5px]" />} icon={<IconFeed includeTitle={false} className="translate-x-[-0.5px]" />}
href={PATH_FEED_INFERRED} href={PATH_FEED_INFERRED}
active={currentSelection === 'feed'} active={currentSelection === 'feed'}
tooltip={!isAdminMenuOpen tooltip={{
? { content: 'Feed',
content: 'Feed', keyCommand: 'F',
keyCommand: 'F', }}
}
: undefined}
noPadding noPadding
/>; />;
@ -50,20 +62,20 @@ export default function AppViewSwitcher({
icon={<IconGrid includeTitle={false} className="translate-x-[-0.5px]" />} icon={<IconGrid includeTitle={false} className="translate-x-[-0.5px]" />}
href={PATH_GRID_INFERRED} href={PATH_GRID_INFERRED}
active={currentSelection === 'grid'} active={currentSelection === 'grid'}
tooltip={!isAdminMenuOpen tooltip={{
? { content: 'Grid',
content: 'Grid', keyCommand: 'G',
keyCommand: 'G', }}
}
: undefined}
noPadding noPadding
/>; />;
return ( return (
<div className={clsx( <div
'flex gap-1 sm:gap-2', className={clsx(
className, 'flex gap-1 sm:gap-2',
)}> className,
)}
>
<Switcher> <Switcher>
{GRID_HOMEPAGE_ENABLED ? renderItemGrid : renderItemFeed} {GRID_HOMEPAGE_ENABLED ? renderItemGrid : renderItemFeed}
{GRID_HOMEPAGE_ENABLED ? renderItemFeed : renderItemGrid} {GRID_HOMEPAGE_ENABLED ? renderItemFeed : renderItemGrid}
@ -73,9 +85,7 @@ export default function AppViewSwitcher({
icon={<Spinner />} icon={<Spinner />}
isInteractive={false} isInteractive={false}
noPadding noPadding
tooltip={!isAdminMenuOpen tooltip={{ content: 'Admin Menu' }}
? { content: 'Admin Menu' }
: undefined}
/>} />}
{isUserSignedIn && {isUserSignedIn &&
<SwitcherItem <SwitcherItem
@ -83,9 +93,7 @@ export default function AppViewSwitcher({
isOpen={isAdminMenuOpen} isOpen={isAdminMenuOpen}
setIsOpen={setIsAdminMenuOpen} setIsOpen={setIsAdminMenuOpen}
/>} />}
tooltip={!isAdminMenuOpen tooltip={{ content: !isAdminMenuOpen ? 'Admin Menu' : undefined }}
? { content: 'Admin Menu' }
: undefined}
noPadding noPadding
/>} />}
</Switcher> </Switcher>
@ -93,13 +101,11 @@ export default function AppViewSwitcher({
<SwitcherItem <SwitcherItem
icon={<IconSearch includeTitle={false} />} icon={<IconSearch includeTitle={false} />}
onClick={() => setIsCommandKOpen?.(true)} onClick={() => setIsCommandKOpen?.(true)}
tooltip={!isAdminMenuOpen tooltip={{
? { content: 'Search',
content: 'Search', keyCommand: 'K',
keyCommand: 'K', keyCommandModifier: '⌘',
keyCommandModifier: '⌘', }}
}
: undefined}
/> />
</Switcher> </Switcher>
</div> </div>

View File

@ -72,7 +72,7 @@ export default function SwitcherItem({
? <Tooltip ? <Tooltip
{...tooltip} {...tooltip}
classNameTrigger={WIDTH_CLASS} classNameTrigger={WIDTH_CLASS}
delayDuration={500} delayDuration={300}
> >
{content} {content}
</Tooltip> </Tooltip>

View File

@ -19,7 +19,11 @@ export default function KeyCommand({
{keys.map((key) => ( {keys.map((key) => (
<span <span
key={key} key={key}
className="text-gray-600 bg-gray-200/75 px-1 rounded-sm" className={clsx(
'px-1 rounded-sm shadow-xs',
'text-gray-600 bg-gray-200/90',
'dark:text-gray-300 dark:bg-gray-600/55',
)}
> >
{key} {key}
</span> </span>

View File

@ -49,7 +49,7 @@ export default function TooltipPrimitive({
}); });
const classNameTrigger = clsx( const classNameTrigger = clsx(
'cursor-default inline-block', 'cursor-default inline-flex',
classNameTriggerProp, classNameTriggerProp,
); );