From dca9ad17997794ccd3303174f00e2b8277e953e6 Mon Sep 17 00:00:00 2001 From: dyzulk <66510723+dyzulk@users.noreply.github.com> Date: Wed, 31 Dec 2025 10:50:50 +0700 Subject: [PATCH] feat(ui): port error pages, standardize fonts to Geist, and add health status page --- package-lock.json | 87 ++ package.json | 3 + public/images/error/403-dark.svg | 20 + public/images/error/403.svg | 20 + public/images/error/404-dark.svg | 20 + public/images/error/404.svg | 20 + public/images/error/500-dark.svg | 24 + public/images/error/500.svg | 24 + public/images/error/503-dark.svg | 26 + public/images/error/503.svg | 26 + public/images/error/maintenance-dark.svg | 5 + public/images/error/maintenance.svg | 5 + public/images/error/success-dark.svg | 3 + public/images/error/success.svg | 3 + resources/css/app.css | 888 +++++++++++++++++- resources/js/app.js | 5 + .../common/common-grid-shape.blade.php | 8 + .../components/common/preloader.blade.php | 9 + .../components/ui/flash-message.blade.php | 92 ++ resources/views/errors/403.blade.php | 33 + resources/views/errors/404.blade.php | 33 + resources/views/errors/500.blade.php | 30 + resources/views/errors/503.blade.php | 30 + .../views/layouts/fullscreen-layout.blade.php | 150 +++ resources/views/welcome.blade.php | 307 +----- routes/web.php | 2 +- 26 files changed, 1596 insertions(+), 277 deletions(-) create mode 100644 public/images/error/403-dark.svg create mode 100644 public/images/error/403.svg create mode 100644 public/images/error/404-dark.svg create mode 100644 public/images/error/404.svg create mode 100644 public/images/error/500-dark.svg create mode 100644 public/images/error/500.svg create mode 100644 public/images/error/503-dark.svg create mode 100644 public/images/error/503.svg create mode 100644 public/images/error/maintenance-dark.svg create mode 100644 public/images/error/maintenance.svg create mode 100644 public/images/error/success-dark.svg create mode 100644 public/images/error/success.svg create mode 100644 resources/views/components/common/common-grid-shape.blade.php create mode 100644 resources/views/components/common/preloader.blade.php create mode 100644 resources/views/components/ui/flash-message.blade.php create mode 100644 resources/views/errors/403.blade.php create mode 100644 resources/views/errors/404.blade.php create mode 100644 resources/views/errors/500.blade.php create mode 100644 resources/views/errors/503.blade.php create mode 100644 resources/views/layouts/fullscreen-layout.blade.php diff --git a/package-lock.json b/package-lock.json index 57d104b..15de352 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,11 +5,14 @@ "packages": { "": { "devDependencies": { + "@tailwindcss/typography": "^0.5.19", "@tailwindcss/vite": "^4.0.0", + "alpinejs": "^3.15.3", "axios": "^1.11.0", "concurrently": "^9.0.1", "laravel-echo": "^2.2.6", "laravel-vite-plugin": "^2.0.0", + "prismjs": "^1.30.0", "pusher-js": "^8.4.0", "tailwindcss": "^4.0.0", "vite": "^7.0.7" @@ -1080,6 +1083,19 @@ "node": ">= 10" } }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz", + "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" + } + }, "node_modules/@tailwindcss/vite": { "version": "4.1.18", "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.18.tgz", @@ -1102,6 +1118,33 @@ "dev": true, "license": "MIT" }, + "node_modules/@vue/reactivity": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz", + "integrity": "sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/shared": "3.1.5" + } + }, + "node_modules/@vue/shared": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz", + "integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/alpinejs": { + "version": "3.15.3", + "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.15.3.tgz", + "integrity": "sha512-fSI6F5213FdpMC4IWaup92KhuH3jBX0VVqajRJ6cOTCy1cL6888KyXdGO+seAAkn+g6fnrxBqQEx6gRpQ5EZoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "~3.1.1" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1264,6 +1307,19 @@ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -2121,6 +2177,30 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -2380,6 +2460,13 @@ "dev": true, "license": "Unlicense" }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, "node_modules/vite": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz", diff --git a/package.json b/package.json index 7b2b57f..4348f36 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,14 @@ "dev": "vite" }, "devDependencies": { + "@tailwindcss/typography": "^0.5.19", "@tailwindcss/vite": "^4.0.0", + "alpinejs": "^3.15.3", "axios": "^1.11.0", "concurrently": "^9.0.1", "laravel-echo": "^2.2.6", "laravel-vite-plugin": "^2.0.0", + "prismjs": "^1.30.0", "pusher-js": "^8.4.0", "tailwindcss": "^4.0.0", "vite": "^7.0.7" diff --git a/public/images/error/403-dark.svg b/public/images/error/403-dark.svg new file mode 100644 index 0000000..a40b741 --- /dev/null +++ b/public/images/error/403-dark.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/error/403.svg b/public/images/error/403.svg new file mode 100644 index 0000000..f849ace --- /dev/null +++ b/public/images/error/403.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/error/404-dark.svg b/public/images/error/404-dark.svg new file mode 100644 index 0000000..4d14ec9 --- /dev/null +++ b/public/images/error/404-dark.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/error/404.svg b/public/images/error/404.svg new file mode 100644 index 0000000..ff8b8a2 --- /dev/null +++ b/public/images/error/404.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/error/500-dark.svg b/public/images/error/500-dark.svg new file mode 100644 index 0000000..c5ac764 --- /dev/null +++ b/public/images/error/500-dark.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/error/500.svg b/public/images/error/500.svg new file mode 100644 index 0000000..82f5159 --- /dev/null +++ b/public/images/error/500.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/error/503-dark.svg b/public/images/error/503-dark.svg new file mode 100644 index 0000000..8df2a94 --- /dev/null +++ b/public/images/error/503-dark.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/error/503.svg b/public/images/error/503.svg new file mode 100644 index 0000000..a27a714 --- /dev/null +++ b/public/images/error/503.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/error/maintenance-dark.svg b/public/images/error/maintenance-dark.svg new file mode 100644 index 0000000..e2a4499 --- /dev/null +++ b/public/images/error/maintenance-dark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/images/error/maintenance.svg b/public/images/error/maintenance.svg new file mode 100644 index 0000000..859d817 --- /dev/null +++ b/public/images/error/maintenance.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/images/error/success-dark.svg b/public/images/error/success-dark.svg new file mode 100644 index 0000000..b57643f --- /dev/null +++ b/public/images/error/success-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/images/error/success.svg b/public/images/error/success.svg new file mode 100644 index 0000000..91e1a76 --- /dev/null +++ b/public/images/error/success.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/css/app.css b/resources/css/app.css index 3e6abea..7ecb3b0 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -1,11 +1,893 @@ +@import 'prismjs/themes/prism.min.css'; @import 'tailwindcss'; +@plugin '@tailwindcss/typography'; + @source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php'; @source '../../storage/framework/views/*.php'; @source '../**/*.blade.php'; @source '../**/*.js'; -@theme { - --font-sans: 'Instrument Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', - 'Segoe UI Symbol', 'Noto Color Emoji'; + +@custom-variant dark (&:is(.dark *)); + +@font-face { + font-family: 'Geist Sans'; + src: url('/fonts/Geist-Variable.woff2') format('woff2'); + font-weight: 100 900; + font-display: swap; + font-style: normal; +} + +@font-face { + font-family: 'Geist Mono'; + src: url('/fonts/GeistMono-Variable.woff2') format('woff2'); + font-weight: 100 900; + font-display: swap; + font-style: normal; +} + +@theme { + --font-*: initial; + --font-sans: 'Geist Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --font-mono: 'Geist Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + + --breakpoint-*: initial; + --breakpoint-2xsm: 375px; + --breakpoint-xsm: 425px; + --breakpoint-3xl: 2000px; + --breakpoint-sm: 640px; + --breakpoint-md: 768px; + --breakpoint-lg: 1024px; + --breakpoint-xl: 1280px; + --breakpoint-2xl: 1536px; + + --text-title-2xl: 72px; + --text-title-2xl--line-height: 90px; + --text-title-xl: 60px; + --text-title-xl--line-height: 72px; + --text-title-lg: 48px; + --text-title-lg--line-height: 60px; + --text-title-md: 36px; + --text-title-md--line-height: 44px; + --text-title-sm: 30px; + --text-title-sm--line-height: 38px; + --text-theme-xl: 20px; + --text-theme-xl--line-height: 30px; + --text-theme-sm: 14px; + --text-theme-sm--line-height: 20px; + --text-theme-xs: 12px; + --text-theme-xs--line-height: 18px; + + --color-current: currentColor; + --color-transparent: transparent; + --color-white: #ffffff; + --color-black: #101828; + + --color-brand-25: #f2f7ff; + --color-brand-50: #ecf3ff; + --color-brand-100: #dde9ff; + --color-brand-200: #c2d6ff; + --color-brand-300: #9cb9ff; + --color-brand-400: #7592ff; + --color-brand-500: #465fff; + --color-brand-600: #3641f5; + --color-brand-700: #2a31d8; + --color-brand-800: #252dae; + --color-brand-900: #262e89; + --color-brand-950: #161950; + + --color-blue-light-25: #f5fbff; + --color-blue-light-50: #f0f9ff; + --color-blue-light-100: #e0f2fe; + --color-blue-light-200: #b9e6fe; + --color-blue-light-300: #7cd4fd; + --color-blue-light-400: #36bffa; + --color-blue-light-500: #0ba5ec; + --color-blue-light-600: #0086c9; + --color-blue-light-700: #026aa2; + --color-blue-light-800: #065986; + --color-blue-light-900: #0b4a6f; + --color-blue-light-950: #062c41; + + --color-gray-25: #fcfcfd; + --color-gray-50: #f9fafb; + --color-gray-100: #f2f4f7; + --color-gray-200: #e4e7ec; + --color-gray-300: #d0d5dd; + --color-gray-400: #98a2b3; + --color-gray-500: #667085; + --color-gray-600: #475467; + --color-gray-700: #344054; + --color-gray-800: #1d2939; + --color-gray-900: #101828; + --color-gray-950: #0c111d; + --color-gray-dark: #1a2231; + + --color-orange-25: #fffaf5; + --color-orange-50: #fff6ed; + --color-orange-100: #ffead5; + --color-orange-200: #fddcab; + --color-orange-300: #feb273; + --color-orange-400: #fd853a; + --color-orange-500: #fb6514; + --color-orange-600: #ec4a0a; + --color-orange-700: #c4320a; + --color-orange-800: #9c2a10; + --color-orange-900: #7e2410; + --color-orange-950: #511c10; + + --color-success-25: #f6fef9; + --color-success-50: #ecfdf3; + --color-success-100: #d1fadf; + --color-success-200: #a6f4c5; + --color-success-300: #6ce9a6; + --color-success-400: #32d583; + --color-success-500: #12b76a; + --color-success-600: #039855; + --color-success-700: #027a48; + --color-success-800: #05603a; + --color-success-900: #054f31; + --color-success-950: #053321; + + --color-error-25: #fffbfa; + --color-error-50: #fef3f2; + --color-error-100: #fee4e2; + --color-error-200: #fecdca; + --color-error-300: #fda29b; + --color-error-400: #f97066; + --color-error-500: #f04438; + --color-error-600: #d92d20; + --color-error-700: #b42318; + --color-error-800: #912018; + --color-error-900: #7a271a; + --color-error-950: #55160c; + + --color-warning-25: #fffcf5; + --color-warning-50: #fffaeb; + --color-warning-100: #fef0c7; + --color-warning-200: #fedf89; + --color-warning-300: #fec84b; + --color-warning-400: #fdb022; + --color-warning-500: #f79009; + --color-warning-600: #dc6803; + --color-warning-700: #b54708; + --color-warning-800: #93370d; + --color-warning-900: #7a2e0e; + --color-warning-950: #4e1d09; + + --color-theme-pink-500: #ee46bc; + + --color-theme-purple-500: #7a5af8; + + --shadow-theme-md: 0px 4px 8px -2px rgba(16, 24, 40, 0.1), 0px 2px 4px -2px rgba(16, 24, 40, 0.06); + --shadow-theme-lg: 0px 12px 16px -4px rgba(16, 24, 40, 0.08), + 0px 4px 6px -2px rgba(16, 24, 40, 0.03); + --shadow-theme-sm: 0px 1px 3px 0px rgba(16, 24, 40, 0.1), 0px 1px 2px 0px rgba(16, 24, 40, 0.06); + --shadow-theme-xs: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + --shadow-theme-xl: 0px 20px 24px -4px rgba(16, 24, 40, 0.08), + 0px 8px 8px -4px rgba(16, 24, 40, 0.03); + --shadow-datepicker: -5px 0 0 #262d3c, 5px 0 0 #262d3c; + --shadow-focus-ring: 0px 0px 0px 4px rgba(70, 95, 255, 0.12); + --shadow-slider-navigation: 0px 1px 2px 0px rgba(16, 24, 40, 0.1), + 0px 1px 3px 0px rgba(16, 24, 40, 0.1); + --shadow-tooltip: 0px 4px 6px -2px rgba(16, 24, 40, 0.05), + -8px 0px 20px 8px rgba(16, 24, 40, 0.05); + + --drop-shadow-4xl: 0 35px 35px rgba(0, 0, 0, 0.25), 0 45px 65px rgba(0, 0, 0, 0.15); + + --z-index-1: 1; + --z-index-9: 9; + --z-index-99: 99; + --z-index-999: 999; + --z-index-9999: 9999; + --z-index-99999: 99999; + --z-index-999999: 999999; +} + +/* + The default border color has changed to `currentColor` in Tailwind CSS v4, + so we've added these compatibility styles to make sure everything still + looks the same as it did with Tailwind CSS v3. + + If we ever want to remove these styles, we need to add an explicit border + color utility to any element that depends on these defaults. +*/ +@layer base { + *, + ::after, + ::before, + ::backdrop, + ::file-selector-button { + border-color: var(--color-gray-200, currentColor); + } + button:not(:disabled), + [role='button']:not(:disabled) { + cursor: pointer; + } + body { + @apply relative font-normal font-sans z-1 bg-gray-50; + } +} + +@utility menu-item { + @apply relative flex items-center w-full gap-3 px-3 py-2 font-medium rounded-lg text-theme-sm; +} + +@utility menu-item-active { + @apply bg-brand-50 text-brand-500 dark:bg-brand-500/[0.12] dark:text-brand-400; +} + +@utility menu-item-inactive { + @apply text-gray-700 hover:bg-gray-100 group-hover:text-gray-700 dark:text-gray-300 dark:hover:bg-white/5 dark:hover:text-gray-300; +} + +@utility menu-item-icon { + @apply text-gray-500 group-hover:text-gray-700 dark:text-gray-400; +} + +@utility menu-item-icon-active { + @apply text-brand-500 dark:text-brand-400; +} + +@utility menu-item-icon-inactive { + @apply text-gray-500 group-hover:text-gray-700 dark:text-gray-400 dark:group-hover:text-gray-300; +} + +@utility menu-item-arrow { + @apply relative; +} + +@utility menu-item-arrow-active { + @apply rotate-180 text-brand-500 dark:text-brand-400; +} + +@utility menu-item-arrow-inactive { + @apply text-gray-500 group-hover:text-gray-700 dark:text-gray-400 dark:group-hover:text-gray-300; +} + +@utility menu-dropdown-item { + @apply relative flex items-center gap-3 rounded-lg px-3 py-2.5 text-theme-sm font-medium; +} + +@utility menu-dropdown-item-active { + @apply bg-brand-50 text-brand-500 dark:bg-brand-500/[0.12] dark:text-brand-400; +} + +@utility menu-dropdown-item-inactive { + @apply text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-white/5; +} + +@utility menu-dropdown-item { + @apply text-theme-sm relative flex items-center gap-3 rounded-lg px-3 py-2.5 font-medium; +} + +@utility menu-dropdown-item-active { + @apply bg-brand-50 text-brand-500 dark:bg-brand-500/[0.12] dark:text-brand-400; +} + +@utility menu-dropdown-item-inactive { + @apply text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-white/5; +} + +@utility menu-dropdown-badge { + @apply text-success-600 dark:text-success-500 block rounded-full px-2.5 py-0.5 text-xs font-medium uppercase; +} + +@utility menu-dropdown-badge-active { + @apply bg-success-100 dark:bg-success-500/20; +} + +@utility menu-dropdown-badge-inactive { + @apply bg-success-50 group-hover:bg-success-100 dark:bg-success-500/15 dark:group-hover:bg-success-500/20; +} + +@utility menu-dropdown-badge-pro { + @apply text-brand-600 dark:text-brand-500 block rounded-full px-2.5 py-0.5 text-xs font-medium uppercase; +} + +@utility menu-dropdown-badge-pro-active { + @apply bg-brand-100 dark:bg-brand-500/20; +} + +@utility menu-dropdown-badge-pro-inactive { + @apply bg-brand-50 group-hover:bg-brand-100 dark:bg-brand-500/15 dark:group-hover:bg-brand-500/20; +} + +@utility no-scrollbar { + /* Chrome, Safari and Opera */ + &::-webkit-scrollbar { + display: none; + } + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ +} + +@utility custom-scrollbar { + &::-webkit-scrollbar { + @apply size-1.5; + } + + &::-webkit-scrollbar-track { + @apply rounded-full; + } + + &::-webkit-scrollbar-thumb { + @apply bg-gray-200 rounded-full dark:bg-gray-700; + } +} +.dark .custom-scrollbar::-webkit-scrollbar-thumb { + background-color: #344054; +} +@layer utilities { + /* For Remove Date Icon */ + input[type='date']::-webkit-inner-spin-button, + input[type='time']::-webkit-inner-spin-button, + input[type='date']::-webkit-calendar-picker-indicator, + input[type='time']::-webkit-calendar-picker-indicator { + display: none; + -webkit-appearance: none; + } +} + +.sidebar:hover { + width: 290px; +} +.sidebar:hover .logo { + display: block; +} +.sidebar:hover .logo-icon { + display: none; +} +.sidebar:hover .sidebar-header { + justify-content: space-between; +} +.sidebar:hover .menu-group-title { + display: block; +} +.sidebar:hover .menu-group-icon { + display: none; +} + +.sidebar:hover .menu-item-text { + display: inline; +} + +.sidebar:hover .menu-item-arrow { + display: block; +} + +.sidebar:hover .menu-dropdown { + display: flex; +} + +.tableCheckbox:checked ~ span span { + @apply opacity-100; +} +.tableCheckbox:checked ~ span { + @apply border-brand-500 bg-brand-500; +} + +/* third-party libraries CSS */ +.apexcharts-legend-text { + @apply !text-gray-700 dark:!text-gray-400; +} + +.apexcharts-text { + @apply !fill-gray-700 dark:!fill-gray-400; +} + +.apexcharts-tooltip.apexcharts-theme-light { + @apply gap-1 !rounded-lg !border-gray-200 p-3 !shadow-theme-sm dark:!border-gray-800 dark:!bg-gray-900; +} + +/* .apexcharts-tooltip-marker { + @apply !mr-1.5 !h-1.5 !w-1.5; +} */ +.apexcharts-legend-text { + @apply !pl-5 !text-gray-700 dark:!text-gray-400; +} +.apexcharts-tooltip-series-group { + @apply !p-0; +} +.apexcharts-tooltip-y-group { + @apply !p-0; +} +.apexcharts-tooltip-title { + @apply !mb-0 !border-b-0 !bg-transparent !p-0 !text-[10px] !leading-4 !text-gray-800 dark:!text-white/90; +} +.apexcharts-tooltip-text { + @apply !text-theme-xs !text-gray-700 dark:!text-white/90; +} +.apexcharts-tooltip-text-y-value { + @apply !font-medium; +} + +.apexcharts-gridline { + @apply !stroke-gray-100 dark:!stroke-gray-800; +} +#chartTwo .apexcharts-datalabels-group { + @apply !-translate-y-24; +} + +#chartSeven .apexcharts-datalabels-group .apexcharts-text, +#chartTwo .apexcharts-datalabels-group .apexcharts-text, +#chartThirteen .apexcharts-datalabels-group .apexcharts-text, +#chartTwelve .apexcharts-datalabels-group .apexcharts-text { + @apply !fill-gray-800 !font-semibold dark:!fill-white/90; +} + +#chartSixteen .apexcharts-legend { + @apply !p-0 !pl-6; +} + +.jvm-container { + @apply !bg-gray-50 dark:!bg-gray-900; +} +.jvm-region.jvm-element { + @apply !fill-gray-300 hover:!fill-brand-500 dark:!fill-gray-700 dark:hover:!fill-brand-500; +} +.jvm-marker.jvm-element { + @apply !stroke-gray-200 dark:!stroke-gray-800; +} + +.stocks-slider-outer .swiper-button-next:after, +.stocks-slider-outer .swiper-button-prev:after { + @apply hidden; +} + +.stocks-slider-outer .swiper-button-next, +.stocks-slider-outer .swiper-button-prev { + @apply static! mt-0 h-8 w-9 rounded-full border border-gray-200 !text-gray-700 transition hover:bg-gray-100 dark:border-gray-800 dark:bg-gray-800 dark:text-gray-400!; +} + +.stocks-slider-outer .swiper-button-next.swiper-button-disabled, +.stocks-slider-outer .swiper-button-prev.swiper-button-disabled { + @apply bg-white opacity-50 dark:bg-gray-900; +} + +.stocks-slider-outer .swiper-button-next svg, +.stocks-slider-outer .swiper-button-prev svg { + @apply !h-auto !w-auto; + fill: none; +} + +.flatpickr-wrapper { + @apply w-full; +} +.flatpickr-calendar { + @apply mt-2 !rounded-xl bg-black !p-5 !border !border-transparent dark:!border-white/5 !text-gray-500 dark:!bg-gray-dark dark:!text-gray-400 dark:!shadow-theme-xl 2xsm:!w-auto; +} +.flatpickr-time input { + background-color: #f9fafb !important; +} +.flatpickr-months .flatpickr-prev-month:hover svg, +.flatpickr-months .flatpickr-next-month:hover svg { + @apply stroke-brand-500; +} +.flatpickr-calendar.arrowTop:before, +.flatpickr-calendar.arrowTop:after { + @apply hidden; +} +.flatpickr-current-month .cur-month, +.flatpickr-current-month input.cur-year { + @apply !h-auto !pt-0 !text-lg !font-medium !text-gray-800 dark:!text-white/90; +} + +.flatpickr-prev-month, +.flatpickr-next-month { + @apply !p-0; +} + +.flatpickr-weekdays { + @apply h-auto mt-6 mb-4; +} + +.flatpickr-weekday { + @apply !text-theme-sm !font-medium !text-gray-500 dark:!text-gray-400; +} + +.flatpickr-day { + @apply !flex !items-center !text-theme-sm !font-medium !text-gray-800 dark:!text-white/90 dark:hover:!border-gray-300 dark:hover:!bg-gray-900; +} +.flatpickr-day.nextMonthDay, +.flatpickr-day.prevMonthDay { + @apply !text-gray-400; +} +.flatpickr-months .flatpickr-prev-month, +.flatpickr-months .flatpickr-next-month { + @apply !top-7 dark:!fill-white dark:!text-white; +} +.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month, +.flatpickr-months .flatpickr-next-month.flatpickr-prev-month { + @apply !left-7; +} +.flatpickr-months .flatpickr-prev-month.flatpickr-next-month, +.flatpickr-months .flatpickr-next-month.flatpickr-next-month { + @apply !right-7; +} +span.flatpickr-weekday, +.flatpickr-months .flatpickr-month { + @apply dark:!fill-white dark:!text-white; +} +.flatpickr-day.inRange { + box-shadow: + -5px 0 0 #f9fafb, + 5px 0 0 #f9fafb !important; + @apply dark:!shadow-datepicker; +} +.flatpickr-day.inRange, +.flatpickr-day.prevMonthDay.inRange, +.flatpickr-day.nextMonthDay.inRange, +.flatpickr-day.today.inRange, +.flatpickr-day.prevMonthDay.today.inRange, +.flatpickr-day.nextMonthDay.today.inRange, +.flatpickr-day:hover, +.flatpickr-day.prevMonthDay:hover, +.flatpickr-day.nextMonthDay:hover, +.flatpickr-day:focus, +.flatpickr-day.prevMonthDay:focus, +.flatpickr-day.nextMonthDay:focus { + @apply !border-gray-50 !bg-gray-50 dark:!border-0 dark:!border-white/5 dark:!bg-white/5; +} +.flatpickr-day.selected, +.flatpickr-day.startRange, +.flatpickr-day.selected, +.flatpickr-day.endRange { + @apply !text-white dark:!text-white; +} +.flatpickr-day.selected, +.flatpickr-day.startRange, +.flatpickr-day.endRange, +.flatpickr-day.selected.inRange, +.flatpickr-day.startRange.inRange, +.flatpickr-day.endRange.inRange, +.flatpickr-day.selected:focus, +.flatpickr-day.startRange:focus, +.flatpickr-day.endRange:focus, +.flatpickr-day.selected:hover, +.flatpickr-day.startRange:hover, +.flatpickr-day.endRange:hover, +.flatpickr-day.selected.prevMonthDay, +.flatpickr-day.startRange.prevMonthDay, +.flatpickr-day.endRange.prevMonthDay, +.flatpickr-day.selected.nextMonthDay, +.flatpickr-day.startRange.nextMonthDay, +.flatpickr-day.endRange.nextMonthDay { + background: #465fff; + @apply !border-brand-500 !bg-brand-500 hover:!border-brand-500 hover:!bg-brand-500; +} +.flatpickr-day.selected.startRange + .endRange:not(:nth-child(7n + 1)), +.flatpickr-day.startRange.startRange + .endRange:not(:nth-child(7n + 1)), +.flatpickr-day.endRange.startRange + .endRange:not(:nth-child(7n + 1)) { + box-shadow: -10px 0 0 #465fff; +} + +.flatpickr-months .flatpickr-prev-month svg, +.flatpickr-months .flatpickr-next-month svg, +.flatpickr-months .flatpickr-prev-month, +.flatpickr-months .flatpickr-next-month { + @apply hover:!fill-none; +} +.flatpickr-months .flatpickr-prev-month:hover svg, +.flatpickr-months .flatpickr-next-month:hover svg { + fill: none !important; +} + +.flatpickr-calendar.static { + @apply right-0; +} +.flatpickr-calendar.hasTime { + width: 300px !important; +} +.flatpickr-calendar.hasTime .flatpickr-time { + border: transparent !important; +} +.fc .fc-view-harness { + @apply max-w-full overflow-x-auto custom-scrollbar; +} +.fc-dayGridMonth-view.fc-view.fc-daygrid { + @apply min-w-[718px]; +} +.fc .fc-scrollgrid-section > * { + border-right-width: 0; + border-bottom-width: 0; +} +.fc .fc-scrollgrid { + border-left-width: 0; +} +.fc .fc-toolbar.fc-header-toolbar { + @apply flex-col gap-4 px-6 pt-6 sm:flex-row; +} +.fc-button-group { + @apply gap-2; +} +.fc-button-group .fc-button { + @apply flex h-10 w-10 items-center justify-center !rounded-lg border border-gray-200 bg-transparent hover:border-gray-200 hover:bg-gray-50 focus:shadow-none active:!border-gray-200 active:!bg-transparent active:!shadow-none dark:border-gray-800 dark:hover:border-gray-800 dark:hover:bg-gray-900 dark:active:!border-gray-800; +} + +.fc-button-group .fc-button.fc-prev-button:before { + @apply inline-block mt-1; + content: url("data:image/svg+xml,%3Csvg width='25' height='24' viewBox='0 0 25 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16.0068 6L9.75684 12.25L16.0068 18.5' stroke='%23344054' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A"); +} +.fc-button-group .fc-button.fc-next-button:before { + @apply inline-block mt-1; + content: url("data:image/svg+xml,%3Csvg width='25' height='24' viewBox='0 0 25 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.50684 19L15.7568 12.75L9.50684 6.5' stroke='%23344054' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A"); +} +.dark .fc-button-group .fc-button.fc-prev-button:before { + content: url("data:image/svg+xml,%3Csvg width='25' height='24' viewBox='0 0 25 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16.0068 6L9.75684 12.25L16.0068 18.5' stroke='%2398A2B3' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A"); +} +.dark .fc-button-group .fc-button.fc-next-button:before { + content: url("data:image/svg+xml,%3Csvg width='25' height='24' viewBox='0 0 25 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.50684 19L15.7568 12.75L9.50684 6.5' stroke='%2398A2B3' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A"); +} +.fc-button-group .fc-button .fc-icon { + @apply hidden; +} +.fc-addEventButton-button { + @apply !rounded-lg !border-0 !bg-brand-500 !px-4 !py-2.5 !text-sm !font-medium hover:!bg-brand-600 focus:!shadow-none; +} +.fc-toolbar-title { + @apply !text-lg !font-medium text-gray-800 dark:text-white/90; +} +.fc-header-toolbar.fc-toolbar .fc-toolbar-chunk:last-child { + @apply rounded-lg bg-gray-100 p-0.5 dark:bg-gray-900; +} +.fc-header-toolbar.fc-toolbar .fc-toolbar-chunk:last-child .fc-button { + @apply !h-auto !w-auto rounded-md !border-0 bg-transparent !px-5 !py-2 text-sm font-medium text-gray-500 hover:text-gray-700 focus:!shadow-none dark:text-gray-400; +} +.fc-header-toolbar.fc-toolbar .fc-toolbar-chunk:last-child .fc-button.fc-button-active { + @apply text-gray-900 bg-white dark:bg-gray-800 dark:text-white; +} +.fc-theme-standard th { + @apply !border-x-0 border-t !border-gray-200 bg-gray-50 !text-left dark:!border-gray-800 dark:bg-gray-900; +} +.fc-theme-standard td, +.fc-theme-standard .fc-scrollgrid { + @apply !border-gray-200 dark:!border-gray-800; +} +.fc .fc-col-header-cell-cushion { + @apply !px-5 !py-4 text-sm font-medium uppercase text-gray-400; +} +.fc .fc-daygrid-day.fc-day-today { + @apply bg-transparent; +} +.fc .fc-daygrid-day { + @apply p-2; +} +.fc .fc-daygrid-day.fc-day-today .fc-scrollgrid-sync-inner { + @apply rounded-sm bg-gray-100 dark:bg-white/[0.03]; +} +.fc .fc-daygrid-day-number { + @apply !p-3 text-sm font-medium text-gray-700 dark:text-gray-400; +} +.fc .fc-daygrid-day-top { + @apply flex-row!; +} +.fc .fc-day-other .fc-daygrid-day-top { + opacity: 1; +} +.fc .fc-day-other .fc-daygrid-day-top .fc-daygrid-day-number { + @apply text-gray-400 dark:text-white/30; +} +.event-fc-color { + @apply rounded-lg py-2.5 pl-4 pr-3; +} +.event-fc-color .fc-event-title { + @apply p-0 text-sm font-normal text-gray-700; +} +.fc-daygrid-event-dot { + @apply w-1 h-5 ml-0 mr-3 border-none rounded-sm; +} +.fc-event { + @apply focus:shadow-none; +} +.fc-daygrid-event.fc-event-start { + @apply !ml-3; +} +.event-fc-color.fc-bg-success { + @apply border-success-50 bg-success-50; +} +.event-fc-color.fc-bg-danger { + @apply border-error-50 bg-error-50; +} +.event-fc-color.fc-bg-primary { + @apply border-brand-50 bg-brand-50; +} +.event-fc-color.fc-bg-warning { + @apply border-orange-50 bg-orange-50; +} +.event-fc-color.fc-bg-success .fc-daygrid-event-dot { + @apply bg-success-500; +} +.event-fc-color.fc-bg-danger .fc-daygrid-event-dot { + @apply bg-error-500; +} +.event-fc-color.fc-bg-primary .fc-daygrid-event-dot { + @apply bg-brand-500; +} +.event-fc-color.fc-bg-warning .fc-daygrid-event-dot { + @apply bg-orange-500; +} +.fc-direction-ltr .fc-timegrid-slot-label-frame { + @apply px-3 py-1.5 text-left text-sm font-medium text-gray-500 dark:text-gray-400; +} +.fc .fc-timegrid-axis-cushion { + @apply text-sm font-medium text-gray-500 dark:text-gray-400; +} + +.input-date-icon::-webkit-inner-spin-button, +.input-date-icon::-webkit-calendar-picker-indicator { + opacity: 0; + -webkit-appearance: none; +} + +.swiper-button-prev svg, +.swiper-button-next svg { + @apply !h-auto w-auto!; +} + +.carouselTwo .swiper-button-next:after, +.carouselTwo .swiper-button-prev:after, +.carouselFour .swiper-button-next:after, +.carouselFour .swiper-button-prev:after { + @apply hidden; +} +.carouselTwo .swiper-button-next.swiper-button-disabled, +.carouselTwo .swiper-button-prev.swiper-button-disabled, +.carouselFour .swiper-button-next.swiper-button-disabled, +.carouselFour .swiper-button-prev.swiper-button-disabled { + @apply bg-white/60 opacity-100!; +} +.carouselTwo .swiper-button-next, +.carouselTwo .swiper-button-prev, +.carouselFour .swiper-button-next, +.carouselFour .swiper-button-prev { + @apply h-10 w-10 rounded-full border-[0.5px] border-white/10 bg-white/90 !text-gray-700 shadow-slider-navigation backdrop-blur-[10px]; +} + +.carouselTwo .swiper-button-prev, +.carouselFour .swiper-button-prev { + @apply !left-3 sm:!left-4; +} + +.carouselTwo .swiper-button-next, +.carouselFour .swiper-button-next { + @apply !right-3 sm:!right-4; +} + +.carouselThree .swiper-pagination, +.carouselFour .swiper-pagination { + @apply !bottom-3 !left-1/2 inline-flex !w-auto -translate-x-1/2 items-center gap-1.5 rounded-[40px] border-[0.5px] border-white/10 bg-white/60 px-2 py-1.5 shadow-slider-navigation backdrop-blur-[10px] sm:!bottom-5; +} + +.carouselThree .swiper-pagination-bullet, +.carouselFour .swiper-pagination-bullet { + @apply !m-0 h-2.5 w-2.5 bg-white opacity-100 shadow-theme-xs duration-200 ease-in-out; +} + +.carouselThree .swiper-pagination-bullet-active, +.carouselFour .swiper-pagination-bullet-active { + @apply w-6.5 rounded-xl; +} + +.form-check-input:checked ~ span { + @apply border-[6px] border-brand-500 dark:border-brand-500; +} + +.taskCheckbox:checked ~ .box span { + @apply opacity-100; +} +.taskCheckbox:checked ~ p { + @apply text-gray-400 line-through; +} +.taskCheckbox:checked ~ .box { + @apply border-brand-500 bg-brand-500 dark:border-brand-500; +} + +.task { + transition: all 0.2s ease; /* Smooth transition for visual effects */ +} + +.task.is-dragging { + border-radius: 0.75rem; + box-shadow: + 0px 1px 3px 0px rgba(16, 24, 40, 0.1), + 0px 1px 2px 0px rgba(16, 24, 40, 0.06); + opacity: 0.8; + cursor: grabbing; /* Changes the cursor to indicate dragging */ +} + + +.custom-calendar .fc-h-event { + background-color: #0000; + border: none; + color: black; +} + +.simplebar-scrollbar:before { + @apply !bg-gray-200 !rounded-full dark:!bg-gray-700 !opacity-100; +} + +.dark .simplebar-scrollbar::before { + @apply !bg-gray-700; +} + +.simplebar-scrollbar.simplebar-visible:before { + @apply opacity-100; +} + +.social-button { + @apply flex h-11 w-11 items-center justify-center gap-2 rounded-full border border-gray-300 bg-white text-sm font-medium text-gray-700 shadow-theme-xs hover:bg-gray-50 hover:text-gray-800 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:hover:bg-white/[0.03] dark:hover:text-gray-200; +} + +.edit-button { + @apply flex w-full items-center justify-center gap-2 rounded-full border border-gray-300 bg-white px-4 py-3 text-sm font-medium text-gray-700 shadow-theme-xs hover:bg-gray-50 hover:text-gray-800 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:hover:bg-white/[0.03] dark:hover:text-gray-200 lg:inline-flex lg:w-auto; +} + +/* Code Editor */ +code[class*='language-'], +pre[class*='language-'] { + text-shadow: none; + color: #344054; + overflow: hidden !important; + font-size: 14px; + margin: 0; + padding: 0; + white-space: pre-wrap; + word-wrap: break-word; + text-align: justify; +} + +.dark code[class*='language-'], +.dark pre[class*='language-'] { + text-shadow: none; + color: #98a2b3; +} +.language-html { + background-color: #ffffff !important; +} +.dark .language-html { + background-color: #ffffff00 !important; +} +.token { + text-shadow: none; + font-size: 14px; +} +.token.doctype-tag, +.token.name { + color: #018001; +} +.token.tag { + color: #267f99; +} +.token.selector { + color: #267f99; +} +.token.property { + color: #0070c1; +} +.token.language-css { + color: #1b00ff; +} +.token.attr-name { + color: #98a2b3; +} +.token.attr-value { + color: #a31615; +} +.token.punctuation { + color: #344054; +} +.dark .token.punctuation { + color: #98a2b3; +} +.custom-datepicker .flatpickr-calendar.static.open { + left: 0; + right: auto; +} + +.swiper-button-prev, .swiper-button-next { + svg { + fill: none !important; + } } diff --git a/resources/js/app.js b/resources/js/app.js index e59d6a0..bcef694 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -1 +1,6 @@ import './bootstrap'; +import Alpine from 'alpinejs'; + +window.Alpine = Alpine; + +Alpine.start(); diff --git a/resources/views/components/common/common-grid-shape.blade.php b/resources/views/components/common/common-grid-shape.blade.php new file mode 100644 index 0000000..8392fe6 --- /dev/null +++ b/resources/views/components/common/common-grid-shape.blade.php @@ -0,0 +1,8 @@ +
+
+ grid +
+
+ grid +
+
diff --git a/resources/views/components/common/preloader.blade.php b/resources/views/components/common/preloader.blade.php new file mode 100644 index 0000000..bbd9d34 --- /dev/null +++ b/resources/views/components/common/preloader.blade.php @@ -0,0 +1,9 @@ +
+
+
diff --git a/resources/views/components/ui/flash-message.blade.php b/resources/views/components/ui/flash-message.blade.php new file mode 100644 index 0000000..ba589c1 --- /dev/null +++ b/resources/views/components/ui/flash-message.blade.php @@ -0,0 +1,92 @@ +@if (session()->has('success') || session()->has('error') || session()->has('warning') || session()->has('info') || session()->has('status')) + @php + $variant = 'info'; + $message = ''; + $title = ''; + + if (session()->has('success')) { + $variant = 'success'; + $message = session('success'); + $title = session('title') ?? 'Success'; + } elseif (session()->has('error')) { + $variant = 'error'; + $message = session('error'); + $title = session('title') ?? 'Error'; + } elseif (session()->has('warning')) { + $variant = 'warning'; + $message = session('warning'); + $title = session('title') ?? 'Warning'; + } elseif (session()->has('info')) { + $variant = 'info'; + $message = session('info'); + $title = session('title') ?? 'Information'; + } elseif (session()->has('status')) { + $variant = 'success'; // Default status to success/info style + $message = session('status'); + $title = session('title') ?? 'Notification'; + } + + // Copy styles from ui.alert + $variantClasses = [ + 'success' => [ + 'container' => 'border-green-500 bg-green-50 dark:border-green-500/30 dark:bg-green-500/15', + 'icon' => 'text-green-500', + ], + 'error' => [ + 'container' => 'border-red-500 bg-red-50 dark:border-red-500/30 dark:bg-red-500/15', + 'icon' => 'text-red-500', + ], + 'warning' => [ + 'container' => 'border-yellow-500 bg-yellow-50 dark:border-yellow-500/30 dark:bg-yellow-500/15', + 'icon' => 'text-yellow-500', + ], + 'info' => [ + 'container' => 'border-blue-500 bg-blue-50 dark:border-blue-500/30 dark:bg-blue-500/15', + 'icon' => 'text-blue-500', + ], + ]; + + $icons = [ + 'success' => '', + 'error' => '', + 'warning' => '', + 'info' => '', + ]; + + $containerClass = $variantClasses[$variant]['container'] ?? $variantClasses['info']['container']; + $iconClass = $variantClasses[$variant]['icon'] ?? $variantClasses['info']['icon']; + $icon = $icons[$variant] ?? $icons['info']; + @endphp + + +@endif diff --git a/resources/views/errors/403.blade.php b/resources/views/errors/403.blade.php new file mode 100644 index 0000000..632e0d6 --- /dev/null +++ b/resources/views/errors/403.blade.php @@ -0,0 +1,33 @@ +@extends('layouts.fullscreen-layout') + +@section('content') +@php + $currentYear = date('Y'); +@endphp +
+ {{-- common grid shape --}} + + +
+

+ FORBIDDEN +

+ + 403 + + +

+ You don't have permission to access this page. +

+ + + Back to home + +
+ +

+ © {{ $currentYear }} - {{ config('app.name') }} +

+
+@endsection diff --git a/resources/views/errors/404.blade.php b/resources/views/errors/404.blade.php new file mode 100644 index 0000000..12c2a05 --- /dev/null +++ b/resources/views/errors/404.blade.php @@ -0,0 +1,33 @@ +@extends('layouts.fullscreen-layout') + +@section('content') +@php + $currentYear = date('Y'); +@endphp +
+ {{-- common grid shape --}} + + +
+

+ ERROR +

+ + 404 + + +

+ We can't seem to find the page you are looking for! +

+ + + Back to home + +
+ +

+ © {{ $currentYear }} - {{ config('app.name') }} +

+
+@endsection diff --git a/resources/views/errors/500.blade.php b/resources/views/errors/500.blade.php new file mode 100644 index 0000000..a16392c --- /dev/null +++ b/resources/views/errors/500.blade.php @@ -0,0 +1,30 @@ +@extends('layouts.fullscreen-layout') + +@section('content') +@php + $currentYear = date('Y'); +@endphp +
+ +
+

+ ERROR +

+ + 500 + + +

+ Something went wrong on our end. Please try again later. +

+ + + Back to home + +
+

+ © {{ $currentYear }} - {{ config('app.name') }} +

+
+@endsection diff --git a/resources/views/errors/503.blade.php b/resources/views/errors/503.blade.php new file mode 100644 index 0000000..48c6ce0 --- /dev/null +++ b/resources/views/errors/503.blade.php @@ -0,0 +1,30 @@ +@extends('layouts.fullscreen-layout') + +@section('content') +@php + $currentYear = date('Y'); +@endphp +
+ +
+

+ MAINTENANCE +

+ + 503 + + +

+ The service is currently unavailable. We are performing maintenance. +

+ + + Refresh Page + +
+

+ © {{ $currentYear }} - {{ config('app.name') }} +

+
+@endsection diff --git a/resources/views/layouts/fullscreen-layout.blade.php b/resources/views/layouts/fullscreen-layout.blade.php new file mode 100644 index 0000000..60a8fe2 --- /dev/null +++ b/resources/views/layouts/fullscreen-layout.blade.php @@ -0,0 +1,150 @@ + + + + + + + + + {{ $title ?? 'Unified Management' }} | {{ config('app.name', 'DyDev Admin') }} + + + + + + + + + + + + + + + + + + + + + @yield('meta') + + + @vite(['resources/css/app.css', 'resources/js/app.js']) + + + {{-- --}} + + + + + + + + + + + {{-- Flash Message Component --}} + + + {{-- preloader --}} + + {{-- preloader end --}} + + @yield('content') + + + +@stack('scripts') + + diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php index b7355d7..83bbfd3 100644 --- a/resources/views/welcome.blade.php +++ b/resources/views/welcome.blade.php @@ -1,277 +1,38 @@ - - - - - +@extends('layouts.fullscreen-layout') - {{ config('app.name', 'Laravel') }} +@section('content') + @php + $currentYear = date('Y'); + @endphp +
+ + +
+

+ {{ config('app.name') }} API +

+ +
+ + + + + All Systems Operational +
- - - +

+ The API service is running normally.
+ For the user interface, please visit our main application. +

- - @if (file_exists(public_path('build/manifest.json')) || file_exists(public_path('hot'))) - @vite(['resources/css/app.css', 'resources/js/app.js']) - @else - - @endif - - -
- @if (Route::has('login')) - - @endif -
-
-
-
-

Let's get started

-

Laravel has an incredibly rich ecosystem.
We suggest starting with the following.

- - -
-
- {{-- Laravel Logo --}} - - - - - - - - - - - {{-- Light Mode 12 SVG --}} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {{-- Dark Mode 12 SVG --}} - -
-
-
+ + Go to TrustLab Web +
- - @if (Route::has('login')) - - @endif - - + +

+ © {{ $currentYear }} - {{ config('app.name') }} +

+
+@endsection diff --git a/routes/web.php b/routes/web.php index 44d411e..da5496b 100644 --- a/routes/web.php +++ b/routes/web.php @@ -3,7 +3,7 @@ use Illuminate\Support\Facades\Route; Route::get('/', function () { - return response()->json(['status' => 'ok', 'service' => 'trustlab-api']); + return view('welcome'); }); use App\Http\Controllers\AuthController;