fix: UI standardization and sidebar improvements

- Fix sidebar menu items requiring double-click (checkbox overlay issue)
- Remove jittery scroll animation on sidebar navigation
- Remove green search button, use neutral icon instead
- Standardize dropdown menus across all pages (btn instead of label, menu-sm)
- Fix brand dashboard topPerformer undefined key error
- Fix product hashid validation for image routes
- Initialize Alpine.js search state from URL params on products page
- Update theme colors in tailwind config
This commit is contained in:
kelly
2025-12-11 01:37:41 -07:00
parent 8d9725b501
commit 37204edfd7
33 changed files with 178 additions and 171 deletions

View File

@@ -126,6 +126,13 @@
.collapse {
input {
@apply min-h-8 p-0;
/* Only cover the collapse-title, not the content */
position: absolute;
top: 0;
left: 0;
right: 0;
height: 2rem; /* Match min-h-8 */
z-index: 1;
}
.collapse-title {
@@ -247,15 +254,15 @@ html:not([data-theme="material"], [data-theme="material-dark"]) {
/* == Cannabrands Brand Colors ==
* DO NOT CHANGE THESE COLORS!
* Primary: #4B6FA4 (muted blue)
* Success: #4E8D71 (muted green)
* Primary: #4E8D71 (green - main action color)
* Info: #4B6FA4 (blue - informational)
* Error: #E1524D (clean red)
* These are the official brand colors. */
--color-primary: #4B6FA4;
--color-primary: #4E8D71;
--color-primary-content: #ffffff;
--color-secondary: #4B6FA4;
--color-secondary-content: #ffffff;
--color-accent: #4B6FA4;
--color-accent: #4E8D71;
--color-accent-content: #ffffff;
--color-neutral: #374151;
--color-neutral-content: #ffffff;
@@ -302,11 +309,11 @@ html:not([data-theme="material"], [data-theme="material-dark"]) {
/* == Cannabrands Brand Colors (Dark) ==
* DO NOT CHANGE THESE COLORS!
* See light theme for brand color documentation. */
--color-primary: #5A7FB4;
--color-primary: #5E9D81;
--color-primary-content: #ffffff;
--color-secondary: #5A7FB4;
--color-secondary-content: #ffffff;
--color-accent: #5A7FB4;
--color-accent: #5E9D81;
--color-accent-content: #ffffff;
--color-neutral: #9ca3af;
--color-neutral-content: #1e2832;

View File

@@ -5,24 +5,21 @@
--}}
@php
$statusConfig = [
// New orders (primary - blue)
'new' => ['label' => 'New', 'class' => 'badge-primary'],
// All active/in-progress states (neutral - gray)
'buyer_modified' => ['label' => 'Modified', 'class' => 'badge-neutral'],
'seller_modified' => ['label' => 'Modified', 'class' => 'badge-neutral'],
'accepted' => ['label' => 'Accepted', 'class' => 'badge-neutral'],
'in_progress' => ['label' => 'In Progress', 'class' => 'badge-neutral'],
'ready_for_delivery' => ['label' => 'Buyer Review', 'class' => 'badge-neutral'],
'out_for_delivery' => ['label' => 'Delivering', 'class' => 'badge-neutral'],
'ready_for_manifest' => ['label' => 'Ready', 'class' => 'badge-neutral'],
'approved_for_delivery' => ['label' => 'Ready', 'class' => 'badge-neutral'],
'delivered' => ['label' => 'Delivered', 'class' => 'badge-neutral'],
'buyer_approved' => ['label' => 'Complete', 'class' => 'badge-neutral'],
'completed' => ['label' => 'Complete', 'class' => 'badge-neutral'],
// Terminal error states only (error - muted red)
'cancelled' => ['label' => 'Cancelled', 'class' => 'badge-error'],
'rejected' => ['label' => 'Rejected', 'class' => 'badge-error'],
// All statuses use ghost (no color) style
'new' => ['label' => 'New', 'class' => 'badge-ghost'],
'buyer_modified' => ['label' => 'Modified', 'class' => 'badge-ghost'],
'seller_modified' => ['label' => 'Modified', 'class' => 'badge-ghost'],
'accepted' => ['label' => 'Accepted', 'class' => 'badge-ghost'],
'in_progress' => ['label' => 'In Progress', 'class' => 'badge-ghost'],
'ready_for_delivery' => ['label' => 'Buyer Review', 'class' => 'badge-ghost'],
'out_for_delivery' => ['label' => 'Delivering', 'class' => 'badge-ghost'],
'ready_for_manifest' => ['label' => 'Ready', 'class' => 'badge-ghost'],
'approved_for_delivery' => ['label' => 'Ready', 'class' => 'badge-ghost'],
'delivered' => ['label' => 'Delivered', 'class' => 'badge-ghost'],
'buyer_approved' => ['label' => 'Complete', 'class' => 'badge-ghost'],
'completed' => ['label' => 'Complete', 'class' => 'badge-ghost'],
'cancelled' => ['label' => 'Cancelled', 'class' => 'badge-ghost'],
'rejected' => ['label' => 'Rejected', 'class' => 'badge-ghost'],
];
$config = $statusConfig[$status] ?? ['label' => ucfirst(str_replace('_', ' ', $status)), 'class' => 'badge-neutral'];

View File

@@ -25,20 +25,11 @@
<div class="size-full overflow-y-auto"
x-data="{
init() {
// Wait for collapse animations to complete (they take ~300ms)
setTimeout(() => {
// Scroll the active menu item into view
const activeItem = this.$el.querySelector('.menu-item.active');
if (activeItem) {
activeItem.scrollIntoView({ behavior: 'smooth', block: 'center' });
} else {
// Fallback to saved scroll position
const savedScroll = localStorage.getItem('sidebar-scroll-position');
if (savedScroll) {
this.$el.scrollTop = parseInt(savedScroll);
}
}
}, 350);
// Restore scroll position immediately (no animation)
const savedScroll = localStorage.getItem('sidebar-scroll-position');
if (savedScroll) {
this.$el.scrollTop = parseInt(savedScroll);
}
}
}"
@scroll.debounce.150ms="localStorage.setItem('sidebar-scroll-position', $el.scrollTop)">

View File

@@ -82,9 +82,10 @@
name="{{ $searchName }}"
value="{{ $searchValue }}"
placeholder="{{ $searchPlaceholder }}"
class="input input-sm input-bordered w-full pr-8 bg-base-100">
<button type="submit" class="absolute right-1.5 top-1/2 -translate-y-1/2 btn btn-ghost btn-xs btn-circle">
<span class="icon-[heroicons--magnifying-glass] size-4 text-base-content/30"></span>
class="input input-sm input-bordered w-full pr-10 bg-base-100"
onkeydown="if(event.key==='Enter'){this.form.submit();}">
<button type="submit" class="absolute right-2.5 top-1/2 -translate-y-1/2" title="Search">
<span class="icon-[heroicons--magnifying-glass] size-4 text-base-content/30 hover:text-base-content/60"></span>
</button>
</div>

View File

@@ -199,7 +199,7 @@
</div>
{{-- Brand Insights Section (Mini Tiles) --}}
@if(isset($brandInsights))
@if(!empty($brandInsights) && isset($brandInsights['topPerformer']))
<div class="space-y-3">
<div class="flex items-center gap-2">
<span class="icon-[heroicons--light-bulb] size-4 text-base-content/50"></span>
@@ -348,11 +348,11 @@
</tr>
</thead>
<tbody>
@forelse($brand->products->take(5) as $product)
@forelse($brand->products->filter(fn($p) => !empty($p->hashid))->take(5) as $product)
<tr class="hover:bg-base-200/30 transition-colors">
<td class="pl-5">
<div class="flex items-center gap-3">
@if($product->image_path)
@if($product->image_path && $product->hashid)
<div class="avatar">
<div class="w-10 h-10 rounded-lg bg-base-200/50">
<img src="{{ route('image.product', [$product->hashid, 80]) }}" alt="{{ $product->name }}" class="object-contain" />

View File

@@ -19,10 +19,10 @@
</a>
{{-- Quick Actions Dropdown --}}
<div class="dropdown dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</label>
<ul tabindex="0" class="dropdown-content z-10 menu p-2 shadow-sm bg-base-100 rounded-lg w-52 border border-base-300">
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-52 border border-base-300 z-[100]">
<li>
<a href="{{ route('seller.business.crm.leads.create', $business->slug) }}" class="gap-2">
<span class="icon-[heroicons--user-plus] size-4"></span>

View File

@@ -90,10 +90,10 @@
{{-- Actions Dropdown --}}
<div class="dropdown {{ $loop->last ? 'dropdown-top' : '' }} dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</label>
<ul tabindex="0" class="dropdown-content menu p-2 shadow-lg bg-base-100 rounded-2xl w-40 z-[100] border border-base-200 {{ $loop->last ? 'mb-1' : '' }}">
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100] {{ $loop->last ? 'mb-1' : '' }}">
<li>
<a href="{{ route('seller.business.crm.automations.show', [$business, $automation]) }}">
<span class="icon-[heroicons--eye] size-4"></span>

