@aravindc26/velu 0.11.0 → 0.11.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/package.json +15 -6
  2. package/schema/velu.schema.json +1251 -115
  3. package/src/build.ts +1121 -304
  4. package/src/cli.ts +90 -26
  5. package/src/engine/_server.mjs +1684 -277
  6. package/src/engine/app/(docs)/[...slug]/layout.tsx +371 -0
  7. package/src/engine/app/(docs)/[...slug]/page.tsx +926 -0
  8. package/src/engine/app/api/proxy/route.ts +23 -0
  9. package/src/engine/app/copy-page.css +59 -1
  10. package/src/engine/app/global.css +3157 -3
  11. package/src/engine/app/layout.tsx +56 -1
  12. package/src/engine/app/llms-file/route.ts +87 -0
  13. package/src/engine/app/llms-full-file/route.ts +62 -0
  14. package/src/engine/app/md-file/[...slug]/route.ts +409 -0
  15. package/src/engine/app/page.tsx +45 -0
  16. package/src/engine/app/robots.txt/route.ts +63 -0
  17. package/src/engine/app/rss-file/[...slug]/route.ts +169 -0
  18. package/src/engine/app/sitemap.xml/route.ts +82 -0
  19. package/src/engine/components/assistant.tsx +16 -5
  20. package/src/engine/components/changelog-filters.tsx +114 -0
  21. package/src/engine/components/code-group.tsx +383 -0
  22. package/src/engine/components/color.tsx +118 -0
  23. package/src/engine/components/expandable.tsx +77 -0
  24. package/src/engine/components/icon.tsx +136 -0
  25. package/src/engine/components/image-zoom-fallback.tsx +147 -0
  26. package/src/engine/components/image.tsx +111 -0
  27. package/src/engine/components/manual-api-playground.tsx +154 -0
  28. package/src/engine/components/mermaid.tsx +142 -0
  29. package/src/engine/components/openapi-toc-sync.tsx +59 -0
  30. package/src/engine/components/openapi.tsx +1682 -0
  31. package/src/engine/components/page-feedback.tsx +153 -0
  32. package/src/engine/components/product-switcher.tsx +27 -3
  33. package/src/engine/components/prompt.tsx +90 -0
  34. package/src/engine/components/providers.tsx +1 -6
  35. package/src/engine/components/search.tsx +4 -0
  36. package/src/engine/components/sidebar-links.tsx +13 -15
  37. package/src/engine/components/synced-tabs.tsx +57 -0
  38. package/src/engine/components/toc-examples.tsx +110 -0
  39. package/src/engine/components/view.tsx +344 -0
  40. package/src/engine/generated/redirects.ts +3 -0
  41. package/src/engine/lib/changelog.ts +246 -0
  42. package/src/engine/lib/layout.shared.ts +30 -2
  43. package/src/engine/lib/llms.ts +444 -0
  44. package/src/engine/lib/navigation-normalize.mjs +481 -412
  45. package/src/engine/lib/navigation-normalize.ts +261 -54
  46. package/src/engine/lib/redirects.ts +194 -0
  47. package/src/engine/lib/source.ts +107 -4
  48. package/src/engine/lib/velu.ts +368 -2
  49. package/src/engine/mdx-components.tsx +648 -0
  50. package/src/engine/middleware.ts +66 -0
  51. package/src/engine/public/icons/cursor-dark.svg +12 -0
  52. package/src/engine/public/icons/cursor-light.svg +12 -0
  53. package/src/engine/source.config.ts +98 -1
  54. package/src/engine/src/components/PageTitle.astro +16 -5
  55. package/src/engine/src/lib/velu.ts +11 -3
  56. package/src/navigation-normalize.ts +252 -54
  57. package/src/themes.ts +6 -6
  58. package/src/validate.ts +119 -6
  59. package/src/engine/app/(docs)/[[...slug]]/layout.tsx +0 -87
  60. package/src/engine/app/(docs)/[[...slug]]/page.tsx +0 -146
@@ -4,7 +4,9 @@
4
4
  "title": "Velu Configuration",
5
5
  "description": "Configuration schema for velu.json — the core config file for Velu documentation sites.",
6
6
  "type": "object",
