mdsvr 1.0.2 → 2.0.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 (78) hide show
  1. package/README.md +180 -4
  2. package/bin/mdsvr.js +0 -0
  3. package/dist/cli.js +73 -5
  4. package/dist/cli.js.map +1 -1
  5. package/dist/directory.d.ts.map +1 -1
  6. package/dist/directory.js +50 -21
  7. package/dist/directory.js.map +1 -1
  8. package/dist/generators/feed.d.ts +3 -0
  9. package/dist/generators/feed.d.ts.map +1 -0
  10. package/dist/generators/feed.js +110 -0
  11. package/dist/generators/feed.js.map +1 -0
  12. package/dist/generators/search-index.d.ts +10 -0
  13. package/dist/generators/search-index.d.ts.map +1 -0
  14. package/dist/generators/search-index.js +79 -0
  15. package/dist/generators/search-index.js.map +1 -0
  16. package/dist/generators/sitemap.d.ts +3 -0
  17. package/dist/generators/sitemap.d.ts.map +1 -0
  18. package/dist/generators/sitemap.js +90 -0
  19. package/dist/generators/sitemap.js.map +1 -0
  20. package/dist/index.d.ts +2 -0
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +1 -0
  23. package/dist/index.js.map +1 -1
  24. package/dist/renderer/components.d.ts +60 -0
  25. package/dist/renderer/components.d.ts.map +1 -0
  26. package/dist/renderer/components.js +59 -0
  27. package/dist/renderer/components.js.map +1 -0
  28. package/dist/renderer/index.d.ts +7 -0
  29. package/dist/renderer/index.d.ts.map +1 -0
  30. package/dist/renderer/index.js +14 -0
  31. package/dist/renderer/index.js.map +1 -0
  32. package/dist/renderer/markdown.d.ts +14 -0
  33. package/dist/renderer/markdown.d.ts.map +1 -0
  34. package/dist/renderer/markdown.js +83 -0
  35. package/dist/renderer/markdown.js.map +1 -0
  36. package/dist/renderer/mdx.d.ts +13 -0
  37. package/dist/renderer/mdx.d.ts.map +1 -0
  38. package/dist/renderer/mdx.js +55 -0
  39. package/dist/renderer/mdx.js.map +1 -0
  40. package/dist/router.d.ts +2 -1
  41. package/dist/router.d.ts.map +1 -1
  42. package/dist/router.js +158 -45
  43. package/dist/router.js.map +1 -1
  44. package/dist/server.d.ts +5 -1
  45. package/dist/server.d.ts.map +1 -1
  46. package/dist/server.js +43 -1
  47. package/dist/server.js.map +1 -1
  48. package/dist/settings/defaults.d.ts +5 -0
  49. package/dist/settings/defaults.d.ts.map +1 -0
  50. package/dist/settings/defaults.js +35 -0
  51. package/dist/settings/defaults.js.map +1 -0
  52. package/dist/settings/index.d.ts +11 -0
  53. package/dist/settings/index.d.ts.map +1 -0
  54. package/dist/settings/index.js +78 -0
  55. package/dist/settings/index.js.map +1 -0
  56. package/dist/settings/schema.d.ts +820 -0
  57. package/dist/settings/schema.d.ts.map +1 -0
  58. package/dist/settings/schema.js +117 -0
  59. package/dist/settings/schema.js.map +1 -0
  60. package/dist/template/index.d.ts +15 -0
  61. package/dist/template/index.d.ts.map +1 -0
  62. package/dist/template/index.js +851 -0
  63. package/dist/template/index.js.map +1 -0
  64. package/dist/template/search.d.ts +5 -0
  65. package/dist/template/search.d.ts.map +1 -0
  66. package/dist/template/search.js +241 -0
  67. package/dist/template/search.js.map +1 -0
  68. package/dist/template/seo.d.ts +13 -0
  69. package/dist/template/seo.d.ts.map +1 -0
  70. package/dist/template/seo.js +71 -0
  71. package/dist/template/seo.js.map +1 -0
  72. package/dist/template/sidebar.d.ts +14 -0
  73. package/dist/template/sidebar.d.ts.map +1 -0
  74. package/dist/template/sidebar.js +185 -0
  75. package/dist/template/sidebar.js.map +1 -0
  76. package/dist/types.d.ts +4 -0
  77. package/dist/types.d.ts.map +1 -1
  78. package/package.json +15 -3
