Spaces:
Running
Running
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>Hold'em Mastery | Offline Poker Tutorial & Simulator</title> | |
| <script src="https://cdn.tailwindcss.com"></script> | |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> | |
| <style> | |
| @keyframes dealCard { | |
| 0% { transform: translateY(-100px) rotate(-10deg); opacity: 0; } | |
| 100% { transform: translateY(0) rotate(0deg); opacity: 1; } | |
| } | |
| @keyframes chipGlow { | |
| 0% { box-shadow: 0 0 5px rgba(255, 215, 0, 0.5); } | |
| 50% { box-shadow: 0 0 20px rgba(255, 215, 0, 0.8); } | |
| 100% { box-shadow: 0 0 5px rgba(255, 215, 0, 0.5); } | |
| } | |
| .card-animate { | |
| animation: dealCard 0.5s ease-out forwards; | |
| } | |
| .chip-glow { | |
| animation: chipGlow 1.5s infinite; | |
| } | |
| .hand-strength-bar { | |
| height: 6px; | |
| background: linear-gradient(90deg, #ff5e5e 0%, #ffe600 50%, #4ade80 100%); | |
| } | |
| .blur-filter { | |
| backdrop-filter: blur(5px); | |
| } | |
| .table-felt { | |
| background: radial-gradient(circle, #1a5f1a 0%, #124712 70%, #0a300a 100%); | |
| } | |
| .card { | |
| width: 80px; | |
| height: 120px; | |
| border-radius: 8px; | |
| box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); | |
| } | |
| .chip { | |
| width: 40px; | |
| height: 40px; | |
| border-radius: 50%; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| cursor: pointer; | |
| transition: transform 0.2s; | |
| } | |
| .chip:hover { | |
| transform: translateY(-5px); | |
| } | |
| .action-button { | |
| transition: all 0.2s; | |
| transform-style: preserve-3d; | |
| } | |
| .action-button:active { | |
| transform: translateY(2px) scale(0.98); | |
| } | |
| .action-button::after { | |
| content: ''; | |
| position: absolute; | |
| inset: 0; | |
| border-radius: 9999px; | |
| box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); | |
| opacity: 0; | |
| transition: opacity 0.2s; | |
| } | |
| .action-button:hover::after { | |
| opacity: 1; | |
| } | |
| .tooltip { | |
| position: absolute; | |
| padding: 6px 12px; | |
| background: rgba(0, 0, 0, 0.8); | |
| color: white; | |
| border-radius: 4px; | |
| font-size: 12px; | |
| pointer-events: none; | |
| opacity: 0; | |
| transition: opacity 0.2s; | |
| z-index: 50; | |
| } | |
| .has-tooltip:hover .tooltip { | |
| opacity: 1; | |
| } | |
| /* Responsive adjustments */ | |
| @media (max-width: 768px) { | |
| .card { | |
| width: 50px; | |
| height: 75px; | |
| font-size: 12px; | |
| } | |
| .chip { | |
| width: 30px; | |
| height: 30px; | |
| font-size: 10px; | |
| } | |
| .player-info { | |
| font-size: 12px; | |
| } | |
| } | |
| </style> | |
| </head> | |
| <body class="bg-gray-900 text-white font-sans overflow-x-hidden"> | |
| <!-- App Container --> | |
| <div class="min-h-screen flex flex-col"> | |
| <!-- Header/Navigation --> | |
| <header class="bg-gray-800 shadow-lg py-4 px-6 flex items-center justify-between sticky top-0 z-50"> | |
| <div class="flex items-center space-x-4"> | |
| <div class="bg-yellow-500 text-gray-900 font-bold rounded-full w-10 h-10 flex items-center justify-center"> | |
| <i class="fas fa-spade"></i> | |
| </div> | |
| <h1 class="text-xl font-bold bg-gradient-to-r from-yellow-400 to-yellow-200 bg-clip-text text-transparent"> | |
| Hold'em Mastery | |
| </h1> | |
| </div> | |
| <nav class="hidden md:flex items-center space-x-6"> | |
| <a href="#tutorials" class="hover:text-yellow-400 transition">Tutorials</a> | |
| <a href="#simulator" class="hover:text-yellow-400 transition">Simulator</a> | |
| <a href="#analytics" class="hover:text-yellow-400 transition">Analytics</a> | |
| <button id="help-btn" class="bg-gray-700 hover:bg-gray-600 px-3 py-1 rounded-lg transition"> | |
| <i class="fas fa-question-circle mr-1"></i> Help | |
| </button> | |
| </nav> | |
| <div class="flex items-center space-x-4"> | |
| <button id="sound-toggle" class="w-10 h-10 rounded-full bg-gray-700 flex items-center justify-center hover:bg-gray-600 transition"> | |
| <i class="fas fa-volume-up"></i> | |
| </button> | |
| <button id="menu-toggle" class="md:hidden w-10 h-10 rounded-full bg-gray-700 flex items-center justify-center hover:bg-gray-600 transition"> | |
| <i class="fas fa-bars"></i> | |
| </button> | |
| </div> | |
| </header> | |
| <!-- Mobile Menu (Hidden by default) --> | |
| <div id="mobile-menu" class="hidden md:hidden bg-gray-800 shadow-lg py-3 px-6 fixed top-20 left-0 right-0 z-40"> | |
| <nav class="flex flex-col space-y-3"> | |
| <a href="#tutorials" class="hover:text-yellow-400 transition py-2">Tutorials</a> | |
| <a href="#simulator" class="hover:text-yellow-400 transition py-2">Simulator</a> | |
| <a href="#analytics" class="hover:text-yellow-400 transition py-2">Analytics</a> | |
| <button id="mobile-help-btn" class="text-left py-2 hover:text-yellow-400 transition"> | |
| <i class="fas fa-question-circle mr-2"></i> Help | |
| </button> | |
| </nav> | |
| </div> | |
| <!-- Main Content Area --> | |
| <main class="flex-grow p-4 md:p-6"> | |
| <!-- Game View - Default Screen --> | |
| <div id="game-view" class="max-w-6xl mx-auto"> | |
| <!-- Poker Table --> | |
| <div class="table-felt rounded-3xl shadow-xl p-6 md:p-8 relative overflow-hidden border-4 border-yellow-800"> | |
| <!-- Table Decoration --> | |
| <div class="absolute inset-0 opacity-20 flex items-center justify-center"> | |
| <div class="w-full h-full bg-repeat" style="background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"100\" viewBox=\"0 0 100 100\"><text x=\"50\" y=\"50\" font-size=\"20\" fill=\"white\" opacity=\"0.3\" text-anchor=\"middle\" dominant-baseline=\"middle\">♠</text></svg>')"></div> | |
| </div> | |
| <!-- Pot Display --> | |
| <div class="absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 bg-black bg-opacity-30 rounded-full px-4 py-2 flex items-center justify-center space-x-2 z-10"> | |
| <div class="chip-glow bg-yellow-500 text-black font-bold">500</div> | |
| <span class="font-bold">Pot</span> | |
| </div> | |
| <!-- Community Cards --> | |
| <div class="flex justify-center space-x-2 md:space-x-4 mb-16 md:mb-24 relative z-10"> | |
| <!-- Placeholder for flop/turn/river cards --> | |
| <div class="card bg-gray-100"></div> | |
| <div class="card bg-gray-100"></div> | |
| <div class="card bg-gray-100"></div> | |
| <div class="card bg-gray-100 opacity-50"></div> | |
| <div class="card bg-gray-100 opacity-50"></div> | |
| </div> | |
| <!-- Players (AI opponents) --> | |
| <div class="grid grid-cols-2 md:grid-cols-5 gap-4 relative z-10"> | |
| <!-- Player 1 (Top Left) --> | |
| <div class="player-info bg-gray-800 bg-opacity-70 rounded-lg p-3 text-center"> | |
| <div class="flex justify-center mb-1"> | |
| <div class="w-8 h-8 rounded-full bg-blue-500 flex items-center justify-center"> | |
| <i class="fas fa-robot"></i> | |
| </div> | |
| </div> | |
| <div class="text-xs font-semibold">AI Player 1</div> | |
| <div class="text-xs">$2,450</div> | |
| <div class="inline-block mt-1 px-2 py-0.5 text-xs bg-gray-700 rounded-md">Folding 20%</div> | |
| </div> | |
| <!-- Player 2 (Top Middle - only on larger screens) --> | |
| <div class="hidden md:block player-info bg-gray-800 bg-opacity-70 rounded-lg p-3 text-center"> | |
| <div class="flex justify-center mb-1"> | |
| <div class="w-8 h-8 rounded-full bg-green-500 flex items-center justify-center"> | |
| <i class="fas fa-robot"></i> | |
| </div> | |
| </div> | |
| <div class="text-xs font-semibold">AI Player 2</div> | |
| <div class="text-xs">$1,780</div> | |
| <div class="inline-block mt-1 px-2 py-0.5 text-xs bg-gray-700 rounded-md">Raised</div> | |
| </div> | |
| <!-- Player 3 (Top Right) --> | |
| <div class="player-info bg-gray-800 bg-opacity-70 rounded-lg p-3 text-center"> | |
| <div class="flex justify-center mb-1"> | |
| <div class="w-8 h-8 rounded-full bg-purple-500 flex items-center justify-center"> | |
| <i class="fas fa-robot"></i> | |
| </div> | |
| </div> | |
| <div class="text-xs font-semibold">AI Player 3</div> | |
| <div class="text-xs">$3,210</div> | |
| <div class="inline-block mt-1 px-2 py-0.5 text-xs bg-gray-700 rounded-md">Calling 70%</div> | |
| </div> | |
| <!-- Player 4 (Bottom Right - only on larger screens) --> | |
| <div class="hidden md:block player-info bg-gray-800 bg-opacity-70 rounded-lg p-3 text-center"> | |
| <div class="flex justify-center mb-1"> | |
| <div class="w-8 h-8 rounded-full bg-red-500 flex items-center justify-center"> | |
| <i class="fas fa-robot"></i> | |
| </div> | |
| </div> | |
| <div class="text-xs font-semibold">AI Player 4</div> | |
| <div class="text-xs">$1,250</div> | |
| <div class="inline-block mt-1 px-2 py-0.5 text-xs bg-gray-700 rounded-md">All-in!</div> | |
| </div> | |
| <!-- Player 5 (Bottom Left - only on larger screens) --> | |
| <div class="hidden md:block player-info bg-gray-800 bg-opacity-70 rounded-lg p-3 text-center"> | |
| <div class="flex justify-center mb-1"> | |
| <div class="w-8 h-8 rounded-full bg-yellow-500 flex items-center justify-center"> | |
| <i class="fas fa-robot"></i> | |
| </div> | |
| </div> | |
| <div class="text-xs font-semibold">AI Player 5</div> | |
| <div class="text-xs">$2,920</div> | |
| <div class="inline-block mt-1 px-2 py-0.5 text-xs bg-gray-700 rounded-md">Checking</div> | |
| </div> | |
| </div> | |
| <!-- User Player Area --> | |
| <div class="mt-8 md:mt-12 flex flex-col items-center relative z-10"> | |
| <div class="bg-gray-800 bg-opacity-80 rounded-xl p-4 w-full max-w-md"> | |
| <!-- User's Cards --> | |
| <div class="flex justify-center space-x-2 mb-4"> | |
| <div class="card bg-white text-black flex flex-col items-center justify-center card-animate"> | |
| <span class="text-red-500 text-xl font-bold">A</span> | |
| <span class="text-red-500">♥</span> | |
| </div> | |
| <div class="card bg-white text-black flex flex-col items-center justify-center card-animate" style="animation-delay: 0.1s"> | |
| <span class="text-black text-xl font-bold">K</span> | |
| <span class="text-black">♠</span> | |
| </div> | |
| </div> | |
| <!-- Hand Strength Indicator --> | |
| <div class="mb-4"> | |
| <div class="text-xs font-semibold mb-1 flex justify-between"> | |
| <span>Hand Strength:</span> | |
| <span>87% (Very Strong)</span> | |
| </div> | |
| <div class="hand-strength-bar rounded-full h-2 w-full"> | |
| <div class="bg-blue-500 h-2 rounded-full" style="width: 87%"></div> | |
| </div> | |
| </div> | |
| <!-- Action Buttons --> | |
| <div class="flex flex-wrap justify-center gap-2 mt-4"> | |
| <button class="action-button bg-red-500 hover:bg-red-600 text-white px-4 py-2 rounded-lg font-bold relative"> | |
| <i class="fas fa-times mr-1"></i> Fold | |
| <span class="tooltip">Discard your hand and forfeit the current pot</span> | |
| </button> | |
| <button class="action-button bg-gray-500 hover:bg-gray-600 text-white px-4 py-2 rounded-lg font-bold relative"> | |
| <i class="fas fa-pause mr-1"></i> Check | |
| <span class="tooltip">Pass the action to the next player without betting</span> | |
| </button> | |
| <button class="action-button bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded-lg font-bold relative"> | |
| <i class="fas fa-check mr-1"></i> Call $50 | |
| <span class="tooltip">Match the current bet of $50 to stay in the hand</span> | |
| </button> | |
| <button class="action-button bg-green-500 hover:bg-green-600 text-white px-4 py-2 rounded-lg font-bold relative"> | |
| <i class="fas fa-arrow-up mr-1"></i> Raise | |
| <span class="tooltip">Increase the current bet amount</span> | |
| </button> | |
| </div> | |
| <!-- Betting Controls (Appears when Raise is selected) --> | |
| <div class="mt-4 bg-gray-700 rounded-lg p-3 hidden"> | |
| <div class="flex items-center justify-between mb-2"> | |
| <div class="text-sm font-semibold">Raise Amount:</div> | |
| <div class="text-sm font-bold">$150</div> | |
| </div> | |
| <input type="range" min="50" max="500" value="150" class="w-full h-2 bg-gray-600 rounded-lg appearance-none cursor-pointer"> | |
| <div class="flex justify-between text-xs text-gray-300 mt-1"> | |
| <span>Min: $50</span> | |
| <span>Max: $500</span> | |
| </div> | |
| <div class="flex justify-center mt-2"> | |
| <button class="bg-yellow-500 hover:bg-yellow-600 text-gray-900 px-4 py-1 rounded-lg font-bold"> | |
| Confirm Raise | |
| </button> | |
| </div> | |
| </div> | |
| <!-- Chip Selection --> | |
| <div class="mt-4 flex justify-center space-x-2"> | |
| <div class="chip bg-red-600 text-white font-bold">5</div> | |
| <div class="chip bg-blue-600 text-white font-bold">25</div> | |
| <div class="chip bg-green-600 text-white font-bold">50</div> | |
| <div class="chip bg-yellow-500 text-black font-bold">100</div> | |
| <div class="chip bg-purple-600 text-white font-bold">500</div> | |
| <div class="chip bg-gray-100 text-black font-bold">1000</div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Player Stats & Info --> | |
| <div class="mt-6 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"> | |
| <div class="bg-gray-800 rounded-lg p-4"> | |
| <div class="flex items-center justify-between mb-2"> | |
| <h3 class="font-bold text-yellow-400">Current Hand Stats</h3> | |
| <button class="text-gray-400 hover:text-white"> | |
| <i class="fas fa-info-circle"></i> | |
| </button> | |
| </div> | |
| <div class="space-y-2 text-sm"> | |
| <div class="flex justify-between"> | |
| <span>Win Probability:</span> | |
| <span class="font-bold text-green-400">68%</span> | |
| </div> | |
| <div class="flex justify-between"> | |
| <span>Expected Value:</span> | |
| <span class="font-bold">+$42.50</span> | |
| </div> | |
| <div class="flex justify-between"> | |
| <span>Pot Odds:</span> | |
| <span class="font-bold">2.5:1</span> | |
| </div> | |
| <div class="flex justify-between"> | |
| <span>Best Possible:</span> | |
| <span class="font-bold">Two Pair</span> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="bg-gray-800 rounded-lg p-4"> | |
| <div class="flex items-center justify-between mb-2"> | |
| <h3 class="font-bold text-yellow-400">Session Stats</h3> | |
| <button class="text-gray-400 hover:text-white"> | |
| <i class="fas fa-chart-line"></i> | |
| </button> | |
| </div> | |
| <div class="space-y-2 text-sm"> | |
| <div class="flex justify-between"> | |
| <span>Hands Played:</span> | |
| <span class="font-bold">24</span> | |
| </div> | |
| <div class="flex justify-between"> | |
| <span>Win Rate:</span> | |
| <span class="font-bold text-green-400">58%</span> | |
| </div> | |
| <div class="flex justify-between"> | |
| <span>Profit/Loss:</span> | |
| <span class="font-bold text-green-400">+$320</span> | |
| </div> | |
| <div class="flex justify-between"> | |
| <span>VPIP (Voluntarily Put $ In Pot):</span> | |
| <span class="font-bold">42%</span> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="bg-gray-800 rounded-lg p-4"> | |
| <div class="flex items-center justify-between mb-2"> | |
| <h3 class="font-bold text-yellow-400">Suggested Action</h3> | |
| <button class="text-gray-400 hover:text-white"> | |
| <i class="fas fa-lightbulb"></i> | |
| </button> | |
| </div> | |
| <div class="bg-gray-700 rounded-lg p-3 text-sm"> | |
| <div class="flex items-start"> | |
| <div class="text-yellow-400 mr-2 mt-0.5"> | |
| <i class="fas fa-check-circle"></i> | |
| </div> | |
| <div> | |
| <p class="font-bold">Recommendation: Call or Raise</p> | |
| <p class="text-gray-300 mt-1">You have a strong Ace-high with top kicker. The pot odds are favorable, and your hand has good potential to improve on later streets.</p> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Tutorial View (Hidden by default) --> | |
| <div id="tutorial-view" class="hidden max-w-6xl mx-auto"> | |
| <div class="bg-gray-800 rounded-xl shadow-lg overflow-hidden"> | |
| <div class="p-6 bg-gray-700"> | |
| <h2 class="text-xl font-bold">Texas Hold'em Basics</h2> | |
| <p class="text-gray-300 mt-1">Learn the fundamental rules and strategies of poker</p> | |
| </div> | |
| <div class="p-6 grid grid-cols-1 md:grid-cols-3 gap-6"> | |
| <!-- Tutorial Cards --> | |
| <div class="bg-gray-800 rounded-lg overflow-hidden border border-gray-700 hover:border-yellow-500 transition cursor-pointer"> | |
| <div class="bg-gradient-to-r from-blue-800 to-blue-600 p-4"> | |
| <div class="text-xl font-bold">Hand Rankings</div> | |
| <div class="text-sm opacity-80 mt-1">Learn what beats what</div> | |
| </div> | |
| <div class="p-4"> | |
| <div class="flex justify-center space-x-2 mb-3"> | |
| <div class="card bg-white text-black flex flex-col items-center justify-center"> | |
| <span class="text-red-500 text-sm font-bold">A</span> | |
| <span class="text-red-500">♥</span> | |
| </div> | |
| <div class="card bg-white text-black flex flex-col items-center justify-center"> | |
| <span class="text-red-500 text-sm font-bold">A</span> | |
| <span class="text-red-500">♠</span> | |
| </div> | |
| </div> | |
| <div class="text-sm text-gray-300"> | |
| Understand the hierarchy of poker hands from high card to royal flush. | |
| </div> | |
| <button class="mt-3 w-full bg-blue-600 hover:bg-blue-700 text-white py-1 rounded-md text-sm"> | |
| Start Lesson | |
| </button> | |
| </div> | |
| </div> | |
| <div class="bg-gray-800 rounded-lg overflow-hidden border border-gray-700 hover:border-yellow-500 transition cursor-pointer"> | |
| <div class="bg-gradient-to-r from-green-800 to-green-600 p-4"> | |
| <div class="text-xl font-bold">Betting Rounds</div> | |
| <div class="text-sm opacity-80 mt-1">Pre-flop to River</div> | |
| </div> | |
| <div class="p-4"> | |
| <div class="flex justify-center space-x-1 mb-3"> | |
| <div class="w-6 h-6 rounded-full bg-yellow-500 text-black text-xs flex items-center justify-center font-bold">P</div> | |
| <div class="w-6 h-6 rounded-full bg-yellow-500 text-black text-xs flex items-center justify-center font-bold">F</div> | |
| <div class="w-6 h-6 rounded-full bg-blue-500 text-white text-xs flex items-center justify-center font-bold">T</div> | |
| <div class="w-6 h-6 rounded-full bg-red-500 text-white text-xs flex items-center justify-center font-bold">R</div> | |
| </div> | |
| <div class="text-sm text-gray-300"> | |
| Master the flow of the game through each betting round and community card reveal. | |
| </div> | |
| <button class="mt-3 w-full bg-green-600 hover:bg-green-700 text-white py-1 rounded-md text-sm"> | |
| Start Lesson | |
| </button> | |
| </div> | |
| </div> | |
| <div class="bg-gray-800 rounded-lg overflow-hidden border border-gray-700 hover:border-yellow-500 transition cursor-pointer"> | |
| <div class="bg-gradient-to-r from-purple-800 to-purple-600 p-4"> | |
| <div class="text-xl font-bold">Position Play</div> | |
| <div class="text-sm opacity-80 mt-1">Why seat matters</div> | |
| </div> | |
| <div class="p-4"> | |
| <div class="flex justify-center mb-3"> | |
| <div class="relative w-20 h-20"> | |
| <div class="absolute top-0 left-0 w-6 h-6 rounded-full bg-gray-700 flex items-center justify-center text-xs">BTN</div> | |
| <div class="absolute top-1/2 right-0 w-6 h-6 rounded-full bg-gray-700 flex items-center justify-center text-xs">SB</div> | |
| <div class="absolute bottom-0 left-1/2 transform -translate-x-1/2 w-6 h-6 rounded-full bg-green-500 flex items-center justify-center text-xs"> | |
| <i class="fas fa-user"></i> | |
| </div> | |
| <div class="absolute top-1/2 left-0 w-6 h-6 rounded-full bg-gray-700 flex items-center justify-center text-xs">BB</div> | |
| </div> | |
| </div> | |
| <div class="text-sm text-gray-300"> | |
| Learn how your position at the table affects your strategy and decision making. | |
| </div> | |
| <button class="mt-3 w-full bg-purple-600 hover:bg-purple-700 text-white py-1 rounded-md text-sm"> | |
| Start Lesson | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="p-6 bg-gray-700 border-t border-gray-600"> | |
| <div class="flex items-center justify-between"> | |
| <div> | |
| <h3 class="font-semibold">Your Progress</h3> | |
| <p class="text-sm text-gray-300">2 of 10 lessons completed</p> | |
| </div> | |
| <div class="w-24 h-3 bg-gray-600 rounded-full overflow-hidden"> | |
| <div class="h-full bg-yellow-500" style="width: 20%"></div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Analytics View (Hidden by default) --> | |
| <div id="analytics-view" class="hidden max-w-6xl mx-auto"> | |
| <div class="bg-gray-800 rounded-xl shadow-lg overflow-hidden"> | |
| <div class="p-6 bg-gray-700"> | |
| <h2 class="text-xl font-bold">Player Analytics</h2> | |
| <p class="text-gray-300 mt-1">Review your performance and identify areas for improvement</p> | |
| </div> | |
| <div class="p-6"> | |
| <div class="grid grid-cols-1 md:grid-cols-2 gap-6"> | |
| <!-- Win Rate Chart --> | |
| <div class="bg-gray-900 rounded-lg p-4 border border-gray-700"> | |
| <div class="flex items-center justify-between mb-3"> | |
| <h3 class="font-semibold">Win Rate by Position</h3> | |
| <select class="bg-gray-800 text-sm rounded px-2 py-1"> | |
| <option>Last 100 Hands</option> | |
| <option>Last 50 Hands</option> | |
| <option>All Time</option> | |
| </select> | |
| </div> | |
| <div class="h-48 flex items-end justify-between"> | |
| <div class="flex flex-col items-center w-1/6"> | |
| <div class="w-6 bg-blue-500" style="height: 30%;"></div> | |
| <div class="text-xs mt-1">BTN</div> | |
| <div class="text-xs text-blue-400">62%</div> | |
| </div> | |
| <div class="flex flex-col items-center w-1/6"> | |
| <div class="w-6 bg-blue-500" style="height: 45%;"></div> | |
| <div class="text-xs mt-1">SB</div> | |
| <div class="text-xs text-blue-400">48%</div> | |
| </div> | |
| <div class="flex flex-col items-center w-1/6"> | |
| <div class="w-6 bg-blue-500" style="height: 70%;"></div> | |
| <div class="text-xs mt-1">BB</div> | |
| <div class="text-xs text-blue-400">51%</div> | |
| </div> | |
| <div class="flex flex-col items-center w-1/6"> | |
| <div class="w-6 bg-blue-500" style="height: 55%;"></div> | |
| <div class="text-xs mt-1">MP</div> | |
| <div class="text-xs text-blue-400">58%</div> | |
| </div> | |
| <div class="flex flex-col items-center w-1/6"> | |
| <div class="w-6 bg-blue-500" style="height: 65%;"></div> | |
| <div class="text-xs mt-1">CO</div> | |
| <div class="text-xs text-blue-400">60%</div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- VPIP/PFR --> | |
| <div class="bg-gray-900 rounded-lg p-4 border border-gray-700"> | |
| <div class="flex items-center justify-between mb-3"> | |
| <h3 class="font-semibold">VPIP / PFR</h3> | |
| <select class="bg-gray-800 text-sm rounded px-2 py-1"> | |
| <option>Last 100 Hands</option> | |
| <option>Last 50 Hands</option> | |
| <option>All Time</option> | |
| </select> | |
| </div> | |
| <div class="flex items-center justify-center h-48"> | |
| <div class="relative w-32 h-32"> | |
| <svg class="w-full h-full" viewBox="0 0 100 100"> | |
| <!-- Background circle --> | |
| <circle cx="50" cy="50" r="45" stroke="#374151" stroke-width="5" fill="none"/> | |
| <!-- VPIP (Voluntarily put $ in pot) --> | |
| <circle cx="50" cy="50" r="45" stroke="#3B82F6" stroke-width="5" fill="none" | |
| stroke-dasharray="282.743" stroke-dashoffset="70.6858" transform="rotate(-90 50 50)"/> | |
| <!-- PFR (Pre-flop raise) --> | |
| <circle cx="50" cy="50" r="35" stroke="#10B981" stroke-width="5" fill="none" | |
| stroke-dasharray="219.911" stroke-dashoffset="109.955" transform="rotate(-90 50 50)"/> | |
| </svg> | |
| <div class="absolute inset-0 flex flex-col items-center justify-center"> | |
| <div class="text-2xl font-bold">28/18</div> | |
| <div class="text-xs text-gray-400">VPIP/PFR</div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="flex justify-center mt-2 text-xs space-x-4"> | |
| <div class="flex items-center"> | |
| <div class="w-3 h-3 bg-blue-500 mr-1"></div> | |
| <span>VPIP: 28%</span> | |
| </div> | |
| <div class="flex items-center"> | |
| <div class="w-3 h-3 bg-green-500 mr-1"></div> | |
| <span>PFR: 18%</span> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Hand Analysis --> | |
| <div class="bg-gray-900 rounded-lg p-4 border border-gray-700 col-span-1 md:col-span-2"> | |
| <div class="flex items-center justify-between mb-3"> | |
| <h3 class="font-semibold">Recent Hand Analysis</h3> | |
| <select class="bg-gray-800 text-sm rounded px-2 py-1"> | |
| <option>Last 10 Hands</option> | |
| <option>Last 25 Hands</option> | |
| <option>All Hands Today</option> | |
| </select> | |
| </div> | |
| <div class="overflow-x-auto"> | |
| <table class="min-w-full text-xs"> | |
| <thead> | |
| <tr class="border-b border-gray-700"> | |
| <th class="text-left py-2 px-1">Hand</th> | |
| <th class="text-left py-2 px-1">Cards</th> | |
| <th class="text-left py-2 px-1">Position</th> | |
| <th class="text-left py-2 px-1">Action</th> | |
| <th class="text-left py-2 px-1">Result</th> | |
| <th class="text-left py-2 px-1">Net</th> | |
| <th class="text-left py-2 px-1">Review</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr class="border-b border-gray-800 hover:bg-gray-800"> | |
| <td class="py-2 px-1">#2479</td> | |
| <td class="py-2 px-1"> | |
| <span class="text-red-500">A♥</span> | |
| <span class="text-black">K♠</span> | |
| </td> | |
| <td class="py-2 px-1">BTN</td> | |
| <td class="py-2 px-1">Raised, Called</td> | |
| <td class="py-2 px-1 text-green-400">Won</td> | |
| <td class="py-2 px-1 text-green-400">+$45</td> | |
| <td class="py-2 px-1"> | |
| <button class="text-blue-400 hover:text-blue-300"> | |
| <i class="fas fa-eye"></i> | |
| </button> | |
| </td> | |
| </tr> | |
| <tr class="border-b border-gray-800 hover:bg-gray-800"> | |
| <td class="py-2 px-1">#2478</td> | |
| <td class="py-2 px-1"> | |
| <span class="text-black">Q♣</span> | |
| <span class="text-black">J♣</span> | |
| </td> | |
| <td class="py-2 px-1">MP</td> | |
| <td class="py-2 px-1">Called</td> | |
| <td class="py-2 px-1 text-red-400">Lost</td> | |
| <td class="py-2 px-1 text-red-400">-$20</td> | |
| <td class="py-2 px-1"> | |
| <button class="text-blue-400 hover:text-blue-300"> | |
| <i class="fas fa-eye"></i> | |
| </button> | |
| </td> | |
| </tr> | |
| <tr class="border-b border-gray-800 hover:bg-gray-800"> | |
| <td class="py-2 px-1">#2477</td> | |
| <td class="py-2 px-1"> | |
| <span class="text-black">K♦</span> | |
| <span class="text-black">K♣</span> | |
| </td> | |
| <td class="py-2 px-1">BB</td> | |
| <td class="py-2 px-1">Raised, Called</td> | |
| <td class="py-2 px-1 text-green-400">Won</td> | |
| <td class="py-2 px-1 text-green-400">+$85</td> | |
| <td class="py-2 px-1"> | |
| <button class="text-blue-400 hover:text-blue-300"> | |
| <i class="fas fa-eye"></i> | |
| </button> | |
| </td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| <div class="mt-3 text-center"> | |
| <button class="text-sm bg-gray-700 hover:bg-gray-600 px-3 py-1 rounded"> | |
| View All Hands | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Settings View (Hidden by default) --> | |
| <div id="settings-view" class="hidden max-w-3xl mx-auto"> | |
| <div class="bg-gray-800 rounded-xl shadow-lg overflow-hidden"> | |
| <div class="p-6 bg-gray-700"> | |
| <h2 class="text-xl font-bold">Settings</h2> | |
| </div> | |
| <div class="p-6"> | |
| <div class="space-y-6"> | |
| <!-- Game Settings --> | |
| <div> | |
| <h3 class="font-semibold border-b border-gray-700 pb-2 mb-4">Game Settings</h3> | |
| <div class="space-y-4"> | |
| <div class="flex items-center justify-between"> | |
| <div> | |
| <div class="text-sm font-medium">Sounds</div> | |
| <div class="text-xs text-gray-400">Enable or disable sound effects</div> | |
| </div> | |
| <label class="relative inline-flex items-center cursor-pointer"> | |
| <input type="checkbox" value="" class="sr-only peer" checked> | |
| <div class="w-11 h-6 bg-gray-700 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-blue-600"></div> | |
| </label> | |
| </div> | |
| <div class="flex items-center justify-between"> | |
| <div> | |
| <div class="text-sm font-medium">Animations</div> | |
| <div class="text-xs text-gray-400">Toggle card and chip animations</div> | |
| </div> | |
| <label class="relative inline-flex items-center cursor-pointer"> | |
| <input type="checkbox" value="" class="sr-only peer" checked> | |
| <div class="w-11 h-6 bg-gray-700 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-blue-600"></div> | |
| </label> | |
| </div> | |
| <div class="flex items-center justify-between"> | |
| <div> | |
| <div class="text-sm font-medium">AI Difficulty</div> | |
| <div class="text-xs text-gray-400">Set challenge level of AI opponents</div> | |
| </div> | |
| <select class="bg-gray-700 text-sm rounded px-3 py-1"> | |
| <option>Beginner</option> | |
| <option selected>Intermediate</option> | |
| <option>Advanced</option> | |
| </select> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Account Settings --> | |
| <div> | |
| <h3 class="font-semibold border-b border-gray-700 pb-2 mb-4">Account</h3> | |
| <div class="space-y-4"> | |
| <div class="flex items-center justify-between"> | |
| <div> | |
| <div class="text-sm font-medium">Player Name</div> | |
| <div class="text-xs text-gray-400">Your display name at tables</div> | |
| </div> | |
| <input type="text" value="Player1" class="bg-gray-700 text-sm rounded px-3 py-1 w-40"> | |
| </div> | |
| <div class="flex items-center justify-between"> | |
| <div> | |
| <div class="text-sm font-medium">Starting Stack</div> | |
| <div class="text-xs text-gray-400">Chip count for new games</div> | |
| </div> | |
| <select class="bg-gray-700 text-sm rounded px-3 py-1"> | |
| <option>1,000</option> | |
| <option selected>2,000</option> | |
| <option>5,000</option> | |
| <option>10,000</option> | |
| </select> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Data Management --> | |
| <div> | |
| <h3 class="font-semibold border-b border-gray-700 pb-2 mb-4">Data</h3> | |
| <div class="space-y-4"> | |
| <div class="flex items-center justify-between"> | |
| <div> | |
| <div class="text-sm font-medium">Export Data</div> | |
| <div class="text-xs text-gray-400">Download your game history</div> | |
| </div> | |
| <button class="bg-gray-700 hover:bg-gray-600 px-3 py-1 rounded text-sm"> | |
| Export | |
| </button> | |
| </div> | |
| <div class="flex items-center justify-between"> | |
| <div> | |
| <div class="text-sm font-medium">Reset Data</div> | |
| <div class="text-xs text-gray-400">Clear all stats and history</div> | |
| </div> | |
| <button class="bg-red-600 hover:bg-red-700 px-3 py-1 rounded text-sm"> | |
| Reset | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </main> | |
| <!-- Bottom Navigation --> | |
| <nav class="bg-gray-800 shadow-lg py-2 px-4 flex justify-around md:hidden fixed bottom-0 left-0 right-0 z-50"> | |
| <button class="nav-btn active p-2 rounded-lg text-center" data-view="game"> | |
| <i class="fas fa-gamepad block text-2xl mb-1 text-yellow-400"></i> | |
| <span class="text-xs">Game</span> | |
| </button> | |
| <button class="nav-btn p-2 rounded-lg text-center" data-view="tutorial"> | |
| <i class="fas fa-graduation-cap block text-2xl mb-1"></i> | |
| <span class="text-xs">Learn</span> | |
| </button> | |
| <button class="nav-btn p-2 rounded-lg text-center" data-view="analytics"> | |
| <i class="fas fa-chart-bar block text-2xl mb-1"></i> | |
| <span class="text-xs">Stats</span> | |
| </button> | |
| <button class="nav-btn p-2 rounded-lg text-center" data-view="settings"> | |
| <i class="fas fa-cog block text-2xl mb-1"></i> | |
| <span class="text-xs">Settings</span> | |
| </button> | |
| </nav> | |
| <!-- Help Modal (Hidden by default) --> | |
| <div id="help-modal" class="hidden fixed inset-0 bg-black bg-opacity-70 flex items-center justify-center z-50 p-4"> | |
| <div class="bg-gray-800 rounded-xl max-w-md w-full max-h-[90vh] overflow-y-auto"> | |
| <div class="p-6 bg-gray-700 sticky top-0 flex justify-between items-center"> | |
| <h2 class="text-xl font-bold">Help & Support</h2> | |
| <button id="close-help" class="text-2xl">×</button> | |
| </div> | |
| <div class="p-6 space-y-6"> | |
| <div> | |
| <h3 class="font-semibold text-lg mb-2">Getting Started</h3> | |
| <p class="text-gray-300"> | |
| Welcome to Hold'em Mastery! This offline poker tutorial and simulator helps you learn and improve your Texas Hold'em skills. | |
| </p> | |
| </div> | |
| <div> | |
| <h3 class="font-semibold text-lg mb-2">How to Play</h3> | |
| <div class="space-y-3 text-sm text-gray-300"> | |
| <div class="flex items-start"> | |
| <div class="bg-yellow-500 text-gray-900 rounded-full w-5 h-5 flex items-center justify-center mt-0.5 mr-2 flex-shrink-0">1</div> | |
| <p>Start with the tutorials to learn poker basics and strategies.</p> | |
| </div> | |
| <div class="flex items-start"> | |
| <div class="bg-yellow-500 text-gray-900 rounded-full w-5 h-5 flex items-center justify-center mt-0.5 mr-2 flex-shrink-0">2</div> | |
| <p>Practice in the simulator against AI opponents of varying difficulty.</p> | |
| </div> | |
| <div class="flex items-start"> | |
| <div class="bg-yellow-500 text-gray-900 rounded-full w-5 h-5 flex items-center justify-center mt-0.5 mr-2 flex-shrink-0">3</div> | |
| <p>Review your statistics in the analytics section to identify strengths and weaknesses.</p> | |
| </div> | |
| </div> | |
| </div> | |
| <div> | |
| <h3 class="font-semibold text-lg mb-2">Features</h3> | |
| <ul class="list-disc list-inside text-sm text-gray-300 space-y-1"> | |
| <li>Fully offline functionality - no internet required after loading</li> | |
| <li>Interactive lessons with guided feedback</li> | |
| <li>Adjustable AI difficulty levels</li> | |
| <li>Detailed hand analysis and statistics</li> | |
| <li>Progress tracking across devices</li> | |
| </ul> | |
| </div> | |
| <div> | |
| <h3 class="font-semibold text-lg mb-2">Support</h3> | |
| <p class="text-gray-300 mb-2"> | |
| For additional help or to report issues, please contact our support team. | |
| </p> | |
| <button class="bg-blue-600 hover:bg-blue-700 px-4 py-2 rounded-lg"> | |
| Contact Support | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Install Prompt (Hidden by default) --> | |
| <div id="install-prompt" class="hidden fixed bottom-4 right-4 bg-gray-800 border border-gray2-600 rounded-lg shadow-xl z-50 max-w-xs"> | |
| <div class="p-4"> | |
| <div class="flex items-start"> | |
| <div class="bg-yellow-500 text-gray-900 rounded-full w-6 h-6 flex items-center justify-center mt-0.5 mr-2 flex-shrink-0"> | |
| <i class="fas fa-download"></i> | |
| </div> | |
| <div> | |
| <h3 class="font-semibold">Install Hold'em Mastery</h3> | |
| <p class="text-sm text-gray-300 mt-1"> | |
| Add this app to your home screen for quick access and full offline play. | |
| </p> | |
| </div> | |
| </div> | |
| <div class="flex justify-end mt-3 space-x-2"> | |
| <button id="cancel-install" class="text-sm bg-gray-700 hover:bg-gray-600 px-3 py-1 rounded"> | |
| Not Now | |
| </button> | |
| <button id="confirm-install" class="text-sm bg-blue-600 hover:bg-blue-700 px-3 py-1 rounded"> | |
| Install | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <script> | |
| // DOM Elements | |
| const gameView = document.getElementById('game-view'); | |
| const tutorialView = document.getElementById('tutorial-view'); | |
| const analyticsView = document.getElementById('analytics-view'); | |
| const settingsView = document.getElementById('settings-view'); | |
| const helpModal = document.getElementById('help-modal'); | |
| const closeHelp = document.getElementById('close-help'); | |
| const helpBtn = document.getElementById('help-btn'); | |
| const mobileHelpBtn = document.getElementById('mobile-help-btn'); | |
| const menuToggle = document.getElementById('menu-toggle'); | |
| const mobileMenu = document.getElementById('mobile-menu'); | |
| const navBtns = document.querySelectorAll('.nav-btn'); | |
| const installPrompt = document.getElementById('install-prompt'); | |
| const cancelInstall = document.getElementById('cancel-install'); | |
| const confirmInstall = document.getElementById('confirm-install'); | |
| const soundToggle = document.getElementById('sound-toggle'); | |
| // Mobile menu toggle | |
| menuToggle.addEventListener('click', () => { | |
| mobileMenu.classList.toggle('hidden'); | |
| }); | |
| // Navigation controls | |
| navBtns.forEach(btn => { | |
| btn.addEventListener('click', () => { | |
| // Remove active class from all buttons | |
| navBtns.forEach(b => b.classList.remove('active', 'bg-gray-700', 'text-yellow-400')); | |
| navBtns.forEach(b => b.querySelector('span').classList.remove('text-yellow-400')); | |
| navBtns.forEach(b => b.querySelector('i').classList.remove('text-yellow-400')); | |
| // Add active class to clicked button | |
| btn.classList.add('active', 'bg-gray-700'); | |
| btn.querySelector('span').classList.add('text-yellow-400'); | |
| btn.querySelector('i').classList.add('text-yellow-400'); | |
| // Show the corresponding view | |
| const view = btn.getAttribute('data-view'); | |
| // Hide all views | |
| gameView.classList.add('hidden'); | |
| tutorialView.classList.add('hidden'); | |
| analyticsView.classList.add('hidden'); | |
| settingsView.classList.add('hidden'); | |
| // Show selected view | |
| if (view === 'game') { | |
| gameView.classList.remove('hidden'); | |
| } else if (view === 'tutorial') { | |
| tutorialView.classList.remove('hidden'); | |
| } else if (view === 'analytics') { | |
| analyticsView.classList.remove('hidden'); | |
| } else if (view === 'settings') { | |
| settingsView.classList.remove('hidden'); | |
| } | |
| }); | |
| }); | |
| // Help modal controls | |
| helpBtn.addEventListener('click', () => { | |
| helpModal.classList.remove('hidden'); | |
| }); | |
| mobileHelpBtn.addEventListener('click', () => { | |
| helpModal.classList.remove('hidden'); | |
| mobileMenu.classList.add('hidden'); | |
| }); | |
| closeHelp.addEventListener('click', () => { | |
| helpModal.classList.add('hidden'); | |
| }); | |
| // Install prompt controls | |
| cancelInstall.addEventListener('click', () => { | |
| installPrompt.classList.add('hidden'); | |
| }); | |
| confirmInstall.addEventListener('click', () => { | |
| // In a real app, this would trigger the PWA install prompt | |
| alert('App installation would be triggered here. For demo purposes, we\'re just showing the UI.'); | |
| installPrompt.classList.add('hidden'); | |
| }); | |
| // Simulate a delayed install prompt (would use PWA detection in a real app) | |
| setTimeout(() => { | |
| installPrompt.classList.remove('hidden'); | |
| }, 15000); | |
| // Sound toggle | |
| let soundOn = true; | |
| soundToggle.addEventListener('click', () => { | |
| soundOn = !soundOn; | |
| const icon = soundToggle.querySelector('i'); | |
| icon.className = soundOn ? 'fas fa-volume-up' : 'fas fa-volume-mute'; | |
| }); | |
| // Tooltip positioning | |
| document.querySelectorAll('.has-tooltip').forEach(el => { | |
| const tooltip = el.querySelector('.tooltip'); | |
| el.addEventListener('mousemove', (e) => { | |
| tooltip.style.left = `${e.pageX + 10}px`; | |
| tooltip.style.top = `${e.pageY + 10}px`; | |
| }); | |
| }); | |
| // Demo: Show community cards progressively | |
| if (gameView) { | |
| setTimeout(() => { | |
| const communityCards = document.querySelectorAll('#game-view .card'); | |
| // Show flop | |
| for (let i = 0; i < 3; i++) { | |
| setTimeout(() => { | |
| communityCards[i].innerHTML = ` | |
| <div class="flex flex-col items-center justify-center h-full"> | |
| ${getRandomCardHtml()} | |
| </div> | |
| `; | |
| communityCards[i].classList.add('card-animate'); | |
| }, i * 200); | |
| } | |
| // Show turn | |
| setTimeout(() => { | |
| communityCards[3].innerHTML = ` | |
| <div class="flex flex-col items-center justify-center h-full"> | |
| ${getRandomCardHtml()} | |
| </div> | |
| `; | |
| communityCards[3].classList.remove('opacity-50'); | |
| communityCards[3].classList.add('card-animate'); | |
| }, 1500); | |
| // Show river | |
| setTimeout(() => { | |
| communityCards[4].innerHTML = ` | |
| <div class="flex flex-col items-center justify-center h-full"> | |
| ${getRandomCardHtml()} | |
| </div> | |
| `; | |
| communityCards[4].classList.remove('opacity-50'); | |
| communityCards[4].classList.add('card-animate'); | |
| }, 2500); | |
| }, 1000); | |
| } | |
| // Helper function for demo | |
| function getRandomCardHtml() { | |
| const ranks = ['A', 'K', 'Q', 'J', '10', '9', '8', '7', '6', '5', '4', '3', '2']; | |
| const suits = ['♥', '♦', '♣', '♠']; | |
| const rank = ranks[Math.floor(Math.random() * ranks.length)]; | |
| const suit = suits[Math.floor(Math.random() * suits.length)]; | |
| const color = (suit === '♥' || suit === '♦') ? 'text-red-500' : 'text-black'; | |
| return ` | |
| <span class="${color} text-xl font-bold">${rank}</span> | |
| <span class="${color}">${suit}</span> | |
| `; | |
| } | |
| </script> | |
| <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - <a href="https://enzostvs-deepsite.hf.space?remix=LukasBe/hodlem-mastery" style="color: #fff;text-decoration: underline;" target="_blank" >🧬 Remix</a></p></body> | |
| </html> |