ssh-mcp-pro 1.4.2 → 1.5.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 (66) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/mcp.d.ts +1 -1
  3. package/dist/mcp.js +1 -1
  4. package/dist/remote/agent-bounded-io.d.ts +20 -0
  5. package/dist/remote/agent-bounded-io.d.ts.map +1 -0
  6. package/dist/remote/agent-bounded-io.js +101 -0
  7. package/dist/remote/agent-bounded-io.js.map +1 -0
  8. package/dist/remote/agent-enrollment.d.ts +12 -0
  9. package/dist/remote/agent-enrollment.d.ts.map +1 -0
  10. package/dist/remote/agent-enrollment.js +87 -0
  11. package/dist/remote/agent-enrollment.js.map +1 -0
  12. package/dist/remote/agent-executor.d.ts.map +1 -1
  13. package/dist/remote/agent-executor.js +1 -100
  14. package/dist/remote/agent-executor.js.map +1 -1
  15. package/dist/remote/control-plane.d.ts +3 -2
  16. package/dist/remote/control-plane.d.ts.map +1 -1
  17. package/dist/remote/control-plane.js +22 -79
  18. package/dist/remote/control-plane.js.map +1 -1
  19. package/dist/remote/dashboard-enrollment-commands.d.ts +7 -0
  20. package/dist/remote/dashboard-enrollment-commands.d.ts.map +1 -0
  21. package/dist/remote/dashboard-enrollment-commands.js +15 -0
  22. package/dist/remote/dashboard-enrollment-commands.js.map +1 -0
  23. package/dist/remote/oauth-handler.d.ts +5 -0
  24. package/dist/remote/oauth-handler.d.ts.map +1 -1
  25. package/dist/remote/oauth-handler.js +110 -65
  26. package/dist/remote/oauth-handler.js.map +1 -1
  27. package/dist/remote/oauth-provider-exchange.d.ts +11 -0
  28. package/dist/remote/oauth-provider-exchange.d.ts.map +1 -0
  29. package/dist/remote/oauth-provider-exchange.js +73 -0
  30. package/dist/remote/oauth-provider-exchange.js.map +1 -0
  31. package/dist/remote/store-schema.d.ts +4 -0
  32. package/dist/remote/store-schema.d.ts.map +1 -0
  33. package/dist/remote/store-schema.js +147 -0
  34. package/dist/remote/store-schema.js.map +1 -0
  35. package/dist/remote/store.d.ts +7 -2
  36. package/dist/remote/store.d.ts.map +1 -1
  37. package/dist/remote/store.js +81 -130
  38. package/dist/remote/store.js.map +1 -1
  39. package/dist/remote/types.d.ts +13 -0
  40. package/dist/remote/types.d.ts.map +1 -1
  41. package/dist/remote/types.js.map +1 -1
  42. package/dist/remote/web-dashboard-oauth-users.d.ts.map +1 -1
  43. package/dist/remote/web-dashboard-oauth-users.js +4 -38
  44. package/dist/remote/web-dashboard-oauth-users.js.map +1 -1
  45. package/dist/remote/web-dashboard.d.ts +0 -2
  46. package/dist/remote/web-dashboard.d.ts.map +1 -1
  47. package/dist/remote/web-dashboard.js +3 -18
  48. package/dist/remote/web-dashboard.js.map +1 -1
  49. package/dist/session-auth-config.d.ts +8 -0
  50. package/dist/session-auth-config.d.ts.map +1 -0
  51. package/dist/session-auth-config.js +67 -0
  52. package/dist/session-auth-config.js.map +1 -0
  53. package/dist/session.d.ts +0 -12
  54. package/dist/session.d.ts.map +1 -1
  55. package/dist/session.js +3 -64
  56. package/dist/session.js.map +1 -1
  57. package/docs/api-overview.md +67 -0
  58. package/docs/development/release-process.md +5 -5
  59. package/docs/security/hosted-data-inventory.md +3 -1
  60. package/docs/theme/favicon.svg +12 -0
  61. package/docs/theme/ssh-docs.css +670 -0
  62. package/docs/theme/ssh-docs.js +58 -0
  63. package/mcp.json +1 -1
  64. package/package.json +11 -11
  65. package/registry/ssh-mcp-pro/mcp.json +1 -1
  66. package/server.json +3 -3
