@xyd-js/core 0.1.0-build.170

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.
@@ -0,0 +1,1553 @@
1
+ import * as React from 'react';
2
+
3
+ /**
4
+ * @todo rename to PageMeta
5
+ *
6
+ * Represents metadata for a content page.
7
+ * Usually used as md/mdx frontmatter.
8
+ *
9
+ */
10
+ interface Metadata<P = void> {
11
+ /** The main title of the content - by default visible in navigation and page title */
12
+ title: string;
13
+ /** Title to display in the sidebar navigation */
14
+ sidebarTitle?: string;
15
+ /** Disply description for SEO purposes */
16
+ description?: string;
17
+ /** Icon identifier for the navigation item */
18
+ icon?: string;
19
+ /** Layout type for the content display */
20
+ layout?: PageLayout;
21
+ /** Max depth for table of contents */
22
+ maxTocDepth?: number;
23
+ /** External URL for the content */
24
+ url?: string;
25
+ /**
26
+ * If false, hide the copy page button
27
+ */
28
+ copyPage?: boolean;
29
+ /**
30
+ * @internal
31
+ *
32
+ * The type of component to render this content with
33
+ */
34
+ component?: "docs" | "atlas" | "home" | "firstslide" | "bloghome" | "blogpost";
35
+ /**
36
+ * @internal
37
+ *
38
+ * Properties specific to the component type
39
+ */
40
+ componentProps?: P;
41
+ /**
42
+ * @internal
43
+ *
44
+ * Group for sidebar navigation
45
+ */
46
+ group?: string[];
47
+ /**
48
+ * Uniform for API Docs references
49
+ */
50
+ uniform?: PageMetaUniform;
51
+ /**
52
+ * @internal
53
+ *
54
+ * used for graphql references
55
+ */
56
+ graphql?: string;
57
+ /**
58
+ * @internal
59
+ *
60
+ * used for openapi references
61
+ */
62
+ openapi?: string;
63
+ /**
64
+ * If true, hide from navigation
65
+ */
66
+ hidden?: boolean;
67
+ /**
68
+ * Optional 'tocCard' for custom cards in the table of contents
69
+ *
70
+ * @example
71
+ * ```
72
+ * tocCard: {
73
+ * link: "https://github.com/livesession/livesession-browser",
74
+ * title: "Checkout the code",
75
+ * description: "Check how to use the LiveSession Browser SDK",
76
+ * icon: "github"
77
+ * }
78
+ * ```
79
+ */
80
+ tocCard?: TocCard | TocCard[];
81
+ }
82
+ interface TocCard {
83
+ /** 'link' to the card */
84
+ link: string;
85
+ /** 'title' of the card */
86
+ title: string;
87
+ /** 'description' of the card */
88
+ description: string;
89
+ /** 'icon' of the card */
90
+ icon?: string;
91
+ }
92
+ type PageMetaUniform = string | PageMetaUniformDetails;
93
+ /**
94
+ * Uniform details allows to specify more options than just the path, for example eager loading
95
+ */
96
+ type PageMetaUniformDetails = {
97
+ /**
98
+ * Path to the uniform file / url
99
+ */
100
+ path: string;
101
+ /**
102
+ * If true, the uniform will be eagerly loaded
103
+ */
104
+ eager?: boolean;
105
+ };
106
+ type MetadataMap<P = void> = {
107
+ [page: string]: Metadata<P>;
108
+ };
109
+ type PageLayout = "wide" | "page" | "reader";
110
+
111
+ /**
112
+ * Interface representing all possible meta tags that can be used in HTML documents.
113
+ * This includes standard meta tags, Open Graph tags, Twitter cards, and various other
114
+ * specialized meta tags for different content types.
115
+ *
116
+ */
117
+ interface MetaTags {
118
+ /** Standard meta tag for controlling search engine crawling and indexing
119
+ * @example "noindex"
120
+ */
121
+ robots: string;
122
+ /** Character encoding for the document
123
+ * @example "UTF-8"
124
+ */
125
+ charset: string;
126
+ /** Viewport settings for responsive design
127
+ * @example "width=device-width, initial-scale=1, maximum-scale=1"
128
+ */
129
+ viewport: string;
130
+ /** Brief description of the page content
131
+ * @example "Your page description"
132
+ */
133
+ description: string;
134
+ /** Keywords relevant to the page content
135
+ * @example "keyword, keyword2"
136
+ */
137
+ keywords: string;
138
+ /** Author of the page content
139
+ * @example "Author Name"
140
+ */
141
+ author: string;
142
+ /** Google-specific crawling instructions
143
+ * @example "index, follow"
144
+ */
145
+ googlebot: string;
146
+ /** Google-specific settings
147
+ * @example "notranslate"
148
+ */
149
+ google: string;
150
+ /** Google Search Console verification token
151
+ * @example "verification_token"
152
+ */
153
+ "google-site-verification": string;
154
+ /** Software used to generate the page
155
+ * @example "xyd"
156
+ */
157
+ generator: string;
158
+ /** Theme color for browser UI
159
+ * @example "#ffffff"
160
+ */
161
+ "theme-color": string;
162
+ /** Color scheme preference
163
+ * @example "light"
164
+ */
165
+ "color-scheme": string;
166
+ /** Format detection settings
167
+ * @example "telephone=no"
168
+ */
169
+ "format-detection": string;
170
+ /** Referrer policy
171
+ * @example "origin"
172
+ */
173
+ referrer: string;
174
+ /** Page refresh settings
175
+ * @example "0;url=https://example.com"
176
+ */
177
+ refresh: string;
178
+ /** Content rating
179
+ * @example "general"
180
+ */
181
+ rating: string;
182
+ /** Crawl frequency suggestion
183
+ * @example "7 days"
184
+ */
185
+ "revisit-after": string;
186
+ /** Page language
187
+ * @example "en-US"
188
+ */
189
+ language: string;
190
+ /** Copyright information
191
+ * @example "Copyright 2024"
192
+ */
193
+ copyright: string;
194
+ /** Reply-to email address
195
+ * @example "contact@example.com"
196
+ */
197
+ "reply-to": string;
198
+ /** Content distribution scope
199
+ * @example "global"
200
+ */
201
+ distribution: string;
202
+ /** Content coverage area
203
+ * @example "Worldwide"
204
+ */
205
+ coverage: string;
206
+ /** Content category
207
+ * @example "Technology"
208
+ */
209
+ category: string;
210
+ /** Target audience
211
+ * @example "all"
212
+ */
213
+ target: string;
214
+ /** Mobile device compatibility
215
+ * @example "true"
216
+ */
217
+ HandheldFriendly: string;
218
+ /** Mobile optimization settings
219
+ * @example "width"
220
+ */
221
+ MobileOptimized: string;
222
+ /** iOS web app capability
223
+ * @example "yes"
224
+ */
225
+ "apple-mobile-web-app-capable": string;
226
+ /** iOS status bar style
227
+ * @example "black"
228
+ */
229
+ "apple-mobile-web-app-status-bar-style": string;
230
+ /** iOS web app title
231
+ * @example "App Name"
232
+ */
233
+ "apple-mobile-web-app-title": string;
234
+ /** Web application name
235
+ * @example "My App"
236
+ */
237
+ "application-name": string;
238
+ /** Windows tile color
239
+ * @example "#2b5797"
240
+ */
241
+ "msapplication-TileColor": string;
242
+ /** Windows tile image
243
+ * @example "/mstile-144x144.png"a
244
+ */
245
+ "msapplication-TileImage": string;
246
+ /** Windows browser config
247
+ * @example "/browserconfig.xml"
248
+ */
249
+ "msapplication-config": string;
250
+ /** Open Graph title
251
+ * @example "Page Title"
252
+ */
253
+ "og:title": string;
254
+ /** Open Graph content type
255
+ * @example "website"
256
+ */
257
+ "og:type": string;
258
+ /** Open Graph URL
259
+ * @example "https://example.com"
260
+ */
261
+ "og:url": string;
262
+ /** Open Graph image
263
+ * @example "https://example.com/image.jpg"
264
+ */
265
+ "og:image": string;
266
+ /** Open Graph description
267
+ * @example "A brief description for social media"
268
+ */
269
+ "og:description": string;
270
+ /** Open Graph site name
271
+ * @example "Site Name"
272
+ */
273
+ "og:site_name": string;
274
+ /** Open Graph locale
275
+ * @example "en_US"
276
+ */
277
+ "og:locale": string;
278
+ /** Open Graph video
279
+ * @example "https://example.com/video.mp4"
280
+ */
281
+ "og:video": string;
282
+ /** Open Graph audio
283
+ * @example "https://example.com/audio.mp3"
284
+ */
285
+ "og:audio": string;
286
+ /** Twitter card type
287
+ * @example "summary"
288
+ */
289
+ "twitter:card": string;
290
+ /** Twitter site handle
291
+ * @example "@username"
292
+ */
293
+ "twitter:site": string;
294
+ /** Twitter creator handle
295
+ * @example "@author"
296
+ */
297
+ "twitter:creator": string;
298
+ /** Twitter title
299
+ * @example "Page Title"
300
+ */
301
+ "twitter:title": string;
302
+ /** Twitter description
303
+ * @example "A brief description for Twitter"
304
+ */
305
+ "twitter:description": string;
306
+ /** Twitter image
307
+ * @example "https://example.com/image.jpg"
308
+ */
309
+ "twitter:image": string;
310
+ /** Twitter image alt text
311
+ * @example "Image description"
312
+ */
313
+ "twitter:image:alt": string;
314
+ /** Twitter player URL
315
+ * @example "https://example.com/player"
316
+ */
317
+ "twitter:player": string;
318
+ /** Twitter player width
319
+ * @example "480"
320
+ */
321
+ "twitter:player:width": string;
322
+ /** Twitter player height
323
+ * @example "480"
324
+ */
325
+ "twitter:player:height": string;
326
+ /** Twitter iOS app name
327
+ * @example "App Name"
328
+ */
329
+ "twitter:app:name:iphone": string;
330
+ /** Twitter iOS app ID
331
+ * @example "123456789"
332
+ */
333
+ "twitter:app:id:iphone": string;
334
+ /** Twitter iOS app URL
335
+ * @example "app://"
336
+ */
337
+ "twitter:app:url:iphone": string;
338
+ /** Article publication time
339
+ * @example "2024-03-20T12:00:00Z"
340
+ */
341
+ "article:published_time": string;
342
+ /** Article modification time
343
+ * @example "2024-03-21T15:30:00Z"
344
+ */
345
+ "article:modified_time": string;
346
+ /** Article expiration time
347
+ * @example "2024-04-20T12:00:00Z"
348
+ */
349
+ "article:expiration_time": string;
350
+ /** Article author
351
+ * @example "John Doe"
352
+ */
353
+ "article:author": string;
354
+ /** Article section
355
+ * @example "Technology"
356
+ */
357
+ "article:section": string;
358
+ /** Article tags
359
+ * @example "Web Development"
360
+ */
361
+ "article:tag": string;
362
+ /** Book author
363
+ * @example "Jane Smith"
364
+ */
365
+ "book:author": string;
366
+ /** Book ISBN
367
+ * @example "978-3-16-148410-0"
368
+ */
369
+ "book:isbn": string;
370
+ /** Book release date
371
+ * @example "2024-01-01"
372
+ */
373
+ "book:release_date": string;
374
+ /** Book tags
375
+ * @example "Fiction"
376
+ */
377
+ "book:tag": string;
378
+ /** Profile first name
379
+ * @example "John"
380
+ */
381
+ "profile:first_name": string;
382
+ /** Profile last name
383
+ * @example "Doe"
384
+ */
385
+ "profile:last_name": string;
386
+ /** Profile username
387
+ * @example "johndoe"
388
+ */
389
+ "profile:username": string;
390
+ /** Profile gender
391
+ * @example "male"
392
+ */
393
+ "profile:gender": string;
394
+ /** Music duration in seconds
395
+ * @example "180"
396
+ */
397
+ "music:duration": string;
398
+ /** Music album name
399
+ * @example "Album Name"
400
+ */
401
+ "music:album": string;
402
+ /** Music album disc number
403
+ * @example "1"
404
+ */
405
+ "music:album:disc": string;
406
+ /** Music album track number
407
+ * @example "1"
408
+ */
409
+ "music:album:track": string;
410
+ /** Music musician/artist
411
+ * @example "Artist Name"
412
+ */
413
+ "music:musician": string;
414
+ /** Music song name
415
+ * @example "Song Name"
416
+ */
417
+ "music:song": string;
418
+ /** Music song disc number
419
+ * @example "1"
420
+ */
421
+ "music:song:disc": string;
422
+ /** Music song track number
423
+ * @example "1"
424
+ */
425
+ "music:song:track": string;
426
+ /** Video actor name
427
+ * @example "Actor Name"
428
+ */
429
+ "video:actor": string;
430
+ /** Video actor role
431
+ * @example "Character Name"
432
+ */
433
+ "video:actor:role": string;
434
+ /** Video director
435
+ * @example "Director Name"
436
+ */
437
+ "video:director": string;
438
+ /** Video writer
439
+ * @example "Writer Name"
440
+ */
441
+ "video:writer": string;
442
+ /** Video duration in seconds
443
+ * @example "120"
444
+ */
445
+ "video:duration": string;
446
+ /** Video release date
447
+ * @example "2024-01-01"
448
+ */
449
+ "video:release_date": string;
450
+ /** Video tags
451
+ * @example "Action"
452
+ */
453
+ "video:tag": string;
454
+ /** Video series name
455
+ * @example "Series Name"
456
+ */
457
+ "video:series": string;
458
+ }
459
+
460
+ type RawTheme = {
461
+ name?: string;
462
+ type?: string;
463
+ tokenColors?: ThemeSetting[];
464
+ colors?: {
465
+ [key: string]: string;
466
+ };
467
+ [key: string]: any;
468
+ };
469
+ type ThemeSetting = {
470
+ name?: string;
471
+ scope?: string | string[];
472
+ settings: {
473
+ fontStyle?: string;
474
+ foreground?: string;
475
+ background?: string;
476
+ };
477
+ };
478
+ declare const THEME_NAMES: readonly ["dark-plus", "dracula-soft", "dracula", "github-dark", "github-dark-dimmed", "github-from-css", "github-light", "light-plus", "material-darker", "material-default", "material-from-css", "material-lighter", "material-ocean", "material-palenight", "min-dark", "min-light", "monokai", "nord", "one-dark-pro", "poimandres", "slack-dark", "slack-ochin", "solarized-dark", "solarized-light"];
479
+ type NamesTuple$1 = typeof THEME_NAMES;
480
+ type StringTheme = NamesTuple$1[number];
481
+ type Theme$1 = StringTheme | RawTheme;
482
+
483
+ /**
484
+ * Main settings interface for the application
485
+ */
486
+ interface Settings {
487
+ /** Theme configuration for the application */
488
+ theme?: Theme;
489
+ /** Navigation configuration */
490
+ navigation?: Navigation;
491
+ /** API Docs configuration */
492
+ api?: API;
493
+ /** Integrations configuration */
494
+ integrations?: Integrations;
495
+ /** Plugins configuration */
496
+ plugins?: Plugins;
497
+ /**
498
+ * SEO configuration
499
+ */
500
+ seo?: SEO;
501
+ /**
502
+ * @internal
503
+ *
504
+ * WebEditor configuration - building blocks for UI editing
505
+ */
506
+ webeditor?: WebEditor;
507
+ /**
508
+ *
509
+ * Components configuration
510
+ */
511
+ components?: Components;
512
+ /** Engine configuration - advanced engine-like configuration */
513
+ engine?: Engine;
514
+ /**
515
+ * @internal
516
+ * Redirects configuration
517
+ */
518
+ redirects?: Redirects[];
519
+ }
520
+ /**
521
+ * Theme configuration that changes the look and feel of the project
522
+ */
523
+ interface Theme {
524
+ /**
525
+ * A theme name.
526
+ */
527
+ readonly name: ThemePresetName | (string & {});
528
+ /**
529
+ * Path to logo image or object with path to "light" and "dark" mode logo images, and where the logo links to.
530
+ */
531
+ logo?: string | Logo | React.JSX.Element;
532
+ /**
533
+ * Font configuration for the theme.
534
+ */
535
+ fonts?: ThemeFont;
536
+ /**
537
+ * Path to the favicon image. For example: /path/to/favicon.svg
538
+ */
539
+ favicon?: string;
540
+ /**
541
+ * The iconify library setup.
542
+ */
543
+ icons?: Icons;
544
+ /**
545
+ * Appearance configuration for the theme.
546
+ */
547
+ appearance?: Appearance;
548
+ /**
549
+ * Writer configuration for the theme.
550
+ */
551
+ writer?: Writer;
552
+ /**
553
+ * Coder configuration for the theme, including options like syntax highlighting.
554
+ */
555
+ coder?: Coder;
556
+ /**
557
+ * Head configuration
558
+ */
559
+ head?: HeadConfig[];
560
+ /**
561
+ * Custom scripts to be added to the head of the every page.
562
+ * Paths are relative to the root of the project or absolute.
563
+ */
564
+ scripts?: Script[];
565
+ }
566
+ type ThemeFont = Font | Font[] | {
567
+ body?: Font | Font[];
568
+ coder?: Font | Font[];
569
+ };
570
+ interface Font {
571
+ /**
572
+ * The font family to use.
573
+ */
574
+ family?: string;
575
+ /**
576
+ * The font weight to use.
577
+ */
578
+ weight?: string;
579
+ /**
580
+ * The font src to use.
581
+ */
582
+ src?: string;
583
+ /**
584
+ * The font format to use.
585
+ */
586
+ format?: "woff2" | "woff" | "ttf";
587
+ }
588
+ /**
589
+ * Coder configuration for the theme, including options like syntax highlighting.
590
+ */
591
+ interface Coder {
592
+ /**
593
+ * If `true` then code blocks will have line numbers by default.
594
+ */
595
+ lines?: boolean;
596
+ /**
597
+ * If `true` then code blocks will have a scrollbar by default.
598
+ */
599
+ scroll?: boolean;
600
+ /**
601
+ * Syntax highlighting configuration.
602
+ */
603
+ syntaxHighlight?: Theme$1;
604
+ }
605
+ interface Writer {
606
+ /**
607
+ * The maximum number of table of conten§ts levels.
608
+ */
609
+ maxTocDepth?: number;
610
+ /**
611
+ * Copy page button
612
+ */
613
+ copyPage?: boolean;
614
+ }
615
+ /**
616
+ * Appearance configuration for the theme.
617
+ */
618
+ interface Appearance {
619
+ /**
620
+ * The default color scheme to use.
621
+ */
622
+ colorScheme?: "light" | "dark" | "os";
623
+ /**
624
+ * Colors configuration for the theme.
625
+ */
626
+ colors?: Colors;
627
+ /**
628
+ * CSS tokens for the theme.
629
+ */
630
+ cssTokens?: {
631
+ [token: string]: string;
632
+ };
633
+ /**
634
+ * Presets for the theme.
635
+ */
636
+ presets?: string[];
637
+ /**
638
+ * Logo appearance for the theme.
639
+ */
640
+ logo?: AppearanceLogo;
641
+ /**
642
+ * Search appearance for the theme.
643
+ */
644
+ search?: AppearanceSearch;
645
+ /**
646
+ * Header appearance for the theme.
647
+ */
648
+ header?: AppearanceHeader;
649
+ /**
650
+ * Tabs appearance for the theme.
651
+ */
652
+ tabs?: AppearanceTabs;
653
+ /**
654
+ * Sidebar appearance for the theme.
655
+ */
656
+ sidebar?: AppearanceSidebar;
657
+ /**
658
+ * Buttons appearance for the theme.
659
+ */
660
+ buttons?: AppearanceButtons;
661
+ /**
662
+ * Table appearance for the theme.
663
+ */
664
+ tables?: AppearanceTables;
665
+ /**
666
+ * Banner appearance for the theme.
667
+ */
668
+ banner?: AppearanceBanner;
669
+ /**
670
+ * Content appearance for the theme.
671
+ */
672
+ content?: AppearanceContent;
673
+ /**
674
+ * Footer appearance for the theme.
675
+ */
676
+ footer?: AppearanceFooter;
677
+ }
678
+ interface Colors {
679
+ /**
680
+ * The primary color of the theme.
681
+ */
682
+ primary: string;
683
+ /**
684
+ * The light color of the theme.
685
+ */
686
+ light?: string;
687
+ /**
688
+ * The dark color of the theme.
689
+ */
690
+ dark?: string;
691
+ }
692
+ interface AppearanceTabs {
693
+ /**
694
+ * The tabs to display in the header.
695
+ */
696
+ surface?: "center" | "sidebar";
697
+ }
698
+ /**
699
+ * AppearanceLogo configuration for the theme.
700
+ */
701
+ interface AppearanceLogo {
702
+ /**
703
+ * If `true` then the logo will be displayed on the sidebar.
704
+ */
705
+ sidebar?: boolean | "mobile" | "desktop";
706
+ /**
707
+ * If `true` then the logo will be displayed on the header.
708
+ */
709
+ header?: boolean | "mobile" | "desktop";
710
+ }
711
+ interface AppearanceContent {
712
+ /**
713
+ * Content decorator for the theme.
714
+ */
715
+ contentDecorator?: "secondary";
716
+ /**
717
+ * If `true` then the breadcrumbs will be displayed.
718
+ */
719
+ breadcrumbs?: boolean;
720
+ /**
721
+ * If `true` then the section separator will be displayed.
722
+ */
723
+ sectionSeparator?: boolean;
724
+ }
725
+ interface AppearanceFooter {
726
+ /**
727
+ * The footer surface.
728
+ */
729
+ surface?: "page";
730
+ }
731
+ interface AppearanceSearch {
732
+ /**
733
+ * If `true` then the search bar will be displayed as a full width.
734
+ */
735
+ fullWidth?: boolean;
736
+ /**
737
+ * If `true` then the search bar will be displayed on the sidebar.
738
+ */
739
+ sidebar?: boolean | "mobile" | "desktop";
740
+ /**
741
+ * If `true` then the search bar will be displayed in the middle of the header.
742
+ */
743
+ middle?: boolean | "mobile" | "desktop";
744
+ /**
745
+ * If `true` then the search bar will be displayed on the right side of the header.
746
+ */
747
+ right?: boolean | "mobile" | "desktop";
748
+ }
749
+ interface AppearanceHeader {
750
+ /**
751
+ * If `true` then the header external links will display an external arrow.
752
+ */
753
+ externalArrow?: boolean;
754
+ /**
755
+ * If `right` then separator will be displayed on the right side of the header.
756
+ */
757
+ separator?: "right";
758
+ /**
759
+ * The type of the header.
760
+ */
761
+ type?: "classic" | "pad";
762
+ /**
763
+ * The button size of the header.
764
+ */
765
+ buttonSize?: "sm" | "md" | "lg";
766
+ }
767
+ interface AppearanceSidebar {
768
+ /**
769
+ * If `true` then the sidebar will display a scroll shadow.
770
+ */
771
+ externalArrow?: boolean;
772
+ /**
773
+ * If `true` then the sidebar will display a scroll shadow.
774
+ */
775
+ scrollShadow?: boolean;
776
+ /**
777
+ * The color of the sidebar scrollbar.
778
+ */
779
+ scrollbar?: "secondary";
780
+ /**
781
+ * The color of the sidebar scrollbar.
782
+ */
783
+ scrollbarColor?: string;
784
+ /**
785
+ * The transition behaviour of the sidebar scroll when navigating to a new page.
786
+ */
787
+ scrollTransition?: "smooth" | "instant";
788
+ }
789
+ interface AppearanceButtons {
790
+ rounded?: boolean | "lg" | "md" | "sm";
791
+ }
792
+ interface AppearanceTables {
793
+ /**
794
+ * The kind of the table.
795
+ */
796
+ kind?: "secondary";
797
+ }
798
+ interface AppearanceBanner {
799
+ /**
800
+ * If `true` then the banner will have fixed position (always visible).
801
+ */
802
+ fixed?: boolean;
803
+ }
804
+ /**
805
+ * Configuration type for head elements that can be added to the HTML head.
806
+ * Format: [tagName, attributes]
807
+ *
808
+ * @example: ['script', { src: 'https://example.com/script.js', defer: true }]
809
+ */
810
+ type HeadConfig = [string, Record<string, string | boolean>, string?];
811
+ type Script = string;
812
+ /**
813
+ * Logo configuration interface
814
+ */
815
+ interface Logo {
816
+ /** Path to the logo in light mode. For example: `/path/to/logo.svg` */
817
+ light?: string;
818
+ /** Path to the logo in dark mode. For example: `/path/to/logo.svg` */
819
+ dark?: string;
820
+ /** External href to when clicking on the logo */
821
+ href?: string;
822
+ /** The page to link to when clicking on the logo */
823
+ page?: string;
824
+ }
825
+ interface IconLibrary {
826
+ /** The iconify library name */
827
+ name: string;
828
+ /** The iconify library version */
829
+ version?: string;
830
+ /** The default iconify icon name */
831
+ default?: boolean;
832
+ /** Merge icons from the library into the default iconify library */
833
+ noprefix?: boolean;
834
+ }
835
+ interface Icons {
836
+ /** The iconify library */
837
+ library?: string | IconLibrary | (string | IconLibrary)[];
838
+ }
839
+ /** Available theme preset names */
840
+ type ThemePresetName = "poetry" | "cosmo" | "opener" | "picasso";
841
+ /** Search bar location options */
842
+ type SearchType = "side" | "top";
843
+ /**
844
+ * Navigation configuration interface
845
+ */
846
+ interface Navigation {
847
+ /**
848
+ * Sidebar navigation - main navigation on the left side of the page.
849
+ */
850
+ sidebar: SidebarNavigation;
851
+ /**
852
+ * Tabs navigation - navigation through tabs.
853
+ */
854
+ tabs?: Tabs;
855
+ /**
856
+ * Sidebar dropdown navigation - navigation through dropdown in the sidebar.
857
+ */
858
+ sidebarDropdown?: SidebarDropdown;
859
+ /**
860
+ * Segments navigation - navigation elements visible only on specific routes.
861
+ */
862
+ segments?: Segment[];
863
+ /**
864
+ * Anchors navigation - fixed navigation, for anchor-like elements.
865
+ */
866
+ anchors?: Anchors;
867
+ }
868
+ type SidebarDropdown = NavigationItem[];
869
+ /**
870
+ * Tabs configuration
871
+ */
872
+ type Tabs = NavigationItem[];
873
+ /**
874
+ * Sidebar navigation type
875
+ */
876
+ type SidebarNavigation = (SidebarRoute | Sidebar | string)[];
877
+ /**
878
+ * Sidebar route configuration
879
+ */
880
+ interface SidebarRoute {
881
+ /** Route for this sidebar */
882
+ route: string;
883
+ /** The group of the route */
884
+ group?: string | false;
885
+ /** The id of the route */
886
+ id?: string;
887
+ /** Sidebar pages within this route or sub routes */
888
+ pages: Sidebar[] | SidebarRoute[];
889
+ }
890
+ /**
891
+ * Sidebar configuration
892
+ */
893
+ interface Sidebar {
894
+ /** The name of the group */
895
+ group?: string | false;
896
+ /**
897
+ * The relative paths to the markdown files that will serve as pages.
898
+ * Note: groups are recursive, so to add a sub-folder add another group object in the page array.
899
+ */
900
+ pages?: PageURL[];
901
+ /**
902
+ * The icon of the group.
903
+ */
904
+ icon?: string;
905
+ /**
906
+ * The order of the group.
907
+ */
908
+ order?: Order;
909
+ }
910
+ type Order = 0 | -1 | {
911
+ after: string;
912
+ } | {
913
+ before: string;
914
+ };
915
+ /**
916
+ * Page URL type
917
+ */
918
+ type PageURL = string | VirtualPage | Sidebar;
919
+ /**
920
+ * @internal
921
+ *
922
+ * Virtual page type
923
+ *
924
+ * Virtual pages are composition of pages, needed for templating e.g in uniform
925
+ *
926
+ * Example:
927
+ *
928
+ * {
929
+ * pages: [0
930
+ * ".xyd/.cache/.content/docs/rest/todo:docs/rest/todo",
931
+ * ]
932
+ * }
933
+ *
934
+ * above will be rendered as docs/rest/todo.md using composition from xyd's `.content`
935
+ */
936
+ type VirtualPage = string | {
937
+ /** The virtual page to use for the page */
938
+ virtual: string;
939
+ /** The page to use for the page */
940
+ page: string;
941
+ /** The template to use for the page */
942
+ templates?: string | string[];
943
+ };
944
+ /**
945
+ * Segment configuration
946
+ */
947
+ interface Segment {
948
+ /** Route for this segment */
949
+ route: string;
950
+ /** Title of this segment */
951
+ title?: string;
952
+ /** Appearance of this segment. If 'sidebarDropdown' then show this segment as a dropdown in the sidebar if match. */
953
+ appearance?: "sidebarDropdown";
954
+ /** Items within this segment */
955
+ pages: NavigationItem[];
956
+ }
957
+ /**
958
+ * Core interface for navigation items
959
+ */
960
+ interface NavigationItem {
961
+ /**
962
+ * The navigation item title
963
+ */
964
+ title?: string;
965
+ /**
966
+ * The navigation item description
967
+ */
968
+ description?: string;
969
+ /**
970
+ * The navigation page, if set it redirects to the page + matches based on routing
971
+ */
972
+ page?: string;
973
+ /**
974
+ * The navigation href, if set it redirects but does not match based on routing
975
+ */
976
+ href?: string;
977
+ /**
978
+ * The navigation item icon
979
+ */
980
+ icon?: string | React.ReactNode;
981
+ }
982
+ type NavigationItemButton = NavigationItem & {
983
+ button: "primary" | "secondary";
984
+ };
985
+ type NavigationItemSocial = NavigationItem & {
986
+ social: Social;
987
+ };
988
+ /**
989
+ * Anchor root configuration
990
+ */
991
+ interface Anchors {
992
+ /** Header anchors */
993
+ header?: AnchorHeader[];
994
+ /** Sidebar anchors */
995
+ sidebar?: {
996
+ top?: NavigationItem[];
997
+ bottom?: NavigationItem[];
998
+ };
999
+ }
1000
+ type AnchorHeader = NavigationItem | NavigationItemButton | NavigationItemSocial;
1001
+ /**
1002
+ * WebEditor navigation item configuration
1003
+ */
1004
+ type WebEditorNavigationItem = NavigationItem & Partial<JSONComponent> & {
1005
+ /**
1006
+ * If `true` then the item will be displayed on mobile.
1007
+ */
1008
+ mobile?: boolean;
1009
+ /**
1010
+ * If `true` then the item will be displayed on desktop.
1011
+ */
1012
+ desktop?: boolean;
1013
+ };
1014
+ interface Components {
1015
+ /**
1016
+ * WebEditor banner configuration
1017
+ */
1018
+ banner?: WebEditorBanner;
1019
+ /**
1020
+ * WebEditor footer configuration
1021
+ */
1022
+ footer?: WebEditorFooter;
1023
+ }
1024
+ /**
1025
+ * WebEditor configuration
1026
+ */
1027
+ interface WebEditor {
1028
+ /**
1029
+ * WebEditor header configuration
1030
+ */
1031
+ sidebarTop?: WebEditorNavigationItem[];
1032
+ /**
1033
+ * WebEditor header configuration
1034
+ */
1035
+ header?: WebEditorHeader[];
1036
+ /**
1037
+ * WebEditor header configuration
1038
+ */
1039
+ subheader?: WebEditorSubHeader;
1040
+ }
1041
+ type Social = "x" | "facebook" | "youtube" | "discord" | "slack" | "github" | "linkedin" | "instagram" | "hackernews" | "medium" | "telegram" | "bluesky" | "reddit";
1042
+ interface WebEditorFooter {
1043
+ kind?: "minimal";
1044
+ logo?: boolean | ComponentLike;
1045
+ /** Footer socials */
1046
+ social?: {
1047
+ [K in Social]?: string;
1048
+ };
1049
+ /** Footer links */
1050
+ links?: WebEditorFooterLinks;
1051
+ /** Footer footnote */
1052
+ footnote?: ComponentLike;
1053
+ }
1054
+ type WebEditorFooterLinks = WebEditorFooterLink[] | WebEditorFooterLinkItem[];
1055
+ interface WebEditorFooterLink {
1056
+ header: string;
1057
+ items: WebEditorFooterLinkItem[];
1058
+ }
1059
+ type WebEditorFooterLinkItem = {
1060
+ label: string;
1061
+ href: string;
1062
+ };
1063
+ interface WebEditorBanner {
1064
+ /**
1065
+ * Banner content.
1066
+ */
1067
+ content: ComponentLike;
1068
+ /**
1069
+ * Banner label.
1070
+ */
1071
+ label?: string;
1072
+ /**
1073
+ * Banner kind.
1074
+ */
1075
+ kind?: "secondary";
1076
+ /**
1077
+ * Banner href.
1078
+ */
1079
+ href?: string;
1080
+ /**
1081
+ * Banner icon.
1082
+ */
1083
+ icon?: string;
1084
+ }
1085
+ /**
1086
+ * WebEditor header configuration
1087
+ */
1088
+ type WebEditorHeader = WebEditorNavigationItem & {
1089
+ /** Float the header to the right */
1090
+ float?: "right" | "center";
1091
+ };
1092
+ /**
1093
+ * WebEditorSubHeader header configuration
1094
+ */
1095
+ interface WebEditorSubHeader {
1096
+ /** Items of this subheader */
1097
+ items: WebEditorNavigationItem[];
1098
+ /** Title of this segment */
1099
+ title?: string;
1100
+ }
1101
+ /**
1102
+ * API Docs configuration interface
1103
+ */
1104
+ interface API {
1105
+ /**
1106
+ * OpenAPI configuration
1107
+ */
1108
+ openapi?: APIFile;
1109
+ /**
1110
+ * GraphQL configuration
1111
+ */
1112
+ graphql?: APIFile;
1113
+ /**
1114
+ * Sources configuration
1115
+ */
1116
+ sources?: APIFile;
1117
+ }
1118
+ /**
1119
+ * API file configuration. Can be a path, an array of paths, a map of paths, or an advanced configuration
1120
+ */
1121
+ type APIFile = string | string[] | APIFileMap | APIFileAdvanced;
1122
+ /**
1123
+ * API file map type
1124
+ */
1125
+ type APIFileMap = {
1126
+ [name: string]: string | APIFileAdvanced;
1127
+ };
1128
+ /**
1129
+ * API file advanced type
1130
+ */
1131
+ type APIFileAdvanced = {
1132
+ /** API information configuration */
1133
+ info?: APIInfo;
1134
+ /** Route configuration */
1135
+ route: string;
1136
+ };
1137
+ /**
1138
+ * API file type - can be a string, array of strings, or a map of strings
1139
+ */
1140
+ /**
1141
+ * API information configuration
1142
+ */
1143
+ interface APIInfo {
1144
+ /**
1145
+ * The base url for all API endpoints. If baseUrl is an array, it will enable
1146
+ * for multiple base url options that the user can toggle.
1147
+ */
1148
+ baseUrl?: string;
1149
+ /** Authentication information */
1150
+ auth?: APIAuth;
1151
+ /**
1152
+ * The name of the authentication parameter used in the API playground.
1153
+ * If method is basic, the format should be [usernameName]:[passwordName]
1154
+ */
1155
+ name?: string;
1156
+ /**
1157
+ * The default value that's designed to be a prefisx for the authentication input field.
1158
+ * E.g. If an inputPrefix of AuthKey would inherit the default input result of the authentication field as AuthKey.
1159
+ */
1160
+ inputPrefix?: string;
1161
+ /** Request configuration */
1162
+ request?: APIInfoRequest;
1163
+ }
1164
+ /**
1165
+ * API authentication configuration
1166
+ */
1167
+ interface APIAuth {
1168
+ /** The authentication strategy used for all API endpoints */
1169
+ method: "bearer" | "basic" | "key";
1170
+ }
1171
+ /**
1172
+ * API request configuration
1173
+ */
1174
+ interface APIInfoRequest {
1175
+ /** Configurations for the auto-generated API request examples */
1176
+ example?: {
1177
+ /**
1178
+ * An array of strings that determine the order of the languages of the auto-generated request examples.
1179
+ * You can either define custom languages utilizing x-codeSamples or use our default languages which include
1180
+ * bash, python, javascript, php, go, java
1181
+ */
1182
+ languages?: string[];
1183
+ };
1184
+ }
1185
+ /**
1186
+ * Integrations configuration
1187
+ */
1188
+ interface Integrations {
1189
+ /**
1190
+ * Configurations to add third-party analytics integrations.
1191
+ * See full list of supported analytics here.
1192
+ */
1193
+ analytics?: IntegrationAnalytics;
1194
+ /**
1195
+ * Configurations to add third-party support integrations.
1196
+ */
1197
+ support?: IntegrationSupport;
1198
+ /**
1199
+ * Configurations to add third-party search integrations.
1200
+ * See full list of supported search here.
1201
+ */
1202
+ search?: IntegrationSearch;
1203
+ /**
1204
+ * A/B testing configuration
1205
+ */
1206
+ abtesting?: IntegrationABTesting;
1207
+ /**
1208
+ * Diagrams configuration
1209
+ */
1210
+ diagrams?: boolean;
1211
+ /**
1212
+ * Custom apps directory.
1213
+ */
1214
+ [".apps"]?: AppsDirectory;
1215
+ }
1216
+ /**
1217
+ * Analytics configuration
1218
+ */
1219
+ interface IntegrationAnalytics {
1220
+ /** Livesession analytics configuration */
1221
+ livesession?: IntegrationAnalyticsLiveSession;
1222
+ }
1223
+ /**
1224
+ * Livesession analytics configuration
1225
+ */
1226
+ interface IntegrationAnalyticsLiveSession {
1227
+ /** Livesession's TrackID */
1228
+ trackId: string;
1229
+ }
1230
+ /**
1231
+ * Support configuration
1232
+ */
1233
+ interface IntegrationSupport {
1234
+ /** Chatwoot support configuration */
1235
+ chatwoot?: IntegrationSupportChatwoot;
1236
+ /** Intercom support configuration */
1237
+ intercom?: IntegrationSupportIntercom;
1238
+ /** Livechat support configuration */
1239
+ livechat?: IntegrationSupportLivechat;
1240
+ }
1241
+ /**
1242
+ * Chatwoot support configuration
1243
+ */
1244
+ interface IntegrationSupportChatwoot {
1245
+ /** Chatwoot website token */
1246
+ websiteToken: string;
1247
+ /** Chatwoot base URL */
1248
+ baseURL?: string;
1249
+ /** Chatwoot settings */
1250
+ chatwootSettings?: JSON;
1251
+ }
1252
+ /**
1253
+ * Intercom support configuration
1254
+ */
1255
+ interface IntegrationSupportIntercom {
1256
+ /** Intercom app ID */
1257
+ appId: string;
1258
+ /** Intercom API base */
1259
+ apiBase?: string;
1260
+ }
1261
+ interface IntegrationSupportLivechat {
1262
+ /** Livechat license ID */
1263
+ licenseId: string;
1264
+ }
1265
+ /**
1266
+ * Search configuration
1267
+ */
1268
+ interface IntegrationSearch {
1269
+ /** Algolia search configuration */
1270
+ algolia?: {
1271
+ /** Algolia application ID */
1272
+ appId: string;
1273
+ /** Algolia API key */
1274
+ apiKey: string;
1275
+ };
1276
+ orama?: {
1277
+ /** Orama endpoint */
1278
+ endpoint: string;
1279
+ /** Orama API key */
1280
+ apiKey: string;
1281
+ /** Orama suggestions */
1282
+ suggestions?: string[];
1283
+ } | boolean;
1284
+ }
1285
+ /**
1286
+ * A/B testing configuration
1287
+ */
1288
+ interface IntegrationABTesting {
1289
+ /**
1290
+ * Context max age in milliseconds
1291
+ */
1292
+ contextMaxAge?: number;
1293
+ /**
1294
+ * Context storage key used to store the context in the browser storage
1295
+ */
1296
+ contextStorageKey?: string;
1297
+ /**
1298
+ * Providers configuration
1299
+ */
1300
+ providers?: IntegrationABTestingProviders;
1301
+ }
1302
+ interface IntegrationABTestingProviders {
1303
+ /**
1304
+ * GrowthBook configuration
1305
+ */
1306
+ growthbook?: IntegrationABTestingGrowthBook;
1307
+ /**
1308
+ * LaunchDarkly configuration
1309
+ */
1310
+ launchdarkly?: IntegrationABTestingLaunchDarkly;
1311
+ }
1312
+ interface IntegrationABTestingGrowthBook {
1313
+ /**
1314
+ * GrowthBook API host
1315
+ */
1316
+ apiHost: string;
1317
+ /**
1318
+ * GrowthBook client key
1319
+ */
1320
+ clientKey: string;
1321
+ }
1322
+ interface IntegrationABTestingLaunchDarkly {
1323
+ /**
1324
+ * LaunchDarkly environment key
1325
+ */
1326
+ env: string;
1327
+ }
1328
+ interface AppsDirectory {
1329
+ /**
1330
+ * Github star app configuration.
1331
+ */
1332
+ githubStar?: IntegrationAppGithubStar;
1333
+ /**
1334
+ * Supademo app configuration.
1335
+ */
1336
+ supademo?: IntegrationAppSupademo;
1337
+ }
1338
+ interface IntegrationAppGithubStar {
1339
+ /**
1340
+ * The title of the Github button
1341
+ */
1342
+ title: string;
1343
+ /**
1344
+ * The label of the Github Button
1345
+ */
1346
+ label?: string;
1347
+ /**
1348
+ * The href of the Github project
1349
+ */
1350
+ href: string;
1351
+ /**
1352
+ * The data-show-count of the Github project
1353
+ */
1354
+ dataShowCount?: boolean;
1355
+ /**
1356
+ * The data-icon of the Github button
1357
+ */
1358
+ dataIcon?: string;
1359
+ /**
1360
+ * The data-size of the Github button
1361
+ */
1362
+ dataSize?: string;
1363
+ /**
1364
+ * The aria-label of the Github button
1365
+ */
1366
+ ariaLabel?: string;
1367
+ }
1368
+ interface IntegrationAppSupademo {
1369
+ /**
1370
+ * The Supademo API key
1371
+ */
1372
+ apiKey: string;
1373
+ }
1374
+ /**
1375
+ * Plugin configuration
1376
+ *
1377
+ * @example
1378
+ * 1)
1379
+ * {
1380
+ * plugins: [
1381
+ * "livesession",
1382
+ * ]
1383
+ * }
1384
+ *
1385
+ * or 2)
1386
+ * {
1387
+ * plugins: [
1388
+ * [
1389
+ * "livesession",
1390
+ * "accountID.websiteID",
1391
+ * {
1392
+ * keystrokes: true
1393
+ * }
1394
+ * ]
1395
+ * ]
1396
+ * }
1397
+ *
1398
+ * @example [audience:dev]
1399
+ * You can also use the type to define the plugin config in your code:
1400
+ *
1401
+ * const livesessionPlugin: PluginConfig<"livesession", [string, { keystrokes: boolean }]> = [
1402
+ * "livesession",
1403
+ * "accountID.websiteID",
1404
+ * {
1405
+ * keystrokes: true
1406
+ * }
1407
+ * ]
1408
+ */
1409
+ type Plugins = (string | PluginConfig)[];
1410
+ type PluginConfig<PluginName extends string = string, PluginArgs extends unknown[] = unknown[]> = [PluginName, ...PluginArgs];
1411
+ /**
1412
+ * Redirects configuration
1413
+ */
1414
+ interface Redirects {
1415
+ /** Source path to redirect from */
1416
+ source: string;
1417
+ /** Destination path to redirect to */
1418
+ destination: string;
1419
+ }
1420
+ /**
1421
+ * SEO configuration
1422
+ */
1423
+ interface SEO {
1424
+ /**
1425
+ * Domain name
1426
+ */
1427
+ domain?: string;
1428
+ /**
1429
+ * Meta tags
1430
+ */
1431
+ metatags?: {
1432
+ [tag: string]: string;
1433
+ };
1434
+ }
1435
+ /**
1436
+ * Engine configuration
1437
+ */
1438
+ interface Engine {
1439
+ /**
1440
+ * Path aliases for imports. Avoid long relative paths by creating shortcuts.
1441
+ *
1442
+ * @example
1443
+ * ```json
1444
+ * {
1445
+ * "paths": {
1446
+ * "@my-package/*": ["../my-package/src/*"],
1447
+ * "@livesession-go/*": ["https://github.com/livesession/livesession-go/*"]
1448
+ * }
1449
+ * }
1450
+ * ```
1451
+ *
1452
+ * Usage:
1453
+ * ```typescript
1454
+ * // Instead of
1455
+ * @importCode("../../../my-package/src/components/Badge.tsx")
1456
+ *
1457
+ * // Use
1458
+ * @importCode("@my-package/src/components/Badge.tsx")
1459
+ * ```
1460
+ */
1461
+ paths?: EnginePaths;
1462
+ /**
1463
+ *
1464
+ * Uniform configuration
1465
+ *
1466
+ */
1467
+ uniform?: EngineUniform;
1468
+ }
1469
+ type EnginePaths = {
1470
+ [key: string]: string[];
1471
+ };
1472
+ type EngineUniform = {
1473
+ /**
1474
+ * If `true` then virtual pages will not created and generated content will be stored on disk
1475
+ */
1476
+ store?: boolean;
1477
+ };
1478
+ /**
1479
+ * JSON representation of a component.
1480
+ */
1481
+ interface JSONComponent {
1482
+ /**
1483
+ * The component type, e.g. "Button", "Card", etc.
1484
+ */
1485
+ component: string;
1486
+ /**
1487
+ * The component's children, which can be a string, an array of strings, or an array of JSONComponent objects.
1488
+ */
1489
+ props?: Record<string, any>;
1490
+ }
1491
+ /**
1492
+ * A type that can be used to represent a component-like structure.
1493
+ */
1494
+ type ComponentLike = React.JSX.Element | JSONComponent | string;
1495
+ interface ThemeColors {
1496
+ colorScheme: string;
1497
+ foreground: string;
1498
+ background: string;
1499
+ lighter: {
1500
+ inlineBackground: string;
1501
+ };
1502
+ editor: {
1503
+ background: string;
1504
+ foreground: string;
1505
+ lineHighlightBackground: string;
1506
+ rangeHighlightBackground: string;
1507
+ infoForeground: string;
1508
+ selectionBackground: string;
1509
+ };
1510
+ focusBorder: string;
1511
+ tab: {
1512
+ activeBackground: string;
1513
+ activeForeground: string;
1514
+ inactiveBackground: string;
1515
+ inactiveForeground: string;
1516
+ border: string;
1517
+ activeBorder: string;
1518
+ activeBorderTop: string;
1519
+ };
1520
+ editorGroup: {
1521
+ border: string;
1522
+ };
1523
+ editorGroupHeader: {
1524
+ tabsBackground: string;
1525
+ };
1526
+ editorLineNumber: {
1527
+ foreground: string;
1528
+ };
1529
+ input: {
1530
+ background: string;
1531
+ foreground: string;
1532
+ border: string;
1533
+ };
1534
+ icon: {
1535
+ foreground: string;
1536
+ };
1537
+ sideBar: {
1538
+ background: string;
1539
+ foreground: string;
1540
+ border: string;
1541
+ };
1542
+ list: {
1543
+ activeSelectionBackground: string;
1544
+ activeSelectionForeground: string;
1545
+ hoverBackground: string;
1546
+ hoverForeground: string;
1547
+ };
1548
+ }
1549
+ interface UserPreferences {
1550
+ themeColors?: ThemeColors;
1551
+ }
1552
+
1553
+ export type { API, APIAuth, APIFile, APIFileAdvanced, APIFileMap, APIInfo, APIInfoRequest, AnchorHeader, Anchors, Appearance, AppearanceBanner, AppearanceButtons, AppearanceContent, AppearanceFooter, AppearanceHeader, AppearanceLogo, AppearanceSearch, AppearanceSidebar, AppearanceTables, AppearanceTabs, AppsDirectory, Coder, Colors, ComponentLike, Components, Engine, EnginePaths, EngineUniform, Font, HeadConfig, IconLibrary, Icons, IntegrationABTesting, IntegrationABTestingGrowthBook, IntegrationABTestingLaunchDarkly, IntegrationABTestingProviders, IntegrationAnalytics, IntegrationAnalyticsLiveSession, IntegrationAppGithubStar, IntegrationAppSupademo, IntegrationSearch, IntegrationSupport, IntegrationSupportChatwoot, IntegrationSupportIntercom, IntegrationSupportLivechat, Integrations, JSONComponent, Logo, MetaTags, Metadata, MetadataMap, Navigation, NavigationItem, NavigationItemButton, NavigationItemSocial, PageLayout, PageMetaUniform, PageMetaUniformDetails, PageURL, PluginConfig, Plugins, Redirects, SEO, Script, SearchType, Segment, Settings, Sidebar, SidebarDropdown, SidebarNavigation, SidebarRoute, Social, Tabs, Theme, ThemeColors, ThemeFont, ThemePresetName, TocCard, UserPreferences, VirtualPage, WebEditor, WebEditorBanner, WebEditorFooter, WebEditorFooterLink, WebEditorFooterLinkItem, WebEditorFooterLinks, WebEditorHeader, WebEditorNavigationItem, WebEditorSubHeader, Writer };