View File

@@ -38,10 +38,10 @@
</form>
@endif
<div class="dropdown dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-5"></span>
</label>
<ul tabindex="0" class="dropdown-content z-10 menu p-2 shadow bg-base-100 rounded-box w-48">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
<li>
<a href="{{ route('seller.business.crm.calendar.index', $business->slug) }}?date={{ $event->start_at->format('Y-m-d') }}">
<span class="icon-[heroicons--calendar] size-4"></span>

View File

@@ -27,12 +27,10 @@
</form>
@endif
<div class="dropdown dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-sm">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z" />
</svg>
</label>
<ul tabindex="0" class="dropdown-content menu p-2 shadow bg-base-100 rounded-box w-52">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
<li><a href="{{ route('seller.business.crm.quotes.create', ['business' => $business, 'deal_id' => $deal->id]) }}">Create Quote</a></li>
<li>
<form method="POST" action="{{ route('seller.business.crm.deals.destroy', [$business, $deal]) }}" onsubmit="return confirm('Delete this deal?')">

View File

@@ -132,12 +132,12 @@
{{ \App\Models\Crm\CrmLead::STATUSES[$lead->status] ?? $lead->status }}
</span>
</td>
<td>
<td class="py-2 align-middle text-right">
<div class="dropdown dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</label>
<ul tabindex="0" class="dropdown-content z-10 menu menu-sm p-2 shadow-lg bg-base-100 rounded-box w-52">
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
<li>
<a href="{{ route('seller.business.crm.leads.show', [$business->slug, $lead->hashid]) }}">
<span class="icon-[heroicons--eye] size-4"></span>

