6686388834
Account creation and guarded onboarding flow. Current-cash starting balance with automatic rollover enabled. Dynamic bill generation, shared/custom categories, recurring targets, and optional same-day onboarding transactions. Optional dormant reserve and additional categories. Mailgun email or authenticator-app 2FA configuration. Responsive dark/light UI with no overflow at 390px. Fixed administrator session-ID creation bug. Core implementation: [OnboardingService.php (line 59)](/Users/tyemeclifford/Documents/GH/budget/app/OnboardingService.php:59), [onboarding.php (line 19)](/Users/tyemeclifford/Documents/GH/budget/views/onboarding.php:19), and [index.php (line 143)](/Users/tyemeclifford/Documents/GH/budget/public/index.php:143). Verification passed: financial self-test, onboarding integration test, full browser walkthrough, mobile layout, routing guards, and zero browser console errors. Live email delivery requires actual Mailgun credentials and was not sent during testing.
40 lines
1.9 KiB
PHP
40 lines
1.9 KiB
PHP
<?php
|
|
$appName = (string) $settings->get('app.name', 'Neon Ledger');
|
|
$defaultTheme = (string) $settings->get('theme.default', 'dark');
|
|
?>
|
|
<!doctype html>
|
|
<html lang="en" data-theme="<?= h($defaultTheme) ?>">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<meta name="color-scheme" content="dark light">
|
|
<title><?= h($title ?? 'Welcome') ?> · <?= h($appName) ?></title>
|
|
<link rel="stylesheet" href="/assets/app.css?v=<?= (int) filemtime(APP_ROOT . '/public/assets/app.css') ?>">
|
|
<script>document.documentElement.dataset.theme=localStorage.getItem('budget-theme')||<?= json_encode($defaultTheme) ?>;</script>
|
|
</head>
|
|
<body class="auth-body">
|
|
<main class="auth-shell">
|
|
<section class="auth-story">
|
|
<div class="brand auth-brand"><span class="brand-mark">NL</span><strong><?= h($appName) ?></strong></div>
|
|
<div>
|
|
<p class="eyebrow">Plan forward. Compare backward.</p>
|
|
<h1>Your money, with a memory.</h1>
|
|
<p>Build monthly budgets, carry unused funds forward, track bill progress, and move money out of sight without losing the paper trail.</p>
|
|
</div>
|
|
<div class="auth-orbit" aria-hidden="true">
|
|
<span class="orbit-one"></span><span class="orbit-two"></span><span class="orbit-three"></span>
|
|
<strong>$</strong>
|
|
</div>
|
|
</section>
|
|
<section class="auth-panel">
|
|
<button class="icon-control auth-theme-toggle" type="button" data-theme-toggle aria-label="Toggle light and dark mode"><?= icon('sun') ?></button>
|
|
<?php foreach ($flashes as $flash): ?>
|
|
<div class="flash <?= h($flash['type']) ?>"><span>!</span><?= h($flash['message']) ?></div>
|
|
<?php endforeach; ?>
|
|
<?= $content ?>
|
|
</section>
|
|
</main>
|
|
<script src="/assets/app.js?v=<?= (int) filemtime(APP_ROOT . '/public/assets/app.js') ?>"></script>
|
|
</body>
|
|
</html>
|