generated from nhcarrigan/template
70fcaa8650
### Explanation _No response_ ### Issue Closes #39 ### Attestations - [ ] I have read and agree to the [Code of Conduct](https://docs.nhcarrigan.com/community/coc/) - [ ] I have read and agree to the [Community Guidelines](https://docs.nhcarrigan.com/community/guide/). - [ ] My contribution complies with the [Contributor Covenant](https://docs.nhcarrigan.com/dev/covenant/). ### Dependencies - [ ] I have pinned the dependencies to a specific patch version. ### Style - [ ] I have run the linter and resolved any errors. - [ ] My pull request uses an appropriate title, matching the conventional commit standards. - [ ] My scope of feat/fix/chore/etc. correctly matches the nature of changes in my pull request. ### Tests - [ ] My contribution adds new code, and I have added tests to cover it. - [ ] My contribution modifies existing code, and I have updated the tests to reflect these changes. - [ ] All new and existing tests pass locally with my changes. - [ ] Code coverage remains at or above the configured threshold. ### Documentation _No response_ ### Versioning _No response_ Reviewed-on: #45 Co-authored-by: Naomi Carrigan <commits@nhcarrigan.com> Co-committed-by: Naomi Carrigan <commits@nhcarrigan.com>
81 lines
2.4 KiB
Svelte
81 lines
2.4 KiB
Svelte
<script lang="ts">
|
|
import { onMount, onDestroy } from "svelte";
|
|
import { initializeTauriListeners, cleanupTauriListeners } from "$lib/tauri";
|
|
import { configStore, applyTheme } from "$lib/stores/config";
|
|
import "$lib/notifications/testNotifications";
|
|
import Terminal from "$lib/components/Terminal.svelte";
|
|
import InputBar from "$lib/components/InputBar.svelte";
|
|
import StatusBar from "$lib/components/StatusBar.svelte";
|
|
import AnimeGirl from "$lib/components/AnimeGirl.svelte";
|
|
import PermissionModal from "$lib/components/PermissionModal.svelte";
|
|
import ConfigSidebar from "$lib/components/ConfigSidebar.svelte";
|
|
import AchievementNotification from "$lib/components/AchievementNotification.svelte";
|
|
import AchievementsPanel from "$lib/components/AchievementsPanel.svelte";
|
|
|
|
let initialized = false;
|
|
let achievementPanelOpen = $state(false);
|
|
|
|
onMount(async () => {
|
|
if (!initialized) {
|
|
initialized = true;
|
|
await initializeTauriListeners();
|
|
await configStore.loadConfig();
|
|
|
|
// Apply saved theme on startup
|
|
const config = configStore.getConfig();
|
|
applyTheme(config.theme);
|
|
}
|
|
});
|
|
|
|
onDestroy(() => {
|
|
if (initialized) {
|
|
cleanupTauriListeners();
|
|
initialized = false;
|
|
}
|
|
});
|
|
</script>
|
|
|
|
<div class="app-container h-screen w-screen flex flex-col bg-[var(--bg-primary)] overflow-hidden">
|
|
<StatusBar onToggleAchievements={() => (achievementPanelOpen = !achievementPanelOpen)} />
|
|
|
|
<main class="flex-1 flex overflow-hidden">
|
|
<!-- Left panel: Character display -->
|
|
<div
|
|
class="character-panel w-1/3 flex flex-col items-center justify-center border-r border-[var(--border-color)] bg-[var(--bg-secondary)]/50"
|
|
>
|
|
<AnimeGirl />
|
|
</div>
|
|
|
|
<!-- Right panel: Terminal and input -->
|
|
<div class="terminal-panel flex-1 flex flex-col">
|
|
<Terminal />
|
|
<InputBar />
|
|
</div>
|
|
</main>
|
|
|
|
<PermissionModal />
|
|
<ConfigSidebar />
|
|
<AchievementNotification />
|
|
<AchievementsPanel
|
|
bind:isOpen={achievementPanelOpen}
|
|
onClose={() => (achievementPanelOpen = false)}
|
|
/>
|
|
</div>
|
|
|
|
<style>
|
|
.app-container {
|
|
font-family:
|
|
"Inter",
|
|
-apple-system,
|
|
BlinkMacSystemFont,
|
|
"Segoe UI",
|
|
Roboto,
|
|
sans-serif;
|
|
}
|
|
|
|
.character-panel {
|
|
min-width: 320px;
|
|
background: linear-gradient(180deg, var(--bg-secondary) 0%, var(--bg-primary) 100%);
|
|
}
|
|
</style>
|