6989a98d75
- 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
202 lines
11 KiB
XML
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> |