7
- "required": ["navigation"],
7
+ "required": [
8
+ "navigation"
9
+ ],
8
10
  "properties": {
9
11
  "$schema": {
10
12
  "type": "string",
@@ -13,9 +15,43 @@
13
15
  "theme": {
14
16
  "type": "string",
15
17
  "description": "Named theme preset that controls the overall look and feel. Supports Fumadocs presets and legacy Velu aliases.",
16
- "enum": ["neutral", "black", "vitepress", "dusk", "catppuccin", "ocean", "emerald", "ruby", "purple", "solar", "aspen", "violet", "maple", "palm", "willow", "linden", "almond"],
18
+ "enum": [
19
+ "neutral",
20
+ "black",
21
+ "vitepress",
22
+ "dusk",
23
+ "catppuccin",
24
+ "ocean",
25
+ "emerald",
26
+ "ruby",
27
+ "purple",
28
+ "solar",
29
+ "aspen",
30
+ "violet",
31
+ "maple",
32
+ "palm",
33
+ "willow",
34
+ "linden",
35
+ "almond"
36
+ ],
17
37
  "default": "neutral"
18
38
  },
39
+ "name": {
40
+ "type": "string",
41
+ "description": "Site name shown in metadata and brand text."
42
+ },
43
+ "title": {
44
+ "type": "string",
45
+ "description": "Legacy alias for site name. Used when `name` is not provided."
46
+ },
47
+ "favicon": {
48
+ "$ref": "#/definitions/themeAsset",
49
+ "description": "Favicon path or light/dark favicon object."
50
+ },
51
+ "logo": {
52
+ "$ref": "#/definitions/logoAsset",
53
+ "description": "Brand logo path or light/dark logo object."
54
+ },
19
55
  "colors": {
20
56
  "type": "object",
21
57
  "description": "Override the theme's accent colors.",
@@ -41,9 +77,33 @@
41
77
  "appearance": {
42
78
  "type": "string",
43
79
  "description": "Controls light/dark mode behavior.",
44
- "enum": ["system", "light", "dark"],
80
+ "enum": [
81
+ "system",
82
+ "light",
83
+ "dark"
84
+ ],
45
85
  "default": "system"
46
86
  },
87
+ "icons": {
88
+ "type": "object",
89
+ "description": "Icon settings compatible with Mint-style configuration.",
90
+ "properties": {
91
+ "library": {
92
+ "type": "string",
93
+ "description": "Icon library used for named icon strings.",
94
+ "enum": [
95
+ "fontawesome",
96
+ "lucide",
97
+ "tabler"
98
+ ],
99
+ "default": "fontawesome"
100
+ }
101
+ },
102
+ "required": [
103
+ "library"
104
+ ],
105
+ "additionalProperties": false
106
+ },
47
107
  "styling": {
48
108
  "type": "object",
49
109
  "description": "Fine-grained styling options.",
@@ -55,14 +115,23 @@
55
115
  "theme": {
56
116
  "description": "Shiki theme for syntax highlighting. Use a string for a single theme, or an object with light/dark keys.",
57
117
  "oneOf": [
58
- { "type": "string" },
118
+ {
119
+ "type": "string"
120
+ },
59
121
  {
60
122
  "type": "object",
61
123
  "properties": {
62
- "light": { "type": "string" },
63
- "dark": { "type": "string" }
124
+ "light": {
125
+ "type": "string"
126
+ },
127
+ "dark": {
128
+ "type": "string"
129
+ }
64
130
  },
65
- "required": ["light", "dark"],
131
+ "required": [
132
+ "light",
133
+ "dark"
134
+ ],
66
135
  "additionalProperties": false
67
136
  }
68
137
  ]
@@ -82,10 +151,143 @@
82
151
  },
83
152
  "minItems": 1
84
153
  },
154
+ "openapi": {
155
+ "$ref": "#/definitions/openapiSource",
156
+ "description": "Default OpenAPI source used by API pages."
157
+ },
158
+ "api": {
159
+ "type": "object",
160
+ "description": "API playground and MDX endpoint settings.",
161
+ "properties": {
162
+ "baseUrl": {
163
+ "type": "string",
164
+ "description": "Base API URL used by generated examples."
165
+ },
166
+ "playground": {
167
+ "type": "object",
168
+ "description": "Global playground display settings.",
169
+ "properties": {
170
+ "mode": {
171
+ "type": "string",
172
+ "enum": [
173
+ "show",
174
+ "hide",
175
+ "none"
176
+ ]
177
+ },
178
+ "display": {
179
+ "type": "string",
180
+ "enum": [
181
+ "interactive",
182
+ "simple",
183
+ "none",
184
+ "auth"
185
+ ]
186
+ },
187
+ "proxy": {
188
+ "type": "boolean",
189
+ "description": "Whether to send playground requests through the proxy endpoint. Defaults to true.",
190
+ "default": true
191
+ }
192
+ },
193
+ "additionalProperties": true
194
+ },
195
+ "examples": {
196
+ "type": "object",
197
+ "description": "Autogenerated API code sample settings.",
198
+ "properties": {
199
+ "languages": {
200
+ "type": "array",
201
+ "description": "Enabled API example languages.",
202
+ "items": {
203
+ "type": "string"
204
+ },
205
+ "minItems": 1
206
+ },
207
+ "defaults": {
208
+ "type": "string",
209
+ "enum": [
210
+ "required",
211
+ "all"
212
+ ],
213
+ "description": "Whether examples should prioritize required-only or all parameters."
214
+ },
215
+ "prefill": {
216
+ "type": "boolean",
217
+ "description": "Whether to prefill playground fields from schema examples.",
218
+ "default": false
219
+ },
220
+ "autogenerate": {
221
+ "type": "boolean",
222
+ "description": "Whether to autogenerate API code samples from OpenAPI operations.",
223
+ "default": true
224
+ }
225
+ },
226
+ "additionalProperties": true
227
+ },
228
+ "mdx": {
229
+ "type": "object",
230
+ "description": "Defaults for manually-authored MDX API endpoint pages.",
231
+ "properties": {
232
+ "server": {
233
+ "description": "Server URL prepended to relative `api` frontmatter paths. Supports one server URL or multiple server URLs.",
234
+ "oneOf": [
235
+ {
236
+ "type": "string"
237
+ },
238
+ {
239
+ "type": "array",
240
+ "items": {
241
+ "type": "string"
242
+ },
243
+ "minItems": 1
244
+ }
245
+ ]
246
+ },
247
+ "auth": {
248
+ "type": "object",
249
+ "properties": {
250
+ "method": {
251
+ "type": "string",
252
+ "enum": [
253
+ "bearer",
254
+ "basic",
255
+ "key",
256
+ "none"
257
+ ]
258
+ },
259
+ "name": {
260
+ "type": "string",
261
+ "description": "Header name when `method` is `key`."
262
+ }
263
+ },
264
+ "additionalProperties": false
265
+ }
266
+ },
267
+ "additionalProperties": true
268
+ }
269
+ },
270
+ "additionalProperties": true
271
+ },
272
+ "seo": {
273
+ "$ref": "#/definitions/seoConfig",
274
+ "description": "SEO configuration for metadata and indexing behavior."
275
+ },
276
+ "redirects": {
277
+ "type": "array",
278
+ "description": "Permanent or temporary redirects for moved pages.",
279
+ "items": {
280
+ "$ref": "#/definitions/redirect"
281
+ }
282
+ },
85
283
  "navigation": {
86
284
  "type": "object",
87
285
  "description": "Defines the site navigation hierarchy. Use 'tabs' for single-language sites, or 'languages' for per-language navigation (like Mintlify).",
88
286
  "properties": {
287
+ "openapi": {
288
+ "$ref": "#/definitions/openapiSource",
289
+ "description": "Default OpenAPI source inherited by tabs/groups/pages in this navigation section."
290
+ },
89
291
  "tabs": {
90
292
  "type": "array",
91
293
  "description": "Top-level navigation tabs (single-language mode). Ignored when 'languages' is present.",
@@ -115,9 +317,15 @@
115
317
  "description": "Top-level pages when tabs/dropdowns are not used.",
116
318
  "items": {
117
319
  "oneOf": [
118
- { "$ref": "#/definitions/page" },
119
- { "$ref": "#/definitions/separator" },
120
- { "$ref": "#/definitions/link" }
320
+ {
321
+ "$ref": "#/definitions/page"
322
+ },
323
+ {
324
+ "$ref": "#/definitions/separator"
325
+ },
326
+ {
327
+ "$ref": "#/definitions/link"
328
+ }
121
329
  ]
122
330
  },
123
331
  "minItems": 1
@@ -173,23 +381,180 @@
173
381
  }
174
382
  },
175
383
  "additionalProperties": false
384
+ },
385
+ "asyncapi": {
386
+ "$ref": "#/definitions/openapiSource",
387
+ "description": "Default AsyncAPI source inherited by tabs/groups/pages in this navigation section."
176
388
  }
177
389
  },
178
390
  "anyOf": [
179
- { "required": ["tabs"] },
180
- { "required": ["dropdowns"] },
181
- { "required": ["groups"] },
182
- { "required": ["pages"] },
183
- { "required": ["languages"] },
184
- { "required": ["products"] },
185
- { "required": ["versions"] },
186
- { "required": ["anchors"] }
391
+ {
392
+ "required": [
393
+ "tabs"
394
+ ]
395
+ },
396
+ {
397
+ "required": [
398
+ "dropdowns"
399
+ ]
400
+ },
401
+ {
402
+ "required": [
403
+ "groups"
404
+ ]
405
+ },
406
+ {
407
+ "required": [
408
+ "pages"
409
+ ]
410
+ },
411
+ {
412
+ "required": [
413
+ "languages"
414
+ ]
415
+ },
416
+ {
417
+ "required": [
418
+ "products"
419
+ ]
420
+ },
421
+ {
422
+ "required": [
423
+ "versions"
424
+ ]
425
+ },
426
+ {
427
+ "required": [
428
+ "anchors"
429
+ ]
430
+ }
187
431
  ],
188
432
  "additionalProperties": false
433
+ },
434
+ "asyncapi": {
435
+ "$ref": "#/definitions/openapiSource",
436
+ "description": "Default AsyncAPI source used by API pages."
189
437
  }
190
438
  },
