@sonordev/site-kit 8.1.0 → 8.3.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 (194) hide show
  1. package/AGENTS.md +13 -1
  2. package/CHANGELOG.md +11 -0
  3. package/README.md +9 -5
  4. package/agent-manifest.json +47 -8
  5. package/dist/{AnalyticsProvider-UWTCE5UO.js → AnalyticsProvider-QXO33JUF.js} +6 -6
  6. package/dist/{ArticleFaqSection-3Q26DP7P.js → ArticleFaqSection-DEWE5B4Q.js} +1 -1
  7. package/dist/{ArticleViewTracker-MYD6SGNH.js → ArticleViewTracker-KN6ENIRS.js} +17 -6
  8. package/dist/{BlocksPopup-OY5G3EFH.js → BlocksPopup-3RPN6YVJ.js} +6 -6
  9. package/dist/{ChatWidget-BTR5VERC.js → ChatWidget-D2X445PO.js} +6 -6
  10. package/dist/{FileField-DEHVYXAO.js → FileField-UNGSNGJ5.js} +4 -4
  11. package/dist/{FormSpotlight-VGC4CZL4.js → FormSpotlight-JFH2ENKQ.js} +1 -1
  12. package/dist/{FormStage-CJUSCSAL.js → FormStage-RC3WHHXP.js} +1 -1
  13. package/dist/{ManagedForm-JCI2KPMO.js → ManagedForm-FOQZ2IYG.js} +7 -7
  14. package/dist/{ManagedNewsletterForm-DTE4KKXV.js → ManagedNewsletterForm-NFNF33V3.js} +16 -7
  15. package/dist/{SignalCore-LGCBQDEH.js → SignalCore-5KABGX5C.js} +4 -4
  16. package/dist/SiteChat-JQ46ZIJ4.js +6 -0
  17. package/dist/SiteDesignReporter-N7L6DR4J.js +12 -0
  18. package/dist/{SitePopups-T6YPHAVY.js → SitePopups-WZBKX5Q3.js} +6 -6
  19. package/dist/SitemapSync-GY6UADRI.js +9 -0
  20. package/dist/_client/booking-widget.js +6 -6
  21. package/dist/_client/testimonial-section.js +3 -3
  22. package/dist/affiliates/index.js +4 -4
  23. package/dist/analytics/index.js +6 -6
  24. package/dist/{article-styles-GGZOQG5X.js → article-styles-7QONZJR5.js} +3 -3
  25. package/dist/article-tables-6XHVULPU.js +2 -0
  26. package/dist/articles/Article.d.ts +2 -89
  27. package/dist/articles/ArticleFAQ.d.ts +2 -41
  28. package/dist/articles/ArticleFaqSection.d.ts +2 -2
  29. package/dist/articles/ArticleList.d.ts +2 -79
  30. package/dist/articles/ArticleViewTracker.d.ts +2 -15
  31. package/dist/articles/AuthorCard.d.ts +2 -10
  32. package/dist/articles/AuthorPage.d.ts +2 -8
  33. package/dist/articles/ClusterLandingPage.d.ts +2 -40
  34. package/dist/articles/ClusterNavigation.d.ts +2 -37
  35. package/dist/articles/ManagedNewsletterForm.d.ts +3 -12
  36. package/dist/articles/NewsletterShell.d.ts +2 -17
  37. package/dist/articles/NewsletterWidget.d.ts +2 -30
  38. package/dist/articles/PublicationLayout.d.ts +2 -67
  39. package/dist/articles/PublicationSidebar.d.ts +2 -36
  40. package/dist/articles/RelatedPosts.d.ts +2 -22
  41. package/dist/articles/ServiceCallout.d.ts +2 -56
  42. package/dist/articles/TableOfContents.d.ts +2 -6
  43. package/dist/articles/article-photos.d.ts +2 -9
  44. package/dist/articles/article-styles.d.ts +2 -21
  45. package/dist/articles/article-tables.d.ts +2 -12
  46. package/dist/articles/artwork.d.ts +2 -13
  47. package/dist/articles/author-schema.d.ts +2 -72
  48. package/dist/articles/author-social.d.ts +2 -14
  49. package/dist/articles/excerpt.d.ts +2 -17
  50. package/dist/articles/index.d.ts +2 -79
  51. package/dist/articles/index.js +16 -11
  52. package/dist/articles/news-sitemap.d.ts +2 -46
  53. package/dist/articles/processArticleHtml.d.ts +2 -34
  54. package/dist/articles/public-reads.d.ts +2 -26
  55. package/dist/articles/reading-time.d.ts +2 -9
  56. package/dist/articles/routes.d.ts +2 -52
  57. package/dist/articles/server-core.d.ts +2 -461
  58. package/dist/articles/server-ui.d.ts +2 -30
  59. package/dist/articles/server-ui.js +26 -17
  60. package/dist/articles/server.d.ts +2 -461
  61. package/dist/articles/server.js +14 -5
  62. package/dist/articles/types.d.ts +2 -315
  63. package/dist/articles/widget-styles.d.ts +2 -8
  64. package/dist/chat/index.js +8 -8
  65. package/dist/{chunk-AIDIEVPZ.js → chunk-2JMCBJM5.js} +1 -1
  66. package/dist/chunk-34ZYJTQR.js +1 -0
  67. package/dist/{chunk-ADI6IYFH.js → chunk-3OY52UFM.js} +1 -1
  68. package/dist/{chunk-WMVK77ND.js → chunk-4K735O3J.js} +1 -1
  69. package/dist/{chunk-55GHBRCN.js → chunk-4PVMUPC6.js} +2 -2
  70. package/dist/{chunk-L5UOHS6E.js → chunk-5D7ZISUP.js} +1 -1
  71. package/dist/{chunk-JT52KYHQ.js → chunk-5RYSTKVU.js} +1 -1
  72. package/dist/{chunk-6CJGZFOU.js → chunk-A4MPHIVP.js} +1 -1
  73. package/dist/chunk-B7T2SFUF.js +1 -0
  74. package/dist/{chunk-FV2VD7WM.js → chunk-BC7JMY4Z.js} +3 -3
  75. package/dist/{chunk-255NCCPB.js → chunk-BOCYBDKV.js} +1 -1
  76. package/dist/{chunk-NFRJTOTB.js → chunk-BSQP6PRA.js} +1 -1
  77. package/dist/{chunk-GKGSXUVQ.js → chunk-BVB5FBAA.js} +1 -1
  78. package/dist/{chunk-NWVB75ER.js → chunk-C2UROFGZ.js} +1 -1
  79. package/dist/{chunk-F2VYN3QL.js → chunk-C4AFNZT2.js} +1 -1
  80. package/dist/{chunk-GC2QWXJ3.js → chunk-D6ZIQMHB.js} +3 -3
  81. package/dist/{chunk-GYF2ULVO.js → chunk-DJAYFHVF.js} +1 -1
  82. package/dist/{chunk-XUCU3LX4.js → chunk-DPSNMOMZ.js} +1 -1
  83. package/dist/{chunk-A3EU6HB5.js → chunk-E3UR37RX.js} +2 -2
  84. package/dist/{chunk-Y3INC4QJ.js → chunk-E4PTMORJ.js} +1 -1
  85. package/dist/{chunk-TAO6BVA2.js → chunk-EA6FZMYA.js} +2 -2
  86. package/dist/{chunk-V56RZH7J.js → chunk-FHUTOXS7.js} +1 -1
  87. package/dist/{chunk-LLW5HKEE.js → chunk-GKJVSZ7H.js} +3 -3
  88. package/dist/chunk-H72ZFO3F.js +1 -0
  89. package/dist/{chunk-CSTC6HZO.js → chunk-HND6BDXC.js} +3 -3
  90. package/dist/chunk-IEGDPRQB.js +14 -0
  91. package/dist/{chunk-CAH4Y4PY.js → chunk-JO76F5WP.js} +1 -1
  92. package/dist/{chunk-4Z3DI2EL.js → chunk-KJVUOJMW.js} +58 -58
  93. package/dist/{chunk-SC4MZGWZ.js → chunk-LBDWAXAO.js} +1 -1
  94. package/dist/{chunk-RSBMQFZW.js → chunk-LPKKSYKX.js} +3 -3
  95. package/dist/{chunk-2UO4HPGE.js → chunk-M5SF7NCC.js} +73 -51
  96. package/dist/{chunk-S6IGQYHW.js → chunk-MQ4REMTH.js} +2 -2
  97. package/dist/{chunk-O4DETQJI.js → chunk-NA4Z4CQG.js} +1 -1
  98. package/dist/{chunk-WPOFTCKL.js → chunk-OIWFXUVD.js} +2 -2
  99. package/dist/{chunk-G2HCCWZQ.js → chunk-QBCWVT2S.js} +2 -2
  100. package/dist/{chunk-DZV3KPVF.js → chunk-QCZHYO5M.js} +1 -1
  101. package/dist/{chunk-DOMBP3FW.js → chunk-QDILCQBL.js} +9 -9
  102. package/dist/{chunk-IAYGTQJD.js → chunk-SCTVADDL.js} +2 -2
  103. package/dist/{chunk-QXMIKDOL.js → chunk-SNRE3ZVZ.js} +3 -3
  104. package/dist/{chunk-DSNCU2E3.js → chunk-TT4JZDKM.js} +3 -3
  105. package/dist/{chunk-6VHDCJIZ.js → chunk-U7Y3QG3A.js} +1 -1
  106. package/dist/{chunk-3G7YABRA.js → chunk-W7OPEMGJ.js} +4 -1
  107. package/dist/{chunk-2JEUDTL6.js → chunk-WBUG7XRL.js} +2 -2
  108. package/dist/{chunk-47VB5INH.js → chunk-WSOZ3FQN.js} +1 -1
  109. package/dist/chunk-X4IJS7LV.js +319 -0
  110. package/dist/{chunk-JIH32RH2.js → chunk-XA7Q2VQA.js} +1 -1
  111. package/dist/{chunk-5L467Z5Q.js → chunk-XLAXYPTK.js} +3 -3
  112. package/dist/client/index.js +4 -16
  113. package/dist/contracts/editorial-media.d.ts +39 -0
  114. package/dist/contracts/entries.d.ts +1 -1
  115. package/dist/fleet/index.js +6 -6
  116. package/dist/forms/index.js +9 -325
  117. package/dist/forms/server.js +2 -2
  118. package/dist/images/index.js +4 -4
  119. package/dist/index.js +1 -1
  120. package/dist/layout/client.js +9 -9
  121. package/dist/layout/index.js +10 -10
  122. package/dist/llms/index.js +8 -8
  123. package/dist/maps/index.js +4 -4
  124. package/dist/mcp/sonor.d.ts +42 -3
  125. package/dist/mcp/sonor.js +25 -20
  126. package/dist/mcp/transport.d.ts +1 -1
  127. package/dist/press-kit/articles/Article.d.ts +89 -0
  128. package/dist/press-kit/articles/ArticleFAQ.d.ts +41 -0
  129. package/dist/press-kit/articles/ArticleFaqSection.d.ts +2 -0
  130. package/dist/press-kit/articles/ArticleList.d.ts +79 -0
  131. package/dist/press-kit/articles/ArticleViewTracker.d.ts +15 -0
  132. package/dist/press-kit/articles/AuthorCard.d.ts +10 -0
  133. package/dist/press-kit/articles/AuthorPage.d.ts +8 -0
  134. package/dist/press-kit/articles/ClusterLandingPage.d.ts +40 -0
  135. package/dist/press-kit/articles/ClusterNavigation.d.ts +37 -0
  136. package/dist/press-kit/articles/ManagedNewsletterForm.d.ts +12 -0
  137. package/dist/press-kit/articles/NewsletterShell.d.ts +17 -0
  138. package/dist/press-kit/articles/NewsletterWidget.d.ts +30 -0
  139. package/dist/press-kit/articles/PublicationLayout.d.ts +67 -0
  140. package/dist/press-kit/articles/PublicationSidebar.d.ts +36 -0
  141. package/dist/press-kit/articles/RelatedPosts.d.ts +22 -0
  142. package/dist/press-kit/articles/ServiceCallout.d.ts +56 -0
  143. package/dist/press-kit/articles/TableOfContents.d.ts +6 -0
  144. package/dist/press-kit/articles/article-photos.d.ts +9 -0
  145. package/dist/press-kit/articles/article-styles.d.ts +21 -0
  146. package/dist/press-kit/articles/article-tables.d.ts +12 -0
  147. package/dist/press-kit/articles/artwork.d.ts +13 -0
  148. package/dist/press-kit/articles/author-schema.d.ts +72 -0
  149. package/dist/press-kit/articles/author-social.d.ts +14 -0
  150. package/dist/press-kit/articles/excerpt.d.ts +17 -0
  151. package/dist/press-kit/articles/index.d.ts +79 -0
  152. package/dist/press-kit/articles/news-sitemap.d.ts +46 -0
  153. package/dist/press-kit/articles/processArticleHtml.d.ts +34 -0
  154. package/dist/press-kit/articles/public-reads.d.ts +26 -0
  155. package/dist/press-kit/articles/reading-time.d.ts +9 -0
  156. package/dist/press-kit/articles/routes.d.ts +52 -0
  157. package/dist/press-kit/articles/server-core.d.ts +461 -0
  158. package/dist/press-kit/articles/server-ui.d.ts +31 -0
  159. package/dist/press-kit/articles/types.d.ts +316 -0
  160. package/dist/press-kit/articles/widget-styles.d.ts +8 -0
  161. package/dist/reputation/index.js +3 -3
  162. package/dist/reputation/server.js +2 -2
  163. package/dist/revalidate/index.js +2 -2
  164. package/dist/runtime/index.js +5 -4
  165. package/dist/seo/client.js +6 -6
  166. package/dist/seo/index.js +7 -7
  167. package/dist/seo/llms.js +8 -8
  168. package/dist/seo/register-sitemap-cli.js +1 -1
  169. package/dist/seo/sitemap.js +6 -6
  170. package/dist/server/index.js +3 -2
  171. package/dist/shared/build-entries.d.ts +2 -1
  172. package/dist/shared/clientApiConfig.d.ts +2 -0
  173. package/dist/shared/import-specifiers.d.ts +1 -1
  174. package/dist/shared/index.d.ts +6 -0
  175. package/dist/shared/index.js +8 -0
  176. package/dist/shared/version.d.ts +1 -1
  177. package/dist/signal/index.js +2 -2
  178. package/dist/sitemap/index.js +6 -6
  179. package/dist/sync/index.js +6 -6
  180. package/dist/website/images.js +4 -4
  181. package/dist/website/index.js +7 -7
  182. package/dist/website/popups.js +6 -6
  183. package/dist/{writeLLMsTxt-OS2WBSLM.js → writeLLMsTxt-VKHCM5IS.js} +5 -5
  184. package/docs/MIGRATING-TO-PRESS-KIT.md +83 -0
  185. package/docs.json +145 -29
  186. package/package.json +15 -5
  187. package/src/articles/README.md +5 -360
  188. package/src/mcp/README.md +16 -0
  189. package/src/og/README.md +1 -1
  190. package/src/runtime/README.md +4 -0
  191. package/dist/SiteChat-6SF7PVUT.js +0 -6
  192. package/dist/SiteDesignReporter-VISQZ5NQ.js +0 -12
  193. package/dist/SitemapSync-VKMVRPZL.js +0 -9
  194. package/dist/article-tables-AXSZOGNW.js +0 -2
