botserver/docs/src/assets/feature-parity-flow.svg

262 lines
13 KiB
XML
Raw Normal View History

<svg width="1200" height="650" xmlns="http://www.w3.org/2000/svg">
<defs>
<!-- Modern Gradients -->
<linearGradient id="primaryGradient" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#6366F1;stop-opacity:1" />
<stop offset="100%" style="stop-color:#8B5CF6;stop-opacity:1" />
</linearGradient>
<linearGradient id="secondaryGradient" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#06B6D4;stop-opacity:1" />
<stop offset="100%" style="stop-color:#0EA5E9;stop-opacity:1" />
</linearGradient>
<linearGradient id="successGradient" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#10B981;stop-opacity:1" />
<stop offset="100%" style="stop-color:#34D399;stop-opacity:1" />
</linearGradient>
<linearGradient id="warningGradient" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#F59E0B;stop-opacity:1" />
<stop offset="100%" style="stop-color:#FBBF24;stop-opacity:1" />
</linearGradient>
<linearGradient id="flowLineGradient" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#6366F1;stop-opacity:0.3" />
<stop offset="50%" style="stop-color:#8B5CF6;stop-opacity:0.7" />
<stop offset="100%" style="stop-color:#A855F7;stop-opacity:0.3" />
</linearGradient>
<linearGradient id="bgGradient" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#F8FAFC;stop-opacity:1" />
<stop offset="100%" style="stop-color:#F1F5F9;stop-opacity:1" />
</linearGradient>
<!-- Filters -->
<filter id="cardShadow" x="-10%" y="-10%" width="120%" height="130%">
<feDropShadow dx="0" dy="4" stdDeviation="8" flood-color="#6366F1" flood-opacity="0.15"/>
</filter>
<filter id="glowEffect" x="-30%" y="-30%" width="160%" height="160%">
<feGaussianBlur stdDeviation="3" result="coloredBlur"/>
<feMerge>
<feMergeNode in="coloredBlur"/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
<!-- Arrow markers -->
<marker id="arrowPrimary" markerWidth="12" markerHeight="12" refX="10" refY="4" orient="auto" markerUnits="strokeWidth">
<path d="M0,0 L0,8 L12,4 z" fill="#8B5CF6"/>
</marker>
<marker id="arrowSuccess" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto" markerUnits="strokeWidth">
<path d="M0,0 L0,6 L10,3 z" fill="#10B981"/>
</marker>
<!-- Dot pattern -->
<pattern id="dots" patternUnits="userSpaceOnUse" width="20" height="20">
<circle cx="10" cy="10" r="1" fill="#6366F1" opacity="0.1"/>
</pattern>
</defs>
<style>
.title-text { fill: #1E1B4B; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
.main-text { fill: #334155; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
.secondary-text { fill: #64748B; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
.white-text { fill: #FFFFFF; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
.mono-text { fill: #475569; font-family: 'SF Mono', 'Fira Code', Consolas, monospace; }
.accent-text { fill: #6366F1; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
@media (prefers-color-scheme: dark) {
.title-text { fill: #F1F5F9; }
.main-text { fill: #E2E8F0; }
.secondary-text { fill: #94A3B8; }
.mono-text { fill: #CBD5E1; }
}
</style>
<!-- Background -->
<rect width="1200" height="650" fill="url(#bgGradient)"/>
<rect width="1200" height="650" fill="url(#dots)"/>
<!-- Title -->
<text x="600" y="45" text-anchor="middle" font-size="26" font-weight="700" class="title-text">Feature Parity Flow</text>
<text x="600" y="72" text-anchor="middle" font-size="14" class="secondary-text">From Enterprise Cloud Services to Self-Hosted Freedom</text>
<!-- Source Platform Box -->
<g transform="translate(50, 110)">
<rect x="0" y="0" width="300" height="400" rx="12" fill="#FFFFFF" stroke="#E2E8F0" stroke-width="2" filter="url(#cardShadow)"/>
<rect x="0" y="0" width="300" height="50" rx="12" fill="url(#secondaryGradient)"/>
<rect x="0" y="38" width="300" height="12" fill="url(#secondaryGradient)"/>
<text x="150" y="32" text-anchor="middle" font-size="16" font-weight="600" class="white-text">Enterprise Cloud</text>
<!-- Service items -->
<g transform="translate(20, 70)">
<rect x="0" y="0" width="260" height="40" rx="6" fill="#F1F5F9"/>
<circle cx="20" cy="20" r="12" fill="#0078D4"/>
<text x="45" y="17" font-size="12" font-weight="600" class="main-text">Exchange Online</text>
<text x="45" y="32" font-size="10" class="mono-text">Mail, Calendar, Contacts</text>
</g>
<g transform="translate(20, 120)">
<rect x="0" y="0" width="260" height="40" rx="6" fill="#F8FAFC"/>
<circle cx="20" cy="20" r="12" fill="#0078D4"/>
<text x="45" y="17" font-size="12" font-weight="600" class="main-text">OneDrive / SharePoint</text>
<text x="45" y="32" font-size="10" class="mono-text">Files, Versioning, Sharing</text>
</g>
<g transform="translate(20, 170)">
<rect x="0" y="0" width="260" height="40" rx="6" fill="#F1F5F9"/>
<circle cx="20" cy="20" r="12" fill="#0078D4"/>
<text x="45" y="17" font-size="12" font-weight="600" class="main-text">Teams</text>
<text x="45" y="32" font-size="10" class="mono-text">Chat, Video, Collaboration</text>
</g>
<g transform="translate(20, 220)">
<rect x="0" y="0" width="260" height="40" rx="6" fill="#F8FAFC"/>
<circle cx="20" cy="20" r="12" fill="#0078D4"/>
<text x="45" y="17" font-size="12" font-weight="600" class="main-text">Power Automate</text>
<text x="45" y="32" font-size="10" class="mono-text">Workflows, Triggers</text>
</g>
<g transform="translate(20, 270)">
<rect x="0" y="0" width="260" height="40" rx="6" fill="#F1F5F9"/>
<circle cx="20" cy="20" r="12" fill="#0078D4"/>
<text x="45" y="17" font-size="12" font-weight="600" class="main-text">Copilot</text>
<text x="45" y="32" font-size="10" class="mono-text">AI Assistant ($30/user)</text>
</g>
<g transform="translate(20, 320)">
<rect x="0" y="0" width="260" height="40" rx="6" fill="#F8FAFC"/>
<circle cx="20" cy="20" r="12" fill="#0078D4"/>
<text x="45" y="17" font-size="12" font-weight="600" class="main-text">Azure AD / Entra</text>
<text x="45" y="32" font-size="10" class="mono-text">Identity, Auth, SSO</text>
</g>
</g>
<!-- Migration Arrow Center -->
<g transform="translate(380, 250)">
<!-- Flow line -->
<path d="M0,60 Q220,60 440,60" stroke="url(#flowLineGradient)" stroke-width="4" fill="none" marker-end="url(#arrowPrimary)"/>
<!-- Migration badge -->
<rect x="170" y="20" width="100" height="80" rx="10" fill="url(#primaryGradient)" filter="url(#glowEffect)"/>
<text x="220" y="55" text-anchor="middle" font-size="11" font-weight="600" class="white-text">MIGRATE</text>
<text x="220" y="72" text-anchor="middle" font-size="10" class="white-text" opacity="0.8">100% Parity</text>
<!-- Checkmarks -->
<g transform="translate(190, 95)">
<circle cx="0" cy="0" r="10" fill="url(#successGradient)"/>
<path d="M-4,0 L-1,3 L5,-3" stroke="#FFF" stroke-width="2" fill="none"/>
</g>
<g transform="translate(220, 95)">
<circle cx="0" cy="0" r="10" fill="url(#successGradient)"/>
<path d="M-4,0 L-1,3 L5,-3" stroke="#FFF" stroke-width="2" fill="none"/>
</g>
<g transform="translate(250, 95)">
<circle cx="0" cy="0" r="10" fill="url(#successGradient)"/>
<path d="M-4,0 L-1,3 L5,-3" stroke="#FFF" stroke-width="2" fill="none"/>
</g>
</g>
<!-- Target Platform Box -->
<g transform="translate(850, 110)">
<rect x="0" y="0" width="300" height="400" rx="12" fill="#FFFFFF" stroke="#E2E8F0" stroke-width="2" filter="url(#cardShadow)"/>
<rect x="0" y="0" width="300" height="50" rx="12" fill="url(#primaryGradient)"/>
<rect x="0" y="38" width="300" height="12" fill="url(#primaryGradient)"/>
<text x="150" y="32" text-anchor="middle" font-size="16" font-weight="600" class="white-text">General Bots</text>
<!-- Service items -->
<g transform="translate(20, 70)">
<rect x="0" y="0" width="260" height="40" rx="6" fill="#EEF2FF"/>
<circle cx="20" cy="20" r="12" fill="url(#primaryGradient)"/>
<text x="45" y="17" font-size="12" font-weight="600" class="main-text">Stalwart Mail</text>
<text x="45" y="32" font-size="10" class="mono-text">IMAP/SMTP/JMAP + CalDAV</text>
</g>
<g transform="translate(20, 120)">
<rect x="0" y="0" width="260" height="40" rx="6" fill="#F5F3FF"/>
<circle cx="20" cy="20" r="12" fill="url(#primaryGradient)"/>
<text x="45" y="17" font-size="12" font-weight="600" class="main-text">SeaweedFS Drive</text>
<text x="45" y="32" font-size="10" class="mono-text">S3-compatible + Versioning</text>
</g>
<g transform="translate(20, 170)">
<rect x="0" y="0" width="260" height="40" rx="6" fill="#EEF2FF"/>
<circle cx="20" cy="20" r="12" fill="url(#primaryGradient)"/>
<text x="45" y="17" font-size="12" font-weight="600" class="main-text">LiveKit Meet</text>
<text x="45" y="32" font-size="10" class="mono-text">WebRTC + Multi-channel</text>
</g>
<g transform="translate(20, 220)">
<rect x="0" y="0" width="260" height="40" rx="6" fill="#F5F3FF"/>
<circle cx="20" cy="20" r="12" fill="url(#primaryGradient)"/>
<text x="45" y="17" font-size="12" font-weight="600" class="main-text">BASIC Scripts</text>
<text x="45" y="32" font-size="10" class="mono-text">90+ Keywords + Cron</text>
</g>
<g transform="translate(20, 270)">
<rect x="0" y="0" width="260" height="40" rx="6" fill="#EEF2FF"/>
<circle cx="20" cy="20" r="12" fill="url(#primaryGradient)"/>
<text x="45" y="17" font-size="12" font-weight="600" class="main-text">LLM Integration</text>
<text x="45" y="32" font-size="10" class="mono-text">Any Provider (Free)</text>
</g>
<g transform="translate(20, 320)">
<rect x="0" y="0" width="260" height="40" rx="6" fill="#F5F3FF"/>
<circle cx="20" cy="20" r="12" fill="url(#primaryGradient)"/>
<text x="45" y="17" font-size="12" font-weight="600" class="main-text">Zitadel IAM</text>
<text x="45" y="32" font-size="10" class="mono-text">OIDC/OAuth2 + MFA</text>
</g>
</g>
<!-- Benefits Bar -->
<g transform="translate(50, 540)">
<rect x="0" y="0" width="1100" height="80" rx="12" fill="#FFFFFF" stroke="#E2E8F0" stroke-width="1"/>
<!-- Benefit 1 -->
<g transform="translate(50, 15)">
<rect x="0" y="0" width="200" height="50" rx="8" fill="#ECFDF5"/>
<circle cx="25" cy="25" r="15" fill="url(#successGradient)"/>
<text x="22" y="30" text-anchor="middle" font-size="14" font-weight="700" class="white-text"></text>
<text x="55" y="22" font-size="12" font-weight="600" class="main-text">Self-Hosted</text>
<text x="55" y="38" font-size="10" class="secondary-text">Full Data Control</text>
</g>
<!-- Benefit 2 -->
<g transform="translate(280, 15)">
<rect x="0" y="0" width="200" height="50" rx="8" fill="#EEF2FF"/>
<circle cx="25" cy="25" r="15" fill="url(#primaryGradient)"/>
<text x="25" y="31" text-anchor="middle" font-size="14" font-weight="700" class="white-text">$0</text>
<text x="55" y="22" font-size="12" font-weight="600" class="main-text">No Per-User Fee</text>
<text x="55" y="38" font-size="10" class="secondary-text">Unlimited Users</text>
</g>
<!-- Benefit 3 -->
<g transform="translate(510, 15)">
<rect x="0" y="0" width="200" height="50" rx="8" fill="#FEF3C7"/>
<circle cx="25" cy="25" r="15" fill="url(#warningGradient)"/>
<text x="25" y="31" text-anchor="middle" font-size="12" font-weight="700" class="white-text">AI</text>
<text x="55" y="22" font-size="12" font-weight="600" class="main-text">Native LLM</text>
<text x="55" y="38" font-size="10" class="secondary-text">Built-in RAG + Tools</text>
</g>
<!-- Benefit 4 -->
<g transform="translate(740, 15)">
<rect x="0" y="0" width="200" height="50" rx="8" fill="#F0FDF4"/>
<circle cx="25" cy="25" r="15" fill="url(#successGradient)"/>
<text x="25" y="31" text-anchor="middle" font-size="10" font-weight="700" class="white-text">OSS</text>
<text x="55" y="22" font-size="12" font-weight="600" class="main-text">Open Source</text>
<text x="55" y="38" font-size="10" class="secondary-text">AGPL Licensed</text>
</g>
<!-- Benefit 5 -->
<g transform="translate(970, 15)">
<rect x="0" y="0" width="80" height="50" rx="8" fill="#EEF2FF"/>
<text x="40" y="30" text-anchor="middle" font-size="20" font-weight="700" class="accent-text">90+</text>
<text x="40" y="45" text-anchor="middle" font-size="9" class="secondary-text">Keywords</text>
</g>
</g>
</svg>