David flagged 2026-06-10: '14 stations wraps 3 lines, original idea
was 2 lines tidy, but now thought of user selecting themselves' +
'maybe have a description of each station' + 'be great to keep the
code clean.'
Architecture: pure data, not code. Adds tuner.quickStations as a
new chrome.storage.local key. Default 8 (tidy 2-row layout per the
v0.4.0 picks). User can pick any subset of the 46 SomaFM channels
via a new Options page card.
NEW FILE
src/lib/quick-stations.js — DEFAULT_QUICK_IDS + storage helpers
(getQuickStations, setQuickStations, resetQuickStations) with the
same defensive 'fall back if chrome.storage missing' pattern as
history.js + theme.js.
CHANGED
src/newtab/newtab.js — removed hardcoded QUICK_IDS array, replaced
with module-level 'let quickIds = []' populated during init from
getQuickStations() + re-loaded when chrome.storage.onChanged fires
on tuner.quickStations. renderQuick() now uses module-level
quickIds and shows 'No Quick Stations picked — set some in
Settings' empty state if the array is empty.
src/options/options.html — new 'Quick Stations' card between
Appearance and Playback. Contains: helper text + selected-count
badge + scrollable <ul> + Reset-to-defaults button.
src/options/options.css — ~90 lines for the new picker: scrollable
list (max-height 360px), checkbox-name-description row layout,
accent-coloured count badge, subtle hover background, brand-styled
scrollbar.
src/options/options.js — initQuickStationsUI() reads cached
channel list from tuner.stationsCache, sorts alphabetically, builds
one row per channel with checkbox + name + genre pill + description.
Toggle handler writes the current pick set to chrome.storage.local.
Reset button confirms then calls resetQuickStations() + re-checks
boxes to match defaults. Cross-surface sync via storage.onChanged
re-syncs check state if changes happen elsewhere.
5 files (1 new), ~250 lines added. No new permissions, no new
dependencies.