jsgui3-server 0.0.140 → 0.0.141

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.
Files changed (32) hide show
  1. package/.github/agents/jsgui3-server.agent.md +699 -0
  2. package/.github/instructions/copilot.instructions.md +180 -0
  3. package/.playwright-mcp/page-2025-11-29T23-39-18-629Z.png +0 -0
  4. package/.playwright-mcp/page-2025-11-29T23-39-31-903Z.png +0 -0
  5. package/.playwright-mcp/page-2025-11-30T00-33-56-265Z.png +0 -0
  6. package/.playwright-mcp/page-2025-11-30T00-34-06-619Z.png +0 -0
  7. package/docs/agent-development-guide.md +108 -4
  8. package/docs/api-reference.md +116 -0
  9. package/docs/controls-development.md +127 -0
  10. package/docs/css/luxuryObsidianCss.js +1203 -0
  11. package/docs/css/obsidian-scrollbars.css +370 -0
  12. package/docs/diagrams/jsgui3-stack.svg +568 -0
  13. package/docs/guides/JSGUI3_UI_ARCHITECTURE_GUIDE.md +2527 -0
  14. package/docs/guides/OBSIDIAN_LUXURY_DESIGN_GUIDE.md +847 -0
  15. package/docs/jsgui3-vs-express-comparison.svg +542 -0
  16. package/docs/jsgui3-vs-nestjs-comparison.svg +550 -0
  17. package/docs/publishers-guide.md +76 -0
  18. package/docs/troubleshooting.md +51 -0
  19. package/examples/controls/15) window, observable SSE/README.md +125 -0
  20. package/examples/controls/15) window, observable SSE/check.js +144 -0
  21. package/examples/controls/15) window, observable SSE/client.js +395 -0
  22. package/examples/controls/15) window, observable SSE/server.js +111 -0
  23. package/http/responders/static/Static_Route_HTTP_Responder.js +16 -16
  24. package/module.js +7 -0
  25. package/package.json +7 -6
  26. package/port-utils.js +112 -0
  27. package/serve-factory.js +27 -5
  28. package/tests/README.md +40 -26
  29. package/tests/examples-controls.e2e.test.js +164 -0
  30. package/tests/observable-sse.test.js +363 -0
  31. package/tests/port-utils.test.js +114 -0
  32. package/tests/test-runner.js +13 -12