View File

@@ -127,12 +127,12 @@
<span class="text-sm text-base-content/40">-</span>
@endif
</td>
<td class="py-2 text-right">
<td class="py-2 align-middle text-right">
<div class="dropdown {{ $loop->last ? 'dropdown-top' : '' }} dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</label>
<ul tabindex="0" class="dropdown-content menu p-2 shadow-sm bg-base-100 rounded-lg w-44 z-[100] border border-base-300 {{ $loop->last ? 'mb-1' : '' }}">
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100] {{ $loop->last ? 'mb-1' : '' }}">
<li>
<a href="{{ route('seller.business.crm.quotes.show', [$business, $quote]) }}">
<span class="icon-[heroicons--eye] size-4"></span>

View File

@@ -67,12 +67,10 @@
{{-- Actions dropdown --}}
<div class="dropdown dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-sm">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z" />
</svg>
</label>
<ul tabindex="0" class="dropdown-content menu p-2 shadow bg-base-100 rounded-box w-52">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
@if($thread->status !== 'closed')
<li>
<form method="POST" action="{{ route('seller.business.crm.threads.close', [$business, $thread]) }}">

View File

@@ -149,10 +149,10 @@
{{-- Actions --}}
<td>
<div class="dropdown dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-xs">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</label>
<ul tabindex="0" class="dropdown-content z-[1] menu p-2 shadow-lg bg-base-100 rounded-box w-52 border border-base-300">
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
<li><a><span class="icon-[heroicons--eye] size-4"></span> View Product</a></li>
<li><a><span class="icon-[heroicons--pencil] size-4"></span> Edit Product</a></li>
<li><a><span class="icon-[heroicons--cube] size-4"></span> Adjust Stock</a></li>