@@ -1,315 +1,2 @@
1
- /**
2
- * @sonordev/site-kit/articles - Type definitions
3
- */
4
- import type { PublicationRoutingOptions } from './routes';
5
- /** Public, approved photo snapshot. Planning briefs and private source metadata stay in Sonor. */
6
- export interface ArticleEditorialPhoto {
7
- url: string;
8
- alt: string;
9
- caption?: string;
10
- width: number;
11
- height: number;
12
- placement: {
13
- kind: 'after_intro';
14
- } | {
15
- kind: 'after_heading';
16
- heading: string;
17
- };
18
- }
19
- export interface Article {
20
- id: string;
21
- project_id: string;
22
- /** URL slug */
23
- slug: string;
24
- /** Content */
25
- title: string;
26
- subtitle?: string;
27
- excerpt?: string;
28
- content: string;
29
- content_html?: string;
30
- /** Complete promotional image, including composed share-card text when generated. */
31
- featured_image?: string;
32
- featured_image_alt?: string;
33
- /** Article artwork, separate from the promotional card. Optional on older APIs. */
34
- editorial_image?: string;
35
- /** Empty for decorative atmosphere artwork; preserve an explicitly empty value. */
36
- editorial_image_alt?: string;
37
- /** Dedicated index frame from Sonor's atmosphere + content-stage renderer. */
38
- index_image?: string;
39
- index_image_alt?: string;
40
- /** Supporting photos placed deliberately in the article body; optional on older APIs. */
41
- editorial_photos?: ArticleEditorialPhoto[];
42
- /** Author - can be string or object depending on API response */
43
- author_id?: string;
44
- author?: ArticleAuthor | string;
45
- /** Categorization - can be string slug or object */
46
- category_id?: string;
47
- category?: ArticleCategory | string;
48
- tags?: string[] | ArticleTag[];
49
- /** SEO */
50
- meta_title?: string;
51
- meta_description?: string;
52
- og_title?: string;
53
- og_description?: string;
54
- canonical_url?: string;
55
- focus_keyphrase?: string;
56
- keywords?: string;
57
- /** Rich content */
58
- table_of_contents?: TocItem[];
59
- faq_items?: {
60
- question: string;
61
- answer: string;
62
- }[];
63
- /** E-E-A-T: when present, use as JSON-LD on the post page (Article/FAQ/Person from Signal) */
64
- schema?: object | object[];
65
- /** Raw DB column name for the same E-E-A-T JSON-LD — the public API passes
66
- * it through unmapped. generateAllArticleSchemas reads schema ?? schema_json. */
67
- schema_json?: object | object[];
68
- service_callouts?: {
69
- title: string;
70
- description?: string;
71
- url?: string;
72
- }[];
73
- /** Publishing */
74
- status: 'draft' | 'published' | 'scheduled' | 'archived';
75
- published_at?: string;
76
- /** Scheduled publish time (blog_posts.scheduled_for) */
77
- scheduled_for?: string;
78
- /** Settings */
79
- allow_comments?: boolean;
80
- featured?: boolean;
81
- /** Computed */
82
- /** Pre-mapped caller data only — the API never returns this name */
83
- reading_time_minutes?: number;
84
- /** The field the API actually returns (blog_posts.reading_time) */
85
- reading_time?: number;
86
- view_count?: number;
87
- word_count?: number;
88
- /** Timestamps */
89
- created_at: string;
90
- updated_at: string;
91
- /** Topic Cluster fields */
92
- article_type?: 'pillar' | 'support' | 'comparison' | 'faq' | 'glossary' | 'checklist' | 'case-study-adjacent';
93
- cluster_id?: string;
94
- cluster_slug?: string;
95
- cluster_name?: string;
96
- parent_pillar_id?: string;
97
- parent_pillar_slug?: string;
98
- parent_pillar_title?: string;
99
- /** The pillar's own category slug, for category-segmented article URLs */
100
- parent_pillar_category?: string;
101
- search_intent?: 'informational' | 'navigational' | 'commercial' | 'transactional';
102
- funnel_stage?: 'awareness' | 'consideration' | 'decision' | 'retention';
103
- relationship_to_pillar?: string;
104
- publish_priority?: number;
105
- canonical_role?: 'primary' | 'supporting' | 'overlap-risk';
106
- ai_summary?: string;
107
- /** Sibling articles in the same cluster (populated by API) */
108
- sibling_articles?: Array<{
109
- slug: string;
110
- title: string;
111
- article_type: string;
112
- category?: string;
113
- }>;
114
- }
115
- export interface ArticleAuthor {
116
- id: string;
117
- project_id: string;
118
- name: string;
119
- slug: string;
120
- bio?: string;
121
- avatar_url?: string;
122
- /** @deprecated Legacy shape — the API column is website_url. getAuthorSocialLinks handles both. */
123
- website?: string;
124
- /** @deprecated Legacy shape — the API columns are linkedin_url/twitter_url/etc. getAuthorSocialLinks handles both. */
125
- social_links?: {
126
- twitter?: string;
127
- linkedin?: string;
128
- github?: string;
129
- };
130
- is_active: boolean;
131
- /** E-E-A-T / Author Page fields */
132
- title?: string;
133
- company?: string;
134
- short_bio?: string;
135
- credentials?: string[];
136
- expertise_areas?: string[];
137
- years_experience?: number;
138
- linkedin_url?: string;
139
- twitter_url?: string;
140
- website_url?: string;
141
- author_page_url?: string;
142
- /**
143
- * schema.org `@id` for this person, shared by every site that describes
144
- * them (blog_authors.entity_id), e.g. `https://example.com/#person`.
145
- * Unset: the kit uses `<author page URL>#person`.
146
- */
147
- entity_id?: string | null;
148
- same_as?: string[];
149
- knows_about?: string[];
150
- is_subject_matter_expert?: boolean;
151
- has_verified_credentials?: boolean;
152
- featured_publications?: string[];
153
- awards?: string[];
154
- post_count?: number;
155
- created_at?: string;
156
- updated_at?: string;
157
- }
158
- /**
159
- * The public /categories endpoint guarantees only name/slug/post_count
160
- * (getCategories maps exactly those keys). id/project_id exist in
161
- * blog_categories but are stripped from the public response — do not
162
- * re-promote them to required.
163
- */
164
- export interface ArticleCategory {
165
- id?: string;
166
- project_id?: string;
167
- name: string;
168
- slug: string;
169
- description?: string;
170
- parent_id?: string;
171
- post_count?: number;
172
- }
173
- /**
174
- * The public /tags endpoint returns only name/slug/post_count. Tags are
175
- * synthesized from blog_posts.tags strings — no id/project_id can ever
176
- * exist, on any server version.
177
- */
178
- export interface ArticleTag {
179
- name: string;
180
- slug: string;
181
- post_count?: number;
182
- }
183
- export interface TopicCluster {
184
- id: string;
185
- cluster_name: string;
186
- cluster_slug: string;
187
- core_topic: string;
188
- primary_entity?: string;
189
- industry?: string;
190
- geo_target?: string;
191
- commercial_goal?: string;
192
- pillar_post_id?: string;
193
- target_service_page?: string;
194
- article_count: number;
195
- pillar: Article | null;
196
- supports: Article[];
197
- interlink_map: Array<{
198
- from: string;
199
- to: string;
200
- anchor: string;
201
- }>;
202
- created_at?: string;
203
- }
204
- export interface ClusterNavigation {
205
- cluster_name: string;
206
- cluster_slug: string;
207
- /** category = the article's own category slug, for category-segmented article URLs */
208
- pillar: {
209
- slug: string;
210
- title: string;
211
- category?: string;
212
- } | null;
213
- siblings: Array<{
214
- slug: string;
215
- title: string;
216
- article_type: string;
217
- category?: string;
218
- }>;
219
- is_pillar: boolean;
220
- }
221
- export interface ArticleListOptions {
222
- projectId: string;
223
- /** Pagination */
224
- page?: number;
225
- perPage?: number;
226
- /** Filters */
227
- category?: string;
228
- tag?: string;
229
- /** Author slug (preferred) or display name; slug filtering requires the current Sonor API */
230
- author?: string;
231
- search?: string;
232
- featured?: boolean;
233
- cluster?: string;
234
- /** Sorting */
235
- orderBy?: 'published_at' | 'title' | 'view_count';
236
- order?: 'asc' | 'desc';
237
- }
238
- export interface ArticleListResult {
239
- posts: Article[];
240
- pagination: {
241
- page: number;
242
- perPage: number;
243
- total: number;
244
- totalPages: number;
245
- hasNext: boolean;
246
- hasPrev: boolean;
247
- };
248
- }
249
- export interface ArticleProps {
250
- projectId: string;
251
- slug: string;
252
- children?: (props: ArticleRenderProps) => React.ReactNode;
253
- }
254
- export interface ArticleRenderProps {
255
- post: Article;
256
- content: string;
257
- relatedPosts?: Article[];
258
- tableOfContents?: TocItem[];
259
- }
260
- export interface ArticleListProps {
261
- projectId: string;
262
- options?: Omit<ArticleListOptions, 'projectId'>;
263
- children?: (props: ArticleListRenderProps) => React.ReactNode;
264
- }
265
- export interface ArticleListRenderProps {
266
- posts: Article[];
267
- pagination: ArticleListResult['pagination'];
268
- categories: ArticleCategory[];
269
- tags: ArticleTag[];
270
- }
271
- export interface AuthorCardProps {
272
- author: ArticleAuthor;
273
- showBio?: boolean;
274
- showSocial?: boolean;
275
- showTrustBlock?: boolean;
276
- className?: string;
277
- }
278
- export interface AuthorPageProps {
279
- author: ArticleAuthor;
280
- posts: Article[];
281
- basePath?: string;
282
- /**
283
- * AuthorPage is exported from the client-stamped `articles` barrel, so from
284
- * a Server Component only serializable options survive: a function
285
- * `authorPages` / `postPath` fails at render. For a custom author route,
286
- * render `generateAuthorSchema` on the server and pass `jsonLd={false}`.
287
- */
288
- routing?: PublicationRoutingOptions;
289
- /** Absolute site origin, so the ProfilePage JSON-LD carries absolute URLs and a Person @id. */
290
- siteUrl?: string;
291
- /** Fallback employer name for the Person when the author row has no company. */
292
- siteName?: string;
293
- /**
294
- * Emit the ProfilePage JSON-LD (default true). Pass false only when the
295
- * page renders generateAuthorSchema itself, so it is never emitted twice.
296
- */
297
- jsonLd?: boolean;
298
- }
299
- export interface RelatedPostsProps {
300
- projectId: string;
301
- postId: string;
302
- limit?: number;
303
- className?: string;
304
- }
305
- export interface TableOfContentsProps {
306
- content: string;
307
- maxDepth?: number;
308
- className?: string;
309
- }
310
- export interface TocItem {
311
- id: string;
312
- text: string;
313
- level: number;
314
- children?: TocItem[];
315
- }
1
+ /** @deprecated Import from @sonordev/press-kit instead. Compatibility build uses the same canonical source. */
2
+ export * from '../press-kit/articles/types';
@@ -1,8 +1,2 @@
1
- import type React from 'react';
2
- /**
3
- * Shared sidebar-widget chrome, extracted from PublicationSidebar so the client-side
4
- * NewsletterWidget (its own module — it needs hooks, and PublicationSidebar is also
5
- * bundled into the un-stamped server entry articles/server-ui) can reuse it.
6
- */
7
- export declare const widgetStyle: React.CSSProperties;
8
- export declare const widgetTitleStyle: React.CSSProperties;
1
+ /** @deprecated Import from @sonordev/press-kit instead. Compatibility build uses the same canonical source. */
2
+ export * from '../press-kit/articles/widget-styles';
@@ -1,10 +1,10 @@
1
1
  'use client';
