feat: Light mode default, auth, Posts rename, display scaling, TinyMCE improvements

This commit is contained in:
Jess Rogerson
2026-05-21 14:22:46 +10:00
parent 51d086dab9
commit 39fcd9ec6e
154 changed files with 12897 additions and 133 deletions
+12 -16
View File
@@ -1,20 +1,16 @@
@model Device
@{ ViewData["Title"] = "New Kitten"; }
<div class="row justify-content-center">
<div class="col-md-8 col-lg-6">
<div class="card"><div class="card-body">
<form asp-action="Create" method="post">
@Html.AntiForgeryToken()
<div class="mb-3"><label asp-for="Name" class="form-label">Display Name *</label><input asp-for="Name" class="form-control" placeholder="e.g. Front of House" required /><span asp-validation-for="Name" class="text-danger"></span></div>
<div class="mb-3"><label asp-for="Slug" class="form-label">URL Slug *</label><div class="input-group"><span class="input-group-text">/</span><input asp-for="Slug" class="form-control font-monospace" placeholder="frontofhouse" /></div><div class="form-text">Lowercase, no spaces. Auto-generated from name if left empty.</div><span asp-validation-for="Slug" class="text-danger"></span></div>
<div class="row g-3 mb-3"><div class="col-6"><label asp-for="ResolutionWidth" class="form-label">Width (px)</label><input asp-for="ResolutionWidth" class="form-control" type="number" min="320" max="7680" /></div><div class="col-6"><label asp-for="ResolutionHeight" class="form-label">Height (px)</label><input asp-for="ResolutionHeight" class="form-control" type="number" min="240" max="4320" /></div></div>
<div class="mb-3"><label class="form-label">Quick Presets</label><div class="d-flex flex-wrap gap-2"><button type="button" class="btn btn-sm btn-outline-secondary" onclick="setRes(1920,1080)">1080p</button><button type="button" class="btn btn-sm btn-outline-secondary" onclick="setRes(3840,2160)">4K</button><button type="button" class="btn btn-sm btn-outline-secondary" onclick="setRes(1080,1920)">Portrait</button><button type="button" class="btn btn-sm btn-outline-secondary" onclick="setRes(1280,720)">720p</button></div></div>
<div class="mb-4"><label asp-for="Transition" class="form-label">Transition Effect</label><select asp-for="Transition" class="form-select"><option value="fade">Fade</option><option value="slide">Slide</option><option value="none">None</option></select></div>
<div class="d-grid gap-2"><button type="submit" class="btn btn-primary btn-lg"><i class="bi bi-check-lg me-1"></i>Create Kitten</button><a href="/admin/devices" class="btn btn-outline-secondary">Cancel</a></div>
</form>
</div></div>
</div>
</div>
@{ ViewData["Title"] = "New Post"; }
<div class="row justify-content-center"><div class="col-md-8 col-lg-6"><div class="card"><div class="card-body">
<form asp-action="Create" method="post">
@Html.AntiForgeryToken()
<div class="mb-3"><label asp-for="Name" class="form-label">Display Name *</label><input asp-for="Name" class="form-control" placeholder="e.g. Front of House" required /><span asp-validation-for="Name" class="text-danger"></span></div>
<div class="mb-3"><label asp-for="Slug" class="form-label">URL Slug *</label><div class="input-group"><span class="input-group-text">/</span><input asp-for="Slug" class="form-control font-monospace" placeholder="frontofhouse" /></div><div class="form-text">Lowercase, no spaces. Auto-generated from name if left empty.</div><span asp-validation-for="Slug" class="text-danger"></span></div>
<div class="row g-3 mb-3"><div class="col-6"><label asp-for="ResolutionWidth" class="form-label">Width (px)</label><input asp-for="ResolutionWidth" class="form-control" type="number" min="320" max="7680" /></div><div class="col-6"><label asp-for="ResolutionHeight" class="form-label">Height (px)</label><input asp-for="ResolutionHeight" class="form-control" type="number" min="240" max="4320" /></div></div>
<div class="mb-3"><label class="form-label">Quick Presets</label><div class="d-flex flex-wrap gap-2"><button type="button" class="btn btn-sm btn-outline-secondary" onclick="setRes(1920,1080)">1080p</button><button type="button" class="btn btn-sm btn-outline-secondary" onclick="setRes(3840,2160)">4K</button><button type="button" class="btn btn-sm btn-outline-secondary" onclick="setRes(1080,1920)">Portrait</button><button type="button" class="btn btn-sm btn-outline-secondary" onclick="setRes(1280,720)">720p</button></div></div>
<div class="mb-4"><label asp-for="Transition" class="form-label">Transition Effect</label><select asp-for="Transition" class="form-select"><option value="fade">Fade</option><option value="slide">Slide</option><option value="none">None</option></select></div>
<div class="d-grid gap-2"><button type="submit" class="btn btn-primary btn-lg"><i class="bi bi-check-lg me-1"></i>Create Post</button><a href="/admin/devices" class="btn btn-outline-secondary">Cancel</a></div>
</form>
</div></div></div></div>
@section Scripts {
<script>
function setRes(w,h){document.getElementById('ResolutionWidth').value=w;document.getElementById('ResolutionHeight').value=h;}
+1 -1
View File
@@ -3,7 +3,7 @@
<div class="row justify-content-center"><div class="col-md-6"><div class="card border-danger">
<div class="card-header bg-danger text-white"><h5 class="mb-0"><i class="bi bi-exclamation-triangle me-2"></i>Confirm Deletion</h5></div>
<div class="card-body">
<p>Are you sure you want to delete the kitten <strong>"@Model.Name"</strong>?</p>
<p>Are you sure you want to delete the post <strong>"@Model.Name"</strong>?</p>
<p class="text-muted">URL: <code>/@Model.Slug</code> · @Model.DeviceSlides.Count slide(s) assigned</p>
<p class="text-muted">This will remove the device and its playlist. Slides themselves will not be deleted.</p>
<form asp-action="Delete" method="post">
+4 -4
View File
@@ -1,8 +1,8 @@
@model List<Device>
@{ ViewData["Title"] = "Kittens (Devices)"; }
@{ ViewData["Title"] = "Posts (Devices)"; }
@section HeaderActions {
<a href="/admin/devices/create" class="btn btn-primary"><i class="bi bi-plus-lg me-1"></i>New Kitten</a>
<a href="/admin/devices/create" class="btn btn-primary"><i class="bi bi-plus-lg me-1"></i>New Post</a>
}
@if (Model.Any())
@@ -42,8 +42,8 @@ else
{
<div class="empty-state">
<i class="bi bi-display" style="font-size:3em;"></i>
<h4 class="mt-3">No kittens yet</h4>
<h4 class="mt-3">No posts yet</h4>
<p class="text-muted">Create your first display device.</p>
<a href="/admin/devices/create" class="btn btn-primary"><i class="bi bi-plus-lg me-1"></i>Create Kitten</a>
<a href="/admin/devices/create" class="btn btn-primary"><i class="bi bi-plus-lg me-1"></i>Create Post</a>
</div>
}
+1 -1
View File
@@ -53,7 +53,7 @@
</div>
</div>
<div class="col-lg-4">
<div class="card mb-4"><div class="card-header"><h6 class="mb-0">Kitten Info</h6></div><div class="card-body"><p class="mb-1"><strong>@Model.Name</strong></p><p class="mb-1 text-muted"><code>/@Model.Slug</code></p><p class="mb-0 text-muted">@(Model.ResolutionWidth)x@(Model.ResolutionHeight) · @Model.Transition</p></div></div>
<div class="card mb-4"><div class="card-header"><h6 class="mb-0">Post Info</h6></div><div class="card-body"><p class="mb-1"><strong>@Model.Name</strong></p><p class="mb-1 text-muted"><code>/@Model.Slug</code></p><p class="mb-0 text-muted">@(Model.ResolutionWidth)x@(Model.ResolutionHeight) · @Model.Transition</p></div></div>
<div class="card"><div class="card-header"><h6 class="mb-0"><i class="bi bi-plus-circle me-1"></i>Add Meow</h6></div><div class="card-body">
@if (availableSlides != null && availableSlides.Any())
{