';
for (const svc of data.services) {
const borderColor = svc.skip ? 'var(--bad-fg)' : 'var(--border)';
html += `
`;
html += `
${escapeHtml(svc.name)}`;
if (svc.skip) html += ` — skipped: ${escapeHtml(svc.reason)}`;
html += `
`;
if (!svc.skip) {
html += `
Image: ${escapeHtml(svc.image)}
`;
if (svc.ports?.length) html += `
Ports: ${svc.ports.map(p => `${p.host}:${p.container}`).join(', ')}
`;
if (svc.volumes?.length) html += `
Volumes: ${svc.volumes.length}
`;
if (Object.keys(svc.environment || {}).length) html += `
Env vars: ${Object.keys(svc.environment).length}
`;
if (svc.envFileWarning) html += `
⚠ ${escapeHtml(svc.envFileWarning)}
`;
if (svc.resources?.cpus || svc.resources?.memory) {
const parts = [];
if (svc.resources.cpus) parts.push(`CPU: ${svc.resources.cpus}`);
if (svc.resources.memory) parts.push(`Mem: ${svc.resources.memory}MB`);
html += `
Limits: ${parts.join(', ')}
`;
}
}
html += '