@fullstackdatasolutions/articles 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/CHANGELOG.md +237 -0
  2. package/README.md +199 -29
  3. package/dist/index.cjs +635 -274
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/index.d.cts +160 -56
  6. package/dist/index.d.ts +160 -56
  7. package/dist/index.js +614 -250
  8. package/dist/index.js.map +1 -1
  9. package/dist/nextjs.cjs +40 -5
  10. package/dist/nextjs.cjs.map +1 -1
  11. package/dist/nextjs.d.cts +67 -0
  12. package/dist/nextjs.d.ts +67 -0
  13. package/dist/nextjs.js +40 -5
  14. package/dist/nextjs.js.map +1 -1
  15. package/dist/server.cjs +278 -15
  16. package/dist/server.cjs.map +1 -1
  17. package/dist/server.d.cts +87 -3
  18. package/dist/server.d.ts +87 -3
  19. package/dist/server.js +267 -15
  20. package/dist/server.js.map +1 -1
  21. package/package.json +8 -5
  22. package/src/ArticleDetailHero.tsx +27 -2
  23. package/src/ArticleSchemas.tsx +27 -27
  24. package/src/AuthorArticlesPage.tsx +60 -0
  25. package/src/AuthorCard.tsx +112 -0
  26. package/src/AuthorDetailHero.tsx +56 -0
  27. package/src/Breadcrumb.tsx +78 -0
  28. package/src/CategoryArticlesPage.tsx +62 -11
  29. package/src/__tests__/ArticleDetailHero.test.tsx +21 -1
  30. package/src/__tests__/ArticleSchemas.test.tsx +47 -2
  31. package/src/__tests__/AuthorArticlesPage.test.tsx +74 -0
  32. package/src/__tests__/AuthorCard.test.tsx +98 -0
  33. package/src/__tests__/AuthorDetailHero.test.tsx +51 -0
  34. package/src/__tests__/CategoryArticlesPage.test.tsx +31 -5
  35. package/src/__tests__/authorUtils.test.ts +89 -0
  36. package/src/__tests__/renderMdx.test.tsx +35 -0
  37. package/src/__tests__/seoUtils-authors.test.ts +160 -0
  38. package/src/__tests__/seoUtils.test.ts +4 -0
  39. package/src/__tests__/server-articles.test.ts +159 -2
  40. package/src/articleTypes.ts +33 -0
  41. package/src/articlesConfig.ts +62 -0
  42. package/src/authorUtils.ts +95 -0
  43. package/src/index.ts +31 -9
  44. package/src/renderMdx.tsx +3 -1
  45. package/src/seoUtils.ts +226 -7
  46. package/src/server-articles.ts +98 -10
  47. package/src/server.ts +19 -1
package/dist/index.d.cts CHANGED
@@ -1,5 +1,80 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
 
3
+ interface TocItem {
4
+ id: string;
5
+ depth: number;
6
+ text: string;
7
+ }
8
+ interface FaqItem {
9
+ question: string;
10
+ answer: string;
11
+ }
12
+ interface HowToStep {
13
+ name: string;
14
+ text: string;
15
+ }
16
+ interface Article {
17
+ slug: string;
18
+ title: string;
19
+ excerpt: string;
20
+ date?: string;
21
+ lastmod?: string;
22
+ author: string;
23
+ authors?: string[];
24
+ category: string;
25
+ categories: string[];
26
+ readTime: string;
27
+ featuredImage: string;
28
+ tags?: string[];
29
+ content?: string;
30
+ htmlContent?: string;
31
+ mdxSource?: string;
32
+ contentType?: 'md' | 'mdx';
33
+ draft?: boolean;
34
+ toc?: TocItem[];
35
+ faq?: FaqItem[];
36
+ howTo?: HowToStep[];
37
+ canonicalUrl?: string;
38
+ articleType?: string;
39
+ series?: string;
40
+ aiCrawl?: boolean;
41
+ }
42
+ interface CategoryInfo {
43
+ name: string;
44
+ slug: string;
45
+ count: number;
46
+ featuredImage: string;
47
+ }
48
+ interface AuthorSocial {
49
+ website?: string;
50
+ facebook?: string;
51
+ twitter?: string;
52
+ x?: string;
53
+ linkedin?: string;
54
+ instagram?: string;
55
+ youtube?: string;
56
+ tiktok?: string;
57
+ github?: string;
58
+ bluesky?: string;
59
+ threads?: string;
60
+ mastodon?: string;
61
+ medium?: string;
62
+ newsletter?: string;
63
+ other?: Record<string, string>;
64
+ }
65
+ interface AuthorProfile {
66
+ name: string;
67
+ slug: string;
68
+ bio: string;
69
+ avatar?: string;
70
+ url?: string;
71
+ social?: AuthorSocial;
72
+ }
73
+ interface BreadcrumbItem {
74
+ name: string;
75
+ url?: string;
76
+ }
77
+
3
78
  /** Keys for each renderable section of the articles listing page. */
