jsgui3-server 0.0.140 → 0.0.142

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 +9 -8
  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,370 @@
1
+ /* ═══════════════════════════════════════════════════════════════════════════ */
2
+ /* OBSIDIAN SCROLLBARS - Luxury Dark Theme Scrollbar Styles */
3
+ /* ═══════════════════════════════════════════════════════════════════════════ */
4
+ /*
5
+ * Usage: Include this CSS file and add one of these classes to scrollable containers:
6
+ * .obsidian-scroll - Standard 8px scrollbar
7
+ * .obsidian-scroll-thin - Compact 6px scrollbar
8
+ * .obsidian-scroll-wide - Wide 12px scrollbar
9
+ * .obsidian-scroll-glow - Add gold glow on hover
10
+ *
11
+ * Example:
12
+ * <div class="my-list obsidian-scroll obsidian-scroll-glow">...</div>
13
+ *
14
+ * See: docs/guides/OBSIDIAN_LUXURY_DESIGN_GUIDE.md for full documentation
15
+ */
16
+
17
+ /* ─────────────────────────────────────────────────────────────────────────── */
18
+ /* CSS Variables (if not already defined in :root) */
19
+ /* ─────────────────────────────────────────────────────────────────────────── */
20
+
21
+ :root {
22
+ /* Only define if not already set */
23
+ --obsidian-bg-deep: rgba(10, 13, 20, 0.99);
24
+ --obsidian-bg-surface: rgba(20, 24, 36, 0.98);
25
+ --obsidian-bg-elevated: rgba(30, 35, 50, 0.95);
26
+ --obsidian-gold: #c9a227;
27
+ --obsidian-gold-dim: rgba(201, 162, 39, 0.6);
28
+ --obsidian-gold-glow: rgba(201, 162, 39, 0.4);
29
+ --obsidian-gold-subtle: rgba(201, 162, 39, 0.15);
30
+ --obsidian-border: rgba(201, 162, 39, 0.3);
31
+ --obsidian-border-dim: rgba(201, 162, 39, 0.15);
32
+ }
33
+
34
+ /* ─────────────────────────────────────────────────────────────────────────── */
35
+ /* Base Scrollbar Styles */
36
+ /* ─────────────────────────────────────────────────────────────────────────── */
37
+
38
+ .obsidian-scroll {
39
+ overflow-y: auto;
40
+ /* Firefox */
41
+ scrollbar-width: thin;
42
+ scrollbar-color: var(--obsidian-border) var(--obsidian-bg-deep);
43
+ }
44
+
45
+ /* WebKit - Track */
46
+ .obsidian-scroll::-webkit-scrollbar {
47
+ width: 8px;
48
+ height: 8px;
49
+ }
50
+
51
+ .obsidian-scroll::-webkit-scrollbar-track {
52
+ background: var(--obsidian-bg-deep);
53
+ border-radius: 4px;
54
+ }
55
+
56
+ /* WebKit - Thumb */
57
+ .obsidian-scroll::-webkit-scrollbar-thumb {
58
+ background: var(--obsidian-border);
59
+ border-radius: 4px;
60
+ border: 1px solid transparent;
61
+ background-clip: padding-box;
62
+ transition: background 0.15s ease;
63
+ }
64
+
65
+ .obsidian-scroll::-webkit-scrollbar-thumb:hover {
66
+ background: var(--obsidian-gold-dim);
67
+ }
68
+
69
+ .obsidian-scroll::-webkit-scrollbar-thumb:active {
70
+ background: var(--obsidian-gold);
71
+ }
72
+
73
+ /* WebKit - Corner (for both scrollbars visible) */
74
+ .obsidian-scroll::-webkit-scrollbar-corner {
75
+ background: var(--obsidian-bg-deep);
76
+ }
77
+
78
+ /* ─────────────────────────────────────────────────────────────────────────── */
79
+ /* Size Variants */
80
+ /* ─────────────────────────────────────────────────────────────────────────── */
81
+
82
+ /* Thin variant - 6px width */
83
+ .obsidian-scroll-thin::-webkit-scrollbar {
84
+ width: 6px;
85
+ height: 6px;
86
+ }
87
+
88
+ .obsidian-scroll-thin::-webkit-scrollbar-track {
89
+ border-radius: 3px;
90
+ }
91
+
92
+ .obsidian-scroll-thin::-webkit-scrollbar-thumb {
93
+ border-radius: 3px;
94
+ }
95
+
96
+ /* Wide variant - 12px width */
97
+ .obsidian-scroll-wide::-webkit-scrollbar {
98
+ width: 12px;
99
+ height: 12px;
100
+ }
101
+
102
+ .obsidian-scroll-wide::-webkit-scrollbar-track {
103
+ border-radius: 6px;
104
+ }
105
+
106
+ .obsidian-scroll-wide::-webkit-scrollbar-thumb {
107
+ border-radius: 6px;
108
+ border: 2px solid transparent;
109
+ }
110
+
111
+ /* ─────────────────────────────────────────────────────────────────────────── */
112
+ /* Glow Effect Modifier */
113
+ /* ─────────────────────────────────────────────────────────────────────────── */
114
+
115
+ .obsidian-scroll-glow::-webkit-scrollbar-thumb:hover {
116
+ background: var(--obsidian-gold-dim);
117
+ box-shadow:
118
+ 0 0 6px var(--obsidian-gold-glow),
119
+ inset 0 0 3px var(--obsidian-gold-glow);
120
+ }
121
+
122
+ .obsidian-scroll-glow::-webkit-scrollbar-thumb:active {
123
+ background: var(--obsidian-gold);
124
+ box-shadow:
125
+ 0 0 10px var(--obsidian-gold-glow),
126
+ inset 0 0 4px rgba(255, 255, 255, 0.2);
127
+ }
128
+
129
+ /* ─────────────────────────────────────────────────────────────────────────── */
130
+ /* Horizontal Scrollbar (when needed) */
131
+ /* ─────────────────────────────────────────────────────────────────────────── */
132
+
133
+ .obsidian-scroll-x {
134
+ overflow-x: auto;
135
+ overflow-y: hidden;
136
+ scrollbar-width: thin;
137
+ scrollbar-color: var(--obsidian-border) var(--obsidian-bg-deep);
138
+ }
139
+
140
+ .obsidian-scroll-x::-webkit-scrollbar {
141
+ width: 8px;
142
+ height: 8px;
143
+ }
144
+
145
+ .obsidian-scroll-x::-webkit-scrollbar-track {
146
+ background: var(--obsidian-bg-deep);
147
+ border-radius: 4px;
148
+ }
149
+
150
+ .obsidian-scroll-x::-webkit-scrollbar-thumb {
151
+ background: var(--obsidian-border);
152
+ border-radius: 4px;
153
+ }
154
+
155
+ .obsidian-scroll-x::-webkit-scrollbar-thumb:hover {
156
+ background: var(--obsidian-gold-dim);
157
+ }
158
+
159
+ /* ─────────────────────────────────────────────────────────────────────────── */
160
+ /* Both Scrollbars (overflow: auto on both axes) */
161
+ /* ─────────────────────────────────────────────────────────────────────────── */
162
+
163
+ .obsidian-scroll-both {
164
+ overflow: auto;
165
+ scrollbar-width: thin;
166
+ scrollbar-color: var(--obsidian-border) var(--obsidian-bg-deep);
167
+ }
168
+
169
+ .obsidian-scroll-both::-webkit-scrollbar {
170
+ width: 8px;
171
+ height: 8px;
172
+ }
173
+
174
+ .obsidian-scroll-both::-webkit-scrollbar-track {
175
+ background: var(--obsidian-bg-deep);
176
+ border-radius: 4px;
177
+ }
178
+
179
+ .obsidian-scroll-both::-webkit-scrollbar-thumb {
180
+ background: var(--obsidian-border);
181
+ border-radius: 4px;
182
+ }
183
+
184
+ .obsidian-scroll-both::-webkit-scrollbar-thumb:hover {
185
+ background: var(--obsidian-gold-dim);
186
+ }
187
+
188
+ .obsidian-scroll-both::-webkit-scrollbar-corner {
189
+ background: var(--obsidian-bg-deep);
190
+ }
191
+
192
+ /* ─────────────────────────────────────────────────────────────────────────── */
193
+ /* Invisible Scrollbar (scroll functionality, hidden bar) */
194
+ /* ─────────────────────────────────────────────────────────────────────────── */
195
+
196
+ .obsidian-scroll-hidden {
197
+ overflow-y: auto;
198
+ scrollbar-width: none; /* Firefox */
199
+ -ms-overflow-style: none; /* IE/Edge */
200
+ }
201
+
202
+ .obsidian-scroll-hidden::-webkit-scrollbar {
203
+ display: none; /* WebKit */
204
+ }
205
+
206
+ /* ─────────────────────────────────────────────────────────────────────────── */
207
+ /* Auto-Fade Scrollbar (only visible when scrolling - webkit only) */
208
+ /* ─────────────────────────────────────────────────────────────────────────── */
209
+
210
+ .obsidian-scroll-fade {
211
+ overflow-y: auto;
212
+ scrollbar-width: thin;
213
+ scrollbar-color: transparent var(--obsidian-bg-deep);
214
+ }
215
+
216
+ .obsidian-scroll-fade::-webkit-scrollbar {
217
+ width: 8px;
218
+ }
219
+
220
+ .obsidian-scroll-fade::-webkit-scrollbar-track {
221
+ background: transparent;
222
+ }
223
+
224
+ .obsidian-scroll-fade::-webkit-scrollbar-thumb {
225
+ background: transparent;
226
+ border-radius: 4px;
227
+ transition: background 0.3s ease;
228
+ }
229
+
230
+ .obsidian-scroll-fade:hover::-webkit-scrollbar-thumb {
231
+ background: var(--obsidian-border);
232
+ }
233
+
234
+ .obsidian-scroll-fade:hover::-webkit-scrollbar-thumb:hover {
235
+ background: var(--obsidian-gold-dim);
236
+ }
237
+
238
+ /* ─────────────────────────────────────────────────────────────────────────── */
239
+ /* OVERLAY SCROLLBAR - NO LAYOUT JIGGLE (RECOMMENDED) */
240
+ /* ─────────────────────────────────────────────────────────────────────────── */
241
+ /*
242
+ * This is the RECOMMENDED scrollbar style for most use cases.
243
+ * Uses overlay scrollbars that float over content instead of pushing it.
244
+ * Content width stays constant whether scrollbar is visible or not.
245
+ *
246
+ * How it works:
247
+ * - `overflow: overlay` (Chromium) makes scrollbar float over content
248
+ * - Fallback to `overflow: auto` for Firefox/Safari
249
+ * - Scrollbar-gutter reserves space on browsers that support it
250
+ */
251
+
252
+ .obsidian-scroll-overlay {
253
+ /* Primary: overlay scrollbars (Chromium-based browsers) */
254
+ overflow-y: overlay;
255
+ /* Fallback for Firefox/Safari - reserve space to prevent jiggle */
256
+ scrollbar-gutter: stable;
257
+ /* Firefox styling */
258
+ scrollbar-width: thin;
259
+ scrollbar-color: var(--obsidian-border) transparent;
260
+ }
261
+
262
+ /* Fallback for browsers that don't support overlay */
263
+ @supports not (overflow: overlay) {
264
+ .obsidian-scroll-overlay {
265
+ overflow-y: auto;
266
+ /* scrollbar-gutter: stable ensures space is always reserved */
267
+ }
268
+ }
269
+
270
+ .obsidian-scroll-overlay::-webkit-scrollbar {
271
+ width: 10px;
272
+ height: 10px;
273
+ }
274
+
275
+ .obsidian-scroll-overlay::-webkit-scrollbar-track {
276
+ background: transparent;
277
+ }
278
+
279
+ .obsidian-scroll-overlay::-webkit-scrollbar-thumb {
280
+ background: var(--obsidian-border);
281
+ border-radius: 5px;
282
+ /* Inset border creates visual padding from edge */
283
+ border: 2px solid transparent;
284
+ background-clip: padding-box;
285
+ }
286
+
287
+ .obsidian-scroll-overlay::-webkit-scrollbar-thumb:hover {
288
+ background: var(--obsidian-gold-dim);
289
+ border: 2px solid transparent;
290
+ background-clip: padding-box;
291
+ }
292
+
293
+ .obsidian-scroll-overlay::-webkit-scrollbar-thumb:active {
294
+ background: var(--obsidian-gold);
295
+ border: 2px solid transparent;
296
+ background-clip: padding-box;
297
+ }
298
+
299
+ .obsidian-scroll-overlay::-webkit-scrollbar-corner {
300
+ background: transparent;
301
+ }
302
+
303
+ /* ─────────────────────────────────────────────────────────────────────────── */
304
+ /* OVERLAY + GLOW (Premium variant) */
305
+ /* ─────────────────────────────────────────────────────────────────────────── */
306
+
307
+ .obsidian-scroll-overlay-glow {
308
+ overflow-y: overlay;
309
+ scrollbar-gutter: stable;
310
+ scrollbar-width: thin;
311
+ scrollbar-color: var(--obsidian-border) transparent;
312
+ }
313
+
314
+ @supports not (overflow: overlay) {
315
+ .obsidian-scroll-overlay-glow {
316
+ overflow-y: auto;
317
+ }
318
+ }
319
+
320
+ .obsidian-scroll-overlay-glow::-webkit-scrollbar {
321
+ width: 10px;
322
+ height: 10px;
323
+ }
324
+
325
+ .obsidian-scroll-overlay-glow::-webkit-scrollbar-track {
326
+ background: transparent;
327
+ }
328
+
329
+ .obsidian-scroll-overlay-glow::-webkit-scrollbar-thumb {
330
+ background: var(--obsidian-border);
331
+ border-radius: 5px;
332
+ border: 2px solid transparent;
333
+ background-clip: padding-box;
334
+ transition: all 0.2s ease;
335
+ }
336
+
337
+ .obsidian-scroll-overlay-glow::-webkit-scrollbar-thumb:hover {
338
+ background: var(--obsidian-gold-dim);
339
+ border: 2px solid transparent;
340
+ background-clip: padding-box;
341
+ box-shadow:
342
+ 0 0 8px var(--obsidian-gold-glow),
343
+ inset 0 0 4px var(--obsidian-gold-glow);
344
+ }
345
+
346
+ .obsidian-scroll-overlay-glow::-webkit-scrollbar-thumb:active {
347
+ background: var(--obsidian-gold);
348
+ border: 2px solid transparent;
349
+ background-clip: padding-box;
350
+ box-shadow:
351
+ 0 0 12px var(--obsidian-gold-glow),
352
+ inset 0 0 6px rgba(255, 255, 255, 0.3);
353
+ }
354
+
355
+ /* ─────────────────────────────────────────────────────────────────────────── */
356
+ /* Utility: Apply to body/html for global no-jiggle scrollbars */
357
+ /* ─────────────────────────────────────────────────────────────────────────── */
358
+
359
+ .obsidian-scroll-global {
360
+ overflow-y: overlay;
361
+ scrollbar-gutter: stable;
362
+ scrollbar-width: thin;
363
+ scrollbar-color: var(--obsidian-border) var(--obsidian-bg-deep);
364
+ }
365
+
366
+ @supports not (overflow: overlay) {
367
+ .obsidian-scroll-global {
368
+ overflow-y: scroll; /* Always show scrollbar to prevent jiggle */
369
+ }
370
+ }