191
439
  "additionalProperties": false,
192
440
  "definitions": {
441
+ "themeAsset": {
442
+ "description": "Theme-aware asset path. Supports a string or an object with light/dark variants.",
443
+ "oneOf": [
444
+ {
445
+ "type": "string"
446
+ },
447
+ {
448
+ "type": "object",
449
+ "properties": {
450
+ "light": {
451
+ "type": "string"
452
+ },
453
+ "dark": {
454
+ "type": "string"
455
+ },
456
+ "default": {
457
+ "type": "string",
458
+ "description": "Fallback used when a mode-specific value is not provided."
459
+ }
460
+ },
461
+ "additionalProperties": false
462
+ }
463
+ ]
464
+ },
465
+ "logoAsset": {
466
+ "description": "Logo asset config. Same as themeAsset, with optional logo link target.",
467
+ "oneOf": [
468
+ {
469
+ "type": "string"
470
+ },
471
+ {
472
+ "type": "object",
473
+ "properties": {
474
+ "light": {
475
+ "type": "string"
476
+ },
477
+ "dark": {
478
+ "type": "string"
479
+ },
480
+ "default": {
481
+ "type": "string",
482
+ "description": "Fallback used when a mode-specific value is not provided."
483
+ },
484
+ "href": {
485
+ "$ref": "#/definitions/href",
486
+ "description": "Optional link target when clicking the logo."
487
+ }
488
+ },
489
+ "additionalProperties": false
490
+ }
491
+ ]
492
+ },
493
+ "seoConfig": {
494
+ "type": "object",
495
+ "description": "SEO settings including global metatags and indexing policy.",
496
+ "properties": {
497
+ "metatags": {
498
+ "type": "object",
499
+ "description": "Global metatags applied to page metadata. Keys are tag names (for example 'og:title' or 'twitter:card').",
500
+ "additionalProperties": {
501
+ "type": "string"
502
+ }
503
+ },
504
+ "indexing": {
505
+ "type": "string",
506
+ "description": "Controls which pages are included in generated indexing outputs like sitemap and llms files.",
507
+ "enum": [
508
+ "navigable",
509
+ "all"
510
+ ],
511
+ "default": "navigable"
512
+ }
513
+ },
514
+ "additionalProperties": false
515
+ },
516
+ "openapiSource": {
517
+ "description": "OpenAPI source value. Supports a spec URL/path, a list of sources, or an object form.",
518
+ "oneOf": [
519
+ {
520
+ "type": "string"
521
+ },
522
+ {
523
+ "type": "array",
524
+ "items": {
525
+ "type": "string"
526
+ },
527
+ "minItems": 1
528
+ },
529
+ {
530
+ "type": "object",
531
+ "required": [
532
+ "source"
533
+ ],
534
+ "properties": {
535
+ "source": {
536
+ "oneOf": [
537
+ {
538
+ "type": "string"
539
+ },
540
+ {
541
+ "type": "array",
542
+ "items": {
543
+ "type": "string"
544
+ },
545
+ "minItems": 1
546
+ }
547
+ ]
548
+ },
549
+ "directory": {
550
+ "type": "string",
551
+ "description": "Optional directory for generated OpenAPI pages."
552
+ }
553
+ },
554
+ "additionalProperties": false
555
+ }
556
+ ]
557
+ },
193
558
  "page": {
194
559
  "type": "string",
195
560
  "description": "Explicit markdown file path relative to the docs directory (without .md extension). No automatic language fallback is applied. Example: 'quickstart' → docs/quickstart.md, 'ja/quickstart' → docs/ja/quickstart.md, 'writing-content/page' → docs/writing-content/page.md."
@@ -209,10 +574,45 @@
209
574
  }
210
575
  ]
211
576
  },
577
+ "redirect": {
578
+ "type": "object",
579
+ "description": "Redirect rule for moved, renamed, or deleted pages.",
580
+ "required": [
581
+ "source",
582
+ "destination"
583
+ ],
584
+ "properties": {
585
+ "source": {
586
+ "type": "string",
587
+ "description": "Source path to match. Query params and anchors are not supported.",
588
+ "pattern": "^/[^?#]*$"
589
+ },
590
+ "destination": {
591
+ "type": "string",
592
+ "description": "Destination path or absolute URL. Query params and anchors are not supported.",
593
+ "anyOf": [
594
+ {
595
+ "format": "uri"
596
+ },
597
+ {
598
+ "pattern": "^/[^?#]*$"
599
+ }
600
+ ]
601
+ },
602
+ "permanent": {
603
+ "type": "boolean",
604
+ "description": "Whether to use a permanent redirect status. Defaults to true.",
605
+ "default": true
606
+ }
607
+ },
608
+ "additionalProperties": false
609
+ },
212
610
  "group": {
213
611
  "type": "object",
214
612
  "description": "A group of pages, optionally nested.",
215
- "required": ["group", "pages"],
613
+ "required": [
614
+ "group"
615
+ ],
216
616
  "properties": {
217
617
  "group": {
218
618
  "type": "string",
@@ -227,6 +627,10 @@
227
627
  "type": "string",
228
628
  "description": "Icon identifier for the group."
229
629
  },
630
+ "iconType": {
631
+ "type": "string",
632
+ "description": "Icon style hint (primarily for Font Awesome)."
633
+ },
230
634
  "tag": {
231
635
  "type": "string",
232
636
  "description": "Optional badge/tag label displayed next to the group name."
@@ -245,30 +649,69 @@
245
649
  "description": "Whether the group is hidden from navigation. Defaults to false.",
246
650
  "default": false
247
651
  },
652
+ "openapi": {
653
+ "$ref": "#/definitions/openapiSource",
654
+ "description": "Default OpenAPI source inherited by page entries in this group."
655
+ },
248
656
  "pages": {
249
657
  "type": "array",
250
658
  "description": "Pages, nested groups, separators, or external links within this group.",
251
659
  "items": {
252
660
  "oneOf": [
253
- { "$ref": "#/definitions/page" },
254
- { "$ref": "#/definitions/group" },
255
- { "$ref": "#/definitions/separator" },
256
- { "$ref": "#/definitions/link" }
661
+ {
662
+ "$ref": "#/definitions/page"
663
+ },
664
+ {
665
+ "$ref": "#/definitions/group"
666
+ },
667
+ {
668
+ "$ref": "#/definitions/separator"
669
+ },
670
+ {
671
+ "$ref": "#/definitions/link"
672
+ }
257
673
  ]
258
674
  }
675
+ },
676
+ "asyncapi": {
677
+ "$ref": "#/definitions/openapiSource",
678
+ "description": "Default AsyncAPI source inherited by page entries in this group."
259
679
  }
260
680
  },
681
+ "anyOf": [
682
+ {
683
+ "required": [
684
+ "pages"
685
+ ]
686
+ },
687
+ {
688
+ "required": [
689
+ "openapi"
690
+ ]
691
+ },
692
+ {
693
+ "required": [
694
+ "asyncapi"
695
+ ]
696
+ }
697
+ ],
261
698
  "additionalProperties": false
262
699
  },
