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 @@
+
+
+

+
+
+

+
+
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
+
+
+
+
+
+
+ {!! $icon !!}
+
+
+
{{-- Add padding right for close button --}}
+
+ {{ $title }}
+
+
{{ $message }}
+
+
+
+
+@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
+
+
+

+

+
+
+ 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
+
+
+

+

+
+
+ 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
+
+
+

+

+
+
+ 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
+
+
+

+

+
+
+ 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;