2
- export { ChatWidget, DEFAULT_LAUNCHER_OFFSET_BOTTOM, EchoChat, chatLauncherStyles, isChatEnabled } from '../chunk-CSTC6HZO.js';
3
- export { SiteChat } from '../chunk-A3EU6HB5.js';
2
+ export { ChatWidget, DEFAULT_LAUNCHER_OFFSET_BOTTOM, EchoChat, chatLauncherStyles, isChatEnabled } from '../chunk-HND6BDXC.js';
3
+ export { SiteChat } from '../chunk-E3UR37RX.js';
4
4
  import '../chunk-6T6CQVNL.js';
5
5
  import '../chunk-JE4A5S4F.js';
6
6
  import '../chunk-27FISYK4.js';
7
- import '../chunk-S6IGQYHW.js';
7
+ import '../chunk-MQ4REMTH.js';
8
8
  import '../chunk-Q6E4OPGG.js';
9
9
  import '../chunk-5ROTTMBL.js';
10
10
  import '../chunk-C2FZBUSS.js';
@@ -15,12 +15,12 @@ import '../chunk-S22FSH7C.js';
15
15
  import '../chunk-L2V5PUFN.js';
16
16
  import '../chunk-5TM3WPCI.js';
17
17
  import '../chunk-GJWI74ZZ.js';
