{"id":12894,"date":"2026-10-07T18:46:26","date_gmt":"2026-10-07T18:46:26","guid":{"rendered":"https:\/\/cofdar.com\/?page_id=12894"},"modified":"2026-10-07T18:58:45","modified_gmt":"2026-10-07T18:58:45","slug":"coffee-flavor-map","status":"publish","type":"page","link":"https:\/\/cofdar.com\/en\/coffee-flavor-map\/","title":{"rendered":"Coffee Flavor Map"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"12894\" class=\"elementor elementor-12894\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c71f59c elementor-section-boxed elementor-section-height-default elementor-section-height-default rt-parallax-bg-no\" data-id=\"c71f59c\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-e14c8b9\" data-id=\"e14c8b9\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-0ba48a0 elementor-widget elementor-widget-spacer\" data-id=\"0ba48a0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-14d90ec elementor-widget elementor-widget-image\" data-id=\"14d90ec\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/cofdar.com\/wp-content\/uploads\/2026\/10\/CofdarInteractiveCoffeeFlavorMap-1024x576.png\" class=\"attachment-large size-large wp-image-12895\" alt=\"Cofdar interactive coffee flavor map showing coffee tasting notes, aromas and flavor families\" srcset=\"https:\/\/cofdar.com\/wp-content\/uploads\/2026\/10\/CofdarInteractiveCoffeeFlavorMap-1024x576.png 1024w, https:\/\/cofdar.com\/wp-content\/uploads\/2026\/10\/CofdarInteractiveCoffeeFlavorMap-300x169.png 300w, https:\/\/cofdar.com\/wp-content\/uploads\/2026\/10\/CofdarInteractiveCoffeeFlavorMap-768x432.png 768w, https:\/\/cofdar.com\/wp-content\/uploads\/2026\/10\/CofdarInteractiveCoffeeFlavorMap-1536x864.png 1536w, https:\/\/cofdar.com\/wp-content\/uploads\/2026\/10\/CofdarInteractiveCoffeeFlavorMap-600x338.png 600w, https:\/\/cofdar.com\/wp-content\/uploads\/2026\/10\/CofdarInteractiveCoffeeFlavorMap.png 1672w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" title=\"\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8514a0a elementor-widget elementor-widget-spacer\" data-id=\"8514a0a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-634cc3b elementor-widget elementor-widget-html\" data-id=\"634cc3b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- ==================================================================\r\n     Cofdar Interactive Coffee Flavor Map\r\n     Original educational tool. Do not copy the arrangement, colors, text, or translation of any licensed wheel.\r\n     LTR \u00b7 Mobile First \u00b7 Elementor widget \u00b7 No external libraries.\r\n     To edit content, update the DATA array below only.\r\n     ================================================================== -->\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\" \/>\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin \/>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Tajawal:wght@400;500;700;800&display=swap\" rel=\"stylesheet\" \/>\r\n\r\n<div class=\"acfm\" dir=\"ltr\" lang=\"en\">\r\n<style>\r\n  .acfm{--navy:#2b406f;--coffee:#b27244;--olive:#6f7752;--cream:#f7f3ec;--dark:#1f2933;\r\n    --coffee-deep:#8f5733;--line:#e7dfcf;--muted:#6b6256;--white:#fff;--danger:#9a3b3b;\r\n    --font:\"Tajawal\",\"Segoe UI\",system-ui,sans-serif;\r\n    direction:ltr;text-align:left;font-family:var(--font);color:var(--dark);line-height:1.7;\r\n    -webkit-font-smoothing:antialiased;max-width:980px;margin:0 auto;padding:clamp(14px,4vw,26px);overflow-x:hidden}\r\n  .acfm *{box-sizing:border-box;margin:0;padding:0;max-width:100%}\r\n  .acfm button{font-family:var(--font);cursor:pointer}\r\n  .acfm .hidden{display:none !important}\r\n  .acfm section{margin-top:1.5rem}\r\n  .acfm .sec-h{font-weight:800;color:var(--navy);font-size:1.12rem;margin-bottom:.7rem}\r\n\r\n  .acfm .kicker{font-weight:700;font-size:.78rem;letter-spacing:.03em;color:var(--coffee-deep)}\r\n  .acfm h2{font-weight:800;font-size:clamp(1.45rem,6vw,2.1rem);color:var(--navy);margin:.35rem 0 .15rem;letter-spacing:-.01em}\r\n  .acfm .en{font-weight:500;font-size:.9rem;color:var(--muted);letter-spacing:.04em}\r\n  .acfm .intro{color:var(--muted);font-size:1rem;max-width:64ch;margin-top:.55rem}\r\n\r\n  .acfm .daily{display:flex;gap:.85rem;align-items:center;flex-wrap:wrap;background:var(--navy);color:#fff;border-radius:12px;padding:.9rem 1.1rem;margin-top:1.2rem}\r\n  .acfm .daily .tag{font-weight:800;font-size:.7rem;letter-spacing:.04em;color:var(--cream);background:rgba(255,255,255,.12);padding:.32rem .65rem;border-radius:30px;white-space:nowrap}\r\n  .acfm .daily .nm{font-weight:800;font-size:1.05rem}\r\n  .acfm .daily .nm small{font-weight:500;font-size:.74rem;color:rgba(247,243,236,.7);margin-inline-start:.4rem}\r\n  .acfm .daily .ds{color:rgba(247,243,236,.85);font-size:.88rem;flex:1;min-width:160px}\r\n\r\n  \/* family selection *\/\r\n  .acfm .famtop{display:flex;align-items:center;justify-content:space-between;gap:.6rem;flex-wrap:wrap}\r\n  .acfm .toggle{font-weight:700;font-size:.84rem;color:var(--navy);background:var(--white);border:1px solid var(--line);border-radius:30px;padding:.45rem .95rem}\r\n  .acfm .toggle:hover{border-color:var(--coffee)}\r\n  .acfm .circlebox{display:flex;justify-content:center;margin:.9rem 0 .2rem}\r\n  .acfm .circlebox svg{width:100%;max-width:300px;height:auto;display:block;overflow:visible}\r\n  .acfm .seg{cursor:pointer;transition:opacity .2s}\r\n  .acfm .seg:hover{opacity:.9}\r\n  .acfm .seg.dim{opacity:.34}\r\n  .acfm .seg .lbl{font-weight:700;font-size:10px;fill:#fff;paint-order:stroke;stroke:rgba(0,0,0,.32);stroke-width:2.4px}\r\n  .acfm .ctr-t{font-weight:800;font-size:14px;fill:var(--navy)}\r\n  .acfm .ctr-s{font-weight:500;font-size:10px;fill:var(--muted)}\r\n\r\n  .acfm .famcards{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:.7rem;margin-top:.9rem}\r\n  .acfm .famcard{text-align:left;background:var(--white);border:1px solid var(--line);border-top:4px solid var(--line);border-radius:11px;padding:.8rem .85rem;transition:transform .15s,box-shadow .2s,border-color .2s}\r\n  .acfm .famcard:hover{transform:translateY(-2px);box-shadow:0 16px 30px -22px rgba(31,41,51,.45)}\r\n  .acfm .famcard.on{border-color:var(--coffee);box-shadow:0 0 0 2px rgba(178,114,68,.16)}\r\n  .acfm .famcard .fn{font-weight:800;color:var(--navy);font-size:1rem;line-height:1.3}\r\n  .acfm .famcard .fc{color:var(--coffee-deep);font-weight:700;font-size:.74rem;margin:.15rem 0 .35rem}\r\n  .acfm .famcard .fd{color:var(--muted);font-size:.82rem;line-height:1.55}\r\n\r\n  \/* filters *\/\r\n  .acfm .filterbox{border:1px solid var(--line);border-radius:12px;background:var(--white)}\r\n  .acfm .filterhd{display:flex;align-items:center;justify-content:space-between;gap:.6rem;width:100%;font-weight:800;color:var(--navy);font-size:1rem;background:transparent;border:none;padding:.9rem 1rem}\r\n  .acfm .filterhd .ic{transition:transform .2s;color:var(--muted)}\r\n  .acfm .filterbox.open .filterhd .ic{transform:rotate(180deg)}\r\n  .acfm .filterbody{padding:0 1rem 1rem;display:none}\r\n  .acfm .filterbox.open .filterbody{display:block}\r\n  .acfm .flbl{font-weight:700;font-size:.74rem;color:var(--muted);margin:.1rem 0 .25rem}\r\n  .acfm input[type=text],.acfm select{width:100%;font-family:var(--font);font-size:.94rem;color:var(--dark);padding:.65rem .7rem;border:1px solid var(--line);border-radius:8px;background:var(--white)}\r\n  .acfm select:focus,.acfm input:focus{outline:none;border-color:var(--coffee);box-shadow:0 0 0 3px rgba(178,114,68,.12)}\r\n  .acfm .frow{display:grid;grid-template-columns:1fr;gap:.6rem;margin-top:.6rem}\r\n  .acfm .factions{display:flex;gap:.5rem;flex-wrap:wrap;margin-top:.9rem}\r\n  .acfm .bbtn{font-weight:700;font-size:.88rem;color:var(--navy);background:var(--white);border:1px solid var(--navy);border-radius:9px;padding:.62rem 1rem;transition:background .2s,color .2s}\r\n  .acfm .bbtn:hover{background:var(--navy);color:#fff}\r\n  .acfm .bbtn.accent{color:#fff;background:var(--coffee);border-color:var(--coffee)}\r\n  .acfm .bbtn.accent:hover{background:var(--coffee-deep);border-color:var(--coffee-deep)}\r\n\r\n  \/* results *\/\r\n  .acfm .reshead{display:flex;align-items:baseline;gap:.6rem;flex-wrap:wrap;margin-bottom:.2rem}\r\n  .acfm .reshead .rt{font-weight:800;color:var(--navy);font-size:1.08rem}\r\n  .acfm .reshead .rc{color:var(--muted);font-weight:700;font-size:.82rem}\r\n  .acfm .results{display:grid;grid-template-columns:1fr;gap:1rem;margin-top:.8rem}\r\n  .acfm .hint{color:var(--muted);background:var(--cream);border:1px dashed var(--line);border-radius:12px;padding:1.5rem;text-align:center}\r\n  .acfm .hint b{display:block;color:var(--navy);font-size:1.02rem;margin-bottom:.3rem}\r\n\r\n  .acfm .card{background:var(--white);border:1px solid var(--line);border-radius:12px;overflow:hidden;transition:box-shadow .2s}\r\n  .acfm .card:hover{box-shadow:0 22px 40px -30px rgba(31,41,51,.5)}\r\n  .acfm .card .top{padding:1rem;cursor:pointer;display:flex;align-items:flex-start;gap:.65rem}\r\n  .acfm .card .accent{width:5px;align-self:stretch;border-radius:4px;flex-shrink:0}\r\n  .acfm .card .hd{flex:1;min-width:0}\r\n  .acfm .card .nm{font-weight:800;color:var(--navy);font-size:1.14rem;line-height:1.3}\r\n  .acfm .card .nm small{font-weight:500;font-size:.72rem;color:var(--muted);margin-inline-start:.3rem;letter-spacing:.03em}\r\n  .acfm .card .def{color:var(--dark);font-size:.95rem;margin-top:.3rem}\r\n  .acfm .badge{display:inline-block;font-weight:700;font-size:.7rem;padding:.24rem .55rem;border-radius:30px;border:1px solid;white-space:nowrap;margin-top:.55rem}\r\n  .acfm .chev{color:var(--muted);font-size:1rem;transition:transform .2s;flex-shrink:0}\r\n  .acfm .card.open .chev{transform:rotate(180deg)}\r\n  .acfm .detail{max-height:0;overflow:hidden;transition:max-height .3s ease}\r\n  .acfm .detail .in{padding:0 1rem 1rem;border-top:1px solid var(--line)}\r\n  .acfm .field{margin-top:.7rem}\r\n  .acfm .field .k{font-weight:800;color:var(--coffee-deep);font-size:.76rem;margin-bottom:.1rem}\r\n  .acfm .field .v{color:var(--muted);font-size:.92rem}\r\n  .acfm .meta{display:flex;flex-wrap:wrap;gap:.4rem;margin-top:.7rem}\r\n  .acfm .pill{font-weight:700;font-size:.7rem;color:var(--navy);background:var(--cream);border:1px solid var(--line);border-radius:30px;padding:.25rem .6rem}\r\n  .acfm .cbtns{display:flex;gap:.5rem;flex-wrap:wrap;margin-top:.9rem}\r\n  .acfm .mini{font-weight:700;font-size:.84rem;border-radius:8px;padding:.6rem .85rem;transition:background .2s,border-color .2s;flex:1 1 100%;text-align:center}\r\n  .acfm .mini.ghost{color:var(--navy);background:var(--cream);border:1px solid var(--line)}\r\n  .acfm .mini.ghost:hover{background:#efe7d8}\r\n  .acfm .mini.add{color:#fff;background:var(--olive);border:1px solid var(--olive)}\r\n  .acfm .mini.add.on{background:var(--navy);border-color:var(--navy)}\r\n  .acfm .toast{text-align:center;color:var(--olive);font-weight:700;font-size:.82rem;height:0;overflow:hidden;transition:height .2s;margin-top:.3rem}\r\n  .acfm .toast.show{height:1.3em}\r\n\r\n  \/* builder *\/\r\n  .acfm .builder{background:var(--cream);border:1px solid var(--line);border-radius:14px}\r\n  .acfm .builderhd{display:flex;align-items:center;justify-content:space-between;gap:.6rem;width:100%;background:transparent;border:none;padding:1rem 1.1rem;font-weight:800;color:var(--navy);font-size:1.08rem}\r\n  .acfm .builderhd .ic{transition:transform .2s;color:var(--muted)}\r\n  .acfm .builder.open .builderhd .ic{transform:rotate(180deg)}\r\n  .acfm .builderbody{padding:0 1.1rem 1.2rem;display:none}\r\n  .acfm .builder.open .builderbody{display:block}\r\n  .acfm .sheetclose{display:none;width:100%;margin-bottom:.8rem;font-weight:700;font-size:.86rem;color:var(--navy);background:var(--white);border:1px solid var(--line);border-radius:9px;padding:.55rem}\r\n  .acfm .builder .sub{color:var(--muted);font-size:.88rem;margin-bottom:.9rem}\r\n  .acfm .zone{margin-bottom:.85rem}\r\n  .acfm .zone .zt{font-weight:800;color:var(--coffee-deep);font-size:.78rem;margin-bottom:.35rem}\r\n  .acfm .bchips{display:flex;flex-wrap:wrap;gap:.45rem;min-height:1.4rem}\r\n  .acfm .bchip{display:inline-flex;align-items:center;gap:.35rem;font-weight:700;font-size:.82rem;color:var(--navy);background:var(--white);border:1px solid var(--line);border-radius:30px;padding:.3rem .35rem .3rem .7rem}\r\n  .acfm .bchip button{border:none;width:19px;height:19px;border-radius:50%;line-height:1;font-weight:800;font-size:.72rem}\r\n  .acfm .bchip .mv{background:var(--cream);color:var(--coffee-deep)}\r\n  .acfm .bchip .rm{background:var(--line);color:var(--dark)}\r\n  .acfm .bempty{color:var(--muted);font-size:.84rem}\r\n  .acfm .clarity{display:flex;gap:.4rem;flex-wrap:wrap;margin:.4rem 0 .9rem}\r\n  .acfm .crbtn{font-weight:700;font-size:.82rem;color:var(--navy);background:var(--white);border:1px solid var(--line);border-radius:30px;padding:.42rem .9rem}\r\n  .acfm .crbtn.on{background:var(--coffee);color:#fff;border-color:var(--coffee)}\r\n  .acfm .builder textarea{width:100%;font-family:var(--font);font-size:.94rem;color:var(--dark);line-height:1.85;border:1px solid var(--line);border-radius:9px;padding:.8rem .9rem;background:var(--white);resize:vertical;min-height:96px}\r\n  .acfm .builder textarea:focus{outline:none;border-color:var(--coffee);box-shadow:0 0 0 3px rgba(178,114,68,.12)}\r\n  .acfm .bactions{display:flex;gap:.5rem;flex-wrap:wrap;margin-top:.8rem}\r\n  .acfm .bactions .bbtn{flex:1 1 100%}\r\n\r\n  .acfm .builderfab{position:fixed;inset:auto 12px 12px;z-index:55;display:none;background:var(--coffee);color:#fff;border:none;border-radius:30px;padding:.8rem 1.3rem;font-weight:800;font-size:.95rem;box-shadow:0 12px 30px -8px rgba(178,114,68,.6)}\r\n\r\n  \/* quiz *\/\r\n  .acfm .quiz{background:var(--white);border:1px solid var(--line);border-radius:14px;padding:clamp(1.2rem,4vw,1.8rem);margin-top:.8rem}\r\n  .acfm .quiz .qtop{display:flex;justify-content:space-between;align-items:center;gap:.8rem;flex-wrap:wrap;margin-bottom:1.1rem}\r\n  .acfm .quiz .score{font-weight:800;color:var(--olive)}\r\n  .acfm .quiz .q{font-weight:800;color:var(--navy);font-size:1.1rem;margin-bottom:1rem;line-height:1.6}\r\n  .acfm .quiz .opts{display:grid;gap:.55rem}\r\n  .acfm .opt{text-align:left;font-weight:700;font-size:.96rem;color:var(--dark);background:var(--cream);border:1px solid var(--line);border-radius:10px;padding:.85rem 1rem;transition:border-color .2s,background .2s}\r\n  .acfm .opt:hover{border-color:var(--coffee)}\r\n  .acfm .opt.right{border-color:var(--olive);background:rgba(111,119,82,.12);color:#46502f}\r\n  .acfm .opt.wrong{border-color:var(--danger);background:rgba(154,59,59,.1);color:#7a2f2f}\r\n  .acfm .opt:disabled{cursor:default}\r\n  .acfm .qfeed{margin-top:1rem;font-weight:700;min-height:1.4em}\r\n  .acfm .qfeed.ok{color:var(--olive)} .acfm .qfeed.no{color:var(--danger)}\r\n\r\n  .acfm .note{color:var(--muted);font-size:.82rem;margin-top:1.6rem;text-align:center;line-height:1.8;border-top:1px solid var(--line);padding-top:1rem}\r\n\r\n  \/* breakpoints (mobile first) *\/\r\n  @media(min-width:620px){\r\n    .acfm .frow{grid-template-columns:1fr 1fr}\r\n    .acfm .results{grid-template-columns:1fr 1fr}\r\n    .acfm .famcards{grid-template-columns:repeat(3,1fr)}\r\n    .acfm .circlebox svg{max-width:340px}\r\n  }\r\n  @media(min-width:980px){\r\n    .acfm .results{grid-template-columns:1fr 1fr 1fr}\r\n    .acfm .famcards{grid-template-columns:repeat(4,1fr)}\r\n    .acfm .circlebox svg{max-width:360px}\r\n    .acfm .seg .lbl{font-size:11px}\r\n  }\r\n  @media(max-width:780px){\r\n    .acfm .builderfab.show{display:block}\r\n    .acfm .builder.sheetopen{position:fixed;inset:auto 8px 8px;max-height:84vh;overflow:auto;z-index:60;box-shadow:0 -12px 44px rgba(31,41,51,.24)}\r\n    .acfm .builder.sheetopen .sheetclose{display:block}\r\n  }\r\n<\/style>\r\n\r\n  <div class=\"head\">\r\n    <span class=\"kicker\">A tasting and development tool for roasters and the coffee community<\/span>\r\n    <h2>Cofdar Interactive Coffee Flavor Map<\/h2>\r\n    <div class=\"en\">Coffee Sensory & Tasting Tool<\/div>\r\n    <p class=\"intro\">More than 100 flavors across 12 families. Choose a family to explore its flavors, or filter by classification, processing, roast level, and position in the sensory profile. For roasters, build a professional description ready for a product page or package.<\/p>\r\n  <\/div>\r\n\r\n  <div class=\"daily\" id=\"acfmDaily\"><\/div>\r\n\r\n  <section>\r\n    <div class=\"famtop\">\r\n      <div class=\"sec-h\" style=\"margin:0\">Choose a family<\/div>\r\n      <button class=\"toggle\" id=\"acfmCircleToggle\" type=\"button\">Show wheel<\/button>\r\n    <\/div>\r\n    <div class=\"circlebox hidden\" id=\"acfmCircleBox\"><svg id=\"acfmCircle\" viewBox=\"0 0 400 400\" role=\"img\" aria-label=\"Flavor family wheel\"><\/svg><\/div>\r\n    <div class=\"famcards\" id=\"acfmFamCards\"><\/div>\r\n  <\/section>\r\n\r\n  <section>\r\n    <div class=\"filterbox\" id=\"acfmFilterBox\">\r\n      <button class=\"filterhd\" id=\"acfmFilterHd\" type=\"button\"><span>Filter flavors<\/span><span class=\"ic\">&#9662;<\/span><\/button>\r\n      <div class=\"filterbody\">\r\n        <div><div class=\"flbl\">Search<\/div><input id=\"acfmSearch\" type=\"text\" placeholder=\"Search: berry, honey, winey, musty...\" \/><\/div>\r\n        <div class=\"frow\">\r\n          <div><div class=\"flbl\">Classification<\/div><select id=\"f-type\"><option value=\"\">All<\/option><option value=\"positive\">Positive<\/option><option value=\"neutral\">Neutral<\/option><option value=\"context\">May be a defect<\/option><option value=\"defect\">Sensory defect<\/option><\/select><\/div>\r\n          <div><div class=\"flbl\">Processing<\/div><select id=\"f-process\"><option value=\"\">All<\/option><option value=\"natural\">Natural<\/option><option value=\"washed\">Washed<\/option><option value=\"honey\">Honey<\/option><option value=\"fermented\">Fermented<\/option><option value=\"unspecified\">Unspecified<\/option><\/select><\/div>\r\n          <div><div class=\"flbl\">Roast level<\/div><select id=\"f-roast\"><option value=\"\">All<\/option><option value=\"light\">Light<\/option><option value=\"medium\">Medium<\/option><option value=\"dark\">Dark<\/option><option value=\"unspecified\">Unspecified<\/option><\/select><\/div>\r\n          <div><div class=\"flbl\">Position in profile<\/div><select id=\"f-profile\"><option value=\"\">All<\/option><option value=\"aroma\">Aroma<\/option><option value=\"acidity\">Acidity<\/option><option value=\"sweetness\">Sweetness<\/option><option value=\"body\">Body<\/option><option value=\"aftertaste\">Aftertaste<\/option><\/select><\/div>\r\n        <\/div>\r\n        <div class=\"factions\">\r\n          <button class=\"bbtn accent\" id=\"acfmApply\" type=\"button\">Apply<\/button>\r\n          <button class=\"bbtn\" id=\"acfmClear\" type=\"button\">Clear filters<\/button>\r\n          <button class=\"bbtn\" id=\"acfmAll\" type=\"button\">Show all<\/button>\r\n          <button class=\"bbtn\" id=\"acfmReset\" type=\"button\">Start over<\/button>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/section>\r\n\r\n  <section>\r\n    <div class=\"reshead\" id=\"acfmResHead\"><\/div>\r\n    <div class=\"results\" id=\"acfmResults\"><\/div>\r\n  <\/section>\r\n\r\n  <section class=\"builder hidden\" id=\"acfmBuilder\">\r\n    <button class=\"builderhd\" id=\"acfmBuilderHd\" type=\"button\"><span>Product Description Builder for Roasters<\/span><span class=\"ic\">&#9662;<\/span><\/button>\r\n    <div class=\"builderbody\">\r\n      <button class=\"sheetclose\" id=\"acfmSheetClose\" type=\"button\">Close builder<\/button>\r\n      <p class=\"sub\">Arrange flavors across the opening, middle, and aftertaste, then choose the clarity level to generate an English description ready to copy. Use the rotate button on each flavor to move it between positions.<\/p>\r\n      <div class=\"zone\"><div class=\"zt\">Opening flavors<\/div><div class=\"bchips\" id=\"zone-front\"><\/div><\/div>\r\n      <div class=\"zone\"><div class=\"zt\">Middle flavors<\/div><div class=\"bchips\" id=\"zone-mid\"><\/div><\/div>\r\n      <div class=\"zone\"><div class=\"zt\">Aftertaste flavors<\/div><div class=\"bchips\" id=\"zone-after\"><\/div><\/div>\r\n      <div class=\"zt\" style=\"font-weight:800;color:var(--coffee-deep);font-size:.78rem\">Clarity level<\/div>\r\n      <div class=\"clarity\" id=\"acfmClarity\">\r\n        <button class=\"crbtn\" data-cl=\"light\" type=\"button\">Subtle<\/button>\r\n        <button class=\"crbtn on\" data-cl=\"medium\" type=\"button\">Medium<\/button>\r\n        <button class=\"crbtn\" data-cl=\"clear\" type=\"button\">Clear<\/button>\r\n      <\/div>\r\n      <textarea id=\"acfmDescOut\" placeholder=\"The description will appear here after you add flavors...\"><\/textarea>\r\n      <div class=\"bactions\">\r\n        <button class=\"bbtn accent\" id=\"acfmDescCopy\" type=\"button\">Copy description<\/button>\r\n        <button class=\"bbtn\" id=\"acfmDescClear\" type=\"button\">Clear<\/button>\r\n      <\/div>\r\n      <div class=\"toast\" id=\"acfmDescToast\">Copied<\/div>\r\n    <\/div>\r\n  <\/section>\r\n\r\n  <section>\r\n    <div class=\"sec-h\">Training mode<\/div>\r\n    <button class=\"bbtn accent\" id=\"acfmQuizToggle\" type=\"button\">Start training<\/button>\r\n    <div class=\"quiz hidden\" id=\"acfmQuizPanel\"><\/div>\r\n  <\/section>\r\n\r\n  <button class=\"builderfab\" id=\"acfmBuilderFab\" type=\"button\">View description<\/button>\r\n\r\n  <p class=\"note\">An original Cofdar educational tool that helps users understand and build flavor descriptions. The descriptions are indicative and may vary by origin, variety, processing, roast, and brewing method. The tool is not a substitute for formal sensory evaluation or laboratory analysis.<\/p>\r\n\r\n<script>\r\n(function(){\r\n  var TYPES={positive:{label:'Positive',color:'#6f7752'},neutral:{label:'Neutral',color:'#2b406f'},context:{label:'May be a defect depending on context',color:'#b27244'},defect:{label:'Sensory defect',color:'#9a3b3b'}};\r\n  var PROC={natural:'Natural',washed:'Washed',honey:'Honey',fermented:'Fermented',unspecified:'Unspecified'};\r\n  var ROAST={light:'Light',medium:'Medium',dark:'Dark',unspecified:'Unspecified'};\r\n  var PROF={aroma:'Aroma',acidity:'Acidity',sweetness:'Sweetness',body:'Body',aftertaste:'Aftertaste'};\r\n  function F(ar,en,def,cup,where,tip,type,processTags,roastTags,profilePosition){\r\n    return {ar:ar,en:en,def:def,cup:cup,where:where,tip:tip,type:type,processTags:processTags,roastTags:roastTags,profilePosition:profilePosition};\r\n  }\r\n  var DATA=[\r\n   {id:'redfruit',name:'Red & Dark Fruit',short:'Dark Fruit',color:'#9e4b5e',subs:[\r\n    F('Blueberry','','Dark berry sweetness with a juicy aromatic character.','Often reads as sweet dark fruit with gentle acidity.','Commonly associated with fruit-forward coffees, especially some natural or fermentation-led lots.','Compare fresh blueberry with jammy fruit; jamminess can drift toward a fermentative impression.','positive',['natural','fermented'],['light','medium'],'aroma'),\r\n    F('Strawberry','','Soft red-berry sweetness with a fragrant character.','Usually appears as delicate fruit sweetness, often early in the sip.','Can occur in fruit-forward natural coffees.','Look for it in the aroma first, then confirm it as the cup cools.','positive',['natural'],['light','medium'],'aroma'),\r\n    F('Raspberry','','Sweet red berry with a bright tart edge.','Shows as lively berry acidity and light sweetness.','Can occur in clean, expressive coffees with vivid fruit character.','Differentiate it from strawberry by its sharper acidity.','positive',['washed','natural'],['light'],'acidity'),\r\n    F('Blackberry','','Deep dark-berry sweetness with a fuller tone.','Often gives a round, dark-fruit sweetness.','May appear in natural and fermentation-led profiles.','Usually deeper and less bright than red-berry notes.','positive',['natural','fermented'],['medium'],'sweetness'),\r\n    F('Cherry','','Sweet-tart stone-fruit character reminiscent of cherry.','Combines fruit sweetness with a clean tart edge.','Can appear across balanced washed and natural coffees.','Black-cherry impressions tend to feel sweeter; red cherry often reads brighter.','positive',['washed','natural'],['medium'],'aroma'),\r\n    F('Blackcurrant','','Dark berry with a tart, aromatic intensity.','Often perceived as concentrated berry acidity with strong aroma.','Frequently associated with vivid washed coffees, including some East African profiles.','Look for a darker, sharper berry note than blueberry or blackberry.','positive',['washed'],['light','medium'],'acidity'),\r\n    F('Pomegranate','','Tart red-fruit character with a lightly tannic edge.','Reads as bright acidity supported by restrained sweetness.','Can occur in lively, clean washed coffees.','Notice its refreshing tartness and slightly drying finish.','positive',['washed'],['light'],'acidity'),\r\n    F('Red grape','','Juicy grape-like fruit sweetness.','Can show grape sweetness that approaches a wine-like character.','May occur in natural and fermentation-led coffees.','If the alcoholic impression becomes dominant, compare it with fermentative notes.','positive',['natural','fermented'],['medium'],'sweetness'),\r\n    F('Plum','','Dark stone-fruit sweetness with a soft, rounded tone.','Usually presents as deep, calm fruit sweetness.','Can appear in natural coffees and medium roasts.','Compare with dried fruit if the note becomes denser or more concentrated.','positive',['natural'],['medium'],'sweetness'),\r\n    F('Cranberry','','Dry, tart red-berry character.','Shows as brisk acidity with a lightly drying sensation.','Can occur in sharp, clean washed coffees.','Often becomes clearer mid-sip as the cup cools.','positive',['washed'],['light'],'acidity')\r\n   ]},\r\n   {id:'citrus',name:'Citrus & Yellow Fruit',short:'Citrus',color:'#c9a13b',subs:[\r\n    F('Lemon','','Bright, clean citrus acidity.','Gives a crisp, refreshing lift to the cup.','Often associated with light-roasted, clean washed coffees.','Distinguish fresh lemon brightness from harsh, sour sharpness.','positive',['washed'],['light'],'acidity'),\r\n    F('Lime','','Sharp, fresh citrus with a green edge.','Presents as brisk, high-toned acidity.','Can occur in lively washed coffees.','Useful as a reference for very bright, clean citrus acidity.','positive',['washed'],['light'],'acidity'),\r\n    F('Orange','','Sweet citrus character with rounded acidity.','Balances citrus brightness with noticeable sweetness.','Can appear in balanced washed or honey-processed coffees.','Softer and sweeter than lemon, with less aggressive acidity.','positive',['washed','honey'],['light','medium'],'acidity'),\r\n    F('Grapefruit','','Citrus brightness with a gentle bitter edge.','Combines acidity and restrained bitterness.','Can occur in distinctive clean washed coffees.','A light pith-like bitterness may be pleasant when integrated.','positive',['washed'],['light'],'acidity'),\r\n    F('Mandarin','','Soft, sweet citrus with gentle acidity.','Shows as rounded citrus sweetness.','Can appear in sweet, aromatic coffees.','Usually softer and less sharp than lemon or lime.','positive',['washed','honey'],['light','medium'],'aroma'),\r\n    F('Apple','','Crisp orchard-fruit character with clear acidity.','Often reads as clean malic-style brightness.','Can occur in washed and honey-processed coffees.','Green apple tends to feel brighter; red apple tends to feel sweeter.','positive',['washed','honey'],['light','medium'],'acidity'),\r\n    F('Pear','','Soft orchard-fruit sweetness with a delicate aroma.','Usually subtle, smooth and lightly sweet.','Can occur in delicate, clean coffees.','A quiet note that often becomes easier to detect as the cup cools.','positive',['washed'],['light'],'aroma'),\r\n    F('Peach','','Sweet, fragrant stone-fruit character.','Often gives a full, aromatic fruit sweetness.','Can occur in honey and natural coffees.','Compare with nectarine: peach usually feels softer and rounder.','positive',['honey','natural'],['light','medium'],'sweetness'),\r\n    F('Apricot','','Sweet stone fruit with a gentle tart edge.','Combines soft sweetness with lively acidity.','Can occur in washed and honey-processed coffees.','Often sits between peach-like sweetness and citrus-like brightness.','positive',['washed','honey'],['light','medium'],'acidity'),\r\n    F('Nectarine','','Bright, fragrant stone fruit with clear sweetness.','Presents as lifted stone-fruit aromatics.','Can occur in expressive washed and honey-processed coffees.','Typically brighter and slightly crisper than peach.','positive',['washed','honey'],['light'],'aroma')\r\n   ]},\r\n   {id:'tropical',name:'Tropical & Dried Fruit',short:'Tropical',color:'#c47a3e',subs:[\r\n    F('Mango','','Dense tropical sweetness with a ripe-fruit character.','Often appears as full, lush tropical fruit.','Can occur in natural and fermentation-led coffees.','Compare ripe mango with overripe fruit to avoid confusing it with fermentative character.','positive',['fermented','natural'],['light','medium'],'sweetness'),\r\n    F('Pineapple','','Tropical sweetness with sharp, juicy acidity.','Combines sweetness and a distinctive tangy lift.','Can occur in fermentation-led and highly fruit-forward coffees.','If the sharpness becomes solvent-like or excessive, assess for over-fermentation.','positive',['fermented'],['light'],'acidity'),\r\n    F('Passion fruit','','Highly aromatic tropical fruit with vivid tartness.','Shows as penetrating tropical acidity and aroma.','Can occur in expressive washed or fermentation-led coffees.','Often easiest to identify in the aroma and first half of the sip.','positive',['fermented','washed'],['light'],'aroma'),\r\n    F('Guava','','Sweet, aromatic tropical fruit with a dense character.','Often reads as juicy, rounded tropical sweetness.','Can occur in natural and fermentation-led coffees.','Compare with mango; guava often feels more perfumed and less heavy.','positive',['natural','fermented'],['medium'],'sweetness'),\r\n    F('Banana','','Creamy, sweet tropical fruit.','Shows as soft, round sweetness with a ripe-fruit quality.','Can occur in natural or fermentation-led profiles.','Overripe banana can overlap with fermentative character.','context',['natural','fermented'],['medium'],'sweetness'),\r\n    F('Lychee','','Delicate tropical fruit with floral sweetness.','Often perceived as light, perfumed sweetness.','Can occur in aromatic washed or fermentation-led coffees.','Useful as a bridge between floral and tropical notes.','positive',['washed','fermented'],['light'],'aroma'),\r\n    F('Raisin','','Concentrated dried-fruit sweetness.','Often deepens the finish with dark fruit sweetness.','Can occur in natural coffees and deeper roast development.','Compare with fresh grape to judge concentration and dryness.','positive',['natural'],['medium','dark'],'aftertaste'),\r\n    F('Fig','','Deep dried-fruit sweetness with a rich, rounded tone.','Often presents as dense, dark sweetness.','Can occur in natural coffees and medium-to-dark roasts.','May overlap with cocoa-like depth in fuller cups.','positive',['natural'],['medium','dark'],'sweetness'),\r\n    F('Date','','Dense dried-fruit sweetness with a syrupy impression.','Gives a deep, comfortable sweetness and long finish.','Can occur in natural coffees and medium roasts.','Compare with raisin and prune; date usually feels rounder and less tart.','positive',['natural'],['medium'],'aftertaste'),\r\n    F('Prune','','Dark, concentrated dried-fruit character.','Often reads as sticky, dark fruit sweetness.','Can occur in natural coffees and somewhat deeper roasts.','If it becomes sharply alcoholic, compare with fermentative notes.','positive',['natural'],['medium','dark'],'aftertaste')\r\n   ]},\r\n   {id:'floral',name:'Floral & Aromatic',short:'Floral',color:'#b97c95',subs:[\r\n    F('Jasmine','','Delicate, sweet white-floral aroma.','Usually perceived more through aroma than basic taste.','Can occur in aromatic, lightly roasted washed coffees.','Smell the dry grounds and rising steam before tasting.','positive',['washed'],['light'],'aroma'),\r\n    F('Rose','','Warm, perfumed floral character.','Can appear in fragrance, aroma and the finish.','Can occur in highly aromatic coffees.','Often delicate and easy to lose as the cup changes temperature.','positive',['washed'],['light'],'aroma'),\r\n    F('Orange blossom','','Floral aroma with a citrus-like lift.','Combines blossom-like perfume with bright freshness.','Can occur in high-aroma washed coffees.','Compare with orange: the blossom note is more aromatic than juicy.','positive',['washed'],['light'],'aroma'),\r\n    F('Chamomile','','Soft floral-herbal character reminiscent of chamomile tea.','Often reads as calm, tea-like aromatics.','Can occur in delicate, light-roasted coffees.','Look for a gentle dried-flower and herbal impression rather than sweetness.','positive',['washed'],['light'],'aroma'),\r\n    F('Lavender','','Distinctive floral aroma with a herbal edge.','Can feel intense and perfumed.','Can occur in highly aromatic coffees.','At low intensity it can feel elegant; at high intensity it may read as soapy.','context',['washed'],['light'],'aroma'),\r\n    F('Honeysuckle','','Sweet floral aroma with a nectar-like impression.','Shows as delicate floral sweetness.','Can occur in clean, aromatic coffees.','Useful as a bridge between floral and honey-like notes.','positive',['washed'],['light'],'aroma'),\r\n    F('Hibiscus','','Tart floral character with a red-fruit edge.','Often presents as bright, floral acidity.','Can occur in vivid, lightly roasted coffees.','Notice the combination of floral aroma and tartness.','positive',['washed'],['light'],'acidity'),\r\n    F('Elderflower','','Light, fragrant floral aroma with a fresh character.','Usually subtle and airy.','Can occur in delicate aromatic coffees.','A nuanced note that is easiest to detect at moderate cup temperatures.','positive',['washed'],['light'],'aroma'),\r\n    F('Floral','','General floral aroma without a single flower clearly identified.','Creates a broad perfumed impression.','Can occur across aromatic origins and processing styles.','Use this as a starting point before narrowing to a specific flower.','positive',['washed','honey'],['light'],'aroma')\r\n   ]},\r\n   {id:'sweet',name:'Sweetness & Sugars',short:'Sweet',color:'#b27244',subs:[\r\n    F('Honey','','Floral, syrupy sweetness with a smooth impression.','Often adds roundness and soft sweetness.','Can occur across honey-processed and other sweet coffees.','Look for nectar-like sweetness rather than simple sugar.','positive',['honey'],['medium'],'sweetness'),\r\n    F('Caramel','','Warm cooked-sugar sweetness.','Adds rounded sweetness and moderate depth.','Common in well-developed medium roasts.','If it becomes bitter or charred, compare with burnt-sugar notes.','positive',['washed','honey'],['medium'],'sweetness'),\r\n    F('Toffee','','Buttery, cooked-sugar sweetness.','Often gives creamy, rich sweetness.','Can occur in medium to darker roast development.','Sits between caramel, butter and brown-sugar impressions.','positive',['natural','honey'],['medium','dark'],'sweetness'),\r\n    F('Brown sugar','','Dark sugar sweetness with a mild molasses-like tone.','Usually feels warm, rounded and comforting.','Can occur in medium and darker roasts.','Compare with molasses for intensity and with caramel for cleaner sweetness.','positive',['natural'],['medium','dark'],'sweetness'),\r\n    F('Molasses','','Dark, concentrated sugar sweetness.','Often reads as heavy, deep sweetness.','Can occur in deeper roast development and dense natural profiles.','Close to burnt sugar, but should retain sweetness rather than char.','positive',['natural'],['dark'],'sweetness'),\r\n    F('Maple','','Warm, distinctive syrup-like sweetness.','Usually soft, smooth and lingering.','Can occur in balanced medium-roast profiles.','Look for a rounded syrup impression rather than simple sugar.','positive',['honey'],['medium'],'sweetness'),\r\n    F('Vanilla','','Creamy, aromatic sweetness.','Often appears as a soft aromatic layer in the background.','Can occur in sweet, balanced coffees and medium roasts.','It can soften the perception of sharper acidity.','positive',['washed','honey'],['medium'],'aroma'),\r\n    F('Caramelized sugar','','Deep cooked-sugar sweetness with browned character.','Often presents as warm, dark sweetness.','Can occur in medium to darker roast development.','Use it to distinguish browned sweetness from clearly burnt notes.','positive',['natural'],['medium','dark'],'sweetness'),\r\n    F('Sweet','','General perception of sweetness without a specific reference.','Often balances acidity and bitterness.','Can occur across origins, processes and roast levels.','Use this as a starting point before identifying a more specific sweet descriptor.','positive',['washed','honey','natural'],['medium'],'sweetness')\r\n   ]},\r\n   {id:'cocoa',name:'Cocoa & Chocolate',short:'Cocoa',color:'#5d4033',subs:[\r\n    F('Dark chocolate','','Deep cocoa character with a bittersweet edge.','Often contributes weight, depth and pleasant bitterness.','Can occur in many medium-to-dark roast profiles.','Useful in espresso-style descriptions when the cocoa character is clear and persistent.','positive',['washed','natural'],['medium','dark'],'body'),\r\n    F('Milk chocolate','','Soft cocoa sweetness with a creamy impression.','Usually smooth, sweet and rounded.','Can occur in balanced medium-roast coffees.','Often pairs perceptually with nutty notes.','positive',['washed'],['medium'],'sweetness'),\r\n    F('Cocoa','','Dry cocoa character with restrained sweetness.','Can leave a gentle drying cocoa finish.','Can occur across many origins and roast styles.','Differentiate it from sweeter milk-chocolate or dark-chocolate impressions.','positive',['washed','natural'],['medium'],'aftertaste'),\r\n    F('White chocolate','','Creamy confection-like sweetness with very low bitterness.','Usually soft, rich and smooth.','Can occur in sweet, moderately developed coffees.','Think creamy sweetness more than cocoa bitterness.','positive',['washed','honey'],['light','medium'],'sweetness'),\r\n    F('Mocha','','Coffee-like cocoa character with roasted depth.','Often gives a full, integrated cocoa-and-coffee impression.','Can occur in medium and darker roast profiles.','Use when coffee roast character and cocoa are difficult to separate.','positive',['natural'],['medium','dark'],'body')\r\n   ]},\r\n   {id:'nutty',name:'Nuts & Grains',short:'Nuts',color:'#9a7b52',subs:[\r\n    F('Almond','','Light, clean nutty character.','May add gentle dryness and medium body.','Can occur in classic balanced profiles.','Compare with cocoa when both appear dry and mild.','positive',['washed'],['medium'],'body'),\r\n    F('Hazelnut','','Rich, roasted nut character.','Often gives warm fullness and sweetness.','Can occur in medium-roast coffees.','A common espresso-compatible descriptor when integrated and clean.','positive',['washed','natural'],['medium'],'body'),\r\n    F('Peanut','','Simple roasted-nut character with an earthy edge.','May read as dry or plain.','Can occur in coffees with simpler flavor structure or underdeveloped roast character.','High intensity can reduce perceived complexity.','neutral',['washed','unspecified'],['light','medium'],'body'),\r\n    F('Walnut','','Nutty character with a mild bitter edge.','Often combines dryness and light bitterness.','Can occur in medium-to-dark roast profiles.','Usually more bitter and drying than almond.','neutral',['washed'],['medium','dark'],'aftertaste'),\r\n    F('Cashew','','Soft, sweet nut character.','Often reads as smooth, creamy and mild.','Can occur in balanced medium-roast coffees.','Typically softer and sweeter than walnut or peanut.','positive',['washed','honey'],['medium'],'body'),\r\n    F('Pistachio','','Distinctive green-nut aroma with mild sweetness.','Usually subtle and aromatic.','Can occur in light-to-medium roast profiles.','A relatively uncommon note; confirm it against other nutty descriptors.','positive',['washed'],['light','medium'],'aroma'),\r\n    F('Coconut','','Creamy tropical sweetness with a nut-like character.','Often soft, sweet and smooth.','Can occur in natural and honey-processed coffees.','Useful as a bridge between tropical fruit, sweetness and nutty character.','positive',['natural','honey'],['light','medium'],'sweetness'),\r\n    F('Grain','','Dry cereal-like character reminiscent of toasted grain.','Can add mild dryness and simple cereal structure.','May appear in very light or underdeveloped roast profiles.','High intensity can suggest limited roast development.','neutral',['unspecified'],['light'],'body'),\r\n    F('Malt','','Warm cereal sweetness with a toasted quality.','Often adds round, grain-like sweetness and body.','Can occur in medium-roast profiles.','Distinguish it from plain grain by its sweeter, fuller impression.','positive',['natural'],['medium'],'body')\r\n   ]},\r\n   {id:'spice',name:'Warm Spices',short:'Spices',color:'#a6552f',subs:[\r\n    F('Cinnamon','','Sweet, warm spice aroma.','Often appears as a soft warming accent.','Can occur across natural and washed coffees.','Usually an aromatic association rather than a literal cinnamon taste.','positive',['natural','washed'],['medium'],'aroma'),\r\n    F('Cardamom','','Highly aromatic warm spice with a fresh edge.','Can create a lifted aromatic sensation in the nose.','May occur in complex, highly aromatic coffees.','A distinctive spice note that should remain separate from added-flavor expectations.','positive',['washed','fermented'],['light','medium'],'aroma'),\r\n    F('Clove','','Warm, woody spice with a sharp edge.','Often appears late in the sip or finish.','Can occur in deeper roast and spice-forward profiles.','High intensity can make the cup feel heavy or medicinal.','neutral',['natural'],['medium','dark'],'aftertaste'),\r\n    F('Nutmeg','','Warm, woody spice with gentle sweetness.','Often reads as a calm, dry spice note.','Can occur in medium-roast profiles.','Compare with cinnamon; nutmeg usually feels drier and woodier.','neutral',['natural'],['medium'],'aroma'),\r\n    F('Black pepper','','Pungent, warm spice character.','Can create a mild prickling or spicy finish.','May occur in complex coffees and deeper roast development.','Look for a spice-like pungency rather than simple bitterness.','neutral',['natural','fermented'],['medium','dark'],'aftertaste'),\r\n    F('Ginger','','Fresh, warm spice with a bright edge.','Often feels lively and slightly warming.','Can occur in highly aromatic, bright coffees.','Useful as a bridge between spice and fresh aromatic character.','positive',['washed','fermented'],['light','medium'],'aroma'),\r\n    F('Anise','','Sweet, distinctive aromatic spice.','Usually highly recognizable when present.','Can occur in unusual or complex fermentation-led profiles.','Confirm carefully; its licorice-like quality can dominate perception.','neutral',['fermented'],['medium'],'aroma')\r\n   ]},\r\n   {id:'herbal',name:'Herbal & Vegetal',short:'Herbal',color:'#6f7752',subs:[\r\n    F('Green tea','','Soft green, tea-like aromatic character.','Often feels light, fresh and delicate.','Can occur in light-roasted washed coffees.','At low intensity it can read as freshness rather than raw vegetation.','positive',['washed'],['light'],'aroma'),\r\n    F('Mint','','Cool, fresh aromatic sensation.','Often leaves a refreshing impression in the finish.','Can occur in highly aromatic coffees.','A subtle cooling sensation is more useful than expecting literal mint flavor.','positive',['washed'],['light'],'aftertaste'),\r\n    F('Grassy','','Fresh-cut grass or raw green plant character.','Usually light and vegetal.','Can occur in very light or underdeveloped roast profiles.','Low intensity may feel fresh; high intensity can feel underdeveloped.','context',['washed','unspecified'],['light'],'aroma'),\r\n    F('Vegetative','','Cooked-vegetable or bean-like character.','Often feels heavier and less fresh than grassy notes.','Can be associated with immature coffee or processing issues.','High intensity is generally distracting and may indicate quality problems.','context',['unspecified'],['light'],'body'),\r\n    F('Dried herbs','','Dry herbal aroma with savory character.','Often gives mild aromatic dryness.','Can occur across origins and processing styles.','Useful as a bridge between green\/herbal and spice-like notes.','neutral',['natural','washed'],['light','medium'],'aroma'),\r\n    F('Woody','','Dry wood-like character.','Often creates a dry, dull finish.','Can be associated with age, storage or deeper roast development.','High intensity may indicate staling or loss of freshness.','context',['unspecified'],['dark'],'aftertaste'),\r\n    F('Earthy','','Soil-like or damp earth character.','Often adds weight and a muted earthy impression.','Can be associated with drying, storage or certain processing outcomes.','Strong earthy character can indicate a fault; low levels may be context-dependent.','context',['natural','unspecified'],['medium','dark'],'body'),\r\n    F('Peapod','','Raw green vegetal character reminiscent of pea pods.','Usually sharp, green and immature.','Can be associated with under-ripe coffee or limited development.','A useful marker for distinctly raw green character.','context',['unspecified'],['light'],'aroma'),\r\n    F('Tobacco','','Dry, dark aromatic character reminiscent of cured tobacco leaf.','Often appears in the finish with restrained bitterness.','Can occur in deeper roast profiles or aged flavor structures.','At low intensity it may add complexity; high intensity can feel stale or dry.','neutral',['natural'],['dark'],'aftertaste')\r\n   ]},\r\n   {id:'ferment',name:'Fermentative & Processing',short:'Fermentative',color:'#7e5a86',subs:[\r\n    F('Winey','','Fruit acidity with a vinous or lightly alcoholic impression.','Can create deep fruit complexity and lively acidity.','May occur in extended or fermentation-led processing.','At controlled intensity it can be complex; excessive alcohol-like character may signal imbalance.','context',['fermented','natural'],['light','medium'],'acidity'),\r\n    F('Boozy','','Overripe fruit with a clear alcohol-like aromatic impression.','Often feels heavy, ripe and fermentation-driven.','Can be associated with intense or prolonged fermentation.','Use context: low intensity may feel expressive, while high intensity can become solvent-like.','context',['fermented'],['medium'],'aftertaste'),\r\n    F('Lactic','','Creamy sourness reminiscent of cultured dairy.','Often combines soft acidity with a rounded mouthfeel.','Can occur in fermentation-led coffees with lactic character.','Look for creamy acidity rather than sharp vinegar-like sourness.','context',['fermented'],['light','medium'],'acidity'),\r\n    F('Fermented','','General fruit-fermentation character without a more specific reference.','Usually presents as noticeable fermentation-derived aroma and flavor.','Can occur in intentionally fermentation-led processing.','Use this broad term only when a more specific descriptor is not clear.','context',['fermented'],['medium'],'aroma'),\r\n    F('Cidery','','Apple-like acidity with a fermented edge.','Often reads as tart, fermented apple.','Can occur with extended fermentation.','Compare with fresh apple; cidery character should feel more fermented and less crisp.','context',['fermented'],['light'],'acidity'),\r\n    F('Kombucha','','Tangy, fermented character with tea-like acidity.','Often presents as refreshing but clearly fermentation-led sourness.','Can occur in highly experimental fermentation profiles.','Keep it separate from acetic sharpness or spoilage-like sourness.','context',['fermented'],['light'],'acidity')\r\n   ]},\r\n   {id:'roastbody',name:'Roast & Body',short:'Roast',color:'#4e463e',subs:[\r\n    F('Roasted','','General warm roasted character.','Often appears as roast-driven aroma in the background.','Increases with roast development.','Use as a broad descriptor before narrowing to toast, smoke or burnt notes.','positive',['natural','washed'],['medium','dark'],'aroma'),\r\n    F('Smoky','','Smoke-like roasted aroma.','Can create a sharp, dry roast impression.','More common in darker roast development.','High intensity can mask origin character.','neutral',['natural'],['dark'],'aftertaste'),\r\n    F('Toast','','Warm toasted bread or cereal character.','Often reads as comforting, dry and roasted.','Can occur in balanced medium-roast development.','Compare with grain for cereal character and with roasted for broader roast aroma.','positive',['washed'],['medium'],'aroma'),\r\n    F('Roasted coffee','','Classic aroma of freshly roasted coffee.','Gives a familiar, coffee-forward aromatic profile.','Typically more apparent in medium-to-dark roast development.','Use when roast aroma is clear but not specifically smoky or burnt.','positive',['natural','washed'],['medium','dark'],'aroma'),\r\n    F('Creamy body','','Smooth, rounded mouthfeel with a creamy texture.','Perceived as softness and coating weight in the mouth.','Can occur in many sweet natural and honey-processed coffees.','This is a tactile attribute, not a flavor descriptor.','positive',['natural','honey'],['medium'],'body'),\r\n    F('Buttery body','','Rich, dense mouthfeel with a buttery texture.','Often feels heavy, soft and coating.','Can occur in full-bodied coffees and moderately developed roasts.','Evaluate it as texture rather than as literal butter flavor.','positive',['natural'],['medium'],'body'),\r\n    F('Tea-like','','Light, transparent mouthfeel with delicate structure.','Often feels clean, thin and elegant rather than heavy.','Can occur in light-roasted washed coffees.','A positive structural trait when the cup remains expressive and clean.','positive',['washed'],['light'],'body'),\r\n    F('Astringent','','Drying, puckering tactile sensation.','Feels like the mouth and tongue are being tightened or dried.','Can arise from coffee composition, roast development or extraction conditions.','High intensity is usually undesirable; separate it from bitterness.','context',['unspecified'],['light','dark'],'aftertaste')\r\n   ]},\r\n   {id:'defect',name:'Sensory Defects',short:'Defects',color:'#9a3b3b',subs:[\r\n    F('Musty','','Stale, damp or closed aromatic character.','Often creates a muted, unclean impression.','Can be associated with poor drying, storage or age.','Treat persistent mustiness as a fault indicator rather than an origin note.','defect',['unspecified'],['unspecified'],'aroma'),\r\n    F('Phenolic','','Medicinal, antiseptic or sharply chemical aromatic character.','Often feels penetrating and unpleasant.','Can be associated with defective beans or problematic processing.','Distinguish it from smoke and spice by its medicinal, disinfectant-like quality.','defect',['unspecified'],['unspecified'],'aftertaste'),\r\n    F('Papery','','Paper or cardboard-like stale character.','Often feels flat, faded and dry.','Commonly associated with oxidation, age or poor storage.','A useful marker of lost freshness.','defect',['unspecified'],['unspecified'],'aftertaste'),\r\n    F('Burnt','','Charred roast character with excessive bitterness.','Usually dominates the cup with dry, harsh bitterness.','Can result from excessive roast development.','Strong burnt character masks origin and process expression.','defect',['unspecified'],['dark'],'aftertaste'),\r\n    F('Potato','','Raw potato-like aromatic defect.','Often appears suddenly and distinctly in an individual cup.','Can occur sporadically in coffees from parts of East and Central Africa.','Treat it as a defect when clearly present.','defect',['unspecified'],['unspecified'],'aroma'),\r\n    F('Chemical','','Solvent-like, artificial or medicinal chemical character.','Usually sharp, intrusive and non-food-like.','Can be associated with contamination or severe processing\/storage issues.','If clearly chemical rather than spice-like or phenolic, treat it as a fault indicator.','defect',['unspecified'],['unspecified'],'aroma'),\r\n    F('Rancid','','Stale oxidized-fat character.','Often feels oily, heavy and unclean.','Can be associated with old coffee or poor storage.','A strong rancid note indicates deterioration.','defect',['unspecified'],['unspecified'],'aftertaste'),\r\n    F('Sulfurous','','Sulfur, onion or similar sharp sulfur-like character.','Usually pungent and distracting.','Can be associated with problematic fermentation or defective coffee.','Persistent sulfurous character is a strong fault indicator.','defect',['fermented','unspecified'],['unspecified'],'aroma'),\r\n    F('Over-fermented','','Excessive, spoiled or uncontrolled fermentation character.','Often presents as harsh fermented acidity and unpleasant ripe-fruit intensity.','Can result from fermentation that exceeds a clean, controlled sensory range.','Use when fermentation character has clearly crossed from expressive to defective.','defect',['fermented'],['unspecified'],'acidity')\r\n   ]}\r\n  ];\r\n\r\n  var FAMDESC={redfruit:'Sweet and tart red berries and dark fruits',citrus:'Bright acidity and refreshing yellow fruits',tropical:'Dense tropical fruit and dried fruit',floral:'Delicate aromatic floral notes',sweet:'Natural sweetness and warm sugars',cocoa:'Cocoa depth and full body',nutty:'Warm nuts and roasted grains',spice:'Warm aromatic spice notes',herbal:'Green herbal and vegetal notes',ferment:'Fermentative and wine-like fruit character',roastbody:'Roast flavors and body sensations',defect:'Undesirable notes that reduce quality'};\r\n  DATA.forEach(function(f){ f.desc=FAMDESC[f.id]||''; });\r\n\r\n  var FAMMAP={}; DATA.forEach(function(f){ FAMMAP[f.id]=f; });\r\n  var FLAT=[]; DATA.forEach(function(f){ f.subs.forEach(function(s){ FLAT.push(Object.assign({fam:f.name,famId:f.id,famColor:f.color},s)); }); });\r\n\r\n  var SVGNS='http:\/\/www.w3.org\/2000\/svg';\r\n  var svg=document.getElementById('acfmCircle');\r\n  var elRes=document.getElementById('acfmResults');\r\n  var elHead=document.getElementById('acfmResHead');\r\n  var elQuiz=document.getElementById('acfmQuizPanel');\r\n  var famcards=document.getElementById('acfmFamCards');\r\n  var builder=document.getElementById('acfmBuilder');\r\n  var fab=document.getElementById('acfmBuilderFab');\r\n  var mq=window.matchMedia('(max-width:780px)');\r\n  var activeFam=null, showAll=false;\r\n  var filters={type:'',process:'',roast:'',profile:''};\r\n  var chosen=[], clarity='medium';\r\n\r\n  function esc(t){ return (t||'').replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;'); }\r\n  function el(tag,a){ var e=document.createElementNS(SVGNS,tag); for(var k in a) e.setAttribute(k,a[k]); return e; }\r\n  function polar(cx,cy,r,a){ return [cx+r*Math.cos(a), cy+r*Math.sin(a)]; }\r\n  function arc(cx,cy,rO,rI,a0,a1){ var p0=polar(cx,cy,rO,a0),p1=polar(cx,cy,rO,a1),p2=polar(cx,cy,rI,a1),p3=polar(cx,cy,rI,a0);\r\n    var lg=(a1-a0)>Math.PI?1:0;\r\n    return 'M'+p0[0]+' '+p0[1]+' A'+rO+' '+rO+' 0 '+lg+' 1 '+p1[0]+' '+p1[1]+' L'+p2[0]+' '+p2[1]+' A'+rI+' '+rI+' 0 '+lg+' 0 '+p3[0]+' '+p3[1]+' Z'; }\r\n  var cx=200,cy=200,rO=188,rI=86,rL=140,N=DATA.length,step=(Math.PI*2)\/N,pad=0.024;\r\n\r\n  \/* circle (optional visual) *\/\r\n  function buildCircle(){\r\n    while(svg.firstChild) svg.removeChild(svg.firstChild);\r\n    DATA.forEach(function(f,i){\r\n      var a0=-Math.PI\/2+i*step+pad,a1=-Math.PI\/2+(i+1)*step-pad;\r\n      var g=el('g',{'class':'seg','data-id':f.id});\r\n      g.appendChild(el('path',{d:arc(cx,cy,rO,rI,a0,a1),fill:f.color}));\r\n      var mid=(a0+a1)\/2,lp=polar(cx,cy,rL,mid);\r\n      var t=el('text',{x:lp[0],y:lp[1]+4,'text-anchor':'middle','class':'lbl'}); t.textContent=f.short; g.appendChild(t);\r\n      g.addEventListener('click',function(){ selectFam(activeFam===f.id?null:f.id); });\r\n      svg.appendChild(g);\r\n    });\r\n    svg.appendChild(el('circle',{cx:cx,cy:cy,r:rI-6,fill:'#fff',stroke:'#e7dfcf','stroke-width':'1'}));\r\n    var ct=el('text',{x:cx,y:cy-2,'text-anchor':'middle','class':'ctr-t',id:'acfmCtrT'}); ct.textContent='Coffee';\r\n    var cs=el('text',{x:cx,y:cy+17,'text-anchor':'middle','class':'ctr-s',id:'acfmCtrS'}); cs.textContent='Choose a family';\r\n    svg.appendChild(ct); svg.appendChild(cs);\r\n  }\r\n  function paintCircle(){\r\n    var old=document.getElementById('acfmSelArc'); if(old) old.remove();\r\n    var ct=document.getElementById('acfmCtrT'), cs=document.getElementById('acfmCtrS');\r\n    svg.querySelectorAll('.seg').forEach(function(g){ g.classList.toggle('dim', activeFam && g.getAttribute('data-id')!==activeFam); });\r\n    if(activeFam){ DATA.forEach(function(f,i){ if(f.id===activeFam){ var a0=-Math.PI\/2+i*step+pad,a1=-Math.PI\/2+(i+1)*step-pad;\r\n      svg.appendChild(el('path',{d:arc(cx,cy,rO+3,rI-3,a0,a1),fill:'none',stroke:'#b27244','stroke-width':'3',id:'acfmSelArc','pointer-events':'none'}));\r\n      if(ct){ct.textContent=f.short;ct.setAttribute('fill',f.color);} if(cs){cs.textContent=f.subs.length+' flavors';} }}); }\r\n    else { if(ct){ct.textContent='Coffee';ct.setAttribute('fill','#2b406f');} if(cs){cs.textContent='Choose a family';} }\r\n  }\r\n\r\n  \/* family cards *\/\r\n  function buildFamCards(){\r\n    famcards.innerHTML='';\r\n    DATA.forEach(function(f){\r\n      var b=document.createElement('button'); b.className='famcard'; b.setAttribute('data-id',f.id); b.style.borderTopColor=f.color;\r\n      b.innerHTML='<div class=\"fn\">'+esc(f.name)+'<\/div><div class=\"fc\">'+f.subs.length+' flavors<\/div><div class=\"fd\">'+esc(f.desc)+'<\/div>';\r\n      b.addEventListener('click',function(){ selectFam(activeFam===f.id?null:f.id); });\r\n      famcards.appendChild(b);\r\n    });\r\n  }\r\n  function paintFamCards(){ famcards.querySelectorAll('.famcard').forEach(function(c){ c.classList.toggle('on', c.getAttribute('data-id')===activeFam); }); }\r\n\r\n  function selectFam(id){\r\n    activeFam=id; showAll=false; document.getElementById('acfmSearch').value='';\r\n    paintFamCards(); paintCircle(); refresh();\r\n    if(id){ setTimeout(function(){ elHead.scrollIntoView({behavior:'smooth',block:'start'}); },30); }\r\n  }\r\n\r\n  \/* list + filters *\/\r\n  function searchRes(q){ return FLAT.filter(function(x){ return x.ar.toLowerCase().indexOf(q)>-1||x.en.toLowerCase().indexOf(q)>-1||x.def.toLowerCase().indexOf(q)>-1||x.fam.toLowerCase().indexOf(q)>-1; }); }\r\n  function anyFilter(){ return filters.type||filters.process||filters.roast||filters.profile; }\r\n  function baseList(){\r\n    var sv=(document.getElementById('acfmSearch').value||'').trim().toLowerCase();\r\n    if(activeFam) return FLAT.filter(function(x){return x.famId===activeFam;});\r\n    if(sv) return searchRes(sv);\r\n    if(showAll||anyFilter()) return FLAT.slice();\r\n    return null;\r\n  }\r\n  function applyFilters(list){ if(!list) return list; return list.filter(function(s){\r\n    if(filters.type && s.type!==filters.type) return false;\r\n    if(filters.process && s.processTags.indexOf(filters.process)<0) return false;\r\n    if(filters.roast && s.roastTags.indexOf(filters.roast)<0) return false;\r\n    if(filters.profile && s.profilePosition!==filters.profile) return false;\r\n    return true; }); }\r\n  function headTitle(){\r\n    var sv=(document.getElementById('acfmSearch').value||'').trim();\r\n    if(activeFam) return 'Family flavors: '+FAMMAP[activeFam].name;\r\n    if(sv) return 'Search results';\r\n    if(showAll) return 'All flavors';\r\n    if(anyFilter()) return 'Filtered results';\r\n    return '';\r\n  }\r\n  function refresh(){\r\n    var list=applyFilters(baseList());\r\n    var title=headTitle();\r\n    if(!list){ elHead.innerHTML=''; }\r\n    else { elHead.innerHTML='<span class=\"rt\">'+esc(title)+'<\/span><span class=\"rc\">Results: '+list.length+'<\/span>'; }\r\n    renderList(list);\r\n  }\r\n\r\n  function badge(type){ var t=TYPES[type]; return '<span class=\"badge\" style=\"color:'+t.color+';border-color:'+t.color+';background:'+t.color+'14\">'+t.label+'<\/span>'; }\r\n  function keyOf(s){ return s.famId+':'+s.ar; }\r\n  function tagList(arr,map){ return arr.map(function(k){return map[k];}).join(', '); }\r\n\r\n  function cardHTML(s,i){\r\n    var added=chosen.some(function(c){return c.key===keyOf(s);});\r\n    return '<div class=\"card\" data-k=\"'+i+'\">'+\r\n      '<div class=\"top\"><span class=\"accent\" style=\"background:'+s.famColor+'\"><\/span><div class=\"hd\">'+\r\n        '<div class=\"nm\">'+esc(s.ar)+(s.en?'<small>'+esc(s.en)+'<\/small>':'')+'<\/div>'+\r\n        '<div class=\"def\">'+esc(s.def)+'<\/div>'+badge(s.type)+\r\n      '<\/div><span class=\"chev\">&#9662;<\/span><\/div>'+\r\n      '<div class=\"detail\"><div class=\"in\">'+\r\n        '<div class=\"field\"><div class=\"k\">How it may present in the cup<\/div><div class=\"v\">'+esc(s.cup)+'<\/div><\/div>'+\r\n        '<div class=\"field\"><div class=\"k\">Where it may appear<\/div><div class=\"v\">'+esc(s.where)+'<\/div><\/div>'+\r\n        '<div class=\"field\"><div class=\"k\">Tasting tip<\/div><div class=\"v\">'+esc(s.tip)+'<\/div><\/div>'+\r\n        '<div class=\"meta\">'+\r\n          '<span class=\"pill\">Position: '+PROF[s.profilePosition]+'<\/span>'+\r\n          '<span class=\"pill\">Processing: '+tagList(s.processTags,PROC)+'<\/span>'+\r\n          '<span class=\"pill\">Roast: '+tagList(s.roastTags,ROAST)+'<\/span>'+\r\n          '<span class=\"pill\">Family: '+esc(s.fam)+'<\/span>'+\r\n        '<\/div>'+\r\n        '<div class=\"cbtns\">'+\r\n          '<button class=\"mini add'+(added?' on':'')+'\" type=\"button\" data-add>'+(added?'Added to description':'Add to description')+'<\/button>'+\r\n          '<button class=\"mini ghost\" type=\"button\" data-copy>Copy flavor description<\/button>'+\r\n        '<\/div><div class=\"toast\">Copied<\/div>'+\r\n      '<\/div><\/div><\/div>';\r\n  }\r\n  function renderList(list){\r\n    if(!list){ elRes.innerHTML='<div class=\"hint\"><b>Choose a family from the cards above<\/b>Or use search and filters, or click \"Show all\".<\/div>'; return; }\r\n    if(!list.length){ elRes.innerHTML='<div class=\"hint\"><b>No matching results<\/b>Try changing the filters or search term.<\/div>'; return; }\r\n    elRes.innerHTML=list.map(cardHTML).join('');\r\n    elRes.querySelectorAll('.card').forEach(function(card){\r\n      var s=list[+card.getAttribute('data-k')], detail=card.querySelector('.detail'), toast=card.querySelector('.toast');\r\n      card.querySelector('.top').addEventListener('click',function(){ var open=card.classList.toggle('open'); detail.style.maxHeight=open?detail.scrollHeight+'px':null; });\r\n      card.querySelector('[data-copy]').addEventListener('click',function(e){ e.stopPropagation();\r\n        var txt='Flavor: '+s.ar+(s.en?' ('+s.en+')':'')+'\\nDefinition: '+s.def+'\\nIn the cup: '+s.cup+'\\nWhere it may appear: '+s.where+'\\nTip: '+s.tip+'\\nPosition: '+PROF[s.profilePosition]+'\\nProcessing: '+tagList(s.processTags,PROC)+'\\nRoast: '+tagList(s.roastTags,ROAST)+'\\nClassification: '+TYPES[s.type].label+'\\nCofdar Interactive Coffee Flavor Map';\r\n        copyText(txt,toast); });\r\n      card.querySelector('[data-add]').addEventListener('click',function(e){ e.stopPropagation(); toggleChosen(s);\r\n        var on=chosen.some(function(c){return c.key===keyOf(s);}); this.classList.toggle('on',on); this.textContent=on?'Added to description':'Add to description'; });\r\n    });\r\n  }\r\n  function copyText(txt,toastEl){\r\n    var done=function(){ if(toastEl){toastEl.classList.add('show'); setTimeout(function(){toastEl.classList.remove('show');},1400);} };\r\n    if(navigator.clipboard&&navigator.clipboard.writeText){ navigator.clipboard.writeText(txt).then(done,done); }\r\n    else { var ta=document.createElement('textarea'); ta.value=txt; document.body.appendChild(ta); ta.select(); try{document.execCommand('copy');}catch(e){} ta.remove(); done(); }\r\n  }\r\n\r\n  \/* builder *\/\r\n  function isMobile(){ return mq.matches; }\r\n  function flavorByKey(k){ return FLAT.filter(function(x){return keyOf(x)===k;})[0]; }\r\n  function updateBuilder(){\r\n    if(chosen.length===0){ builder.classList.add('hidden'); builder.classList.remove('sheetopen','open'); fab.classList.remove('show'); return; }\r\n    if(isMobile()){ fab.classList.add('show'); if(!builder.classList.contains('sheetopen')) builder.classList.add('hidden'); }\r\n    else { fab.classList.remove('show'); builder.classList.remove('sheetopen'); builder.classList.remove('hidden'); builder.classList.add('open'); }\r\n  }\r\n  function openSheet(){ builder.classList.remove('hidden'); builder.classList.add('open','sheetopen'); fab.classList.remove('show'); }\r\n  function closeSheet(){ builder.classList.remove('sheetopen'); if(chosen.length){ builder.classList.add('hidden'); fab.classList.add('show'); } }\r\n  function toggleChosen(s){ var k=keyOf(s); var idx=-1; chosen.forEach(function(c,j){if(c.key===k)idx=j;});\r\n    if(idx>-1) chosen.splice(idx,1); else chosen.push({key:k,pos:'front'});\r\n    renderBuilder(); updateBuilder();\r\n  }\r\n  function nextPos(p){ return p==='front'?'mid':(p==='mid'?'after':'front'); }\r\n  function renderBuilder(){\r\n    ['front','mid','after'].forEach(function(pos){\r\n      var z=document.getElementById('zone-'+pos); var items=chosen.filter(function(c){return c.pos===pos;});\r\n      if(!items.length){ z.innerHTML='<span class=\"bempty\">No flavors here.<\/span>'; return; }\r\n      z.innerHTML=items.map(function(c){ var s=flavorByKey(c.key);\r\n        return '<span class=\"bchip\">'+esc(s.ar)+'<button class=\"mv\" type=\"button\" data-mv=\"'+c.key+'\" title=\"Move\">&#8634;<\/button><button class=\"rm\" type=\"button\" data-rm=\"'+c.key+'\" title=\"Remove\">&times;<\/button><\/span>'; }).join('');\r\n    });\r\n    builder.querySelectorAll('[data-mv]').forEach(function(b){ b.addEventListener('click',function(){ var k=b.getAttribute('data-mv'); chosen.forEach(function(c){ if(c.key===k) c.pos=nextPos(c.pos); }); renderBuilder(); }); });\r\n    builder.querySelectorAll('[data-rm]').forEach(function(b){ b.addEventListener('click',function(){ var k=b.getAttribute('data-rm'); var idx=-1; chosen.forEach(function(c,j){if(c.key===k)idx=j;}); if(idx>-1) chosen.splice(idx,1);\r\n      renderBuilder(); updateBuilder(); refresh(); }); });\r\n    document.getElementById('acfmDescOut').value=genDesc();\r\n  }\r\n  function listNames(pos){ var ns=chosen.filter(function(c){return c.pos===pos;}).map(function(c){return flavorByKey(c.key).ar;});\r\n    if(!ns.length) return ''; return ns.length===1?ns[0]:ns.slice(0,-1).join(', ')+' and '+ns[ns.length-1]; }\r\n  function genDesc(){\r\n    if(!chosen.length) return '';\r\n    var clr={light:'with subtle flavor definition',medium:'with balanced flavor clarity',clear:'with clear and expressive flavors'}[clarity];\r\n    var front=listNames('front'),mid=listNames('mid'),after=listNames('after'),parts=[];\r\n    if(front) parts.push('opens with '+front);\r\n    if(mid) parts.push('followed by '+mid+' in the middle');\r\n    if(after) parts.push('finishing with '+after+' in the aftertaste');\r\n    var body=parts.length?('A coffee '+clr+', '+parts.join(', ')+'.'):('A coffee '+clr+'.');\r\n    return body+' The intensity of these flavors may vary with origin, variety, processing, roast level, and brewing method.';\r\n  }\r\n  document.getElementById('acfmBuilderHd').addEventListener('click',function(){ builder.classList.toggle('open'); });\r\n  document.getElementById('acfmSheetClose').addEventListener('click',closeSheet);\r\n  document.getElementById('acfmBuilderFab').addEventListener('click',openSheet);\r\n  document.getElementById('acfmClarity').querySelectorAll('.crbtn').forEach(function(b){ b.addEventListener('click',function(){\r\n    document.getElementById('acfmClarity').querySelectorAll('.crbtn').forEach(function(x){x.classList.remove('on');}); b.classList.add('on'); clarity=b.getAttribute('data-cl'); document.getElementById('acfmDescOut').value=genDesc(); }); });\r\n  document.getElementById('acfmDescCopy').addEventListener('click',function(){ var v=document.getElementById('acfmDescOut').value; if(v) copyText(v,document.getElementById('acfmDescToast')); });\r\n  document.getElementById('acfmDescClear').addEventListener('click',function(){ chosen=[]; renderBuilder(); updateBuilder(); refresh(); });\r\n\r\n  \/* circle toggle *\/\r\n  var cbox=document.getElementById('acfmCircleBox'), ctgl=document.getElementById('acfmCircleToggle');\r\n  function setCircle(show){ cbox.classList.toggle('hidden',!show); ctgl.textContent=show?'Hide wheel':'Show wheel'; }\r\n  ctgl.addEventListener('click',function(){ setCircle(cbox.classList.contains('hidden')); });\r\n\r\n  \/* controls *\/\r\n  document.getElementById('acfmSearch').addEventListener('input',function(){ activeFam=null; showAll=false; paintFamCards(); paintCircle(); refresh(); });\r\n  function readFilters(){ filters.type=document.getElementById('f-type').value; filters.process=document.getElementById('f-process').value; filters.roast=document.getElementById('f-roast').value; filters.profile=document.getElementById('f-profile').value; }\r\n  document.getElementById('acfmApply').addEventListener('click',function(){ readFilters(); if(!activeFam){ showAll=false; } refresh(); setTimeout(function(){ elHead.scrollIntoView({behavior:'smooth',block:'start'}); },30); });\r\n  document.getElementById('acfmClear').addEventListener('click',function(){ filters={type:'',process:'',roast:'',profile:''};\r\n    document.getElementById('f-type').value=''; document.getElementById('f-process').value=''; document.getElementById('f-roast').value=''; document.getElementById('f-profile').value=''; document.getElementById('acfmSearch').value=''; refresh(); });\r\n  document.getElementById('acfmAll').addEventListener('click',function(){ activeFam=null; showAll=true; document.getElementById('acfmSearch').value=''; paintFamCards(); paintCircle(); refresh(); setTimeout(function(){ elHead.scrollIntoView({behavior:'smooth',block:'start'}); },30); });\r\n  document.getElementById('acfmReset').addEventListener('click',function(){ activeFam=null; showAll=false; filters={type:'',process:'',roast:'',profile:''};\r\n    document.getElementById('acfmSearch').value=''; document.getElementById('f-type').value=''; document.getElementById('f-process').value=''; document.getElementById('f-roast').value=''; document.getElementById('f-profile').value='';\r\n    paintFamCards(); paintCircle(); refresh(); window.scrollTo({top:0,behavior:'smooth'}); });\r\n  document.getElementById('acfmFilterHd').addEventListener('click',function(){ document.getElementById('acfmFilterBox').classList.toggle('open'); });\r\n\r\n  \/* daily *\/\r\n  (function(){ var now=new Date(),start=new Date(now.getFullYear(),0,0),day=Math.floor((now-start)\/86400000); var s=FLAT[day%FLAT.length];\r\n    document.getElementById('acfmDaily').innerHTML='<span class=\"tag\">Flavor of the day<\/span><span class=\"nm\">'+esc(s.ar)+(s.en?'<small>'+esc(s.en)+'<\/small>':'')+'<\/span><span class=\"ds\">'+esc(s.def)+' '+esc(s.tip)+'<\/span>'; })();\r\n\r\n  \/* quiz *\/\r\n  var score=0, asked=0;\r\n  function shuffle(a){ a=a.slice(); for(var i=a.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=a[i];a[i]=a[j];a[j]=t;} return a; }\r\n  function pick(a){ return a[Math.floor(Math.random()*a.length)]; }\r\n  function makeQ(){\r\n    var kind=pick(['type','family','defect','profile']), s=pick(FLAT), q,correct,opts;\r\n    if(kind==='type'){ q='How is \u201c'+s.ar+'\u201d classified?'; correct=TYPES[s.type].label; opts=shuffle(Object.keys(TYPES).map(function(k){return TYPES[k].label;})).slice(0,4); if(opts.indexOf(correct)<0){opts[0]=correct;opts=shuffle(opts);} }\r\n    else if(kind==='family'){ q='Which family does \u201c'+s.ar+'\u201d belong to?'; correct=s.fam; var fams=shuffle(DATA.map(function(f){return f.name;})).filter(function(n){return n!==correct;}).slice(0,3); fams.push(correct); opts=shuffle(fams); }\r\n    else if(kind==='profile'){ q='Where does \u201c'+s.ar+'\u201d most commonly appear in the profile?'; correct=PROF[s.profilePosition]; var ps=shuffle(Object.keys(PROF).map(function(k){return PROF[k];})).filter(function(n){return n!==correct;}).slice(0,3); ps.push(correct); opts=shuffle(ps); }\r\n    else { q='Which of the following is classified as a sensory defect?'; var d=pick(FLAT.filter(function(x){return x.type==='defect';})); correct=d.ar; opts=shuffle(FLAT.filter(function(x){return x.type==='positive';})).slice(0,3).map(function(x){return x.ar;}); opts.push(correct); opts=shuffle(opts); }\r\n    return {q:q,correct:correct,opts:opts};\r\n  }\r\n  function renderQuiz(){\r\n    var Q=makeQ();\r\n    elQuiz.innerHTML='<div class=\"qtop\"><span class=\"score\">Score: '+score+' \/ '+asked+'<\/span><button class=\"bbtn\" id=\"acfmQClose\" type=\"button\">Close training<\/button><\/div><div class=\"q\">'+esc(Q.q)+'<\/div><div class=\"opts\">'+Q.opts.map(function(o){return '<button class=\"opt\" type=\"button\">'+esc(o)+'<\/button>';}).join('')+'<\/div><div class=\"qfeed\" id=\"acfmFeed\"><\/div><div class=\"hidden\" id=\"acfmNextWrap\" style=\"margin-top:1.1rem\"><button class=\"bbtn accent\" id=\"acfmNext\" type=\"button\">New question<\/button><\/div>';\r\n    document.getElementById('acfmQClose').addEventListener('click',closeQuiz);\r\n    var feed=document.getElementById('acfmFeed'), answered=false;\r\n    elQuiz.querySelectorAll('.opt').forEach(function(btn){ btn.addEventListener('click',function(){ if(answered)return; answered=true; asked++;\r\n      if(btn.textContent===Q.correct){ score++; btn.classList.add('right'); feed.textContent='Correct answer.'; feed.className='qfeed ok'; }\r\n      else { btn.classList.add('wrong'); feed.textContent='Correct answer: '+Q.correct; feed.className='qfeed no'; elQuiz.querySelectorAll('.opt').forEach(function(b){if(b.textContent===Q.correct)b.classList.add('right');}); }\r\n      elQuiz.querySelectorAll('.opt').forEach(function(b){b.disabled=true;}); document.querySelector('.score').textContent='Score: '+score+' \/ '+asked; document.getElementById('acfmNextWrap').classList.remove('hidden'); }); });\r\n    document.getElementById('acfmNext').addEventListener('click',renderQuiz);\r\n  }\r\n  var qtgl=document.getElementById('acfmQuizToggle');\r\n  function closeQuiz(){ elQuiz.classList.add('hidden'); qtgl.textContent='Start training'; }\r\n  qtgl.addEventListener('click',function(){ if(elQuiz.classList.contains('hidden')){ elQuiz.classList.remove('hidden'); qtgl.textContent='Stop training'; renderQuiz(); } else { closeQuiz(); } });\r\n\r\n  \/* init *\/\r\n  buildCircle(); buildFamCards(); paintCircle();\r\n  setCircle(!isMobile());\r\n  if(!isMobile()) document.getElementById('acfmFilterBox').classList.add('open');\r\n  mq.addListener(function(){ updateBuilder(); });\r\n  renderBuilder(); refresh();\r\n})();\r\n<\/script>\r\n<\/div>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-1c3141f elementor-section-boxed elementor-section-height-default elementor-section-height-default rt-parallax-bg-no\" data-id=\"1c3141f\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f7e85c5\" data-id=\"f7e85c5\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-028c173 elementor-widget elementor-widget-spacer\" data-id=\"028c173\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-22eb8b1 elementor-widget elementor-widget-html\" data-id=\"22eb8b1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- =========================================================\r\n     COFDAR COFFEE FLAVOR MAP - ENGLISH CONTENT SECTION\r\n     Elementor HTML Widget\r\n========================================================= -->\r\n\r\n<section class=\"cofdar-flavor-content\" lang=\"en\" dir=\"ltr\">\r\n\r\n<style>\r\n.cofdar-flavor-content{\r\n  --navy:#2b406f;\r\n  --coffee:#b27244;\r\n  --coffee-deep:#8f5733;\r\n  --olive:#6f7752;\r\n  --cream:#f7f3ec;\r\n  --dark:#1f2933;\r\n  --muted:#6b6256;\r\n  --line:#e7dfcf;\r\n  --white:#ffffff;\r\n\r\n  width:100%;\r\n  color:var(--dark);\r\n  font-family:inherit;\r\n  text-align:left;\r\n  line-height:1.75;\r\n}\r\n\r\n.cofdar-flavor-content *{\r\n  box-sizing:border-box;\r\n}\r\n\r\n.cofdar-flavor-content .intro-box{\r\n  background:var(--cream);\r\n  border:1px solid var(--line);\r\n  border-top:4px solid var(--coffee);\r\n  padding:clamp(22px,4vw,34px);\r\n  border-radius:12px;\r\n}\r\n\r\n.cofdar-flavor-content .eyebrow{\r\n  display:block;\r\n  color:var(--coffee-deep);\r\n  font-size:.78rem;\r\n  font-weight:700;\r\n  letter-spacing:.06em;\r\n  text-transform:uppercase;\r\n  margin-bottom:.45rem;\r\n}\r\n\r\n.cofdar-flavor-content h2{\r\n  color:var(--navy);\r\n  font-size:clamp(1.65rem,4vw,2.35rem);\r\n  line-height:1.25;\r\n  margin:0 0 .55rem;\r\n  font-weight:800;\r\n  letter-spacing:-.02em;\r\n}\r\n\r\n.cofdar-flavor-content .subtitle{\r\n  color:var(--coffee-deep);\r\n  font-size:1.08rem;\r\n  font-weight:700;\r\n  margin:0 0 .75rem;\r\n}\r\n\r\n.cofdar-flavor-content .intro-box p{\r\n  color:var(--muted);\r\n  font-size:1rem;\r\n  margin:.45rem 0 0;\r\n  max-width:900px;\r\n}\r\n\r\n.cofdar-flavor-content .content-block{\r\n  padding:1.5rem 0;\r\n  border-bottom:1px solid var(--line);\r\n}\r\n\r\n.cofdar-flavor-content .content-block:last-child{\r\n  border-bottom:none;\r\n  padding-bottom:0;\r\n}\r\n\r\n.cofdar-flavor-content h3{\r\n  color:var(--navy);\r\n  font-size:clamp(1.18rem,3vw,1.42rem);\r\n  line-height:1.4;\r\n  font-weight:800;\r\n  margin:0 0 .55rem;\r\n}\r\n\r\n.cofdar-flavor-content .content-block p{\r\n  color:var(--dark);\r\n  font-size:.98rem;\r\n  margin:0;\r\n  max-width:960px;\r\n}\r\n\r\n.cofdar-flavor-content strong{\r\n  color:var(--navy);\r\n  font-weight:800;\r\n}\r\n\r\n.cofdar-flavor-content .family-list{\r\n  margin-top:.8rem;\r\n  padding:1rem 1.1rem;\r\n  background:var(--white);\r\n  border:1px solid var(--line);\r\n  border-left:4px solid var(--olive);\r\n  border-radius:10px;\r\n  color:var(--muted);\r\n  font-size:.93rem;\r\n}\r\n\r\n@media(max-width:600px){\r\n  .cofdar-flavor-content .intro-box{\r\n    padding:20px 16px;\r\n  }\r\n\r\n  .cofdar-flavor-content .content-block{\r\n    padding:1.25rem 0;\r\n  }\r\n\r\n  .cofdar-flavor-content h2{\r\n    font-size:1.65rem;\r\n  }\r\n\r\n  .cofdar-flavor-content h3{\r\n    font-size:1.16rem;\r\n  }\r\n}\r\n<\/style>\r\n\r\n\r\n<div class=\"intro-box\">\r\n\r\n  <span class=\"eyebrow\">Coffee Sensory Reference<\/span>\r\n\r\n  <h2>Cofdar Interactive Coffee Flavor Map<\/h2>\r\n\r\n  <div class=\"subtitle\">\r\n    A practical way to explore coffee tasting notes and build a clearer sensory vocabulary\r\n  <\/div>\r\n\r\n  <p>\r\n    The Cofdar Interactive Coffee Flavor Map helps you explore the aromas,\r\n    flavors and sensory characteristics found in coffee, from fruit, floral\r\n    and sweet notes to cocoa, nuts, spices, roast character and sensory defects.\r\n  <\/p>\r\n\r\n  <p>\r\n    Developed by Cofdar as a practical reference for roasters, baristas,\r\n    coffee teams and enthusiasts, the tool brings more than 100 descriptors\r\n    into 12 structured flavor families. Each descriptor includes a concise\r\n    definition, how it may appear in the cup, where it may commonly occur\r\n    and a practical tasting cue.\r\n  <\/p>\r\n\r\n<\/div>\r\n\r\n\r\n<div class=\"content-block\">\r\n\r\n  <h3>The Language of Coffee Tasting Notes<\/h3>\r\n\r\n  <p>\r\n    When a coffee is described with notes such as peach, dark chocolate or\r\n    jasmine, those words are not intended to mean that these ingredients\r\n    were added to the coffee. They are sensory references used to communicate\r\n    aromas, flavors and impressions that tasters perceive in the cup.\r\n    The Cofdar Coffee Flavor Map helps turn a broad impression such as\r\n    <strong>\u201cfruity\u201d<\/strong> into a more useful description such as\r\n    <strong>\u201cred berries with bright acidity\u201d<\/strong>, making coffee\r\n    descriptions clearer and easier to compare.\r\n  <\/p>\r\n\r\n<\/div>\r\n\r\n\r\n<div class=\"content-block\">\r\n\r\n  <h3>What Is a Coffee Flavor Map?<\/h3>\r\n\r\n  <p>\r\n    A coffee flavor map organizes sensory descriptors into related families\r\n    so that tasters can move from a broad impression to a more specific note.\r\n    A coffee may first appear fruity, floral, sweet or cocoa-like. From there,\r\n    the map helps narrow the description toward references such as blueberry,\r\n    jasmine, caramel, hazelnut or dark chocolate.\r\n    This structured approach makes sensory language easier to learn,\r\n    communicate and apply consistently.\r\n  <\/p>\r\n\r\n<\/div>\r\n\r\n\r\n<div class=\"content-block\">\r\n\r\n  <h3>The 12 Coffee Flavor Families<\/h3>\r\n\r\n  <p>\r\n    Cofdar organizes the map into twelve broad families. Each family contains\r\n    more specific descriptors that can be explored individually inside the\r\n    interactive tool.\r\n  <\/p>\r\n\r\n  <div class=\"family-list\">\r\n    <strong>The families are:<\/strong>\r\n    Red & Dark Fruits, Citrus & Yellow Fruits, Tropical & Dried Fruits,\r\n    Floral & Aromatic, Sweet & Sugary, Cocoa & Chocolate, Nuts & Grains,\r\n    Warm Spices, Herbs & Vegetal Notes, Fermentative & Processing Notes,\r\n    Roast & Body, and Sensory Defects.\r\n  <\/div>\r\n\r\n<\/div>\r\n\r\n\r\n<div class=\"content-block\">\r\n\r\n  <h3>How Processing and Roast Can Influence Coffee Flavor<\/h3>\r\n\r\n  <p>\r\n    Processing and roasting can influence how flavors are expressed, but\r\n    they should not be treated as fixed rules. Natural processing often\r\n    produces a more fruit-forward profile and may contribute greater body\r\n    or fermentative character. Washed coffees are often associated with\r\n    cleaner acidity and greater clarity in floral and citrus notes, while\r\n    honey processing may combine characteristics of both.\r\n    As roast development increases, caramelized, cocoa and roasted notes may\r\n    become more prominent while delicate origin characteristics can become\r\n    less pronounced. Origin, variety, processing, roasting and brewing all\r\n    interact to shape the final cup.\r\n  <\/p>\r\n\r\n<\/div>\r\n\r\n\r\n<div class=\"content-block\">\r\n\r\n  <h3>How Roasters Can Use the Coffee Flavor Map<\/h3>\r\n\r\n  <p>\r\n    For roasters, a shared sensory vocabulary can support product development,\r\n    internal tasting sessions, staff training and customer communication.\r\n    The map can help teams describe coffees more consistently when comparing\r\n    origins, processing methods or roast profiles. It can also support clearer\r\n    product descriptions for packaging and online stores.\r\n    The built-in description builder allows selected notes to be arranged\r\n    across the opening, middle and finish of the cup and turned into a\r\n    concise product description ready for further review.\r\n  <\/p>\r\n\r\n<\/div>\r\n\r\n\r\n<div class=\"content-block\">\r\n\r\n  <h3>How to Use the Interactive Coffee Flavor Map<\/h3>\r\n\r\n  <p>\r\n    Start by choosing one of the flavor families to reveal its descriptors.\r\n    You can also search directly or filter the map by classification,\r\n    processing, roast level and position in the flavor profile.\r\n    Open any descriptor to read its definition, how it may present in the cup,\r\n    where it may commonly appear and a tasting tip.\r\n    Add selected notes to the description builder, organize them into the\r\n    opening, middle and aftertaste, then generate a working product description.\r\n    You can also use Training Mode to test your familiarity with flavor\r\n    families and sensory terminology.\r\n  <\/p>\r\n\r\n<\/div>\r\n\r\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0e44a20 elementor-widget elementor-widget-spacer\" data-id=\"0e44a20\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cfa75af elementor-widget elementor-widget-html\" data-id=\"cfa75af\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- =========================================================\r\n     COFDAR COFFEE FLAVOR MAP - FAQ\r\n     Elementor HTML Widget\r\n========================================================= -->\r\n\r\n<section class=\"cofdar-flavor-faq\" lang=\"en\" dir=\"ltr\">\r\n\r\n<style>\r\n.cofdar-flavor-faq{\r\n  --navy:#2b406f;\r\n  --coffee:#b27244;\r\n  --coffee-deep:#8f5733;\r\n  --cream:#f7f3ec;\r\n  --dark:#1f2933;\r\n  --muted:#6b6256;\r\n  --line:#e7dfcf;\r\n  --white:#ffffff;\r\n\r\n  width:100%;\r\n  font-family:inherit;\r\n  color:var(--dark);\r\n  text-align:left;\r\n}\r\n\r\n.cofdar-flavor-faq *{\r\n  box-sizing:border-box;\r\n}\r\n\r\n.cofdar-flavor-faq .faq-head{\r\n  margin-bottom:1rem;\r\n}\r\n\r\n.cofdar-flavor-faq .faq-kicker{\r\n  color:var(--coffee-deep);\r\n  font-size:.76rem;\r\n  font-weight:700;\r\n  letter-spacing:.06em;\r\n  text-transform:uppercase;\r\n  margin-bottom:.3rem;\r\n}\r\n\r\n.cofdar-flavor-faq h2{\r\n  color:var(--navy);\r\n  font-size:clamp(1.45rem,4vw,1.9rem);\r\n  line-height:1.3;\r\n  font-weight:800;\r\n  margin:0 0 .35rem;\r\n}\r\n\r\n.cofdar-flavor-faq .faq-intro{\r\n  color:var(--muted);\r\n  font-size:.95rem;\r\n  margin:0;\r\n}\r\n\r\n.cofdar-flavor-faq .faq-list{\r\n  border-top:1px solid var(--line);\r\n}\r\n\r\n.cofdar-flavor-faq details{\r\n  border-bottom:1px solid var(--line);\r\n  background:var(--white);\r\n}\r\n\r\n.cofdar-flavor-faq summary{\r\n  position:relative;\r\n  list-style:none;\r\n  cursor:pointer;\r\n  color:var(--navy);\r\n  font-size:.98rem;\r\n  font-weight:800;\r\n  line-height:1.5;\r\n  padding:1rem 2.6rem 1rem .15rem;\r\n}\r\n\r\n.cofdar-flavor-faq summary::-webkit-details-marker{\r\n  display:none;\r\n}\r\n\r\n.cofdar-flavor-faq summary:after{\r\n  content:\"+\";\r\n  position:absolute;\r\n  right:.25rem;\r\n  top:50%;\r\n  transform:translateY(-50%);\r\n  width:28px;\r\n  height:28px;\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  color:var(--coffee);\r\n  background:var(--cream);\r\n  border:1px solid var(--line);\r\n  border-radius:50%;\r\n  font-size:1.15rem;\r\n  font-weight:500;\r\n}\r\n\r\n.cofdar-flavor-faq details[open] summary:after{\r\n  content:\"\u2212\";\r\n}\r\n\r\n.cofdar-flavor-faq details[open] summary{\r\n  color:var(--coffee-deep);\r\n}\r\n\r\n.cofdar-flavor-faq .answer{\r\n  color:var(--muted);\r\n  font-size:.93rem;\r\n  line-height:1.75;\r\n  padding:0 2.6rem 1rem .15rem;\r\n  max-width:920px;\r\n}\r\n\r\n.cofdar-flavor-faq .answer strong{\r\n  color:var(--navy);\r\n}\r\n\r\n@media(max-width:600px){\r\n  .cofdar-flavor-faq summary{\r\n    padding-right:2.3rem;\r\n  }\r\n\r\n  .cofdar-flavor-faq .answer{\r\n    padding-right:.15rem;\r\n  }\r\n}\r\n<\/style>\r\n\r\n\r\n<div class=\"faq-head\">\r\n\r\n  <div class=\"faq-kicker\">Coffee Flavor Map FAQ<\/div>\r\n\r\n  <h2>Frequently Asked Questions About Coffee Tasting Notes<\/h2>\r\n\r\n  <p class=\"faq-intro\">\r\n    Quick answers to common questions about flavor descriptors,\r\n    sensory evaluation and using the Cofdar Coffee Flavor Map.\r\n  <\/p>\r\n\r\n<\/div>\r\n\r\n\r\n<div class=\"faq-list\">\r\n\r\n  <details>\r\n    <summary>Do I need previous tasting experience to use the map?<\/summary>\r\n\r\n    <div class=\"answer\">\r\n      No. The map is designed to work from broad sensory families toward\r\n      more specific descriptors, so beginners can start with familiar\r\n      impressions while experienced tasters can use the additional detail,\r\n      filters and description tools.\r\n    <\/div>\r\n  <\/details>\r\n\r\n\r\n  <details>\r\n    <summary>Are the flavors listed in the map added to the coffee?<\/summary>\r\n\r\n    <div class=\"answer\">\r\n      No. Terms such as blueberry, jasmine, caramel or cocoa describe\r\n      sensory similarities perceived in the coffee. They do not mean that\r\n      these ingredients were added. Coffee aroma and flavor are influenced\r\n      by many factors including variety, growing conditions, processing,\r\n      roasting and brewing.\r\n    <\/div>\r\n  <\/details>\r\n\r\n\r\n  <details>\r\n    <summary>Are coffee tasting notes absolute?<\/summary>\r\n\r\n    <div class=\"answer\">\r\n      No. Sensory descriptions are references, not absolute measurements.\r\n      Different tasters may describe the same coffee differently, and the\r\n      perceived profile can change with water, brewing method, extraction,\r\n      temperature and other variables. The map is intended to make\r\n      descriptions more structured and comparable.\r\n    <\/div>\r\n  <\/details>\r\n\r\n\r\n  <details>\r\n    <summary>Can a flavor note identify the coffee's origin or processing method?<\/summary>\r\n\r\n    <div class=\"answer\">\r\n      Not by itself. Some sensory characteristics are more commonly\r\n      associated with particular origins or processing styles, but a single\r\n      flavor note cannot reliably determine origin, variety or processing.\r\n      The processing and roast filters in the tool should therefore be used\r\n      as practical guidance rather than diagnostic rules.\r\n    <\/div>\r\n  <\/details>\r\n\r\n\r\n  <details>\r\n    <summary>How does roast level affect coffee flavor?<\/summary>\r\n\r\n    <div class=\"answer\">\r\n      Roast development changes the balance of sensory characteristics.\r\n      Lighter roasting can preserve more delicate origin, floral and fruit\r\n      characteristics, while deeper roasting generally increases roasted,\r\n      caramelized, cocoa and bitter impressions. The result still depends\r\n      heavily on the coffee itself and the way it is brewed.\r\n    <\/div>\r\n  <\/details>\r\n\r\n\r\n  <details>\r\n    <summary>Is the Cofdar Coffee Flavor Map designed only for roasters?<\/summary>\r\n\r\n    <div class=\"answer\">\r\n      No. It is useful for roasters, baristas, green coffee professionals,\r\n      sales teams and coffee enthusiasts. Roasters may use it for product\r\n      descriptions and internal tasting, while other users can use it to\r\n      develop vocabulary and better understand what they perceive in the cup.\r\n    <\/div>\r\n  <\/details>\r\n\r\n\r\n  <details>\r\n    <summary>What is the Product Description Builder for?<\/summary>\r\n\r\n    <div class=\"answer\">\r\n      The builder lets you select descriptors from the map and arrange them\r\n      into the opening, middle and aftertaste of the cup. It then generates\r\n      a concise working description that can help a roaster prepare product\r\n      copy for a coffee bag, catalog or online product page.\r\n      The final description should always reflect an actual tasting of the coffee.\r\n    <\/div>\r\n  <\/details>\r\n\r\n\r\n  <details>\r\n    <summary>Does this tool replace professional cupping or sensory evaluation?<\/summary>\r\n\r\n    <div class=\"answer\">\r\n      No. The Cofdar Coffee Flavor Map is an educational and practical\r\n      sensory reference. It can support learning, communication and internal\r\n      tasting work, but it does not replace a calibrated sensory panel,\r\n      formal cupping protocol, laboratory analysis or professional quality assessment.\r\n    <\/div>\r\n  <\/details>\r\n\r\n<\/div>\r\n\r\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8b305c4 elementor-widget elementor-widget-spacer\" data-id=\"8b305c4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>A tasting and development tool for roasters and the coffee community Cofdar Interactive Coffee Flavor Map Coffee Sensory &#038; Tasting Tool More than 100 flavors across 12 families. Choose a family to explore its flavors, or filter by classification, processing, roast level, and position in the sensory profile. For roasters, build a professional description ready &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_rtcl_gb_attr":"","footnotes":""},"class_list":["post-12894","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cofdar.com\/en\/wp-json\/wp\/v2\/pages\/12894","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cofdar.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cofdar.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cofdar.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cofdar.com\/en\/wp-json\/wp\/v2\/comments?post=12894"}],"version-history":[{"count":3,"href":"https:\/\/cofdar.com\/en\/wp-json\/wp\/v2\/pages\/12894\/revisions"}],"predecessor-version":[{"id":12902,"href":"https:\/\/cofdar.com\/en\/wp-json\/wp\/v2\/pages\/12894\/revisions\/12902"}],"wp:attachment":[{"href":"https:\/\/cofdar.com\/en\/wp-json\/wp\/v2\/media?parent=12894"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}