diff --git a/website/et_banner.jpg b/website/et_banner.jpg new file mode 100644 index 00000000000..3af1b255c3b Binary files /dev/null and b/website/et_banner.jpg differ diff --git a/website/index.html b/website/index.html index a7be0dc04f1..8fb55a45b26 100644 --- a/website/index.html +++ b/website/index.html @@ -1,3 +1,4 @@ + @@ -5,6 +6,7 @@ ExecuTorch - On-Device AI Inference Powered by PyTorch + @@ -16,966 +18,44 @@ - + +
+
+
+ + +
+
+
-

- - ExecuTorch -

-

Deploy PyTorch models directly to edge devices. Text, vision, and audio AI with privacy-preserving, real-time inference—no cloud required.

- +

Deploy PyTorch models directly to edge devices. Text, vision, and audio AI with privacy-preserving, real-time inference — no cloud required.

+ +
-

Why On-Device AI Matters

-

The future of AI is at the edge, where privacy meets performance

- -
-
-
🔒
-

Enhanced Privacy

-

Data never leaves the device. Process personal content, conversations, and media locally without cloud exposure.

+

Why On-Device AI Matters

+
+
+
+ + + + +
- -
-
-

Real-Time Response

-

Instant inference with no network round-trips. Perfect for AR/VR experiences, multimodal AI interactions, and responsive conversational agents.

+

Enhanced Privacy

+

Data never leaves the device. Process personal content, conversations, and media locally without cloud exposure.

+
+
+
+ + + + +
- -
-
🌐
-

Offline & Low-Bandwidth Ready

-

Zero network dependency for inference. Works seamlessly in low-bandwidth regions, remote areas, or completely offline.

+

Real-Time Response

+

Instant inference with no network round-trips. Perfect for AR/VR experiences, multimodal AI interactions, and responsive conversational agents.

+
+
+
+ + + + + +
- -
-
💰
-

Cost Efficient

-

No cloud compute bills. No API rate limits. Scale to billions of users without infrastructure costs growing linearly.

+

Offline & Low-Bandwidth Ready

+

Zero network dependency for inference. Works seamlessly in low-bandwidth regions, remote areas, or completely offline.

+
+
+
+ + + + $ +
+

Cost Efficient

+

No cloud compute bills. No API rate limits. Scale to billions of users without infrastructure costs growing linearly.

+
@@ -1068,29 +170,94 @@

Models Are Getting Smaller & S

Why On-Device AI Was Hard

-

The technical challenges that made edge deployment complex... until now

-
🔋
+ +
+ + + + + + + + + + + + +
+

Power Constraints

From battery-powered phones to energy-harvesting sensors, edge devices have strict power budgets. Microcontrollers may run on milliwatts, requiring extreme efficiency.

-
🌡️
+
+ + + + + + + + + + + + + +

Thermal Management

Sustained inference generates heat without active cooling. From smartphones to industrial IoT devices, thermal throttling limits continuous AI workloads.

-
💾
+
+ + + + + + + + + + + + + + + + + + + + +

Memory Limitations

Edge devices range from high-end phones to tiny microcontrollers. Beyond capacity, limited memory bandwidth creates bottlenecks when moving tensors between compute units.

-
🔧
+
+ + + + + + + + + + + + + + + +

Hardware Heterogeneity

From microcontrollers to smartphone NPUs to embedded GPUs. Each architecture demands unique optimizations, making broad deployment across diverse form factors extremely challenging.

@@ -1101,7 +268,7 @@

Hardware Heterogeneity

-

PyTorch Powers 92% of AI Research

+

PyTorch Powers >90% of AI Research

But deploying PyTorch models to edge devices meant losing everything that made PyTorch great

@@ -1162,37 +329,115 @@

ExecuTorch
-
🎯
+
+ + + + + + + + + + + + + + + + + +

No Conversions

Direct export from PyTorch to edge. Core ATen operators preserved. No intermediate formats, no vendor lock-in.

-
⚙️
+
+ + + + + + + + + + +

Ahead-of-Time Compilation

Optimize models offline for target device capabilities. Hardware-specific performance tuning before deployment.

-
🔧
+
+ + + + + + + + + +

Modular by Design

Pick and choose optimization steps. Composable at both compile-time and runtime for maximum flexibility.

-
🚀
+
+ + + + + + + + + + + + + + + +