View File

@@ -8,7 +8,7 @@
<h1 class="text-2xl font-semibold">Invoices</h1>
<p class="text-sm text-base-content/60">Manage and track your invoices.</p>
</div>
<a href="{{ route('seller.business.invoices.create', $business->slug) }}" class="btn btn-primary btn-sm gap-1">
<a href="{{ route('seller.business.invoices.create', $business->slug) }}" class="btn btn-secondary btn-sm gap-1">
<span class="icon-[heroicons--plus] size-4"></span>
Create Invoice
</a>
@@ -18,6 +18,7 @@
<x-ui.filter-bar
form-action="{{ route('seller.business.invoices.index', $business->slug) }}"
search-placeholder="Search invoices..."
search-name="search"
:search-value="request('search')"
clear-url="{{ route('seller.business.invoices.index', $business->slug) }}"
>
@@ -42,7 +43,7 @@
<p class="text-xs text-base-content/50 mb-4 max-w-md">
Create your first invoice to bill customers and track payment status.
</p>
<a href="{{ route('seller.business.invoices.create', $business->slug) }}" class="btn btn-primary btn-sm">
<a href="{{ route('seller.business.invoices.create', $business->slug) }}" class="btn btn-secondary btn-sm">
Create Invoice
</a>
</div>
@@ -106,11 +107,11 @@
</td>
<td class="py-2 align-middle">
@if($invoice->payment_status === 'paid')
<span class="badge badge-success badge-sm">Paid</span>
<span class="badge badge-ghost badge-sm">Paid</span>
@elseif($invoice->isOverdue())
<span class="badge badge-error badge-sm">Overdue</span>
<span class="badge badge-ghost badge-sm">Overdue</span>
@else
<span class="badge badge-neutral badge-sm">Unpaid</span>
<span class="badge badge-ghost badge-sm">Unpaid</span>
@endif
</td>
<td class="py-2 align-middle text-right">

View File

@@ -117,12 +117,12 @@
<td class="text-right">
@if($period->isOpen() && $canClosePeriods)
<div class="dropdown dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-sm">
<button tabindex="0" class="btn btn-ghost btn-sm">
<span class="icon-[heroicons--lock-closed] size-4"></span>
Close
<span class="icon-[heroicons--chevron-down] size-4"></span>
</label>
<ul tabindex="0" class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-48">
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
<li>
<button type="button" onclick="openCloseModal({{ $period->id }}, '{{ $period->period_label }}', 'soft_closed')">
<span class="icon-[heroicons--lock-open] size-4 text-warning"></span>

View File

@@ -133,10 +133,10 @@
</td>
<td>
<div class="dropdown dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-5"></span>
</label>
<ul tabindex="0" class="dropdown-content menu p-2 shadow bg-base-100 rounded-box w-52 z-10">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
<li>
<button type="button" @click="openEditModal({{ json_encode($vendor) }})">
<span class="icon-[heroicons--pencil] size-4"></span>

View File

@@ -107,12 +107,12 @@
<span class="badge badge-ghost badge-sm">Inactive</span>
@endif
</td>
<td class="text-right">
<td class="py-2 align-middle text-right">
<div class="dropdown dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-sm">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</label>
<ul tabindex="0" class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-48">
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
<li>
<a href="{{ route('seller.business.management.bank-accounts.show', [$business, $account]) }}">
<span class="icon-[heroicons--eye] size-4"></span>

View File