263
700
  "tab": {
264
701
  "type": "object",
265
702
  "description": "A top-level navigation tab.",
266
- "required": ["tab"],
703
+ "required": [
704
+ "tab"
705
+ ],
267
706
  "properties": {
268
707
  "tab": {
269
708
  "type": "string",
270
709
  "description": "Display name for the tab."
271
710
  },
711
+ "version": {
712
+ "type": "string",
713
+ "description": "Optional version label inherited by generated OpenAPI operation pages under this tab."
714
+ },
272
715
  "slug": {
273
716
  "type": "string",
274
717
  "description": "Optional URL slug prefix for pages in this tab. If omitted, Velu derives one from the tab label.",
@@ -278,17 +721,31 @@
278
721
  "type": "string",
279
722
  "description": "Icon identifier for the tab."
280
723
  },
724
+ "iconType": {
725
+ "type": "string",
726
+ "description": "Icon style hint (primarily for Font Awesome)."
727
+ },
281
728
  "href": {
282
729
  "$ref": "#/definitions/href"
283
730
  },
731
+ "openapi": {
732
+ "$ref": "#/definitions/openapiSource",
733
+ "description": "Default OpenAPI source inherited by groups/pages in this tab."
734
+ },
284
735
  "pages": {
285
736
  "type": "array",
286
737
  "description": "Standalone pages, separators, or external links directly under this tab.",
287
738
  "items": {
288
739
  "oneOf": [
289
- { "$ref": "#/definitions/page" },
290
- { "$ref": "#/definitions/separator" },
291
- { "$ref": "#/definitions/link" }
740
+ {
741
+ "$ref": "#/definitions/page"
742
+ },
743
+ {
744
+ "$ref": "#/definitions/separator"
745
+ },
746
+ {
747
+ "$ref": "#/definitions/link"
748
+ }
292
749
  ]
293
750
  }
294
751
  },
@@ -319,30 +776,127 @@
319
776
  "items": {
320
777
  "$ref": "#/definitions/dropdown"
321
778
  }
779
+ },
780
+ "asyncapi": {
781
+ "$ref": "#/definitions/openapiSource",
782
+ "description": "Default AsyncAPI source inherited by groups/pages in this tab."
322
783
  }
323
784
  },
324
785
  "additionalProperties": false,
786
+ "allOf": [
787
+ {
788
+ "not": {
789
+ "allOf": [
790
+ {
791
+ "required": [
792
+ "menu"
793
+ ]
794
+ },
795
+ {
796
+ "anyOf": [
797
+ {
798
+ "required": [
799
+ "groups"
800
+ ]
801
+ },
802
+ {
803
+ "required": [
804
+ "pages"
805
+ ]
806
+ },
807
+ {
808
+ "required": [
809
+ "anchors"
810
+ ]
811
+ },
812
+ {
813
+ "required": [
814
+ "dropdowns"
815
+ ]
816
+ }
817
+ ]
818
+ }
819
+ ]
820
+ }
821
+ }
822
+ ],
325
823
  "oneOf": [
326
824
  {
327
- "required": ["href"],
825
+ "required": [
826
+ "href"
827
+ ],
328
828
  "not": {
329
829
  "anyOf": [
330
- { "required": ["pages"] },
331
- { "required": ["groups"] },
332
- { "required": ["menu"] },
333
- { "required": ["anchors"] },
334
- { "required": ["dropdowns"] }
830
+ {
831
+ "required": [
832
+ "pages"
833
+ ]
834
+ },
835
+ {
836
+ "required": [
837
+ "groups"
838
+ ]
839
+ },
840
+ {
841
+ "required": [
842
+ "menu"
843
+ ]
844
+ },
845
+ {
846
+ "required": [
847
+ "anchors"
848
+ ]
849
+ },
850
+ {
851
+ "required": [
852
+ "dropdowns"
853
+ ]
854
+ }
335
855
  ]
336
856
  }
337
857
  },
338
858
  {
339
- "not": { "required": ["href"] },
859
+ "not": {
860
+ "required": [
861
+ "href"
862
+ ]
863
+ },
340
864
  "anyOf": [
341
- { "required": ["pages"] },
342
- { "required": ["groups"] },
343
- { "required": ["menu"] },
344
- { "required": ["anchors"] },
345
- { "required": ["dropdowns"] }
865
+ {
866
+ "required": [
867
+ "pages"
868
+ ]
869
+ },
870
+ {
871
+ "required": [
872
+ "groups"
873
+ ]
874
+ },
875
+ {
876
+ "required": [
877
+ "menu"
878
+ ]
879
+ },
880
+ {
881
+ "required": [
882
+ "anchors"
883
+ ]
884
+ },
885
+ {
886
+ "required": [
887
+ "dropdowns"
888
+ ]
889
+ },
890
+ {
891
+ "required": [
892
+ "openapi"
893
+ ]
894
+ },
895
+ {
896
+ "required": [
897
+ "asyncapi"
898
+ ]
899
+ }
346
900
  ]
347
901
  }
348
902
  ]
