- Implemented the full Fat Bottom Grille storefront and staff dashboard.
Highlights include configurable menus, specials, cart/checkout, taxes, customer accounts with email 2FA, newsletters, analytics, refunds, PDF/CSV exports, Square/Mailgun adapters, and optional MySQL migration. See README.md for setup and production configuration. Verified PHP/JavaScript syntax, responsive layouts, registration, 2FA, checkout, dashboard workflows, settings persistence, and PDF generation. Real Square, Mailgun, and MySQL connections require credentials/server access. Square implementation follows the official Payments API and Refunds API.
This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
<section class="hero">
|
||||
<div class="hero-texture"></div>
|
||||
<div class="container hero-grid">
|
||||
<div class="hero-copy">
|
||||
<span class="eyebrow">Keyser made. Come hungry.</span>
|
||||
<h1>Big flavor.<br><em>No shortcuts.</em></h1>
|
||||
<p>Stacked burgers, loaded burritos, and dinner plates that eat like Sunday supper. Order ahead and we will have it hot.</p>
|
||||
<div class="hero-actions">
|
||||
<a class="button button-large" href="/menu">Start Your Order</a>
|
||||
<?php if ($config->get('business.phone')): ?>
|
||||
<a class="text-link" href="tel:<?= e(preg_replace('/[^0-9+]/', '', (string) $config->get('business.phone'))) ?>">
|
||||
Call <?= e($config->get('business.phone')) ?>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div class="hero-meta">
|
||||
<span>Pickup in about <?= (int) $config->get('ordering.pickup_eta_minutes', 25) ?> minutes</span>
|
||||
<span><?= (bool) $config->get('ordering.accepting_orders', true) ? 'Ordering now open' : 'Ordering currently paused' ?></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hero-plate" aria-hidden="true">
|
||||
<div class="plate-ring">
|
||||
<div class="burger">
|
||||
<span class="bun bun-top"></span>
|
||||
<span class="lettuce"></span>
|
||||
<span class="cheese"></span>
|
||||
<span class="patty"></span>
|
||||
<span class="onion"></span>
|
||||
<span class="patty patty-two"></span>
|
||||
<span class="bun bun-bottom"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hero-stamp">
|
||||
<strong>410</strong>
|
||||
<span>W Piedmont</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<?php if ($specials): ?>
|
||||
<section class="specials-section section">
|
||||
<div class="container">
|
||||
<div class="section-heading">
|
||||
<div>
|
||||
<span class="eyebrow">Happening now</span>
|
||||
<h2>Today’s Specials</h2>
|
||||
</div>
|
||||
<a class="text-link" href="/menu">See the full menu</a>
|
||||
</div>
|
||||
<div class="special-grid special-count-<?= min(count($specials), 4) ?>">
|
||||
<?php foreach ($specials as $special): ?>
|
||||
<article class="special-card">
|
||||
<span class="special-badge"><?= e($special['badge']) ?></span>
|
||||
<h3><?= e($special['title']) ?></h3>
|
||||
<p><?= e($special['description']) ?></p>
|
||||
<div class="special-footer">
|
||||
<?php if ($special['price_cents'] !== null): ?>
|
||||
<strong><?= money($special['price_cents']) ?></strong>
|
||||
<?php endif; ?>
|
||||
<?php if ($special['menu_item_id']): ?>
|
||||
<form action="/cart/add" method="post">
|
||||
<?= csrf_field() ?>
|
||||
<input type="hidden" name="menu_item_id" value="<?= (int) $special['menu_item_id'] ?>">
|
||||
<input type="hidden" name="quantity" value="1">
|
||||
<input type="hidden" name="return_to" value="/">
|
||||
<button class="button button-small button-light" type="submit">Add Item</button>
|
||||
</form>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</article>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<?php endif; ?>
|
||||
|
||||
<section class="section menu-preview">
|
||||
<div class="container">
|
||||
<div class="section-heading">
|
||||
<div>
|
||||
<span class="eyebrow">Built to satisfy</span>
|
||||
<h2>Local Favorites</h2>
|
||||
</div>
|
||||
<p>These are the orders that keep showing up at the counter.</p>
|
||||
</div>
|
||||
<div class="menu-grid">
|
||||
<?php foreach ($featured as $item): ?>
|
||||
<?php \FatBottom\Core\View::partial('partials/menu-card', compact('item')); ?>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="category-band">
|
||||
<div class="container">
|
||||
<span class="eyebrow">Pick your direction</span>
|
||||
<div class="category-links">
|
||||
<?php foreach ($categories as $category): ?>
|
||||
<a href="/menu#<?= e($category['slug']) ?>">
|
||||
<strong><?= e($category['name']) ?></strong>
|
||||
<span><?= count($category['items']) ?> picks</span>
|
||||
</a>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="story-section section">
|
||||
<div class="container story-grid">
|
||||
<div class="story-art" aria-hidden="true">
|
||||
<span class="story-number">26726</span>
|
||||
<div class="mountain-lines"></div>
|
||||
</div>
|
||||
<div>
|
||||
<span class="eyebrow">Proudly from Keyser</span>
|
||||
<h2>Food that shows up hungry.</h2>
|
||||
<p>Fat Bottom Grille is the kind of place where the portions are honest and nobody leaves wondering what is for dinner. Find us at 410 W Piedmont Street, right here in Keyser.</p>
|
||||
<a class="button button-outline" href="/menu">Order for Pickup</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
Reference in New Issue
Block a user