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

View File

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

View File

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

View File

@ -19,7 +19,11 @@ export default function KeyCommand({
{keys.map((key) => (
<span
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}
</span>

View File

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