refactor admin CSS: replace utility classes with semantic styles
Replace Tailwind utility soup across admin templates with semantic
CSS classes. Add layout primitives (stack, row, cluster, grid),
extract JS transition helpers into transitions.css, and refactor
core_components, layouts, settings, newsletter, order_show, providers,
and theme editor templates.
Utility occurrences reduced from 290+ to 127 across admin files.
All 1679 tests pass.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 17:15:25 +00:00
|
|
|
<div class="admin-layout">
|
2026-03-05 15:29:05 +00:00
|
|
|
<input id="admin-drawer" type="checkbox" class="admin-layout-toggle" hidden />
|
2026-02-12 08:35:22 +00:00
|
|
|
|
|
|
|
|
<%!-- main content area --%>
|
2026-02-17 23:05:01 +00:00
|
|
|
<div class="admin-layout-content">
|
2026-02-12 08:35:22 +00:00
|
|
|
<%!-- mobile header --%>
|
2026-02-17 23:05:01 +00:00
|
|
|
<header class="admin-topbar">
|
|
|
|
|
<label
|
|
|
|
|
for="admin-drawer"
|
|
|
|
|
class="admin-btn admin-btn-ghost admin-btn-icon"
|
|
|
|
|
aria-label="Open navigation"
|
|
|
|
|
>
|
|
|
|
|
<.icon name="hero-bars-3" class="size-5" />
|
|
|
|
|
</label>
|
2026-02-18 21:23:15 +00:00
|
|
|
<span class="admin-topbar-title">Berrypod</span>
|
2026-02-17 23:05:01 +00:00
|
|
|
<.link href={~p"/"} class="admin-btn admin-btn-ghost admin-btn-sm">
|
|
|
|
|
<.icon name="hero-arrow-top-right-on-square-mini" class="size-4" /> Shop
|
|
|
|
|
</.link>
|
2026-02-12 08:35:22 +00:00
|
|
|
</header>
|
|
|
|
|
|
2026-03-07 09:30:07 +00:00
|
|
|
<.flash_group flash={@flash} />
|
|
|
|
|
|
2026-02-12 08:35:22 +00:00
|
|
|
<%!-- page content --%>
|
refactor admin CSS: replace utility classes with semantic styles
Replace Tailwind utility soup across admin templates with semantic
CSS classes. Add layout primitives (stack, row, cluster, grid),
extract JS transition helpers into transitions.css, and refactor
core_components, layouts, settings, newsletter, order_show, providers,
and theme editor templates.
Utility occurrences reduced from 290+ to 127 across admin files.
All 1679 tests pass.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 17:15:25 +00:00
|
|
|
<main class="admin-main">
|
|
|
|
|
<div class="admin-container">
|
2026-02-12 08:35:22 +00:00
|
|
|
{@inner_content}
|
|
|
|
|
</div>
|
|
|
|
|
</main>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<%!-- sidebar --%>
|
2026-02-17 23:05:01 +00:00
|
|
|
<div class="admin-sidebar-wrapper">
|
|
|
|
|
<label for="admin-drawer" class="admin-sidebar-overlay" aria-label="Close navigation"></label>
|
|
|
|
|
<aside class="admin-sidebar">
|
2026-02-12 08:35:22 +00:00
|
|
|
<%!-- nav links --%>
|
refactor admin CSS: replace utility classes with semantic styles
Replace Tailwind utility soup across admin templates with semantic
CSS classes. Add layout primitives (stack, row, cluster, grid),
extract JS transition helpers into transitions.css, and refactor
core_components, layouts, settings, newsletter, order_show, providers,
and theme editor templates.
Utility occurrences reduced from 290+ to 127 across admin files.
All 1679 tests pass.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 17:15:25 +00:00
|
|
|
<nav class="admin-sidebar-nav" aria-label="Admin navigation">
|
2026-02-28 20:17:03 +00:00
|
|
|
<div class="admin-nav-group">
|
|
|
|
|
<span class="admin-nav-heading">Shop</span>
|
|
|
|
|
<ul class="admin-nav">
|
|
|
|
|
<li>
|
|
|
|
|
<.link
|
|
|
|
|
navigate={~p"/admin"}
|
|
|
|
|
class={admin_nav_active?(@current_path, "/admin")}
|
|
|
|
|
>
|
|
|
|
|
<.icon name="hero-home" class="size-5" /> Dashboard
|
|
|
|
|
</.link>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<.link
|
|
|
|
|
navigate={~p"/admin/analytics"}
|
|
|
|
|
class={admin_nav_active?(@current_path, "/admin/analytics")}
|
|
|
|
|
>
|
|
|
|
|
<.icon name="hero-chart-bar" class="size-5" /> Analytics
|
|
|
|
|
</.link>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<.link
|
|
|
|
|
navigate={~p"/admin/orders"}
|
|
|
|
|
class={admin_nav_active?(@current_path, "/admin/orders")}
|
|
|
|
|
>
|
|
|
|
|
<.icon name="hero-shopping-bag" class="size-5" /> Orders
|
|
|
|
|
</.link>
|
|
|
|
|
</li>
|
add activity log with order timeline and global feed
Single activity_log table powering two views: chronological timeline
on each order detail page (replacing the old fulfilment card) and a
global feed at /admin/activity with tabs, category filters, search,
and pagination. Real-time via PubSub — new entries appear instantly,
nav badge updates across all admin pages.
Instrumented across all event points: Stripe webhooks, order notifier,
submission worker, fulfilment status worker, product sync worker, and
Oban exhausted-job telemetry. Contextual action buttons (retry
submission, retry sync, dismiss) with Oban unique constraints to
prevent double-enqueue. 90-day pruning via cron.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 15:09:08 +00:00
|
|
|
<li>
|
|
|
|
|
<.link
|
|
|
|
|
navigate={~p"/admin/activity"}
|
|
|
|
|
class={admin_nav_active?(@current_path, "/admin/activity")}
|
|
|
|
|
>
|
|
|
|
|
<.icon name="hero-bell" class="size-5" /> Activity
|
|
|
|
|
<span
|
|
|
|
|
:if={@attention_count > 0}
|
|
|
|
|
class="admin-badge admin-badge-sm admin-badge-warning ml-auto"
|
|
|
|
|
>
|
|
|
|
|
{@attention_count}
|
|
|
|
|
</span>
|
|
|
|
|
</.link>
|
|
|
|
|
</li>
|
2026-02-28 20:17:03 +00:00
|
|
|
<li>
|
|
|
|
|
<.link
|
|
|
|
|
navigate={~p"/admin/products"}
|
|
|
|
|
class={admin_nav_active?(@current_path, "/admin/products")}
|
|
|
|
|
>
|
|
|
|
|
<.icon name="hero-cube" class="size-5" /> Products
|
|
|
|
|
</.link>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<.link
|
|
|
|
|
navigate={~p"/admin/providers"}
|
|
|
|
|
class={admin_nav_active?(@current_path, "/admin/providers")}
|
|
|
|
|
>
|
|
|
|
|
<.icon name="hero-link" class="size-5" /> Print providers
|
|
|
|
|
</.link>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="admin-nav-group">
|
|
|
|
|
<span class="admin-nav-heading">Content</span>
|
|
|
|
|
<ul class="admin-nav">
|
|
|
|
|
<li>
|
|
|
|
|
<.link
|
|
|
|
|
navigate={~p"/admin/pages"}
|
|
|
|
|
class={admin_nav_active?(@current_path, "/admin/pages")}
|
|
|
|
|
>
|
|
|
|
|
<.icon name="hero-document" class="size-5" /> Pages
|
|
|
|
|
</.link>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<.link
|
|
|
|
|
navigate={~p"/admin/navigation"}
|
|
|
|
|
class={admin_nav_active?(@current_path, "/admin/navigation")}
|
|
|
|
|
>
|
|
|
|
|
<.icon name="hero-bars-3" class="size-5" /> Navigation
|
|
|
|
|
</.link>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<.link
|
|
|
|
|
navigate={~p"/admin/media"}
|
|
|
|
|
class={admin_nav_active?(@current_path, "/admin/media")}
|
|
|
|
|
>
|
|
|
|
|
<.icon name="hero-photo" class="size-5" /> Media
|
|
|
|
|
</.link>
|
|
|
|
|
</li>
|
2026-02-28 23:25:28 +00:00
|
|
|
<li>
|
|
|
|
|
<.link
|
|
|
|
|
navigate={~p"/admin/newsletter"}
|
|
|
|
|
class={admin_nav_active?(@current_path, "/admin/newsletter")}
|
|
|
|
|
>
|
|
|
|
|
<.icon name="hero-megaphone" class="size-5" /> Newsletter
|
|
|
|
|
</.link>
|
|
|
|
|
</li>
|
2026-02-28 20:17:03 +00:00
|
|
|
<li>
|
|
|
|
|
<.link
|
|
|
|
|
href={~p"/admin/theme"}
|
|
|
|
|
class={admin_nav_active?(@current_path, "/admin/theme")}
|
|
|
|
|
>
|
|
|
|
|
<.icon name="hero-paint-brush" class="size-5" /> Theme
|
|
|
|
|
</.link>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="admin-nav-group">
|
|
|
|
|
<span class="admin-nav-heading">Settings</span>
|
|
|
|
|
<ul class="admin-nav">
|
|
|
|
|
<li>
|
|
|
|
|
<.link
|
|
|
|
|
navigate={~p"/admin/settings"}
|
|
|
|
|
class={admin_nav_active?(@current_path, "/admin/settings")}
|
|
|
|
|
>
|
|
|
|
|
<.icon name="hero-cog-6-tooth" class="size-5" /> Settings
|
|
|
|
|
</.link>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<.link
|
|
|
|
|
navigate={~p"/admin/settings/email"}
|
|
|
|
|
class={admin_nav_active?(@current_path, "/admin/settings/email")}
|
|
|
|
|
>
|
|
|
|
|
<.icon name="hero-envelope" class="size-5" /> Email
|
|
|
|
|
</.link>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<.link
|
|
|
|
|
navigate={~p"/admin/redirects"}
|
|
|
|
|
class={admin_nav_active?(@current_path, "/admin/redirects")}
|
|
|
|
|
>
|
|
|
|
|
<.icon name="hero-arrow-uturn-right" class="size-5" /> Redirects
|
|
|
|
|
</.link>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</div>
|
2026-02-12 08:35:22 +00:00
|
|
|
</nav>
|
|
|
|
|
|
|
|
|
|
<%!-- sidebar footer --%>
|
refactor admin CSS: replace utility classes with semantic styles
Replace Tailwind utility soup across admin templates with semantic
CSS classes. Add layout primitives (stack, row, cluster, grid),
extract JS transition helpers into transitions.css, and refactor
core_components, layouts, settings, newsletter, order_show, providers,
and theme editor templates.
Utility occurrences reduced from 290+ to 127 across admin files.
All 1679 tests pass.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 17:15:25 +00:00
|
|
|
<div class="admin-sidebar-footer">
|
2026-02-17 23:05:01 +00:00
|
|
|
<ul class="admin-nav">
|
2026-03-05 15:29:05 +00:00
|
|
|
<li class="admin-sidebar-email truncate">
|
|
|
|
|
<.icon name="hero-user" class="size-5" /> {@current_scope.user.email}
|
|
|
|
|
</li>
|
2026-02-19 08:30:02 +00:00
|
|
|
<li>
|
2026-03-02 08:15:46 +00:00
|
|
|
<details class="admin-dev-tools">
|
|
|
|
|
<summary>
|
|
|
|
|
<.icon name="hero-wrench-screwdriver" class="size-5" /> Developer tools
|
|
|
|
|
<.icon name="hero-chevron-right" class="size-4 admin-dev-tools-chevron" />
|
|
|
|
|
</summary>
|
|
|
|
|
<ul class="admin-nav">
|
|
|
|
|
<li>
|
|
|
|
|
<.link href={~p"/admin/dashboard"}>
|
|
|
|
|
<.icon name="hero-chart-bar" class="size-5" /> LiveDashboard
|
|
|
|
|
</.link>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<.link href={~p"/admin/errors"}>
|
|
|
|
|
<.icon name="hero-bug-ant" class="size-5" /> Errors
|
|
|
|
|
</.link>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<.link href={~p"/admin/oban"}>
|
|
|
|
|
<.icon name="hero-queue-list" class="size-5" /> Jobs
|
|
|
|
|
</.link>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</details>
|
2026-03-02 07:44:06 +00:00
|
|
|
</li>
|
2026-02-12 08:35:22 +00:00
|
|
|
<li>
|
|
|
|
|
<.link href={~p"/users/log-out"} method="delete">
|
|
|
|
|
<.icon name="hero-arrow-right-start-on-rectangle" class="size-5" /> Log out
|
|
|
|
|
</.link>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</div>
|
|
|
|
|
</aside>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|