@@ -350,7 +904,9 @@
350
904
  "dropdown": {
351
905
  "type": "object",
352
906
  "description": "A dropdown navigation container.",
353
- "required": ["dropdown"],
907
+ "required": [
908
+ "dropdown"
909
+ ],
354
910
  "properties": {
355
911
  "dropdown": {
356
912
  "type": "string",
@@ -365,17 +921,31 @@
365
921
  "type": "string",
366
922
  "description": "Icon identifier for the dropdown."
367
923
  },
924
+ "iconType": {
925
+ "type": "string",
926
+ "description": "Icon style hint (primarily for Font Awesome)."
927
+ },
368
928
  "href": {
369
929
  "$ref": "#/definitions/href"
370
930
  },
931
+ "openapi": {
932
+ "$ref": "#/definitions/openapiSource",
933
+ "description": "Default OpenAPI source inherited by groups/pages in this dropdown."
934
+ },
371
935
  "pages": {
372
936
  "type": "array",
373
937
  "description": "Pages directly under this dropdown.",
374
938
  "items": {
375
939
  "oneOf": [
376
- { "$ref": "#/definitions/page" },
377
- { "$ref": "#/definitions/separator" },
378
- { "$ref": "#/definitions/link" }
940
+ {
941
+ "$ref": "#/definitions/page"
942
+ },
943
+ {
944
+ "$ref": "#/definitions/separator"
945
+ },
946
+ {
947
+ "$ref": "#/definitions/link"
948
+ }
379
949
  ]
380
950
  }
381
951
  },
@@ -399,28 +969,112 @@
399
969
  "items": {
400
970
  "$ref": "#/definitions/anchor"
401
971
  }
972
+ },
973
+ "asyncapi": {
974
+ "$ref": "#/definitions/openapiSource",
975
+ "description": "Default AsyncAPI source inherited by groups/pages in this dropdown."
402
976
  }
403
977
  },
404
978
  "additionalProperties": false,
979
+ "allOf": [
980
+ {
981
+ "not": {
982
+ "allOf": [
983
+ {
984
+ "required": [
985
+ "menu"
986
+ ]
987
+ },
988
+ {
989
+ "anyOf": [
990
+ {
991
+ "required": [
992
+ "groups"
993
+ ]
994
+ },
995
+ {
996
+ "required": [
997
+ "pages"
998
+ ]
999
+ },
1000
+ {
1001
+ "required": [
1002
+ "anchors"
1003
+ ]
1004
+ }
1005
+ ]
1006
+ }
1007
+ ]
1008
+ }
1009
+ }
1010
+ ],
405
1011
  "oneOf": [
406
1012
  {
407
- "required": ["href"],
1013
+ "required": [
1014
+ "href"
1015
+ ],
408
1016
  "not": {
409
1017
  "anyOf": [
410
- { "required": ["pages"] },
411
- { "required": ["groups"] },
412
- { "required": ["menu"] },
413
- { "required": ["anchors"] }
1018
+ {
1019
+ "required": [
1020
+ "pages"
1021
+ ]
1022
+ },
1023
+ {
1024
+ "required": [
1025
+ "groups"
1026
+ ]
1027
+ },
1028
+ {
1029
+ "required": [
1030
+ "menu"
1031
+ ]
1032
+ },
1033
+ {
1034
+ "required": [
1035
+ "anchors"
1036
+ ]
1037
+ }
414
1038
  ]
415
1039
  }
416
1040
  },
417
1041
  {
418
- "not": { "required": ["href"] },
1042
+ "not": {
1043
+ "required": [
1044
+ "href"
1045
+ ]
1046
+ },
419
1047
  "anyOf": [
420
- { "required": ["pages"] },
421
- { "required": ["groups"] },
422
- { "required": ["menu"] },
423
- { "required": ["anchors"] }
1048
+ {
1049
+ "required": [
1050
+ "pages"
1051
+ ]
1052
+ },
1053
+ {
1054
+ "required": [
1055
+ "groups"
1056
+ ]
1057
+ },
1058
+ {
1059
+ "required": [
1060
+ "menu"
1061
+ ]
1062
+ },
1063
+ {
1064
+ "required": [
1065
+ "anchors"
1066
+ ]
1067
+ },
1068
+ {
1069
+ "required": [
1070
+ "openapi"
1071
+ ]
1072
+ },
1073
+ {
1074
+ "required": [
1075
+ "asyncapi"
1076
+ ]
1077
+ }
424
1078
  ]
425
1079
  }
426
1080
  ]
@@ -428,7 +1082,9 @@
428
1082
  "menuItem": {
429
1083
  "type": "object",
430
1084
  "description": "A named menu item within a tab. Normalized into a sidebar group.",
431
- "required": ["item"],
1085
+ "required": [
1086
+ "item"
1087
+ ],
432
1088
  "properties": {
433
1089
  "item": {
434
1090
  "type": "string",
@@ -438,14 +1094,28 @@
438
1094
  "type": "string",
439
1095
  "description": "Icon identifier for the menu item."
440
1096
  },
1097
+ "iconType": {
1098
+ "type": "string",
1099
+ "description": "Icon style hint (primarily for Font Awesome)."
1100
+ },
1101
+ "openapi": {
1102
+ "$ref": "#/definitions/openapiSource",
1103
+ "description": "Default OpenAPI source inherited by groups/pages in this menu item."
1104
+ },
441
1105
  "pages": {
442
1106
  "type": "array",
443
1107
  "description": "Pages directly under this menu item.",
444
1108
  "items": {
445
1109
  "oneOf": [
446
- { "$ref": "#/definitions/page" },
447
- { "$ref": "#/definitions/separator" },
448
- { "$ref": "#/definitions/link" }
1110
+ {
1111
+ "$ref": "#/definitions/page"
1112
+ },
1113
+ {
1114
+ "$ref": "#/definitions/separator"
1115
+ },
1116
+ {
1117
+ "$ref": "#/definitions/link"
1118
+ }
449
1119
  ]
450
1120
  }
451
1121
  },
@@ -455,18 +1125,42 @@
455
1125
  "items": {
456
1126
  "$ref": "#/definitions/group"
457
1127
  }
1128
+ },
1129
+ "asyncapi": {
1130
+ "$ref": "#/definitions/openapiSource",
1131
+ "description": "Default AsyncAPI source inherited by groups/pages in this menu item."
458
1132
  }
459
1133
  },
460
1134
  "additionalProperties": false,
461
1135
  "anyOf": [
462
- { "required": ["pages"] },
463
- { "required": ["groups"] }
1136
+ {
1137
+ "required": [
1138
+ "pages"
1139
+ ]
1140
+ },
1141
+ {
1142
+ "required": [
1143
+ "groups"
1144
+ ]
1145
+ },
1146
+ {
1147
+ "required": [
1148
+ "openapi"
1149
+ ]
1150
+ },
1151
+ {
1152
+ "required": [
1153
+ "asyncapi"
1154
+ ]
1155
+ }
464
1156
  ]
465
1157
  },
