@pruddiman/mdmirror 0.1.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.
- package/README.md +1 -0
- package/dist/build/builder.d.ts +41 -0
- package/dist/build/builder.js +108 -0
- package/dist/build/builder.js.map +1 -0
- package/dist/cli/build.d.ts +14 -0
- package/dist/cli/build.js +116 -0
- package/dist/cli/build.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.js +104 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/serve.d.ts +15 -0
- package/dist/cli/serve.js +233 -0
- package/dist/cli/serve.js.map +1 -0
- package/dist/core/discovery.d.ts +12 -0
- package/dist/core/discovery.js +91 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/navigation.d.ts +12 -0
- package/dist/core/navigation.js +155 -0
- package/dist/core/navigation.js.map +1 -0
- package/dist/core/slug.d.ts +47 -0
- package/dist/core/slug.js +132 -0
- package/dist/core/slug.js.map +1 -0
- package/dist/core/title.d.ts +22 -0
- package/dist/core/title.js +43 -0
- package/dist/core/title.js.map +1 -0
- package/dist/render/highlight.d.ts +23 -0
- package/dist/render/highlight.js +36 -0
- package/dist/render/highlight.js.map +1 -0
- package/dist/render/mermaid.d.ts +13 -0
- package/dist/render/mermaid.js +66 -0
- package/dist/render/mermaid.js.map +1 -0
- package/dist/render/pipeline.d.ts +32 -0
- package/dist/render/pipeline.js +141 -0
- package/dist/render/pipeline.js.map +1 -0
- package/dist/search/index.d.ts +19 -0
- package/dist/search/index.js +43 -0
- package/dist/search/index.js.map +1 -0
- package/dist/server/reload.d.ts +23 -0
- package/dist/server/reload.js +80 -0
- package/dist/server/reload.js.map +1 -0
- package/dist/server/server.d.ts +22 -0
- package/dist/server/server.js +137 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/watcher.d.ts +24 -0
- package/dist/server/watcher.js +62 -0
- package/dist/server/watcher.js.map +1 -0
- package/dist/theme/index.d.ts +8 -0
- package/dist/theme/index.js +19 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/layout.d.ts +37 -0
- package/dist/theme/layout.js +141 -0
- package/dist/theme/layout.js.map +1 -0
- package/dist/theme/scripts.d.ts +29 -0
- package/dist/theme/scripts.js +159 -0
- package/dist/theme/scripts.js.map +1 -0
- package/dist/theme/styles.css +462 -0
- package/dist/types.d.ts +99 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
/* mdmirror default theme */
|
|
2
|
+
|
|
3
|
+
*,
|
|
4
|
+
*::before,
|
|
5
|
+
*::after {
|
|
6
|
+
box-sizing: border-box;
|
|
7
|
+
margin: 0;
|
|
8
|
+
padding: 0;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
:root {
|
|
12
|
+
--sidebar-width: 280px;
|
|
13
|
+
--content-max-width: 48rem;
|
|
14
|
+
--font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
|
|
15
|
+
--font-mono: "SF Mono", "Fira Code", "Fira Mono", Menlo, Consolas, monospace;
|
|
16
|
+
--color-bg: #ffffff;
|
|
17
|
+
--color-text: #1a1a2e;
|
|
18
|
+
--color-text-muted: #6b7280;
|
|
19
|
+
--color-border: #e5e7eb;
|
|
20
|
+
--color-sidebar-bg: #f9fafb;
|
|
21
|
+
--color-sidebar-hover: #f3f4f6;
|
|
22
|
+
--color-active: #2563eb;
|
|
23
|
+
--color-active-bg: #eff6ff;
|
|
24
|
+
--color-link: #2563eb;
|
|
25
|
+
--color-code-bg: #f3f4f6;
|
|
26
|
+
--color-blockquote-border: #d1d5db;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@media (prefers-color-scheme: dark) {
|
|
30
|
+
:root {
|
|
31
|
+
--color-bg: #0d1117;
|
|
32
|
+
--color-text: #e6edf3;
|
|
33
|
+
--color-text-muted: #8b949e;
|
|
34
|
+
--color-border: #30363d;
|
|
35
|
+
--color-sidebar-bg: #161b22;
|
|
36
|
+
--color-sidebar-hover: #21262d;
|
|
37
|
+
--color-active: #58a6ff;
|
|
38
|
+
--color-active-bg: #1f3a5f;
|
|
39
|
+
--color-link: #58a6ff;
|
|
40
|
+
--color-code-bg: #161b22;
|
|
41
|
+
--color-blockquote-border: #30363d;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
html {
|
|
46
|
+
font-size: 16px;
|
|
47
|
+
line-height: 1.6;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
body {
|
|
51
|
+
font-family: var(--font-sans);
|
|
52
|
+
color: var(--color-text);
|
|
53
|
+
background: var(--color-bg);
|
|
54
|
+
display: flex;
|
|
55
|
+
min-height: 100vh;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/* Sidebar */
|
|
59
|
+
.sidebar {
|
|
60
|
+
position: fixed;
|
|
61
|
+
top: 0;
|
|
62
|
+
left: 0;
|
|
63
|
+
width: var(--sidebar-width);
|
|
64
|
+
height: 100vh;
|
|
65
|
+
overflow-y: auto;
|
|
66
|
+
background: var(--color-sidebar-bg);
|
|
67
|
+
border-right: 1px solid var(--color-border);
|
|
68
|
+
padding: 1.5rem 0;
|
|
69
|
+
z-index: 100;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.sidebar-header {
|
|
73
|
+
padding: 0 1.25rem 1rem;
|
|
74
|
+
border-bottom: 1px solid var(--color-border);
|
|
75
|
+
margin-bottom: 1rem;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.site-title {
|
|
79
|
+
font-size: 1.1rem;
|
|
80
|
+
font-weight: 700;
|
|
81
|
+
color: var(--color-text);
|
|
82
|
+
text-decoration: none;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.site-title:hover {
|
|
86
|
+
color: var(--color-active);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.menu-toggle {
|
|
90
|
+
display: none;
|
|
91
|
+
background: none;
|
|
92
|
+
border: none;
|
|
93
|
+
cursor: pointer;
|
|
94
|
+
padding: 0.5rem;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.menu-toggle span {
|
|
98
|
+
display: block;
|
|
99
|
+
width: 20px;
|
|
100
|
+
height: 2px;
|
|
101
|
+
background: var(--color-text);
|
|
102
|
+
margin: 4px 0;
|
|
103
|
+
transition: 0.3s;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/* Search */
|
|
107
|
+
.search-container {
|
|
108
|
+
padding: 0 0.75rem 0.75rem;
|
|
109
|
+
position: relative;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.search-input {
|
|
113
|
+
width: 100%;
|
|
114
|
+
padding: 0.4rem 0.75rem;
|
|
115
|
+
border: 1px solid var(--color-border);
|
|
116
|
+
border-radius: 0.375rem;
|
|
117
|
+
background: var(--color-bg);
|
|
118
|
+
color: var(--color-text);
|
|
119
|
+
font-size: 0.875rem;
|
|
120
|
+
font-family: var(--font-sans);
|
|
121
|
+
outline: none;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.search-input:focus {
|
|
125
|
+
border-color: var(--color-active);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.search-results {
|
|
129
|
+
display: none;
|
|
130
|
+
position: absolute;
|
|
131
|
+
top: 100%;
|
|
132
|
+
left: 0.75rem;
|
|
133
|
+
right: 0.75rem;
|
|
134
|
+
background: var(--color-bg);
|
|
135
|
+
border: 1px solid var(--color-border);
|
|
136
|
+
border-radius: 0.375rem;
|
|
137
|
+
list-style: none;
|
|
138
|
+
padding: 0.25rem 0;
|
|
139
|
+
z-index: 200;
|
|
140
|
+
max-height: 300px;
|
|
141
|
+
overflow-y: auto;
|
|
142
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.search-results li a {
|
|
146
|
+
display: block;
|
|
147
|
+
padding: 0.4rem 0.75rem;
|
|
148
|
+
font-size: 0.875rem;
|
|
149
|
+
color: var(--color-text);
|
|
150
|
+
text-decoration: none;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.search-results li a:hover {
|
|
154
|
+
background: var(--color-sidebar-hover);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.search-no-results {
|
|
158
|
+
padding: 0.4rem 0.75rem;
|
|
159
|
+
font-size: 0.875rem;
|
|
160
|
+
color: var(--color-text-muted);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/* Navigation */
|
|
164
|
+
.sidebar nav ul {
|
|
165
|
+
list-style: none;
|
|
166
|
+
padding: 0;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.sidebar nav > ul {
|
|
170
|
+
padding: 0 0.75rem;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.sidebar nav li {
|
|
174
|
+
margin: 0;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.sidebar nav li a,
|
|
178
|
+
.sidebar nav li summary span,
|
|
179
|
+
.sidebar nav li summary a {
|
|
180
|
+
display: block;
|
|
181
|
+
padding: 0.35rem 0.75rem;
|
|
182
|
+
color: var(--color-text-muted);
|
|
183
|
+
text-decoration: none;
|
|
184
|
+
font-size: 0.9rem;
|
|
185
|
+
border-radius: 0.375rem;
|
|
186
|
+
transition: color 0.15s, background 0.15s;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.sidebar nav li a:hover,
|
|
190
|
+
.sidebar nav li summary span:hover,
|
|
191
|
+
.sidebar nav li summary a:hover {
|
|
192
|
+
color: var(--color-text);
|
|
193
|
+
background: var(--color-sidebar-hover);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.sidebar nav li.active > a,
|
|
197
|
+
.sidebar nav li.active > details > summary a {
|
|
198
|
+
color: var(--color-active);
|
|
199
|
+
background: var(--color-active-bg);
|
|
200
|
+
font-weight: 600;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/* Section expand/collapse */
|
|
204
|
+
.sidebar nav details {
|
|
205
|
+
margin: 0;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.sidebar nav details summary {
|
|
209
|
+
cursor: pointer;
|
|
210
|
+
list-style: none;
|
|
211
|
+
display: flex;
|
|
212
|
+
align-items: center;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
.sidebar nav details summary::-webkit-details-marker {
|
|
216
|
+
display: none;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/* Chevron indicator for expandable sections */
|
|
220
|
+
.sidebar nav details summary::before {
|
|
221
|
+
content: "";
|
|
222
|
+
display: inline-block;
|
|
223
|
+
width: 0.35rem;
|
|
224
|
+
height: 0.35rem;
|
|
225
|
+
border-right: 1.5px solid var(--color-text-muted);
|
|
226
|
+
border-bottom: 1.5px solid var(--color-text-muted);
|
|
227
|
+
transform: rotate(-45deg);
|
|
228
|
+
transition: transform 0.15s ease;
|
|
229
|
+
margin-right: 0.35rem;
|
|
230
|
+
flex-shrink: 0;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
.sidebar nav details[open] > summary::before {
|
|
234
|
+
transform: rotate(45deg);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
.sidebar nav details > ul {
|
|
238
|
+
padding-left: 0.75rem;
|
|
239
|
+
border-left: 1px solid var(--color-border);
|
|
240
|
+
margin-left: 1rem;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/* Main content */
|
|
244
|
+
.content {
|
|
245
|
+
margin-left: var(--sidebar-width);
|
|
246
|
+
flex: 1;
|
|
247
|
+
padding: 2rem 3rem;
|
|
248
|
+
max-width: calc(var(--content-max-width) + 6rem);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.content article {
|
|
252
|
+
max-width: var(--content-max-width);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/* Typography */
|
|
256
|
+
.content h1 {
|
|
257
|
+
font-size: 2rem;
|
|
258
|
+
font-weight: 800;
|
|
259
|
+
margin-bottom: 1rem;
|
|
260
|
+
line-height: 1.2;
|
|
261
|
+
border-bottom: 1px solid var(--color-border);
|
|
262
|
+
padding-bottom: 0.5rem;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
.content h2 {
|
|
266
|
+
font-size: 1.5rem;
|
|
267
|
+
font-weight: 700;
|
|
268
|
+
margin-top: 2rem;
|
|
269
|
+
margin-bottom: 0.75rem;
|
|
270
|
+
line-height: 1.3;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
.content h3 {
|
|
274
|
+
font-size: 1.25rem;
|
|
275
|
+
font-weight: 600;
|
|
276
|
+
margin-top: 1.5rem;
|
|
277
|
+
margin-bottom: 0.5rem;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
.content h4, .content h5, .content h6 {
|
|
281
|
+
font-size: 1.1rem;
|
|
282
|
+
font-weight: 600;
|
|
283
|
+
margin-top: 1.25rem;
|
|
284
|
+
margin-bottom: 0.5rem;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
.content p {
|
|
288
|
+
margin-bottom: 1rem;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
.content a {
|
|
292
|
+
color: var(--color-link);
|
|
293
|
+
text-decoration: none;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
.content a:hover {
|
|
297
|
+
text-decoration: underline;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/* Lists */
|
|
301
|
+
.content ul, .content ol {
|
|
302
|
+
margin-bottom: 1rem;
|
|
303
|
+
padding-left: 1.5rem;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
.content li {
|
|
307
|
+
margin-bottom: 0.25rem;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
.content li > ul,
|
|
311
|
+
.content li > ol {
|
|
312
|
+
margin-bottom: 0;
|
|
313
|
+
margin-top: 0.25rem;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/* Code */
|
|
317
|
+
.content code {
|
|
318
|
+
font-family: var(--font-mono);
|
|
319
|
+
font-size: 0.875em;
|
|
320
|
+
background: var(--color-code-bg);
|
|
321
|
+
padding: 0.15em 0.35em;
|
|
322
|
+
border-radius: 0.25rem;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
.content pre {
|
|
326
|
+
background: var(--color-code-bg);
|
|
327
|
+
padding: 1rem 1.25rem;
|
|
328
|
+
border-radius: 0.5rem;
|
|
329
|
+
overflow-x: auto;
|
|
330
|
+
margin-bottom: 1rem;
|
|
331
|
+
line-height: 1.5;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
.content pre code {
|
|
335
|
+
background: none;
|
|
336
|
+
padding: 0;
|
|
337
|
+
font-size: 0.85rem;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/* Tables */
|
|
341
|
+
.content table {
|
|
342
|
+
width: 100%;
|
|
343
|
+
border-collapse: collapse;
|
|
344
|
+
margin-bottom: 1rem;
|
|
345
|
+
font-size: 0.9rem;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
.content th,
|
|
349
|
+
.content td {
|
|
350
|
+
padding: 0.5rem 0.75rem;
|
|
351
|
+
border: 1px solid var(--color-border);
|
|
352
|
+
text-align: left;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
.content th {
|
|
356
|
+
background: var(--color-code-bg);
|
|
357
|
+
font-weight: 600;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
.content tr:nth-child(even) {
|
|
361
|
+
background: var(--color-sidebar-bg);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/* Blockquotes */
|
|
365
|
+
.content blockquote {
|
|
366
|
+
border-left: 3px solid var(--color-blockquote-border);
|
|
367
|
+
padding: 0.5rem 1rem;
|
|
368
|
+
margin-bottom: 1rem;
|
|
369
|
+
color: var(--color-text-muted);
|
|
370
|
+
font-style: italic;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
.content blockquote p:last-child {
|
|
374
|
+
margin-bottom: 0;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/* Images */
|
|
378
|
+
.content img {
|
|
379
|
+
max-width: 100%;
|
|
380
|
+
height: auto;
|
|
381
|
+
border-radius: 0.5rem;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/* Horizontal rules */
|
|
385
|
+
.content hr {
|
|
386
|
+
border: none;
|
|
387
|
+
border-top: 1px solid var(--color-border);
|
|
388
|
+
margin: 2rem 0;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/* Mermaid diagrams */
|
|
392
|
+
.content .mermaid {
|
|
393
|
+
visibility: hidden;
|
|
394
|
+
background: transparent;
|
|
395
|
+
text-align: center;
|
|
396
|
+
padding: 1rem 0;
|
|
397
|
+
margin-bottom: 1rem;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
.content .mermaid svg {
|
|
401
|
+
max-width: 100%;
|
|
402
|
+
height: auto;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/* Shiki syntax highlighting overrides */
|
|
406
|
+
.content pre:has(code) {
|
|
407
|
+
background: var(--color-code-bg);
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
.content pre .shiki {
|
|
411
|
+
background: transparent !important;
|
|
412
|
+
padding: 0;
|
|
413
|
+
margin: 0;
|
|
414
|
+
overflow-x: auto;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
.content pre .shiki code {
|
|
418
|
+
background: transparent;
|
|
419
|
+
font-family: var(--font-mono);
|
|
420
|
+
font-size: 0.85rem;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/* Shiki dual-theme: show light tokens by default, dark tokens in dark mode */
|
|
424
|
+
.shiki span[style*="--shiki-dark"] {
|
|
425
|
+
color: var(--shiki-light);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
@media (prefers-color-scheme: dark) {
|
|
429
|
+
.shiki span[style*="--shiki-dark"] {
|
|
430
|
+
color: var(--shiki-dark) !important;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/* Responsive */
|
|
435
|
+
@media (max-width: 768px) {
|
|
436
|
+
.sidebar {
|
|
437
|
+
transform: translateX(-100%);
|
|
438
|
+
transition: transform 0.3s ease;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
.sidebar.open {
|
|
442
|
+
transform: translateX(0);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
.menu-toggle {
|
|
446
|
+
display: block;
|
|
447
|
+
position: fixed;
|
|
448
|
+
top: 1rem;
|
|
449
|
+
left: 1rem;
|
|
450
|
+
z-index: 200;
|
|
451
|
+
background: var(--color-bg);
|
|
452
|
+
border: 1px solid var(--color-border);
|
|
453
|
+
border-radius: 0.375rem;
|
|
454
|
+
padding: 0.5rem;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
.content {
|
|
458
|
+
margin-left: 0;
|
|
459
|
+
padding: 2rem 1.5rem;
|
|
460
|
+
padding-top: 4rem;
|
|
461
|
+
}
|
|
462
|
+
}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared TypeScript type definitions for mdmirror.
|
|
3
|
+
* Based on data-model.md entity definitions.
|
|
4
|
+
*/
|
|
5
|
+
export interface SourceFolder {
|
|
6
|
+
/** Resolved absolute path to the root documentation directory */
|
|
7
|
+
path: string;
|
|
8
|
+
/** Whether the path exists and is a directory */
|
|
9
|
+
exists: boolean;
|
|
10
|
+
}
|
|
11
|
+
export type FileType = "md" | "txt";
|
|
12
|
+
export interface Document {
|
|
13
|
+
/** Path relative to the source folder root (e.g., "guides/getting-started.md") */
|
|
14
|
+
sourcePath: string;
|
|
15
|
+
/** Resolved absolute path on disk for reading content */
|
|
16
|
+
absolutePath: string;
|
|
17
|
+
/** Clean URL slug derived from the relative path */
|
|
18
|
+
slug: string;
|
|
19
|
+
/** Page title, derived from front matter, first heading, or filename */
|
|
20
|
+
title: string;
|
|
21
|
+
/** Short description from front matter (used in meta tags) */
|
|
22
|
+
description: string;
|
|
23
|
+
/** Raw source content of the file */
|
|
24
|
+
content: string;
|
|
25
|
+
/** HTML output after markdown processing */
|
|
26
|
+
renderedHtml: string;
|
|
27
|
+
/** Determines rendering strategy */
|
|
28
|
+
fileType: FileType;
|
|
29
|
+
/** True if filename is index.md or README.md */
|
|
30
|
+
isIndex: boolean;
|
|
31
|
+
/** Derived from filename for navigation ordering */
|
|
32
|
+
sortKey: string;
|
|
33
|
+
}
|
|
34
|
+
export type NavigationNodeType = "section" | "page";
|
|
35
|
+
export interface NavigationNode {
|
|
36
|
+
/** Display text in navigation */
|
|
37
|
+
label: string;
|
|
38
|
+
/** URL slug for this node */
|
|
39
|
+
slug: string;
|
|
40
|
+
/** Determines rendering in the sidebar */
|
|
41
|
+
type: NavigationNodeType;
|
|
42
|
+
/** Child nodes (only for sections) */
|
|
43
|
+
children: NavigationNode[];
|
|
44
|
+
/** Ordering key */
|
|
45
|
+
sortKey: string;
|
|
46
|
+
/** Whether this node corresponds to the currently viewed page */
|
|
47
|
+
isActive: boolean;
|
|
48
|
+
/** For sections: the index.md/README.md landing page if one exists */
|
|
49
|
+
indexDocument: Document | null;
|
|
50
|
+
/** Nesting level (0 = root level) */
|
|
51
|
+
depth: number;
|
|
52
|
+
}
|
|
53
|
+
export interface NavigationTree {
|
|
54
|
+
/** Top-level navigation nodes */
|
|
55
|
+
root: NavigationNode[];
|
|
56
|
+
/** Flat list of all documents for iteration/lookup */
|
|
57
|
+
flatPages: Document[];
|
|
58
|
+
/** Count of all pages in the tree */
|
|
59
|
+
totalPages: number;
|
|
60
|
+
}
|
|
61
|
+
export type SiteMode = "serve" | "build";
|
|
62
|
+
export interface Site {
|
|
63
|
+
/** The input directory */
|
|
64
|
+
sourceFolder: SourceFolder;
|
|
65
|
+
/** The generated navigation hierarchy */
|
|
66
|
+
navigationTree: NavigationTree;
|
|
67
|
+
/** All processed documents */
|
|
68
|
+
documents: Document[];
|
|
69
|
+
/** The active visual theme configuration */
|
|
70
|
+
theme: Theme;
|
|
71
|
+
/** Whether running as dev server or generating static output */
|
|
72
|
+
mode: SiteMode;
|
|
73
|
+
}
|
|
74
|
+
export interface Theme {
|
|
75
|
+
/** HTML template function */
|
|
76
|
+
layoutTemplate: string;
|
|
77
|
+
/** CSS content for the default theme */
|
|
78
|
+
stylesheet: string;
|
|
79
|
+
/** Client-side JS files to include */
|
|
80
|
+
clientScripts: string[];
|
|
81
|
+
}
|
|
82
|
+
export interface ServerConfig {
|
|
83
|
+
/** HTTP server port. Default: 3000 */
|
|
84
|
+
port: number;
|
|
85
|
+
/** Bind address. Default: localhost */
|
|
86
|
+
host: string;
|
|
87
|
+
/** Absolute path to the source folder being served */
|
|
88
|
+
sourcePath: string;
|
|
89
|
+
/** Whether WebSocket live reload is active */
|
|
90
|
+
liveReload: boolean;
|
|
91
|
+
}
|
|
92
|
+
export interface BuildConfig {
|
|
93
|
+
/** Directory to write static output. Default: ./dist */
|
|
94
|
+
outputDir: string;
|
|
95
|
+
/** Absolute path to the source folder being built */
|
|
96
|
+
sourcePath: string;
|
|
97
|
+
/** Base URL for links. Default: ./ */
|
|
98
|
+
baseUrl: string;
|
|
99
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
package/package.json
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@pruddiman/mdmirror",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Zero-config CLI tool that turns any folder of markdown files into a browsable documentation site",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"mdmirror": "dist/cli/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"engines": {
|
|
14
|
+
"node": ">=18.0.0"
|
|
15
|
+
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc && cp src/theme/styles.css dist/theme/styles.css",
|
|
18
|
+
"prepare": "npm run build",
|
|
19
|
+
"test": "vitest run",
|
|
20
|
+
"test:watch": "vitest",
|
|
21
|
+
"dev": "tsx src/cli/index.ts",
|
|
22
|
+
"lint": "eslint src tests",
|
|
23
|
+
"lint:fix": "eslint src tests --fix",
|
|
24
|
+
"format": "prettier --write src tests",
|
|
25
|
+
"format:check": "prettier --check src tests"
|
|
26
|
+
},
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "git+https://github.com/PatrickRuddiman/mdmirror.git"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"markdown",
|
|
33
|
+
"documentation",
|
|
34
|
+
"static-site",
|
|
35
|
+
"cli"
|
|
36
|
+
],
|
|
37
|
+
"publishConfig": {
|
|
38
|
+
"access": "public"
|
|
39
|
+
},
|
|
40
|
+
"author": "",
|
|
41
|
+
"license": "ISC",
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/PatrickRuddiman/mdmirror/issues"
|
|
44
|
+
},
|
|
45
|
+
"homepage": "https://github.com/PatrickRuddiman/mdmirror#readme",
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@shikijs/rehype": "^3.22.0",
|
|
48
|
+
"chokidar": "^5.0.0",
|
|
49
|
+
"citty": "^0.2.1",
|
|
50
|
+
"mermaid": "^11.12.3",
|
|
51
|
+
"minisearch": "^7.2.0",
|
|
52
|
+
"rehype-raw": "^7.0.0",
|
|
53
|
+
"rehype-stringify": "^10.0.1",
|
|
54
|
+
"remark-extract-frontmatter": "^3.2.0",
|
|
55
|
+
"remark-frontmatter": "^5.0.0",
|
|
56
|
+
"remark-gfm": "^4.0.1",
|
|
57
|
+
"remark-parse": "^11.0.0",
|
|
58
|
+
"remark-rehype": "^11.1.2",
|
|
59
|
+
"unified": "^11.0.5",
|
|
60
|
+
"unist-util-visit": "^5.1.0",
|
|
61
|
+
"ws": "^8.19.0",
|
|
62
|
+
"yaml": "^2.8.3"
|
|
63
|
+
},
|
|
64
|
+
"devDependencies": {
|
|
65
|
+
"@eslint/js": "^10.0.1",
|
|
66
|
+
"@types/node": "^25.3.0",
|
|
67
|
+
"@types/ws": "^8.18.1",
|
|
68
|
+
"eslint": "^10.1.0",
|
|
69
|
+
"eslint-config-prettier": "^10.1.8",
|
|
70
|
+
"prettier": "^3.8.1",
|
|
71
|
+
"tsx": "^4.21.0",
|
|
72
|
+
"typescript": "^5.9.3",
|
|
73
|
+
"typescript-eslint": "^8.57.1",
|
|
74
|
+
"vitest": "^4.0.18"
|
|
75
|
+
}
|
|
76
|
+
}
|