Release v1.18.0
Replaces the per-switch feed profiles (v1.17.0) with a central, user-
maintained feed list.
- New global native.feeds: {id, name, vendor, size, protein, fat, fibre,
ash, url}. New "Feed list" admin tab (FeedsTab.jsx) to maintain it; the
offer/purchase link is an optional, collapsible field. - Per switch: activeFeed is now a feed id (string, was a numeric profile
index). SwitchTab gets a "Currently loaded feed" dropdown reading the
central list; the feed-profiles editor is removed. Dispense rate stays
per switch (dispenseGramsPerSec, calibration helper unchanged). - main.js: feedList()/feedById()/activeFeedOf(); dispenseRateFor() now
returns the per-switch rate; recomputeFeedAmount writes the new
status.activeFeed* states; info.feeds mirrored as JSON in
createGlobalObjects; SWITCH_SETTINGS.activeFeed is a string (settings
state type migrated via extendObject); NUMERIC_BOUNDS.activeFeed removed. - One-time migrateFeedList(): merges existing feedProfiles into native.feeds
(dedup by name), backfills dispenseGramsPerSec from the active profile,
maps activeFeed index -> id, drops feedProfiles. Guard feedListMigrated. - New states: info.feeds and per switch status.activeFeedName / Vendor /
Size / Protein / Fat / Fibre / Ash / Url. Widget reads these later
(widget repo issue #33). Closes #25, #26. - Docs updated in all 11 languages + German PDF handbook; admin i18n +21/-3
keys x11. Gates green (lint, tsc, admin build, 72 js, 57 package,
integration incl. migration).
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com