Hardware Ecosystem

Fully open source with hardware partner contributions. Built on PyTorch's standardized IR and operator set.

-
💾
+
+ + + + + + + +

Embedded-Friendly Runtime

Portable C++ runtime runs on microcontrollers to smartphones.

-
🔗
+
+ + + + + + + + + + + + + + +

PyTorch Ecosystem

Native integration with PyTorch ecosystem, including torchao for quantization. Stay in familiar tools throughout.

@@ -1201,7 +446,7 @@

PyTorch Ecosystem

-
+

Simple as 1-2-3

Export, optimize, and run PyTorch models on edge devices

@@ -1235,17 +480,17 @@

Choose your target hardware to see the corresponding code:
-
+
CPU Optimization
-
XNNPACK with KleidiAI
+
XNNPACK with Arm Kleidi
-
+
Apple Devices
Core ML partitioner
-
-
Qualcomm Chips
-
Hexagon NPU support
+
+
Qualcomm® AI Engine
+
Qualcomm® Hexagon™ NPU
@@ -1313,19 +558,19 @@

Choose your platform to see the native API:
-
+
C++
-
+
Swift
-
+
Kotlin
-
+
Objective-C
-
+
WebAssembly
@@ -1409,7 +654,7 @@

+

High-Level Multimodal APIs

Run complex multimodal LLMs with simplified C++ interfaces

@@ -1427,15 +672,15 @@

Unified API across mobile platforms:
-
+
C++
Cross-platform
-
+
Swift
iOS native
-
+
Kotlin
Android native
@@ -1590,22 +835,22 @@

Comprehensive Hardware Ecosyst
-

XNNPACK with KleidiAI

-

CPU acceleration across ARM and x86 architectures

+

XNNPACK with Arm Kleidi

+

CPU acceleration across Arm and x86 architectures

-

Apple Core ML

+

Apple Core ML for Apple silicon

Neural Engine and Apple Silicon optimization

-

Qualcomm Snapdragon

-

Hexagon NPU support

+

Qualcomm® AI Engine for Qualcomm® Hexagon™ NPU

+

Hardware-accelerated AI inference on Qualcomm platforms

-

ARM Ethos-U

+

Arm Ethos-U NPU

Microcontroller NPU for ultra-low power

@@ -1615,7 +860,7 @@

Vulkan GPU

-

Intel OpenVINO

+

OpenVINO from Intel

x86 CPU and integrated GPU optimization

@@ -1625,22 +870,22 @@

MediaTek NPU

-

Samsung Exynos

+

Samsung Exynos NPU

Integrated NPU optimization

-

NXP Neutron

+

NXP Semiconductors' eIQ® Neutron NPU

Automotive and IoT acceleration

-

Apple MPS

-

Metal Performance Shaders for GPU acceleration

+

Apple Metal Performance Shaders (MPS)

+

GPU acceleration on macOS and iOS

-

ARM VGF

+

Arm VGF

Versatile graphics framework support

@@ -1725,10 +970,10 @@

Ready to Deploy AI at the Edge?

window.addEventListener('scroll', function() { const navbar = document.querySelector('nav'); if (window.scrollY > 50) { - navbar.style.background = 'rgba(255, 255, 255, 0.98)'; - navbar.style.boxShadow = '0 2px 20px rgba(0, 0, 0, 0.1)'; + navbar.style.background = 'rgba(48,48,48,0.97)'; + navbar.style.boxShadow = '0 2px 20px rgba(0,0,0,0.1)'; } else { - navbar.style.background = 'rgba(255, 255, 255, 0.95)'; + navbar.style.background = 'rgba(48,48,48,0.97)'; navbar.style.boxShadow = 'none'; } }); @@ -1748,7 +993,7 @@

Ready to Deploy AI at the Edge?

}); // Backend switcher - function switchBackend(backend) { + function switchBackend(backend, event) { // Hide all backend content document.querySelectorAll('.backend-content').forEach(content => { content.classList.remove('active'); @@ -1767,7 +1012,7 @@

Ready to Deploy AI at the Edge?

} // Platform switcher - function switchPlatform(platform) { + function switchPlatform(platform, event) { // Hide all platform content document.querySelectorAll('.platform-content').forEach(content => { content.classList.remove('active'); @@ -1786,7 +1031,7 @@

