@bsb/registry 1.0.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.
Files changed (54) hide show
  1. package/README.md +133 -0
  2. package/bsb-plugin.json +47 -0
  3. package/lib/.bsb/clients/service-bsb-registry.d.ts +1118 -0
  4. package/lib/.bsb/clients/service-bsb-registry.d.ts.map +1 -0
  5. package/lib/.bsb/clients/service-bsb-registry.js +393 -0
  6. package/lib/.bsb/clients/service-bsb-registry.js.map +1 -0
  7. package/lib/plugins/service-bsb-registry/auth.d.ts +87 -0
  8. package/lib/plugins/service-bsb-registry/auth.d.ts.map +1 -0
  9. package/lib/plugins/service-bsb-registry/auth.js +197 -0
  10. package/lib/plugins/service-bsb-registry/auth.js.map +1 -0
  11. package/lib/plugins/service-bsb-registry/db/file.d.ts +73 -0
  12. package/lib/plugins/service-bsb-registry/db/file.d.ts.map +1 -0
  13. package/lib/plugins/service-bsb-registry/db/file.js +588 -0
  14. package/lib/plugins/service-bsb-registry/db/file.js.map +1 -0
  15. package/lib/plugins/service-bsb-registry/db/index.d.ts +75 -0
  16. package/lib/plugins/service-bsb-registry/db/index.d.ts.map +1 -0
  17. package/lib/plugins/service-bsb-registry/db/index.js +24 -0
  18. package/lib/plugins/service-bsb-registry/db/index.js.map +1 -0
  19. package/lib/plugins/service-bsb-registry/index.d.ts +1228 -0
  20. package/lib/plugins/service-bsb-registry/index.d.ts.map +1 -0
  21. package/lib/plugins/service-bsb-registry/index.js +661 -0
  22. package/lib/plugins/service-bsb-registry/index.js.map +1 -0
  23. package/lib/plugins/service-bsb-registry/types.d.ts +559 -0
  24. package/lib/plugins/service-bsb-registry/types.d.ts.map +1 -0
  25. package/lib/plugins/service-bsb-registry/types.js +235 -0
  26. package/lib/plugins/service-bsb-registry/types.js.map +1 -0
  27. package/lib/plugins/service-bsb-registry-ui/http-server.d.ts +138 -0
  28. package/lib/plugins/service-bsb-registry-ui/http-server.d.ts.map +1 -0
  29. package/lib/plugins/service-bsb-registry-ui/http-server.js +1660 -0
  30. package/lib/plugins/service-bsb-registry-ui/http-server.js.map +1 -0
  31. package/lib/plugins/service-bsb-registry-ui/index.d.ts +62 -0
  32. package/lib/plugins/service-bsb-registry-ui/index.d.ts.map +1 -0
  33. package/lib/plugins/service-bsb-registry-ui/index.js +101 -0
  34. package/lib/plugins/service-bsb-registry-ui/index.js.map +1 -0
  35. package/lib/plugins/service-bsb-registry-ui/static/assets/images/apple-touch-icon.png +0 -0
  36. package/lib/plugins/service-bsb-registry-ui/static/assets/images/favicon-16x16.png +0 -0
  37. package/lib/plugins/service-bsb-registry-ui/static/assets/images/favicon-32x32.png +0 -0
  38. package/lib/plugins/service-bsb-registry-ui/static/assets/images/favicon.ico +0 -0
  39. package/lib/plugins/service-bsb-registry-ui/static/css/style.css +1849 -0
  40. package/lib/plugins/service-bsb-registry-ui/static/js/app.js +336 -0
  41. package/lib/plugins/service-bsb-registry-ui/templates/layouts/main.hbs +39 -0
  42. package/lib/plugins/service-bsb-registry-ui/templates/pages/error.hbs +13 -0
  43. package/lib/plugins/service-bsb-registry-ui/templates/pages/home.hbs +62 -0
  44. package/lib/plugins/service-bsb-registry-ui/templates/pages/not-found.hbs +13 -0
  45. package/lib/plugins/service-bsb-registry-ui/templates/pages/plugin-detail.hbs +537 -0
  46. package/lib/plugins/service-bsb-registry-ui/templates/pages/plugins.hbs +40 -0
  47. package/lib/plugins/service-bsb-registry-ui/templates/partials/pagination.hbs +41 -0
  48. package/lib/plugins/service-bsb-registry-ui/templates/partials/plugin-card.hbs +40 -0
  49. package/lib/plugins/service-bsb-registry-ui/templates/partials/search-form.hbs +31 -0
  50. package/lib/schemas/service-bsb-registry-ui.json +57 -0
  51. package/lib/schemas/service-bsb-registry-ui.plugin.json +73 -0
  52. package/lib/schemas/service-bsb-registry.json +1883 -0
  53. package/lib/schemas/service-bsb-registry.plugin.json +68 -0
  54. package/package.json +60 -0
