From 9f312091e7c1bc0dbe25756e5400d7bbf4097eb9 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Wed, 22 Apr 2026 18:40:16 +0700 Subject: [PATCH] feat: implement dynamic time-based dashboard theme and live greeting interface --- resources/css/app.css | 2 + resources/js/components/app-sidebar.tsx | 2 +- resources/js/pages/dashboard.tsx | 171 ++++++++++++++++++++++-- 3 files changed, 161 insertions(+), 14 deletions(-) diff --git a/resources/css/app.css b/resources/css/app.css index 450845e..4deb5b6 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -62,6 +62,8 @@ @theme { --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); --color-sidebar-border: var(--sidebar-border); --color-sidebar-ring: var(--sidebar-ring); + + --animate-spin-slow: spin 8s linear infinite; } :root { diff --git a/resources/js/components/app-sidebar.tsx b/resources/js/components/app-sidebar.tsx index 5b432ae..e5dbaa1 100644 --- a/resources/js/components/app-sidebar.tsx +++ b/resources/js/components/app-sidebar.tsx @@ -24,7 +24,7 @@ import order from '@/routes/order'; const mainNavItems: NavItem[] = [ { - title: 'Dashboard', + title: 'Dasbor', href: dashboard().url, icon: LayoutGrid, }, diff --git a/resources/js/pages/dashboard.tsx b/resources/js/pages/dashboard.tsx index 3fe0cc7..25f2205 100644 --- a/resources/js/pages/dashboard.tsx +++ b/resources/js/pages/dashboard.tsx @@ -1,25 +1,170 @@ -import { Head } from '@inertiajs/react'; +import { Head, usePage } from '@inertiajs/react'; +import { useEffect, useState } from 'react'; import { PlaceholderPattern } from '@/components/ui/placeholder-pattern'; import { dashboard } from '@/routes'; +import { Auth } from '@/types'; +import { Sun, Moon, Cloud, Trees, CloudRain, Stars, Bird } from 'lucide-react'; + +interface PageProps { + auth: Auth; + [key: string]: any; +} + +const DynamicScene = ({ hour }: { hour: number }) => { + if (hour >= 5 && hour < 11) { + return ( +
+ + + +
+ ); + } + if (hour >= 11 && hour < 15) { + return ( +
+ + + +
+ ); + } + if (hour >= 15 && hour < 19) { + return ( +
+ + + +
+ ); + } + return ( +
+ + + +
+
+ ); +}; export default function Dashboard() { + const { auth } = usePage().props; + const [time, setTime] = useState(new Date()); + + useEffect(() => { + const timer = setInterval(() => setTime(new Date()), 1000); + return () => clearInterval(timer); + }, []); + + const getTimeTheme = () => { + const hour = time.getHours(); + if (hour >= 5 && hour < 11) return { + greeting: 'Selamat Pagi', + class: 'bg-gradient-to-br from-amber-50 to-orange-100 dark:from-amber-950/40 dark:to-orange-900/40 border-amber-200 dark:border-amber-800/30 shadow-sm', + text: 'text-amber-950 dark:text-amber-50', + subtext: 'text-amber-900/70 dark:text-amber-200/70', + decoration: 'bg-amber-500/10 dark:bg-amber-500/20', + pageBackground: 'bg-amber-50/50 dark:bg-amber-950/10', + card: 'bg-white/80 dark:bg-amber-900/10 backdrop-blur-sm border-amber-200/50 dark:border-amber-800/20', + placeholder: 'stroke-amber-500/20 dark:stroke-amber-400/20' + }; + + if (hour >= 11 && hour < 15) return { + greeting: 'Selamat Siang', + class: 'bg-gradient-to-br from-sky-50 to-blue-100 dark:from-sky-950/40 dark:to-blue-900/40 border-sky-200 dark:border-sky-800/30 shadow-sm', + text: 'text-sky-950 dark:text-sky-50', + subtext: 'text-sky-900/70 dark:text-sky-200/70', + decoration: 'bg-sky-500/10 dark:bg-sky-500/20', + pageBackground: 'bg-sky-50/50 dark:bg-sky-950/10', + card: 'bg-white/80 dark:bg-sky-900/10 backdrop-blur-sm border-sky-200/50 dark:border-sky-800/20', + placeholder: 'stroke-sky-500/20 dark:stroke-sky-400/20' + }; + + if (hour >= 15 && hour < 19) return { + greeting: 'Selamat Sore', + class: 'bg-gradient-to-br from-orange-50 to-purple-100 dark:from-orange-950/40 dark:to-purple-900/40 border-orange-200 dark:border-orange-800/30 shadow-sm', + text: 'text-orange-950 dark:text-orange-50', + subtext: 'text-orange-900/70 dark:text-orange-200/70', + decoration: 'bg-orange-500/10 dark:bg-orange-500/20', + pageBackground: 'bg-orange-50/50 dark:bg-orange-950/10', + card: 'bg-white/80 dark:bg-orange-900/10 backdrop-blur-sm border-orange-200/50 dark:border-orange-800/20', + placeholder: 'stroke-orange-500/20 dark:stroke-orange-400/20' + }; + + return { + greeting: 'Selamat Malam', + class: 'bg-gradient-to-br from-slate-900 via-indigo-950 to-black text-white border-indigo-500/20 shadow-indigo-950', + text: 'text-indigo-50 drop-shadow-md', + subtext: 'text-indigo-200/70 drop-shadow-sm', + decoration: 'bg-indigo-500/20', + pageBackground: 'bg-slate-100 dark:bg-slate-950', + card: 'bg-white dark:bg-slate-900 border-slate-200 dark:border-slate-800', + placeholder: 'stroke-slate-300 dark:stroke-slate-700' + }; + }; + + const theme = getTimeTheme(); + const hour = time.getHours(); + + const formattedTime = time.toLocaleTimeString('id-ID', { + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + }); + + const formattedDate = time.toLocaleDateString('id-ID', { + weekday: 'long', + day: 'numeric', + month: 'long', + year: 'numeric', + }); + return ( <> -
-
-
- +
+ {/* Welcome Section */} +
+ {/* Decorative Elements */} +
+
+ +
+

+ {theme.greeting}, {auth.user.name}! +

+

+ Senang melihat Anda kembali. Berikut adalah ringkasan bisnis Anda hari ini. +

-
- -
-
- + +
+ +
+
+ {formattedTime} +
+
+ {formattedDate} +
+
-
- + +
+
+ +
+
+ +
+
+ +
+
+
+
@@ -29,7 +174,7 @@ export default function Dashboard() { Dashboard.layout = { breadcrumbs: [ { - title: 'Dashboard', + title: 'Dasbor', href: dashboard(), }, ],