@@ -0,0 +1,550 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1400 2200" width="1400" height="2200">
3
+ <defs>
4
+ <!-- Industrial Luxury Obsidian Gradients -->
5
+ <linearGradient id="obsidianBg" x1="0%" y1="0%" x2="100%" y2="100%">
6
+ <stop offset="0%" style="stop-color:#050508"/>
7
+ <stop offset="25%" style="stop-color:#0a0d14"/>
8
+ <stop offset="50%" style="stop-color:#0f1420"/>
9
+ <stop offset="75%" style="stop-color:#0a0d14"/>
10
+ <stop offset="100%" style="stop-color:#050508"/>
11
+ </linearGradient>
12
+
13
+ <linearGradient id="goldTitle" x1="0%" y1="0%" x2="100%" y2="0%">
14
+ <stop offset="0%" style="stop-color:#8b7500"/>
15
+ <stop offset="30%" style="stop-color:#ffd700"/>
16
+ <stop offset="50%" style="stop-color:#fffacd"/>
17
+ <stop offset="70%" style="stop-color:#ffd700"/>
18
+ <stop offset="100%" style="stop-color:#8b7500"/>
19
+ </linearGradient>
20
+
21
+ <linearGradient id="cardGradient" x1="0%" y1="0%" x2="0%" y2="100%">
22
+ <stop offset="0%" style="stop-color:#1a1f2e"/>
23
+ <stop offset="50%" style="stop-color:#141824"/>
24
+ <stop offset="100%" style="stop-color:#0f1420"/>
25
+ </linearGradient>
26
+
27
+ <linearGradient id="headerGradient" x1="0%" y1="0%" x2="100%" y2="0%">
28
+ <stop offset="0%" style="stop-color:#0f1420"/>
29
+ <stop offset="50%" style="stop-color:#1a1f2e"/>
30
+ <stop offset="100%" style="stop-color:#0f1420"/>
31
+ </linearGradient>
32
+
33
+ <linearGradient id="goldAccent" x1="0%" y1="0%" x2="100%" y2="0%">
34
+ <stop offset="0%" style="stop-color:transparent"/>
35
+ <stop offset="20%" style="stop-color:#8b7500"/>
36
+ <stop offset="50%" style="stop-color:#c9a227"/>
37
+ <stop offset="80%" style="stop-color:#8b7500"/>
38
+ <stop offset="100%" style="stop-color:transparent"/>
39
+ </linearGradient>
40
+
41
+ <linearGradient id="goldButton" x1="0%" y1="0%" x2="0%" y2="100%">
42
+ <stop offset="0%" style="stop-color:#c9a227"/>
43
+ <stop offset="100%" style="stop-color:#b8960f"/>
44
+ </linearGradient>
45
+
46
+ <!-- Filters for glow effects -->
47
+ <filter id="goldGlow" x="-50%" y="-50%" width="200%" height="200%">
48
+ <feGaussianBlur stdDeviation="3" result="blur"/>
49
+ <feMerge>
50
+ <feMergeNode in="blur"/>
51
+ <feMergeNode in="SourceGraphic"/>
52
+ </feMerge>
53
+ </filter>
54
+
55
+ <filter id="softShadow" x="-20%" y="-20%" width="140%" height="140%">
56
+ <feDropShadow dx="0" dy="4" stdDeviation="10" flood-color="#000000" flood-opacity="0.5"/>
57
+ </filter>
58
+
59
+ <!-- Pattern for subtle grid -->
60
+ <pattern id="gridPattern" width="80" height="80" patternUnits="userSpaceOnUse">
61
+ <path d="M 80 0 L 0 0 0 80" fill="none" stroke="rgba(201,162,39,0.03)" stroke-width="1"/>
62
+ </pattern>
63
+
64
+ <!-- Diagonal hatch pattern -->
65
+ <pattern id="hatchPattern" width="16" height="16" patternUnits="userSpaceOnUse" patternTransform="rotate(45)">
66
+ <line x1="0" y1="0" x2="0" y2="16" stroke="rgba(201,162,39,0.02)" stroke-width="1"/>
67
+ </pattern>
68
+ </defs>
69
+
70
+ <!-- ═══════════════════════════════════════════════════════════════════════════════
71
+ BACKGROUND LAYERS
72
+ ═══════════════════════════════════════════════════════════════════════════════ -->
73
+ <rect width="1400" height="2200" fill="url(#obsidianBg)"/>
74
+ <rect width="1400" height="2200" fill="url(#gridPattern)"/>
75
+ <rect width="1400" height="2200" fill="url(#hatchPattern)"/>
76
+
77
+ <!-- Corner flourishes -->
78
+ <ellipse cx="0" cy="0" rx="150" ry="150" fill="radial-gradient(ellipse at 0% 0%, #8b7500 0%, transparent 70%)" opacity="0.25"/>
79
+ <ellipse cx="1400" cy="0" rx="150" ry="150" fill="radial-gradient(ellipse at 100% 0%, #8b7500 0%, transparent 70%)" opacity="0.25"/>
80
+ <ellipse cx="0" cy="2200" rx="150" ry="150" fill="radial-gradient(ellipse at 0% 100%, #8b7500 0%, transparent 70%)" opacity="0.25"/>
81
+ <ellipse cx="1400" cy="2200" rx="150" ry="150" fill="radial-gradient(ellipse at 100% 100%, #8b7500 0%, transparent 70%)" opacity="0.25"/>
82
+
83
+ <!-- ═══════════════════════════════════════════════════════════════════════════════
84
+ HERO SECTION
85
+ ═══════════════════════════════════════════════════════════════════════════════ -->
86
+
87
+ <!-- Hero glow -->
88
+ <ellipse cx="700" cy="100" rx="400" ry="120" fill="rgba(201,162,39,0.12)"/>
89
+
90
+ <!-- Diamond icon -->
91
+ <text x="700" y="70" text-anchor="middle" font-size="40" fill="#c9a227" filter="url(#goldGlow)">◆</text>
92
+
93
+ <!-- Main title -->
94
+ <text x="700" y="130" text-anchor="middle" font-family="Georgia, 'Playfair Display', serif" font-size="48" font-weight="700" fill="url(#goldTitle)" filter="url(#goldGlow)">
95
+ JSGUI3 Server vs NestJS
96
+ </text>
97
+
98
+ <!-- Subtitle -->
99
+ <text x="700" y="165" text-anchor="middle" font-family="Inter, system-ui, sans-serif" font-size="14" fill="#94a3b8" letter-spacing="3">
100
+ COMPREHENSIVE FEATURE COMPARISON
101
+ </text>
102
+
103
+ <!-- Decorative line under title -->
104
+ <line x1="200" y1="195" x2="1200" y2="195" stroke="url(#goldAccent)" stroke-width="1" opacity="0.6"/>
105
+
106
+ <!-- ═══════════════════════════════════════════════════════════════════════════════
107
+ STAT CARDS
108
+ ═══════════════════════════════════════════════════════════════════════════════ -->
109
+ <g transform="translate(60, 230)">
110
+ <!-- JSGUI3 Stat Card -->
111
+ <g filter="url(#softShadow)">
112
+ <rect x="0" y="0" width="280" height="100" rx="10" fill="url(#cardGradient)" stroke="#334155"/>
113
+ <rect x="0" y="0" width="280" height="3" rx="2" fill="#50c878"/>
114
+ <text x="140" y="50" text-anchor="middle" font-family="Georgia, serif" font-size="28" font-weight="700" fill="#50c878">Full-Stack</text>
115
+ <text x="140" y="75" text-anchor="middle" font-family="Inter, sans-serif" font-size="11" fill="#64748b" text-transform="uppercase" letter-spacing="1">JSGUI3 FOCUS</text>
116
+ </g>
117
+
118
+ <!-- NestJS Stat Card -->
119
+ <g transform="translate(320, 0)" filter="url(#softShadow)">
120
+ <rect x="0" y="0" width="280" height="100" rx="10" fill="url(#cardGradient)" stroke="#334155"/>
121
+ <rect x="0" y="0" width="280" height="3" rx="2" fill="#6fa8dc"/>
122
+ <text x="140" y="50" text-anchor="middle" font-family="Georgia, serif" font-size="28" font-weight="700" fill="#6fa8dc">Backend</text>
123
+ <text x="140" y="75" text-anchor="middle" font-family="Inter, sans-serif" font-size="11" fill="#64748b" text-transform="uppercase" letter-spacing="1">NESTJS FOCUS</text>
124
+ </g>
125
+
126
+ <!-- Publisher Count Card -->
127
+ <g transform="translate(640, 0)" filter="url(#softShadow)">
128
+ <rect x="0" y="0" width="280" height="100" rx="10" fill="url(#cardGradient)" stroke="#334155"/>
129
+ <rect x="0" y="0" width="280" height="3" rx="2" fill="#da70d6"/>
130
+ <text x="140" y="50" text-anchor="middle" font-family="Georgia, serif" font-size="28" font-weight="700" fill="#da70d6">14+</text>
131
+ <text x="140" y="75" text-anchor="middle" font-family="Inter, sans-serif" font-size="11" fill="#64748b" text-transform="uppercase" letter-spacing="1">JSGUI3 PUBLISHERS</text>
132
+ </g>
133
+
134
+ <!-- Microservices Card -->
135
+ <g transform="translate(960, 0)" filter="url(#softShadow)">
136
+ <rect x="0" y="0" width="280" height="100" rx="10" fill="url(#cardGradient)" stroke="#334155"/>
137
+ <rect x="0" y="0" width="280" height="3" rx="2" fill="#ffc87c"/>
138
+ <text x="140" y="50" text-anchor="middle" font-family="Georgia, serif" font-size="28" font-weight="700" fill="#ffc87c">8+</text>
139
+ <text x="140" y="75" text-anchor="middle" font-family="Inter, sans-serif" font-size="11" fill="#64748b" text-transform="uppercase" letter-spacing="1">NESTJS TRANSPORTS</text>
140
+ </g>
141
+ </g>
142
+
143
+ <!-- ═══════════════════════════════════════════════════════════════════════════════
144
+ MAIN COMPARISON PANEL
145
+ ═══════════════════════════════════════════════════════════════════════════════ -->
146
+ <g transform="translate(60, 370)" filter="url(#softShadow)">
147
+ <!-- Panel background -->
148
+ <rect x="0" y="0" width="1280" height="1750" rx="16" fill="url(#cardGradient)" stroke="#334155" stroke-width="2"/>
149
+
150
+ <!-- Panel gold border accent -->
151
+ <rect x="2" y="2" width="1276" height="1746" rx="14" fill="none" stroke="url(#goldAccent)" stroke-width="1" opacity="0.4"/>
152
+
153
+ <!-- Panel header -->
154
+ <rect x="0" y="0" width="1280" height="60" rx="16" fill="url(#headerGradient)"/>
155
+ <rect x="0" y="56" width="1280" height="4" fill="#0f1420"/>
156
+ <line x1="0" y1="60" x2="1280" y2="60" stroke="url(#goldAccent)" stroke-width="1" opacity="0.6"/>
157
+
158
+ <!-- Header title -->
159
+ <text x="40" y="38" font-family="Georgia, serif" font-size="18" font-weight="600" fill="#c9a227">◆</text>
160
+ <text x="70" y="38" font-family="Georgia, serif" font-size="18" font-weight="600" fill="#c9a227">Feature Comparison Matrix</text>
161
+ <text x="60" y="38" font-family="Georgia, serif" font-size="10" fill="#c9a227" opacity="0.6">◆</text>
162
+ <text x="340" y="38" font-family="Georgia, serif" font-size="10" fill="#c9a227" opacity="0.6">◆</text>
163
+
164
+ <!-- Column headers -->
165
+ <rect x="0" y="60" width="1280" height="50" fill="#0a0d14"/>
166
+ <line x1="0" y1="110" x2="1280" y2="110" stroke="#334155"/>
167
+
168
+ <text x="200" y="92" text-anchor="middle" font-family="Inter, sans-serif" font-size="11" font-weight="600" fill="#c9a227" letter-spacing="1">FEATURE CATEGORY</text>
169
+ <text x="540" y="92" text-anchor="middle" font-family="Inter, sans-serif" font-size="11" font-weight="600" fill="#c9a227" letter-spacing="1">JSGUI3 SERVER</text>
170
+ <text x="940" y="92" text-anchor="middle" font-family="Inter, sans-serif" font-size="11" font-weight="600" fill="#c9a227" letter-spacing="1">NESTJS</text>
171
+
172
+ <!-- Vertical dividers -->
173
+ <line x1="380" y1="60" x2="380" y2="1750" stroke="#334155" stroke-dasharray="4,4" opacity="0.5"/>
174
+ <line x1="740" y1="60" x2="740" y2="1750" stroke="#334155" stroke-dasharray="4,4" opacity="0.5"/>
175
+ <line x1="1140" y1="60" x2="1140" y2="1750" stroke="#334155" stroke-dasharray="4,4" opacity="0.5"/>
176
+
177
+ <!-- ═══════════════════════════════════════════════════════════════════════════════
178
+ ARCHITECTURE SECTION
179
+ ═══════════════════════════════════════════════════════════════════════════════ -->
180
+ <g transform="translate(0, 130)">
181
+ <rect x="20" y="0" width="1240" height="30" rx="4" fill="rgba(201,162,39,0.08)"/>
182
+ <text x="40" y="20" font-family="Georgia, serif" font-size="14" font-weight="600" fill="#c9a227">ARCHITECTURE &amp; DESIGN</text>
183
+ </g>
184
+
185
+ <!-- Row 1: Core Architecture -->
186
+ <g transform="translate(0, 175)">
187
+ <rect x="0" y="0" width="1280" height="55" fill="transparent"/>
188
+ <rect x="0" y="54" width="1280" height="1" fill="#334155" opacity="0.3"/>
189
+ <text x="40" y="25" font-family="Inter, sans-serif" font-size="13" fill="#cbd5e1">Core Architecture</text>
190
+ <text x="40" y="42" font-family="Inter, sans-serif" font-size="10" fill="#64748b">Fundamental structural approach</text>
191
+
192
+ <!-- JSGUI3 -->
193
+ <rect x="400" y="10" width="280" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
194
+ <text x="540" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">Component + Publisher + Resource</text>
195
+
196
+ <!-- NestJS -->
197
+ <rect x="760" y="10" width="360" height="35" rx="4" fill="rgba(111,168,220,0.1)" stroke="#0f52ba"/>
198
+ <text x="940" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#6fa8dc">Module → Controller → Provider (Angular-inspired)</text>
199
+ </g>
200
+
201
+ <!-- Row 2: Primary Purpose -->
202
+ <g transform="translate(0, 230)">
203
+ <rect x="0" y="0" width="1280" height="55" fill="rgba(26,31,46,0.3)"/>
204
+ <rect x="0" y="54" width="1280" height="1" fill="#334155" opacity="0.3"/>
205
+ <text x="40" y="25" font-family="Inter, sans-serif" font-size="13" fill="#cbd5e1">Primary Purpose</text>
206
+ <text x="40" y="42" font-family="Inter, sans-serif" font-size="10" fill="#64748b">What the framework is designed for</text>
207
+
208
+ <rect x="400" y="10" width="280" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
209
+ <text x="540" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">GUI Delivery to Browsers</text>
210
+
211
+ <rect x="760" y="10" width="360" height="35" rx="4" fill="rgba(111,168,220,0.1)" stroke="#0f52ba"/>
212
+ <text x="940" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#6fa8dc">Enterprise Backend APIs &amp; Microservices</text>
213
+ </g>
214
+
215
+ <!-- Row 3: Language -->
216
+ <g transform="translate(0, 285)">
217
+ <rect x="0" y="0" width="1280" height="55" fill="transparent"/>
218
+ <rect x="0" y="54" width="1280" height="1" fill="#334155" opacity="0.3"/>
219
+ <text x="40" y="25" font-family="Inter, sans-serif" font-size="13" fill="#cbd5e1">Language Support</text>
220
+ <text x="40" y="42" font-family="Inter, sans-serif" font-size="10" fill="#64748b">Primary development language</text>
221
+
222
+ <rect x="400" y="10" width="280" height="35" rx="4" fill="rgba(255,159,0,0.1)" stroke="#cc7000"/>
223
+ <text x="540" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#ffc87c">JavaScript ES6+ (No TypeScript)</text>
224
+
225
+ <rect x="760" y="10" width="360" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
226
+ <text x="940" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">First-class TypeScript + Decorators</text>
227
+ </g>
228
+
229
+ <!-- Row 4: Dependency Injection -->
230
+ <g transform="translate(0, 340)">
231
+ <rect x="0" y="0" width="1280" height="55" fill="rgba(26,31,46,0.3)"/>
232
+ <rect x="0" y="54" width="1280" height="1" fill="#334155" opacity="0.3"/>
233
+ <text x="40" y="25" font-family="Inter, sans-serif" font-size="13" fill="#cbd5e1">Dependency Injection</text>
234
+ <text x="40" y="42" font-family="Inter, sans-serif" font-size="10" fill="#64748b">How dependencies are managed</text>
235
+
236
+ <rect x="400" y="10" width="280" height="35" rx="4" fill="rgba(255,159,0,0.1)" stroke="#cc7000"/>
237
+ <text x="540" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#ffc87c">Context-based + Resource Pools</text>
238
+
239
+ <rect x="760" y="10" width="360" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
240
+ <text x="940" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">Full IoC Container (Reflect-metadata)</text>
241
+ </g>
242
+
243
+ <!-- ═══════════════════════════════════════════════════════════════════════════════
244
+ FRONTEND CAPABILITIES SECTION
245
+ ═══════════════════════════════════════════════════════════════════════════════ -->
246
+ <g transform="translate(0, 415)">
247
+ <rect x="20" y="0" width="1240" height="30" rx="4" fill="rgba(80,200,120,0.08)"/>
248
+ <text x="40" y="20" font-family="Georgia, serif" font-size="14" font-weight="600" fill="#50c878">FRONTEND CAPABILITIES (JSGUI3 Strengths)</text>
249
+ </g>
250
+
251
+ <!-- Row 5: UI Components -->
252
+ <g transform="translate(0, 460)">
253
+ <rect x="0" y="0" width="1280" height="55" fill="transparent"/>
254
+ <rect x="0" y="54" width="1280" height="1" fill="#334155" opacity="0.3"/>
255
+ <text x="40" y="25" font-family="Inter, sans-serif" font-size="13" fill="#cbd5e1">Native UI Components</text>
256
+ <text x="40" y="42" font-family="Inter, sans-serif" font-size="10" fill="#64748b">Windows, Panels, Buttons, Inputs</text>
257
+
258
+ <rect x="400" y="10" width="280" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
259
+ <text x="540" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ Full Control System</text>
260
+
261
+ <rect x="760" y="10" width="360" height="35" rx="4" fill="rgba(255,107,107,0.1)" stroke="#8b0000"/>
262
+ <text x="940" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#ff6b6b">✗ Not Included (Backend Only)</text>
263
+ </g>
264
+
265
+ <!-- Row 6: Data Binding -->
266
+ <g transform="translate(0, 515)">
267
+ <rect x="0" y="0" width="1280" height="55" fill="rgba(26,31,46,0.3)"/>
268
+ <rect x="0" y="54" width="1280" height="1" fill="#334155" opacity="0.3"/>
269
+ <text x="40" y="25" font-family="Inter, sans-serif" font-size="13" fill="#cbd5e1">Reactive Data Binding</text>
270
+ <text x="40" y="42" font-family="Inter, sans-serif" font-size="10" fill="#64748b">Data_Object with field() observables</text>
271
+
272
+ <rect x="400" y="10" width="280" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
273
+ <text x="540" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ Built-in Reactive System</text>
274
+
275
+ <rect x="760" y="10" width="360" height="35" rx="4" fill="rgba(255,107,107,0.1)" stroke="#8b0000"/>
276
+ <text x="940" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#ff6b6b">✗ Not Applicable</text>
277
+ </g>
278
+
279
+ <!-- Row 7: JS/CSS Bundling -->
280
+ <g transform="translate(0, 570)">
281
+ <rect x="0" y="0" width="1280" height="55" fill="transparent"/>
282
+ <rect x="0" y="54" width="1280" height="1" fill="#334155" opacity="0.3"/>
283
+ <text x="40" y="25" font-family="Inter, sans-serif" font-size="13" fill="#cbd5e1">JS/CSS Bundling</text>
284
+ <text x="40" y="42" font-family="Inter, sans-serif" font-size="10" fill="#64748b">Asset compilation and optimization</text>
285
+
286
+ <rect x="400" y="10" width="280" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
287
+ <text x="540" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ Built-in ESBuild Integration</text>
288
+
289
+ <rect x="760" y="10" width="360" height="35" rx="4" fill="rgba(255,107,107,0.1)" stroke="#8b0000"/>
290
+ <text x="940" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#ff6b6b">✗ Requires External Tools</text>
291
+ </g>
292
+
293
+ <!-- Row 8: HTML Generation -->
294
+ <g transform="translate(0, 625)">
295
+ <rect x="0" y="0" width="1280" height="55" fill="rgba(26,31,46,0.3)"/>
296
+ <rect x="0" y="54" width="1280" height="1" fill="#334155" opacity="0.3"/>
297
+ <text x="40" y="25" font-family="Inter, sans-serif" font-size="13" fill="#cbd5e1">Server-Side HTML Generation</text>
298
+ <text x="40" y="42" font-family="Inter, sans-serif" font-size="10" fill="#64748b">Complete page rendering from controls</text>
299
+
300
+ <rect x="400" y="10" width="280" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
301
+ <text x="540" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ Active_HTML_Document System</text>
302
+
303
+ <rect x="760" y="10" width="360" height="35" rx="4" fill="rgba(255,159,0,0.1)" stroke="#cc7000"/>
304
+ <text x="940" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#ffc87c">~ Template Engines (Handlebars, etc.)</text>
305
+ </g>
306
+
307
+ <!-- ═══════════════════════════════════════════════════════════════════════════════
308
+ PUBLISHING SYSTEM SECTION
309
+ ═══════════════════════════════════════════════════════════════════════════════ -->
310
+ <g transform="translate(0, 700)">
311
+ <rect x="20" y="0" width="1240" height="30" rx="4" fill="rgba(218,112,214,0.08)"/>
312
+ <text x="40" y="20" font-family="Georgia, serif" font-size="14" font-weight="600" fill="#da70d6">PUBLISHING SYSTEM (JSGUI3 Unique)</text>
313
+ </g>
314
+
315
+ <!-- Row 9: Publishers -->
316
+ <g transform="translate(0, 745)">
317
+ <rect x="0" y="0" width="1280" height="55" fill="transparent"/>
318
+ <rect x="0" y="54" width="1280" height="1" fill="#334155" opacity="0.3"/>
319
+ <text x="40" y="25" font-family="Inter, sans-serif" font-size="13" fill="#cbd5e1">Content Type Publishers</text>
320
+ <text x="40" y="42" font-family="Inter, sans-serif" font-size="10" fill="#64748b">Webpage, CSS, JS, Image, Function, SVG</text>
321
+
322
+ <rect x="400" y="10" width="280" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
323
+ <text x="540" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ 14+ Built-in Publishers</text>
324
+
325
+ <rect x="760" y="10" width="360" height="35" rx="4" fill="rgba(255,159,0,0.1)" stroke="#cc7000"/>
326
+ <text x="940" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#ffc87c">~ Static File Serving Only</text>
327
+ </g>
328
+
329
+ <!-- Row 10: Function Publishing -->
330
+ <g transform="translate(0, 800)">
331
+ <rect x="0" y="0" width="1280" height="55" fill="rgba(26,31,46,0.3)"/>
332
+ <rect x="0" y="54" width="1280" height="1" fill="#334155" opacity="0.3"/>
333
+ <text x="40" y="25" font-family="Inter, sans-serif" font-size="13" fill="#cbd5e1">Function → API Publishing</text>
334
+ <text x="40" y="42" font-family="Inter, sans-serif" font-size="10" fill="#64748b">Automatic JSON/text content-type handling</text>
335
+
336
+ <rect x="400" y="10" width="280" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
337
+ <text x="540" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ server.publish('name', fn)</text>
338
+
339
+ <rect x="760" y="10" width="360" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
340
+ <text x="940" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ @Controller() + @Get/@Post</text>
341
+ </g>
342
+
343
+ <!-- Row 11: Resource System -->
344
+ <g transform="translate(0, 855)">
345
+ <rect x="0" y="0" width="1280" height="55" fill="transparent"/>
346
+ <rect x="0" y="54" width="1280" height="1" fill="#334155" opacity="0.3"/>
347
+ <text x="40" y="25" font-family="Inter, sans-serif" font-size="13" fill="#cbd5e1">Resource Abstraction Layer</text>
348
+ <text x="40" y="42" font-family="Inter, sans-serif" font-size="10" fill="#64748b">Unified data source access patterns</text>
349
+
350
+ <rect x="400" y="10" width="280" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
351
+ <text x="540" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ Server_Resource_Pool + Resources</text>
352
+
353
+ <rect x="760" y="10" width="360" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
354
+ <text x="940" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ Providers + Repositories</text>
355
+ </g>
356
+
357
+ <!-- ═══════════════════════════════════════════════════════════════════════════════
358
+ BACKEND CAPABILITIES SECTION
359
+ ═══════════════════════════════════════════════════════════════════════════════ -->
360
+ <g transform="translate(0, 930)">
361
+ <rect x="20" y="0" width="1240" height="30" rx="4" fill="rgba(111,168,220,0.08)"/>
362
+ <text x="40" y="20" font-family="Georgia, serif" font-size="14" font-weight="600" fill="#6fa8dc">BACKEND CAPABILITIES (NestJS Strengths)</text>
363
+ </g>
364
+
365
+ <!-- Row 12: Microservices -->
366
+ <g transform="translate(0, 975)">
367
+ <rect x="0" y="0" width="1280" height="55" fill="transparent"/>
368
+ <rect x="0" y="54" width="1280" height="1" fill="#334155" opacity="0.3"/>
369
+ <text x="40" y="25" font-family="Inter, sans-serif" font-size="13" fill="#cbd5e1">Microservices Architecture</text>
370
+ <text x="40" y="42" font-family="Inter, sans-serif" font-size="10" fill="#64748b">TCP, Redis, NATS, Kafka, gRPC, RabbitMQ</text>
371
+
372
+ <rect x="400" y="10" width="280" height="35" rx="4" fill="rgba(255,107,107,0.1)" stroke="#8b0000"/>
373
+ <text x="540" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#ff6b6b">✗ Not Built-in</text>
374
+
375
+ <rect x="760" y="10" width="360" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
376
+ <text x="940" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ Native 8+ Transports</text>
377
+ </g>
378
+
379
+ <!-- Row 13: WebSockets -->
380
+ <g transform="translate(0, 1030)">
381
+ <rect x="0" y="0" width="1280" height="55" fill="rgba(26,31,46,0.3)"/>
382
+ <rect x="0" y="54" width="1280" height="1" fill="#334155" opacity="0.3"/>
383
+ <text x="40" y="25" font-family="Inter, sans-serif" font-size="13" fill="#cbd5e1">WebSocket Support</text>
384
+ <text x="40" y="42" font-family="Inter, sans-serif" font-size="10" fill="#64748b">Real-time bidirectional communication</text>
385
+
386
+ <rect x="400" y="10" width="280" height="35" rx="4" fill="rgba(255,159,0,0.1)" stroke="#cc7000"/>
387
+ <text x="540" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#ffc87c">~ Basic HTTP Server Events</text>
388
+
389
+ <rect x="760" y="10" width="360" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
390
+ <text x="940" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ Full @WebSocketGateway</text>
391
+ </g>
392
+
393
+ <!-- Row 14: GraphQL -->
394
+ <g transform="translate(0, 1085)">
395
+ <rect x="0" y="0" width="1280" height="55" fill="transparent"/>
396
+ <rect x="0" y="54" width="1280" height="1" fill="#334155" opacity="0.3"/>
397
+ <text x="40" y="25" font-family="Inter, sans-serif" font-size="13" fill="#cbd5e1">GraphQL Integration</text>
398
+ <text x="40" y="42" font-family="Inter, sans-serif" font-size="10" fill="#64748b">Query language for APIs</text>
399
+
400
+ <rect x="400" y="10" width="280" height="35" rx="4" fill="rgba(255,107,107,0.1)" stroke="#8b0000"/>
401
+ <text x="540" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#ff6b6b">✗ Not Included</text>
402
+
403
+ <rect x="760" y="10" width="360" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
404
+ <text x="940" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ Native @nestjs/graphql</text>
405
+ </g>
406
+
407
+ <!-- Row 15: Guards/Interceptors -->
408
+ <g transform="translate(0, 1140)">
409
+ <rect x="0" y="0" width="1280" height="55" fill="rgba(26,31,46,0.3)"/>
410
+ <rect x="0" y="54" width="1280" height="1" fill="#334155" opacity="0.3"/>
411
+ <text x="40" y="25" font-family="Inter, sans-serif" font-size="13" fill="#cbd5e1">Guards, Pipes, Interceptors</text>
412
+ <text x="40" y="42" font-family="Inter, sans-serif" font-size="10" fill="#64748b">Request lifecycle hooks</text>
413
+
414
+ <rect x="400" y="10" width="280" height="35" rx="4" fill="rgba(255,159,0,0.1)" stroke="#cc7000"/>
415
+ <text x="540" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#ffc87c">~ Router-level Middleware</text>
416
+
417
+ <rect x="760" y="10" width="360" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
418
+ <text x="940" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ Full Decorator System</text>
419
+ </g>
420
+
421
+ <!-- Row 16: Validation -->
422
+ <g transform="translate(0, 1195)">
423
+ <rect x="0" y="0" width="1280" height="55" fill="transparent"/>
424
+ <rect x="0" y="54" width="1280" height="1" fill="#334155" opacity="0.3"/>
425
+ <text x="40" y="25" font-family="Inter, sans-serif" font-size="13" fill="#cbd5e1">DTO Validation</text>
426
+ <text x="40" y="42" font-family="Inter, sans-serif" font-size="10" fill="#64748b">Request payload validation</text>
427
+
428
+ <rect x="400" y="10" width="280" height="35" rx="4" fill="rgba(255,159,0,0.1)" stroke="#cc7000"/>
429
+ <text x="540" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#ffc87c">~ Manual Validation</text>
430
+
431
+ <rect x="760" y="10" width="360" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
432
+ <text x="940" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ class-validator + class-transformer</text>
433
+ </g>
434
+
435
+ <!-- ═══════════════════════════════════════════════════════════════════════════════
436
+ OPERATIONAL SECTION
437
+ ═══════════════════════════════════════════════════════════════════════════════ -->
438
+ <g transform="translate(0, 1270)">
439
+ <rect x="20" y="0" width="1240" height="30" rx="4" fill="rgba(255,200,124,0.08)"/>
440
+ <text x="40" y="20" font-family="Georgia, serif" font-size="14" font-weight="600" fill="#ffc87c">OPERATIONAL FEATURES</text>
441
+ </g>
442
+
443
+ <!-- Row 17: CLI -->
444
+ <g transform="translate(0, 1315)">
445
+ <rect x="0" y="0" width="1280" height="55" fill="transparent"/>
446
+ <rect x="0" y="54" width="1280" height="1" fill="#334155" opacity="0.3"/>
447
+ <text x="40" y="25" font-family="Inter, sans-serif" font-size="13" fill="#cbd5e1">CLI Tooling</text>
448
+ <text x="40" y="42" font-family="Inter, sans-serif" font-size="10" fill="#64748b">Command-line development tools</text>
449
+
450
+ <rect x="400" y="10" width="280" height="35" rx="4" fill="rgba(255,159,0,0.1)" stroke="#cc7000"/>
451
+ <text x="540" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#ffc87c">~ Basic cli.js (serve/help)</text>
452
+
453
+ <rect x="760" y="10" width="360" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
454
+ <text x="940" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ Full @nestjs/cli Scaffolding</text>
455
+ </g>
456
+
457
+ <!-- Row 18: Testing -->
458
+ <g transform="translate(0, 1370)">
459
+ <rect x="0" y="0" width="1280" height="55" fill="rgba(26,31,46,0.3)"/>
460
+ <rect x="0" y="54" width="1280" height="1" fill="#334155" opacity="0.3"/>
461
+ <text x="40" y="25" font-family="Inter, sans-serif" font-size="13" fill="#cbd5e1">Testing Framework</text>
462
+ <text x="40" y="42" font-family="Inter, sans-serif" font-size="10" fill="#64748b">Built-in testing support</text>
463
+
464
+ <rect x="400" y="10" width="280" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
465
+ <text x="540" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ Mocha Test Runner</text>
466
+
467
+ <rect x="760" y="10" width="360" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
468
+ <text x="940" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ Jest + TestingModule</text>
469
+ </g>
470
+
471
+ <!-- Row 19: HTTP Adapters -->
472
+ <g transform="translate(0, 1425)">
473
+ <rect x="0" y="0" width="1280" height="55" fill="transparent"/>
474
+ <rect x="0" y="54" width="1280" height="1" fill="#334155" opacity="0.3"/>
475
+ <text x="40" y="25" font-family="Inter, sans-serif" font-size="13" fill="#cbd5e1">HTTP Server Engine</text>
476
+ <text x="40" y="42" font-family="Inter, sans-serif" font-size="10" fill="#64748b">Underlying HTTP implementation</text>
477
+
478
+ <rect x="400" y="10" width="280" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
479
+ <text x="540" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ Native Node.js http/https</text>
480
+
481
+ <rect x="760" y="10" width="360" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
482
+ <text x="940" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ Express or Fastify Adapters</text>
483
+ </g>
484
+
485
+ <!-- Row 20: Configuration -->
486
+ <g transform="translate(0, 1480)">
487
+ <rect x="0" y="0" width="1280" height="55" fill="rgba(26,31,46,0.3)"/>
488
+ <rect x="0" y="54" width="1280" height="1" fill="#334155" opacity="0.3"/>
489
+ <text x="40" y="25" font-family="Inter, sans-serif" font-size="13" fill="#cbd5e1">Configuration System</text>
490
+ <text x="40" y="42" font-family="Inter, sans-serif" font-size="10" fill="#64748b">Environment and settings management</text>
491
+
492
+ <rect x="400" y="10" width="280" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
493
+ <text x="540" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ Server.serve() Options</text>
494
+
495
+ <rect x="760" y="10" width="360" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
496
+ <text x="940" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ @nestjs/config Module</text>
497
+ </g>
498
+
499
+ <!-- Row 21: Documentation -->
500
+ <g transform="translate(0, 1535)">
501
+ <rect x="0" y="0" width="1280" height="55" fill="transparent"/>
502
+ <rect x="0" y="54" width="1280" height="1" fill="#334155" opacity="0.3"/>
503
+ <text x="40" y="25" font-family="Inter, sans-serif" font-size="13" fill="#cbd5e1">API Documentation</text>
504
+ <text x="40" y="42" font-family="Inter, sans-serif" font-size="10" fill="#64748b">Auto-generated API docs</text>
505
+
506
+ <rect x="400" y="10" width="280" height="35" rx="4" fill="rgba(255,159,0,0.1)" stroke="#cc7000"/>
507
+ <text x="540" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#ffc87c">~ Manual Documentation</text>
508
+
509
+ <rect x="760" y="10" width="360" height="35" rx="4" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
510
+ <text x="940" y="33" text-anchor="middle" font-family="Inter, sans-serif" font-size="12" fill="#50c878">✓ Swagger/OpenAPI Integration</text>
511
+ </g>
512
+
513
+ <!-- ═══════════════════════════════════════════════════════════════════════════════
514
+ LEGEND
515
+ ═══════════════════════════════════════════════════════════════════════════════ -->
516
+ <g transform="translate(0, 1620)">
517
+ <rect x="20" y="0" width="1240" height="80" rx="8" fill="#0a0d14"/>
518
+ <text x="640" y="25" text-anchor="middle" font-family="Georgia, serif" font-size="12" fill="#64748b" letter-spacing="2">LEGEND</text>
519
+
520
+ <!-- Strong -->
521
+ <rect x="120" y="45" width="16" height="16" rx="3" fill="rgba(80,200,120,0.1)" stroke="#2e8b57"/>
522
+ <text x="145" y="57" font-family="Inter, sans-serif" font-size="11" fill="#50c878">Strong/Native Support</text>
523
+
524
+ <!-- Partial -->
525
+ <rect x="420" y="45" width="16" height="16" rx="3" fill="rgba(255,159,0,0.1)" stroke="#cc7000"/>
526
+ <text x="445" y="57" font-family="Inter, sans-serif" font-size="11" fill="#ffc87c">Partial/Basic Support</text>
527
+
528
+ <!-- Not Available -->
529
+ <rect x="720" y="45" width="16" height="16" rx="3" fill="rgba(255,107,107,0.1)" stroke="#8b0000"/>
530
+ <text x="745" y="57" font-family="Inter, sans-serif" font-size="11" fill="#ff6b6b">Not Available/Not Applicable</text>
531
+
532
+ <!-- Different Approach -->
533
+ <rect x="1020" y="45" width="16" height="16" rx="3" fill="rgba(111,168,220,0.1)" stroke="#0f52ba"/>
534
+ <text x="1045" y="57" font-family="Inter, sans-serif" font-size="11" fill="#6fa8dc">Different Approach</text>
535
+ </g>
536
+ </g>
537
+
538
+ <!-- ═══════════════════════════════════════════════════════════════════════════════
539
+ FOOTER
540
+ ═══════════════════════════════════════════════════════════════════════════════ -->
541
+ <g transform="translate(0, 2140)">
542
+ <line x1="60" y1="0" x2="1340" y2="0" stroke="#334155"/>
543
+ <text x="700" y="35" text-anchor="middle" font-family="Inter, sans-serif" font-size="11" fill="#64748b">
544
+ JSGUI3 Server v0.0.140 | Industrial Luxury Obsidian Theme | Generated November 2025
545
+ </text>
546
+ <text x="700" y="52" text-anchor="middle" font-family="Inter, sans-serif" font-size="10" fill="#475569">
547
+ JSGUI3 excels at full-stack GUI delivery • NestJS excels at enterprise backend services
548
+ </text>
549
+ </g>
550
+ </svg>