466
1158
  "separator": {
467
1159
  "type": "object",
468
1160
  "description": "A visual separator/label in the sidebar navigation.",
469
- "required": ["separator"],
1161
+ "required": [
1162
+ "separator"
1163
+ ],
470
1164
  "properties": {
471
1165
  "separator": {
472
1166
  "type": "string",
@@ -478,7 +1172,10 @@
478
1172
  "link": {
479
1173
  "type": "object",
480
1174
  "description": "An external link displayed in the sidebar.",
481
- "required": ["href", "label"],
1175
+ "required": [
1176
+ "href",
1177
+ "label"
1178
+ ],
482
1179
  "properties": {
483
1180
  "href": {
484
1181
  "$ref": "#/definitions/href"
@@ -490,6 +1187,10 @@
490
1187
  "icon": {
491
1188
  "type": "string",
492
1189
  "description": "Icon identifier for the link."
1190
+ },
1191
+ "iconType": {
1192
+ "type": "string",
1193
+ "description": "Icon style hint (primarily for Font Awesome)."
493
1194
  }
494
1195
  },
495
1196
  "additionalProperties": false
@@ -497,15 +1198,25 @@
497
1198
  "anchor": {
498
1199
  "type": "object",
499
1200
  "description": "A prominent navigation anchor. Can be an external link or a container of tabs.",
500
- "required": ["anchor"],
1201
+ "required": [
1202
+ "anchor"
1203
+ ],
501
1204
  "properties": {
502
1205
  "anchor": {
503
1206
  "type": "string",
504
1207
  "description": "Display name for the anchor."
505
1208
  },
1209
+ "version": {
1210
+ "type": "string",
1211
+ "description": "Optional version label inherited by generated OpenAPI operation pages under this anchor."
1212
+ },
506
1213
  "href": {
507
1214
  "$ref": "#/definitions/href"
508
1215
  },
1216
+ "openapi": {
1217
+ "$ref": "#/definitions/openapiSource",
1218
+ "description": "Default OpenAPI source inherited by tabs/groups/pages in this anchor."
1219
+ },
509
1220
  "tabs": {
510
1221
  "type": "array",
511
1222
  "description": "Optional tabs promoted to top-level navigation under this anchor.",
@@ -525,9 +1236,15 @@
525
1236
  "description": "Pages nested under this anchor.",
526
1237
  "items": {
527
1238
  "oneOf": [
528
- { "$ref": "#/definitions/page" },
529
- { "$ref": "#/definitions/separator" },
530
- { "$ref": "#/definitions/link" }
1239
+ {
1240
+ "$ref": "#/definitions/page"
1241
+ },
1242
+ {
1243
+ "$ref": "#/definitions/separator"
1244
+ },
1245
+ {
1246
+ "$ref": "#/definitions/link"
1247
+ }
531
1248
  ]
532
1249
  }
533
1250
  },
@@ -556,6 +1273,10 @@
556
1273
  "type": "string",
557
1274
  "description": "Icon identifier for the anchor."
558
1275
  },
1276
+ "iconType": {
1277
+ "type": "string",
1278
+ "description": "Icon style hint (primarily for Font Awesome)."
1279
+ },
559
1280
  "color": {
560
1281
  "type": "object",
561
1282
  "description": "Optional light/dark color hints for displaying this anchor.",
@@ -571,38 +1292,151 @@
571
1292
  "pattern": "^#[0-9a-fA-F]{6}$"
572
1293
  }
573
1294
  },
574
- "required": ["light", "dark"],
1295
+ "required": [
1296
+ "light",
1297
+ "dark"
1298
+ ],
575
1299
  "additionalProperties": false
576
1300
  },
577
1301
  "hidden": {
578
1302
  "type": "boolean",
579
1303
  "description": "Whether the anchor is hidden. Defaults to false.",
580
1304
  "default": false
1305
+ },
1306
+ "asyncapi": {
1307
+ "$ref": "#/definitions/openapiSource",
1308
+ "description": "Default AsyncAPI source inherited by tabs/groups/pages in this anchor."
581
1309
  }
582
1310
  },
1311
+ "allOf": [
1312
+ {
1313
+ "not": {
1314
+ "allOf": [
1315
+ {
1316
+ "required": [
1317
+ "menu"
1318
+ ]
1319
+ },
1320
+ {
1321
+ "anyOf": [
1322
+ {
1323
+ "required": [
1324
+ "tabs"
1325
+ ]
1326
+ },
1327
+ {
1328
+ "required": [
1329
+ "groups"
1330
+ ]
1331
+ },
1332
+ {
1333
+ "required": [
1334
+ "pages"
1335
+ ]
1336
+ },
1337
+ {
1338
+ "required": [
1339
+ "anchors"
1340
+ ]
1341
+ },
1342
+ {
1343
+ "required": [
1344
+ "dropdowns"
1345
+ ]
1346
+ }
1347
+ ]
1348
+ }
1349
+ ]
1350
+ }
1351
+ }
1352
+ ],
583
1353
  "oneOf": [
584
1354
  {
585
- "required": ["href"],
1355
+ "required": [
1356
+ "href"
1357
+ ],
586
1358
  "not": {
587
1359
  "anyOf": [
588
- { "required": ["tabs"] },
589
- { "required": ["groups"] },
590
- { "required": ["pages"] },
591
- { "required": ["menu"] },
592
- { "required": ["anchors"] },
593
- { "required": ["dropdowns"] }
1360
+ {
1361
+ "required": [
1362
+ "tabs"
1363
+ ]
1364
+ },
1365
+ {
1366
+ "required": [
1367
+ "groups"
1368
+ ]
1369
+ },
1370
+ {
1371
+ "required": [
1372
+ "pages"
1373
+ ]
1374
+ },
1375
+ {
1376
+ "required": [
1377
+ "menu"
1378
+ ]
1379
+ },
1380
+ {
1381
+ "required": [
1382
+ "anchors"
1383
+ ]
1384
+ },
1385
+ {
1386
+ "required": [
1387
+ "dropdowns"
1388
+ ]
1389
+ }
594
1390
  ]
595
1391
  }
596
1392
  },
597
1393
  {
598
- "not": { "required": ["href"] },
1394
+ "not": {
1395
+ "required": [
1396
+ "href"
1397
+ ]
1398
+ },
599
1399
  "anyOf": [
600
- { "required": ["tabs"] },
601
- { "required": ["groups"] },
602
- { "required": ["pages"] },
603
- { "required": ["menu"] },
604
- { "required": ["anchors"] },
605
- { "required": ["dropdowns"] }
1400
+ {
1401
+ "required": [
1402
+ "tabs"
1403
+ ]
1404
+ },
1405
+ {
1406
+ "required": [
1407
+ "groups"
1408
+ ]
1409
+ },
1410
+ {
1411
+ "required": [
1412
+ "pages"
1413
+ ]
1414
+ },
1415
+ {
1416
+ "required": [
1417
+ "menu"
1418
+ ]
1419
+ },
1420
+ {
1421
+ "required": [
1422
+ "anchors"
1423
+ ]
1424
+ },
1425
+ {
1426
+ "required": [
1427
+ "dropdowns"
1428
+ ]
1429
+ },
1430
+ {
1431
+ "required": [
1432
+ "openapi"
1433
+ ]
1434
+ },
1435
+ {
1436
+ "required": [
1437
+ "asyncapi"
1438
+ ]
1439
+ }
606
1440
  ]
607
1441
  }
608
1442
  ],
@@ -611,7 +1445,9 @@
611
1445
  "productNav": {
612
1446
  "type": "object",
613
1447
  "description": "Navigation definition for a product docs area.",
614
- "required": ["product"],
1448
+ "required": [
1449
+ "product"
1450
+ ],
615
1451
  "properties": {
616
1452
  "product": {
617
1453
  "type": "string",
@@ -621,6 +1457,10 @@
621
1457
  "type": "string",
622
1458
  "description": "Icon identifier for the product."
623
1459
  },
1460
+ "iconType": {
1461
+ "type": "string",
1462
+ "description": "Icon style hint (primarily for Font Awesome)."
1463
+ },
624
1464
  "name": {
625
1465
  "type": "string",
626
1466
  "description": "Optional display name for the product."
@@ -652,9 +1492,16 @@
652
1492
  "pattern": "^#[0-9a-fA-F]{6}$"
653
1493
  }
654
1494
  },
655
- "required": ["light", "dark"],
1495
+ "required": [
1496
+ "light",
1497
+ "dark"
1498
+ ],
656
1499
  "additionalProperties": false
657
1500
  },
1501
+ "openapi": {
1502
+ "$ref": "#/definitions/openapiSource",
1503
+ "description": "Default OpenAPI source inherited by tabs/groups/pages in this product."
1504
+ },
658
1505
  "tabs": {
659
1506
  "type": "array",
660
1507
  "description": "Tabs within this product.",
@@ -681,9 +1528,15 @@
681
1528
  "description": "Pages directly under this product when tabs are not needed.",
682
1529
  "items": {
683
1530
  "oneOf": [
684
- { "$ref": "#/definitions/page" },
685
- { "$ref": "#/definitions/separator" },
686
- { "$ref": "#/definitions/link" }
1531
+ {
1532
+ "$ref": "#/definitions/page"
1533
+ },
1534
+ {
1535
+ "$ref": "#/definitions/separator"
1536
+ },
1537
+ {
1538
+ "$ref": "#/definitions/link"
1539
+ }
687
1540
  ]
688
1541
  }
689
1542
  },
@@ -700,23 +1553,109 @@
700
1553
  "items": {
701
1554
  "$ref": "#/definitions/anchor"
702
1555
  }
1556
+ },
1557
+ "asyncapi": {
1558
+ "$ref": "#/definitions/openapiSource",
1559
+ "description": "Default AsyncAPI source inherited by tabs/groups/pages in this product."
703
1560
  }
704
1561
  },
705
1562
  "additionalProperties": false,
1563
+ "allOf": [
1564
+ {
1565
+ "not": {
1566
+ "allOf": [
1567
+ {
1568
+ "required": [
1569
+ "menu"
1570
+ ]
1571
+ },
1572
+ {
1573
+ "anyOf": [
1574
+ {
1575
+ "required": [
1576
+ "tabs"
1577
+ ]
1578
+ },
1579
+ {
1580
+ "required": [
1581
+ "dropdowns"
1582
+ ]
1583
+ },
1584
+ {
1585
+ "required": [
1586
+ "groups"
1587
+ ]
1588
+ },
1589
+ {
1590
+ "required": [
1591
+ "pages"
1592
+ ]
1593
+ },
1594
+ {
1595
+ "required": [
1596
+ "anchors"
1597
+ ]
1598
+ }
1599
+ ]
1600
+ }
1601
+ ]
1602
+ }
1603
+ }
1604
+ ],
706
1605
  "anyOf": [
707
- { "required": ["href"] },
708
- { "required": ["tabs"] },
709
- { "required": ["dropdowns"] },
710
- { "required": ["groups"] },
711
- { "required": ["pages"] },
712
- { "required": ["menu"] },
713
- { "required": ["anchors"] }
1606
+ {
1607
+ "required": [
1608
+ "href"
1609
+ ]
1610
+ },
1611
+ {
1612
+ "required": [
1613
+ "tabs"
1614
+ ]
1615
+ },
1616
+ {
1617
+ "required": [
1618
+ "dropdowns"
1619
+ ]
1620
+ },
1621
+ {
1622
+ "required": [
1623
+ "groups"
1624
+ ]
1625
+ },
1626
+ {
1627
+ "required": [
1628
+ "pages"
1629
+ ]
1630
+ },
1631
+ {
1632
+ "required": [
1633
+ "menu"
1634
+ ]
1635
+ },
1636
+ {
1637
+ "required": [
1638
+ "anchors"
1639
+ ]
1640
+ },
1641
+ {
1642
+ "required": [
1643
+ "openapi"
1644
+ ]
1645
+ },
1646
+ {
1647
+ "required": [
1648
+ "asyncapi"
1649
+ ]
1650
+ }
714
1651
  ]
715
1652
  },