18
- import '../chunk-CAH4Y4PY.js';
18
+ import '../chunk-JO76F5WP.js';
19
19
  import '../chunk-EKBEOXTH.js';
20
- import '../chunk-3G7YABRA.js';
21
- import '../chunk-WPOFTCKL.js';
22
- import '../chunk-F2VYN3QL.js';
23
- import '../chunk-NWVB75ER.js';
20
+ import '../chunk-OIWFXUVD.js';
21
+ import '../chunk-C4AFNZT2.js';
22
+ import '../chunk-W7OPEMGJ.js';
23
+ import '../chunk-C2UROFGZ.js';
24
24
  import '../chunk-PKBMQBKP.js';
25
25
 
26
26
  // src/chat/echo-config.ts
@@ -1,4 +1,4 @@
1
- import { generateLLMsTxt, generateLLMsFullTxt, appendAgentAccessSection } from './chunk-GC2QWXJ3.js';
1
+ import { generateLLMsTxt, generateLLMsFullTxt, appendAgentAccessSection } from './chunk-D6ZIQMHB.js';
2
2
  import { createHash } from 'crypto';
3
3
  import { existsSync, readFileSync } from 'fs';
4
4
  import { join } from 'path';
@@ -0,0 +1 @@
1
+
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { sonorFetch } from './chunk-WPOFTCKL.js';
2
+ import { sonorFetch } from './chunk-OIWFXUVD.js';
3
3
  import { useState, useCallback, useEffect } from 'react';
