@mamut_1945/dashboard-ui 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/package.json +1 -1
  2. package/resources/views/components/common/common-grid-shape.blade.php +8 -0
  3. package/resources/views/components/common/component-card.blade.php +25 -0
  4. package/resources/views/components/common/dropdown-menu.blade.php +22 -0
  5. package/resources/views/components/common/form.blade.php +21 -0
  6. package/resources/views/components/common/input-group.blade.php +100 -0
  7. package/resources/views/components/common/page-breadcrumb.blade.php +38 -0
  8. package/resources/views/components/common/preloader.blade.php +9 -0
  9. package/resources/views/components/common/table.blade.php +73 -0
  10. package/resources/views/components/common/theme-toggle.blade.php +30 -0
  11. package/resources/views/components/header/user-dropdown.blade.php +128 -0
  12. package/resources/views/components/readme.txt +6 -0
  13. package/resources/views/components/ui/alert.blade.php +82 -0
  14. package/resources/views/components/ui/avatar.blade.php +49 -0
  15. package/resources/views/components/ui/badge.blade.php +53 -0
  16. package/resources/views/components/ui/button.blade.php +61 -0
  17. package/resources/views/components/ui/modal.blade.php +59 -0
  18. package/resources/views/components/ui/youtube-embed.blade.php +29 -0
  19. package/resources/views/layouts/app-header.blade.php +96 -0
  20. package/resources/views/layouts/app.blade.php +138 -0
  21. package/resources/views/layouts/backdrop.blade.php +12 -0
  22. package/resources/views/layouts/fullscreen-layout.blade.php +117 -0
  23. package/resources/views/layouts/sidebar.blade.php +225 -0
  24. package/resources/views/pages/example/easy-form-example.blade.php +40 -0
  25. package/resources/views/pages/example/table-example.blade.php +45 -0
