';
+
+ if (dbArtists.length) {
+ h += '
';
+ h += dbArtists.map(a => `
${a.image_url ? `

` : '🎤'}
${_escToast(a.name)}
Library
`).join('');
+ h += '
';
+ }
+
+ if (artists.length) {
+ h += `
`;
+ h += artists.map(a => `
${a.image_url ? `

` : '🎤'}
`).join('');
+ h += '
';
+ }
+
+ const activeSrc = _gsState.activeSource || 'spotify';
+
+ if (albums.length) {
+ h += `
`;
+ h += albums.map(a => {
+ const ar = a.artist || (a.artists ? a.artists.join(', ') : '');
+ const yr = a.release_date ? a.release_date.substring(0, 4) : '';
+ const img = (a.image_url || '').replace(/'/g, "\\'");
+ return `
${a.image_url ? `

` : '💿'}
${_escToast(a.name)}
${_escToast(ar)}${yr ? ` · ${yr}` : ''}
`;
+ }).join('');
+ h += '
';
+ }
+
+ if (singles.length) {
+ h += `
`;
+ h += singles.map(a => {
+ const ar = a.artist || (a.artists ? a.artists.join(', ') : '');
+ const img = (a.image_url || '').replace(/'/g, "\\'");
+ return `
${a.image_url ? `

` : '🎶'}
${_escToast(a.name)}
${_escToast(ar)}
`;
+ }).join('');
+ h += '
';
+ }
+
+ if (tracks.length) {
+ h += `
`;
+ h += tracks.map(t => {
+ const ar = t.artist || (t.artists ? t.artists.join(', ') : '');
+ const dur = t.duration_ms ? `${Math.floor(t.duration_ms / 60000)}:${String(Math.floor((t.duration_ms % 60000) / 1000)).padStart(2, '0')}` : '';
+ return `
${t.image_url ? `

` : '🎵'}
${_escToast(t.name)}
${_escToast(ar)}${t.album ? ` · ${_escToast(t.album)}` : ''}
${dur}
`;
+ }).join('');
+ h += '
';
+ }
+
+ h += '
';
+ results.innerHTML = h;
+ results.classList.add('visible');
+ _gsRenderTabs();
+}
+
+function _gsRenderTabs() {
+ const el = document.getElementById('gsearch-tabs');
+ if (!el) return;
+ const sources = Object.keys(_gsState.sources);
+ if (sources.length < 2) { el.style.display = 'none'; return; }
+ const labels = { spotify: 'Spotify', itunes: 'Apple Music', deezer: 'Deezer', hydrabase: 'Hydrabase' };
+ el.style.display = 'flex';
+ el.innerHTML = sources.map(s => {
+ const d = _gsState.sources[s];
+ const c = (d.artists?.length || 0) + (d.albums?.length || 0) + (d.tracks?.length || 0);
+ return `