@@ -135,10 +135,10 @@
<td class="text-sm text-base-content/60">{{ $tx->category_display }}</td>
<td>
<div class="dropdown dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-xs">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</label>
<ul tabindex="0" class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-52">
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
<li>
<button @click="openMatchModal({{ $tx->id }})">
<span class="icon-[heroicons--link] size-4"></span>

View File

@@ -80,10 +80,10 @@
Edit
</a>
<div class="dropdown dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-xs">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</label>
<ul tabindex="0" class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-40">
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
@if(!$budget->approved_at)
<li>
<form action="{{ route('seller.business.management.budgets.approve', [$business, $budget]) }}" method="POST">

View File

@@ -116,10 +116,10 @@
View
</a>
<div class="dropdown dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-xs">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</label>
<ul tabindex="0" class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-40">
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
<li>
<a href="{{ route('seller.business.management.recurring.edit', [$business, $schedule]) }}">Edit</a>
</li>

View File

@@ -198,12 +198,10 @@
{{-- Actions Dropdown --}}
<div class="dropdown dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-sm">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z"></path>
</svg>
</label>
<ul tabindex="0" class="dropdown-content menu p-2 shadow bg-base-100 rounded-box w-52 z-10">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
<li><a href="{{ route('seller.marketing.broadcasts.show', $broadcast) }}">View Details</a></li>
<li><a href="{{ route('seller.marketing.broadcasts.analytics', $broadcast) }}">Analytics</a></li>

View File

@@ -136,12 +136,12 @@
<span class="text-base-content/50 text-sm">-</span>
@endif
</td>
<td class="py-2 text-right">
<td class="py-2 align-middle text-right">
<div class="dropdown {{ $loop->last ? 'dropdown-top' : '' }} dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</label>
<ul tabindex="0" class="dropdown-content menu p-2 shadow-lg bg-base-100 rounded-2xl w-44 z-[100] border border-base-200 {{ $loop->last ? 'mb-1' : '' }}">
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100] {{ $loop->last ? 'mb-1' : '' }}">
<li>
<a href="{{ route('seller.business.marketing.campaigns.show', [$business->slug, $campaign]) }}">
<span class="icon-[heroicons--eye] size-4"></span>

View File

@@ -82,10 +82,10 @@
<span class="badge badge-neutral badge-sm">Inactive</span>
@endif
<div class="dropdown dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-xs btn-square">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</label>
<ul tabindex="0" class="dropdown-content menu p-2 shadow-lg bg-base-100 rounded-2xl w-40 z-[100] border border-base-200">
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
<li>
<a href="{{ route('seller.business.marketing.channels.edit', [$business->slug, $channel]) }}">
<span class="icon-[heroicons--pencil] size-4"></span>

View File

@@ -131,14 +131,12 @@
-
@endif
</td>
<td>
<td class="py-2 align-middle text-right">
<div class="dropdown dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-xs">
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" viewBox="0 0 20 20" fill="currentColor">
<path d="M6 10a2 2 0 11-4 0 2 2 0 014 0zM12 10a2 2 0 11-4 0 2 2 0 014 0zM16 12a2 2 0 100-4 2 2 0 000 4z" />
</svg>
</label>
<ul tabindex="0" class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-40">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
<li><a href="{{ route('seller.business.marketing.contacts.edit', [$business, $contact]) }}">Edit</a></li>
<li>
<form method="POST" action="{{ route('seller.business.marketing.contacts.destroy', [$business, $contact]) }}" onsubmit="return confirm('Delete this contact?')">

View File

@@ -29,12 +29,10 @@
</span>
</div>
<div class="dropdown dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor">
<path d="M6 10a2 2 0 11-4 0 2 2 0 014 0zM12 10a2 2 0 11-4 0 2 2 0 014 0zM16 12a2 2 0 100-4 2 2 0 000 4z" />
</svg>
</label>
<ul tabindex="0" class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-40">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
<li><a href="{{ route('seller.business.marketing.lists.show', [$business, $list]) }}">View Contacts</a></li>
<li><a href="{{ route('seller.business.marketing.lists.edit', [$business, $list]) }}">Edit</a></li>
<li>

View File

