{"id":8218,"date":"2026-06-21T06:16:57","date_gmt":"2026-06-21T06:16:57","guid":{"rendered":"https:\/\/www.sanjuanito.com.mx\/online-wine-calculator\/"},"modified":"2026-06-23T05:22:19","modified_gmt":"2026-06-23T05:22:19","slug":"online-wine-calculator","status":"publish","type":"page","link":"https:\/\/www.sanjuanito.com.mx\/en\/online-wine-calculator\/","title":{"rendered":"Online Wine Calculator for Events"},"content":{"rendered":"<script type=\"application\/ld+json\">\n  {\n    \"@context\": \"https:\/\/schema.org\",\n    \"@type\": \"WebApplication\",\n    \"name\": \"Online wine calculator\",\n    \"applicationCategory\": \"LifestyleApplication\",\n    \"operatingSystem\": \"Web\",\n    \"description\": \"Online wine calculator to estimate bottles, cases and glasses per person for gatherings, dinners, weddings and events. Includes online sommelier-style pairing recommendations.\",\n    \"publisher\": {\n      \"@type\": \"Organization\",\n      \"name\": \"San Juanito\"\n    }\n  }\n  <\/script>\n<script type=\"application\/ld+json\">\n  {\n    \"@context\": \"https:\/\/schema.org\",\n    \"@type\": \"FAQPage\",\n    \"mainEntity\": [\n      {\n        \"@type\": \"Question\",\n        \"name\": \"How do I calculate wine for a gathering?\",\n        \"acceptedAnswer\": {\n          \"@type\": \"Answer\",\n          \"text\": \"Think in glasses. If each guest has 2 glasses and one bottle serves about 5 glasses, a 15-person gathering needs about 6 bottles before adding a margin. Adjust for duration, weather, food and whether there will be other drinks.\"\n        }\n      },\n      {\n        \"@type\": \"Question\",\n        \"name\": \"How many bottles of wine do I need for 12 or 15 people?\",\n        \"acceptedAnswer\": {\n          \"@type\": \"Answer\",\n          \"text\": \"For a lunch or dinner with 12-15 people, 3-6 bottles is usually a good starting point if wine consumption is moderate and other drinks are available. If wine is the main drink or the gathering is long, the number may go up.\"\n        }\n      },\n      {\n        \"@type\": \"Question\",\n        \"name\": \"How many bottles of wine do I need for 100 people?\",\n        \"acceptedAnswer\": {\n          \"@type\": \"Answer\",\n          \"text\": \"A 100-person event is often around 30 to 40 bottles if wine accompanies the meal. If wine is the main drink, the event is long or there is a welcome toast, it can rise to 50-60 bottles.\"\n        }\n      },\n      {\n        \"@type\": \"Question\",\n        \"name\": \"Should I buy only red wine?\",\n        \"acceptedAnswer\": {\n          \"@type\": \"Answer\",\n          \"text\": \"Not always. Red wine can be delicious, but weather, timing, menu and texture matter. In warm weather, chilled whites, ros\u00e9s and sparkling wines usually work better; at night or with meats, sauces and grilled food, reds have more room to shine.\"\n        }\n      },\n      {\n        \"@type\": \"Question\",\n        \"name\": \"What wine goes with Mexican food?\",\n        \"acceptedAnswer\": {\n          \"@type\": \"Answer\",\n          \"text\": \"Mexican food is very diverse. Pozole can pair with sparkling wine, mole with fruit-forward reds, tacos al pastor or grilled fish with ros\u00e9, cochinita pibil with very cold ros\u00e9 or a young red, and birria with a fruity red.\"\n        }\n      },\n      {\n        \"@type\": \"Question\",\n        \"name\": \"What quick tips help with wine pairing?\",\n        \"acceptedAnswer\": {\n          \"@type\": \"Answer\",\n          \"text\": \"Pair by complement or contrast. Acidity refreshes fatty or acidic dishes, a touch of sweetness helps with spice, tannins work better with fat and protein, and serving temperature matters because higher alcohol feels warmer.\"\n        }\n      },\n      {\n        \"@type\": \"Question\",\n        \"name\": \"Does this work as an online sommelier?\",\n        \"acceptedAnswer\": {\n          \"@type\": \"Answer\",\n          \"text\": \"Yes. Besides calculating bottles, it works as an online sommelier guide to choose wine styles based on menu, weather, timing, texture, intensity and type of gathering.\"\n        }\n      },\n      {\n        \"@type\": \"Question\",\n        \"name\": \"How should I plan responsible consumption?\",\n        \"acceptedAnswer\": {\n          \"@type\": \"Answer\",\n          \"text\": \"Enjoy wine with food, water and pace. Alternating wine with still or sparkling water helps the gathering feel better. If consumption was higher than expected, the responsible choice is not to drive.\"\n        }\n      }\n    ]\n  }\n  <\/script>\n<style>\n    .sj-winecalc {\n      --sj-ink: #15110f;\n      --sj-text: #2c2420;\n      --sj-muted: #766d65;\n      --sj-paper: #fffdf8;\n      --sj-cream: #f7f3ea;\n      --sj-line: #d8cec2;\n      --sj-wine: #4b0f22;\n      --sj-red: #a61e35;\n      --sj-earth: #8a6a3f;\n      --sj-green: #456b45;\n      --sj-shadow: 0 18px 52px rgba(21, 17, 15, .12);\n      --sj-radius: 8px;\n      color: var(--sj-text);\n      background: var(--sj-paper);\n      font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n    }\n\n    .sj-winecalc * { box-sizing: border-box; }\n    .sj-winecalc a { color: inherit; }\n    .sj-wc-wrap { width: min(1160px, 92vw); margin: 0 auto; }\n\n    .sj-wc-hero {\n      position: relative;\n      min-height: 90vh;\n      overflow: hidden;\n      background:\n        linear-gradient(120deg, rgba(75, 15, 34, .94), rgba(21, 17, 15, .97) 46%, rgba(21, 17, 15, .92)),\n        var(--sj-ink);\n      display: grid;\n      align-items: start;\n      padding: 72px 0 42px;\n    }\n\n    .sj-wc-hero-grid {\n      position: relative;\n      z-index: 1;\n      display: grid;\n      grid-template-columns: minmax(0, .84fr) minmax(470px, 1.16fr);\n      gap: 36px;\n      align-items: start;\n    }\n\n    .sj-wc-kicker {\n      color: #f2d6a3;\n      font-size: 12px;\n      font-weight: 900;\n      letter-spacing: .15em;\n      text-transform: uppercase;\n      margin: 0 0 16px;\n    }\n\n    .sj-wc-h1,\n    .sj-wc-h2,\n    .sj-wc-result-number {\n      font-family: \"Playfair Display\", Georgia, \"Times New Roman\", serif;\n      letter-spacing: 0;\n    }\n\n    .sj-winecalc .sj-wc-h1 {\n      color: #fffdf8 !important;\n      font-size: clamp(42px, 5.4vw, 70px);\n      line-height: .96;\n      font-weight: 600;\n      margin: 0;\n      max-width: 760px;\n      text-shadow: 0 3px 22px rgba(0, 0, 0, .58);\n    }\n\n    .sj-wc-lead {\n      color: #f8ead7;\n      font-size: clamp(16px, 1.55vw, 20px);\n      line-height: 1.5;\n      margin: 18px 0 0;\n      max-width: 650px;\n    }\n\n    .sj-wc-proof {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 10px;\n      margin-top: 26px;\n      padding: 0;\n      list-style: none;\n    }\n\n    .sj-wc-chip {\n      display: inline-flex;\n      align-items: center;\n      min-height: 34px;\n      border: 1px solid rgba(255, 253, 248, .34);\n      background: rgba(255, 253, 248, .12);\n      color: #fff7e8;\n      border-radius: 999px;\n      padding: 7px 12px;\n      font-size: 13px;\n      font-weight: 800;\n      backdrop-filter: blur(8px);\n    }\n\n    .sj-wc-tldr {\n      max-width: 620px;\n      margin-top: 20px;\n      padding: 14px 16px;\n      border: 1px solid rgba(255, 253, 248, .28);\n      border-radius: var(--sj-radius);\n      background: rgba(255, 253, 248, .1);\n      color: #fff7e8;\n      line-height: 1.48;\n      font-size: 14px;\n      backdrop-filter: blur(8px);\n    }\n\n    .sj-wc-tldr strong {\n      display: block;\n      color: #f2d6a3;\n      font-size: 12px;\n      font-weight: 900;\n      letter-spacing: .12em;\n      text-transform: uppercase;\n      margin-bottom: 6px;\n    }\n\n    .sj-wc-visual {\n      position: relative;\n      margin-top: 22px;\n      height: 260px;\n      border: 1px solid rgba(255, 253, 248, .24);\n      border-radius: var(--sj-radius);\n      overflow: hidden;\n      background: #241915;\n      box-shadow: 0 24px 60px rgba(0, 0, 0, .28);\n    }\n\n    .sj-wc-visual img {\n      width: 100%;\n      height: 100%;\n      object-fit: cover;\n      display: block;\n    }\n\n    .sj-wc-visual figcaption {\n      position: absolute;\n      left: 14px;\n      right: 14px;\n      bottom: 14px;\n      color: #fffdf8;\n      font-size: 12px;\n      font-weight: 850;\n      letter-spacing: .08em;\n      text-transform: uppercase;\n      text-shadow: 0 2px 14px rgba(0, 0, 0, .65);\n    }\n\n    .sj-wc-visual figcaption.sj-wc-sr-only {\n      position: absolute;\n      width: 1px;\n      height: 1px;\n      padding: 0;\n      margin: -1px;\n      overflow: hidden;\n      clip: rect(0, 0, 0, 0);\n      white-space: nowrap;\n      border: 0;\n    }\n\n    .sj-wc-tool {\n      background: rgba(255, 253, 248, .96);\n      border: 1px solid rgba(255, 253, 248, .52);\n      border-radius: var(--sj-radius);\n      box-shadow: var(--sj-shadow);\n      overflow: hidden;\n    }\n\n    .sj-wc-tool-head {\n      padding: 22px 24px 18px;\n      border-bottom: 1px solid var(--sj-line);\n      background: linear-gradient(180deg, #fffdf8, #f7f3ea);\n    }\n\n    .sj-wc-tool-title {\n      margin: 0;\n      color: var(--sj-wine);\n      font-size: 24px;\n      line-height: 1.1;\n      font-family: \"Playfair Display\", Georgia, \"Times New Roman\", serif;\n      font-weight: 700;\n    }\n\n    .sj-wc-tool-subtitle {\n      color: var(--sj-muted);\n      line-height: 1.5;\n      margin: 8px 0 0;\n      font-size: 14px;\n    }\n\n    .sj-wc-form {\n      display: grid;\n      gap: 18px;\n      padding: 22px 24px 24px;\n    }\n\n    .sj-wc-field {\n      display: grid;\n      gap: 9px;\n    }\n\n    .sj-wc-field[hidden] {\n      display: none !important;\n    }\n\n    .sj-wc-label-row {\n      display: flex;\n      align-items: baseline;\n      justify-content: space-between;\n      gap: 12px;\n    }\n\n    .sj-wc-label {\n      color: var(--sj-ink);\n      font-size: 13px;\n      font-weight: 900;\n    }\n\n    .sj-wc-hint {\n      color: var(--sj-muted);\n      font-size: 12px;\n      line-height: 1.35;\n    }\n\n    .sj-wc-input,\n    .sj-wc-select,\n    .sj-wc-textarea {\n      width: 100%;\n      min-height: 46px;\n      border: 1px solid var(--sj-line);\n      border-radius: var(--sj-radius);\n      background: #fff;\n      color: var(--sj-ink);\n      font: inherit;\n      font-weight: 750;\n      padding: 11px 12px;\n      outline: none;\n    }\n\n    .sj-wc-input:focus,\n    .sj-wc-select:focus,\n    .sj-wc-textarea:focus {\n      border-color: var(--sj-red);\n      box-shadow: 0 0 0 3px rgba(166, 30, 53, .12);\n    }\n\n    .sj-wc-textarea {\n      min-height: 84px;\n      resize: vertical;\n      line-height: 1.4;\n      font-weight: 650;\n    }\n\n    .sj-wc-select:invalid,\n    .sj-wc-input:placeholder-shown,\n    .sj-wc-textarea::placeholder {\n      color: #9a9188;\n    }\n\n    .sj-wc-stepper {\n      display: grid;\n      grid-template-columns: 46px minmax(0, 1fr) 46px;\n      gap: 8px;\n      align-items: center;\n    }\n\n    .sj-wc-iconbtn {\n      width: 46px;\n      height: 46px;\n      border: 1px solid var(--sj-line);\n      background: var(--sj-cream);\n      color: var(--sj-wine);\n      border-radius: var(--sj-radius);\n      font-size: 24px;\n      line-height: 1;\n      cursor: pointer;\n    }\n\n    .sj-wc-iconbtn:hover { background: #efe3d1; }\n\n    .sj-wc-segments {\n      display: grid;\n      grid-template-columns: repeat(3, 1fr);\n      gap: 8px;\n    }\n\n    .sj-wc-segments.two { grid-template-columns: repeat(2, 1fr); }\n    .sj-wc-segments.four { grid-template-columns: repeat(auto-fit, minmax(118px, 1fr)); }\n\n    .sj-wc-segment {\n      min-height: 50px;\n      height: 50px;\n      border: 1px solid var(--sj-line);\n      border-radius: var(--sj-radius);\n      background: #fff;\n      color: var(--sj-text);\n      font: inherit;\n      font-size: 13px;\n      font-weight: 850;\n      cursor: pointer;\n      padding: 8px 8px;\n      line-height: 1.15;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      gap: 6px;\n      width: 100%;\n    }\n\n    .sj-wc-segment small {\n      color: inherit;\n      display: block;\n      font-size: 10px;\n      font-weight: 900;\n      letter-spacing: .08em;\n      opacity: .75;\n      text-transform: uppercase;\n    }\n\n    .sj-wc-segment[aria-pressed=\"true\"] {\n      background: var(--sj-wine);\n      border-color: var(--sj-wine);\n      color: #fffdf8;\n    }\n\n    .sj-wc-grid-2 {\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n      gap: 14px;\n    }\n\n    .sj-wc-results {\n      background: var(--sj-cream);\n      border-top: 1px solid var(--sj-line);\n      padding: 24px;\n    }\n\n    .sj-wc-result-main {\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n      gap: 14px;\n    }\n\n    .sj-wc-result-box {\n      background: #fffdf8;\n      border: 1px solid var(--sj-line);\n      border-radius: 8px;\n      padding: 16px;\n    }\n\n    .sj-wc-result-label {\n      color: var(--sj-muted);\n      font-size: 12px;\n      font-weight: 900;\n      text-transform: uppercase;\n      letter-spacing: .08em;\n      margin: 0 0 6px;\n    }\n\n    .sj-wc-result-number {\n      color: var(--sj-wine);\n      font-size: 42px;\n      line-height: .95;\n      margin: 0;\n    }\n\n    .sj-wc-result-copy {\n      color: var(--sj-muted);\n      font-size: 13px;\n      line-height: 1.45;\n      margin: 7px 0 0;\n    }\n\n    .sj-wc-breakdown {\n      display: grid;\n      gap: 9px;\n      margin-top: 16px;\n    }\n\n    .sj-wc-breakdown-row {\n      display: grid;\n      grid-template-columns: 104px minmax(0, 1fr) 58px;\n      align-items: center;\n      gap: 10px;\n      color: var(--sj-text);\n      font-size: 13px;\n      font-weight: 800;\n    }\n\n    .sj-wc-bar {\n      height: 10px;\n      border-radius: 999px;\n      background: #eadfce;\n      overflow: hidden;\n    }\n\n    .sj-wc-bar > span {\n      display: block;\n      height: 100%;\n      width: 0;\n      background: var(--sj-red);\n      border-radius: inherit;\n      transition: width .2s ease;\n    }\n\n    .sj-wc-breakdown-row:nth-child(2) .sj-wc-bar > span { background: #c97a89; }\n    .sj-wc-breakdown-row:nth-child(3) .sj-wc-bar > span { background: var(--sj-earth); }\n\n    .sj-wc-pairing {\n      margin-top: 16px;\n      background: #fffdf8;\n      border: 1px solid var(--sj-line);\n      border-radius: 8px;\n      padding: 16px;\n    }\n\n    .sj-wc-pairing h3 {\n      margin: 0 0 8px;\n      color: var(--sj-wine);\n      font-family: Georgia, \"Times New Roman\", serif;\n      font-size: 23px;\n      line-height: 1.1;\n    }\n\n    .sj-wc-pairing p {\n      color: var(--sj-muted);\n      line-height: 1.55;\n      margin: 0;\n      font-size: 14px;\n    }\n\n    .sj-wc-info-list {\n      display: grid;\n      gap: 10px;\n    }\n\n    .sj-wc-info-item {\n      display: grid;\n      grid-template-columns: 130px minmax(0, 1fr);\n      gap: 10px;\n      align-items: start;\n      color: var(--sj-muted);\n      line-height: 1.35;\n      font-size: 14px;\n    }\n\n    .sj-wc-info-item strong {\n      color: var(--sj-wine);\n      font-size: 12px;\n      line-height: 1.25;\n      text-transform: uppercase;\n    }\n\n    .sj-wc-pairing-list {\n      display: grid;\n      gap: 12px;\n      margin-top: 12px;\n    }\n\n    .sj-wc-pairing-card {\n      border: 1px solid #eadfce;\n      border-radius: 8px;\n      padding: 12px;\n      background: #fffaf1;\n    }\n\n    .sj-wc-pairing-card h4 {\n      margin: 0 0 8px;\n      color: var(--sj-text);\n      font-size: 15px;\n      line-height: 1.25;\n    }\n\n    .sj-wc-pairing-card h4 span {\n      color: var(--sj-muted);\n      font-weight: 700;\n    }\n\n    .sj-wc-pairing-context {\n      margin: -2px 0 10px;\n      color: var(--sj-muted);\n      font-size: 13px;\n      line-height: 1.35;\n    }\n\n    .sj-wc-pairing-options {\n      display: grid;\n      gap: 7px;\n    }\n\n    .sj-wc-pairing-option {\n      display: grid;\n      grid-template-columns: 128px minmax(0, 1fr);\n      gap: 8px;\n      color: var(--sj-muted);\n      font-size: 13px;\n      line-height: 1.35;\n    }\n\n    .sj-wc-pairing-option strong {\n      color: var(--sj-wine);\n      font-size: 12px;\n      text-transform: uppercase;\n    }\n\n    .sj-wc-actions {\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n      gap: 10px;\n      margin-top: 16px;\n    }\n\n    .sj-wc-btn {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      gap: 9px;\n      min-height: 48px;\n      border-radius: 8px;\n      padding: 12px 16px;\n      border: 1px solid var(--sj-wine);\n      text-decoration: none;\n      font-weight: 900;\n      cursor: pointer;\n      text-align: center;\n    }\n\n    .sj-wc-btn svg {\n      width: 20px;\n      height: 20px;\n      flex: 0 0 auto;\n    }\n\n    .sj-wc-btn.primary {\n      background: var(--sj-wine);\n      color: #fffdf8;\n    }\n\n    .sj-wc-btn.secondary {\n      background: transparent;\n      color: var(--sj-wine);\n    }\n\n    .sj-wc-btn.whatsapp {\n      background: #25d366;\n      border-color: #1fb457;\n      color: #fff;\n      box-shadow: 0 8px 18px rgba(37, 211, 102, .22);\n    }\n\n    .sj-wc-btn.amazon {\n      background: #ff9900;\n      border-color: #e38600;\n      color: #201a12;\n      box-shadow: 0 8px 18px rgba(255, 153, 0, .22);\n    }\n\n    .sj-wc-btn.visit {\n      background: #73262f;\n      border-color: #591c23;\n      color: #fffdf8;\n      box-shadow: 0 8px 18px rgba(115, 38, 47, .22);\n    }\n\n    .sj-wc-btn.whatsapp:hover { background: #20bd5a; }\n    .sj-wc-btn.amazon:hover { background: #f08f00; }\n    .sj-wc-btn.visit:hover { background: #591c23; }\n\n    .sj-wc-lead-form {\n      display: grid;\n      grid-template-columns: minmax(0, 1fr) auto;\n      gap: 10px;\n      margin-top: 16px;\n      align-items: end;\n    }\n\n    .sj-wc-lead-form .sj-wc-field { gap: 7px; }\n\n    .sj-wc-consent {\n      display: flex;\n      grid-column: 1 \/ -1;\n      align-items: flex-start;\n      gap: 9px;\n      color: var(--sj-muted);\n      font-size: 12px;\n      line-height: 1.4;\n      font-weight: 650;\n    }\n\n    .sj-wc-consent input {\n      width: 16px;\n      height: 16px;\n      margin: 1px 0 0;\n      accent-color: var(--sj-wine);\n      flex: 0 0 auto;\n    }\n\n    .sj-wc-lead-status {\n      grid-column: 1 \/ -1;\n      color: var(--sj-muted);\n      font-size: 12px;\n      line-height: 1.4;\n      min-height: 18px;\n      margin: 0;\n    }\n\n    .sj-wc-lead-status.ok { color: var(--sj-green); }\n    .sj-wc-lead-status.error { color: var(--sj-red); }\n\n    .sj-wc-course-grid {\n      display: grid;\n      gap: 10px;\n    }\n\n    .sj-wc-course-grid[hidden] { display: none; }\n\n    .sj-wc-empty-result {\n      border: 1px dashed var(--sj-line);\n      border-radius: 8px;\n      padding: 16px;\n      background: rgba(255, 253, 248, .66);\n      color: var(--sj-muted);\n      font-size: 14px;\n      line-height: 1.5;\n      font-weight: 650;\n    }\n\n    .sj-wc-section {\n      padding: 72px 0;\n      background: var(--sj-paper);\n    }\n\n    .sj-wc-section.alt { background: var(--sj-cream); }\n\n    .sj-wc-section-head {\n      max-width: 840px;\n      margin-bottom: 28px;\n    }\n\n    .sj-wc-eyebrow {\n      color: var(--sj-earth);\n      font-size: 12px;\n      font-weight: 900;\n      letter-spacing: .14em;\n      text-transform: uppercase;\n      margin: 0 0 12px;\n    }\n\n    .sj-wc-h2 {\n      color: var(--sj-wine);\n      font-size: clamp(31px, 4.2vw, 54px);\n      line-height: 1.04;\n      margin: 0;\n    }\n\n    .sj-wc-section-copy {\n      color: var(--sj-muted);\n      font-size: 18px;\n      line-height: 1.68;\n      margin: 16px 0 0;\n    }\n\n    .sj-wc-info-grid {\n      display: grid;\n      grid-template-columns: repeat(3, 1fr);\n      gap: 16px;\n    }\n\n    .sj-wc-info {\n      border: 1px solid var(--sj-line);\n      background: #fffdf8;\n      border-radius: 8px;\n      padding: 22px;\n    }\n\n    .sj-wc-info h3 {\n      color: var(--sj-ink);\n      font-size: 18px;\n      line-height: 1.2;\n      margin: 0 0 9px;\n    }\n\n    .sj-wc-info p {\n      color: var(--sj-muted);\n      line-height: 1.6;\n      margin: 0;\n      font-size: 15px;\n    }\n\n    .sj-wc-link-grid {\n      display: grid;\n      grid-template-columns: repeat(4, 1fr);\n      gap: 12px;\n      margin-top: 20px;\n    }\n\n    .sj-wc-link-card {\n      display: block;\n      border: 1px solid var(--sj-line);\n      background: #fffdf8;\n      border-radius: 8px;\n      padding: 16px;\n      color: var(--sj-ink);\n      text-decoration: none;\n      transition: border-color .2s ease, transform .2s ease;\n    }\n\n    .sj-wc-link-card:hover,\n    .sj-wc-link-card:focus {\n      border-color: var(--sj-wine);\n      transform: translateY(-1px);\n      outline: none;\n    }\n\n    .sj-wc-link-card strong {\n      display: block;\n      color: var(--sj-wine);\n      font-size: 15px;\n      line-height: 1.25;\n      margin-bottom: 5px;\n    }\n\n    .sj-wc-link-card span {\n      display: block;\n      color: var(--sj-muted);\n      font-size: 13px;\n      line-height: 1.45;\n    }\n\n    .sj-wc-rules {\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n      gap: 16px;\n      margin-top: 18px;\n    }\n\n    .sj-wc-rulebox {\n      border: 1px solid var(--sj-line);\n      background: #fffdf8;\n      border-radius: 8px;\n      padding: 20px;\n    }\n\n    .sj-wc-rulebox h3 {\n      margin: 0 0 10px;\n      color: var(--sj-wine);\n      font-family: Georgia, \"Times New Roman\", serif;\n      font-size: 24px;\n      line-height: 1.1;\n    }\n\n    .sj-wc-rulebox ul {\n      margin: 0;\n      padding-left: 18px;\n      color: var(--sj-muted);\n      line-height: 1.65;\n    }\n\n    .sj-wc-rulebox li + li { margin-top: 6px; }\n\n    .sj-wc-responsible {\n      border-color: rgba(69, 107, 69, .35);\n      background: #f6faf3;\n    }\n\n    .sj-wc-faq details {\n      border: 1px solid var(--sj-line);\n      background: #fffdf8;\n      border-radius: 8px;\n      padding: 18px 20px;\n      margin: 12px 0;\n    }\n\n    .sj-wc-faq summary {\n      cursor: pointer;\n      color: var(--sj-ink);\n      font-weight: 900;\n    }\n\n    .sj-wc-faq p {\n      color: var(--sj-muted);\n      line-height: 1.65;\n      margin: 12px 0 0;\n    }\n\n    @media (max-width: 980px) {\n      .sj-wc-hero { min-height: auto; padding: 44px 0 36px; }\n      .sj-wc-hero-grid { grid-template-columns: 1fr; }\n      .sj-wc-lead { max-width: none; }\n      .sj-wc-tool { max-width: 680px; }\n      .sj-wc-info-grid { grid-template-columns: 1fr; }\n      .sj-wc-link-grid { grid-template-columns: repeat(2, 1fr); }\n      .sj-wc-visual { max-width: 680px; }\n    }\n\n    @media (max-width: 640px) {\n      .sj-wc-wrap { width: min(100% - 28px, 1160px); }\n      .sj-wc-hero { padding: 32px 0 28px; }\n      .sj-wc-kicker { font-size: 11px; margin-bottom: 12px; }\n      .sj-winecalc .sj-wc-h1 {\n        color: #fffdf8 !important;\n        font-size: clamp(36px, 11.6vw, 48px);\n        line-height: 1;\n        text-shadow: 0 3px 20px rgba(0, 0, 0, .68);\n      }\n      .sj-wc-lead { font-size: 16px; line-height: 1.45; margin-top: 14px; }\n      .sj-wc-tldr { font-size: 13px; line-height: 1.45; padding: 12px 14px; }\n      .sj-wc-visual { height: 190px; margin-top: 16px; }\n      .sj-wc-proof { margin-top: 16px; gap: 8px; }\n      .sj-wc-chip { min-height: 30px; font-size: 12px; padding: 6px 10px; }\n      .sj-wc-tool-head,\n      .sj-wc-form,\n      .sj-wc-results { padding-left: 16px; padding-right: 16px; }\n      .sj-wc-grid-2,\n      .sj-wc-result-main,\n      .sj-wc-actions,\n      .sj-wc-lead-form,\n      .sj-wc-rules,\n      .sj-wc-link-grid { grid-template-columns: 1fr; }\n      .sj-wc-segments,\n      .sj-wc-segments.four { grid-template-columns: 1fr 1fr; }\n      .sj-wc-segments.two { grid-template-columns: 1fr 1fr; }\n      .sj-wc-segment { font-size: 12px; min-height: 50px; height: 50px; }\n      .sj-wc-breakdown-row { grid-template-columns: 100px minmax(0, 1fr) 46px; }\n      .sj-wc-info-item { grid-template-columns: 1fr; gap: 3px; }\n      .sj-wc-pairing-option { grid-template-columns: 1fr; gap: 2px; }\n      .sj-wc-section { padding: 48px 0; }\n    }\n  \n<\/style>\n<main class=\"sj-winecalc\" data-sj-winecalc>\n    <section class=\"sj-wc-hero\">\n      <div class=\"sj-wc-wrap sj-wc-hero-grid\">\n        <div>\n          <p class=\"sj-wc-kicker\">San Juanito \u00b7 Valle de Bernal<\/p>\n          <h1 class=\"sj-wc-h1\">Online wine calculator for gatherings and events<\/h1>\n          <p class=\"sj-wc-lead\">Estimate how many bottles to buy based on guests, duration, expected consumption and menu. You also get an online sommelier-style pairing recommendation for dinner at home, a family meal, a gathering with friends, a wedding or an event.<\/p>\n          <div class=\"sj-wc-tldr\">\n            <strong>TL;DR<\/strong>\n            To calculate wine for a gathering, start with glasses per person, adjust for duration and convert to bottles. This online wine calculator estimates how much to buy for dinners, family meals, gatherings with friends, weddings and events, with a safety margin and an online sommelier that suggests pairings by course.\n          <\/div>\n          <figure class=\"sj-wc-visual\">\n            <img decoding=\"async\" src=\"https:\/\/www.sanjuanito.com.mx\/wp-content\/uploads\/2026\/06\/vinos-sanjuanito-hero.jpg\" alt=\"San Juanito red, ros\u00e9 and sparkling ros\u00e9 wines for dinners, gatherings and events\" title=\"San Juanito wines for dinners, gatherings and events\">\n            <figcaption class=\"sj-wc-sr-only\">San Juanito red, ros\u00e9 and sparkling ros\u00e9 wines for gatherings, dinners and events.<\/figcaption>\n          <\/figure>\n          <ul class=\"sj-wc-proof\">\n            <li class=\"sj-wc-chip\">Online wine calculator<\/li>\n            <li class=\"sj-wc-chip\">Calculate glasses per person<\/li>\n            <li class=\"sj-wc-chip\">Online sommelier for wine pairing<\/li>\n            <li class=\"sj-wc-chip\">Valle de Bernal, Quer\u00e9taro<\/li>\n            <li class=\"sj-wc-chip\">150+ medallas internacionales<\/li>\n            <li class=\"sj-wc-chip\">Productor carbono neutral<\/li>\n          <\/ul>\n        <\/div>\n\n        <section class=\"sj-wc-tool\" aria-label=\"Wine calculator and online sommelier for pairing\">\n          <div class=\"sj-wc-tool-head\">\n            <h2 class=\"sj-wc-tool-title\">Build your recommendation<\/h2>\n            <p class=\"sj-wc-tool-subtitle\">Adjust your gathering or event details and get a practical range of bottles, cases and pairing ideas with online sommelier logic.<\/p>\n          <\/div>\n\n          <div class=\"sj-wc-form\">\n            <div class=\"sj-wc-grid-2\">\n              <label class=\"sj-wc-field\">\n                <span class=\"sj-wc-label-row\">\n                  <span class=\"sj-wc-label\">Guests<\/span>\n                  <span class=\"sj-wc-hint\">1 case = 12 bottles<\/span>\n                <\/span>\n                <span class=\"sj-wc-stepper\">\n                  <button class=\"sj-wc-iconbtn\" type=\"button\" data-step=\"-10\" aria-label=\"Reduce guests\">&#8211;<\/button>\n                  <input class=\"sj-wc-input\" data-input=\"guests\" type=\"number\" min=\"2\" max=\"600\" placeholder=\"Ej. 120\" inputmode=\"numeric\" required>\n                  <button class=\"sj-wc-iconbtn\" type=\"button\" data-step=\"10\" aria-label=\"Increase guests\">+<\/button>\n                <\/span>\n              <\/label>\n\n              <label class=\"sj-wc-field\">\n                <span class=\"sj-wc-label\">Event type<\/span>\n                <select class=\"sj-wc-select\" data-input=\"eventType\" required>\n                  <option value=\"\" selected disabled>Select an option<\/option>\n                  <option value=\"wedding\">Wedding<\/option>\n                  <option value=\"lunch\">Lunch<\/option>\n                  <option value=\"dinner\">Dinner<\/option>\n                  <option value=\"corporate\">Corporate event<\/option>\n                  <option value=\"cocktail\">Toast or cocktail<\/option>\n                  <option value=\"casual\">Casual gathering<\/option>\n                <\/select>\n              <\/label>\n            <\/div>\n\n            <div class=\"sj-wc-grid-2\">\n              <div class=\"sj-wc-field\">\n                <span class=\"sj-wc-label\">Duration<\/span>\n                <div class=\"sj-wc-segments\" data-segment-group=\"duration\">\n                  <button class=\"sj-wc-segment\" type=\"button\" data-value=\"short\">1-2 h<\/button>\n                  <button class=\"sj-wc-segment\" type=\"button\" data-value=\"medium\" aria-pressed=\"true\">3-4 h<\/button>\n                  <button class=\"sj-wc-segment\" type=\"button\" data-value=\"long\">5+ h<\/button>\n                <\/div>\n              <\/div>\n\n              <div class=\"sj-wc-field\">\n                <span class=\"sj-wc-label\">Expected consumption<\/span>\n                <div class=\"sj-wc-segments\" data-segment-group=\"consumption\">\n                  <button class=\"sj-wc-segment\" type=\"button\" data-value=\"low\">Low<\/button>\n                  <button class=\"sj-wc-segment\" type=\"button\" data-value=\"medium\" aria-pressed=\"true\">Medium<\/button>\n                  <button class=\"sj-wc-segment\" type=\"button\" data-value=\"high\">High<\/button>\n                <\/div>\n              <\/div>\n            <\/div>\n\n            <div class=\"sj-wc-grid-2\">\n              <div class=\"sj-wc-field\">\n                <span class=\"sj-wc-label\">Serving size<\/span>\n                <div class=\"sj-wc-segments two\" data-segment-group=\"serving\">\n                  <button class=\"sj-wc-segment\" type=\"button\" data-value=\"standard\" aria-pressed=\"true\"><span>5 glasses\/bottle<small>Standard<\/small><\/span><\/button>\n                  <button class=\"sj-wc-segment\" type=\"button\" data-value=\"stretch\">6 glasses\/bottle<\/button>\n                <\/div>\n                <span class=\"sj-wc-hint\">Use 6 when you want smaller pours and a lighter service.<\/span>\n              <\/div>\n\n              <div class=\"sj-wc-field\">\n                <span class=\"sj-wc-label\">Copa de welcome<\/span>\n                <div class=\"sj-wc-segments two\" data-segment-group=\"welcome\">\n                  <button class=\"sj-wc-segment\" type=\"button\" data-value=\"yes\">Yes<\/button>\n                  <button class=\"sj-wc-segment\" type=\"button\" data-value=\"no\" aria-pressed=\"true\">No<\/button>\n                <\/div>\n                <span class=\"sj-wc-hint\">If there is a welcome drink, sparkling wine will be included. Bubbles rarely fail.<\/span>\n              <\/div>\n            <\/div>\n\n            <div class=\"sj-wc-field\">\n              <span class=\"sj-wc-label\">Wine mix<\/span>\n              <div class=\"sj-wc-segments four\" data-segment-group=\"wineMix\">\n                <button class=\"sj-wc-segment\" type=\"button\" data-value=\"red\">Red<\/button>\n                <button class=\"sj-wc-segment\" type=\"button\" data-value=\"redRose\">Red + ros\u00e9\/white<\/button>\n                <button class=\"sj-wc-segment\" type=\"button\" data-value=\"redSparkling\">Red + sparkling<\/button>\n                <button class=\"sj-wc-segment\" type=\"button\" data-value=\"all\">Red + ros\u00e9\/white + sparkling<\/button>\n                <button class=\"sj-wc-segment\" type=\"button\" data-value=\"recommend\" aria-pressed=\"true\">Recommend for me<\/button>\n              <\/div>\n            <\/div>\n\n            <div class=\"sj-wc-grid-2\">\n              <label class=\"sj-wc-field\">\n                <span class=\"sj-wc-label\">Menu courses<\/span>\n                <select class=\"sj-wc-select\" data-input=\"courseCount\">\n                  <option value=\"0\">0 courses \/ toast only<\/option>\n                  <option value=\"1\">1 course<\/option>\n                  <option value=\"2\">2 courses<\/option>\n                  <option value=\"3\" selected>3 courses<\/option>\n                  <option value=\"4\">4 courses<\/option>\n                <\/select>\n              <\/label>\n\n              <div class=\"sj-wc-field\">\n                <span class=\"sj-wc-label\">Brindis<\/span>\n                <div class=\"sj-wc-segments two\" data-segment-group=\"toast\">\n                  <button class=\"sj-wc-segment\" type=\"button\" data-value=\"yes\">Yes<\/button>\n                  <button class=\"sj-wc-segment\" type=\"button\" data-value=\"no\" aria-pressed=\"true\">No<\/button>\n                <\/div>\n              <\/div>\n            <\/div>\n\n            <div class=\"sj-wc-course-grid\" data-course-grid>\n              <label class=\"sj-wc-field\" data-course-field=\"1\">\n                <span class=\"sj-wc-label\" data-course-label>Starter<\/span>\n                <textarea class=\"sj-wc-textarea\" data-input=\"course1\" maxlength=\"180\" placeholder=\"E.g. goat cheese salad, charcuterie, ceviche...\"><\/textarea>\n              <\/label>\n              <label class=\"sj-wc-field\" data-course-field=\"2\">\n                <span class=\"sj-wc-label\" data-course-label>Main course<\/span>\n                <textarea class=\"sj-wc-textarea\" data-input=\"course2\" maxlength=\"180\" placeholder=\"E.g. tomato pasta, mushroom cream, pork tacos...\"><\/textarea>\n              <\/label>\n              <label class=\"sj-wc-field\" data-course-field=\"3\">\n                <span class=\"sj-wc-label\" data-course-label>Dessert<\/span>\n                <textarea class=\"sj-wc-textarea\" data-input=\"course3\" maxlength=\"180\" placeholder=\"E.g. chocolate cake, berry tart, flan...\"><\/textarea>\n              <\/label>\n              <label class=\"sj-wc-field\" data-course-field=\"4\">\n                <span class=\"sj-wc-label\" data-course-label>Dessert<\/span>\n                <textarea class=\"sj-wc-textarea\" data-input=\"course4\" maxlength=\"180\" placeholder=\"E.g. chocolate cake, berry tart, flan...\"><\/textarea>\n              <\/label>\n            <\/div>\n          <\/div>\n\n          <div class=\"sj-wc-results\" aria-live=\"polite\">\n            <div class=\"sj-wc-empty-result\" data-output=\"emptyState\">Complete guests and event type to see the calculation. If you add the dishes, the online sommelier adjusts the pairing recommendation based on the menu.<\/div>\n            <div class=\"sj-wc-result-main\">\n              <div class=\"sj-wc-result-box\">\n                <p class=\"sj-wc-result-label\">Recommendation<\/p>\n                <p class=\"sj-wc-result-number\"><span data-output=\"bottles\">0<\/span><\/p>\n                <p class=\"sj-wc-result-copy\" data-output=\"bottlesCopy\">bottles approx. with a safety buffer.<\/p>\n              <\/div>\n              <div class=\"sj-wc-result-box\">\n                <p class=\"sj-wc-result-label\">Operational purchase<\/p>\n                <p class=\"sj-wc-result-number\"><span data-output=\"cases\">0<\/span><\/p>\n                <p class=\"sj-wc-result-copy\" data-output=\"casesCopy\">12-bottle cases, rounded up.<\/p>\n              <\/div>\n            <\/div>\n\n            <div class=\"sj-wc-breakdown\" aria-label=\"Recommended split\">\n              <div class=\"sj-wc-breakdown-row\">\n                <span>Red<\/span>\n                <span class=\"sj-wc-bar\"><span data-bar=\"red\"><\/span><\/span>\n                <span data-output=\"red\">0<\/span>\n              <\/div>\n              <div class=\"sj-wc-breakdown-row\">\n                <span>White\/ros\u00e9<\/span>\n                <span class=\"sj-wc-bar\"><span data-bar=\"rose\"><\/span><\/span>\n                <span data-output=\"rose\">0<\/span>\n              <\/div>\n              <div class=\"sj-wc-breakdown-row\">\n                <span>Sparkling<\/span>\n                <span class=\"sj-wc-bar\"><span data-bar=\"sparkling\"><\/span><\/span>\n                <span data-output=\"sparkling\">0<\/span>\n              <\/div>\n            <\/div>\n\n            <div class=\"sj-wc-pairing\">\n              <h3 data-output=\"pairingTitle\">Online sommelier: suggested pairing<\/h3>\n              <div data-output=\"pairingBody\"><\/div>\n            <\/div>\n\n            <div class=\"sj-wc-pairing\">\n              <h3>How to read the result<\/h3>\n              <div data-output=\"calculationNote\"><\/div>\n            <\/div>\n\n            <div class=\"sj-wc-pairing\">\n              <h3>Sdinnerrios with these inputs<\/h3>\n              <div data-output=\"scenarioText\"><\/div>\n            <\/div>\n\n            <div class=\"sj-wc-actions\">\n              <a class=\"sj-wc-btn whatsapp\" data-output=\"whatsapp\" href=\"https:\/\/wa.me\/525579476854\" target=\"_blank\" rel=\"noopener\">\n                <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n                  <path fill=\"currentColor\" d=\"M12.04 2C6.54 2 2.07 6.43 2.07 11.88c0 1.74.46 3.44 1.34 4.93L2 22l5.33-1.39a10.08 10.08 0 0 0 4.71 1.18h.01c5.49 0 9.96-4.43 9.96-9.88C22 6.45 17.53 2 12.04 2Zm.01 18.1h-.01a8.35 8.35 0 0 1-4.26-1.16l-.3-.18-3.16.83.84-3.06-.2-.31a8.14 8.14 0 0 1-1.27-4.34c0-4.52 3.75-8.2 8.36-8.2 2.23 0 4.33.86 5.9 2.41a8.1 8.1 0 0 1 2.45 5.82c0 4.52-3.75 8.19-8.35 8.19Zm4.58-6.13c-.25-.12-1.48-.72-1.71-.8-.23-.09-.4-.13-.56.12-.17.25-.65.8-.79.96-.15.17-.3.19-.55.07-.25-.13-1.06-.39-2.02-1.24-.75-.66-1.25-1.47-1.4-1.72-.15-.25-.02-.38.11-.51.12-.12.25-.3.38-.44.13-.15.17-.25.25-.42.08-.17.04-.31-.02-.44-.06-.12-.56-1.34-.77-1.84-.2-.48-.41-.42-.56-.43h-.48c-.17 0-.44.06-.67.31-.23.25-.88.85-.88 2.08 0 1.23.9 2.42 1.03 2.59.13.17 1.78 2.69 4.31 3.77.6.26 1.07.41 1.44.52.61.19 1.16.16 1.59.1.49-.07 1.48-.6 1.69-1.18.21-.58.21-1.08.15-1.18-.06-.1-.23-.16-.48-.29Z\"\/>\n                <\/svg>\n                Send my result by WhatsApp\n              <\/a>\n              <a class=\"sj-wc-btn amazon\" href=\"https:\/\/www.amazon.com.mx\/stores\/SanJuanito\/page\/96F0A893-B7F4-4A55-83F5-E20140778B9A\" target=\"_blank\" rel=\"noopener\">\n                <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n                  <path fill=\"currentColor\" d=\"M7.2 18.75a1.45 1.45 0 1 1-2.9 0 1.45 1.45 0 0 1 2.9 0Zm10.95 1.45a1.45 1.45 0 1 0 0-2.9 1.45 1.45 0 0 0 0 2.9ZM6.18 6.3l.34 1.66h12.84c.74 0 1.27.7 1.08 1.41l-1.2 4.49a1.8 1.8 0 0 1-1.74 1.34H8.02a1.8 1.8 0 0 1-1.76-1.43L4.78 6.57H2.9a.9.9 0 1 1 0-1.8h2.23c.5 0 .93.35 1.05.84Zm.75 3.46.76 3.67h9.77l.98-3.67H6.93Zm2.3 7.27c2.72.82 5.61.82 8.34.03 1.28-.37 2.48-.92 3.58-1.61.38-.24.88-.12 1.11.26.24.38.12.88-.26 1.11a15.55 15.55 0 0 1-13.24 1.74.81.81 0 0 1 .47-1.53Z\"\/>\n                <\/svg>\n                Buy wines on Amazon\n              <\/a>\n              <a class=\"sj-wc-btn visit\" href=\"https:\/\/www.sanjuanito.com.mx\/en\/guided-tours\/\">\n                <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n                  <path fill=\"currentColor\" d=\"M12 2.5a7.2 7.2 0 0 0-7.2 7.2c0 4.85 6.19 11.35 6.45 11.62a1.04 1.04 0 0 0 1.5 0c.26-.27 6.45-6.77 6.45-11.62A7.2 7.2 0 0 0 12 2.5Zm0 16.55c-1.92-2.18-5.1-6.53-5.1-9.35a5.1 5.1 0 1 1 10.2 0c0 2.82-3.18 7.17-5.1 9.35Zm0-12.25a2.95 2.95 0 1 0 0 5.9 2.95 2.95 0 0 0 0-5.9Zm0 3.8a.85.85 0 1 1 0-1.7.85.85 0 0 1 0 1.7Z\"\/>\n                <\/svg>\n                Visit the vineyard\n              <\/a>\n            <\/div>\n\n            <div class=\"sj-wc-lead-form\">\n              <label class=\"sj-wc-field\">\n                <span class=\"sj-wc-label\">Save email and calculation<\/span>\n                <input class=\"sj-wc-input\" data-input=\"email\" type=\"email\" placeholder=\"you@email.com\" autocomplete=\"email\">\n              <\/label>\n              <button class=\"sj-wc-btn secondary\" data-action=\"saveLead\" type=\"button\">Save calculation<\/button>\n              <label class=\"sj-wc-consent\">\n                <input data-input=\"marketingConsent\" type=\"checkbox\">\n                <span>I agree that San Juanito may save my calculation and email for follow-up. I can unsubscribe later.<\/span>\n              <\/label>\n              <p class=\"sj-wc-lead-status\" data-output=\"leadStatus\"><\/p>\n            <\/div>\n          <\/div>\n        <\/section>\n      <\/div>\n    <\/section>\n\n    <section class=\"sj-wc-section\">\n      <div class=\"sj-wc-wrap\">\n        <div class=\"sj-wc-section-head\">\n          <p class=\"sj-wc-eyebrow\">How it works<\/p>\n          <h2 class=\"sj-wc-h2\">How to calculate wine for a gathering<\/h2>\n          <p class=\"sj-wc-section-copy\">The guide starts with glasses per person, adjusts by duration and adds a margin so wine does not run short. It works for a 12-15 person lunch, dinner with friends, wedding or catered event.<\/p>\n        <\/div>\n        <div class=\"sj-wc-info-grid\">\n          <article class=\"sj-wc-info\">\n            <h3>Quantity<\/h3>\n            <p>Start from low, medium or high consumption in glasses per person and convert it into bottles and cases so you can buy or quote without guesswork.<\/p>\n          <\/article>\n          <article class=\"sj-wc-info\">\n            <h3>Pairing<\/h3>\n            <p>It works like an online sommelier: it reads the menu and suggests a course-by-course route with San Juanito wines, broader Mexican wines, international wines and more adventurous options.<\/p>\n          <\/article>\n          <article class=\"sj-wc-info\">\n            <h3>Next step<\/h3>\n            <p>Send your result by WhatsApp or email, check prices on Amazon and buy the wines that best fit your gathering or event.<\/p>\n          <\/article>\n        <\/div>\n        <div class=\"sj-wc-rules\">\n          <article class=\"sj-wc-rulebox\">\n            <h3>Calculation basis<\/h3>\n            <ul>\n              <li>One 750 ml bottle equals about five 150 ml glasses, or six 125 ml glasses.<\/li>\n              <li>Low consumption: 1.25 glasses per person, useful when beer, cocktails or other drinks are also available.<\/li>\n              <li>Medium consumption: 1.75 glasses per person, a good starting point for lunches and dinners.<\/li>\n              <li>High consumption: 2.75 glasses per person, better if wine is the main drink or the gathering will be long.<\/li>\n              <li>Welcome sparkling wine is calculated separately: 7-8 glasses per bottle.<\/li>\n              <li>The welcome moment before food is calculated separately.<\/li>\n              <li>It adjusts by duration, lunch\/dinner and adds a 10-15% buffer.<\/li>\n            <\/ul>\n          <\/article>\n          <article class=\"sj-wc-rulebox\">\n            <h3>Pairing basis<\/h3>\n            <ul>\n              <li>Daytime meals favor white\/ros\u00e9, sparkling wines and fresh reds.<\/li>\n              <li>Dinner gives reds more room, especially with meats, sauces, fat or grilled dishes.<\/li>\n              <li>Tannins feel like texture: they can dry the mouth slightly and work better with protein, fat and flavorful dishes.<\/li>\n              <li>Acidity refreshes; bubbles clean fat; body and temperature change how wine feels on the palate.<\/li>\n              <li>The higher the alcohol, the warmer the wine feels. Serving it slightly chilled helps it not overpower the dish.<\/li>\n              <li>If you do not add the menu, the calculator still works with a flexible recommendation.<\/li>\n              <li>Adventurous options help when you want something less expected without losing the thread of the menu.<\/li>\n            <\/ul>\n          <\/article>\n          <article class=\"sj-wc-rulebox sj-wc-responsible\">\n            <h3>Responsible consumption<\/h3>\n            <ul>\n              <li>Wine accompanies food beautifully and can make a gathering more enjoyable, but it is still alcohol.<\/li>\n              <li>Calculate with margin to serve calmly and well, not to push extra consumption.<\/li>\n              <li>Keep still or sparkling water on hand; drinking water during the meal or between glasses helps a lot.<\/li>\n              <li>If someone drank more than expected, the responsible choice is not to drive and to arrange another way home.<\/li>\n            <\/ul>\n          <\/article>\n        <\/div>\n        <div class=\"sj-wc-link-grid\" aria-label=\"More from San Juanito\">\n          <a class=\"sj-wc-link-card\" href=\"https:\/\/www.sanjuanito.com.mx\/en\/wedding\/\">\n            <strong>Wine for weddings<\/strong>\n            <span>Plan a celebration with wine, food and the vineyard experience.<\/span>\n          <\/a>\n          <a class=\"sj-wc-link-card\" href=\"https:\/\/www.sanjuanito.com.mx\/en\/corporate-events\/\">\n            <strong>Wine for corporate events<\/strong>\n            <span>Options for groups, companies, meals and private gatherings.<\/span>\n          <\/a>\n          <a class=\"sj-wc-link-card\" href=\"https:\/\/www.sanjuanito.com.mx\/en\/oenology\/\">\n            <strong>Wine pairing<\/strong>\n            <span>More ideas to choose wine by menu and occasion.<\/span>\n          <\/a>\n          <a class=\"sj-wc-link-card\" href=\"https:\/\/www.sanjuanito.com.mx\/en\/guided-tours\/\">\n            <strong>Tours and tastings at San Juanito<\/strong>\n            <span>Discover the vineyard, cellar and available experiences.<\/span>\n          <\/a>\n        <\/div>\n      <\/div>\n    <\/section>\n\n    <section class=\"sj-wc-section alt\">\n      <div class=\"sj-wc-wrap sj-wc-faq\">\n        <div class=\"sj-wc-section-head\">\n          <p class=\"sj-wc-eyebrow\">Frequently asked questions<\/p>\n          <h2 class=\"sj-wc-h2\">Common questions when buying wine for a gathering<\/h2>\n        <\/div>\n        <details open>\n          <summary>How do I calculate wine for a gathering?<\/summary>\n          <p>Think in glasses. If your guests will have 2 glasses each and one bottle gives about 5 glasses, a 15-person gathering needs about 6 bottles before margin. Then adjust for duration, weather, food, timing and whether beer, cocktails or other drinks will also be served.<\/p>\n        <\/details>\n        <details>\n          <summary>How many bottles of wine do I need for 12 or 15 people?<\/summary>\n          <p>For 12-15 people, 2 glasses per guest equals 24-30 glasses: roughly 5-6 bottles. If there are other drinks or the meal is short, you can go lower; if the after-meal conversation will be long or wine is the main drink, go a bit higher.<\/p>\n        <\/details>\n        <details>\n          <summary>How many bottles of wine do I need for 100 people?<\/summary>\n          <p>As a quick guide, a 100-person event is often around 30 to 40 bottles when wine accompanies the meal: that is 1.5-2 glasses per person plus buffer. If wine is the main drink, the gathering is long or there is a welcome toast, it can rise to 50-60 bottles.<\/p>\n        <\/details>\n        <details>\n          <summary>Should I buy only red wine?<\/summary>\n          <p>Definitely not always. Red wine is delicious and works beautifully with meats, sauces, grilled food or dinner, but weather and timing matter. In warm weather or daytime meals, cold whites, ros\u00e9s and sparkling wines are often more appealing. For mixed groups, a balanced mix usually works better than betting everything on one style.<\/p>\n        <\/details>\n        <details>\n          <summary>What wine goes with Mexican food?<\/summary>\n          <p>Mexican food, like Mexican wine, is very diverse. Pozole with sparkling wine; mole with fruit-forward reds; tacos al pastor or grilled fish with ros\u00e9; cochinita pibil with very cold ros\u00e9 or a young red; birria with a fruity red; ceviche or aguachile with fresh white, ros\u00e9 or sparkling wine. If the dish is very spicy, avoid wines that are too heavy or too alcoholic.<\/p>\n        <\/details>\n        <details>\n          <summary>What quick tips help with wine pairing?<\/summary>\n          <p>Think in complement and contrast. Acidity lifts fatty or acidic dishes; bubbles clean the palate; a touch of sweetness helps with spice; red wine tannins feel like a dry texture and work better with protein, fat and intense sauces. Temperature matters too: higher alcohol feels warmer, so serving the wine slightly chilled can make it friendlier.<\/p>\n        <\/details>\n        <details>\n          <summary>Does this work as an online sommelier?<\/summary>\n          <p>Yes. It does not replace a conversation with an expert, but it works as an online sommelier guide: it considers guests, timing, weather, expected consumption and dishes to suggest wine styles and pairings that are more useful than a generic recommendation.<\/p>\n        <\/details>\n        <details>\n          <summary>How should I plan responsible consumption?<\/summary>\n          <p>Wine pairs beautifully with food and can enhance enjoyment, but it is still alcohol. Serve with pace, have enough food and keep still or sparkling water on the table; drinking water during the meal or between glasses makes a big difference. If someone drank more than expected, the responsible choice is not to drive.<\/p>\n        <\/details>\n        <details>\n          <summary>Does the calculation replace a formal quote?<\/summary>\n          <p>No. It is a guide to start well. For large gatherings, catered events, long schedules, multiple courses or special consumption patterns, it is best to adjust the calculation with the San Juanito team.<\/p>\n        <\/details>\n      <\/div>\n    <\/section>\n  <\/main>\n<script>\n    (function () {\n      const root = document.querySelector(\"[data-sj-winecalc]\");\n      if (!root) return;\n\n      const state = {\n        duration: \"medium\",\n        consumption: \"medium\",\n        wineMix: \"recommend\",\n        serving: \"standard\",\n        welcome: \"no\",\n        toast: \"no\"\n      };\n      let currentResult = null;\n\n      const glassesPerGuest = {\n        low: 1.25,\n        medium: 1.75,\n        high: 2.75\n      };\n\n      const courseConsumptionMultipliers = {\n        low: 0.65,\n        medium: 1,\n        high: 1.35\n      };\n\n      const servingProfiles = {\n        standard: {\n          stillGlassesPerBottle: 5,\n          sparklingGlassesPerBottle: 7,\n          label: \"5 glasses per bottle of still wine and 7 per sparkling wine\"\n        },\n        stretch: {\n          stillGlassesPerBottle: 6,\n          sparklingGlassesPerBottle: 8,\n          label: \"6 glasses per bottle of still wine and 8 per sparkling wine\"\n        }\n      };\n\n      const durationMultipliers = {\n        short: 0.75,\n        medium: 1,\n        long: 1.2\n      };\n\n      const eventProfiles = {\n        wedding: { safety: 1.15, preMealGlasses: 0.45, foodGlassesPerCourse: 1, name: \"wedding\" },\n        lunch: { safety: 1.12, preMealGlasses: 0.4, foodGlassesPerCourse: 0.85, name: \"lunch\", warmer: true },\n        dinner: { safety: 1.12, preMealGlasses: 0.35, foodGlassesPerCourse: 0.95, name: \"dinner\" },\n        corporate: { safety: 1.1, preMealGlasses: 0.35, foodGlassesPerCourse: 0.75, name: \"event corporativo\" },\n        cocktail: { safety: 1.1, preMealGlasses: 1.2, foodGlassesPerCourse: 0, name: \"toast o coctel\" },\n        casual: { safety: 1.1, preMealGlasses: 0.5, foodGlassesPerCourse: 0.65, name: \"casual gathering\" }\n      };\n\n      const mixProfiles = {\n        red: { red: 1, rose: 0, sparkling: 0 },\n        redRose: { red: 0.68, rose: 0.32, sparkling: 0 },\n        redSparkling: { red: 0.7, rose: 0, sparkling: 0.3 },\n        all: { red: 0.52, rose: 0.32, sparkling: 0.16 },\n        recommend: { red: 0.62, rose: 0.38, sparkling: 0 }\n      };\n\n      const pairings = {\n        beef: {\n          title: \"Carnes rojas \/ asado\",\n          options: {\n            sanJuanito: \"Reserva Malbec.\",\n            mexico: \"Malbec from Quer\u00e9taro or Valle de Guadalupe, Mexico.\",\n            world: \"Malbec from Mendoza, Argentina, or Northern Rh\u00f4ne Syrah, France.\",\n            adventurous: \"Garnacha from Gredos, Spain, served slightly chilled.\"\n          }\n        },\n        italian: {\n          title: \"Pasta, pizza o italiano\",\n          options: {\n            sanJuanito: \"Reserva Syrah-Malbec.\",\n            mexico: \"Young Nebbiolo from Baja California, Mexico.\",\n            world: \"Chianti Classico, Toscana, Italia.\",\n            adventurous: \"Lambrusco seco de Emilia-Romagna, Italia.\"\n          }\n        },\n        porkChicken: {\n          title: \"Pollo o cerdo\",\n          options: {\n            sanJuanito: \"San Juanito Rosado.\",\n            mexico: \"Dry ros\u00e9 from Quer\u00e9taro or Valle de Guadalupe, Mexico.\",\n            world: \"Pinot Noir from Burgundy, France, or Garnacha from Navarra, Spain.\",\n            adventurous: \"Brut sparkling ros\u00e9 from Quer\u00e9taro, Mexico.\"\n          }\n        },\n        mexican: {\n          title: \"Lunch mexicana\",\n          options: {\n            sanJuanito: \"Amanecer; Atardecer if available for the event.\",\n            mexico: \"Young red Garnacha or Syrah from Quer\u00e9taro, Mexico.\",\n            world: \"Young Rioja, Spain, or light Zinfandel from California, USA.\",\n            adventurous: \"Ros\u00e9 pet-nat from Baja California, Mexico.\"\n          }\n        },\n        cheese: {\n          title: \"Cheese \/ charcuterie\",\n          options: {\n            sanJuanito: \"Espuma del Valle de Bernal Ros\u00e9.\",\n            mexico: \"Ros\u00e9 sparkling wine from Quer\u00e9taro, Mexico.\",\n            world: \"Ros\u00e9 Cava from Pened\u00e8s, Spain.\",\n            adventurous: \"Beaujolais-Villages, France, served chilled.\"\n          }\n        },\n        seafood: {\n          title: \"Pescado o mariscos\",\n          options: {\n            sanJuanito: \"San Juanito Rosado.\",\n            mexico: \"Sauvignon Blanc from Valle de Guadalupe, Mexico.\",\n            world: \"Albari\u00f1o from R\u00edas Baixas, Spain.\",\n            adventurous: \"Light orange wine from Baja California, Mexico.\"\n          }\n        },\n        dessert: {\n          title: \"Desserts\",\n          options: {\n            sanJuanito: \"Espuma del Valle de Bernal Ros\u00e9.\",\n            mexico: \"Ros\u00e9 sparkling wine from Quer\u00e9taro, Mexico.\",\n            world: \"Moscato d'Asti, Piemonte, Italia.\",\n            adventurous: \"Brachetto d'Acqui, Piemonte, Italia.\"\n          }\n        },\n        mixed: {\n          title: \"Menu mixto\",\n          options: {\n            sanJuanito: \"San Juanito Rosado.\",\n            mexico: \"Dry ros\u00e9 from Quer\u00e9taro, Mexico.\",\n            world: \"Provence Ros\u00e9, France.\",\n            adventurous: \"Clairet de Burdeos, Francia.\"\n          }\n        }\n      };\n\n      const pairingRules = [\n        { key: \"beef\", words: [\"res\", \"carne\", \"carnes\", \"filete\", \"rib eye\", \"ribeye\", \"arrachera\", \"asado\", \"asada\", \"asadas\", \"parrilla\", \"parrillada\", \"cabreria\", \"cabrito\", \"cordero\", \"barbacoa\", \"birria\"] },\n        { key: \"seafood\", words: [\"pescado\", \"salmon\", \"atun\", \"marisco\", \"camaron\", \"ceviche\", \"pulpo\", \"callo\", \"ostion\"] },\n        { key: \"mexican\", words: [\"mole\", \"taco\", \"tacos\", \"enchilada\", \"pozole\", \"cochinita\", \"chile\", \"salsa\", \"maiz\", \"antojito\"] },\n        { key: \"italian\", words: [\"pasta\", \"pizza\", \"risotto\", \"lasagna\", \"raviol\", \"gnocchi\", \"tomate\", \"italian\"] },\n        { key: \"cheese\", words: [\"botana\", \"botanas\", \"queso\", \"quesos\", \"charcuteria\", \"jamon\", \"salami\", \"tabla\", \"aceituna\", \"aceitunas\", \"guacamole\"] },\n        { key: \"dessert\", words: [\"postre\", \"pastel\", \"chocolate\", \"tarta\", \"flan\", \"helado\", \"frutos rojos\"] },\n        { key: \"porkChicken\", words: [\"pollo\", \"cerdo\", \"lechon\", \"pavo\", \"lomo\", \"costilla\"] }\n      ];\n\n      function getInput(name) {\n        return root.querySelector(`[data-input=\"${name}\"]`);\n      }\n\n      function setText(name, value) {\n        const node = root.querySelector(`[data-output=\"${name}\"]`);\n        if (node) node.textContent = value;\n      }\n\n      function renderInfoList(name, items) {\n        const node = root.querySelector(`[data-output=\"${name}\"]`);\n        if (!node) return;\n        node.textContent = \"\";\n        const list = document.createElement(\"div\");\n        list.className = \"sj-wc-info-list\";\n        items.forEach((item) => {\n          const row = document.createElement(\"div\");\n          row.className = \"sj-wc-info-item\";\n          const label = document.createElement(\"strong\");\n          label.textContent = item.label;\n          const value = document.createElement(\"span\");\n          value.textContent = item.value;\n          row.append(label, value);\n          list.appendChild(row);\n        });\n        node.appendChild(list);\n      }\n\n      function renderPairing(pairing) {\n        const node = root.querySelector('[data-output=\"pairingBody\"]');\n        if (!node) return;\n        node.textContent = \"\";\n\n        const intro = document.createElement(\"p\");\n        intro.textContent = pairing.intro;\n        node.appendChild(intro);\n\n        if (!pairing.courses.length) return;\n\n        const list = document.createElement(\"div\");\n        list.className = \"sj-wc-pairing-list\";\n        pairing.courses.forEach((course) => {\n          const card = document.createElement(\"article\");\n          card.className = \"sj-wc-pairing-card\";\n\n          const heading = document.createElement(\"h4\");\n          heading.textContent = course.label;\n          if (course.text) {\n            const detail = document.createElement(\"span\");\n            detail.textContent = `: ${course.text}`;\n            heading.appendChild(detail);\n          }\n          card.appendChild(heading);\n\n          if (course.context) {\n            const context = document.createElement(\"p\");\n            context.className = \"sj-wc-pairing-context\";\n            context.textContent = course.context;\n            card.appendChild(context);\n          }\n\n          const options = document.createElement(\"div\");\n          options.className = \"sj-wc-pairing-options\";\n          [\n            [\"San Juanito\", course.options.sanJuanito],\n            [\"Wine mexicano\", course.options.mexico],\n            [\"Wine de fuera\", course.options.world],\n            [\"Aventurera\", course.options.adventurous]\n          ].forEach(([label, value]) => {\n            const row = document.createElement(\"div\");\n            row.className = \"sj-wc-pairing-option\";\n            const strong = document.createElement(\"strong\");\n            strong.textContent = label;\n            const span = document.createElement(\"span\");\n            span.textContent = value;\n            row.append(strong, span);\n            options.appendChild(row);\n          });\n\n          card.appendChild(options);\n          list.appendChild(card);\n        });\n        node.appendChild(list);\n      }\n\n      function setBar(name, value) {\n        const node = root.querySelector(`[data-bar=\"${name}\"]`);\n        if (node) node.style.width = `${Math.max(0, Math.min(100, value))}%`;\n      }\n\n      function setLeadStatus(message, type) {\n        const node = root.querySelector('[data-output=\"leadStatus\"]');\n        if (!node) return;\n        node.textContent = message || \"\";\n        node.classList.remove(\"ok\", \"error\");\n        if (type) node.classList.add(type);\n      }\n\n      function roundToBottle(value) {\n        return Math.max(0, Math.ceil(value));\n      }\n\n      function normalizeText(value) {\n        return String(value || \"\")\n          .toLowerCase()\n          .normalize(\"NFD\")\n          .replace(\/[\\u0300-\\u036f]\/g, \"\");\n      }\n\n      function getCourseLabel(index) {\n        const field = root.querySelector(`[data-course-field=\"${index}\"]`);\n        return field ? field.querySelector(\"[data-course-label]\").textContent : `Tiempo ${index}`;\n      }\n\n      function matchCourseKey(text) {\n        const normalized = normalizeText(text);\n        const scores = pairingRules.map((rule) => ({\n          key: rule.key,\n          score: rule.words.reduce((sum, word) => sum + (normalized.includes(normalizeText(word)) ? 1 : 0), 0)\n        })).sort((a, b) => b.score - a.score);\n\n        return scores[0] && scores[0].score > 0 ? scores[0].key : \"mixed\";\n      }\n\n      function getCourseEntries() {\n        const courseCount = Math.max(0, Number(getInput(\"courseCount\").value) || 0);\n        return [1, 2, 3, 4].slice(0, courseCount)\n          .map((index) => ({\n            index,\n            label: getCourseLabel(index),\n            text: ((getInput(`course${index}`) || {}).value || \"\").trim()\n          }))\n          .filter((entry) => entry.text)\n          .map((entry) => ({ ...entry, key: matchCourseKey(entry.text) }));\n      }\n\n      function inferMenuFromCourses() {\n        const courses = getCourseEntries();\n        if (!courses.length) return { key: \"mixed\", courses };\n\n        const main = courses.find((entry) => normalizeText(entry.label).includes(\"plato fuerte\"));\n        if (main && main.key !== \"mixed\") return { key: main.key, courses };\n\n        const priority = [\"beef\", \"mexican\", \"porkChicken\", \"italian\", \"seafood\", \"cheese\", \"dessert\"];\n        const key = priority.find((candidate) => courses.some((entry) => entry.key === candidate));\n        return {\n          key: key || \"mixed\",\n          courses\n        };\n      }\n\n      function getCourseContext(course) {\n        const label = normalizeText(course.label);\n        if (course.key === \"dessert\" || label.includes(\"postre\")) {\n          return \"Suggested use of the mix: sparkling wine for a fresh closing.\";\n        }\n        if (course.key === \"mexican\") {\n          return \"Suggested use of the mix: a more intense white\/ros\u00e9; if you use red, keep it young and fruit-forward.\";\n        }\n        if (course.key === \"beef\" || label.includes(\"plato fuerte\")) {\n          return \"Suggested use of the mix: mostly red wine for this course.\";\n        }\n        if (course.key === \"cheese\" || course.key === \"seafood\" || label.includes(\"entrada\")) {\n          return \"Suggested use of the mix: white\/ros\u00e9 or sparkling wine for a lighter opening.\";\n        }\n        return \"Suggested mix: white\/ros\u00e9 for freshness; red if the dish has more fat or intensity.\";\n      }\n\n      function buildPairingCopy(inferred, recommendation) {\n        const pairing = pairings[inferred.key] || pairings.mixed;\n        const selectedCourseCount = Math.max(0, Number(getInput(\"courseCount\").value) || 0);\n        if (!inferred.courses.length) {\n          return {\n            title: selectedCourseCount === 0 ? \"No food\" : \"Online sommelier: suggested pairing\",\n            intro: selectedCourseCount === 0\n              ? \"Since there will be no meal, we do not show course-by-course pairing. The recommendation focuses on welcome, toast and mingling: sparkling wine as the lead, and if the event runs longer, white\/ros\u00e9 or fresh red as support.\"\n              : \"If no dishes are entered, the calculator still works with a flexible mix: sparkling wine for welcome or toast, white\/ros\u00e9 for the pre-meal moment and fresh reds or ros\u00e9s if food follows.\",\n            courses: []\n          };\n        }\n\n        const courses = inferred.courses.map((course) => {\n          const coursePairing = pairings[course.key] || pairings.mixed;\n          return {\n            label: course.label,\n            text: course.text,\n            category: coursePairing.title,\n            context: getCourseContext(course),\n            options: coursePairing.options\n          };\n        });\n\n        const mixContext = recommendation\n          ? `The mix calculated above is ${recommendation.red} red, ${recommendation.rose} white\/ros\u00e9 and ${recommendation.sparkling} sparkling wine; below is how to use it by course.`\n          : \"The mix calculated above is distributed by moment; below is how to use it by course.\";\n\n        return {\n          title: `Online sommelier: pairing for ${inferred.courses.length} ${inferred.courses.length === 1 ? \"course\" : \"courses\"}`,\n          intro: `${mixContext} Choose a buying route: San Juanito, Mexican wine, international wine or adventurous; these are not four wines to serve all at once.`,\n          courses\n        };\n      }\n\n      function getProfile(menu, eventType) {\n        let profile = mixProfiles[state.wineMix];\n        if (state.wineMix === \"recommend\") {\n          if (eventType === \"lunch\") {\n            profile = menu === \"beef\"\n              ? { red: 0.62, rose: 0.38, sparkling: 0 }\n              : { red: 0.42, rose: 0.48, sparkling: 0.1 };\n          } else {\n            profile = menu === \"seafood\" || menu === \"cheese\"\n              ? { red: 0.35, rose: 0.45, sparkling: 0.2 }\n              : menu === \"beef\"\n                ? { red: 0.82, rose: 0.18, sparkling: 0 }\n                : mixProfiles.recommend;\n          }\n        }\n        return profile;\n      }\n\n      function buildRecommendation({ guests, eventType, menu, consumption }) {\n        const eventProfile = eventProfiles[eventType] || eventProfiles.dinner;\n        const safety = eventProfile.safety;\n        const serving = servingProfiles[state.serving];\n        const courseCount = Math.max(0, Number(getInput(\"courseCount\").value) || 0);\n        const hasCourseText = getCourseEntries().length > 0;\n        const hasFoodService = courseCount > 0;\n        const baselineGlasses = guests * glassesPerGuest[consumption] * durationMultipliers[state.duration];\n        const preMealGlasses = hasFoodService\n          ? Math.min(baselineGlasses * 0.45, guests * eventProfile.preMealGlasses)\n          : baselineGlasses;\n        const courseFloorGlasses = hasCourseText && courseCount > 0\n          ? guests * courseCount * eventProfile.foodGlassesPerCourse * courseConsumptionMultipliers[consumption]\n          : 0;\n        const foodGlasses = hasFoodService ? Math.max(0, baselineGlasses - preMealGlasses, courseFloorGlasses) : 0;\n        const targetGlasses = preMealGlasses + foodGlasses;\n        const preMealBase = (preMealGlasses \/ serving.stillGlassesPerBottle) * safety;\n        const foodBase = (foodGlasses \/ serving.stillGlassesPerBottle) * safety;\n        const profile = getProfile(menu, eventType);\n\n        let red = roundToBottle(foodBase * profile.red);\n        let rose = roundToBottle(foodBase * profile.rose);\n        let sparkling = roundToBottle(foodBase * profile.sparkling);\n        let preMealRed = 0;\n        let preMealRose = 0;\n        let preMealSparkling = 0;\n\n        if (preMealBase > 0) {\n          if (state.wineMix === \"red\") {\n            preMealRed = roundToBottle(preMealBase);\n          } else if (state.wineMix === \"redSparkling\") {\n            preMealRed = roundToBottle(preMealBase * 0.45);\n            preMealSparkling = roundToBottle(preMealBase * 0.55);\n          } else {\n            preMealRose = roundToBottle(preMealBase * (eventType === \"dinner\" ? 0.45 : 0.6));\n            preMealSparkling = roundToBottle(preMealBase * (eventType === \"dinner\" ? 0.55 : 0.4));\n          }\n        }\n\n        red += preMealRed;\n        rose += preMealRose;\n        sparkling += preMealSparkling;\n\n        if (state.welcome === \"yes\") {\n          const welcomeBottles = Math.ceil(guests \/ serving.sparklingGlassesPerBottle);\n          sparkling += welcomeBottles;\n        }\n\n        if (state.toast === \"yes\") {\n          const toastBottles = Math.ceil(guests \/ serving.sparklingGlassesPerBottle);\n          sparkling = Math.max(sparkling, toastBottles);\n        }\n\n        if (state.wineMix === \"red\") {\n          rose = 0;\n          red = roundToBottle((preMealBase + foodBase) || (targetGlasses \/ serving.stillGlassesPerBottle) * safety);\n          sparkling = 0;\n          if (state.welcome === \"yes\") {\n            sparkling += Math.ceil(guests \/ serving.sparklingGlassesPerBottle);\n          }\n          if (state.toast === \"yes\") {\n            sparkling = Math.max(sparkling, Math.ceil(guests \/ serving.sparklingGlassesPerBottle));\n          }\n        }\n\n        const total = red + rose + sparkling;\n        const cases = Math.ceil(total \/ 12);\n        const welcomeBottles = state.welcome === \"yes\" ? Math.ceil(guests \/ serving.sparklingGlassesPerBottle) : 0;\n        return {\n          red,\n          rose,\n          sparkling,\n          total,\n          cases,\n          targetGlasses,\n          serving,\n          safety,\n          moments: {\n            welcome: welcomeBottles,\n            preMeal: {\n              red: preMealRed,\n              rose: preMealRose,\n              sparkling: preMealSparkling,\n              total: preMealRed + preMealRose + preMealSparkling\n            },\n            food: {\n              red: Math.max(0, red - preMealRed),\n              rose: Math.max(0, rose - preMealRose),\n              sparkling: Math.max(0, sparkling - preMealSparkling - welcomeBottles),\n              courses: courseCount\n            }\n          }\n        };\n      }\n\n      function updateCourseVisibility() {\n        const count = Math.max(0, Number(getInput(\"courseCount\").value) || 0);\n        const labelsByCount = {\n          0: [],\n          1: [\"Platillo principal\"],\n          2: [\"Starter\", \"Main course\"],\n          3: [\"Starter\", \"Main course\", \"Dessert\"],\n          4: [\"Starter\", \"Segundo tiempo\", \"Main course\", \"Dessert\"]\n        };\n        const grid = root.querySelector(\"[data-course-grid]\");\n        if (grid) grid.hidden = count === 0;\n        root.querySelectorAll(\"[data-course-field]\").forEach((field) => {\n          const index = Number(field.getAttribute(\"data-course-field\"));\n          field.hidden = index > count;\n          const label = field.querySelector(\"[data-course-label]\");\n          if (label) label.textContent = labelsByCount[count][index - 1] || `Tiempo ${index}`;\n        });\n      }\n\n      function calculate() {\n        updateCourseVisibility();\n\n        const guestInput = getInput(\"guests\");\n        const rawGuests = Number(guestInput.value);\n        const eventType = getInput(\"eventType\").value;\n        const emptyState = root.querySelector('[data-output=\"emptyState\"]');\n        const hasRequiredBasics = rawGuests >= 2 && Boolean(eventType);\n\n        if (!hasRequiredBasics) {\n          currentResult = null;\n          if (emptyState) emptyState.hidden = false;\n          setText(\"bottles\", \"\u2014\");\n          setText(\"cases\", \"\u2014\");\n          setText(\"bottlesCopy\", \"The calculation appears once you add guests and event type.\");\n          setText(\"casesCopy\", \"We will round up to 12-bottle cases.\");\n          setText(\"red\", \"\u2014\");\n          setText(\"rose\", \"\u2014\");\n          setText(\"sparkling\", \"\u2014\");\n          setText(\"pairingTitle\", \"Online sommelier: suggested pairing\");\n          renderPairing({\n            title: \"Online sommelier: suggested pairing\",\n            intro: \"Enter the menu courses to refine the recommendation. If there is not enough information, we give a general recommendation without breaking the calculation.\",\n            courses: []\n          });\n          renderInfoList(\"calculationNote\", [{ label: \"Pending\", value: \"Complete guests and event type to see the calculation.\" }]);\n          renderInfoList(\"scenarioText\", [{ label: \"Pending\", value: \"Complete guests and event type to compare scenarios.\" }]);\n          setBar(\"red\", 0);\n          setBar(\"rose\", 0);\n          setBar(\"sparkling\", 0);\n          return;\n        }\n\n        if (emptyState) emptyState.hidden = true;\n\n        const guests = Math.max(2, Math.min(600, rawGuests));\n        guestInput.value = guests;\n\n        const inferred = inferMenuFromCourses();\n        const menu = inferred.key;\n        const recommendation = buildRecommendation({ guests, eventType, menu, consumption: state.consumption });\n        const { red, rose, sparkling, total, cases, targetGlasses, serving } = recommendation;\n        const pairing = buildPairingCopy(inferred, recommendation);\n        const eventLabel = getInput(\"eventType\").selectedOptions[0].textContent;\n        const courseCount = Math.max(0, Number(getInput(\"courseCount\").value) || 0);\n        const menuLabel = courseCount === 0\n          ? \"No food\"\n          : inferred.courses.length ? inferred.courses.map((course) => `${course.label}: ${course.text}`).join(\" \/ \") : \"Menu por definir\";\n        const lowSdinnerrio = buildRecommendation({ guests, eventType, menu, consumption: \"low\" });\n        const mediumSdinnerrio = buildRecommendation({ guests, eventType, menu, consumption: \"medium\" });\n        const highSdinnerrio = buildRecommendation({ guests, eventType, menu, consumption: \"high\" });\n        const caseCapacity = cases * 12;\n        const extraBottles = caseCapacity - total;\n        const estimatedServedGlasses = Math.round(\n          targetGlasses\n          + (recommendation.moments.welcome ? guests : 0)\n          + (state.toast === \"yes\" ? guests : 0)\n        );\n        const estimatedGlassesPerGuest = (estimatedServedGlasses \/ guests).toFixed(estimatedServedGlasses \/ guests >= 10 ? 0 : 1);\n        const welcomeCopy = recommendation.moments.welcome\n          ? `Welcome: ${recommendation.moments.welcome} bottles of sparkling wine to receive guests. `\n          : \"\";\n        const preMealParts = [\n          recommendation.moments.preMeal.red ? `${recommendation.moments.preMeal.red} red` : \"\",\n          recommendation.moments.preMeal.rose ? `${recommendation.moments.preMeal.rose} white\/ros\u00e9` : \"\",\n          recommendation.moments.preMeal.sparkling ? `${recommendation.moments.preMeal.sparkling} sparkling wine` : \"\"\n        ].filter(Boolean).join(\", \");\n        const foodParts = [\n          recommendation.moments.food.red ? `${recommendation.moments.food.red} red` : \"\",\n          recommendation.moments.food.rose ? `${recommendation.moments.food.rose} white\/ros\u00e9` : \"\",\n          recommendation.moments.food.sparkling ? `${recommendation.moments.food.sparkling} sparkling wine` : \"\"\n        ].filter(Boolean).join(\", \");\n        const foodMomentLabel = inferred.courses.length\n          ? `Durante ${courseCount || \"los\"} ${courseCount === 1 ? \"tiempo\" : \"tiempos\"} de lunch`\n          : \"Durante los alimentos\";\n        const momentCopy = courseCount === 0\n          ? `${welcomeCopy}${preMealParts ? `Toast\/welcome: ${preMealParts}.` : \"Toast\/welcome: adjust consumption, duration or mix to see bottles.\"}`\n          : `${welcomeCopy}${preMealParts ? `Pre-meal gathering: ${preMealParts}. ` : \"\"}${foodParts ? `${foodMomentLabel}: ${foodParts}.` : \"For food, adjust by menu or use the recommended mix.\"}`;\n\n        setText(\"bottles\", total);\n        setText(\"cases\", cases);\n        setText(\n          \"bottlesCopy\",\n          `We estimate ${estimatedGlassesPerGuest} glasses per person (${estimatedServedGlasses} glasses total). With operating margin: ${total} bottles.`\n        );\n        setText(\n          \"casesCopy\",\n          `${cases} cases cover ${caseCapacity} bottles; ${extraBottles} bottles remain as margin over the calculation.`\n        );\n        setText(\"red\", red);\n        setText(\"rose\", rose);\n        setText(\"sparkling\", sparkling);\n        setText(\"pairingTitle\", pairing.title);\n        renderPairing(pairing);\n        renderInfoList(\"calculationNote\", [\n          { label: \"Momentos\", value: momentCopy },\n          { label: \"Consumption\", value: `${state.consumption === \"low\" ? \"Low\" : state.consumption === \"medium\" ? \"Medium\" : \"High\"}: ${glassesPerGuest[state.consumption]} glasses per person before duration adjustment.` },\n          { label: \"Menu\", value: courseCount === 0 ? \"No food: wine is not forced into lunch or dinner courses.\" : inferred.courses.length ? \"With a written menu: enough wine is reserved to accompany each course.\" : \"Without a written menu: a general mix is used and the calculation still works.\" },\n          { label: \"Servicio\", value: serving.label }\n        ]);\n        renderInfoList(\"scenarioText\", [\n          { label: \"Low\", value: `${lowSdinnerrio.total} bottles. Use this if there will be cocktails, beer or other drinks.` },\n          { label: \"Medium\", value: `${mediumSdinnerrio.total} bottles. This is the balanced point for wine accompanying the event.` },\n          { label: \"High\", value: `${highSdinnerrio.total} bottles. Use this if wine will be the main drink or the gathering will be long.` }\n        ]);\n\n        setBar(\"red\", total ? (red \/ total) * 100 : 0);\n        setBar(\"rose\", total ? (rose \/ total) * 100 : 0);\n        setBar(\"sparkling\", total ? (sparkling \/ total) * 100 : 0);\n\n        const message = [\n          \"Hi, I used the wine calculator for my event at San Juanito.\",\n          `We are ${guests} people.`,\n          `Event type: ${eventLabel}.`,\n          `Menu: ${menuLabel}.`,\n          `Servicio: ${serving.label}.`,\n          `Result: ${total} bottles approx. (${cases} cases): ${red} red, ${rose} white\/ros\u00e9 and ${sparkling} sparkling wine.`,\n          momentCopy,\n          \"Can you help me adjust the recommendation and quote it?\"\n        ].join(\" \");\n\n        const whatsapp = root.querySelector('[data-output=\"whatsapp\"]');\n        if (whatsapp) whatsapp.href = `https:\/\/wa.me\/525579476854?text=${encodeURIComponent(message)}`;\n\n        currentResult = {\n          guests,\n          eventType,\n          eventLabel,\n          menuLabel,\n          courseCount,\n          courses: inferred.courses,\n          serving: serving.label,\n          state: { ...state },\n          bottles: { red, whiteRose: rose, sparkling, total, cases },\n          moments: recommendation.moments,\n          pairing,\n          calculationNote: momentCopy,\n          message\n        };\n      }\n\n      async function saveLead() {\n        const emailInput = getInput(\"email\");\n        const consentInput = getInput(\"marketingConsent\");\n        const email = (emailInput.value || \"\").trim();\n        if (!currentResult) {\n          setLeadStatus(\"Complete guests and event type before saving the calculation.\", \"error\");\n          return;\n        }\n        if (!emailInput.checkValidity() || !email) {\n          setLeadStatus(\"Enter a valid email to save the calculation.\", \"error\");\n          emailInput.focus();\n          return;\n        }\n        if (!consentInput.checked) {\n          setLeadStatus(\"Please check consent so we can use the email for campaigns.\", \"error\");\n          consentInput.focus();\n          return;\n        }\n\n        const button = root.querySelector('[data-action=\"saveLead\"]');\n        if (button) {\n          button.disabled = true;\n          button.textContent = \"Enviando...\";\n        }\n        setLeadStatus(\"Saving your calculation...\", \"\");\n\n        try {\n          const response = await fetch(\"https:\/\/sanjuanito-calculadora-vino-demo.vercel.app\/api\/leads\", {\n            method: \"POST\",\n            headers: { \"Content-Type\": \"application\/json\" },\n            body: JSON.stringify({\n              email,\n              marketingConsent: true,\n              source: \"calculadora-wine-demo\",\n              page: window.location.href,\n              capturedAt: new Date().toISOString(),\n              result: currentResult\n            })\n          });\n          const data = await response.json().catch(() => ({}));\n          if (!response.ok) throw new Error(data.error || \"No se pudo guardar el lead.\");\n          setLeadStatus(\"Done: we saved your email and calculation for follow-up.\", \"ok\");\n        } catch (error) {\n          setLeadStatus(error.message || \"No se pudo guardar. Intenta por WhatsApp.\", \"error\");\n        } finally {\n          if (button) {\n            button.disabled = false;\n            button.textContent = \"Save calculation\";\n          }\n        }\n      }\n\n      root.querySelectorAll(\"[data-segment-group]\").forEach((group) => {\n        const key = group.getAttribute(\"data-segment-group\");\n        group.querySelectorAll(\".sj-wc-segment\").forEach((button) => {\n          if (!button.hasAttribute(\"aria-pressed\")) {\n            button.setAttribute(\"aria-pressed\", state[key] === button.dataset.value ? \"true\" : \"false\");\n          }\n          button.addEventListener(\"click\", () => {\n            state[key] = button.dataset.value;\n            group.querySelectorAll(\".sj-wc-segment\").forEach((other) => {\n              other.setAttribute(\"aria-pressed\", other === button ? \"true\" : \"false\");\n            });\n            calculate();\n          });\n        });\n      });\n\n      root.querySelectorAll(\"[data-input]\").forEach((input) => {\n        input.addEventListener(\"input\", calculate);\n        input.addEventListener(\"change\", calculate);\n      });\n\n      root.querySelectorAll(\"[data-step]\").forEach((button) => {\n        button.addEventListener(\"click\", () => {\n          const input = getInput(\"guests\");\n          input.value = Number(input.value || 0) + Number(button.dataset.step);\n          calculate();\n        });\n      });\n\n      const saveLeadButton = root.querySelector('[data-action=\"saveLead\"]');\n      if (saveLeadButton) saveLeadButton.addEventListener(\"click\", saveLead);\n\n      calculate();\n    })();\n  <\/script>","protected":false},"excerpt":{"rendered":"<p>Online wine calculator: estimate bottles, cases and glasses per person for gatherings and events, with online sommelier pairing suggestions based on your menu.<\/p>\n","protected":false},"author":18,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-8218","page","type-page","status-publish","hentry"],"acf":[],"rankMath":{"parentDomain":"sanjuanito.com.mx","noFollowDomains":[],"noFollowExcludeDomains":[],"noFollowExternalLinks":false,"featuredImageNotice":"The featured image should be at least 200 by 200 pixels to be picked up by Facebook and other social media sites.","pluginReviewed":true,"postSettings":{"linkSuggestions":true,"useFocusKeyword":false},"frontEndScore":false,"postName":"online-wine-calculator","permalinkFormat":"https:\/\/www.sanjuanito.com.mx\/en\/%pagename%\/","showLockModifiedDate":true,"assessor":{"focusKeywordLink":"https:\/\/www.sanjuanito.com.mx\/wp-admin\/edit.php?focus_keyword=%focus_keyword%&post_type=%post_type%","hasTOCPlugin":true,"primaryTaxonomy":false,"serpData":{"title":"","description":"","focusKeywords":"","pillarContent":false,"canonicalUrl":"","breadcrumbTitle":"","advancedRobots":{"max-snippet":"-1","max-video-preview":"-1","max-image-preview":"large"},"facebookTitle":"","facebookDescription":"","facebookImage":"","facebookImageID":"","facebookHasOverlay":false,"facebookImageOverlay":"","facebookAuthor":"","twitterCardType":"","twitterUseFacebook":true,"twitterTitle":"","twitterDescription":"","twitterImage":"","twitterImageID":"","twitterHasOverlay":false,"twitterImageOverlay":"","twitterPlayerUrl":"","twitterPlayerSize":"","twitterPlayerStream":"","twitterPlayerStreamCtype":"","twitterAppDescription":"","twitterAppIphoneName":"","twitterAppIphoneID":"","twitterAppIphoneUrl":"","twitterAppIpadName":"","twitterAppIpadID":"","twitterAppIpadUrl":"","twitterAppGoogleplayName":"","twitterAppGoogleplayID":"","twitterAppGoogleplayUrl":"","twitterAppCountry":"","robots":{"index":true},"twitterAuthor":"username","primaryTerm":0,"authorName":"Antonio Trevino","titleTemplate":"%title% %sep% %sitename%","descriptionTemplate":"%excerpt%","showScoreFrontend":true,"lockModifiedDate":false},"powerWords":["a cut above","absolute","absolutely","absolutely lowest","absurd","abuse","accurate","accuse","achieve","actionable","adaptable","adequate","admit","adorable","advantage","advice","affordable","aggravate","aggressive","agitated","agonizing","agony","alarmed","alarming","alienated","aligned","alive","all-inclusive","alluring","always","amazing","amp","animated","annihilate","announcing","anonymous","antagonistic","anxious","apocalypse","appalled","approved","approving","argumentative","armageddon","arrogant","ass kicking","assault","assured","astonishing","astounded","astounding","at ease","atrocious","attack","attractive","audacity","authentic","authoritative","authority","avoid","aware","awe-inspiring","awesome","awkward","backbone","backdoor","backed","backlash","backstabbing","badass","balanced","banned","bargain","barrage","basic","battle","beaming","beat down","beating","beautiful","beauty","begging","behind the scenes","belief","belong","best","best-selling","better","beware","big","billion","black market","blacklisted","blast","blessed","blinded","blissful","blood","bloodbath","bloodcurdling","bloody","blunder","blushing","bold","bomb","bona","bona fide","bonanza","bonus","bootleg","bottom line","bountiful","brave","bravery","brazen","break","breaking","breakthrough","breathtaking","bright","brilliant","broke","brutal","budget","buffoon","bullshit","bully","bumbling","buy","cadaver","calm","cancel anytime","capable","captivate","captivating","carefree","case study","cash","cataclysmic","catapult","catastrophe","caution","censored","centered","certain","certainly","certified","challenge","charming","cheap","cheat","cheat-sheet","cheer","cheerful","child-like","clarity","classified","clear","clueless","collapse","colorful","colossal","comfortable","compare","competitive","complete","completely","completeness","comprehensive","compromise","compulsive","concealed","conclusive","condemning","condescending","confess","confession","confessions","confident","confidential","conquer","conscientious","constructive","content","contrary","controlling","controversial","convenient","convert","cool","cooperative","copy","corpse","corrupt","corrupting","courage","courageous","cover-up","covert","coward","cowardly","crammed","crave","crazy","create","creative","cringeworthy","cripple","crisis","critical","crooked","crush","crushing","damaging","danger","dangerous","daring","dazzling","dead","deadline","deadly","death","decadent","deceived","deceptive","deep","defiance","definitely","definitive","defying","dejected","delicious","delight","delighted","delightful","delirious","delivered","demoralizing","deplorable","depraved","desire","desperate","despicable","destiny","destroy","detailed","devastating","devoted","diagnosed","direct","dirty","disadvantages","disastrous","discount","discover","disdainful","disempowered","disgusted","disgusting","dishonest","disillusioned","disoriented","distracted","distraught","distressed","distrustful","divulge","document","dollar","dominate","doomed","double","doubtful","download","dreadful","dreamy","drive","drowning","dumb","dynamic","eager","earnest","easily","easy","economical","ecstatic","edge","effective","efficient","effortless","elated","eliminate","elite","embarrass","embarrassed","embarrassing","emergency","emerging","emphasize","empowered","enchant","encouraged","endorsed","energetic","energy","enormous","enraged","enthusiastic","envy","epic","epidemic","essential","ethical","euphoric","evil","exactly","exasperated","excellent","excited","excitement","exciting","exclusive","exclusivity","excruciating","exhilarated","expensive","expert","explode","exploit","explosive","exposed","exquisite","extra","extraordinary","extremely","exuberant","eye-opening","fail","fail-proof","failure","faith","famous","fantasy","fascinating","fatigued","faux","faux pas","fearless","feast","feeble","festive","fide","fierce","fight","final","fine","fired","first","first ever","flirt","fluid","focus","focused","fool","fooled","foolish","forbidden","force-fed","forever","forgiving","forgotten","formula","fortune","foul","frantic","free","freebie","freedom","frenzied","frenzy","frightening","frisky","frugal","frustrated","fulfill","fulfilled","full","fully","fun","fun-loving","fundamentals","funniest","funny","furious","gambling","gargantuan","genius","genuine","gift","gigantic","giveaway","glamorous","gleeful","glorious","glowing","goddamn","gorgeous","graceful","grateful","gratified","gravity","great","greatest","greatness","greed","greedy","gripping","grit","grounded","growth","guaranteed","guilt","guilt-free","gullible","guts","hack","happiness","happy","harmful","harsh","hate","have you heard","havoc","hazardous","healthy","heart","heartbreaking","heartwarming","heavenly","hell","helpful","helplessness","hero","hesitant","hidden","high tech","highest","highly effective","hilarious","hoak","hoax","honest","honored","hope","hopeful","horribly","horrific","horrifying","horror","hostile","how to","huge","humility","humor","hurricane","hurry","hypnotic","idiot","ignite","illegal","illusive","imagination","immediately","imminently","impatience","impatient","impenetrable","important","impressive","improved","in the zone","incapable","incapacitated","incompetent","inconsiderate","increase","incredible","indecisive","indulgence","indulgent","inexpensive","inferior","informative","infuriated","ingredients","innocent","innovative","insane","insecure","insider","insidious","inspired","inspiring","instant savings","instantly","instructive","insult","intel","intelligent","intense","interesting","intriguing","introducing","invasion","investment","iron-clad","ironclad","irresistible","irs","is here","jackpot","jail","jaw-dropping","jealous","jeopardy","jittery","jovial","joyous","jubilant","judgmental","jumpstart","just arrived","keen","kickass","kickstart","kill","killed","killing","kills","know it all","lame","largest","lascivious","last","last chance","last minute","latest","laugh","laughing","launch","launching","lavishly","lawsuit","lazy","left behind","legendary","legitimate","liberal","liberated","lick","lies","life-changing","lifetime","light","lighthearted","likely","limited","literally","little-known","loathsome","lonely","looming","loser","lost","love","lucrative","lunatic","lurking","lust","luxurious","luxury","lying","magic","magical","magnificent","mainstream","malicious","mammoth","manipulative","marked down","massive","master","masterclass","maul","mediocre","meditative","meltdown","memorability","memorable","menacing","mesmerizing","meticulous","mind-blowing","minimalist","miracle","mired","mischievous","misgiving","missing out","mistake","monetize","money","moneyback","moneygrubbing","monumental","most important","motivated","mouth-watering","murder","mystery","nail","naked","natural","naughty","nazi","nest egg","never","new","nightmare","no good","no obligation","no one talks about","no questions asked","no risk","no strings attached","non-controlling","noted","novelty","now","obnoxious","obsessed","obsession","obvious","odd","off-kilter","off-limits","off-the record","offensive","official","okay","on-demand","open-minded","opportunities","optimistic","ordeal","outlawed","outrageousness","outstanding","overcome","overjoyed","overnight","overwhelmed","packed","painful","painless","painstaking","pale","panic","panicked","paralyzed","pas","passionate","pathetic","pay zero","payback","perfect","peril","perplexed","perspective","pessimistic","pioneering","piranha","pitfall","pitiful","placid","plague","played","playful","pleased","pluck","plummet","plunge","poison","poisonous","polarizing","poor","popular","portfolio","pound","powerful","powerless","practical","preposterous","prestige","price","priceless","pride","prison","privacy","private","privileged","prize","problem","productive","professional","profit","profitable","profound","promiscuous","promising","promote","protect","protected","proven","provocative","provoke","psychological","pummel","punch","punish","pus","quadruple","quality","quarrelsome","quick","quick-start","quickly","quiet","radiant","rare","ravenous","rebellious","recession-proof","reckoning","recognized","recommend","recreate","reduced","reflective","refugee","refund","refundable","reject","relaxed","release","relentless","reliable","remarkable","replicate","report","reprimanding","repulsed","repulsive","research","resentful","resourceful","responsible","responsive","rested","restricted","results","retaliating","reveal","revealing","revenge","revengeful","revisited","revolting","revolutionary","reward","rich","ridiculous","risky","riveting","rookie","rowdy","ruin","rules","ruthless","sabotaging","sacred","sadistic","sadly","sadness","safe","safety","sale","sampler","sarcastic","satisfied","savage","savagery","save","savings","savvy","scam","scandal","scandalous","scarce","scared","scary","scornful","scream","searing","secret","secret agenda","secret plot","secrets","secure","security","seductive","seething","seize","selected","self-hating","self-sufficient","sensational","senseless","sensual","serene","seriously","severe","sex","sexy","shaking","shameful","shameless","shaming","shatter","shellacking","shocking","should","shrewd","sick and tired","signs","silly","simple","simplicity","simplified","simplistic","sincere","sinful","sins","six-figure","sizable","sizzle","sizzled","sizzles","sizzling","sizzlingly","skill","skyrocket","slaughter","slave","sleazy","sleeping","sly","smash","smiling","smug","smuggle","smuggled","sneak-peek","sneaky","sniveling","snob","snooty","snotty","soar","soaring","solid","solution","spank","special","spectacular","speedy","spell-binding","spine","spirit","spirited","spiteful","spoiler","spontaneous","spotlight","spunky","squirming","stable","staggering","startling","steady","steal","stealthy","steamy","step-by-step","still","stoic","stop","strange","strangle","strategy","stressed","strong","strongly suggest","struggle","stuck up","studies","stunning","stupid","stupid-simple","sturdy","sublime","succeed","success","successful","suck","suddenly","suffer","sunny","super","super-human","superb","supercharge","superior","supported","supportive","sure","sure fire","surefire","surge","surging","surprise","surprised","surprising","survival","survive","suspicious","sweaty","swoon","swoon-worthy","tailspin","tank","tantalizing","targeted","tawdry","tease","technology","teetering","tempting","tenacious","tense","terrible","terrific","terrified","terrifying","terror","terrorist","tested","thankful","the truth","threaten","threatened","thrilled","thrilling","thug","ticked off","tickled","timely","today","torture","toxic","track record","trade secret","tragedy","tragic","transform","transparency","trap","trapped","trauma","traumatized","treacherous","treasure","tremendous","trend","tricks","triggers","triple","triumph","truly","trusting","trustworthy","truth","truthful","turbo-charge","turbocharges","tweaks","twitching","ultimate","unadulterated","unassuming","unauthorized","unbelievable","unburdened","uncaring","uncensored","uncertain","uncomfortable","unconditional","uncontrollable","unconventional","uncovered","undeniable","under priced","undercover","underground","underhanded","underused","unexpected","unforgettable","unheard of","unhurried","uninterested","unique","unjustified","unknowingly","unleashed","unlimited","unlock","unparalleled","unpopular","unreliable","unresponsive","unseen","unstable","unstoppable","unsure","unsurpassed","untapped","unusual","up-sell","upbeat","uplifted","uplifting","urge","urgent","useful","useless","validate","valor","valuable","value","vanquish","vaporize","venomous","verify","vibrant","vicious","victim","victory","vigorous","vilified","vindictive","violated","violent","volatile","vulnerable","waiting","wanted","wanton","warning","waste","weak","wealth","weird","what no one tells you","whip","whopping","wicked","wild","willpower","withheld","wonderful","wondrous","woozy","world","worry","worst","worthwhile","wounded","wreaking","youthful","zen","zinger"],"diacritics":{"A":"[\\u0041\\u24B6\\uFF21\\u00C0\\u00C1\\u00C2\\u1EA6\\u1EA4\\u1EAA\\u1EA8\\u00C3\\u0100\\u0102\\u1EB0\\u1EAE\\u1EB4\\u1EB2\\u0226\\u01E0\\u00C4\\u01DE\\u1EA2\\u00C5\\u01FA\\u01CD\\u0200\\u0202\\u1EA0\\u1EAC\\u1EB6\\u1E00\\u0104\\u023A\\u2C6F]","AA":"[\\uA732]","AE":"[\\u00C6\\u01FC\\u01E2]","AO":"[\\uA734]","AU":"[\\uA736]","AV":"[\\uA738\\uA73A]","AY":"[\\uA73C]","B":"[\\u0042\\u24B7\\uFF22\\u1E02\\u1E04\\u1E06\\u0243\\u0182\\u0181]","C":"[\\u0043\\u24B8\\uFF23\\u0106\\u0108\\u010A\\u010C\\u00C7\\u1E08\\u0187\\u023B\\uA73E]","D":"[\\u0044\\u24B9\\uFF24\\u1E0A\\u010E\\u1E0C\\u1E10\\u1E12\\u1E0E\\u0110\\u018B\\u018A\\u0189\\uA779]","DZ":"[\\u01F1\\u01C4]","Dz":"[\\u01F2\\u01C5]","E":"[\\u0045\\u24BA\\uFF25\\u00C8\\u00C9\\u00CA\\u1EC0\\u1EBE\\u1EC4\\u1EC2\\u1EBC\\u0112\\u1E14\\u1E16\\u0114\\u0116\\u00CB\\u1EBA\\u011A\\u0204\\u0206\\u1EB8\\u1EC6\\u0228\\u1E1C\\u0118\\u1E18\\u1E1A\\u0190\\u018E]","F":"[\\u0046\\u24BB\\uFF26\\u1E1E\\u0191\\uA77B]","G":"[\\u0047\\u24BC\\uFF27\\u01F4\\u011C\\u1E20\\u011E\\u0120\\u01E6\\u0122\\u01E4\\u0193\\uA7A0\\uA77D\\uA77E]","H":"[\\u0048\\u24BD\\uFF28\\u0124\\u1E22\\u1E26\\u021E\\u1E24\\u1E28\\u1E2A\\u0126\\u2C67\\u2C75\\uA78D]","I":"[\\u0049\\u24BE\\uFF29\\u00CC\\u00CD\\u00CE\\u0128\\u012A\\u012C\\u0130\\u00CF\\u1E2E\\u1EC8\\u01CF\\u0208\\u020A\\u1ECA\\u012E\\u1E2C\\u0197]","J":"[\\u004A\\u24BF\\uFF2A\\u0134\\u0248]","K":"[\\u004B\\u24C0\\uFF2B\\u1E30\\u01E8\\u1E32\\u0136\\u1E34\\u0198\\u2C69\\uA740\\uA742\\uA744\\uA7A2]","L":"[\\u004C\\u24C1\\uFF2C\\u013F\\u0139\\u013D\\u1E36\\u1E38\\u013B\\u1E3C\\u1E3A\\u0141\\u023D\\u2C62\\u2C60\\uA748\\uA746\\uA780]","LJ":"[\\u01C7]","Lj":"[\\u01C8]","M":"[\\u004D\\u24C2\\uFF2D\\u1E3E\\u1E40\\u1E42\\u2C6E\\u019C]","N":"[\\u004E\\u24C3\\uFF2E\\u01F8\\u0143\\u00D1\\u1E44\\u0147\\u1E46\\u0145\\u1E4A\\u1E48\\u0220\\u019D\\uA790\\uA7A4]","NJ":"[\\u01CA]","Nj":"[\\u01CB]","O":"[\\u004F\\u24C4\\uFF2F\\u00D2\\u00D3\\u00D4\\u1ED2\\u1ED0\\u1ED6\\u1ED4\\u00D5\\u1E4C\\u022C\\u1E4E\\u014C\\u1E50\\u1E52\\u014E\\u022E\\u0230\\u00D6\\u022A\\u1ECE\\u0150\\u01D1\\u020C\\u020E\\u01A0\\u1EDC\\u1EDA\\u1EE0\\u1EDE\\u1EE2\\u1ECC\\u1ED8\\u01EA\\u01EC\\u00D8\\u01FE\\u0186\\u019F\\uA74A\\uA74C]","OI":"[\\u01A2]","OO":"[\\uA74E]","OU":"[\\u0222]","P":"[\\u0050\\u24C5\\uFF30\\u1E54\\u1E56\\u01A4\\u2C63\\uA750\\uA752\\uA754]","Q":"[\\u0051\\u24C6\\uFF31\\uA756\\uA758\\u024A]","R":"[\\u0052\\u24C7\\uFF32\\u0154\\u1E58\\u0158\\u0210\\u0212\\u1E5A\\u1E5C\\u0156\\u1E5E\\u024C\\u2C64\\uA75A\\uA7A6\\uA782]","S":"[\\u0053\\u24C8\\uFF33\\u1E9E\\u015A\\u1E64\\u015C\\u1E60\\u0160\\u1E66\\u1E62\\u1E68\\u0218\\u015E\\u2C7E\\uA7A8\\uA784]","T":"[\\u0054\\u24C9\\uFF34\\u1E6A\\u0164\\u1E6C\\u021A\\u0162\\u1E70\\u1E6E\\u0166\\u01AC\\u01AE\\u023E\\uA786]","TZ":"[\\uA728]","U":"[\\u0055\\u24CA\\uFF35\\u00D9\\u00DA\\u00DB\\u0168\\u1E78\\u016A\\u1E7A\\u016C\\u00DC\\u01DB\\u01D7\\u01D5\\u01D9\\u1EE6\\u016E\\u0170\\u01D3\\u0214\\u0216\\u01AF\\u1EEA\\u1EE8\\u1EEE\\u1EEC\\u1EF0\\u1EE4\\u1E72\\u0172\\u1E76\\u1E74\\u0244]","V":"[\\u0056\\u24CB\\uFF36\\u1E7C\\u1E7E\\u01B2\\uA75E\\u0245]","VY":"[\\uA760]","W":"[\\u0057\\u24CC\\uFF37\\u1E80\\u1E82\\u0174\\u1E86\\u1E84\\u1E88\\u2C72]","X":"[\\u0058\\u24CD\\uFF38\\u1E8A\\u1E8C]","Y":"[\\u0059\\u24CE\\uFF39\\u1EF2\\u00DD\\u0176\\u1EF8\\u0232\\u1E8E\\u0178\\u1EF6\\u1EF4\\u01B3\\u024E\\u1EFE]","Z":"[\\u005A\\u24CF\\uFF3A\\u0179\\u1E90\\u017B\\u017D\\u1E92\\u1E94\\u01B5\\u0224\\u2C7F\\u2C6B\\uA762]","a":"[\\u0061\\u24D0\\uFF41\\u1E9A\\u00E0\\u00E1\\u00E2\\u1EA7\\u1EA5\\u1EAB\\u1EA9\\u00E3\\u0101\\u0103\\u1EB1\\u1EAF\\u1EB5\\u1EB3\\u0227\\u01E1\\u00E4\\u01DF\\u1EA3\\u00E5\\u01FB\\u01CE\\u0201\\u0203\\u1EA1\\u1EAD\\u1EB7\\u1E01\\u0105\\u2C65\\u0250]","aa":"[\\uA733]","ae":"[\\u00E6\\u01FD\\u01E3]","ao":"[\\uA735]","au":"[\\uA737]","av":"[\\uA739\\uA73B]","ay":"[\\uA73D]","b":"[\\u0062\\u24D1\\uFF42\\u1E03\\u1E05\\u1E07\\u0180\\u0183\\u0253]","c":"[\\u0063\\u24D2\\uFF43\\u0107\\u0109\\u010B\\u010D\\u00E7\\u1E09\\u0188\\u023C\\uA73F\\u2184]","d":"[\\u0064\\u24D3\\uFF44\\u1E0B\\u010F\\u1E0D\\u1E11\\u1E13\\u1E0F\\u0111\\u018C\\u0256\\u0257\\uA77A]","dz":"[\\u01F3\\u01C6]","e":"[\\u0065\\u24D4\\uFF45\\u00E8\\u00E9\\u00EA\\u1EC1\\u1EBF\\u1EC5\\u1EC3\\u1EBD\\u0113\\u1E15\\u1E17\\u0115\\u0117\\u00EB\\u1EBB\\u011B\\u0205\\u0207\\u1EB9\\u1EC7\\u0229\\u1E1D\\u0119\\u1E19\\u1E1B\\u0247\\u025B\\u01DD]","f":"[\\u0066\\u24D5\\uFF46\\u1E1F\\u0192\\uA77C]","g":"[\\u0067\\u24D6\\uFF47\\u01F5\\u011D\\u1E21\\u011F\\u0121\\u01E7\\u0123\\u01E5\\u0260\\uA7A1\\u1D79\\uA77F]","h":"[\\u0068\\u24D7\\uFF48\\u0125\\u1E23\\u1E27\\u021F\\u1E25\\u1E29\\u1E2B\\u1E96\\u0127\\u2C68\\u2C76\\u0265]","hv":"[\\u0195]","i":"[\\u0069\\u24D8\\uFF49\\u00EC\\u00ED\\u00EE\\u0129\\u012B\\u012D\\u00EF\\u1E2F\\u1EC9\\u01D0\\u0209\\u020B\\u1ECB\\u012F\\u1E2D\\u0268\\u0131]","j":"[\\u006A\\u24D9\\uFF4A\\u0135\\u01F0\\u0249]","k":"[\\u006B\\u24DA\\uFF4B\\u1E31\\u01E9\\u1E33\\u0137\\u1E35\\u0199\\u2C6A\\uA741\\uA743\\uA745\\uA7A3]","l":"[\\u006C\\u24DB\\uFF4C\\u0140\\u013A\\u013E\\u1E37\\u1E39\\u013C\\u1E3D\\u1E3B\\u017F\\u0142\\u019A\\u026B\\u2C61\\uA749\\uA781\\uA747]","lj":"[\\u01C9]","m":"[\\u006D\\u24DC\\uFF4D\\u1E3F\\u1E41\\u1E43\\u0271\\u026F]","n":"[\\u006E\\u24DD\\uFF4E\\u01F9\\u0144\\u00F1\\u1E45\\u0148\\u1E47\\u0146\\u1E4B\\u1E49\\u019E\\u0272\\u0149\\uA791\\uA7A5]","nj":"[\\u01CC]","o":"[\\u006F\\u24DE\\uFF4F\\u00F2\\u00F3\\u00F4\\u1ED3\\u1ED1\\u1ED7\\u1ED5\\u00F5\\u1E4D\\u022D\\u1E4F\\u014D\\u1E51\\u1E53\\u014F\\u022F\\u0231\\u00F6\\u022B\\u1ECF\\u0151\\u01D2\\u020D\\u020F\\u01A1\\u1EDD\\u1EDB\\u1EE1\\u1EDF\\u1EE3\\u1ECD\\u1ED9\\u01EB\\u01ED\\u00F8\\u01FF\\u0254\\uA74B\\uA74D\\u0275]","oi":"[\\u01A3]","ou":"[\\u0223]","oo":"[\\uA74F]","p":"[\\u0070\\u24DF\\uFF50\\u1E55\\u1E57\\u01A5\\u1D7D\\uA751\\uA753\\uA755]","q":"[\\u0071\\u24E0\\uFF51\\u024B\\uA757\\uA759]","r":"[\\u0072\\u24E1\\uFF52\\u0155\\u1E59\\u0159\\u0211\\u0213\\u1E5B\\u1E5D\\u0157\\u1E5F\\u024D\\u027D\\uA75B\\uA7A7\\uA783]","s":"[\\u0073\\u24E2\\uFF53\\u015B\\u1E65\\u015D\\u1E61\\u0161\\u1E67\\u1E63\\u1E69\\u0219\\u015F\\u023F\\uA7A9\\uA785\\u1E9B]","ss":"[\\u00DF]","t":"[\\u0074\\u24E3\\uFF54\\u1E6B\\u1E97\\u0165\\u1E6D\\u021B\\u0163\\u1E71\\u1E6F\\u0167\\u01AD\\u0288\\u2C66\\uA787]","tz":"[\\uA729]","u":"[\\u0075\\u24E4\\uFF55\\u00F9\\u00FA\\u00FB\\u0169\\u1E79\\u016B\\u1E7B\\u016D\\u00FC\\u01DC\\u01D8\\u01D6\\u01DA\\u1EE7\\u016F\\u0171\\u01D4\\u0215\\u0217\\u01B0\\u1EEB\\u1EE9\\u1EEF\\u1EED\\u1EF1\\u1EE5\\u1E73\\u0173\\u1E77\\u1E75\\u0289]","v":"[\\u0076\\u24E5\\uFF56\\u1E7D\\u1E7F\\u028B\\uA75F\\u028C]","vy":"[\\uA761]","w":"[\\u0077\\u24E6\\uFF57\\u1E81\\u1E83\\u0175\\u1E87\\u1E85\\u1E98\\u1E89\\u2C73]","x":"[\\u0078\\u24E7\\uFF58\\u1E8B\\u1E8D]","y":"[\\u0079\\u24E8\\uFF59\\u1EF3\\u00FD\\u0177\\u1EF9\\u0233\\u1E8F\\u00FF\\u1EF7\\u1E99\\u1EF5\\u01B4\\u024F\\u1EFF]","z":"[\\u007A\\u24E9\\uFF5A\\u017A\\u1E91\\u017C\\u017E\\u1E93\\u1E95\\u01B6\\u0225\\u0240\\u2C6C\\uA763]"},"researchesTests":["contentHasTOC","contentHasShortParagraphs","contentHasAssets","keywordInTitle","keywordInMetaDescription","keywordInPermalink","keywordIn10Percent","keywordInContent","keywordInSubheadings","keywordInImageAlt","keywordDensity","keywordNotUsed","lengthContent","lengthPermalink","linksHasInternal","linksHasExternals","linksNotAllExternals","titleStartWithKeyword","titleSentiment","titleHasPowerWords","titleHasNumber","hasContentAI"],"hasRedirection":true,"hasBreadcrumb":true},"homeUrl":"https:\/\/www.sanjuanito.com.mx\/en\/","objectID":8218,"objectType":"post","locale":"en","localeFull":"en_US","overlayImages":{"play":{"name":"Play icon","url":"https:\/\/www.sanjuanito.com.mx\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-play.png","path":"\/home\/sanjuanito\/public_html\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-play.png","position":"middle_center"},"gif":{"name":"GIF icon","url":"https:\/\/www.sanjuanito.com.mx\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-gif.png","path":"\/home\/sanjuanito\/public_html\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-gif.png","position":"middle_center"}},"defautOgImage":"https:\/\/www.sanjuanito.com.mx\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/social-placeholder.jpg","customPermalinks":true,"isUserRegistered":false,"autoSuggestKeywords":false,"connectSiteUrl":"https:\/\/rankmath.com\/auth?site=https%3A%2F%2Fwww.sanjuanito.com.mx%2Fen%2F&r=https%3A%2F%2Fwww.sanjuanito.com.mx%2Fen%2Fwp-json%2Fwp%2Fv2%2Fpages%2F8218%3Fnonce%3D8d6f5d9344","maxTags":5,"trendsIcon":"<svg viewBox=\"0 0 610 610\"><path d=\"M18.85,446,174.32,290.48l58.08,58.08L76.93,504a14.54,14.54,0,0,1-20.55,0L18.83,466.48a14.54,14.54,0,0,1,0-20.55Z\" style=\"fill:#4285f4\"\/><path d=\"M242.65,242.66,377.59,377.6l-47.75,47.75a14.54,14.54,0,0,1-20.55,0L174.37,290.43l47.75-47.75A14.52,14.52,0,0,1,242.65,242.66Z\" style=\"fill:#ea4335\"\/><polygon points=\"319.53 319.53 479.26 159.8 537.34 217.88 377.61 377.62 319.53 319.53\" style=\"fill:#fabb05\"\/><path d=\"M594.26,262.73V118.61h0a16.94,16.94,0,0,0-16.94-16.94H433.2a16.94,16.94,0,0,0-12,28.92L565.34,274.71h0a16.94,16.94,0,0,0,28.92-12Z\" style=\"fill:#34a853\"\/><rect width=\"610\" height=\"610\" style=\"fill:none\"\/><\/svg>","showScore":true,"siteFavIcon":"https:\/\/www.sanjuanito.com.mx\/wp-content\/uploads\/2025\/01\/cropped-favicon-sanjuanito-32x32.webp","canUser":{"general":false,"advanced":false,"snippet":false,"social":false,"analysis":false,"analytics":false,"content_ai":false},"showKeywordIntent":true,"isPro":false,"is_front_page":false,"trendsUpgradeLink":"https:\/\/rankmath.com\/pricing\/?utm_source=Plugin&utm_medium=CE%20General%20Tab%20Trends&utm_campaign=WP","trendsUpgradeLabel":"Upgrade","trendsPreviewImage":"https:\/\/www.sanjuanito.com.mx\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/trends-preview.jpg","currentEditor":false,"homepageData":{"assessor":{"powerWords":["a cut above","absolute","absolutely","absolutely lowest","absurd","abuse","accurate","accuse","achieve","actionable","adaptable","adequate","admit","adorable","advantage","advice","affordable","aggravate","aggressive","agitated","agonizing","agony","alarmed","alarming","alienated","aligned","alive","all-inclusive","alluring","always","amazing","amp","animated","annihilate","announcing","anonymous","antagonistic","anxious","apocalypse","appalled","approved","approving","argumentative","armageddon","arrogant","ass kicking","assault","assured","astonishing","astounded","astounding","at ease","atrocious","attack","attractive","audacity","authentic","authoritative","authority","avoid","aware","awe-inspiring","awesome","awkward","backbone","backdoor","backed","backlash","backstabbing","badass","balanced","banned","bargain","barrage","basic","battle","beaming","beat down","beating","beautiful","beauty","begging","behind the scenes","belief","belong","best","best-selling","better","beware","big","billion","black market","blacklisted","blast","blessed","blinded","blissful","blood","bloodbath","bloodcurdling","bloody","blunder","blushing","bold","bomb","bona","bona fide","bonanza","bonus","bootleg","bottom line","bountiful","brave","bravery","brazen","break","breaking","breakthrough","breathtaking","bright","brilliant","broke","brutal","budget","buffoon","bullshit","bully","bumbling","buy","cadaver","calm","cancel anytime","capable","captivate","captivating","carefree","case study","cash","cataclysmic","catapult","catastrophe","caution","censored","centered","certain","certainly","certified","challenge","charming","cheap","cheat","cheat-sheet","cheer","cheerful","child-like","clarity","classified","clear","clueless","collapse","colorful","colossal","comfortable","compare","competitive","complete","completely","completeness","comprehensive","compromise","compulsive","concealed","conclusive","condemning","condescending","confess","confession","confessions","confident","confidential","conquer","conscientious","constructive","content","contrary","controlling","controversial","convenient","convert","cool","cooperative","copy","corpse","corrupt","corrupting","courage","courageous","cover-up","covert","coward","cowardly","crammed","crave","crazy","create","creative","cringeworthy","cripple","crisis","critical","crooked","crush","crushing","damaging","danger","dangerous","daring","dazzling","dead","deadline","deadly","death","decadent","deceived","deceptive","deep","defiance","definitely","definitive","defying","dejected","delicious","delight","delighted","delightful","delirious","delivered","demoralizing","deplorable","depraved","desire","desperate","despicable","destiny","destroy","detailed","devastating","devoted","diagnosed","direct","dirty","disadvantages","disastrous","discount","discover","disdainful","disempowered","disgusted","disgusting","dishonest","disillusioned","disoriented","distracted","distraught","distressed","distrustful","divulge","document","dollar","dominate","doomed","double","doubtful","download","dreadful","dreamy","drive","drowning","dumb","dynamic","eager","earnest","easily","easy","economical","ecstatic","edge","effective","efficient","effortless","elated","eliminate","elite","embarrass","embarrassed","embarrassing","emergency","emerging","emphasize","empowered","enchant","encouraged","endorsed","energetic","energy","enormous","enraged","enthusiastic","envy","epic","epidemic","essential","ethical","euphoric","evil","exactly","exasperated","excellent","excited","excitement","exciting","exclusive","exclusivity","excruciating","exhilarated","expensive","expert","explode","exploit","explosive","exposed","exquisite","extra","extraordinary","extremely","exuberant","eye-opening","fail","fail-proof","failure","faith","famous","fantasy","fascinating","fatigued","faux","faux pas","fearless","feast","feeble","festive","fide","fierce","fight","final","fine","fired","first","first ever","flirt","fluid","focus","focused","fool","fooled","foolish","forbidden","force-fed","forever","forgiving","forgotten","formula","fortune","foul","frantic","free","freebie","freedom","frenzied","frenzy","frightening","frisky","frugal","frustrated","fulfill","fulfilled","full","fully","fun","fun-loving","fundamentals","funniest","funny","furious","gambling","gargantuan","genius","genuine","gift","gigantic","giveaway","glamorous","gleeful","glorious","glowing","goddamn","gorgeous","graceful","grateful","gratified","gravity","great","greatest","greatness","greed","greedy","gripping","grit","grounded","growth","guaranteed","guilt","guilt-free","gullible","guts","hack","happiness","happy","harmful","harsh","hate","have you heard","havoc","hazardous","healthy","heart","heartbreaking","heartwarming","heavenly","hell","helpful","helplessness","hero","hesitant","hidden","high tech","highest","highly effective","hilarious","hoak","hoax","honest","honored","hope","hopeful","horribly","horrific","horrifying","horror","hostile","how to","huge","humility","humor","hurricane","hurry","hypnotic","idiot","ignite","illegal","illusive","imagination","immediately","imminently","impatience","impatient","impenetrable","important","impressive","improved","in the zone","incapable","incapacitated","incompetent","inconsiderate","increase","incredible","indecisive","indulgence","indulgent","inexpensive","inferior","informative","infuriated","ingredients","innocent","innovative","insane","insecure","insider","insidious","inspired","inspiring","instant savings","instantly","instructive","insult","intel","intelligent","intense","interesting","intriguing","introducing","invasion","investment","iron-clad","ironclad","irresistible","irs","is here","jackpot","jail","jaw-dropping","jealous","jeopardy","jittery","jovial","joyous","jubilant","judgmental","jumpstart","just arrived","keen","kickass","kickstart","kill","killed","killing","kills","know it all","lame","largest","lascivious","last","last chance","last minute","latest","laugh","laughing","launch","launching","lavishly","lawsuit","lazy","left behind","legendary","legitimate","liberal","liberated","lick","lies","life-changing","lifetime","light","lighthearted","likely","limited","literally","little-known","loathsome","lonely","looming","loser","lost","love","lucrative","lunatic","lurking","lust","luxurious","luxury","lying","magic","magical","magnificent","mainstream","malicious","mammoth","manipulative","marked down","massive","master","masterclass","maul","mediocre","meditative","meltdown","memorability","memorable","menacing","mesmerizing","meticulous","mind-blowing","minimalist","miracle","mired","mischievous","misgiving","missing out","mistake","monetize","money","moneyback","moneygrubbing","monumental","most important","motivated","mouth-watering","murder","mystery","nail","naked","natural","naughty","nazi","nest egg","never","new","nightmare","no good","no obligation","no one talks about","no questions asked","no risk","no strings attached","non-controlling","noted","novelty","now","obnoxious","obsessed","obsession","obvious","odd","off-kilter","off-limits","off-the record","offensive","official","okay","on-demand","open-minded","opportunities","optimistic","ordeal","outlawed","outrageousness","outstanding","overcome","overjoyed","overnight","overwhelmed","packed","painful","painless","painstaking","pale","panic","panicked","paralyzed","pas","passionate","pathetic","pay zero","payback","perfect","peril","perplexed","perspective","pessimistic","pioneering","piranha","pitfall","pitiful","placid","plague","played","playful","pleased","pluck","plummet","plunge","poison","poisonous","polarizing","poor","popular","portfolio","pound","powerful","powerless","practical","preposterous","prestige","price","priceless","pride","prison","privacy","private","privileged","prize","problem","productive","professional","profit","profitable","profound","promiscuous","promising","promote","protect","protected","proven","provocative","provoke","psychological","pummel","punch","punish","pus","quadruple","quality","quarrelsome","quick","quick-start","quickly","quiet","radiant","rare","ravenous","rebellious","recession-proof","reckoning","recognized","recommend","recreate","reduced","reflective","refugee","refund","refundable","reject","relaxed","release","relentless","reliable","remarkable","replicate","report","reprimanding","repulsed","repulsive","research","resentful","resourceful","responsible","responsive","rested","restricted","results","retaliating","reveal","revealing","revenge","revengeful","revisited","revolting","revolutionary","reward","rich","ridiculous","risky","riveting","rookie","rowdy","ruin","rules","ruthless","sabotaging","sacred","sadistic","sadly","sadness","safe","safety","sale","sampler","sarcastic","satisfied","savage","savagery","save","savings","savvy","scam","scandal","scandalous","scarce","scared","scary","scornful","scream","searing","secret","secret agenda","secret plot","secrets","secure","security","seductive","seething","seize","selected","self-hating","self-sufficient","sensational","senseless","sensual","serene","seriously","severe","sex","sexy","shaking","shameful","shameless","shaming","shatter","shellacking","shocking","should","shrewd","sick and tired","signs","silly","simple","simplicity","simplified","simplistic","sincere","sinful","sins","six-figure","sizable","sizzle","sizzled","sizzles","sizzling","sizzlingly","skill","skyrocket","slaughter","slave","sleazy","sleeping","sly","smash","smiling","smug","smuggle","smuggled","sneak-peek","sneaky","sniveling","snob","snooty","snotty","soar","soaring","solid","solution","spank","special","spectacular","speedy","spell-binding","spine","spirit","spirited","spiteful","spoiler","spontaneous","spotlight","spunky","squirming","stable","staggering","startling","steady","steal","stealthy","steamy","step-by-step","still","stoic","stop","strange","strangle","strategy","stressed","strong","strongly suggest","struggle","stuck up","studies","stunning","stupid","stupid-simple","sturdy","sublime","succeed","success","successful","suck","suddenly","suffer","sunny","super","super-human","superb","supercharge","superior","supported","supportive","sure","sure fire","surefire","surge","surging","surprise","surprised","surprising","survival","survive","suspicious","sweaty","swoon","swoon-worthy","tailspin","tank","tantalizing","targeted","tawdry","tease","technology","teetering","tempting","tenacious","tense","terrible","terrific","terrified","terrifying","terror","terrorist","tested","thankful","the truth","threaten","threatened","thrilled","thrilling","thug","ticked off","tickled","timely","today","torture","toxic","track record","trade secret","tragedy","tragic","transform","transparency","trap","trapped","trauma","traumatized","treacherous","treasure","tremendous","trend","tricks","triggers","triple","triumph","truly","trusting","trustworthy","truth","truthful","turbo-charge","turbocharges","tweaks","twitching","ultimate","unadulterated","unassuming","unauthorized","unbelievable","unburdened","uncaring","uncensored","uncertain","uncomfortable","unconditional","uncontrollable","unconventional","uncovered","undeniable","under priced","undercover","underground","underhanded","underused","unexpected","unforgettable","unheard of","unhurried","uninterested","unique","unjustified","unknowingly","unleashed","unlimited","unlock","unparalleled","unpopular","unreliable","unresponsive","unseen","unstable","unstoppable","unsure","unsurpassed","untapped","unusual","up-sell","upbeat","uplifted","uplifting","urge","urgent","useful","useless","validate","valor","valuable","value","vanquish","vaporize","venomous","verify","vibrant","vicious","victim","victory","vigorous","vilified","vindictive","violated","violent","volatile","vulnerable","waiting","wanted","wanton","warning","waste","weak","wealth","weird","what no one tells you","whip","whopping","wicked","wild","willpower","withheld","wonderful","wondrous","woozy","world","worry","worst","worthwhile","wounded","wreaking","youthful","zen","zinger"],"diacritics":true,"researchesTests":["contentHasTOC","contentHasShortParagraphs","contentHasAssets","keywordInTitle","keywordInMetaDescription","keywordInPermalink","keywordIn10Percent","keywordInContent","keywordInSubheadings","keywordInImageAlt","keywordDensity","keywordNotUsed","lengthContent","lengthPermalink","linksHasInternal","linksHasExternals","linksNotAllExternals","titleStartWithKeyword","titleSentiment","titleHasPowerWords","titleHasNumber","hasContentAI"],"hasBreadcrumb":true,"serpData":{"title":"%sitename% %page% %sep% %sitedesc%","description":"","titleTemplate":"%sitename% %page% %sep% %sitedesc%","descriptionTemplate":"","focusKeywords":"","breadcrumbTitle":"Home","robots":{"index":true},"advancedRobots":{"max-snippet":"-1","max-video-preview":"-1","max-image-preview":"large"},"facebookTitle":"","facebookDescription":"","facebookImage":"","facebookImageID":""}}},"tocTitle":"Table of Contents","tocExcludeHeadings":[],"listStyle":"ul"},"_links":{"self":[{"href":"https:\/\/www.sanjuanito.com.mx\/en\/wp-json\/wp\/v2\/pages\/8218","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sanjuanito.com.mx\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.sanjuanito.com.mx\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.sanjuanito.com.mx\/en\/wp-json\/wp\/v2\/users\/18"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sanjuanito.com.mx\/en\/wp-json\/wp\/v2\/comments?post=8218"}],"version-history":[{"count":0,"href":"https:\/\/www.sanjuanito.com.mx\/en\/wp-json\/wp\/v2\/pages\/8218\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sanjuanito.com.mx\/en\/wp-json\/wp\/v2\/media?parent=8218"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}