| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- <?php
- // layout.php – shared admin HTML chrome
- // Call admin_head($title) and admin_foot() around content.
- function admin_head(string $title, string $active = ''): void {
- $nav = [
- 'index.php' => 'Dashboard',
- 'activities.php' => 'Activities',
- 'activity_groups.php'=> 'Activity Groups',
- 'items.php' => 'Items',
- 'item_groups.php' => 'Item Groups',
- 'mappings.php' => 'Mappings',
- ];
- ?>
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>PackIt Admin – <?= htmlspecialchars($title) ?></title>
- <link rel="preconnect" href="https://fonts.googleapis.com">
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
- <link href="https://fonts.googleapis.com/css2?family=Bebas+Neue&family=DM+Sans:wght@300;400;500;600&display=swap" rel="stylesheet">
- <style>
- :root{--bg:#0f1117;--surface:#181c27;--border:#2a2f3f;--accent:#e8c547;--accent2:#4fd1c5;--text:#e8eaf0;--muted:#7a8099;--danger:#e05555;--green:#5cb85c;--radius:8px;}
- *,*::before,*::after{box-sizing:border-box;margin:0;padding:0;}
- body{background:var(--bg);color:var(--text);font-family:'DM Sans',sans-serif;font-size:14px;display:flex;min-height:100vh;}
- /* sidebar */
- .sidebar{width:200px;flex-shrink:0;background:var(--surface);border-right:1px solid var(--border);display:flex;flex-direction:column;padding:1.5rem 0;}
- .sidebar-logo{font-family:'Bebas Neue',sans-serif;font-size:1.8rem;color:var(--accent);letter-spacing:.05em;padding:0 1.25rem .5rem;}
- .sidebar-sub{font-size:.7rem;color:var(--muted);letter-spacing:.1em;text-transform:uppercase;padding:0 1.25rem 1.5rem;}
- .nav-link{display:block;padding:.55rem 1.25rem;color:var(--muted);text-decoration:none;font-size:.85rem;font-weight:500;border-left:3px solid transparent;transition:color .15s,border-color .15s,background .15s;}
- .nav-link:hover{color:var(--text);background:rgba(255,255,255,.03);}
- .nav-link.active{color:var(--accent);border-left-color:var(--accent);background:rgba(232,197,71,.05);}
- .nav-sep{height:1px;background:var(--border);margin:.5rem 1.25rem;}
- .sidebar-footer{margin-top:auto;padding:1rem 1.25rem;}
- .btn-logout{display:block;text-align:center;padding:.5rem;background:transparent;border:1px solid var(--border);border-radius:var(--radius);color:var(--muted);font-size:.8rem;cursor:pointer;text-decoration:none;transition:all .15s;width:100%;}
- .btn-logout:hover{border-color:var(--danger);color:var(--danger);}
- /* main */
- .admin-main{flex:1;display:flex;flex-direction:column;min-width:0;}
- .admin-topbar{padding:.9rem 1.75rem;border-bottom:1px solid var(--border);font-size:.85rem;color:var(--muted);display:flex;align-items:center;justify-content:space-between;}
- .admin-content{padding:1.75rem;flex:1;}
- h1{font-family:'Bebas Neue',sans-serif;font-size:1.8rem;letter-spacing:.05em;color:var(--accent);margin-bottom:1.25rem;}
- h2{font-size:1rem;font-weight:600;margin-bottom:.75rem;color:var(--text);}
- /* table */
- .tbl{width:100%;border-collapse:collapse;margin-bottom:1.5rem;}
- .tbl th{text-align:left;font-size:.75rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);padding:.6rem .9rem;border-bottom:1px solid var(--border);}
- .tbl td{padding:.6rem .9rem;border-bottom:1px solid rgba(42,47,63,.6);vertical-align:middle;}
- .tbl tr:hover td{background:rgba(255,255,255,.02);}
- /* form card */
- .card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:1.25rem 1.5rem;margin-bottom:1.5rem;}
- label{display:block;font-size:.8rem;font-weight:500;color:var(--muted);margin-bottom:.3rem;letter-spacing:.04em;text-transform:uppercase;}
- input[type=text],input[type=password],input[type=number],select,textarea{width:100%;background:var(--bg);border:1.5px solid var(--border);color:var(--text);padding:.55rem .8rem;border-radius:var(--radius);font-family:'DM Sans',sans-serif;font-size:.9rem;outline:none;transition:border-color .15s;margin-bottom:.9rem;}
- input:focus,select:focus,textarea:focus{border-color:var(--accent2);}
- .form-row{display:grid;grid-template-columns:1fr 1fr;gap:1rem;}
- /* buttons */
- .btn{display:inline-flex;align-items:center;gap:.4rem;padding:.5rem 1rem;border-radius:var(--radius);font-family:'DM Sans',sans-serif;font-size:.83rem;font-weight:500;cursor:pointer;border:1.5px solid transparent;text-decoration:none;transition:all .15s;}
- .btn-sm{padding:.3rem .7rem;font-size:.78rem;}
- .btn-primary{background:var(--accent);color:#0f1117;border-color:var(--accent);}
- .btn-primary:hover{background:#f0d260;}
- .btn-danger{background:transparent;color:var(--danger);border-color:var(--danger);}
- .btn-danger:hover{background:rgba(224,85,85,.08);}
- .btn-secondary{background:transparent;color:var(--text);border-color:var(--border);}
- .btn-secondary:hover{border-color:var(--muted);}
- .btn-teal{background:transparent;color:var(--accent2);border-color:var(--accent2);}
- .btn-teal:hover{background:rgba(79,209,197,.08);}
- /* alerts */
- .alert{padding:.75rem 1rem;border-radius:var(--radius);margin-bottom:1rem;font-size:.85rem;}
- .alert-success{background:rgba(92,184,92,.1);border:1px solid rgba(92,184,92,.3);color:var(--green);}
- .alert-error{background:rgba(224,85,85,.1);border:1px solid rgba(224,85,85,.3);color:var(--danger);}
- /* badges */
- .badge{display:inline-block;padding:.15rem .55rem;border-radius:999px;font-size:.72rem;font-weight:600;letter-spacing:.04em;}
- .badge-group{background:rgba(79,209,197,.1);color:var(--accent2);border:1px solid rgba(79,209,197,.3);}
- </style>
- </head>
- <body>
- <aside class="sidebar">
- <div class="sidebar-logo">PackIt</div>
- <div class="sidebar-sub">Admin Panel</div>
- <?php foreach ($nav as $file => $label): ?>
- <a href="<?= $file ?>" class="nav-link <?= $active === $file ? 'active' : '' ?>"><?= $label ?></a>
- <?php endforeach; ?>
- <div class="nav-sep"></div>
- <a href="../index.php" class="nav-link" style="font-size:.78rem">← Back to site</a>
- <div class="sidebar-footer">
- <a href="logout.php" class="btn-logout">Log out</a>
- </div>
- </aside>
- <div class="admin-main">
- <div class="admin-topbar">
- <span>PackIt Admin</span>
- <span style="color:var(--accent);font-weight:500"><?= htmlspecialchars($_SESSION['admin_user'] ?? '') ?></span>
- </div>
- <div class="admin-content">
- <?php } // end admin_head
- function admin_foot(): void { ?>
- </div></div></body></html>
- <?php }
- function flash(string $key, string $msg): void {
- $_SESSION["flash_$key"] = $msg;
- }
- function get_flash(string $key): string {
- $msg = $_SESSION["flash_$key"] ?? '';
- unset($_SESSION["flash_$key"]);
- return $msg;
- }
- function show_alerts(): void {
- $s = get_flash('success');
- $e = get_flash('error');
- if ($s) echo '<div class="alert alert-success">' . htmlspecialchars($s) . '</div>';
- if ($e) echo '<div class="alert alert-error">' . htmlspecialchars($e) . '</div>';
- }
|