@ox-content/vite-plugin 1.0.0-alpha.0 → 1.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/dist/chunk.cjs +39 -49
- package/dist/github.cjs +323 -3
- package/dist/github.cjs.map +1 -0
- package/dist/github.mjs +2 -0
- package/dist/{github2.js → github2.mjs} +2 -3
- package/dist/github2.mjs.map +1 -0
- package/dist/index.cjs +467 -292
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +79 -66
- package/dist/index.d.cts.map +1 -1
- package/dist/{index.d.ts → index.d.mts} +80 -67
- package/dist/index.d.mts.map +1 -0
- package/dist/{index.js → index.mjs} +479 -317
- package/dist/index.mjs.map +1 -0
- package/dist/mermaid.cjs +115 -3
- package/dist/mermaid.cjs.map +1 -0
- package/dist/{mermaid2.js → mermaid.mjs} +14 -6
- package/dist/mermaid.mjs.map +1 -0
- package/dist/mermaid2.mjs +2 -0
- package/dist/ogp.cjs +316 -3
- package/dist/ogp.cjs.map +1 -0
- package/dist/ogp.mjs +2 -0
- package/dist/{ogp2.js → ogp2.mjs} +2 -3
- package/dist/ogp2.mjs.map +1 -0
- package/dist/tabs.cjs +212 -3
- package/dist/tabs.cjs.map +1 -0
- package/dist/tabs.mjs +2 -0
- package/dist/{tabs2.js → tabs2.mjs} +2 -3
- package/dist/tabs2.mjs.map +1 -0
- package/dist/youtube.cjs +135 -3
- package/dist/youtube.cjs.map +1 -0
- package/dist/youtube.mjs +2 -0
- package/dist/{youtube2.js → youtube2.mjs} +2 -3
- package/dist/youtube2.mjs.map +1 -0
- package/package.json +61 -56
- package/dist/github.js +0 -3
- package/dist/github2.cjs +0 -313
- package/dist/github2.cjs.map +0 -1
- package/dist/github2.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/mermaid.js +0 -3
- package/dist/mermaid2.cjs +0 -92
- package/dist/mermaid2.cjs.map +0 -1
- package/dist/mermaid2.js.map +0 -1
- package/dist/ogp.js +0 -3
- package/dist/ogp2.cjs +0 -306
- package/dist/ogp2.cjs.map +0 -1
- package/dist/ogp2.js.map +0 -1
- package/dist/tabs.js +0 -3
- package/dist/tabs2.cjs +0 -203
- package/dist/tabs2.cjs.map +0 -1
- package/dist/tabs2.js.map +0 -1
- package/dist/youtube.js +0 -3
- package/dist/youtube2.cjs +0 -127
- package/dist/youtube2.cjs.map +0 -1
- package/dist/youtube2.js.map +0 -1
|
@@ -2,7 +2,6 @@ import { LanguageRegistration, LanguageRegistration as LanguageRegistration$1 }
|
|
|
2
2
|
import { EnvironmentOptions, Plugin } from "vite";
|
|
3
3
|
|
|
4
4
|
//#region src/theme.d.ts
|
|
5
|
-
|
|
6
5
|
/**
|
|
7
6
|
* Theme API for ox-content SSG
|
|
8
7
|
*
|
|
@@ -186,9 +185,6 @@ declare function mergeThemes(...themes: ThemeConfig[]): ThemeConfig;
|
|
|
186
185
|
* Resolves a theme configuration by merging with its extends chain and defaults.
|
|
187
186
|
*/
|
|
188
187
|
declare function resolveTheme(config?: ThemeConfig): ResolvedThemeConfig;
|
|
189
|
-
/**
|
|
190
|
-
* Converts resolved theme to the format expected by Rust NAPI.
|
|
191
|
-
*/
|
|
192
188
|
//#endregion
|
|
193
189
|
//#region src/types.d.ts
|
|
194
190
|
/**
|
|
@@ -388,6 +384,18 @@ interface OxContentOptions {
|
|
|
388
384
|
* These are loaded alongside the built-in languages.
|
|
389
385
|
*/
|
|
390
386
|
highlightLangs?: LanguageRegistration$1[];
|
|
387
|
+
/**
|
|
388
|
+
* Opt-in code block annotations for fenced code blocks.
|
|
389
|
+
*
|
|
390
|
+
* Supports the configurable attribute syntax by default, and can also opt
|
|
391
|
+
* into VitePress-compatible fence metadata and inline notation.
|
|
392
|
+
*
|
|
393
|
+
* Example:
|
|
394
|
+
* ` ```ts annotate="highlight:1,3-4;warning:6;error:7" `
|
|
395
|
+
*
|
|
396
|
+
* @default false
|
|
397
|
+
*/
|
|
398
|
+
codeAnnotations?: boolean | CodeAnnotationsOptions;
|
|
391
399
|
/**
|
|
392
400
|
* Enable mermaid diagram rendering.
|
|
393
401
|
* @default false
|
|
@@ -462,6 +470,7 @@ interface ResolvedOptions {
|
|
|
462
470
|
highlight: boolean;
|
|
463
471
|
highlightTheme: string;
|
|
464
472
|
highlightLangs: LanguageRegistration$1[];
|
|
473
|
+
codeAnnotations: ResolvedCodeAnnotationsOptions;
|
|
465
474
|
mermaid: boolean;
|
|
466
475
|
frontmatter: boolean;
|
|
467
476
|
toc: boolean;
|
|
@@ -474,6 +483,55 @@ interface ResolvedOptions {
|
|
|
474
483
|
ogViewer: boolean;
|
|
475
484
|
i18n: ResolvedI18nOptions | false;
|
|
476
485
|
}
|
|
486
|
+
/**
|
|
487
|
+
* Supported line annotation kinds for code blocks.
|
|
488
|
+
*/
|
|
489
|
+
type CodeAnnotationKind = "highlight" | "warning" | "error";
|
|
490
|
+
/**
|
|
491
|
+
* Supported code annotation syntaxes.
|
|
492
|
+
*/
|
|
493
|
+
type CodeAnnotationSyntax = "attribute" | "vitepress" | "both";
|
|
494
|
+
/**
|
|
495
|
+
* Opt-in code annotation configuration.
|
|
496
|
+
*/
|
|
497
|
+
interface CodeAnnotationsOptions {
|
|
498
|
+
/**
|
|
499
|
+
* Annotation syntax to enable.
|
|
500
|
+
*
|
|
501
|
+
* - `attribute`: custom attribute syntax like `annotate="highlight:1,3-4"`
|
|
502
|
+
* - `vitepress`: VitePress-compatible syntax like `{1,3-4}` and `[!code warning]`
|
|
503
|
+
* - `both`: enables both syntaxes
|
|
504
|
+
*
|
|
505
|
+
* @default "attribute"
|
|
506
|
+
*/
|
|
507
|
+
notation?: CodeAnnotationSyntax;
|
|
508
|
+
/**
|
|
509
|
+
* Attribute name read from the code fence meta string.
|
|
510
|
+
*
|
|
511
|
+
* Example: `annotate="highlight:1,3-4;warning:6"`
|
|
512
|
+
*
|
|
513
|
+
* @default "annotate"
|
|
514
|
+
*/
|
|
515
|
+
metaKey?: string;
|
|
516
|
+
/**
|
|
517
|
+
* Enable line numbers for all code blocks by default.
|
|
518
|
+
*
|
|
519
|
+
* In `vitepress` or `both` mode, fenced code blocks can override this with
|
|
520
|
+
* `:line-numbers`, `:line-numbers=<start>`, or `:no-line-numbers`.
|
|
521
|
+
*
|
|
522
|
+
* @default false
|
|
523
|
+
*/
|
|
524
|
+
defaultLineNumbers?: boolean;
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* Resolved code annotation configuration.
|
|
528
|
+
*/
|
|
529
|
+
interface ResolvedCodeAnnotationsOptions {
|
|
530
|
+
enabled: boolean;
|
|
531
|
+
notation: CodeAnnotationSyntax;
|
|
532
|
+
metaKey: string;
|
|
533
|
+
defaultLineNumbers: boolean;
|
|
534
|
+
}
|
|
477
535
|
/**
|
|
478
536
|
* OG image generation options.
|
|
479
537
|
* Uses Chromium-based rendering with customizable templates.
|
|
@@ -731,9 +789,13 @@ interface ExtractedDocs {
|
|
|
731
789
|
entries: DocEntry[];
|
|
732
790
|
}
|
|
733
791
|
/**
|
|
734
|
-
*
|
|
792
|
+
* Machine-readable payload emitted alongside generated docs.
|
|
735
793
|
*/
|
|
736
|
-
|
|
794
|
+
interface GeneratedDocsData {
|
|
795
|
+
version: 1;
|
|
796
|
+
generatedAt: string;
|
|
797
|
+
modules: ExtractedDocs[];
|
|
798
|
+
}
|
|
737
799
|
/**
|
|
738
800
|
* Options for full-text search.
|
|
739
801
|
*/
|
|
@@ -795,6 +857,14 @@ interface SearchResult {
|
|
|
795
857
|
score: number;
|
|
796
858
|
matches: string[];
|
|
797
859
|
snippet: string;
|
|
860
|
+
scopes?: string[];
|
|
861
|
+
}
|
|
862
|
+
/**
|
|
863
|
+
* Parsed search query with optional scope prefixes.
|
|
864
|
+
*/
|
|
865
|
+
interface ScopedSearchQuery {
|
|
866
|
+
text: string;
|
|
867
|
+
scopes: string[];
|
|
798
868
|
}
|
|
799
869
|
/**
|
|
800
870
|
* Locale configuration.
|
|
@@ -860,7 +930,6 @@ interface ResolvedI18nOptions {
|
|
|
860
930
|
check: boolean;
|
|
861
931
|
functionNames: string[];
|
|
862
932
|
}
|
|
863
|
-
//# sourceMappingURL=types.d.ts.map
|
|
864
933
|
//#endregion
|
|
865
934
|
//#region src/environment.d.ts
|
|
866
935
|
/**
|
|
@@ -885,13 +954,6 @@ interface ResolvedI18nOptions {
|
|
|
885
954
|
* ```
|
|
886
955
|
*/
|
|
887
956
|
declare function createMarkdownEnvironment(options: ResolvedOptions): EnvironmentOptions;
|
|
888
|
-
/**
|
|
889
|
-
* Environment-specific module transformer.
|
|
890
|
-
*
|
|
891
|
-
* This is called during the transform phase to process
|
|
892
|
-
* Markdown files within the environment context.
|
|
893
|
-
*/
|
|
894
|
-
|
|
895
957
|
//#endregion
|
|
896
958
|
//#region src/transform.d.ts
|
|
897
959
|
/**
|
|
@@ -987,11 +1049,6 @@ interface SsgTransformOptions {
|
|
|
987
1049
|
sourcePath?: string;
|
|
988
1050
|
}
|
|
989
1051
|
declare function transformMarkdown(source: string, filePath: string, options: ResolvedOptions, ssgOptions?: SsgTransformOptions): Promise<TransformResult>;
|
|
990
|
-
/**
|
|
991
|
-
* Extracts imports from Markdown content.
|
|
992
|
-
*
|
|
993
|
-
* Supports importing components for interactive islands.
|
|
994
|
-
*/
|
|
995
1052
|
//#endregion
|
|
996
1053
|
//#region src/docs.d.ts
|
|
997
1054
|
/**
|
|
@@ -1069,25 +1126,16 @@ declare function generateMarkdown(docs: ExtractedDocs[], options: ResolvedDocsOp
|
|
|
1069
1126
|
*/
|
|
1070
1127
|
declare function writeDocs(docs: Record<string, string>, outDir: string, extractedDocs?: ExtractedDocs[], options?: ResolvedDocsOptions): Promise<void>;
|
|
1071
1128
|
declare function resolveDocsOptions(options: DocsOptions | false | undefined): ResolvedDocsOptions | false;
|
|
1072
|
-
//# sourceMappingURL=docs.d.ts.map
|
|
1073
1129
|
//#endregion
|
|
1074
1130
|
//#region src/ssg.d.ts
|
|
1075
1131
|
/**
|
|
1076
1132
|
* Default HTML template for SSG pages with navigation.
|
|
1077
1133
|
*/
|
|
1078
|
-
declare const DEFAULT_HTML_TEMPLATE = "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>{{title}}{{#siteName}} - {{siteName}}{{/siteName}}</title>\n {{#description}}<meta name=\"description\" content=\"{{description}}\">{{/description}}\n <!-- Open Graph -->\n <meta property=\"og:type\" content=\"website\">\n <meta property=\"og:title\" content=\"{{title}}{{#siteName}} - {{siteName}}{{/siteName}}\">\n {{#description}}<meta property=\"og:description\" content=\"{{description}}\">{{/description}}\n {{#ogImage}}<meta property=\"og:image\" content=\"{{ogImage}}\">{{/ogImage}}\n <!-- Twitter Card -->\n {{#ogImage}}<meta name=\"twitter:card\" content=\"summary_large_image\">{{/ogImage}}\n {{^ogImage}}<meta name=\"twitter:card\" content=\"summary\">{{/ogImage}}\n <meta name=\"twitter:title\" content=\"{{title}}{{#siteName}} - {{siteName}}{{/siteName}}\">\n {{#description}}<meta name=\"twitter:description\" content=\"{{description}}\">{{/description}}\n {{#ogImage}}<meta name=\"twitter:image\" content=\"{{ogImage}}\">{{/ogImage}}\n <style>\n :root {\n --sidebar-width: 260px;\n --header-height: 60px;\n --max-content-width: 960px;\n --font-sans: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n --font-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;\n --color-bg: #ffffff;\n --color-bg-alt: #f8f9fa;\n --color-text: #1a1a1a;\n --color-text-muted: #666666;\n --color-border: #e5e7eb;\n --color-primary: #b7410e;\n --color-primary-hover: #ce5937;\n --color-code-bg: #1e293b;\n --color-code-text: #e2e8f0;\n }\n [data-theme=\"dark\"] {\n --color-bg: #141414;\n --color-bg-alt: #141414;\n --color-text: #e5e5e5;\n --color-text-muted: #a3a3a3;\n --color-border: #2a2a2a;\n --color-primary: #c9714a;\n --color-primary-hover: #d4845f;\n --color-code-bg: #1a1a1a;\n --color-code-text: #e5e5e5;\n }\n @media (prefers-color-scheme: dark) {\n :root:not([data-theme=\"light\"]) {\n --color-bg: #141414;\n --color-bg-alt: #141414;\n --color-text: #e5e5e5;\n --color-text-muted: #a3a3a3;\n --color-border: #2a2a2a;\n --color-primary: #c9714a;\n --color-primary-hover: #d4845f;\n --color-code-bg: #1a1a1a;\n --color-code-text: #e5e5e5;\n }\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n html { scroll-behavior: smooth; }\n body {\n font-family: var(--font-sans);\n line-height: 1.7;\n color: var(--color-text);\n background: var(--color-bg);\n }\n a { color: var(--color-primary); text-decoration: none; }\n a:hover { color: var(--color-primary-hover); text-decoration: underline; }\n\n /* Header */\n .header {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n height: var(--header-height);\n background: var(--color-bg);\n border-bottom: 1px solid var(--color-border);\n display: flex;\n align-items: center;\n padding: 0 1.5rem;\n z-index: 100;\n }\n .header-title {\n font-size: 1.25rem;\n font-weight: 600;\n color: var(--color-text);\n }\n .header-title:hover { text-decoration: none; }\n .menu-toggle {\n display: none;\n background: none;\n border: none;\n cursor: pointer;\n padding: 0.5rem;\n margin-right: 0.75rem;\n }\n .menu-toggle svg { display: block; }\n .menu-toggle path { stroke: var(--color-text); }\n .header-actions { margin-left: auto; display: flex; align-items: center; gap: 0.5rem; }\n .search-button {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n background: var(--color-bg-alt);\n border: 1px solid var(--color-border);\n border-radius: 6px;\n color: var(--color-text-muted);\n cursor: pointer;\n font-size: 0.875rem;\n transition: border-color 0.15s, color 0.15s;\n }\n .search-button:hover { border-color: var(--color-primary); color: var(--color-text); }\n .search-button svg { width: 16px; height: 16px; }\n .search-button kbd {\n padding: 0.125rem 0.375rem;\n background: var(--color-bg);\n border: 1px solid var(--color-border);\n border-radius: 4px;\n font-family: var(--font-mono);\n font-size: 0.75rem;\n }\n @media (max-width: 640px) {\n .search-button span, .search-button kbd { display: none; }\n .search-button { padding: 0.5rem; }\n }\n .search-modal-overlay {\n display: none;\n position: fixed;\n inset: 0;\n z-index: 200;\n background: rgba(0,0,0,0.6);\n backdrop-filter: blur(4px);\n justify-content: center;\n padding-top: 10vh;\n }\n .search-modal-overlay.open { display: flex; }\n .search-modal {\n width: 100%;\n max-width: 560px;\n margin: 0 1rem;\n background: var(--color-bg);\n border: 1px solid var(--color-border);\n border-radius: 12px;\n overflow: hidden;\n box-shadow: 0 25px 50px -12px rgba(0,0,0,0.4);\n max-height: 70vh;\n display: flex;\n flex-direction: column;\n }\n .search-header {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 1rem;\n border-bottom: 1px solid var(--color-border);\n }\n .search-header svg { flex-shrink: 0; color: var(--color-text-muted); }\n .search-input {\n flex: 1;\n background: none;\n border: none;\n outline: none;\n font-size: 1rem;\n color: var(--color-text);\n }\n .search-input::placeholder { color: var(--color-text-muted); }\n .search-close {\n padding: 0.25rem 0.5rem;\n background: var(--color-bg-alt);\n border: 1px solid var(--color-border);\n border-radius: 4px;\n color: var(--color-text-muted);\n font-family: var(--font-mono);\n font-size: 0.75rem;\n cursor: pointer;\n }\n .search-results {\n flex: 1;\n overflow-y: auto;\n padding: 0.5rem;\n }\n .search-result {\n display: block;\n padding: 0.75rem 1rem;\n border-radius: 8px;\n color: var(--color-text);\n text-decoration: none;\n }\n .search-result:hover, .search-result.selected { background: var(--color-bg-alt); text-decoration: none; }\n .search-result-title { font-weight: 600; font-size: 0.875rem; margin-bottom: 0.25rem; }\n .search-result-snippet { font-size: 0.8125rem; color: var(--color-text-muted); }\n .search-empty { padding: 2rem 1rem; text-align: center; color: var(--color-text-muted); }\n .search-footer {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 1rem;\n padding: 0.75rem 1rem;\n border-top: 1px solid var(--color-border);\n background: var(--color-bg-alt);\n font-size: 0.75rem;\n color: var(--color-text-muted);\n }\n .search-footer kbd {\n padding: 0.125rem 0.375rem;\n background: var(--color-bg);\n border: 1px solid var(--color-border);\n border-radius: 4px;\n font-family: var(--font-mono);\n }\n .theme-toggle {\n background: none;\n border: none;\n cursor: pointer;\n padding: 0.5rem;\n border-radius: 6px;\n color: var(--color-text-muted);\n transition: background 0.15s, color 0.15s;\n }\n .theme-toggle:hover { background: var(--color-bg-alt); color: var(--color-text); }\n .theme-toggle svg { display: block; width: 20px; height: 20px; }\n .theme-toggle .icon-sun { display: none; }\n .theme-toggle .icon-moon { display: block; }\n [data-theme=\"dark\"] .theme-toggle .icon-sun { display: block; }\n [data-theme=\"dark\"] .theme-toggle .icon-moon { display: none; }\n @media (prefers-color-scheme: dark) {\n :root:not([data-theme=\"light\"]) .theme-toggle .icon-sun { display: block; }\n :root:not([data-theme=\"light\"]) .theme-toggle .icon-moon { display: none; }\n }\n\n /* Layout */\n .layout {\n display: flex;\n padding-top: var(--header-height);\n min-height: 100vh;\n }\n\n /* Sidebar */\n .sidebar {\n position: fixed;\n top: var(--header-height);\n left: 0;\n bottom: 0;\n width: var(--sidebar-width);\n background: var(--color-bg-alt);\n border-right: 1px solid var(--color-border);\n overflow-y: auto;\n padding: 1.5rem 1rem;\n }\n .nav-section { margin-bottom: 1.5rem; }\n .nav-title {\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--color-text-muted);\n margin-bottom: 0.5rem;\n padding: 0 0.75rem;\n }\n .nav-list { list-style: none; }\n .nav-item { margin: 0.125rem 0; }\n .nav-link {\n display: block;\n padding: 0.5rem 0.75rem;\n border-radius: 6px;\n color: var(--color-text);\n font-size: 0.875rem;\n transition: background 0.15s;\n }\n .nav-link:hover {\n background: var(--color-border);\n text-decoration: none;\n }\n .nav-link.active {\n background: var(--color-primary);\n color: white;\n }\n\n /* Main content */\n .main {\n flex: 1;\n margin-left: var(--sidebar-width);\n padding: 2rem;\n min-width: 0;\n overflow-x: hidden;\n }\n .content {\n max-width: var(--max-content-width);\n margin: 0 auto;\n overflow-wrap: break-word;\n word-wrap: break-word;\n word-break: break-word;\n }\n\n /* TOC (right sidebar) */\n .toc {\n position: fixed;\n top: calc(var(--header-height) + 2rem);\n right: 2rem;\n width: 200px;\n font-size: 0.8125rem;\n }\n .toc-title {\n font-weight: 600;\n margin-bottom: 0.75rem;\n color: var(--color-text-muted);\n }\n .toc-list { list-style: none; }\n .toc-item { margin: 0.375rem 0; }\n .toc-link {\n color: var(--color-text-muted);\n display: block;\n padding-left: calc((var(--depth, 1) - 1) * 0.75rem);\n }\n .toc-link:hover { color: var(--color-primary); }\n @media (max-width: 1200px) { .toc { display: none; } }\n\n /* Typography */\n .content h1 { font-size: 2.25rem; margin-bottom: 1rem; line-height: 1.2; }\n .content h2 { font-size: 1.5rem; margin-top: 2.5rem; margin-bottom: 1rem; padding-bottom: 0.5rem; border-bottom: 1px solid var(--color-border); }\n .content h3 { font-size: 1.25rem; margin-top: 2rem; margin-bottom: 0.75rem; }\n .content h4 { font-size: 1rem; margin-top: 1.5rem; margin-bottom: 0.5rem; }\n .content p { margin-bottom: 1rem; }\n .content ul, .content ol { margin: 1rem 0; padding-left: 1.5rem; }\n .content li { margin: 0.375rem 0; }\n .content blockquote {\n border-left: 4px solid var(--color-primary);\n padding: 0.5rem 1rem;\n margin: 1rem 0;\n background: var(--color-bg-alt);\n border-radius: 0 6px 6px 0;\n }\n .content code {\n font-family: var(--font-mono);\n font-size: 0.875em;\n background: var(--color-bg-alt);\n padding: 0.2em 0.4em;\n border-radius: 4px;\n word-break: break-all;\n }\n .content pre {\n background: var(--color-code-bg);\n color: var(--color-code-text);\n padding: 1rem 1.25rem;\n border-radius: 8px;\n overflow-x: auto;\n margin: 1.5rem 0;\n line-height: 1.5;\n }\n .content pre code {\n background: transparent;\n padding: 0;\n font-size: 0.8125rem;\n }\n .content table {\n width: 100%;\n border-collapse: collapse;\n margin: 1.5rem 0;\n font-size: 0.875rem;\n }\n .content th, .content td {\n border: 1px solid var(--color-border);\n padding: 0.75rem 1rem;\n text-align: left;\n }\n .content th { background: var(--color-bg-alt); font-weight: 600; }\n .content img { max-width: 100%; height: auto; border-radius: 8px; display: block; }\n .content img[alt*=\"Logo\"] { max-width: 200px; display: block; margin: 1rem 0; }\n .content img[alt*=\"Architecture\"] { max-width: 600px; }\n .content img[alt*=\"Benchmark\"] { max-width: 680px; }\n .content hr { border: none; border-top: 1px solid var(--color-border); margin: 2rem 0; }\n\n /* Responsive */\n @media (max-width: 768px) {\n .menu-toggle { display: block; }\n .sidebar {\n transform: translateX(-100%);\n transition: transform 0.3s ease;\n z-index: 99;\n width: 280px;\n }\n .sidebar.open { transform: translateX(0); }\n .main { margin-left: 0; padding: 1rem 0.75rem; }\n .content { padding: 0 0.25rem; }\n .content h1 { font-size: 1.5rem; line-height: 1.3; margin-bottom: 0.75rem; }\n .content h2 { font-size: 1.2rem; margin-top: 2rem; }\n .content h3 { font-size: 1.1rem; }\n .content p { font-size: 0.9375rem; margin-bottom: 0.875rem; }\n .content ul, .content ol { padding-left: 1.25rem; font-size: 0.9375rem; }\n .content pre {\n padding: 0.75rem;\n font-size: 0.75rem;\n margin: 1rem -0.75rem;\n border-radius: 0;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .content code { font-size: 0.8125em; }\n .content table {\n display: block;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n font-size: 0.8125rem;\n margin: 1rem -0.75rem;\n width: calc(100% + 1.5rem);\n }\n .content th, .content td { padding: 0.5rem 0.75rem; white-space: nowrap; }\n .content img { margin: 1rem 0; }\n .content img[alt*=\"Logo\"] { max-width: 150px; }\n .content img[alt*=\"Architecture\"] { max-width: 100%; }\n .content img[alt*=\"Benchmark\"] { max-width: 100%; }\n .content blockquote { padding: 0.5rem 0.75rem; margin: 1rem 0; font-size: 0.9375rem; }\n .header { padding: 0 1rem; }\n .header-title { font-size: 1rem; }\n .header-title img { width: 24px; height: 24px; }\n .overlay {\n display: none;\n position: fixed;\n inset: 0;\n background: rgba(0,0,0,0.5);\n z-index: 98;\n }\n .overlay.open { display: block; }\n }\n\n /* Extra small devices */\n @media (max-width: 480px) {\n .main { padding: 0.75rem 0.5rem; }\n .content h1 { font-size: 1.35rem; }\n .content pre { font-size: 0.6875rem; padding: 0.625rem; }\n .content table { font-size: 0.75rem; }\n .content th, .content td { padding: 0.375rem 0.5rem; }\n }\n </style>\n</head>\n<body>\n <header class=\"header\">\n <button class=\"menu-toggle\" aria-label=\"Toggle menu\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\">\n <path d=\"M3 12h18M3 6h18M3 18h18\"/>\n </svg>\n </button>\n <a href=\"{{base}}index.html\" class=\"header-title\">\n <img src=\"{{base}}logo.svg\" alt=\"\" width=\"28\" height=\"28\" style=\"margin-right: 8px; vertical-align: middle;\" />\n {{siteName}}\n </a>\n <div class=\"header-actions\">\n <button class=\"search-button\" aria-label=\"Search\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.3-4.3\"/>\n </svg>\n <span>Search</span>\n <kbd>/</kbd>\n </button>\n <button class=\"theme-toggle\" aria-label=\"Toggle theme\">\n <svg class=\"icon-sun\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"5\"/><path d=\"M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42\"/>\n </svg>\n <svg class=\"icon-moon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\"/>\n </svg>\n </button>\n </div>\n </header>\n <div class=\"search-modal-overlay\">\n <div class=\"search-modal\">\n <div class=\"search-header\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.3-4.3\"/>\n </svg>\n <input type=\"text\" class=\"search-input\" placeholder=\"Search documentation...\" />\n <button class=\"search-close\">Esc</button>\n </div>\n <div class=\"search-results\"></div>\n <div class=\"search-footer\">\n <span><kbd>\u2191</kbd><kbd>\u2193</kbd> to navigate</span>\n <span><kbd>Enter</kbd> to select</span>\n <span><kbd>Esc</kbd> to close</span>\n </div>\n </div>\n </div>\n <div class=\"overlay\"></div>\n <div class=\"layout\">\n <aside class=\"sidebar\">\n <nav>\n{{navigation}}\n </nav>\n </aside>\n <main class=\"main\">\n <article class=\"content\">\n{{content}}\n </article>\n </main>\n{{#hasToc}}\n <aside class=\"toc\">\n <div class=\"toc-title\">On this page</div>\n <ul class=\"toc-list\">\n{{toc}}\n </ul>\n </aside>\n{{/hasToc}}\n </div>\n <script>\n // Menu toggle\n const toggle = document.querySelector('.menu-toggle');\n const sidebar = document.querySelector('.sidebar');\n const overlay = document.querySelector('.overlay');\n if (toggle && sidebar && overlay) {\n const close = () => { sidebar.classList.remove('open'); overlay.classList.remove('open'); };\n toggle.addEventListener('click', () => {\n sidebar.classList.toggle('open');\n overlay.classList.toggle('open');\n });\n overlay.addEventListener('click', close);\n sidebar.querySelectorAll('a').forEach(a => a.addEventListener('click', close));\n }\n\n // Theme toggle\n const themeToggle = document.querySelector('.theme-toggle');\n const getPreferredTheme = () => {\n const stored = localStorage.getItem('theme');\n if (stored) return stored;\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n };\n const setTheme = (theme) => {\n document.documentElement.setAttribute('data-theme', theme);\n localStorage.setItem('theme', theme);\n };\n // Initialize theme\n setTheme(getPreferredTheme());\n if (themeToggle) {\n themeToggle.addEventListener('click', () => {\n const current = document.documentElement.getAttribute('data-theme') || getPreferredTheme();\n setTheme(current === 'dark' ? 'light' : 'dark');\n });\n }\n\n // Search functionality\n const searchButton = document.querySelector('.search-button');\n const searchOverlay = document.querySelector('.search-modal-overlay');\n const searchInput = document.querySelector('.search-input');\n const searchResults = document.querySelector('.search-results');\n const searchClose = document.querySelector('.search-close');\n let searchIndex = null;\n let selectedIndex = 0;\n let results = [];\n\n const openSearch = () => {\n searchOverlay.classList.add('open');\n searchInput.focus();\n };\n const closeSearch = () => {\n searchOverlay.classList.remove('open');\n searchInput.value = '';\n searchResults.innerHTML = '';\n selectedIndex = 0;\n results = [];\n };\n\n // Load search index\n const loadSearchIndex = async () => {\n if (searchIndex) return;\n try {\n const res = await fetch('{{base}}search-index.json');\n searchIndex = await res.json();\n } catch (e) {\n console.warn('Failed to load search index:', e);\n }\n };\n\n // Tokenize query\n const tokenize = (text) => {\n const tokens = [];\n let current = '';\n for (const char of text) {\n const isCjk = /[\\u4E00-\\u9FFF\\u3400-\\u4DBF\\u3040-\\u309F\\u30A0-\\u30FF\\uAC00-\\uD7AF]/.test(char);\n if (isCjk) {\n if (current) { tokens.push(current.toLowerCase()); current = ''; }\n tokens.push(char);\n } else if (/[a-zA-Z0-9_]/.test(char)) {\n current += char;\n } else if (current) {\n tokens.push(current.toLowerCase());\n current = '';\n }\n }\n if (current) tokens.push(current.toLowerCase());\n return tokens;\n };\n\n // Perform search\n const performSearch = async (query) => {\n if (!query.trim()) {\n searchResults.innerHTML = '';\n results = [];\n return;\n }\n await loadSearchIndex();\n if (!searchIndex) {\n searchResults.innerHTML = '<div class=\"search-empty\">Search index not available</div>';\n return;\n }\n\n const tokens = tokenize(query);\n if (!tokens.length) {\n searchResults.innerHTML = '';\n results = [];\n return;\n }\n\n const k1 = 1.2, b = 0.75;\n const docScores = new Map();\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n const isLast = i === tokens.length - 1;\n let matchingTerms = [];\n if (isLast && token.length >= 2) {\n matchingTerms = Object.keys(searchIndex.index).filter(t => t.startsWith(token));\n } else if (searchIndex.index[token]) {\n matchingTerms = [token];\n }\n\n for (const term of matchingTerms) {\n const postings = searchIndex.index[term] || [];\n const df = searchIndex.df[term] || 1;\n const idf = Math.log((searchIndex.doc_count - df + 0.5) / (df + 0.5) + 1.0);\n\n for (const posting of postings) {\n const doc = searchIndex.documents[posting.doc_idx];\n if (!doc) continue;\n const boost = posting.field === 'Title' ? 10 : posting.field === 'Heading' ? 5 : 1;\n const tf = posting.tf;\n const docLen = doc.body.length;\n const score = idf * ((tf * (k1 + 1)) / (tf + k1 * (1 - b + b * docLen / searchIndex.avg_dl))) * boost;\n\n if (!docScores.has(posting.doc_idx)) {\n docScores.set(posting.doc_idx, { score: 0, matches: new Set() });\n }\n const entry = docScores.get(posting.doc_idx);\n entry.score += score;\n entry.matches.add(term);\n }\n }\n }\n\n results = Array.from(docScores.entries())\n .map(([docIdx, data]) => {\n const doc = searchIndex.documents[docIdx];\n let snippet = '';\n if (doc.body) {\n const bodyLower = doc.body.toLowerCase();\n let firstPos = -1;\n for (const match of data.matches) {\n const pos = bodyLower.indexOf(match);\n if (pos !== -1 && (firstPos === -1 || pos < firstPos)) firstPos = pos;\n }\n const start = Math.max(0, firstPos - 50);\n const end = Math.min(doc.body.length, start + 150);\n snippet = doc.body.slice(start, end);\n if (start > 0) snippet = '...' + snippet;\n if (end < doc.body.length) snippet += '...';\n }\n return { ...doc, score: data.score, snippet };\n })\n .sort((a, b) => b.score - a.score)\n .slice(0, 10);\n\n selectedIndex = 0;\n renderResults();\n };\n\n const renderResults = () => {\n if (!results.length) {\n searchResults.innerHTML = '<div class=\"search-empty\">No results found</div>';\n return;\n }\n searchResults.innerHTML = results.map((r, i) =>\n '<a href=\"' + r.url + '\" class=\"search-result' + (i === selectedIndex ? ' selected' : '') + '\">' +\n '<div class=\"search-result-title\">' + r.title + '</div>' +\n (r.snippet ? '<div class=\"search-result-snippet\">' + r.snippet + '</div>' : '') +\n '</a>'\n ).join('');\n };\n\n // Event listeners\n if (searchButton) searchButton.addEventListener('click', openSearch);\n if (searchClose) searchClose.addEventListener('click', closeSearch);\n if (searchOverlay) searchOverlay.addEventListener('click', (e) => { if (e.target === searchOverlay) closeSearch(); });\n\n let searchTimeout = null;\n if (searchInput) {\n searchInput.addEventListener('input', () => {\n if (searchTimeout) clearTimeout(searchTimeout);\n searchTimeout = setTimeout(() => performSearch(searchInput.value), 150);\n });\n searchInput.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') closeSearch();\n else if (e.key === 'ArrowDown') {\n e.preventDefault();\n if (selectedIndex < results.length - 1) { selectedIndex++; renderResults(); }\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n if (selectedIndex > 0) { selectedIndex--; renderResults(); }\n } else if (e.key === 'Enter' && results[selectedIndex]) {\n e.preventDefault();\n window.location.href = results[selectedIndex].url;\n }\n });\n }\n\n // Global keyboard shortcut (/ or Cmd+K)\n document.addEventListener('keydown', (e) => {\n if ((e.key === '/' && !(e.target instanceof HTMLInputElement)) ||\n ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'k')) {\n e.preventDefault();\n openSearch();\n }\n });\n </script>\n</body>\n</html>";
|
|
1079
|
-
/**
|
|
1080
|
-
* Bare HTML template (no navigation, no styles).
|
|
1081
|
-
*/
|
|
1082
|
-
|
|
1134
|
+
declare const DEFAULT_HTML_TEMPLATE = "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>{{title}}{{#siteName}} - {{siteName}}{{/siteName}}</title>\n {{#description}}<meta name=\"description\" content=\"{{description}}\">{{/description}}\n <!-- Open Graph -->\n <meta property=\"og:type\" content=\"website\">\n <meta property=\"og:title\" content=\"{{title}}{{#siteName}} - {{siteName}}{{/siteName}}\">\n {{#description}}<meta property=\"og:description\" content=\"{{description}}\">{{/description}}\n {{#ogImage}}<meta property=\"og:image\" content=\"{{ogImage}}\">{{/ogImage}}\n <!-- Twitter Card -->\n {{#ogImage}}<meta name=\"twitter:card\" content=\"summary_large_image\">{{/ogImage}}\n {{^ogImage}}<meta name=\"twitter:card\" content=\"summary\">{{/ogImage}}\n <meta name=\"twitter:title\" content=\"{{title}}{{#siteName}} - {{siteName}}{{/siteName}}\">\n {{#description}}<meta name=\"twitter:description\" content=\"{{description}}\">{{/description}}\n {{#ogImage}}<meta name=\"twitter:image\" content=\"{{ogImage}}\">{{/ogImage}}\n <style>\n :root {\n --sidebar-width: 260px;\n --header-height: 60px;\n --max-content-width: 960px;\n --font-sans: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n --font-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;\n --color-bg: #ffffff;\n --color-bg-alt: #f8f9fa;\n --color-text: #1a1a1a;\n --color-text-muted: #666666;\n --color-border: #e5e7eb;\n --color-primary: #b7410e;\n --color-primary-hover: #ce5937;\n --color-code-bg: #1e293b;\n --color-code-text: #e2e8f0;\n --color-code-line-highlight: rgba(56, 189, 248, 0.16);\n --color-code-line-warning: rgba(245, 158, 11, 0.18);\n --color-code-line-warning-border: #f59e0b;\n --color-code-line-error: rgba(239, 68, 68, 0.18);\n --color-code-line-error-border: #ef4444;\n }\n [data-theme=\"dark\"] {\n --color-bg: #141414;\n --color-bg-alt: #141414;\n --color-text: #e5e5e5;\n --color-text-muted: #a3a3a3;\n --color-border: #2a2a2a;\n --color-primary: #c9714a;\n --color-primary-hover: #d4845f;\n --color-code-bg: #1a1a1a;\n --color-code-text: #e5e5e5;\n --color-code-line-highlight: rgba(14, 165, 233, 0.2);\n --color-code-line-warning: rgba(245, 158, 11, 0.2);\n --color-code-line-warning-border: #f59e0b;\n --color-code-line-error: rgba(239, 68, 68, 0.22);\n --color-code-line-error-border: #f87171;\n }\n @media (prefers-color-scheme: dark) {\n :root:not([data-theme=\"light\"]) {\n --color-bg: #141414;\n --color-bg-alt: #141414;\n --color-text: #e5e5e5;\n --color-text-muted: #a3a3a3;\n --color-border: #2a2a2a;\n --color-primary: #c9714a;\n --color-primary-hover: #d4845f;\n --color-code-bg: #1a1a1a;\n --color-code-text: #e5e5e5;\n --color-code-line-highlight: rgba(14, 165, 233, 0.2);\n --color-code-line-warning: rgba(245, 158, 11, 0.2);\n --color-code-line-warning-border: #f59e0b;\n --color-code-line-error: rgba(239, 68, 68, 0.22);\n --color-code-line-error-border: #f87171;\n }\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n html { scroll-behavior: smooth; }\n body {\n font-family: var(--font-sans);\n line-height: 1.7;\n color: var(--color-text);\n background: var(--color-bg);\n }\n a { color: var(--color-primary); text-decoration: none; }\n a:hover { color: var(--color-primary-hover); text-decoration: underline; }\n\n /* Header */\n .header {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n height: var(--header-height);\n background: var(--color-bg);\n border-bottom: 1px solid var(--color-border);\n display: flex;\n align-items: center;\n padding: 0 1.5rem;\n z-index: 100;\n }\n .header-title {\n font-size: 1.25rem;\n font-weight: 600;\n color: var(--color-text);\n }\n .header-title:hover { text-decoration: none; }\n .menu-toggle {\n display: none;\n background: none;\n border: none;\n cursor: pointer;\n padding: 0.5rem;\n margin-right: 0.75rem;\n }\n .menu-toggle svg { display: block; }\n .menu-toggle path { stroke: var(--color-text); }\n .header-actions { margin-left: auto; display: flex; align-items: center; gap: 0.5rem; }\n .search-button {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n background: var(--color-bg-alt);\n border: 1px solid var(--color-border);\n border-radius: 6px;\n color: var(--color-text-muted);\n cursor: pointer;\n font-size: 0.875rem;\n transition: border-color 0.15s, color 0.15s;\n }\n .search-button:hover { border-color: var(--color-primary); color: var(--color-text); }\n .search-button svg { width: 16px; height: 16px; }\n .search-button kbd {\n padding: 0.125rem 0.375rem;\n background: var(--color-bg);\n border: 1px solid var(--color-border);\n border-radius: 4px;\n font-family: var(--font-mono);\n font-size: 0.75rem;\n }\n @media (max-width: 640px) {\n .search-button span, .search-button kbd { display: none; }\n .search-button { padding: 0.5rem; }\n }\n .search-modal-overlay {\n display: none;\n position: fixed;\n inset: 0;\n z-index: 200;\n background: rgba(0,0,0,0.6);\n backdrop-filter: blur(4px);\n justify-content: center;\n padding-top: 10vh;\n }\n .search-modal-overlay.open { display: flex; }\n .search-modal {\n width: 100%;\n max-width: 560px;\n margin: 0 1rem;\n background: var(--color-bg);\n border: 1px solid var(--color-border);\n border-radius: 12px;\n overflow: hidden;\n box-shadow: 0 25px 50px -12px rgba(0,0,0,0.4);\n max-height: 70vh;\n display: flex;\n flex-direction: column;\n }\n .search-header {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 1rem;\n border-bottom: 1px solid var(--color-border);\n }\n .search-header svg { flex-shrink: 0; color: var(--color-text-muted); }\n .search-input {\n flex: 1;\n background: none;\n border: none;\n outline: none;\n font-size: 1rem;\n color: var(--color-text);\n }\n .search-input::placeholder { color: var(--color-text-muted); }\n .search-close {\n padding: 0.25rem 0.5rem;\n background: var(--color-bg-alt);\n border: 1px solid var(--color-border);\n border-radius: 4px;\n color: var(--color-text-muted);\n font-family: var(--font-mono);\n font-size: 0.75rem;\n cursor: pointer;\n }\n .search-results {\n flex: 1;\n overflow-y: auto;\n padding: 0.5rem;\n }\n .search-result {\n display: block;\n padding: 0.75rem 1rem;\n border-radius: 8px;\n color: var(--color-text);\n text-decoration: none;\n }\n .search-result:hover, .search-result.selected { background: var(--color-bg-alt); text-decoration: none; }\n .search-result-title { font-weight: 600; font-size: 0.875rem; margin-bottom: 0.25rem; }\n .search-result-snippet { font-size: 0.8125rem; color: var(--color-text-muted); }\n .search-empty { padding: 2rem 1rem; text-align: center; color: var(--color-text-muted); }\n .search-footer {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 1rem;\n padding: 0.75rem 1rem;\n border-top: 1px solid var(--color-border);\n background: var(--color-bg-alt);\n font-size: 0.75rem;\n color: var(--color-text-muted);\n }\n .search-footer kbd {\n padding: 0.125rem 0.375rem;\n background: var(--color-bg);\n border: 1px solid var(--color-border);\n border-radius: 4px;\n font-family: var(--font-mono);\n }\n .theme-toggle {\n background: none;\n border: none;\n cursor: pointer;\n padding: 0.5rem;\n border-radius: 6px;\n color: var(--color-text-muted);\n transition: background 0.15s, color 0.15s;\n }\n .theme-toggle:hover { background: var(--color-bg-alt); color: var(--color-text); }\n .theme-toggle svg { display: block; width: 20px; height: 20px; }\n .theme-toggle .icon-sun { display: none; }\n .theme-toggle .icon-moon { display: block; }\n [data-theme=\"dark\"] .theme-toggle .icon-sun { display: block; }\n [data-theme=\"dark\"] .theme-toggle .icon-moon { display: none; }\n @media (prefers-color-scheme: dark) {\n :root:not([data-theme=\"light\"]) .theme-toggle .icon-sun { display: block; }\n :root:not([data-theme=\"light\"]) .theme-toggle .icon-moon { display: none; }\n }\n\n /* Layout */\n .layout {\n display: flex;\n padding-top: var(--header-height);\n min-height: 100vh;\n }\n\n /* Sidebar */\n .sidebar {\n position: fixed;\n top: var(--header-height);\n left: 0;\n bottom: 0;\n width: var(--sidebar-width);\n background: var(--color-bg-alt);\n border-right: 1px solid var(--color-border);\n overflow-y: auto;\n padding: 1.5rem 1rem;\n }\n .nav-section { margin-bottom: 1.5rem; }\n .nav-title {\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--color-text-muted);\n margin-bottom: 0.5rem;\n padding: 0 0.75rem;\n }\n .nav-list { list-style: none; }\n .nav-item { margin: 0.125rem 0; }\n .nav-link {\n display: block;\n padding: 0.5rem 0.75rem;\n border-radius: 6px;\n color: var(--color-text);\n font-size: 0.875rem;\n transition: background 0.15s;\n }\n .nav-link:hover {\n background: var(--color-border);\n text-decoration: none;\n }\n .nav-link.active {\n background: var(--color-primary);\n color: white;\n }\n\n /* Main content */\n .main {\n flex: 1;\n margin-left: var(--sidebar-width);\n padding: 2rem;\n min-width: 0;\n overflow-x: hidden;\n }\n .content {\n max-width: var(--max-content-width);\n margin: 0 auto;\n overflow-wrap: break-word;\n word-wrap: break-word;\n word-break: break-word;\n }\n\n /* TOC (right sidebar) */\n .toc {\n position: fixed;\n top: calc(var(--header-height) + 2rem);\n right: 2rem;\n width: 200px;\n font-size: 0.8125rem;\n }\n .toc-title {\n font-weight: 600;\n margin-bottom: 0.75rem;\n color: var(--color-text-muted);\n }\n .toc-list { list-style: none; }\n .toc-item { margin: 0.375rem 0; }\n .toc-link {\n color: var(--color-text-muted);\n display: block;\n padding-left: calc((var(--depth, 1) - 1) * 0.75rem);\n }\n .toc-link:hover { color: var(--color-primary); }\n @media (max-width: 1200px) { .toc { display: none; } }\n\n /* Typography */\n .content h1 { font-size: 2.25rem; margin-bottom: 1rem; line-height: 1.2; }\n .content h2 { font-size: 1.5rem; margin-top: 2.5rem; margin-bottom: 1rem; padding-bottom: 0.5rem; border-bottom: 1px solid var(--color-border); }\n .content h3 { font-size: 1.25rem; margin-top: 2rem; margin-bottom: 0.75rem; }\n .content h4 { font-size: 1rem; margin-top: 1.5rem; margin-bottom: 0.5rem; }\n .content p { margin-bottom: 1rem; }\n .content ul, .content ol { margin: 1rem 0; padding-left: 1.5rem; }\n .content li { margin: 0.375rem 0; }\n .content blockquote {\n border-left: 4px solid var(--color-primary);\n padding: 0.5rem 1rem;\n margin: 1rem 0;\n background: var(--color-bg-alt);\n border-radius: 0 6px 6px 0;\n }\n .content code {\n font-family: var(--font-mono);\n font-size: 0.875em;\n background: var(--color-bg-alt);\n padding: 0.2em 0.4em;\n border-radius: 4px;\n word-break: break-all;\n }\n .content pre {\n background: var(--color-code-bg);\n color: var(--color-code-text);\n padding: 1rem 1.25rem;\n border-radius: 8px;\n overflow-x: auto;\n margin: 1.5rem 0;\n line-height: 1.5;\n }\n .content pre code {\n background: transparent;\n padding: 0;\n font-size: 0.8125rem;\n }\n .content pre.ox-code-block code {\n display: block;\n }\n .content pre.ox-code-block .line {\n display: block;\n margin: 0 -1.25rem;\n padding: 0 1.25rem;\n }\n .content pre.ox-code-block .ox-code-line--highlight {\n background: var(--color-code-line-highlight);\n }\n .content pre.ox-code-block .ox-code-line--warning {\n background: var(--color-code-line-warning);\n box-shadow: inset 3px 0 0 var(--color-code-line-warning-border);\n }\n .content pre.ox-code-block .ox-code-line--error {\n background: var(--color-code-line-error);\n box-shadow: inset 3px 0 0 var(--color-code-line-error-border);\n }\n .content table {\n width: 100%;\n border-collapse: collapse;\n margin: 1.5rem 0;\n font-size: 0.875rem;\n }\n .content th, .content td {\n border: 1px solid var(--color-border);\n padding: 0.75rem 1rem;\n text-align: left;\n }\n .content th { background: var(--color-bg-alt); font-weight: 600; }\n .content img { max-width: 100%; height: auto; border-radius: 8px; display: block; }\n .content img[alt*=\"Logo\"] { max-width: 200px; display: block; margin: 1rem 0; }\n .content img[alt*=\"Architecture\"] { max-width: 600px; }\n .content img[alt*=\"Benchmark\"] { max-width: 680px; }\n .content hr { border: none; border-top: 1px solid var(--color-border); margin: 2rem 0; }\n\n /* Responsive */\n @media (max-width: 768px) {\n .menu-toggle { display: block; }\n .sidebar {\n transform: translateX(-100%);\n transition: transform 0.3s ease;\n z-index: 99;\n width: 280px;\n }\n .sidebar.open { transform: translateX(0); }\n .main { margin-left: 0; padding: 1rem 0.75rem; }\n .content { padding: 0 0.25rem; }\n .content h1 { font-size: 1.5rem; line-height: 1.3; margin-bottom: 0.75rem; }\n .content h2 { font-size: 1.2rem; margin-top: 2rem; }\n .content h3 { font-size: 1.1rem; }\n .content p { font-size: 0.9375rem; margin-bottom: 0.875rem; }\n .content ul, .content ol { padding-left: 1.25rem; font-size: 0.9375rem; }\n .content pre {\n padding: 0.75rem;\n font-size: 0.75rem;\n margin: 1rem -0.75rem;\n border-radius: 0;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .content pre.ox-code-block .line {\n margin: 0 -0.75rem;\n padding: 0 0.75rem;\n }\n .content code { font-size: 0.8125em; }\n .content table {\n display: block;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n font-size: 0.8125rem;\n margin: 1rem -0.75rem;\n width: calc(100% + 1.5rem);\n }\n .content th, .content td { padding: 0.5rem 0.75rem; white-space: nowrap; }\n .content img { margin: 1rem 0; }\n .content img[alt*=\"Logo\"] { max-width: 150px; }\n .content img[alt*=\"Architecture\"] { max-width: 100%; }\n .content img[alt*=\"Benchmark\"] { max-width: 100%; }\n .content blockquote { padding: 0.5rem 0.75rem; margin: 1rem 0; font-size: 0.9375rem; }\n .header { padding: 0 1rem; }\n .header-title { font-size: 1rem; }\n .header-title img { width: 24px; height: 24px; }\n .overlay {\n display: none;\n position: fixed;\n inset: 0;\n background: rgba(0,0,0,0.5);\n z-index: 98;\n }\n .overlay.open { display: block; }\n }\n\n /* Extra small devices */\n @media (max-width: 480px) {\n .main { padding: 0.75rem 0.5rem; }\n .content h1 { font-size: 1.35rem; }\n .content pre { font-size: 0.6875rem; padding: 0.625rem; }\n .content table { font-size: 0.75rem; }\n .content th, .content td { padding: 0.375rem 0.5rem; }\n }\n </style>\n</head>\n<body>\n <header class=\"header\">\n <button class=\"menu-toggle\" aria-label=\"Toggle menu\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\">\n <path d=\"M3 12h18M3 6h18M3 18h18\"/>\n </svg>\n </button>\n <a href=\"{{base}}index.html\" class=\"header-title\">\n <img src=\"{{base}}logo.svg\" alt=\"\" width=\"28\" height=\"28\" style=\"margin-right: 8px; vertical-align: middle;\" />\n {{siteName}}\n </a>\n <div class=\"header-actions\">\n <button class=\"search-button\" aria-label=\"Search\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.3-4.3\"/>\n </svg>\n <span>Search</span>\n <kbd>/</kbd>\n </button>\n <button class=\"theme-toggle\" aria-label=\"Toggle theme\">\n <svg class=\"icon-sun\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"5\"/><path d=\"M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42\"/>\n </svg>\n <svg class=\"icon-moon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\"/>\n </svg>\n </button>\n </div>\n </header>\n <div class=\"search-modal-overlay\">\n <div class=\"search-modal\">\n <div class=\"search-header\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.3-4.3\"/>\n </svg>\n <input type=\"text\" class=\"search-input\" placeholder=\"Search documentation...\" />\n <button class=\"search-close\">Esc</button>\n </div>\n <div class=\"search-results\"></div>\n <div class=\"search-footer\">\n <span><kbd>\u2191</kbd><kbd>\u2193</kbd> to navigate</span>\n <span><kbd>Enter</kbd> to select</span>\n <span><kbd>Esc</kbd> to close</span>\n </div>\n </div>\n </div>\n <div class=\"overlay\"></div>\n <div class=\"layout\">\n <aside class=\"sidebar\">\n <nav>\n{{navigation}}\n </nav>\n </aside>\n <main class=\"main\">\n <article class=\"content\">\n{{content}}\n </article>\n </main>\n{{#hasToc}}\n <aside class=\"toc\">\n <div class=\"toc-title\">On this page</div>\n <ul class=\"toc-list\">\n{{toc}}\n </ul>\n </aside>\n{{/hasToc}}\n </div>\n <script>\n // Menu toggle\n const toggle = document.querySelector('.menu-toggle');\n const sidebar = document.querySelector('.sidebar');\n const overlay = document.querySelector('.overlay');\n if (toggle && sidebar && overlay) {\n const close = () => { sidebar.classList.remove('open'); overlay.classList.remove('open'); };\n toggle.addEventListener('click', () => {\n sidebar.classList.toggle('open');\n overlay.classList.toggle('open');\n });\n overlay.addEventListener('click', close);\n sidebar.querySelectorAll('a').forEach(a => a.addEventListener('click', close));\n }\n\n // Theme toggle\n const themeToggle = document.querySelector('.theme-toggle');\n const getPreferredTheme = () => {\n const stored = localStorage.getItem('theme');\n if (stored) return stored;\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n };\n const setTheme = (theme) => {\n document.documentElement.setAttribute('data-theme', theme);\n localStorage.setItem('theme', theme);\n };\n // Initialize theme\n setTheme(getPreferredTheme());\n if (themeToggle) {\n themeToggle.addEventListener('click', () => {\n const current = document.documentElement.getAttribute('data-theme') || getPreferredTheme();\n setTheme(current === 'dark' ? 'light' : 'dark');\n });\n }\n\n // Search functionality\n const searchButton = document.querySelector('.search-button');\n const searchOverlay = document.querySelector('.search-modal-overlay');\n const searchInput = document.querySelector('.search-input');\n const searchResults = document.querySelector('.search-results');\n const searchClose = document.querySelector('.search-close');\n let searchIndex = null;\n let selectedIndex = 0;\n let results = [];\n\n const openSearch = () => {\n searchOverlay.classList.add('open');\n searchInput.focus();\n };\n const closeSearch = () => {\n searchOverlay.classList.remove('open');\n searchInput.value = '';\n searchResults.innerHTML = '';\n selectedIndex = 0;\n results = [];\n };\n\n // Load search index\n const loadSearchIndex = async () => {\n if (searchIndex) return;\n try {\n const res = await fetch('{{base}}search-index.json');\n searchIndex = await res.json();\n } catch (e) {\n console.warn('Failed to load search index:', e);\n }\n };\n\n const parseScopedQuery = (query) => {\n const scopes = [];\n const terms = [];\n for (const part of query.trim().split(/\\s+/).filter(Boolean)) {\n if (part.startsWith('@') && part.length > 1) {\n scopes.push(part.slice(1).toLowerCase());\n } else {\n terms.push(part);\n }\n }\n return { text: terms.join(' ').trim(), scopes: [...new Set(scopes)] };\n };\n\n const getScopesForDoc = (doc) => {\n const source = (doc.id || doc.url || '').replace(/^\\/+/, '').toLowerCase();\n const segments = source.split('/').filter(Boolean);\n if (segments.length <= 1) return [];\n\n const scopes = [];\n let current = '';\n for (const segment of segments.slice(0, -1)) {\n current = current ? current + '/' + segment : segment;\n scopes.push(current);\n }\n return scopes;\n };\n\n const matchesScopes = (doc, scopes) => {\n if (!scopes.length) return true;\n const docScopes = new Set(getScopesForDoc(doc));\n return scopes.some((scope) => docScopes.has(scope));\n };\n\n // Tokenize query\n const tokenize = (text) => {\n const tokens = [];\n let current = '';\n for (const char of text) {\n const isCjk = /[\\u4E00-\\u9FFF\\u3400-\\u4DBF\\u3040-\\u309F\\u30A0-\\u30FF\\uAC00-\\uD7AF]/.test(char);\n if (isCjk) {\n if (current) { tokens.push(current.toLowerCase()); current = ''; }\n tokens.push(char);\n } else if (/[a-zA-Z0-9_]/.test(char)) {\n current += char;\n } else if (current) {\n tokens.push(current.toLowerCase());\n current = '';\n }\n }\n if (current) tokens.push(current.toLowerCase());\n return tokens;\n };\n\n // Perform search\n const performSearch = async (query) => {\n await loadSearchIndex();\n if (!searchIndex) {\n searchResults.innerHTML = '<div class=\"search-empty\">Search index not available</div>';\n return;\n }\n\n const parsedQuery = parseScopedQuery(query);\n if (!parsedQuery.text && parsedQuery.scopes.length === 0) {\n searchResults.innerHTML = '';\n results = [];\n return;\n }\n\n const tokens = tokenize(parsedQuery.text);\n const k1 = 1.2, b = 0.75;\n const docScores = new Map();\n\n if (!tokens.length) {\n searchIndex.documents.forEach((doc, docIdx) => {\n if (matchesScopes(doc, parsedQuery.scopes)) {\n docScores.set(docIdx, { score: 0, matches: new Set() });\n }\n });\n }\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n const isLast = i === tokens.length - 1;\n let matchingTerms = [];\n if (isLast && token.length >= 2) {\n matchingTerms = Object.keys(searchIndex.index).filter(t => t.startsWith(token));\n } else if (searchIndex.index[token]) {\n matchingTerms = [token];\n }\n\n for (const term of matchingTerms) {\n const postings = searchIndex.index[term] || [];\n const df = searchIndex.df[term] || 1;\n const idf = Math.log((searchIndex.doc_count - df + 0.5) / (df + 0.5) + 1.0);\n\n for (const posting of postings) {\n const doc = searchIndex.documents[posting.doc_idx];\n if (!doc) continue;\n if (!matchesScopes(doc, parsedQuery.scopes)) continue;\n const boost = posting.field === 'Title' ? 10 : posting.field === 'Heading' ? 5 : 1;\n const tf = posting.tf;\n const docLen = doc.body.length;\n const score = idf * ((tf * (k1 + 1)) / (tf + k1 * (1 - b + b * docLen / searchIndex.avg_dl))) * boost;\n\n if (!docScores.has(posting.doc_idx)) {\n docScores.set(posting.doc_idx, { score: 0, matches: new Set() });\n }\n const entry = docScores.get(posting.doc_idx);\n entry.score += score;\n entry.matches.add(term);\n }\n }\n }\n\n results = Array.from(docScores.entries())\n .map(([docIdx, data]) => {\n const doc = searchIndex.documents[docIdx];\n const scopes = getScopesForDoc(doc);\n let snippet = '';\n if (doc.body) {\n const bodyLower = doc.body.toLowerCase();\n let firstPos = -1;\n for (const match of data.matches) {\n const pos = bodyLower.indexOf(match);\n if (pos !== -1 && (firstPos === -1 || pos < firstPos)) firstPos = pos;\n }\n const start = firstPos === -1 ? 0 : Math.max(0, firstPos - 50);\n const end = Math.min(doc.body.length, start + 150);\n snippet = doc.body.slice(start, end);\n if (start > 0) snippet = '...' + snippet;\n if (end < doc.body.length) snippet += '...';\n }\n return { ...doc, score: data.score, scopes, snippet };\n })\n .sort((a, b) => b.score - a.score || a.title.localeCompare(b.title))\n .slice(0, 10);\n\n selectedIndex = 0;\n renderResults();\n };\n\n const renderResults = () => {\n if (!results.length) {\n searchResults.innerHTML = '<div class=\"search-empty\">No results found</div>';\n return;\n }\n searchResults.innerHTML = results.map((r, i) =>\n '<a href=\"' + r.url + '\" class=\"search-result' + (i === selectedIndex ? ' selected' : '') + '\">' +\n '<div class=\"search-result-title\">' + r.title + (r.scopes?.length ? '<span class=\"search-result-scope\">@' + r.scopes[0] + '</span>' : '') + '</div>' +\n (r.snippet ? '<div class=\"search-result-snippet\">' + r.snippet + '</div>' : '') +\n '</a>'\n ).join('');\n };\n\n // Event listeners\n if (searchButton) searchButton.addEventListener('click', openSearch);\n if (searchClose) searchClose.addEventListener('click', closeSearch);\n if (searchOverlay) searchOverlay.addEventListener('click', (e) => { if (e.target === searchOverlay) closeSearch(); });\n\n let searchTimeout = null;\n if (searchInput) {\n searchInput.addEventListener('input', () => {\n if (searchTimeout) clearTimeout(searchTimeout);\n searchTimeout = setTimeout(() => performSearch(searchInput.value), 150);\n });\n searchInput.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') closeSearch();\n else if (e.key === 'ArrowDown') {\n e.preventDefault();\n if (selectedIndex < results.length - 1) { selectedIndex++; renderResults(); }\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n if (selectedIndex > 0) { selectedIndex--; renderResults(); }\n } else if (e.key === 'Enter' && results[selectedIndex]) {\n e.preventDefault();\n window.location.href = results[selectedIndex].url;\n }\n });\n }\n\n // Global keyboard shortcut (/ or Cmd+K)\n document.addEventListener('keydown', (e) => {\n if ((e.key === '/' && !(e.target instanceof HTMLInputElement)) ||\n ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'k')) {\n e.preventDefault();\n openSearch();\n }\n });\n </script>\n</body>\n</html>";
|
|
1083
1135
|
/**
|
|
1084
1136
|
* Resolves SSG options with defaults.
|
|
1085
1137
|
*/
|
|
1086
1138
|
declare function resolveSsgOptions(ssg: SsgOptions | boolean | undefined): ResolvedSsgOptions;
|
|
1087
|
-
/**
|
|
1088
|
-
* Extracts title from content or frontmatter.
|
|
1089
|
-
*/
|
|
1090
|
-
|
|
1091
1139
|
/**
|
|
1092
1140
|
* Builds all markdown files to static HTML.
|
|
1093
1141
|
*/
|
|
@@ -1095,7 +1143,6 @@ declare function buildSsg(options: ResolvedOptions, root: string): Promise<{
|
|
|
1095
1143
|
files: string[];
|
|
1096
1144
|
errors: string[];
|
|
1097
1145
|
}>;
|
|
1098
|
-
//# sourceMappingURL=ssg.d.ts.map
|
|
1099
1146
|
//#endregion
|
|
1100
1147
|
//#region src/search.d.ts
|
|
1101
1148
|
/**
|
|
@@ -1110,11 +1157,6 @@ declare function buildSearchIndex(srcDir: string, base: string): Promise<string>
|
|
|
1110
1157
|
* Writes the search index to a file.
|
|
1111
1158
|
*/
|
|
1112
1159
|
declare function writeSearchIndex(indexJson: string, outDir: string): Promise<void>;
|
|
1113
|
-
/**
|
|
1114
|
-
* Client-side search module code.
|
|
1115
|
-
* This is injected into the bundle as a virtual module.
|
|
1116
|
-
*/
|
|
1117
|
-
|
|
1118
1160
|
//#endregion
|
|
1119
1161
|
//#region src/jsx-runtime.d.ts
|
|
1120
1162
|
/**
|
|
@@ -1241,8 +1283,7 @@ interface BasePageProps {
|
|
|
1241
1283
|
* Extended page props with custom frontmatter.
|
|
1242
1284
|
*/
|
|
1243
1285
|
type PageProps<T extends Record<string, unknown> = Record<string, unknown>> = BasePageProps & {
|
|
1244
|
-
/** Custom frontmatter fields */
|
|
1245
|
-
frontmatter: T & Record<string, unknown>;
|
|
1286
|
+
/** Custom frontmatter fields */frontmatter: T & Record<string, unknown>;
|
|
1246
1287
|
};
|
|
1247
1288
|
/**
|
|
1248
1289
|
* Site-wide configuration available in context.
|
|
@@ -1401,7 +1442,6 @@ declare function inferType(value: unknown): string;
|
|
|
1401
1442
|
* Generates TypeScript interface from frontmatter samples.
|
|
1402
1443
|
*/
|
|
1403
1444
|
declare function generateFrontmatterTypes(samples: Record<string, unknown>[], interfaceName?: string): string;
|
|
1404
|
-
//# sourceMappingURL=page-context.d.ts.map
|
|
1405
1445
|
//#endregion
|
|
1406
1446
|
//#region src/theme-renderer.d.ts
|
|
1407
1447
|
/**
|
|
@@ -1504,7 +1544,6 @@ declare function createTheme(config: {
|
|
|
1504
1544
|
layouts: Record<string, ThemeComponent>;
|
|
1505
1545
|
defaultLayout?: string;
|
|
1506
1546
|
}): ThemeComponent;
|
|
1507
|
-
//# sourceMappingURL=theme-renderer.d.ts.map
|
|
1508
1547
|
//#endregion
|
|
1509
1548
|
//#region src/plugins/tabs.d.ts
|
|
1510
1549
|
/**
|
|
@@ -1516,7 +1555,6 @@ declare function transformTabs(html: string): Promise<string>;
|
|
|
1516
1555
|
* This is needed because :has() selectors need unique IDs.
|
|
1517
1556
|
*/
|
|
1518
1557
|
declare function generateTabsCSS(groupCount: number): string;
|
|
1519
|
-
//# sourceMappingURL=tabs.d.ts.map
|
|
1520
1558
|
//#endregion
|
|
1521
1559
|
//#region src/plugins/youtube.d.ts
|
|
1522
1560
|
/**
|
|
@@ -1543,7 +1581,6 @@ declare function extractVideoId(input: string): string | null;
|
|
|
1543
1581
|
* Transform YouTube components in HTML.
|
|
1544
1582
|
*/
|
|
1545
1583
|
declare function transformYouTube(html: string, options?: YouTubeOptions): Promise<string>;
|
|
1546
|
-
//# sourceMappingURL=youtube.d.ts.map
|
|
1547
1584
|
//#endregion
|
|
1548
1585
|
//#region src/plugins/github.d.ts
|
|
1549
1586
|
/**
|
|
@@ -1589,7 +1626,6 @@ declare function prefetchGitHubRepos(repos: string[], options?: GitHubOptions):
|
|
|
1589
1626
|
* Transform GitHub components in HTML.
|
|
1590
1627
|
*/
|
|
1591
1628
|
declare function transformGitHub(html: string, repoDataMap?: Map<string, GitHubRepoData | null>, options?: GitHubOptions): Promise<string>;
|
|
1592
|
-
//# sourceMappingURL=github.d.ts.map
|
|
1593
1629
|
//#endregion
|
|
1594
1630
|
//#region src/plugins/ogp.d.ts
|
|
1595
1631
|
/**
|
|
@@ -1632,7 +1668,6 @@ declare function prefetchOgpData(urls: string[], options?: OgpOptions): Promise<
|
|
|
1632
1668
|
* Transform OgCard components in HTML.
|
|
1633
1669
|
*/
|
|
1634
1670
|
declare function transformOgp(html: string, ogpDataMap?: Map<string, OgpData | null>, options?: OgpOptions): Promise<string>;
|
|
1635
|
-
//# sourceMappingURL=ogp.d.ts.map
|
|
1636
1671
|
//#endregion
|
|
1637
1672
|
//#region src/plugins/mermaid.d.ts
|
|
1638
1673
|
/**
|
|
@@ -1655,7 +1690,6 @@ declare function transformMermaidStatic(html: string, _options?: MermaidOptions)
|
|
|
1655
1690
|
* @deprecated No longer used. Mermaid rendering is now done at build time via NAPI.
|
|
1656
1691
|
*/
|
|
1657
1692
|
declare const mermaidClientScript = "";
|
|
1658
|
-
//# sourceMappingURL=mermaid.d.ts.map
|
|
1659
1693
|
//#endregion
|
|
1660
1694
|
//#region src/plugins/index.d.ts
|
|
1661
1695
|
/**
|
|
@@ -1674,7 +1708,6 @@ interface TransformAllOptions {
|
|
|
1674
1708
|
* Transform all enabled plugins in HTML content.
|
|
1675
1709
|
*/
|
|
1676
1710
|
declare function transformAllPlugins(html: string, options?: TransformAllOptions): Promise<string>;
|
|
1677
|
-
//# sourceMappingURL=index.d.ts.map
|
|
1678
1711
|
//#endregion
|
|
1679
1712
|
//#region src/island/parse.d.ts
|
|
1680
1713
|
/**
|
|
@@ -1694,10 +1727,6 @@ interface ParseIslandsResult {
|
|
|
1694
1727
|
html: string;
|
|
1695
1728
|
islands: IslandInfo[];
|
|
1696
1729
|
}
|
|
1697
|
-
/**
|
|
1698
|
-
* Reset island counter (for testing).
|
|
1699
|
-
*/
|
|
1700
|
-
|
|
1701
1730
|
/**
|
|
1702
1731
|
* Transform Island components in HTML.
|
|
1703
1732
|
*
|
|
@@ -1734,7 +1763,6 @@ declare function extractIslandInfo(html: string): Promise<IslandInfo[]>;
|
|
|
1734
1763
|
* This is a minimal script that imports and initializes islands.
|
|
1735
1764
|
*/
|
|
1736
1765
|
declare function generateHydrationScript(components: string[]): string;
|
|
1737
|
-
//# sourceMappingURL=parse.d.ts.map
|
|
1738
1766
|
//#endregion
|
|
1739
1767
|
//#region src/og-image/types.d.ts
|
|
1740
1768
|
/**
|
|
@@ -1814,7 +1842,6 @@ interface ResolvedOgImageOptions {
|
|
|
1814
1842
|
cache: boolean;
|
|
1815
1843
|
concurrency: number;
|
|
1816
1844
|
}
|
|
1817
|
-
//# sourceMappingURL=types.d.ts.map
|
|
1818
1845
|
//#endregion
|
|
1819
1846
|
//#region src/og-image/browser.d.ts
|
|
1820
1847
|
/**
|
|
@@ -1832,17 +1859,6 @@ interface ResolvedOgImageOptions {
|
|
|
1832
1859
|
interface OgBrowserSession extends AsyncDisposable {
|
|
1833
1860
|
renderPage(html: string, width: number, height: number, publicDir?: string): Promise<Buffer>;
|
|
1834
1861
|
}
|
|
1835
|
-
/**
|
|
1836
|
-
* Opens a Chromium browser and returns a session for rendering OG images.
|
|
1837
|
-
* Returns null if Playwright/Chromium is not available.
|
|
1838
|
-
*
|
|
1839
|
-
* The session implements AsyncDisposable — use `await using` for automatic cleanup:
|
|
1840
|
-
* ```ts
|
|
1841
|
-
* await using session = await openBrowser();
|
|
1842
|
-
* if (!session) return;
|
|
1843
|
-
* const png = await session.renderPage(html, 1200, 630);
|
|
1844
|
-
* ```
|
|
1845
|
-
*/
|
|
1846
1862
|
//#endregion
|
|
1847
1863
|
//#region src/og-image/index.d.ts
|
|
1848
1864
|
/**
|
|
@@ -1875,7 +1891,6 @@ interface OgImageResult {
|
|
|
1875
1891
|
* All errors are non-fatal: failures are reported in results but never throw.
|
|
1876
1892
|
*/
|
|
1877
1893
|
declare function generateOgImages(pages: OgImagePageEntry[], options: ResolvedOgImageOptions, root: string): Promise<OgImageResult[]>;
|
|
1878
|
-
//# sourceMappingURL=index.d.ts.map
|
|
1879
1894
|
//#endregion
|
|
1880
1895
|
//#region src/i18n.d.ts
|
|
1881
1896
|
/**
|
|
@@ -1886,8 +1901,6 @@ declare function resolveI18nOptions(options: I18nOptions | false | undefined): R
|
|
|
1886
1901
|
* Creates the i18n sub-plugin for the Vite plugin array.
|
|
1887
1902
|
*/
|
|
1888
1903
|
declare function createI18nPlugin(resolvedOptions: ResolvedOptions): Plugin;
|
|
1889
|
-
//# sourceMappingURL=i18n.d.ts.map
|
|
1890
|
-
|
|
1891
1904
|
//#endregion
|
|
1892
1905
|
//#region src/index.d.ts
|
|
1893
1906
|
/**
|
|
@@ -1911,5 +1924,5 @@ declare function createI18nPlugin(resolvedOptions: ResolvedOptions): Plugin;
|
|
|
1911
1924
|
*/
|
|
1912
1925
|
declare function oxContent(options?: OxContentOptions): Plugin[];
|
|
1913
1926
|
//#endregion
|
|
1914
|
-
export { type BasePageProps, DEFAULT_HTML_TEMPLATE, DefaultTheme, type DocEntry, type DocsOptions, type EntryPageConfig, type ExtractedDocs, type FeatureConfig, Fragment, type FrontmatterSchema, type GitHubOptions, type GitHubRepoData, type HeroAction, type HeroConfig, type HeroImage, type I18nOptions, type IslandInfo, type JSXChild, type JSXElementType, type JSXNode, type JSXProps, type LanguageRegistration, type LoadStrategy, type LocaleConfig, MarkdownNode, MarkdownTransformer, type MermaidOptions, type NavGroup, type NavItem, type OgBrowserSession, type OgImageOptions, type OgImagePageEntry, type OgImageOptions$1 as OgImagePluginOptions, type OgImageResult, type OgImageTemplateFn, type OgImageTemplateProps, type OgpData, type OgpOptions, type OxContentOptions, type PageData, type PageProps, type ParamDoc, type ParseIslandsResult, type RenderContext, type ResolvedDocsOptions, type ResolvedI18nOptions, type ResolvedOgImageOptions, ResolvedOptions, type ResolvedSearchOptions, type ResolvedSsgOptions, type ResolvedThemeConfig, type ReturnDoc, type SearchDocument, type SearchOptions, type SearchResult, type SiteConfig, type SocialLinks, type SsgOptions, type ThemeColors, type ThemeComponent, type ThemeConfig, type ThemeEmbed, type ThemeFonts, type ThemeFooter, type ThemeHeader, type ThemeLayout, type ThemeProps, type ThemeRenderOptions, TocEntry, type TransformAllOptions, TransformContext, TransformResult, type YouTubeOptions, buildSearchIndex, buildSsg, clearRenderContext, collectGitHubRepos, collectOgpUrls, createI18nPlugin, createMarkdownEnvironment, createTheme, defaultTheme, defineTheme, each, extractDocs, extractIslandInfo, extractVideoId, fetchOgpData, fetchRepoData, generateFrontmatterTypes, generateHydrationScript, generateMarkdown, generateOgImages, generateTabsCSS, generateTypes, hasIslands, inferType, jsx, jsxs, mergeThemes, mermaidClientScript, oxContent, prefetchGitHubRepos, prefetchOgpData, raw, renderAllPages, renderPage, renderToString, resolveDocsOptions, resolveI18nOptions, resolveOgImageOptions, resolveSearchOptions, resolveSsgOptions, resolveTheme, setRenderContext, transformAllPlugins, transformGitHub, transformIslands, transformMarkdown, transformMermaidStatic, transformOgp, transformTabs, transformYouTube, useIsActive, useNav, usePageProps, useRenderContext, useSiteConfig, when, writeDocs, writeSearchIndex };
|
|
1915
|
-
//# sourceMappingURL=index.d.
|
|
1927
|
+
export { type BasePageProps, CodeAnnotationKind, type CodeAnnotationSyntax, type CodeAnnotationsOptions, DEFAULT_HTML_TEMPLATE, DefaultTheme, type DocEntry, type DocsOptions, type EntryPageConfig, type ExtractedDocs, type FeatureConfig, Fragment, type FrontmatterSchema, GeneratedDocsData, type GitHubOptions, type GitHubRepoData, type HeroAction, type HeroConfig, type HeroImage, type I18nOptions, type IslandInfo, type JSXChild, type JSXElementType, type JSXNode, type JSXProps, type LanguageRegistration, type LoadStrategy, type LocaleConfig, MarkdownNode, MarkdownTransformer, type MermaidOptions, type NavGroup, type NavItem, type OgBrowserSession, type OgImageOptions, type OgImagePageEntry, type OgImageOptions$1 as OgImagePluginOptions, type OgImageResult, type OgImageTemplateFn, type OgImageTemplateProps, type OgpData, type OgpOptions, type OxContentOptions, type PageData, type PageProps, type ParamDoc, type ParseIslandsResult, type RenderContext, type ResolvedCodeAnnotationsOptions, type ResolvedDocsOptions, type ResolvedI18nOptions, type ResolvedOgImageOptions, ResolvedOptions, type ResolvedSearchOptions, type ResolvedSsgOptions, type ResolvedThemeConfig, type ReturnDoc, ScopedSearchQuery, type SearchDocument, type SearchOptions, type SearchResult, type SiteConfig, type SocialLinks, type SsgOptions, type ThemeColors, type ThemeComponent, type ThemeConfig, type ThemeEmbed, type ThemeFonts, type ThemeFooter, type ThemeHeader, type ThemeLayout, type ThemeProps, type ThemeRenderOptions, TocEntry, type TransformAllOptions, TransformContext, TransformResult, type YouTubeOptions, buildSearchIndex, buildSsg, clearRenderContext, collectGitHubRepos, collectOgpUrls, createI18nPlugin, createMarkdownEnvironment, createTheme, defaultTheme, defineTheme, each, extractDocs, extractIslandInfo, extractVideoId, fetchOgpData, fetchRepoData, generateFrontmatterTypes, generateHydrationScript, generateMarkdown, generateOgImages, generateTabsCSS, generateTypes, hasIslands, inferType, jsx, jsxs, mergeThemes, mermaidClientScript, oxContent, prefetchGitHubRepos, prefetchOgpData, raw, renderAllPages, renderPage, renderToString, resolveDocsOptions, resolveI18nOptions, resolveOgImageOptions, resolveSearchOptions, resolveSsgOptions, resolveTheme, setRenderContext, transformAllPlugins, transformGitHub, transformIslands, transformMarkdown, transformMermaidStatic, transformOgp, transformTabs, transformYouTube, useIsActive, useNav, usePageProps, useRenderContext, useSiteConfig, when, writeDocs, writeSearchIndex };
|
|
1928
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/theme.ts","../src/types.ts","../src/environment.ts","../src/transform.ts","../src/docs.ts","../src/ssg.ts","../src/search.ts","../src/jsx-runtime.ts","../src/page-context.ts","../src/theme-renderer.ts","../src/plugins/tabs.ts","../src/plugins/youtube.ts","../src/plugins/github.ts","../src/plugins/ogp.ts","../src/plugins/mermaid.ts","../src/plugins/index.ts","../src/island/parse.ts","../src/og-image/types.ts","../src/og-image/browser.ts","../src/og-image/index.ts","../src/i18n.ts","../src/index.ts"],"mappings":"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"}
|