@magpiecloud/mags 1.8.16 → 1.9.0

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 (45) hide show
  1. package/API.md +388 -0
  2. package/Mags-API.postman_collection.json +374 -0
  3. package/QUICKSTART.md +295 -0
  4. package/README.md +378 -95
  5. package/bin/mags.js +79 -44
  6. package/deploy-page.sh +171 -0
  7. package/index.js +0 -2
  8. package/mags +0 -0
  9. package/mags.sh +270 -0
  10. package/nodejs/README.md +197 -0
  11. package/nodejs/bin/mags.js +1882 -0
  12. package/nodejs/index.js +602 -0
  13. package/nodejs/package.json +45 -0
  14. package/package.json +3 -18
  15. package/python/INTEGRATION.md +800 -0
  16. package/python/README.md +161 -0
  17. package/python/dist/magpie_mags-1.3.8-py3-none-any.whl +0 -0
  18. package/python/dist/magpie_mags-1.3.8.tar.gz +0 -0
  19. package/python/examples/demo.py +181 -0
  20. package/python/pyproject.toml +39 -0
  21. package/python/src/magpie_mags.egg-info/PKG-INFO +186 -0
  22. package/python/src/magpie_mags.egg-info/SOURCES.txt +9 -0
  23. package/python/src/magpie_mags.egg-info/dependency_links.txt +1 -0
  24. package/python/src/magpie_mags.egg-info/requires.txt +1 -0
  25. package/python/src/magpie_mags.egg-info/top_level.txt +1 -0
  26. package/python/src/mags/__init__.py +6 -0
  27. package/python/src/mags/client.py +527 -0
  28. package/python/test_sdk.py +78 -0
  29. package/skill.md +153 -0
  30. package/test-sdk.js +68 -0
  31. package/website/api.html +1095 -0
  32. package/website/claude-skill.html +481 -0
  33. package/website/cookbook/hn-marketing.html +410 -0
  34. package/website/cookbook/hn-marketing.sh +42 -0
  35. package/website/cookbook.html +282 -0
  36. package/website/docs.html +677 -0
  37. package/website/env.js +4 -0
  38. package/website/index.html +801 -0
  39. package/website/llms.txt +334 -0
  40. package/website/login.html +108 -0
  41. package/website/mags.md +210 -0
  42. package/website/script.js +453 -0
  43. package/website/styles.css +1075 -0
  44. package/website/tokens.html +169 -0
  45. package/website/usage.html +185 -0
