Collapse sidebar based on configuration

This commit is contained in:
Sam Becker 2025-03-23 11:46:29 -05:00
parent f781ddbc60
commit 6c967b9970
3 changed files with 27 additions and 16 deletions

View File

@ -220,6 +220,8 @@ export const SHOW_FILM_SIMULATIONS =
CATEGORY_VISIBILITY.includes('films');
export const SHOW_FOCAL_LENGTHS =
CATEGORY_VISIBILITY.includes('focal-lengths');
export const COLLAPSE_SIDEBAR_CATEGORIES =
process.env.NEXT_PUBLIC_EXPAND_SIDEBAR_CATEGORIES !== '1';
export const SHOW_EXIF_DATA =
process.env.NEXT_PUBLIC_HIDE_EXIF_DATA !== '1';
export const SHOW_ZOOM_CONTROLS =

View File

@ -5,29 +5,33 @@ import AnimateItems from './AnimateItems';
import { ReactNode, useState } from 'react';
import LoaderButton from './primitives/LoaderButton';
import { IoChevronDownOutline, IoChevronUpOutline } from 'react-icons/io5';
const SIDEBAR_MAX_COLLAPSE_ITEMS = 5;
import { COLLAPSE_SIDEBAR_CATEGORIES } from '@/app/config';
export default function HeaderList({
title,
className,
icon,
items,
maxItems = 5,
}: {
title?: string,
className?: string,
icon?: ReactNode,
items: ReactNode[]
items: ReactNode[],
maxItems?: number,
}) {
const [isExpanded, setIsExpanded] = useState(false);
const hasMoreItems = items.length > SIDEBAR_MAX_COLLAPSE_ITEMS;
const hasItemsToExpand =
COLLAPSE_SIDEBAR_CATEGORIES &&
// Don't show expand button if it only reveals 1 item
items.length > (maxItems + 1);
return (
<AnimateItems
className={clsx(
className,
'space-y-1',
className,
)}
scaleOffset={0.95}
duration={0.5}
@ -39,7 +43,7 @@ export default function HeaderList({
'text-gray-900',
'dark:text-gray-100',
'flex items-center mb-1 gap-1',
'uppercase',
'uppercase select-none',
)}
>
{icon &&
@ -48,26 +52,28 @@ export default function HeaderList({
</span>}
{title}
</div>]
:[] as ReactNode[]
: [] as ReactNode[]
)
.concat(items.slice(0, isExpanded
? items.length
: SIDEBAR_MAX_COLLAPSE_ITEMS))
.concat(hasMoreItems
.concat(items.slice(
0,
hasItemsToExpand && !isExpanded ? maxItems : items.length,
))
.concat(hasItemsToExpand
? [
<LoaderButton
key="expand-button"
onClick={() => setIsExpanded(!isExpanded)}
styleAs="link"
className={clsx(
'mt-1',
'text-xs tracking-wide',
'text-xs font-medium tracking-wider',
'border-medium rounded-md',
'px-1.5 h-6!',
'px-[5px] h-5!',
'hover:bg-dim active:bg-main',
)}
>
{<span className="flex items-center gap-1">
<span>{isExpanded ? 'HIDE' : 'MORE'}</span>
<span>{isExpanded ? 'LESS' : 'MORE'}</span>
{isExpanded
? <IoChevronUpOutline size={12} />
: <IoChevronDownOutline size={12} />}

View File

@ -56,7 +56,10 @@ export default function PhotoGridSidebar({
? <HeaderList
key="cameras"
title="Cameras"
icon={<IconCamera size={15} />}
icon={<IconCamera
size={15}
className="translate-x-[0.5px]"
/>}
items={cameras
.sort(sortCamerasWithCount)
.map(({ cameraKey, camera, count }) =>
@ -99,7 +102,7 @@ export default function PhotoGridSidebar({
title='Tags'
icon={<IconTag
size={14}
className="translate-y-[1px]"
className="translate-x-[1px] translate-y-[1px]"
/>}
items={tagsIncludingHidden.map(({ tag, count }) => {
switch (tag) {