4
4
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
5
5
 
@@ -1,4 +1,4 @@
1
- // src/articles/routes.ts
1
+ // packages/press-kit/src/articles/routes.ts
2
2
  var DEFAULT_PUBLICATION_PATH = "/articles";
3
3
  function articleCategorySlug(category) {
4
4
  const value = typeof category === "string" ? category : category?.slug || category?.name || "";
@@ -1,6 +1,6 @@
1
1
  'use client';
2
- import { detectTimezone, releaseSlotHold, fetchBookingTypeDetails, fetchBookingTypes, fetchAvailability, createSlotHold, createBooking, formatDuration, formatDate, formatTime, prepareMeeting } from './chunk-2JEUDTL6.js';
3
- import { readPublishedApiConfig, DEFAULT_SONOR_API_URL } from './chunk-3G7YABRA.js';
2
+ import { detectTimezone, releaseSlotHold, fetchBookingTypeDetails, fetchBookingTypes, fetchAvailability, createSlotHold, createBooking, formatDuration, formatDate, formatTime, prepareMeeting } from './chunk-WBUG7XRL.js';
3
+ import { readPublishedApiConfig, DEFAULT_SONOR_API_URL } from './chunk-W7OPEMGJ.js';
4
4
  import { useState, useRef, useMemo, useCallback, useEffect, useId } from 'react';
5
5
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
6
6
 
@@ -1,4 +1,4 @@
1
- // src/articles/processArticleHtml.ts
1
+ // packages/press-kit/src/articles/processArticleHtml.ts
2
2
  function linkClassificationHost(siteUrl) {
3
3
  try {
4
4
  const base = siteUrl.startsWith("http") ? siteUrl : `https://${siteUrl}`;
@@ -6,7 +6,7 @@ import { DEFAULT_HONEYPOT_FIELD } from './chunk-NJCTQH2P.js';
6
6
  import React, { useRef, useEffect, useState, useMemo, useCallback } from 'react';
7
7
  import { jsx, jsxs } from 'react/jsx-runtime';
8
8
 
9
- var loadInteractiveForm = () => import('./ManagedForm-JCI2KPMO.js').then((m) => m.ManagedForm);
9
+ var loadInteractiveForm = () => import('./ManagedForm-FOQZ2IYG.js').then((m) => m.ManagedForm);
10
10
  var REPLAY_WAIT_MS = 8e3;
11
11
  function FormEnhancer({
12
12
  formId,
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { reviewPhotoUrl } from './chunk-CAT235HY.js';
3
- import { fetchReviews } from './chunk-NFRJTOTB.js';
3
+ import { fetchReviews } from './chunk-BSQP6PRA.js';
4
4
  import { useState, useEffect, useCallback } from 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
6
6
 
@@ -0,0 +1 @@
1
+
@@ -1,4 +1,4 @@
1
- import { createPublicationRoutes } from './chunk-WMVK77ND.js';
1
+ import { createPublicationRoutes } from './chunk-4K735O3J.js';
2
2
  import { resolveTrailingSlash, applyTrailingSlash } from './chunk-YVKRYQRG.js';
3
3
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
4
4
 
@@ -323,7 +323,7 @@ function ClusterNavigation({
323
323
  ] });
324
324
  }
325
325
 
326
- // src/articles/author-social.ts
326
+ // packages/press-kit/src/articles/author-social.ts
327
327
  var withPrefix = (value, base) => value.startsWith("http") ? value : `${base}${value}`;
328
328
  function getAuthorSocialLinks(author) {
329
329
  const links = [];
@@ -338,7 +338,7 @@ function getAuthorSocialLinks(author) {
338
338
  return links;
339
339
  }
340
340
 
341
- // src/articles/reading-time.ts
341
+ // packages/press-kit/src/articles/reading-time.ts
342
342
  function readingTimeMinutes(post) {
343
343
  const value = post.reading_time_minutes ?? post.reading_time;
344
344
  return typeof value === "number" && value > 0 ? value : null;
@@ -1,4 +1,4 @@
1
- import { writeLLMsTxtToPublic } from './chunk-GC2QWXJ3.js';
1
+ import { writeLLMsTxtToPublic } from './chunk-D6ZIQMHB.js';
2
2
  import { getSiteConfig } from './chunk-Z22QVHT4.js';
3
3
  import { buildFetch } from './chunk-UAYAJPEP.js';
4
4
  import { findAppDirForDiscovery } from './chunk-ZEGVKVD5.js';
@@ -1,5 +1,5 @@
1
1
  import { monotonicMs } from './chunk-MH2DSGC6.js';
2
- import { getClientApiConfig } from './chunk-3G7YABRA.js';
2
+ import { getClientApiConfig } from './chunk-W7OPEMGJ.js';
3
3
 
4
4
  // src/reputation/api.ts
5
5
  var reviewsCache = /* @__PURE__ */ new Map();
@@ -2,7 +2,7 @@
2
2
  import { useState, useCallback, useRef } from 'react';
3
3
  import { jsxs, jsx } from 'react/jsx-runtime';
4
4
 
5
- // src/articles/ArticleFAQ.tsx
5
+ // packages/press-kit/src/articles/ArticleFAQ.tsx
6
6
  var defaultStyles = {
7
7
  section: {
8
8
  margin: "3rem 0",
@@ -1,4 +1,4 @@
1
1
  // src/shared/version.ts
2
- var SITE_KIT_VERSION = "8.1.0";
2
+ var SITE_KIT_VERSION = "8.3.0";
3
3
 
4
4
  export { SITE_KIT_VERSION };
@@ -1,4 +1,4 @@
1
- import { SITE_KIT_VERSION } from './chunk-NWVB75ER.js';
1
+ import { SITE_KIT_VERSION } from './chunk-C2UROFGZ.js';
2
2
 
3
3
  // src/shared/siteToken.ts
4
4
  var SITE_TOKEN_PREFIX = "st1.";
@@ -1,6 +1,6 @@
1
- import { getLLMsData, getOptimizedLLMsTxt } from './chunk-JIH32RH2.js';
2
- import { linkClassificationHost } from './chunk-L5UOHS6E.js';
3
- import { resolveArticleUrl } from './chunk-WMVK77ND.js';
1
+ import { getLLMsData, getOptimizedLLMsTxt } from './chunk-XA7Q2VQA.js';
2
+ import { linkClassificationHost } from './chunk-5D7ZISUP.js';
3
+ import { resolveArticleUrl } from './chunk-4K735O3J.js';
4
4
  import { freshFetch } from './chunk-UAYAJPEP.js';
5
5
  import { LLM_GEO_CONTRACT_VERSION, sanitizePrimaryLanguageTag, sanitizeLlmsDisclaimerLine, sanitizeLlmsPublicSummary } from './chunk-NZ4RXN3G.js';
6
6
  import { resolveTrailingSlash, applyTrailingSlash } from './chunk-YVKRYQRG.js';
@@ -1,4 +1,4 @@
1
- // src/articles/widget-styles.ts
1
+ // packages/press-kit/src/articles/widget-styles.ts
2
2
  var widgetStyle = {
3
3
  padding: 20,
4
4
  backgroundColor: "var(--sk-bg-elevated)",
@@ -26,7 +26,7 @@ function useFieldControls(fields) {
26
26
  }
27
27
  if (needsFile && !requested.current.file) {
28
28
  requested.current.file = true;
29
- import('./FileField-DEHVYXAO.js').then((m) => {
29
+ import('./FileField-UNGSNGJ5.js').then((m) => {
30
30
  if (!cancelled) setControls((prev) => ({ ...prev, File: m.FileField }));
31
31
  }).catch(() => {
32
32
  requested.current.file = false;
@@ -1,13 +1,13 @@
1
1
  'use client';
2
2
  import { DEFAULT_WIDGET_Z_INDEX } from './chunk-27FISYK4.js';
3
- import { resolveAnalyticsTarget } from './chunk-CAH4Y4PY.js';
3
+ import { resolveAnalyticsTarget } from './chunk-JO76F5WP.js';
4
4
  import { useState, useEffect } from 'react';
5
5
  import ReactDOM from 'react-dom';
6
6
  import dynamic from 'next/dynamic';
7
7
  import { jsx } from 'react/jsx-runtime';
8
8
 
9
9
  var LazyChatWidget = dynamic(
10
- () => import('./ChatWidget-BTR5VERC.js').then((m) => ({ default: m.ChatWidget })),
10
+ () => import('./ChatWidget-D2X445PO.js').then((m) => ({ default: m.ChatWidget })),
11
11
  { ssr: false }
12
12
  );
13
13
  function SiteChat(props) {
@@ -1,4 +1,4 @@
1
- // src/articles/article-tables.ts
1
+ // packages/press-kit/src/articles/article-tables.ts
2
2
  var tableScrollClass = "sk-article-table-scroll";
3
3
  var legacyTableScrollClass = "sk-blog-table-scroll";
4
4
  var voidElements = /* @__PURE__ */ new Set([
@@ -2,8 +2,8 @@
2
2
  import { registerAnalyticsDispatcher } from './chunk-LCDVPAMR.js';
3
3
  import { getOrCreateVisitorId, getOrCreateSessionId } from './chunk-ZKADJNR2.js';
4
4
  import { onPageLeave } from './chunk-L2V5PUFN.js';
5
- import { resolveAnalyticsTarget } from './chunk-CAH4Y4PY.js';
6
- import { sonorFetch, sonorBeacon } from './chunk-WPOFTCKL.js';
5
+ import { resolveAnalyticsTarget } from './chunk-JO76F5WP.js';
6
+ import { sonorFetch, sonorBeacon } from './chunk-OIWFXUVD.js';
7
7
  import { createContext, useRef, useEffect, useState, useMemo, useCallback, useContext } from 'react';
8
8
  import { usePathname } from 'next/navigation';
9
9
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1,5 +1,5 @@
1
1
  import { secretsMatch, readCappedBody } from './chunk-XTRZGXB2.js';
2
- import { SITE_KIT_VERSION } from './chunk-NWVB75ER.js';
2
+ import { SITE_KIT_VERSION } from './chunk-C2UROFGZ.js';
3
3
 
4
4
  // src/llms/revalidate.ts
5
5
  function createLlmsRevalidateHandler(secret, options) {
@@ -2,8 +2,8 @@
2
2
  import { DEFAULT_WIDGET_Z_INDEX } from './chunk-27FISYK4.js';
3
3
  import { readAnalyticsIdentity } from './chunk-5ROTTMBL.js';
4
4
  import { getOrCreateVisitorId } from './chunk-ZKADJNR2.js';
5
- import { resolveAnalyticsTarget } from './chunk-CAH4Y4PY.js';
6
- import { sonorFetch } from './chunk-WPOFTCKL.js';
5
+ import { resolveAnalyticsTarget } from './chunk-JO76F5WP.js';
6
+ import { sonorFetch } from './chunk-OIWFXUVD.js';
7
7
  import { useState, useEffect, useCallback, useRef } from 'react';
8
8
  import ReactDOM from 'react-dom';
9
9
  import dynamic from 'next/dynamic';
@@ -161,7 +161,7 @@ function activatePopup(active, id, popups) {
161
161
  return [...active, id];
162
162
  }
163
163
  var LazyBlocksPopup = dynamic(
164
- () => import('./BlocksPopup-OY5G3EFH.js').then((m) => ({ default: m.BlocksPopup })),
164
+ () => import('./BlocksPopup-3RPN6YVJ.js').then((m) => ({ default: m.BlocksPopup })),
165
165
  { ssr: false }
166
166
  );
167
167
  function SitePopups(props) {
@@ -0,0 +1 @@
1
+
@@ -2,10 +2,10 @@
2
2
  import { VISUAL_VIEWPORT_GAP_PROPERTY } from './chunk-6T6CQVNL.js';
3
3
  import { GlassStyles } from './chunk-JE4A5S4F.js';
4
4
  import { DEFAULT_WIDGET_Z_INDEX } from './chunk-27FISYK4.js';
5
- import { useForm } from './chunk-S6IGQYHW.js';
5
+ import { useForm } from './chunk-MQ4REMTH.js';
6
6
  import { parseColor, relativeLuminance, DARK_LUMINANCE, contrastRatio } from './chunk-S22FSH7C.js';
7
- import { readPublishedApiConfig } from './chunk-3G7YABRA.js';
8
- import { sonorFetch } from './chunk-WPOFTCKL.js';
7
+ import { sonorFetch } from './chunk-OIWFXUVD.js';
8
+ import { readPublishedApiConfig } from './chunk-W7OPEMGJ.js';
9
9
  import { useState, useEffect, useRef, useLayoutEffect, useCallback, Fragment as Fragment$1 } from 'react';
10
10
  import { lexer } from 'marked';
11
11
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -0,0 +1,14 @@
1
+ import { publishSiteCredential } from './chunk-U7Y3QG3A.js';
2
+
3
+ // src/client/SiteKitCredential.tsx
4
+ function SiteKitCredential({
5
+ apiKey,
6
+ apiUrl,
7
+ site,
8
+ debug
9
+ }) {
10
+ publishSiteCredential({ apiKey, apiUrl, site, debug });
11
+ return null;
12
+ }
13
+
14
+ export { SiteKitCredential };
@@ -1,5 +1,5 @@
1
1
  import { FRAME_READY_MESSAGE } from './chunk-EKBEOXTH.js';
2
- import { readPublishedApiConfig, DEFAULT_SONOR_API_URL } from './chunk-3G7YABRA.js';
2
+ import { readPublishedApiConfig, DEFAULT_SONOR_API_URL } from './chunk-W7OPEMGJ.js';
3
3
 
4
4
  // src/shared/frame.ts
5
5
  function isFramed() {