4
79
  type ArticlesSection = 'hero' | 'search' | 'featured' | 'latest' | 'categories' | 'newsletter';
5
80
  /**
@@ -60,6 +135,39 @@ interface HeroConfig {
60
135
  }
61
136
  /** Controls how article body links set target/rel attributes. */
62
137
  type LinkTargetStrategy = 'external-new-tab' | 'all-new-tab' | 'same-tab';
138
+ type ArticleBreadcrumbToken = 'home' | 'articles' | 'primaryCategory' | 'folderPath' | 'articleTitle';
139
+ type CategoryBreadcrumbToken = 'home' | 'articles' | 'category';
140
+ type AuthorBreadcrumbToken = 'home' | 'articles' | 'authors' | 'authorName';
141
+ interface CustomBreadcrumbItem {
142
+ /** Label displayed in the breadcrumb trail. */
143
+ name: string;
144
+ /** Custom URL. Relative paths are resolved against `siteUrl` by server builders. */
145
+ url: string;
146
+ }
147
+ type ArticleBreadcrumbEntry = ArticleBreadcrumbToken | CustomBreadcrumbItem;
148
+ type CategoryBreadcrumbEntry = CategoryBreadcrumbToken | CustomBreadcrumbItem;
149
+ type AuthorBreadcrumbEntry = AuthorBreadcrumbToken | CustomBreadcrumbItem;
150
+ interface BreadcrumbLabels {
151
+ home?: string;
152
+ articles?: string;
153
+ authors?: string;
154
+ }
155
+ interface BreadcrumbsConfig {
156
+ /** Set to false to hide visible breadcrumbs and breadcrumb JSON-LD generated by the helper builders. */
157
+ show?: boolean;
158
+ /** Separator used by the visible Breadcrumb component. Default: '>'. */
159
+ separator?: string;
160
+ /** Set to false to render visible breadcrumbs without JSON-LD. Default: true. */
161
+ showSchema?: boolean;
162
+ /** Article breadcrumb trail. Example: ['primaryCategory', { name: 'Guides', url: '/guides' }, 'articleTitle']. */
163
+ article?: ArticleBreadcrumbEntry[];
164
+ /** Category breadcrumb trail. Default: ['home', 'articles', 'category']. */
165
+ category?: CategoryBreadcrumbEntry[];
166
+ /** Author breadcrumb trail. Default: ['home', 'articles', 'authors', 'authorName']. */
167
+ author?: AuthorBreadcrumbEntry[];
168
+ /** Optional label overrides for built-in breadcrumb items. */
169
+ labels?: BreadcrumbLabels;
170
+ }
63
171
  /** Top-level configuration object. Pass one instance to every library component. */
