-
- IN-PLAY
-
-
Quick Filter
+
+
+
+ IN-PLAY
+
+ / Today's Events
+
)
-}
-
+}
\ No newline at end of file
diff --git a/components/betting/live-events-list.tsx b/components/betting/live-events-list.tsx
new file mode 100644
index 0000000..5615e9a
--- /dev/null
+++ b/components/betting/live-events-list.tsx
@@ -0,0 +1,195 @@
+"use client"
+
+import { useBetslipStore } from "@/lib/store/betslip-store"
+import { mockEvents, type Event } from "@/lib/mock-data"
+import { cn } from "@/lib/utils"
+import { BarChart2, TrendingUp, Monitor, Tv } from "lucide-react"
+
+
+function LiveEventRow({ event, isNoOdds }: { event: Event, isNoOdds?: boolean }) {
+ const { bets, addBet } = useBetslipStore()
+
+ // Dummy data for demonstration
+ const score = event.homeScore !== undefined ? `${event.homeScore} - ${event.awayScore}` : "0 - 0"
+ const time = event.liveMinute ? `${event.liveMinute}:00` : "83:10"
+ const period = "H2"
+
+ return (
+
+ {/* Match Info Column (Time & Score) */}
+
+
+ {time}
+ {period}
+
+
+
+ {event.homeTeam} {score} {event.awayTeam}
+
+
+
+
+
+
+
+
+ {/* Odds Grid or Placeholder */}
+
+ {isNoOdds ? (
+
+ Sorry, no odds for this match
+
+ ) : (
+
+ {event.markets.slice(0, 3).map((m, idx) => {
+ const labels = ["Home", "Draw", "Away"]
+ return (
+
+ )
+ })}
+
+ )}
+
+
+ {/* Right Indicator */}
+
+
+ )
+}
+
+const liveSports = [
+ { id: "soccer", label: "Soccer", icon: "⚽", count: 25, active: true },
+ { id: "basketball", label: "Basketball", icon: "🏀", count: 39 },
+ { id: "ice-hockey", label: "Ice Hockey", icon: "🏒", count: 3 },
+ { id: "tennis", label: "Tennis", icon: "🎾", count: 4 },
+ { id: "handball", label: "Handball", icon: "🤾", count: 10 },
+ { id: "rugby", label: "Rugby", icon: "🏉", count: 2 },
+ { id: "table-tennis", label: "Table Tennis", icon: "🏓", count: 8 },
+ { id: "volleyball", label: "Volleyball", icon: "🏐", count: 7 },
+ { id: "futsal", label: "Futsal", icon: "⚽", count: 2 },
+ { id: "esport-counter-strike", label: "ESport Cou...", icon: "🎮", count: 2 },
+ { id: "esport-league-of-legends", label: "ESport Lea...", icon: "🎮", count: 1 },
+ { id: "esport-dota-2", label: "ESport Dota", icon: "🎮", count: 1 },
+ { id: "efootball", label: "eFootball", icon: "⚽", count: 4 },
+ { id: "ebasketball", label: "eBasketball", icon: "🏀", count: 1 },
+]
+
+export function LiveEventsList() {
+ // Enhanced mock data local to live view to match screenshot exactly
+ const liveMatches = [
+ {
+ league: "Algeria - Ligue 1",
+ flag: "https://flagcdn.com/w20/dz.png",
+ matches: [
+ { ...mockEvents[0], id: "l1", homeTeam: "Paradou AC", awayTeam: "Ben Aknoun", homeScore: 3, awayScore: 5, liveMinute: 91, noOdds: true }
+ ]
+ },
+ {
+ league: "Australia - U23 Victoria NPL",
+ flag: "https://flagcdn.com/w20/au.png",
+ matches: [
+ { ...mockEvents[1], id: "l2", homeTeam: "Oakleigh Cannons FC", awayTeam: "Altona Magic SC", homeScore: 5, awayScore: 1, liveMinute: 87, noOdds: true }
+ ]
+ },
+ {
+ league: "Australia - U23 Victoria Premier League 1",
+ flag: "https://flagcdn.com/w20/au.png",
+ matches: [
+ { ...mockEvents[2], id: "l3", homeTeam: "Northcote City FC", awayTeam: "Western United FC", homeScore: 4, awayScore: 0, liveMinute: 83, noOdds: false },
+ { ...mockEvents[3], id: "l4", homeTeam: "Melbourne Knights FC", awayTeam: "Melbourne Victory FC", homeScore: 0, awayScore: 3, liveMinute: 81, noOdds: true }
+ ]
+ },
+ {
+ league: "Australia - Victoria NPL, Women",
+ flag: "https://flagcdn.com/w20/au.png",
+ matches: [
+ { ...mockEvents[4], id: "l5", homeTeam: "Preston Lions FC", awayTeam: "South Melbourne FC", homeScore: 1, awayScore: 1, liveMinute: 52, noOdds: true },
+ { ...mockEvents[0], id: "l6", homeTeam: "Bentleigh Greens SC", awayTeam: "Box Hill United", homeScore: 0, awayScore: 6, liveMinute: 83, noOdds: true }
+ ]
+ }
+ ]
+
+ return (
+
+ {/* Sport Navigation Carousel */}
+
+
+ {/* Favourites & Prematch */}
+
+
+
+ {/* Live Sports */}
+ {liveSports.map((sport) => (
+
+ ))}
+
+
+
+ {/* Category Header (Soccer) */}
+
+ ⚽
+
Soccer
+
+
+ {/* Grouped Live Matches */}
+
+ {liveMatches.map((group, gIdx) => (
+
+ {/* League Header */}
+
+

+
+ {group.league}
+
+
+
+ {/* Matches in this league */}
+
+ {group.matches.map((match, mIdx) => (
+
+ ))}
+
+
+ ))}
+
+
+ )
+}
diff --git a/components/betting/quick-filter-bar.tsx b/components/betting/quick-filter-bar.tsx
index 41c422b..7568d1d 100644
--- a/components/betting/quick-filter-bar.tsx
+++ b/components/betting/quick-filter-bar.tsx
@@ -1,18 +1,32 @@
-import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"
+"use client"
-const filters = ["All", "Today", "3h", "6h", "9h", "12h"]
+import { cn } from "@/lib/utils"
-export function QuickFilterBar() {
+const filters = ["All", "Live", "Today", "3h", "6h", "12h"]
+
+export function QuickFilterBar({ active, onChange }: {
+ active: string
+ onChange: (f: string) => void
+}) {
return (
-
-
- {filters.map((filter) => (
-
- {filter}
-
- ))}
-
-
+
+ {filters.map((filter) => (
+
+ ))}
+
)
-}
-
+}
\ No newline at end of file
diff --git a/components/betting/reload-ticket.tsx b/components/betting/reload-ticket.tsx
index 91d501f..9ab5e60 100644
--- a/components/betting/reload-ticket.tsx
+++ b/components/betting/reload-ticket.tsx
@@ -1,28 +1,27 @@
-import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
-import { Input } from "@/components/ui/input"
-import { Button } from "@/components/ui/button"
+"use client"
+
+import { useState } from "react"
export function ReloadTicket() {
- return (
-
-
- Reload Ticket
-
-
-
- Insert the code to load
-
-
-
-
-
-
-
- )
-}
+ const [code, setCode] = useState("")
+ return (
+
+
+
Reload Ticket
+
Insert the code to load
+
+
setCode(e.target.value)}
+ className="flex-1 bg-[#121212] border border-border/40 px-2 py-2 text-[11px] text-white outline-none focus:border-primary"
+ />
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/components/betting/search-event.tsx b/components/betting/search-event.tsx
index 65f5e87..339994e 100644
--- a/components/betting/search-event.tsx
+++ b/components/betting/search-event.tsx
@@ -1,19 +1,21 @@
-import { Input } from "@/components/ui/input"
+"use client"
-export function SearchEvent() {
+import { Search } from "lucide-react"
+
+export function SearchEvent({ value, onChange }: {
+ value: string
+ onChange: (v: string) => void
+}) {
return (
-
-
- Search Event
-
-
- Insert the events name or at least one team in the form below
-
-
+
+
onChange(e.target.value)}
+ placeholder="Search by event, team or league..."
+ className="w-full bg-secondary border border-border rounded pl-8 pr-3 py-2 text-[12px] text-foreground placeholder:text-muted-foreground focus:outline-none focus:border-primary transition-colors"
/>
)
-}
-
+}
\ No newline at end of file
diff --git a/components/betting/sport-home.tsx b/components/betting/sport-home.tsx
new file mode 100644
index 0000000..172f5e6
--- /dev/null
+++ b/components/betting/sport-home.tsx
@@ -0,0 +1,27 @@
+"use client"
+
+import { useSearchParams } from "next/navigation"
+import { HeroBanner } from "./hero-banner"
+import { TopMatches } from "./top-matches"
+import { SportsNav } from "./sports-nav"
+import { HomeTabs } from "./home-tabs"
+import { EventsList } from "./events-list"
+
+export function SportHome() {
+ const searchParams = useSearchParams()
+ const isLeagueView = !!searchParams.get("league")
+
+ return (
+
+ {!isLeagueView && (
+ <>
+
+
+
+
+ >
+ )}
+
+
+ )
+}
diff --git a/components/betting/sports-nav.tsx b/components/betting/sports-nav.tsx
new file mode 100644
index 0000000..44c3332
--- /dev/null
+++ b/components/betting/sports-nav.tsx
@@ -0,0 +1,33 @@
+import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"
+
+const sports = [
+ { id: "football", name: "Football", icon: "⚽" },
+ { id: "tennis", name: "Tennis", icon: "🎾" },
+ { id: "basketball", name: "Basketball", icon: "🏀" },
+ { id: "ice-hockey", name: "Ice Hockey", icon: "🏒" },
+ { id: "mma", name: "MMA", icon: "🥋" },
+ { id: "handball", name: "Handball", icon: "🤾" },
+ { id: "darts", name: "Darts", icon: "🎯" },
+ { id: "snooker", name: "Snooker", icon: "🎱" },
+ { id: "cricket", name: "Cricket", icon: "🏏" },
+ { id: "dota2", name: "Dota 2", icon: "🎮" },
+]
+
+export function SportsNav() {
+ return (
+
+
+ {sports.map((sport) => (
+
+ {sport.icon}
+ {sport.name}
+
+ ))}
+
+
+ )
+}
diff --git a/components/betting/top-matches.tsx b/components/betting/top-matches.tsx
new file mode 100644
index 0000000..824e905
--- /dev/null
+++ b/components/betting/top-matches.tsx
@@ -0,0 +1,102 @@
+import { ChevronRight } from "lucide-react"
+import { Button } from "@/components/ui/button"
+
+const topMatches = [
+ {
+ id: "tm1",
+ league: "England - Premier League",
+ time: "05:00 PM",
+ homeTeam: "Nottingham Forest",
+ awayTeam: "Liverpool",
+ odds: { home: 4.09, draw: 3.93, away: 1.82 }
+ },
+ {
+ id: "tm2",
+ league: "England - Premier League",
+ time: "11:00 PM",
+ homeTeam: "Man City",
+ awayTeam: "Newcastle",
+ odds: { home: 1.50, draw: 5.17, away: 5.93 }
+ },
+ {
+ id: "tm3",
+ league: "England - Premier League",
+ time: "06:00 PM",
+ homeTeam: "Chelsea",
+ awayTeam: "Burnley",
+ odds: { home: 1.21, draw: 6.91, away: 11.50 }
+ },
+ {
+ id: "tm4",
+ league: "Spain - LaLiga",
+ time: "07:30 PM",
+ homeTeam: "Arsenal",
+ awayTeam: "Wolves",
+ odds: { home: 1.56, draw: 4.16, away: 5.80 }
+ },
+ {
+ id: "tm5",
+ league: "Italy - Serie A",
+ time: "09:45 PM",
+ homeTeam: "Inter Milan",
+ awayTeam: "Napoli",
+ odds: { home: 1.85, draw: 3.60, away: 4.20 }
+ }
+]
+
+export function TopMatches() {
+ return (
+
+ {topMatches.map((match) => (
+
+ {/* Top Label Ribbon */}
+
+
+
+
+ {match.league}
+ {match.time}
+
+
+
+
+
+
+
+
+
+
+
+
+ ))}
+
+ )
+}
diff --git a/components/layout/sports-sidebar.tsx b/components/layout/sports-sidebar.tsx
index ccb57b6..fc7b7e5 100644
--- a/components/layout/sports-sidebar.tsx
+++ b/components/layout/sports-sidebar.tsx
@@ -1,32 +1,164 @@
-const sports = [
- "Soccer",
- "Basketball",
- "Tennis",
- "Ice Hockey",
- "Volleyball",
- "Handball",
- "Baseball",
- "American Football",
- "Cricket",
- "Rugby",
+"use client"
+
+import { useState } from "react"
+import Link from "next/link"
+import { popularLeagues } from "@/lib/mock-data"
+import { cn } from "@/lib/utils"
+import { Button } from "@/components/ui/button"
+
+const sportCategories = [
+ { id: "football", name: "Football", icon: "⚽", count: 1412 },
+ { id: "tennis", name: "Tennis", icon: "🎾", count: 67 },
+ { id: "basketball", name: "Basketball", icon: "🏀", count: 255 },
+ { id: "ice-hockey", name: "Ice Hockey", icon: "🏒", count: 238 },
+ { id: "mma", name: "MMA", icon: "🥊", count: 51 },
+ { id: "handball", name: "Handball", icon: "🤾", count: 92 },
+ { id: "darts", name: "Darts", icon: "🎯", count: 25 },
+ { id: "snooker", name: "Snooker", icon: "🎱", count: 3 },
+ { id: "cricket", name: "Cricket", icon: "🏏", count: 42 },
+ { id: "dota2", name: "Dota 2", icon: "🎮", count: 2 },
+ { id: "rugby", name: "Rugby", icon: "🏉", count: 41 },
+ { id: "volleyball", name: "Volleyball", icon: "🏐", count: 69 },
]
export function SportsSidebar() {
- return (
-
- );
-}
+ const [activeSport, setActiveSport] = useState("football")
+ return (
+
+ )
+}