@@ -0,0 +1,670 @@
1
+ /* SSH MCP Pro documentation skin — TypeDoc 0.28 default theme.
2
+ Keep the upstream renderer/search/navigation and adjust presentation only. */
3
+
4
+ :root {
5
+ --light-color-background: #f5f7fb;
6
+ --light-color-background-secondary: #edf1f8;
7
+ --light-color-background-active: #e0eafe;
8
+ --light-color-accent: #dbe3ef;
9
+ --light-color-text: #18243a;
10
+ --light-color-text-aside: #53627b;
11
+ --light-color-link: #235fd0;
12
+ --light-color-focus-outline: #3d78e6;
13
+ --dark-color-background: #0b1222;
14
+ --dark-color-background-secondary: #121e32;
15
+ --dark-color-background-active: #223656;
16
+ --dark-color-accent: #283b57;
17
+ --dark-color-text: #e9f0fc;
18
+ --dark-color-text-aside: #a4b6d1;
19
+ --dark-color-link: #92bbff;
20
+ --dark-color-focus-outline: #96bdff;
21
+ --docs-surface: #ffffff;
22
+ --docs-surface-alt: #f3f6fc;
23
+ --docs-elevated: #ffffff;
24
+ --docs-line: #dce4f1;
25
+ --docs-ink: #16233b;
26
+ --docs-muted: #53647e;
27
+ --docs-brand: #2a64da;
28
+ --docs-brand-strong: #174cba;
29
+ --docs-brand-tint: #e9f1ff;
30
+ --docs-shadow: 0 14px 45px rgb(32 52 94 / 6%);
31
+ --docs-hero-gradient: linear-gradient(125deg, #0d2150 0%, #174bb4 64%, #326fe1 100%);
32
+ }
33
+
34
+ :root[data-theme="dark"] {
35
+ --docs-surface: #121d30;
36
+ --docs-surface-alt: #17243a;
37
+ --docs-elevated: #17253b;
38
+ --docs-line: #2b405d;
39
+ --docs-ink: #eff5ff;
40
+ --docs-muted: #afc0d9;
41
+ --docs-brand: #9bbdff;
42
+ --docs-brand-strong: #bbd2ff;
43
+ --docs-brand-tint: #1d3150;
44
+ --docs-shadow: 0 16px 50px rgb(0 0 0 / 16%);
45
+ --docs-hero-gradient: linear-gradient(125deg, #112b60 0%, #203f83 63%, #214ea2 100%);
46
+ }
47
+
48
+ @media (prefers-color-scheme: dark) {
49
+ :root:not([data-theme="light"], [data-theme="dark"]) {
50
+ --docs-surface: #121d30;
51
+ --docs-surface-alt: #17243a;
52
+ --docs-elevated: #17253b;
53
+ --docs-line: #2b405d;
54
+ --docs-ink: #eff5ff;
55
+ --docs-muted: #afc0d9;
56
+ --docs-brand: #9bbdff;
57
+ --docs-brand-strong: #bbd2ff;
58
+ --docs-brand-tint: #1d3150;
59
+ --docs-shadow: 0 16px 50px rgb(0 0 0 / 16%);
60
+ --docs-hero-gradient: linear-gradient(125deg, #112b60 0%, #203f83 63%, #214ea2 100%);
61
+ }
62
+ }
63
+
64
+ html {
65
+ scroll-padding-top: 6rem;
66
+ }
67
+ body {
68
+ line-height: 1.62;
69
+ -webkit-font-smoothing: antialiased;
70
+ }
71
+ ::selection {
72
+ background: #92b5fa90;
73
+ }
74
+ :focus-visible {
75
+ outline: 3px solid var(--docs-brand) !important;
76
+ outline-offset: 3px;
77
+ }
78
+
79
+ .container {
80
+ max-width: 1780px;
81
+ padding-inline: clamp(18px, 2.25vw, 38px);
82
+ }
83
+
84
+ /* Branded but unobtrusive global navigation. */
85
+ .tsd-page-toolbar {
86
+ position: sticky;
87
+ top: 0;
88
+ z-index: 1050;
89
+ background: color-mix(in srgb, var(--docs-surface) 93%, transparent);
90
+ border-bottom: 1px solid var(--docs-line);
91
+ backdrop-filter: saturate(150%) blur(15px);
92
+ -webkit-backdrop-filter: saturate(150%) blur(15px);
93
+ }
94
+ .tsd-toolbar-contents {
95
+ min-height: 64px;
96
+ gap: 14px;
97
+ }
98
+ .tsd-toolbar-contents .title {
99
+ font-size: 1.04rem;
100
+ font-weight: 750;
101
+ letter-spacing: -0.025em;
102
+ text-decoration: none;
103
+ color: var(--docs-ink);
104
+ min-width: 0;
105
+ }
106
+ .tsd-toolbar-contents .title:hover {
107
+ color: var(--docs-brand-strong);
108
+ }
109
+ #tsd-toolbar-links {
110
+ display: flex;
111
+ gap: 6px;
112
+ margin-left: auto;
113
+ align-items: center;
114
+ }
115
+ #tsd-toolbar-links a {
116
+ font-size: 0.84rem;
117
+ font-weight: 650;
118
+ padding: 8px 11px;
119
+ border-radius: 10px;
120
+ text-decoration: none;
121
+ color: var(--docs-muted);
122
+ white-space: nowrap;
123
+ }
124
+ #tsd-toolbar-links a:hover {
125
+ color: var(--docs-brand-strong);
126
+ background: var(--docs-brand-tint);
127
+ }
128
+ #tsd-search-trigger,
129
+ .docs-theme-switch {
130
+ display: inline-flex;
131
+ align-items: center;
132
+ justify-content: center;
133
+ width: 39px;
134
+ min-width: 39px;
135
+ height: 39px;
136
+ padding: 0;
137
+ border-radius: 11px;
138
+ border: 1px solid var(--docs-line);
139
+ background: var(--docs-surface);
140
+ color: var(--docs-ink);
141
+ cursor: pointer;
142
+ transition:
143
+ background 0.16s ease,
144
+ border-color 0.16s ease,
145
+ transform 0.16s ease;
146
+ }
147
+ #tsd-search-trigger:hover,
148
+ .docs-theme-switch:hover {
149
+ border-color: var(--docs-brand);
150
+ background: var(--docs-brand-tint);
151
+ }
152
+ .docs-theme-switch .docs-theme-icon {
153
+ font-size: 19px;
154
+ line-height: 1;
155
+ }
156
+ .tsd-toolbar-contents .menu {
157
+ border-radius: 10px;
158
+ }
159
+ #tsd-search {
160
+ border-radius: 16px;
161
+ border: 1px solid var(--docs-line);
162
+ box-shadow: var(--docs-shadow);
163
+ }
164
+
165
+ /* A stable three-column grid. The old fractional layout let long tables
166
+ overflow the content track and visually cover the TOC. */
167
+ .container-main {
168
+ min-width: 0;
169
+ margin-block: 30px 64px;
170
+ }
171
+ .col-content {
172
+ min-width: 0;
173
+ max-width: 100%;
174
+ }
175
+ .col-content > * {
176
+ min-width: 0;
177
+ }
178
+ .tsd-page-title {
179
+ padding: 4px 0 15px;
180
+ }
181
+ .tsd-page-title h1 {
182
+ font-size: clamp(1.6rem, 2vw, 2.25rem);
183
+ font-weight: 770;
184
+ letter-spacing: -0.04em;
185
+ overflow-wrap: anywhere;
186
+ }
187
+ .tsd-breadcrumb {
188
+ font-size: 0.87rem;
189
+ }
190
+ .tsd-breadcrumb a {
191
+ text-decoration: none;
192
+ }
193
+ .tsd-breadcrumb a:hover {
194
+ color: var(--docs-brand-strong);
195
+ text-decoration: underline;
196
+ }
197
+
198
+ @media (min-width: 770px) {
199
+ .container-main {
200
+ gap: clamp(16px, 2vw, 30px);
201
+ }
202
+ .col-content {
203
+ padding: 0;
204
+ }
205
+ }
206
+ @media (min-width: 1200px) {
207
+ .container-main {
208
+ grid-template-columns: minmax(215px, 252px) minmax(0, 1fr) minmax(195px, 230px);
209
+ grid-template-areas: "sidebar content toc";
210
+ align-items: start;
211
+ }
212
+ .col-sidebar {
213
+ display: contents;
214
+ }
215
+ .col-content {
216
+ grid-area: content;
217
+ }
218
+ .site-menu {
219
+ grid-area: sidebar;
220
+ }
221
+ .page-menu {
222
+ grid-area: toc;
223
+ padding: 0;
224
+ }
225
+ .page-menu,
226
+ .site-menu {
227
+ top: 82px;
228
+ max-height: calc(100dvh - 102px);
229
+ overflow: auto;
230
+ overscroll-behavior: contain;
231
+ scrollbar-width: thin;
232
+ }
233
+ }
234
+ @media (min-width: 770px) and (max-width: 1199px) {
235
+ .container-main {
236
+ grid-template-columns: minmax(195px, 235px) minmax(0, 1fr);
237
+ }
238
+ .col-sidebar {
239
+ max-height: calc(100dvh - 100px);
240
+ top: 82px;
241
+ overflow: auto;
242
+ overscroll-behavior: contain;
243
+ scrollbar-width: thin;
244
+ }
245
+ }
246
+ @media (min-width: 770px) {
247
+ .site-menu,
248
+ .page-menu {
249
+ background: var(--docs-surface);
250
+ border: 1px solid var(--docs-line);
251
+ border-radius: 16px;
252
+ padding: 14px 10px;
253
+ box-shadow: var(--docs-shadow);
254
+ }
255
+ .site-menu {
256
+ margin-top: 0;
257
+ }
258
+ }
259
+ .tsd-navigation a,
260
+ .tsd-page-navigation a,
261
+ .tsd-navigation .tsd-accordion-summary {
262
+ border-radius: 9px;
263
+ font-size: 0.89rem;
264
+ line-height: 1.4;
265
+ padding: 7px 9px;
266
+ overflow-wrap: anywhere;
267
+ }
268
+ .tsd-navigation a:hover,
269
+ .tsd-page-navigation a:hover {
270
+ background: var(--docs-brand-tint);
271
+ color: var(--docs-brand-strong);
272
+ text-decoration: none;
273
+ }
274
+ .tsd-navigation a.current,
275
+ .tsd-page-navigation a.current {
276
+ background: var(--docs-brand-tint);
277
+ color: var(--docs-brand-strong);
278
+ font-weight: 650;
279
+ }
280
+ .tsd-page-navigation .tsd-accordion-details {
281
+ display: flex;
282
+ flex-direction: column;
283
+ gap: 2px;
284
+ }
285
+ .tsd-navigation h3,
286
+ .tsd-page-navigation h3 {
287
+ font-size: 0.89rem;
288
+ font-weight: 730;
289
+ letter-spacing: -0.015em;
290
+ }
291
+ .tsd-navigation.settings {
292
+ margin-bottom: 8px;
293
+ }
294
+ .tsd-filter-visibility,
295
+ .tsd-theme-toggle {
296
+ font-size: 0.85rem;
297
+ }
298
+
299
+ /* Surfaces and readable API signatures. */
300
+ .tsd-panel,
301
+ .tsd-signature,
302
+ .tsd-index-panel {
303
+ max-width: 100%;
304
+ min-width: 0;
305
+ overflow-wrap: anywhere;
306
+ }
307
+ .tsd-panel.tsd-typography {
308
+ background: var(--docs-surface);
309
+ border: 1px solid var(--docs-line);
310
+ border-radius: 18px;
311
+ box-shadow: var(--docs-shadow);
312
+ padding: clamp(17px, 2.5vw, 34px);
313
+ }
314
+ .tsd-panel.tsd-typography > :first-child {
315
+ margin-top: 0;
316
+ }
317
+ .tsd-panel.tsd-typography > :last-child {
318
+ margin-bottom: 0;
319
+ }
320
+ .tsd-typography {
321
+ font-size: 0.965rem;
322
+ color: var(--docs-ink);
323
+ }
324
+ .tsd-typography p,
325
+ .tsd-typography li {
326
+ line-height: 1.72;
327
+ }
328
+ .tsd-typography h2,
329
+ .tsd-typography h3 {
330
+ letter-spacing: -0.025em;
331
+ }
332
+ .tsd-typography h2 {
333
+ font-size: 1.45rem;
334
+ margin-top: 1.9em;
335
+ }
336
+ .tsd-typography a {
337
+ color: var(--docs-brand-strong);
338
+ text-underline-offset: 3px;
339
+ }
340
+ .tsd-signature {
341
+ white-space: normal;
342
+ overflow-wrap: anywhere;
343
+ }
344
+ .tsd-signatures,
345
+ .tsd-member,
346
+ .tsd-index-panel {
347
+ min-width: 0;
348
+ }
349
+ .tsd-member .tsd-signature {
350
+ line-height: 1.65;
351
+ }
352
+ .tsd-panel-group {
353
+ min-width: 0;
354
+ }
355
+ .tsd-panel-group h2 {
356
+ letter-spacing: -0.035em;
357
+ }
358
+
359
+ /* Long API property/configuration tables never enter the TOC column. */
360
+ .tsd-typography table {
361
+ display: block;
362
+ width: 100%;
363
+ max-width: 100%;
364
+ overflow-x: auto;
365
+ overflow-y: hidden;
366
+ border: 1px solid var(--docs-line);
367
+ border-radius: 12px;
368
+ scrollbar-width: thin;
369
+ background: var(--docs-surface);
370
+ margin: 1.3rem 0 1.6rem;
371
+ }
372
+ .tsd-typography th,
373
+ .tsd-typography td {
374
+ padding: 11px 15px;
375
+ border: 0;
376
+ border-bottom: 1px solid var(--docs-line);
377
+ vertical-align: top;
378
+ min-width: 110px;
379
+ overflow-wrap: anywhere;
380
+ word-break: normal;
381
+ font-size: 0.875rem;
382
+ }
383
+ .tsd-typography th {
384
+ text-align: left;
385
+ font-size: 0.78rem;
386
+ letter-spacing: 0.02em;
387
+ font-weight: 750;
388
+ color: var(--docs-muted);
389
+ }
390
+ .tsd-typography tbody tr:last-child td {
391
+ border-bottom: 0;
392
+ }
393
+ .tsd-typography thead,
394
+ .tsd-typography tbody tr:nth-child(even) {
395
+ background: var(--docs-surface-alt);
396
+ }
397
+ .tsd-typography tbody tr:hover {
398
+ background: var(--docs-brand-tint);
399
+ }
400
+ .tsd-typography table code,
401
+ .tsd-typography td code {
402
+ white-space: normal;
403
+ overflow-wrap: anywhere;
404
+ }
405
+ .tsd-typography pre {
406
+ max-width: 100%;
407
+ overflow-x: auto;
408
+ border-radius: 13px;
409
+ border: 1px solid var(--docs-line);
410
+ background: var(--docs-surface-alt);
411
+ padding: 15px;
412
+ scrollbar-width: thin;
413
+ }
414
+ .tsd-typography code:not(pre code) {
415
+ background: var(--docs-surface-alt);
416
+ border: 1px solid var(--docs-line);
417
+ padding: 0.1em 0.35em;
418
+ border-radius: 6px;
419
+ font-size: 0.87em;
420
+ }
421
+ .tsd-typography pre code {
422
+ overflow-wrap: normal;
423
+ }
424
+ .tsd-typography img {
425
+ max-width: 100%;
426
+ height: auto;
427
+ }
428
+ .tsd-typography blockquote {
429
+ border-left: 3px solid var(--docs-brand);
430
+ background: var(--docs-surface-alt);
431
+ margin-left: 0;
432
+ padding: 13px 18px;
433
+ border-radius: 0 12px 12px 0;
434
+ }
435
+ footer {
436
+ border-top: 1px solid var(--docs-line);
437
+ color: var(--docs-muted);
438
+ font-size: 0.8rem;
439
+ }
440
+
441
+ /* A focused, action-first overview for humans arriving at the API root. */
442
+ .docs-hero {
443
+ position: relative;
444
+ overflow: hidden;
445
+ border-radius: 18px;
446
+ background: var(--docs-hero-gradient);
447
+ padding: clamp(24px, 4vw, 52px);
448
+ color: #fff;
449
+ margin-bottom: 20px;
450
+ }
451
+ .docs-hero::after {
452
+ content: "";
453
+ position: absolute;
454
+ width: 320px;
455
+ height: 320px;
456
+ border-radius: 50%;
457
+ right: -125px;
458
+ top: -200px;
459
+ background: rgb(255 255 255 / 8%);
460
+ pointer-events: none;
461
+ }
462
+ .docs-hero h2 {
463
+ color: #fff;
464
+ font-weight: 790;
465
+ font-size: clamp(2rem, 3.3vw, 3.1rem);
466
+ line-height: 1.12;
467
+ max-width: 17ch;
468
+ margin: 17px 0 16px;
469
+ letter-spacing: -0.055em;
470
+ }
471
+ .docs-hero p {
472
+ font-size: clamp(1rem, 1.3vw, 1.1rem);
473
+ color: #dce8ff;
474
+ max-width: 54ch;
475
+ margin: 0;
476
+ }
477
+ .docs-kicker {
478
+ display: inline-block;
479
+ border: 1px solid rgb(255 255 255 / 25%);
480
+ border-radius: 100px;
481
+ background: rgb(255 255 255 / 11%);
482
+ color: #eaf1ff;
483
+ padding: 6px 12px;
484
+ font-size: 0.72rem;
485
+ letter-spacing: 0.11em;
486
+ text-transform: uppercase;
487
+ font-weight: 760;
488
+ }
489
+ .docs-hero-actions {
490
+ display: flex;
491
+ flex-wrap: wrap;
492
+ align-items: center;
493
+ gap: 12px;
494
+ margin-top: 28px;
495
+ }
496
+ .docs-hero-actions a {
497
+ display: inline-flex;
498
+ align-items: center;
499
+ justify-content: center;
500
+ min-height: 44px;
501
+ border-radius: 11px;
502
+ padding: 10px 18px;
503
+ background: #fff;
504
+ color: #153f93 !important;
505
+ font-weight: 750;
506
+ text-decoration: none;
507
+ font-size: 0.9rem;
508
+ }
509
+ .docs-hero-actions a:hover {
510
+ background: #eaf2ff;
511
+ }
512
+ .docs-hero-actions a.docs-action-quiet {
513
+ background: rgb(255 255 255 / 10%);
514
+ border: 1px solid rgb(255 255 255 / 30%);
515
+ color: #fff !important;
516
+ }
517
+ .docs-hero-actions a.docs-action-quiet:hover {
518
+ background: rgb(255 255 255 / 20%);
519
+ }
520
+ .docs-tiles {
521
+ display: grid;
522
+ grid-template-columns: repeat(2, minmax(0, 1fr));
523
+ gap: 12px;
524
+ margin: 18px 0 26px;
525
+ }
526
+ .docs-tile {
527
+ display: flex;
528
+ flex-direction: column;
529
+ gap: 8px;
530
+ min-width: 0;
531
+ padding: 20px;
532
+ border-radius: 14px;
533
+ border: 1px solid var(--docs-line);
534
+ background: var(--docs-surface);
535
+ text-decoration: none !important;
536
+ transition:
537
+ transform 0.18s ease,
538
+ border-color 0.18s ease,
539
+ box-shadow 0.18s ease;
540
+ }
541
+ .docs-tile:hover {
542
+ border-color: var(--docs-brand);
543
+ box-shadow: var(--docs-shadow);
544
+ transform: translateY(-2px);
545
+ }
546
+ .docs-tile-title {
547
+ color: var(--docs-ink);
548
+ font-weight: 760;
549
+ font-size: 0.99rem;
550
+ line-height: 1.3;
551
+ }
552
+ .docs-tile-desc {
553
+ color: var(--docs-muted);
554
+ font-size: 0.85rem;
555
+ line-height: 1.55;
556
+ }
557
+ .docs-pill {
558
+ display: inline-block;
559
+ background: var(--docs-brand-tint);
560
+ color: var(--docs-brand-strong);
561
+ font-size: 0.68rem;
562
+ font-weight: 760;
563
+ letter-spacing: 0.065em;
564
+ text-transform: uppercase;
565
+ border-radius: 7px;
566
+ padding: 3px 8px;
567
+ width: max-content;
568
+ }
569
+
570
+ @media (max-width: 769px) {
571
+ .container {
572
+ padding-inline: 16px;
573
+ }
574
+ .container-main {
575
+ margin-block: 20px 40px;
576
+ }
577
+ .tsd-toolbar-contents {
578
+ min-height: 58px;
579
+ gap: 7px;
580
+ }
581
+ .tsd-toolbar-contents .title {
582
+ font-size: 0.88rem;
583
+ }
584
+ #tsd-toolbar-links {
585
+ display: none;
586
+ }
587
+ .docs-theme-switch,
588
+ #tsd-search-trigger {
589
+ width: 36px;
590
+ height: 36px;
591
+ min-width: 36px;
592
+ }
593
+ .tsd-page-title {
594
+ padding-top: 10px;
595
+ }
596
+ .tsd-panel.tsd-typography {
597
+ padding: 18px 15px;
598
+ }
599
+ .docs-hero {
600
+ padding: 24px 18px;
601
+ }
602
+ .docs-hero h2 {
603
+ font-size: 2rem;
604
+ }
605
+ .docs-hero-actions a {
606
+ width: 100%;
607
+ box-sizing: border-box;
608
+ }
609
+ .docs-tiles {
610
+ grid-template-columns: minmax(0, 1fr);
611
+ }
612
+ .tsd-typography th,
613
+ .tsd-typography td {
614
+ padding: 8px 11px;
615
+ }
616
+ }
617
+ @media (prefers-reduced-motion: reduce) {
618
+ .docs-tile,
619
+ .docs-theme-switch,
620
+ #tsd-search-trigger {
621
+ transition: none !important;
622
+ }
623
+ }
624
+
625
+ /* Module-level groups need the same visual hierarchy as the overview. */
626
+ .col-content > .tsd-panel-group {
627
+ padding: 14px clamp(16px, 2vw, 26px);
628
+ margin-bottom: 18px;
629
+ border: 1px solid var(--docs-line);
630
+ border-radius: 16px;
631
+ background: var(--docs-surface);
632
+ box-shadow: var(--docs-shadow);
633
+ }
634
+ .col-content > .tsd-panel-group > summary {
635
+ padding: 3px 0;
636
+ }
637
+ .tsd-member-summaries {
638
+ margin-bottom: 0;
639
+ }
640
+ .tsd-member-summary {
641
+ padding: 8px 4px;
642
+ }
643
+ .tsd-member-summary + .tsd-member-summary {
644
+ border-top: 1px solid var(--docs-line);
645
+ }
646
+ .tsd-signature,
647
+ .tsd-signatures {
648
+ overflow-wrap: anywhere;
649
+ }
650
+ @media (max-width: 769px) {
651
+ .col-content > .tsd-panel-group {
652
+ padding: 12px 14px;
653
+ }
654
+ }
655
+
656
+ /* Long TypeScript symbol names must wrap at narrow widths, not widen the viewport. */
657
+ .tsd-member-summary-name {
658
+ display: inline-flex;
659
+ align-items: flex-start;
660
+ max-width: 100%;
661
+ min-width: 0;
662
+ }
663
+ .tsd-member-summary-name a {
664
+ min-width: 0;
665
+ overflow-wrap: anywhere;
666
+ word-break: break-word;
667
+ }
668
+ .tsd-member-summary-name .tsd-kind-icon {
669
+ flex-shrink: 0;
670
+ }
@@ -0,0 +1,58 @@
1
+ /* Small, accessible theme shortcut. TypeDoc owns the actual theme setting. */
2
+ (() => {
3
+ "use strict";
4
+ const THEME_KEY = "tsd-theme";
5
+
6
+ function init() {
7
+ const toolbar = document.querySelector(".tsd-toolbar-contents");
8
+ const existingTheme = document.getElementById("tsd-theme");
9
+ const search = document.getElementById("tsd-search-trigger");
10
+ if (!toolbar || !existingTheme || !search || document.getElementById("docs-theme-switch"))
11
+ return;
12
+
13
+ const button = document.createElement("button");
14
+ button.type = "button";
15
+ button.id = "docs-theme-switch";
16
+ button.className = "docs-theme-switch";
17
+ button.title = "Toggle light and dark theme";
18
+ button.setAttribute("aria-label", "Switch to dark theme");
19
+
20
+ const icon = document.createElement("span");
21
+ icon.className = "docs-theme-icon";
22
+ icon.setAttribute("aria-hidden", "true");
23
+ button.appendChild(icon);
24
+ search.before(button);
25
+
26
+ const prefersDark = window.matchMedia("(prefers-color-scheme: dark)");
27
+ const activeTheme = () => {
28
+ const current = document.documentElement.dataset.theme;
29
+ return current === "dark" || (current !== "light" && prefersDark.matches) ? "dark" : "light";
30
+ };
31
+ const update = () => {
32
+ const dark = activeTheme() === "dark";
33
+ icon.textContent = dark ? "☀" : "☾";
34
+ button.setAttribute("aria-label", dark ? "Switch to light theme" : "Switch to dark theme");
35
+ button.title = dark ? "Use light theme" : "Use dark theme";
36
+ button.setAttribute("aria-pressed", String(dark));
37
+ };
38
+ button.addEventListener("click", () => {
39
+ const next = activeTheme() === "dark" ? "light" : "dark";
40
+ document.documentElement.dataset.theme = next;
41
+ try {
42
+ window.localStorage.setItem(THEME_KEY, next);
43
+ } catch {
44
+ /* Private browsing. */
45
+ }
46
+ existingTheme.value = next;
47
+ existingTheme.dispatchEvent(new Event("change", { bubbles: true }));
48
+ update();
49
+ });
50
+ existingTheme.addEventListener("change", update);
51
+ prefersDark.addEventListener?.("change", update);
52
+ update();
53
+ }
54
+
55
+ if (document.readyState === "loading")
56
+ document.addEventListener("DOMContentLoaded", init, { once: true });
57
+ else init();
58
+ })();