@ox-content/vite-plugin 3.0.0-alpha.1 → 3.0.0-alpha.11

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/index.d.mts CHANGED
@@ -48,6 +48,33 @@ interface ResolvedHeaderNavItem {
48
48
  /** Resolves locale maps so NAPI always receives string labels. */
49
49
  declare function resolveHeaderNavItems(items: HeaderNavItem[] | undefined, locale?: string, defaultLocale?: string): ResolvedHeaderNavItem[] | undefined;
50
50
  //#endregion
51
+ //#region src/theme-fonts.d.ts
52
+ type ThemeFontProvider = "google" | "local";
53
+ type ThemeFontStyle = "normal" | "italic";
54
+ type ThemeFontDisplay = "auto" | "block" | "swap" | "fallback" | "optional";
55
+ /** UnoCSS-inspired family descriptor. The string stack form remains valid. */
56
+ interface ThemeWebFont {
57
+ /** Family name, e.g. `"Inter"` or `"DM Mono"`. */
58
+ family: string;
59
+ /** Defaults to `"local"` when `path` is set, otherwise `"google"`. */
60
+ provider?: ThemeFontProvider;
61
+ /** File, directory, or `@fontsource/*` package. Required for `local`. */
62
+ path?: string;
63
+ weights?: number[];
64
+ styles?: ThemeFontStyle[];
65
+ subsets?: string[];
66
+ display?: ThemeFontDisplay;
67
+ /** Copy files into the SSG output and emit `@font-face`. */
68
+ selfHost?: boolean;
69
+ /** Extra families after `family` in the emitted CSS stack. */
70
+ fallbacks?: string[];
71
+ /** Preload every self-hosted face, or only these weights. */
72
+ preload?: boolean | number[];
73
+ /** Optional `unicode-range` for local faces. */
74
+ unicodeRange?: string;
75
+ }
76
+ type ThemeFontValue = string | ThemeWebFont;
77
+ //#endregion
51
78
  //#region src/theme-tokens.d.ts
52
79
  /**
53
80
  * Free-form `--octc-*` custom properties for themes that need more than the
@@ -100,12 +127,17 @@ interface ThemeLayout {
100
127
  }
101
128
  /**
102
129
  * Theme font configuration.
130
+ *
131
+ * `sans` and `mono` accept a CSS stack string or a web-font object. Named
132
+ * families are extra stacks exposed as `--octc-font-<name>`.
103
133
  */
104
134
  interface ThemeFonts {
105
- /** Sans-serif font stack */
106
- sans?: string;
107
- /** Monospace font stack */
108
- mono?: string;
135
+ /** Sans-serif font stack or self-hosted family */
136
+ sans?: ThemeFontValue;
137
+ /** Monospace font stack or self-hosted family */
138
+ mono?: ThemeFontValue;
139
+ /** Additional families, exposed as `--octc-font-<name>` */
140
+ named?: Record<string, ThemeFontValue>;
109
141
  }
110
142
  /**
111
143
  * Entry page theme configuration.
@@ -225,6 +257,14 @@ interface ThemeConfig {
225
257
  * `breadcrumbs: false` still hides it on that page.
226
258
  */
227
259
  breadcrumbs?: boolean | Record<string, unknown>;
260
+ /**
261
+ * Heading permalink visibility. CSS only — the renderer HTML stays
262
+ * `<a class="header-anchor" href="#id">`.
263
+ *
264
+ * `"hover"` (default) reveals the `#` on hover / focus-visible, and
265
+ * stays visible on touch. `"always"` keeps it visible.
266
+ */
267
+ headingPermalink?: "hover" | "always";
228
268
  /** Light mode colors (maps to CSS variables) */
229
269
  colors?: ThemeColors;
230
270
  /** Dark mode colors (maps to CSS variables) */
@@ -279,6 +319,7 @@ interface ResolvedThemeConfig {
279
319
  viewTransitions: boolean;
280
320
  aside: boolean;
281
321
  breadcrumbs: boolean;
322
+ headingPermalink: "hover" | "always";
282
323
  colors: ThemeColors;
283
324
  darkColors: ThemeColors;
284
325
  fonts: ThemeFonts;
@@ -346,6 +387,377 @@ declare function mergeThemes(...themes: (ThemeConfig | ThemeConfig[])[]): ThemeC
346
387
  */
347
388
  declare function resolveTheme(config?: ThemeConfig | ThemeConfig[]): ResolvedThemeConfig;
348
389
  //#endregion
390
+ //#region src/plugins/tabs.d.ts
391
+ /**
392
+ * Transform Tabs components in HTML.
393
+ */
394
+ declare function transformTabs(html: string): Promise<string>;
395
+ /**
396
+ * Generate dynamic CSS for :has() based tab switching.
397
+ * This is needed because :has() selectors need unique IDs.
398
+ */
399
+ declare function generateTabsCSS(groupCount: number): string;
400
+ //#endregion
401
+ //#region src/plugins/pm.d.ts
402
+ /**
403
+ * Package Manager Tabs Plugin
404
+ *
405
+ * Transforms <pm>npm install …</pm> blocks into a tab group with one tab per
406
+ * package manager (npm/pnpm/yarn/bun). The single npm-style command is converted
407
+ * to each package manager's equivalent natively in Rust (`transformPmEmbeds` in
408
+ * @ox-content/napi), and the result reuses the same `ox-tabs` widget markup as
409
+ * the generic `<tabs>` plugin so styling and keyboard navigation are consistent.
410
+ *
411
+ * Syncing is opt-in (off by default): when enabled, the rendered group carries a
412
+ * `data-ox-tab-group="pkg-manager"` attribute so the client runtime can keep
413
+ * every package-manager group on the page in sync via localStorage.
414
+ *
415
+ * Package-manager groups share the tab-group counter with the `<tabs>` plugin so
416
+ * `data-group` ids (and the CSS produced by `generateTabsCSS`) stay unique.
417
+ */
418
+ /** Options for {@link transformPm}. */
419
+ interface PmOptions {
420
+ /**
421
+ * Enable opt-in synced package-manager tab groups. When `true`, a
422
+ * `data-ox-tab-group="pkg-manager"` attribute is emitted so the client runtime
423
+ * syncs the active package manager across every pm group on the page and
424
+ * persists the choice in localStorage.
425
+ * @default false
426
+ */
427
+ sync?: boolean;
428
+ }
429
+ //#endregion
430
+ //#region src/plugins/youtube.d.ts
431
+ /**
432
+ * YouTube Plugin - Privacy-enhanced iframe embedding
433
+ *
434
+ * Transforms <YouTube> components into responsive iframe embeds using
435
+ * youtube-nocookie.com for enhanced privacy. A digits-only `start` attribute
436
+ * becomes `?start=` on the iframe URL.
437
+ *
438
+ * The HTML rewrite is performed in Rust (`transformYoutubeEmbeds` in
439
+ * @ox-content/napi), replacing the previous rehype parse/stringify
440
+ * round-trip. This module keeps the public TS surface and a cheap marker
441
+ * check so pages without a `<youtube>` element never cross the NAPI boundary.
442
+ */
443
+ interface YouTubeOptions {
444
+ /**
445
+ * Use privacy-enhanced mode (`youtube-nocookie.com`).
446
+ * @default true
447
+ */
448
+ privacyEnhanced?: boolean;
449
+ /**
450
+ * Default iframe aspect ratio.
451
+ * @default '16/9'
452
+ */
453
+ aspectRatio?: string;
454
+ /**
455
+ * Allow fullscreen playback.
456
+ * @default true
457
+ */
458
+ allowFullscreen?: boolean;
459
+ /**
460
+ * Lazy load the iframe.
461
+ * @default true
462
+ */
463
+ lazyLoad?: boolean;
464
+ }
465
+ /**
466
+ * Extract a YouTube video ID from a bare ID or a watch / share / embed /
467
+ * shorts URL.
468
+ *
469
+ * The rule lives in Rust so this function and the `<youtube>` rewrite below
470
+ * cannot disagree about what counts as a video: `transformYoutubeEmbeds`
471
+ * resolves IDs with the same code.
472
+ */
473
+ declare function extractVideoId(input: string): string | null;
474
+ /**
475
+ * Transform YouTube components in HTML.
476
+ */
477
+ declare function transformYouTube(html: string, options?: YouTubeOptions): Promise<string>;
478
+ //#endregion
479
+ //#region src/plugins/provider-articles.d.ts
480
+ interface ProviderArticleEmbedOptions {
481
+ /** Fetch article metadata at build time. @default true */
482
+ fetch?: boolean;
483
+ /** Metadata request timeout in milliseconds. @default 10000 */
484
+ timeout?: number;
485
+ /** Cache fetched metadata in memory for the current process. @default true */
486
+ cache?: boolean;
487
+ /** Cache TTL in milliseconds. @default 3600000 */
488
+ cacheTTL?: number;
489
+ /** Persist metadata across builds. Off by default. */
490
+ persistCache?: boolean;
491
+ /** Directory for the persistent cache. */
492
+ cacheDir?: string;
493
+ }
494
+ //#endregion
495
+ //#region src/plugins/provider-packages.d.ts
496
+ interface ProviderPackageEmbedOptions {
497
+ /** Fetch package metadata at build time. @default true */
498
+ fetch?: boolean;
499
+ /** Metadata request timeout in milliseconds. @default 10000 */
500
+ timeout?: number;
501
+ /** Cache fetched metadata in memory for the current process. @default true */
502
+ cache?: boolean;
503
+ /** Cache TTL in milliseconds. @default 3600000 */
504
+ cacheTTL?: number;
505
+ /** Persist metadata across builds. Off by default. */
506
+ persistCache?: boolean;
507
+ /** Directory for the persistent cache. */
508
+ cacheDir?: string;
509
+ }
510
+ //#endregion
511
+ //#region src/plugins/provider-playgrounds.d.ts
512
+ interface ProviderPlaygroundEmbedOptions {
513
+ /** Fetch playground metadata at build time where a public endpoint exists. @default true */
514
+ fetch?: boolean;
515
+ /** Add provider iframe URLs for supported providers. @default false */
516
+ iframe?: boolean;
517
+ /** Metadata request timeout in milliseconds. @default 10000 */
518
+ timeout?: number;
519
+ /** Cache fetched metadata in memory for the current process. @default true */
520
+ cache?: boolean;
521
+ /** Cache TTL in milliseconds. @default 3600000 */
522
+ cacheTTL?: number;
523
+ /** Persist metadata across builds. Off by default. */
524
+ persistCache?: boolean;
525
+ /** Directory for the persistent cache. */
526
+ cacheDir?: string;
527
+ }
528
+ //#endregion
529
+ //#region src/plugins/provider-videos.d.ts
530
+ interface ProviderVideoEmbedOptions {
531
+ /** Fetch public video metadata at build time where supported. @default true */
532
+ fetch?: boolean;
533
+ /** Add lazy provider iframe URLs when supported. @default false */
534
+ iframe?: boolean;
535
+ /** Twitch embed parent domain or domains. Required for Twitch iframes. */
536
+ parent?: string | string[];
537
+ /** Metadata request timeout in milliseconds. @default 10000 */
538
+ timeout?: number;
539
+ /** Cache fetched metadata in memory for the current process. @default true */
540
+ cache?: boolean;
541
+ /** Cache TTL in milliseconds. @default 3600000 */
542
+ cacheTTL?: number;
543
+ /** Persist metadata across builds. Off by default. */
544
+ persistCache?: boolean;
545
+ /** Directory for the persistent cache. */
546
+ cacheDir?: string;
547
+ }
548
+ //#endregion
549
+ //#region src/plugins/reddit/types.d.ts
550
+ interface RedditEmbedOptions {
551
+ /**
552
+ * Fetch Reddit post metadata at build time.
553
+ * @default true
554
+ */
555
+ fetch?: boolean;
556
+ /**
557
+ * Metadata request timeout in milliseconds.
558
+ * @default 10000
559
+ */
560
+ timeout?: number;
561
+ /**
562
+ * Cache fetched post metadata in memory for the current process.
563
+ * @default true
564
+ */
565
+ cache?: boolean;
566
+ /**
567
+ * Cache TTL in milliseconds. Fresh memory entries skip the network.
568
+ * @default 3600000
569
+ */
570
+ cacheTTL?: number;
571
+ /**
572
+ * User agent sent to Reddit's JSON endpoint.
573
+ * @default 'ox-content-reddit-bot/1.0 (compatible; +https://github.com/ubugeeei-prod/ox-content)'
574
+ */
575
+ userAgent?: string;
576
+ }
577
+ interface RedditPostReference {
578
+ url: string;
579
+ id?: string;
580
+ subreddit?: string;
581
+ slug?: string;
582
+ shareId?: string;
583
+ apiUrl?: string;
584
+ }
585
+ interface RedditPostImage {
586
+ url: string;
587
+ width?: number;
588
+ height?: number;
589
+ }
590
+ interface RedditPostData {
591
+ permalink: string;
592
+ subreddit: string;
593
+ title: string;
594
+ author?: string;
595
+ body?: string;
596
+ score?: number;
597
+ commentCount?: number;
598
+ createdAt?: string;
599
+ originalUrl?: string;
600
+ image?: RedditPostImage;
601
+ }
602
+ //#endregion
603
+ //#region src/plugins/reddit/transform.d.ts
604
+ declare function transformRedditEmbeds(html: string, options?: RedditEmbedOptions): Promise<string>;
605
+ //#endregion
606
+ //#region src/plugins/reddit/url.d.ts
607
+ declare function parseRedditPostReference(value: string): RedditPostReference | null;
608
+ //#endregion
609
+ //#region src/plugins/twitter/types.d.ts
610
+ interface TwitterEmbedOptions {
611
+ /** Fetch the post body, author, and media from X at build time. */
612
+ fetch?: boolean;
613
+ /** Language sent to the syndication endpoint. @default "en" */
614
+ lang?: string;
615
+ /** Request timeout in milliseconds. @default 10000 */
616
+ timeout?: number;
617
+ /** Cache syndication responses in memory and on disk. @default true */
618
+ cache?: boolean;
619
+ /** Directory used for the persistent metadata cache. @default ".cache/ox-content/twitter" */
620
+ cacheDir?: string;
621
+ /** Directory where avatars, photos, and videos are written. @default "public/ox-content/twitter" */
622
+ mediaOutputDir?: string;
623
+ /** Public URL prefix for downloaded media. @default "/ox-content/twitter" */
624
+ mediaPublicPath?: string;
625
+ /** Download MP4 video and animated GIF assets at build time. @default false */
626
+ downloadVideo?: boolean;
627
+ /** Maximum video size in bytes. Oversized assets are skipped. @default 8388608 */
628
+ maxVideoBytes?: number;
629
+ /** Fetched-card chrome. `"full"` matches sveltweet / react-tweet. @default "compact" */
630
+ appearance?: TweetAppearance;
631
+ /**
632
+ * IANA timezone for full-card timestamps.
633
+ * Invalid values fall back to UTC so build output stays deterministic.
634
+ * @default "UTC"
635
+ */
636
+ timeZone?: string;
637
+ }
638
+ type TweetAppearance = "compact" | "full";
639
+ //#endregion
640
+ //#region src/plugins/media.d.ts
641
+ interface MediaEmbedOptions {
642
+ /**
643
+ * Render `<Spotify>` embeds.
644
+ * @default false
645
+ */
646
+ spotify?: boolean;
647
+ /**
648
+ * Render `<AppleMusic>` embeds.
649
+ * @default false
650
+ */
651
+ appleMusic?: boolean;
652
+ /**
653
+ * Render `<SpeakerDeck>` embeds.
654
+ * @default false
655
+ */
656
+ speakerDeck?: boolean;
657
+ /**
658
+ * Render `<Audio>` native players.
659
+ * @default false
660
+ */
661
+ audio?: boolean;
662
+ /**
663
+ * Render `<Video>` native players.
664
+ * @default false
665
+ */
666
+ video?: boolean;
667
+ /**
668
+ * Render `<StackBlitz>` embeds.
669
+ * @default false
670
+ */
671
+ stackBlitz?: boolean;
672
+ /**
673
+ * Render `<Tweet>` / `<XPost>` static cards. Pass `{ fetch: true }` to
674
+ * resolve the post content and self-host its media at build time.
675
+ * @default false
676
+ */
677
+ twitter?: boolean | TwitterEmbedOptions;
678
+ /**
679
+ * Render `<Reddit>` static cards with build-time metadata fetch.
680
+ * @default false
681
+ */
682
+ reddit?: boolean | RedditEmbedOptions;
683
+ /**
684
+ * Render `<Bluesky>` static cards.
685
+ * @default false
686
+ */
687
+ bluesky?: boolean;
688
+ /**
689
+ * Render `<GoogleMaps>` static place cards.
690
+ * @default false
691
+ */
692
+ googleMaps?: boolean;
693
+ /**
694
+ * Render `<Qiita>` static article cards.
695
+ * Pass `{ fetch: false }` to skip metadata fetching and render a link-only card.
696
+ * @default false
697
+ */
698
+ qiita?: boolean | ProviderArticleEmbedOptions;
699
+ /**
700
+ * Render `<Zenn>` static article cards.
701
+ * Pass `{ fetch: false }` to skip metadata fetching and render a link-only card.
702
+ * @default false
703
+ */
704
+ zenn?: boolean | ProviderArticleEmbedOptions;
705
+ /**
706
+ * Render `<NpmPackage>`, `<CratesIo>`, `<PyPI>`, and `<DockerHub>` package cards.
707
+ * Pass `{ fetch: false }` to skip metadata fetching and render link-only cards.
708
+ * @default false
709
+ */
710
+ packageRegistry?: boolean | ProviderPackageEmbedOptions;
711
+ /**
712
+ * Render `<CodePen>`, `<JSFiddle>`, and `<Observable>` static playground cards.
713
+ * Pass `{ iframe: true }` to add lazy provider iframe URLs where supported.
714
+ * @default false
715
+ */
716
+ playgrounds?: boolean | ProviderPlaygroundEmbedOptions;
717
+ /**
718
+ * Render `<Vimeo>` static video cards.
719
+ * Pass `{ iframe: true }` to add lazy player iframe URLs.
720
+ * @default false
721
+ */
722
+ vimeo?: boolean | ProviderVideoEmbedOptions;
723
+ /**
724
+ * Render `<Twitch>` static video, clip, and channel cards.
725
+ * Pass `{ iframe: true, parent: "example.com" }` to add Twitch player iframes.
726
+ * @default false
727
+ */
728
+ twitch?: boolean | ProviderVideoEmbedOptions;
729
+ /**
730
+ * Render `<Discord>` static invite/message cards.
731
+ * @default false
732
+ */
733
+ discord?: boolean;
734
+ /**
735
+ * Render `<Fediverse>`, `<Mastodon>`, `<Misskey>`, and `<Mixi2>` static cards.
736
+ * @default false
737
+ */
738
+ fediverse?: boolean;
739
+ /**
740
+ * Render `<Facebook>` static post cards.
741
+ * @default false
742
+ */
743
+ facebook?: boolean;
744
+ /**
745
+ * Render `<Threads>` static post cards.
746
+ * @default false
747
+ */
748
+ threads?: boolean;
749
+ /**
750
+ * Render `<Instagram>` static post cards.
751
+ * @default false
752
+ */
753
+ instagram?: boolean;
754
+ /**
755
+ * Render `<WebContainer>` lazy placeholder blocks.
756
+ * @default false
757
+ */
758
+ webContainer?: boolean;
759
+ }
760
+ //#endregion
349
761
  //#region src/plugins/github/types.d.ts
350
762
  interface GitHubRepoData {
351
763
  name: string;
@@ -371,6 +783,11 @@ interface GitHubSourceRef {
371
783
  permalink: string;
372
784
  lines?: GitHubLineRange;
373
785
  }
786
+ interface GitHubSourceCommit {
787
+ sha: string;
788
+ message: string;
789
+ html_url: string;
790
+ }
374
791
  interface GitHubSourceData {
375
792
  repo: string;
376
793
  ref: string;
@@ -380,6 +797,7 @@ interface GitHubSourceData {
380
797
  size: number;
381
798
  html_url: string;
382
799
  language: string | null;
800
+ commit?: GitHubSourceCommit;
383
801
  }
384
802
  interface GitHubOptions {
385
803
  /**
@@ -447,31 +865,7 @@ declare function parseGitHubPermalink(value: string): GitHubSourceRef | null;
447
865
  */
448
866
  declare function transformGitHub(html: string, repoDataMap?: Map<string, GitHubRepoData | null>, options?: GitHubOptions): Promise<string>;
449
867
  //#endregion
450
- //#region src/plugins/twitter/types.d.ts
451
- interface TwitterEmbedOptions {
452
- /** Fetch the post body, author, and media from X at build time. */
453
- fetch?: boolean;
454
- /** Language sent to the syndication endpoint. @default "en" */
455
- lang?: string;
456
- /** Request timeout in milliseconds. @default 10000 */
457
- timeout?: number;
458
- /** Cache syndication responses in memory and on disk. @default true */
459
- cache?: boolean;
460
- /** Directory used for the persistent metadata cache. @default ".cache/ox-content/twitter" */
461
- cacheDir?: string;
462
- /** Directory where avatars and photos are written. @default "public/ox-content/twitter" */
463
- mediaOutputDir?: string;
464
- /** Public URL prefix for downloaded media. @default "/ox-content/twitter" */
465
- mediaPublicPath?: string;
466
- }
467
- //#endregion
468
- //#region src/plugins/ogp.d.ts
469
- /**
470
- * OGP Card Plugin - Link card embedding
471
- *
472
- * Transforms <OgCard> components into static link preview cards
473
- * by fetching OGP metadata at build time.
474
- */
868
+ //#region src/plugins/ogp/types.d.ts
475
869
  interface OgpData {
476
870
  url: string;
477
871
  title: string;
@@ -488,119 +882,45 @@ interface OgpOptions {
488
882
  timeout?: number;
489
883
  /**
490
884
  * Cache fetched Open Graph metadata in memory for the current process.
885
+ * Persistent disk cache also requires this to be enabled.
491
886
  * @default true
492
887
  */
493
888
  cache?: boolean;
494
889
  /**
495
- * Cache TTL in milliseconds.
890
+ * Cache TTL in milliseconds. Fresh memory and disk entries skip the network.
496
891
  * @default 3600000
497
892
  */
498
893
  cacheTTL?: number;
499
894
  /**
500
- * User agent sent with metadata fetch requests.
501
- * @default 'ox-content-ogp-bot/1.0 (compatible; +https://github.com/ubugeeei-prod/ox-content)'
502
- */
503
- userAgent?: string;
504
- }
505
- /**
506
- * Fetch OGP data for a URL.
507
- */
508
- declare function fetchOgpData(url: string, options: Required<OgpOptions>): Promise<OgpData | null>;
509
- /**
510
- * Collect all OGP URLs from HTML for pre-fetching.
511
- */
512
- declare function collectOgpUrls(html: string): Promise<string[]>;
513
- /**
514
- * Pre-fetch all OGP data.
515
- */
516
- declare function prefetchOgpData(urls: string[], options?: OgpOptions): Promise<Map<string, OgpData | null>>;
517
- /**
518
- * Transform OgCard components in HTML.
519
- */
520
- declare function transformOgp(html: string, ogpDataMap?: Map<string, OgpData | null>, options?: OgpOptions): Promise<string>;
521
- //#endregion
522
- //#region src/plugins/pm.d.ts
523
- /**
524
- * Package Manager Tabs Plugin
525
- *
526
- * Transforms <pm>npm install …</pm> blocks into a tab group with one tab per
527
- * package manager (npm/pnpm/yarn/bun). The single npm-style command is converted
528
- * to each package manager's equivalent natively in Rust (`transformPmEmbeds` in
529
- * @ox-content/napi), and the result reuses the same `ox-tabs` widget markup as
530
- * the generic `<tabs>` plugin so styling and keyboard navigation are consistent.
531
- *
532
- * Syncing is opt-in (off by default): when enabled, the rendered group carries a
533
- * `data-ox-tab-group="pkg-manager"` attribute so the client runtime can keep
534
- * every package-manager group on the page in sync via localStorage.
535
- *
536
- * Package-manager groups share the tab-group counter with the `<tabs>` plugin so
537
- * `data-group` ids (and the CSS produced by `generateTabsCSS`) stay unique.
538
- */
539
- /** Options for {@link transformPm}. */
540
- interface PmOptions {
541
- /**
542
- * Enable opt-in synced package-manager tab groups. When `true`, a
543
- * `data-ox-tab-group="pkg-manager"` attribute is emitted so the client runtime
544
- * syncs the active package manager across every pm group on the page and
545
- * persists the choice in localStorage.
895
+ * Persist successful and negative cache entries to disk across builds.
896
+ * Off by default so existing sites do not write a cache directory.
546
897
  * @default false
547
898
  */
548
- sync?: boolean;
549
- }
550
- //#endregion
551
- //#region src/plugins/tabs.d.ts
552
- /**
553
- * Transform Tabs components in HTML.
554
- */
555
- declare function transformTabs(html: string): Promise<string>;
556
- /**
557
- * Generate dynamic CSS for :has() based tab switching.
558
- * This is needed because :has() selectors need unique IDs.
559
- */
560
- declare function generateTabsCSS(groupCount: number): string;
561
- //#endregion
562
- //#region src/plugins/youtube.d.ts
563
- /**
564
- * YouTube Plugin - Privacy-enhanced iframe embedding
565
- *
566
- * Transforms <YouTube> components into responsive iframe embeds using
567
- * youtube-nocookie.com for enhanced privacy.
568
- *
569
- * The HTML rewrite is performed in Rust (`transformYoutubeEmbeds` in
570
- * @ox-content/napi), replacing the previous rehype parse/stringify
571
- * round-trip. This module keeps the public TS surface and a cheap marker
572
- * check so pages without a `<youtube>` element never cross the NAPI boundary.
573
- */
574
- interface YouTubeOptions {
575
- /**
576
- * Use privacy-enhanced mode (`youtube-nocookie.com`).
577
- * @default true
578
- */
579
- privacyEnhanced?: boolean;
899
+ persistCache?: boolean;
580
900
  /**
581
- * Default iframe aspect ratio.
582
- * @default '16/9'
901
+ * Directory used for the persistent metadata cache when `persistCache` is on.
902
+ * @default ".cache/ox-content/ogp"
583
903
  */
584
- aspectRatio?: string;
904
+ cacheDir?: string;
585
905
  /**
586
- * Allow fullscreen playback.
587
- * @default true
906
+ * Re-fetch metadata even when a fresh cache entry exists.
907
+ * @default false
588
908
  */
589
- allowFullscreen?: boolean;
909
+ refresh?: boolean;
590
910
  /**
591
- * Lazy load the iframe.
592
- * @default true
911
+ * User agent sent with metadata fetch requests.
912
+ * @default 'ox-content-ogp-bot/1.0 (compatible; +https://github.com/ubugeeei-prod/ox-content)'
593
913
  */
594
- lazyLoad?: boolean;
914
+ userAgent?: string;
595
915
  }
596
- /**
597
- * Extract YouTube video ID from various URL formats.
598
- */
599
- declare function extractVideoId(input: string): string | null;
600
- /**
601
- * Transform YouTube components in HTML.
602
- */
603
- declare function transformYouTube(html: string, options?: YouTubeOptions): Promise<string>;
916
+ //#endregion
917
+ //#region src/plugins/ogp/fetch.d.ts
918
+ declare function fetchOgpData(url: string, options?: OgpOptions): Promise<OgpData | null>;
919
+ //#endregion
920
+ //#region src/plugins/ogp/transform.d.ts
921
+ declare function collectOgpUrls(html: string): Promise<string[]>;
922
+ declare function prefetchOgpData(urls: string[], options?: OgpOptions): Promise<Map<string, OgpData | null>>;
923
+ declare function transformOgp(html: string, ogpDataMap?: Map<string, OgpData | null>, options?: OgpOptions): Promise<string>;
604
924
  //#endregion
605
925
  //#region src/plugins/mermaid.d.ts
606
926
  /**
@@ -627,12 +947,45 @@ declare function transformMermaidStatic(html: string, _options?: MermaidOptions)
627
947
  */
628
948
  declare const mermaidClientScript = "";
629
949
  //#endregion
950
+ //#region src/plugins/graphviz-renderer.d.ts
951
+ type GraphvizFailureMode = "error" | "warn";
952
+ interface GraphvizOptions {
953
+ /** Graphviz renderer command. @default 'dot' */
954
+ command?: string;
955
+ /** Extra arguments passed before `-Tsvg`. @default [] */
956
+ args?: string[];
957
+ /** Behavior when the Graphviz command is not available. @default 'error' */
958
+ missingRenderer?: GraphvizFailureMode;
959
+ /** Behavior when Graphviz rejects a DOT source. @default 'error' */
960
+ renderErrors?: GraphvizFailureMode;
961
+ /** Per-render timeout in milliseconds. @default 10000 */
962
+ timeout?: number;
963
+ /** Cache rendered SVGs in memory for this process. @default true */
964
+ cache?: boolean;
965
+ /** Cache TTL in milliseconds. @default 3600000 */
966
+ cacheTTL?: number;
967
+ }
968
+ interface ResolvedGraphvizOptions {
969
+ command: string;
970
+ args: string[];
971
+ missingRenderer: GraphvizFailureMode;
972
+ renderErrors: GraphvizFailureMode;
973
+ timeout: number;
974
+ cache: boolean;
975
+ cacheTTL: number;
976
+ }
977
+ declare function clearGraphvizCache(): void;
978
+ declare function resolveGraphvizOptions(options: boolean | GraphvizOptions | undefined): ResolvedGraphvizOptions | false;
979
+ //#endregion
980
+ //#region src/plugins/graphviz.d.ts
981
+ declare function transformGraphvizStatic(html: string, options?: boolean | GraphvizOptions | ResolvedGraphvizOptions): Promise<string>;
982
+ //#endregion
630
983
  //#region src/plugins/index.d.ts
631
984
  /**
632
985
  * Transform all plugin components in HTML.
633
986
  * Call this during SSG build to process all plugins at once.
634
987
  */
635
- interface TransformAllOptions {
988
+ interface TransformAllOptions extends MediaEmbedOptions {
636
989
  tabs?: boolean;
637
990
  /**
638
991
  * Expand `<pm>` package-manager blocks into install tabs. Pass an object to
@@ -645,18 +998,127 @@ interface TransformAllOptions {
645
998
  ogp?: boolean | OgpOptions;
646
999
  openGraph?: boolean | OgpOptions;
647
1000
  mermaid?: boolean;
1001
+ graphviz?: boolean | GraphvizOptions;
648
1002
  githubToken?: string;
649
- spotify?: boolean;
650
- stackBlitz?: boolean;
651
- twitter?: boolean | TwitterEmbedOptions;
652
- bluesky?: boolean;
653
- webContainer?: boolean;
654
1003
  }
655
1004
  /**
656
1005
  * Transform all enabled plugins in HTML content.
657
1006
  */
658
1007
  declare function transformAllPlugins(html: string, options?: TransformAllOptions): Promise<string>;
659
1008
  //#endregion
1009
+ //#region src/cross-reference-types.d.ts
1010
+ type CrossReferenceKind = "figure" | "table" | "section";
1011
+ type CrossReferenceFailureMode = "error" | "warn";
1012
+ interface CrossReferenceLabelOptions {
1013
+ figure?: string;
1014
+ table?: string;
1015
+ section?: string;
1016
+ }
1017
+ interface CrossReferencesOptions {
1018
+ enabled?: boolean;
1019
+ missing?: CrossReferenceFailureMode;
1020
+ duplicates?: CrossReferenceFailureMode;
1021
+ mismatches?: CrossReferenceFailureMode;
1022
+ labels?: CrossReferenceLabelOptions;
1023
+ }
1024
+ interface ResolvedCrossReferencesOptions {
1025
+ enabled: boolean;
1026
+ missing: CrossReferenceFailureMode;
1027
+ duplicates: CrossReferenceFailureMode;
1028
+ mismatches: CrossReferenceFailureMode;
1029
+ labels: Required<CrossReferenceLabelOptions>;
1030
+ }
1031
+ interface CrossReferenceEntry {
1032
+ id: string;
1033
+ kind: CrossReferenceKind;
1034
+ number: string;
1035
+ label: string;
1036
+ text: string;
1037
+ href: string;
1038
+ title?: string;
1039
+ }
1040
+ //#endregion
1041
+ //#region src/citation-types.d.ts
1042
+ type CitationFailureMode = "error" | "warn";
1043
+ interface CitationsOptions {
1044
+ enabled?: boolean;
1045
+ bibliography?: string | string[];
1046
+ rootDir?: string;
1047
+ appendBibliography?: boolean;
1048
+ missing?: CitationFailureMode;
1049
+ duplicates?: CitationFailureMode;
1050
+ malformed?: CitationFailureMode;
1051
+ bibliographyTitle?: string;
1052
+ }
1053
+ interface ResolvedCitationsOptions {
1054
+ enabled: boolean;
1055
+ bibliography: string[];
1056
+ rootDir?: string;
1057
+ appendBibliography: boolean;
1058
+ missing: CitationFailureMode;
1059
+ duplicates: CitationFailureMode;
1060
+ malformed: CitationFailureMode;
1061
+ bibliographyTitle: string;
1062
+ }
1063
+ interface CitationReference {
1064
+ id: string;
1065
+ key: string;
1066
+ index: number;
1067
+ label: string;
1068
+ href: string;
1069
+ bibliographyId: string;
1070
+ suppressAuthor: boolean;
1071
+ }
1072
+ interface BibliographyEntry {
1073
+ key: string;
1074
+ id: string;
1075
+ index: number;
1076
+ label: string;
1077
+ title: string;
1078
+ authors: string[];
1079
+ year?: string;
1080
+ url?: string;
1081
+ doi?: string;
1082
+ html: string;
1083
+ }
1084
+ //#endregion
1085
+ //#region src/budoux-types.d.ts
1086
+ type BudouxLanguage = "ja" | "zh-hans" | "zh-hant" | "th";
1087
+ interface BudouxParser {
1088
+ parse(text: string): string[];
1089
+ }
1090
+ interface BudouxOptions {
1091
+ /**
1092
+ * Enable build-time BudouX segmentation when an options object is supplied.
1093
+ *
1094
+ * @default true
1095
+ */
1096
+ enabled?: boolean;
1097
+ /**
1098
+ * Default BudouX parser language.
1099
+ *
1100
+ * @default "ja"
1101
+ */
1102
+ language?: BudouxLanguage;
1103
+ /**
1104
+ * Separator inserted between BudouX phrases.
1105
+ *
1106
+ * @default "\u200b"
1107
+ */
1108
+ separator?: string;
1109
+ /**
1110
+ * Custom build-time parser. When supplied, ox-content does not import the
1111
+ * `budoux` package.
1112
+ */
1113
+ parser?: BudouxParser;
1114
+ }
1115
+ interface ResolvedBudouxOptions {
1116
+ enabled: boolean;
1117
+ language: BudouxLanguage;
1118
+ separator: string;
1119
+ parser?: BudouxParser;
1120
+ }
1121
+ //#endregion
660
1122
  //#region src/page-context.d.ts
661
1123
  /**
662
1124
  * Base page props available for all pages.
@@ -672,10 +1134,17 @@ interface BasePageProps {
672
1134
  toc: TocEntry[];
673
1135
  /** Last git commit timestamp in milliseconds */
674
1136
  lastUpdated?: number;
1137
+ /** Unique git authors for this page */
1138
+ contributors?: Array<{
1139
+ name: string;
1140
+ avatar?: string;
1141
+ }>;
675
1142
  /** Source file path (relative to docs root) */
676
1143
  path: string;
677
1144
  /** Output URL path */
678
1145
  url: string;
1146
+ /** Published Markdown companion URL when `ssg.markdownSource` is on */
1147
+ markdownSource?: string;
679
1148
  /** Raw frontmatter object */
680
1149
  frontmatter: Record<string, unknown>;
681
1150
  /** Layout name from frontmatter */
@@ -872,10 +1341,17 @@ interface PageData {
872
1341
  toc: TocEntry[];
873
1342
  /** Last git commit timestamp in milliseconds */
874
1343
  lastUpdated?: number;
1344
+ /** Unique git authors for this page */
1345
+ contributors?: Array<{
1346
+ name: string;
1347
+ avatar?: string;
1348
+ }>;
875
1349
  /** Source file path */
876
1350
  path: string;
877
1351
  /** Output URL path */
878
1352
  url: string;
1353
+ /** Published Markdown companion URL when `ssg.markdownSource` is on */
1354
+ markdownSource?: string;
879
1355
  /** Frontmatter */
880
1356
  frontmatter: Record<string, unknown>;
881
1357
  /** Layout name */
@@ -1082,6 +1558,21 @@ interface SsgOptions {
1082
1558
  * @default '.html'
1083
1559
  */
1084
1560
  extension?: string;
1561
+ /**
1562
+ * Mount generated page routes under this path, independent from `base` and
1563
+ * `outDir`.
1564
+ *
1565
+ * `blog`, `/blog`, and `/blog/` all mount under `/blog`. Page HTML and
1566
+ * page-level assets follow the prefix. Root host files (`_redirects`,
1567
+ * `_headers`, root feeds, sitemap index) stay at `outDir`. `base` remains
1568
+ * the public deployment prefix and is not used as an output mount.
1569
+ * Frontmatter `permalink` still wins when permalinks are enabled.
1570
+ *
1571
+ * Off when omitted.
1572
+ *
1573
+ * @default undefined
1574
+ */
1575
+ routePrefix?: string;
1085
1576
  /**
1086
1577
  * Remove previously generated files from the output directory before writing
1087
1578
  * the new SSG result.
@@ -1187,6 +1678,17 @@ interface SsgOptions {
1187
1678
  * @default false
1188
1679
  */
1189
1680
  lastUpdated?: boolean;
1681
+ /**
1682
+ * List unique git authors for each page.
1683
+ *
1684
+ * Off by default. `true` enables names only. An object enables the
1685
+ * feature and can set `ignore` and `avatars`. Missing `.git` (for
1686
+ * example a published tarball) yields an empty list and does not
1687
+ * fail the build.
1688
+ *
1689
+ * @default false
1690
+ */
1691
+ contributors?: boolean | ContributorsOptions;
1190
1692
  /**
1191
1693
  * Show previous/next page links after the article.
1192
1694
  *
@@ -1206,6 +1708,26 @@ interface SsgOptions {
1206
1708
  * @default false
1207
1709
  */
1208
1710
  breadcrumbs?: boolean | Record<string, unknown>;
1711
+ /**
1712
+ * Emit JSON-LD structured data (`TechArticle`, `WebSite`, and optional
1713
+ * `BreadcrumbList`) in the page `<head>`.
1714
+ *
1715
+ * Disabled when omitted or `false`. `true` enables the defaults. An object
1716
+ * enables the feature and can hide BreadcrumbList or supply a publisher.
1717
+ * Publisher fields the site does not set are not invented.
1718
+ *
1719
+ * @default false
1720
+ */
1721
+ jsonLd?: boolean | JsonLdOptions;
1722
+ /**
1723
+ * Validate custom page-head descriptors during SSG.
1724
+ *
1725
+ * `false` / omitted drops invalid values silently. `warn` logs them.
1726
+ * `strict` fails the build on unsafe URLs or invalid hreflang.
1727
+ *
1728
+ * @default false
1729
+ */
1730
+ headValidation?: false | "warn" | "strict";
1209
1731
  /**
1210
1732
  * Opt-in copy buttons, outbound-link icons, and a back-to-top control.
1211
1733
  *
@@ -1246,6 +1768,21 @@ interface SsgOptions {
1246
1768
  * @default false
1247
1769
  */
1248
1770
  pageChrome?: boolean | Record<string, unknown>;
1771
+ /**
1772
+ * Publish the original Markdown beside each generated HTML page.
1773
+ *
1774
+ * Off by default. `true` writes a `.md` companion using the published URL
1775
+ * (permalink, locale, base, and output directory) and adds
1776
+ * `<link rel="alternate" type="text/markdown">`. An object enables the
1777
+ * feature and can turn the alternate link off, or opt in to the default
1778
+ * theme's Copy as Markdown control.
1779
+ *
1780
+ * The companion is a byte-for-byte copy of the source file, including
1781
+ * frontmatter. Draft and unlisted pages are never written.
1782
+ *
1783
+ * @default false
1784
+ */
1785
+ markdownSource?: boolean | MarkdownSourceOptions;
1249
1786
  /**
1250
1787
  * Write a themed 404 page during SSG.
1251
1788
  *
@@ -1267,6 +1804,27 @@ interface SsgOptions {
1267
1804
  * @default false
1268
1805
  */
1269
1806
  team?: boolean | TeamOptions;
1807
+ /**
1808
+ * Opt-in blog index, authors, tags, reading time, and archive.
1809
+ *
1810
+ * Off by default. `true` enables defaults. An object enables the feature
1811
+ * and overrides only the fields you set. Top-level `blog` wins when both
1812
+ * are set.
1813
+ *
1814
+ * @default false
1815
+ */
1816
+ blog?: boolean | BlogOptions;
1817
+ /**
1818
+ * Generate a static index for directories that have child pages but no
1819
+ * `index.md` / `index.mdx`.
1820
+ *
1821
+ * Off by default. `true` enables card listings. An object enables the
1822
+ * feature and can switch the listing to `list`. Existing content indexes
1823
+ * are never overwritten.
1824
+ *
1825
+ * @default false
1826
+ */
1827
+ sectionIndex?: boolean | SectionIndexOptions;
1270
1828
  /**
1271
1829
  * Absolute site URL used when generating social metadata.
1272
1830
  *
@@ -1362,12 +1920,66 @@ interface A11yOptions {
1362
1920
  type ResolvedA11y = false | {
1363
1921
  skipLinkLabel: string;
1364
1922
  };
1923
+ /**
1924
+ * Per-control flags for `ssg.jsonLd`.
1925
+ *
1926
+ * Omitted fields keep the defaults when the feature itself is enabled.
1927
+ */
1928
+ interface JsonLdOptions {
1929
+ /**
1930
+ * Emit `BreadcrumbList` when a visible breadcrumb trail exists.
1931
+ *
1932
+ * @default true
1933
+ */
1934
+ breadcrumbs?: boolean;
1935
+ /**
1936
+ * Optional publisher. Only configured `name` / `url` are written.
1937
+ * Logo and other Organization fields are never invented.
1938
+ */
1939
+ publisher?: JsonLdPublisherOptions;
1940
+ /**
1941
+ * Page `@type`. Defaults to `TechArticle`.
1942
+ */
1943
+ type?: JsonLdPageType;
1944
+ /**
1945
+ * Extra `@graph` nodes. Only objects are kept. The build does not invent
1946
+ * fields inside them.
1947
+ */
1948
+ graph?: Record<string, unknown>[];
1949
+ }
1950
+ /** JSON-LD page node `@type`. Unknown values fall back to `TechArticle`. */
1951
+ type JsonLdPageType = "TechArticle" | "BlogPosting" | "WebPage";
1952
+ /**
1953
+ * Optional JSON-LD publisher. Empty or omitted fields are left out.
1954
+ */
1955
+ interface JsonLdPublisherOptions {
1956
+ /** Organization name. */
1957
+ name?: string;
1958
+ /** Organization URL. `javascript:` and other unsafe schemes are dropped. */
1959
+ url?: string;
1960
+ }
1961
+ /**
1962
+ * Resolved JSON-LD options. `false` means no `<script type="application/ld+json">`.
1963
+ */
1964
+ type ResolvedJsonLd = false | {
1965
+ breadcrumbs: boolean;
1966
+ publisher?: {
1967
+ name?: string;
1968
+ url?: string;
1969
+ };
1970
+ type?: JsonLdPageType;
1971
+ graph?: Record<string, unknown>[];
1972
+ };
1365
1973
  /**
1366
1974
  * Resolved SSG options.
1367
1975
  */
1368
1976
  interface ResolvedSsgOptions {
1369
1977
  enabled: boolean;
1370
1978
  extension: string;
1979
+ /**
1980
+ * Present after `resolveSsgOptions`. Omitted / empty means off.
1981
+ */
1982
+ routePrefix?: string;
1371
1983
  clean: boolean;
1372
1984
  bare: boolean;
1373
1985
  render?: ThemeComponent;
@@ -1379,12 +1991,25 @@ interface ResolvedSsgOptions {
1379
1991
  ogImage?: string;
1380
1992
  generateOgImage: boolean;
1381
1993
  lastUpdated: boolean;
1994
+ /**
1995
+ * Present after `resolveSsgOptions`. Omitted in hand-built fixtures means off.
1996
+ */
1997
+ contributors?: ResolvedContributors;
1382
1998
  pagination: boolean;
1383
1999
  breadcrumbs: boolean;
2000
+ jsonLd: ResolvedJsonLd;
2001
+ /**
2002
+ * Present after `resolveSsgOptions`. Omitted / `false` means off.
2003
+ */
2004
+ headValidation?: false | "warn" | "strict";
1384
2005
  readerChrome: ResolvedReaderChrome;
1385
2006
  localeSwitcher: boolean;
1386
2007
  a11y: ResolvedA11y;
1387
2008
  pageChrome: boolean;
2009
+ /**
2010
+ * Present after `resolveSsgOptions`. Omitted in hand-built fixtures means off.
2011
+ */
2012
+ markdownSource?: ResolvedMarkdownSourceOptions;
1388
2013
  /**
1389
2014
  * Present after `resolveSsgOptions`. Omitted in hand-built fixtures means off.
1390
2015
  */
@@ -1393,6 +2018,11 @@ interface ResolvedSsgOptions {
1393
2018
  * Present after `resolveSsgOptions`. Omitted in hand-built fixtures means off.
1394
2019
  */
1395
2020
  team?: ResolvedTeamOptions;
2021
+ /**
2022
+ * Present after `resolveSsgOptions`. Omitted in hand-built fixtures means off.
2023
+ */
2024
+ blog?: ResolvedBlogOptions;
2025
+ sectionIndex?: ResolvedSectionIndexOptions;
1396
2026
  siteUrl?: string;
1397
2027
  theme?: ResolvedThemeConfig;
1398
2028
  navigation?: SsgNavigationGroup[];
@@ -1445,6 +2075,29 @@ interface TeamMember {
1445
2075
  /**
1446
2076
  * Opt-in team / members page.
1447
2077
  */
2078
+ /**
2079
+ * Opt-in git contributor list.
2080
+ */
2081
+ interface ContributorsOptions {
2082
+ /**
2083
+ * Author names or emails to omit. Comparison is case-insensitive and
2084
+ * matches the full name or the full email.
2085
+ */
2086
+ ignore?: string[];
2087
+ /**
2088
+ * When true and a git author email is present, render a Gravatar
2089
+ * image from the MD5 of that email. The raw email is never written
2090
+ * into HTML. Default is names only.
2091
+ */
2092
+ avatars?: boolean;
2093
+ }
2094
+ /**
2095
+ * Resolved git contributor list. `false` means the feature is off.
2096
+ */
2097
+ type ResolvedContributors = false | {
2098
+ ignore: string[];
2099
+ avatars: boolean;
2100
+ };
1448
2101
  interface TeamOptions {
1449
2102
  /**
1450
2103
  * People rendered as static cards on `layout: team` pages.
@@ -1460,7 +2113,140 @@ interface ResolvedTeamOptions {
1460
2113
  members: TeamMember[];
1461
2114
  }
1462
2115
  /**
1463
- * Opt-in crawl manifests written during SSG.
2116
+ * Listing style for a generated section index.
2117
+ */
2118
+ type SectionIndexStyle = "list" | "cards";
2119
+ /**
2120
+ * Opt-in generated section index pages.
2121
+ */
2122
+ interface SectionIndexOptions {
2123
+ /**
2124
+ * How children are rendered. `cards` is the default when the feature is on.
2125
+ * @default "cards"
2126
+ */
2127
+ style?: SectionIndexStyle;
2128
+ }
2129
+ /**
2130
+ * Resolved generated section index options.
2131
+ */
2132
+ interface ResolvedSectionIndexOptions {
2133
+ enabled: boolean;
2134
+ style: SectionIndexStyle;
2135
+ }
2136
+ /**
2137
+ * Opt-in web app manifest and service worker written during SSG.
2138
+ *
2139
+ * Enabling `offline` (the default when the feature is on) injects a tiny
2140
+ * client script that registers `sw.js`. Set `offline: false` to keep the
2141
+ * manifest without that script.
2142
+ */
2143
+ interface PwaOptions {
2144
+ /**
2145
+ * Write `sw.js` and register it from themed pages.
2146
+ * @default true
2147
+ */
2148
+ offline?: boolean;
2149
+ /**
2150
+ * Manifest `name`. Falls back to `ssg.siteName` when omitted.
2151
+ */
2152
+ name?: string;
2153
+ /**
2154
+ * Manifest `short_name`. Falls back to `name` when omitted.
2155
+ */
2156
+ shortName?: string;
2157
+ /**
2158
+ * Manifest / meta theme color. Hex (`#rgb` / `#rrggbb`) or a CSS color name.
2159
+ * @default "#000000"
2160
+ */
2161
+ themeColor?: string;
2162
+ /**
2163
+ * Manifest background color. Hex or a CSS color name.
2164
+ * @default "#ffffff"
2165
+ */
2166
+ backgroundColor?: string;
2167
+ /**
2168
+ * Manifest `start_url`. Same-origin site paths only (`/`, `/docs/`).
2169
+ * Defaults to the Vite `base`.
2170
+ */
2171
+ startUrl?: string;
2172
+ }
2173
+ /**
2174
+ * Resolved PWA options.
2175
+ */
2176
+ interface ResolvedPwaOptions {
2177
+ enabled: boolean;
2178
+ offline: boolean;
2179
+ name?: string;
2180
+ shortName?: string;
2181
+ themeColor?: string;
2182
+ backgroundColor?: string;
2183
+ startUrl?: string;
2184
+ }
2185
+ /**
2186
+ * Opt-in self-hosted Iconify CSS for used icons.
2187
+ *
2188
+ * Off by default. When enabled, the SSG build resolves Iconify names from
2189
+ * installed `@iconify/json` or `@iconify-json/*` packages and emits CSS
2190
+ * masks so the published site does not request `api.iconify.design`.
2191
+ */
2192
+ interface IconsOptions {
2193
+ /**
2194
+ * CSS emission mode.
2195
+ * @default "css-mask"
2196
+ */
2197
+ mode?: "css-mask";
2198
+ /**
2199
+ * Class syntax. `"unocss"` emits `icon-[prefix--name]`.
2200
+ * @default "unocss"
2201
+ */
2202
+ syntax?: "unocss";
2203
+ /**
2204
+ * Glob patterns to scan, or explicit `prefix:name` icons.
2205
+ * Entries that look like Iconify names are used as-is (no scan).
2206
+ */
2207
+ include?: string[];
2208
+ /**
2209
+ * Iconify names that are always emitted, even when no source mentions them.
2210
+ */
2211
+ safelist?: string[];
2212
+ }
2213
+ /**
2214
+ * Resolved icon asset options.
2215
+ */
2216
+ interface ResolvedIconsOptions {
2217
+ enabled: boolean;
2218
+ mode: "css-mask";
2219
+ syntax: "unocss";
2220
+ include: string[];
2221
+ safelist: string[];
2222
+ }
2223
+ /**
2224
+ * Opt-in Markdown source companions written beside generated HTML.
2225
+ */
2226
+ interface MarkdownSourceOptions {
2227
+ /**
2228
+ * Add `<link rel="alternate" type="text/markdown">` to generated HTML.
2229
+ * @default true
2230
+ */
2231
+ alternate?: boolean;
2232
+ /**
2233
+ * Show a page-level Copy as Markdown control in the default theme.
2234
+ * The control copies or opens the published companion bytes, including
2235
+ * frontmatter. Off unless set, even when companions are enabled.
2236
+ * @default false
2237
+ */
2238
+ copy?: boolean;
2239
+ }
2240
+ /**
2241
+ * Resolved Markdown source-companion options.
2242
+ */
2243
+ interface ResolvedMarkdownSourceOptions {
2244
+ enabled: boolean;
2245
+ alternate: boolean;
2246
+ copy: boolean;
2247
+ }
2248
+ /**
2249
+ * Opt-in crawl manifests written during SSG.
1464
2250
  */
1465
2251
  interface SiteMapsOptions {
1466
2252
  /**
@@ -1548,6 +2334,13 @@ interface CascadeOptions {
1548
2334
  interface ResolvedCascadeOptions {
1549
2335
  enabled: boolean;
1550
2336
  }
2337
+ /**
2338
+ * Host that consumes the generated `_redirects` file.
2339
+ *
2340
+ * Both values write the same `_redirects` body today. The distinct names
2341
+ * leave room for provider-specific limits and diagnostics later.
2342
+ */
2343
+ type RedirectProvider = "netlify" | "cloudflare";
1551
2344
  /**
1552
2345
  * Opt-in static redirects, aliases, and path rewrites.
1553
2346
  *
@@ -1562,10 +2355,13 @@ interface RedirectsOptions {
1562
2355
  */
1563
2356
  map?: Record<string, string>;
1564
2357
  /**
1565
- * Write a Netlify / Cloudflare `_redirects` file next to the HTML pages.
1566
- * @default false
2358
+ * Host that should receive a `_redirects` file.
2359
+ *
2360
+ * Omit the field to detect `CF_PAGES=1`, `WORKERS_CI=1`, or `NETLIFY=true`.
2361
+ * Local builds and GitHub Actions should set this explicitly. HTML redirect
2362
+ * pages are independent of this selector.
1567
2363
  */
1568
- netlify?: boolean;
2364
+ provider?: RedirectProvider;
1569
2365
  /**
1570
2366
  * Write a `_headers` Location map next to the HTML pages.
1571
2367
  * @default false
@@ -1576,6 +2372,14 @@ interface RedirectsOptions {
1576
2372
  * @default false
1577
2373
  */
1578
2374
  json?: boolean;
2375
+ /**
2376
+ * Write static HTML fallback pages for ordinary redirect sources.
2377
+ *
2378
+ * Set `false` when the selected host should consume `_redirects` directly.
2379
+ * Wildcard sources never write HTML pages because they are host-rule syntax.
2380
+ * @default true
2381
+ */
2382
+ html?: boolean;
1579
2383
  /**
1580
2384
  * Allow `http://` and `https://` destinations. `javascript:`, `data:`, and
1581
2385
  * protocol-relative `//` targets stay rejected.
@@ -1589,29 +2393,80 @@ interface RedirectsOptions {
1589
2393
  interface ResolvedRedirectsOptions {
1590
2394
  enabled: boolean;
1591
2395
  map: Record<string, string>;
1592
- netlify: boolean;
2396
+ provider?: RedirectProvider;
1593
2397
  headers: boolean;
1594
2398
  json: boolean;
2399
+ html: boolean;
1595
2400
  allowExternal: boolean;
1596
2401
  }
1597
2402
  /**
1598
2403
  * Feed file formats written during SSG.
1599
2404
  */
1600
2405
  type FeedFormat = "rss" | "atom" | "json";
2406
+ /** One feed item author accepted by programmatic feeds. */
2407
+ interface FeedItemAuthor {
2408
+ name: string;
2409
+ url?: string;
2410
+ }
2411
+ type FeedItemAuthorInput = string | FeedItemAuthor;
2412
+ /** One JSON Feed / enclosure attachment accepted by programmatic feeds. */
2413
+ interface FeedItemAttachment {
2414
+ url: string;
2415
+ mimeType?: string;
2416
+ title?: string;
2417
+ sizeInBytes?: number;
2418
+ durationInSeconds?: number;
2419
+ }
2420
+ /** One collection or programmatic item considered for a generated feed. */
2421
+ interface FeedItemInput {
2422
+ title?: string;
2423
+ description?: string;
2424
+ content?: string;
2425
+ path?: string;
2426
+ loc?: string;
2427
+ url?: string;
2428
+ id?: string;
2429
+ date?: unknown;
2430
+ lastUpdated?: unknown;
2431
+ draft?: unknown;
2432
+ unlisted?: unknown;
2433
+ author?: FeedItemAuthorInput;
2434
+ authors?: readonly FeedItemAuthorInput[];
2435
+ image?: string;
2436
+ attachments?: readonly FeedItemAttachment[];
2437
+ language?: string;
2438
+ frontmatter?: Record<string, unknown>;
2439
+ }
2440
+ interface FeedItemsResolveContext {
2441
+ name?: string;
2442
+ formats: readonly FeedFormat[];
2443
+ path: string;
2444
+ siteUrl?: string;
2445
+ siteName?: string;
2446
+ siteDescription?: string;
2447
+ base: string;
2448
+ outDir?: string;
2449
+ }
2450
+ type FeedItemsSource = readonly FeedItemInput[] | ((context: FeedItemsResolveContext) => readonly FeedItemInput[] | Promise<readonly FeedItemInput[]>);
1601
2451
  /**
1602
- * Opt-in RSS / Atom / JSON Feed files written during SSG.
2452
+ * One feed's formats, source, output path, and channel metadata.
1603
2453
  */
1604
- interface FeedsOptions {
2454
+ interface FeedChannelOptions {
1605
2455
  /**
1606
2456
  * Feed formats to write.
1607
2457
  * @default ["rss", "atom", "json"]
1608
2458
  */
1609
- formats?: FeedFormat[];
2459
+ formats?: readonly FeedFormat[];
1610
2460
  /**
1611
2461
  * Named collection to publish. Defaults to `content`, or the first
1612
2462
  * configured collection when `content` is absent.
1613
2463
  */
1614
2464
  collection?: string;
2465
+ /**
2466
+ * Programmatic items for this channel. A channel may set either
2467
+ * `collection` or `items`, not both.
2468
+ */
2469
+ items?: FeedItemsSource;
1615
2470
  /**
1616
2471
  * Maximum number of published items, newest first.
1617
2472
  * @default 20
@@ -1622,16 +2477,130 @@ interface FeedsOptions {
1622
2477
  * @default "/"
1623
2478
  */
1624
2479
  path?: string;
2480
+ /** Channel title. Defaults to the SSG site name. */
2481
+ title?: string;
2482
+ /** Channel description. Defaults to the SSG site description. */
2483
+ description?: string;
2484
+ /** Channel language (`en`, `ja`, …). Omitted when unset. */
2485
+ language?: string;
2486
+ /** Channel image URL (RSS image / Atom logo / JSON Feed icon). */
2487
+ image?: string;
2488
+ /** Favicon URL (Atom icon / JSON Feed favicon). */
2489
+ favicon?: string;
2490
+ /** Copyright / rights notice. Omitted from JSON Feed. */
2491
+ copyright?: string;
1625
2492
  }
1626
2493
  /**
1627
- * Resolved feed options.
2494
+ * Opt-in RSS / Atom / JSON Feed files written during SSG.
2495
+ *
2496
+ * A single object is one default feed. A named record or array writes
2497
+ * multiple feeds with their own paths and channel metadata.
1628
2498
  */
1629
- interface ResolvedFeedsOptions {
1630
- enabled: boolean;
1631
- formats: FeedFormat[];
2499
+ type FeedsOptions = FeedChannelOptions | readonly FeedChannelOptions[] | {
2500
+ [name: string]: FeedChannelOptions;
2501
+ };
2502
+ /**
2503
+ * One resolved feed channel.
2504
+ */
2505
+ interface ResolvedFeedChannel {
2506
+ name?: string;
2507
+ formats: readonly FeedFormat[];
1632
2508
  collection?: string;
2509
+ items?: FeedItemsSource;
1633
2510
  limit: number;
1634
2511
  path: string;
2512
+ title?: string;
2513
+ description?: string;
2514
+ language?: string;
2515
+ image?: string;
2516
+ favicon?: string;
2517
+ copyright?: string;
2518
+ }
2519
+ /**
2520
+ * Resolved feed options.
2521
+ *
2522
+ * Legacy `true` / single-object configs keep one channel on the top-level
2523
+ * fields. A named record or array also sets `feeds` to every channel.
2524
+ */
2525
+ interface ResolvedFeedsOptions extends ResolvedFeedChannel {
2526
+ enabled: boolean;
2527
+ feeds?: ResolvedFeedChannel[];
2528
+ }
2529
+ /**
2530
+ * One person in the `blog.authors` map.
2531
+ */
2532
+ interface BlogAuthor {
2533
+ /** Display name. Escaped in HTML. */
2534
+ name: string;
2535
+ /** Optional short bio. Escaped in HTML. */
2536
+ bio?: string;
2537
+ /** Profile URL. Only `https:` or a site-relative `/` path is emitted. */
2538
+ url?: string;
2539
+ }
2540
+ /**
2541
+ * Opt-in blog index, authors, tags, reading time, and archive.
2542
+ */
2543
+ interface BlogOptions {
2544
+ /**
2545
+ * Named collection of posts. Defaults to a collection named `blog`, or
2546
+ * the only configured collection. Required when several collections exist
2547
+ * and none is named `blog`.
2548
+ */
2549
+ collection?: string;
2550
+ /**
2551
+ * Author records keyed by the frontmatter `author` / `authors` value.
2552
+ * @default {}
2553
+ */
2554
+ authors?: Record<string, BlogAuthor>;
2555
+ /**
2556
+ * Posts per index page, newest first.
2557
+ * @default 10
2558
+ */
2559
+ pageSize?: number;
2560
+ /**
2561
+ * External RSS / Atom sources merged into the blog index at build time.
2562
+ * Empty / omitted fetches nothing. Only these URLs are requested.
2563
+ * @default []
2564
+ */
2565
+ feeds?: Array<string | BlogFeedSource>;
2566
+ }
2567
+ /**
2568
+ * One configured external blog feed.
2569
+ */
2570
+ interface BlogFeedSource {
2571
+ /** Absolute `https:` feed URL. */
2572
+ url: string;
2573
+ /** Default language applied when an item omits one. */
2574
+ language?: string;
2575
+ /** Default author applied when an item omits one. */
2576
+ author?: string;
2577
+ /**
2578
+ * Failed fetch / parse handling for this source.
2579
+ * `warn` skips the source. `error` fails the build after other sources run.
2580
+ * @default "warn"
2581
+ */
2582
+ onError?: BlogFeedFailurePolicy;
2583
+ }
2584
+ /** How a failed external feed source is reported. */
2585
+ type BlogFeedFailurePolicy = "warn" | "error";
2586
+ /**
2587
+ * Resolved blog options.
2588
+ */
2589
+ interface ResolvedBlogOptions {
2590
+ enabled: boolean;
2591
+ collection?: string;
2592
+ authors: Record<string, BlogAuthor>;
2593
+ pageSize: number;
2594
+ feeds: ResolvedBlogFeedSource[];
2595
+ }
2596
+ /**
2597
+ * Resolved external blog feed source.
2598
+ */
2599
+ interface ResolvedBlogFeedSource {
2600
+ url: string;
2601
+ language?: string;
2602
+ author?: string;
2603
+ onError: BlogFeedFailurePolicy;
1635
2604
  }
1636
2605
  /**
1637
2606
  * Opt-in term list pages, per-term pages, and related-page lists.
@@ -1830,6 +2799,18 @@ interface OxContentOptions {
1830
2799
  * @default false
1831
2800
  */
1832
2801
  redirects?: boolean | RedirectsOptions | Record<string, string>;
2802
+ /**
2803
+ * Write a paginated blog index, tag pages, and yearly/monthly archive,
2804
+ * and inject author / reading-time chrome on posts.
2805
+ *
2806
+ * Off by default. `true` uses the `blog` collection when it exists,
2807
+ * otherwise the only configured collection, with pageSize 10.
2808
+ * An object enables the feature and overrides only the fields you set.
2809
+ * Also accepted as `ssg.blog`; the top-level option wins when both are set.
2810
+ *
2811
+ * @default false
2812
+ */
2813
+ blog?: boolean | BlogOptions;
1833
2814
  /**
1834
2815
  * Write RSS, Atom, and/or JSON Feed files from a named collection.
1835
2816
  *
@@ -1842,6 +2823,29 @@ interface OxContentOptions {
1842
2823
  * @default false
1843
2824
  */
1844
2825
  feeds?: boolean | FeedsOptions;
2826
+ /**
2827
+ * Write a web app manifest and an optional service worker.
2828
+ *
2829
+ * Off by default. `true` writes `manifest.webmanifest` and `sw.js`, and
2830
+ * injects a tiny client script that registers the worker on themed pages.
2831
+ * An object enables the feature and can set `offline: false` to keep the
2832
+ * manifest without caching or that script. This adds client JavaScript
2833
+ * when offline is on. Requires `ssg.siteUrl`. When that is missing the
2834
+ * build continues and a warning is emitted instead of writing files.
2835
+ *
2836
+ * @default false
2837
+ */
2838
+ pwa?: boolean | PwaOptions;
2839
+ /**
2840
+ * Generate self-hosted Iconify CSS for used and safelisted icons.
2841
+ *
2842
+ * Off by default. `true` or `{}` enables CSS-mask emission. Install
2843
+ * `@iconify/json` or individual `@iconify-json/*` packages so the build
2844
+ * can resolve collections without a network request.
2845
+ *
2846
+ * @default false
2847
+ */
2848
+ icons?: boolean | IconsOptions;
1845
2849
  /**
1846
2850
  * Write tag/category term pages and inject related-page lists.
1847
2851
  *
@@ -1884,6 +2888,17 @@ interface OxContentOptions {
1884
2888
  * @default true
1885
2889
  */
1886
2890
  footnotes?: boolean;
2891
+ /**
2892
+ * Render footnotes as a semantic ordered section with numeric markers.
2893
+ *
2894
+ * Source identifiers are used only for lookup and slugs. Visible markers
2895
+ * are 1, 2, … in document order, and definitions emit as
2896
+ * `<section class="footnotes"><ol><li>…`.
2897
+ *
2898
+ * Off by default so current alpha HTML stays stable.
2899
+ * @default false
2900
+ */
2901
+ semanticFootnotes?: boolean;
1887
2902
  /**
1888
2903
  * Enable tables.
1889
2904
  * @default true
@@ -1908,9 +2923,9 @@ interface OxContentOptions {
1908
2923
  * Enable syntax highlighting for code blocks.
1909
2924
  *
1910
2925
  * When true, fenced and language-tagged inline code is highlighted with the
1911
- * native tree-sitter engine. Token colors are `--octc-shiki-*` custom
1912
- * properties (the `shiki` prefix is historical) so theme-color packages keep
1913
- * working. Languages with no native grammar stay unhighlighted.
2926
+ * native tree-sitter engine. Token colors are `--octc-syntax-*` custom
2927
+ * properties so theme-color packages resolve highlighting. Languages with no
2928
+ * native grammar stay unhighlighted.
1914
2929
  *
1915
2930
  * @default false
1916
2931
  */
@@ -1960,6 +2975,42 @@ interface OxContentOptions {
1960
2975
  * @default false
1961
2976
  */
1962
2977
  attrs?: boolean | AttrsOptions;
2978
+ /**
2979
+ * Opt-in labeled cross-references for headings, figures/images, and tables.
2980
+ *
2981
+ * References such as `@sec-install`, `@fig-pipeline`, and `@tbl-options`
2982
+ * become links to matching `id` attributes generated by `attrs` or native
2983
+ * Markdown rendering. Missing labels, duplicate labels, and prefix/type
2984
+ * mismatches fail by default and can be downgraded to warnings.
2985
+ *
2986
+ * @default false
2987
+ */
2988
+ crossReferences?: boolean | CrossReferencesOptions;
2989
+ /**
2990
+ * Alias for `crossReferences`.
2991
+ *
2992
+ * @default false
2993
+ */
2994
+ xrefs?: boolean | CrossReferencesOptions;
2995
+ /**
2996
+ * Opt-in bibliography-backed citation references.
2997
+ *
2998
+ * References such as `[@rfc9110]` and `[@smith2024; @doe2023]` become
2999
+ * links to generated bibliography entries loaded from local CSL JSON files.
3000
+ *
3001
+ * @default false
3002
+ */
3003
+ citations?: boolean | CitationsOptions;
3004
+ /**
3005
+ * Opt-in build-time BudouX phrase segmentation.
3006
+ *
3007
+ * Inserts zero-width spaces into visible prose so Japanese text gets better
3008
+ * line-break opportunities without shipping the BudouX parser to the browser.
3009
+ * Install `budoux` when enabling the default parser, or pass a custom parser.
3010
+ *
3011
+ * @default false
3012
+ */
3013
+ budoux?: boolean | BudouxOptions;
1963
3014
  /**
1964
3015
  * Opt-in `{badge:variant}` inline badges.
1965
3016
  *
@@ -1969,6 +3020,62 @@ interface OxContentOptions {
1969
3020
  * @default false
1970
3021
  */
1971
3022
  badges?: boolean | BadgeOptions;
3023
+ /**
3024
+ * Opt-in `<NotByAI />` authorship disclosure badge.
3025
+ *
3026
+ * Passing `true` or an options object emits the official Not By AI light/dark
3027
+ * artwork as static HTML. This is not a status badge — see `badges` for
3028
+ * `{badge:tip}` labels. Disabled when omitted. Fenced, indented, and inline
3029
+ * code plus HTML comments are skipped.
3030
+ *
3031
+ * @default false
3032
+ */
3033
+ notByAi?: boolean | NotByAiOptions;
3034
+ /**
3035
+ * Opt-in `{kbd:...}` inline keyboard keys.
3036
+ *
3037
+ * Passing `true` or an options object enables `{kbd:Ctrl+K}` and
3038
+ * `{kbd:Cmd Shift P}`. Key labels are HTML-escaped. Fenced, indented,
3039
+ * inline, and raw code, plus HTML comments, are skipped. Aliases come
3040
+ * from build config, not the runtime user agent.
3041
+ *
3042
+ * @default false
3043
+ */
3044
+ keyboardKeys?: boolean | KeyboardKeysOptions;
3045
+ /**
3046
+ * Opt-in abbreviation and glossary expansion.
3047
+ *
3048
+ * Passing `true` or an options object expands `*[LSP]: Language Server Protocol`
3049
+ * and config `terms` into `<abbr class="ox-abbr">`. Matching uses Unicode word
3050
+ * boundaries. Fenced, indented, inline, and raw code, HTML comments, and
3051
+ * existing links are skipped. There is no client JavaScript.
3052
+ *
3053
+ * @default false
3054
+ */
3055
+ abbreviations?: boolean | AbbreviationsOptions;
3056
+ /**
3057
+ * Opt-in PHP Markdown Extra / mdBook-style definition lists.
3058
+ *
3059
+ * Passing `true` or an options object turns
3060
+ * `Term` / `: definition` source into semantic `<dl>` markup.
3061
+ * Disabled when omitted. Fenced, indented, and inline code are skipped.
3062
+ * Invalid or ambiguous forms stay ordinary paragraphs or lists.
3063
+ *
3064
+ * @default false
3065
+ */
3066
+ definitionLists?: boolean | DefinitionListOptions;
3067
+ /**
3068
+ * Opt-in `{link:...}` rich magic links.
3069
+ *
3070
+ * Passing `true` or an options object enables GitHub-user, alias, and
3071
+ * explicit `label|url` forms. Attributes and text are HTML-escaped.
3072
+ * Fenced, indented, inline, and raw code, plus already-linked text, are
3073
+ * skipped. The transform does not make network requests unless an explicit
3074
+ * favicon template is enabled (still URL-only; no fetch at transform time).
3075
+ *
3076
+ * @default false
3077
+ */
3078
+ magicLinks?: boolean | MagicLinkOptions;
1972
3079
  /**
1973
3080
  * Opt-in `::: tip` custom containers.
1974
3081
  *
@@ -1989,6 +3096,57 @@ interface OxContentOptions {
1989
3096
  * @default false
1990
3097
  */
1991
3098
  images?: boolean | ImageOptions;
3099
+ /**
3100
+ * Opt-in static `::: gallery` image groups.
3101
+ *
3102
+ * Each non-empty line inside the block must be a Markdown image, optionally
3103
+ * as a list item. Image titles become item captions, and the block title or
3104
+ * caption metadata becomes the gallery caption. Passing `true` or `{}`
3105
+ * enables strict empty-gallery and missing-alt diagnostics.
3106
+ *
3107
+ * @default false
3108
+ */
3109
+ imageGalleries?: boolean | ImageGalleryOptions;
3110
+ /**
3111
+ * Opt-in static `::: timeline` milestone lists.
3112
+ *
3113
+ * Timeline blocks render dated or undated milestones from Markdown-only
3114
+ * `::: timeline` blocks. Items can carry `status`, `label`, and `href`
3115
+ * metadata while nested Markdown stays searchable and static.
3116
+ *
3117
+ * @default false
3118
+ */
3119
+ timelines?: boolean | TimelineOptions;
3120
+ /**
3121
+ * Opt-in static `::: if` / `::: else` blocks.
3122
+ *
3123
+ * Conditions are evaluated from `conditionalBlocks.values` and page
3124
+ * frontmatter before Markdown is parsed. Non-selected branches are excluded
3125
+ * from rendered HTML, TOC, and generated search payloads. The expression
3126
+ * language supports `==`, `!=`, `in`, `and`, `or`, parentheses, string /
3127
+ * number / boolean / null literals, and array literals. No JavaScript is
3128
+ * executed.
3129
+ *
3130
+ * @default false
3131
+ */
3132
+ conditionalBlocks?: boolean | ConditionalBlockOptions;
3133
+ /**
3134
+ * Opt-in page-bundle resources and build-time image processing.
3135
+ *
3136
+ * Off by default. `true` or `{}` treats each page directory as a bundle:
3137
+ * sibling images are addressable with relative URLs. Query-string
3138
+ * resize/crop/format transforms run at build time and are cached by
3139
+ * source mtime plus transform params. Paths that leave the page
3140
+ * directory or `srcDir` are rejected. Missing sources fail the build
3141
+ * when `missing` is `"error"` (the default when enabled).
3142
+ * `dedupe` is off unless set; it does not turn on with `true` / `{}`.
3143
+ *
3144
+ * This is separate from `images`, which only adds figures, captions,
3145
+ * and lazy-loading.
3146
+ *
3147
+ * @default false
3148
+ */
3149
+ resources?: boolean | ResourcesOptions;
1992
3150
  /**
1993
3151
  * Import source snippets into fences with `<<< @/path/to/file.ts{region}`.
1994
3152
  *
@@ -2010,6 +3168,17 @@ interface OxContentOptions {
2010
3168
  * @default false
2011
3169
  */
2012
3170
  includes?: boolean | IncludeOptions;
3171
+ /**
3172
+ * Inline a parameterized Markdown partial with
3173
+ * `<!-- @partial: ./_partials/install.md package="ox-content" -->`.
3174
+ *
3175
+ * Disabled when omitted. `{{ name }}` substitutions are HTML-escaped.
3176
+ * Missing parameters stay literal unless `missing` is `"error"`. Existing
3177
+ * `<!-- @include: -->` behavior is unchanged.
3178
+ *
3179
+ * @default false
3180
+ */
3181
+ partials?: boolean | PartialsOptions;
2013
3182
  /**
2014
3183
  * Opt-in `::: card` / `::: link-card` / `::: card-grid` blocks.
2015
3184
  *
@@ -2028,15 +3197,37 @@ interface OxContentOptions {
2028
3197
  * @default false
2029
3198
  */
2030
3199
  steps?: boolean | StepsOptions;
3200
+ /**
3201
+ * Opt-in VitePress-style `::: code-group` fence groups.
3202
+ *
3203
+ * Passing `true` or `{}` enables rewriting labeled fences into the
3204
+ * existing no-JS tab widget. Omitted or `false` leaves the source on
3205
+ * the normal Markdown/container path.
3206
+ *
3207
+ * @default false
3208
+ */
3209
+ codeGroups?: boolean | CodeGroupOptions;
2031
3210
  /**
2032
3211
  * Opt-in static directory trees from `file-tree` fences.
2033
3212
  *
2034
3213
  * Passing `true` or `{}` enables the transform. Names are escaped and never
2035
- * read from the filesystem.
3214
+ * read from the filesystem. Directories with children open and close with
3215
+ * `<details>`. Icons are on by default and can be replaced from site config.
2036
3216
  *
2037
3217
  * @default false
2038
3218
  */
2039
3219
  fileTree?: boolean | FileTreeOptions;
3220
+ /**
3221
+ * Opt-in static tables from `csv-table` / `json-table` fences.
3222
+ *
3223
+ * Passing `true` or `{}` enables the transform. Inline CSV/JSON becomes a
3224
+ * semantic `<table>` with a responsive wrapper. `src` or a single path body
3225
+ * can import `@/data/options.csv` or `./options.json`. Paths cannot escape
3226
+ * the content/project root with `..`. Missing imports use `missing`.
3227
+ *
3228
+ * @default false
3229
+ */
3230
+ dataTables?: boolean | DataTableOptions;
2040
3231
  /**
2041
3232
  * Sanitize rendered HTML with safe defaults or explicit allow lists.
2042
3233
  *
@@ -2083,6 +3274,16 @@ interface OxContentOptions {
2083
3274
  * @default false
2084
3275
  */
2085
3276
  codeBlockTypecheck?: boolean | CodeBlockTypecheckOptions;
3277
+ /**
3278
+ * Attach build-time TypeScript hover overlays to opted-in fences.
3279
+ *
3280
+ * Off by default. `true` or `{}` enables the feature. Only `ts` / `tsx`
3281
+ * fences tagged `twoslash` receive payloads. Types are generated during
3282
+ * the Markdown transform; no TypeScript compiler is shipped to the browser.
3283
+ *
3284
+ * @default false
3285
+ */
3286
+ typedHover?: boolean | TypedHoverOptions;
2086
3287
  /**
2087
3288
  * Extract runnable fenced examples for Vitest docs-as-tests harnesses.
2088
3289
  *
@@ -2097,6 +3298,13 @@ interface OxContentOptions {
2097
3298
  * @default false
2098
3299
  */
2099
3300
  mermaid?: boolean;
3301
+ /**
3302
+ * Render `dot` / `graphviz` fenced blocks to static SVG with Graphviz.
3303
+ * Pass an object to configure the renderer command and failure policy.
3304
+ *
3305
+ * @default false
3306
+ */
3307
+ graphviz?: boolean | GraphvizOptions;
2100
3308
  /**
2101
3309
  * Enable `$…$` inline and `$$…$$` block math.
2102
3310
  *
@@ -2121,6 +3329,15 @@ interface OxContentOptions {
2121
3329
  * @default 3
2122
3330
  */
2123
3331
  tocMaxDepth?: number;
3332
+ /**
3333
+ * Append a visible heading permalink (`<a class="header-anchor" href="#id">`).
3334
+ *
3335
+ * Reuses the generated heading id. Default off. Theme
3336
+ * `headingPermalink: "hover" | "always"` changes only CSS visibility.
3337
+ *
3338
+ * @default false
3339
+ */
3340
+ headingPermalinks?: boolean | HeadingPermalinksOptions;
2124
3341
  /**
2125
3342
  * Enable OG image generation.
2126
3343
  * @default false
@@ -2194,12 +3411,23 @@ interface ResolvedOptions {
2194
3411
  permalinks?: ResolvedPermalinksOptions;
2195
3412
  cascade?: ResolvedCascadeOptions;
2196
3413
  redirects?: ResolvedRedirectsOptions;
3414
+ blog?: ResolvedBlogOptions;
2197
3415
  feeds?: ResolvedFeedsOptions;
3416
+ pwa?: ResolvedPwaOptions;
3417
+ /**
3418
+ * Present after `resolveOptions`. Omitted in hand-built fixtures means off.
3419
+ */
3420
+ icons?: ResolvedIconsOptions;
2198
3421
  taxonomies?: ResolvedTaxonomiesOptions;
2199
3422
  versions?: ResolvedVersionsOptions;
3423
+ resources?: ResolvedResourcesOptions;
2200
3424
  gfm: boolean;
2201
3425
  mdx?: boolean;
2202
3426
  footnotes: boolean;
3427
+ /**
3428
+ * Present after `resolveOptions`. Omitted in hand-built fixtures means off.
3429
+ */
3430
+ semanticFootnotes?: boolean;
2203
3431
  tables: boolean;
2204
3432
  taskLists: boolean;
2205
3433
  strikethrough: boolean;
@@ -2209,25 +3437,78 @@ interface ResolvedOptions {
2209
3437
  wikiLinks: ResolvedWikiLinkOptions;
2210
3438
  emojiShortcodes: ResolvedEmojiShortcodeOptions;
2211
3439
  attrs: ResolvedAttrsOptions;
3440
+ crossReferences: ResolvedCrossReferencesOptions;
3441
+ citations: ResolvedCitationsOptions;
3442
+ /**
3443
+ * Present after `resolveOptions`. Omitted in hand-built fixtures means off.
3444
+ */
3445
+ budoux?: ResolvedBudouxOptions;
2212
3446
  badges: ResolvedBadgeOptions;
3447
+ /**
3448
+ * Present after `resolveOptions`. Omitted in hand-built fixtures means off.
3449
+ */
3450
+ notByAi?: ResolvedNotByAiOptions;
3451
+ keyboardKeys?: ResolvedKeyboardKeysOptions;
3452
+ /**
3453
+ * Present after `resolveOptions`. Omitted in hand-built fixtures means off.
3454
+ */
3455
+ abbreviations?: ResolvedAbbreviationsOptions;
3456
+ /**
3457
+ * Present after `resolveOptions`. Omitted in hand-built fixtures means off.
3458
+ */
3459
+ definitionLists?: ResolvedDefinitionListOptions;
3460
+ /**
3461
+ * Present after `resolveOptions`. Omitted in hand-built fixtures means off.
3462
+ */
3463
+ magicLinks?: ResolvedMagicLinkOptions;
2213
3464
  containers: ResolvedContainerOptions;
2214
3465
  images: ResolvedImageOptions;
3466
+ /**
3467
+ * Present after `resolveOptions`. Omitted in hand-built fixtures means off.
3468
+ */
3469
+ imageGalleries?: ResolvedImageGalleryOptions;
3470
+ /**
3471
+ * Present after `resolveOptions`. Omitted in hand-built fixtures means off.
3472
+ */
3473
+ timelines?: ResolvedTimelineOptions;
3474
+ /**
3475
+ * Present after `resolveOptions`. Omitted in hand-built fixtures means off.
3476
+ */
3477
+ conditionalBlocks?: ResolvedConditionalBlockOptions;
2215
3478
  codeImports: ResolvedCodeImportOptions;
2216
3479
  includes: ResolvedIncludeOptions;
3480
+ /**
3481
+ * Present after `resolveOptions`. Omitted in hand-built fixtures means off.
3482
+ */
3483
+ partials?: ResolvedPartialsOptions;
2217
3484
  cards: ResolvedCardOptions;
2218
3485
  steps: ResolvedStepsOptions;
3486
+ /**
3487
+ * Present after `resolveOptions`. Omitted in hand-built fixtures means off.
3488
+ */
3489
+ codeGroups?: ResolvedCodeGroupOptions;
2219
3490
  fileTree: ResolvedFileTreeOptions;
3491
+ dataTables: ResolvedDataTableOptions;
2220
3492
  sanitize: ResolvedSanitizeOptions;
2221
3493
  editThisPage: ResolvedEditThisPageOptions;
2222
3494
  cjkEmphasis: boolean;
2223
3495
  codeBlockLint: ResolvedCodeBlockLintOptions;
2224
3496
  codeBlockTypecheck: ResolvedCodeBlockTypecheckOptions;
3497
+ /**
3498
+ * Present after `resolveOptions`. Omitted in hand-built fixtures means off.
3499
+ */
3500
+ typedHover?: ResolvedTypedHoverOptions;
2225
3501
  docsTests: ResolvedDocsTestOptions;
2226
3502
  mermaid: boolean;
3503
+ graphviz: ResolvedGraphvizOptions | false;
2227
3504
  math: ResolvedMathOptions;
2228
3505
  frontmatter: boolean;
2229
3506
  toc: boolean;
2230
3507
  tocMaxDepth: number;
3508
+ /**
3509
+ * Present after `resolveOptions`. Omitted in hand-built fixtures means off.
3510
+ */
3511
+ headingPermalinks?: ResolvedHeadingPermalinksOptions;
2231
3512
  ogImage: boolean;
2232
3513
  ogImageOptions: ResolvedOgImageOptions$1;
2233
3514
  transformers: MarkdownTransformer[];
@@ -2269,6 +3550,28 @@ interface BuiltinEmbedOptions {
2269
3550
  * @default false
2270
3551
  */
2271
3552
  spotify?: boolean;
3553
+ /**
3554
+ * Render `<AppleMusic url="https://music.apple.com/...">` iframes.
3555
+ * @default false
3556
+ */
3557
+ appleMusic?: boolean;
3558
+ /**
3559
+ * Render `<SpeakerDeck url="https://speakerdeck.com/...">` cards.
3560
+ * Player URLs and oEmbed-resolved share URLs render a lazy iframe plus
3561
+ * title/author metadata. Fetch or parse failures become a link card.
3562
+ * @default false
3563
+ */
3564
+ speakerDeck?: boolean;
3565
+ /**
3566
+ * Render `<Audio src="https://...">` native audio players.
3567
+ * @default false
3568
+ */
3569
+ audio?: boolean;
3570
+ /**
3571
+ * Render `<Video src="https://...">` native video players.
3572
+ * @default false
3573
+ */
3574
+ video?: boolean;
2272
3575
  /**
2273
3576
  * Render `<StackBlitz url="https://stackblitz.com/edit/...">` iframes.
2274
3577
  * @default false
@@ -2281,11 +3584,83 @@ interface BuiltinEmbedOptions {
2281
3584
  * @default false
2282
3585
  */
2283
3586
  twitter?: boolean | TwitterEmbedOptions;
3587
+ /**
3588
+ * Render `<Reddit>` as a static post card.
3589
+ * Pass `{ fetch: false }` to skip metadata fetching and render a link-only card.
3590
+ * @default false
3591
+ */
3592
+ reddit?: boolean | RedditEmbedOptions;
2284
3593
  /**
2285
3594
  * Render `<Bluesky>` as static cards.
2286
3595
  * @default false
2287
3596
  */
2288
3597
  bluesky?: boolean;
3598
+ /**
3599
+ * Render `<GoogleMaps>` as static place cards.
3600
+ * @default false
3601
+ */
3602
+ googleMaps?: boolean;
3603
+ /**
3604
+ * Render `<Qiita>` as static article cards.
3605
+ * Pass `{ fetch: false }` to skip metadata fetching and render a link-only card.
3606
+ * @default false
3607
+ */
3608
+ qiita?: boolean | ProviderArticleEmbedOptions;
3609
+ /**
3610
+ * Render `<Zenn>` as static article cards.
3611
+ * Pass `{ fetch: false }` to skip metadata fetching and render a link-only card.
3612
+ * @default false
3613
+ */
3614
+ zenn?: boolean | ProviderArticleEmbedOptions;
3615
+ /**
3616
+ * Render `<NpmPackage>`, `<CratesIo>`, `<PyPI>`, and `<DockerHub>` as static cards.
3617
+ * Pass `{ fetch: false }` to skip metadata fetching and render link-only cards.
3618
+ * @default false
3619
+ */
3620
+ packageRegistry?: boolean | ProviderPackageEmbedOptions;
3621
+ /**
3622
+ * Render `<CodePen>`, `<JSFiddle>`, and `<Observable>` as static playground cards.
3623
+ * Pass `{ iframe: true }` to include lazy iframe URLs where supported.
3624
+ * @default false
3625
+ */
3626
+ playgrounds?: boolean | ProviderPlaygroundEmbedOptions;
3627
+ /**
3628
+ * Render `<Vimeo>` as static video cards.
3629
+ * Pass `{ iframe: true }` to include lazy player iframe URLs.
3630
+ * @default false
3631
+ */
3632
+ vimeo?: boolean | ProviderVideoEmbedOptions;
3633
+ /**
3634
+ * Render `<Twitch>` as static video, clip, and channel cards.
3635
+ * Pass `{ iframe: true, parent: "example.com" }` to include Twitch iframes.
3636
+ * @default false
3637
+ */
3638
+ twitch?: boolean | ProviderVideoEmbedOptions;
3639
+ /**
3640
+ * Render `<Discord>` as static invite/message cards.
3641
+ * @default false
3642
+ */
3643
+ discord?: boolean;
3644
+ /**
3645
+ * Render `<Fediverse>`, `<Mastodon>`, `<Misskey>`, and `<Mixi2>` as static cards.
3646
+ * @default false
3647
+ */
3648
+ fediverse?: boolean;
3649
+ /**
3650
+ * Render `<Facebook>` as static post cards.
3651
+ * @default false
3652
+ */
3653
+ facebook?: boolean;
3654
+ /**
3655
+ * Render `<Threads>` as static post cards.
3656
+ * @default false
3657
+ */
3658
+ threads?: boolean;
3659
+ /**
3660
+ * Render `<Instagram>` as static post cards.
3661
+ * @default false
3662
+ */
3663
+ instagram?: boolean;
2289
3664
  /**
2290
3665
  * Render `<WebContainer>` lazy placeholders with isolation metadata.
2291
3666
  * @default false
@@ -2310,9 +3685,26 @@ interface ResolvedBuiltinEmbedOptions {
2310
3685
  openGraph: OgpOptions | false;
2311
3686
  pm: BuiltinPmOptions | false;
2312
3687
  spotify: boolean;
3688
+ appleMusic: boolean;
3689
+ speakerDeck: boolean;
3690
+ audio?: boolean;
3691
+ video?: boolean;
2313
3692
  stackBlitz: boolean;
2314
3693
  twitter: TwitterEmbedOptions | false;
3694
+ reddit?: RedditEmbedOptions | false;
2315
3695
  bluesky: boolean;
3696
+ googleMaps?: boolean;
3697
+ qiita?: ProviderArticleEmbedOptions | false;
3698
+ zenn?: ProviderArticleEmbedOptions | false;
3699
+ packageRegistry?: ProviderPackageEmbedOptions | false;
3700
+ playgrounds?: ProviderPlaygroundEmbedOptions | false;
3701
+ vimeo?: ProviderVideoEmbedOptions | false;
3702
+ twitch?: ProviderVideoEmbedOptions | false;
3703
+ discord?: boolean;
3704
+ fediverse?: boolean;
3705
+ facebook?: boolean;
3706
+ threads?: boolean;
3707
+ instagram?: boolean;
2316
3708
  webContainer: boolean;
2317
3709
  }
2318
3710
  /**
@@ -2332,6 +3724,169 @@ interface BadgeOptions {
2332
3724
  interface ResolvedBadgeOptions {
2333
3725
  enabled: boolean;
2334
3726
  }
3727
+ /**
3728
+ * Options for opt-in PHP Markdown Extra / mdBook-style definition lists.
3729
+ */
3730
+ interface DefinitionListOptions {
3731
+ /**
3732
+ * Enable the definition-list transform when an options object is supplied.
3733
+ *
3734
+ * @default true
3735
+ */
3736
+ enabled?: boolean;
3737
+ }
3738
+ /**
3739
+ * Resolved definition-list transform options.
3740
+ */
3741
+ interface ResolvedDefinitionListOptions {
3742
+ enabled: boolean;
3743
+ }
3744
+ /**
3745
+ * Options for the opt-in `<NotByAI />` authorship badge.
3746
+ */
3747
+ interface NotByAiOptions {
3748
+ /**
3749
+ * Enable the badge transform when an options object is supplied.
3750
+ *
3751
+ * @default true
3752
+ */
3753
+ enabled?: boolean;
3754
+ /**
3755
+ * Accessible label for the badge link.
3756
+ *
3757
+ * @default "Written by human, not by AI"
3758
+ */
3759
+ label?: string;
3760
+ /**
3761
+ * Destination URL. Unsafe values fall back to `https://notbyai.fyi`.
3762
+ *
3763
+ * @default "https://notbyai.fyi"
3764
+ */
3765
+ href?: string;
3766
+ }
3767
+ /**
3768
+ * Resolved NotByAI authorship-badge options.
3769
+ */
3770
+ interface ResolvedNotByAiOptions {
3771
+ enabled: boolean;
3772
+ label: string;
3773
+ href: string;
3774
+ }
3775
+ /**
3776
+ * Options for opt-in `{kbd:...}` inline keyboard keys.
3777
+ */
3778
+ interface KeyboardKeysOptions {
3779
+ /**
3780
+ * Enable the keyboard-key transform when an options object is supplied.
3781
+ *
3782
+ * @default true
3783
+ */
3784
+ enabled?: boolean;
3785
+ /**
3786
+ * Build-time aliases. Keys are matched case-insensitively and override
3787
+ * the built-in `cmd` / `ctrl` table.
3788
+ */
3789
+ aliases?: Record<string, string>;
3790
+ /**
3791
+ * Built-in alias labels. `"words"` emits `Command`; `"symbols"` emits `⌘`.
3792
+ *
3793
+ * @default "words"
3794
+ */
3795
+ style?: "words" | "symbols";
3796
+ }
3797
+ /**
3798
+ * Resolved inline keyboard-key transform options.
3799
+ */
3800
+ interface ResolvedKeyboardKeysOptions {
3801
+ enabled: boolean;
3802
+ aliases: Record<string, string>;
3803
+ style: "words" | "symbols";
3804
+ }
3805
+ /**
3806
+ * Options for opt-in abbreviation and glossary expansion.
3807
+ */
3808
+ interface AbbreviationsOptions {
3809
+ /**
3810
+ * Enable the transform when an options object is supplied.
3811
+ *
3812
+ * @default true
3813
+ */
3814
+ enabled?: boolean;
3815
+ /**
3816
+ * Central glossary. Keys are matched with Unicode word boundaries.
3817
+ */
3818
+ terms?: Record<string, string>;
3819
+ /**
3820
+ * Wrap only the first occurrence of each term.
3821
+ *
3822
+ * @default false
3823
+ */
3824
+ firstUseOnly?: boolean;
3825
+ }
3826
+ /**
3827
+ * Resolved abbreviation / glossary transform options.
3828
+ */
3829
+ interface ResolvedAbbreviationsOptions {
3830
+ enabled: boolean;
3831
+ terms: Record<string, string>;
3832
+ firstUseOnly: boolean;
3833
+ }
3834
+ /**
3835
+ * Options for opt-in `{link:...}` rich magic links.
3836
+ */
3837
+ interface MagicLinkOptions {
3838
+ /**
3839
+ * Enable the magic-link transform when an options object is supplied.
3840
+ *
3841
+ * @default true
3842
+ */
3843
+ enabled?: boolean;
3844
+ /**
3845
+ * Named aliases. A string value is treated as `{ href }`.
3846
+ */
3847
+ aliases?: Record<string, string | MagicLinkAlias>;
3848
+ /**
3849
+ * Emit a favicon URL when a link has no image.
3850
+ *
3851
+ * `true` uses `https://{host}/favicon.ico`. Pass `{ template }` to override.
3852
+ * The transform never fetches; the browser may load the URL later.
3853
+ *
3854
+ * @default false
3855
+ */
3856
+ favicon?: boolean | {
3857
+ template?: string;
3858
+ };
3859
+ /**
3860
+ * Replace the resolved image for matching hrefs.
3861
+ */
3862
+ imageOverrides?: MagicLinkImageOverride[];
3863
+ }
3864
+ /**
3865
+ * One configured magic-link target.
3866
+ */
3867
+ interface MagicLinkAlias {
3868
+ href: string;
3869
+ label?: string;
3870
+ image?: string;
3871
+ }
3872
+ /**
3873
+ * Replace the image for an exact href or prefix.
3874
+ */
3875
+ interface MagicLinkImageOverride {
3876
+ href?: string;
3877
+ prefix?: string;
3878
+ image: string;
3879
+ }
3880
+ /**
3881
+ * Resolved magic-link transform options.
3882
+ */
3883
+ interface ResolvedMagicLinkOptions {
3884
+ enabled: boolean;
3885
+ aliases: Record<string, MagicLinkAlias>;
3886
+ favicon: boolean;
3887
+ faviconTemplate?: string;
3888
+ imageOverrides: MagicLinkImageOverride[];
3889
+ }
2335
3890
  /**
2336
3891
  * Options for opt-in `::: type` custom containers.
2337
3892
  */
@@ -2384,6 +3939,159 @@ interface ResolvedImageOptions {
2384
3939
  enabled: boolean;
2385
3940
  lazy: boolean;
2386
3941
  }
3942
+ /**
3943
+ * Options for opt-in static image galleries.
3944
+ */
3945
+ interface ImageGalleryOptions {
3946
+ /**
3947
+ * Enable `::: gallery` blocks.
3948
+ *
3949
+ * @default true when the options object is supplied.
3950
+ */
3951
+ enabled?: boolean;
3952
+ /**
3953
+ * Add `loading="lazy"` to gallery images.
3954
+ *
3955
+ * @default follows `images.lazy`, or true when `images` is disabled.
3956
+ */
3957
+ lazy?: boolean;
3958
+ /**
3959
+ * Diagnostics for image items without alt text.
3960
+ *
3961
+ * @default "error"
3962
+ */
3963
+ missingAlt?: "error" | "warn" | "ignore";
3964
+ /**
3965
+ * Diagnostics for galleries without image items.
3966
+ *
3967
+ * @default "error"
3968
+ */
3969
+ empty?: "error" | "warn" | "ignore";
3970
+ }
3971
+ /**
3972
+ * Resolved image gallery transform options.
3973
+ */
3974
+ interface ResolvedImageGalleryOptions {
3975
+ enabled: boolean;
3976
+ lazy?: boolean;
3977
+ missingAlt: "error" | "warn" | "ignore";
3978
+ empty: "error" | "warn" | "ignore";
3979
+ }
3980
+ /**
3981
+ * Options for opt-in static timelines.
3982
+ */
3983
+ interface TimelineOptions {
3984
+ /**
3985
+ * Enable `::: timeline` blocks.
3986
+ *
3987
+ * @default true when the options object is supplied.
3988
+ */
3989
+ enabled?: boolean;
3990
+ /**
3991
+ * Render timelines as ordered lists unless a block overrides it.
3992
+ *
3993
+ * @default true
3994
+ */
3995
+ ordered?: boolean;
3996
+ /**
3997
+ * Diagnostics for malformed `YYYY`, `YYYY-MM`, or `YYYY-MM-DD` item dates.
3998
+ *
3999
+ * @default "error"
4000
+ */
4001
+ invalidDate?: "error" | "warn" | "ignore";
4002
+ /**
4003
+ * Diagnostics for unsupported item metadata.
4004
+ *
4005
+ * @default "error"
4006
+ */
4007
+ unknownMeta?: "error" | "warn" | "ignore";
4008
+ /**
4009
+ * Diagnostics for timeline blocks without items.
4010
+ *
4011
+ * @default "error"
4012
+ */
4013
+ empty?: "error" | "warn" | "ignore";
4014
+ }
4015
+ /**
4016
+ * Resolved timeline transform options.
4017
+ */
4018
+ interface ResolvedTimelineOptions {
4019
+ enabled: boolean;
4020
+ ordered: boolean;
4021
+ invalidDate: "error" | "warn" | "ignore";
4022
+ unknownMeta: "error" | "warn" | "ignore";
4023
+ empty: "error" | "warn" | "ignore";
4024
+ }
4025
+ /**
4026
+ * Options for opt-in static conditional blocks.
4027
+ */
4028
+ interface ConditionalBlockOptions {
4029
+ /**
4030
+ * Enable `::: if` / `::: else` blocks.
4031
+ *
4032
+ * @default true when the options object is supplied.
4033
+ */
4034
+ enabled?: boolean;
4035
+ /**
4036
+ * Build-time values available as `config.*` or bare identifiers. Page
4037
+ * frontmatter wins for bare identifiers; use `config.name` to force config.
4038
+ */
4039
+ values?: Record<string, unknown>;
4040
+ }
4041
+ /**
4042
+ * Resolved conditional-block transform options.
4043
+ */
4044
+ interface ResolvedConditionalBlockOptions {
4045
+ enabled: boolean;
4046
+ values: Record<string, unknown>;
4047
+ }
4048
+ /**
4049
+ * Options for opt-in page-bundle resources and image processing.
4050
+ */
4051
+ interface ResourcesOptions {
4052
+ /**
4053
+ * Allowed output formats for `?format=`.
4054
+ *
4055
+ * `jpg` is treated as `jpeg`. Pixel transforms encode `png` and `jpeg`.
4056
+ * `webp` is copied when the source is already webp and no pixel
4057
+ * transform is requested.
4058
+ *
4059
+ * @default ["png", "jpeg", "webp"]
4060
+ */
4061
+ formats?: string[];
4062
+ /**
4063
+ * Allowed `?width=` / `?w=` values. An empty list allows any positive
4064
+ * width.
4065
+ *
4066
+ * @default []
4067
+ */
4068
+ widths?: number[];
4069
+ /**
4070
+ * What to do when a relative resource is missing.
4071
+ *
4072
+ * @default "error"
4073
+ */
4074
+ missing?: "error" | "warn";
4075
+ /**
4076
+ * Emit identical bytes once as `/assets/content/<sha256>.<ext>` and
4077
+ * rewrite `src`, `poster`, and relevant `href` to that URL.
4078
+ *
4079
+ * Off unless this is `true`. `resources: true` and `{}` leave it off.
4080
+ *
4081
+ * @default false
4082
+ */
4083
+ dedupe?: boolean;
4084
+ }
4085
+ /**
4086
+ * Resolved page-resource options.
4087
+ */
4088
+ interface ResolvedResourcesOptions {
4089
+ enabled: boolean;
4090
+ formats: string[];
4091
+ widths: number[];
4092
+ missing: "error" | "warn";
4093
+ dedupe: boolean;
4094
+ }
2387
4095
  /**
2388
4096
  * Options for expanding Obsidian-style wiki links.
2389
4097
  *
@@ -2440,6 +4148,10 @@ interface ResolvedEmojiShortcodeOptions {
2440
4148
  }
2441
4149
  /**
2442
4150
  * Options for opt-in `$…$` / `$$…$$` math.
4151
+ *
4152
+ * Delimiter parsing lives in the native transform. Typesetting uses KaTeX at
4153
+ * build time when the optional `katex` peer is installed. Sites that omit
4154
+ * `math` do not need that package.
2443
4155
  */
2444
4156
  interface MathOptions {
2445
4157
  /**
@@ -2479,6 +4191,27 @@ interface AttrsOptions {
2479
4191
  interface ResolvedAttrsOptions {
2480
4192
  enabled: boolean;
2481
4193
  }
4194
+ /**
4195
+ * Opt-in visible heading permalinks.
4196
+ *
4197
+ * Headings already have stable `id`s. Enabling this appends a real
4198
+ * `<a class="header-anchor" href="#id">` using that exact id. Off by
4199
+ * default so existing HTML stays byte-stable.
4200
+ */
4201
+ interface HeadingPermalinksOptions {
4202
+ /**
4203
+ * Emit the permalink control.
4204
+ *
4205
+ * @default true
4206
+ */
4207
+ enabled?: boolean;
4208
+ }
4209
+ /**
4210
+ * Resolved heading permalink options.
4211
+ */
4212
+ interface ResolvedHeadingPermalinksOptions {
4213
+ enabled: boolean;
4214
+ }
2482
4215
  /**
2483
4216
  * Options for importing source snippets into code fences.
2484
4217
  *
@@ -2531,6 +4264,48 @@ interface ResolvedIncludeOptions {
2531
4264
  enabled: boolean;
2532
4265
  rootDir?: string;
2533
4266
  }
4267
+ /**
4268
+ * Options for parameterized Markdown partials with `<!-- @partial: PATH k="v" -->`.
4269
+ *
4270
+ * Bare names resolve under `root` (`_partials` by default). Relative `./` and
4271
+ * `../` paths resolve from the current file. `@/` and leading `/` resolve from
4272
+ * `rootDir`. After canonicalize, paths outside `rootDir` are rejected.
4273
+ */
4274
+ interface PartialsOptions {
4275
+ /**
4276
+ * Enable the transform when an options object is supplied.
4277
+ *
4278
+ * @default true
4279
+ */
4280
+ enabled?: boolean;
4281
+ /**
4282
+ * Directory used to resolve `@/` and absolute partial paths.
4283
+ *
4284
+ * @default undefined
4285
+ */
4286
+ rootDir?: string;
4287
+ /**
4288
+ * Directory used for bare names such as `install.md`.
4289
+ *
4290
+ * @default "_partials"
4291
+ */
4292
+ root?: string;
4293
+ /**
4294
+ * Missing `{{ name }}` substitutions stay literal, or report a diagnostic.
4295
+ *
4296
+ * @default "literal"
4297
+ */
4298
+ missing?: "literal" | "error";
4299
+ }
4300
+ /**
4301
+ * Resolved parameterized-partial transform options.
4302
+ */
4303
+ interface ResolvedPartialsOptions {
4304
+ enabled: boolean;
4305
+ rootDir?: string;
4306
+ root: string;
4307
+ missing: "literal" | "error";
4308
+ }
2534
4309
  /**
2535
4310
  * Options for opt-in `::: card` / `::: link-card` / `::: card-grid` blocks.
2536
4311
  */
@@ -2565,6 +4340,37 @@ interface StepsOptions {
2565
4340
  interface ResolvedStepsOptions {
2566
4341
  enabled: boolean;
2567
4342
  }
4343
+ /**
4344
+ * Options for opt-in `::: code-group` fence groups.
4345
+ */
4346
+ interface CodeGroupOptions {
4347
+ /**
4348
+ * Enable the code-group transform when an options object is supplied.
4349
+ *
4350
+ * @default true
4351
+ */
4352
+ enabled?: boolean;
4353
+ }
4354
+ /**
4355
+ * Resolved code-group transform options.
4356
+ */
4357
+ interface ResolvedCodeGroupOptions {
4358
+ enabled: boolean;
4359
+ }
4360
+ /**
4361
+ * Replaceable file-tree icons. Values are trusted site-config SVG markup or
4362
+ * CSS class tokens, never fence content.
4363
+ */
4364
+ interface FileTreeIconOptions {
4365
+ /** Collapsed folder icon. */
4366
+ folder?: string;
4367
+ /** Open folder icon. */
4368
+ folderOpen?: string;
4369
+ /** Default file icon. */
4370
+ file?: string;
4371
+ /** File icons keyed by extension (`ts`, `.json`). */
4372
+ files?: Record<string, string>;
4373
+ }
2568
4374
  /**
2569
4375
  * Options for opt-in `file-tree` fences.
2570
4376
  */
@@ -2575,12 +4381,63 @@ interface FileTreeOptions {
2575
4381
  * @default true
2576
4382
  */
2577
4383
  enabled?: boolean;
4384
+ /**
4385
+ * Open directory `<details>` by default.
4386
+ *
4387
+ * @default true
4388
+ */
4389
+ defaultOpen?: boolean;
4390
+ /**
4391
+ * Render folder and file icons. Pass an object to replace the defaults.
4392
+ *
4393
+ * @default true
4394
+ */
4395
+ icons?: boolean | FileTreeIconOptions;
2578
4396
  }
2579
4397
  /**
2580
4398
  * Resolved file-tree transform options.
2581
4399
  */
2582
4400
  interface ResolvedFileTreeOptions {
2583
4401
  enabled: boolean;
4402
+ defaultOpen: boolean;
4403
+ icons: boolean;
4404
+ iconFolder?: string;
4405
+ iconFolderOpen?: string;
4406
+ iconFile?: string;
4407
+ iconFiles?: Record<string, string>;
4408
+ }
4409
+ /**
4410
+ * Options for opt-in `csv-table` / `json-table` fences.
4411
+ */
4412
+ interface DataTableOptions {
4413
+ /**
4414
+ * Enable the data-table transform when an options object is supplied.
4415
+ *
4416
+ * @default true
4417
+ */
4418
+ enabled?: boolean;
4419
+ /**
4420
+ * Directory used to resolve `@/` and absolute import paths.
4421
+ *
4422
+ * When omitted, imports resolve from the Vite project root.
4423
+ *
4424
+ * @default undefined
4425
+ */
4426
+ rootDir?: string;
4427
+ /**
4428
+ * What to do when an imported CSV/JSON file is missing.
4429
+ *
4430
+ * @default "error"
4431
+ */
4432
+ missing?: "error" | "warn";
4433
+ }
4434
+ /**
4435
+ * Resolved data-table transform options.
4436
+ */
4437
+ interface ResolvedDataTableOptions {
4438
+ enabled: boolean;
4439
+ rootDir?: string;
4440
+ missing: "error" | "warn";
2584
4441
  }
2585
4442
  /**
2586
4443
  * Options for sanitizing rendered HTML.
@@ -2783,6 +4640,43 @@ interface ResolvedCodeBlockTypecheckOptions {
2783
4640
  tsgoCommand: string;
2784
4641
  mode: "warn" | "error";
2785
4642
  }
4643
+ /**
4644
+ * Options for opt-in typed hover overlays on TypeScript fences.
4645
+ *
4646
+ * Hover strings are computed at build time with the same TypeScript compiler
4647
+ * family used by `codeBlockTypecheck` (`tsgo` / `typescript`). The browser
4648
+ * only receives JSON payloads and a tiny overlay script.
4649
+ */
4650
+ interface TypedHoverOptions {
4651
+ /**
4652
+ * Enable typed hover overlays.
4653
+ *
4654
+ * @default true when the object form is used
4655
+ */
4656
+ enabled?: boolean;
4657
+ /**
4658
+ * Fence languages that can receive hover payloads.
4659
+ *
4660
+ * Language names are compared case-insensitively.
4661
+ *
4662
+ * @default ['ts', 'tsx']
4663
+ */
4664
+ languages?: string[];
4665
+ /**
4666
+ * Path to the `tsgo` binary used to compute hover types.
4667
+ *
4668
+ * When omitted, the bundled `@typescript/native-preview` executable is used.
4669
+ */
4670
+ tsgoCommand?: string;
4671
+ }
4672
+ /**
4673
+ * Resolved typed-hover options.
4674
+ */
4675
+ interface ResolvedTypedHoverOptions {
4676
+ enabled: boolean;
4677
+ languages: string[];
4678
+ tsgoCommand?: string;
4679
+ }
2786
4680
  /**
2787
4681
  * Options for extracting fenced examples into docs-as-tests fixtures.
2788
4682
  *
@@ -2865,11 +4759,67 @@ interface ResolvedCodeAnnotationsOptions {
2865
4759
  metaKey: string;
2866
4760
  defaultLineNumbers: boolean;
2867
4761
  }
4762
+ /**
4763
+ * OG image rendering backend.
4764
+ */
4765
+ type OgImageRenderer = "chromium" | "satori";
4766
+ /**
4767
+ * Font weight values supported by Satori.
4768
+ */
4769
+ type OgImageSatoriFontWeight = 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;
4770
+ /**
4771
+ * Font file loaded by the Satori renderer.
4772
+ */
4773
+ interface OgImageSatoriFont {
4774
+ /**
4775
+ * Absolute path, or a path relative to the project root.
4776
+ */
4777
+ path: string;
4778
+ /**
4779
+ * Font family name used by template CSS.
4780
+ */
4781
+ name?: string;
4782
+ /**
4783
+ * Font weight.
4784
+ * @default 400
4785
+ */
4786
+ weight?: OgImageSatoriFontWeight;
4787
+ /**
4788
+ * Font style.
4789
+ * @default "normal"
4790
+ */
4791
+ style?: "normal" | "italic";
4792
+ }
4793
+ /**
4794
+ * Satori renderer options.
4795
+ */
4796
+ interface OgImageSatoriOptions {
4797
+ /**
4798
+ * Font files passed to Satori.
4799
+ *
4800
+ * Satori cannot render text without at least one font. When omitted,
4801
+ * Ox Content tries a small set of system font paths unless
4802
+ * `systemFontFallback` is disabled.
4803
+ */
4804
+ fonts?: OgImageSatoriFont[];
4805
+ /**
4806
+ * Try known OS font paths when `fonts` is empty.
4807
+ * @default true
4808
+ */
4809
+ systemFontFallback?: boolean;
4810
+ }
2868
4811
  /**
2869
4812
  * OG image generation options.
2870
- * Uses Chromium-based rendering with customizable templates.
4813
+ * Uses Chromium or Satori rendering with customizable templates.
2871
4814
  */
2872
4815
  interface OgImageOptions {
4816
+ /**
4817
+ * Rendering backend.
4818
+ * - `"chromium"`: full browser rendering, best template compatibility
4819
+ * - `"satori"`: fast HTML-to-SVG-to-PNG rendering, limited CSS subset
4820
+ * @default "chromium"
4821
+ */
4822
+ renderer?: OgImageRenderer;
2873
4823
  /**
2874
4824
  * Path to a custom template file (.ts, .vue, .svelte, .tsx/.jsx).
2875
4825
  * - `.ts`: default-export a function `(props) => string`
@@ -2907,17 +4857,26 @@ interface OgImageOptions {
2907
4857
  * @default 1
2908
4858
  */
2909
4859
  concurrency?: number;
4860
+ /**
4861
+ * Options for the Satori renderer.
4862
+ */
4863
+ satori?: OgImageSatoriOptions;
2910
4864
  }
2911
4865
  /**
2912
4866
  * Resolved OG image options with all defaults applied.
2913
4867
  */
2914
4868
  interface ResolvedOgImageOptions$1 {
4869
+ renderer: OgImageRenderer;
2915
4870
  template?: string;
2916
4871
  vuePlugin: "vitejs" | "vizejs";
2917
4872
  width: number;
2918
4873
  height: number;
2919
4874
  cache: boolean;
2920
4875
  concurrency: number;
4876
+ satori: {
4877
+ fonts: OgImageSatoriFont[];
4878
+ systemFontFallback: boolean;
4879
+ };
2921
4880
  }
2922
4881
  /**
2923
4882
  * Custom AST transformer.
@@ -2958,6 +4917,30 @@ interface MarkdownNode {
2958
4917
  value?: string;
2959
4918
  [key: string]: unknown;
2960
4919
  }
4920
+ /**
4921
+ * How a specifier was imported from an MDX `import` statement.
4922
+ */
4923
+ type MdxImportSpecifierKind = "default" | "named" | "namespace";
4924
+ /**
4925
+ * One binding created by an MDX `import` statement.
4926
+ */
4927
+ interface MdxImportSpecifier {
4928
+ /** Imported name (`default`, `*`, or the named export). */
4929
+ imported: string;
4930
+ /** Local binding name. */
4931
+ local: string;
4932
+ /** Specifier kind. */
4933
+ kind: MdxImportSpecifierKind;
4934
+ }
4935
+ /**
4936
+ * One MDX `import` statement collected from the AST.
4937
+ */
4938
+ interface MdxImport {
4939
+ /** Module specifier string. */
4940
+ source: string;
4941
+ /** Bindings created by the import. */
4942
+ specifiers: MdxImportSpecifier[];
4943
+ }
2961
4944
  /**
2962
4945
  * Transform result.
2963
4946
  */
@@ -2982,6 +4965,30 @@ interface TransformResult {
2982
4965
  * Table of contents.
2983
4966
  */
2984
4967
  toc: TocEntry[];
4968
+ /**
4969
+ * MDX `import` statements (empty when MDX is off or no ESM nodes).
4970
+ */
4971
+ imports: MdxImport[];
4972
+ /**
4973
+ * Export names from MDX ESM (empty when MDX is off or no exports).
4974
+ */
4975
+ exports: string[];
4976
+ /**
4977
+ * Unique JSX component names in document order (empty when none).
4978
+ */
4979
+ components: string[];
4980
+ /**
4981
+ * Labeled cross-reference targets collected during the Markdown transform.
4982
+ */
4983
+ crossReferences: CrossReferenceEntry[];
4984
+ /**
4985
+ * Citation references collected during the Markdown transform.
4986
+ */
4987
+ citations: CitationReference[];
4988
+ /**
4989
+ * Bibliography entries used by this document.
4990
+ */
4991
+ bibliography: BibliographyEntry[];
2985
4992
  }
2986
4993
  /**
2987
4994
  * Table of contents entry.
@@ -3086,6 +5093,15 @@ interface DocsOptions {
3086
5093
  * @default undefined
3087
5094
  */
3088
5095
  entryPoints?: DocsEntryPoint[];
5096
+ /**
5097
+ * Local OpenAPI 3.0/3.1 JSON or YAML files to render as static REST API docs.
5098
+ *
5099
+ * Generated pages are written under `out/openapi/<spec>/` and use the same
5100
+ * Markdown, stale-file cleanup, SSG, and search pipeline as source docs.
5101
+ *
5102
+ * @default false
5103
+ */
5104
+ openapi?: OpenApiDocsSource | OpenApiDocsSource[] | OpenApiDocsOptions | false;
3089
5105
  /**
3090
5106
  * Output format.
3091
5107
  *
@@ -3273,6 +5289,7 @@ interface ResolvedDocsOptions {
3273
5289
  include: string[];
3274
5290
  exclude: string[];
3275
5291
  entryPoints?: ResolvedDocsEntryPoint[];
5292
+ openapi: ResolvedOpenApiDocsOptions | false;
3276
5293
  format: "markdown" | "json" | "html";
3277
5294
  private: boolean;
3278
5295
  internal: boolean;
@@ -3301,6 +5318,48 @@ interface ResolvedDocsOptions {
3301
5318
  singleEntryRoot: "preserve" | "flatten";
3302
5319
  generateNav: boolean;
3303
5320
  }
5321
+ /** OpenAPI docs shorthand accepted by `docs.openapi`. */
5322
+ type OpenApiDocsSource = string | OpenApiDocsInput;
5323
+ /** One local OpenAPI file consumed by generated REST API docs. */
5324
+ interface OpenApiDocsInput {
5325
+ /** JSON or YAML file path, resolved from the Vite project root. */
5326
+ path: string;
5327
+ /** Optional display name. Defaults to `info.title` or the file name. */
5328
+ name?: string;
5329
+ /** Fail on unresolved or remote `$ref` values. Defaults to `true`. */
5330
+ failOnUnresolvedRefs?: boolean;
5331
+ }
5332
+ /** Object form for configuring generated OpenAPI docs. */
5333
+ interface OpenApiDocsOptions {
5334
+ /** Local OpenAPI files to render. */
5335
+ src?: OpenApiDocsSource | OpenApiDocsSource[];
5336
+ /** Route prefix used by generated OpenAPI nav metadata. Defaults to `basePath` or `/api`. */
5337
+ basePath?: string;
5338
+ /** Default unresolved `$ref` policy for sources. Defaults to `true`. */
5339
+ failOnUnresolvedRefs?: boolean;
5340
+ }
5341
+ /** Resolved local OpenAPI file input. */
5342
+ interface ResolvedOpenApiDocsInput {
5343
+ path: string;
5344
+ name?: string;
5345
+ failOnUnresolvedRefs: boolean;
5346
+ }
5347
+ /** Resolved generated OpenAPI docs options. */
5348
+ interface ResolvedOpenApiDocsOptions {
5349
+ src: ResolvedOpenApiDocsInput[];
5350
+ basePath?: string;
5351
+ }
5352
+ /** Navigation item emitted for generated docs sidebars. */
5353
+ interface DocsNavigationItem {
5354
+ title: string;
5355
+ path: string;
5356
+ children?: DocsNavigationItem[];
5357
+ }
5358
+ /** Generated OpenAPI Markdown pages and sidebar metadata. */
5359
+ interface GeneratedOpenApiDocs {
5360
+ pages: Record<string, string>;
5361
+ nav: DocsNavigationItem[];
5362
+ }
3304
5363
  /**
3305
5364
  * A single documentation entry extracted from source.
3306
5365
  *
@@ -3583,6 +5642,16 @@ interface SearchOptions {
3583
5642
  * @default true
3584
5643
  */
3585
5644
  prefix?: boolean;
5645
+ /**
5646
+ * Enable fuzzy typo-tolerant matching.
5647
+ *
5648
+ * Fuzzy matching is off by default so large static indexes keep the fastest
5649
+ * exact/prefix path. When enabled, local BM25 also considers near matches
5650
+ * for tokens with at least three characters.
5651
+ *
5652
+ * @default false
5653
+ */
5654
+ fuzzy?: boolean;
3586
5655
  /**
3587
5656
  * Placeholder text for the search input.
3588
5657
  *
@@ -3651,6 +5720,7 @@ interface ResolvedSearchOptions {
3651
5720
  enabled: boolean;
3652
5721
  limit: number;
3653
5722
  prefix: boolean;
5723
+ fuzzy: boolean;
3654
5724
  placeholder: string;
3655
5725
  hotkey: string;
3656
5726
  provider?: "local" | "hosted";
@@ -3804,6 +5874,33 @@ interface ResolvedI18nOptions {
3804
5874
  check: boolean;
3805
5875
  functionNames: string[];
3806
5876
  }
5877
+ /**
5878
+ * One host-owned page for composable SSG outputs (`ssg: false`).
5879
+ *
5880
+ * The host renders HTML. Ox Content plans and emits resources, Markdown
5881
+ * companions, feeds, and sitemap metadata from these fields.
5882
+ */
5883
+ interface SsgOutputPageInput {
5884
+ /** Source file used for git lastmod and companion identity. */
5885
+ inputPath: string;
5886
+ /** Published URL path (`guide` or `/`). */
5887
+ urlPath: string;
5888
+ /** Filesystem path of the host-rendered HTML page. */
5889
+ outputPath?: string;
5890
+ /** Host-rendered HTML. Required for resource fingerprinting. */
5891
+ html?: string;
5892
+ /** Already-read Markdown source bytes for companions. */
5893
+ source?: string;
5894
+ title?: string;
5895
+ description?: string;
5896
+ /** Absolute page URL. When omitted, `siteUrl` + `base` + `urlPath` is used. */
5897
+ loc?: string;
5898
+ /** Git commit time in milliseconds, or a host-supplied timestamp. */
5899
+ lastUpdated?: number;
5900
+ draft?: boolean;
5901
+ unlisted?: boolean;
5902
+ frontmatter?: Record<string, unknown>;
5903
+ }
3807
5904
  //#endregion
3808
5905
  //#region src/virtual.d.ts
3809
5906
  declare module "virtual:ox-content/collections" {
@@ -3839,18 +5936,53 @@ declare module "virtual:ox-content/collections" {
3839
5936
  export default api;
3840
5937
  }
3841
5938
  //#endregion
5939
+ //#region src/builtin-embed-options.d.ts
5940
+ declare function resolveBuiltinEmbedOptions(options: OxContentOptions["embeds"]): ResolvedOptions["embeds"];
5941
+ //#endregion
5942
+ //#region src/resolve-options.d.ts
5943
+ declare function resolveMathOptions(options: OxContentOptions["math"]): ResolvedOptions["math"];
5944
+ declare function resolveBadgeOptions(options: OxContentOptions["badges"]): ResolvedOptions["badges"];
5945
+ declare function resolveKeyboardKeysOptions(options: OxContentOptions["keyboardKeys"]): NonNullable<ResolvedOptions["keyboardKeys"]>;
5946
+ //#endregion
5947
+ //#region src/abbreviations-options.d.ts
5948
+ declare function resolveAbbreviationsOptions(options: OxContentOptions["abbreviations"]): ResolvedAbbreviationsOptions;
5949
+ //#endregion
5950
+ //#region src/not-by-ai-options.d.ts
5951
+ declare function resolveNotByAiOptions(options: OxContentOptions["notByAi"]): ResolvedOptions["notByAi"];
5952
+ //#endregion
3842
5953
  //#region src/card-options.d.ts
3843
5954
  declare function resolveCardOptions(options: OxContentOptions["cards"]): ResolvedOptions["cards"];
3844
5955
  //#endregion
3845
5956
  //#region src/include-options.d.ts
3846
5957
  declare function resolveIncludeOptions(options: OxContentOptions["includes"]): ResolvedOptions["includes"];
3847
5958
  //#endregion
5959
+ //#region src/partials-options.d.ts
5960
+ declare function resolvePartialsOptions(options: OxContentOptions["partials"]): NonNullable<ResolvedOptions["partials"]>;
5961
+ //#endregion
3848
5962
  //#region src/step-options.d.ts
3849
5963
  declare function resolveStepsOptions(options: OxContentOptions["steps"]): ResolvedOptions["steps"];
3850
5964
  //#endregion
5965
+ //#region src/code-group-options.d.ts
5966
+ declare function resolveCodeGroupOptions(options: OxContentOptions["codeGroups"]): ResolvedCodeGroupOptions;
5967
+ //#endregion
3851
5968
  //#region src/file-tree-options.d.ts
3852
5969
  declare function resolveFileTreeOptions(options: OxContentOptions["fileTree"]): ResolvedOptions["fileTree"];
3853
5970
  //#endregion
5971
+ //#region src/data-table-options.d.ts
5972
+ declare function resolveDataTableOptions(options: OxContentOptions["dataTables"]): ResolvedOptions["dataTables"];
5973
+ //#endregion
5974
+ //#region src/image-gallery-options.d.ts
5975
+ declare function resolveImageGalleryOptions(options: OxContentOptions["imageGalleries"]): ResolvedImageGalleryOptions;
5976
+ //#endregion
5977
+ //#region src/timeline-options.d.ts
5978
+ declare function resolveTimelineOptions(options: OxContentOptions["timelines"]): ResolvedTimelineOptions;
5979
+ //#endregion
5980
+ //#region src/heading-permalinks-options.d.ts
5981
+ declare function resolveHeadingPermalinksOptions(options: OxContentOptions["headingPermalinks"]): ResolvedOptions["headingPermalinks"];
5982
+ //#endregion
5983
+ //#region src/typed-hover.d.ts
5984
+ declare function resolveTypedHoverOptions(options: OxContentOptions["typedHover"]): ResolvedTypedHoverOptions;
5985
+ //#endregion
3854
5986
  //#region src/environment.d.ts
3855
5987
  /**
3856
5988
  * Creates the Markdown processing environment configuration.
@@ -4017,6 +6149,9 @@ declare function renderMarkdownStream(chunks: MarkdownChunkSource, options?: Inc
4017
6149
  * - `html` (string): Rendered HTML content with all enhancements applied
4018
6150
  * - `frontmatter` (object): Parsed YAML frontmatter as JavaScript object
4019
6151
  * - `toc` (array): Hierarchical table of contents entries
6152
+ * - `imports` (array): MDX import statements (`source` + specifiers)
6153
+ * - `exports` (array): MDX export names
6154
+ * - `components` (array): Unique JSX component names
4020
6155
  * - `render` (function): Client-side render function for dynamic updates
4021
6156
  *
4022
6157
  * ## Markdown Features Supported
@@ -4091,6 +6226,156 @@ interface SsgTransformOptions {
4091
6226
  }
4092
6227
  declare function transformMarkdown(source: string, filePath: string, options: ResolvedOptions, ssgOptions?: SsgTransformOptions): Promise<TransformResult>;
4093
6228
  //#endregion
6229
+ //#region src/render-markdown.d.ts
6230
+ /**
6231
+ * Processor that resolves `OxContentOptions` once and renders many documents.
6232
+ */
6233
+ interface MarkdownProcessor {
6234
+ render(source: string, filePath: string): Promise<TransformResult>;
6235
+ }
6236
+ /**
6237
+ * Resolves public options once so custom `ssg: false` hosts can reuse the pipeline.
6238
+ */
6239
+ declare function createMarkdownProcessor(options?: OxContentOptions): MarkdownProcessor;
6240
+ /**
6241
+ * Run the Vite plugin Markdown/MDX pipeline from public `OxContentOptions`.
6242
+ *
6243
+ * Returns structured `TransformResult` fields (`html`, `frontmatter`, `toc`,
6244
+ * MDX metadata) so consumers do not need to cast a Vite hook or parse
6245
+ * generated module source. `.md` / `.mdx` inference matches `oxContent()`.
6246
+ */
6247
+ declare function renderMarkdown(source: string, filePath: string, options?: OxContentOptions): Promise<TransformResult>;
6248
+ //#endregion
6249
+ //#region src/markdown.d.ts
6250
+ declare const DEFAULT_MARKDOWN_EXTENSIONS: readonly [".md", ".markdown", ".mdx"];
6251
+ declare function normalizeMarkdownExtensions(extensions?: readonly string[]): string[];
6252
+ declare function isMarkdownFilePath(filePath: string, extensions?: readonly string[]): boolean;
6253
+ /** Returns true when a resource id points at an MDX source file. */
6254
+ declare function isMdxFilePath(filePath: string): boolean;
6255
+ /** Explicit configuration wins; otherwise MDX follows the source extension. */
6256
+ declare function resolveMdxForFilePath(filePath: string, configured?: boolean): boolean;
6257
+ declare function stripMarkdownExtension(filePath: string, extensions?: readonly string[]): string;
6258
+ //#endregion
6259
+ //#region src/mdx-islands.d.ts
6260
+ /**
6261
+ * Discover registered MDX islands from the mdast tree or rendered HTML.
6262
+ *
6263
+ * Framework plugins use this instead of a source regex when MDX is on, so
6264
+ * nested JSX, expression attributes, and fragments stay visible. Names that
6265
+ * are not in the global `components` map and are not document-local import
6266
+ * bindings are left as static HTML.
6267
+ */
6268
+ /** Global component map: object, Map, or name list. */
6269
+ type ComponentRegistry = Readonly<Record<string, unknown>> | ReadonlyMap<string, unknown> | Iterable<string>;
6270
+ /**
6271
+ * Collect named MDX JSX tags from a parsed mdast tree (JSON from NAPI `parse()`).
6272
+ * Fragments (`name: null`) and non-JSX nodes are ignored. Walks nested children
6273
+ * so inner islands are found.
6274
+ */
6275
+ declare function collectMdxJsxNamesFromAst(ast: unknown): string[];
6276
+ /**
6277
+ * Collect `data-ox-island` names from Rust-rendered HTML.
6278
+ * Used when an AST walk is unavailable.
6279
+ */
6280
+ declare function collectMdxIslandNamesFromHtml(html: string): string[];
6281
+ /** Keep names that exist on the global component map, in first-seen order. */
6282
+ declare function intersectRegisteredComponentNames(names: Iterable<string>, components: ComponentRegistry): string[];
6283
+ /**
6284
+ * Keep names that are either globally registered or document-local bindings.
6285
+ */
6286
+ declare function intersectHydratableComponentNames(names: Iterable<string>, components: ComponentRegistry, localNames?: Iterable<string>): string[];
6287
+ interface DiscoverRegisteredMdxComponentsInput {
6288
+ /** Markdown/MDX body (frontmatter already stripped). */
6289
+ source: string;
6290
+ /** Rendered HTML, used when `parse()` is missing or the AST walk fails. */
6291
+ html?: string;
6292
+ components: ComponentRegistry;
6293
+ /** Document-local import bindings. These override the global map for this file. */
6294
+ localNames?: Iterable<string>;
6295
+ }
6296
+ /**
6297
+ * Resolve registered island names for an MDX document.
6298
+ *
6299
+ * Prefers a NAPI `parse()` AST walk. Falls back to rendered `data-ox-island`
6300
+ * names so plugins still hydrate if #659 metadata is not present.
6301
+ */
6302
+ declare function discoverRegisteredMdxComponents(input: DiscoverRegisteredMdxComponentsInput): Promise<string[]>;
6303
+ declare function isRegisteredComponent(name: string, components: ComponentRegistry): boolean;
6304
+ //#endregion
6305
+ //#region src/document-imports.d.ts
6306
+ interface ResolveDocumentComponentImportsInput {
6307
+ imports: readonly MdxImport[];
6308
+ documentPath: string;
6309
+ contentRoot?: string;
6310
+ srcDir?: string;
6311
+ }
6312
+ interface ResolvedDocumentComponentImport {
6313
+ localName: string;
6314
+ specifier: string;
6315
+ resolvedPath: string;
6316
+ importPathRelativeToDocument: string;
6317
+ imported: string;
6318
+ kind: Exclude<MdxImportSpecifierKind, "namespace">;
6319
+ }
6320
+ type DocumentImportDiagnosticCode = "not-relative" | "escapes-root" | "duplicate-binding";
6321
+ interface DocumentImportDiagnostic {
6322
+ code: DocumentImportDiagnosticCode;
6323
+ message: string;
6324
+ specifier: string;
6325
+ localName?: string;
6326
+ }
6327
+ interface ResolveDocumentComponentImportsResult {
6328
+ bindings: ResolvedDocumentComponentImport[];
6329
+ diagnostics: DocumentImportDiagnostic[];
6330
+ }
6331
+ declare function resolveContentRootPath(input: {
6332
+ contentRoot?: string;
6333
+ srcDir?: string;
6334
+ root?: string;
6335
+ }): string;
6336
+ declare function stripViteQuery(id: string): string;
6337
+ declare function resolveDocumentComponentImports(input: ResolveDocumentComponentImportsInput): ResolveDocumentComponentImportsResult;
6338
+ //#endregion
6339
+ //#region src/document-islands.d.ts
6340
+ interface DiscoverDocumentMdxIslandsInput {
6341
+ source: string;
6342
+ html?: string;
6343
+ components: ComponentRegistry;
6344
+ imports: readonly MdxImport[];
6345
+ documentPath: string;
6346
+ contentRoot?: string;
6347
+ srcDir?: string;
6348
+ root?: string;
6349
+ }
6350
+ interface DiscoverDocumentMdxIslandsResult {
6351
+ usedComponents: string[];
6352
+ localBindings: Map<string, ResolvedDocumentComponentImport>;
6353
+ diagnostics: DocumentImportDiagnostic[];
6354
+ }
6355
+ declare function discoverDocumentMdxIslands(input: DiscoverDocumentMdxIslandsInput): Promise<DiscoverDocumentMdxIslandsResult>;
6356
+ //#endregion
6357
+ //#region src/island-codegen.d.ts
6358
+ type GlobalComponentMap = Readonly<Record<string, string>> | ReadonlyMap<string, string>;
6359
+ interface RenderIslandComponentImportsInput {
6360
+ globalComponents: GlobalComponentMap;
6361
+ localBindings?: ReadonlyMap<string, ResolvedDocumentComponentImport>;
6362
+ documentPath: string;
6363
+ root?: string;
6364
+ }
6365
+ declare function renderIslandComponentImports(usedComponents: readonly string[], input: RenderIslandComponentImportsInput): string;
6366
+ //#endregion
6367
+ //#region src/island-ssr.d.ts
6368
+ /**
6369
+ * Optional adapter-side island SSR.
6370
+ *
6371
+ * Framework plugins may supply `renderIsland` to replace island inner HTML at
6372
+ * transform time. The hook receives the original slot HTML so adapters can pass
6373
+ * children into their SSR runtime. This helper stays framework-neutral and does
6374
+ * not import a framework SSR runtime.
6375
+ */
6376
+ type RenderIslandFn = (name: string, props: Record<string, unknown>, filePath: string, slotHtml?: string) => string | Promise<string>;
6377
+ declare function applyIslandSsrHtml(html: string, renderIsland: RenderIslandFn, filePath: string, names?: Iterable<string>): Promise<string>;
6378
+ //#endregion
4094
6379
  //#region src/resolve-image-options.d.ts
4095
6380
  declare function resolveImageOptions(options: OxContentOptions["images"]): ResolvedOptions["images"];
4096
6381
  //#endregion
@@ -4118,6 +6403,7 @@ interface FrameworkMarkdownOptions {
4118
6403
  math?: boolean | {
4119
6404
  enabled?: boolean;
4120
6405
  };
6406
+ mdx?: boolean;
4121
6407
  }
4122
6408
  interface FrameworkComponentIsland {
4123
6409
  name: string;
@@ -4399,10 +6685,14 @@ declare function extractDocs(srcDirs: string[], options: ResolvedDocsOptions): P
4399
6685
  * Generates Markdown documentation from extracted docs.
4400
6686
  */
4401
6687
  declare function generateMarkdown(docs: ExtractedDocs[], options: ResolvedDocsOptions): Record<string, string>;
6688
+ /**
6689
+ * Generates Markdown documentation from local OpenAPI 3.0/3.1 files.
6690
+ */
6691
+ declare function generateOpenApiDocs(options: ResolvedDocsOptions, root?: string): GeneratedOpenApiDocs;
4402
6692
  /**
4403
6693
  * Writes generated documentation to the output directory.
4404
6694
  */
4405
- declare function writeDocs(docs: Record<string, string>, outDir: string, extractedDocs?: ExtractedDocs[], options?: ResolvedDocsOptions): Promise<void>;
6695
+ declare function writeDocs(docs: Record<string, string>, outDir: string, extractedDocs?: ExtractedDocs[], options?: ResolvedDocsOptions, extraNav?: DocsNavigationItem[]): Promise<void>;
4406
6696
  /**
4407
6697
  * Resolves docs options with defaults.
4408
6698
  */
@@ -4727,6 +7017,76 @@ interface SsgBuildResult {
4727
7017
  */
4728
7018
  declare function buildSsg(options: ResolvedOptions, root: string): Promise<SsgBuildResult>;
4729
7019
  //#endregion
7020
+ //#region src/page-head.d.ts
7021
+ /** How invalid head descriptors are reported. */
7022
+ type HeadValidationMode = false | "off" | "warn" | "strict";
7023
+ interface SiteHead {
7024
+ name?: string;
7025
+ url?: string;
7026
+ locale?: string;
7027
+ titleTemplate?: string;
7028
+ }
7029
+ interface HeadMeta {
7030
+ key?: string;
7031
+ name?: string;
7032
+ property?: string;
7033
+ httpEquiv?: string;
7034
+ content: string;
7035
+ }
7036
+ interface HeadLink {
7037
+ key?: string;
7038
+ rel: string;
7039
+ href: string;
7040
+ hreflang?: string;
7041
+ type?: string;
7042
+ sizes?: string;
7043
+ }
7044
+ interface HeadAlternate {
7045
+ lang: string;
7046
+ href: string;
7047
+ }
7048
+ interface HeadJsonLd {
7049
+ key?: string;
7050
+ json: string;
7051
+ }
7052
+ /**
7053
+ * Build-time page-head input. Unhead-shaped, no client runtime.
7054
+ *
7055
+ * Unknown keys such as `twitter.imggg` are a TypeScript error here. Use
7056
+ * `metas` / `links` for extra tags.
7057
+ */
7058
+ interface HeadInput {
7059
+ site?: SiteHead;
7060
+ title?: string;
7061
+ titleTemplate?: string;
7062
+ titleSuffix?: boolean;
7063
+ description?: string;
7064
+ canonical?: string;
7065
+ robots?: string;
7066
+ ogImage?: string;
7067
+ ogType?: string;
7068
+ twitterCard?: "summary" | "summary_large_image" | (string & {});
7069
+ social?: boolean;
7070
+ emitSiteName?: boolean;
7071
+ trusted?: boolean;
7072
+ metas?: HeadMeta[];
7073
+ links?: HeadLink[];
7074
+ alternates?: HeadAlternate[];
7075
+ jsonLd?: HeadJsonLd[];
7076
+ validation?: "off" | "warn" | "strict";
7077
+ }
7078
+ interface HeadDiagnostic {
7079
+ strict: boolean;
7080
+ message: string;
7081
+ }
7082
+ interface RenderedHead {
7083
+ html: string;
7084
+ diagnostics: HeadDiagnostic[];
7085
+ }
7086
+ /** Resolve descriptors to escaped `<head>` markup. Build-time only. */
7087
+ declare function renderHead(input: HeadInput): RenderedHead;
7088
+ declare function resolveHeadValidation(value: HeadValidationMode | undefined): false | "warn" | "strict";
7089
+ //#endregion
4730
7090
  //#region src/not-found.d.ts
4731
7091
  /**
4732
7092
  * Resolves `ssg.notFound` with defaults.
@@ -4737,6 +7097,26 @@ declare function buildSsg(options: ResolvedOptions, root: string): Promise<SsgBu
4737
7097
  declare function resolveNotFoundOptions(value: boolean | NotFoundOptions | undefined): ResolvedNotFoundOptions;
4738
7098
  //#endregion
4739
7099
  //#region src/site-maps.d.ts
7100
+ /** One page considered for crawl manifests. */
7101
+ interface SiteMapPageInput {
7102
+ loc: string;
7103
+ title: string;
7104
+ description?: string;
7105
+ /** Source-file git commit time in milliseconds. Omitted when Git has no history. */
7106
+ lastUpdated?: number;
7107
+ draft?: boolean;
7108
+ unlisted?: boolean;
7109
+ }
7110
+ /** Inputs for writing crawl manifests next to generated HTML. */
7111
+ interface WriteSiteMapFilesInput {
7112
+ outDir: string;
7113
+ siteUrl?: string;
7114
+ base: string;
7115
+ siteName?: string;
7116
+ siteDescription?: string;
7117
+ options?: ResolvedSiteMapsOptions;
7118
+ pages: readonly SiteMapPageInput[];
7119
+ }
4740
7120
  /**
4741
7121
  * Resolves `siteMaps` with defaults.
4742
7122
  *
@@ -4744,6 +7124,36 @@ declare function resolveNotFoundOptions(value: boolean | NotFoundOptions | undef
4744
7124
  * enables the feature and overrides only the fields the site set.
4745
7125
  */
4746
7126
  declare function resolveSiteMapsOptions(value: boolean | SiteMapsOptions | undefined): ResolvedSiteMapsOptions;
7127
+ /** Writes enabled crawl manifests into `outDir`. */
7128
+ declare function writeSiteMapFiles(input: WriteSiteMapFilesInput): Promise<{
7129
+ files: string[];
7130
+ warning?: string;
7131
+ }>;
7132
+ //#endregion
7133
+ //#region src/markdown-source.d.ts
7134
+ /** One page that may receive a source companion. */
7135
+ interface MarkdownSourcePageInput {
7136
+ inputPath: string;
7137
+ /** Already-read source bytes. Omitted pages are skipped. */
7138
+ source?: string;
7139
+ urlPath: string;
7140
+ frontmatter: Record<string, unknown>;
7141
+ }
7142
+ /** Inputs for writing companions next to generated HTML. */
7143
+ interface WriteMarkdownSourceFilesInput {
7144
+ outDir: string;
7145
+ base: string;
7146
+ options?: ResolvedMarkdownSourceOptions | null;
7147
+ publishState?: ResolvedPublishStateOptions;
7148
+ pages: readonly MarkdownSourcePageInput[];
7149
+ }
7150
+ /**
7151
+ * Resolves `ssg.markdownSource` with defaults.
7152
+ *
7153
+ * `false` / omitted stays off. `true` enables companions and the alternate
7154
+ * link. An object enables the feature and overrides only the fields set.
7155
+ */
7156
+ declare function resolveMarkdownSourceOptions(value: boolean | MarkdownSourceOptions | undefined): ResolvedMarkdownSourceOptions;
4747
7157
  //#endregion
4748
7158
  //#region src/publish-state.d.ts
4749
7159
  /** Split pages into production output vs listing surfaces. */
@@ -4780,19 +7190,122 @@ declare function resolveCascadeOptions(value: boolean | CascadeOptions | undefin
4780
7190
  *
4781
7191
  * `false` / omitted stays off. `true` or `{}` enables empty defaults.
4782
7192
  * A path map (`{ "/old": "/new" }`) enables the feature with that map.
4783
- * `{ map, netlify, headers, json, allowExternal }` overrides only set fields.
7193
+ * `{ map, provider, headers, json, html, allowExternal }` overrides only set fields.
7194
+ * Pass `env` to inject CI detection without reading the real `process.env`.
7195
+ */
7196
+ declare function resolveRedirectsOptions(value: boolean | RedirectsOptions | Record<string, string> | undefined, env?: NodeJS.ProcessEnv): ResolvedRedirectsOptions;
7197
+ //#endregion
7198
+ //#region src/markdown-tables.d.ts
7199
+ interface MarkdownTableEnhancementOptions {
7200
+ /**
7201
+ * Tables to enhance. Defaults to Markdown content tables styled by
7202
+ * `@ox-content/vite-plugin/styles/core.css`.
7203
+ */
7204
+ selector?: string;
7205
+ /**
7206
+ * Accessible name applied only when an overflowing table has no existing
7207
+ * `aria-label` or `aria-labelledby`.
7208
+ */
7209
+ label?: string;
7210
+ }
7211
+ declare function markdownTableScrollLabel(locale?: string): string;
7212
+ /**
7213
+ * Makes overflowing Markdown tables keyboard-scrollable without wrapping or
7214
+ * replacing the native `<table>` element.
7215
+ *
7216
+ * Run this after rendering Markdown and again after layout-changing updates.
7217
+ * Narrow tables stay out of the tab order when overflow can be measured.
4784
7218
  */
4785
- declare function resolveRedirectsOptions(value: boolean | RedirectsOptions | Record<string, string> | undefined): ResolvedRedirectsOptions;
7219
+ declare function enhanceMarkdownTables(root?: ParentNode, options?: MarkdownTableEnhancementOptions): number;
4786
7220
  //#endregion
4787
7221
  //#region src/feeds.d.ts
7222
+ /** Inputs for rendering feed bodies. */
7223
+ interface FeedsRenderInput {
7224
+ options?: ResolvedFeedsOptions | null;
7225
+ siteUrl?: string;
7226
+ siteName?: string;
7227
+ siteDescription?: string;
7228
+ base?: string;
7229
+ collections?: Record<string, readonly FeedItemInput[]>;
7230
+ collectionNames?: readonly string[];
7231
+ items?: readonly FeedItemInput[];
7232
+ publishState?: ResolvedPublishStateOptions;
7233
+ }
7234
+ /** Rendered feed bodies, or a skip warning. */
7235
+ interface FeedsRenderResult {
7236
+ rssXml?: string;
7237
+ atomXml?: string;
7238
+ jsonFeed?: string;
7239
+ warning?: string;
7240
+ }
7241
+ interface RenderedFeedFile {
7242
+ path: string;
7243
+ contentType: string;
7244
+ content: string;
7245
+ }
7246
+ interface RenderFeedFilesInput extends FeedsRenderInput {
7247
+ base: string;
7248
+ outDir?: string;
7249
+ }
7250
+ interface RenderFeedFilesResult {
7251
+ files: RenderedFeedFile[];
7252
+ warning?: string;
7253
+ }
7254
+ interface WriteFeedFilesInput extends RenderFeedFilesInput {
7255
+ outDir: string;
7256
+ }
4788
7257
  /**
4789
7258
  * Resolves `feeds` with defaults.
4790
7259
  *
4791
7260
  * `false` / omitted stays off. `true` enables all three formats with
4792
7261
  * collection `content` (or the first configured collection) and limit 20.
4793
- * An object enables the feature and overrides only the fields the site set.
7262
+ * A single object is one default feed. A named record or array writes
7263
+ * multiple feeds.
4794
7264
  */
4795
7265
  declare function resolveFeedsOptions(value: boolean | FeedsOptions | undefined): ResolvedFeedsOptions;
7266
+ /** Builds RSS / Atom / JSON Feed bodies without writing files. */
7267
+ declare function generateFeeds(input: FeedsRenderInput): FeedsRenderResult;
7268
+ declare function renderFeedFiles(input: RenderFeedFilesInput): Promise<RenderFeedFilesResult>;
7269
+ declare function writeFeedFiles(input: WriteFeedFilesInput): Promise<{
7270
+ files: string[];
7271
+ warning?: string;
7272
+ }>;
7273
+ //#endregion
7274
+ //#region src/blog-options.d.ts
7275
+ declare function resolveBlogOptions(value: boolean | BlogOptions | undefined): ResolvedBlogOptions;
7276
+ /**
7277
+ * Picks a collection named `blog`, else the only configured collection.
7278
+ *
7279
+ * An explicit name always wins. Several collections and no `blog` name
7280
+ * require `blog.collection`.
7281
+ */
7282
+ declare function resolveBlogCollectionName(requested: string | undefined, collectionNames: readonly string[]): string | undefined;
7283
+ //#endregion
7284
+ //#region src/blog-feeds.d.ts
7285
+ declare class BlogFeedError extends Error {
7286
+ readonly issues: string[];
7287
+ constructor(issues: string[]);
7288
+ }
7289
+ //#endregion
7290
+ //#region src/blog-reading.d.ts
7291
+ /**
7292
+ * Deterministic blog reading-time estimates.
7293
+ */
7294
+ declare function readingTimeMinutes(markdown: string): number;
7295
+ //#endregion
7296
+ //#region src/budoux.d.ts
7297
+ declare function resolveBudouxOptions(options: OxContentOptions["budoux"]): ResolvedBudouxOptions;
7298
+ declare function transformBudouxHtml(html: string, options: ResolvedBudouxOptions | undefined): Promise<string>;
7299
+ //#endregion
7300
+ //#region src/pwa.d.ts
7301
+ /**
7302
+ * Resolves `pwa` with defaults.
7303
+ *
7304
+ * `false` / omitted stays off. `true` enables the manifest and offline
7305
+ * service worker. An object enables the feature and overrides only the
7306
+ * fields the site set.
7307
+ */
7308
+ declare function resolvePwaOptions(value: boolean | PwaOptions | undefined): ResolvedPwaOptions;
4796
7309
  //#endregion
4797
7310
  //#region src/taxonomies.d.ts
4798
7311
  /**
@@ -4810,6 +7323,17 @@ declare function resolveTaxonomiesOptions(value: boolean | TaxonomiesOptions | u
4810
7323
  */
4811
7324
  declare function resolveVersionsOptions(value: boolean | VersionsOptions | undefined): ResolvedVersionsOptions;
4812
7325
  //#endregion
7326
+ //#region src/resources.d.ts
7327
+ declare class PageResourceError extends Error {
7328
+ readonly issues: string[];
7329
+ constructor(issues: string[]);
7330
+ }
7331
+ /**
7332
+ * Resolves `resources`. Omitted / `false` stay off. `true` or `{}` enables
7333
+ * defaults. An object enables the feature and overrides only set fields.
7334
+ */
7335
+ declare function resolveResourcesOptions(value: boolean | ResourcesOptions | undefined): ResolvedResourcesOptions;
7336
+ //#endregion
4813
7337
  //#region src/team.d.ts
4814
7338
  /**
4815
7339
  * Resolves `ssg.team` with defaults.
@@ -4819,6 +7343,15 @@ declare function resolveVersionsOptions(value: boolean | VersionsOptions | undef
4819
7343
  */
4820
7344
  declare function resolveTeamOptions(value: boolean | TeamOptions | undefined): ResolvedTeamOptions;
4821
7345
  //#endregion
7346
+ //#region src/section-index.d.ts
7347
+ /**
7348
+ * Resolves `ssg.sectionIndex` with defaults.
7349
+ *
7350
+ * `false` / omitted stays off. `true` enables card listings. An object
7351
+ * enables the feature and overrides only the fields the site set.
7352
+ */
7353
+ declare function resolveSectionIndexOptions(value: boolean | SectionIndexOptions | undefined): ResolvedSectionIndexOptions;
7354
+ //#endregion
4822
7355
  //#region src/search.d.ts
4823
7356
  /**
4824
7357
  * Resolves search options with defaults.
@@ -4831,7 +7364,7 @@ declare function resolveSearchOptions(options: SearchOptions | boolean | undefin
4831
7364
  * then drops matching documents and rebuilds the BM25 index so omitted
4832
7365
  * pages (such as the opt-in 404 source) are not searchable.
4833
7366
  */
4834
- declare function buildSearchIndex(srcDir: string, base: string, extensions?: readonly string[], publishState?: ResolvedPublishStateOptions, excludeDocumentIds?: readonly string[], mdx?: boolean): Promise<string>;
7367
+ declare function buildSearchIndex(srcDir: string, base: string, extensions?: readonly string[], publishState?: ResolvedPublishStateOptions, excludeDocumentIds?: readonly string[], mdx?: boolean, conditionalBlocks?: ResolvedConditionalBlockOptions, citations?: ResolvedCitationsOptions): Promise<string>;
4835
7368
  /**
4836
7369
  * Writes the search index to a file.
4837
7370
  */
@@ -4844,12 +7377,6 @@ declare function resolveCollectionsOptions(options: CollectionsOptions | boolean
4844
7377
  declare function buildCollectionManifest(root: string, options: ResolvedOptions): Promise<CollectionManifest>;
4845
7378
  declare function generateCollectionsVirtualModule(root: string, options: ResolvedOptions): Promise<string>;
4846
7379
  //#endregion
4847
- //#region src/markdown.d.ts
4848
- declare const DEFAULT_MARKDOWN_EXTENSIONS: readonly [".md", ".markdown", ".mdx"];
4849
- declare function normalizeMarkdownExtensions(extensions?: readonly string[]): string[];
4850
- declare function isMarkdownFilePath(filePath: string, extensions?: readonly string[]): boolean;
4851
- declare function stripMarkdownExtension(filePath: string, extensions?: readonly string[]): string;
4852
- //#endregion
4853
7380
  //#region src/vitepress.d.ts
4854
7381
  interface VitePressLogo {
4855
7382
  light?: string;
@@ -4982,7 +7509,7 @@ declare function generateHydrationScript(components: string[]): string;
4982
7509
  //#endregion
4983
7510
  //#region src/og-image/types.d.ts
4984
7511
  /**
4985
- * Type definitions for Chromium-based OG image generation.
7512
+ * Type definitions for OG image generation.
4986
7513
  */
4987
7514
  /**
4988
7515
  * Props passed to OG image template functions.
@@ -5005,10 +7532,66 @@ interface OgImageTemplateProps {
5005
7532
  * Template function that receives page metadata and returns an HTML string.
5006
7533
  */
5007
7534
  type OgImageTemplateFn = (props: OgImageTemplateProps) => string | Promise<string>;
7535
+ /**
7536
+ * OG image rendering backend.
7537
+ */
7538
+ type OgImageRenderer$1 = "chromium" | "satori";
7539
+ /**
7540
+ * Font weight values supported by Satori.
7541
+ */
7542
+ type OgImageSatoriFontWeight$1 = 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;
7543
+ /**
7544
+ * Font file loaded by the Satori renderer.
7545
+ */
7546
+ interface OgImageSatoriFont$1 {
7547
+ /**
7548
+ * Absolute path, or a path relative to the project root.
7549
+ */
7550
+ path: string;
7551
+ /**
7552
+ * Font family name used by template CSS.
7553
+ */
7554
+ name?: string;
7555
+ /**
7556
+ * Font weight.
7557
+ * @default 400
7558
+ */
7559
+ weight?: OgImageSatoriFontWeight$1;
7560
+ /**
7561
+ * Font style.
7562
+ * @default "normal"
7563
+ */
7564
+ style?: "normal" | "italic";
7565
+ }
7566
+ /**
7567
+ * Satori renderer options.
7568
+ */
7569
+ interface OgImageSatoriOptions$1 {
7570
+ /**
7571
+ * Font files passed to Satori.
7572
+ *
7573
+ * Satori cannot render text without at least one font. When omitted,
7574
+ * Ox Content tries a small set of system font paths unless
7575
+ * `systemFontFallback` is disabled.
7576
+ */
7577
+ fonts?: OgImageSatoriFont$1[];
7578
+ /**
7579
+ * Try known OS font paths when `fonts` is empty.
7580
+ * @default true
7581
+ */
7582
+ systemFontFallback?: boolean;
7583
+ }
5008
7584
  /**
5009
7585
  * OG image generation options (user-facing).
5010
7586
  */
5011
7587
  interface OgImageOptions$1 {
7588
+ /**
7589
+ * Rendering backend.
7590
+ * - `"chromium"`: full browser rendering, best template compatibility
7591
+ * - `"satori"`: fast HTML-to-SVG-to-PNG rendering, limited CSS subset
7592
+ * @default "chromium"
7593
+ */
7594
+ renderer?: OgImageRenderer$1;
5012
7595
  /**
5013
7596
  * Path to a custom template file (.ts, .vue, .svelte, .tsx/.jsx).
5014
7597
  * - `.ts`: default-export a function `(props) => string`
@@ -5046,17 +7629,26 @@ interface OgImageOptions$1 {
5046
7629
  * @default 1
5047
7630
  */
5048
7631
  concurrency?: number;
7632
+ /**
7633
+ * Options for the Satori renderer.
7634
+ */
7635
+ satori?: OgImageSatoriOptions$1;
5049
7636
  }
5050
7637
  /**
5051
7638
  * Resolved OG image options with all defaults applied.
5052
7639
  */
5053
7640
  interface ResolvedOgImageOptions {
7641
+ renderer: OgImageRenderer$1;
5054
7642
  template?: string;
5055
7643
  vuePlugin: "vitejs" | "vizejs";
5056
7644
  width: number;
5057
7645
  height: number;
5058
7646
  cache: boolean;
5059
7647
  concurrency: number;
7648
+ satori: {
7649
+ fonts: OgImageSatoriFont$1[];
7650
+ systemFontFallback: boolean;
7651
+ };
5060
7652
  }
5061
7653
  //#endregion
5062
7654
  //#region src/og-image/browser.d.ts
@@ -5077,9 +7669,6 @@ interface OgBrowserSession extends AsyncDisposable {
5077
7669
  }
5078
7670
  //#endregion
5079
7671
  //#region src/og-image/index.d.ts
5080
- /**
5081
- * Resolves user-provided OG image options with defaults.
5082
- */
5083
7672
  declare function resolveOgImageOptions(options: OgImageOptions$1 | undefined): ResolvedOgImageOptions;
5084
7673
  /**
5085
7674
  * A single page entry for batch OG image generation.
@@ -5101,7 +7690,7 @@ interface OgImageResult {
5101
7690
  /**
5102
7691
  * Generates OG images for a batch of pages.
5103
7692
  *
5104
- * Manages the full lifecycle: resolve template → launch browser (with `using`)
7693
+ * Manages the full lifecycle: resolve template → select renderer
5105
7694
  * render each page (with caching and concurrency).
5106
7695
  *
5107
7696
  * All errors are non-fatal: failures are reported in results but never throw.
@@ -5118,6 +7707,115 @@ declare function resolveI18nOptions(options: I18nOptions | false | undefined): R
5118
7707
  */
5119
7708
  declare function createI18nPlugin(resolvedOptions: ResolvedOptions): Plugin;
5120
7709
  //#endregion
7710
+ //#region src/ssg-output-write.d.ts
7711
+ /** One host-rendered page that may receive resource fingerprinting. */
7712
+ interface WriteResourceFilesPage {
7713
+ html: string;
7714
+ inputPath: string;
7715
+ outputPath: string;
7716
+ }
7717
+ /** Inputs for writing fingerprinted page resources from host HTML. */
7718
+ interface WriteResourceFilesInput {
7719
+ pages: readonly WriteResourceFilesPage[];
7720
+ srcDir: string;
7721
+ outDir: string;
7722
+ root?: string;
7723
+ base?: string;
7724
+ options?: ResolvedResourcesOptions | null;
7725
+ cacheDir?: string;
7726
+ }
7727
+ /** Rewritten host pages plus emitted resource paths. */
7728
+ interface WriteResourceFilesResult {
7729
+ pages: WriteResourceFilesPage[];
7730
+ files: string[];
7731
+ errors: string[];
7732
+ }
7733
+ /**
7734
+ * Fingerprint, rewrite, and emit page resources for host-rendered HTML.
7735
+ *
7736
+ * Uses the same `resources` option object and emit path as `buildSsg()`.
7737
+ * Throws `PageResourceError` when `missing: "error"` hits a fatal issue.
7738
+ */
7739
+ declare function writeResourceFiles(input: WriteResourceFilesInput): Promise<WriteResourceFilesResult>;
7740
+ /**
7741
+ * Write Markdown companions for host-rendered pages.
7742
+ *
7743
+ * Reuses `writeMarkdownSourceFiles` from the copy-as-markdown pipeline.
7744
+ */
7745
+ declare function writeMarkdownCompanions(input: WriteMarkdownSourceFilesInput): Promise<{
7746
+ files: string[];
7747
+ errors: string[];
7748
+ }>;
7749
+ /**
7750
+ * Git last-commit time for `filePath` in milliseconds.
7751
+ *
7752
+ * Same lookup `buildSsg()` uses for `ssg.lastUpdated` and sitemap `<lastmod>`.
7753
+ * Returns `undefined` when `root` is missing, Git has no history, or NAPI is unavailable.
7754
+ */
7755
+ declare function resolveGitLastmod(filePath: string, root?: string): number | undefined;
7756
+ //#endregion
7757
+ //#region src/ssg-output.d.ts
7758
+ /** Same option objects `oxContent()` / `buildSsg()` accept. `ssg.enabled` is ignored. */
7759
+ interface PlanSsgOutputsOptions {
7760
+ base?: string;
7761
+ resources?: boolean | ResourcesOptions;
7762
+ feeds?: boolean | FeedsOptions;
7763
+ siteMaps?: boolean | SiteMapsOptions;
7764
+ publishState?: boolean | PublishStateOptions;
7765
+ ssg?: boolean | SsgOptions;
7766
+ }
7767
+ /** Inputs for planning composable SSG outputs from host-rendered pages. */
7768
+ interface PlanSsgOutputsInput {
7769
+ pages: readonly SsgOutputPageInput[];
7770
+ outDir: string;
7771
+ srcDir?: string;
7772
+ root?: string;
7773
+ siteDescription?: string;
7774
+ collections?: Record<string, readonly FeedItemInput[]>;
7775
+ collectionNames?: readonly string[];
7776
+ items?: readonly FeedItemInput[];
7777
+ options?: PlanSsgOutputsOptions | Pick<OxContentOptions, keyof PlanSsgOutputsOptions>;
7778
+ }
7779
+ /** Planned writer inputs. Call the matching `write*` function for each feature. */
7780
+ interface SsgOutputPlan {
7781
+ resources: WriteResourceFilesInput;
7782
+ markdownCompanions: {
7783
+ outDir: string;
7784
+ base: string;
7785
+ options: ResolvedMarkdownSourceOptions;
7786
+ publishState: ResolvedPublishStateOptions;
7787
+ pages: MarkdownSourcePageInput[];
7788
+ };
7789
+ feeds: {
7790
+ outDir: string;
7791
+ base: string;
7792
+ siteUrl?: string;
7793
+ siteName?: string;
7794
+ siteDescription?: string;
7795
+ options: ResolvedFeedsOptions;
7796
+ publishState: ResolvedPublishStateOptions;
7797
+ collections?: Record<string, readonly FeedItemInput[]>;
7798
+ collectionNames?: readonly string[];
7799
+ items?: readonly FeedItemInput[];
7800
+ };
7801
+ siteMaps: {
7802
+ outDir: string;
7803
+ base: string;
7804
+ siteUrl?: string;
7805
+ siteName?: string;
7806
+ siteDescription?: string;
7807
+ options: ResolvedSiteMapsOptions;
7808
+ pages: SiteMapPageInput[];
7809
+ };
7810
+ }
7811
+ /**
7812
+ * Plan resource, companion, feed, and sitemap outputs without rendering pages.
7813
+ *
7814
+ * `ssg.enabled` is ignored. Use `ssg: { enabled: false, markdownSource, lastUpdated, siteUrl }`
7815
+ * so those fields still resolve. `lastUpdated` on a page wins over git.
7816
+ */
7817
+ declare function planSsgOutputs(input: PlanSsgOutputsInput): SsgOutputPlan;
7818
+ //#endregion
5121
7819
  //#region src/index.d.ts
5122
7820
  /**
5123
7821
  * Creates the Ox Content Vite plugin.
@@ -5139,13 +7837,10 @@ declare function createI18nPlugin(resolvedOptions: ResolvedOptions): Plugin;
5139
7837
  * ```
5140
7838
  */
5141
7839
  declare function oxContent(options?: OxContentOptions): Plugin[];
5142
- declare function resolveBuiltinEmbedOptions(options: OxContentOptions["embeds"]): ResolvedOptions["embeds"];
5143
- declare function resolveMathOptions(options: OxContentOptions["math"]): ResolvedOptions["math"];
5144
- declare function resolveBadgeOptions(options: OxContentOptions["badges"]): ResolvedOptions["badges"];
5145
7840
  /**
5146
7841
  * Generates virtual module content.
5147
7842
  */
5148
7843
  declare function generateVirtualModule(path: string, options: ResolvedOptions): string;
5149
7844
  //#endregion
5150
- export { A11yOptions, AttrsOptions, BadgeOptions, type BasePageProps, BuiltinEmbedOptions, BuiltinPmOptions, CardOptions, CascadeOptions, CodeAnnotationKind, CodeAnnotationSyntax, CodeAnnotationsOptions, type CodeBlockDiagnostic, CodeBlockLintOptions, CodeBlockTypecheckOptions, CodeImportOptions, type CollectedDocsTest, CollectionEntry, CollectionIncludeField, CollectionManifest, CollectionOptions, CollectionQueryBuilder, CollectionQueryOperator, CollectionsOptions, ContainerOptions, ContainerTypeOptions, DEFAULT_HTML_TEMPLATE, DEFAULT_MARKDOWN_EXTENSIONS, DefaultTheme, DocEntry, DocMember, DocsEntryPoint, DocsOptions, DocsSortStrategy, DocsSummary, type DocsTestFileOptions, type DocsTestHarnessOptions, DocsTestOptions, DocsTestRunError, type DocsTestRunResult, type DocsTestSource, type DocsTestWriteResult, EditThisPageOptions, EmojiShortcodeOptions, EntryPageConfig, type ExtractedCodeBlock, ExtractedDocs, FeatureConfig, FeedFormat, FeedsOptions, FileTreeOptions, Fragment, type FrameworkCodegenMode, type FrameworkCodegenTarget, type FrameworkComponentIsland, type FrameworkMarkdownOptions, type FrameworkRenderTarget, type FrameworkTransformData, type FrontmatterSchema, type GenerateVitePressMigrationConfigOptions, GeneratedDocsData, type GitHubLineRange, type GitHubOptions, type GitHubRepoData, type GitHubSourceData, type GitHubSourceRef, type HeaderNavItem, HeroAction, HeroConfig, HeroImage, HeroNotice, I18nOptions, ImageOptions, IncludeOptions, type IncrementalMarkdownParseAppendOptions, type IncrementalMarkdownParseResult, IncrementalMarkdownParser, type IncrementalMarkdownParserOptions, type IncrementalMarkdownRenderAppendOptions, type IncrementalMarkdownRenderResult, IncrementalMarkdownRenderer, type IncrementalMarkdownRendererOptions, type IslandInfo, type JSXChild, type JSXElementType, type JSXNode, type JSXProps, type LoadStrategy, LocaleConfig, type LocaleLabel, type MarkdownChunkSource, MarkdownDisplayFormat, type MarkdownLintFileDiagnostic as MarkdownLintBatchDiagnostic, type MarkdownLintFileDiagnostic, type MarkdownLintDiagnostic, type MarkdownLintDictionaryOptions, type MarkdownLintFileOptions, type MarkdownLintFileOptions as MarkdownLintProjectOptions, type MarkdownLintFileResult, type MarkdownLintFilesResult, type MarkdownLintLanguage, type MarkdownLintOptions, type MarkdownLintResult, type MarkdownLintRuleOptions, type MarkdownLintSeverity, type MarkdownLintStandardDictionaryOptions, MarkdownNode, MarkdownTransformer, MathOptions, type MermaidOptions, type NavGroup, NavItem, NotFoundOptions, type OgBrowserSession, OgImageOptions, type OgImagePageEntry, type OgImageOptions$1 as OgImagePluginOptions, type OgImageResult, type OgImageTemplateFn, type OgImageTemplateProps, type OgpData, type OgpOptions, OxContentOptions, type PageChromeFlags, type PageData, type PageProps, ParamDoc, type ParseIslandsResult, PermalinksOptions, PublishStateOptions, ReaderChromeOptions, RedirectsOptions, type RenderContext, ResolvedA11y, ResolvedAttrsOptions, ResolvedBadgeOptions, ResolvedBuiltinEmbedOptions, ResolvedCardOptions, ResolvedCascadeOptions, ResolvedCodeAnnotationsOptions, ResolvedCodeBlockLintOptions, ResolvedCodeBlockTypecheckOptions, ResolvedCodeImportOptions, ResolvedCollectionOptions, ResolvedCollectionsOptions, ResolvedContainerOptions, ResolvedDocsEntryPoint, ResolvedDocsOptions, ResolvedDocsTestOptions, ResolvedEditThisPageOptions, ResolvedEmojiShortcodeOptions, ResolvedFeedsOptions, ResolvedFileTreeOptions, ResolvedI18nOptions, ResolvedImageOptions, ResolvedIncludeOptions, ResolvedMathOptions, ResolvedNotFoundOptions, ResolvedOgImageOptions, ResolvedOptions, ResolvedPermalinksOptions, ResolvedPublishStateOptions, ResolvedReaderChrome, ResolvedRedirectsOptions, ResolvedSanitizeOptions, ResolvedSearchOptions, ResolvedSiteMapsOptions, ResolvedSsgOptions, ResolvedStepsOptions, ResolvedTaxonomiesOptions, ResolvedTeamOptions, type ResolvedThemeConfig, ResolvedVersionEntry, ResolvedVersionsOptions, ResolvedWikiLinkOptions, ReturnDoc, type RunDocsTestsOptions, SanitizeOptions, ScopedSearchQuery, SearchDocument, SearchOptions, SearchResult, type SidebarItem, type SiteConfig, SiteMapsOptions, type SocialLinks, SsgNavigationGroup, SsgNavigationItem, SsgOptions, StepsOptions, TaxonomiesOptions, TeamLink, TeamMember, TeamOptions, type ThemeAnnouncement, type ThemeColors, type ThemeComponent, type ThemeConfig, type ThemeEmbed, type ThemeEntryPage, type ThemeFonts, type ThemeFooter, type ThemeHeader, type ThemeLayout, type ThemeProps, type ThemeRenderOptions, type ThemeTokens, ThrowsDoc, TocEntry, type TransformAllOptions, TransformContext, TransformResult, type TwitterEmbedOptions, type TypecheckCodeBlockOptions, VersionBannerKind, VersionEntry, VersionsOptions, type VitePressConfig, type VitePressFooter, type VitePressLogo, type VitePressNavItem, type VitePressSidebar, type VitePressSidebarItem, type VitePressSocialLink, type VitePressThemeConfig, WikiLinkOptions, type WrittenDocsTestFile, type YouTubeOptions, buildCollectionManifest, buildSearchIndex, buildSsg, classifyPublishState, clearRenderContext, collectDocsTests, collectGitHubRepos, collectGitHubSources, collectOgpUrls, convertVitePressNav, convertVitePressSidebar, createFrameworkMarkdownOptions, createI18nPlugin, createIncrementalMarkdownParser, createIncrementalMarkdownRenderer, createMarkdownEnvironment, createTheme, defaultTheme, defineCollection, defineCollections, defineTheme, each, escapeSvelteMarkup, extractCodeBlocks, extractDocs, extractDocsTests, extractIslandInfo, extractVideoId, fetchGitHubSource, fetchOgpData, fetchRepoData, fromVitePressConfig, generateCollectionsVirtualModule, generateFrontmatterTypes, generateHydrationScript, generateMarkdown, generateOgImages, generateTabsCSS, generateTypes, generateVirtualModule, generateVitePressMigrationConfig, hasIslands, inferType, isMarkdownFilePath, jsx, jsxs, lintCodeBlocks, lintMarkdown, lintMarkdownAsync, lintMarkdownFile, lintMarkdownFiles, mergeThemes, mermaidClientScript, normalizeMarkdownExtensions, normalizeVitePressFrontmatter, oxContent, parseGitHubLineRange, parseGitHubPermalink, parsePageChromeFlags, partitionPublishedPages, prefetchGitHubRepos, prefetchGitHubSources, prefetchOgpData, raw, renderAllPages, renderHtmlToFrameworkCode, renderHtmlToReactComponent, renderHtmlToReactCreateElement, renderHtmlToSvelteComponent, renderHtmlToVueComponent, renderHtmlToVueH, renderMarkdownStream, renderPage, renderToString, resolveBadgeOptions, resolveBuiltinEmbedOptions, resolveCardOptions, resolveCascadeOptions, resolveCollectionsOptions, resolveDocsOptions, resolveFeedsOptions, resolveFileTreeOptions, resolveHeaderNavItems, resolveI18nOptions, resolveImageOptions, resolveIncludeOptions, resolveLocaleLabel, resolveMathOptions, resolveNotFoundOptions, resolveOgImageOptions, resolvePageChromeOption, resolvePermalinksOptions, resolvePublishStateOptions, resolveRedirectsOptions, resolveSearchOptions, resolveSiteMapsOptions, resolveSsgOptions, resolveStepsOptions, resolveTaxonomiesOptions, resolveTeamOptions, resolveTheme, resolveVersionsOptions, runDocsTests, setRenderContext, shouldLintMarkdownFile, stripMarkdownExtension, transformAllPlugins, transformGitHub, transformIslands, transformMarkdown, transformMermaidStatic, transformOgp, transformTabs, transformYouTube, typecheckCodeBlocks, useIsActive, useNav, usePageProps, useRenderContext, useSiteConfig, when, writeDocs, writeDocsTestFiles, writeSearchIndex };
7845
+ export { A11yOptions, AbbreviationsOptions, AttrsOptions, BadgeOptions, type BasePageProps, type BibliographyEntry, BlogAuthor, BlogFeedError, BlogFeedFailurePolicy, BlogFeedSource, BlogOptions, type BudouxLanguage, type BudouxOptions, type BudouxParser, BuiltinEmbedOptions, BuiltinPmOptions, CardOptions, CascadeOptions, type CitationFailureMode, type CitationReference, type CitationsOptions, CodeAnnotationKind, CodeAnnotationSyntax, CodeAnnotationsOptions, type CodeBlockDiagnostic, CodeBlockLintOptions, CodeBlockTypecheckOptions, CodeGroupOptions, CodeImportOptions, type CollectedDocsTest, CollectionEntry, CollectionIncludeField, CollectionManifest, CollectionOptions, CollectionQueryBuilder, CollectionQueryOperator, CollectionsOptions, type ComponentRegistry, ConditionalBlockOptions, ContainerOptions, ContainerTypeOptions, ContributorsOptions, type CrossReferenceEntry, type CrossReferenceFailureMode, type CrossReferenceKind, type CrossReferenceLabelOptions, type CrossReferencesOptions, DEFAULT_HTML_TEMPLATE, DEFAULT_MARKDOWN_EXTENSIONS, DataTableOptions, DefaultTheme, DefinitionListOptions, type DiscoverDocumentMdxIslandsInput, type DiscoverDocumentMdxIslandsResult, type DiscoverRegisteredMdxComponentsInput, DocEntry, DocMember, DocsEntryPoint, DocsNavigationItem, DocsOptions, DocsSortStrategy, DocsSummary, type DocsTestFileOptions, type DocsTestHarnessOptions, DocsTestOptions, DocsTestRunError, type DocsTestRunResult, type DocsTestSource, type DocsTestWriteResult, type DocumentImportDiagnostic, type DocumentImportDiagnosticCode, EditThisPageOptions, EmojiShortcodeOptions, EntryPageConfig, type ExtractedCodeBlock, ExtractedDocs, FeatureConfig, FeedChannelOptions, FeedFormat, FeedItemAttachment, FeedItemAuthor, FeedItemAuthorInput, FeedItemInput, FeedItemsResolveContext, FeedItemsSource, FeedsOptions, type FeedsRenderInput, type FeedsRenderResult, FileTreeIconOptions, FileTreeOptions, Fragment, type FrameworkCodegenMode, type FrameworkCodegenTarget, type FrameworkComponentIsland, type FrameworkMarkdownOptions, type FrameworkRenderTarget, type FrameworkTransformData, type FrontmatterSchema, type GenerateVitePressMigrationConfigOptions, GeneratedDocsData, GeneratedOpenApiDocs, type GitHubLineRange, type GitHubOptions, type GitHubRepoData, type GitHubSourceCommit, type GitHubSourceData, type GitHubSourceRef, type GlobalComponentMap, type GraphvizFailureMode, type GraphvizOptions, type HeadAlternate, type HeadDiagnostic, type HeadInput, type HeadJsonLd, type HeadLink, type HeadMeta, type HeadValidationMode, type HeaderNavItem, HeadingPermalinksOptions, HeroAction, HeroConfig, HeroImage, HeroNotice, I18nOptions, IconsOptions, ImageGalleryOptions, ImageOptions, IncludeOptions, type IncrementalMarkdownParseAppendOptions, type IncrementalMarkdownParseResult, IncrementalMarkdownParser, type IncrementalMarkdownParserOptions, type IncrementalMarkdownRenderAppendOptions, type IncrementalMarkdownRenderResult, IncrementalMarkdownRenderer, type IncrementalMarkdownRendererOptions, type IslandInfo, type JSXChild, type JSXElementType, type JSXNode, type JSXProps, JsonLdOptions, JsonLdPageType, JsonLdPublisherOptions, KeyboardKeysOptions, type LoadStrategy, LocaleConfig, type LocaleLabel, MagicLinkAlias, MagicLinkImageOverride, MagicLinkOptions, type MarkdownChunkSource, MarkdownDisplayFormat, type MarkdownLintFileDiagnostic as MarkdownLintBatchDiagnostic, type MarkdownLintFileDiagnostic, type MarkdownLintDiagnostic, type MarkdownLintDictionaryOptions, type MarkdownLintFileOptions, type MarkdownLintFileOptions as MarkdownLintProjectOptions, type MarkdownLintFileResult, type MarkdownLintFilesResult, type MarkdownLintLanguage, type MarkdownLintOptions, type MarkdownLintResult, type MarkdownLintRuleOptions, type MarkdownLintSeverity, type MarkdownLintStandardDictionaryOptions, MarkdownNode, type MarkdownProcessor, MarkdownSourceOptions, type MarkdownTableEnhancementOptions, MarkdownTransformer, MathOptions, MdxImport, MdxImportSpecifier, MdxImportSpecifierKind, type MermaidOptions, type NavGroup, NavItem, NotByAiOptions, NotFoundOptions, type OgBrowserSession, OgImageOptions, type OgImagePageEntry, type OgImageOptions$1 as OgImagePluginOptions, OgImageRenderer, type OgImageResult, OgImageSatoriFont, OgImageSatoriFontWeight, OgImageSatoriOptions, type OgImageTemplateFn, type OgImageTemplateProps, type OgpData, type OgpOptions, OpenApiDocsInput, OpenApiDocsOptions, OpenApiDocsSource, OxContentOptions, type PageChromeFlags, type PageData, type PageProps, PageResourceError, ParamDoc, type ParseIslandsResult, PartialsOptions, PermalinksOptions, type PlanSsgOutputsInput, type PlanSsgOutputsOptions, PublishStateOptions, PwaOptions, ReaderChromeOptions, type RedditEmbedOptions, type RedditPostData, type RedditPostReference, RedirectProvider, RedirectsOptions, type RenderContext, type RenderFeedFilesInput, type RenderFeedFilesResult, type RenderIslandComponentImportsInput, type RenderIslandFn, type RenderedFeedFile, type RenderedHead, type ResolveDocumentComponentImportsInput, type ResolveDocumentComponentImportsResult, ResolvedA11y, ResolvedAbbreviationsOptions, ResolvedAttrsOptions, ResolvedBadgeOptions, ResolvedBlogFeedSource, ResolvedBlogOptions, type ResolvedBudouxOptions, ResolvedBuiltinEmbedOptions, ResolvedCardOptions, ResolvedCascadeOptions, type ResolvedCitationsOptions, ResolvedCodeAnnotationsOptions, ResolvedCodeBlockLintOptions, ResolvedCodeBlockTypecheckOptions, ResolvedCodeGroupOptions, ResolvedCodeImportOptions, ResolvedCollectionOptions, ResolvedCollectionsOptions, ResolvedConditionalBlockOptions, ResolvedContainerOptions, ResolvedContributors, type ResolvedCrossReferencesOptions, ResolvedDataTableOptions, ResolvedDefinitionListOptions, ResolvedDocsEntryPoint, ResolvedDocsOptions, ResolvedDocsTestOptions, type ResolvedDocumentComponentImport, ResolvedEditThisPageOptions, ResolvedEmojiShortcodeOptions, ResolvedFeedChannel, ResolvedFeedsOptions, ResolvedFileTreeOptions, type ResolvedGraphvizOptions, ResolvedHeadingPermalinksOptions, ResolvedI18nOptions, ResolvedIconsOptions, ResolvedImageGalleryOptions, ResolvedImageOptions, ResolvedIncludeOptions, ResolvedJsonLd, ResolvedKeyboardKeysOptions, ResolvedMagicLinkOptions, ResolvedMarkdownSourceOptions, ResolvedMathOptions, ResolvedNotByAiOptions, ResolvedNotFoundOptions, ResolvedOgImageOptions, ResolvedOpenApiDocsInput, ResolvedOpenApiDocsOptions, ResolvedOptions, ResolvedPartialsOptions, ResolvedPermalinksOptions, ResolvedPublishStateOptions, ResolvedPwaOptions, ResolvedReaderChrome, ResolvedRedirectsOptions, ResolvedResourcesOptions, ResolvedSanitizeOptions, ResolvedSearchOptions, ResolvedSectionIndexOptions, ResolvedSiteMapsOptions, ResolvedSsgOptions, ResolvedStepsOptions, ResolvedTaxonomiesOptions, ResolvedTeamOptions, type ResolvedThemeConfig, ResolvedTimelineOptions, ResolvedTypedHoverOptions, ResolvedVersionEntry, ResolvedVersionsOptions, ResolvedWikiLinkOptions, ResourcesOptions, ReturnDoc, type RunDocsTestsOptions, SanitizeOptions, ScopedSearchQuery, SearchDocument, SearchOptions, SearchResult, SectionIndexOptions, SectionIndexStyle, type SidebarItem, type SiteConfig, type SiteHead, SiteMapsOptions, type SocialLinks, SsgNavigationGroup, SsgNavigationItem, SsgOptions, SsgOutputPageInput, type SsgOutputPlan, StepsOptions, TaxonomiesOptions, TeamLink, TeamMember, TeamOptions, type ThemeAnnouncement, type ThemeColors, type ThemeComponent, type ThemeConfig, type ThemeEmbed, type ThemeEntryPage, type ThemeFontValue, type ThemeFonts, type ThemeFooter, type ThemeHeader, type ThemeLayout, type ThemeProps, type ThemeRenderOptions, type ThemeTokens, type ThemeWebFont, ThrowsDoc, TimelineOptions, TocEntry, type TransformAllOptions, TransformContext, TransformResult, type TwitterEmbedOptions, type TypecheckCodeBlockOptions, TypedHoverOptions, VersionBannerKind, VersionEntry, VersionsOptions, type VitePressConfig, type VitePressFooter, type VitePressLogo, type VitePressNavItem, type VitePressSidebar, type VitePressSidebarItem, type VitePressSocialLink, type VitePressThemeConfig, WikiLinkOptions, type WriteFeedFilesInput, type WriteResourceFilesInput, type WriteResourceFilesPage, type WriteResourceFilesResult, type WrittenDocsTestFile, type YouTubeOptions, applyIslandSsrHtml, buildCollectionManifest, buildSearchIndex, buildSsg, classifyPublishState, clearGraphvizCache, clearRenderContext, collectDocsTests, collectGitHubRepos, collectGitHubSources, collectMdxIslandNamesFromHtml, collectMdxJsxNamesFromAst, collectOgpUrls, convertVitePressNav, convertVitePressSidebar, createFrameworkMarkdownOptions, createI18nPlugin, createIncrementalMarkdownParser, createIncrementalMarkdownRenderer, createMarkdownEnvironment, createMarkdownProcessor, createTheme, defaultTheme, defineCollection, defineCollections, defineTheme, discoverDocumentMdxIslands, discoverRegisteredMdxComponents, each, enhanceMarkdownTables, escapeSvelteMarkup, extractCodeBlocks, extractDocs, extractDocsTests, extractIslandInfo, extractVideoId, fetchGitHubSource, fetchOgpData, fetchRepoData, fromVitePressConfig, generateCollectionsVirtualModule, generateFeeds, generateFrontmatterTypes, generateHydrationScript, generateMarkdown, generateOgImages, generateOpenApiDocs, generateTabsCSS, generateTypes, generateVirtualModule, generateVitePressMigrationConfig, hasIslands, inferType, intersectHydratableComponentNames, intersectRegisteredComponentNames, isMarkdownFilePath, isMdxFilePath, isRegisteredComponent, jsx, jsxs, lintCodeBlocks, lintMarkdown, lintMarkdownAsync, lintMarkdownFile, lintMarkdownFiles, markdownTableScrollLabel, mergeThemes, mermaidClientScript, normalizeMarkdownExtensions, normalizeVitePressFrontmatter, oxContent, parseGitHubLineRange, parseGitHubPermalink, parsePageChromeFlags, parseRedditPostReference, partitionPublishedPages, planSsgOutputs, prefetchGitHubRepos, prefetchGitHubSources, prefetchOgpData, raw, readingTimeMinutes, renderAllPages, renderFeedFiles, renderHead, renderHtmlToFrameworkCode, renderHtmlToReactComponent, renderHtmlToReactCreateElement, renderHtmlToSvelteComponent, renderHtmlToVueComponent, renderHtmlToVueH, renderIslandComponentImports, renderMarkdown, renderMarkdownStream, renderPage, renderToString, resolveAbbreviationsOptions, resolveBadgeOptions, resolveBlogCollectionName, resolveBlogOptions, resolveBudouxOptions, resolveBuiltinEmbedOptions, resolveCardOptions, resolveCascadeOptions, resolveCodeGroupOptions, resolveCollectionsOptions, resolveContentRootPath, resolveDataTableOptions, resolveDocsOptions, resolveDocumentComponentImports, resolveFeedsOptions, resolveFileTreeOptions, resolveGitLastmod, resolveGraphvizOptions, resolveHeadValidation, resolveHeaderNavItems, resolveHeadingPermalinksOptions, resolveI18nOptions, resolveImageGalleryOptions, resolveImageOptions, resolveIncludeOptions, resolveKeyboardKeysOptions, resolveLocaleLabel, resolveMarkdownSourceOptions, resolveMathOptions, resolveMdxForFilePath, resolveNotByAiOptions, resolveNotFoundOptions, resolveOgImageOptions, resolvePageChromeOption, resolvePartialsOptions, resolvePermalinksOptions, resolvePublishStateOptions, resolvePwaOptions, resolveRedirectsOptions, resolveResourcesOptions, resolveSearchOptions, resolveSectionIndexOptions, resolveSiteMapsOptions, resolveSsgOptions, resolveStepsOptions, resolveTaxonomiesOptions, resolveTeamOptions, resolveTheme, resolveTimelineOptions, resolveTypedHoverOptions, resolveVersionsOptions, runDocsTests, setRenderContext, shouldLintMarkdownFile, stripMarkdownExtension, stripViteQuery, transformAllPlugins, transformBudouxHtml, transformGitHub, transformGraphvizStatic, transformIslands, transformMarkdown, transformMermaidStatic, transformOgp, transformRedditEmbeds, transformTabs, transformYouTube, typecheckCodeBlocks, useIsActive, useNav, usePageProps, useRenderContext, useSiteConfig, when, writeDocs, writeDocsTestFiles, writeFeedFiles, writeMarkdownCompanions, writeResourceFiles, writeSearchIndex, writeSiteMapFiles };
5151
7846
  //# sourceMappingURL=index.d.mts.map