@@ -0,0 +1,1075 @@
1
+ @import url("https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap");
2
+
3
+ :root {
4
+ color-scheme: dark;
5
+ --bg: #090c12;
6
+ --bg-muted: #111723;
7
+ --surface: rgba(22, 29, 42, 0.95);
8
+ --surface-muted: rgba(15, 20, 28, 0.78);
9
+ --text: #f8fafc;
10
+ --text-muted: #94a3b8;
11
+ --border: rgba(148, 163, 184, 0.16);
12
+ --accent: #2f9b66;
13
+ --accent-strong: #3dbd7e;
14
+ --accent-soft: rgba(47, 155, 102, 0.16);
15
+ --shadow: 0 24px 60px rgba(8, 15, 30, 0.45);
16
+ --radius: 18px;
17
+ --radius-sm: 12px;
18
+ --max-width: 1120px;
19
+ --sans: "Manrope", "Helvetica Neue", "Segoe UI", sans-serif;
20
+ --mono: "JetBrains Mono", "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
21
+ }
22
+
23
+ * {
24
+ box-sizing: border-box;
25
+ }
26
+
27
+ body {
28
+ margin: 0;
29
+ font-family: var(--sans);
30
+ background: var(--bg);
31
+ color: var(--text);
32
+ line-height: 1.7;
33
+ -webkit-font-smoothing: antialiased;
34
+ }
35
+
36
+ a {
37
+ color: inherit;
38
+ text-decoration: none;
39
+ }
40
+
41
+ a:hover {
42
+ color: var(--accent-strong);
43
+ }
44
+
45
+ .backdrop {
46
+ position: fixed;
47
+ inset: 0;
48
+ z-index: -1;
49
+ background:
50
+ radial-gradient(circle at 18% 20%, rgba(47, 155, 102, 0.12), transparent 45%),
51
+ radial-gradient(circle at 82% 8%, rgba(35, 112, 74, 0.14), transparent 55%),
52
+ var(--bg);
53
+ }
54
+
55
+ .container {
56
+ width: min(100% - 2.5rem, var(--max-width));
57
+ margin: 0 auto;
58
+ }
59
+
60
+ .site-header {
61
+ position: sticky;
62
+ top: 0;
63
+ background: rgba(9, 12, 18, 0.88);
64
+ border-bottom: 1px solid var(--border);
65
+ backdrop-filter: blur(16px);
66
+ z-index: 5;
67
+ }
68
+
69
+ .nav {
70
+ display: flex;
71
+ align-items: center;
72
+ justify-content: space-between;
73
+ padding: 1.1rem 0;
74
+ gap: 1.5rem;
75
+ }
76
+
77
+ .brand {
78
+ display: flex;
79
+ flex-direction: column;
80
+ gap: 0.2rem;
81
+ }
82
+
83
+ .logo {
84
+ font-size: 1.45rem;
85
+ font-weight: 700;
86
+ letter-spacing: 0.03em;
87
+ }
88
+
89
+ .tag {
90
+ font-size: 0.85rem;
91
+ color: var(--text-muted);
92
+ }
93
+
94
+ .nav-links {
95
+ display: flex;
96
+ gap: 1.4rem;
97
+ font-size: 0.95rem;
98
+ color: var(--text-muted);
99
+ }
100
+
101
+ .nav-cta {
102
+ display: flex;
103
+ }
104
+
105
+ .button {
106
+ display: inline-flex;
107
+ align-items: center;
108
+ justify-content: center;
109
+ padding: 0.75rem 1.5rem;
110
+ border-radius: 999px;
111
+ background: var(--accent);
112
+ color: #ffffff;
113
+ font-weight: 600;
114
+ border: 1px solid transparent;
115
+ transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.2s ease;
116
+ box-shadow: 0 14px 30px rgba(47, 155, 102, 0.2);
117
+ }
118
+
119
+ .button.full {
120
+ width: 100%;
121
+ }
122
+
123
+ .button:hover {
124
+ transform: translateY(-1px);
125
+ background: var(--accent-strong);
126
+ color: #ffffff;
127
+ }
128
+
129
+ .button.ghost {
130
+ background: transparent;
131
+ color: var(--text);
132
+ border: 1px solid var(--border);
133
+ box-shadow: none;
134
+ }
135
+
136
+ .button.ghost:hover {
137
+ border-color: var(--accent);
138
+ color: var(--accent-strong);
139
+ transform: translateY(-1px);
140
+ }
141
+
142
+ .hero {
143
+ padding: 5.5rem 0 3rem;
144
+ }
145
+
146
+ .hero-grid {
147
+ display: grid;
148
+ grid-template-columns: repeat(2, minmax(0, 1fr));
149
+ gap: 3.5rem;
150
+ align-items: center;
151
+ }
152
+
153
+ .hero-copy h1 {
154
+ font-size: clamp(2.4rem, 4vw, 3.4rem);
155
+ line-height: 1.05;
156
+ margin: 1rem 0 1.1rem;
157
+ }
158
+
159
+ .pill {
160
+ display: inline-flex;
161
+ align-items: center;
162
+ padding: 0.2rem 0.7rem;
163
+ border-radius: 999px;
164
+ background: var(--accent-soft);
165
+ color: var(--accent-strong);
166
+ font-size: 0.75rem;
167
+ font-weight: 600;
168
+ letter-spacing: 0.08em;
169
+ text-transform: uppercase;
170
+ }
171
+
172
+ .lead {
173
+ color: var(--text-muted);
174
+ font-size: 1.05rem;
175
+ max-width: 520px;
176
+ }
177
+
178
+ .hero-actions {
179
+ display: flex;
180
+ gap: 1rem;
181
+ margin: 1.8rem 0 1.2rem;
182
+ flex-wrap: wrap;
183
+ }
184
+
185
+ .hero-meta {
186
+ display: flex;
187
+ flex-direction: column;
188
+ gap: 0.3rem;
189
+ color: var(--text-muted);
190
+ font-size: 0.95rem;
191
+ }
192
+
193
+ .auth-status {
194
+ margin-top: 1rem;
195
+ color: var(--text-muted);
196
+ font-size: 0.9rem;
197
+ }
198
+
199
+ .hero-card {
200
+ padding: 1.8rem;
201
+ border-radius: var(--radius);
202
+ background: var(--surface);
203
+ border: 1px solid var(--border);
204
+ box-shadow: var(--shadow);
205
+ }
206
+
207
+ .card-header {
208
+ display: flex;
209
+ justify-content: space-between;
210
+ align-items: center;
211
+ margin-bottom: 1rem;
212
+ color: var(--text-muted);
213
+ font-size: 0.9rem;
214
+ }
215
+
216
+ .chip {
217
+ padding: 0.2rem 0.65rem;
218
+ border-radius: 999px;
219
+ border: 1px solid var(--border);
220
+ font-size: 0.75rem;
221
+ text-transform: uppercase;
222
+ letter-spacing: 0.08em;
223
+ }
224
+
225
+ .card-note {
226
+ margin: 0.9rem 0 0;
227
+ color: var(--text-muted);
228
+ }
229
+
230
+ .section {
231
+ padding: 3.5rem 0;
232
+ }
233
+
234
+ .section-title p {
235
+ text-transform: uppercase;
236
+ letter-spacing: 0.08em;
237
+ color: var(--accent-strong);
238
+ font-size: 0.75rem;
239
+ margin: 0 0 0.6rem;
240
+ }
241
+
242
+ .section-title h2 {
243
+ margin: 0 0 2rem;
244
+ font-size: clamp(1.7rem, 3vw, 2.4rem);
245
+ }
246
+
247
+ .grid {
248
+ display: grid;
249
+ gap: 1.6rem;
250
+ }
251
+
252
+ .section .grid + .grid {
253
+ margin-top: 1.6rem;
254
+ }
255
+
256
+ .grid.cards {
257
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
258
+ }
259
+
260
+ .grid.split {
261
+ grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
262
+ }
263
+
264
+ .auth-card {
265
+ display: grid;
266
+ gap: 0.8rem;
267
+ }
268
+
269
+ .auth-page {
270
+ padding: 4.5rem 0 5.5rem;
271
+ }
272
+
273
+ .auth-layout {
274
+ display: flex;
275
+ justify-content: center;
276
+ }
277
+
278
+ .auth-shell {
279
+ width: min(100%, 420px);
280
+ background: var(--surface);
281
+ border: 1px solid var(--border);
282
+ border-radius: var(--radius);
283
+ padding: 2.2rem;
284
+ box-shadow: var(--shadow);
285
+ display: grid;
286
+ gap: 1.4rem;
287
+ }
288
+
289
+ .auth-title {
290
+ margin: 0.6rem 0 0.4rem;
291
+ font-size: 2.1rem;
292
+ line-height: 1.1;
293
+ }
294
+
295
+ .auth-subtitle {
296
+ margin: 0;
297
+ color: var(--text-muted);
298
+ }
299
+
300
+ .auth-divider {
301
+ position: relative;
302
+ text-align: center;
303
+ color: var(--text-muted);
304
+ font-size: 0.85rem;
305
+ }
306
+
307
+ .auth-divider::before,
308
+ .auth-divider::after {
309
+ content: '';
310
+ position: absolute;
311
+ top: 50%;
312
+ width: 40%;
313
+ height: 1px;
314
+ background: var(--border);
315
+ }
316
+
317
+ .auth-divider::before {
318
+ left: 0;
319
+ }
320
+
321
+ .auth-divider::after {
322
+ right: 0;
323
+ }
324
+
325
+ .login-form,
326
+ .token-form {
327
+ display: grid;
328
+ gap: 0.9rem;
329
+ }
330
+
331
+ .form-group {
332
+ display: grid;
333
+ gap: 0.4rem;
334
+ }
335
+
336
+ .form-label {
337
+ font-size: 0.85rem;
338
+ color: var(--text-muted);
339
+ }
340
+
341
+ .input {
342
+ border: 1px solid var(--border);
343
+ border-radius: 12px;
344
+ padding: 0.7rem 0.9rem;
345
+ font-size: 0.95rem;
346
+ font-family: var(--sans);
347
+ background: rgba(17, 24, 39, 0.65);
348
+ color: var(--text);
349
+ }
350
+
351
+ .input:focus {
352
+ outline: none;
353
+ border-color: var(--accent);
354
+ box-shadow: 0 0 0 3px rgba(47, 155, 102, 0.2);
355
+ }
356
+
357
+ .form-message {
358
+ margin: 0;
359
+ font-size: 0.85rem;
360
+ color: var(--text-muted);
361
+ }
362
+
363
+ .form-links {
364
+ display: flex;
365
+ justify-content: space-between;
366
+ font-size: 0.85rem;
367
+ color: var(--text-muted);
368
+ }
369
+
370
+ .stats-grid {
371
+ display: grid;
372
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
373
+ gap: 1.4rem;
374
+ }
375
+
376
+ .stat-card {
377
+ background: var(--surface);
378
+ border: 1px solid var(--border);
379
+ border-radius: var(--radius-sm);
380
+ padding: 1.4rem 1.6rem;
381
+ box-shadow: var(--shadow);
382
+ }
383
+
384
+ .stat-label {
385
+ margin: 0;
386
+ font-size: 0.85rem;
387
+ color: var(--text-muted);
388
+ }
389
+
390
+ .stat-value {
391
+ margin: 0.4rem 0 0.2rem;
392
+ font-size: 1.8rem;
393
+ font-weight: 600;
394
+ }
395
+
396
+ .stat-note {
397
+ margin: 0;
398
+ color: var(--text-muted);
399
+ font-size: 0.9rem;
400
+ }
401
+
402
+ .recipe-list {
403
+ display: grid;
404
+ gap: 1.2rem;
405
+ }
406
+
407
+ .recipe-item {
408
+ background: var(--surface);
409
+ border: 1px solid var(--border);
410
+ border-radius: var(--radius-sm);
411
+ padding: 1.4rem 1.6rem;
412
+ box-shadow: var(--shadow);
413
+ }
414
+
415
+ .recipe-header {
416
+ display: flex;
417
+ align-items: center;
418
+ justify-content: space-between;
419
+ gap: 1rem;
420
+ margin-bottom: 0.6rem;
421
+ }
422
+
423
+ .recipe-header h3 {
424
+ margin: 0;
425
+ font-size: 1.05rem;
426
+ }
427
+
428
+ .card,
429
+ .panel,
430
+ .card.wide {
431
+ background: var(--surface);
432
+ border: 1px solid var(--border);
433
+ border-radius: var(--radius-sm);
434
+ padding: 1.4rem 1.6rem;
435
+ box-shadow: var(--shadow);
436
+ }
437
+
438
+ .card.wide {
439
+ margin-top: 1.6rem;
440
+ }
441
+
442
+ .card h3,
443
+ .panel h3 {
444
+ margin-top: 0;
445
+ font-size: 1.05rem;
446
+ }
447
+
448
+ .panel {
449
+ background: var(--surface);
450
+ }
451
+
452
+ .list {
453
+ margin: 0;
454
+ padding-left: 1.1rem;
455
+ color: var(--text-muted);
456
+ }
457
+
458
+ .list li {
459
+ margin-bottom: 0.6rem;
460
+ }
461
+
462
+ .list code {
463
+ color: var(--accent-strong);
464
+ }
465
+
466
+ .command-list {
467
+ display: grid;
468
+ gap: 0.9rem;
469
+ }
470
+
471
+ .command-item {
472
+ padding-bottom: 0.9rem;
473
+ border-bottom: 1px solid var(--border);
474
+ }
475
+
476
+ .command-item:last-child {
477
+ border-bottom: none;
478
+ padding-bottom: 0;
479
+ }
480
+
481
+ .command-row {
482
+ display: flex;
483
+ align-items: center;
484
+ justify-content: space-between;
485
+ gap: 0.8rem;
486
+ }
487
+
488
+ .command-row code {
489
+ color: var(--text);
490
+ font-size: 0.95rem;
491
+ }
492
+
493
+ .command-item p {
494
+ margin: 0.35rem 0 0;
495
+ color: var(--text-muted);
496
+ font-size: 0.95rem;
497
+ }
498
+
499
+ .copy-button {
500
+ border: 1px solid var(--border);
501
+ background: var(--surface);
502
+ color: var(--text-muted);
503
+ border-radius: 999px;
504
+ font-size: 0.75rem;
505
+ padding: 0.35rem 0.75rem;
506
+ cursor: pointer;
507
+ transition: border-color 0.2s ease, color 0.2s ease, transform 0.2s ease;
508
+ }
509
+
510
+ .copy-button:hover {
511
+ border-color: var(--accent);
512
+ color: var(--accent-strong);
513
+ transform: translateY(-1px);
514
+ }
515
+
516
+ .copy-button.copied {
517
+ border-color: var(--accent);
518
+ color: var(--accent-strong);
519
+ }
520
+
521
+ .revoke-button {
522
+ border: 1px solid rgba(248, 113, 113, 0.35);
523
+ background: rgba(248, 113, 113, 0.08);
524
+ color: #f87171;
525
+ border-radius: 999px;
526
+ font-size: 0.75rem;
527
+ padding: 0.35rem 0.75rem;
528
+ cursor: pointer;
529
+ transition: border-color 0.2s ease, color 0.2s ease, transform 0.2s ease;
530
+ }
531
+
532
+ .revoke-button:hover {
533
+ border-color: #f87171;
534
+ color: #fca5a5;
535
+ transform: translateY(-1px);
536
+ }
537
+
538
+ .table-wrap {
539
+ border: 1px solid var(--border);
540
+ border-radius: var(--radius-sm);
541
+ background: var(--surface);
542
+ box-shadow: var(--shadow);
543
+ overflow: hidden;
544
+ }
545
+
546
+ .table-header,
547
+ .table-row {
548
+ display: grid;
549
+ grid-template-columns: 1.2fr 1fr 1fr 1fr 0.7fr;
550
+ gap: 1rem;
551
+ padding: 0.9rem 1.2rem;
552
+ align-items: center;
553
+ font-size: 0.9rem;
554
+ }
555
+
556
+ .table-header {
557
+ background: var(--bg-muted);
558
+ color: var(--text-muted);
559
+ text-transform: uppercase;
560
+ letter-spacing: 0.08em;
561
+ font-size: 0.72rem;
562
+ font-weight: 600;
563
+ }
564
+
565
+ .table-row {
566
+ border-top: 1px solid var(--border);
567
+ color: var(--text);
568
+ }
569
+
570
+ .table-row.empty {
571
+ color: var(--text-muted);
572
+ }
573
+
574
+ .status {
575
+ display: inline-flex;
576
+ align-items: center;
577
+ justify-content: center;
578
+ padding: 0.25rem 0.6rem;
579
+ border-radius: 999px;
580
+ font-size: 0.72rem;
581
+ text-transform: uppercase;
582
+ letter-spacing: 0.05em;
583
+ background: var(--accent-soft);
584
+ color: var(--accent-strong);
585
+ }
586
+
587
+ .status.error {
588
+ background: rgba(248, 113, 113, 0.12);
589
+ color: #f87171;
590
+ }
591
+
592
+ .status.pending,
593
+ .status.sleeping {
594
+ background: rgba(245, 158, 11, 0.15);
595
+ color: #f59e0b;
596
+ }
597
+
598
+ .text-link {
599
+ color: var(--accent-strong);
600
+ font-weight: 600;
601
+ }
602
+
603
+ .token-result {
604
+ display: grid;
605
+ gap: 0.8rem;
606
+ }
607
+
608
+ .token-box {
609
+ display: flex;
610
+ align-items: center;
611
+ justify-content: space-between;
612
+ gap: 0.8rem;
613
+ padding: 0.7rem 0.9rem;
614
+ border: 1px dashed var(--border);
615
+ border-radius: 12px;
616
+ background: var(--surface-muted);
617
+ font-family: var(--mono);
618
+ font-size: 0.85rem;
619
+ }
620
+
621
+ .hidden {
622
+ display: none !important;
623
+ }
624
+
625
+ .callout {
626
+ margin-top: 1rem;
627
+ padding: 0.8rem 1rem;
628
+ border-radius: 12px;
629
+ background: var(--accent-soft);
630
+ border: 1px solid rgba(47, 155, 102, 0.25);
631
+ color: var(--text-muted);
632
+ }
633
+
634
+ .stack {
635
+ display: grid;
636
+ gap: 1rem;
637
+ }
638
+
639
+ .label {
640
+ margin: 0 0 0.4rem;
641
+ font-size: 0.85rem;
642
+ color: var(--text-muted);
643
+ }
644
+
645
+ pre {
646
+ background: rgba(15, 20, 28, 0.78);
647
+ border-radius: var(--radius-sm);
648
+ padding: 0.9rem 1rem;
649
+ border: 1px solid var(--border);
650
+ font-family: var(--mono);
651
+ font-size: 0.9rem;
652
+ line-height: 1.6;
653
+ white-space: pre-wrap;
654
+ word-break: break-word;
655
+ overflow: hidden;
656
+ color: var(--text);
657
+ }
658
+
659
+ code {
660
+ font-family: var(--mono);
661
+ color: var(--accent-strong);
662
+ }
663
+
664
+ .site-footer {
665
+ padding: 3rem 0 4rem;
666
+ border-top: 1px solid var(--border);
667
+ background: var(--bg-muted);
668
+ }
669
+
670
+ .footer-grid {
671
+ display: grid;
672
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
673
+ gap: 2rem;
674
+ }
675
+
676
+ .footer-links {
677
+ display: grid;
678
+ gap: 0.6rem;
679
+ color: var(--text-muted);
680
+ }
681
+
682
+ [data-reveal] {
683
+ opacity: 0;
684
+ transform: translateY(16px);
685
+ }
686
+
687
+ [data-reveal].visible {
688
+ opacity: 1;
689
+ transform: translateY(0);
690
+ transition: opacity 0.5s ease, transform 0.5s ease;
691
+ }
692
+
693
+ @media (max-width: 920px) {
694
+ .nav-links {
695
+ display: none;
696
+ }
697
+
698
+ .hero-grid {
699
+ grid-template-columns: 1fr;
700
+ }
701
+
702
+ .hero-card {
703
+ order: -1;
704
+ }
705
+ }
706
+
707
+ @media (max-width: 700px) {
708
+ .nav {
709
+ flex-direction: column;
710
+ align-items: flex-start;
711
+ }
712
+
713
+ .nav-cta {
714
+ width: 100%;
715
+ }
716
+
717
+ .hero-actions {
718
+ flex-direction: column;
719
+ align-items: stretch;
720
+ }
721
+ }
722
+
723
+ /* ── Tab bar ─────────────────────────────────────────────── */
724
+
725
+ .tab-group {
726
+ position: relative;
727
+ }
728
+
729
+ .tab-bar {
730
+ display: flex;
731
+ gap: 0.35rem;
732
+ margin-bottom: 1.2rem;
733
+ padding: 0.25rem;
734
+ background: var(--bg-muted);
735
+ border: 1px solid var(--border);
736
+ border-radius: 10px;
737
+ width: fit-content;
738
+ }
739
+
740
+ .tab-bar .tab {
741
+ padding: 0.4rem 1rem;
742
+ border-radius: 8px;
743
+ font-size: 0.82rem;
744
+ font-weight: 600;
745
+ color: var(--text-muted);
746
+ cursor: pointer;
747
+ border: none;
748
+ background: transparent;
749
+ font-family: var(--sans);
750
+ transition: color 0.15s, background 0.15s;
751
+ }
752
+
753
+ .tab-bar .tab:hover {
754
+ color: var(--text);
755
+ }
756
+
757
+ .tab-bar .tab.active {
758
+ background: var(--accent);
759
+ color: #ffffff;
760
+ box-shadow: 0 1px 4px rgba(47, 155, 102, 0.3);
761
+ }
762
+
763
+ .tab-content {
764
+ display: none;
765
+ }
766
+
767
+ .tab-content.active {
768
+ display: block;
769
+ }
770
+
771
+ /* ── Pattern cards (expandable) ─────────────────────────── */
772
+
773
+ .pattern-list {
774
+ display: grid;
775
+ gap: 0.6rem;
776
+ }
777
+
778
+ .pattern-card {
779
+ background: var(--surface);
780
+ border: 1px solid var(--border);
781
+ border-radius: var(--radius-sm);
782
+ overflow: hidden;
783
+ transition: box-shadow 0.2s;
784
+ }
785
+
786
+ .pattern-card:hover {
787
+ box-shadow: 0 4px 16px rgba(8, 15, 30, 0.4);
788
+ }
789
+
790
+ .pattern-header {
791
+ display: flex;
792
+ align-items: center;
793
+ justify-content: space-between;
794
+ padding: 1rem 1.4rem;
795
+ cursor: pointer;
796
+ user-select: none;
797
+ }
798
+
799
+ .pattern-header h4 {
800
+ margin: 0;
801
+ font-size: 0.95rem;
802
+ font-weight: 600;
803
+ }
804
+
805
+ .pattern-header .pattern-desc {
806
+ margin: 0;
807
+ color: var(--text-muted);
808
+ font-size: 0.85rem;
809
+ }
810
+
811
+ .pattern-header .chevron {
812
+ font-size: 0.8rem;
813
+ color: var(--text-muted);
814
+ transition: transform 0.2s;
815
+ flex-shrink: 0;
816
+ margin-left: 1rem;
817
+ }
818
+
819
+ .pattern-card.open .chevron {
820
+ transform: rotate(180deg);
821
+ }
822
+
823
+ .pattern-body {
824
+ display: none;
825
+ padding: 0 1.4rem 1.2rem;
826
+ }
827
+
828
+ .pattern-card.open .pattern-body {
829
+ display: block;
830
+ }
831
+
832
+ /* ── Reference tables ─────────────────────────────────── */
833
+
834
+ .ref-section {
835
+ margin-bottom: 2rem;
836
+ }
837
+
838
+ .ref-section h3 {
839
+ margin: 0 0 0.75rem;
840
+ font-size: 1rem;
841
+ font-weight: 600;
842
+ }
843
+
844
+ .ref-table-wrap {
845
+ border: 1px solid var(--border);
846
+ border-radius: var(--radius-sm);
847
+ overflow: hidden;
848
+ background: var(--surface);
849
+ }
850
+
851
+ .ref-table {
852
+ width: 100%;
853
+ border-collapse: collapse;
854
+ font-size: 0.88rem;
855
+ }
856
+
857
+ .ref-table thead {
858
+ background: var(--bg-muted);
859
+ }
860
+
861
+ .ref-table th {
862
+ text-align: left;
863
+ padding: 0.65rem 1rem;
864
+ font-weight: 600;
865
+ font-size: 0.75rem;
866
+ text-transform: uppercase;
867
+ letter-spacing: 0.06em;
868
+ color: var(--text-muted);
869
+ }
870
+
871
+ .ref-table td {
872
+ padding: 0.6rem 1rem;
873
+ border-top: 1px solid var(--border);
874
+ vertical-align: top;
875
+ color: var(--text-muted);
876
+ }
877
+
878
+ .ref-table td:first-child {
879
+ white-space: nowrap;
880
+ }
881
+
882
+ .ref-table code {
883
+ font-family: var(--mono);
884
+ font-size: 0.82rem;
885
+ background: rgba(15, 20, 28, 0.6);
886
+ padding: 0.15rem 0.4rem;
887
+ border-radius: 4px;
888
+ }
889
+
890
+ @media (max-width: 768px) {
891
+ .ref-table td:first-child {
892
+ white-space: normal;
893
+ }
894
+ }
895
+
896
+ /* ── Inline tab bar (for endpoint cards in api.html) ───── */
897
+
898
+ .code-tabs {
899
+ margin-top: 1rem;
900
+ }
901
+
902
+ .code-tabs .tab-bar {
903
+ margin-bottom: 0.6rem;
904
+ }
905
+
906
+ /* ── Docs layout ───────────────────────────────────────── */
907
+
908
+ .docs-layout {
909
+ display: grid;
910
+ grid-template-columns: 240px 1fr;
911
+ gap: 0;
912
+ min-height: calc(100vh - 60px);
913
+ }
914
+
915
+ .docs-sidebar {
916
+ position: sticky;
917
+ top: 60px;
918
+ height: calc(100vh - 60px);
919
+ overflow-y: auto;
920
+ padding: 1.5rem 0 2rem 0;
921
+ border-right: 1px solid var(--border);
922
+ scrollbar-width: thin;
923
+ scrollbar-color: var(--accent-soft) transparent;
924
+ }
925
+
926
+ .docs-sidebar::-webkit-scrollbar {
927
+ width: 4px;
928
+ }
929
+
930
+ .docs-sidebar::-webkit-scrollbar-thumb {
931
+ background: var(--accent-soft);
932
+ border-radius: 999px;
933
+ }
934
+
935
+ .docs-nav {
936
+ display: flex;
937
+ flex-direction: column;
938
+ gap: 0.2rem;
939
+ padding: 0 1rem;
940
+ }
941
+
942
+ .docs-nav-group {
943
+ margin-bottom: 0.6rem;
944
+ }
945
+
946
+ .docs-nav-heading {
947
+ font-size: 0.7rem;
948
+ font-weight: 700;
949
+ text-transform: uppercase;
950
+ letter-spacing: 0.08em;
951
+ color: var(--text-muted);
952
+ padding: 0.6rem 0.75rem 0.3rem;
953
+ margin: 0;
954
+ }
955
+
956
+ .docs-nav-link {
957
+ display: block;
958
+ padding: 0.35rem 0.75rem;
959
+ border-radius: 8px;
960
+ font-size: 0.85rem;
961
+ color: var(--text-muted);
962
+ transition: color 0.15s, background 0.15s;
963
+ border-left: 2px solid transparent;
964
+ }
965
+
966
+ .docs-nav-link:hover {
967
+ color: var(--text);
968
+ background: rgba(148, 163, 184, 0.08);
969
+ }
970
+
971
+ .docs-nav-link.active {
972
+ color: var(--accent-strong);
973
+ background: var(--accent-soft);
974
+ border-left-color: var(--accent);
975
+ }
976
+
977
+ .docs-content {
978
+ padding: 2rem 2.5rem 4rem;
979
+ max-width: 860px;
980
+ }
981
+
982
+ .docs-content h1 {
983
+ font-size: 2rem;
984
+ margin: 0 0 0.5rem;
985
+ line-height: 1.15;
986
+ }
987
+
988
+ .docs-content > .lead {
989
+ margin-bottom: 2rem;
990
+ }
991
+
992
+ .docs-section {
993
+ padding-top: 2.5rem;
994
+ margin-bottom: 1rem;
995
+ }
996
+
997
+ .docs-section h2 {
998
+ font-size: 1.4rem;
999
+ margin: 0 0 0.3rem;
1000
+ padding-bottom: 0.6rem;
1001
+ border-bottom: 1px solid var(--border);
1002
+ }
1003
+
1004
+ .docs-section h3 {
1005
+ font-size: 1.05rem;
1006
+ margin: 1.5rem 0 0.5rem;
1007
+ }
1008
+
1009
+ .docs-section p {
1010
+ color: var(--text-muted);
1011
+ margin: 0.4rem 0 0.8rem;
1012
+ line-height: 1.7;
1013
+ }
1014
+
1015
+ .docs-section pre {
1016
+ margin: 0.6rem 0 1rem;
1017
+ }
1018
+
1019
+ .docs-section .ref-section {
1020
+ margin-bottom: 1.5rem;
1021
+ }
1022
+
1023
+ .docs-section .ref-section h3 {
1024
+ margin-top: 1rem;
1025
+ }
1026
+
1027
+ @media (max-width: 860px) {
1028
+ .docs-layout {
1029
+ grid-template-columns: 1fr;
1030
+ }
1031
+
1032
+ .docs-sidebar {
1033
+ position: static;
1034
+ height: auto;
1035
+ border-right: none;
1036
+ border-bottom: 1px solid var(--border);
1037
+ padding: 1rem 0;
1038
+ }
1039
+
1040
+ .docs-nav {
1041
+ flex-direction: row;
1042
+ flex-wrap: wrap;
1043
+ gap: 0.2rem;
1044
+ padding: 0 1.25rem;
1045
+ }
1046
+
1047
+ .docs-nav-group {
1048
+ margin-bottom: 0;
1049
+ }
1050
+
1051
+ .docs-nav-heading {
1052
+ display: none;
1053
+ }
1054
+
1055
+ .docs-nav-link {
1056
+ border-left: none;
1057
+ font-size: 0.8rem;
1058
+ padding: 0.3rem 0.6rem;
1059
+ }
1060
+
1061
+ .docs-content {
1062
+ padding: 1.5rem 1.25rem 3rem;
1063
+ }
1064
+ }
1065
+
1066
+ @media (prefers-reduced-motion: reduce) {
1067
+ * {
1068
+ scroll-behavior: auto !important;
1069
+ }
1070
+
1071
+ [data-reveal] {
1072
+ opacity: 1;
1073
+ transform: none;
1074
+ }
1075
+ }