Ready to Deploy AI at the Edge?

} // Multimodal platform switcher - function switchMultimodalPlatform(platform) { + function switchMultimodalPlatform(platform, event) { // Hide all multimodal platform content document.querySelectorAll('.multimodal-content').forEach(content => { content.classList.remove('active'); @@ -1803,6 +1048,22 @@

Ready to Deploy AI at the Edge?

// Add active class to clicked card event.currentTarget.classList.add('active'); } + + // Hamburger menu toggle + function toggleNav() { + var navLinks = document.getElementById('navLinks'); + navLinks.classList.toggle('open'); + } + + // Highlight active nav link on click + document.querySelectorAll('.nav-links a').forEach(function(link) { + link.addEventListener('click', function() { + document.querySelectorAll('.nav-links a').forEach(function(l) { + l.classList.remove('active'); + }); + this.classList.add('active'); + }); + }); diff --git a/website/style.css b/website/style.css new file mode 100644 index 00000000000..04ef18442a4 --- /dev/null +++ b/website/style.css @@ -0,0 +1,1062 @@ +/* Font Faces */ +@font-face{ + font-family:'Open Sans'; + src:url('https://pytorch.org/wp-content/themes/salient/css/fonts/OpenSans-Light.woff') format('woff'); + font-weight:300; + font-style:normal; +} +@font-face{ + font-family:'Open Sans'; + src:url('https://pytorch.org/wp-content/themes/salient/css/fonts/OpenSans-Regular.woff') format('woff'); + font-weight:400; + font-style:normal; +} +@font-face{ + font-family:'Open Sans'; + src:url('https://pytorch.org/wp-content/themes/salient/css/fonts/OpenSans-SemiBold.woff') format('woff'); + font-weight:600; + font-style:normal; +} +@font-face{ + font-family:'Open Sans'; + src:url('https://pytorch.org/wp-content/themes/salient/css/fonts/OpenSans-Bold.woff') format('woff'); + font-weight:700; + font-style:normal; +} + +/* Legacy Container Styles */ +html body[data-header-resize="1"] .container-wrap, +html body[data-header-format="left-header"][data-header-resize="0"] .container-wrap, +html body[data-header-resize="0"] .container-wrap, +body[data-header-format="left-header"][data-header-resize="0"] .container-wrap { + padding-top: 0; +} + +.main-content > .row > #breadcrumbs.yoast { + padding: 20px 0; +} + +/* CSS Variables */ +:root { + --primary: #df3411; + --bg-light: #ffffff; + --bg-gray: #f8fafc; + --text-dark: #1e293b; + --text-gray: #3e4c5f; + --text-gray-light: #576270; + --text-light:var(--bg-gray); + --border: #e2e8f0; + --border-dark: #2c3440; + --boarder-primary: #903321; + --max-width: 1200px; +} + +/* Base Styles */ +* { box-sizing: border-box; margin: 0; padding: 0; } + +body { + font-family: 'Open Sans',Helvetica,sans-serif; + line-height: 1.6; + color: var(--text-dark); + background: var(--bg-light); +} + +/* Container */ +.container { + max-width: var(--max-width); + margin: 0 auto; + padding: 0 2rem; +} + +/* Navigation */ +nav { + position: fixed; + top: 0; + width: 100%; + background: rgba(48,48,48,0.97); + border-bottom: 1px solid var(--border-dark); + z-index: 1000; + box-shadow: 0 2px 8px rgba(0,0,0,0.04); +} + +.nav-content { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1rem 0; +} + +.logo { + display: flex; + align-items: center; + gap: 0.75rem; + font-size: 1.5rem; + font-weight: 700; + color: var(--text-dark); +} + +.logo img { + height: 40px; + filter: drop-shadow(0 0 2px var(--bg-gray)); +} + +.nav-links { + display: flex; + gap: 2rem; + list-style: none; +} + +.nav-links a { + color: var(--text-light); + text-decoration: none; + font-weight: 500; + padding-bottom: 2px; + transition: color 0.3s, border-bottom 0.3s; +} + +.nav-links a.active, +.nav-links a:hover { + border-bottom: 2px solid var(--primary); +} + +/* nav search */ +.nav-search { + margin-left: 2rem; +} + +.nav-search input { + padding: 0.5rem 1rem; + border-radius: 6px; + border: 1px solid var(--border); + font-size: 1rem; +} + +.nav-toggle { + display: none; + background: none; + border: none; + font-size: 2rem; + color: var(--primary); + cursor: pointer; + margin-left: 1rem; +} + +/* Sections */ +section { + padding: 5rem 0; +} + +section.alt { + background: var(--bg-gray); +} + +/* Title Banner */ +.title_banner { + background-image: url('et_banner.jpg'); + background-size: cover; + background-position: center; + background-repeat: no-repeat; + width: 100%; + height: 400px; + position: relative; + filter: drop-shadow(0 0 10px var(--text-gray)); +} + +.title_banner-container { + position: absolute; + left:150px; + bottom: 0; + display: flex; + gap: 12px; + padding: 2rem; + filter: none; +} + +.title_banner-logo { + height: 80px; + filter: drop-shadow(0 0 4px var(--bg-gray)); +} + +.logo-text-container { + font-size: 4rem; + font-weight: 800; + display: flex; + align-items: center; + gap: 12px; +} + +/* Hero */ +.hero { + padding: 7rem 0 4rem; + text-align: center; + background: linear-gradient(180deg, var(--bg-gray) 0%, var(--bg-light) 100%); +} + +.hero-logo { + height: 80px; +} + +.hero-subtitle { + font-size: 2rem; + color: var(--text-gray-light); + margin-bottom: 3rem; + padding: 2rem; + border-radius: 10px; + box-shadow: 0 4px 12px rgba(0,0,0,0.12); +} + +/* Typography */ +.section-title { + font-size: 3rem; + font-weight: 700; + text-align: center; + margin-bottom: 1rem; + color: var(--text-dark); +} + +.section-subtitle { + font-size: 1.25rem; + text-align: center; + color: var(--text-gray); + margin-bottom: 3rem; + max-width: 800px; + margin-left: auto; + margin-right: auto; +} + +.highlight { + color: var(--primary); +} + +.banner_highlight{ + color: var( --bg-gray); +} + +/* Card Grid */ +.grid-2x2 { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 2rem; + margin-top: 2rem; +} + +.card { + background: var(--bg-light); + padding: 2rem; + border-radius: 16px; + border: 1px solid var(--border); + height: 100%; + box-shadow: 0 2px 8px rgba(222,52,18,0.04); + transition: box-shadow 0.3s, border-color 0.3s, transform 0.3s; + display: flex; + flex-direction: column; + align-items: center; + text-align: center; +} + +.card:hover { + box-shadow: 0 8px 24px rgba(222,52,18,0.12); + border-color: var(--primary); + transform: translateY(-4px); +} + +.card-icon { + width: 60px; + height: 60px; + margin-bottom: 1.5rem; + display: flex; + align-items: center; + justify-content: center; + background: var(--bg-gray); + border-radius: 12px; + border: 2px solid var(--primary); +} + +.card-title { + font-size: 1.25rem; + font-weight: 600; + margin-bottom: 1rem; + color: var(--text-dark); +} + +.card-text { + color: var(--text-gray); + line-height: 1.6; + font-size: 1.25rem; +} + +/* Stats Grid */ +.stats { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 2rem; + margin: 3rem 0; +} + +.stat-card { + background: var(--bg-light); + padding: 2rem; + border-radius: 12px; + border: 1px solid var(--border); + text-align: center; +} + +.stat-card-clickable { + cursor: pointer; + transition: all 0.3s ease; +} + +.stat-card-clickable:hover { + transform: translateY(-4px); + box-shadow: 0 8px 24px rgba(222, 52, 18, 0.2); + border-color: var(--primary); +} + +.stat-card-clickable:hover .stat-number { + color: #c62e10; +} + +.stat-number { + font-size: 2.5rem; + font-weight: 700; + color: var(--primary); + margin-bottom: 0.5rem; +} + +.stat-label { + color: var(--text-gray); + font-size: 0.9rem; +} + +/* Grid Layout */ +.grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 2rem; +} + +.grid-2 { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 3rem; + align-items: start; +} + +/* Buttons */ +.btn { + display: inline-block; + padding: 1rem 2rem; + border-radius: 8px; + text-decoration: none; + font-weight: 600; + margin: 0.5rem; + transition: all 0.3s; + font-size: 1rem; +} + +.btn-primary { + background: #c62e10; + color: white; + box-shadow: 0 2px 8px rgba(198, 46, 16, 0.25); +} + +.btn-primary:hover { + background: #a82609; + transform: translateY(-2px); + box-shadow: 0 10px 30px rgba(198, 46, 16, 0.4); +} + +.btn-secondary { + background: transparent; + color: var(--text-dark); + border: 2px solid var(--border); +} + +.btn-secondary:hover { + border-color: var(--primary); + color: var(--primary); +} + +/* Features Grid */ +.features-3 { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 2rem; + text-align: center; + margin: 3rem 0; +} + +.feature-item { + background: var(--bg-light); + padding: 2rem; + border-radius: 12px; + border: 1px solid var(--border); +} + +.feature-title { + font-size: 1.1rem; + font-weight: 600; + color: var(--primary); + margin-bottom: 0.5rem; +} + +.feature-text { + color: var(--text-gray); + font-size: 0.9rem; +} + +/* Problem/Solution */ +.problem-solution { + display: grid; + grid-template-columns: 1fr auto 1fr; + gap: 2rem; + align-items: center; + margin: 3rem 0; +} + +.problem-card { + text-align: center; + padding: 2rem; + border-radius: 12px; + border: 2px solid var(--border); +} + +.problem-card.good { + background: var(--bg-light); +} + +.problem-card.bad { + background: #fef2f2; + border-color: #fca5a5; +} + +.arrow { + font-size: 2rem; + color: var(--primary); +} + +/* Issues Grid */ +.issues { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 1.5rem; + text-align: center; +} + +.issue-item { + display: flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + margin-bottom: 0.5rem; +} + +.issue-icon { + color: var(--primary); + font-size: 1.2rem; +} + +.issue-title { + font-weight: 600; + color: var(--text-dark); +} + +.issue-text { + color: var(--text-gray); + font-size: 0.9rem; +} + +/* Solution Box */ +.solution-box { + text-align: center; + padding: 3rem; + background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%); + border-radius: 16px; + border: 2px solid #0ea5e9; + margin: 3rem 0; +} + +.solution-title { + font-size: 1.8rem; + margin-bottom: 1rem; + color: var(--text-dark); +} + +.solution-text { + color: var(--text-gray); + font-size: 1.1rem; + max-width: 700px; + margin: 0 auto; +} + +/* Performance */ +.metric { + margin-bottom: 1.5rem; +} + +.metric-header { + display: flex; + justify-content: space-between; + margin-bottom: 0.5rem; +} + +.metric-value { + color: var(--primary); + font-weight: 600; +} + +.metric-bar { + height: 8px; + background: var(--border); + border-radius: 4px; + overflow: hidden; +} + +.metric-fill { + height: 100%; + background: var(--primary); + border-radius: 4px; +} + +/* Architecture Flow */ +.flow { + display: flex; + justify-content: center; + align-items: center; + gap: 2rem; + flex-wrap: wrap; + margin: 3rem 0; + text-align: center; +} + +.flow-step { + background: var(--bg-light); + padding: 1.5rem; + border-radius: 12px; + border: 2px solid var(--border); + min-width: 150px; +} + +.flow-step h4 { + color: var(--primary); + margin-bottom: 0.5rem; +} + +.flow-step p { + color: var(--text-gray); + font-size: 0.9rem; +} + +.flow-arrow { + color: var(--text-gray); + font-size: 2rem; +} + +/* Partners */ +.partners { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 1.5rem; +} + +.partner-card { + background: var(--bg-light); + padding: 1.5rem; + border-radius: 12px; + border: 1px solid var(--border); + text-align: center; +} + +.partner-name { + font-weight: 600; + color: var(--text-dark); + margin-bottom: 0.5rem; +} + +.partner-desc { + color: var(--text-gray); + font-size: 0.9rem; +} + +/* Code Section Container */ +.code-section-container { + max-width: var(--max-width); + margin: 0 auto; + padding: 0 2rem; +} + +/* Backend Grid */ +.backend-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 1.5rem; + margin-bottom: 1.5rem; +} + +.backend-option { + background: #0f172a; + border-radius: 12px; + padding: 1.5rem; + border: 1px solid #334155; +} + +.backend-option h4 { + color: #94a3b8; + font-size: 1rem; + margin-bottom: 1rem; + text-align: center; +} + +.save-code { + background: #0f172a; + border-radius: 12px; + padding: 1.5rem; + border: 1px solid #334155; +} + +/* CTA */ +.cta { + background: linear-gradient(135deg, var(--text-dark) 0%, #374151 100%); + padding: 5rem 0; + text-align: center; + color: white; +} + +.cta-title { + font-size: 2.5rem; + font-weight: 700; + margin-bottom: 1rem; +} + +.cta-text { + font-size: 1.25rem; + margin-bottom: 2rem; + opacity: 0.9; +} + +.cta .btn { + background: white; + color: #1e293b; + border: 2px solid white; + font-weight: 700; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2); +} + +.cta .btn:hover { + background: #f1f5f9; + transform: translateY(-2px); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3); +} + +/* Footer */ +footer { + background: var(--bg-gray); + padding: 3rem 0; + text-align: center; + color: var(--text-gray); + border-top: 1px solid var(--border); + margin-top: 4rem; +} + +footer a { + color: var(--text-gray); + margin: 0 1rem; + text-decoration: none; + font-weight: 500; +} + +/* Domain Slider Animation */ +.domain-slider { + overflow: hidden; + white-space: nowrap; + position: relative; +} + +.domain-track { + display: inline-flex; + gap: 1.5rem; + animation: slide 20s linear infinite; +} + +.domain-track span { + background: var(--bg-gray); + padding: 0.75rem 1.5rem; + border-radius: 25px; + font-weight: 600; + color: var(--text-dark); + flex-shrink: 0; +} + +@keyframes slide { + 0% { + transform: translateX(0); + } + 100% { + transform: translateX(-50%); + } +} + +/* Backend Switcher Cards */ +.backend-switcher { + margin-bottom: 1rem; + border: 2px solid var(--border); + border-radius: 12px; + background: var(--bg-gray); + padding: 1rem; +} + +.backend-cards { + display: flex; + justify-content: flex-start; + gap: 0; + margin-bottom: 0; + flex-wrap: wrap; +} + +.backend-card { + background: var(--bg-light); + border: 2px solid var(--border); + border-radius: 8px 8px 0 0; + border-bottom: none; + padding: 0.75rem 1rem; + cursor: pointer; + transition: all 0.3s; + text-align: center; + min-width: 140px; + position: relative; +} + +.backend-card:not(:first-child) { + border-left: none; + border-radius: 0 8px 0 0; +} + +.backend-card:first-child { + border-radius: 8px 0 0 0; +} + +.backend-card:last-child { + border-radius: 0 8px 0 0; +} + +.backend-card:only-child { + border-radius: 8px 8px 0 0; +} + +.backend-card::after { + content: "Click to view code"; + position: absolute; + top: -2rem; + left: 50%; + transform: translateX(-50%); + background: var(--text-dark); + color: white; + padding: 0.25rem 0.5rem; + border-radius: 4px; + font-size: 0.7rem; + opacity: 0; + transition: opacity 0.3s; + pointer-events: none; + white-space: nowrap; +} + +.backend-card:hover::after { + opacity: 1; +} + +.backend-card:hover { + border-color: var(--primary); + box-shadow: 0 4px 20px rgba(222, 52, 18, 0.1); + transform: translateY(-2px); +} + +.backend-card.active { + border-color: var(--primary); + background: var(--primary); + color: white; + box-shadow: 0 4px 20px rgba(222, 52, 18, 0.25); + transform: translateY(-2px); +} + +.backend-card.active::after { + opacity: 0; +} + +.backend-card-title { + font-size: 0.9rem; + font-weight: 600; + color: var(--text-dark); + margin-bottom: 0.25rem; +} + +.backend-card-desc { + font-size: 0.75rem; + color: var(--text-gray); +} + +.backend-card.active .backend-card-title { + color: white; +} + +.backend-card.active .backend-card-desc { + color: rgba(255, 255, 255, 0.9); +} + +.backend-card.more-backends { + background: linear-gradient(135deg, var(--bg-gray) 0%, #e5e7eb 100%); + border-style: dashed; + cursor: pointer; +} + +.backend-card.more-backends:hover { + border-color: var(--primary); + box-shadow: 0 4px 20px rgba(222, 52, 18, 0.1); + transform: translateY(-2px); +} + +.backend-card.more-backends::after { + content: "View all backends documentation"; +} + +.backend-card.more-backends .backend-card-title { + color: var(--text-gray); +} + +.backend-card.more-backends .backend-card-desc { + color: var(--text-gray); + opacity: 0.8; +} + +.backend-content { + display: none; +} + +.backend-content.active { + display: block; +} + +.backend-content > div { + border-radius: 0 8px 8px 8px !important; + border-top: none !important; +} + +/* Platform Switcher - Same Style */ +.platform-switcher { + margin-bottom: 1rem; + border: 2px solid var(--border); + border-radius: 12px; + background: var(--bg-gray); + padding: 1rem; +} + +.platform-cards { + display: flex; + justify-content: flex-start; + gap: 0; + margin-bottom: 0; + flex-wrap: wrap; +} + +.platform-card { + background: var(--bg-light); + border: 2px solid var(--border); + border-radius: 8px 8px 0 0; + border-bottom: none; + padding: 0.75rem 1rem; + cursor: pointer; + transition: all 0.3s; + text-align: center; + min-width: 120px; + position: relative; +} + +.platform-card:not(:first-child) { + border-left: none; + border-radius: 0 8px 0 0; +} + +.platform-card:first-child { + border-radius: 8px 0 0 0; +} + +.platform-card:last-child { + border-radius: 0 8px 0 0; +} + +.platform-card:only-child { + border-radius: 8px 8px 0 0; +} + +.platform-card::after { + content: "Click to view code"; + position: absolute; + top: -2rem; + left: 50%; + transform: translateX(-50%); + background: var(--text-dark); + color: white; + padding: 0.25rem 0.5rem; + border-radius: 4px; + font-size: 0.7rem; + opacity: 0; + transition: opacity 0.3s; + pointer-events: none; + white-space: nowrap; +} + +.platform-card:hover::after { + opacity: 1; +} + +.platform-card:hover { + border-color: var(--primary); + box-shadow: 0 4px 20px rgba(222, 52, 18, 0.1); + transform: translateY(-2px); +} + +.platform-card.active { + border-color: var(--primary); + background: var(--primary); + color: white; + box-shadow: 0 4px 20px rgba(222, 52, 18, 0.25); + transform: translateY(-2px); +} + +.platform-card.active::after { + opacity: 0; +} + +.platform-card-title { + font-size: 0.9rem; + font-weight: 600; + color: var(--text-dark); +} + +.platform-card.active .platform-card-title { + color: white; +} + +.platform-content { + display: none; +} + +.platform-content.active { + display: block; +} + +.platform-content > div { + border-radius: 0 8px 8px 8px !important; + border-top: none !important; +} + +/* Multimodal Platform Switcher */ +.multimodal-content { + display: none; +} + +.multimodal-content.active { + display: block; +} + +.multimodal-content > div { + border-radius: 0 8px 8px 8px !important; + border-top: none !important; +} + +.code-instruction { + text-align: center; + color: var(--text-gray); + font-size: 0.85rem; + margin-bottom: 0.5rem; + font-style: italic; +} + +/* Responsive */ +@media (max-width: 900px) { + .container { + padding: 0 1rem; + } + .nav-search { + display: none; + } + .grid-2x2 { + grid-template-columns: 1fr; + } +} + +@media (max-width: 768px) { + .container { + padding: 0 1rem; + } + .hero-logo { + height: 60px; + } + .section-title { + font-size: 2.2rem; + } + .grid-2 { + grid-template-columns: 1fr; + gap: 2rem; + } + .grid-2x2 { + grid-template-columns: 1fr; + } + .features-3 { + grid-template-columns: 1fr; + } + .issues { + grid-template-columns: 1fr; + } + .backend-grid { + grid-template-columns: 1fr; + } + .problem-solution { + grid-template-columns: 1fr; + } + .arrow { + transform: rotate(90deg); + } + .flow { + flex-direction: column; + } + .flow-arrow { + transform: rotate(90deg); + } + .nav-links { + display: none; + } + .nav-search { + display: none; + } +} + +@media (max-width: 700px) { + .nav-links { + display: none; + flex-direction: column; + background: #fff; + position: absolute; + top: 64px; + left: 0; + width: 100%; + box-shadow: 0 2px 8px rgba(0,0,0,0.08); + } + .nav-links.open { + display: flex; + } + .nav-toggle { + display: block; + } + .nav-content { + flex-wrap: wrap; + } +} + +@media (max-width: 480px) { + .stats { + grid-template-columns: 1fr; + } + .section-title { + font-size: 1.8rem; + } +}