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
+
+
+
+
+
+
+
{{ $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
+
+
+
+
+
+
+
{{ $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
+
+
+
+
+
+
+
{{ $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,