` ).join('\n'); const mfPlaceholders = regions.map(region => { const mf = microFrontends.find(m => m.name === region.assignedMf); if (mf) { return `
<${mf.name.toLowerCase().replace(/[^a-z0-9-]/g, '')}-component>
`; } return `
`; }).join('\n'); let communicationLogic = ''; if (communicationPattern === 'customEvents') { communicationLogic = ` // --- Micro-Frontend Communication (Custom Events) --- function sendEvent(mfName, eventName, detail) { const event = new CustomEvent(\`mf-\${mfName}-\${eventName}\`, { bubbles: true, detail }); window.dispatchEvent(event); console.log(\`[Orchestrator] Sent event: \${eventName} to \${mfName} with detail:\`, detail); } // Example of how micro-frontends might listen: // window.addEventListener('mf-HeaderComponent-userLogin', (e) => { // console.log('Received login event from Header:', e.detail); // // Update other components based on login status // }); // Example of how micro-frontends might dispatch: // const loginEvent = new CustomEvent('mf-orchestrator-userLogin', { detail: { userId: '123', token: 'abc' } }); // window.dispatchEvent(loginEvent); `; } else if (communicationPattern === 'sharedState') { communicationLogic = ` // --- Micro-Frontend Communication (Shared State / Global Object) --- window.mfSharedState = window.mfSharedState || { user: null, cart: [], // ... add other shared data here }; // Use a proxy for reactive updates (optional, but good practice) window.mfStateProxy = new Proxy(window.mfSharedState, { set(target, property, value) { const oldValue = target[property]; target[property] = value; // Dispatch a custom event whenever state changes const event = new CustomEvent('mf-shared-state-change', { detail: { property, value, oldValue } }); window.dispatchEvent(event); console.log(\`[Orchestrator] Shared state '\${property}' changed to:\`, value); return true; } }); // Example of how micro-frontends can use/listen: // Access state: console.log(window.mfStateProxy.user); // Update state: window.mfStateProxy.user = { id: 'new-user' }; // Listen for changes: // window.addEventListener('mf-shared-state-change', (e) => { // console.log('Shared state changed:', e.detail.property, e.detail.value); // }); `; } else { // Premium communication patterns communicationLogic = ` // --- Communication Pattern: ${communicationPattern} (Premium Feature) --- // This communication pattern requires advanced setup or specific framework integrations. // For a free version, 'Custom Events' or 'Shared State' are available. // Upgrade to unlock full communication patterns like Event Bus or Shared Context! `; } let layoutStyles = ''; if (layoutType === 'simple') { layoutStyles = ` .mf-container { display: flex; flex-direction: column; /* Stacks regions vertically by default */ gap: 20px; padding: 20px; } .mf-region { border: 1px dashed #4a4a6e; padding: 15px; border-radius: 8px; min-height: 100px; display: flex; align-items: center; justify-content: center; font-style: italic; color: #888; } /* Example for specific region styling */ /* #mf-region-header { background-color: #e0e0e0; } */ /* #mf-region-main { background-color: #f5f5f5; } */ `; } else { // Premium layout types layoutStyles = ` /* --- Layout Type: ${layoutType} (Premium Feature) --- */ /* Advanced layout (Grid/Flexbox) for complex compositions. */ /* Upgrade to unlock advanced layout configurations! */ .mf-container { display: grid; grid-template-areas: "header header" "sidebar main"; grid-template-columns: 200px 1fr; grid-template-rows: auto 1fr; gap: 20px; padding: 20px; min-height: calc(100vh - 40px); /* Adjust as needed */ } #mf-region-header { grid-area: header; } #mf-region-sidebar { grid-area: sidebar; } #mf-region-main { grid-area: main; } .mf-region { border: 1px dashed #4a4a6e; padding: 15px; border-radius: 8px; min-height: 100px; display: flex; align-items: center; justify-content: center; font-style: italic; color: #888; } `; } return ` ${projectName} Micro-Frontend Application

${projectName}

Orchestrated Micro-Frontend Application

${mfPlaceholders}
${mfScripts} `; } // Copy Code to Clipboard copyCodeBtn.addEventListener('click', async () => { try { await navigator.clipboard.writeText(generatedCodeDisplay.textContent); alert(translations[currentLang].copySuccess); } catch (err) { console.error('Failed to copy text: ', err); alert(translations[currentLang].copyError); } }); // WhatsApp Integration sendViaWhatsAppBtn.addEventListener('click', () => { const projectName = document.getElementById('projectName').value || "Unnamed Project"; const basePath = document.getElementById('basePath').value || "N/A"; const microFrontends = Array.from(microFrontendComponentsDiv.querySelectorAll('.component-item')).map(div => ({ name: div.querySelector('.mf-name').value, entryPoint: div.querySelector('.mf-entry-point').value, description: div.querySelector('.mf-description').value })); const regions = Array.from(regionsContainer.querySelectorAll('.component-item')).map(div => { const regionName = div.querySelector('.region-name').value; const assignedMfValue = div.querySelector('.region-mf-assign').value; const assignedMfName = assignedMfValue ? assignedMfValue.split('|')[0] : 'None'; return { name: regionName, assignedMf: assignedMfName }; }); const layoutType = document.getElementById('layoutType').value; const communicationPattern = document.getElementById('communicationPattern').value; let mfDetails = microFrontends.map(mf => `- ${mf.name} (Entry: ${mf.entryPoint}, Desc: ${mf.description})` ).join('\n'); let regionDetails = regions.map(region => `- ${region.name}: ${region.assignedMf || 'Not assigned'}` ).join('\n'); const whatsappMessage = `*${translations[currentLang].whatsappMessageSubject}* ${translations[currentLang].whatsappMessageDetail} *Project Name:* ${projectName} *Base Path:* ${basePath} *Micro-Frontends:* ${mfDetails || '- None defined'} *Regions & Assignments:* ${regionDetails || '- None defined'} *Layout Type:* ${layoutType} *Communication Pattern:* ${communicationPattern} I am interested in the generated code and exploring advanced features or enterprise support for this setup.`; const encodedMessage = encodeURIComponent(whatsappMessage); window.open(`https://wa.me/420607450436?text=${encodedMessage}`, '_blank'); }); // Initial setup calls document.addEventListener('DOMContentLoaded', () => { addMicroFrontendComponent('Header', 'https://example.com/mf-header.js', 'Global application header'); addMicroFrontendComponent('Dashboard', 'https://example.com/mf-dashboard.js', 'User dashboard content'); addRegion('header', 'Header|https://example.com/mf-header.js'); addRegion('main', 'Dashboard|https://example.com/mf-dashboard.js'); checkFreeVersionLimits(); });