Files
aethera/frontend/public/index.html

150 lines
5.2 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=0.9, maximum-scale=0.9, viewport-fit=cover"
/>
<meta name="theme-color" content="#f8f7ff" />
<title>Aethera - AI Conversation & Image Generator</title>
<script type="module" src="./dist/main.js"></script>
<link rel="stylesheet" href="./dist/styles.css" />
</head>
<body class="bg-primary-50" x-data x-init="$store.navigation.init()">
<!-- Nav - Fixed and fully transparent so page content always sits behind
it (including under the iOS dynamic island, even at scroll=0). The
pill inside provides its own background. Pages clear the nav with
padding-top: var(--nav-h). -->
<header
class="fixed top-0 left-0 right-0 z-50 flex justify-between px-4 md:px-6 pb-3 pointer-events-none"
style="padding-top: max(1rem, env(safe-area-inset-top));"
>
<div class="size-9 flex items-center justify-start pointer-events-auto">
<button
x-show="$store.navigation.activeTab === 'chats'"
@click="$store.chatSidebar.toggleMobile()"
:aria-expanded="$store.chatSidebar.mobileOpen ? 'true' : 'false'"
aria-label="Toggle conversation list"
class="md:hidden p-2 rounded-md text-primary-700 hover:bg-primary-300 transition-colors cursor-pointer"
>
<svg
x-show="!$store.chatSidebar.mobileOpen"
xmlns="http://www.w3.org/2000/svg"
class="h-5 w-5"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
</svg>
<svg
x-show="$store.chatSidebar.mobileOpen"
xmlns="http://www.w3.org/2000/svg"
class="h-5 w-5"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
</div>
<!-- Main Nav -->
<nav class="inline-flex bg-primary-100 rounded-full pointer-events-auto">
<a
href="#/chats"
:class="[
'px-5 py-2 rounded-full text-sm font-medium transition-colors',
$store.navigation.activeTab === 'chats'
? 'bg-primary-600 text-white'
: 'text-primary-700 hover:bg-primary-200'
]"
>
Chats
</a>
<a
href="#/images"
:class="[
'px-5 py-2 rounded-full text-sm font-medium transition-colors',
$store.navigation.activeTab === 'images'
? 'bg-primary-600 text-white'
: 'text-primary-700 hover:bg-primary-200'
]"
>
Images
</a>
<a
href="#/settings"
:class="[
'px-5 py-2 rounded-full text-sm font-medium transition-colors',
$store.navigation.activeTab === 'settings'
? 'bg-primary-600 text-white'
: 'text-primary-700 hover:bg-primary-200'
]"
>
Settings
</a>
</nav>
<!-- Theme Toggle -->
<button
@click="$store.theme.cycleTheme()"
x-init="$store.theme.init()"
class="p-2 cursor-pointer rounded-md text-primary-700 hover:bg-primary-300 transition-colors pointer-events-auto"
aria-label="Toggle theme"
>
<svg
x-show="$store.theme.getThemeIcon() === 'sun'"
xmlns="http://www.w3.org/2000/svg"
class="h-5 w-5"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"
/>
</svg>
<svg
x-show="$store.theme.getThemeIcon() === 'moon'"
xmlns="http://www.w3.org/2000/svg"
class="h-5 w-5"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"
/>
</svg>
<svg
x-show="$store.theme.getThemeIcon() === 'system'"
xmlns="http://www.w3.org/2000/svg"
class="h-5 w-5"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"
/>
</svg>
</button>
</header>
<!-- Main Content Area - No fixed height; the document scrolls. -->
<main id="page-content"></main>
</body>
</html>