You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
4.1 KiB
139 lines
4.1 KiB
'use client';
|
|
|
|
import { MinusSquare, Moon, PlusSquare, Search, Sun, Type } from 'lucide-react';
|
|
import { shallow } from 'zustand/shallow';
|
|
|
|
import { useSearchStore } from '@/stores/search-store';
|
|
import { useThemeStore } from '@/stores/theme-store';
|
|
import { Tooltip } from '@/components/tooltip';
|
|
import { cn } from '@/lib/utils';
|
|
|
|
type ToolbarProps = {
|
|
fontControls: boolean;
|
|
className?: string;
|
|
};
|
|
|
|
export function Toolbar({ fontControls, className }: ToolbarProps) {
|
|
const toggleSearch = useSearchStore((state) => state.toggleSearch);
|
|
const isSearching = useSearchStore((state) => state.isSearching);
|
|
|
|
const {
|
|
isDark,
|
|
isSerif,
|
|
isFontSizeMin,
|
|
isFontSizeMax,
|
|
toggleDark,
|
|
toggleSerif,
|
|
increaseFontSize,
|
|
decreaseFontSize,
|
|
} = useThemeStore(
|
|
(state) => ({
|
|
isDark: state.isDark,
|
|
isSerif: state.isSerif,
|
|
isFontSizeMin: state.isFontSizeMin,
|
|
isFontSizeMax: state.isFontSizeMax,
|
|
toggleDark: state.toggleDark,
|
|
toggleSerif: state.toggleSerif,
|
|
increaseFontSize: state.increaseFontSize,
|
|
decreaseFontSize: state.decreaseFontSize,
|
|
}),
|
|
shallow,
|
|
);
|
|
|
|
const toggleDarkAndApply = () => {
|
|
toggleDark();
|
|
document.querySelector('html')?.classList.toggle('dark');
|
|
};
|
|
|
|
return (
|
|
<div
|
|
className={cn(
|
|
'flex h-8 w-fit flex-row items-center justify-end space-x-1',
|
|
className,
|
|
)}
|
|
>
|
|
<button onClick={toggleSearch}>
|
|
<Search
|
|
id="search"
|
|
className={cn(
|
|
'icon-base h-5 w-5 mix-blend-color-dodge xs:h-6 xs:w-6',
|
|
isSearching && 'text-accent/60 dark:text-accent-dark/80',
|
|
)}
|
|
aria-label="Поиск по тегам"
|
|
data-tooltip-content="Поиск по тегам"
|
|
data-tooltip-id="toolbar-tooltip"
|
|
/>
|
|
</button>
|
|
|
|
{fontControls && (
|
|
<>
|
|
<button
|
|
onClick={decreaseFontSize}
|
|
disabled={isFontSizeMin}
|
|
className="group"
|
|
>
|
|
<MinusSquare
|
|
id="decrease-font-size"
|
|
className={cn(
|
|
'icon-base h-5 w-5 mix-blend-color-dodge xs:h-6 xs:w-6',
|
|
'group-disabled:text-accent/60 dark:group-disabled:text-accent-dark/80',
|
|
)}
|
|
aria-label="Decrease font size"
|
|
data-tooltip-content="Decrease font size"
|
|
data-tooltip-id="toolbar-tooltip"
|
|
/>
|
|
</button>
|
|
<button
|
|
onClick={increaseFontSize}
|
|
disabled={isFontSizeMax}
|
|
className="group"
|
|
>
|
|
<PlusSquare
|
|
id="increase-font-size"
|
|
className={cn(
|
|
'icon-base h-5 w-5 mix-blend-color-dodge xs:h-6 xs:w-6',
|
|
'group-disabled:text-accent/60 dark:group-disabled:text-accent-dark/80',
|
|
)}
|
|
aria-label="Increase font size"
|
|
data-tooltip-content="Increase font size"
|
|
data-tooltip-id="toolbar-tooltip"
|
|
/>
|
|
</button>
|
|
</>
|
|
)}
|
|
|
|
<button onClick={toggleSerif}>
|
|
<Type
|
|
id="serif"
|
|
className={cn(
|
|
'icon-base ml-auto h-5 w-5 mix-blend-color-dodge xs:h-6 xs:w-6',
|
|
isSerif && 'text-accent/60 dark:text-accent-dark/80',
|
|
)}
|
|
data-tooltip-content="Toggle serif font"
|
|
data-tooltip-id="toolbar-tooltip"
|
|
aria-label="Toggle serif font"
|
|
/>
|
|
</button>
|
|
<button
|
|
onClick={toggleDarkAndApply}
|
|
id="theme-toggle"
|
|
data-tooltip-content={`Смена темы на ${isDark ? 'светлую' : 'темную'}`}
|
|
data-tooltip-id="toolbar-tooltip"
|
|
>
|
|
{isDark ? (
|
|
<Moon
|
|
className="icon-base h-5 w-5 mix-blend-color-dodge xs:h-6 xs:w-6"
|
|
aria-label="Светлая тема"
|
|
/>
|
|
) : (
|
|
<Sun
|
|
className="icon-base h-5 w-5 mix-blend-color-dodge xs:h-6 xs:w-6"
|
|
aria-label="Тёмная тема"
|
|
/>
|
|
)}
|
|
</button>
|
|
|
|
<Tooltip id="toolbar-tooltip" />
|
|
</div>
|
|
);
|
|
}
|
|
|