You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(ui): mouthfeel as a target dimension in the studios (#245)
Mouthfeel shipped as a modality in #243 but wasn't selectable anywhere. _precompute_design now
tags the design pool with the mouthfeel heads (batched, like aroma and taste), /api/studio_terms
returns a third `mouthfeel` list, and both pickers gained a Mouthfeel group — the Studio chip rail
and the Formulation Studio target profile — styled with a dotted amber edge.
Two bugs caught by verifying against the live box rather than assuming:
1. tingling matched 0 molecules and astringent 1, because the design pool is built from the HSDB
*odor* corpus which barely contains trigeminal agents (0 of 11 tingling, 1 of 11 astringent).
Curated mouthfeel agents now fold into the pool via a dedicated _MOUTHFEEL_CARRIERS loader.
2. `pungent` under Mouthfeel returned acetic acid, acetone and ammonia — sharp-SMELLING molecules
— because the aroma head and the sensation head shared a bare tag and aroma had far more
corpus molecules. Mouthfeel tags are now namespaced (mouthfeel:pungent), matching how the
profile index keys aroma:cooling vs mouthfeel:cooling.
Verified after deploy: mouthfeel:pungent -> allyl isothiocyanate, diallyl disulfide, capsaicin;
note:pungent -> acetic acid, acetaldehyde, acetone, ammonia. All five sensations return real
agents. Part of #240, which stays open for the broader chip-picker usability pass.
<divclass="form-target-head">Target profile <spanclass="mapsub" style="text-transform:none;font-weight:600">— optional; pick the <b>flavors</b> and <b>notes</b> you're aiming for. <b>Analyze</b> (above) scores your rows against it; <b>Design</b> (below) proposes a recipe for it.</span></div>
<divclass="form-tgt-group"><spanclass="form-tgt-label" title="Chemesthesis — how it feels in the mouth, not how it smells"><svgclass="ic"><usehref="#ic-notes"/></svg> Mouthfeel</span><divid="formTargetMouth" class="form-chips"></div></div>
832
840
<buttonclass="mix-btn" id="formDesign" title="Propose a starting recipe for your target flavors + notes" style="margin-top:4px">✨ Design a recipe for this target</button>
833
841
</div>
834
842
<divid="formResults"></div>
@@ -1236,6 +1244,16 @@ <h4>Software & type</h4>
1236
1244
salty:'small mineral (alkali) salts — paired with a cation rule',
1237
1245
tasteless:'little or no basic taste expected from structure'
1238
1246
};
1247
+
// per-sensation "what this feels like" — the mouthfeel parallel to AROMA_HELP/TASTE_HELP.
1248
+
// Mouthfeel is trigeminal (chemesthesis), a different modality from smell — cooling and pungent
1249
+
// exist as BOTH an aroma head and a mouthfeel head, so these blurbs stress the *sensation*.
1250
+
constMOUTHFEEL_HELP={
1251
+
cooling:'cooling — TRPM8 coolants (menthol, WS-agents); a physiological cool, not just a cool smell',
// Mouthfeel — trained trigeminal sensations (a different modality from taste and aroma)
2317
+
if(mouth.length){
2318
+
html+=`<div class="studio-section"><div class="ss-head"><svg class="ic"><use href="#ic-notes"/></svg> Mouthfeel <span class="ss-sub">how it <b>feels</b> in the mouth — chemesthesis, not smell</span></div><div class="ss-body">`+
2319
+
`<div class="studio-group studio-group-notes">`+
2320
+
mouth.map(m=>{constlbl=m.replace(/^mouthfeel:/,'');// term stays namespaced, label reads plain
0 commit comments