/** * Hello Dashboard — sample extension surface. * * Platform contract: * - Mounts into #extension-mount * - window.__MANIFEST__ — surface manifest (json, lowercase keys) * - window.__USER__ — authenticated user {username, display_name, role} * - UI.toast(msg, type) — platform toast (success/error/info/warning) * - API._get(path) — authenticated fetch (returns parsed JSON) */ (function() { 'use strict'; var mount = document.getElementById('extension-mount'); if (!mount) return; var manifest = window.__MANIFEST__ || {}; var user = window.__USER__ || {}; var isDark = document.documentElement.getAttribute('data-theme') === 'dark'; var name = user.display_name || user.username || 'World'; mount.innerHTML = '
' + '
' + '

Hello, ' + esc(name) + '!

' + '

Extension surface ' + esc(manifest.id || 'unknown') + ' loaded successfully.

' + '
' + '
' + card('Platform Access', (typeof UI !== 'undefined' ? '\u2713 Connected' : '\u2717 Unavailable'), 'API, Theme, UI primitives available', 'var(--accent)') + card('Theme', isDark ? '\uD83C\uDF19 Dark' : '\u2600\uFE0F Light', 'Reads from platform theme system', '') + card('Route', '' + esc(manifest.route || '/s/hello-dashboard') + '', 'Registered via surface manifest', '') + '
' + '
' + '' + '' + '
' + '
' + esc(JSON.stringify(manifest, null, 2)) + '
' + '
'; // Wire toast button document.getElementById('helloToast').addEventListener('click', function() { if (typeof UI !== 'undefined' && UI.toast) { UI.toast('Extension surface is working!', 'success'); } else { alert('Extension surface is working! (UI.toast not available)'); } }); // Wire API test button document.getElementById('helloApi').addEventListener('click', function() { if (typeof API === 'undefined' || !API._get) { toast('API module not available', 'error'); return; } API._get('/api/v1/surfaces').then(function(resp) { toast('API returned ' + (resp.surfaces || []).length + ' registered surfaces', 'info'); }).catch(function(e) { toast('API error: ' + e.message, 'error'); }); }); function toast(msg, type) { if (typeof UI !== 'undefined' && UI.toast) UI.toast(msg, type); else alert(msg); } function card(title, value, detail, color) { var style = color ? ' style="color:' + color + ';"' : ''; return '
' + '
' + esc(title) + '
' + '
' + value + '
' + '
' + esc(detail) + '
' + '
'; } function esc(s) { var el = document.createElement('span'); el.textContent = s; return el.innerHTML; } })();