@@ -131,12 +131,12 @@
<span class="text-base-content/40">-</span>
@endif
</td>
<td class="py-2 text-right">
<td class="py-2 align-middle text-right">
<div class="dropdown {{ $loop->last ? 'dropdown-top' : '' }} dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</label>
<ul tabindex="0" class="dropdown-content menu p-2 shadow-lg bg-base-100 rounded-2xl w-40 z-[100] border border-base-200 {{ $loop->last ? 'mb-1' : '' }}">
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100] {{ $loop->last ? 'mb-1' : '' }}">
<li>
<a href="{{ route('seller.business.marketing.promos.show', [$business->slug, $promo]) }}">
<span class="icon-[heroicons--eye] size-4"></span>

View File

@@ -120,12 +120,12 @@
<td class="py-2 text-sm whitespace-nowrap">
{{ $template->updated_at->diffForHumans() }}
</td>
<td class="py-2 text-right">
<td class="py-2 align-middle text-right">
<div class="dropdown {{ $loop->last ? 'dropdown-top' : '' }} dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</label>
<ul tabindex="0" class="dropdown-content menu p-2 shadow-lg bg-base-100 rounded-2xl w-40 z-[100] border border-base-200 {{ $loop->last ? 'mb-1' : '' }}">
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100] {{ $loop->last ? 'mb-1' : '' }}">
<li>
<a href="{{ route('seller.business.marketing.templates.show', [$business->slug, $template]) }}">
<span class="icon-[heroicons--eye] size-4"></span>

View File

@@ -95,24 +95,24 @@
</td>
<td class="py-3 text-center">
@if($order->workorder_status == 100)
<span class="badge badge-neutral badge-sm whitespace-nowrap">Complete</span>
<span class="badge badge-success badge-sm whitespace-nowrap">Complete</span>
@elseif($order->workorder_status == 0)
<span class="badge badge-neutral badge-sm whitespace-nowrap">Not Started</span>
<span class="badge badge-success badge-sm whitespace-nowrap">Not Started</span>
@elseif($order->workorder_status > 0 && $order->workorder_status < 100)
<span class="badge badge-neutral badge-sm whitespace-nowrap">{{ number_format($order->workorder_status, 0) }}%</span>
<span class="badge badge-success badge-sm whitespace-nowrap">{{ number_format($order->workorder_status, 0) }}%</span>
@else
<span class="badge badge-neutral badge-sm whitespace-nowrap">Not Started</span>
<span class="badge badge-success badge-sm whitespace-nowrap">Not Started</span>
@endif
</td>
<td class="py-3">
@include('buyer.orders.partials.status-badge', ['status' => $order->status])
</td>
<td class="py-3 text-right">
<td class="py-2 align-middle text-right">
<div class="dropdown {{ $loop->last ? 'dropdown-top' : '' }} dropdown-end">
<button tabindex="0" role="button" class="btn btn-ghost btn-sm btn-square">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</button>
<ul tabindex="0" class="dropdown-content menu bg-base-100 rounded-lg shadow-sm w-48 p-2 z-[100] border border-base-300 {{ $loop->last ? 'mb-1' : '' }}">
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100] {{ $loop->last ? 'mb-1' : '' }}">
<li>
<a href="{{ route('seller.business.orders.show', [$business->slug, $order]) }}">
<span class="icon-[heroicons--eye] size-4"></span>

View File