716
1653
  "versionNav": {
717
1654
  "type": "object",
718
1655
  "description": "Navigation definition for a specific docs version.",
719
- "required": ["version"],
1656
+ "required": [
1657
+ "version"
1658
+ ],
720
1659
  "properties": {
721
1660
  "version": {
722
1661
  "type": "string",
@@ -735,6 +1674,10 @@
735
1674
  "href": {
736
1675
  "$ref": "#/definitions/href"
737
1676
  },
1677
+ "openapi": {
1678
+ "$ref": "#/definitions/openapiSource",
1679
+ "description": "Default OpenAPI source inherited by tabs/groups/pages in this version."
1680
+ },
738
1681
  "tabs": {
739
1682
  "type": "array",
740
1683
  "description": "Tabs for this version.",
@@ -761,9 +1704,15 @@
761
1704
  "description": "Pages for this version.",
762
1705
  "items": {
763
1706
  "oneOf": [
764
- { "$ref": "#/definitions/page" },
765
- { "$ref": "#/definitions/separator" },
766
- { "$ref": "#/definitions/link" }
1707
+ {
1708
+ "$ref": "#/definitions/page"
1709
+ },
1710
+ {
1711
+ "$ref": "#/definitions/separator"
1712
+ },
1713
+ {
1714
+ "$ref": "#/definitions/link"
1715
+ }
767
1716
  ]
768
1717
  }
769
1718
  },
@@ -780,23 +1729,110 @@
780
1729
  "items": {
781
1730
  "$ref": "#/definitions/anchor"
782
1731
  }
1732
+ },
1733
+ "asyncapi": {
1734
+ "$ref": "#/definitions/openapiSource",
1735
+ "description": "Default AsyncAPI source inherited by tabs/groups/pages in this version."
783
1736
  }
784
1737
  },
1738
+ "allOf": [
1739
+ {
1740
+ "not": {
1741
+ "allOf": [
1742
+ {
1743
+ "required": [
1744
+ "menu"
1745
+ ]
1746
+ },
1747
+ {
1748
+ "anyOf": [
1749
+ {
1750
+ "required": [
1751
+ "tabs"
1752
+ ]
1753
+ },
1754
+ {
1755
+ "required": [
1756
+ "dropdowns"
1757
+ ]
1758
+ },
1759
+ {
1760
+ "required": [
1761
+ "groups"
1762
+ ]
1763
+ },
1764
+ {
1765
+ "required": [
1766
+ "pages"
1767
+ ]
1768
+ },
1769
+ {
1770
+ "required": [
1771
+ "anchors"
1772
+ ]
1773
+ }
1774
+ ]
1775
+ }
1776
+ ]
1777
+ }
1778
+ }
1779
+ ],
785
1780
  "anyOf": [
786
- { "required": ["href"] },
787
- { "required": ["tabs"] },
788
- { "required": ["dropdowns"] },
789
- { "required": ["groups"] },
790
- { "required": ["pages"] },
791
- { "required": ["menu"] },
792
- { "required": ["anchors"] }
1781
+ {
1782
+ "required": [
1783
+ "href"
1784
+ ]
1785
+ },
1786
+ {
1787
+ "required": [
1788
+ "tabs"
1789
+ ]
1790
+ },
1791
+ {
1792
+ "required": [
1793
+ "dropdowns"
1794
+ ]
1795
+ },
1796
+ {
1797
+ "required": [
1798
+ "groups"
1799
+ ]
1800
+ },
1801
+ {
1802
+ "required": [
1803
+ "pages"
1804
+ ]
1805
+ },
1806
+ {
1807
+ "required": [
1808
+ "menu"
1809
+ ]
1810
+ },
1811
+ {
1812
+ "required": [
1813
+ "anchors"
1814
+ ]
1815
+ },
1816
+ {
1817
+ "required": [
1818
+ "openapi"
1819
+ ]
1820
+ },
1821
+ {
1822
+ "required": [
1823
+ "asyncapi"
1824
+ ]
1825
+ }
793
1826
  ],
794
1827
  "additionalProperties": false
795
1828
  },
