179 lines
3.8 KiB
Svelte
179 lines
3.8 KiB
Svelte
<script lang="ts">
|
|
import { goto } from "$app/navigation";
|
|
import AppModal from "$lib/components/AppModal.svelte";
|
|
import Navbar from "$lib/components/Navbar.svelte";
|
|
|
|
const activeSection = "account";
|
|
|
|
let modalOpen = false;
|
|
let modalTitle = "";
|
|
let modalMessage = "";
|
|
let modalConfirmText = "OK";
|
|
let modalCancelText = "Cancel";
|
|
let modalShowCancel = false;
|
|
let modalTone: "default" | "danger" = "default";
|
|
let modalAction: "logout-confirm" | "logout-info" | null = null;
|
|
|
|
function showModal(options: {
|
|
action: "logout-confirm" | "logout-info";
|
|
title: string;
|
|
message: string;
|
|
confirmText?: string;
|
|
cancelText?: string;
|
|
showCancel?: boolean;
|
|
tone?: "default" | "danger";
|
|
}) {
|
|
modalAction = options.action;
|
|
modalTitle = options.title;
|
|
modalMessage = options.message;
|
|
modalConfirmText = options.confirmText ?? "OK";
|
|
modalCancelText = options.cancelText ?? "Cancel";
|
|
modalShowCancel = options.showCancel ?? false;
|
|
modalTone = options.tone ?? "default";
|
|
modalOpen = true;
|
|
}
|
|
|
|
function closeModal() {
|
|
modalOpen = false;
|
|
modalAction = null;
|
|
}
|
|
|
|
function handleModalConfirm() {
|
|
if (modalAction === "logout-confirm") {
|
|
showModal({
|
|
action: "logout-info",
|
|
title: "Logout Requested",
|
|
message: "You have been logged out.",
|
|
confirmText: "Close"
|
|
});
|
|
return;
|
|
}
|
|
|
|
closeModal();
|
|
}
|
|
|
|
function handleSelect(id: string) {
|
|
if (id === "logout") {
|
|
showModal({
|
|
action: "logout-confirm",
|
|
title: "Confirm Logout",
|
|
message: "Are you sure you want to log out?",
|
|
confirmText: "Log Out",
|
|
cancelText: "Cancel",
|
|
showCancel: true,
|
|
tone: "danger"
|
|
});
|
|
return;
|
|
}
|
|
|
|
if (id === "account") {
|
|
return;
|
|
}
|
|
|
|
if (id === "settings") {
|
|
goto("/settings");
|
|
return;
|
|
}
|
|
|
|
goto("/");
|
|
}
|
|
</script>
|
|
|
|
<div class="app-shell panel-closed">
|
|
<Navbar {activeSection} onSelect={handleSelect} />
|
|
|
|
<main class="route-view">
|
|
<header class="route-header">
|
|
<h1>Account</h1>
|
|
<p>Manage your profile and account preferences.</p>
|
|
</header>
|
|
|
|
<section class="route-card">
|
|
<label>
|
|
Display Name
|
|
<input type="text" value="John Doe" />
|
|
</label>
|
|
|
|
<label>
|
|
Email
|
|
<input type="email" value="john@example.com" />
|
|
</label>
|
|
|
|
<button type="button">Save Changes</button>
|
|
</section>
|
|
</main>
|
|
</div>
|
|
|
|
<AppModal
|
|
open={modalOpen}
|
|
title={modalTitle}
|
|
message={modalMessage}
|
|
confirmText={modalConfirmText}
|
|
cancelText={modalCancelText}
|
|
showCancel={modalShowCancel}
|
|
tone={modalTone}
|
|
onConfirm={handleModalConfirm}
|
|
onCancel={closeModal}
|
|
/>
|
|
|
|
<style>
|
|
.route-view {
|
|
min-height: 100vh;
|
|
padding: 20px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 16px;
|
|
background: linear-gradient(180deg, var(--surface-2) 0%, var(--bg-editor) 100%);
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
.route-header h1 {
|
|
font-size: 1.1rem;
|
|
margin-bottom: 4px;
|
|
}
|
|
|
|
.route-header p {
|
|
color: var(--text-muted);
|
|
font-size: 0.9rem;
|
|
}
|
|
|
|
.route-card {
|
|
border: 1px solid var(--border-soft);
|
|
background: var(--surface-1);
|
|
border-radius: 10px;
|
|
padding: 14px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 10px;
|
|
max-width: 420px;
|
|
}
|
|
|
|
.route-card label {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 4px;
|
|
font-size: 0.82rem;
|
|
color: var(--text-muted);
|
|
}
|
|
|
|
.route-card input {
|
|
border: 1px solid var(--border-soft);
|
|
border-radius: 7px;
|
|
background: var(--bg-app);
|
|
color: var(--text-primary);
|
|
padding: 8px 10px;
|
|
}
|
|
|
|
.route-card button {
|
|
width: fit-content;
|
|
padding: 7px 11px;
|
|
border-radius: 7px;
|
|
border: 1px solid var(--border-strong);
|
|
background: var(--surface-3);
|
|
color: var(--text-primary);
|
|
cursor: pointer;
|
|
}
|
|
</style>
|
|
|
|
|