@@ -0,0 +1,53 @@
1
+
2
+ @props([
3
+ 'variant' => 'light',
4
+ 'size' => 'md',
5
+ 'color' => 'primary',
6
+ 'startIcon' => null,
7
+ 'endIcon' => null,
8
+ ])
9
+
10
+ @php
11
+ $baseStyles = 'inline-flex items-center px-2.5 py-0.5 justify-center gap-1 rounded-full font-medium capitalize';
12
+
13
+ $sizeStyles = [
14
+ 'sm' => 'text-xs',
15
+ 'md' => 'text-sm',
16
+ ];
17
+
18
+ $variants = [
19
+ 'light' => [
20
+ 'primary' => 'bg-blue-50 text-blue-500 dark:bg-blue-500/15 dark:text-blue-400',
21
+ 'success' => 'bg-green-50 text-green-600 dark:bg-green-500/15 dark:text-green-500',
22
+ 'error' => 'bg-red-50 text-red-600 dark:bg-red-500/15 dark:text-red-500',
23
+ 'warning' => 'bg-yellow-50 text-yellow-600 dark:bg-yellow-500/15 dark:text-orange-400',
24
+ 'info' => 'bg-sky-50 text-sky-500 dark:bg-sky-500/15 dark:text-sky-500',
25
+ 'light' => 'bg-gray-100 text-gray-700 dark:bg-white/5 dark:text-white/80',
26
+ 'dark' => 'bg-gray-500 text-white dark:bg-white/5 dark:text-white',
27
+ ],
28
+ 'solid' => [
29
+ 'primary' => 'bg-blue-500 text-white dark:text-white',
30
+ 'success' => 'bg-green-500 text-white dark:text-white',
31
+ 'error' => 'bg-red-500 text-white dark:text-white',
32
+ 'warning' => 'bg-yellow-500 text-white dark:text-white',
33
+ 'info' => 'bg-sky-500 text-white dark:text-white',
34
+ 'light' => 'bg-gray-400 dark:bg-white/5 text-white dark:text-white/80',
35
+ 'dark' => 'bg-gray-700 text-white dark:text-white',
36
+ ],
37
+ ];
38
+
39
+ $sizeClass = $sizeStyles[$size] ?? $sizeStyles['md'];
40
+ $colorStyles = $variants[$variant][$color] ?? $variants['light']['primary'];
41
+ @endphp
42
+
43
+ <span class="{{ $baseStyles }} {{ $sizeClass }} {{ $colorStyles }}" {{ $attributes }}>
44
+ @if($startIcon)
45
+ {!! $startIcon !!}
46
+ @endif
47
+
48
+ {{ $slot }}
49
+
50
+ @if($endIcon)
51
+ {!! $endIcon !!}
52
+ @endif
53
+ </span>
@@ -0,0 +1,61 @@
1
+ @props([
2
+ 'size' => 'md',
3
+ 'variant' => 'primary',
4
+ 'startIcon' => null,
5
+ 'endIcon' => null,
6
+ 'className' => '',
7
+ 'disabled' => false,
8
+ ])
9
+
10
+ @php
11
+ // Base classes
12
+ $base = 'inline-flex items-center justify-center font-medium gap-2 rounded-lg transition';
13
+
14
+ // Size map
15
+ $sizeMap = [
16
+ 'sm' => 'px-4 py-3 text-sm',
17
+ 'md' => 'px-5 py-3.5 text-sm',
18
+ ];
19
+ $sizeClass = $sizeMap[$size] ?? $sizeMap['md'];
20
+
21
+ // Variant map
22
+ $variantMap = [
23
+ 'primary' => 'bg-brand-500 text-white shadow-theme-xs hover:bg-brand-600 disabled:bg-brand-300',
24
+ 'outline' => 'bg-white text-gray-700 ring-1 ring-inset ring-gray-300 hover:bg-gray-50 dark:bg-gray-800 dark:text-gray-400 dark:ring-gray-700 dark:hover:bg-white/[0.03] dark:hover:text-gray-300',
25
+ ];
26
+ $variantClass = $variantMap[$variant] ?? $variantMap['primary'];
27
+
28
+ // disabled classes
29
+ $disabledClass = $disabled ? 'cursor-not-allowed opacity-50' : '';
30
+
31
+ // final classes (merge user className too)
32
+ $classes = trim("{$base} {$sizeClass} {$variantClass} {$className} {$disabledClass}");
33
+ @endphp
34
+
35
+ <button
36
+ {{ $attributes->merge(['class' => $classes, 'type' => $attributes->get('type', 'button')]) }}
37
+ @if($disabled) disabled @endif
38
+ >
39
+ {{-- start icon: priority — named slot 'startIcon' first, then startIcon prop if it's a HtmlString --}}
40
+ @if (isset($__env) && $slot->isEmpty() === false) @endif
41
+
42
+ @hasSection('startIcon')
43
+ <span class="flex items-center">
44
+ @yield('startIcon')
45
+ </span>
46
+ @elseif($startIcon)
47
+ <span class="flex items-center">{!! $startIcon !!}</span>
48
+ @endif
49
+
50
+ {{-- main slot --}}
51
+ {{ $slot }}
52
+
53
+ {{-- end icon: named slot 'endIcon' first, then endIcon prop --}}
54
+ @hasSection('endIcon')
55
+ <span class="flex items-center">
56
+ @yield('endIcon')
57
+ </span>
58
+ @elseif($endIcon)
59
+ <span class="flex items-center">{!! $endIcon !!}</span>
60
+ @endif
61
+ </button>
@@ -0,0 +1,59 @@
1
+ @props([
2
+ 'isOpen' => false,
3
+ 'showCloseButton' => true,
4
+ ])
5
+
6
+ <div x-data="{
7
+ open: @js($isOpen),
8
+ init() {
9
+ this.$watch('open', value => {
10
+ if (value) {
11
+ document.body.style.overflow = 'hidden';
12
+ } else {
13
+ document.body.style.overflow = 'unset';
14
+ }
15
+ });
16
+ }
17
+ }" x-show="open" x-cloak @keydown.escape.window="open = false"
18
+ class="modal fixed inset-0 z-99999 flex items-center justify-center overflow-y-auto p-5"
19
+ {{ $attributes->except('class') }}>
20
+
21
+ <!-- Backdrop -->
22
+ <div @click="open = false" class="fixed inset-0 h-full w-full bg-gray-400/50 backdrop-blur-[32px]"
23
+ x-transition:enter="transition ease-out duration-300" x-transition:enter-start="opacity-0"
24
+ x-transition:enter-end="opacity-100" x-transition:leave="transition ease-in duration-200"
25
+ x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0">
26
+ </div>
27
+
28
+ <!-- Modal Content -->
29
+ <div @click.stop class="relative w-full rounded-3xl bg-white dark:bg-gray-900 {{ $attributes->get('class') }}"
30
+ x-transition:enter="transition ease-out duration-300" x-transition:enter-start="opacity-0 transform scale-95"
31
+ x-transition:enter-end="opacity-100 transform scale-100" x-transition:leave="transition ease-in duration-200"
32
+ x-transition:leave-start="opacity-100 transform scale-100"
33
+ x-transition:leave-end="opacity-0 transform scale-95">
34
+
35
+ <!-- Close Button -->
36
+ @if ($showCloseButton)
37
+ <button @click="open = false"
38
+ class="absolute right-3 top-3 z-999 flex h-9.5 w-9.5 items-center justify-center rounded-full bg-gray-100 text-gray-400 transition-colors hover:bg-gray-200 hover:text-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white sm:right-6 sm:top-6 sm:h-11 sm:w-11">
39
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none"
40
+ xmlns="http://www.w3.org/2000/svg">
41
+ <path fillRule="evenodd" clipRule="evenodd"
42
+ d="M6.04289 16.5413C5.65237 16.9318 5.65237 17.565 6.04289 17.9555C6.43342 18.346 7.06658 18.346 7.45711 17.9555L11.9987 13.4139L16.5408 17.956C16.9313 18.3466 17.5645 18.3466 17.955 17.956C18.3455 17.5655 18.3455 16.9323 17.955 16.5418L13.4129 11.9997L17.955 7.4576C18.3455 7.06707 18.3455 6.43391 17.955 6.04338C17.5645 5.65286 16.9313 5.65286 16.5408 6.04338L11.9987 10.5855L7.45711 6.0439C7.06658 5.65338 6.43342 5.65338 6.04289 6.0439C5.65237 6.43442 5.65237 7.06759 6.04289 7.45811L10.5845 11.9997L6.04289 16.5413Z"
43
+ fill="currentColor" />
44
+ </svg>
45
+ </button>
46
+ @endif
47
+
48
+ <!-- Modal Body -->
49
+ <div>
50
+ {{ $slot }}
51
+ </div>
52
+ </div>
53
+ </div>
54
+
55
+ <style>
56
+ [x-cloak] {
57
+ display: none;
58
+ }
59
+ </style>
@@ -0,0 +1,29 @@
1
+
2
+ @props([
3
+ 'videoId' => '',
4
+ 'aspectRatio' => '16:9',
5
+ 'title' => 'YouTube video',
6
+ 'className' => ''
7
+ ])
8
+
9
+ @php
10
+ $aspectRatioClasses = [
11
+ '16:9' => 'aspect-video',
12
+ '4:3' => 'aspect-4/3',
13
+ '21:9' => 'aspect-21/9',
14
+ '1:1' => 'aspect-square',
15
+ ];
16
+
17
+ $aspectRatioClass = $aspectRatioClasses[$aspectRatio] ?? $aspectRatioClasses['16:9'];
18
+ @endphp
19
+
20
+ <div class="overflow-hidden rounded-lg {{ $aspectRatioClass }} {{ $className }}">
21
+ <iframe
22
+ src="https://www.youtube.com/embed/{{ $videoId }}"
23
+ title="{{ $title }}"
24
+ frameborder="0"
25
+ allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
26
+ allowfullscreen
27
+ class="w-full h-full"
28
+ ></iframe>
29
+ </div>
@@ -0,0 +1,96 @@
1
+ <header
2
+ class="sticky top-0 flex w-full bg-white border-gray-200 z-99999 dark:border-gray-800 dark:bg-gray-900 xl:border-b"
3
+ x-data="{
4
+ isApplicationMenuOpen: false,
5
+ toggleApplicationMenu() {
6
+ this.isApplicationMenuOpen = !this.isApplicationMenuOpen;
7
+ }
8
+ }">
9
+ <div class="flex flex-col items-center justify-between grow xl:flex-row xl:px-6">
10
+ <div
11
+ class="flex items-center justify-between w-full gap-2 px-3 py-3 border-b border-gray-200 dark:border-gray-800 sm:gap-4 xl:justify-normal xl:border-b-0 xl:px-0 lg:py-4">
12
+
13
+ <!-- Desktop Sidebar Toggle Button (visible on xl and up) -->
14
+ <button
15
+ class="hidden xl:flex items-center justify-center w-10 h-10 text-gray-500 border border-gray-200 rounded-lg dark:border-gray-800 dark:text-gray-400 lg:h-11 lg:w-11"
16
+ :class="{ 'bg-gray-100 dark:bg-white/[0.03]': !$store.sidebar.isExpanded }"
17
+ @click="$store.sidebar.toggleExpanded()" aria-label="Toggle Sidebar">
18
+ <svg x-show="!$store.sidebar.isMobileOpen" width="16" height="12" viewBox="0 0 16 12" fill="none"
19
+ xmlns="http://www.w3.org/2000/svg">
20
+ <path fill-rule="evenodd" clip-rule="evenodd"
21
+ d="M0.583252 1C0.583252 0.585788 0.919038 0.25 1.33325 0.25H14.6666C15.0808 0.25 15.4166 0.585786 15.4166 1C15.4166 1.41421 15.0808 1.75 14.6666 1.75L1.33325 1.75C0.919038 1.75 0.583252 1.41422 0.583252 1ZM0.583252 11C0.583252 10.5858 0.919038 10.25 1.33325 10.25L14.6666 10.25C15.0808 10.25 15.4166 10.5858 15.4166 11C15.4166 11.4142 15.0808 11.75 14.6666 11.75L1.33325 11.75C0.919038 11.75 0.583252 11.4142 0.583252 11ZM1.33325 5.25C0.919038 5.25 0.583252 5.58579 0.583252 6C0.583252 6.41421 0.919038 6.75 1.33325 6.75L7.99992 6.75C8.41413 6.75 8.74992 6.41421 8.74992 6C8.74992 5.58579 8.41413 5.25 7.99992 5.25L1.33325 5.25Z"
22
+ fill="currentColor"></path>
23
+ </svg>
24
+ <svg x-show="$store.sidebar.isMobileOpen" class="fill-current" width="24" height="24" viewBox="0 0 24 24"
25
+ fill="none" xmlns="http://www.w3.org/2000/svg">
26
+ <path fill-rule="evenodd" clip-rule="evenodd"
27
+ d="M6.21967 7.28131C5.92678 6.98841 5.92678 6.51354 6.21967 6.22065C6.51256 5.92775 6.98744 5.92775 7.28033 6.22065L11.999 10.9393L16.7176 6.22078C17.0105 5.92789 17.4854 5.92788 17.7782 6.22078C18.0711 6.51367 18.0711 6.98855 17.7782 7.28144L13.0597 12L17.7782 16.7186C18.0711 17.0115 18.0711 17.4863 17.7782 17.7792C17.4854 18.0721 17.0105 18.0721 16.7176 17.7792L11.999 13.0607L7.28033 17.7794C6.98744 18.0722 6.51256 18.0722 6.21967 17.7794C5.92678 17.4865 5.92678 17.0116 6.21967 16.7187L10.9384 12L6.21967 7.28131Z"
28
+ fill="" />
29
+ </svg>
30
+ </button>
31
+
32
+ <!-- Mobile Menu Toggle Button (visible below xl) -->
33
+ <button
34
+ class="flex xl:hidden items-center justify-center w-10 h-10 text-gray-500 rounded-lg dark:text-gray-400 lg:h-11 lg:w-11"
35
+ :class="{ 'bg-gray-100 dark:bg-white/[0.03]': $store.sidebar.isMobileOpen }"
36
+ @click="$store.sidebar.toggleMobileOpen()" aria-label="Toggle Mobile Menu">
37
+ <svg x-show="!$store.sidebar.isMobileOpen" width="16" height="12" viewBox="0 0 16 12" fill="none"
38
+ xmlns="http://www.w3.org/2000/svg">
39
+ <path fill-rule="evenodd" clip-rule="evenodd"
40
+ d="M0.583252 1C0.583252 0.585788 0.919038 0.25 1.33325 0.25H14.6666C15.0808 0.25 15.4166 0.585786 15.4166 1C15.4166 1.41421 15.0808 1.75 14.6666 1.75L1.33325 1.75C0.919038 1.75 0.583252 1.41422 0.583252 1ZM0.583252 11C0.583252 10.5858 0.919038 10.25 1.33325 10.25L14.6666 10.25C15.0808 10.25 15.4166 10.5858 15.4166 11C15.4166 11.4142 15.0808 11.75 14.6666 11.75L1.33325 11.75C0.919038 11.75 0.583252 11.4142 0.583252 11ZM1.33325 5.25C0.919038 5.25 0.583252 5.58579 0.583252 6C0.583252 6.41421 0.919038 6.75 1.33325 6.75L7.99992 6.75C8.41413 6.75 8.74992 6.41421 8.74992 6C8.74992 5.58579 8.41413 5.25 7.99992 5.25L1.33325 5.25Z"
41
+ fill="currentColor"></path>
42
+ </svg>
43
+ <svg x-show="$store.sidebar.isMobileOpen" class="fill-current" width="24" height="24" viewBox="0 0 24 24"
44
+ fill="none" xmlns="http://www.w3.org/2000/svg">
45
+ <path fill-rule="evenodd" clip-rule="evenodd"
46
+ d="M6.21967 7.28131C5.92678 6.98841 5.92678 6.51354 6.21967 6.22065C6.51256 5.92775 6.98744 5.92775 7.28033 6.22065L11.999 10.9393L16.7176 6.22078C17.0105 5.92789 17.4854 5.92788 17.7782 6.22078C18.0711 6.51367 18.0711 6.98855 17.7782 7.28144L13.0597 12L17.7782 16.7186C18.0711 17.0115 18.0711 17.4863 17.7782 17.7792C17.4854 18.0721 17.0105 18.0721 16.7176 17.7792L11.999 13.0607L7.28033 17.7794C6.98744 18.0722 6.51256 18.0722 6.21967 17.7794C5.92678 17.4865 5.92678 17.0116 6.21967 16.7187L10.9384 12L6.21967 7.28131Z"
47
+ fill="" />
48
+ </svg>
49
+ </button>
50
+
51
+ <!-- Logo (mobile only) -->
52
+ <a href="/" class="xl:hidden">
53
+ <img class="dark:hidden" src="/images/logo/logo.svg" alt="Logo" />
54
+ <img class="hidden dark:block" src="/images/logo/logo-dark.svg" alt="Logo" />
55
+ </a>
56
+
57
+ <!-- Application Menu Toggle (mobile only) -->
58
+ <button @click="toggleApplicationMenu()"
59
+ class="flex items-center justify-center w-10 h-10 text-gray-700 rounded-lg z-99999 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-800 xl:hidden">
60
+ <!-- Dots Icon -->
61
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none">
62
+ <path fill-rule="evenodd" clip-rule="evenodd"
63
+ d="M5.99902 10.4951C6.82745 10.4951 7.49902 11.1667 7.49902 11.9951V12.0051C7.49902 12.8335 6.82745 13.5051 5.99902 13.5051C5.1706 13.5051 4.49902 12.8335 4.49902 12.0051V11.9951C4.49902 11.1667 5.1706 10.4951 5.99902 10.4951ZM17.999 10.4951C18.8275 10.4951 19.499 11.1667 19.499 11.9951V12.0051C19.499 12.8335 18.8275 13.5051 17.999 13.5051C17.1706 13.5051 16.499 12.8335 16.499 12.0051V11.9951C16.499 11.1667 17.1706 10.4951 17.999 10.4951ZM13.499 11.9951C13.499 11.1667 12.8275 10.4951 11.999 10.4951C11.1706 10.4951 10.499 11.1667 10.499 11.9951V12.0051C10.499 12.8335 11.1706 13.5051 11.999 13.5051C12.8275 13.5051 13.499 12.8335 13.499 12.0051V11.9951Z"
64
+ fill="currentColor" />
65
+ </svg>
66
+ </button>
67
+ </div>
68
+
69
+ <!-- Application Menu (mobile) and Right Side Actions (desktop) -->
70
+ <div :class="isApplicationMenuOpen ? 'flex' : 'hidden'"
71
+ class="items-center justify-between w-full gap-4 px-5 py-4 xl:flex shadow-theme-md xl:justify-end xl:px-0 xl:shadow-none">
72
+ <div class="flex items-center gap-2 2xsm:gap-3">
73
+ <!-- Theme Toggle Button -->
74
+ <button
75
+ class="relative flex items-center justify-center text-gray-500 transition-colors bg-white border border-gray-200 rounded-full hover:text-dark-900 h-11 w-11 hover:bg-gray-100 hover:text-gray-700 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-white"
76
+ @click="$store.theme.toggle()">
77
+ <svg class="hidden dark:block" width="20" height="20" viewBox="0 0 20 20" fill="none"
78
+ xmlns="http://www.w3.org/2000/svg">
79
+ <path fill-rule="evenodd" clip-rule="evenodd"
80
+ d="M9.99998 1.5415C10.4142 1.5415 10.75 1.87729 10.75 2.2915V3.5415C10.75 3.95572 10.4142 4.2915 9.99998 4.2915C9.58577 4.2915 9.24998 3.95572 9.24998 3.5415V2.2915C9.24998 1.87729 9.58577 1.5415 9.99998 1.5415ZM10.0009 6.79327C8.22978 6.79327 6.79402 8.22904 6.79402 10.0001C6.79402 11.7712 8.22978 13.207 10.0009 13.207C11.772 13.207 13.2078 11.7712 13.2078 10.0001C13.2078 8.22904 11.772 6.79327 10.0009 6.79327ZM5.29402 10.0001C5.29402 7.40061 7.40135 5.29327 10.0009 5.29327C12.6004 5.29327 14.7078 7.40061 14.7078 10.0001C14.7078 12.5997 12.6004 14.707 10.0009 14.707C7.40135 14.707 5.29402 12.5997 5.29402 10.0001ZM15.9813 5.08035C16.2742 4.78746 16.2742 4.31258 15.9813 4.01969C15.6884 3.7268 15.2135 3.7268 14.9207 4.01969L14.0368 4.90357C13.7439 5.19647 13.7439 5.67134 14.0368 5.96423C14.3297 6.25713 14.8045 6.25713 15.0974 5.96423L15.9813 5.08035ZM18.4577 10.0001C18.4577 10.4143 18.1219 10.7501 17.7077 10.7501H16.4577C16.0435 10.7501 15.7077 10.4143 15.7077 10.0001C15.7077 9.58592 16.0435 9.25013 16.4577 9.25013H17.7077C18.1219 9.25013 18.4577 9.58592 18.4577 10.0001ZM14.9207 15.9806C15.2135 16.2735 15.6884 16.2735 15.9813 15.9806C16.2742 15.6877 16.2742 15.2128 15.9813 14.9199L15.0974 14.036C14.8045 13.7431 14.3297 13.7431 14.0368 14.036C13.7439 14.3289 13.7439 14.8038 14.0368 15.0967L14.9207 15.9806ZM9.99998 15.7088C10.4142 15.7088 10.75 16.0445 10.75 16.4588V17.7088C10.75 18.123 10.4142 18.4588 9.99998 18.4588C9.58577 18.4588 9.24998 18.123 9.24998 17.7088V16.4588C9.24998 16.0445 9.58577 15.7088 9.99998 15.7088ZM5.96356 15.0972C6.25646 14.8043 6.25646 14.3295 5.96356 14.0366C5.67067 13.7437 5.1958 13.7437 4.9029 14.0366L4.01902 14.9204C3.72613 15.2133 3.72613 15.6882 4.01902 15.9811C4.31191 16.274 4.78679 16.274 5.07968 15.9811L5.96356 15.0972ZM4.29224 10.0001C4.29224 10.4143 3.95645 10.7501 3.54224 10.7501H2.29224C1.87802 10.7501 1.54224 10.4143 1.54224 10.0001C1.54224 9.58592 1.87802 9.25013 2.29224 9.25013H3.54224C3.95645 9.25013 4.29224 9.58592 4.29224 10.0001ZM4.9029 5.9637C5.1958 6.25659 5.67067 6.25659 5.96356 5.9637C6.25646 5.6708 6.25646 5.19593 5.96356 4.90303L5.07968 4.01915C4.78679 3.72626 4.31191 3.72626 4.01902 4.01915C3.72613 4.31204 3.72613 4.78692 4.01902 5.07981L4.9029 5.9637Z"
81
+ fill="currentColor" />
82
+ </svg>
83
+ <svg class="dark:hidden" width="20" height="20" viewBox="0 0 20 20" fill="none"
84
+ xmlns="http://www.w3.org/2000/svg">
85
+ <path
86
+ d="M17.4547 11.97L18.1799 12.1611C18.265 11.8383 18.1265 11.4982 17.8401 11.3266C17.5538 11.1551 17.1885 11.1934 16.944 11.4207L17.4547 11.97ZM8.0306 2.5459L8.57989 3.05657C8.80718 2.81209 8.84554 2.44682 8.67398 2.16046C8.50243 1.8741 8.16227 1.73559 7.83948 1.82066L8.0306 2.5459ZM12.9154 13.0035C9.64678 13.0035 6.99707 10.3538 6.99707 7.08524H5.49707C5.49707 11.1823 8.81835 14.5035 12.9154 14.5035V13.0035ZM16.944 11.4207C15.8869 12.4035 14.4721 13.0035 12.9154 13.0035V14.5035C14.8657 14.5035 16.6418 13.7499 17.9654 12.5193L16.944 11.4207ZM16.7295 11.7789C15.9437 14.7607 13.2277 16.9586 10.0003 16.9586V18.4586C13.9257 18.4586 17.2249 15.7853 18.1799 12.1611L16.7295 11.7789ZM10.0003 16.9586C6.15734 16.9586 3.04199 13.8433 3.04199 10.0003H1.54199C1.54199 14.6717 5.32892 18.4586 10.0003 18.4586V16.9586ZM3.04199 10.0003C3.04199 6.77289 5.23988 4.05695 8.22173 3.27114L7.83948 1.82066C4.21532 2.77574 1.54199 6.07486 1.54199 10.0003H3.04199ZM6.99707 7.08524C6.99707 5.52854 7.5971 4.11366 8.57989 3.05657L7.48132 2.03522C6.25073 3.35885 5.49707 5.13487 5.49707 7.08524H6.99707Z"
87
+ fill="currentColor" />
88
+ </svg>
89
+ </button>
90
+ </div>
91
+
92
+ <!-- User Dropdown -->
93
+ <x-header.user-dropdown />
94
+ </div>
95
+ </div>
96
+ </header>
@@ -0,0 +1,138 @@
1
+ <!DOCTYPE html>
2
+ <html lang="{{ str_replace('_', '-', app()->getLocale()) }}" class="h-full">
3
+
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <meta name="csrf-token" content="{{ csrf_token() }}">
8
+
9
+ <title>{{ $title ?? 'Dashboard' }} | TailAdmin - Laravel Tailwind CSS Admin Dashboard Template</title>
10
+
11
+ <!-- Scripts -->
12
+ @vite(['resources/css/app.css', 'resources/js/app.js'])
13
+
14
+ <!-- Alpine.js -->
15
+ {{-- <script defer src="https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.js"></script> --}}
16
+
17
+ <!-- Theme Store -->
18
+ <script>
19
+ document.addEventListener('alpine:init', () => {
20
+ Alpine.store('theme', {
21
+ init() {
22
+ const savedTheme = localStorage.getItem('theme');
23
+ const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' :
24
+ 'light';
25
+ this.theme = savedTheme || systemTheme;
26
+ this.updateTheme();
27
+ },
28
+ theme: 'light',
29
+ toggle() {
30
+ this.theme = this.theme === 'light' ? 'dark' : 'light';
31
+ localStorage.setItem('theme', this.theme);
32
+ this.updateTheme();
33
+ },
34
+ updateTheme() {
35
+ const html = document.documentElement;
36
+ const body = document.body;
37
+ if (this.theme === 'dark') {
38
+ html.classList.add('dark');
39
+ body.classList.add('dark', 'bg-gray-900');
40
+ } else {
41
+ html.classList.remove('dark');
42
+ body.classList.remove('dark', 'bg-gray-900');
43
+ }
44
+ }
45
+ });
46
+
47
+ Alpine.store('sidebar', {
48
+ // Initialize based on screen size
49
+ isExpanded: window.innerWidth >= 1280, // true for desktop, false for mobile
50
+ isMobileOpen: false,
51
+ isHovered: false,
52
+
53
+ toggleExpanded() {
54
+ this.isExpanded = !this.isExpanded;
55
+ // When toggling desktop sidebar, ensure mobile menu is closed
56
+ this.isMobileOpen = false;
57
+ },
58
+
59
+ toggleMobileOpen() {
60
+ this.isMobileOpen = !this.isMobileOpen;
61
+ // Don't modify isExpanded when toggling mobile menu
62
+ },
63
+
64
+ setMobileOpen(val) {
65
+ this.isMobileOpen = val;
66
+ },
67
+
68
+ setHovered(val) {
69
+ // Only allow hover effects on desktop when sidebar is collapsed
70
+ if (window.innerWidth >= 1280 && !this.isExpanded) {
71
+ this.isHovered = val;
72
+ }
73
+ }
74
+ });
75
+ });
76
+ </script>
77
+
78
+ <!-- Apply dark mode immediately to prevent flash -->
79
+ <script>
80
+ (function() {
81
+ const savedTheme = localStorage.getItem('theme');
82
+ const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
83
+ const theme = savedTheme || systemTheme;
84
+ if (theme === 'dark') {
85
+ document.documentElement.classList.add('dark');
86
+ document.body.classList.add('dark', 'bg-gray-900');
87
+ } else {
88
+ document.documentElement.classList.remove('dark');
89
+ document.body.classList.remove('dark', 'bg-gray-900');
90
+ }
91
+ })();
92
+ </script>
93
+
94
+ </head>
95
+
96
+ <body
97
+ x-data="{ 'loaded': true}"
98
+ x-init="$store.sidebar.isExpanded = window.innerWidth >= 1280;
99
+ const checkMobile = () => {
100
+ if (window.innerWidth < 1280) {
101
+ $store.sidebar.setMobileOpen(false);
102
+ $store.sidebar.isExpanded = false;
103
+ } else {
104
+ $store.sidebar.isMobileOpen = false;
105
+ $store.sidebar.isExpanded = true;
106
+ }
107
+ };
108
+ window.addEventListener('resize', checkMobile);">
109
+
110
+ {{-- preloader --}}
111
+ <x-common.preloader/>
112
+ {{-- preloader end --}}
113
+
114
+ <div class="min-h-screen xl:flex">
115
+ @include('layouts.backdrop')
116
+ @include('layouts.sidebar')
117
+
118
+ <div class="flex-1 transition-all duration-300 ease-in-out"
119
+ :class="{
120
+ 'xl:ml-[290px]': $store.sidebar.isExpanded || $store.sidebar.isHovered,
121
+ 'xl:ml-[90px]': !$store.sidebar.isExpanded && !$store.sidebar.isHovered,
122
+ 'ml-0': $store.sidebar.isMobileOpen
123
+ }">
124
+ <!-- app header start -->
125
+ @include('layouts.app-header')
126
+ <!-- app header end -->
127
+ <div class="p-4 mx-auto max-w-(--breakpoint-2xl) md:p-6">
128
+ @yield('content')
129
+ </div>
130
+ </div>
131
+
132
+ </div>
133
+
134
+ </body>
135
+
136
+ @stack('scripts')
137
+
138
+ </html>
@@ -0,0 +1,12 @@
1
+ {{-- <div
2
+ x-show="$store.sidebar.isMobileOpen"
3
+ @click="$store.sidebar.toggleMobileOpen()"
4
+ class="fixed inset-0 bg-gray-900/50 z-[9999] xl:hidden"
5
+ >
6
+ sidebarToggle ? 'block xl:hidden' : 'hidden'
7
+ </div> --}}
8
+
9
+ <div
10
+ :class="$store.sidebar.isMobileOpen ? 'block xl:hidden' : 'hidden'"
11
+ class="fixed z-50 h-screen w-full bg-gray-900/50"
12
+ ></div>
@@ -0,0 +1,117 @@
1
+ <!DOCTYPE html>
2
+ <html lang="{{ str_replace('_', '-', app()->getLocale()) }}" class="h-full">
3
+
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <meta name="csrf-token" content="{{ csrf_token() }}">
8
+
9
+ <title>{{ $title ?? 'Dashboard' }} | TailAdmin - Laravel Tailwind CSS Admin Dashboard Template</title>
10
+
11
+ <!-- Scripts -->
12
+ @vite(['resources/css/app.css', 'resources/js/app.js'])
13
+
14
+ <!-- Alpine.js -->
15
+ {{-- <script defer src="https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.js"></script> --}}
16
+
17
+ <!-- Theme Store -->
18
+ <script>
19
+ document.addEventListener('alpine:init', () => {
20
+ Alpine.store('theme', {
21
+ init() {
22
+ const savedTheme = localStorage.getItem('theme');
23
+ const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' :
24
+ 'light';
25
+ this.theme = savedTheme || systemTheme;
26
+ this.updateTheme();
27
+ },
28
+ theme: 'light',
29
+ toggle() {
30
+ this.theme = this.theme === 'light' ? 'dark' : 'light';
31
+ localStorage.setItem('theme', this.theme);
32
+ this.updateTheme();
33
+ },
34
+ updateTheme() {
35
+ const html = document.documentElement;
36
+ const body = document.body;
37
+ if (this.theme === 'dark') {
38
+ html.classList.add('dark');
39
+ body.classList.add('dark', 'bg-gray-900');
40
+ } else {
41
+ html.classList.remove('dark');
42
+ body.classList.remove('dark', 'bg-gray-900');
43
+ }
44
+ }
45
+ });
46
+
47
+ Alpine.store('sidebar', {
48
+ // Initialize based on screen size
49
+ isExpanded: window.innerWidth >= 1280, // true for desktop, false for mobile
50
+ isMobileOpen: false,
51
+ isHovered: false,
52
+
53
+ toggleExpanded() {
54
+ this.isExpanded = !this.isExpanded;
55
+ // When toggling desktop sidebar, ensure mobile menu is closed
56
+ this.isMobileOpen = false;
57
+ },
58
+
59
+ toggleMobileOpen() {
60
+ this.isMobileOpen = !this.isMobileOpen;
61
+ // Don't modify isExpanded when toggling mobile menu
62
+ },
63
+
64
+ setMobileOpen(val) {
65
+ this.isMobileOpen = val;
66
+ },
67
+
68
+ setHovered(val) {
69
+ // Only allow hover effects on desktop when sidebar is collapsed
70
+ if (window.innerWidth >= 1280 && !this.isExpanded) {
71
+ this.isHovered = val;
72
+ }
73
+ }
74
+ });
75
+ });
76
+ </script>
77
+
78
+ <!-- Apply dark mode immediately to prevent flash -->
79
+ <script>
80
+ (function() {
81
+ const savedTheme = localStorage.getItem('theme');
82
+ const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
83
+ const theme = savedTheme || systemTheme;
84
+ if (theme === 'dark') {
85
+ document.documentElement.classList.add('dark');
86
+ document.body.classList.add('dark', 'bg-gray-900');
87
+ } else {
88
+ document.documentElement.classList.remove('dark');
89
+ document.body.classList.remove('dark', 'bg-gray-900');
90
+ }
91
+ })();
92
+ </script>
93
+ </head>
94
+
95
+ <body x-data="{ 'loaded': true}" x-init="$store.sidebar.isExpanded = window.innerWidth >= 1280;
96
+ const checkMobile = () => {
97
+ if (window.innerWidth < 1280) {
98
+ $store.sidebar.setMobileOpen(false);
99
+ $store.sidebar.isExpanded = false;
100
+ } else {
101
+ $store.sidebar.isMobileOpen = false;
102
+ $store.sidebar.isExpanded = true;
103
+ }
104
+ };
105
+ window.addEventListener('resize', checkMobile);">
106
+
107
+ {{-- preloader --}}
108
+ <x-common.preloader/>
109
+ {{-- preloader end --}}
110
+
111
+ @yield('content')
112
+
113
+ </body>
114
+
115
+ @stack('scripts')
116
+
117
+ </html>