From 7546698a3c6fda5a1b9653bf3520ca6a23f998f0 Mon Sep 17 00:00:00 2001 From: Mark Gregory Date: Wed, 26 Aug 2026 15:34:45 +0100 Subject: [PATCH] structure updates --- resources/themes/backend/assets/css/app.css | 18 ++ .../themes/backend/assets/css/helpdesk.css | 39 +++++ .../components/helpdesk/layouts/app.blade.php | 163 +++++++++++++++++- .../views/components/layouts/app.blade.php | 157 ++++++++++++++++- .../backend/views/layouts/app.blade.php | 162 ++++++++++++++++- .../backend/views/partials/head.blade.php | 6 +- vite.config.js | 8 +- 7 files changed, 537 insertions(+), 16 deletions(-) create mode 100644 resources/themes/backend/assets/css/app.css diff --git a/resources/themes/backend/assets/css/app.css b/resources/themes/backend/assets/css/app.css new file mode 100644 index 0000000..f00f78a --- /dev/null +++ b/resources/themes/backend/assets/css/app.css @@ -0,0 +1,18 @@ +@import 'tailwindcss'; +@import '@fortawesome/fontawesome-free/css/all.min.css'; +@import '../../../../../vendor/livewire/flux/dist/flux.css'; +@import './helpdesk.css'; + +@source '../../views/**/*.blade.php'; +@source '../../../../../Modules/**/*.php'; +@source '../../../../../Modules/*/Resources/views/**/*.blade.php'; +@source '../../../../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php'; +@source '../../../../../vendor/livewire/flux/stubs/**/*.blade.php'; +@source '../../../../../vendor/livewire/flux-pro/stubs/**/*.blade.php'; + +@custom-variant dark (&:where(.dark, .dark *)); + +@theme { + --font-sans: 'Instrument Sans', ui-sans-serif, system-ui, sans-serif, + 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; +} diff --git a/resources/themes/backend/assets/css/helpdesk.css b/resources/themes/backend/assets/css/helpdesk.css index b40c181..d8f3d6e 100644 --- a/resources/themes/backend/assets/css/helpdesk.css +++ b/resources/themes/backend/assets/css/helpdesk.css @@ -1547,3 +1547,42 @@ span.flatpickr-weekday { width: min(310px, calc(100vw - 20px)); } } + + +/* Dark authentication + account settings controls */ +:is(.hd-auth-surface, .hd-account-settings) input:not([type="checkbox"]):not([type="radio"]):not([type="color"]):not([type="file"]), +:is(.hd-auth-surface, .hd-account-settings) textarea, +:is(.hd-auth-surface, .hd-account-settings) select, +:is(.hd-auth-surface, .hd-account-settings) [data-flux-input], +:is(.hd-auth-surface, .hd-account-settings) [data-flux-control], +:is(.hd-auth-surface, .hd-account-settings) [data-flux-field-control], +:is(.hd-auth-surface, .hd-account-settings) [data-flux-select] { + background: #252a31 !important; + border-color: #424a56 !important; + color: #f3f4f6 !important; + box-shadow: inset 0 1px 0 rgba(255,255,255,.025) !important; +} + +:is(.hd-auth-surface, .hd-account-settings) input::placeholder, +:is(.hd-auth-surface, .hd-account-settings) textarea::placeholder { + color: #8f96a3 !important; + opacity: 1 !important; +} + +:is(.hd-auth-surface, .hd-account-settings) input:not([type="checkbox"]):not([type="radio"]):focus, +:is(.hd-auth-surface, .hd-account-settings) textarea:focus, +:is(.hd-auth-surface, .hd-account-settings) select:focus { + border-color: #3b82f6 !important; + outline: none !important; + box-shadow: 0 0 0 3px rgba(59,130,246,.16) !important; +} + +.hd-account-settings, +.hd-account-settings label { + color: #e5e7eb !important; +} + +.hd-account-settings [data-flux-subheading], +.hd-account-settings [data-flux-text] { + color: #9ca3af !important; +} diff --git a/resources/themes/backend/views/components/helpdesk/layouts/app.blade.php b/resources/themes/backend/views/components/helpdesk/layouts/app.blade.php index 59ce0d3..112cddf 100644 --- a/resources/themes/backend/views/components/helpdesk/layouts/app.blade.php +++ b/resources/themes/backend/views/components/helpdesk/layouts/app.blade.php @@ -1,9 +1,158 @@ -@props(['title' => null]) +@props([ + 'title' => null, +]) -{{-- - Helpdesk compatibility component. + + + + @include('partials.head') + @if(!empty($title)) + {{ $title }} · {{ config('app.name', 'Laravel') }} + @endif + + +@php + $user = auth()->user(); + $isAdmin = $user !== null && ( + (bool) ($user->helpdesk_admin ?? false) + || (method_exists($user, 'isHelpdeskAdmin') && $user->isHelpdeskAdmin()) + ); + $roleLabel = $isAdmin ? 'Administrator' : ((method_exists($user, 'isHelpdeskAgent') && $user->isHelpdeskAgent()) || (bool) ($user->helpdesk_agent ?? false) ? 'Agent' : 'User'); +@endphp +
+
+ +
+ @if(Route::has('helpdesk.tickets.index')) + + @endif +
+ +
+
+ + + + +
{{ $slot }}
+
+ +@persist('toast')@endpersist +@fluxScripts + + diff --git a/resources/themes/backend/views/components/layouts/app.blade.php b/resources/themes/backend/views/components/layouts/app.blade.php index c5287f0..112cddf 100644 --- a/resources/themes/backend/views/components/layouts/app.blade.php +++ b/resources/themes/backend/views/components/layouts/app.blade.php @@ -2,6 +2,157 @@ 'title' => null, ]) - - {{ $slot }} - + + + + @include('partials.head') + @if(!empty($title)) + {{ $title }} · {{ config('app.name', 'Laravel') }} + @endif + + +@php + $user = auth()->user(); + $isAdmin = $user !== null && ( + (bool) ($user->helpdesk_admin ?? false) + || (method_exists($user, 'isHelpdeskAdmin') && $user->isHelpdeskAdmin()) + ); + $roleLabel = $isAdmin ? 'Administrator' : ((method_exists($user, 'isHelpdeskAgent') && $user->isHelpdeskAgent()) || (bool) ($user->helpdesk_agent ?? false) ? 'Agent' : 'User'); +@endphp +
+
+ +
+ @if(Route::has('helpdesk.tickets.index')) + + @endif +
+ +
+
+ + + + +
{{ $slot }}
+
+ +@persist('toast')@endpersist +@fluxScripts + + diff --git a/resources/themes/backend/views/layouts/app.blade.php b/resources/themes/backend/views/layouts/app.blade.php index 611bc8c..a114ae5 100644 --- a/resources/themes/backend/views/layouts/app.blade.php +++ b/resources/themes/backend/views/layouts/app.blade.php @@ -1,4 +1,158 @@ -@include('layouts.app.sidebar', [ - 'slot' => $slot, - 'title' => $title ?? null, -]) +@php + $title = $title ?? null; +@endphp + + + + + @include('partials.head') + @if(!empty($title)) + {{ $title }} · {{ config('app.name', 'Laravel') }} + @endif + + +@php + $user = auth()->user(); + $isAdmin = $user !== null && ( + (bool) ($user->helpdesk_admin ?? false) + || (method_exists($user, 'isHelpdeskAdmin') && $user->isHelpdeskAdmin()) + ); + $roleLabel = $isAdmin ? 'Administrator' : ((method_exists($user, 'isHelpdeskAgent') && $user->isHelpdeskAgent()) || (bool) ($user->helpdesk_agent ?? false) ? 'Agent' : 'User'); +@endphp +
+
+ +
+ @if(Route::has('helpdesk.tickets.index')) + + @endif +
+ +
+
+ + + + +
{{ $slot }}
+
+ +@persist('toast')@endpersist +@fluxScripts + + diff --git a/resources/themes/backend/views/partials/head.blade.php b/resources/themes/backend/views/partials/head.blade.php index cbe8789..9931115 100644 --- a/resources/themes/backend/views/partials/head.blade.php +++ b/resources/themes/backend/views/partials/head.blade.php @@ -4,8 +4,12 @@ @fonts @php + $backendCssEntry = is_file(resource_path('themes/backend/assets/css/app.css')) + ? 'resources/themes/backend/assets/css/app.css' + : 'resources/themes/backend/assets/css/helpdesk.css'; + $viteAssets = [ - 'resources/themes/backend/assets/css/app.css', + $backendCssEntry, 'resources/themes/backend/assets/js/passkeys.js', 'resources/themes/backend/assets/js/layout.js', ]; diff --git a/vite.config.js b/vite.config.js index 7c58d61..477e230 100644 --- a/vite.config.js +++ b/vite.config.js @@ -6,6 +6,12 @@ import { existsSync, readdirSync, statSync } from 'node:fs'; import { join, relative } from 'node:path'; const projectRoot = process.cwd(); + +const backendCssEntry = existsSync( + join(projectRoot, 'resources/themes/backend/assets/css/app.css') +) + ? 'resources/themes/backend/assets/css/app.css' + : 'resources/themes/backend/assets/css/helpdesk.css'; function discoverModuleInputs() { const modulesPath = join(projectRoot, 'Modules'); if (!existsSync(modulesPath)) return []; @@ -25,7 +31,7 @@ export default defineConfig({ plugins:[ laravel({ input:[ - 'resources/themes/backend/assets/css/app.css', + backendCssEntry, 'resources/themes/backend/assets/js/passkeys.js', 'resources/themes/backend/assets/js/layout.js', ...moduleInputs,