@@ -0,0 +1,851 @@
1
+ import { buildSeoTags } from "./seo.js";
2
+ import { renderSidebar, renderToc } from "./sidebar.js";
3
+ import { renderSearchModal, renderSearchTrigger, getSearchInlineScript, } from "./search.js";
4
+ export function renderPage(params) {
5
+ const { title, body, filePath, settings, frontmatter = {}, toc = [], sidebar = [], urlPath = "/", } = params;
6
+ // Determine theme
7
+ const defaultTheme = settings.appearance.defaultTheme;
8
+ const themeScript = `
9
+ <script>
10
+ (function() {
11
+ var theme = localStorage.getItem('theme') || '${defaultTheme}';
12
+ if (theme === 'system') {
13
+ theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
14
+ }
15
+ document.documentElement.setAttribute('data-theme', theme);
16
+ })();
17
+ </script>`;
18
+ // Build SEO data from frontmatter and settings
19
+ const seoData = {
20
+ title: frontmatter.title || title,
21
+ description: frontmatter.description || settings.site.description,
22
+ image: frontmatter.image || settings.seo.defaultImage,
23
+ url: urlPath,
24
+ type: frontmatter.date ? "article" : "website",
25
+ date: frontmatter.date || undefined,
26
+ author: frontmatter.author || undefined,
27
+ noIndex: frontmatter.noIndex || false,
28
+ };
29
+ const seoTags = buildSeoTags(seoData, settings);
30
+ const pageTitle = settings.seo.titleTemplate.replace("%s", seoData.title);
31
+ // Render sidebar if enabled
32
+ const hasSidebar = settings.navigation.sidebar.enabled && sidebar.length > 0;
33
+ const sidebarHtml = hasSidebar
34
+ ? `<aside class="sidebar" id="sidebar">${renderSidebar(sidebar, settings)}</aside>`
35
+ : "";
36
+ // Sidebar toggle button for mobile
37
+ const sidebarToggle = hasSidebar
38
+ ? `<button class="sidebar-toggle" onclick="document.getElementById('sidebar').classList.toggle('open')" aria-label="Toggle menu">☰</button>`
39
+ : "";
40
+ // Render TOC if enabled
41
+ const tocHtml = settings.navigation.tocEnabled && toc.length > 0
42
+ ? `<aside class="toc-sidebar">${renderToc(toc, settings)}</aside>`
43
+ : "";
44
+ // Search trigger in header
45
+ const searchTrigger = renderSearchTrigger(settings);
46
+ // Theme toggle
47
+ const themeToggle = settings.appearance.allowThemeToggle
48
+ ? `<button class="theme-toggle" onclick="toggleTheme()" title="Toggle theme">
49
+ <span class="theme-icon-light">☀️</span>
50
+ <span class="theme-icon-dark">🌙</span>
51
+ </button>`
52
+ : "";
53
+ // Logo/header
54
+ const logoHtml = settings.site.logo
55
+ ? `<a href="${settings.site.logo.href}" class="site-logo">
56
+ <img src="${settings.site.logo.src}" alt="${settings.site.logo.alt}" />
57
+ </a>`
58
+ : `<a href="/" class="site-logo">${settings.site.title}</a>`;
59
+ // Footer
60
+ const footerLinks = settings.footer.links
61
+ .map((link) => `<a href="${link.href}">${escapeHtml(link.label)}</a>`)
62
+ .join(" | ");
63
+ const footerHtml = `<footer class="footer">
64
+ <div class="footer-content">
65
+ <span>${escapeHtml(settings.footer.text)}</span>
66
+ ${footerLinks ? `<span class="footer-links">${footerLinks}</span>` : ""}
67
+ </div>
68
+ </footer>`;
69
+ // Breadcrumbs
70
+ const breadcrumbs = settings.navigation.breadcrumbs
71
+ ? renderBreadcrumbs(urlPath, settings)
72
+ : "";
73
+ return `<!DOCTYPE html>
74
+ <html lang="${settings.site.language}" data-theme="${defaultTheme}">
75
+ <head>
76
+ <meta charset="UTF-8">
77
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
78
+ ${themeScript}
79
+ ${seoTags}
80
+ ${settings.site.favicon ? `<link rel="icon" href="${settings.site.favicon}">` : ""}
81
+ <style>
82
+ ${getBaseStyles(settings)}
83
+ </style>
84
+ </head>
85
+ <body>
86
+ <header class="site-header">
87
+ <div class="header-left">
88
+ ${sidebarToggle}
89
+ ${logoHtml}
90
+ </div>
91
+ <div class="header-right">
92
+ ${searchTrigger}
93
+ ${themeToggle}
94
+ </div>
95
+ </header>
96
+
97
+ <div class="site-container">
98
+ ${sidebarHtml}
99
+ <main class="content">
100
+ ${breadcrumbs}
101
+ <article class="markdown-body">
102
+ ${body}
103
+ </article>
104
+ ${footerHtml}
105
+ </main>
106
+ ${tocHtml}
107
+ </div>
108
+
109
+ ${renderSearchModal(settings)}
110
+ ${settings.search.enabled ? getSearchInlineScript() : ""}
111
+
112
+ <script>
113
+ function toggleTheme() {
114
+ var current = document.documentElement.getAttribute('data-theme');
115
+ var next = current === 'dark' ? 'light' : 'dark';
116
+ document.documentElement.setAttribute('data-theme', next);
117
+ localStorage.setItem('theme', next);
118
+ }
119
+
120
+ // Listen for system theme changes
121
+ if (window.matchMedia) {
122
+ var mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
123
+ mediaQuery.addListener(function(e) {
124
+ if (localStorage.getItem('theme') === 'system' || !localStorage.getItem('theme')) {
125
+ document.documentElement.setAttribute('data-theme', e.matches ? 'dark' : 'light');
126
+ }
127
+ });
128
+ }
129
+ </script>
130
+ </body>
131
+ </html>`;
132
+ }
133
+ function renderBreadcrumbs(urlPath, settings) {
134
+ if (urlPath === "/")
135
+ return "";
136
+ const parts = urlPath.split("/").filter(Boolean);
137
+ let accum = "";
138
+ const links = parts.map((part, i) => {
139
+ accum += "/" + part;
140
+ const isLast = i === parts.length - 1;
141
+ const label = humanize(part);
142
+ if (isLast) {
143
+ return `<span class="breadcrumb-current">${escapeHtml(label)}</span>`;
144
+ }
145
+ return `<a href="${accum}">${escapeHtml(label)}</a>`;
146
+ });
147
+ return `<nav class="breadcrumbs">
148
+ <a href="/">Home</a>
149
+ ${links.length > 0 ? '<span class="breadcrumb-sep">/</span>' + links.join('<span class="breadcrumb-sep">/</span>') : ""}
150
+ </nav>`;
151
+ }
152
+ function humanize(str) {
153
+ return str
154
+ .replace(/[-_]/g, " ")
155
+ .replace(/\.\w+$/, "")
156
+ .replace(/^\w/, (c) => c.toUpperCase());
157
+ }
158
+ function escapeHtml(text) {
159
+ const htmlEscapes = {
160
+ "&": "&amp;",
161
+ "<": "&lt;",
162
+ ">": "&gt;",
163
+ '"': "&quot;",
164
+ "'": "&#x27;",
165
+ };
166
+ return text.replace(/[&<>"']/g, (char) => htmlEscapes[char] || char);
167
+ }
168
+ function getBaseStyles(settings) {
169
+ const accentColor = settings.appearance.accentColor;
170
+ return `
171
+ :root {
172
+ --accent-color: ${accentColor};
173
+ }
174
+
175
+ :root[data-theme="light"] {
176
+ --bg: #ffffff;
177
+ --bg-secondary: #f6f8fa;
178
+ --border: #d1d9e0;
179
+ --text: #1f2328;
180
+ --text-muted: #636c76;
181
+ --accent: var(--accent-color, #0969da);
182
+ --code-bg: #f6f8fa;
183
+ --sidebar-width: 260px;
184
+ --toc-width: 220px;
185
+ }
186
+
187
+ :root[data-theme="dark"] {
188
+ --bg: #0d1117;
189
+ --bg-secondary: #161b22;
190
+ --border: #30363d;
191
+ --text: #e6edf3;
192
+ --text-muted: #8d96a0;
193
+ --accent: var(--accent-color, #58a6ff);
194
+ --code-bg: #161b22;
195
+ --sidebar-width: 260px;
196
+ --toc-width: 220px;
197
+ }
198
+
199
+ * { box-sizing: border-box; }
200
+
201
+ body {
202
+ margin: 0;
203
+ font-family: ${settings.appearance.fontFamily.body || "-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif"};
204
+ font-size: 16px;
205
+ line-height: 1.6;
206
+ color: var(--text);
207
+ background: var(--bg);
208
+ }
209
+
210
+ .site-header {
211
+ position: fixed;
212
+ top: 0;
213
+ left: 0;
214
+ right: 0;
215
+ height: 60px;
216
+ background: var(--bg-secondary);
217
+ border-bottom: 1px solid var(--border);
218
+ display: flex;
219
+ align-items: center;
220
+ justify-content: space-between;
221
+ padding: 0 24px;
222
+ z-index: 100;
223
+ }
224
+
225
+ .header-left, .header-right {
226
+ display: flex;
227
+ align-items: center;
228
+ gap: 16px;
229
+ }
230
+
231
+ .site-logo {
232
+ color: var(--text);
233
+ font-weight: 600;
234
+ font-size: 18px;
235
+ text-decoration: none;
236
+ display: flex;
237
+ align-items: center;
238
+ gap: 8px;
239
+ }
240
+
241
+ .site-logo img {
242
+ height: 28px;
243
+ width: auto;
244
+ }
245
+
246
+ .search-trigger, .theme-toggle, .sidebar-toggle {
247
+ background: transparent;
248
+ border: 1px solid var(--border);
249
+ color: var(--text-muted);
250
+ padding: 8px 12px;
251
+ border-radius: 6px;
252
+ cursor: pointer;
253
+ font-size: 14px;
254
+ display: flex;
255
+ align-items: center;
256
+ gap: 6px;
257
+ }
258
+
259
+ .search-trigger:hover, .theme-toggle:hover, .sidebar-toggle:hover {
260
+ border-color: var(--accent);
261
+ color: var(--text);
262
+ }
263
+
264
+ .sidebar-toggle {
265
+ display: none;
266
+ font-size: 18px;
267
+ padding: 6px 10px;
268
+ }
269
+
270
+ @media (max-width: 768px) {
271
+ .sidebar-toggle {
272
+ display: flex;
273
+ }
274
+ }
275
+
276
+ .search-shortcut {
277
+ font-size: 12px;
278
+ opacity: 0.6;
279
+ }
280
+
281
+ .site-container {
282
+ display: flex;
283
+ margin-top: 60px;
284
+ min-height: calc(100vh - 60px);
285
+ }
286
+
287
+ .sidebar {
288
+ width: var(--sidebar-width);
289
+ flex-shrink: 0;
290
+ background: var(--bg-secondary);
291
+ border-right: 1px solid var(--border);
292
+ padding: 24px 16px;
293
+ overflow-y: auto;
294
+ position: fixed;
295
+ top: 60px;
296
+ bottom: 0;
297
+ left: 0;
298
+ }
299
+
300
+ .sidebar-nav {
301
+ list-style: none;
302
+ margin: 0;
303
+ padding: 0;
304
+ }
305
+
306
+ .nav-item {
307
+ margin: 4px 0;
308
+ }
309
+
310
+ .nav-link {
311
+ display: block;
312
+ padding: 6px 12px;
313
+ color: var(--text-muted);
314
+ text-decoration: none;
315
+ border-radius: 6px;
316
+ font-size: 14px;
317
+ }
318
+
319
+ .nav-link:hover {
320
+ background: var(--bg);
321
+ color: var(--text);
322
+ }
323
+
324
+ .nav-link.active {
325
+ background: var(--accent);
326
+ color: white;
327
+ }
328
+
329
+ .nav-children {
330
+ margin-left: 12px;
331
+ border-left: 1px solid var(--border);
332
+ padding-left: 8px;
333
+ }
334
+
335
+ .content {
336
+ flex: 1;
337
+ margin-left: var(--sidebar-width);
338
+ padding: 32px 48px;
339
+ max-width: calc(100% - var(--sidebar-width) - var(--toc-width));
340
+ }
341
+
342
+ .toc-sidebar {
343
+ width: var(--toc-width);
344
+ flex-shrink: 0;
345
+ padding: 32px 24px;
346
+ position: fixed;
347
+ right: 0;
348
+ top: 60px;
349
+ bottom: 0;
350
+ overflow-y: auto;
351
+ }
352
+
353
+ .toc h3 {
354
+ font-size: 14px;
355
+ font-weight: 600;
356
+ margin: 0 0 12px;
357
+ color: var(--text-muted);
358
+ }
359
+
360
+ .toc-list {
361
+ list-style: none;
362
+ margin: 0;
363
+ padding: 0;
364
+ }
365
+
366
+ .toc-item {
367
+ margin: 4px 0;
368
+ }
369
+
370
+ .toc-item a {
371
+ display: block;
372
+ padding: 4px 0;
373
+ color: var(--text-muted);
374
+ text-decoration: none;
375
+ font-size: 13px;
376
+ }
377
+
378
+ .toc-item a:hover {
379
+ color: var(--accent);
380
+ }
381
+
382
+ .breadcrumbs {
383
+ margin-bottom: 24px;
384
+ font-size: 14px;
385
+ color: var(--text-muted);
386
+ }
387
+
388
+ .breadcrumbs a {
389
+ color: var(--accent);
390
+ text-decoration: none;
391
+ }
392
+
393
+ .breadcrumb-sep {
394
+ margin: 0 8px;
395
+ opacity: 0.5;
396
+ }
397
+
398
+ .markdown-body {
399
+ max-width: 800px;
400
+ }
401
+
402
+ .markdown-body h1, .markdown-body h2, .markdown-body h3,
403
+ .markdown-body h4, .markdown-body h5, .markdown-body h6 {
404
+ margin-top: 24px;
405
+ margin-bottom: 16px;
406
+ font-weight: 600;
407
+ line-height: 1.25;
408
+ color: var(--text);
409
+ }
410
+
411
+ .markdown-body h1 { font-size: 2em; border-bottom: 1px solid var(--border); padding-bottom: 0.3em; }
412
+ .markdown-body h2 { font-size: 1.5em; border-bottom: 1px solid var(--border); padding-bottom: 0.3em; }
413
+ .markdown-body h3 { font-size: 1.25em; }
414
+ .markdown-body h4 { font-size: 1em; }
415
+ .markdown-body h5 { font-size: 0.875em; }
416
+ .markdown-body h6 { font-size: 0.85em; color: var(--text-muted); }
417
+ .markdown-body p { margin-top: 0; margin-bottom: 16px; }
418
+ .markdown-body a { color: var(--accent); text-decoration: none; }
419
+ .markdown-body a:hover { text-decoration: underline; }
420
+ .markdown-body ul, .markdown-body ol {
421
+ margin-top: 0;
422
+ margin-bottom: 16px;
423
+ padding-left: 2em;
424
+ }
425
+ .markdown-body ul { list-style-type: disc; }
426
+ .markdown-body ol { list-style-type: decimal; }
427
+ .markdown-body li + li { margin-top: 0.25em; }
428
+ .markdown-body code {
429
+ font-family: ${settings.appearance.fontFamily.code || "'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace"};
430
+ font-size: 85%;
431
+ padding: 0.2em 0.4em;
432
+ background: var(--code-bg);
433
+ border-radius: 6px;
434
+ }
435
+ .markdown-body pre {
436
+ background: var(--code-bg);
437
+ border-radius: 6px;
438
+ padding: 16px;
439
+ overflow: auto;
440
+ font-size: 85%;
441
+ line-height: 1.45;
442
+ margin-bottom: 16px;
443
+ }
444
+ .markdown-body pre code {
445
+ background: transparent;
446
+ padding: 0;
447
+ border-radius: 0;
448
+ }
449
+ .markdown-body blockquote {
450
+ margin: 0 0 16px;
451
+ padding: 0 1em;
452
+ color: var(--text-muted);
453
+ border-left: 0.25em solid var(--border);
454
+ }
455
+ .markdown-body table {
456
+ border-collapse: collapse;
457
+ width: 100%;
458
+ margin-bottom: 16px;
459
+ }
460
+ .markdown-body th, .markdown-body td {
461
+ padding: 6px 13px;
462
+ border: 1px solid var(--border);
463
+ }
464
+ .markdown-body th { background: var(--bg-secondary); font-weight: 600; }
465
+ .markdown-body tr:nth-child(2n) { background: var(--bg-secondary); }
466
+ .markdown-body img { max-width: 100%; height: auto; }
467
+ .markdown-body hr {
468
+ height: 0.25em;
469
+ padding: 0;
470
+ margin: 24px 0;
471
+ background: var(--border);
472
+ border: 0;
473
+ }
474
+
475
+ .footer {
476
+ margin-top: 64px;
477
+ padding-top: 24px;
478
+ border-top: 1px solid var(--border);
479
+ font-size: 14px;
480
+ color: var(--text-muted);
481
+ }
482
+
483
+ .footer-content {
484
+ display: flex;
485
+ justify-content: space-between;
486
+ align-items: center;
487
+ flex-wrap: wrap;
488
+ gap: 16px;
489
+ }
490
+
491
+ .footer-links a {
492
+ color: var(--accent);
493
+ text-decoration: none;
494
+ }
495
+
496
+ /* Search modal styles */
497
+ .search-modal {
498
+ position: fixed;
499
+ top: 0;
500
+ left: 0;
501
+ right: 0;
502
+ bottom: 0;
503
+ z-index: 1000;
504
+ }
505
+
506
+ .search-overlay {
507
+ position: absolute;
508
+ top: 0;
509
+ left: 0;
510
+ right: 0;
511
+ bottom: 0;
512
+ background: rgba(0, 0, 0, 0.5);
513
+ }
514
+
515
+ .search-container {
516
+ position: absolute;
517
+ top: 100px;
518
+ left: 50%;
519
+ transform: translateX(-50%);
520
+ width: 90%;
521
+ max-width: 600px;
522
+ background: var(--bg);
523
+ border-radius: 8px;
524
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
525
+ overflow: hidden;
526
+ }
527
+
528
+ .search-header {
529
+ display: flex;
530
+ align-items: center;
531
+ padding: 16px;
532
+ border-bottom: 1px solid var(--border);
533
+ gap: 12px;
534
+ }
535
+
536
+ .search-input {
537
+ flex: 1;
538
+ border: none;
539
+ background: transparent;
540
+ font-size: 16px;
541
+ color: var(--text);
542
+ outline: none;
543
+ }
544
+
545
+ .search-input::placeholder {
546
+ color: var(--text-muted);
547
+ }
548
+
549
+ .search-close {
550
+ background: none;
551
+ border: none;
552
+ font-size: 24px;
553
+ color: var(--text-muted);
554
+ cursor: pointer;
555
+ }
556
+
557
+ .search-results {
558
+ max-height: 400px;
559
+ overflow-y: auto;
560
+ }
561
+
562
+ .search-result {
563
+ display: block;
564
+ padding: 12px 16px;
565
+ text-decoration: none;
566
+ color: var(--text);
567
+ border-bottom: 1px solid var(--border);
568
+ }
569
+
570
+ .search-result:hover, .search-result.selected {
571
+ background: var(--bg-secondary);
572
+ }
573
+
574
+ .search-result-title {
575
+ font-weight: 600;
576
+ margin-bottom: 4px;
577
+ }
578
+
579
+ .search-result-excerpt {
580
+ font-size: 14px;
581
+ color: var(--text-muted);
582
+ }
583
+
584
+ .search-result-excerpt mark {
585
+ background: rgba(255, 215, 0, 0.3);
586
+ color: inherit;
587
+ }
588
+
589
+ .search-footer {
590
+ display: flex;
591
+ justify-content: space-between;
592
+ padding: 12px 16px;
593
+ font-size: 12px;
594
+ color: var(--text-muted);
595
+ border-top: 1px solid var(--border);
596
+ }
597
+
598
+ .search-footer kbd {
599
+ background: var(--bg-secondary);
600
+ padding: 2px 6px;
601
+ border-radius: 4px;
602
+ border: 1px solid var(--border);
603
+ }
604
+
605
+ .search-no-results {
606
+ padding: 24px;
607
+ text-align: center;
608
+ color: var(--text-muted);
609
+ }
610
+
611
+ /* MDX Components - Light mode */
612
+ .callout {
613
+ border-left: 4px solid;
614
+ padding: 16px;
615
+ border-radius: 6px;
616
+ margin-bottom: 16px;
617
+ }
618
+ .callout-info {
619
+ border-color: #0969da;
620
+ background: #ddf4ff;
621
+ }
622
+ .callout-warning {
623
+ border-color: #9a6700;
624
+ background: #fff8c5;
625
+ }
626
+ .callout-danger {
627
+ border-color: #cf222e;
628
+ background: #ffebe9;
629
+ }
630
+ .callout-success {
631
+ border-color: #1a7f37;
632
+ background: #dafbe1;
633
+ }
634
+ .callout-tip {
635
+ border-color: #bf3989;
636
+ background: #ffeff7;
637
+ }
638
+
639
+ /* MDX Components - Dark mode */
640
+ [data-theme="dark"] .callout-info {
641
+ border-color: #58a6ff;
642
+ background: #0c1c38;
643
+ }
644
+ [data-theme="dark"] .callout-warning {
645
+ border-color: #d29922;
646
+ background: #241c04;
647
+ }
648
+ [data-theme="dark"] .callout-danger {
649
+ border-color: #f85149;
650
+ background: #3c0e0e;
651
+ }
652
+ [data-theme="dark"] .callout-success {
653
+ border-color: #3fb950;
654
+ background: #0f2616;
655
+ }
656
+ [data-theme="dark"] .callout-tip {
657
+ border-color: #db61a2;
658
+ background: #2a0e1f;
659
+ }
660
+
661
+ /* CodeGroup */
662
+ .code-group {
663
+ border: 1px solid var(--border);
664
+ border-radius: 6px;
665
+ margin-bottom: 16px;
666
+ overflow: hidden;
667
+ }
668
+ .code-group-title {
669
+ background: var(--bg-secondary);
670
+ padding: 8px 16px;
671
+ border-bottom: 1px solid var(--border);
672
+ font-size: 14px;
673
+ font-weight: 600;
674
+ color: var(--text);
675
+ }
676
+
677
+ /* Steps */
678
+ .steps {
679
+ counter-reset: step;
680
+ margin-bottom: 16px;
681
+ }
682
+ .steps > * {
683
+ position: relative;
684
+ padding-left: 40px;
685
+ margin-bottom: 16px;
686
+ }
687
+ .steps > *::before {
688
+ counter-increment: step;
689
+ content: counter(step);
690
+ position: absolute;
691
+ left: 0;
692
+ top: 0;
693
+ width: 28px;
694
+ height: 28px;
695
+ border-radius: 50%;
696
+ background: var(--accent);
697
+ color: white;
698
+ display: flex;
699
+ align-items: center;
700
+ justify-content: center;
701
+ font-size: 14px;
702
+ font-weight: 600;
703
+ }
704
+
705
+ /* Cards */
706
+ .card-group {
707
+ display: grid;
708
+ gap: 16px;
709
+ margin-bottom: 16px;
710
+ }
711
+ .card {
712
+ border: 1px solid var(--border);
713
+ border-radius: 6px;
714
+ padding: 16px;
715
+ background: var(--bg-secondary);
716
+ text-decoration: none;
717
+ color: var(--text);
718
+ display: block;
719
+ }
720
+ .card:hover {
721
+ border-color: var(--accent);
722
+ }
723
+ .card-title {
724
+ font-weight: 600;
725
+ margin-bottom: 8px;
726
+ display: flex;
727
+ align-items: center;
728
+ gap: 8px;
729
+ }
730
+ .card-description {
731
+ font-size: 14px;
732
+ color: var(--text-muted);
733
+ }
734
+
735
+ /* Badge */
736
+ .badge {
737
+ display: inline-block;
738
+ padding: 2px 8px;
739
+ border-radius: 12px;
740
+ font-size: 12px;
741
+ font-weight: 500;
742
+ }
743
+ .badge-blue { background: #0969da; color: white; }
744
+ .badge-green { background: #1a7f37; color: white; }
745
+ .badge-orange { background: #9a6700; color: white; }
746
+ .badge-red { background: #cf222e; color: white; }
747
+ .badge-purple { background: #8250df; color: white; }
748
+ .badge-gray { background: #6e7781; color: white; }
749
+
750
+ [data-theme="dark"] .badge-blue { background: #58a6ff; }
751
+ [data-theme="dark"] .badge-green { background: #3fb950; }
752
+ [data-theme="dark"] .badge-orange { background: #d29922; }
753
+ [data-theme="dark"] .badge-red { background: #f85149; }
754
+ [data-theme="dark"] .badge-purple { background: #a371f7; }
755
+ [data-theme="dark"] .badge-gray { background: #8c959f; }
756
+
757
+ /* Accordion */
758
+ .accordion {
759
+ border: 1px solid var(--border);
760
+ border-radius: 6px;
761
+ margin-bottom: 16px;
762
+ }
763
+ .accordion-summary {
764
+ padding: 12px 16px;
765
+ cursor: pointer;
766
+ font-weight: 600;
767
+ background: var(--bg-secondary);
768
+ border-radius: 6px;
769
+ }
770
+ .accordion-content {
771
+ padding: 12px 16px;
772
+ border-top: 1px solid var(--border);
773
+ }
774
+ .accordion-icon {
775
+ display: inline-block;
776
+ transition: transform 0.2s;
777
+ }
778
+ .accordion-icon.open {
779
+ transform: rotate(180deg);
780
+ }
781
+
782
+ /* Tabs */
783
+ .tabs-container {
784
+ border: 1px solid var(--border);
785
+ border-radius: 6px;
786
+ margin-bottom: 16px;
787
+ overflow: hidden;
788
+ }
789
+ .tabs {
790
+ display: flex;
791
+ border-bottom: 1px solid var(--border);
792
+ background: var(--bg-secondary);
793
+ }
794
+ .tab {
795
+ padding: 8px 16px;
796
+ cursor: pointer;
797
+ border: none;
798
+ background: transparent;
799
+ font-size: 14px;
800
+ border-bottom: 2px solid transparent;
801
+ margin-bottom: -1px;
802
+ color: var(--text-muted);
803
+ }
804
+ .tab.active {
805
+ border-bottom-color: var(--accent);
806
+ color: var(--accent);
807
+ font-weight: 600;
808
+ background: var(--bg);
809
+ }
810
+ .tab-content {
811
+ padding: 16px;
812
+ }
813
+
814
+ /* Responsive */
815
+ @media (max-width: 1024px) {
816
+ .toc-sidebar {
817
+ display: none;
818
+ }
819
+ .content {
820
+ max-width: none;
821
+ margin-right: 0;
822
+ }
823
+ }
824
+
825
+ @media (max-width: 768px) {
826
+ .sidebar {
827
+ transform: translateX(-100%);
828
+ transition: transform 0.2s;
829
+ z-index: 90;
830
+ box-shadow: 2px 0 8px rgba(0,0,0,0.1);
831
+ }
832
+ .sidebar.open {
833
+ transform: translateX(0);
834
+ }
835
+ .content {
836
+ margin-left: 0;
837
+ padding: 24px;
838
+ }
839
+ .site-container {
840
+ flex-direction: column;
841
+ }
842
+ }
843
+
844
+ /* Theme icons */
845
+ :root[data-theme="light"] .theme-icon-dark,
846
+ :root[data-theme="dark"] .theme-icon-light {
847
+ display: none;
848
+ }
849
+ `;
850
+ }
851
+ //# sourceMappingURL=index.js.map