@@ -3,10 +3,10 @@
@section('content')
<div class="max-w-7xl mx-auto px-6 py-4 space-y-4"
x-data="{
// State
search: '',
brandFilter: 'all',
statusFilter: 'all',
// State - initialize from URL params to sync with server-side filtering
search: '{{ request('search', '') }}',
brandFilter: '{{ request('brand_id', 'all') ?: 'all' }}',
statusFilter: '{{ request('status', 'all') ?: 'all' }}',
visibilityFilter: 'all',
focusFilter: 'all',
viewMode: 'table',
@@ -241,14 +241,24 @@
<span x-show="listing.status === 'paused'" class="badge badge-neutral badge-sm">Paused</span>
<span x-show="listing.status === 'draft'" class="badge badge-neutral badge-sm">Draft</span>
</td>
<td class="py-2.5" @click.stop>
<td class="py-2 align-middle text-right" @click.stop>
<div class="dropdown dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-xs">
<span class="icon-[heroicons--ellipsis-vertical] size-4 text-base-content/40"></span>
</label>
<ul tabindex="0" class="dropdown-content z-[1] menu p-1.5 bg-base-100 rounded-lg w-40 border border-base-300">
<li><a @click="openInspector(listing)" class="text-sm py-1.5"><span class="icon-[heroicons--information-circle] size-4"></span> Quick View</a></li>
<li><a :href="listing.edit_url" class="text-sm py-1.5"><span class="icon-[heroicons--pencil] size-4"></span> Edit</a></li>
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
<li>
<a @click="openInspector(listing)">
<span class="icon-[heroicons--information-circle] size-4"></span>
Quick View
</a>
</li>
<li>
<a :href="listing.edit_url">
<span class="icon-[heroicons--pencil] size-4"></span>
Edit
</a>
</li>
</ul>
</div>
</td>

View File

@@ -200,10 +200,10 @@
{{-- Standard actions dropdown --}}
<div class="dropdown dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[lucide--more-vertical] size-4"></span>
</label>
<ul tabindex="0" class="dropdown-content menu bg-base-100 rounded-box z-[1] w-48 p-2 shadow-lg border border-base-200">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
<li>
<a href="{{ route('seller.business.products.edit', [$business->slug, $product->hashid]) }}">
<span class="icon-[lucide--eye] size-4"></span>

View File

@@ -501,14 +501,24 @@
<span x-show="listing.status === 'paused'" class="badge badge-warning badge-xs">Paused</span>
<span x-show="listing.status === 'draft'" class="badge badge-ghost badge-xs">Draft</span>
</td>
<td @click.stop>
<td class="py-2 align-middle text-right" @click.stop>
<div class="dropdown dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-xs">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</label>
<ul tabindex="0" class="dropdown-content z-[1] menu p-2 shadow-lg bg-base-100 rounded-box w-52 border border-base-300">
<li><a @click="openInspector(listing)"><span class="icon-[heroicons--information-circle] size-4"></span> Quick View</a></li>
<li><a :href="listing.edit_url"><span class="icon-[heroicons--pencil] size-4"></span> Edit Product</a></li>
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
<li>
<a @click="openInspector(listing)">
<span class="icon-[heroicons--information-circle] size-4"></span>
Quick View
</a>
</li>
<li>
<a :href="listing.edit_url">
<span class="icon-[heroicons--pencil] size-4"></span>
Edit Product
</a>
</li>
</ul>
</div>
</td>

View File

@@ -130,12 +130,12 @@
<td>
<input type="checkbox" class="toggle toggle-success toggle-sm" {{ $webhook['enabled'] ? 'checked' : '' }} onchange="toggleWebhook({{ $webhook['id'] }})" />
</td>
<td>
<td class="py-2 align-middle text-right">
<div class="dropdown dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
</label>
<ul tabindex="0" class="dropdown-content z-[1] menu menu-sm p-2 shadow-lg bg-base-100 rounded-box w-48 border border-base-300">
</button>
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
<li><a class="gap-2"><span class="icon-[heroicons--pencil] size-4"></span> Edit</a></li>
<li><a class="gap-2"><span class="icon-[heroicons--paper-airplane] size-4"></span> Test Webhook</a></li>
<li><a class="gap-2"><span class="icon-[heroicons--arrow-path] size-4"></span> View History</a></li>

View File

@@ -29,13 +29,13 @@ export default {
themes: [
{
cannabrands: {
"primary": "#4B6FA4",
"primary": "#4E8D71",
"primary-content": "#ffffff",
"secondary": "#6B7280",
"secondary": "#4B6FA4",
"secondary-content": "#ffffff",
"accent": "#4B6FA4",
"accent": "#4E8D71",
"accent-content": "#ffffff",
"success": "#4E8D71",