{"id":49378,"date":"2026-09-05T21:59:47","date_gmt":"2026-09-06T01:59:47","guid":{"rendered":"https:\/\/www.thebeertimes.com\/?page_id=49378"},"modified":"2026-09-07T18:57:14","modified_gmt":"2026-09-07T22:57:14","slug":"beer-sommelier-digital","status":"publish","type":"page","link":"https:\/\/www.thebeertimes.com\/pt-br\/beer-sommelier-digital\/","title":{"rendered":"Beer Sommelier Digital"},"content":{"rendered":"<!-- El Sommelier \u2014 The Beer Times. Bloco autocontido, cole como est\u00e1 em um bloco \"HTML personalizado\" (Gutenberg) ou em um snippet HFCM. Sem depend\u00eancias externas, sem chamadas de rede. -->\r\n<p>Beer Sommelier \u00e9 a ferramenta de harmoniza\u00e7\u00f5es desenvolvida pela The Beer Times\u2122. Recomenda combina\u00e7\u00f5es entre comida e cerveja com base nos estilos de cerveja atualmente reconhecidos e nos tr\u00eas princ\u00edpios cl\u00e1ssicos da harmoniza\u00e7\u00e3o: afinidade, contraste e complemento.<\/p>\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-49319 size-full aligncenter\" title=\"Beer Sommelier\" src=\"https:\/\/www.thebeertimes.com\/wp-content\/uploads\/2026\/09\/Beer-Sommelier.jpg\" alt=\"Beer Sommelier\" width=\"600\" height=\"315\" srcset=\"https:\/\/www.thebeertimes.com\/wp-content\/uploads\/2026\/09\/Beer-Sommelier.jpg 600w, https:\/\/www.thebeertimes.com\/wp-content\/uploads\/2026\/09\/Beer-Sommelier-300x158.jpg 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\r\n<p>Escolha se quer partir de uma comida ou de uma cerveja, selecione uma op\u00e7\u00e3o da lista (ou digite para filtr\u00e1-la) e o sistema mostra as combina\u00e7\u00f5es que melhor harmonizam, com a refer\u00eancia t\u00e9cnica por tr\u00e1s de cada escolha.<\/p>\r\n<h2>O que \u00e9 um sommelier de cerveja?<\/h2>\r\n<p>Em poucas palavras, um sommelier de cerveja \u00e9 um especialista em cerveja que conhece seus estilos, aromas, sabores e caracter\u00edsticas para recomendar harmoniza\u00e7\u00f5es adequadas com diferentes alimentos.<\/p>\r\n<div id=\"tbt-sommelier\" class=\"tbt-sommelier\">\r\n<div class=\"tbt-som-tabs\" role=\"tablist\"><button class=\"tbt-som-tab is-active\" role=\"tab\" type=\"button\" data-mode=\"comida\" aria-selected=\"true\">Tenho uma comida<\/button> <button class=\"tbt-som-tab\" role=\"tab\" type=\"button\" data-mode=\"cerveza\" aria-selected=\"false\">Tenho uma cerveja<\/button><\/div>\r\n<div class=\"tbt-som-search\"><input class=\"tbt-som-search-input\" type=\"text\" placeholder=\"Filtrar categorias ou estilos\u2026\" aria-label=\"Filtrar op\u00e7\u00f5es\" \/><\/div>\r\n<div class=\"tbt-som-chips\" role=\"group\" aria-label=\"Selecione uma op\u00e7\u00e3o\">\u00a0<\/div>\r\n<div class=\"tbt-som-results\" aria-live=\"polite\">\u00a0<\/div>\r\n<\/div>\r\n<p><style>\r\n\r\n\r\n\r\n  .tbt-sommelier{\r\n\r\n\r\n\r\n    --tbt-ink:#111111;\r\n\r\n\r\n\r\n    --tbt-body:#494949;\r\n\r\n\r\n\r\n    --tbt-muted:#898989;\r\n\r\n\r\n\r\n    --tbt-line:#dddddd;\r\n\r\n\r\n\r\n    max-width:720px;\r\n\r\n\r\n\r\n    margin:2rem auto;\r\n\r\n\r\n\r\n    font-family:Roboto,Arial,Helvetica,sans-serif;\r\n\r\n\r\n\r\n    color:var(--tbt-body);\r\n\r\n\r\n\r\n    line-height:1.45;\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n  .tbt-sommelier *{box-sizing:border-box;}\r\n\r\n\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-intro{\r\n\r\n\r\n\r\n    font-size:1.13rem;line-height:1.6;color:var(--tbt-body);margin:0 0 1.2rem;\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-tabs{\r\n\r\n\r\n\r\n    display:flex;gap:1.4rem;border-bottom:1px solid var(--tbt-line);margin-bottom:1rem;\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-tab{\r\n\r\n\r\n\r\n    background:none;border:none;padding:.2rem 0 .7rem;cursor:pointer;\r\n\r\n\r\n\r\n    font-family:inherit;font-size:.95rem;color:var(--tbt-muted);\r\n\r\n\r\n\r\n    border-bottom:2px solid transparent;\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-tab.is-active{color:var(--tbt-ink);font-weight:700;border-bottom-color:var(--tbt-ink);}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-tab:focus-visible{outline:2px solid var(--tbt-ink);outline-offset:2px;}\r\n\r\n\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-search{margin-bottom:.9rem;}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-search-input{\r\n\r\n\r\n\r\n    width:100%;padding:.65rem .8rem;border:1px solid var(--tbt-ink);border-radius:3px;\r\n\r\n\r\n\r\n    font-family:inherit;font-size:1.09rem;color:var(--tbt-ink);background:#fff;\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-search-input:focus-visible{outline:2px solid var(--tbt-ink);outline-offset:1px;}\r\n\r\n\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-chips{\r\n\r\n\r\n\r\n    display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:1.5rem;\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-chip{\r\n\r\n\r\n\r\n    font-family:inherit;font-size:.91rem;letter-spacing:.03em;text-transform:uppercase;font-weight:600;\r\n\r\n\r\n\r\n    padding:.45rem .7rem;border-radius:3px;border:1px solid var(--tbt-ink);background:#fff;color:var(--tbt-ink);\r\n\r\n\r\n\r\n    text-align:left;\r\n\r\n\r\n\r\n    cursor:pointer;\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-chip.is-selected{background:var(--tbt-ink);border-color:var(--tbt-ink);color:#fff;}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-chip:focus-visible{outline:2px solid var(--tbt-ink);outline-offset:2px;}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-chip.is-hidden{display:none;}\r\n\r\n\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-results{display:flex;flex-direction:column;gap:.9rem;}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-results-heading{\r\n\r\n\r\n\r\n    font-size:1.14rem;font-weight:700;color:var(--tbt-ink);margin:0 0 .2rem;\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-card{\r\n\r\n\r\n\r\n    border:1px solid var(--tbt-line);border-radius:5px;padding:.9rem 1rem;\r\n\r\n\r\n\r\n    display:flex;flex-direction:column;gap:.55rem;background:#fff;\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:.6rem;}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-card-head h3{margin:0;font-size:1.17rem;color:var(--tbt-ink);font-weight:700;}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-badge{\r\n\r\n\r\n\r\n    font-size:.81rem;letter-spacing:.03em;text-transform:uppercase;font-weight:700;\r\n\r\n\r\n\r\n    padding:.22rem .45rem;border-radius:3px;white-space:nowrap;flex:none;\r\n\r\n\r\n\r\n    background:var(--tbt-ink);color:#fff;text-decoration:none;\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-attrs{display:flex;gap:1.1rem;font-variant-numeric:tabular-nums;}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-attrs div{display:flex;flex-direction:column;gap:.1rem;}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-attrs .k{font-size:.79rem;color:var(--tbt-muted);text-transform:uppercase;letter-spacing:.06em;}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-attrs .v{font-size:.99rem;color:var(--tbt-ink);font-weight:500;}\r\n\r\n\r\n\r\n  .tbt-sommelier{\r\n\r\n\r\n\r\n    --tbt-cat-afinidad:#d97706;\r\n\r\n\r\n\r\n    --tbt-cat-contraste:#3b82f6;\r\n\r\n\r\n\r\n    --tbt-cat-complemento:#7c2d92;\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-tag{\r\n\r\n\r\n\r\n    display:inline-block;font-size:.72rem;letter-spacing:.05em;text-transform:uppercase;font-weight:700;\r\n\r\n\r\n\r\n    border:1px solid transparent;border-radius:3px;\r\n\r\n\r\n\r\n    padding:.12rem .4rem;margin-bottom:.35rem;text-align:left;width:auto;\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-tag--afinidad{background:#fef3c7;color:#92400e;}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-tag--contraste{background:#dbeafe;color:#1e40af;}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-tag--complemento{background:#f3e8f7;color:#5b1f6e;}\r\n\r\n\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-card--afinidad{border-left:4px solid var(--tbt-cat-afinidad);}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-card--contraste{border-left:4px solid var(--tbt-cat-contraste);}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-card--complemento{border-left:4px solid var(--tbt-cat-complemento);}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-why{font-size:1.04rem;color:var(--tbt-body);margin:0;}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-foot{\r\n\r\n\r\n\r\n    display:flex;align-items:center;justify-content:space-between;border-top:1px solid var(--tbt-line);\r\n\r\n\r\n\r\n    padding-top:.5rem;margin-top:.1rem;\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-foot span{font-size:.91rem;color:var(--tbt-muted);}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-fb{display:flex;gap:.4rem;}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-fb button{\r\n\r\n\r\n\r\n    font-family:inherit;font-size:.7rem;border:1px solid transparent;background:none;color:var(--tbt-ink);\r\n\r\n\r\n\r\n    padding:.2rem .55rem;border-radius:3px;cursor:pointer;\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-fb button.tbt-som-fb-yes{background:#dcfce7;color:#166534;border-color:#bbf7d0;}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-fb button.tbt-som-fb-no{background:#fee2e2;color:#991b1b;border-color:#fecaca;}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-fb button.tbt-som-fb-yes.is-voted{background:#16a34a;color:#fff;border-color:#16a34a;}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-fb button.tbt-som-fb-no.is-voted{background:#dc2626;color:#fff;border-color:#dc2626;}\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-fb button:disabled{opacity:.5;cursor:default;}\r\n\r\n\r\n\r\n\r\n\r\n  .tbt-sommelier .tbt-som-empty{font-size:1.04rem;color:var(--tbt-muted);}\r\n\r\n\r\n\r\n<\/style> <script>\r\n\r\n\r\n\r\n(function(){\r\n\r\n\r\n\r\n  \"use strict\";\r\n\r\n\r\n\r\n\r\n\r\n  var root = document.getElementById(\"tbt-sommelier\");\r\n\r\n\r\n\r\n  if (!root) return;\r\n\r\n\r\n\r\n\r\n\r\n  var PER_CATEGORY = 3;\r\n\r\n\r\n\r\n  \/\/ ---------------------------------------------------------------------\r\n\r\n\r\n\r\n  \/\/ DADOS \u2014 comidas\r\n\r\n\r\n\r\n  \/\/ ---------------------------------------------------------------------\r\n\r\n\r\n\r\n  var FOODS = [\r\n\r\n\r\n\r\n    { id:\"asado\", label:\"Carnes Assadas e Churrasco\" },\r\n\r\n\r\n\r\n    { id:\"bbq-ahumado\", label:\"BBQ e Carnes Defumadas\" },\r\n\r\n\r\n\r\n    { id:\"brasa\", label:\"Carnes na Brasa\" },\r\n\r\n\r\n\r\n    { id:\"carnes-rojas\", label:\"Carnes Vermelhas\" },\r\n\r\n\r\n\r\n    { id:\"cerdo\", label:\"Carne de Porco\" },\r\n\r\n\r\n\r\n    { id:\"pollo\", label:\"Frango e Aves\" },\r\n\r\n\r\n\r\n    { id:\"pato\", label:\"Pato\" },\r\n\r\n\r\n\r\n    { id:\"caza\", label:\"Ca\u00e7a (coelho, javali, veado)\" },\r\n\r\n\r\n\r\n    { id:\"marinados-especiados\", label:\"Carnes Marinadas e Temperadas\" },\r\n\r\n\r\n\r\n    { id:\"embutidos\", label:\"Charcutaria e Embutidos\" },\r\n\r\n\r\n\r\n    { id:\"pescados-blancos\", label:\"Peixes Brancos\" },\r\n\r\n\r\n\r\n    { id:\"pescados-azules\", label:\"Peixes Gordos\" },\r\n\r\n\r\n\r\n    { id:\"mariscos\", label:\"Frutos do Mar\" },\r\n\r\n\r\n\r\n    { id:\"pescados-ahumados\", label:\"Peixes Defumados\" },\r\n\r\n\r\n\r\n    { id:\"sushi\", label:\"Sushi e Peixes Crus\" },\r\n\r\n\r\n\r\n    { id:\"ceviche\", label:\"Ceviche\" },\r\n\r\n\r\n\r\n    { id:\"pastas\", label:\"Massas (com molho vermelho, branco ou misto)\" },\r\n\r\n\r\n\r\n    { id:\"pizza\", label:\"Pizza\" },\r\n\r\n\r\n\r\n    { id:\"panaderia\", label:\"Padaria e P\u00e3o Artesanal\" },\r\n\r\n\r\n\r\n    { id:\"paella-arroces-secos\", label:\"Paella e Arrozes Secos\" },\r\n\r\n\r\n\r\n    { id:\"arroces-caldosos\", label:\"Arrozes Caldosos\" },\r\n\r\n\r\n\r\n    { id:\"legumbres\", label:\"Leguminosas (lentilhas, gr\u00e3o-de-bico, feij\u00f5es)\" },\r\n\r\n\r\n\r\n    { id:\"guisos-legumbres\", label:\"Ensopados de Leguminosas\" },\r\n\r\n\r\n\r\n    { id:\"hamburguesas\", label:\"Hamb\u00fargueres\" },\r\n\r\n\r\n\r\n    { id:\"frituras\", label:\"Frituras e Fast Food\" },\r\n\r\n\r\n\r\n    { id:\"perros-calientes\", label:\"Cachorros-Quentes\" },\r\n\r\n\r\n\r\n    { id:\"snacks-salados\", label:\"Pipoca e Salgadinhos\" },\r\n\r\n\r\n\r\n    { id:\"ensaladas\", label:\"Saladas e Vegetais\" },\r\n\r\n\r\n\r\n    { id:\"vegetariano\", label:\"Pratos Vegetarianos\" },\r\n\r\n\r\n\r\n    { id:\"verduras-asadas\", label:\"Legumes Assados\" },\r\n\r\n\r\n\r\n    { id:\"sopas-guisos\", label:\"Sopas e Ensopados Leves\" },\r\n\r\n\r\n\r\n    { id:\"estofados-carne\", label:\"Ensopados de Carne (carne bovina, cordeiro)\" },\r\n\r\n\r\n\r\n    { id:\"cocidos-pucheros\", label:\"Cozidos e Ensopados Consistentes\" },\r\n\r\n\r\n\r\n    { id:\"fabadas-potajes\", label:\"Fabada e Ensopados de Leguminosas\" },\r\n\r\n\r\n\r\n    { id:\"chili-con-carne\", label:\"Chili com Carne\" },\r\n\r\n\r\n\r\n    { id:\"gazpacho-salmorejo\", label:\"Gazpacho e Salmorejo\" },\r\n\r\n\r\n\r\n    { id:\"ensaladilla-rusa\", label:\"Salada Russa e Saladas de Massa\" },\r\n\r\n\r\n\r\n    { id:\"empanadas-pasteles-salados\", label:\"Empanadas e Past\u00e9is Salgados\" },\r\n\r\n\r\n\r\n    { id:\"pates-terrinas\", label:\"Pat\u00eas e Terrinas\" },\r\n\r\n\r\n\r\n    { id:\"huevos-revueltos-fritos\", label:\"Ovos Mexidos \/ Fritos\" },\r\n\r\n\r\n\r\n    { id:\"tortillas\", label:\"Tortilhas (espanhola, francesa)\" },\r\n\r\n\r\n\r\n    { id:\"huevos-poche-benedictino\", label:\"Ovos Escalfados \/ Benedict\" },\r\n\r\n\r\n\r\n    { id:\"frittatas-quiches\", label:\"Frittatas e Quiches\" },\r\n\r\n\r\n\r\n    { id:\"tapas-frias\", label:\"Tapas Frias\" },\r\n\r\n\r\n\r\n    { id:\"tapas-calientes\", label:\"Tapas Quentes\" },\r\n\r\n\r\n\r\n    { id:\"aperitivos-variados\", label:\"Aperitivos Variados\" },\r\n\r\n\r\n\r\n    { id:\"picante\", label:\"Comida Picante\" },\r\n\r\n\r\n\r\n    { id:\"curry\", label:\"Curry\" },\r\n\r\n\r\n\r\n    { id:\"asiatica\", label:\"Culin\u00e1ria Asi\u00e1tica Salteada\" },\r\n\r\n\r\n\r\n    { id:\"cocina-hindu\", label:\"Culin\u00e1ria Indiana\" },\r\n\r\n\r\n\r\n    { id:\"quesos-frescos\", label:\"Queijos Frescos\" },\r\n\r\n\r\n\r\n    { id:\"quesos-curados\", label:\"Queijos Maturados\" },\r\n\r\n\r\n\r\n    { id:\"quesos-azules\", label:\"Queijos Azuis\" },\r\n\r\n\r\n\r\n    { id:\"frutos-secos-aceitunas\", label:\"Frutos Secos e Azeitonas\" },\r\n\r\n\r\n\r\n    { id:\"salsas\", label:\"Molhos (maionese, aioli, chimichurri)\" },\r\n\r\n\r\n\r\n    { id:\"encurtidos\", label:\"Picles (pepinos, cebolas, alcaparras)\" },\r\n\r\n\r\n\r\n    { id:\"mermeladas-conservas\", label:\"Geleias e Conservas\" },\r\n\r\n\r\n\r\n    { id:\"postres-chocolate\", label:\"Sobremesas com Chocolate\" },\r\n\r\n\r\n\r\n    { id:\"postres-frutales\", label:\"Sobremesas de Frutas\" },\r\n\r\n\r\n\r\n    { id:\"postres-cremosos\", label:\"Sobremesas Cremosas e com Caramelo\" },\r\n\r\n\r\n\r\n    { id:\"postres-especiados\", label:\"Sobremesas Temperadas\" },\r\n\r\n\r\n\r\n    { id:\"helados-sorbetes\", label:\"Sorvetes e Sorbets\" },\r\n\r\n\r\n\r\n    { id:\"donuts-rosquillas\", label:\"Donuts e Rosquinhas\" },\r\n\r\n\r\n\r\n    { id:\"galletas\", label:\"Biscoitos (manteiga, aveia, gotas de chocolate)\" },\r\n\r\n\r\n\r\n    { id:\"pasteles-esponjosos\", label:\"Bolinhos e P\u00e3es de L\u00f3\" }\r\n\r\n\r\n\r\n  ];\r\n\r\n\r\n\r\n  \/\/ ---------------------------------------------------------------------\r\n\r\n\r\n\r\n  \/\/ DADOS \u2014 os 93 estilos BJCP 2021 com estat\u00edsticas fixas de ABV\/IBU\/cor\r\n\r\n\r\n\r\n  \/\/ (os 17 restantes das 110 diretrizes s\u00e3o modelos abertos de\r\n\r\n\r\n\r\n  \/\/ especialidade sem faixa num\u00e9rica fixa, deixados de fora propositalmente).\r\n\r\n\r\n\r\n  \/\/ bitterness\/roast\/strength\/sour\/wheat\/belgian\/smoked\/fruit s\u00e3o\r\n\r\n\r\n\r\n  \/\/ atributos calculados a partir do IBU, cor e categoria oficial, usados\r\n\r\n\r\n\r\n  \/\/ pelo mecanismo de regras abaixo.\r\n\r\n\r\n\r\n  \/\/ ---------------------------------------------------------------------\r\n\r\n\r\n\r\n  var STYLES = [\r\n\r\n\r\n\r\n    { id:\"american-light-lager\", label:\"American Light Lager\", abv:\"2,8\u20134,2%\", ibu:\"8\u201312\", bitterness:\"low\", roast:\"pale\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"american-lager\", label:\"American Lager\", abv:\"4,2\u20135,3%\", ibu:\"8\u201318\", bitterness:\"low\", roast:\"pale\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"cream-ale\", label:\"Cream Ale\", abv:\"4,2\u20135,6%\", ibu:\"8\u201320\", bitterness:\"low\", roast:\"pale\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"american-wheat-beer\", label:\"American Wheat Beer\", abv:\"4\u20135,5%\", ibu:\"15\u201330\", bitterness:\"med\", roast:\"pale\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"international-pale-lager\", label:\"International Pale Lager\", abv:\"4,5\u20136%\", ibu:\"18\u201325\", bitterness:\"med\", roast:\"pale\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"international-amber-lager\", label:\"International Amber Lager\", abv:\"4,5\u20136%\", ibu:\"8\u201325\", bitterness:\"low\", roast:\"amber\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"international-dark-lager\", label:\"International Dark Lager\", abv:\"4,2\u20136%\", ibu:\"8\u201320\", bitterness:\"low\", roast:\"dark\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"czech-pale-lager\", label:\"Czech Pale Lager\", abv:\"3\u20134,1%\", ibu:\"20\u201335\", bitterness:\"med\", roast:\"pale\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"czech-premium-pale-lager\", label:\"Czech Premium Pale Lager\", abv:\"4,2\u20135,8%\", ibu:\"30\u201345\", bitterness:\"med\", roast:\"pale\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"czech-amber-lager\", label:\"Czech Amber Lager\", abv:\"4,4\u20135,8%\", ibu:\"20\u201335\", bitterness:\"med\", roast:\"amber\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"czech-dark-lager\", label:\"Czech Dark Lager\", abv:\"4,4\u20135,8%\", ibu:\"18\u201334\", bitterness:\"med\", roast:\"dark\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"munich-helles\", label:\"Munich Helles\", abv:\"4,7\u20135,4%\", ibu:\"16\u201322\", bitterness:\"low\", roast:\"pale\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"festbier\", label:\"Festbier\", abv:\"5,8\u20136,3%\", ibu:\"18\u201325\", bitterness:\"med\", roast:\"pale\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"helles-bock\", label:\"Helles Bock\", abv:\"6,3\u20137,4%\", ibu:\"23\u201335\", bitterness:\"med\", roast:\"pale\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"german-leichtbier\", label:\"German Leichtbier\", abv:\"2,4\u20133,6%\", ibu:\"15\u201328\", bitterness:\"med\", roast:\"pale\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"kolsch\", label:\"K\u00f6lsch\", abv:\"4,4\u20135,2%\", ibu:\"18\u201330\", bitterness:\"med\", roast:\"pale\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"german-helles-exportbier\", label:\"German Helles Exportbier\", abv:\"5\u20136%\", ibu:\"20\u201330\", bitterness:\"med\", roast:\"pale\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"german-pils\", label:\"German Pils\", abv:\"4,4\u20135,2%\", ibu:\"22\u201340\", bitterness:\"med\", roast:\"pale\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"marzen\", label:\"M\u00e4rzen\", abv:\"5,6\u20136,3%\", ibu:\"18\u201324\", bitterness:\"med\", roast:\"amber\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"rauchbier\", label:\"Rauchbier\", abv:\"4,8\u20136%\", ibu:\"20\u201330\", bitterness:\"med\", roast:\"amber\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:true, fruit:false },\r\n\r\n\r\n\r\n    { id:\"dunkles-bock\", label:\"Dunkles Bock\", abv:\"6,3\u20137,2%\", ibu:\"20\u201327\", bitterness:\"med\", roast:\"amber\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"vienna-lager\", label:\"Vienna Lager\", abv:\"4,7\u20135,5%\", ibu:\"18\u201330\", bitterness:\"med\", roast:\"amber\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"altbier\", label:\"Altbier\", abv:\"4,3\u20135,5%\", ibu:\"25\u201350\", bitterness:\"med\", roast:\"amber\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"munich-dunkel\", label:\"Munich Dunkel\", abv:\"4,5\u20135,6%\", ibu:\"18\u201328\", bitterness:\"med\", roast:\"dark\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"schwarzbier\", label:\"Schwarzbier\", abv:\"4,4\u20135,4%\", ibu:\"20\u201335\", bitterness:\"med\", roast:\"dark\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"doppelbock\", label:\"Doppelbock\", abv:\"7\u201310%\", ibu:\"16\u201326\", bitterness:\"med\", roast:\"amber\", strength:\"strong\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"eisbock\", label:\"Eisbock\", abv:\"9\u201314%\", ibu:\"25\u201335\", bitterness:\"med\", roast:\"dark\", strength:\"veryStrong\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"baltic-porter\", label:\"Baltic Porter\", abv:\"6,5\u20139,5%\", ibu:\"20\u201340\", bitterness:\"med\", roast:\"dark\", strength:\"strong\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"weissbier\", label:\"Weissbier\", abv:\"4,3\u20135,6%\", ibu:\"8\u201315\", bitterness:\"low\", roast:\"pale\", strength:\"session\", sour:false, wheat:true, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"dunkles-weissbier\", label:\"Dunkles Weissbier\", abv:\"4,3\u20135,6%\", ibu:\"10\u201318\", bitterness:\"low\", roast:\"amber\", strength:\"session\", sour:false, wheat:true, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"weizenbock\", label:\"Weizenbock\", abv:\"6,5\u20139%\", ibu:\"15\u201330\", bitterness:\"med\", roast:\"amber\", strength:\"strong\", sour:false, wheat:true, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"ordinary-bitter\", label:\"Ordinary Bitter\", abv:\"3,2\u20133,8%\", ibu:\"25\u201335\", bitterness:\"med\", roast:\"amber\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"best-bitter\", label:\"Best Bitter\", abv:\"3,8\u20134,6%\", ibu:\"25\u201340\", bitterness:\"med\", roast:\"amber\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"strong-bitter\", label:\"Strong Bitter\", abv:\"4,6\u20136,2%\", ibu:\"30\u201350\", bitterness:\"high\", roast:\"amber\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"british-golden-ale\", label:\"British Golden Ale\", abv:\"3,8\u20135%\", ibu:\"20\u201345\", bitterness:\"med\", roast:\"pale\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"australian-sparkling-ale\", label:\"Australian Sparkling Ale\", abv:\"4,5\u20136%\", ibu:\"20\u201335\", bitterness:\"med\", roast:\"pale\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"english-ipa\", label:\"English IPA\", abv:\"5\u20137,5%\", ibu:\"40\u201360\", bitterness:\"high\", roast:\"amber\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"dark-mild\", label:\"Dark Mild\", abv:\"3\u20133,8%\", ibu:\"10\u201325\", bitterness:\"low\", roast:\"amber\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"british-brown-ale\", label:\"British Brown Ale\", abv:\"4,2\u20135,9%\", ibu:\"20\u201330\", bitterness:\"med\", roast:\"amber\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"english-porter\", label:\"English Porter\", abv:\"4\u20135,4%\", ibu:\"18\u201335\", bitterness:\"med\", roast:\"dark\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"scottish-light\", label:\"Scottish Light\", abv:\"2,5\u20133,3%\", ibu:\"10\u201320\", bitterness:\"low\", roast:\"dark\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"scottish-heavy\", label:\"Scottish Heavy\", abv:\"3,3\u20133,9%\", ibu:\"10\u201320\", bitterness:\"low\", roast:\"amber\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"scottish-export\", label:\"Scottish Export\", abv:\"3,9\u20136%\", ibu:\"15\u201330\", bitterness:\"med\", roast:\"amber\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"irish-red-ale\", label:\"Irish Red Ale\", abv:\"3,8\u20135%\", ibu:\"18\u201328\", bitterness:\"med\", roast:\"amber\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"irish-stout\", label:\"Irish Stout\", abv:\"3,8\u20135%\", ibu:\"25\u201345\", bitterness:\"med\", roast:\"dark\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"irish-extra-stout\", label:\"Irish Extra Stout\", abv:\"5\u20136,5%\", ibu:\"35\u201350\", bitterness:\"high\", roast:\"dark\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"sweet-stout\", label:\"Sweet Stout\", abv:\"4\u20136%\", ibu:\"20\u201340\", bitterness:\"med\", roast:\"dark\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"oatmeal-stout\", label:\"Oatmeal Stout\", abv:\"4,2\u20135,9%\", ibu:\"25\u201340\", bitterness:\"med\", roast:\"dark\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"tropical-stout\", label:\"Tropical Stout\", abv:\"5,5\u20138%\", ibu:\"30\u201350\", bitterness:\"high\", roast:\"dark\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"foreign-extra-stout\", label:\"Foreign Extra Stout\", abv:\"6,3\u20138%\", ibu:\"50\u201370\", bitterness:\"high\", roast:\"dark\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"british-strong-ale\", label:\"British Strong Ale\", abv:\"5,5\u20138%\", ibu:\"30\u201360\", bitterness:\"high\", roast:\"amber\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"old-ale\", label:\"Old Ale\", abv:\"5,5\u20139%\", ibu:\"30\u201360\", bitterness:\"high\", roast:\"amber\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"wee-heavy\", label:\"Wee Heavy\", abv:\"6,5\u201310%\", ibu:\"17\u201335\", bitterness:\"med\", roast:\"amber\", strength:\"strong\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"english-barley-wine\", label:\"English Barley Wine\", abv:\"8\u201312%\", ibu:\"35\u201370\", bitterness:\"high\", roast:\"amber\", strength:\"veryStrong\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"blonde-ale\", label:\"Blonde Ale\", abv:\"3,8\u20135,5%\", ibu:\"15\u201328\", bitterness:\"med\", roast:\"pale\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"american-pale-ale\", label:\"American Pale Ale\", abv:\"4,5\u20136,2%\", ibu:\"30\u201350\", bitterness:\"high\", roast:\"pale\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"american-amber-ale\", label:\"American Amber Ale\", abv:\"4,5\u20136,2%\", ibu:\"25\u201340\", bitterness:\"med\", roast:\"amber\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"california-common\", label:\"California Common\", abv:\"4,5\u20135,5%\", ibu:\"30\u201345\", bitterness:\"med\", roast:\"amber\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"american-brown-ale\", label:\"American Brown Ale\", abv:\"4,3\u20136,2%\", ibu:\"20\u201330\", bitterness:\"med\", roast:\"dark\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"american-porter\", label:\"American Porter\", abv:\"4,8\u20136,5%\", ibu:\"25\u201350\", bitterness:\"med\", roast:\"dark\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"american-stout\", label:\"American Stout\", abv:\"5\u20137%\", ibu:\"35\u201375\", bitterness:\"high\", roast:\"dark\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"imperial-stout\", label:\"Imperial Stout\", abv:\"8\u201312%\", ibu:\"50\u201390\", bitterness:\"high\", roast:\"dark\", strength:\"veryStrong\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"american-ipa\", label:\"American IPA\", abv:\"5,5\u20137,5%\", ibu:\"40\u201370\", bitterness:\"high\", roast:\"amber\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"specialty-ipa\", label:\"Specialty IPA\", abv:\"5,5\u20139%\", ibu:\"50\u201390\", bitterness:\"high\", roast:\"dark\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"hazy-ipa\", label:\"Hazy IPA\", abv:\"6\u20139%\", ibu:\"25\u201360\", bitterness:\"high\", roast:\"pale\", strength:\"strong\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"double-ipa\", label:\"Double IPA\", abv:\"7,5\u201310%\", ibu:\"60\u2013100\", bitterness:\"high\", roast:\"amber\", strength:\"strong\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"american-strong-ale\", label:\"American Strong Ale\", abv:\"6,3\u201310%\", ibu:\"50\u2013100\", bitterness:\"high\", roast:\"amber\", strength:\"strong\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"american-barleywine\", label:\"American Barleywine\", abv:\"8\u201312%\", ibu:\"50\u2013100\", bitterness:\"high\", roast:\"amber\", strength:\"veryStrong\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"wheatwine\", label:\"Wheatwine\", abv:\"8\u201312%\", ibu:\"30\u201360\", bitterness:\"high\", roast:\"amber\", strength:\"veryStrong\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"berliner-weisse\", label:\"Berliner Weisse\", abv:\"2,8\u20133,8%\", ibu:\"3\u20138\", bitterness:\"low\", roast:\"pale\", strength:\"session\", sour:true, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"flanders-red-ale\", label:\"Flanders Red Ale\", abv:\"4,6\u20136,5%\", ibu:\"10\u201325\", bitterness:\"low\", roast:\"amber\", strength:\"standard\", sour:true, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"oud-bruin\", label:\"Oud Bruin\", abv:\"4\u20138%\", ibu:\"20\u201325\", bitterness:\"med\", roast:\"amber\", strength:\"standard\", sour:true, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"lambic\", label:\"Lambic\", abv:\"5\u20136,5%\", ibu:\"0\u201310\", bitterness:\"low\", roast:\"pale\", strength:\"standard\", sour:true, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"gueuze\", label:\"Gueuze\", abv:\"5\u20138%\", ibu:\"0\u201310\", bitterness:\"low\", roast:\"pale\", strength:\"standard\", sour:true, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"fruit-lambic\", label:\"Fruit Lambic\", abv:\"5\u20137%\", ibu:\"0\u201310\", bitterness:\"low\", roast:\"pale\", strength:\"standard\", sour:true, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"gose\", label:\"Gose\", abv:\"4,2\u20134,8%\", ibu:\"5\u201312\", bitterness:\"low\", roast:\"pale\", strength:\"session\", sour:true, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"witbier\", label:\"Witbier\", abv:\"4,5\u20135,5%\", ibu:\"8\u201320\", bitterness:\"low\", roast:\"pale\", strength:\"standard\", sour:false, wheat:false, belgian:true, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"belgian-pale-ale\", label:\"Belgian Pale Ale\", abv:\"4,8\u20135,5%\", ibu:\"20\u201330\", bitterness:\"med\", roast:\"amber\", strength:\"standard\", sour:false, wheat:false, belgian:true, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"biere-de-garde\", label:\"Bi\u00e8re de Garde\", abv:\"6\u20138,5%\", ibu:\"18\u201328\", bitterness:\"med\", roast:\"amber\", strength:\"standard\", sour:false, wheat:false, belgian:true, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"belgian-blond-ale\", label:\"Belgian Blond Ale\", abv:\"6\u20137,5%\", ibu:\"15\u201330\", bitterness:\"med\", roast:\"pale\", strength:\"standard\", sour:false, wheat:false, belgian:true, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"saison\", label:\"Saison\", abv:\"5\u20137%\", ibu:\"20\u201335\", bitterness:\"med\", roast:\"amber\", strength:\"standard\", sour:false, wheat:false, belgian:true, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"belgian-golden-strong-ale\", label:\"Belgian Golden Strong Ale\", abv:\"7,5\u201310,5%\", ibu:\"22\u201335\", bitterness:\"med\", roast:\"pale\", strength:\"strong\", sour:false, wheat:false, belgian:true, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"belgian-single\", label:\"Belgian Single\", abv:\"4,8\u20136%\", ibu:\"25\u201345\", bitterness:\"med\", roast:\"pale\", strength:\"standard\", sour:false, wheat:false, belgian:true, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"belgian-dubbel\", label:\"Belgian Dubbel\", abv:\"6\u20137,6%\", ibu:\"15\u201325\", bitterness:\"med\", roast:\"amber\", strength:\"standard\", sour:false, wheat:false, belgian:true, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"belgian-tripel\", label:\"Belgian Tripel\", abv:\"7,5\u20139,5%\", ibu:\"20\u201340\", bitterness:\"med\", roast:\"pale\", strength:\"strong\", sour:false, wheat:false, belgian:true, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"belgian-dark-strong-ale\", label:\"Belgian Dark Strong Ale\", abv:\"8\u201312%\", ibu:\"20\u201335\", bitterness:\"med\", roast:\"amber\", strength:\"veryStrong\", sour:false, wheat:false, belgian:true, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"straight-sour-beer\", label:\"Straight Sour Beer\", abv:\"4,5\u20137%\", ibu:\"3\u20138\", bitterness:\"low\", roast:\"pale\", strength:\"standard\", sour:true, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"grape-ale\", label:\"Grape Ale\", abv:\"6\u20138,5%\", ibu:\"10\u201330\", bitterness:\"med\", roast:\"pale\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:true },\r\n\r\n\r\n\r\n    { id:\"dorada-pampeana\", label:\"Dorada Pampeana\", abv:\"4,3\u20135,5%\", ibu:\"15\u201322\", bitterness:\"low\", roast:\"pale\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"ipa-argenta\", label:\"IPA Argenta\", abv:\"5\u20136,5%\", ibu:\"35\u201360\", bitterness:\"high\", roast:\"amber\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"italian-grape-ale\", label:\"Italian Grape Ale\", abv:\"4,5\u201312%\", ibu:\"6\u201330\", bitterness:\"low\", roast:\"amber\", strength:\"strong\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"catharina-sour\", label:\"Catharina Sour\", abv:\"4\u20135,5%\", ibu:\"2\u20138\", bitterness:\"low\", roast:\"pale\", strength:\"session\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false },\r\n\r\n\r\n\r\n    { id:\"new-zealand-pilsner\", label:\"New Zealand Pilsner\", abv:\"4,5\u20135,8%\", ibu:\"25\u201345\", bitterness:\"med\", roast:\"pale\", strength:\"standard\", sour:false, wheat:false, belgian:false, smoked:false, fruit:false }\r\n\r\n\r\n\r\n  ];\r\n\r\n\r\n\r\n  \/\/ ---------------------------------------------------------------------\r\n\r\n\r\n\r\n  \/\/ MECANISMO DE HARMONIZA\u00c7\u00c3O POR ATRIBUTOS \u2014 cada comida define tr\u00eas regras\r\n\r\n\r\n\r\n  \/\/ independentes, uma por princ\u00edpio (afinidade, contraste, complemento),\r\n\r\n\r\n\r\n  \/\/ avaliadas contra os 93 estilos. N\u00e3o \u00e9 uma lista fechada de pares,\r\n\r\n\r\n\r\n  \/\/ qualquer novo estilo adicionado a STYLES fica automaticamente dispon\u00edvel\r\n\r\n\r\n\r\n  \/\/ para os tr\u00eas sem tocar nesta se\u00e7\u00e3o.\r\n\r\n\r\n\r\n  \/\/ ---------------------------------------------------------------------\r\n\r\n\r\n\r\n  var CATS = [\"afinidad\", \"contraste\", \"complemento\"];\r\n\r\n\r\n\r\n\r\n\r\n  var RULES = {\r\n\r\n\r\n\r\n    \"asado\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.smoked || s.roast===\"dark\"; },\r\n\r\n\r\n\r\n        text:function(s){ return s.smoked ? \"O car\u00e1ter defumado do estilo dialoga diretamente com a fuma\u00e7a da churrasqueira.\" : \"O torrado do malte ecoa o tostado e a fuma\u00e7a do assado.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"high\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor pronunciado corta a gordura de cortes intensos na grelha.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.strength===\"session\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo leve e a carbonata\u00e7\u00e3o alta refrescam durante um churrasco longo sem pesar.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"bbq-ahumado\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.smoked; },\r\n\r\n\r\n\r\n        text:function(){ return \"O car\u00e1ter defumado do estilo dialoga diretamente com a fuma\u00e7a do cozimento lento.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"high\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor corta a gordura de um cozimento longo e untuoso.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"dark\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O torrado do malte acompanha o sabor defumado sem competir.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"brasa\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"amber\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O perfil tostado m\u00e9dio ecoa o dourado e as marcas da brasa.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"high\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor corta a gordura de uma carne cozida na brasa.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.strength===\"standard\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo m\u00e9dio acompanha a carne na brasa sem domin\u00e1-la.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"carnes-rojas\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"dark\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O torrado do malte ecoa o dourado e a crosta da carne vermelha.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"high\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor e a carbonata\u00e7\u00e3o cortam a gordura de uma carne vermelha suculenta.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"amber\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O perfil tostado m\u00e9dio acompanha a carne sem domin\u00e1-la.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"cerdo\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.belgian; },\r\n\r\n\r\n\r\n        text:function(){ return \"A do\u00e7ura de fruta madura e os \u00e9steres belgas acompanham molhos e glaceados t\u00edpicos do porco.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\" || s.bitterness===\"high\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor corta a gordura do porco.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"amber\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O perfil tostado m\u00e9dio combina com glaceados e molhos dourados.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"pollo\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.wheat; },\r\n\r\n\r\n\r\n        text:function(){ return \"Os \u00e9steres frutados do trigo combinam com frango preparado com especiarias suaves.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return (s.bitterness===\"med\" || s.bitterness===\"high\") && s.roast!==\"dark\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor moderado corta a gordura de um frango frito ou glaceado.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.bitterness===\"low\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo leve e o baixo amargor n\u00e3o ofuscam uma carne delicada como o frango.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"pato\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.fruit; },\r\n\r\n\r\n\r\n        text:function(){ return \"As notas frutadas ecoam o molho de fruta t\u00edpico do pato.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez corta a gordura rica do pato.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.strength===\"strong\" || s.strength===\"veryStrong\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo denso iguala a intensidade do pato.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"caza\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"dark\" || s.belgian; },\r\n\r\n\r\n\r\n        text:function(){ return \"O torrado escuro ou a do\u00e7ura especiada de um estilo belga ecoam o sabor intenso da ca\u00e7a.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez corta a gordura e o sabor forte de uma carne de ca\u00e7a.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.strength===\"strong\" || s.strength===\"veryStrong\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo denso iguala a intensidade de uma carne de ca\u00e7a.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"marinados-especiados\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.smoked; },\r\n\r\n\r\n\r\n        text:function(){ return \"O car\u00e1ter defumado ou tostado do estilo ecoa uma marinada especiada na grelha.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"high\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor alto corta a gordura de um corte marinado.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"amber\" && s.strength===\"standard\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo m\u00e9dio acompanha uma carne marinada sem domin\u00e1-la.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"embutidos\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.belgian; },\r\n\r\n\r\n\r\n        text:function(){ return \"As notas de fruta escura e caramelo acompanham a gordura curada do embutido.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"high\" || s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor ou a acidez cortam a gordura curada do embutido.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"amber\" && s.strength===\"standard\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo m\u00e9dio acompanha o embutido sem competir com seu sal.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"pescados-blancos\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"pale\" && s.bitterness===\"med\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"Os matizes c\u00edtricos ou florais do l\u00fapulo ecoam o lim\u00e3o que costuma acompanhar o peixe branco.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez do estilo contrasta com a do\u00e7ura natural do peixe branco.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.bitterness===\"low\" && s.strength===\"session\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo leve n\u00e3o ofusca um peixe branco de sabor delicado.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"pescados-azules\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"pale\" && s.bitterness===\"med\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"Os matizes c\u00edtricos ou florais do l\u00fapulo ecoam o lim\u00e3o que corta a gordura do peixe gordo.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\" || s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor ou a acidez cortam a gordura pr\u00f3pria de um peixe gordo.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"amber\" && s.strength===\"standard\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo m\u00e9dio acompanha o sabor mais intenso de um peixe gordo.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"mariscos\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"pale\" && s.bitterness===\"med\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"Os matizes c\u00edtricos ou florais do l\u00fapulo ecoam o lim\u00e3o que costuma acompanhar os frutos do mar.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez do estilo contrasta com a do\u00e7ura natural dos frutos do mar.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.bitterness!==\"high\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O perfil leve e a carbonata\u00e7\u00e3o fina real\u00e7am a salinidade dos frutos do mar sem encobri-la.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"pescados-ahumados\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.smoked; },\r\n\r\n\r\n\r\n        text:function(){ return \"O car\u00e1ter defumado do estilo ecoa o peixe defumado.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez corta a untuosidade de um peixe defumado.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.bitterness===\"low\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo leve n\u00e3o ofusca um peixe defumado.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"sushi\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez cumpre um papel semelhante ao do vinagre do arroz.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"Um amargor moderado limpa a gordura de cortes como salm\u00e3o ou atum gordo.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.bitterness===\"low\" && s.strength===\"session\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo leve e a baixa intensidade deixam o peixe cru como protagonista.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"ceviche\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez ecoa o c\u00edtrico de um ceviche.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor moderado corta o \u00f3leo natural do peixe cru.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.bitterness===\"low\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo leve n\u00e3o ofusca um ceviche delicado.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"pastas\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.belgian; },\r\n\r\n\r\n\r\n        text:function(){ return \"A do\u00e7ura de fruta madura combina com massas recheadas de carne e molhos reduzidos.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\" && s.roast!==\"dark\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor moderado equilibra molhos \u00e0 base de tomate.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.bitterness===\"low\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O perfil leve n\u00e3o compete com massas simples de azeite e alho.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"pizza\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"dark\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O torrado do malte ecoa uma crosta bem assada ou embutidos defumados.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\" && s.roast!==\"dark\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor corta a gordura do queijo derretido.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"amber\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O perfil tostado acompanha a crosta sem competir com os demais ingredientes.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"panaderia\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.belgian; },\r\n\r\n\r\n\r\n        text:function(){ return \"Os \u00e9steres belgas ecoam a crosta caramelizada do p\u00e3o artesanal.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor moderado corta a manteiga passada no p\u00e3o.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"amber\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O tostado m\u00e9dio ecoa a crosta sem competir.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"paella-arroces-secos\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"amber\" && s.strength===\"standard\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O perfil tostado m\u00e9dio ecoa o socarrat e o sofrito de uma paella ou arroz seco.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\" || s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor ou a acidez cortam o azeite do sofrito.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.bitterness===\"med\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O frescor c\u00edtrico do l\u00fapulo acompanha a variedade de ingredientes sem encobri-los.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"arroces-caldosos\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"amber\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O perfil tostado m\u00e9dio ecoa a profundidade de um caldo reduzido.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor moderado corta a untuosidade de um arroz caldoso.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.strength===\"session\" || s.strength===\"standard\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo leve a m\u00e9dio n\u00e3o ofusca um caldo delicado.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"legumbres\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"dark\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O torrado escuro ecoa o car\u00e1ter terroso das leguminosas.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor moderado alivia a densidade de um prato de leguminosas.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"amber\" && s.strength===\"standard\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo m\u00e9dio acompanha as leguminosas sem domin\u00e1-las.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"guisos-legumbres\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.smoked || s.roast===\"dark\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O car\u00e1ter defumado ou tostado ecoa o chouri\u00e7o ou a morcela de um ensopado de leguminosas.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"high\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor corta a gordura de um ensopado de leguminosas com embutido.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"amber\" && s.strength===\"standard\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo m\u00e9dio iguala a intensidade de um ensopado de leguminosas.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"hamburguesas\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"dark\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O torrado do malte acompanha carnes com notas defumadas.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"high\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor resinoso corta a gordura da carne e do queijo derretido.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"amber\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo m\u00e9dio acompanha o hamb\u00farguer sem competir com o p\u00e3o nem a alface.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"frituras\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"amber\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O perfil tostado do estilo ecoa o dourado de uma fritura.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\" || s.bitterness===\"high\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor corta a gordura de uma fritura.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.strength===\"session\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"A leveza e a carbonata\u00e7\u00e3o alta limpam o paladar entre uma mordida e outra de fritura.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"perros-calientes\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"amber\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O perfil tostado ecoa a salsicha grelhada ou na chapa.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\" || s.bitterness===\"high\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor corta a gordura da salsicha e os molhos doces do cachorro-quente.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.strength===\"session\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo leve e refrescante acompanha um fast-food sem adicionar mais peso.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"snacks-salados\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"amber\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O tostado m\u00e9dio ecoa o milho tostado de um salgadinho.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\" || s.bitterness===\"high\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor corta a gordura de frituras e manteiga.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.strength===\"session\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo leve refresca entre uma mordida e outra de salgadinho.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"ensaladas\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez do estilo ecoa o vinagre de um molho fresco.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\" || s.bitterness===\"high\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor corta a cremosidade de um molho tipo c\u00e9sar ou ranch.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.strength===\"session\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O perfil leve e refrescante n\u00e3o ofusca vegetais crus nem molhos c\u00edtricos.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"vegetariano\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.wheat || s.belgian; },\r\n\r\n\r\n\r\n        text:function(){ return \"Os matizes frutados ou especiados combinam com vegetais assados e ervas frescas.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"high\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor contrasta com a do\u00e7ura natural de vegetais assados ou glaceados.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.bitterness===\"low\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo leve n\u00e3o ofusca sabores vegetais delicados.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"verduras-asadas\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"amber\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O perfil tostado do estilo ecoa a carameliza\u00e7\u00e3o de um vegetal assado.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"high\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor contrasta com a do\u00e7ura de um vegetal caramelizado no forno.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.bitterness===\"low\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo leve n\u00e3o ofusca o sabor natural do vegetal assado.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"sopas-guisos\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"dark\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O torrado escuro ecoa uma sopa ou ensopado de cozimento lento.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor moderado corta a untuosidade de uma sopa espessa.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.strength===\"session\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo leve acompanha uma sopa suave sem adicionar mais peso.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"estofados-carne\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"dark\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O torrado escuro ecoa a profundidade de um ensopado de carne de cozimento lento.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor moderado corta a untuosidade de um ensopado de carne.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.strength===\"standard\" || s.strength===\"strong\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo denso iguala a intensidade de um ensopado de carne bovina ou cordeiro.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"cocidos-pucheros\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.smoked || s.roast===\"dark\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O car\u00e1ter defumado ou tostado ecoa o chouri\u00e7o ou a morcela de um cozido.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\" || s.bitterness===\"high\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor corta a gordura das carnes de um cozido.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"amber\" && s.strength===\"standard\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo m\u00e9dio acompanha um cozido sem domin\u00e1-lo.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"fabadas-potajes\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.smoked; },\r\n\r\n\r\n\r\n        text:function(){ return \"O car\u00e1ter defumado do estilo ecoa o chouri\u00e7o e a morcela de uma fabada.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"high\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor alto corta a gordura densa de uma fabada.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"dark\" && s.strength===\"standard\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O torrado escuro e o corpo m\u00e9dio igualam a riqueza de um ensopado de leguminosas.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"chili-con-carne\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"dark\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O torrado escuro ecoa a carne e o p\u00e1prica de um chili com carne.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"low\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"Um amargor baixo refresca o paladar sem adicionar mais ardor ao chili.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"amber\" && s.strength===\"standard\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo m\u00e9dio iguala a intensidade de um chili com carne.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"gazpacho-salmorejo\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez do estilo ecoa o tomate e o vinagre de um gazpacho ou salmorejo.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor moderado corta o azeite de uma sopa fria.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.strength===\"session\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo leve e refrescante acompanha uma sopa fria sem adicionar peso.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"ensaladilla-rusa\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"pale\" && s.bitterness===\"med\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"Os matizes c\u00edtricos do l\u00fapulo ecoam o atum e os picles de uma salada russa.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez corta a maionese de uma salada russa.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.strength===\"session\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo leve n\u00e3o ofusca uma salada fria \u00e0 base de maionese.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"empanadas-pasteles-salados\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"amber\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O perfil tostado ecoa uma massa assada ou frita.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\" || s.bitterness===\"high\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor corta a gordura da massa e do recheio de uma empanada.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"amber\" && s.strength===\"standard\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo m\u00e9dio acompanha uma empanada ou pastel salgado sem domin\u00e1-lo.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"pates-terrinas\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.belgian || s.fruit; },\r\n\r\n\r\n\r\n        text:function(){ return \"A do\u00e7ura frutada do estilo ecoa o marmelo ou a geleia que costuma acompanhar um pat\u00ea.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour || s.bitterness===\"high\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez ou o amargor cortam a gordura densa de um pat\u00ea ou terrina.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.strength===\"strong\" || s.strength===\"veryStrong\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo denso iguala a riqueza de um pat\u00ea.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"huevos-revueltos-fritos\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"amber\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O perfil tostado do estilo ecoa a riqueza da gema de ovo.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor moderado corta a gordura da gema.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.strength===\"session\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo leve n\u00e3o ofusca um prato de ovo simples.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"tortillas\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"amber\" && s.strength===\"standard\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O perfil tostado m\u00e9dio ecoa a cebola ou a batata caramelizada de uma tortilha.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor moderado corta a gordura do ovo e da batata.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.bitterness===\"low\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo leve n\u00e3o ofusca uma tortilha simples.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"huevos-poche-benedictino\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"pale\" && s.bitterness===\"med\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"Os matizes c\u00edtricos do l\u00fapulo ecoam o lim\u00e3o de um molho holand\u00eas.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez corta a gordura de um molho holand\u00eas.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.strength===\"session\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo leve n\u00e3o compete com um ovo escalfado delicado.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"frittatas-quiches\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.wheat || s.belgian; },\r\n\r\n\r\n\r\n        text:function(){ return \"Os matizes frutados ou especiados do estilo combinam com as ervas e vegetais de uma quiche.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor moderado corta a gordura do queijo e do creme de uma frittata ou quiche.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"amber\" && s.strength===\"standard\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo m\u00e9dio acompanha uma frittata ou quiche sem domin\u00e1-la.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"tapas-frias\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"pale\" && s.bitterness===\"med\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O frescor c\u00edtrico do l\u00fapulo ecoa um presunto, um queijo ou uma tapa fria.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez corta a gordura e o sal de um embutido ou queijo maturado.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.strength===\"session\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo leve acompanha uma variedade de tapas frias sem dominar nenhuma.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"tapas-calientes\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"amber\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O perfil tostado ecoa o dourado de uma croquete ou de lulas fritas.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\" || s.bitterness===\"high\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor corta a gordura de uma tapa frita.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"amber\" && s.strength===\"standard\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo m\u00e9dio acompanha uma variedade de tapas quentes.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"aperitivos-variados\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.belgian; },\r\n\r\n\r\n\r\n        text:function(){ return \"Os \u00e9steres belgas acompanham a variedade de sabores de uma t\u00e1bua de aperitivos.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"high\" || s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor ou a acidez cortam a gordura e o sal de frituras e petiscos salgados.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"amber\" && s.strength===\"standard\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo m\u00e9dio acompanha aperitivos variados sem competir.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"picante\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.belgian; },\r\n\r\n\r\n\r\n        text:function(){ return \"Os matizes especiados do estilo ecoam as especiarias do prato picante.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"low\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"Um amargor baixo refresca o paladar sem adicionar mais ardor ao picante.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.strength===\"session\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo leve n\u00e3o adiciona mais intensidade a um prato j\u00e1 picante.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"curry\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.belgian || s.wheat; },\r\n\r\n\r\n\r\n        text:function(){ return \"Os matizes especiados e frutados do estilo combinam com as especiarias do curry.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez corta a untuosidade de um molho de curry cremoso.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.bitterness===\"low\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O perfil leve n\u00e3o compete com as especiarias do curry.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"asiatica\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.wheat || s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"Os matizes frutados ou a acidez do estilo dialogam com sabores agridoces.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez corta a gordura de molhos com soja ou \u00f3leo de gergelim.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.bitterness===\"low\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O perfil leve e limpo n\u00e3o compete com molhos de soja, gengibre ou gergelim.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"cocina-hindu\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.belgian || s.wheat; },\r\n\r\n\r\n\r\n        text:function(){ return \"Os matizes especiados e frutados do estilo ecoam as especiarias da culin\u00e1ria indiana.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez corta a untuosidade do ghee e dos molhos cremosos.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.bitterness===\"low\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O perfil leve n\u00e3o compete com a camada de especiarias de um prato indiano.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"quesos-frescos\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.wheat; },\r\n\r\n\r\n\r\n        text:function(){ return \"O car\u00e1ter suave do trigo ecoa a cremosidade de um queijo fresco.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez contrasta com a cremosidade de um queijo fresco.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.strength===\"session\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo leve n\u00e3o ofusca um queijo fresco de sabor delicado.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"quesos-curados\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.belgian; },\r\n\r\n\r\n\r\n        text:function(){ return \"As notas de fruta escura acompanham um queijo maturado de sabor intenso.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez contrasta com a densidade de um queijo maturado.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.strength===\"strong\" || s.strength===\"veryStrong\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo e a do\u00e7ura alco\u00f3lica equilibram um queijo maturado ou de pasta dura.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"quesos-azules\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.fruit; },\r\n\r\n\r\n\r\n        text:function(){ return \"A do\u00e7ura frutada do estilo ecoa o mel ou a geleia que costuma acompanhar um queijo azul.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.strength===\"strong\" || s.strength===\"veryStrong\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"A do\u00e7ura e o corpo denso de um estilo intenso equilibram o sal e o picante de um queijo azul.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.belgian; },\r\n\r\n\r\n\r\n        text:function(){ return \"Os \u00e9steres belgas acompanham um queijo azul sem serem ofuscados por sua intensidade.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"frutos-secos-aceitunas\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.belgian; },\r\n\r\n\r\n\r\n        text:function(){ return \"Os \u00e9steres belgas ecoam frutos secos tostados.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez corta o oleoso da azeitona.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"amber\" && s.strength===\"standard\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo m\u00e9dio acompanha frutos secos e azeitonas sem competir.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"salsas\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez do estilo ecoa um molho \u00e0 base de vinagre como o mojo ou o chimichurri.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"high\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor corta a gordura de um molho \u00e0 base de maionese como o aioli ou a brava.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"amber\" && s.strength===\"standard\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo m\u00e9dio acompanha um molho sem competir com o prato principal.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"encurtidos\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez do estilo ecoa o vinagre de um picles.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O amargor moderado equilibra o ponto \u00e1cido de um picles.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.roast===\"pale\" && s.strength===\"session\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo leve e crocante n\u00e3o compete com um picles.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"mermeladas-conservas\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.fruit; },\r\n\r\n\r\n\r\n        text:function(){ return \"As notas frutadas do estilo ecoam uma geleia ou conserva de frutas.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez equilibra a do\u00e7ura de uma geleia ou conserva.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.strength===\"standard\" || s.strength===\"strong\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo e a do\u00e7ura do estilo acompanham uma geleia ou conserva sem encobri-la.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"postres-chocolate\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"dark\" && (s.strength===\"strong\" || s.strength===\"veryStrong\"); },\r\n\r\n\r\n\r\n        text:function(){ return \"A do\u00e7ura intensa e as notas de caf\u00e9 ou chocolate de um estilo escuro e forte acompanham o chocolate.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez equilibra a do\u00e7ura de uma sobremesa de chocolate intenso.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.strength===\"strong\" || s.strength===\"veryStrong\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo denso e a do\u00e7ura do estilo acompanham uma sobremesa de chocolate sem competir.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"postres-frutales\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.fruit; },\r\n\r\n\r\n\r\n        text:function(){ return \"As notas frutadas do estilo ecoam a fruta da sobremesa.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez equilibra a do\u00e7ura de uma sobremesa frutada.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.strength===\"standard\" || s.strength===\"strong\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo e a do\u00e7ura do estilo acompanham uma sobremesa frutada sem encobri-la.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"postres-cremosos\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.belgian; },\r\n\r\n\r\n\r\n        text:function(){ return \"A do\u00e7ura de fruta madura e caramelo do estilo ecoa uma sobremesa cremosa ou com doce de leite.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez corta a untuosidade de uma sobremesa cremosa.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.strength===\"strong\" || s.strength===\"veryStrong\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo denso do estilo acompanha uma sobremesa cremosa sem competir.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"postres-especiados\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.belgian; },\r\n\r\n\r\n\r\n        text:function(){ return \"Os \u00e9steres belgas ecoam canela, gengibre ou noz-moscada.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez equilibra a do\u00e7ura de uma sobremesa especiada.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.strength===\"strong\" || s.strength===\"veryStrong\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo denso iguala a intensidade de uma sobremesa especiada.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"helados-sorbetes\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.fruit; },\r\n\r\n\r\n\r\n        text:function(){ return \"As notas frutadas do estilo ecoam um sorbet de frutas.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.bitterness===\"med\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"Um amargor moderado corta a gordura e a do\u00e7ura de um sorvete cremoso.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.strength===\"strong\" || s.strength===\"veryStrong\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo denso e a do\u00e7ura do estilo acompanham um sorvete no estilo float.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"donuts-rosquillas\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"dark\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O torrado escuro ecoa o glaceado caramelizado de um donut.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez corta a do\u00e7ura e a gordura de uma massa frita.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.strength===\"strong\" || s.strength===\"veryStrong\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"A do\u00e7ura e o corpo do estilo acompanham um donut sem serem ofuscados.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"galletas\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.roast===\"dark\" && (s.strength===\"strong\" || s.strength===\"veryStrong\"); },\r\n\r\n\r\n\r\n        text:function(){ return \"As notas de caramelo, caf\u00e9 ou chocolate de um estilo escuro e forte ecoam um biscoito assado.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez equilibra a do\u00e7ura de um biscoito.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.strength===\"strong\" || s.strength===\"veryStrong\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"A do\u00e7ura e o corpo do estilo acompanham um biscoito sem competir.\"; } }\r\n\r\n\r\n\r\n    },\r\n\r\n\r\n\r\n    \"pasteles-esponjosos\": {\r\n\r\n\r\n\r\n      afinidad: { test:function(s){ return s.fruit || s.belgian; },\r\n\r\n\r\n\r\n        text:function(){ return \"As notas frutadas ou especiadas do estilo ecoam as raspas de c\u00edtrico de um bolo ou bolinho.\"; } },\r\n\r\n\r\n\r\n      contraste: { test:function(s){ return s.sour; },\r\n\r\n\r\n\r\n        text:function(){ return \"A acidez corta a do\u00e7ura de um bolo esponjoso.\"; } },\r\n\r\n\r\n\r\n      complemento: { test:function(s){ return s.strength===\"standard\" || s.strength===\"strong\"; },\r\n\r\n\r\n\r\n        text:function(){ return \"O corpo e a do\u00e7ura moderada do estilo acompanham um bolo esponjoso sem encobri-lo.\"; } }\r\n\r\n\r\n\r\n    }\r\n\r\n\r\n\r\n  };\r\n\r\n\r\n\r\n\r\n\r\n  var CAT_LABELS = { afinidad:\"Afinidade\", contraste:\"Contraste\", complemento:\"Complemento\" };\r\n\r\n\r\n\r\n  \/\/ ---------------------------------------------------------------------\r\n\r\n\r\n\r\n  \/\/ N\u00cdVEL A \u2014 cervejas resenhadas pela TBT que refor\u00e7am uma recomenda\u00e7\u00e3o.\r\n\r\n\r\n\r\n  \/\/ Vazio propositalmente. Preencher apenas com dados verificados\r\n\r\n\r\n\r\n  \/\/ a partir do artigo real (post_id, estilo exato como publicado).\r\n\r\n\r\n\r\n  \/\/ Formato: { style:\"<id de STYLES>\", title:\"...\", postId: 0 }\r\n\r\n\r\n\r\n  \/\/ ---------------------------------------------------------------------\r\n\r\n\r\n\r\n  var REVIEWED_BEERS = [\r\n\r\n\r\n\r\n    { style:\"belgian-blond-ale\", title:\"Chimay Dor\u00e9e (Blonde)\", postId:49160 },\r\n\r\n\r\n\r\n    { style:\"weissbier\", title:\"Weihenstephaner Hefe Weissbier\", postId:44791 },\r\n\r\n\r\n\r\n    { style:\"double-ipa\", title:\"Pliny the Elder\", postId:44686 },\r\n\r\n\r\n\r\n    { style:\"gueuze\", title:\"3 Fonteinen Oude Geuze\", postId:49167 },\r\n\r\n\r\n\r\n    { style:\"international-pale-lager\", title:\"Stella Artois\", postId:42684 },\r\n\r\n\r\n\r\n    { style:\"vienna-lager\", title:\"Cerveza Indio\", postId:42456 },\r\n\r\n\r\n\r\n    { style:\"best-bitter\", title:\"Fuller\u2019s London Pride\", postId:17095 },\r\n\r\n\r\n\r\n    { style:\"munich-dunkel\", title:\"Negra Modelo Dunkel\", postId:34782 },\r\n\r\n\r\n\r\n    { style:\"belgian-dark-strong-ale\", title:\"St. Bernardus Abt 12\", postId:17125 },\r\n\r\n\r\n\r\n    { style:\"witbier\", title:\"Hoegaarden Wit\", postId:17008 },\r\n\r\n\r\n\r\n    { style:\"american-ipa\", title:\"Lagunitas IPA\", postId:16912 },\r\n\r\n\r\n\r\n    { style:\"english-ipa\", title:\"Goose Island IPA\", postId:16948 },\r\n\r\n\r\n\r\n    { style:\"imperial-stout\", title:\"Fuller\u2019s Imperial Stout\", postId:17074 },\r\n\r\n\r\n\r\n    { style:\"belgian-golden-strong-ale\", title:\"Duvel Belgian Strong Ale\", postId:17085 },\r\n\r\n\r\n\r\n    { style:\"rauchbier\", title:\"Schlenkerla Rauchbier\", postId:17080 },\r\n\r\n\r\n\r\n    { style:\"foreign-extra-stout\", title:\"Cuello Negro Stout\", postId:27905 },\r\n\r\n\r\n\r\n    { style:\"belgian-tripel\", title:\"Westmalle Tripel\", postId:16976 },\r\n\r\n\r\n\r\n    { style:\"belgian-pale-ale\", title:\"Orval Belgian Pale Ale\", postId:17110 },\r\n\r\n\r\n\r\n    { style:\"belgian-dubbel\", title:\"Westmalle Dubbel\", postId:27573 },\r\n\r\n\r\n\r\n    { style:\"saison\", title:\"Saison Dupont\", postId:17015 },\r\n\r\n\r\n\r\n    { style:\"american-porter\", title:\"Anchor Porter\", postId:17379 },\r\n\r\n\r\n\r\n    { style:\"czech-premium-pale-lager\", title:\"Pilsner Urquell\", postId:17115 },\r\n\r\n\r\n\r\n    { style:\"flanders-red-ale\", title:\"Petrus Aged Red\", postId:17182 },\r\n\r\n\r\n\r\n    { style:\"american-amber-ale\", title:\"Rogue American Amber Ale\", postId:17105 },\r\n\r\n\r\n\r\n    { style:\"american-lager\", title:\"Corona Extra\", postId:16917 },\r\n\r\n\r\n\r\n    { style:\"american-barleywine\", title:\"Sierra Nevada Bigfoot\", postId:17147 },\r\n\r\n\r\n\r\n    { style:\"schwarzbier\", title:\"K\u00f6stritzer Schwarzbier\", postId:17155 },\r\n\r\n\r\n\r\n    { style:\"wee-heavy\", title:\"Founders Backwoods Bastard\", postId:17376 }\r\n\r\n\r\n\r\n  ];\r\n\r\n\r\n\r\n  \/\/ ---------------------------------------------------------------------\r\n\r\n\r\n\r\n  \/\/ ESTADO E RENDERIZA\u00c7\u00c3O\r\n\r\n\r\n\r\n  \/\/ ---------------------------------------------------------------------\r\n\r\n\r\n\r\n  var state = { mode:\"comida\", selectedId:null, filter:\"\" };\r\n\r\n\r\n\r\n\r\n\r\n  var tabsEl = root.querySelectorAll(\".tbt-som-tab\");\r\n\r\n\r\n\r\n  var searchInput = root.querySelector(\".tbt-som-search-input\");\r\n\r\n\r\n\r\n  var chipsEl = root.querySelector(\".tbt-som-chips\");\r\n\r\n\r\n\r\n  var resultsEl = root.querySelector(\".tbt-som-results\");\r\n\r\n\r\n\r\n\r\n\r\n  function itemsForMode(){ return state.mode === \"comida\" ? FOODS : STYLES; }\r\n\r\n\r\n\r\n\r\n\r\n  function renderChips(){\r\n\r\n\r\n\r\n    var items = itemsForMode();\r\n\r\n\r\n\r\n    chipsEl.innerHTML = \"\";\r\n\r\n\r\n\r\n    items.forEach(function(item){\r\n\r\n\r\n\r\n      var btn = document.createElement(\"button\");\r\n\r\n\r\n\r\n      btn.type = \"button\";\r\n\r\n\r\n\r\n      btn.className = \"tbt-som-chip\";\r\n\r\n\r\n\r\n      btn.textContent = item.label;\r\n\r\n\r\n\r\n      btn.dataset.id = item.id;\r\n\r\n\r\n\r\n      if (item.id === state.selectedId) btn.classList.add(\"is-selected\");\r\n\r\n\r\n\r\n      if (state.filter && item.label.toLowerCase().indexOf(state.filter) === -1) {\r\n\r\n\r\n\r\n        btn.classList.add(\"is-hidden\");\r\n\r\n\r\n\r\n      }\r\n\r\n\r\n\r\n      btn.addEventListener(\"click\", function(){\r\n\r\n\r\n\r\n        state.selectedId = item.id;\r\n\r\n\r\n\r\n        renderChips();\r\n\r\n\r\n\r\n        renderResults();\r\n\r\n\r\n\r\n      });\r\n\r\n\r\n\r\n      chipsEl.appendChild(btn);\r\n\r\n\r\n\r\n    });\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n\r\n\r\n  function findReviewed(styleId){\r\n\r\n\r\n\r\n    for (var i = 0; i < REVIEWED_BEERS.length; i++) {\r\n\r\n\r\n\r\n      if (REVIEWED_BEERS[i].style === styleId) return REVIEWED_BEERS[i];\r\n\r\n\r\n\r\n    }\r\n\r\n\r\n\r\n    return null;\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n\r\n\r\n  function tagEl(cat){\r\n\r\n\r\n\r\n    var span = document.createElement(\"span\");\r\n\r\n\r\n\r\n    span.className = \"tbt-som-tag tbt-som-tag--\" + cat;\r\n\r\n\r\n\r\n    span.textContent = CAT_LABELS[cat] || cat;\r\n\r\n\r\n\r\n    return span;\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n\r\n\r\n  function cardForStyle(style, info){\r\n\r\n\r\n\r\n    var reviewed = findReviewed(style.id);\r\n\r\n\r\n\r\n    var card = document.createElement(\"div\");\r\n\r\n\r\n\r\n    card.className = \"tbt-som-card tbt-som-card--\" + info.cat;\r\n\r\n\r\n\r\n\r\n\r\n    var head = document.createElement(\"div\");\r\n\r\n\r\n\r\n    head.className = \"tbt-som-card-head\";\r\n\r\n\r\n\r\n    var h3 = document.createElement(\"h3\");\r\n\r\n\r\n\r\n    h3.textContent = style.label;\r\n\r\n\r\n\r\n    head.appendChild(h3);\r\n\r\n\r\n\r\n    if (reviewed) {\r\n\r\n\r\n\r\n      var badge = document.createElement(\"a\");\r\n\r\n\r\n\r\n      badge.className = \"tbt-som-badge\";\r\n\r\n\r\n\r\n      badge.href = \"https:\/\/www.thebeertimes.com\/?p=\" + reviewed.postId;\r\n\r\n\r\n\r\n      badge.appendChild(document.createTextNode(reviewed.title));\r\n\r\n\r\n\r\n      head.appendChild(badge);\r\n\r\n\r\n\r\n    }\r\n\r\n\r\n\r\n    card.appendChild(head);\r\n\r\n\r\n\r\n\r\n\r\n    var attrs = document.createElement(\"div\");\r\n\r\n\r\n\r\n    attrs.className = \"tbt-som-attrs\";\r\n\r\n\r\n\r\n    attrs.innerHTML =\r\n\r\n\r\n\r\n      '<div><span class=\"k\">ABV<\/span><span class=\"v\">' + style.abv + '<\/span><\/div>' +\r\n\r\n\r\n\r\n      '<div><span class=\"k\">IBU<\/span><span class=\"v\">' + style.ibu + '<\/span><\/div>';\r\n\r\n\r\n\r\n    card.appendChild(attrs);\r\n\r\n\r\n\r\n\r\n\r\n    var p = document.createElement(\"p\");\r\n\r\n\r\n\r\n    p.className = \"tbt-som-why\";\r\n\r\n\r\n\r\n    p.appendChild(tagEl(info.cat));\r\n\r\n\r\n\r\n    p.appendChild(document.createElement(\"br\"));\r\n\r\n\r\n\r\n    p.appendChild(document.createTextNode(info.text));\r\n\r\n\r\n\r\n    card.appendChild(p);\r\n\r\n\r\n\r\n\r\n\r\n    card.appendChild(feedbackRow());\r\n\r\n\r\n\r\n    return card;\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n\r\n\r\n  function cardForFood(food, info){\r\n\r\n\r\n\r\n    var card = document.createElement(\"div\");\r\n\r\n\r\n\r\n    card.className = \"tbt-som-card tbt-som-card--\" + info.cat;\r\n\r\n\r\n\r\n\r\n\r\n    var head = document.createElement(\"div\");\r\n\r\n\r\n\r\n    head.className = \"tbt-som-card-head\";\r\n\r\n\r\n\r\n    var h3 = document.createElement(\"h3\");\r\n\r\n\r\n\r\n    h3.textContent = food.label;\r\n\r\n\r\n\r\n    head.appendChild(h3);\r\n\r\n\r\n\r\n    card.appendChild(head);\r\n\r\n\r\n\r\n\r\n\r\n    var p = document.createElement(\"p\");\r\n\r\n\r\n\r\n    p.className = \"tbt-som-why\";\r\n\r\n\r\n\r\n    p.appendChild(tagEl(info.cat));\r\n\r\n\r\n\r\n    p.appendChild(document.createElement(\"br\"));\r\n\r\n\r\n\r\n    p.appendChild(document.createTextNode(info.text));\r\n\r\n\r\n\r\n    card.appendChild(p);\r\n\r\n\r\n\r\n\r\n\r\n    card.appendChild(feedbackRow());\r\n\r\n\r\n\r\n    return card;\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n\r\n\r\n  function feedbackRow(){\r\n\r\n\r\n\r\n    var foot = document.createElement(\"div\");\r\n\r\n\r\n\r\n    foot.className = \"tbt-som-foot\";\r\n\r\n\r\n\r\n    var span = document.createElement(\"span\");\r\n\r\n\r\n\r\n    span.textContent = \"Esta recomenda\u00e7\u00e3o foi \u00fatil para voc\u00ea?\";\r\n\r\n\r\n\r\n    var fb = document.createElement(\"div\");\r\n\r\n\r\n\r\n    fb.className = \"tbt-som-fb\";\r\n\r\n\r\n\r\n    var yes = document.createElement(\"button\");\r\n\r\n\r\n\r\n    yes.type = \"button\"; yes.textContent = \"Sim\"; yes.className = \"tbt-som-fb-yes\";\r\n\r\n\r\n\r\n    var no = document.createElement(\"button\");\r\n\r\n\r\n\r\n    no.type = \"button\"; no.textContent = \"N\u00e3o\"; no.className = \"tbt-som-fb-no\";\r\n\r\n\r\n\r\n    function vote(chosen, other){\r\n\r\n\r\n\r\n      chosen.classList.add(\"is-voted\");\r\n\r\n\r\n\r\n      chosen.disabled = true;\r\n\r\n\r\n\r\n      other.disabled = true;\r\n\r\n\r\n\r\n      \/\/ TODO: enviar este voto para um endpoint real (REST do WordPress, planilha, etc.) quando existir \u2014 hoje apenas muda o estado visual.\r\n\r\n\r\n\r\n    }\r\n\r\n\r\n\r\n    yes.addEventListener(\"click\", function(){ vote(yes, no); });\r\n\r\n\r\n\r\n    no.addEventListener(\"click\", function(){ vote(no, yes); });\r\n\r\n\r\n\r\n    fb.appendChild(yes); fb.appendChild(no);\r\n\r\n\r\n\r\n    foot.appendChild(span); foot.appendChild(fb);\r\n\r\n\r\n\r\n    return foot;\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n\r\n\r\n  function renderResults(){\r\n\r\n\r\n\r\n    resultsEl.innerHTML = \"\";\r\n\r\n\r\n\r\n    if (!state.selectedId) return;\r\n\r\n\r\n\r\n\r\n\r\n    var heading = document.createElement(\"p\");\r\n\r\n\r\n\r\n    heading.className = \"tbt-som-results-heading\";\r\n\r\n\r\n\r\n    var anyCard = false;\r\n\r\n\r\n\r\n\r\n\r\n    if (state.mode === \"comida\") {\r\n\r\n\r\n\r\n      var food = FOODS.filter(function(f){ return f.id === state.selectedId; })[0];\r\n\r\n\r\n\r\n      var rulesForFood = RULES[state.selectedId];\r\n\r\n\r\n\r\n      heading.textContent = \"Estilos recomendados para \" + food.label.toLowerCase();\r\n\r\n\r\n\r\n      resultsEl.appendChild(heading);\r\n\r\n\r\n\r\n      if (!rulesForFood) { resultsEl.appendChild(emptyState()); return; }\r\n\r\n\r\n\r\n\r\n\r\n      CATS.forEach(function(cat){\r\n\r\n\r\n\r\n        var rule = rulesForFood[cat];\r\n\r\n\r\n\r\n        var found = STYLES.filter(function(s){ return rule.test(s); }).slice(0, PER_CATEGORY);\r\n\r\n\r\n\r\n        found.forEach(function(s){\r\n\r\n\r\n\r\n          anyCard = true;\r\n\r\n\r\n\r\n          resultsEl.appendChild(cardForStyle(s, { cat:cat, text:rule.text(s) }));\r\n\r\n\r\n\r\n        });\r\n\r\n\r\n\r\n      });\r\n\r\n\r\n\r\n    } else {\r\n\r\n\r\n\r\n      var style = STYLES.filter(function(s){ return s.id === state.selectedId; })[0];\r\n\r\n\r\n\r\n      heading.textContent = style.label + \" (ABV \" + style.abv + \", IBU \" + style.ibu + \") harmoniza bem com\";\r\n\r\n\r\n\r\n      resultsEl.appendChild(heading);\r\n\r\n\r\n\r\n\r\n\r\n      CATS.forEach(function(cat){\r\n\r\n\r\n\r\n        var found = FOODS.filter(function(f){\r\n\r\n\r\n\r\n          var rule = RULES[f.id] && RULES[f.id][cat];\r\n\r\n\r\n\r\n          return rule && rule.test(style);\r\n\r\n\r\n\r\n        }).slice(0, PER_CATEGORY);\r\n\r\n\r\n\r\n        found.forEach(function(f){\r\n\r\n\r\n\r\n          anyCard = true;\r\n\r\n\r\n\r\n          resultsEl.appendChild(cardForFood(f, { cat:cat, text:RULES[f.id][cat].text(style) }));\r\n\r\n\r\n\r\n        });\r\n\r\n\r\n\r\n      });\r\n\r\n\r\n\r\n    }\r\n\r\n\r\n\r\n\r\n\r\n    if (!anyCard) resultsEl.appendChild(emptyState());\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n\r\n\r\n  function emptyState(){\r\n\r\n\r\n\r\n    var p = document.createElement(\"p\");\r\n\r\n\r\n\r\n    p.className = \"tbt-som-empty\";\r\n\r\n\r\n\r\n    p.textContent = \"Ainda n\u00e3o h\u00e1 uma regra carregada para esta combina\u00e7\u00e3o.\";\r\n\r\n\r\n\r\n    return p;\r\n\r\n\r\n\r\n  }\r\n\r\n\r\n\r\n\r\n\r\n  tabsEl.forEach(function(tab){\r\n\r\n\r\n\r\n    tab.addEventListener(\"click\", function(){\r\n\r\n\r\n\r\n      tabsEl.forEach(function(t){ t.classList.remove(\"is-active\"); t.setAttribute(\"aria-selected\",\"false\"); });\r\n\r\n\r\n\r\n      tab.classList.add(\"is-active\");\r\n\r\n\r\n\r\n      tab.setAttribute(\"aria-selected\",\"true\");\r\n\r\n\r\n\r\n      state.mode = tab.dataset.mode;\r\n\r\n\r\n\r\n      state.selectedId = null;\r\n\r\n\r\n\r\n      state.filter = \"\";\r\n\r\n\r\n\r\n      searchInput.value = \"\";\r\n\r\n\r\n\r\n      renderChips();\r\n\r\n\r\n\r\n      renderResults();\r\n\r\n\r\n\r\n    });\r\n\r\n\r\n\r\n  });\r\n\r\n\r\n\r\n\r\n\r\n  searchInput.addEventListener(\"input\", function(){\r\n\r\n\r\n\r\n    state.filter = searchInput.value.trim().toLowerCase();\r\n\r\n\r\n\r\n    renderChips();\r\n\r\n\r\n\r\n  });\r\n\r\n\r\n\r\n\r\n\r\n  renderChips();\r\n\r\n\r\n\r\n  renderResults();\r\n\r\n\r\n\r\n})();\r\n\r\n\r\n\r\n<\/script><\/p>\r\n\r\n<h2>Perguntas frequentes (FAQ)<\/h2>\r\n<h3>1. Como funciona o Beer Sommelier?<\/h3>\r\n<p>O Beer Sommelier permite partir de uma comida ou de uma cerveja e encontrar combina\u00e7\u00f5es de harmoniza\u00e7\u00e3o recomendadas com base no estilo da cerveja e nos princ\u00edpios de afinidade, contraste e complemento.<\/p>\r\n<h3>2. Quais princ\u00edpios o Beer Sommelier utiliza para recomendar uma harmoniza\u00e7\u00e3o?<\/h3>\r\n<p>As recomenda\u00e7\u00f5es s\u00e3o baseadas em tr\u00eas princ\u00edpios cl\u00e1ssicos da harmoniza\u00e7\u00e3o: afinidade, quando caracter\u00edsticas semelhantes s\u00e3o potencializadas; contraste, quando caracter\u00edsticas opostas s\u00e3o equilibradas; e complemento, quando cerveja e comida se integram para criar uma combina\u00e7\u00e3o equilibrada.<\/p>\r\n<h3>3. Posso buscar uma harmoniza\u00e7\u00e3o a partir de uma comida?<\/h3>\r\n<p>Sim. Voc\u00ea pode selecionar ou buscar uma comida, e o Beer Sommelier mostrar\u00e1 os estilos de cerveja que oferecem as combina\u00e7\u00f5es mais adequadas para esse alimento.<\/p>\r\n<h3>4. Posso buscar qual comida harmoniza com uma cerveja?<\/h3>\r\n<p>Sim. Selecione uma cerveja ou um estilo de cerveja para descobrir quais alimentos melhor complementam suas caracter\u00edsticas.<\/p>\r\n<h3>5. As recomenda\u00e7\u00f5es s\u00e3o baseadas em estilos de cerveja?<\/h3>\r\n<p>Sim. O Beer Sommelier utiliza os estilos de cerveja atualmente reconhecidos como refer\u00eancia t\u00e9cnica para estabelecer as combina\u00e7\u00f5es de harmoniza\u00e7\u00e3o.<\/p>\r\n<script type=\"application\/ld+json\">\r\n{\r\n  \"@context\": \"https:\/\/schema.org\",\r\n  \"@type\": \"FAQPage\",\r\n  \"mainEntity\": [\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Como funciona o Beer Sommelier?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"O Beer Sommelier permite partir de uma comida ou de uma cerveja e encontrar combina\u00e7\u00f5es de harmoniza\u00e7\u00e3o recomendadas com base no estilo da cerveja e nos princ\u00edpios de afinidade, contraste e complemento.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Quais princ\u00edpios o Beer Sommelier utiliza para recomendar uma harmoniza\u00e7\u00e3o?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"As recomenda\u00e7\u00f5es s\u00e3o baseadas em tr\u00eas princ\u00edpios cl\u00e1ssicos da harmoniza\u00e7\u00e3o: afinidade, quando caracter\u00edsticas semelhantes s\u00e3o potencializadas; contraste, quando caracter\u00edsticas opostas s\u00e3o equilibradas; e complemento, quando cerveja e comida se integram para criar uma combina\u00e7\u00e3o equilibrada.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Posso buscar uma harmoniza\u00e7\u00e3o a partir de uma comida?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Sim. Voc\u00ea pode selecionar ou buscar uma comida, e o Beer Sommelier mostrar\u00e1 os estilos de cerveja que oferecem as combina\u00e7\u00f5es mais adequadas para esse alimento.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Posso buscar qual comida harmoniza com uma cerveja?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Sim. Selecione uma cerveja ou um estilo de cerveja para descobrir quais alimentos melhor complementam suas caracter\u00edsticas.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"As recomenda\u00e7\u00f5es s\u00e3o baseadas em estilos de cerveja?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Sim. O Beer Sommelier utiliza os estilos de cerveja atualmente reconhecidos como refer\u00eancia t\u00e9cnica para estabelecer as combina\u00e7\u00f5es de harmoniza\u00e7\u00e3o.\"\r\n      }\r\n    }\r\n  ]\r\n}\r\n<\/script>","protected":false},"excerpt":{"rendered":"<p>Beer Sommelier \u00e9 a ferramenta de harmoniza\u00e7\u00f5es desenvolvida pela The Beer Times\u2122. Recomenda combina\u00e7\u00f5es entre comida e cerveja com base nos estilos de cerveja atualmente reconhecidos e nos tr\u00eas princ\u00edpios cl\u00e1ssicos da harmoniza\u00e7\u00e3o: afinidade, contraste e complemento. Escolha se quer partir de uma comida ou de uma cerveja, selecione uma op\u00e7\u00e3o da lista (ou digite<\/p>\n","protected":false},"author":1,"featured_media":49367,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"wpai_generated_summary":"","footnotes":""},"class_list":["post-49378","page","type-page","status-publish","has-post-thumbnail"],"_links":{"self":[{"href":"https:\/\/www.thebeertimes.com\/pt-br\/wp-json\/wp\/v2\/pages\/49378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.thebeertimes.com\/pt-br\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.thebeertimes.com\/pt-br\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.thebeertimes.com\/pt-br\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.thebeertimes.com\/pt-br\/wp-json\/wp\/v2\/comments?post=49378"}],"version-history":[{"count":3,"href":"https:\/\/www.thebeertimes.com\/pt-br\/wp-json\/wp\/v2\/pages\/49378\/revisions"}],"predecessor-version":[{"id":49388,"href":"https:\/\/www.thebeertimes.com\/pt-br\/wp-json\/wp\/v2\/pages\/49378\/revisions\/49388"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.thebeertimes.com\/pt-br\/wp-json\/wp\/v2\/media\/49367"}],"wp:attachment":[{"href":"https:\/\/www.thebeertimes.com\/pt-br\/wp-json\/wp\/v2\/media?parent=49378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}