_loadSpecs() now calls loadCurve(model) instead of returning a hardcoded
literal. Default model 'gva-elastox-r' keeps the legacy GVA numbers; the
editor cascade (supplier → type → model → unit) lets users pick Jäger,
Aerostrip, or PIK/PRK once those curve files land in generalFunctions.
Editor changes:
- diffuser.js serves /diffuser/menu.js + /diffuser/configData.js
- diffuser.html loads the shared MenuManager scripts, includes
asset-fields-placeholder + logger-fields-placeholder, and runs the
shared init/save lifecycle.
- Density field re-labelled "Bottom coverage [%]" — semantics were
always meant to be % surface-area coverage; "elements per m²" was a
prior mis-conversion. Default flipped 2.4 → 15 (typical fine-bubble).
- New defaults: model, unit, assetTagNumber.
specificClass:
- buildDomainConfig now forwards uiConfig.model/unit/assetTagNumber
under config.asset.* so _loadSpecs can resolve it.
- _loadSpecs walks config.asset.model || config.model || DEFAULT, falls
through to GVA on a missing curve file (with a clear error if neither
resolves to a usable otr_curve + p_curve).
All 8 unit + structure tests pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>