From 6e93f5c9f34c062cd12ec4dcecb68920c5fb70fe Mon Sep 17 00:00:00 2001
From: "google-labs-jules[bot]"
<161369871+google-labs-jules[bot]@users.noreply.github.com>
Date: Fri, 24 Apr 2026 17:56:58 +0000
Subject: [PATCH] style: redesign ui to be modern and minimalist
Replaced the heavy 3D aesthetics, large border radii, vibrant colors,
glass-morphism, and deep shadows with a clean, flat, and minimalist
monochrome design language across the application layout and pages.
Co-authored-by: artosien <65523959+artosien@users.noreply.github.com>
---
src/app/globals.css | 81 ++++++++++++++---------------
src/app/page.tsx | 64 +++++++++++------------
src/components/layout/app-shell.tsx | 70 ++++++++++++-------------
3 files changed, 105 insertions(+), 110 deletions(-)
diff --git a/src/app/globals.css b/src/app/globals.css
index b82fcd2..97225ff 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -4,53 +4,53 @@
@layer base {
:root {
- --background: 0 0% 98%;
- --foreground: 261 43% 10%;
+ --background: 0 0% 100%;
+ --foreground: 0 0% 9%;
--card: 0 0% 100%;
- --card-foreground: 261 43% 10%;
+ --card-foreground: 0 0% 9%;
--popover: 0 0% 100%;
- --popover-foreground: 261 43% 10%;
- --primary: 261 43% 47%;
- --primary-foreground: 0 0% 100%;
- --secondary: 187 100% 42%;
- --secondary-foreground: 0 0% 100%;
- --muted: 0 0% 92%;
- --muted-foreground: 261 20% 35%; /* Increased contrast for WCAG AA */
- --accent: 187 100% 42%;
- --accent-foreground: 0 0% 100%;
+ --popover-foreground: 0 0% 9%;
+ --primary: 0 0% 9%;
+ --primary-foreground: 0 0% 98%;
+ --secondary: 0 0% 96.1%;
+ --secondary-foreground: 0 0% 9%;
+ --muted: 0 0% 96.1%;
+ --muted-foreground: 0 0% 45.1%;
+ --accent: 0 0% 96.1%;
+ --accent-foreground: 0 0% 9%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 0 0% 98%;
- --border: 0 0% 88%;
- --input: 0 0% 88%;
- --ring: 261 43% 47%;
- --radius: 1rem;
- --chart-1: 261 43% 47%;
- --chart-2: 187 100% 42%;
- --chart-3: 280 65% 60%;
- --chart-4: 200 80% 50%;
- --chart-5: 160 60% 45%;
+ --border: 0 0% 89.8%;
+ --input: 0 0% 89.8%;
+ --ring: 0 0% 9%;
+ --radius: 0.5rem;
+ --chart-1: 0 0% 9%;
+ --chart-2: 0 0% 25%;
+ --chart-3: 0 0% 40%;
+ --chart-4: 0 0% 60%;
+ --chart-5: 0 0% 80%;
}
.dark {
- --background: 261 43% 4%;
+ --background: 0 0% 3.9%;
--foreground: 0 0% 98%;
- --card: 261 43% 7%;
+ --card: 0 0% 3.9%;
--card-foreground: 0 0% 98%;
- --popover: 261 43% 7%;
+ --popover: 0 0% 3.9%;
--popover-foreground: 0 0% 98%;
- --primary: 261 43% 60%;
- --primary-foreground: 0 0% 100%;
- --secondary: 187 100% 42%;
- --secondary-foreground: 0 0% 100%;
- --muted: 261 25% 15%;
- --muted-foreground: 261 10% 75%;
- --accent: 187 100% 42%;
- --accent-foreground: 0 0% 100%;
+ --primary: 0 0% 98%;
+ --primary-foreground: 0 0% 9%;
+ --secondary: 0 0% 14.9%;
+ --secondary-foreground: 0 0% 98%;
+ --muted: 0 0% 14.9%;
+ --muted-foreground: 0 0% 63.9%;
+ --accent: 0 0% 14.9%;
+ --accent-foreground: 0 0% 98%;
--destructive: 0 62.8% 30.6%;
--destructive-foreground: 0 0% 98%;
- --border: 261 20% 18%;
- --input: 261 20% 18%;
- --ring: 261 43% 60%;
+ --border: 0 0% 14.9%;
+ --input: 0 0% 14.9%;
+ --ring: 0 0% 83.1%;
}
}
@@ -63,18 +63,13 @@
}
}
-/* 3D Lottery Ball Styling */
+/* Minimalist Lottery Ball Styling */
.lotto-ball-3d {
- @apply relative flex items-center justify-center font-black rounded-full overflow-hidden border-none shadow-[inset_-4px_-4px_10px_rgba(0,0,0,0.3),inset_4px_4px_10px_rgba(255,255,255,0.4),0_10px_20px_-5px_rgba(0,0,0,0.3)] transition-all;
-}
-
-.lotto-ball-3d::before {
- content: '';
- @apply absolute top-[15%] left-[20%] w-[35%] h-[25%] bg-white/40 rounded-full blur-[1px] pointer-events-none;
+ @apply relative flex items-center justify-center font-bold rounded-full overflow-hidden border border-border bg-card shadow-sm transition-all;
}
.glass-morphism {
- @apply bg-white/80 dark:bg-black/40 backdrop-blur-xl border border-white/20 dark:border-white/5 shadow-2xl;
+ @apply bg-background border border-border shadow-sm;
}
.animate-spin-slow {
diff --git a/src/app/page.tsx b/src/app/page.tsx
index e43a8af..9d71900 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -40,7 +40,7 @@ export default function DashboardPage() {
{/* Premium Redesigned Hero Section */}
{heroImage && (
-
+
-
-
Professional Studio Feed
+
+
Professional Studio Feed
-
+
Real-Time
PCSO Analytics
Scan My Ticket
@@ -70,9 +70,9 @@ export default function DashboardPage() {
-
+
Watch Studio Live
@@ -89,9 +89,9 @@ export default function DashboardPage() {
{ game: "6/49", time: "Tomorrow", label: "Super Lotto" },
{ game: "6/45", time: "In 2 Days", label: "Mega Lotto" },
].map((item, i) => (
-
-
{item.label}
-
{item.game}
+
+
{item.label}
+
{item.game}
{item.time}
@@ -108,7 +108,7 @@ export default function DashboardPage() {
-
+
Latest Draw Results
@@ -119,15 +119,15 @@ export default function DashboardPage() {
{/* Premium Upgrade (Repositioned & Redesigned) */}
-
+
-
Premium Studio
-
Maximize Your Winning Odds
+
Premium Studio
+
Maximize Your Winning Odds
Unlock AI-driven historical trend analysis and real-time frequency heatmaps for your next draw.
-
+
Start Free Trial
@@ -138,12 +138,12 @@ export default function DashboardPage() {
{ label: "Data Depth", icon: TrendingUp },
{ label: "Cloud Backup", icon: ShieldCheck },
].map((stat, i) => (stat.value ? (
-
-
{stat.value}
-
{stat.label}
+
+
{stat.value}
+
{stat.label}
) : (
-
+
)))}
@@ -155,18 +155,18 @@ export default function DashboardPage() {
{/* Improved Analytics Overview */}
-
-
-
+
+
+
-
Frequency Intelligence
+
Frequency Intelligence
Discover which numbers are overdue for a draw using our professional Pattern Heatmap Studio. Analyzed over 365 days of draw data.
window.dispatchEvent(new CustomEvent('open-analytics'))}
>
Open Pattern Studio
@@ -176,12 +176,12 @@ export default function DashboardPage() {
{/* Homepage Contact Form with FAQ (New Layout) */}
-
+
Help Center
-
Professional Support
+
Professional Support
Have a technical question or need help with a scan? Our team of analysts is ready to assist you.
@@ -194,7 +194,7 @@ export default function DashboardPage() {
"Can I track multiple lotto games?",
"Is my data stored securely?"
].map((q, i) => (
-
+
@@ -202,15 +202,15 @@ export default function DashboardPage() {
-
-
@@ -219,10 +219,10 @@ export default function DashboardPage() {
{/* Security Info */}
-
+
Secure
-
diff --git a/src/components/layout/app-shell.tsx b/src/components/layout/app-shell.tsx
index c6a1b0f..385c522 100644
--- a/src/components/layout/app-shell.tsx
+++ b/src/components/layout/app-shell.tsx
@@ -105,8 +105,8 @@ export function AppShell({ children }: { children: React.ReactNode }) {
const SidebarContent = () => (
-
@@ -135,16 +135,16 @@ export function AppShell({ children }: { children: React.ReactNode }) {
key={item.name}
onClick={item.href.startsWith('/') ? undefined : handleClick}
className={cn(
- "w-full flex items-center gap-3 px-4 py-3.5 rounded-2xl text-sm font-bold transition-all text-left group relative",
+ "w-full flex items-center gap-3 px-4 py-3.5 rounded-lg text-sm font-bold transition-all text-left group relative",
isActive
- ? "bg-primary text-primary-foreground shadow-xl shadow-primary/20 scale-[1.02]"
- : "text-muted-foreground hover:bg-primary/5 hover:text-primary"
+ ? "bg-primary text-primary-foreground shadow-sm scale-[1.02]"
+ : "text-muted-foreground hover:bg-muted/50 hover:text-primary"
)}
>
{item.name}
{item.isLive && (
-
+
)}
)
@@ -153,7 +153,7 @@ export function AppShell({ children }: { children: React.ReactNode }) {
-
+
Professional Suite
@@ -163,16 +163,16 @@ export function AppShell({ children }: { children: React.ReactNode }) {
- Pattern Heatmap
+ Pattern Heatmap
@@ -180,7 +180,7 @@ export function AppShell({ children }: { children: React.ReactNode }) {
Pattern Heatmap Studio
Advanced statistical number tracking.
-
+
@@ -199,7 +199,7 @@ export function AppShell({ children }: { children: React.ReactNode }) {
return (
-
+
@@ -207,8 +207,8 @@ export function AppShell({ children }: { children: React.ReactNode }) {
-
-
L
+
@@ -222,7 +222,7 @@ export function AppShell({ children }: { children: React.ReactNode }) {
-
+
Menu
@@ -233,22 +233,22 @@ export function AppShell({ children }: { children: React.ReactNode }) {
{children}
-
+
-
+
Professional lottery insights and real-time results studio.
-
+
Last Updated: {lastUpdated}
-
Legal & Source
+ Legal & Source
setIsTermsOpen(true)} className="text-sm text-muted-foreground hover:text-primary transition-colors">Terms of Use
setIsPrivacyOpen(true)} className="text-sm text-muted-foreground hover:text-primary transition-colors">Privacy Policy
@@ -256,20 +256,20 @@ export function AppShell({ children }: { children: React.ReactNode }) {
-
Notifications
+ Notifications
setIsAlertsOpen(true)}
- className="rounded-full h-12 px-8 bg-secondary text-white font-black text-[10px] uppercase tracking-widest"
+ className="rounded-full h-12 px-8 bg-secondary text-white font-bold text-[10px] uppercase tracking-widest"
>
Enable Alerts
-
+
-
Official Legal Disclaimer
+ Official Legal Disclaimer
LottoPing is an independent platform and is NOT affiliated with the Philippine Charity Sweepstakes Office (PCSO). All results provided are for informational purposes only. Users MUST verify tickets at official outlets before taking action. LottoPing is not liable for any financial losses. Play responsibly.
@@ -280,7 +280,7 @@ export function AppShell({ children }: { children: React.ReactNode }) {
{/* Mobile Bottom Navigation Bar */}
-
+
{[
{ icon: LayoutDashboard, href: "/", label: "Home", action: () => window.location.href = "/" },
{ icon: Tv, action: () => setIsLiveOpen(true), label: "Live" },
@@ -297,7 +297,7 @@ export function AppShell({ children }: { children: React.ReactNode }) {
@@ -308,7 +308,7 @@ export function AppShell({ children }: { children: React.ReactNode }) {
className="flex flex-col items-center gap-1 group"
>
- {item.label}
+ {item.label}
)
))}
@@ -316,31 +316,31 @@ export function AppShell({ children }: { children: React.ReactNode }) {
{/* Slide-up Sheets (Consistent experience) */}
-
+
Live Broadcast
-
+
Scanner
setIsScannerOpen(false)} />
-
+
Alerts
-
+
-
-
Entry Wallet
+
+ Entry Wallet
setIsTicketsOpen(false)}>
@@ -349,14 +349,14 @@ export function AppShell({ children }: { children: React.ReactNode }) {
-
+
Privacy Policy
-
+
Terms of Use