- Implemented the Lakeside Orders demo rebrand:

New licensed lake, picnic, dining, server, burger, and food photography.
Rebuilt homepage gallery, logo, colors, copy, menu, specials, and 
exports.
Added dashboard-configurable branding in [settings.php (line 
18)](/Users/tyemeclifford/Documents/GH/fatbottomgrille/views/admin/settings.php:18).
Added a public attribution page and full [image 
credits](/Users/tyemeclifford/Documents/GH/fatbottomgrille/public/assets/images/CREDITS.md).
Migrated existing SQLite menu data and admin email to 
admin@lakesideorders.test.
Verified 51 PHP files, JSON/JavaScript, storefront pages, database 
migration, admin settings, and menu PDF. All passed.
This commit is contained in:
Ty Clifford
2026-06-14 14:26:09 -04:00
parent 03348cad79
commit b14f4c1796
33 changed files with 531 additions and 123 deletions
+1 -1
View File
@@ -7,7 +7,7 @@
<div class="admin-panel-heading"><div><span class="eyebrow">Send an update</span><h2>New Newsletter</h2></div></div>
<form class="form-stack" action="<?= e(url('/admin/newsletters/send')) ?>" method="post">
<?= csrf_field() ?>
<label>Subject line<input type="text" name="subject" maxlength="140" required placeholder="This weekend at Fat Bottom Grille"></label>
<label>Subject line<input type="text" name="subject" maxlength="140" required placeholder="This weekend at <?= e($config->get('business.name')) ?>"></label>
<label>Message<textarea name="content" rows="12" required placeholder="Share a new special, schedule update, or note from the kitchen..."></textarea></label>
<div class="notice">Every email includes an unsubscribe link. Users can also opt out from My Account.</div>
<button class="button button-large button-block" type="submit" data-confirm="Send this newsletter to every opted-in user?">Send to <?= (int) $recipientCount ?> Subscribers</button>
+21
View File
@@ -15,6 +15,27 @@
<label class="field-wide">Announcement bar<input type="text" name="business[announcement]" value="<?= e($config->get('business.announcement')) ?>"></label>
</div>
</section>
<section class="admin-panel">
<div class="admin-panel-heading"><div><span class="eyebrow">Storefront presentation</span><h2>Branding & Homepage</h2></div></div>
<div class="notice">Edit the demo message and active image paths here. Image files live in <code>public/assets/images</code>.</div>
<div class="form-grid">
<label>Location label<input type="text" name="branding[location_label]" value="<?= e($config->get('branding.location_label')) ?>"></label>
<label>Hero eyebrow<input type="text" name="branding[hero_eyebrow]" value="<?= e($config->get('branding.hero_eyebrow')) ?>"></label>
<label>Hero heading<input type="text" name="branding[hero_heading]" value="<?= e($config->get('branding.hero_heading')) ?>"></label>
<label>Hero emphasized line<input type="text" name="branding[hero_emphasis]" value="<?= e($config->get('branding.hero_emphasis')) ?>"></label>
<label class="field-wide">Search description<textarea name="branding[meta_description]" rows="2"><?= e($config->get('branding.meta_description')) ?></textarea></label>
<label class="field-wide">Hero introduction<textarea name="branding[hero_intro]" rows="3"><?= e($config->get('branding.hero_intro')) ?></textarea></label>
<label>Hero food image<input type="text" name="branding[hero_image]" value="<?= e($config->get('branding.hero_image')) ?>"></label>
<label>Picnic gallery image<input type="text" name="branding[gallery_picnic_image]" value="<?= e($config->get('branding.gallery_picnic_image')) ?>"></label>
<label>Patio gallery image<input type="text" name="branding[gallery_patio_image]" value="<?= e($config->get('branding.gallery_patio_image')) ?>"></label>
<label>Service gallery image<input type="text" name="branding[gallery_service_image]" value="<?= e($config->get('branding.gallery_service_image')) ?>"></label>
<label>Story image<input type="text" name="branding[story_image]" value="<?= e($config->get('branding.story_image')) ?>"></label>
<label>Story eyebrow<input type="text" name="branding[story_eyebrow]" value="<?= e($config->get('branding.story_eyebrow')) ?>"></label>
<label>Story heading<input type="text" name="branding[story_heading]" value="<?= e($config->get('branding.story_heading')) ?>"></label>
<label class="field-wide">Story text<textarea name="branding[story_text]" rows="3"><?= e($config->get('branding.story_text')) ?></textarea></label>
<label class="field-wide">Footer tagline<input type="text" name="branding[footer_tagline]" value="<?= e($config->get('branding.footer_tagline')) ?>"></label>
</div>
</section>
<section class="admin-panel">
<div class="admin-panel-heading"><div><span class="eyebrow">Kitchen controls</span><h2>Online Ordering</h2></div></div>
<div class="settings-row">