adaptive-memory-multi-model-router 2.12.0 → 2.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/pages.yml +37 -0
- package/Awesome-LLM/LICENSE.md +121 -0
- package/Awesome-LLM/README.md +625 -0
- package/Awesome-LLM/contributing.md +24 -0
- package/Awesome-LLM/paper_list/RLHF.md +1 -0
- package/Awesome-LLM/paper_list/Retrieval_Augmented_Generation.md +6 -0
- package/Awesome-LLM/paper_list/acceleration.md +10 -0
- package/Awesome-LLM/paper_list/alignment.md +20 -0
- package/Awesome-LLM/paper_list/application.md +19 -0
- package/Awesome-LLM/paper_list/augmentation.md +14 -0
- package/Awesome-LLM/paper_list/chain_of_thougt.md +16 -0
- package/Awesome-LLM/paper_list/code_pretraining.md +0 -0
- package/Awesome-LLM/paper_list/detection.md +11 -0
- package/Awesome-LLM/paper_list/evaluation.md +64 -0
- package/Awesome-LLM/paper_list/in_context_learning.md +4 -0
- package/Awesome-LLM/paper_list/instruction-tuning.md +35 -0
- package/Awesome-LLM/paper_list/moe.md +0 -0
- package/Awesome-LLM/paper_list/prompt_learning.md +15 -0
- package/Awesome-LLM/resources/DeepSpeed_light.svg +27 -0
- package/Awesome-LLM/resources/alpa-logo-cropped.png +0 -0
- package/Awesome-LLM/resources/colossal-ai_logo_vertical.png +0 -0
- package/Awesome-LLM/resources/creepy_llm.jpeg +0 -0
- package/Awesome-LLM/resources/image8.gif +0 -0
- package/Awesome-LLM/resources/jax_logo_250px.png +0 -0
- package/Awesome-LLM/resources/logo.png +0 -0
- package/Awesome-LLM/resources/nvidia.png +0 -0
- package/Awesome-LLM/resources/tensorflow.png +0 -0
- package/Awesome-LLM/resources//345/244/247/345/236/213/350/257/255/350/250/200/346/250/241/345/236/213/347/232/204/350/203/275/345/212/233/345/210/206/346/236/220/344/270/216/345/272/224/347/224/250 - 30min.pdf +0 -0
- package/README.md +3 -3
- package/SUBMISSIONS.md +43 -0
- package/assets/chart-cost-v2.svg +91 -0
- package/assets/chart-cost-v3.svg +143 -0
- package/assets/chart-features-v2.svg +132 -0
- package/assets/chart-features-v3.svg +211 -0
- package/assets/chart-growth-v2.svg +122 -0
- package/assets/chart-growth-v3.svg +189 -0
- package/assets/cost-simple.svg +64 -0
- package/assets/growth-simple.svg +69 -0
- package/assets/hero-diagram.svg +81 -0
- package/assets/logo-new.svg +21 -0
- package/assets/social-preview-new.svg +100 -0
- package/assets/social-v2.svg +130 -0
- package/assets/social-v3.svg +212 -0
- package/awesome-ai-gateways/CONTRIBUTING.md +49 -0
- package/awesome-ai-gateways/LICENSE +3 -0
- package/awesome-ai-gateways/README.md +190 -0
- package/awesome-selfhosted/.github/ISSUE_TEMPLATE/config.yml +5 -0
- package/awesome-selfhosted/.github/PULL_REQUEST_TEMPLATE.md +1 -0
- package/awesome-selfhosted/LICENSE +376 -0
- package/awesome-selfhosted/README.md +2303 -0
- package/awesome-selfhosted/_static/awesome.png +0 -0
- package/awesome-selfhosted/non-free.md +377 -0
- package/demo-new.tape +71 -0
- package/demo-real.sh +198 -0
- package/demo-simple.tape +205 -0
- package/demo.html +520 -0
- package/demo.tape +259 -0
- package/dist/cli/tui.js +152 -0
- package/docs/demo-auto.html +264 -0
- package/docs/demo.html +416 -0
- package/docs/index.html +112 -599
- package/index.html +667 -0
- package/package.json +21 -168
- package/docs/assets/cost-comparison.svg +0 -134
- package/docs/assets/growth-chart-animated.svg +0 -76
- package/docs/assets/og-banner.svg +0 -194
- package/docs/assets/social-preview.svg +0 -194
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 450" width="700" height="450">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
4
|
+
<stop offset="0%" stop-color="#0a0a0f"/>
|
|
5
|
+
<stop offset="50%" stop-color="#12121a"/>
|
|
6
|
+
<stop offset="100%" stop-color="#1a1a2e"/>
|
|
7
|
+
</linearGradient>
|
|
8
|
+
|
|
9
|
+
<!-- GPT-4 gradient -->
|
|
10
|
+
<linearGradient id="gpt4Grad" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
11
|
+
<stop offset="0%" stop-color="#3b82f6"/>
|
|
12
|
+
<stop offset="100%" stop-color="#1d4ed8"/>
|
|
13
|
+
</linearGradient>
|
|
14
|
+
|
|
15
|
+
<!-- A3M gradient with shimmer -->
|
|
16
|
+
<linearGradient id="a3mGrad" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
17
|
+
<stop offset="0%" stop-color="#10b981">
|
|
18
|
+
<animate attributeName="stop-color" values="#10b981;#34d399;#10b981" dur="3s" repeatCount="indefinite"/>
|
|
19
|
+
</stop>
|
|
20
|
+
<stop offset="100%" stop-color="#059669"/>
|
|
21
|
+
</linearGradient>
|
|
22
|
+
|
|
23
|
+
<!-- Savings badge gradient -->
|
|
24
|
+
<linearGradient id="savingsGrad" x1="0%" y1="0%" x2="100%" y2="0%">
|
|
25
|
+
<stop offset="0%" stop-color="#10b981"/>
|
|
26
|
+
<stop offset="100%" stop-color="#06b6d4"/>
|
|
27
|
+
</linearGradient>
|
|
28
|
+
|
|
29
|
+
<!-- Glow filter -->
|
|
30
|
+
<filter id="glow" x="-50%" y="-50%" width="200%" height="200%">
|
|
31
|
+
<feGaussianBlur stdDeviation="5" result="blur"/>
|
|
32
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
33
|
+
</filter>
|
|
34
|
+
|
|
35
|
+
<!-- Bar glow -->
|
|
36
|
+
<filter id="barGlow" x="-20%" y="-20%" width="140%" height="140%">
|
|
37
|
+
<feGaussianBlur stdDeviation="3" result="blur"/>
|
|
38
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
39
|
+
</filter>
|
|
40
|
+
|
|
41
|
+
<!-- Grid pattern -->
|
|
42
|
+
<pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse">
|
|
43
|
+
<path d="M 40 0 L 0 0 0 40" fill="none" stroke="#ffffff" stroke-width="0.5" opacity="0.04"/>
|
|
44
|
+
</pattern>
|
|
45
|
+
</defs>
|
|
46
|
+
|
|
47
|
+
<style>
|
|
48
|
+
@keyframes fadeIn { from { opacity: 0; transform: translateY(15px); } to { opacity: 1; transform: translateY(0); } }
|
|
49
|
+
@keyframes slideUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } }
|
|
50
|
+
@keyframes pulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.4); } 50% { box-shadow: 0 0 20px 5px rgba(16, 185, 129, 0.2); } }
|
|
51
|
+
@keyframes countUp { from { opacity: 0; } to { opacity: 1; } }
|
|
52
|
+
.title { animation: fadeIn 0.6s ease-out; }
|
|
53
|
+
.bar-group { animation: slideUp 0.8s ease-out; animation-fill-mode: both; }
|
|
54
|
+
.gpt4-bar { animation: slideUp 0.8s ease-out 0.1s both; }
|
|
55
|
+
.a3m-bar { animation: slideUp 0.8s ease-out 0.3s both; }
|
|
56
|
+
.savings { animation: slideUp 0.8s ease-out 0.5s both; }
|
|
57
|
+
</style>
|
|
58
|
+
|
|
59
|
+
<!-- Background -->
|
|
60
|
+
<rect width="700" height="450" fill="url(#bg)"/>
|
|
61
|
+
<rect width="700" height="450" fill="url(#grid)"/>
|
|
62
|
+
|
|
63
|
+
<!-- Ambient glow -->
|
|
64
|
+
<ellipse cx="350" cy="225" rx="300" ry="200" fill="#3b82f6" opacity="0.03" filter="url(#glow)"/>
|
|
65
|
+
<ellipse cx="350" cy="300" rx="200" ry="100" fill="#10b981" opacity="0.05" filter="url(#glow)"/>
|
|
66
|
+
|
|
67
|
+
<!-- Header -->
|
|
68
|
+
<g class="title">
|
|
69
|
+
<text x="350" y="42" text-anchor="middle" fill="#ffffff" font-family="system-ui,-apple-system,sans-serif" font-size="26" font-weight="700">
|
|
70
|
+
Cost Comparison
|
|
71
|
+
</text>
|
|
72
|
+
<text x="350" y="65" text-anchor="middle" fill="#8888aa" font-family="system-ui,sans-serif" font-size="13">
|
|
73
|
+
100 mixed queries • Code, math, creative, translation
|
|
74
|
+
</text>
|
|
75
|
+
</g>
|
|
76
|
+
|
|
77
|
+
<!-- Chart area -->
|
|
78
|
+
<g transform="translate(80, 100)">
|
|
79
|
+
<!-- Y-axis labels -->
|
|
80
|
+
<g fill="#666688" font-family="system-ui,sans-serif" font-size="12" text-anchor="end">
|
|
81
|
+
<text x="55" y="255">$0</text>
|
|
82
|
+
<text x="55" y="195">$5</text>
|
|
83
|
+
<text x="55" y="135">$10</text>
|
|
84
|
+
<text x="55" y="75">$15</text>
|
|
85
|
+
<text x="55" y="40">$20</text>
|
|
86
|
+
</g>
|
|
87
|
+
|
|
88
|
+
<!-- Y-axis grid -->
|
|
89
|
+
<g stroke="#ffffff" stroke-opacity="0.06" stroke-dasharray="4,4">
|
|
90
|
+
<line x1="70" y1="190" x2="540" y2="190"/>
|
|
91
|
+
<line x1="70" y1="130" x2="540" y2="130"/>
|
|
92
|
+
<line x1="70" y1="70" x2="540" y2="70"/>
|
|
93
|
+
</g>
|
|
94
|
+
|
|
95
|
+
<!-- Axes -->
|
|
96
|
+
<line x1="70" y1="250" x2="540" y2="250" stroke="#444466" stroke-width="2"/>
|
|
97
|
+
<line x1="70" y1="30" x2="70" y2="250" stroke="#444466" stroke-width="2"/>
|
|
98
|
+
|
|
99
|
+
<!-- GPT-4 Bar with glow -->
|
|
100
|
+
<g class="gpt4-bar" filter="url(#barGlow)">
|
|
101
|
+
<rect x="130" y="65" width="110" height="185" rx="8" fill="url(#gpt4Grad)" class="bar">
|
|
102
|
+
<animate attributeName="height" values="0;185;185" dur="1s" ease-out" fill="freeze"/>
|
|
103
|
+
<animate attributeName="y" values="250;65;65" dur="1s" ease-out" fill="freeze"/>
|
|
104
|
+
</rect>
|
|
105
|
+
<!-- Shine effect -->
|
|
106
|
+
<rect x="130" y="65" width="55" height="185" rx="8" fill="#ffffff" fill-opacity="0.1"/>
|
|
107
|
+
</g>
|
|
108
|
+
<text x="185" y="50" text-anchor="middle" fill="#60a5fa" font-family="system-ui,sans-serif" font-size="18" font-weight="700">$15.00</text>
|
|
109
|
+
<text x="185" y="275" text-anchor="middle" fill="#ffffff" font-family="system-ui,sans-serif" font-size="15" font-weight="600">GPT-4</text>
|
|
110
|
+
<text x="185" y="292" text-anchor="middle" fill="#666688" font-family="system-ui,sans-serif" font-size="11">$0.15/1K tokens</text>
|
|
111
|
+
|
|
112
|
+
<!-- A3M Bar with glow -->
|
|
113
|
+
<g class="a3m-bar" filter="url(#barGlow)">
|
|
114
|
+
<rect x="380" y="200" width="110" height="50" rx="8" fill="url(#a3mGrad)" class="bar">
|
|
115
|
+
<animate attributeName="height" values="0;50;50" dur="1s" ease-out" fill="freeze"/>
|
|
116
|
+
<animate attributeName="y" values="250;200;200" dur="1s" ease-out" fill="freeze"/>
|
|
117
|
+
</rect>
|
|
118
|
+
<!-- Shine effect -->
|
|
119
|
+
<rect x="380" y="200" width="55" height="50" rx="8" fill="#ffffff" fill-opacity="0.15"/>
|
|
120
|
+
</g>
|
|
121
|
+
<text x="435" y="185" text-anchor="middle" fill="#10b981" font-family="system-ui,sans-serif" font-size="18" font-weight="700">$5.75</text>
|
|
122
|
+
<text x="435" y="275" text-anchor="middle" fill="#ffffff" font-family="system-ui,sans-serif" font-size="15" font-weight="600">A3M Router</text>
|
|
123
|
+
<text x="435" y="292" text-anchor="middle" fill="#666688" font-family="system-ui,sans-serif" font-size="11">auto-routed</text>
|
|
124
|
+
|
|
125
|
+
<!-- Savings badge -->
|
|
126
|
+
<g class="savings">
|
|
127
|
+
<rect x="230" y="115" width="160" height="65" rx="32" fill="url(#savingsGrad)" fill-opacity="0.15" stroke="url(#savingsGrad)" stroke-width="1.5" filter="url(#glow)"/>
|
|
128
|
+
<text x="310" y="145" text-anchor="middle" fill="#10b981" font-family="system-ui,sans-serif" font-size="26" font-weight="800">-62%</text>
|
|
129
|
+
<text x="310" y="168" text-anchor="middle" fill="#8888aa" font-family="system-ui,sans-serif" font-size="12">savings per query</text>
|
|
130
|
+
</g>
|
|
131
|
+
|
|
132
|
+
<!-- Connection lines -->
|
|
133
|
+
<path d="M185,130 L260,148" stroke="#10b981" stroke-width="1.5" stroke-dasharray="4,4" fill="none" opacity="0.6"/>
|
|
134
|
+
<path d="M435,175 L390,148" stroke="#10b981" stroke-width="1.5" stroke-dasharray="4,4" fill="none" opacity="0.6"/>
|
|
135
|
+
</g>
|
|
136
|
+
|
|
137
|
+
<!-- Bottom info -->
|
|
138
|
+
<g transform="translate(0, 400)">
|
|
139
|
+
<text x="350" y="20" text-anchor="middle" fill="#555577" font-family="system-ui,sans-serif" font-size="11">
|
|
140
|
+
Based on actual benchmark • May 2026 • Real provider pricing
|
|
141
|
+
</text>
|
|
142
|
+
</g>
|
|
143
|
+
</svg>
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 500" width="800" height="500">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bgGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
4
|
+
<stop offset="0%" stop-color="#0a0f1c"/>
|
|
5
|
+
<stop offset="100%" stop-color="#111827"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="headerGrad" x1="0%" y1="0%" x2="100%" y2="0%">
|
|
8
|
+
<stop offset="0%" stop-color="#6366f1"/>
|
|
9
|
+
<stop offset="100%" stop-color="#06b6d4"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
<linearGradient id="a3mGrad" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
12
|
+
<stop offset="0%" stop-color="#10b981"/>
|
|
13
|
+
<stop offset="100%" stop-color="#059669"/>
|
|
14
|
+
</linearGradient>
|
|
15
|
+
|
|
16
|
+
<!-- Glow filter -->
|
|
17
|
+
<filter id="cellGlow" x="-10%" y="-10%" width="120%" height="120%">
|
|
18
|
+
<feGaussianBlur stdDeviation="2" result="blur"/>
|
|
19
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
20
|
+
</filter>
|
|
21
|
+
|
|
22
|
+
<!-- Grid pattern -->
|
|
23
|
+
<pattern id="gridPattern" width="40" height="40" patternUnits="userSpaceOnUse">
|
|
24
|
+
<path d="M 40 0 L 0 0 0 40" fill="none" stroke="#1f2937" stroke-width="0.5" opacity="0.3"/>
|
|
25
|
+
</pattern>
|
|
26
|
+
</defs>
|
|
27
|
+
|
|
28
|
+
<!-- Background -->
|
|
29
|
+
<rect width="800" height="500" fill="url(#bgGrad)"/>
|
|
30
|
+
<rect width="800" height="500" fill="url(#gridPattern)"/>
|
|
31
|
+
|
|
32
|
+
<!-- Header -->
|
|
33
|
+
<text x="400" y="38" text-anchor="middle" fill="#f9fafb" font-family="system-ui,-apple-system,sans-serif" font-size="22" font-weight="700">A3M Router Capabilities</text>
|
|
34
|
+
<text x="400" y="60" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="13">Production-ready features for intelligent LLM routing</text>
|
|
35
|
+
|
|
36
|
+
<!-- Table -->
|
|
37
|
+
<g transform="translate(80, 90)">
|
|
38
|
+
<!-- Header row -->
|
|
39
|
+
<rect x="0" y="0" width="640" height="45" rx="8" fill="url(#headerGrad)" fill-opacity="0.15"/>
|
|
40
|
+
<text x="320" y="28" text-anchor="middle" fill="#f9fafb" font-family="system-ui,sans-serif" font-size="14" font-weight="700">Feature</text>
|
|
41
|
+
<text x="540" y="28" text-anchor="middle" fill="#f9fafb" font-family="system-ui,sans-serif" font-size="14" font-weight="700">A3M Router</text>
|
|
42
|
+
<text x="620" y="28" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="14" font-weight="700">Others</text>
|
|
43
|
+
|
|
44
|
+
<!-- Divider -->
|
|
45
|
+
<line x1="0" y1="45" x2="640" y2="45" stroke="#374151" stroke-width="1"/>
|
|
46
|
+
|
|
47
|
+
<!-- Feature rows -->
|
|
48
|
+
<!-- Row 1 -->
|
|
49
|
+
<g transform="translate(0, 55)">
|
|
50
|
+
<text x="20" y="22" fill="#d1d5db" font-family="system-ui,sans-serif" font-size="13">Routing Accuracy</text>
|
|
51
|
+
<g transform="translate(500)">
|
|
52
|
+
<rect x="0" y="5" width="80" height="28" rx="14" fill="url(#a3mGrad)" filter="url(#cellGlow)"/>
|
|
53
|
+
<text x="40" y="25" text-anchor="middle" fill="#fff" font-family="system-ui,sans-serif" font-size="12" font-weight="600">100%</text>
|
|
54
|
+
</g>
|
|
55
|
+
<text x="620" y="25" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="12">~85%</text>
|
|
56
|
+
</g>
|
|
57
|
+
|
|
58
|
+
<!-- Row 2 -->
|
|
59
|
+
<g transform="translate(0, 100)">
|
|
60
|
+
<text x="20" y="22" fill="#d1d5db" font-family="system-ui,sans-serif" font-size="13">Cost Savings</text>
|
|
61
|
+
<g transform="translate(500)">
|
|
62
|
+
<rect x="0" y="5" width="80" height="28" rx="14" fill="url(#a3mGrad)" filter="url(#cellGlow)"/>
|
|
63
|
+
<text x="40" y="25" text-anchor="middle" fill="#fff" font-family="system-ui,sans-serif" font-size="12" font-weight="600">62%</text>
|
|
64
|
+
</g>
|
|
65
|
+
<text x="620" y="25" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="12">None</text>
|
|
66
|
+
</g>
|
|
67
|
+
|
|
68
|
+
<!-- Row 3 -->
|
|
69
|
+
<g transform="translate(0, 145)">
|
|
70
|
+
<text x="20" y="22" fill="#d1d5db" font-family="system-ui,sans-serif" font-size="13">Zero ML / No GPU</text>
|
|
71
|
+
<g transform="translate(500)">
|
|
72
|
+
<rect x="0" y="5" width="80" height="28" rx="14" fill="url(#a3mGrad)" filter="url(#cellGlow)"/>
|
|
73
|
+
<text x="40" y="25" text-anchor="middle" fill="#fff" font-family="system-ui,sans-serif" font-size="12" font-weight="600">✓</text>
|
|
74
|
+
</g>
|
|
75
|
+
<text x="620" y="25" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="12">✗</text>
|
|
76
|
+
</g>
|
|
77
|
+
|
|
78
|
+
<!-- Row 4 -->
|
|
79
|
+
<g transform="translate(0, 190)">
|
|
80
|
+
<text x="20" y="22" fill="#d1d5db" font-family="system-ui,sans-serif" font-size="13">Provider Failover</text>
|
|
81
|
+
<g transform="translate(500)">
|
|
82
|
+
<rect x="0" y="5" width="80" height="28" rx="14" fill="url(#a3mGrad)" filter="url(#cellGlow)"/>
|
|
83
|
+
<text x="40" y="25" text-anchor="middle" fill="#fff" font-family="system-ui,sans-serif" font-size="12" font-weight="600">Auto</text>
|
|
84
|
+
</g>
|
|
85
|
+
<text x="620" y="25" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="12">Manual</text>
|
|
86
|
+
</g>
|
|
87
|
+
|
|
88
|
+
<!-- Row 5 -->
|
|
89
|
+
<g transform="translate(0, 235)">
|
|
90
|
+
<text x="20" y="22" fill="#d1d5db" font-family="system-ui,sans-serif" font-size="13">Budget Enforcement</text>
|
|
91
|
+
<g transform="translate(500)">
|
|
92
|
+
<rect x="0" y="5" width="80" height="28" rx="14" fill="url(#a3mGrad)" filter="url(#cellGlow)"/>
|
|
93
|
+
<text x="40" y="25" text-anchor="middle" fill="#fff" font-family="system-ui,sans-serif" font-size="12" font-weight="600">Hard</text>
|
|
94
|
+
</g>
|
|
95
|
+
<text x="620" y="25" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="12">Soft</text>
|
|
96
|
+
</g>
|
|
97
|
+
|
|
98
|
+
<!-- Row 6 -->
|
|
99
|
+
<g transform="translate(0, 280)">
|
|
100
|
+
<text x="20" y="22" fill="#d1d5db" font-family="system-ui,sans-serif" font-size="13">Chinese Providers</text>
|
|
101
|
+
<g transform="translate(500)">
|
|
102
|
+
<rect x="0" y="5" width="80" height="28" rx="14" fill="url(#a3mGrad)" filter="url(#cellGlow)"/>
|
|
103
|
+
<text x="40" y="25" text-anchor="middle" fill="#fff" font-family="system-ui,sans-serif" font-size="12" font-weight="600">47+</text>
|
|
104
|
+
</g>
|
|
105
|
+
<text x="620" y="25" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="12">5-10</text>
|
|
106
|
+
</g>
|
|
107
|
+
</g>
|
|
108
|
+
|
|
109
|
+
<!-- Bottom metrics row -->
|
|
110
|
+
<g transform="translate(80, 420)">
|
|
111
|
+
<g transform="translate(0, 0)">
|
|
112
|
+
<rect x="0" y="0" width="145" height="60" rx="10" fill="#10b981" fill-opacity="0.1" stroke="#10b981" stroke-width="1"/>
|
|
113
|
+
<text x="72" y="28" text-anchor="middle" fill="#10b981" font-family="system-ui,sans-serif" font-size="22" font-weight="800">100%</text>
|
|
114
|
+
<text x="72" y="48" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="11">Routing Accuracy</text>
|
|
115
|
+
</g>
|
|
116
|
+
<g transform="translate(165, 0)">
|
|
117
|
+
<rect x="0" y="0" width="145" height="60" rx="10" fill="#06b6d4" fill-opacity="0.1" stroke="#06b6d4" stroke-width="1"/>
|
|
118
|
+
<text x="72" y="28" text-anchor="middle" fill="#06b6d4" font-family="system-ui,sans-serif" font-size="22" font-weight="800">19.5KB</text>
|
|
119
|
+
<text x="72" y="48" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="11">Package Size</text>
|
|
120
|
+
</g>
|
|
121
|
+
<g transform="translate(330, 0)">
|
|
122
|
+
<rect x="0" y="0" width="145" height="60" rx="10" fill="#8b5cf6" fill-opacity="0.1" stroke="#8b5cf6" stroke-width="1"/>
|
|
123
|
+
<text x="72" y="28" text-anchor="middle" fill="#8b5cf6" font-family="system-ui,sans-serif" font-size="22" font-weight="800"><100ms</text>
|
|
124
|
+
<text x="72" y="48" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="11">Startup Time</text>
|
|
125
|
+
</g>
|
|
126
|
+
<g transform="translate(495, 0)">
|
|
127
|
+
<rect x="0" y="0" width="145" height="60" rx="10" fill="#f472b6" fill-opacity="0.1" stroke="#f472b6" stroke-width="1"/>
|
|
128
|
+
<text x="72" y="28" text-anchor="middle" fill="#f472b6" font-family="system-ui,sans-serif" font-size="22" font-weight="800">MIT</text>
|
|
129
|
+
<text x="72" y="48" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="11">License</text>
|
|
130
|
+
</g>
|
|
131
|
+
</g>
|
|
132
|
+
</svg>
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 900 550" width="900" height="550">
|
|
2
|
+
<defs>
|
|
3
|
+
<!-- Background gradient -->
|
|
4
|
+
<linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
5
|
+
<stop offset="0%" stop-color="#0a0a0f"/>
|
|
6
|
+
<stop offset="50%" stop-color="#0f0f1a"/>
|
|
7
|
+
<stop offset="100%" stop-color="#1a1a2e"/>
|
|
8
|
+
</linearGradient>
|
|
9
|
+
|
|
10
|
+
<!-- Header gradient -->
|
|
11
|
+
<linearGradient id="headerGrad" x1="0%" y1="0%" x2="100%" y2="0%">
|
|
12
|
+
<stop offset="0%" stop-color="#6366f1"/>
|
|
13
|
+
<stop offset="50%" stop-color="#8b5cf6"/>
|
|
14
|
+
<stop offset="100%" stop-color="#06b6d4"/>
|
|
15
|
+
</linearGradient>
|
|
16
|
+
|
|
17
|
+
<!-- Success badge gradient -->
|
|
18
|
+
<linearGradient id="successGrad" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
19
|
+
<stop offset="0%" stop-color="#10b981">
|
|
20
|
+
<animate attributeName="stop-color" values="#10b981;#34d399;#10b981" dur="2s" repeatCount="indefinite"/>
|
|
21
|
+
</stop>
|
|
22
|
+
<stop offset="100%" stop-color="#059669"/>
|
|
23
|
+
</linearGradient>
|
|
24
|
+
|
|
25
|
+
<!-- Warning gradient -->
|
|
26
|
+
<linearGradient id="warnGrad" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
27
|
+
<stop offset="0%" stop-color="#f59e0b"/>
|
|
28
|
+
<stop offset="100%" stop-color="#d97706"/>
|
|
29
|
+
</linearGradient>
|
|
30
|
+
|
|
31
|
+
<!-- Glow filter -->
|
|
32
|
+
<filter id="glow" x="-50%" y="-50%" width="200%" height="200%">
|
|
33
|
+
<feGaussianBlur stdDeviation="4" result="blur"/>
|
|
34
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
35
|
+
</filter>
|
|
36
|
+
|
|
37
|
+
<!-- Intense glow -->
|
|
38
|
+
<filter id="glowIntense" x="-100%" y="-100%" width="300%" height="300%">
|
|
39
|
+
<feGaussianBlur stdDeviation="6" result="blur"/>
|
|
40
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
41
|
+
</filter>
|
|
42
|
+
|
|
43
|
+
<!-- Grid pattern -->
|
|
44
|
+
<pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse">
|
|
45
|
+
<path d="M 40 0 L 0 0 0 40" fill="none" stroke="#ffffff" stroke-width="0.5" opacity="0.03"/>
|
|
46
|
+
</pattern>
|
|
47
|
+
</defs>
|
|
48
|
+
|
|
49
|
+
<style>
|
|
50
|
+
@keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
|
|
51
|
+
@keyframes slideIn { from { opacity: 0; transform: translateX(-20px); } to { opacity: 1; transform: translateX(0); } }
|
|
52
|
+
@keyframes pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.05); } }
|
|
53
|
+
@keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } }
|
|
54
|
+
.header { animation: fadeIn 0.5s ease-out; }
|
|
55
|
+
.row { animation: fadeIn 0.4s ease-out; animation-fill-mode: both; }
|
|
56
|
+
.row:nth-child(1) { animation-delay: 0.1s; }
|
|
57
|
+
.row:nth-child(2) { animation-delay: 0.15s; }
|
|
58
|
+
.row:nth-child(3) { animation-delay: 0.2s; }
|
|
59
|
+
.row:nth-child(4) { animation-delay: 0.25s; }
|
|
60
|
+
.row:nth-child(5) { animation-delay: 0.3s; }
|
|
61
|
+
.row:nth-child(6) { animation-delay: 0.35s; }
|
|
62
|
+
.row:nth-child(7) { animation-delay: 0.4s; }
|
|
63
|
+
.check { animation: pulse 2s ease-in-out infinite; }
|
|
64
|
+
.metric { animation: fadeIn 0.6s ease-out; animation-fill-mode: both; }
|
|
65
|
+
.metric:nth-child(1) { animation-delay: 0.5s; }
|
|
66
|
+
.metric:nth-child(2) { animation-delay: 0.6s; }
|
|
67
|
+
.metric:nth-child(3) { animation-delay: 0.7s; }
|
|
68
|
+
.metric:nth-child(4) { animation-delay: 0.8s; }
|
|
69
|
+
</style>
|
|
70
|
+
|
|
71
|
+
<!-- Background -->
|
|
72
|
+
<rect width="900" height="550" fill="url(#bg)"/>
|
|
73
|
+
<rect width="900" height="550" fill="url(#grid)"/>
|
|
74
|
+
|
|
75
|
+
<!-- Ambient glow -->
|
|
76
|
+
<ellipse cx="450" cy="275" rx="400" ry="250" fill="#6366f1" opacity="0.04" filter="url(#glow)"/>
|
|
77
|
+
|
|
78
|
+
<!-- Header -->
|
|
79
|
+
<g class="header">
|
|
80
|
+
<text x="450" y="42" text-anchor="middle" fill="#ffffff" font-family="system-ui,-apple-system,sans-serif" font-size="26" font-weight="700">
|
|
81
|
+
A3M Router Capabilities
|
|
82
|
+
</text>
|
|
83
|
+
<text x="450" y="65" text-anchor="middle" fill="#8888aa" font-family="system-ui,sans-serif" font-size="13">
|
|
84
|
+
Production-ready features • Open-source LLM gateway
|
|
85
|
+
</text>
|
|
86
|
+
</g>
|
|
87
|
+
|
|
88
|
+
<!-- Comparison Table -->
|
|
89
|
+
<g transform="translate(80, 100)">
|
|
90
|
+
<!-- Table Header -->
|
|
91
|
+
<rect x="0" y="0" width="740" height="45" rx="8" fill="url(#headerGrad)" fill-opacity="0.15"/>
|
|
92
|
+
<text x="200" y="28" text-anchor="middle" fill="#ffffff" font-family="system-ui,sans-serif" font-size="14" font-weight="700">Feature</text>
|
|
93
|
+
<text x="450" y="28" text-anchor="middle" fill="#10b981" font-family="system-ui,sans-serif" font-size="14" font-weight="700">A3M Router</text>
|
|
94
|
+
<text x="650" y="28" text-anchor="middle" fill="#8888aa" font-family="system-ui,sans-serif" font-size="14" font-weight="700">Others</text>
|
|
95
|
+
|
|
96
|
+
<!-- Row 1 -->
|
|
97
|
+
<g class="row" transform="translate(0, 55)">
|
|
98
|
+
<rect x="0" y="0" width="740" height="50" rx="6" fill="#ffffff" fill-opacity="0.02"/>
|
|
99
|
+
<text x="30" y="30" fill="#ccccdd" font-family="system-ui,sans-serif" font-size="14">Routing Accuracy</text>
|
|
100
|
+
<g transform="translate(350)">
|
|
101
|
+
<rect x="0" y="8" width="90" height="32" rx="16" fill="url(#successGrad)" filter="url(#glow)"/>
|
|
102
|
+
<text x="45" y="30" text-anchor="middle" fill="#ffffff" font-family="system-ui,sans-serif" font-size="14" font-weight="700">100%</text>
|
|
103
|
+
</g>
|
|
104
|
+
<text x="650" y="30" text-anchor="middle" fill="#666688" font-family="system-ui,sans-serif" font-size="14">~85%</text>
|
|
105
|
+
<!-- Checkmark -->
|
|
106
|
+
<g transform="translate(290, 12)" class="check">
|
|
107
|
+
<circle cx="12" cy="12" r="14" fill="#10b981" fill-opacity="0.2"/>
|
|
108
|
+
<path d="M6,12 L10,16 L18,8" stroke="#10b981" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
|
|
109
|
+
</g>
|
|
110
|
+
</g>
|
|
111
|
+
|
|
112
|
+
<!-- Row 2 -->
|
|
113
|
+
<g class="row" transform="translate(0, 110)">
|
|
114
|
+
<rect x="0" y="0" width="740" height="50" rx="6" fill="#ffffff" fill-opacity="0.02"/>
|
|
115
|
+
<text x="30" y="30" fill="#ccccdd" font-family="system-ui,sans-serif" font-size="14">Cost Savings</text>
|
|
116
|
+
<g transform="translate(350)">
|
|
117
|
+
<rect x="0" y="8" width="80" height="32" rx="16" fill="url(#successGrad)" filter="url(#glow)"/>
|
|
118
|
+
<text x="40" y="30" text-anchor="middle" fill="#ffffff" font-family="system-ui,sans-serif" font-size="14" font-weight="700">62%</text>
|
|
119
|
+
</g>
|
|
120
|
+
<text x="650" y="30" text-anchor="middle" fill="#666688" font-family="system-ui,sans-serif" font-size="14">None</text>
|
|
121
|
+
<g transform="translate(290, 12)" class="check">
|
|
122
|
+
<circle cx="12" cy="12" r="14" fill="#10b981" fill-opacity="0.2"/>
|
|
123
|
+
<path d="M6,12 L10,16 L18,8" stroke="#10b981" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
|
|
124
|
+
</g>
|
|
125
|
+
</g>
|
|
126
|
+
|
|
127
|
+
<!-- Row 3 -->
|
|
128
|
+
<g class="row" transform="translate(0, 165)">
|
|
129
|
+
<rect x="0" y="0" width="740" height="50" rx="6" fill="#ffffff" fill-opacity="0.02"/>
|
|
130
|
+
<text x="30" y="30" fill="#ccccdd" font-family="system-ui,sans-serif" font-size="14">Zero ML / No GPU Required</text>
|
|
131
|
+
<g transform="translate(350)">
|
|
132
|
+
<rect x="0" y="8" width="70" height="32" rx="16" fill="url(#successGrad)" filter="url(#glow)"/>
|
|
133
|
+
<text x="35" y="30" text-anchor="middle" fill="#ffffff" font-family="system-ui,sans-serif" font-size="14" font-weight="700">✓</text>
|
|
134
|
+
</g>
|
|
135
|
+
<text x="650" y="30" text-anchor="middle" fill="#f59e0b" font-family="system-ui,sans-serif" font-size="14">✗</text>
|
|
136
|
+
<g transform="translate(290, 12)" class="check">
|
|
137
|
+
<circle cx="12" cy="12" r="14" fill="#10b981" fill-opacity="0.2"/>
|
|
138
|
+
<path d="M6,12 L10,16 L18,8" stroke="#10b981" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
|
|
139
|
+
</g>
|
|
140
|
+
</g>
|
|
141
|
+
|
|
142
|
+
<!-- Row 4 -->
|
|
143
|
+
<g class="row" transform="translate(0, 220)">
|
|
144
|
+
<rect x="0" y="0" width="740" height="50" rx="6" fill="#ffffff" fill-opacity="0.02"/>
|
|
145
|
+
<text x="30" y="30" fill="#ccccdd" font-family="system-ui,sans-serif" font-size="14">Automatic Provider Failover</text>
|
|
146
|
+
<g transform="translate(350)">
|
|
147
|
+
<rect x="0" y="8" width="70" height="32" rx="16" fill="url(#successGrad)" filter="url(#glow)"/>
|
|
148
|
+
<text x="35" y="30" text-anchor="middle" fill="#ffffff" font-family="system-ui,sans-serif" font-size="14" font-weight="700">Auto</text>
|
|
149
|
+
</g>
|
|
150
|
+
<text x="650" y="30" text-anchor="middle" fill="#666688" font-family="system-ui,sans-serif" font-size="14">Manual</text>
|
|
151
|
+
<g transform="translate(290, 12)" class="check">
|
|
152
|
+
<circle cx="12" cy="12" r="14" fill="#10b981" fill-opacity="0.2"/>
|
|
153
|
+
<path d="M6,12 L10,16 L18,8" stroke="#10b981" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
|
|
154
|
+
</g>
|
|
155
|
+
</g>
|
|
156
|
+
|
|
157
|
+
<!-- Row 5 -->
|
|
158
|
+
<g class="row" transform="translate(0, 275)">
|
|
159
|
+
<rect x="0" y="0" width="740" height="50" rx="6" fill="#ffffff" fill-opacity="0.02"/>
|
|
160
|
+
<text x="30" y="30" fill="#ccccdd" font-family="system-ui,sans-serif" font-size="14">Hard Budget Enforcement</text>
|
|
161
|
+
<g transform="translate(350)">
|
|
162
|
+
<rect x="0" y="8" width="70" height="32" rx="16" fill="url(#successGrad)" filter="url(#glow)"/>
|
|
163
|
+
<text x="35" y="30" text-anchor="middle" fill="#ffffff" font-family="system-ui,sans-serif" font-size="14" font-weight="700">✓</text>
|
|
164
|
+
</g>
|
|
165
|
+
<text x="650" y="30" text-anchor="middle" fill="#666688" font-family="system-ui,sans-serif" font-size="14">Soft</text>
|
|
166
|
+
<g transform="translate(290, 12)" class="check">
|
|
167
|
+
<circle cx="12" cy="12" r="14" fill="#10b981" fill-opacity="0.2"/>
|
|
168
|
+
<path d="M6,12 L10,16 L18,8" stroke="#10b981" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
|
|
169
|
+
</g>
|
|
170
|
+
</g>
|
|
171
|
+
|
|
172
|
+
<!-- Row 6 -->
|
|
173
|
+
<g class="row" transform="translate(0, 330)">
|
|
174
|
+
<rect x="0" y="0" width="740" height="50" rx="6" fill="#ffffff" fill-opacity="0.02"/>
|
|
175
|
+
<text x="30" y="30" fill="#ccccdd" font-family="system-ui,sans-serif" font-size="14">Chinese Providers (Kimi, DeepSeek, Qwen)</text>
|
|
176
|
+
<g transform="translate(350)">
|
|
177
|
+
<rect x="0" y="8" width="70" height="32" rx="16" fill="url(#successGrad)" filter="url(#glow)"/>
|
|
178
|
+
<text x="35" y="30" text-anchor="middle" fill="#ffffff" font-family="system-ui,sans-serif" font-size="14" font-weight="700">47+</text>
|
|
179
|
+
</g>
|
|
180
|
+
<text x="650" y="30" text-anchor="middle" fill="#666688" font-family="system-ui,sans-serif" font-size="14">5-10</text>
|
|
181
|
+
<g transform="translate(290, 12)" class="check">
|
|
182
|
+
<circle cx="12" cy="12" r="14" fill="#10b981" fill-opacity="0.2"/>
|
|
183
|
+
<path d="M6,12 L10,16 L18,8" stroke="#10b981" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
|
|
184
|
+
</g>
|
|
185
|
+
</g>
|
|
186
|
+
</g>
|
|
187
|
+
|
|
188
|
+
<!-- Bottom metrics row -->
|
|
189
|
+
<g transform="translate(80, 490)">
|
|
190
|
+
<g class="metric">
|
|
191
|
+
<rect x="0" y="0" width="155" height="50" rx="10" fill="#10b981" fill-opacity="0.1" stroke="#10b981" stroke-width="1" filter="url(#glow)"/>
|
|
192
|
+
<text x="77" y="28" text-anchor="middle" fill="#10b981" font-family="system-ui,sans-serif" font-size="22" font-weight="800">100%</text>
|
|
193
|
+
<text x="77" y="44" text-anchor="middle" fill="#8888aa" font-family="system-ui,sans-serif" font-size="11">Accuracy</text>
|
|
194
|
+
</g>
|
|
195
|
+
<g class="metric">
|
|
196
|
+
<rect x="175" y="0" width="155" height="50" rx="10" fill="#06b6d4" fill-opacity="0.1" stroke="#06b6d4" stroke-width="1" filter="url(#glow)"/>
|
|
197
|
+
<text x="252" y="28" text-anchor="middle" fill="#06b6d4" font-family="system-ui,sans-serif" font-size="22" font-weight="800">19.5KB</text>
|
|
198
|
+
<text x="252" y="44" text-anchor="middle" fill="#8888aa" font-family="system-ui,sans-serif" font-size="11">Package Size</text>
|
|
199
|
+
</g>
|
|
200
|
+
<g class="metric">
|
|
201
|
+
<rect x="350" y="0" width="155" height="50" rx="10" fill="#8b5cf6" fill-opacity="0.1" stroke="#8b5cf6" stroke-width="1" filter="url(#glow)"/>
|
|
202
|
+
<text x="427" y="28" text-anchor="middle" fill="#8b5cf6" font-family="system-ui,sans-serif" font-size="22" font-weight="800"><100ms</text>
|
|
203
|
+
<text x="427" y="44" text-anchor="middle" fill="#8888aa" font-family="system-ui,sans-serif" font-size="11">Startup Time</text>
|
|
204
|
+
</g>
|
|
205
|
+
<g class="metric">
|
|
206
|
+
<rect x="525" y="0" width="155" height="50" rx="10" fill="#f472b6" fill-opacity="0.1" stroke="#f472b6" stroke-width="1" filter="url(#glow)"/>
|
|
207
|
+
<text x="602" y="28" text-anchor="middle" fill="#f472b6" font-family="system-ui,sans-serif" font-size="22" font-weight="800">MIT</text>
|
|
208
|
+
<text x="602" y="44" text-anchor="middle" fill="#8888aa" font-family="system-ui,sans-serif" font-size="11">License</text>
|
|
209
|
+
</g>
|
|
210
|
+
</g>
|
|
211
|
+
</svg>
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 400" width="800" height="400">
|
|
2
|
+
<defs>
|
|
3
|
+
<!-- Gradients -->
|
|
4
|
+
<linearGradient id="bgGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
5
|
+
<stop offset="0%" stop-color="#0a0f1c"/>
|
|
6
|
+
<stop offset="100%" stop-color="#111827"/>
|
|
7
|
+
</linearGradient>
|
|
8
|
+
<linearGradient id="lineGrad" x1="0%" y1="0%" x2="100%" y2="0%">
|
|
9
|
+
<stop offset="0%" stop-color="#6366f1"/>
|
|
10
|
+
<stop offset="33%" stop-color="#8b5cf6"/>
|
|
11
|
+
<stop offset="66%" stop-color="#06b6d4"/>
|
|
12
|
+
<stop offset="100%" stop-color="#10b981"/>
|
|
13
|
+
</linearGradient>
|
|
14
|
+
<linearGradient id="areaGrad" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
15
|
+
<stop offset="0%" stop-color="#6366f1" stop-opacity="0.35"/>
|
|
16
|
+
<stop offset="50%" stop-color="#8b5cf6" stop-opacity="0.15"/>
|
|
17
|
+
<stop offset="100%" stop-color="#06b6d4" stop-opacity="0"/>
|
|
18
|
+
</linearGradient>
|
|
19
|
+
<linearGradient id="glowGrad" x1="0%" y1="0%" x2="100%" y2="0%">
|
|
20
|
+
<stop offset="0%" stop-color="#6366f1" stop-opacity="0.4"/>
|
|
21
|
+
<stop offset="100%" stop-color="#06b6d4" stop-opacity="0.1"/>
|
|
22
|
+
</linearGradient>
|
|
23
|
+
|
|
24
|
+
<!-- Filters -->
|
|
25
|
+
<filter id="softGlow" x="-50%" y="-50%" width="200%" height="200%">
|
|
26
|
+
<feGaussianBlur stdDeviation="4" result="blur"/>
|
|
27
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
28
|
+
</filter>
|
|
29
|
+
<filter id="lineGlow" x="-20%" y="-20%" width="140%" height="140%">
|
|
30
|
+
<feGaussianBlur stdDeviation="2" result="blur"/>
|
|
31
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
32
|
+
</filter>
|
|
33
|
+
|
|
34
|
+
<!-- Grid pattern -->
|
|
35
|
+
<pattern id="gridPattern" width="40" height="40" patternUnits="userSpaceOnUse">
|
|
36
|
+
<path d="M 40 0 L 0 0 0 40" fill="none" stroke="#1f2937" stroke-width="0.5" opacity="0.5"/>
|
|
37
|
+
</pattern>
|
|
38
|
+
</defs>
|
|
39
|
+
|
|
40
|
+
<!-- Background -->
|
|
41
|
+
<rect width="800" height="400" fill="url(#bgGrad)"/>
|
|
42
|
+
<rect width="800" height="400" fill="url(#gridPattern)"/>
|
|
43
|
+
|
|
44
|
+
<!-- Header -->
|
|
45
|
+
<text x="400" y="38" text-anchor="middle" fill="#f9fafb" font-family="system-ui,-apple-system,sans-serif" font-size="22" font-weight="700" letter-spacing="-0.5">Downloads Growth</text>
|
|
46
|
+
<text x="400" y="60" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="13">Last 4 weeks trajectory</text>
|
|
47
|
+
|
|
48
|
+
<!-- Chart area: x=80..750, y=90..330 -->
|
|
49
|
+
|
|
50
|
+
<!-- Y-axis labels -->
|
|
51
|
+
<g fill="#6b7280" font-family="system-ui,sans-serif" font-size="12" text-anchor="end">
|
|
52
|
+
<text x="65" y="330">0</text>
|
|
53
|
+
<text x="65" y="265">500</text>
|
|
54
|
+
<text x="65" y="200">1K</text>
|
|
55
|
+
<text x="65" y="135">1.5K</text>
|
|
56
|
+
<text x="65" y="100">2K</text>
|
|
57
|
+
</g>
|
|
58
|
+
|
|
59
|
+
<!-- Y-axis grid lines -->
|
|
60
|
+
<g stroke="#1f2937" stroke-width="1" stroke-dasharray="3,3">
|
|
61
|
+
<line x1="80" y1="330" x2="750" y2="330"/>
|
|
62
|
+
<line x1="80" y1="265" x2="750" y2="265"/>
|
|
63
|
+
<line x1="80" y1="200" x2="750" y2="200"/>
|
|
64
|
+
<line x1="80" y1="135" x2="750" y2="135"/>
|
|
65
|
+
<line x1="80" y1="100" x2="750" y2="100"/>
|
|
66
|
+
</g>
|
|
67
|
+
|
|
68
|
+
<!-- Axes -->
|
|
69
|
+
<line x1="80" y1="330" x2="750" y2="330" stroke="#374151" stroke-width="2"/>
|
|
70
|
+
<line x1="80" y1="100" x2="80" y2="330" stroke="#374151" stroke-width="2"/>
|
|
71
|
+
|
|
72
|
+
<!-- Area fill -->
|
|
73
|
+
<path d="M80,310 Q130,308 180,295 T280,260 T380,210 T480,155 T580,115 T680,95 T750,88 L750,330 L80,330 Z" fill="url(#areaGrad)"/>
|
|
74
|
+
|
|
75
|
+
<!-- Glow line behind -->
|
|
76
|
+
<path d="M80,310 Q130,308 180,295 T280,260 T380,210 T480,155 T580,115 T680,95 T750,88"
|
|
77
|
+
stroke="url(#lineGrad)" stroke-width="8" fill="none" stroke-linecap="round" opacity="0.3" filter="url(#lineGlow)"/>
|
|
78
|
+
|
|
79
|
+
<!-- Main line -->
|
|
80
|
+
<path d="M80,310 Q130,308 180,295 T280,260 T380,210 T480,155 T580,115 T680,95 T750,88"
|
|
81
|
+
stroke="url(#lineGrad)" stroke-width="3" fill="none" stroke-linecap="round" filter="url(#softGlow)"/>
|
|
82
|
+
|
|
83
|
+
<!-- Data points with glow -->
|
|
84
|
+
<g filter="url(#softGlow)">
|
|
85
|
+
<circle cx="80" cy="310" r="6" fill="#6366f1"/>
|
|
86
|
+
<circle cx="180" cy="295" r="6" fill="#8b5cf6"/>
|
|
87
|
+
<circle cx="280" cy="260" r="6" fill="#8b5cf6"/>
|
|
88
|
+
<circle cx="380" cy="210" r="6" fill="#06b6d4"/>
|
|
89
|
+
<circle cx="480" cy="155" r="6" fill="#06b6d4"/>
|
|
90
|
+
<circle cx="580" cy="115" r="6" fill="#10b981"/>
|
|
91
|
+
<circle cx="680" cy="95" r="6" fill="#10b981"/>
|
|
92
|
+
<circle cx="750" cy="88" r="8" fill="#10b981"/>
|
|
93
|
+
</g>
|
|
94
|
+
|
|
95
|
+
<!-- Inner dots -->
|
|
96
|
+
<g>
|
|
97
|
+
<circle cx="80" cy="310" r="2.5" fill="#fff"/>
|
|
98
|
+
<circle cx="180" cy="295" r="2.5" fill="#fff"/>
|
|
99
|
+
<circle cx="280" cy="260" r="2.5" fill="#fff"/>
|
|
100
|
+
<circle cx="380" cy="210" r="2.5" fill="#fff"/>
|
|
101
|
+
<circle cx="480" cy="155" r="2.5" fill="#fff"/>
|
|
102
|
+
<circle cx="580" cy="115" r="2.5" fill="#fff"/>
|
|
103
|
+
<circle cx="680" cy="95" r="2.5" fill="#fff"/>
|
|
104
|
+
<circle cx="750" cy="88" r="3" fill="#fff"/>
|
|
105
|
+
</g>
|
|
106
|
+
|
|
107
|
+
<!-- X-axis labels -->
|
|
108
|
+
<g fill="#6b7280" font-family="system-ui,sans-serif" font-size="12" text-anchor="middle">
|
|
109
|
+
<text x="80" y="355">Week 0</text>
|
|
110
|
+
<text x="280" y="355">Week 1</text>
|
|
111
|
+
<text x="480" y="355">Week 2</text>
|
|
112
|
+
<text x="680" y="355">Week 3</text>
|
|
113
|
+
<text x="750" y="355">Now</text>
|
|
114
|
+
</g>
|
|
115
|
+
|
|
116
|
+
<!-- Stat card -->
|
|
117
|
+
<g transform="translate(580, 55)">
|
|
118
|
+
<rect x="0" y="0" width="160" height="55" rx="10" fill="#10b981" fill-opacity="0.15" stroke="#10b981" stroke-width="1"/>
|
|
119
|
+
<text x="80" y="25" text-anchor="middle" fill="#10b981" font-family="system-ui,sans-serif" font-size="22" font-weight="800">+149%</text>
|
|
120
|
+
<text x="80" y="45" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="12">growth in 4 weeks</text>
|
|
121
|
+
</g>
|
|
122
|
+
</svg>
|