@@ -0,0 +1,1849 @@
1
+ /* Reset and Base Styles */
2
+ * {
3
+ margin: 0;
4
+ padding: 0;
5
+ box-sizing: border-box;
6
+ }
7
+
8
+ :root {
9
+ /* Core colors - matching BSB docs site */
10
+ --bg-color: #1a1a1a;
11
+ --bg-secondary: #242424;
12
+ --text-color: #ffffff;
13
+ --text-secondary: #a0a0a0;
14
+
15
+ /* Brand colors */
16
+ --primary-color: #FB8C00;
17
+ --service-color: #a200ff;
18
+ --config-color: #03A9F4;
19
+ --logging-color: #43A047;
20
+
21
+ /* UI colors */
22
+ --border-color: #3a3a3a;
23
+ --code-bg: #0d0d0d;
24
+ --card-bg: #2a2a2a;
25
+ --hover-bg: #333333;
26
+ --success-color: #43A047;
27
+ --warning-color: #FB8C00;
28
+ --error-color: #f44336;
29
+
30
+ /* Shadows */
31
+ --shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
32
+ --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.3);
33
+ }
34
+
35
+ body {
36
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;
37
+ background: var(--bg-color);
38
+ color: var(--text-color);
39
+ line-height: 1.6;
40
+ }
41
+
42
+ .container {
43
+ max-width: 1200px;
44
+ margin: 0 auto;
45
+ padding: 0 20px;
46
+ }
47
+
48
+ /* Header */
49
+ .header {
50
+ background: var(--bg-secondary);
51
+ border-bottom: 1px solid var(--border-color);
52
+ padding: 1rem 0;
53
+ position: sticky;
54
+ top: 0;
55
+ z-index: 100;
56
+ }
57
+
58
+ .header-content {
59
+ display: flex;
60
+ justify-content: space-between;
61
+ align-items: center;
62
+ }
63
+
64
+ .logo a {
65
+ font-size: 1.5rem;
66
+ font-weight: 800;
67
+ color: var(--primary-color);
68
+ text-decoration: none;
69
+ letter-spacing: -0.5px;
70
+ }
71
+
72
+ .nav {
73
+ display: flex;
74
+ gap: 0.5rem;
75
+ }
76
+
77
+ .nav-link {
78
+ color: var(--text-secondary);
79
+ text-decoration: none;
80
+ font-weight: 500;
81
+ padding: 0.5rem 1rem;
82
+ border-radius: 6px;
83
+ transition: all 0.15s ease;
84
+ }
85
+
86
+ .nav-link:hover {
87
+ color: var(--text-color);
88
+ background: var(--hover-bg);
89
+ }
90
+
91
+ .nav-link.active {
92
+ color: var(--primary-color);
93
+ }
94
+
95
+ /* Hero Section */
96
+ .hero {
97
+ background: linear-gradient(135deg, var(--primary-color), #e65100);
98
+ color: white;
99
+ padding: 4rem 2rem;
100
+ text-align: center;
101
+ }
102
+
103
+ .hero-title {
104
+ font-size: 3rem;
105
+ font-weight: 800;
106
+ margin-bottom: 1rem;
107
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
108
+ }
109
+
110
+ .hero-subtitle {
111
+ font-size: 1.25rem;
112
+ opacity: 0.9;
113
+ margin-bottom: 2rem;
114
+ max-width: 600px;
115
+ margin-left: auto;
116
+ margin-right: auto;
117
+ }
118
+
119
+ .search-box {
120
+ max-width: 600px;
121
+ margin: 0 auto 1.5rem;
122
+ display: flex;
123
+ gap: 0.5rem;
124
+ }
125
+
126
+ .search-input {
127
+ flex: 1;
128
+ padding: 0.875rem 1.25rem;
129
+ font-size: 1rem;
130
+ border: 1px solid var(--border-color);
131
+ border-radius: 8px;
132
+ background: var(--bg-secondary);
133
+ color: var(--text-color);
134
+ box-shadow: var(--shadow-lg);
135
+ }
136
+
137
+ .search-input:focus {
138
+ outline: none;
139
+ border-color: var(--primary-color);
140
+ }
141
+
142
+ .search-btn {
143
+ padding: 0.875rem 2rem;
144
+ font-size: 1rem;
145
+ font-weight: 600;
146
+ background: white;
147
+ color: var(--primary-color);
148
+ border: none;
149
+ border-radius: 8px;
150
+ cursor: pointer;
151
+ transition: all 0.2s ease;
152
+ }
153
+
154
+ .search-btn:hover {
155
+ transform: translateY(-2px);
156
+ box-shadow: 0 4px 12px rgba(255, 255, 255, 0.3);
157
+ }
158
+
159
+ .quick-filters {
160
+ display: flex;
161
+ justify-content: center;
162
+ align-items: center;
163
+ gap: 0.75rem;
164
+ flex-wrap: wrap;
165
+ }
166
+
167
+ .filter-label {
168
+ font-weight: 500;
169
+ opacity: 0.8;
170
+ }
171
+
172
+ .filter-tag {
173
+ padding: 0.5rem 1rem;
174
+ background: rgba(255, 255, 255, 0.15);
175
+ border: 1px solid rgba(255, 255, 255, 0.3);
176
+ color: white;
177
+ border-radius: 20px;
178
+ font-size: 0.875rem;
179
+ font-weight: 500;
180
+ cursor: pointer;
181
+ transition: all 0.2s ease;
182
+ }
183
+
184
+ .filter-tag:hover,
185
+ .filter-tag.active {
186
+ background: rgba(255, 255, 255, 0.3);
187
+ border-color: rgba(255, 255, 255, 0.5);
188
+ }
189
+
190
+ /* Stats */
191
+ .stats {
192
+ padding: 3rem 2rem;
193
+ background: var(--bg-color);
194
+ }
195
+
196
+ .stats-grid {
197
+ display: grid;
198
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
199
+ gap: 1.5rem;
200
+ max-width: 1200px;
201
+ margin: 0 auto;
202
+ }
203
+
204
+ .stat-card {
205
+ background: var(--card-bg);
206
+ padding: 2rem;
207
+ border-radius: 12px;
208
+ text-align: center;
209
+ border: 1px solid var(--border-color);
210
+ transition: all 0.2s ease;
211
+ }
212
+
213
+ .stat-card:hover {
214
+ transform: translateY(-2px);
215
+ box-shadow: var(--shadow-lg);
216
+ }
217
+
218
+ .stat-value {
219
+ font-size: 2.5rem;
220
+ font-weight: 700;
221
+ color: var(--primary-color);
222
+ margin-bottom: 0.5rem;
223
+ }
224
+
225
+ .stat-label {
226
+ font-size: 1rem;
227
+ color: var(--text-secondary);
228
+ }
229
+
230
+ /* Plugins Section */
231
+ .plugins {
232
+ padding: 3rem 2rem 5rem;
233
+ background: var(--bg-color);
234
+ }
235
+
236
+ .section-header {
237
+ display: flex;
238
+ justify-content: space-between;
239
+ align-items: center;
240
+ margin-bottom: 2rem;
241
+ max-width: 1200px;
242
+ margin-left: auto;
243
+ margin-right: auto;
244
+ }
245
+
246
+ .section-title {
247
+ font-size: 1.875rem;
248
+ font-weight: 700;
249
+ color: var(--text-color);
250
+ }
251
+
252
+ .sort-select {
253
+ padding: 0.5rem 1rem;
254
+ border: 1px solid var(--border-color);
255
+ border-radius: 8px;
256
+ background: var(--card-bg);
257
+ color: var(--text-color);
258
+ cursor: pointer;
259
+ font-family: inherit;
260
+ }
261
+
262
+ .sort-select:focus {
263
+ outline: none;
264
+ border-color: var(--primary-color);
265
+ }
266
+
267
+ .plugin-grid {
268
+ display: grid;
269
+ grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
270
+ gap: 1.5rem;
271
+ max-width: 1200px;
272
+ margin: 0 auto;
273
+ }
274
+
275
+ .plugin-card {
276
+ background: var(--card-bg);
277
+ padding: 1.5rem;
278
+ border-radius: 12px;
279
+ border: 1px solid var(--border-color);
280
+ transition: all 0.2s ease;
281
+ cursor: pointer;
282
+ }
283
+
284
+ .plugin-card:hover {
285
+ border-color: var(--primary-color);
286
+ box-shadow: var(--shadow-lg);
287
+ transform: translateY(-4px);
288
+ }
289
+
290
+ .card-top-tags {
291
+ margin-bottom: 0.75rem;
292
+ }
293
+
294
+ .plugin-name {
295
+ font-size: 1.25rem;
296
+ font-weight: 600;
297
+ color: var(--text-color);
298
+ margin-bottom: 0.25rem;
299
+ }
300
+
301
+ .plugin-id {
302
+ font-size: 0.875rem;
303
+ color: var(--text-secondary);
304
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
305
+ }
306
+
307
+ .plugin-description {
308
+ color: var(--text-secondary);
309
+ margin-bottom: 1rem;
310
+ line-height: 1.6;
311
+ }
312
+
313
+ .plugin-tags {
314
+ display: flex;
315
+ flex-wrap: wrap;
316
+ gap: 0.5rem;
317
+ }
318
+
319
+ .tag {
320
+ padding: 0.25rem 0.75rem;
321
+ background: var(--bg-secondary);
322
+ border-radius: 6px;
323
+ font-size: 0.75rem;
324
+ color: var(--text-secondary);
325
+ border: 1px solid var(--border-color);
326
+ }
327
+
328
+ .tag.category {
329
+ background: var(--primary-color);
330
+ color: white;
331
+ border-color: var(--primary-color);
332
+ }
333
+
334
+ .tag.language {
335
+ background: var(--success-color);
336
+ color: white;
337
+ border-color: var(--success-color);
338
+ }
339
+
340
+ .loading {
341
+ text-align: center;
342
+ padding: 3rem;
343
+ color: var(--text-secondary);
344
+ font-size: 1.125rem;
345
+ }
346
+
347
+ .error {
348
+ background: rgba(244, 67, 54, 0.1);
349
+ border: 1px solid rgba(244, 67, 54, 0.3);
350
+ color: var(--error-color);
351
+ padding: 1rem 1.5rem;
352
+ border-radius: 8px;
353
+ margin: 2rem 0;
354
+ }
355
+
356
+ /* Pagination */
357
+ .pagination {
358
+ display: flex;
359
+ justify-content: center;
360
+ gap: 0.5rem;
361
+ margin-top: 3rem;
362
+ max-width: 1200px;
363
+ margin-left: auto;
364
+ margin-right: auto;
365
+ }
366
+
367
+ .page-btn {
368
+ padding: 0.5rem 1rem;
369
+ border: 1px solid var(--border-color);
370
+ background: var(--card-bg);
371
+ color: var(--text-color);
372
+ border-radius: 6px;
373
+ cursor: pointer;
374
+ transition: all 0.2s ease;
375
+ font-family: inherit;
376
+ }
377
+
378
+ .page-btn:hover {
379
+ border-color: var(--primary-color);
380
+ color: var(--primary-color);
381
+ background: var(--hover-bg);
382
+ }
383
+
384
+ .page-btn.active {
385
+ background: var(--primary-color);
386
+ color: white;
387
+ border-color: var(--primary-color);
388
+ }
389
+
390
+ .page-btn.disabled {
391
+ cursor: default;
392
+ opacity: 0.5;
393
+ }
394
+
395
+ .page-btn.disabled:hover {
396
+ border-color: var(--border-color);
397
+ color: var(--text-color);
398
+ background: var(--card-bg);
399
+ }
400
+
401
+ /* Modal */
402
+ .modal {
403
+ display: none;
404
+ position: fixed;
405
+ top: 0;
406
+ left: 0;
407
+ width: 100%;
408
+ height: 100%;
409
+ background: rgba(0, 0, 0, 0.75);
410
+ z-index: 1000;
411
+ overflow-y: auto;
412
+ backdrop-filter: blur(4px);
413
+ }
414
+
415
+ .modal.active {
416
+ display: flex;
417
+ align-items: center;
418
+ justify-content: center;
419
+ padding: 2rem;
420
+ }
421
+
422
+ .modal-content {
423
+ background: var(--card-bg);
424
+ max-width: 900px;
425
+ width: 100%;
426
+ border-radius: 12px;
427
+ padding: 2rem;
428
+ position: relative;
429
+ border: 1px solid var(--border-color);
430
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
431
+ }
432
+
433
+ .modal-close {
434
+ position: absolute;
435
+ top: 1rem;
436
+ right: 1rem;
437
+ font-size: 2rem;
438
+ cursor: pointer;
439
+ color: var(--text-secondary);
440
+ width: 2.5rem;
441
+ height: 2.5rem;
442
+ display: flex;
443
+ align-items: center;
444
+ justify-content: center;
445
+ border-radius: 6px;
446
+ transition: all 0.2s ease;
447
+ }
448
+
449
+ .modal-close:hover {
450
+ color: var(--text-color);
451
+ background: var(--hover-bg);
452
+ }
453
+
454
+ /* Footer */
455
+ .footer {
456
+ background: var(--bg-secondary);
457
+ border-top: 1px solid var(--border-color);
458
+ padding: 2rem 0;
459
+ text-align: center;
460
+ color: var(--text-secondary);
461
+ }
462
+
463
+ .footer a {
464
+ color: var(--primary-color);
465
+ text-decoration: none;
466
+ transition: all 0.2s ease;
467
+ }
468
+
469
+ .footer a:hover {
470
+ text-decoration: underline;
471
+ color: #e65100;
472
+ }
473
+
474
+ /* Links in cards/pagination - reset anchor styling */
475
+ a.plugin-card,
476
+ a.page-btn {
477
+ text-decoration: none;
478
+ color: inherit;
479
+ }
480
+
481
+ a.filter-tag {
482
+ text-decoration: none;
483
+ color: inherit;
484
+ }
485
+
486
+ /* Browse Filters (search-form partial) */
487
+ .browse-filters {
488
+ max-width: 1200px;
489
+ margin: 0 auto 2rem;
490
+ }
491
+
492
+ .search-row {
493
+ display: flex;
494
+ gap: 0.5rem;
495
+ margin-bottom: 1rem;
496
+ }
497
+
498
+ .filter-row {
499
+ display: flex;
500
+ gap: 0.75rem;
501
+ flex-wrap: wrap;
502
+ }
503
+
504
+ /* Result Count */
505
+ .result-count {
506
+ font-size: 0.875rem;
507
+ color: var(--text-secondary);
508
+ padding: 0.25rem 0.75rem;
509
+ background: var(--bg-secondary);
510
+ border-radius: 6px;
511
+ white-space: nowrap;
512
+ }
513
+
514
+ /* Pagination Summary */
515
+ .pagination-summary {
516
+ text-align: center;
517
+ margin-top: 0.75rem;
518
+ font-size: 0.875rem;
519
+ color: var(--text-secondary);
520
+ }
521
+
522
+ /* Buttons */
523
+ .btn {
524
+ display: inline-block;
525
+ padding: 0.75rem 1.5rem;
526
+ font-size: 0.875rem;
527
+ font-weight: 600;
528
+ text-decoration: none;
529
+ border-radius: 8px;
530
+ border: none;
531
+ cursor: pointer;
532
+ transition: all 0.2s ease;
533
+ background: var(--primary-color);
534
+ color: white;
535
+ }
536
+
537
+ .btn:hover {
538
+ transform: translateY(-2px);
539
+ box-shadow: var(--shadow-lg);
540
+ background: #e65100;
541
+ }
542
+
543
+ .btn-secondary {
544
+ background: var(--card-bg);
545
+ color: var(--text-color);
546
+ border: 1px solid var(--border-color);
547
+ }
548
+
549
+ .btn-secondary:hover {
550
+ background: var(--hover-bg);
551
+ border-color: var(--primary-color);
552
+ }
553
+
554
+ /* Empty State */
555
+ .empty-state {
556
+ text-align: center;
557
+ padding: 4rem 2rem;
558
+ max-width: 600px;
559
+ margin: 0 auto;
560
+ }
561
+
562
+ .empty-state-code {
563
+ font-size: 6rem;
564
+ font-weight: 800;
565
+ color: var(--primary-color);
566
+ margin-bottom: 1rem;
567
+ line-height: 1;
568
+ }
569
+
570
+ .empty-state-title {
571
+ font-size: 1.5rem;
572
+ font-weight: 600;
573
+ color: var(--text-color);
574
+ margin-bottom: 0.75rem;
575
+ }
576
+
577
+ .empty-state-text {
578
+ font-size: 1rem;
579
+ color: var(--text-secondary);
580
+ margin-bottom: 2rem;
581
+ line-height: 1.6;
582
+ }
583
+
584
+ .empty-state-actions {
585
+ display: flex;
586
+ gap: 1rem;
587
+ justify-content: center;
588
+ }
589
+
590
+ /* Breadcrumb */
591
+ .breadcrumb {
592
+ margin-bottom: 1.5rem;
593
+ }
594
+
595
+ .breadcrumb a {
596
+ color: var(--text-secondary);
597
+ text-decoration: none;
598
+ font-size: 0.875rem;
599
+ transition: color 0.15s ease;
600
+ }
601
+
602
+ .breadcrumb a:hover {
603
+ color: var(--primary-color);
604
+ }
605
+
606
+ /* Detail Page */
607
+ .detail-tab-nav {
608
+ display: flex;
609
+ gap: 0.5rem;
610
+ overflow-x: auto;
611
+ margin-bottom: 1rem;
612
+ padding-bottom: 0.25rem;
613
+ }
614
+
615
+ .detail-tab-btn {
616
+ appearance: none;
617
+ border: 1px solid var(--border-color);
618
+ background: var(--card-bg);
619
+ color: var(--text-secondary);
620
+ font-size: 0.8125rem;
621
+ font-weight: 600;
622
+ line-height: 1;
623
+ padding: 0.625rem 0.875rem;
624
+ border-radius: 8px;
625
+ cursor: pointer;
626
+ white-space: nowrap;
627
+ transition: all 0.15s ease;
628
+ }
629
+
630
+ .detail-tab-btn:hover {
631
+ color: var(--text-color);
632
+ border-color: var(--primary-color);
633
+ }
634
+
635
+ .detail-tab-btn.active {
636
+ background: var(--card-bg);
637
+ border-color: var(--border-color);
638
+ border-bottom-color: var(--card-bg);
639
+ color: var(--text-color);
640
+ }
641
+
642
+ .detail-tab-panel {
643
+ display: none;
644
+ }
645
+
646
+ .detail-tab-panel.active {
647
+ display: block;
648
+ }
649
+
650
+ .detail-card {
651
+ background: var(--card-bg);
652
+ border: 1px solid var(--border-color);
653
+ border-radius: 12px;
654
+ padding: 2rem;
655
+ margin-bottom: 1.5rem;
656
+ }
657
+
658
+ .detail-tabs-shell {
659
+ padding: 0;
660
+ overflow: hidden;
661
+ }
662
+
663
+ .detail-tabs-shell > .detail-tab-nav {
664
+ margin: 0;
665
+ padding: 0.75rem;
666
+ border-bottom: 1px solid var(--border-color);
667
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.01));
668
+ gap: 0.5rem;
669
+ }
670
+
671
+ .detail-tabs-shell > .detail-tab-nav .detail-tab-btn {
672
+ background: rgba(255, 255, 255, 0.03);
673
+ border: 1px solid rgba(255, 255, 255, 0.08);
674
+ border-radius: 999px;
675
+ color: var(--text-secondary);
676
+ padding: 0.6rem 1rem;
677
+ font-size: 0.78rem;
678
+ letter-spacing: 0.02em;
679
+ }
680
+
681
+ .detail-tabs-shell > .detail-tab-nav .detail-tab-btn.active {
682
+ background: var(--primary-color);
683
+ border-color: var(--primary-color);
684
+ color: #fff;
685
+ box-shadow: 0 6px 14px rgba(251, 140, 0, 0.28);
686
+ }
687
+
688
+ .detail-tabs-shell > .detail-tab-nav .detail-tab-btn:hover {
689
+ color: var(--text-color);
690
+ border-color: rgba(255, 255, 255, 0.2);
691
+ background: rgba(255, 255, 255, 0.06);
692
+ }
693
+
694
+ .detail-tabs-shell > .detail-tab-nav .detail-tab-btn.active:hover {
695
+ color: #fff;
696
+ border-color: var(--primary-color);
697
+ background: var(--primary-color);
698
+ }
699
+
700
+ .detail-tabs-shell .detail-tab-panels {
701
+ background: var(--card-bg);
702
+ }
703
+
704
+ .detail-tabs-shell .detail-tab-panel {
705
+ padding: 1.75rem 2rem 2rem;
706
+ }
707
+
708
+ .detail-title {
709
+ font-size: 2rem;
710
+ font-weight: 700;
711
+ color: var(--text-color);
712
+ margin-bottom: 0.5rem;
713
+ }
714
+
715
+ .detail-id {
716
+ margin-bottom: 1rem;
717
+ }
718
+
719
+ .detail-id code {
720
+ font-size: 0.875rem;
721
+ color: var(--text-secondary);
722
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
723
+ background: var(--code-bg);
724
+ padding: 0.25rem 0.5rem;
725
+ border-radius: 4px;
726
+ }
727
+
728
+ .detail-description {
729
+ color: var(--text-secondary);
730
+ margin-bottom: 1.5rem;
731
+ line-height: 1.6;
732
+ }
733
+
734
+ .detail-section-title {
735
+ font-size: 1.25rem;
736
+ font-weight: 600;
737
+ color: var(--text-color);
738
+ margin-bottom: 1rem;
739
+ }
740
+
741
+
742
+ /* Event type colors */
743
+ .event-emit {
744
+ color: var(--warning-color);
745
+ }
746
+
747
+ .event-on {
748
+ color: var(--config-color);
749
+ }
750
+
751
+ .event-returnable {
752
+ color: var(--service-color);
753
+ }
754
+
755
+ .event-broadcast {
756
+ color: var(--success-color);
757
+ }
758
+
759
+ /* Top tags (category/language/version above title) */
760
+ .detail-top-tags {
761
+ margin-bottom: 0.75rem;
762
+ }
763
+
764
+ /* README / Documentation inside first card */
765
+ .detail-card > .readme-content {
766
+ margin-top: 1.5rem;
767
+ }
768
+
769
+ /* Documentation tabs */
770
+ .doc-tabs {
771
+ margin-top: 0;
772
+ }
773
+
774
+ .doc-tab-bar {
775
+ display: flex;
776
+ gap: 0;
777
+ border-bottom: 1px solid var(--border-color);
778
+ margin-bottom: 0;
779
+ overflow-x: auto;
780
+ }
781
+
782
+ .doc-tab-btn {
783
+ padding: 0.625rem 1.25rem;
784
+ font-size: 0.875rem;
785
+ font-weight: 500;
786
+ color: var(--text-secondary);
787
+ background: none;
788
+ border: none;
789
+ border-bottom: 2px solid transparent;
790
+ cursor: pointer;
791
+ transition: all 0.15s ease;
792
+ white-space: nowrap;
793
+ font-family: inherit;
794
+ }
795
+
796
+ .doc-tab-btn:hover {
797
+ color: var(--text-color);
798
+ background: rgba(255, 255, 255, 0.03);
799
+ }
800
+
801
+ .doc-tab-btn.active {
802
+ color: var(--primary-color);
803
+ border-bottom-color: var(--primary-color);
804
+ }
805
+
806
+ .doc-tab-panel {
807
+ display: none;
808
+ }
809
+
810
+ .doc-tab-panel.active {
811
+ display: block;
812
+ }
813
+
814
+ /* Event Schema */
815
+ .event-section-title {
816
+ font-size: 1.125rem;
817
+ font-weight: 600;
818
+ margin: 2rem 0 0.25rem;
819
+ padding-bottom: 0.5rem;
820
+ border-bottom: 1px solid var(--border-color);
821
+ }
822
+
823
+ .event-section-title:first-of-type {
824
+ margin-top: 0.5rem;
825
+ }
826
+
827
+ .event-section-desc {
828
+ font-size: 0.8125rem;
829
+ color: var(--text-secondary);
830
+ margin-bottom: 0.75rem;
831
+ }
832
+
833
+ details.event-item {
834
+ padding: 0;
835
+ margin-bottom: 0.75rem;
836
+ background: var(--bg-secondary);
837
+ border: 1px solid var(--border-color);
838
+ border-radius: 8px;
839
+ transition: border-color 0.15s ease;
840
+ }
841
+
842
+ details.event-item:hover {
843
+ border-color: rgba(255, 255, 255, 0.15);
844
+ }
845
+
846
+ details.event-item:last-child {
847
+ margin-bottom: 0;
848
+ }
849
+
850
+ details.event-item[open] {
851
+ border-color: rgba(255, 255, 255, 0.2);
852
+ }
853
+
854
+ /* Summary (collapsed header) */
855
+ .event-item-summary {
856
+ padding: 1rem;
857
+ cursor: pointer;
858
+ list-style: none;
859
+ position: relative;
860
+ padding-right: 2.5rem;
861
+ }
862
+
863
+ .event-item-summary::-webkit-details-marker {
864
+ display: none;
865
+ }
866
+
867
+ /* Expand indicator */
868
+ .event-item-summary::after {
869
+ content: '+';
870
+ position: absolute;
871
+ right: 1rem;
872
+ top: 1rem;
873
+ font-size: 1.125rem;
874
+ font-weight: 300;
875
+ color: var(--text-secondary);
876
+ line-height: 1;
877
+ transition: transform 0.15s ease;
878
+ }
879
+
880
+ details.event-item[open] > .event-item-summary::after {
881
+ content: '-';
882
+ }
883
+
884
+ /* Expanded body */
885
+ .event-item-body {
886
+ padding: 0 1rem 1rem;
887
+ border-top: 1px solid var(--border-color);
888
+ margin-top: 0;
889
+ padding-top: 0.75rem;
890
+ }
891
+
892
+ .event-item-header {
893
+ display: flex;
894
+ align-items: center;
895
+ gap: 0.75rem;
896
+ flex-wrap: wrap;
897
+ }
898
+
899
+ .event-item-header code {
900
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
901
+ font-size: 0.875rem;
902
+ font-weight: 600;
903
+ background: var(--code-bg);
904
+ padding: 0.25rem 0.625rem;
905
+ border-radius: 4px;
906
+ }
907
+
908
+ .event-type-badge {
909
+ font-size: 0.6875rem;
910
+ font-weight: 600;
911
+ text-transform: uppercase;
912
+ letter-spacing: 0.05em;
913
+ padding: 0.15rem 0.5rem;
914
+ border-radius: 4px;
915
+ border: 1px solid;
916
+ }
917
+
918
+ .event-type-badge.returnable {
919
+ color: var(--service-color);
920
+ border-color: var(--service-color);
921
+ background: rgba(162, 0, 255, 0.08);
922
+ }
923
+
924
+ .event-type-badge.emit {
925
+ color: var(--warning-color);
926
+ border-color: var(--warning-color);
927
+ background: rgba(251, 140, 0, 0.08);
928
+ }
929
+
930
+ .event-type-badge.on {
931
+ color: var(--config-color);
932
+ border-color: var(--config-color);
933
+ background: rgba(3, 169, 244, 0.08);
934
+ }
935
+
936
+ .event-type-badge.broadcast {
937
+ color: var(--success-color);
938
+ border-color: var(--success-color);
939
+ background: rgba(67, 160, 71, 0.08);
940
+ }
941
+
942
+ .event-description {
943
+ margin: 0.5rem 0 0;
944
+ font-size: 0.875rem;
945
+ color: var(--text-secondary);
946
+ line-height: 1.5;
947
+ }
948
+
949
+ /* Event schema property blocks */
950
+ .event-schema-block {
951
+ margin-top: 0.75rem;
952
+ }
953
+
954
+ .event-schema-label {
955
+ display: block;
956
+ font-size: 0.6875rem;
957
+ font-weight: 600;
958
+ text-transform: uppercase;
959
+ letter-spacing: 0.06em;
960
+ color: var(--text-secondary);
961
+ margin-bottom: 0.375rem;
962
+ }
963
+
964
+ .event-props {
965
+ background: var(--code-bg);
966
+ border: 1px solid var(--border-color);
967
+ border-radius: 6px;
968
+ padding: 0.5rem 0;
969
+ overflow-x: auto;
970
+ }
971
+
972
+ .event-prop {
973
+ display: flex;
974
+ align-items: baseline;
975
+ gap: 0.5rem;
976
+ padding: 0.25rem 0.75rem;
977
+ font-size: 0.8125rem;
978
+ flex-wrap: wrap;
979
+ }
980
+
981
+ .event-prop:hover {
982
+ background: rgba(255, 255, 255, 0.02);
983
+ }
984
+
985
+ .event-prop-name {
986
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
987
+ font-weight: 600;
988
+ color: var(--text-color);
989
+ background: none;
990
+ padding: 0;
991
+ border: none;
992
+ font-size: 0.8125rem;
993
+ }
994
+
995
+ .event-prop-type {
996
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
997
+ font-size: 0.75rem;
998
+ color: var(--primary-color);
999
+ opacity: 0.85;
1000
+ }
1001
+
1002
+ .event-prop-optional {
1003
+ font-size: 0.6875rem;
1004
+ color: var(--text-secondary);
1005
+ opacity: 0.65;
1006
+ font-style: italic;
1007
+ }
1008
+
1009
+ .event-prop-desc {
1010
+ font-size: 0.75rem;
1011
+ color: var(--text-secondary);
1012
+ flex-basis: 100%;
1013
+ padding-left: 0;
1014
+ margin-top: 0.125rem;
1015
+ }
1016
+
1017
+ /* Config section */
1018
+ .config-tree {
1019
+ border: 1px solid var(--border-color);
1020
+ border-radius: 10px;
1021
+ background: var(--bg-secondary);
1022
+ overflow: hidden;
1023
+ padding: 0.35rem 0;
1024
+ }
1025
+
1026
+ .config-tree-node {
1027
+ padding: 0.45rem 0.75rem 0.5rem;
1028
+ margin-left: calc(var(--config-level) * 1.1rem);
1029
+ border-left: 2px solid rgba(255, 255, 255, 0.08);
1030
+ position: relative;
1031
+ }
1032
+
1033
+ .config-tree-node::before {
1034
+ content: "";
1035
+ position: absolute;
1036
+ left: -2px;
1037
+ top: 1.1rem;
1038
+ width: 0.7rem;
1039
+ border-top: 1px solid rgba(255, 255, 255, 0.14);
1040
+ }
1041
+
1042
+ .config-tree-node.is-object {
1043
+ background: rgba(255, 255, 255, 0.02);
1044
+ }
1045
+
1046
+ .config-tree-node.is-field {
1047
+ background: transparent;
1048
+ }
1049
+
1050
+ .config-tree-head {
1051
+ display: flex;
1052
+ align-items: center;
1053
+ flex-wrap: wrap;
1054
+ gap: 0.35rem 0.55rem;
1055
+ }
1056
+
1057
+ .config-key {
1058
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
1059
+ font-size: 0.8rem;
1060
+ font-weight: 600;
1061
+ color: var(--text-color);
1062
+ }
1063
+
1064
+ .config-row-path {
1065
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
1066
+ font-size: 0.68rem;
1067
+ color: var(--text-secondary);
1068
+ opacity: 0.75;
1069
+ }
1070
+
1071
+ .config-type {
1072
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
1073
+ font-size: 0.72rem;
1074
+ color: var(--primary-color);
1075
+ }
1076
+
1077
+ .config-pill {
1078
+ font-size: 0.65rem;
1079
+ text-transform: uppercase;
1080
+ letter-spacing: 0.04em;
1081
+ color: var(--text-secondary);
1082
+ border: 1px solid var(--border-color);
1083
+ border-radius: 999px;
1084
+ padding: 0.1rem 0.45rem;
1085
+ }
1086
+
1087
+ .config-pill-default {
1088
+ text-transform: none;
1089
+ letter-spacing: 0;
1090
+ }
1091
+
1092
+ .config-pill-branch {
1093
+ border-color: rgba(3, 169, 244, 0.45);
1094
+ color: #81d4fa;
1095
+ }
1096
+
1097
+ .config-tree-desc {
1098
+ font-size: 0.75rem;
1099
+ color: var(--text-secondary);
1100
+ margin-top: 0.2rem;
1101
+ margin-left: 0.1rem;
1102
+ }
1103
+
1104
+ /* Supported feature groups */
1105
+ .feature-group {
1106
+ margin-bottom: 1.5rem;
1107
+ }
1108
+
1109
+ .feature-group:last-child {
1110
+ margin-bottom: 0;
1111
+ }
1112
+
1113
+ .feature-group-title {
1114
+ font-size: 0.95rem;
1115
+ font-weight: 600;
1116
+ color: var(--text-color);
1117
+ margin: 0 0 0.6rem;
1118
+ }
1119
+
1120
+ .feature-chip-list {
1121
+ display: flex;
1122
+ flex-wrap: wrap;
1123
+ gap: 0.5rem;
1124
+ }
1125
+
1126
+ .feature-chip {
1127
+ display: inline-flex;
1128
+ align-items: center;
1129
+ gap: 0.5rem;
1130
+ padding: 0.35rem 0.55rem;
1131
+ border-radius: 999px;
1132
+ border: 1px solid var(--border-color);
1133
+ background: var(--code-bg);
1134
+ }
1135
+
1136
+ .feature-chip-name {
1137
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
1138
+ font-size: 0.75rem;
1139
+ color: var(--text-color);
1140
+ }
1141
+
1142
+ .feature-chip-state {
1143
+ font-size: 0.67rem;
1144
+ text-transform: uppercase;
1145
+ letter-spacing: 0.04em;
1146
+ font-weight: 600;
1147
+ }
1148
+
1149
+ .feature-chip.is-supported {
1150
+ border-color: rgba(67, 160, 71, 0.45);
1151
+ background: rgba(67, 160, 71, 0.12);
1152
+ }
1153
+
1154
+ .feature-chip.is-supported .feature-chip-state {
1155
+ color: #66bb6a;
1156
+ }
1157
+
1158
+ .feature-chip.is-unsupported {
1159
+ border-color: rgba(255, 255, 255, 0.16);
1160
+ background: rgba(255, 255, 255, 0.03);
1161
+ }
1162
+
1163
+ .feature-chip.is-unsupported .feature-chip-state {
1164
+ color: var(--text-secondary);
1165
+ opacity: 0.8;
1166
+ }
1167
+
1168
+ /* Installation blocks */
1169
+ .install-block {
1170
+ margin-bottom: 1.5rem;
1171
+ }
1172
+
1173
+ .install-block:last-child {
1174
+ margin-bottom: 0;
1175
+ }
1176
+
1177
+ .install-label {
1178
+ font-size: 0.75rem;
1179
+ font-weight: 600;
1180
+ color: var(--text-secondary);
1181
+ text-transform: uppercase;
1182
+ letter-spacing: 0.05em;
1183
+ margin-bottom: 0.5rem;
1184
+ }
1185
+
1186
+ .install-block pre {
1187
+ background: var(--code-bg);
1188
+ border: 1px solid var(--border-color);
1189
+ border-radius: 8px;
1190
+ padding: 1rem 1.25rem;
1191
+ overflow-x: auto;
1192
+ }
1193
+
1194
+ .install-block code {
1195
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
1196
+ font-size: 0.875rem;
1197
+ color: var(--text-color);
1198
+ }
1199
+
1200
+ /* Version List */
1201
+ .version-list {
1202
+ display: flex;
1203
+ flex-wrap: wrap;
1204
+ gap: 0.5rem;
1205
+ }
1206
+
1207
+ /* Dependencies */
1208
+ .dependency-list {
1209
+ display: flex;
1210
+ flex-direction: column;
1211
+ gap: 0.5rem;
1212
+ }
1213
+
1214
+ .dependency-item {
1215
+ display: flex;
1216
+ align-items: center;
1217
+ gap: 0.75rem;
1218
+ padding: 0.75rem 1rem;
1219
+ background: var(--bg-secondary);
1220
+ border: 1px solid var(--border-color);
1221
+ border-radius: 8px;
1222
+ transition: border-color 0.15s ease;
1223
+ }
1224
+
1225
+ .dependency-item:hover {
1226
+ border-color: var(--primary-color);
1227
+ }
1228
+
1229
+ .dependency-link {
1230
+ display: flex;
1231
+ align-items: center;
1232
+ gap: 0.75rem;
1233
+ text-decoration: none;
1234
+ color: inherit;
1235
+ flex: 1;
1236
+ }
1237
+
1238
+ .dependency-id {
1239
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
1240
+ font-size: 0.875rem;
1241
+ font-weight: 600;
1242
+ color: var(--primary-color);
1243
+ background: var(--code-bg);
1244
+ padding: 0.25rem 0.5rem;
1245
+ border-radius: 4px;
1246
+ }
1247
+
1248
+ .dependency-version {
1249
+ font-size: 0.875rem;
1250
+ color: var(--text-secondary);
1251
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
1252
+ }
1253
+
1254
+ .dependency-none {
1255
+ color: var(--text-secondary);
1256
+ font-style: italic;
1257
+ margin: 0;
1258
+ }
1259
+
1260
+ /* README / Rendered Markdown */
1261
+ .readme-content {
1262
+ background: var(--bg-secondary);
1263
+ border: 1px solid var(--border-color);
1264
+ border-radius: 8px;
1265
+ padding: 2rem 2.5rem;
1266
+ overflow-x: auto;
1267
+ }
1268
+
1269
+ /* Markdown body - rendered HTML content */
1270
+ .markdown-body {
1271
+ font-size: 0.9375rem;
1272
+ line-height: 1.7;
1273
+ color: var(--text-color);
1274
+ word-wrap: break-word;
1275
+ }
1276
+
1277
+ .markdown-body > *:first-child {
1278
+ margin-top: 0;
1279
+ }
1280
+
1281
+ .markdown-body > *:last-child {
1282
+ margin-bottom: 0;
1283
+ }
1284
+
1285
+ /* Headings */
1286
+ .markdown-body h1,
1287
+ .markdown-body h2,
1288
+ .markdown-body h3,
1289
+ .markdown-body h4,
1290
+ .markdown-body h5,
1291
+ .markdown-body h6 {
1292
+ color: var(--text-color);
1293
+ font-weight: 600;
1294
+ line-height: 1.3;
1295
+ margin-top: 1.75em;
1296
+ margin-bottom: 0.75em;
1297
+ }
1298
+
1299
+ .markdown-body h1 {
1300
+ font-size: 1.75rem;
1301
+ font-weight: 700;
1302
+ padding-bottom: 0.5em;
1303
+ border-bottom: 1px solid var(--border-color);
1304
+ }
1305
+
1306
+ .markdown-body h2 {
1307
+ font-size: 1.375rem;
1308
+ padding-bottom: 0.4em;
1309
+ border-bottom: 1px solid var(--border-color);
1310
+ }
1311
+
1312
+ .markdown-body h3 {
1313
+ font-size: 1.125rem;
1314
+ }
1315
+
1316
+ .markdown-body h4 {
1317
+ font-size: 1rem;
1318
+ }
1319
+
1320
+ .markdown-body h5 {
1321
+ font-size: 0.875rem;
1322
+ text-transform: uppercase;
1323
+ letter-spacing: 0.03em;
1324
+ color: var(--text-secondary);
1325
+ }
1326
+
1327
+ .markdown-body h6 {
1328
+ font-size: 0.8125rem;
1329
+ text-transform: uppercase;
1330
+ letter-spacing: 0.03em;
1331
+ color: var(--text-secondary);
1332
+ }
1333
+
1334
+ /* Paragraphs */
1335
+ .markdown-body p {
1336
+ margin-top: 0;
1337
+ margin-bottom: 1em;
1338
+ }
1339
+
1340
+ /* Links */
1341
+ .markdown-body a {
1342
+ color: var(--primary-color);
1343
+ text-decoration: none;
1344
+ font-weight: 500;
1345
+ }
1346
+
1347
+ .markdown-body a:hover {
1348
+ text-decoration: underline;
1349
+ color: #e65100;
1350
+ }
1351
+
1352
+ /* Inline code */
1353
+ .markdown-body code {
1354
+ font-family: 'Monaco', 'Menlo', 'Consolas', 'Liberation Mono', monospace;
1355
+ font-size: 0.8125em;
1356
+ padding: 0.2em 0.45em;
1357
+ background: var(--code-bg);
1358
+ border: 1px solid var(--border-color);
1359
+ border-radius: 4px;
1360
+ color: var(--primary-color);
1361
+ }
1362
+
1363
+ /* Code blocks */
1364
+ .markdown-body pre {
1365
+ background: var(--code-bg);
1366
+ border: 1px solid var(--border-color);
1367
+ border-radius: 8px;
1368
+ padding: 1rem 1.25rem;
1369
+ overflow-x: auto;
1370
+ margin-top: 0;
1371
+ margin-bottom: 1.25em;
1372
+ line-height: 1.5;
1373
+ }
1374
+
1375
+ .markdown-body pre code {
1376
+ background: none;
1377
+ border: none;
1378
+ padding: 0;
1379
+ font-size: 0.8125rem;
1380
+ color: var(--text-color);
1381
+ border-radius: 0;
1382
+ }
1383
+
1384
+ /* highlight.js overrides -- keep our background, let hljs handle token colors */
1385
+ .markdown-body pre code.hljs {
1386
+ background: none;
1387
+ padding: 0;
1388
+ color: inherit;
1389
+ }
1390
+
1391
+ .markdown-body pre .hljs {
1392
+ background: none;
1393
+ }
1394
+
1395
+ /* Blockquotes */
1396
+ .markdown-body blockquote {
1397
+ margin: 0 0 1.25em;
1398
+ padding: 0.5em 1.25em;
1399
+ border-left: 4px solid var(--primary-color);
1400
+ background: rgba(251, 140, 0, 0.05);
1401
+ border-radius: 0 6px 6px 0;
1402
+ color: var(--text-secondary);
1403
+ }
1404
+
1405
+ .markdown-body blockquote p:last-child {
1406
+ margin-bottom: 0;
1407
+ }
1408
+
1409
+ .markdown-body blockquote blockquote {
1410
+ border-left-color: var(--border-color);
1411
+ }
1412
+
1413
+ /* Lists */
1414
+ .markdown-body ul,
1415
+ .markdown-body ol {
1416
+ margin-top: 0;
1417
+ margin-bottom: 1em;
1418
+ padding-left: 1.75em;
1419
+ }
1420
+
1421
+ .markdown-body li {
1422
+ margin-bottom: 0.35em;
1423
+ }
1424
+
1425
+ .markdown-body li > ul,
1426
+ .markdown-body li > ol {
1427
+ margin-top: 0.35em;
1428
+ margin-bottom: 0;
1429
+ }
1430
+
1431
+ .markdown-body ul {
1432
+ list-style: disc;
1433
+ }
1434
+
1435
+ .markdown-body ul ul {
1436
+ list-style: circle;
1437
+ }
1438
+
1439
+ .markdown-body ul ul ul {
1440
+ list-style: square;
1441
+ }
1442
+
1443
+ /* Task lists */
1444
+ .markdown-body input[type="checkbox"] {
1445
+ margin-right: 0.5em;
1446
+ vertical-align: middle;
1447
+ position: relative;
1448
+ top: -1px;
1449
+ }
1450
+
1451
+ /* Tables */
1452
+ .markdown-body table {
1453
+ width: 100%;
1454
+ border-collapse: collapse;
1455
+ margin-bottom: 1.25em;
1456
+ overflow: auto;
1457
+ display: block;
1458
+ }
1459
+
1460
+ .markdown-body table th,
1461
+ .markdown-body table td {
1462
+ padding: 0.625rem 1rem;
1463
+ border: 1px solid var(--border-color);
1464
+ text-align: left;
1465
+ }
1466
+
1467
+ .markdown-body table th {
1468
+ background: var(--code-bg);
1469
+ font-weight: 600;
1470
+ font-size: 0.8125rem;
1471
+ text-transform: uppercase;
1472
+ letter-spacing: 0.03em;
1473
+ color: var(--text-secondary);
1474
+ }
1475
+
1476
+ .markdown-body table tr:nth-child(even) {
1477
+ background: rgba(255, 255, 255, 0.02);
1478
+ }
1479
+
1480
+ .markdown-body table tr:hover {
1481
+ background: rgba(251, 140, 0, 0.04);
1482
+ }
1483
+
1484
+ /* Horizontal rules */
1485
+ .markdown-body hr {
1486
+ border: none;
1487
+ border-top: 1px solid var(--border-color);
1488
+ margin: 2em 0;
1489
+ }
1490
+
1491
+ /* Images */
1492
+ .markdown-body img {
1493
+ max-width: 100%;
1494
+ height: auto;
1495
+ border-radius: 8px;
1496
+ margin: 0.5em 0;
1497
+ }
1498
+
1499
+ /* Strong and emphasis */
1500
+ .markdown-body strong {
1501
+ font-weight: 600;
1502
+ color: var(--text-color);
1503
+ }
1504
+
1505
+ .markdown-body em {
1506
+ font-style: italic;
1507
+ }
1508
+
1509
+ /* Definition lists (dl/dt/dd) */
1510
+ .markdown-body dl {
1511
+ margin-bottom: 1em;
1512
+ }
1513
+
1514
+ .markdown-body dt {
1515
+ font-weight: 600;
1516
+ margin-top: 0.75em;
1517
+ }
1518
+
1519
+ .markdown-body dd {
1520
+ margin-left: 1.5em;
1521
+ margin-bottom: 0.5em;
1522
+ color: var(--text-secondary);
1523
+ }
1524
+
1525
+ /* Keyboard */
1526
+ .markdown-body kbd {
1527
+ display: inline-block;
1528
+ padding: 0.15em 0.4em;
1529
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
1530
+ font-size: 0.75em;
1531
+ line-height: 1;
1532
+ color: var(--text-color);
1533
+ vertical-align: middle;
1534
+ background: var(--bg-color);
1535
+ border: 1px solid var(--border-color);
1536
+ border-radius: 4px;
1537
+ box-shadow: inset 0 -1px 0 var(--border-color);
1538
+ }
1539
+
1540
+ /* Metadata Grid */
1541
+ .metadata-grid {
1542
+ display: grid;
1543
+ grid-template-columns: auto 1fr;
1544
+ gap: 0.75rem 1.5rem;
1545
+ align-items: baseline;
1546
+ }
1547
+
1548
+ .metadata-label {
1549
+ font-size: 0.75rem;
1550
+ font-weight: 600;
1551
+ color: var(--text-secondary);
1552
+ text-transform: uppercase;
1553
+ letter-spacing: 0.05em;
1554
+ }
1555
+
1556
+ .metadata-value {
1557
+ font-size: 0.875rem;
1558
+ color: var(--text-color);
1559
+ word-break: break-word;
1560
+ }
1561
+
1562
+ .metadata-value a {
1563
+ color: var(--primary-color);
1564
+ text-decoration: none;
1565
+ }
1566
+
1567
+ .metadata-value a:hover {
1568
+ text-decoration: underline;
1569
+ }
1570
+
1571
+ /* Container (override) */
1572
+ .container {
1573
+ max-width: 1200px;
1574
+ margin: 0 auto;
1575
+ padding: 0 2rem;
1576
+ }
1577
+
1578
+ /* Responsive */
1579
+ @media (max-width: 900px) {
1580
+ .hero-title {
1581
+ font-size: 2rem;
1582
+ }
1583
+
1584
+ .hero-subtitle {
1585
+ font-size: 1rem;
1586
+ }
1587
+
1588
+ .search-box {
1589
+ flex-direction: column;
1590
+ }
1591
+
1592
+ .search-row {
1593
+ flex-direction: column;
1594
+ }
1595
+
1596
+ .filter-row {
1597
+ flex-direction: column;
1598
+ }
1599
+
1600
+ .plugin-grid {
1601
+ grid-template-columns: 1fr;
1602
+ }
1603
+
1604
+ .stats-grid {
1605
+ grid-template-columns: 1fr;
1606
+ }
1607
+
1608
+ .section-header {
1609
+ flex-direction: column;
1610
+ gap: 1rem;
1611
+ align-items: flex-start;
1612
+ }
1613
+
1614
+ .metadata-grid {
1615
+ grid-template-columns: 1fr;
1616
+ }
1617
+
1618
+ .empty-state-actions {
1619
+ flex-direction: column;
1620
+ align-items: center;
1621
+ }
1622
+ }
1623
+
1624
+ @media (max-width: 480px) {
1625
+ .hero {
1626
+ padding: 3rem 1.5rem;
1627
+ }
1628
+
1629
+ .hero-title {
1630
+ font-size: 1.75rem;
1631
+ }
1632
+
1633
+ .stats,
1634
+ .plugins {
1635
+ padding: 2rem 1rem;
1636
+ }
1637
+
1638
+ .modal-content {
1639
+ padding: 1.5rem;
1640
+ }
1641
+
1642
+ .detail-card {
1643
+ padding: 1.25rem;
1644
+ }
1645
+
1646
+ .detail-tabs-shell {
1647
+ padding: 0;
1648
+ }
1649
+
1650
+ .detail-tabs-shell > .detail-tab-nav {
1651
+ padding: 0.625rem 0.625rem 0;
1652
+ }
1653
+
1654
+ .detail-tabs-shell .detail-tab-panel {
1655
+ padding: 1.1rem 1rem 1.25rem;
1656
+ }
1657
+
1658
+ .detail-title {
1659
+ font-size: 1.5rem;
1660
+ }
1661
+
1662
+ }
1663
+
1664
+ /* Marketplace-style plugin cards */
1665
+ .plugin-grid {
1666
+ display: grid;
1667
+ grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
1668
+ gap: 1.5rem;
1669
+ max-width: 1200px;
1670
+ margin: 0 auto;
1671
+ }
1672
+
1673
+ .plugin-card {
1674
+ background: var(--card-bg);
1675
+ border: 1px solid var(--border-color);
1676
+ border-radius: 12px;
1677
+ overflow: hidden;
1678
+ display: flex;
1679
+ flex-direction: column;
1680
+ text-decoration: none;
1681
+ color: inherit;
1682
+ transition: all 0.2s ease;
1683
+ position: relative;
1684
+ padding: 0;
1685
+ }
1686
+
1687
+ .plugin-card:hover {
1688
+ border-color: var(--primary-color);
1689
+ box-shadow: var(--shadow-lg);
1690
+ transform: translateY(-3px);
1691
+ }
1692
+
1693
+ .plugin-image {
1694
+ width: 100%;
1695
+ height: 210px;
1696
+ border-bottom: 1px solid var(--border-color);
1697
+ position: relative;
1698
+ background: linear-gradient(135deg, var(--bg-secondary), var(--code-bg));
1699
+ overflow: hidden;
1700
+ margin: 0;
1701
+ padding: 0;
1702
+ display: block;
1703
+ }
1704
+
1705
+ .plugin-image img {
1706
+ width: 100%;
1707
+ height: 100%;
1708
+ object-fit: contain;
1709
+ display: block;
1710
+ }
1711
+
1712
+ .plugin-image.placeholder {
1713
+ background: linear-gradient(135deg, #2f2f2f, #1f1f1f);
1714
+ display: flex;
1715
+ align-items: center;
1716
+ justify-content: center;
1717
+ }
1718
+
1719
+ .plugin-image-fallback {
1720
+ text-transform: uppercase;
1721
+ font-size: 0.75rem;
1722
+ letter-spacing: 0.1em;
1723
+ color: var(--text-secondary);
1724
+ border: 1px dashed var(--border-color);
1725
+ border-radius: 999px;
1726
+ padding: 0.35rem 0.75rem;
1727
+ }
1728
+
1729
+ .plugin-badges {
1730
+ display: flex;
1731
+ flex-direction: column;
1732
+ align-items: flex-end;
1733
+ gap: 0.3rem;
1734
+ }
1735
+
1736
+ .plugin-badge {
1737
+ font-size: 0.6875rem;
1738
+ font-weight: 600;
1739
+ letter-spacing: 0.03em;
1740
+ border-radius: 6px;
1741
+ padding: 0.15rem 0.5rem;
1742
+ border: 1px solid rgba(255, 255, 255, 0.12);
1743
+ color: #fff;
1744
+ text-transform: uppercase;
1745
+ background: #2f2f2f;
1746
+ }
1747
+
1748
+ .badge-version {
1749
+ background: #111111;
1750
+ border-color: #2d2d2d;
1751
+ }
1752
+
1753
+ .badge-category {
1754
+ background: #fb8c00;
1755
+ border-color: #fb8c00;
1756
+ }
1757
+
1758
+ .badge-language {
1759
+ background: #43a047;
1760
+ border-color: #43a047;
1761
+ }
1762
+
1763
+ .badge-core {
1764
+ background: #03a9f4;
1765
+ border-color: #03a9f4;
1766
+ }
1767
+
1768
+ .badge-official {
1769
+ background: #1e88e5;
1770
+ border-color: #1e88e5;
1771
+ }
1772
+
1773
+ .badge-org,
1774
+ .badge-custom {
1775
+ background: #5e35b1;
1776
+ border-color: #5e35b1;
1777
+ }
1778
+
1779
+ .badge-community {
1780
+ background: #616161;
1781
+ border-color: #616161;
1782
+ }
1783
+
1784
+ .plugin-content {
1785
+ padding: 1rem 1.2rem 1.2rem;
1786
+ display: flex;
1787
+ flex-direction: column;
1788
+ gap: 0.8rem;
1789
+ }
1790
+
1791
+ .plugin-header {
1792
+ display: flex;
1793
+ flex-direction: column;
1794
+ gap: 0.15rem;
1795
+ min-width: 0;
1796
+ }
1797
+
1798
+ .plugin-name {
1799
+ font-size: 1.15rem;
1800
+ font-weight: 700;
1801
+ color: var(--text-color);
1802
+ }
1803
+
1804
+ .plugin-id {
1805
+ font-size: 0.78rem;
1806
+ color: var(--text-secondary);
1807
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
1808
+ word-break: break-all;
1809
+ }
1810
+
1811
+ .plugin-description {
1812
+ color: var(--text-secondary);
1813
+ line-height: 1.6;
1814
+ margin: 0;
1815
+ }
1816
+
1817
+ .plugin-meta-right {
1818
+ position: absolute;
1819
+ top: 0.75rem;
1820
+ right: 0.75rem;
1821
+ display: flex;
1822
+ flex-direction: column;
1823
+ align-items: flex-end;
1824
+ gap: 0.3rem;
1825
+ z-index: 2;
1826
+ }
1827
+
1828
+ .plugin-tags {
1829
+ display: flex;
1830
+ flex-wrap: wrap;
1831
+ gap: 0.4rem;
1832
+ }
1833
+
1834
+ @media (max-width: 900px) {
1835
+ .plugin-grid {
1836
+ grid-template-columns: 1fr;
1837
+ }
1838
+
1839
+ .plugin-meta-right {
1840
+ position: static;
1841
+ align-items: flex-start;
1842
+ }
1843
+
1844
+ .plugin-badges {
1845
+ align-items: flex-start;
1846
+ flex-direction: row;
1847
+ flex-wrap: wrap;
1848
+ }
1849
+ }