🎨 docs: replace features SVG with new PNG (imagejustapi)

swadhinbiswas committed 2 months ago
e568aae
1 parent 5a3085e
commit e568aae
3 files changed
+1 -142
β–ΌREADME.md
+1-1
153
153
## Feature highlights
154
154
155
155
<p align="center">
156
- <img src="assets/justapi-features.svg" alt="Feature matrix" width="100%">
156
+ <img src="assets/justapi-features.png" alt="Feature matrix" width="100%">
157
157
</p>
158
158
159
159
<table>
160
160
β–Όassets/justapi-features.png
+0-0
Binary file not shown.
β–Όassets/justapi-features.svg
+0-141
1
-<svg width="1200" height="560" viewBox="0 0 1200 560" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <defs>
3
- <linearGradient id="bg4" x1="0" y1="0" x2="1200" y2="560" gradientUnits="userSpaceOnUse">
4
- <stop stop-color="#0b0e1a"/>
5
- <stop offset="1" stop-color="#111631"/>
6
- </linearGradient>
7
- <radialGradient id="core" cx="0.5" cy="0.5" r="0.5">
8
- <stop offset="0" stop-color="#e6522c" stop-opacity="0.3"/>
9
- <stop offset="1" stop-color="#e6522c" stop-opacity="0"/>
10
- </radialGradient>
11
- </defs>
12
-
13
- <rect width="1200" height="560" fill="url(#bg4)"/>
14
- <circle cx="600" cy="270" r="260" fill="url(#core)">
15
- <animate attributeName="r" values="240;270;240" dur="6s" repeatCount="indefinite"/>
16
- </circle>
17
-
18
- <!-- center -->
19
- <text x="600" y="255" text-anchor="middle" font-family="'Segoe UI', Arial, sans-serif" font-size="34" font-weight="900" fill="#e6522c" letter-spacing="2">JUSTAPI</text>
20
- <text x="600" y="285" text-anchor="middle" font-family="'Segoe UI', Arial, sans-serif" font-size="13" fill="#94a3b8">Rust core Β· Python surface</text>
21
-
22
- <!-- feature nodes: (cx, cy, icon, title, sub) -->
23
- <!-- 12 nodes in 3 rings of 4 -->
24
- <g font-family="'Segoe UI', Arial, sans-serif">
25
- <!-- ring A: performance -->
26
- <g>
27
- <circle cx="600" cy="70" r="34" fill="#1e293b" stroke="#f5a524" stroke-width="2"/>
28
- <text x="600" y="66" text-anchor="middle" font-size="20">⚑</text>
29
- <text x="600" y="86" text-anchor="middle" font-size="11" fill="#f5a524" font-weight="700">766k req/s</text>
30
- <circle cx="600" cy="70" r="3" fill="#f5a524">
31
- <animate attributeName="opacity" values="1;0.2;1" dur="1.6s" repeatCount="indefinite"/>
32
- </circle>
33
- <text x="600" y="125" text-anchor="middle" font-size="12" fill="#94a3b8">hello-world native</text>
34
- </g>
35
-
36
- <g>
37
- <circle cx="1130" cy="270" r="34" fill="#1e293b" stroke="#22d3ee" stroke-width="2"/>
38
- <text x="1130" y="266" text-anchor="middle" font-size="20">πŸ—„οΈ</text>
39
- <text x="1130" y="286" text-anchor="middle" font-size="11" fill="#22d3ee" font-weight="700">native DB awaits</text>
40
- <circle cx="1130" cy="270" r="3" fill="#22d3ee">
41
- <animate attributeName="opacity" values="1;0.2;1" dur="1.8s" repeatCount="indefinite"/>
42
- </circle>
43
- <text x="1130" y="325" text-anchor="middle" font-size="12" fill="#94a3b8">query_async Β· 53x</text>
44
- </g>
45
-
46
- <g>
47
- <circle cx="600" cy="470" r="34" fill="#1e293b" stroke="#8b5cf6" stroke-width="2"/>
48
- <text x="600" y="466" text-anchor="middle" font-size="20">🧠</text>
49
- <text x="600" y="486" text-anchor="middle" font-size="11" fill="#8b5cf6" font-weight="700">free-threaded</text>
50
- <circle cx="600" cy="470" r="3" fill="#8b5cf6">
51
- <animate attributeName="opacity" values="1;0.2;1" dur="2s" repeatCount="indefinite"/>
52
- </circle>
53
- <text x="600" y="525" text-anchor="middle" font-size="12" fill="#94a3b8">CPython 3.14t Β· 12.4x CPU</text>
54
- </g>
55
-
56
- <g>
57
- <circle cx="70" cy="270" r="34" fill="#1e293b" stroke="#e6522c" stroke-width="2"/>
58
- <text x="70" y="266" text-anchor="middle" font-size="20">πŸ”</text>
59
- <text x="70" y="286" text-anchor="middle" font-size="11" fill="#e6522c" font-weight="700">HTTP/3</text>
60
- <circle cx="70" cy="270" r="3" fill="#e6522c">
61
- <animate attributeName="opacity" values="1;0.2;1" dur="2.2s" repeatCount="indefinite"/>
62
- </circle>
63
- <text x="70" y="325" text-anchor="middle" font-size="12" fill="#94a3b8">QUIC, no one else ships it</text>
64
- </g>
65
-
66
- <!-- ring B: middle ring -->
67
- <g>
68
- <circle cx="850" cy="130" r="34" fill="#1e293b" stroke="#22d3ee" stroke-width="2"/>
69
- <text x="850" y="126" text-anchor="middle" font-size="20">πŸ“‘</text>
70
- <text x="850" y="146" text-anchor="middle" font-size="11" fill="#22d3ee" font-weight="700">native SSE</text>
71
- <circle cx="1130" cy="270" r="3" fill="#22d3ee">
72
- <animate attributeName="opacity" values="1;0.2;1" dur="1.9s" repeatCount="indefinite"/>
73
- </circle>
74
- <text x="850" y="185" text-anchor="middle" font-size="12" fill="#94a3b8">sse_native Β· 0 Python/event</text>
75
- </g>
76
-
77
- <g>
78
- <circle cx="350" cy="130" r="34" fill="#1e293b" stroke="#f5a524" stroke-width="2"/>
79
- <text x="350" y="126" text-anchor="middle" font-size="20">🧩</text>
80
- <text x="350" y="146" text-anchor="middle" font-size="11" fill="#f5a524" font-weight="700">native CRUD</text>
81
- <circle cx="600" cy="70" r="3" fill="#f5a524">
82
- <animate attributeName="opacity" values="1;0.2;1" dur="2.1s" repeatCount="indefinite"/>
83
- </circle>
84
- <text x="350" y="185" text-anchor="middle" font-size="12" fill="#94a3b8">181k SELECT Β· 125x FastAPI</text>
85
- </g>
86
-
87
- <g>
88
- <circle cx="350" cy="410" r="34" fill="#1e293b" stroke="#8b5cf6" stroke-width="2"/>
89
- <text x="350" y="406" text-anchor="middle" font-size="20">πŸš€</text>
90
- <text x="350" y="426" text-anchor="middle" font-size="11" fill="#8b5cf6" font-weight="700">multi-worker</text>
91
- <circle cx="600" cy="470" r="3" fill="#8b5cf6">
92
- <animate attributeName="opacity" values="1;0.2;1" dur="2.3s" repeatCount="indefinite"/>
93
- </circle>
94
- <text x="350" y="465" text-anchor="middle" font-size="12" fill="#94a3b8">--workers N Β· 1.88x @4</text>
95
- </g>
96
-
97
- <g>
98
- <circle cx="850" cy="410" r="34" fill="#1e293b" stroke="#e6522c" stroke-width="2"/>
99
- <text x="850" y="406" text-anchor="middle" font-size="20">πŸ“‹</text>
100
- <text x="850" y="426" text-anchor="middle" font-size="11" fill="#e6522c" font-weight="700">OpenAPI 3.1</text>
101
- <circle cx="70" cy="270" r="3" fill="#e6522c">
102
- <animate attributeName="opacity" values="1;0.2;1" dur="2.5s" repeatCount="indefinite"/>
103
- </circle>
104
- <text x="850" y="465" text-anchor="middle" font-size="12" fill="#94a3b8">Pydantic v2 bridge</text>
105
- </g>
106
-
107
- <!-- inner ring: security + observability -->
108
- <g>
109
- <circle cx="600" cy="190" r="26" fill="#111631" stroke="#22d3ee" stroke-width="1.5"/>
110
- <text x="600" y="188" text-anchor="middle" font-size="15">πŸ›‘οΈ</text>
111
- <text x="600" y="206" text-anchor="middle" font-size="9" fill="#22d3ee" font-weight="700">JWT Β· rate-limit Β· CORS</text>
112
- </g>
113
- <g>
114
- <circle cx="740" cy="270" r="26" fill="#111631" stroke="#f5a524" stroke-width="1.5"/>
115
- <text x="740" y="268" text-anchor="middle" font-size="15">πŸ“Š</text>
116
- <text x="740" y="286" text-anchor="middle" font-size="9" fill="#f5a524" font-weight="700">OTel Β· Prometheus</text>
117
- </g>
118
- <g>
119
- <circle cx="600" cy="350" r="26" fill="#111631" stroke="#8b5cf6" stroke-width="1.5"/>
120
- <text x="600" y="348" text-anchor="middle" font-size="15">πŸ”</text>
121
- <text x="600" y="366" text-anchor="middle" font-size="9" fill="#8b5cf6" font-weight="700">circuit breakers</text>
122
- </g>
123
- <g>
124
- <circle cx="460" cy="270" r="26" fill="#111631" stroke="#e6522c" stroke-width="1.5"/>
125
- <text x="460" y="268" text-anchor="middle" font-size="15">πŸ§ͺ</text>
126
- <text x="460" y="286" text-anchor="middle" font-size="9" fill="#e6522c" font-weight="700">mypy-clean stubs</text>
127
- </g>
128
-
129
- <!-- connecting lines -->
130
- <g stroke="#334155" stroke-width="1" opacity="0.6">
131
- <line x1="600" y1="104" x2="850" y2="130"/>
132
- <line x1="600" y1="104" x2="350" y2="130"/>
133
- <line x1="1130" y1="236" x2="850" y2="164"/>
134
- <line x1="70" y1="236" x2="350" y2="164"/>
135
- <line x1="600" y1="436" x2="850" y2="410"/>
136
- <line x1="600" y1="436" x2="350" y2="410"/>
137
- <line x1="1130" y1="304" x2="740" y2="296"/>
138
- <line x1="70" y1="304" x2="460" y2="296"/>
139
- </g>
140
- </g>
141
-</svg>
142
0