Files
boc/landvex-og-image-v2.svg
T
Bernt 6989a98d75 feat: Passwordless cross-device authentication
- Arkitektur: docs/auth/passwordless-architecture.md
- Backend: iom/quixzoom-auth-service/ (FastAPI + Redis)
- Webb: quixzoom-market-pages/se/login/ (QR-kod + polling)
- App: iom/quixzoom-app/src/features/auth/ (push + deep links)

Flöde: QR-kod → app-godkännande → webb-inloggad
2026-07-07 07:11:50 +00:00

202 lines
11 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 630">
<defs>
<linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#0A1628"/>
<stop offset="50%" stop-color="#0D1F35"/>
<stop offset="100%" stop-color="#0A1628"/>
</linearGradient>
<linearGradient id="accent" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#00D4AA"/>
<stop offset="100%" stop-color="#00A884"/>
</linearGradient>
<filter id="glow" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur stdDeviation="3" result="blur"/>
<feMerge>
<feMergeNode in="blur"/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
<clipPath id="grid-clip">
<rect width="1200" height="630"/>
</clipPath>
</defs>
<!-- Background -->
<rect width="1200" height="630" fill="url(#bg)"/>
<!-- Subtle geometric pattern -->
<g opacity="0.04" stroke="#00D4AA" stroke-width="0.5">
<!-- Horizontal lines -->
<line x1="0" y1="105" x2="1200" y2="105"/>
<line x1="0" y1="210" x2="1200" y2="210"/>
<line x1="0" y1="315" x2="1200" y2="315"/>
<line x1="0" y1="420" x2="1200" y2="420"/>
<line x1="0" y1="525" x2="1200" y2="525"/>
<!-- Vertical lines -->
<line x1="150" y1="0" x2="150" y2="630"/>
<line x1="300" y1="0" x2="300" y2="630"/>
<line x1="450" y1="0" x2="450" y2="630"/>
<line x1="600" y1="0" x2="600" y2="630"/>
<line x1="750" y1="0" x2="750" y2="630"/>
<line x1="900" y1="0" x2="900" y2="630"/>
<line x1="1050" y1="0" x2="1050" y2="630"/>
</g>
<!-- Decorative corner brackets -->
<g stroke="#00D4AA" stroke-width="2" fill="none" opacity="0.3">
<!-- Top left -->
<path d="M 40 80 L 40 40 L 80 40"/>
<!-- Top right -->
<path d="M 1120 40 L 1160 40 L 1160 80"/>
<!-- Bottom left -->
<path d="M 40 550 L 40 590 L 80 590"/>
<!-- Bottom right -->
<path d="M 1120 590 L 1160 590 L 1160 550"/>
</g>
<!-- Left side: Logo and text -->
<g transform="translate(80, 180)">
<!-- Landvex X logo -->
<g transform="translate(0, 0)">
<!-- Corner brackets -->
<path d="M -5 35 L -5 -5 L 35 -5" stroke="#00D4AA" stroke-width="3" fill="none"/>
<path d="M 85 -5 L 125 -5 L 125 35" stroke="#00D4AA" stroke-width="3" fill="none"/>
<path d="M -5 85 L -5 125 L 35 125" stroke="#00D4AA" stroke-width="3" fill="none"/>
<path d="M 85 125 L 125 125 L 125 85" stroke="#00D4AA" stroke-width="3" fill="none"/>
<!-- X shape -->
<path d="M 20 20 L 100 100 M 100 20 L 20 100" stroke="#00D4AA" stroke-width="12" stroke-linecap="round" filter="url(#glow)"/>
</g>
<!-- Brand name -->
<text x="0" y="180" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="64" font-weight="800" fill="#FFFFFF" letter-spacing="4">LANDVEX</text>
<!-- Tagline -->
<text x="0" y="230" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="22" font-weight="400" fill="#8BA4BE">Decision Intelligence for the Physical World</text>
<!-- Accent line -->
<line x1="0" y1="260" x2="200" y2="260" stroke="url(#accent)" stroke-width="3"/>
<!-- Sub-tagline -->
<text x="0" y="300" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="16" font-weight="400" fill="#5A7A9A">Collect. Analyse. Decide.</text>
</g>
<!-- Right side: Visual elements representing field work -->
<g transform="translate(600, 80)">
<!-- Top row: City/infrastructure imagery -->
<g transform="translate(0, 0)">
<rect width="260" height="150" rx="8" fill="#0D2137" stroke="#1A3A5C" stroke-width="1"/>
<!-- Stylized city skyline -->
<g transform="translate(20, 40)">
<rect x="10" y="60" width="20" height="40" fill="#1A3A5C"/>
<rect x="35" y="40" width="25" height="60" fill="#1A3A5C"/>
<rect x="65" y="70" width="18" height="30" fill="#1A3A5C"/>
<rect x="88" y="30" width="22" height="70" fill="#1A3A5C"/>
<rect x="115" y="55" width="20" height="45" fill="#1A3A5C"/>
<rect x="140" y="35" width="25" height="65" fill="#1A3A5C"/>
<rect x="170" y="65" width="18" height="35" fill="#1A3A5C"/>
<rect x="192" y="45" width="20" height="55" fill="#1A3A5C"/>
<!-- Windows with glow -->
<rect x="40" y="50" width="6" height="6" fill="#00D4AA" opacity="0.6"/>
<rect x="40" y="62" width="6" height="6" fill="#00D4AA" opacity="0.4"/>
<rect x="95" y="40" width="6" height="6" fill="#00D4AA" opacity="0.7"/>
<rect x="95" y="52" width="6" height="6" fill="#00D4AA" opacity="0.5"/>
<rect x="145" y="45" width="6" height="6" fill="#00D4AA" opacity="0.6"/>
</g>
<text x="20" y="130" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="12" font-weight="600" fill="#00D4AA">INFRASTRUCTURE</text>
</g>
<!-- Top right: Field worker -->
<g transform="translate(280, 0)">
<rect width="240" height="150" rx="8" fill="#0D2137" stroke="#1A3A5C" stroke-width="1"/>
<!-- Stylized person with device -->
<g transform="translate(80, 30)">
<!-- Head -->
<circle cx="40" cy="20" r="15" fill="#1A3A5C"/>
<!-- Body -->
<path d="M 20 45 Q 40 35 60 45 L 65 90 L 15 90 Z" fill="#1A3A5C"/>
<!-- Device -->
<rect x="55" y="50" width="25" height="35" rx="3" fill="#0A1628" stroke="#00D4AA" stroke-width="1.5"/>
<rect x="60" y="55" width="15" height="20" fill="#00D4AA" opacity="0.3"/>
<!-- Safety vest accent -->
<path d="M 25 50 L 55 50 L 50 80 L 30 80 Z" fill="#00D4AA" opacity="0.2"/>
</g>
<text x="20" y="130" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="12" font-weight="600" fill="#00D4AA">FIELD OPERATIONS</text>
</g>
<!-- Bottom left: Data/Analytics -->
<g transform="translate(0, 170)">
<rect width="260" height="150" rx="8" fill="#0D2137" stroke="#1A3A5C" stroke-width="1"/>
<!-- Stylized dashboard -->
<g transform="translate(20, 25)">
<!-- Chart bars -->
<rect x="10" y="50" width="15" height="40" fill="#00D4AA" opacity="0.7"/>
<rect x="30" y="35" width="15" height="55" fill="#00D4AA" opacity="0.5"/>
<rect x="50" y="20" width="15" height="70" fill="#00D4AA" opacity="0.8"/>
<rect x="70" y="45" width="15" height="45" fill="#00D4AA" opacity="0.6"/>
<rect x="90" y="30" width="15" height="60" fill="#00D4AA" opacity="0.4"/>
<rect x="110" y="55" width="15" height="35" fill="#00D4AA" opacity="0.7"/>
<rect x="130" y="25" width="15" height="65" fill="#00D4AA" opacity="0.5"/>
<rect x="150" y="40" width="15" height="50" fill="#00D4AA" opacity="0.6"/>
<rect x="170" y="15" width="15" height="75" fill="#00D4AA" opacity="0.8"/>
<rect x="190" y="50" width="15" height="40" fill="#00D4AA" opacity="0.4"/>
<!-- Line overlay -->
<polyline points="17,70 47,55 77,35 107,60 137,45 167,30 197,65" fill="none" stroke="#FFFFFF" stroke-width="2" opacity="0.8"/>
<!-- Data points -->
<circle cx="17" cy="70" r="3" fill="#FFFFFF"/>
<circle cx="47" cy="55" r="3" fill="#FFFFFF"/>
<circle cx="77" cy="35" r="3" fill="#FFFFFF"/>
<circle cx="107" cy="60" r="3" fill="#FFFFFF"/>
<circle cx="137" cy="45" r="3" fill="#FFFFFF"/>
<circle cx="167" cy="30" r="3" fill="#FFFFFF"/>
<circle cx="197" cy="65" r="3" fill="#FFFFFF"/>
</g>
<text x="20" y="130" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="12" font-weight="600" fill="#00D4AA">ANALYTICS</text>
</g>
<!-- Bottom right: Drone/tech -->
<g transform="translate(280, 170)">
<rect width="240" height="150" rx="8" fill="#0D2137" stroke="#1A3A5C" stroke-width="1"/>
<!-- Stylized drone -->
<g transform="translate(80, 35)">
<!-- Drone body -->
<ellipse cx="40" cy="40" rx="25" ry="12" fill="#1A3A5C" stroke="#00D4AA" stroke-width="1.5"/>
<!-- Camera -->
<circle cx="40" cy="48" r="8" fill="#0A1628" stroke="#00D4AA" stroke-width="1"/>
<circle cx="40" cy="48" r="4" fill="#00D4AA" opacity="0.5"/>
<!-- Arms -->
<line x1="20" y1="38" x2="5" y2="25" stroke="#1A3A5C" stroke-width="3"/>
<line x1="60" y1="38" x2="75" y2="25" stroke="#1A3A5C" stroke-width="3"/>
<line x1="20" y1="42" x2="5" y2="55" stroke="#1A3A5C" stroke-width="3"/>
<line x1="60" y1="42" x2="75" y2="55" stroke="#1A3A5C" stroke-width="3"/>
<!-- Propellers -->
<ellipse cx="5" cy="25" rx="10" ry="3" fill="#00D4AA" opacity="0.6"/>
<ellipse cx="75" cy="25" rx="10" ry="3" fill="#00D4AA" opacity="0.6"/>
<ellipse cx="5" cy="55" rx="10" ry="3" fill="#00D4AA" opacity="0.6"/>
<ellipse cx="75" cy="55" rx="10" ry="3" fill="#00D4AA" opacity="0.6"/>
<!-- Signal waves -->
<path d="M 40 60 Q 30 75 40 90" stroke="#00D4AA" stroke-width="1.5" fill="none" opacity="0.5"/>
<path d="M 40 60 Q 50 75 40 90" stroke="#00D4AA" stroke-width="1.5" fill="none" opacity="0.5"/>
</g>
<text x="20" y="130" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="12" font-weight="600" fill="#00D4AA">AERIAL INTELLIGENCE</text>
</g>
<!-- Bottom: Stats bar -->
<g transform="translate(0, 340)">
<rect width="520" height="60" rx="8" fill="#0D2137" stroke="#1A3A5C" stroke-width="1"/>
<text x="30" y="25" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="11" font-weight="600" fill="#5A7A9A">CITIES MONITORED</text>
<text x="30" y="48" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="22" font-weight="700" fill="#FFFFFF">2,842</text>
<text x="160" y="25" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="11" font-weight="600" fill="#5A7A9A">OBSERVATIONS</text>
<text x="160" y="48" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="22" font-weight="700" fill="#FFFFFF">1.2M+</text>
<text x="310" y="25" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="11" font-weight="600" fill="#5A7A9A">COVERAGE</text>
<text x="310" y="48" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="22" font-weight="700" fill="#FFFFFF">312 km²</text>
<text x="450" y="25" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="11" font-weight="600" fill="#5A7A9A">ACCURACY</text>
<text x="450" y="48" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="22" font-weight="700" fill="#00D4AA">99.7%</text>
</g>
</g>
<!-- Bottom accent bar -->
<rect x="0" y="620" width="1200" height="10" fill="url(#accent)"/>
</svg>