mirror of
https://github.com/ggml-org/llama.cpp.git
synced 2025-08-16 13:12:51 -04:00
* webui : improve accessibility for visually impaired people * add a11y for extra contents * fix some labels being read twice * add skip to main content
93 lines
3.1 KiB
TypeScript
93 lines
3.1 KiB
TypeScript
import { useEffect, useState } from 'react';
|
|
import StorageUtils from '../utils/storage';
|
|
import { useAppContext } from '../utils/app.context';
|
|
import { classNames } from '../utils/misc';
|
|
import daisyuiThemes from 'daisyui/theme/object';
|
|
import { THEMES } from '../Config';
|
|
import {
|
|
Cog8ToothIcon,
|
|
MoonIcon,
|
|
Bars3Icon,
|
|
} from '@heroicons/react/24/outline';
|
|
|
|
export default function Header() {
|
|
const [selectedTheme, setSelectedTheme] = useState(StorageUtils.getTheme());
|
|
const { setShowSettings } = useAppContext();
|
|
|
|
const setTheme = (theme: string) => {
|
|
StorageUtils.setTheme(theme);
|
|
setSelectedTheme(theme);
|
|
};
|
|
|
|
useEffect(() => {
|
|
document.body.setAttribute('data-theme', selectedTheme);
|
|
document.body.setAttribute(
|
|
'data-color-scheme',
|
|
daisyuiThemes[selectedTheme]?.['color-scheme'] ?? 'auto'
|
|
);
|
|
}, [selectedTheme]);
|
|
|
|
return (
|
|
<div className="flex flex-row items-center pt-6 pb-6 sticky top-0 z-10 bg-base-100">
|
|
{/* open sidebar button */}
|
|
<label htmlFor="toggle-drawer" className="btn btn-ghost lg:hidden">
|
|
<Bars3Icon className="h-5 w-5" />
|
|
</label>
|
|
|
|
<div className="grow text-2xl font-bold ml-2">llama.cpp</div>
|
|
|
|
{/* action buttons (top right) */}
|
|
<div className="flex items-center">
|
|
<div
|
|
className="tooltip tooltip-bottom"
|
|
data-tip="Settings"
|
|
onClick={() => setShowSettings(true)}
|
|
>
|
|
<button className="btn" aria-hidden={true}>
|
|
{/* settings button */}
|
|
<Cog8ToothIcon className="w-5 h-5" />
|
|
</button>
|
|
</div>
|
|
|
|
{/* theme controller is copied from https://daisyui.com/components/theme-controller/ */}
|
|
<div className="tooltip tooltip-bottom" data-tip="Themes">
|
|
<div className="dropdown dropdown-end dropdown-bottom">
|
|
<div tabIndex={0} role="button" className="btn m-1">
|
|
<MoonIcon className="w-5 h-5" />
|
|
</div>
|
|
<ul
|
|
tabIndex={0}
|
|
className="dropdown-content bg-base-300 rounded-box z-[1] w-52 p-2 shadow-2xl h-80 overflow-y-auto"
|
|
>
|
|
<li>
|
|
<button
|
|
className={classNames({
|
|
'btn btn-sm btn-block btn-ghost justify-start': true,
|
|
'btn-active': selectedTheme === 'auto',
|
|
})}
|
|
onClick={() => setTheme('auto')}
|
|
>
|
|
auto
|
|
</button>
|
|
</li>
|
|
{THEMES.map((theme) => (
|
|
<li key={theme}>
|
|
<input
|
|
type="radio"
|
|
name="theme-dropdown"
|
|
className="theme-controller btn btn-sm btn-block btn-ghost justify-start"
|
|
aria-label={theme}
|
|
value={theme}
|
|
checked={selectedTheme === theme}
|
|
onChange={(e) => e.target.checked && setTheme(theme)}
|
|
/>
|
|
</li>
|
|
))}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|