64
172
  interface ArticlesConfig {
65
173
  /** Canonical base URL of the site, used in metadata and JSON-LD. Example: `'https://yoursite.com'` */
@@ -95,62 +203,27 @@ interface ArticlesConfig {
95
203
  showBackToArticles?: boolean;
96
204
  /** Set to false to hide author names from UI and metadata. Default: true. */
97
205
  showAuthor?: boolean;
206
+ /** Author profiles keyed by slug. Omit to keep plain string author display. */
207
+ authors?: Record<string, AuthorProfile>;
208
+ /** Author slug used when article frontmatter omits author fields. */
209
+ defaultAuthor?: string;
210
+ /** Set to false to disable copied author page routes in consuming apps. Default: true. */
211
+ showAuthorPage?: boolean;
212
+ /** Set to false to disable breadcrumbs, or pass a config object to customize breadcrumb trails. */
213
+ breadcrumbs?: false | BreadcrumbsConfig;
98
214
  /** Article body link target behavior. Default: `'external-new-tab'`. */
99
215
  linkTargetStrategy?: LinkTargetStrategy;
100
216
  }
101
217
  declare const DEFAULT_PAGE_SIZE = 6;
102
218
  declare const DEFAULT_CATEGORIES_PAGE_SIZE = 8;
103
219
  declare const DEFAULT_LAYOUT: ArticlesSection[];
220
+ declare function breadcrumbsAreEnabled(config: ArticlesConfig): boolean;
221
+ declare function getBreadcrumbsConfig(config: ArticlesConfig): BreadcrumbsConfig;
104
222
 
105
223
  declare function ArticlesPage({ config }: Readonly<{
106
224
  config: ArticlesConfig;
107
225
  }>): react_jsx_runtime.JSX.Element;
108
226
 
109
- interface TocItem {
110
- id: string;
111
- depth: number;
112
- text: string;
113
- }
114
- interface FaqItem {
115
- question: string;
116
- answer: string;
117
- }
118
- interface HowToStep {
119
- name: string;
120
- text: string;
121
- }
122
- interface Article {
123
- slug: string;
124
- title: string;
125
- excerpt: string;
126
- date?: string;
127
- lastmod?: string;
128
- author: string;
129
- category: string;
130
- categories: string[];
131
- readTime: string;
132
- featuredImage: string;
133
- tags?: string[];
134
- content?: string;
135
- htmlContent?: string;
136
- mdxSource?: string;
137
- contentType?: 'md' | 'mdx';
138
- draft?: boolean;
139
- toc?: TocItem[];
140
- faq?: FaqItem[];
141
- howTo?: HowToStep[];
142
- canonicalUrl?: string;
143
- articleType?: string;
144
- series?: string;
145
- aiCrawl?: boolean;
146
- }
147
- interface CategoryInfo {
148
- name: string;
149
- slug: string;
150
- count: number;
151
- featuredImage: string;
152
- }
153
-
154
227
  type ArticleCardProps = Readonly<{
155
228
  article: Article;
156
229
  }>;
@@ -173,8 +246,9 @@ type ArticleDetailHeroProps = Readonly<{
173
246
  categoryBasePath?: string;
174
247
  showDate?: boolean;
175
248
  showAuthor?: boolean;
249
+ authors?: AuthorProfile[];
176
250
  }>;
177
- declare function ArticleDetailHero({ article, categoryBasePath, showDate, showAuthor, }: ArticleDetailHeroProps): react_jsx_runtime.JSX.Element;
251
+ declare function ArticleDetailHero({ article, categoryBasePath, showDate, showAuthor, authors, }: ArticleDetailHeroProps): react_jsx_runtime.JSX.Element;
178
252
 
179
253
  type ArticleSearchBarProps = Readonly<{
180
254
  value: string;
@@ -211,28 +285,58 @@ type CategoryArticlesPageProps = Readonly<{
211
285
  }>;
212
286
  declare function CategoryArticlesPage({ category, articles, config }: CategoryArticlesPageProps): react_jsx_runtime.JSX.Element | null;
213
287
 
288
+ type AuthorArticlesPageProps = Readonly<{
289
+ author: AuthorProfile;
290
+ articles: Article[];
291
+ config: ArticlesConfig;
292
+ }>;
293
+ declare function AuthorArticlesPage({ author, articles, config }: AuthorArticlesPageProps): react_jsx_runtime.JSX.Element;
294
+
295
+ type AuthorCardProps = Readonly<{
296
+ author: AuthorProfile;
297
+ linkToPage?: boolean;
298
+ showBio?: boolean;
299
+ showSocial?: boolean;
300
+ }>;
301
+ declare function AuthorCard({ author, linkToPage, showBio, showSocial, }: AuthorCardProps): react_jsx_runtime.JSX.Element;
302
+ declare function AuthorSocialLinks({ author }: Readonly<{
303
+ author: AuthorProfile;
304
+ }>): react_jsx_runtime.JSX.Element | null;
305
+
306
+ type AuthorDetailHeroProps = Readonly<{
307
+ author: AuthorProfile;
308
+ articleCount?: number;
309
+ }>;
310
+ declare function AuthorDetailHero({ author, articleCount }: AuthorDetailHeroProps): react_jsx_runtime.JSX.Element;
311
+
312
+ type BreadcrumbProps = Readonly<{
313
+ items: BreadcrumbItem[];
314
+ className?: string;
315
+ showSchema?: boolean;
316
+ separator?: string;
317
+ }>;
318
+ declare function Breadcrumb({ items, className, showSchema, separator, }: BreadcrumbProps): react_jsx_runtime.JSX.Element | null;
319
+ declare function BreadcrumbSchema({ items }: Readonly<{
320
+ items: BreadcrumbItem[];
321
+ }>): react_jsx_runtime.JSX.Element;
322
+
214
323
  type ArticleSchemaProps = Readonly<{
215
324
  article: Article;
216
325
  articleUrl: string;
217
326
  siteName: string;
218
327
  showAuthor?: boolean;
328
+ authors?: AuthorProfile[];
219
329
  }>;
220
- declare function ArticleSchema({ article, articleUrl, siteName, showAuthor, }: ArticleSchemaProps): react_jsx_runtime.JSX.Element;
221
- type BreadcrumbSchemaProps = Readonly<{
222
- items: ReadonlyArray<{
223
- name: string;
224
- url: string;
225
- }>;
226
- }>;
227
- declare function BreadcrumbSchema({ items }: BreadcrumbSchemaProps): react_jsx_runtime.JSX.Element;
330
+ declare function ArticleSchema({ article, articleUrl, siteName, showAuthor, authors, }: ArticleSchemaProps): react_jsx_runtime.JSX.Element;
228
331
  type ArticleSEOProps = Readonly<{
229
332
  article: Article;
230
333
  articleUrl: string;
231
334
  siteName: string;
232
335
  siteLogo?: string;
233
336
  showAuthor?: boolean;
337
+ authors?: AuthorProfile[];
234
338
  }>;
235
- declare function ArticleSEO({ article, articleUrl, siteName, siteLogo, showAuthor, }: ArticleSEOProps): react_jsx_runtime.JSX.Element;
339
+ declare function ArticleSEO({ article, articleUrl, siteName, siteLogo, showAuthor, authors, }: ArticleSEOProps): react_jsx_runtime.JSX.Element;
236
340
  type FAQPageSchemaProps = Readonly<{
237
341
  items: ReadonlyArray<{
238
342
  question: string;
@@ -340,4 +444,4 @@ interface UseArticlesReturn {
340
444
  }
341
445
  declare function useArticles(): UseArticlesReturn;
342
446
 
343
- export { type Article, ArticleBackLink, ArticleCard, ArticleCategoryGrid, type ArticleComment, type ArticleCommentWithReplies, ArticleDetailHero, ArticleNavigation, ArticleSEO, ArticleSchema, ArticleSearchBar, ArticleSocialShare, ArticleTOC, type ArticlesConfig, ArticlesHero, ArticlesPage, type ArticlesSection, type ArticlesTheme, BreadcrumbSchema, CategoryArticlesPage, type CategoryDescription, type CategoryInfo, CollectionPageSchema, CommentForm, CommentItem, CommentThread, type CommentsConfig, CommentsSection, DEFAULT_CATEGORIES_PAGE_SIZE, DEFAULT_LAYOUT, DEFAULT_PAGE_SIZE, FAQPageSchema, type FaqItem, FeaturedArticle, type HowToStep, LatestArticles, LatestArticlesSection, type LinkTargetStrategy, ScrollToTop, type TocItem, type UseArticlesReturn, useArticles };
447
+ export { type Article, ArticleBackLink, type ArticleBreadcrumbEntry, type ArticleBreadcrumbToken, ArticleCard, ArticleCategoryGrid, type ArticleComment, type ArticleCommentWithReplies, ArticleDetailHero, ArticleNavigation, ArticleSEO, ArticleSchema, ArticleSearchBar, ArticleSocialShare, ArticleTOC, type ArticlesConfig, ArticlesHero, ArticlesPage, type ArticlesSection, type ArticlesTheme, AuthorArticlesPage, type AuthorBreadcrumbEntry, type AuthorBreadcrumbToken, AuthorCard, AuthorDetailHero, type AuthorProfile, type AuthorSocial, AuthorSocialLinks, Breadcrumb, type BreadcrumbItem, type BreadcrumbLabels, BreadcrumbSchema, type BreadcrumbsConfig, CategoryArticlesPage, type CategoryBreadcrumbEntry, type CategoryBreadcrumbToken, type CategoryDescription, type CategoryInfo, CollectionPageSchema, CommentForm, CommentItem, CommentThread, type CommentsConfig, CommentsSection, type CustomBreadcrumbItem, DEFAULT_CATEGORIES_PAGE_SIZE, DEFAULT_LAYOUT, DEFAULT_PAGE_SIZE, FAQPageSchema, type FaqItem, FeaturedArticle, type HowToStep, LatestArticles, LatestArticlesSection, type LinkTargetStrategy, ScrollToTop, type TocItem, type UseArticlesReturn, breadcrumbsAreEnabled, getBreadcrumbsConfig, useArticles };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,80 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
 
3
+ interface TocItem {
4
+ id: string;
5
+ depth: number;
6
+ text: string;
7
+ }
8
+ interface FaqItem {
9
+ question: string;
10
+ answer: string;
11
+ }
12
+ interface HowToStep {
13
+ name: string;
14
+ text: string;
15
+ }
16
+ interface Article {
17
+ slug: string;
18
+ title: string;
19
+ excerpt: string;
20
+ date?: string;
21
+ lastmod?: string;
22
+ author: string;
23
+ authors?: string[];
24
+ category: string;
25
+ categories: string[];
26
+ readTime: string;
27
+ featuredImage: string;
28
+ tags?: string[];
29
+ content?: string;
30
+ htmlContent?: string;
31
+ mdxSource?: string;
32
+ contentType?: 'md' | 'mdx';
33
+ draft?: boolean;
34
+ toc?: TocItem[];
35
+ faq?: FaqItem[];
36
+ howTo?: HowToStep[];
37
+ canonicalUrl?: string;
38
+ articleType?: string;
39
+ series?: string;
40
+ aiCrawl?: boolean;
41
+ }
42
+ interface CategoryInfo {
43
+ name: string;
44
+ slug: string;
45
+ count: number;
46
+ featuredImage: string;
47
+ }
48
+ interface AuthorSocial {
49
+ website?: string;
50
+ facebook?: string;
51
+ twitter?: string;
52
+ x?: string;
53
+ linkedin?: string;
54
+ instagram?: string;
55
+ youtube?: string;
56
+ tiktok?: string;
57
+ github?: string;
58
+ bluesky?: string;
59
+ threads?: string;
60
+ mastodon?: string;
61
+ medium?: string;
62
+ newsletter?: string;
63
+ other?: Record<string, string>;
64
+ }
65
+ interface AuthorProfile {
66
+ name: string;
67
+ slug: string;
68
+ bio: string;
69
+ avatar?: string;
70
+ url?: string;
71
+ social?: AuthorSocial;
72
+ }
73
+ interface BreadcrumbItem {
74
+ name: string;
75
+ url?: string;
76
+ }
77
+
3
78
  /** Keys for each renderable section of the articles listing page. */
4
79
  type ArticlesSection = 'hero' | 'search' | 'featured' | 'latest' | 'categories' | 'newsletter';
5
80
  /**
@@ -60,6 +135,39 @@ interface HeroConfig {
60
135
  }
61
136
  /** Controls how article body links set target/rel attributes. */
62
137
  type LinkTargetStrategy = 'external-new-tab' | 'all-new-tab' | 'same-tab';
138
+ type ArticleBreadcrumbToken = 'home' | 'articles' | 'primaryCategory' | 'folderPath' | 'articleTitle';
139
+ type CategoryBreadcrumbToken = 'home' | 'articles' | 'category';
140
+ type AuthorBreadcrumbToken = 'home' | 'articles' | 'authors' | 'authorName';
141
+ interface CustomBreadcrumbItem {
142
+ /** Label displayed in the breadcrumb trail. */
143
+ name: string;
144
+ /** Custom URL. Relative paths are resolved against `siteUrl` by server builders. */
145
+ url: string;
146
+ }
147
+ type ArticleBreadcrumbEntry = ArticleBreadcrumbToken | CustomBreadcrumbItem;
148
+ type CategoryBreadcrumbEntry = CategoryBreadcrumbToken | CustomBreadcrumbItem;
149
+ type AuthorBreadcrumbEntry = AuthorBreadcrumbToken | CustomBreadcrumbItem;
150
+ interface BreadcrumbLabels {
151
+ home?: string;
152
+ articles?: string;
153
+ authors?: string;
154
+ }
155
+ interface BreadcrumbsConfig {
156
+ /** Set to false to hide visible breadcrumbs and breadcrumb JSON-LD generated by the helper builders. */
157
+ show?: boolean;
158
+ /** Separator used by the visible Breadcrumb component. Default: '>'. */
159
+ separator?: string;
160
+ /** Set to false to render visible breadcrumbs without JSON-LD. Default: true. */
161
+ showSchema?: boolean;
162
+ /** Article breadcrumb trail. Example: ['primaryCategory', { name: 'Guides', url: '/guides' }, 'articleTitle']. */
163
+ article?: ArticleBreadcrumbEntry[];
164
+ /** Category breadcrumb trail. Default: ['home', 'articles', 'category']. */
165
+ category?: CategoryBreadcrumbEntry[];
166
+ /** Author breadcrumb trail. Default: ['home', 'articles', 'authors', 'authorName']. */
167
+ author?: AuthorBreadcrumbEntry[];
168
+ /** Optional label overrides for built-in breadcrumb items. */
169
+ labels?: BreadcrumbLabels;
170
+ }
63
171
  /** Top-level configuration object. Pass one instance to every library component. */
64
172
  interface ArticlesConfig {
65
173
  /** Canonical base URL of the site, used in metadata and JSON-LD. Example: `'https://yoursite.com'` */
@@ -95,62 +203,27 @@ interface ArticlesConfig {
95
203
  showBackToArticles?: boolean;
96
204
  /** Set to false to hide author names from UI and metadata. Default: true. */
97
205
  showAuthor?: boolean;
206
+ /** Author profiles keyed by slug. Omit to keep plain string author display. */
207
+ authors?: Record<string, AuthorProfile>;
208
+ /** Author slug used when article frontmatter omits author fields. */
209
+ defaultAuthor?: string;
210
+ /** Set to false to disable copied author page routes in consuming apps. Default: true. */
211
+ showAuthorPage?: boolean;
212
+ /** Set to false to disable breadcrumbs, or pass a config object to customize breadcrumb trails. */
213
+ breadcrumbs?: false | BreadcrumbsConfig;
98
214
  /** Article body link target behavior. Default: `'external-new-tab'`. */
99
215
  linkTargetStrategy?: LinkTargetStrategy;
100
216
  }
101
217
  declare const DEFAULT_PAGE_SIZE = 6;
102
218
  declare const DEFAULT_CATEGORIES_PAGE_SIZE = 8;
103
219
  declare const DEFAULT_LAYOUT: ArticlesSection[];
220
+ declare function breadcrumbsAreEnabled(config: ArticlesConfig): boolean;
221
+ declare function getBreadcrumbsConfig(config: ArticlesConfig): BreadcrumbsConfig;
104
222
 
105
223
  declare function ArticlesPage({ config }: Readonly<{
106
224
  config: ArticlesConfig;
107
225
  }>): react_jsx_runtime.JSX.Element;
108
226
 
109
- interface TocItem {
110
- id: string;
111
- depth: number;
112
- text: string;
113
- }
114
- interface FaqItem {
115
- question: string;
116
- answer: string;
117
- }
118
- interface HowToStep {
119
- name: string;
120
- text: string;
121
- }
122
- interface Article {
123
- slug: string;
124
- title: string;
125
- excerpt: string;
126
- date?: string;
127
- lastmod?: string;
128
- author: string;
129
- category: string;
130
- categories: string[];
131
- readTime: string;
132
- featuredImage: string;
133
- tags?: string[];
134
- content?: string;
135
- htmlContent?: string;
136
- mdxSource?: string;
137
- contentType?: 'md' | 'mdx';
138
- draft?: boolean;
139
- toc?: TocItem[];
140
- faq?: FaqItem[];
141
- howTo?: HowToStep[];
142
- canonicalUrl?: string;
143
- articleType?: string;
144
- series?: string;
145
- aiCrawl?: boolean;
146
- }
147
- interface CategoryInfo {
148
- name: string;
149
- slug: string;
150
- count: number;
151
- featuredImage: string;
152
- }
153
-
154
227
  type ArticleCardProps = Readonly<{
155
228
  article: Article;
156
229
  }>;
@@ -173,8 +246,9 @@ type ArticleDetailHeroProps = Readonly<{
173
246
  categoryBasePath?: string;
174
247
  showDate?: boolean;
175
248
  showAuthor?: boolean;
249
+ authors?: AuthorProfile[];
176
250
  }>;
177
- declare function ArticleDetailHero({ article, categoryBasePath, showDate, showAuthor, }: ArticleDetailHeroProps): react_jsx_runtime.JSX.Element;
251
+ declare function ArticleDetailHero({ article, categoryBasePath, showDate, showAuthor, authors, }: ArticleDetailHeroProps): react_jsx_runtime.JSX.Element;
178
252
 
179
253
  type ArticleSearchBarProps = Readonly<{
180
254
  value: string;
@@ -211,28 +285,58 @@ type CategoryArticlesPageProps = Readonly<{
211
285
  }>;
212
286
  declare function CategoryArticlesPage({ category, articles, config }: CategoryArticlesPageProps): react_jsx_runtime.JSX.Element | null;
213
287
 
288
+ type AuthorArticlesPageProps = Readonly<{
289
+ author: AuthorProfile;
290
+ articles: Article[];
291
+ config: ArticlesConfig;
292
+ }>;
293
+ declare function AuthorArticlesPage({ author, articles, config }: AuthorArticlesPageProps): react_jsx_runtime.JSX.Element;
294
+
295
+ type AuthorCardProps = Readonly<{
296
+ author: AuthorProfile;
297
+ linkToPage?: boolean;
298
+ showBio?: boolean;
299
+ showSocial?: boolean;
300
+ }>;
301
+ declare function AuthorCard({ author, linkToPage, showBio, showSocial, }: AuthorCardProps): react_jsx_runtime.JSX.Element;
302
+ declare function AuthorSocialLinks({ author }: Readonly<{
303
+ author: AuthorProfile;
304
+ }>): react_jsx_runtime.JSX.Element | null;
305
+
306
+ type AuthorDetailHeroProps = Readonly<{
307
+ author: AuthorProfile;
308
+ articleCount?: number;
309
+ }>;
310
+ declare function AuthorDetailHero({ author, articleCount }: AuthorDetailHeroProps): react_jsx_runtime.JSX.Element;
311
+
312
+ type BreadcrumbProps = Readonly<{
313
+ items: BreadcrumbItem[];
314
+ className?: string;
315
+ showSchema?: boolean;
316
+ separator?: string;
317
+ }>;
318
+ declare function Breadcrumb({ items, className, showSchema, separator, }: BreadcrumbProps): react_jsx_runtime.JSX.Element | null;
319
+ declare function BreadcrumbSchema({ items }: Readonly<{
320
+ items: BreadcrumbItem[];
321
+ }>): react_jsx_runtime.JSX.Element;
322
+
214
323
  type ArticleSchemaProps = Readonly<{
215
324
  article: Article;
216
325
  articleUrl: string;
217
326
  siteName: string;
218
327
  showAuthor?: boolean;
328
+ authors?: AuthorProfile[];
219
329
  }>;
220
- declare function ArticleSchema({ article, articleUrl, siteName, showAuthor, }: ArticleSchemaProps): react_jsx_runtime.JSX.Element;
221
- type BreadcrumbSchemaProps = Readonly<{
222
- items: ReadonlyArray<{
223
- name: string;
224
- url: string;
225
- }>;
226
- }>;
227
- declare function BreadcrumbSchema({ items }: BreadcrumbSchemaProps): react_jsx_runtime.JSX.Element;
330
+ declare function ArticleSchema({ article, articleUrl, siteName, showAuthor, authors, }: ArticleSchemaProps): react_jsx_runtime.JSX.Element;
228
331
  type ArticleSEOProps = Readonly<{
229
332
  article: Article;
230
333
  articleUrl: string;
231
334
  siteName: string;
232
335
  siteLogo?: string;
233
336
  showAuthor?: boolean;
337
+ authors?: AuthorProfile[];
234
338
  }>;
235
- declare function ArticleSEO({ article, articleUrl, siteName, siteLogo, showAuthor, }: ArticleSEOProps): react_jsx_runtime.JSX.Element;
339
+ declare function ArticleSEO({ article, articleUrl, siteName, siteLogo, showAuthor, authors, }: ArticleSEOProps): react_jsx_runtime.JSX.Element;
236
340
  type FAQPageSchemaProps = Readonly<{
237
341
  items: ReadonlyArray<{
238
342
  question: string;
@@ -340,4 +444,4 @@ interface UseArticlesReturn {
340
444
  }
341
445
  declare function useArticles(): UseArticlesReturn;
342
446
 
343
- export { type Article, ArticleBackLink, ArticleCard, ArticleCategoryGrid, type ArticleComment, type ArticleCommentWithReplies, ArticleDetailHero, ArticleNavigation, ArticleSEO, ArticleSchema, ArticleSearchBar, ArticleSocialShare, ArticleTOC, type ArticlesConfig, ArticlesHero, ArticlesPage, type ArticlesSection, type ArticlesTheme, BreadcrumbSchema, CategoryArticlesPage, type CategoryDescription, type CategoryInfo, CollectionPageSchema, CommentForm, CommentItem, CommentThread, type CommentsConfig, CommentsSection, DEFAULT_CATEGORIES_PAGE_SIZE, DEFAULT_LAYOUT, DEFAULT_PAGE_SIZE, FAQPageSchema, type FaqItem, FeaturedArticle, type HowToStep, LatestArticles, LatestArticlesSection, type LinkTargetStrategy, ScrollToTop, type TocItem, type UseArticlesReturn, useArticles };
447
+ export { type Article, ArticleBackLink, type ArticleBreadcrumbEntry, type ArticleBreadcrumbToken, ArticleCard, ArticleCategoryGrid, type ArticleComment, type ArticleCommentWithReplies, ArticleDetailHero, ArticleNavigation, ArticleSEO, ArticleSchema, ArticleSearchBar, ArticleSocialShare, ArticleTOC, type ArticlesConfig, ArticlesHero, ArticlesPage, type ArticlesSection, type ArticlesTheme, AuthorArticlesPage, type AuthorBreadcrumbEntry, type AuthorBreadcrumbToken, AuthorCard, AuthorDetailHero, type AuthorProfile, type AuthorSocial, AuthorSocialLinks, Breadcrumb, type BreadcrumbItem, type BreadcrumbLabels, BreadcrumbSchema, type BreadcrumbsConfig, CategoryArticlesPage, type CategoryBreadcrumbEntry, type CategoryBreadcrumbToken, type CategoryDescription, type CategoryInfo, CollectionPageSchema, CommentForm, CommentItem, CommentThread, type CommentsConfig, CommentsSection, type CustomBreadcrumbItem, DEFAULT_CATEGORIES_PAGE_SIZE, DEFAULT_LAYOUT, DEFAULT_PAGE_SIZE, FAQPageSchema, type FaqItem, FeaturedArticle, type HowToStep, LatestArticles, LatestArticlesSection, type LinkTargetStrategy, ScrollToTop, type TocItem, type UseArticlesReturn, breadcrumbsAreEnabled, getBreadcrumbsConfig, useArticles };