{"id":32769,"date":"2026-06-03T17:28:41","date_gmt":"2026-06-03T10:28:41","guid":{"rendered":"https:\/\/www.lapakgaming.com\/blog\/id-id\/?page_id=32769"},"modified":"2026-06-03T17:29:04","modified_gmt":"2026-06-03T10:29:04","slug":"elementor-32769","status":"publish","type":"page","link":"https:\/\/www.lapakgaming.com\/blog\/id-id\/elementor-32769\/","title":{"rendered":"Elementor #32769"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"32769\" class=\"elementor elementor-32769\">\n\t\t\t\t<div class=\"elementor-element elementor-element-fdbc4a4 e-flex e-con-boxed e-con e-parent\" data-id=\"fdbc4a4\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8fb3c67 elementor-widget elementor-widget-html\" data-id=\"8fb3c67\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"id\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<title>Genshin Raffle \u2014 Lucky Spin (Testable)<\/title>\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Cinzel:wght@500;700;900&family=Cormorant+Garamond:ital,wght@0,400;0,500;1,400&family=JetBrains+Mono:wght@500&display=swap\" rel=\"stylesheet\">\r\n<style>\r\n:root {\r\n  --bg-deep: #0a1419;\r\n  --bg-mid: #142128;\r\n  --bg-card: #1a2a33;\r\n  --accent-gold: #d4b16a;\r\n  --accent-gold-bright: #f5d488;\r\n  --accent-teal: #4ec5b4;\r\n  --accent-teal-dark: #2d8478;\r\n  --text-light: #f4ead5;\r\n  --text-dim: #8fa3a8;\r\n  --text-mute: #5a6c70;\r\n  --red: #c0392b;\r\n  --purple: #9b6dd7;\r\n  --orange: #e8843a;\r\n}\r\n\r\n* { margin: 0; padding: 0; box-sizing: border-box; }\r\n\r\nbody {\r\n  font-family: 'Cormorant Garamond', serif;\r\n  background: var(--bg-deep);\r\n  background-image:\r\n    radial-gradient(ellipse at top, rgba(78, 197, 180, 0.08) 0%, transparent 50%),\r\n    radial-gradient(ellipse at bottom, rgba(212, 177, 106, 0.06) 0%, transparent 50%),\r\n    linear-gradient(180deg, var(--bg-deep) 0%, var(--bg-mid) 100%);\r\n  background-attachment: fixed;\r\n  color: var(--text-light);\r\n  min-height: 100vh;\r\n  overflow-x: hidden;\r\n  position: relative;\r\n}\r\n\r\nbody::before {\r\n  content: '';\r\n  position: fixed;\r\n  inset: 0;\r\n  background-image: url(\"data:image\/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http:\/\/www.w3.org\/2000\/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'\/%3E%3CfeColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.04 0'\/%3E%3C\/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'\/%3E%3C\/svg%3E\");\r\n  pointer-events: none;\r\n  z-index: 1;\r\n  opacity: 0.5;\r\n}\r\n\r\n.container {\r\n  max-width: 1300px;\r\n  margin: 0 auto;\r\n  padding: 40px 24px;\r\n  position: relative;\r\n  z-index: 2;\r\n}\r\n\r\n@media (max-width: 768px) {\r\n  .container { padding: 24px 16px; }\r\n}\r\n\r\n@media (max-width: 480px) {\r\n  .container { padding: 16px 12px; }\r\n}\r\n\r\n.header {\r\n  text-align: center;\r\n  margin-bottom: 50px;\r\n  position: relative;\r\n}\r\n\r\n.header::before, .header::after {\r\n  content: '';\r\n  position: absolute;\r\n  top: 50%;\r\n  width: 120px;\r\n  height: 1px;\r\n  background: linear-gradient(90deg, transparent, var(--accent-gold), transparent);\r\n}\r\n.header::before { left: 50%; transform: translateX(-330px); }\r\n.header::after { right: 50%; transform: translateX(330px); }\r\n\r\n@media (max-width: 768px) {\r\n  .header { margin-bottom: 30px; }\r\n  .header::before, .header::after { display: none; }\r\n}\r\n\r\n.eyebrow {\r\n  font-family: 'JetBrains Mono', monospace;\r\n  font-size: 11px;\r\n  letter-spacing: 0.4em;\r\n  color: var(--accent-teal);\r\n  text-transform: uppercase;\r\n  margin-bottom: 14px;\r\n}\r\n\r\n@media (max-width: 480px) {\r\n  .eyebrow { font-size: 9px; letter-spacing: 0.3em; }\r\n}\r\n\r\n.title {\r\n  font-family: 'Cinzel', serif;\r\n  font-size: 48px;\r\n  font-weight: 700;\r\n  letter-spacing: 0.05em;\r\n  color: var(--accent-gold-bright);\r\n  text-shadow: 0 0 30px rgba(212, 177, 106, 0.5);\r\n  margin-bottom: 8px;\r\n}\r\n\r\n@media (max-width: 768px) {\r\n  .title { font-size: 36px; }\r\n}\r\n\r\n@media (max-width: 480px) {\r\n  .title { font-size: 28px; letter-spacing: 0.03em; }\r\n}\r\n\r\n.subtitle {\r\n  font-family: 'Cormorant Garamond', serif;\r\n  font-style: italic;\r\n  color: var(--text-dim);\r\n  font-size: 17px;\r\n  letter-spacing: 0.05em;\r\n}\r\n\r\n@media (max-width: 480px) {\r\n  .subtitle { font-size: 14px; padding: 0 8px; }\r\n}\r\n\r\n.main {\r\n  display: grid;\r\n  grid-template-columns: 320px 1fr 320px;\r\n  gap: 32px;\r\n  align-items: start;\r\n}\r\n\r\n@media (max-width: 1200px) {\r\n  .main {\r\n    grid-template-columns: 280px 1fr 280px;\r\n    gap: 20px;\r\n  }\r\n}\r\n\r\n@media (max-width: 1024px) {\r\n  .main {\r\n    grid-template-columns: 1fr;\r\n    gap: 24px;\r\n  }\r\n  \/* On mobile, wheel area (center) shows first, then left panel, then right panel *\/\r\n  .main > :nth-child(1) { order: 2; }\r\n  .main > :nth-child(2) { order: 1; }\r\n  .main > :nth-child(3) { order: 3; }\r\n}\r\n\r\n.panel {\r\n  background: linear-gradient(180deg, var(--bg-card) 0%, rgba(20, 33, 40, 0.6) 100%);\r\n  border: 1px solid rgba(212, 177, 106, 0.2);\r\n  border-radius: 4px;\r\n  padding: 24px;\r\n  position: relative;\r\n}\r\n\r\n@media (max-width: 480px) {\r\n  .panel { padding: 18px; }\r\n}\r\n\r\n.panel::before {\r\n  content: '';\r\n  position: absolute;\r\n  inset: 0;\r\n  border: 1px solid rgba(212, 177, 106, 0.1);\r\n  border-radius: 4px;\r\n  pointer-events: none;\r\n  margin: 4px;\r\n}\r\n\r\n.panel-title {\r\n  font-family: 'Cinzel', serif;\r\n  font-size: 14px;\r\n  font-weight: 700;\r\n  letter-spacing: 0.2em;\r\n  color: var(--accent-gold);\r\n  text-transform: uppercase;\r\n  margin-bottom: 18px;\r\n  padding-bottom: 12px;\r\n  border-bottom: 1px solid rgba(212, 177, 106, 0.2);\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 10px;\r\n}\r\n\r\n.panel-title::before {\r\n  content: '\u25c6';\r\n  color: var(--accent-teal);\r\n  font-size: 10px;\r\n}\r\n\r\n.stat-row {\r\n  display: flex;\r\n  justify-content: space-between;\r\n  align-items: baseline;\r\n  padding: 10px 0;\r\n  border-bottom: 1px dashed rgba(143, 163, 168, 0.2);\r\n}\r\n.stat-row:last-child { border-bottom: none; }\r\n\r\n.stat-label {\r\n  font-size: 14px;\r\n  color: var(--text-dim);\r\n  letter-spacing: 0.05em;\r\n}\r\n\r\n.stat-value {\r\n  font-family: 'Cinzel', serif;\r\n  font-weight: 700;\r\n  font-size: 18px;\r\n  color: var(--text-light);\r\n}\r\n\r\n.stat-value.gold { color: var(--accent-gold-bright); }\r\n.stat-value.teal { color: var(--accent-teal); }\r\n\r\n\/* Adventure Rank Badge *\/\r\n.ar-badge {\r\n  margin-top: 20px;\r\n  padding: 14px;\r\n  background: linear-gradient(135deg, rgba(212, 177, 106, 0.15), rgba(78, 197, 180, 0.08));\r\n  border: 1px solid rgba(212, 177, 106, 0.3);\r\n  border-radius: 4px;\r\n  text-align: center;\r\n}\r\n\r\n.ar-label {\r\n  font-family: 'JetBrains Mono', monospace;\r\n  font-size: 10px;\r\n  letter-spacing: 0.3em;\r\n  color: var(--text-dim);\r\n  margin-bottom: 6px;\r\n}\r\n\r\n.ar-value {\r\n  font-family: 'Cinzel', serif;\r\n  font-size: 28px;\r\n  font-weight: 900;\r\n  color: var(--accent-gold-bright);\r\n}\r\n\r\n.ar-title {\r\n  font-family: 'Cormorant Garamond', serif;\r\n  font-style: italic;\r\n  font-size: 14px;\r\n  color: var(--accent-teal);\r\n  margin-top: 2px;\r\n}\r\n\r\n.ar-progress-wrap {\r\n  margin-top: 10px;\r\n  background: rgba(10, 20, 25, 0.6);\r\n  border-radius: 2px;\r\n  height: 6px;\r\n  overflow: hidden;\r\n  position: relative;\r\n}\r\n\r\n.ar-progress-bar {\r\n  height: 100%;\r\n  background: linear-gradient(90deg, var(--accent-teal), var(--accent-gold));\r\n  transition: width 0.6s;\r\n}\r\n\r\n.ar-progress-text {\r\n  margin-top: 4px;\r\n  font-family: 'JetBrains Mono', monospace;\r\n  font-size: 10px;\r\n  color: var(--text-mute);\r\n}\r\n\r\n\/* Wheel area *\/\r\n.wheel-area {\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  gap: 28px;\r\n}\r\n\r\n@media (max-width: 480px) {\r\n  .wheel-area { gap: 20px; }\r\n}\r\n\r\n.wheel-container {\r\n  position: relative;\r\n  width: 480px;\r\n  height: 480px;\r\n  max-width: min(90vw, 480px);\r\n  max-height: min(90vw, 480px);\r\n  aspect-ratio: 1;\r\n}\r\n\r\n@media (max-width: 768px) {\r\n  .wheel-container {\r\n    width: min(85vw, 400px);\r\n    height: min(85vw, 400px);\r\n  }\r\n}\r\n\r\n@media (max-width: 480px) {\r\n  .wheel-container {\r\n    width: min(80vw, 320px);\r\n    height: min(80vw, 320px);\r\n  }\r\n}\r\n\r\n.wheel-ring {\r\n  position: absolute;\r\n  inset: -24px;\r\n  border: 2px solid var(--accent-gold);\r\n  border-radius: 50%;\r\n  background: radial-gradient(circle, transparent 60%, rgba(212, 177, 106, 0.08) 100%);\r\n}\r\n\r\n@media (max-width: 480px) {\r\n  .wheel-ring { inset: -14px; }\r\n}\r\n\r\n.wheel-ring::before,\r\n.wheel-ring::after {\r\n  content: '';\r\n  position: absolute;\r\n  inset: 8px;\r\n  border: 1px solid rgba(212, 177, 106, 0.3);\r\n  border-radius: 50%;\r\n}\r\n.wheel-ring::after {\r\n  inset: 16px;\r\n  border: 1px dashed rgba(212, 177, 106, 0.2);\r\n}\r\n\r\n.pegs {\r\n  position: absolute;\r\n  inset: -24px;\r\n  pointer-events: none;\r\n}\r\n\r\n@media (max-width: 480px) {\r\n  .pegs { inset: -14px; }\r\n}\r\n.peg {\r\n  position: absolute;\r\n  width: 8px;\r\n  height: 8px;\r\n  background: var(--accent-gold);\r\n  border-radius: 50%;\r\n  top: 50%; left: 50%;\r\n  box-shadow: 0 0 8px var(--accent-gold-bright);\r\n}\r\n\r\n.wheel {\r\n  width: 100%;\r\n  height: 100%;\r\n  filter: drop-shadow(0 0 30px rgba(212, 177, 106, 0.3));\r\n  transition: transform 6s cubic-bezier(0.17, 0.67, 0.16, 1.0);\r\n}\r\n\r\n.pointer {\r\n  position: absolute;\r\n  top: -30px;\r\n  left: 50%;\r\n  transform: translateX(-50%);\r\n  width: 40px;\r\n  height: 50px;\r\n  z-index: 10;\r\n  filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.5));\r\n}\r\n\r\n@media (max-width: 480px) {\r\n  .pointer {\r\n    top: -20px;\r\n    width: 30px;\r\n    height: 38px;\r\n  }\r\n}\r\n\r\n.hub {\r\n  position: absolute;\r\n  top: 50%;\r\n  left: 50%;\r\n  transform: translate(-50%, -50%);\r\n  width: 100px;\r\n  height: 100px;\r\n  background: radial-gradient(circle, var(--bg-card) 30%, var(--bg-mid) 100%);\r\n  border: 3px solid var(--accent-gold);\r\n  border-radius: 50%;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  z-index: 5;\r\n  box-shadow:\r\n    inset 0 0 20px rgba(0, 0, 0, 0.5),\r\n    0 0 30px rgba(212, 177, 106, 0.3);\r\n}\r\n\r\n@media (max-width: 768px) {\r\n  .hub { width: 80px; height: 80px; }\r\n}\r\n\r\n@media (max-width: 480px) {\r\n  .hub { width: 64px; height: 64px; border-width: 2px; }\r\n}\r\n\r\n.hub-inner {\r\n  width: 70px;\r\n  height: 70px;\r\n  border-radius: 50%;\r\n  background: linear-gradient(135deg, var(--accent-gold), var(--accent-gold-bright));\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  font-family: 'Cinzel', serif;\r\n  font-weight: 900;\r\n  font-size: 24px;\r\n  color: var(--bg-deep);\r\n  letter-spacing: 0.05em;\r\n  box-shadow: inset 0 -2px 6px rgba(0, 0, 0, 0.2);\r\n}\r\n\r\n@media (max-width: 768px) {\r\n  .hub-inner { width: 56px; height: 56px; font-size: 20px; }\r\n}\r\n\r\n@media (max-width: 480px) {\r\n  .hub-inner { width: 44px; height: 44px; font-size: 16px; }\r\n}\r\n\r\n.code-section {\r\n  width: 100%;\r\n  max-width: 480px;\r\n  text-align: center;\r\n  padding: 0 8px;\r\n}\r\n\r\n.code-label {\r\n  font-family: 'JetBrains Mono', monospace;\r\n  font-size: 11px;\r\n  letter-spacing: 0.3em;\r\n  color: var(--text-dim);\r\n  margin-bottom: 12px;\r\n  text-transform: uppercase;\r\n}\r\n\r\n.code-input {\r\n  width: 100%;\r\n  padding: 18px 20px;\r\n  background: var(--bg-card);\r\n  border: 1px solid rgba(212, 177, 106, 0.3);\r\n  color: var(--accent-gold-bright);\r\n  font-family: 'JetBrains Mono', monospace;\r\n  font-size: 18px;\r\n  letter-spacing: 0.15em;\r\n  text-align: center;\r\n  border-radius: 4px;\r\n  text-transform: uppercase;\r\n  transition: all 0.3s;\r\n}\r\n\r\n@media (max-width: 480px) {\r\n  .code-input {\r\n    padding: 14px 12px;\r\n    font-size: 15px;\r\n    letter-spacing: 0.1em;\r\n  }\r\n}\r\n\r\n.code-input:focus {\r\n  outline: none;\r\n  border-color: var(--accent-gold);\r\n  box-shadow: 0 0 20px rgba(212, 177, 106, 0.2);\r\n}\r\n.code-input::placeholder { color: var(--text-mute); letter-spacing: 0.2em; }\r\n\r\n.spin-btn {\r\n  margin-top: 20px;\r\n  padding: 18px 80px;\r\n  background: linear-gradient(135deg, var(--accent-gold), var(--accent-gold-bright));\r\n  color: var(--bg-deep);\r\n  border: none;\r\n  font-family: 'Cinzel', serif;\r\n  font-weight: 700;\r\n  font-size: 16px;\r\n  letter-spacing: 0.3em;\r\n  text-transform: uppercase;\r\n  cursor: pointer;\r\n  border-radius: 4px;\r\n  transition: all 0.3s;\r\n  position: relative;\r\n  overflow: hidden;\r\n  width: 100%;\r\n  max-width: 320px;\r\n  display: block;\r\n  margin-left: auto;\r\n  margin-right: auto;\r\n}\r\n\r\n@media (max-width: 768px) {\r\n  .spin-btn {\r\n    padding: 16px 40px;\r\n    font-size: 15px;\r\n    letter-spacing: 0.25em;\r\n  }\r\n}\r\n\r\n@media (max-width: 480px) {\r\n  .spin-btn {\r\n    padding: 14px 24px;\r\n    font-size: 13px;\r\n    letter-spacing: 0.2em;\r\n    width: 100%;\r\n    max-width: none;\r\n  }\r\n}\r\n\r\n.spin-btn::before {\r\n  content: '';\r\n  position: absolute;\r\n  top: 0; left: -100%;\r\n  width: 100%; height: 100%;\r\n  background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);\r\n  transition: left 0.6s;\r\n}\r\n.spin-btn:hover::before { left: 100%; }\r\n\r\n.spin-btn:hover:not(:disabled) {\r\n  transform: translateY(-2px);\r\n  box-shadow: 0 8px 24px rgba(212, 177, 106, 0.4);\r\n}\r\n\r\n.spin-btn:disabled {\r\n  opacity: 0.4;\r\n  cursor: not-allowed;\r\n}\r\n\r\n\/* Prize list *\/\r\n.prize-row {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  padding: 12px 0;\r\n  border-bottom: 1px dashed rgba(143, 163, 168, 0.15);\r\n}\r\n.prize-row:last-child { border-bottom: none; }\r\n\r\n.prize-left {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 12px;\r\n}\r\n\r\n.prize-dot {\r\n  width: 12px;\r\n  height: 12px;\r\n  border-radius: 50%;\r\n  flex-shrink: 0;\r\n}\r\n\r\n.prize-name {\r\n  font-size: 14px;\r\n  color: var(--text-light);\r\n}\r\n\r\n.prize-odds {\r\n  font-family: 'JetBrains Mono', monospace;\r\n  font-size: 12px;\r\n  color: var(--text-dim);\r\n}\r\n\r\n\/* History *\/\r\n.history-empty {\r\n  text-align: center;\r\n  padding: 24px 0;\r\n  font-style: italic;\r\n  color: var(--text-mute);\r\n  font-size: 14px;\r\n}\r\n\r\n.history-item {\r\n  padding: 10px 0;\r\n  border-bottom: 1px dashed rgba(143, 163, 168, 0.15);\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n}\r\n\r\n.history-spin {\r\n  font-family: 'JetBrains Mono', monospace;\r\n  font-size: 11px;\r\n  color: var(--text-mute);\r\n}\r\n\r\n.history-prize {\r\n  font-size: 13px;\r\n  font-weight: 500;\r\n}\r\n\r\n\/* Modal *\/\r\n.modal-backdrop {\r\n  position: fixed;\r\n  inset: 0;\r\n  background: rgba(10, 20, 25, 0.85);\r\n  backdrop-filter: blur(10px);\r\n  display: none;\r\n  align-items: center;\r\n  justify-content: center;\r\n  z-index: 100;\r\n  animation: fadeIn 0.4s;\r\n}\r\n.modal-backdrop.show { display: flex; }\r\n\r\n@keyframes fadeIn {\r\n  from { opacity: 0; }\r\n  to { opacity: 1; }\r\n}\r\n\r\n@keyframes scaleIn {\r\n  from { transform: scale(0.7); opacity: 0; }\r\n  to { transform: scale(1); opacity: 1; }\r\n}\r\n\r\n.modal {\r\n  background: var(--bg-card);\r\n  border: 1px solid var(--accent-gold);\r\n  padding: 50px 60px;\r\n  text-align: center;\r\n  border-radius: 4px;\r\n  max-width: 500px;\r\n  width: 90%;\r\n  position: relative;\r\n  animation: scaleIn 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);\r\n  box-shadow: 0 0 80px rgba(212, 177, 106, 0.4);\r\n}\r\n\r\n@media (max-width: 480px) {\r\n  .modal {\r\n    padding: 32px 24px;\r\n    width: 92%;\r\n  }\r\n}\r\n\r\n.modal::before {\r\n  content: '';\r\n  position: absolute;\r\n  inset: 6px;\r\n  border: 1px solid rgba(212, 177, 106, 0.3);\r\n  pointer-events: none;\r\n}\r\n\r\n.modal-eyebrow {\r\n  font-family: 'JetBrains Mono', monospace;\r\n  font-size: 10px;\r\n  letter-spacing: 0.4em;\r\n  color: var(--accent-teal);\r\n  text-transform: uppercase;\r\n  margin-bottom: 20px;\r\n}\r\n\r\n.modal-prize-icon {\r\n  font-size: 56px;\r\n  margin-bottom: 18px;\r\n}\r\n\r\n.modal-title {\r\n  font-family: 'Cinzel', serif;\r\n  font-size: 32px;\r\n  font-weight: 700;\r\n  color: var(--accent-gold-bright);\r\n  margin-bottom: 12px;\r\n  letter-spacing: 0.05em;\r\n}\r\n\r\n@media (max-width: 480px) {\r\n  .modal-title { font-size: 24px; }\r\n  .modal-prize-icon { font-size: 44px; }\r\n  .modal-desc { font-size: 15px; }\r\n}\r\n\r\n.modal-desc {\r\n  font-size: 17px;\r\n  color: var(--text-dim);\r\n  font-style: italic;\r\n  margin-bottom: 30px;\r\n}\r\n\r\n.modal-close {\r\n  padding: 12px 40px;\r\n  background: transparent;\r\n  border: 1px solid var(--accent-gold);\r\n  color: var(--accent-gold);\r\n  font-family: 'Cinzel', serif;\r\n  font-size: 13px;\r\n  letter-spacing: 0.3em;\r\n  cursor: pointer;\r\n  border-radius: 4px;\r\n  transition: all 0.3s;\r\n  text-transform: uppercase;\r\n}\r\n.modal-close:hover {\r\n  background: var(--accent-gold);\r\n  color: var(--bg-deep);\r\n}\r\n\r\n.toast {\r\n  position: fixed;\r\n  bottom: 30px;\r\n  left: 50%;\r\n  transform: translateX(-50%) translateY(100px);\r\n  background: var(--bg-card);\r\n  border: 1px solid var(--red);\r\n  padding: 14px 28px;\r\n  color: var(--text-light);\r\n  font-size: 14px;\r\n  border-radius: 4px;\r\n  opacity: 0;\r\n  transition: all 0.4s;\r\n  z-index: 200;\r\n}\r\n.toast.show {\r\n  opacity: 1;\r\n  transform: translateX(-50%) translateY(0);\r\n}\r\n\r\n.toast.success {\r\n  border-color: var(--accent-teal);\r\n}\r\n\r\n@keyframes sparkle {\r\n  0%, 100% { opacity: 0; transform: scale(0) rotate(0deg); }\r\n  50% { opacity: 1; transform: scale(1) rotate(180deg); }\r\n}\r\n\r\n.sparkle {\r\n  position: absolute;\r\n  font-size: 24px;\r\n  color: var(--accent-gold-bright);\r\n  animation: sparkle 2s infinite;\r\n  pointer-events: none;\r\n}\r\n\r\n\/* Testing tools panel *\/\r\n.test-tools {\r\n  margin-top: 24px;\r\n  padding: 20px;\r\n  background: rgba(10, 20, 25, 0.6);\r\n  border: 1px dashed var(--accent-teal);\r\n  border-radius: 4px;\r\n}\r\n\r\n.test-tools-title {\r\n  font-family: 'JetBrains Mono', monospace;\r\n  font-size: 10px;\r\n  letter-spacing: 0.3em;\r\n  color: var(--accent-teal);\r\n  margin-bottom: 12px;\r\n  text-transform: uppercase;\r\n}\r\n\r\n.test-section {\r\n  margin-bottom: 14px;\r\n  padding-bottom: 14px;\r\n  border-bottom: 1px dashed rgba(143, 163, 168, 0.15);\r\n}\r\n.test-section:last-child { border-bottom: none; margin-bottom: 0; padding-bottom: 0; }\r\n\r\n.test-label {\r\n  font-size: 11px;\r\n  color: var(--text-dim);\r\n  margin-bottom: 8px;\r\n  display: block;\r\n}\r\n\r\n.test-controls {\r\n  display: flex;\r\n  gap: 6px;\r\n  flex-wrap: wrap;\r\n}\r\n\r\n.test-btn {\r\n  padding: 6px 10px;\r\n  font-family: 'JetBrains Mono', monospace;\r\n  font-size: 10px;\r\n  background: transparent;\r\n  border: 1px solid var(--text-mute);\r\n  color: var(--text-dim);\r\n  cursor: pointer;\r\n  border-radius: 2px;\r\n  letter-spacing: 0.05em;\r\n  transition: all 0.2s;\r\n}\r\n.test-btn:hover {\r\n  border-color: var(--accent-teal);\r\n  color: var(--accent-teal);\r\n}\r\n.test-btn.danger:hover {\r\n  border-color: var(--red);\r\n  color: var(--red);\r\n}\r\n\r\n.batch-result {\r\n  margin-top: 12px;\r\n  padding: 12px;\r\n  background: rgba(0, 0, 0, 0.3);\r\n  font-family: 'JetBrains Mono', monospace;\r\n  font-size: 11px;\r\n  color: var(--text-light);\r\n  line-height: 1.7;\r\n  border-radius: 2px;\r\n  max-height: 200px;\r\n  overflow-y: auto;\r\n}\r\n\r\n.batch-stat {\r\n  display: flex;\r\n  justify-content: space-between;\r\n  padding: 2px 0;\r\n}\r\n.batch-stat strong { color: var(--accent-gold); }\r\n.batch-stat.win-grand strong { color: var(--accent-gold-bright); }\r\n.batch-stat.win-welkin strong { color: var(--purple); }\r\n<\/style>\r\n<\/head>\r\n<body>\r\n\r\n<div class=\"container\">\r\n\r\n  <div class=\"header\">\r\n    <div class=\"eyebrow\">\u2014 Mondstadt Lucky Draw \u2014<\/div>\r\n    <h1 class=\"title\">Wheel of Fortune<\/h1>\r\n    <p class=\"subtitle\">Setiap pembelian Crystal adalah satu kesempatan dari Barbatos<\/p>\r\n  <\/div>\r\n\r\n  <div class=\"main\">\r\n\r\n    <!-- LEFT PANEL -->\r\n    <div>\r\n      <div class=\"panel\">\r\n        <div class=\"panel-title\">Status Traveler<\/div>\r\n\r\n        <div class=\"stat-row\">\r\n          <span class=\"stat-label\">Discord<\/span>\r\n          <span class=\"stat-value\" id=\"userName\">Traveler#1234<\/span>\r\n        <\/div>\r\n        <div class=\"stat-row\">\r\n          <span class=\"stat-label\">Spin ke<\/span>\r\n          <span class=\"stat-value gold\" id=\"currentSpin\">1<\/span>\r\n        <\/div>\r\n        <div class=\"stat-row\">\r\n          <span class=\"stat-label\">Sisa Kode<\/span>\r\n          <span class=\"stat-value teal\" id=\"remainingCodes\">30<\/span>\r\n        <\/div>\r\n        <div class=\"stat-row\">\r\n          <span class=\"stat-label\">Total Belanja<\/span>\r\n          <span class=\"stat-value\" id=\"totalSpent\">Rp 0<\/span>\r\n        <\/div>\r\n\r\n        <!-- Adventure Rank -->\r\n        <div class=\"ar-badge\">\r\n          <div class=\"ar-label\">\u2014 ADVENTURE RANK \u2014<\/div>\r\n          <div class=\"ar-value\">\u2605 <span id=\"arValue\">1<\/span><\/div>\r\n          <div class=\"ar-title\" id=\"arTitle\">Wanderer<\/div>\r\n          <div class=\"ar-progress-wrap\">\r\n            <div class=\"ar-progress-bar\" id=\"arProgressBar\" style=\"width: 10%;\"><\/div>\r\n          <\/div>\r\n          <div class=\"ar-progress-text\" id=\"arProgressText\">Next: Voyager at AR 10<\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- TESTING TOOLS -->\r\n      <div class=\"test-tools\">\r\n        <div class=\"test-tools-title\">\u25b6 TESTING TOOLS<\/div>\r\n\r\n        <div class=\"test-section\">\r\n          <span class=\"test-label\">Auto Spin Batch (uji probabilitas)<\/span>\r\n          <div class=\"test-controls\">\r\n            <button class=\"test-btn\" onclick=\"autoSpin(30)\">\u00d730 (1 user)<\/button>\r\n            <button class=\"test-btn\" onclick=\"autoSpin(300)\">\u00d7300<\/button>\r\n            <button class=\"test-btn\" onclick=\"autoSpin(6000)\">\u00d76000<\/button>\r\n            <button class=\"test-btn\" onclick=\"autoSpin(60000)\">\u00d760000 (1 bulan sim)<\/button>\r\n          <\/div>\r\n          <div class=\"batch-result\" id=\"batchResult\" style=\"display:none;\"><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"test-section\">\r\n          <span class=\"test-label\">Force Result (spin manual)<\/span>\r\n          <div class=\"test-controls\">\r\n            <button class=\"test-btn\" onclick=\"forceWin('grand')\">FORCE GRAND<\/button>\r\n            <button class=\"test-btn\" onclick=\"forceWin('welkin')\">FORCE WELKIN<\/button>\r\n            <button class=\"test-btn\" onclick=\"forceWin('voucher5')\">FORCE V5<\/button>\r\n            <button class=\"test-btn\" onclick=\"forceWin('unlucky')\">FORCE UNLUCKY<\/button>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"test-section\">\r\n          <span class=\"test-label\">Reset<\/span>\r\n          <div class=\"test-controls\">\r\n            <button class=\"test-btn danger\" onclick=\"resetAll()\">RESET ALL<\/button>\r\n            <button class=\"test-btn danger\" onclick=\"resetCaps()\">RESET CAPS<\/button>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- CENTER: Wheel -->\r\n    <div class=\"wheel-area\">\r\n      <div class=\"wheel-container\">\r\n        <div class=\"wheel-ring\"><\/div>\r\n        <div class=\"pegs\" id=\"pegs\"><\/div>\r\n\r\n        <svg class=\"pointer\" viewBox=\"0 0 40 50\">\r\n          <path d=\"M20 50 L5 10 Q20 0 35 10 Z\" fill=\"#d4b16a\" stroke=\"#0a1419\" stroke-width=\"2\"\/>\r\n          <circle cx=\"20\" cy=\"14\" r=\"4\" fill=\"#0a1419\"\/>\r\n        <\/svg>\r\n\r\n        <svg class=\"wheel\" id=\"wheel\" viewBox=\"0 0 400 400\">\r\n          <g id=\"wheelSlices\"><\/g>\r\n          <circle cx=\"200\" cy=\"200\" r=\"198\" fill=\"none\" stroke=\"#d4b16a\" stroke-width=\"3\"\/>\r\n          <circle cx=\"200\" cy=\"200\" r=\"194\" fill=\"none\" stroke=\"#f5d488\" stroke-width=\"1\" opacity=\"0.6\"\/>\r\n        <\/svg>\r\n\r\n        <div class=\"hub\">\r\n          <div class=\"hub-inner\">GI<\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"code-section\">\r\n        <div class=\"code-label\">\u2014 Masukkan Kode Raffle \u2014<\/div>\r\n        <input type=\"text\" class=\"code-input\" id=\"codeInput\" placeholder=\"GENS-XXXX-XXXX\" maxlength=\"14\" autocomplete=\"off\">\r\n        <br>\r\n        <button class=\"spin-btn\" id=\"spinBtn\" onclick=\"initiateSpin()\">Putar Kincir<\/button>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- RIGHT PANEL -->\r\n    <div>\r\n      <div class=\"panel\">\r\n        <div class=\"panel-title\">Hadiah Tersedia<\/div>\r\n        <div id=\"prizeList\"><\/div>\r\n      <\/div>\r\n\r\n      <div class=\"panel\" style=\"margin-top: 24px;\">\r\n        <div class=\"panel-title\">Riwayat Spin<\/div>\r\n        <div id=\"historyList\"><div class=\"history-empty\">Belum ada spin bulan ini<\/div><\/div>\r\n      <\/div>\r\n\r\n      <div class=\"panel\" style=\"margin-top: 24px;\">\r\n        <div class=\"panel-title\">Stok Hadiah Bulan Ini<\/div>\r\n        <div class=\"stat-row\">\r\n          <span class=\"stat-label\">Grand Prize<\/span>\r\n          <span class=\"stat-value gold\"><span id=\"grandStock\">1<\/span> \/ 1<\/span>\r\n        <\/div>\r\n        <div class=\"stat-row\">\r\n          <span class=\"stat-label\">Welkin Moon<\/span>\r\n          <span class=\"stat-value teal\"><span id=\"welkinStock\">1<\/span> \/ 1<\/span>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- Modal -->\r\n<div class=\"modal-backdrop\" id=\"modal\">\r\n  <div class=\"modal\">\r\n    <div class=\"modal-eyebrow\" id=\"modalEyebrow\">\u2014 Hasil Putaran \u2014<\/div>\r\n    <div class=\"modal-prize-icon\" id=\"modalIcon\">\ud83c\udf81<\/div>\r\n    <h2 class=\"modal-title\" id=\"modalTitle\">Hadiah<\/h2>\r\n    <p class=\"modal-desc\" id=\"modalDesc\">Deskripsi hadiah<\/p>\r\n    <button class=\"modal-close\" onclick=\"closeModal()\">Tutup<\/button>\r\n  <\/div>\r\n<\/div>\r\n\r\n<div class=\"toast\" id=\"toast\">Pesan<\/div>\r\n\r\n<script>\r\n\/\/ ==========================================\r\n\/\/ KONFIGURASI HADIAH & PROBABILITAS \u2014 FLAT\r\n\/\/ (sesuai keputusan: probabilitas sama di setiap spin 1-30)\r\n\/\/ ==========================================\r\nconst PRIZES = {\r\n  grand:    { name: 'Grand Prize',     desc: '6,480 Genesis Crystal',  color: '#d4b16a', icon: '\ud83d\udc51', value: 1600000 },\r\n  welkin:   { name: 'Welkin Moon',     desc: 'Blessing of the Welkin Moon (30 hari)', color: '#9b6dd7', icon: '\ud83c\udf19', value: 75000 },\r\n  voucher5: { name: 'Voucher 5%',      desc: 'Diskon 5% pembelian berikutnya',  color: '#4ec5b4', icon: '\ud83c\udf9f\ufe0f', value: 825 },\r\n  voucher3: { name: 'Voucher 3%',      desc: 'Diskon 3% pembelian berikutnya',  color: '#2d8478', icon: '\ud83c\udfab', value: 495 },\r\n  unlucky:  { name: 'Kurang Beruntung', desc: 'Coba lagi besok, Traveler',  color: '#5a6c70', icon: '\ud83c\udf2b\ufe0f', value: 0 }\r\n};\r\n\r\n\/\/ FLAT probabilities \u2014 sama di setiap spin\r\nconst PROBABILITIES = {\r\n  grand:    0.00005,   \/\/ 0.005%\r\n  welkin:   0.00005,   \/\/ 0.005%\r\n  voucher5: 0.40,      \/\/ 40%\r\n  voucher3: 0.25,      \/\/ 25%\r\n  unlucky:  0.3499     \/\/ 34.99% (sisa)\r\n};\r\n\r\n\/\/ Wheel layout (8 slices, visual)\r\nconst WHEEL_LAYOUT = [\r\n  { id: 'voucher5', label: 'Voucher 5%' },\r\n  { id: 'unlucky',  label: 'Coba Lagi' },\r\n  { id: 'voucher3', label: 'Voucher 3%' },\r\n  { id: 'welkin',   label: 'Welkin' },\r\n  { id: 'voucher5', label: 'Voucher 5%' },\r\n  { id: 'unlucky',  label: 'Coba Lagi' },\r\n  { id: 'voucher3', label: 'Voucher 3%' },\r\n  { id: 'grand',    label: 'GRAND' }\r\n];\r\n\r\n\/\/ Adventure Rank tiers\r\nconst AR_TIERS = [\r\n  { min: 1,   max: 9,   title: 'Wanderer',         color: '#8fa3a8' },\r\n  { min: 10,  max: 24,  title: 'Voyager',          color: '#4ec5b4' },\r\n  { min: 25,  max: 44,  title: 'Pathfinder',       color: '#5b9bd5' },\r\n  { min: 45,  max: 69,  title: 'Archon\\'s Chosen', color: '#9b6dd7' },\r\n  { min: 70,  max: 99,  title: 'Heralded Traveler',color: '#d4b16a' },\r\n  { min: 100, max: 999, title: 'Mythic Traveler',  color: '#f5d488' }\r\n];\r\n\r\n\/\/ ==========================================\r\n\/\/ STATE\r\n\/\/ ==========================================\r\nconst STATE = {\r\n  userName: 'Traveler#1234',\r\n  currentSpin: 1,\r\n  totalSpent: 0,\r\n  history: [],\r\n  isSpinning: false,\r\n  forceResult: null,\r\n  adventureRank: 1,\r\n  monthlyCaps: {\r\n    grand: { max: 1, claimed: 0 },\r\n    welkin: { max: 1, claimed: 0 }\r\n  }\r\n};\r\n\r\n\/\/ ==========================================\r\n\/\/ CODE GENERATION (demo)\r\n\/\/ ==========================================\r\nfunction generateCode() {\r\n  const chars = 'ABCDEFGHJKMNPQRSTUVWXYZ23456789'; \/\/ exclude ambiguous 0,O,1,I,L\r\n  let r1 = '', r2 = '';\r\n  for (let i = 0; i < 4; i++) r1 += chars[Math.floor(Math.random() * chars.length)];\r\n  for (let i = 0; i < 4; i++) r2 += chars[Math.floor(Math.random() * chars.length)];\r\n  return `GENS-${r1}-${r2}`;\r\n}\r\n\r\nfunction refreshCode() {\r\n  document.getElementById('codeInput').value = generateCode();\r\n}\r\n\r\n\/\/ ==========================================\r\n\/\/ PROBABILITY ENGINE (FLAT)\r\n\/\/ ==========================================\r\nfunction drawPrize() {\r\n  \/\/ Dev override\r\n  if (STATE.forceResult) {\r\n    const result = STATE.forceResult;\r\n    STATE.forceResult = null;\r\n    return applyCap(result);\r\n  }\r\n\r\n  const roll = Math.random();\r\n  let cumulative = 0;\r\n  const order = ['grand', 'welkin', 'voucher5', 'voucher3', 'unlucky'];\r\n\r\n  for (const prizeId of order) {\r\n    cumulative += PROBABILITIES[prizeId];\r\n    if (roll < cumulative) {\r\n      return applyCap(prizeId);\r\n    }\r\n  }\r\n  return applyCap('unlucky');\r\n}\r\n\r\n\/\/ CAP SYSTEM: kalau sudah ada 1 winner Grand\/Welkin, redirect ke Voucher 5%\r\nfunction applyCap(prizeId) {\r\n  if (prizeId === 'grand') {\r\n    if (STATE.monthlyCaps.grand.claimed >= STATE.monthlyCaps.grand.max) {\r\n      console.log('[CAP] Grand Prize sudah habis \u2192 redirect ke Voucher 5%');\r\n      return 'voucher5';\r\n    }\r\n    STATE.monthlyCaps.grand.claimed++;\r\n  }\r\n  if (prizeId === 'welkin') {\r\n    if (STATE.monthlyCaps.welkin.claimed >= STATE.monthlyCaps.welkin.max) {\r\n      console.log('[CAP] Welkin sudah habis \u2192 redirect ke Voucher 5%');\r\n      return 'voucher5';\r\n    }\r\n    STATE.monthlyCaps.welkin.claimed++;\r\n  }\r\n  return prizeId;\r\n}\r\n\r\n\/\/ Draw WITHOUT cap (untuk batch testing \u2014 pakai isolated cap)\r\nfunction drawPrizeRaw(localCaps) {\r\n  const roll = Math.random();\r\n  let cumulative = 0;\r\n  const order = ['grand', 'welkin', 'voucher5', 'voucher3', 'unlucky'];\r\n\r\n  for (const prizeId of order) {\r\n    cumulative += PROBABILITIES[prizeId];\r\n    if (roll < cumulative) {\r\n      \/\/ Apply local cap\r\n      if (prizeId === 'grand') {\r\n        if (localCaps.grand.claimed >= localCaps.grand.max) {\r\n          localCaps.grandRedirected++;\r\n          return 'voucher5';\r\n        }\r\n        localCaps.grand.claimed++;\r\n      }\r\n      if (prizeId === 'welkin') {\r\n        if (localCaps.welkin.claimed >= localCaps.welkin.max) {\r\n          localCaps.welkinRedirected++;\r\n          return 'voucher5';\r\n        }\r\n        localCaps.welkin.claimed++;\r\n      }\r\n      return prizeId;\r\n    }\r\n  }\r\n  return 'unlucky';\r\n}\r\n\r\n\/\/ ==========================================\r\n\/\/ WHEEL RENDERING\r\n\/\/ ==========================================\r\nfunction renderWheel() {\r\n  const svg = document.getElementById('wheelSlices');\r\n  svg.innerHTML = '';\r\n  const n = WHEEL_LAYOUT.length;\r\n  const angle = 360 \/ n;\r\n  const cx = 200, cy = 200, r = 196;\r\n\r\n  \/\/ Determine if mobile for shorter labels\r\n  const isMobile = window.innerWidth <= 480;\r\n  const fontSize = isMobile ? 12 : 14;\r\n\r\n  WHEEL_LAYOUT.forEach((slice, i) => {\r\n    const startAngle = i * angle - 90 - angle\/2;\r\n    const endAngle = startAngle + angle;\r\n    const startRad = startAngle * Math.PI \/ 180;\r\n    const endRad = endAngle * Math.PI \/ 180;\r\n\r\n    const x1 = cx + r * Math.cos(startRad);\r\n    const y1 = cy + r * Math.sin(startRad);\r\n    const x2 = cx + r * Math.cos(endRad);\r\n    const y2 = cy + r * Math.sin(endRad);\r\n\r\n    const largeArc = angle > 180 ? 1 : 0;\r\n    const path = `M ${cx} ${cy} L ${x1} ${y1} A ${r} ${r} 0 ${largeArc} 1 ${x2} ${y2} Z`;\r\n    const color = PRIZES[slice.id].color;\r\n\r\n    const pathEl = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'path');\r\n    pathEl.setAttribute('d', path);\r\n    pathEl.setAttribute('fill', color);\r\n    pathEl.setAttribute('stroke', '#0a1419');\r\n    pathEl.setAttribute('stroke-width', '2');\r\n    pathEl.setAttribute('opacity', '0.9');\r\n    svg.appendChild(pathEl);\r\n\r\n    const midAngle = (startAngle + endAngle) \/ 2;\r\n    const midRad = midAngle * Math.PI \/ 180;\r\n    const textR = r * 0.65;\r\n    const tx = cx + textR * Math.cos(midRad);\r\n    const ty = cy + textR * Math.sin(midRad);\r\n\r\n    \/\/ Use shorter label on mobile\r\n    let labelText = slice.label.toUpperCase();\r\n    if (isMobile) {\r\n      const shortLabels = {\r\n        'Voucher 5%': 'V5%',\r\n        'Voucher 3%': 'V3%',\r\n        'Coba Lagi': '\u2014',\r\n        'Welkin': 'WELKIN',\r\n        'GRAND': 'GRAND'\r\n      };\r\n      labelText = shortLabels[slice.label] || slice.label.toUpperCase();\r\n    }\r\n\r\n    const textEl = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'text');\r\n    textEl.setAttribute('x', tx);\r\n    textEl.setAttribute('y', ty);\r\n    textEl.setAttribute('text-anchor', 'middle');\r\n    textEl.setAttribute('dominant-baseline', 'middle');\r\n    textEl.setAttribute('fill', slice.id === 'grand' || slice.id === 'voucher5' ? '#0a1419' : '#f4ead5');\r\n    textEl.setAttribute('font-family', 'Cinzel, serif');\r\n    textEl.setAttribute('font-weight', '700');\r\n    textEl.setAttribute('font-size', fontSize);\r\n    textEl.setAttribute('letter-spacing', '0.05em');\r\n    textEl.setAttribute('transform', `rotate(${midAngle + 90}, ${tx}, ${ty})`);\r\n    textEl.textContent = labelText;\r\n    svg.appendChild(textEl);\r\n\r\n    const dotR = r * 0.92;\r\n    const dotAngleRad = (startAngle + angle\/2) * Math.PI \/ 180;\r\n    const dot = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'circle');\r\n    dot.setAttribute('cx', cx + dotR * Math.cos(dotAngleRad));\r\n    dot.setAttribute('cy', cy + dotR * Math.sin(dotAngleRad));\r\n    dot.setAttribute('r', 3);\r\n    dot.setAttribute('fill', '#f5d488');\r\n    svg.appendChild(dot);\r\n  });\r\n}\r\n\r\nfunction renderPegs() {\r\n  const pegs = document.getElementById('pegs');\r\n  pegs.innerHTML = '';\r\n  const n = WHEEL_LAYOUT.length;\r\n  \/\/ Get actual wheel container size\r\n  const container = document.querySelector('.wheel-container');\r\n  const wheelSize = container ? container.offsetWidth : 480;\r\n  const ringOffset = window.innerWidth <= 480 ? 14 : 24;\r\n  const r = (wheelSize \/ 2) + (ringOffset - 4);\r\n\r\n  for (let i = 0; i < n; i++) {\r\n    const angle = (i * (360\/n) - 90) * Math.PI \/ 180;\r\n    const peg = document.createElement('div');\r\n    peg.className = 'peg';\r\n    peg.style.transform = `translate(${r * Math.cos(angle)}px, ${r * Math.sin(angle)}px) translate(-50%, -50%)`;\r\n    pegs.appendChild(peg);\r\n  }\r\n}\r\n\r\n\/\/ Re-render wheel and pegs on resize (for responsive labels)\r\nlet resizeTimer;\r\nwindow.addEventListener('resize', () => {\r\n  clearTimeout(resizeTimer);\r\n  resizeTimer = setTimeout(() => {\r\n    renderWheel();\r\n    renderPegs();\r\n  }, 200);\r\n});\r\n\r\n\/\/ ==========================================\r\n\/\/ SPIN ANIMATION\r\n\/\/ ==========================================\r\nlet currentRotation = 0;\r\n\r\nfunction spinTo(prizeId) {\r\n  const matchingSlices = WHEEL_LAYOUT\r\n    .map((s, i) => s.id === prizeId ? i : -1)\r\n    .filter(i => i !== -1);\r\n  const sliceIdx = matchingSlices[Math.floor(Math.random() * matchingSlices.length)];\r\n\r\n  const sliceAngle = 360 \/ WHEEL_LAYOUT.length;\r\n  const targetAngle = -sliceIdx * sliceAngle;\r\n  const offset = (Math.random() - 0.5) * sliceAngle * 0.6;\r\n  const fullSpins = 5 + Math.floor(Math.random() * 3);\r\n  currentRotation += fullSpins * 360 + (targetAngle - currentRotation % 360) + offset;\r\n\r\n  const wheel = document.getElementById('wheel');\r\n  wheel.style.transform = `rotate(${currentRotation}deg)`;\r\n  return sliceIdx;\r\n}\r\n\r\n\/\/ ==========================================\r\n\/\/ MAIN SPIN HANDLER\r\n\/\/ ==========================================\r\nfunction initiateSpin() {\r\n  if (STATE.isSpinning) return;\r\n\r\n  const code = document.getElementById('codeInput').value.trim().toUpperCase();\r\n  if (!code) {\r\n    showToast('Masukkan kode raffle terlebih dahulu');\r\n    return;\r\n  }\r\n\r\n  if (!\/^GENS-[A-Z0-9]{4}-[A-Z0-9]{4}$\/.test(code)) {\r\n    showToast('Format kode tidak valid (GENS-XXXX-XXXX)');\r\n    return;\r\n  }\r\n\r\n  if (STATE.currentSpin > 30) {\r\n    showToast('Anda sudah mencapai batas spin bulan ini (30x)');\r\n    return;\r\n  }\r\n\r\n  STATE.isSpinning = true;\r\n  document.getElementById('spinBtn').disabled = true;\r\n\r\n  const prizeId = drawPrize();\r\n  console.log(`[SPIN ${STATE.currentSpin}] Result: ${prizeId}`);\r\n\r\n  spinTo(prizeId);\r\n\r\n  setTimeout(() => {\r\n    finishSpin(prizeId);\r\n  }, 6200);\r\n}\r\n\r\nfunction finishSpin(prizeId) {\r\n  const prize = PRIZES[prizeId];\r\n\r\n  STATE.history.unshift({\r\n    spin: STATE.currentSpin,\r\n    prizeId: prizeId,\r\n    prizeName: prize.name,\r\n    color: prize.color\r\n  });\r\n\r\n  showModal(prizeId);\r\n\r\n  STATE.currentSpin++;\r\n  STATE.totalSpent += 16500;\r\n  STATE.adventureRank = computeAR(STATE.totalSpent);\r\n  STATE.isSpinning = false;\r\n  document.getElementById('spinBtn').disabled = false;\r\n  document.getElementById('codeInput').value = '';\r\n  setTimeout(refreshCode, 100);\r\n\r\n  updateUI();\r\n}\r\n\r\n\/\/ ==========================================\r\n\/\/ ADVENTURE RANK\r\n\/\/ ==========================================\r\nfunction computeAR(spendInRupiah) {\r\n  \/\/ AR = floor(total_spend \/ 50000)\r\n  \/\/ Bonus +5 per full 30 spin month\r\n  \/\/ Bonus +10 per grand\/welkin win\r\n  let baseAR = Math.floor(spendInRupiah \/ 50000);\r\n  \/\/ We don't track months locally; simple approximation\r\n  return Math.max(1, baseAR);\r\n}\r\n\r\nfunction getARTier(ar) {\r\n  for (const tier of AR_TIERS) {\r\n    if (ar >= tier.min && ar <= tier.max) return tier;\r\n  }\r\n  return AR_TIERS[AR_TIERS.length - 1];\r\n}\r\n\r\nfunction getARProgress(ar) {\r\n  const currentTier = getARTier(ar);\r\n  const nextTier = AR_TIERS.find(t => t.min > ar);\r\n\r\n  if (!nextTier) {\r\n    return { percent: 100, text: 'Max tier reached', currentTier };\r\n  }\r\n\r\n  const progress = (ar - currentTier.min) \/ (nextTier.min - currentTier.min);\r\n  return {\r\n    percent: Math.min(100, progress * 100),\r\n    text: `Next: ${nextTier.title} at AR ${nextTier.min}`,\r\n    currentTier\r\n  };\r\n}\r\n\r\n\/\/ ==========================================\r\n\/\/ UI UPDATES\r\n\/\/ ==========================================\r\nfunction updateUI() {\r\n  document.getElementById('currentSpin').textContent = STATE.currentSpin;\r\n  document.getElementById('remainingCodes').textContent = Math.max(0, 30 - STATE.currentSpin + 1);\r\n  document.getElementById('totalSpent').textContent = 'Rp ' + STATE.totalSpent.toLocaleString('id-ID');\r\n  document.getElementById('userName').textContent = STATE.userName;\r\n\r\n  \/\/ Adventure Rank\r\n  document.getElementById('arValue').textContent = STATE.adventureRank;\r\n  const arInfo = getARProgress(STATE.adventureRank);\r\n  document.getElementById('arTitle').textContent = arInfo.currentTier.title;\r\n  document.getElementById('arTitle').style.color = arInfo.currentTier.color;\r\n  document.getElementById('arProgressBar').style.width = arInfo.percent + '%';\r\n  document.getElementById('arProgressText').textContent = arInfo.text;\r\n\r\n  \/\/ Stok\r\n  document.getElementById('grandStock').textContent = STATE.monthlyCaps.grand.max - STATE.monthlyCaps.grand.claimed;\r\n  document.getElementById('welkinStock').textContent = STATE.monthlyCaps.welkin.max - STATE.monthlyCaps.welkin.claimed;\r\n\r\n  \/\/ Prize list dengan probabilitas (flat \u2014 sama di semua spin)\r\n  renderPrizeList();\r\n  renderHistory();\r\n}\r\n\r\nfunction renderPrizeList() {\r\n  const list = document.getElementById('prizeList');\r\n  const order = ['grand', 'welkin', 'voucher5', 'voucher3', 'unlucky'];\r\n  list.innerHTML = order.map(id => {\r\n    const p = PRIZES[id];\r\n    const prob = PROBABILITIES[id];\r\n    let oddsText;\r\n    if (prob < 0.01) {\r\n      oddsText = (prob * 100).toFixed(3) + '%';\r\n    } else {\r\n      oddsText = (prob * 100).toFixed(2) + '%';\r\n    }\r\n    return `\r\n      <div class=\"prize-row\">\r\n        <div class=\"prize-left\">\r\n          <div class=\"prize-dot\" style=\"background: ${p.color}\"><\/div>\r\n          <div>\r\n            <div class=\"prize-name\">${p.icon} ${p.name}<\/div>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"prize-odds\">${oddsText}<\/div>\r\n      <\/div>\r\n    `;\r\n  }).join('');\r\n}\r\n\r\nfunction renderHistory() {\r\n  const list = document.getElementById('historyList');\r\n  if (STATE.history.length === 0) {\r\n    list.innerHTML = '<div class=\"history-empty\">Belum ada spin bulan ini<\/div>';\r\n    return;\r\n  }\r\n  list.innerHTML = STATE.history.slice(0, 10).map(h => `\r\n    <div class=\"history-item\">\r\n      <span class=\"history-spin\">SPIN #${String(h.spin).padStart(2, '0')}<\/span>\r\n      <span class=\"history-prize\" style=\"color: ${h.color}\">${h.prizeName}<\/span>\r\n    <\/div>\r\n  `).join('');\r\n}\r\n\r\n\/\/ ==========================================\r\n\/\/ MODAL\r\n\/\/ ==========================================\r\nfunction showModal(prizeId) {\r\n  const p = PRIZES[prizeId];\r\n  document.getElementById('modalIcon').textContent = p.icon;\r\n  document.getElementById('modalTitle').textContent = p.name;\r\n  document.getElementById('modalDesc').textContent = p.desc;\r\n\r\n  let eyebrow = '\u2014 Hasil Putaran \u2014';\r\n  if (prizeId === 'grand') eyebrow = '\u2726 JACKPOT \u2014 GRAND PRIZE \u2726';\r\n  else if (prizeId === 'welkin') eyebrow = '\u2726 Welkin Winner \u2726';\r\n  else if (prizeId === 'unlucky') eyebrow = '\u2014 Belum Beruntung \u2014';\r\n  document.getElementById('modalEyebrow').textContent = eyebrow;\r\n\r\n  document.getElementById('modal').classList.add('show');\r\n\r\n  if (prizeId === 'grand') triggerCelebration();\r\n}\r\n\r\nfunction closeModal() {\r\n  document.getElementById('modal').classList.remove('show');\r\n}\r\n\r\nfunction showToast(msg, type) {\r\n  const t = document.getElementById('toast');\r\n  t.textContent = msg;\r\n  t.className = 'toast show' + (type === 'success' ? ' success' : '');\r\n  setTimeout(() => t.className = 'toast', 2800);\r\n}\r\n\r\nfunction triggerCelebration() {\r\n  for (let i = 0; i < 30; i++) {\r\n    setTimeout(() => {\r\n      const s = document.createElement('div');\r\n      s.className = 'sparkle';\r\n      s.textContent = '\u2726';\r\n      s.style.left = (Math.random() * 100) + 'vw';\r\n      s.style.top = (Math.random() * 100) + 'vh';\r\n      s.style.animationDelay = (Math.random() * 1) + 's';\r\n      s.style.fontSize = (16 + Math.random() * 20) + 'px';\r\n      document.body.appendChild(s);\r\n      setTimeout(() => s.remove(), 3000);\r\n    }, i * 50);\r\n  }\r\n}\r\n\r\n\/\/ ==========================================\r\n\/\/ TESTING TOOLS\r\n\/\/ ==========================================\r\n\r\n\/\/ Auto spin batch \u2014 runs N simulated spins quickly to verify probability distribution\r\nfunction autoSpin(count) {\r\n  \/\/ Each \"user batch\" of 30 spins uses fresh caps (simulating 1 user\/month)\r\n  \/\/ For larger batches, split into groups of 30 to simulate multiple users\r\n  const usersToSimulate = Math.ceil(count \/ 30);\r\n  const actualSpins = usersToSimulate * 30;\r\n\r\n  const results = { grand: 0, welkin: 0, voucher5: 0, voucher3: 0, unlucky: 0 };\r\n  let totalGrandRedirected = 0;\r\n  let totalWelkinRedirected = 0;\r\n  let totalGrandWinners = 0;\r\n  let totalWelkinWinners = 0;\r\n\r\n  \/\/ For \"1 user\" test (count=30), use single cap\r\n  \/\/ For multi-user simulation, use per-user caps\r\n  \/\/ For \"1 month sim\" (60000), simulate as if 1 single pool of spins competing for 1 grand+welkin\r\n\r\n  if (count <= 30) {\r\n    \/\/ Single user, single cap\r\n    const localCaps = {\r\n      grand: { max: 1, claimed: 0 },\r\n      welkin: { max: 1, claimed: 0 },\r\n      grandRedirected: 0,\r\n      welkinRedirected: 0\r\n    };\r\n    for (let i = 0; i < count; i++) {\r\n      const result = drawPrizeRaw(localCaps);\r\n      results[result]++;\r\n    }\r\n    totalGrandRedirected = localCaps.grandRedirected;\r\n    totalWelkinRedirected = localCaps.welkinRedirected;\r\n    totalGrandWinners = localCaps.grand.claimed;\r\n    totalWelkinWinners = localCaps.welkin.claimed;\r\n  } else {\r\n    \/\/ Multi-user simulation: shared pool of 1 grand + 1 welkin per month\r\n    \/\/ We'll simulate the entire month: ALL spins compete for 1 grand & 1 welkin\r\n    const localCaps = {\r\n      grand: { max: 1, claimed: 0 },\r\n      welkin: { max: 1, claimed: 0 },\r\n      grandRedirected: 0,\r\n      welkinRedirected: 0\r\n    };\r\n    for (let i = 0; i < count; i++) {\r\n      const result = drawPrizeRaw(localCaps);\r\n      results[result]++;\r\n    }\r\n    totalGrandRedirected = localCaps.grandRedirected;\r\n    totalWelkinRedirected = localCaps.welkinRedirected;\r\n    totalGrandWinners = localCaps.grand.claimed;\r\n    totalWelkinWinners = localCaps.welkin.claimed;\r\n  }\r\n\r\n  \/\/ Calculate stats\r\n  const totalSpins = count;\r\n  const revenue = totalSpins * 16500;\r\n  const voucherCost = results.voucher5 * 825 + results.voucher3 * 495;\r\n  const grandCost = totalGrandWinners * 1600000;\r\n  const welkinCost = totalWelkinWinners * 75000;\r\n  const totalCost = voucherCost + grandCost + welkinCost;\r\n  const margin = revenue - totalCost;\r\n\r\n  \/\/ Display\r\n  const div = document.getElementById('batchResult');\r\n  div.style.display = 'block';\r\n  div.innerHTML = `\r\n    <div style=\"color: var(--accent-teal); margin-bottom: 8px;\">\r\n      \u26a1 ${totalSpins.toLocaleString('id-ID')} spin completed\r\n    <\/div>\r\n    <div class=\"batch-stat win-grand\">\r\n      <span>\ud83d\udc51 Grand Prize<\/span>\r\n      <strong>${totalGrandWinners}<\/strong>\r\n    <\/div>\r\n    <div class=\"batch-stat win-welkin\">\r\n      <span>\ud83c\udf19 Welkin<\/span>\r\n      <strong>${totalWelkinWinners}<\/strong>\r\n    <\/div>\r\n    <div class=\"batch-stat\">\r\n      <span>\ud83c\udf9f\ufe0f Voucher 5%<\/span>\r\n      <strong>${results.voucher5.toLocaleString('id-ID')} (${(results.voucher5\/totalSpins*100).toFixed(2)}%)<\/strong>\r\n    <\/div>\r\n    <div class=\"batch-stat\">\r\n      <span>\ud83c\udfab Voucher 3%<\/span>\r\n      <strong>${results.voucher3.toLocaleString('id-ID')} (${(results.voucher3\/totalSpins*100).toFixed(2)}%)<\/strong>\r\n    <\/div>\r\n    <div class=\"batch-stat\">\r\n      <span>\ud83c\udf2b\ufe0f Kurang Beruntung<\/span>\r\n      <strong>${results.unlucky.toLocaleString('id-ID')} (${(results.unlucky\/totalSpins*100).toFixed(2)}%)<\/strong>\r\n    <\/div>\r\n    <div style=\"border-top: 1px dashed rgba(143, 163, 168, 0.2); margin: 8px 0;\"><\/div>\r\n    ${totalGrandRedirected > 0 ? `<div class=\"batch-stat\" style=\"color: var(--orange);\"><span>\u21aa Grand redirect ke V5<\/span><strong>${totalGrandRedirected}<\/strong><\/div>` : ''}\r\n    ${totalWelkinRedirected > 0 ? `<div class=\"batch-stat\" style=\"color: var(--orange);\"><span>\u21aa Welkin redirect ke V5<\/span><strong>${totalWelkinRedirected}<\/strong><\/div>` : ''}\r\n    <div style=\"border-top: 1px dashed rgba(143, 163, 168, 0.2); margin: 8px 0;\"><\/div>\r\n    <div class=\"batch-stat\">\r\n      <span>Revenue<\/span>\r\n      <strong>Rp ${revenue.toLocaleString('id-ID')}<\/strong>\r\n    <\/div>\r\n    <div class=\"batch-stat\">\r\n      <span>Total Payout<\/span>\r\n      <strong>Rp ${totalCost.toLocaleString('id-ID')}<\/strong>\r\n    <\/div>\r\n    <div class=\"batch-stat\" style=\"color: var(--accent-teal);\">\r\n      <span>Margin<\/span>\r\n      <strong>Rp ${margin.toLocaleString('id-ID')} (${(margin\/revenue*100).toFixed(2)}%)<\/strong>\r\n    <\/div>\r\n  `;\r\n  showToast(`${totalSpins.toLocaleString('id-ID')} spin disimulasikan`, 'success');\r\n}\r\n\r\nfunction forceWin(type) {\r\n  STATE.forceResult = type;\r\n  showToast(`Spin berikutnya akan: ${type.toUpperCase()}`, 'success');\r\n}\r\n\r\nfunction resetAll() {\r\n  STATE.currentSpin = 1;\r\n  STATE.totalSpent = 0;\r\n  STATE.history = [];\r\n  STATE.adventureRank = 1;\r\n  STATE.monthlyCaps.grand.claimed = 0;\r\n  STATE.monthlyCaps.welkin.claimed = 0;\r\n  currentRotation = 0;\r\n  document.getElementById('wheel').style.transition = 'none';\r\n  document.getElementById('wheel').style.transform = 'rotate(0deg)';\r\n  setTimeout(() => {\r\n    document.getElementById('wheel').style.transition = '';\r\n  }, 50);\r\n  document.getElementById('batchResult').style.display = 'none';\r\n  updateUI();\r\n  refreshCode();\r\n  showToast('Semua state direset', 'success');\r\n}\r\n\r\nfunction resetCaps() {\r\n  STATE.monthlyCaps.grand.claimed = 0;\r\n  STATE.monthlyCaps.welkin.claimed = 0;\r\n  updateUI();\r\n  showToast('Stok hadiah di-reset (Grand & Welkin tersedia lagi)', 'success');\r\n}\r\n\r\n\/\/ Enter key untuk spin\r\ndocument.getElementById('codeInput').addEventListener('keypress', (e) => {\r\n  if (e.key === 'Enter') initiateSpin();\r\n});\r\n\r\n\/\/ ==========================================\r\n\/\/ INIT\r\n\/\/ ==========================================\r\nrenderWheel();\r\nrenderPegs();\r\nupdateUI();\r\nrefreshCode();\r\n<\/script>\r\n\r\n<\/body>\r\n<\/html>\r\n\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Genshin Raffle \u2014 Lucky Spin (Testable) \u2014 Mondstadt Lucky Draw \u2014 Wheel of Fortune Setiap pembelian Crystal adalah satu kesempatan dari Barbatos Status Traveler Discord Traveler#1234 Spin ke 1 Sisa Kode 30 Total Belanja Rp 0 \u2014 ADVENTURE RANK \u2014 \u2605 1 Wanderer Next: Voyager at AR 10 \u25b6 TESTING TOOLS Auto Spin Batch (uji<\/p>\n","protected":false},"author":33,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"class_list":["post-32769","page","type-page","status-publish"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Elementor #32769 - Blog Lapakgaming<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lapakgaming.com\/blog\/id-id\/elementor-32769\/\" \/>\n<meta property=\"og:locale\" content=\"id_ID\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Elementor #32769 - Blog Lapakgaming\" \/>\n<meta property=\"og:description\" content=\"Genshin Raffle \u2014 Lucky Spin (Testable) \u2014 Mondstadt Lucky Draw \u2014 Wheel of Fortune Setiap pembelian Crystal adalah satu kesempatan dari Barbatos Status Traveler Discord Traveler#1234 Spin ke 1 Sisa Kode 30 Total Belanja Rp 0 \u2014 ADVENTURE RANK \u2014 \u2605 1 Wanderer Next: Voyager at AR 10 \u25b6 TESTING TOOLS Auto Spin Batch (uji\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lapakgaming.com\/blog\/id-id\/elementor-32769\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog Lapakgaming\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-03T10:29:04+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Estimasi waktu membaca\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 menit\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lapakgaming.com\\\/blog\\\/id-id\\\/elementor-32769\\\/\",\"url\":\"https:\\\/\\\/www.lapakgaming.com\\\/blog\\\/id-id\\\/elementor-32769\\\/\",\"name\":\"Elementor #32769 - Blog Lapakgaming\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lapakgaming.com\\\/blog\\\/id-id\\\/#website\"},\"datePublished\":\"2026-06-03T10:28:41+00:00\",\"dateModified\":\"2026-06-03T10:29:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lapakgaming.com\\\/blog\\\/id-id\\\/elementor-32769\\\/#breadcrumb\"},\"inLanguage\":\"id\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lapakgaming.com\\\/blog\\\/id-id\\\/elementor-32769\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lapakgaming.com\\\/blog\\\/id-id\\\/elementor-32769\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lapakgaming.com\\\/blog\\\/id-id\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Elementor #32769\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lapakgaming.com\\\/blog\\\/id-id\\\/#website\",\"url\":\"https:\\\/\\\/www.lapakgaming.com\\\/blog\\\/id-id\\\/\",\"name\":\"Lapakgaming\",\"description\":\"Berita dan Gaming Guides Terlengkap\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lapakgaming.com\\\/blog\\\/id-id\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lapakgaming.com\\\/blog\\\/id-id\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"id\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.lapakgaming.com\\\/blog\\\/id-id\\\/#organization\",\"name\":\"Lapakgaming\",\"url\":\"https:\\\/\\\/www.lapakgaming.com\\\/blog\\\/id-id\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"id\",\"@id\":\"https:\\\/\\\/www.lapakgaming.com\\\/blog\\\/id-id\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/www.lapakgaming.com\\\/blog\\\/id-id\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/logo-lapakgaming.webp?fit=237%2C47&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/www.lapakgaming.com\\\/blog\\\/id-id\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/logo-lapakgaming.webp?fit=237%2C47&ssl=1\",\"width\":237,\"height\":47,\"caption\":\"Lapakgaming\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lapakgaming.com\\\/blog\\\/id-id\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Elementor #32769 - Blog Lapakgaming","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lapakgaming.com\/blog\/id-id\/elementor-32769\/","og_locale":"id_ID","og_type":"article","og_title":"Elementor #32769 - Blog Lapakgaming","og_description":"Genshin Raffle \u2014 Lucky Spin (Testable) \u2014 Mondstadt Lucky Draw \u2014 Wheel of Fortune Setiap pembelian Crystal adalah satu kesempatan dari Barbatos Status Traveler Discord Traveler#1234 Spin ke 1 Sisa Kode 30 Total Belanja Rp 0 \u2014 ADVENTURE RANK \u2014 \u2605 1 Wanderer Next: Voyager at AR 10 \u25b6 TESTING TOOLS Auto Spin Batch (uji","og_url":"https:\/\/www.lapakgaming.com\/blog\/id-id\/elementor-32769\/","og_site_name":"Blog Lapakgaming","article_modified_time":"2026-06-03T10:29:04+00:00","twitter_card":"summary_large_image","twitter_misc":{"Estimasi waktu membaca":"1 menit"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lapakgaming.com\/blog\/id-id\/elementor-32769\/","url":"https:\/\/www.lapakgaming.com\/blog\/id-id\/elementor-32769\/","name":"Elementor #32769 - Blog Lapakgaming","isPartOf":{"@id":"https:\/\/www.lapakgaming.com\/blog\/id-id\/#website"},"datePublished":"2026-06-03T10:28:41+00:00","dateModified":"2026-06-03T10:29:04+00:00","breadcrumb":{"@id":"https:\/\/www.lapakgaming.com\/blog\/id-id\/elementor-32769\/#breadcrumb"},"inLanguage":"id","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lapakgaming.com\/blog\/id-id\/elementor-32769\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lapakgaming.com\/blog\/id-id\/elementor-32769\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lapakgaming.com\/blog\/id-id\/"},{"@type":"ListItem","position":2,"name":"Elementor #32769"}]},{"@type":"WebSite","@id":"https:\/\/www.lapakgaming.com\/blog\/id-id\/#website","url":"https:\/\/www.lapakgaming.com\/blog\/id-id\/","name":"Lapakgaming","description":"Berita dan Gaming Guides Terlengkap","publisher":{"@id":"https:\/\/www.lapakgaming.com\/blog\/id-id\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lapakgaming.com\/blog\/id-id\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"id"},{"@type":"Organization","@id":"https:\/\/www.lapakgaming.com\/blog\/id-id\/#organization","name":"Lapakgaming","url":"https:\/\/www.lapakgaming.com\/blog\/id-id\/","logo":{"@type":"ImageObject","inLanguage":"id","@id":"https:\/\/www.lapakgaming.com\/blog\/id-id\/#\/schema\/logo\/image\/","url":"https:\/\/i0.wp.com\/www.lapakgaming.com\/blog\/id-id\/wp-content\/uploads\/2022\/08\/logo-lapakgaming.webp?fit=237%2C47&ssl=1","contentUrl":"https:\/\/i0.wp.com\/www.lapakgaming.com\/blog\/id-id\/wp-content\/uploads\/2022\/08\/logo-lapakgaming.webp?fit=237%2C47&ssl=1","width":237,"height":47,"caption":"Lapakgaming"},"image":{"@id":"https:\/\/www.lapakgaming.com\/blog\/id-id\/#\/schema\/logo\/image\/"}}]}},"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.lapakgaming.com\/blog\/id-id\/wp-json\/wp\/v2\/pages\/32769","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lapakgaming.com\/blog\/id-id\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lapakgaming.com\/blog\/id-id\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lapakgaming.com\/blog\/id-id\/wp-json\/wp\/v2\/users\/33"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lapakgaming.com\/blog\/id-id\/wp-json\/wp\/v2\/comments?post=32769"}],"version-history":[{"count":0,"href":"https:\/\/www.lapakgaming.com\/blog\/id-id\/wp-json\/wp\/v2\/pages\/32769\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.lapakgaming.com\/blog\/id-id\/wp-json\/wp\/v2\/media?parent=32769"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}