796
1829
  "globalTab": {
797
1830
  "type": "object",
798
1831
  "description": "Global external tab shown in the navbar across all pages.",
799
- "required": ["tab", "href"],
1832
+ "required": [
1833
+ "tab",
1834
+ "href"
1835
+ ],
800
1836
  "properties": {
801
1837
  "tab": {
802
1838
  "type": "string",
@@ -808,6 +1844,10 @@
808
1844
  "icon": {
809
1845
  "type": "string",
810
1846
  "description": "Icon identifier for the global tab."
1847
+ },
1848
+ "iconType": {
1849
+ "type": "string",
1850
+ "description": "Icon style hint (primarily for Font Awesome)."
811
1851
  }
812
1852
  },
813
1853
  "additionalProperties": false
@@ -815,7 +1855,9 @@
815
1855
  "languageNav": {
816
1856
  "type": "object",
817
1857
  "description": "Per-language navigation entry. Defines the full tab/group/page structure for one language.",
818
- "required": ["language"],
1858
+ "required": [
1859
+ "language"
1860
+ ],
819
1861
  "properties": {
820
1862
  "language": {
821
1863
  "type": "string",
@@ -834,6 +1876,10 @@
834
1876
  "href": {
835
1877
  "$ref": "#/definitions/href"
836
1878
  },
1879
+ "openapi": {
1880
+ "$ref": "#/definitions/openapiSource",
1881
+ "description": "Default OpenAPI source inherited by tabs/groups/pages in this language entry."
1882
+ },
837
1883
  "tabs": {
838
1884
  "type": "array",
839
1885
  "description": "Navigation tabs for this language.",
@@ -860,9 +1906,15 @@
860
1906
  "description": "Pages for this language.",
861
1907
  "items": {
862
1908
  "oneOf": [
863
- { "$ref": "#/definitions/page" },
864
- { "$ref": "#/definitions/separator" },
865
- { "$ref": "#/definitions/link" }
1909
+ {
1910
+ "$ref": "#/definitions/page"
1911
+ },
1912
+ {
1913
+ "$ref": "#/definitions/separator"
1914
+ },
1915
+ {
1916
+ "$ref": "#/definitions/link"
1917
+ }
866
1918
  ]
867
1919
  }
868
1920
  },
@@ -879,16 +1931,100 @@
879
1931
  "items": {
880
1932
  "$ref": "#/definitions/anchor"
881
1933
  }
1934
+ },
1935
+ "asyncapi": {
1936
+ "$ref": "#/definitions/openapiSource",
1937
+ "description": "Default AsyncAPI source inherited by tabs/groups/pages in this language entry."
882
1938
  }
883
1939
  },
1940
+ "allOf": [
1941
+ {
1942
+ "not": {
1943
+ "allOf": [
1944
+ {
1945
+ "required": [
1946
+ "menu"
1947
+ ]
1948
+ },
1949
+ {
1950
+ "anyOf": [
1951
+ {
1952
+ "required": [
1953
+ "tabs"
1954
+ ]
1955
+ },
1956
+ {
1957
+ "required": [
1958
+ "dropdowns"
1959
+ ]
1960
+ },
1961
+ {
1962
+ "required": [
1963
+ "groups"
1964
+ ]
1965
+ },
1966
+ {
1967
+ "required": [
1968
+ "pages"
1969
+ ]
1970
+ },
1971
+ {
1972
+ "required": [
1973
+ "anchors"
1974
+ ]
1975
+ }
1976
+ ]
1977
+ }
1978
+ ]
1979
+ }
1980
+ }
1981
+ ],
884
1982
  "anyOf": [
885
- { "required": ["href"] },
886
- { "required": ["tabs"] },
887
- { "required": ["dropdowns"] },
888
- { "required": ["groups"] },
889
- { "required": ["pages"] },
890
- { "required": ["menu"] },
891
- { "required": ["anchors"] }
1983
+ {
1984
+ "required": [
1985
+ "href"
1986
+ ]
1987
+ },
1988
+ {
1989
+ "required": [
1990
+ "tabs"
1991
+ ]
1992
+ },
1993
+ {
1994
+ "required": [
1995
+ "dropdowns"
1996
+ ]
1997
+ },
1998
+ {
1999
+ "required": [
2000
+ "groups"
2001
+ ]
2002
+ },
2003
+ {
2004
+ "required": [
2005
+ "pages"
2006
+ ]
2007
+ },
2008
+ {
2009
+ "required": [
2010
+ "menu"
2011
+ ]
2012
+ },
2013
+ {
2014
+ "required": [
2015
+ "anchors"
2016
+ ]
2017
+ },
2018
+ {
2019
+ "required": [
2020
+ "openapi"
2021
+ ]
2022
+ },
2023
+ {
2024
+ "required": [
2025
+ "asyncapi"
2026
+ ]
2027
+ }
892
2028
  ],
893
2029
  "additionalProperties": false
894
2030
  }