/* global React, Icon, BrandIcon, D365Mock, BrowserShot, Photo, STOCK, SHOTS */ const HomePage = ({ go }) => { return (
{/* Hero */}
A Microsoft Power Platform partner

The full Power Platform team you don't have to hire.

Dynamics 365, Power Apps, AI Builder, Power Automate, Copilot Studio, code apps, PCF — we design, build, and ship across the entire Microsoft business stack. Plus a growing line of our own productivity products.

{ e.preventDefault(); go('contact'); }}>Talk to us What we do
} />
{/* Logos — auto-scrolling marquee */}
Building on the Microsoft stack since day one
{[ 'Dynamics 365', 'Power Apps', 'Power Automate', 'AI Builder', 'Copilot Studio', 'Azure OpenAI', 'Dataverse', 'Power BI', 'Power Pages', 'SharePoint', 'Microsoft Teams', // duplicate for seamless loop 'Dynamics 365', 'Power Apps', 'Power Automate', 'AI Builder', 'Copilot Studio', 'Azure OpenAI', 'Dataverse', 'Power BI', 'Power Pages', 'SharePoint', 'Microsoft Teams', ].map((name, i) => ( {name} ))}
{/* Services — what we do */}
What we do

End-to-end services across the Microsoft business stack.

Whether you need a single PCF control, a custom model-driven app, or a full Copilot rollout — we have shipped it. The list below is a starting point, not a ceiling.

{/* Products */}
Our products

Productivity controls we sell to the world.

Ready-to-install solutions packaged from problems we solved for our own customers. New ones ship every quarter.

And more on the way — every quarter.
{/* Why */}
Why teams pick Dynawins

Microsoft-native by default. Practical by habit.

{/* Testimonials */}
What teams say

D365 admins, sales heads, and Microsoft Partners — already shipping with Dynawins.

{/* CTA */}

Tell us what is broken in your D365 environment.

One call, no sales theatre. We will tell you whether we can help — and if not, who can.

{ e.preventDefault(); go('contact'); }}>Book a call { e.preventDefault(); go('pricing'); }} style={{ color: '#FFF', borderColor: '#525252' }}>See product pricing
); }; const ServiceCard = ({ brand, iconName, title, body }) => (
{brand ? : }

{title}

{body}

); const PRODUCT_ROUTES = { 'Smart Panel AI': 'product', 'Kanban Board': 'kanban', 'Gantt Chart': 'gantt', 'Video Playlist': 'video' }; const ProductCard = ({ accent, iconName, name, desc, status, version, badge, go }) => ( { e.preventDefault(); go(PRODUCT_ROUTES[name] || 'product'); }} style={{ display: 'flex', flexDirection: 'column', gap: 16, color: 'inherit' }}>
{name}
{badge && {badge}}
{version} ● {status}

{desc}

Learn more
); const FeatureBlock = ({ iconName, title, body }) => (

{title}

{body}

); // Per-name stable color (consistent avatar tint across reloads) const TESTIMONIAL_COLORS = [ { bg: '4F46E5', label: 'indigo' }, { bg: '0F6CBD', label: 'blue' }, { bg: '15803D', label: 'green' }, { bg: 'A16207', label: 'amber' }, { bg: '742774', label: 'purple' }, ]; const TESTIMONIAL_GRADIENTS = [ 'linear-gradient(135deg, #4F46E5, #EC4899)', 'linear-gradient(135deg, #0F6CBD, #26C6DA)', 'linear-gradient(135deg, #15803D, #84CC16)', 'linear-gradient(135deg, #A16207, #F59E0B)', 'linear-gradient(135deg, #742774, #A33EA1)', ]; const pickIdx = (name) => (name || '').split('').reduce((a, c) => a + c.charCodeAt(0), 0) % TESTIMONIAL_COLORS.length; const Testimonial = ({ quote, name, role }) => { const idx = pickIdx(name); const initials = (name || '') .split(' ') .map((s) => s[0]) .filter(Boolean) .slice(0, 2) .join('') .toUpperCase(); // ui-avatars.com is a free, hotlink-friendly avatar service. Returns a PNG of // the initials on a colored background. If the request is blocked (offline, // firewall, ad-blocker), our onError swap inserts a CSS-only gradient circle // so the avatar always renders something — and the name never appears twice. const avatarUrl = 'https://ui-avatars.com/api/?' + 'name=' + encodeURIComponent(name) + '&size=128' + '&background=' + TESTIMONIAL_COLORS[idx].bg + '&color=fff&bold=true&format=png'; const fallbackBg = TESTIMONIAL_GRADIENTS[idx]; return (
★★★★★
“{quote}”
{ // Replace the broken with a styled
showing initials. const div = document.createElement('div'); div.className = 'testimonial-avatar'; div.setAttribute('aria-hidden', 'true'); div.style.cssText = 'background:' + fallbackBg + ';color:#FFF;display:flex;' + 'align-items:center;justify-content:center;font-weight:700;' + 'font-size:15px;font-family:var(--font-display);' + 'letter-spacing:0.02em;'; div.textContent = initials; e.currentTarget.replaceWith(div); }} />
{name}
{role}
); }; window.HomePage = HomePage;