Add files via upload
This commit is contained in:
parent
ad4d365d7f
commit
f71ebd5d98
2 changed files with 59 additions and 2 deletions
|
|
@ -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`} />
|
||||||
|
|
|
||||||
|
|
@ -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={`
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue