87eac171bf
- PHP (all 3 recipe endpoints): conf products with weight/volume package_unit (e.g., 300g/conf) now keep qty_number in sub-units (grams/ml) instead of converting to fractional conf. Post-normalisation block converts any AI- returned fractional conf values to grams automatically. - JS submitRecipeUse: vacuum state now read from actual inventory item at the used location (_recipeUseContext.items), not from recipe ingredient data. - JS showRecipeMoveModal: now uses _prefMoveLocCache preference system — after 2 consistent choices the modal is skipped automatically. 'Stay' button records the choice. Added _recipeMoveCancelStay() helper. - JS confirmRecipeMove: records move choice via _recordMoveLocChoice(); accepts optional forcedVacuum param for preference-triggered auto-moves. Closes #108 (duplicate of #107 — data dir permissions)