Add files via upload

This commit is contained in:
Kosztyk 2026-01-12 21:12:23 +02:00 committed by GitHub
parent ad4d365d7f
commit f71ebd5d98
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 59 additions and 2 deletions

View file

@ -15,7 +15,33 @@ export const BaseHtml = ({
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="webroot" content={webroot} /> <meta name="webroot" content={webroot} />
<title safe>{title}</title> <title safe>{title}</title>
{/*
Apply the persisted theme as early as possible to avoid a flash.
- If no preference is stored, tokens fall back to OS preference via CSS.
*/}
<script>
{`
(() => {
const KEY = 'convertx-theme';
try {
const v = localStorage.getItem(KEY);
if (v === 'dark' || v === 'light') {
document.documentElement.setAttribute('data-theme', v);
document.documentElement.style.colorScheme = v;
}
} catch {
// ignore
}
})();
`}
</script>
<link rel="stylesheet" href={`${webroot}/generated.css`} /> <link rel="stylesheet" href={`${webroot}/generated.css`} />
{/* Theme toggle behavior (syncs the header switch + persists choice). */}
<script src={`${webroot}/theme.js`} defer />
<link rel="apple-touch-icon" sizes="180x180" href={`${webroot}/apple-touch-icon.png`} /> <link rel="apple-touch-icon" sizes="180x180" href={`${webroot}/apple-touch-icon.png`} />
<link rel="icon" type="image/png" sizes="32x32" href={`${webroot}/favicon-32x32.png`} /> <link rel="icon" type="image/png" sizes="32x32" href={`${webroot}/favicon-32x32.png`} />
<link rel="icon" type="image/png" sizes="16x16" href={`${webroot}/favicon-16x16.png`} /> <link rel="icon" type="image/png" sizes="16x16" href={`${webroot}/favicon-16x16.png`} />

View file

@ -11,10 +11,40 @@ export const Header = ({
hideHistory?: boolean; hideHistory?: boolean;
webroot?: string; webroot?: string;
}) => { }) => {
const themeToggle = (
<li class="flex items-center gap-2">
<span id="cx-theme-label" class="text-sm font-medium text-neutral-200">
Dark
</span>
<label class="relative inline-flex cursor-pointer items-center" title="Toggle theme">
<input
id="cx-theme-switch"
type="checkbox"
class="sr-only peer"
aria-label="Toggle dark mode"
/>
<div
class={
`
relative h-6 w-11 rounded-full bg-neutral-700
transition-colors
peer-checked:bg-blue-600
peer-focus-visible:outline-none peer-focus-visible:ring-2 peer-focus-visible:ring-blue-500
after:content-[''] after:absolute after:top-[2px] after:left-[2px]
after:h-5 after:w-5 after:rounded-full after:bg-white after:border after:border-neutral-500 after:shadow-sm after:transition-transform
peer-checked:after:translate-x-5
`
}
/>
</label>
</li>
);
let rightNav: JSX.Element; let rightNav: JSX.Element;
if (loggedIn) { if (loggedIn) {
rightNav = ( rightNav = (
<ul class="flex gap-4"> <ul class="flex items-center gap-6">
{themeToggle}
{!hideHistory && ( {!hideHistory && (
<li> <li>
<a <a
@ -58,7 +88,8 @@ export const Header = ({
); );
} else { } else {
rightNav = ( rightNav = (
<ul class="flex gap-4"> <ul class="flex items-center gap-6">
{themeToggle}
<li> <li>
<a <a
class={` class={`