core-maugli 1.0.2

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 (206) hide show
  1. package/LICENSE +727 -0
  2. package/README.md +108 -0
  3. package/bin/index.js +9 -0
  4. package/bin/init.js +38 -0
  5. package/package.json +73 -0
  6. package/public/blackbox.webp +0 -0
  7. package/public/favicon.svg +10 -0
  8. package/public/footerlabel.svg +18 -0
  9. package/public/icon-192.png +0 -0
  10. package/public/icon-512.png +0 -0
  11. package/public/img/page-images/blog_default.webp +0 -0
  12. package/public/logo-icon.svg +3 -0
  13. package/public/logoblog-icon.svg +10 -0
  14. package/public/manifest.webmanifest +21 -0
  15. package/public/maugli_for_animation.svg +6 -0
  16. package/public/mauglilabel.svg +17 -0
  17. package/public/tr-about-1200.webp +0 -0
  18. package/public/tr-about-400.webp +0 -0
  19. package/public/tr-about-800.webp +0 -0
  20. package/public/tr-about.webp +0 -0
  21. package/public/tr-post-1-1200.webp +0 -0
  22. package/public/tr-post-1-400.webp +0 -0
  23. package/public/tr-post-1-800.webp +0 -0
  24. package/public/tr-post0-1200.webp +0 -0
  25. package/public/tr-post0-400.webp +0 -0
  26. package/public/tr-post0-800.webp +0 -0
  27. package/public/tr-post0.webp +0 -0
  28. package/public/tr-prewiew.webp +0 -0
  29. package/resize-all.cjs +29 -0
  30. package/scripts/featured.js +208 -0
  31. package/scripts/update-with-backup.js +34 -0
  32. package/scripts/upgrade-config.js +90 -0
  33. package/scripts/verify-assets.js +28 -0
  34. package/src/assets/img/default/autor_default.webp +0 -0
  35. package/src/assets/img/default/blog_default.webp +0 -0
  36. package/src/assets/img/default/product_default.webp +0 -0
  37. package/src/assets/img/default/project_default.webp +0 -0
  38. package/src/assets/img/default/rubric_default.webp +0 -0
  39. package/src/assets/img/examples/authors/anna.webp +0 -0
  40. package/src/assets/img/examples/authors/carlos.webp +0 -0
  41. package/src/assets/img/examples/authors/daria.webp +0 -0
  42. package/src/assets/img/examples/authors/dmitry.webp +0 -0
  43. package/src/assets/img/examples/authors/igor.webp +0 -0
  44. package/src/assets/img/examples/authors/john.webp +0 -0
  45. package/src/assets/img/examples/blog/post-1-avtomatizaciya-marketinga-kak-ii-osvobozhdaet-predprinimatelei-ot-cifrovogo-rabstva.webp +0 -0
  46. package/src/assets/img/examples/blog/post_11.webp +0 -0
  47. package/src/assets/img/examples/blog/post_12.webp +0 -0
  48. package/src/assets/img/examples/blog/post_1_jsonld_guide.webp +0 -0
  49. package/src/assets/img/examples/blog/test-post.webp +0 -0
  50. package/src/assets/img/examples/blog/tr-post-1.webp +0 -0
  51. package/src/assets/img/examples/products/product_1.webp +0 -0
  52. package/src/assets/img/examples/products/product_2.webp +0 -0
  53. package/src/assets/img/examples/projects/project_1.webp +0 -0
  54. package/src/assets/img/examples/projects/project_2.webp +0 -0
  55. package/src/components/ArticleMeta.astro +103 -0
  56. package/src/components/AuthorCard.astro +95 -0
  57. package/src/components/AuthorLink.astro +25 -0
  58. package/src/components/AuthorLinksGroup.astro +135 -0
  59. package/src/components/Avatar.astro +32 -0
  60. package/src/components/BaseHead.astro +121 -0
  61. package/src/components/Breadcrumbs.astro +90 -0
  62. package/src/components/Button.astro +25 -0
  63. package/src/components/Card.astro +99 -0
  64. package/src/components/ContentFooter.astro +147 -0
  65. package/src/components/CopyLinkButton.astro +133 -0
  66. package/src/components/CountBadge.astro +17 -0
  67. package/src/components/Footer.astro +122 -0
  68. package/src/components/FormattedDate.astro +59 -0
  69. package/src/components/Header.astro +18 -0
  70. package/src/components/HeroImage.astro +38 -0
  71. package/src/components/IconButton.astro +23 -0
  72. package/src/components/Image.astro +13 -0
  73. package/src/components/InfoCard.astro +123 -0
  74. package/src/components/LanguageSwitcher.astro +122 -0
  75. package/src/components/MaugliFloatingLabel.astro +454 -0
  76. package/src/components/MobileTagsAndShare.astro +71 -0
  77. package/src/components/Nav.astro +151 -0
  78. package/src/components/NavLink.astro +31 -0
  79. package/src/components/Pagination.astro +70 -0
  80. package/src/components/PostPreview.astro +22 -0
  81. package/src/components/ProductBannerCard.astro +47 -0
  82. package/src/components/ProductPreview.astro +21 -0
  83. package/src/components/ProjectPreview.astro +21 -0
  84. package/src/components/RubricCard.astro +142 -0
  85. package/src/components/ShareIcon.astro +93 -0
  86. package/src/components/ShareLink.astro +58 -0
  87. package/src/components/Subscribe.astro +68 -0
  88. package/src/components/SummaryFAQCard.astro +106 -0
  89. package/src/components/TableOfContents.astro +143 -0
  90. package/src/components/TagPill.astro +41 -0
  91. package/src/components/TagPills.astro +42 -0
  92. package/src/components/TagsAndShare.astro +379 -0
  93. package/src/components/TagsSection.astro +203 -0
  94. package/src/components/ThemeToggle.astro +58 -0
  95. package/src/config/maugli.config.ts +213 -0
  96. package/src/content/authors/daria-zorina.md +42 -0
  97. package/src/content/authors/default-autor.md +47 -0
  98. package/src/content/authors/igor-sokolov.md +43 -0
  99. package/src/content/authors/john-walker.md +46 -0
  100. package/src/content/blog/jsonld-guide.md +260 -0
  101. package/src/content/blog/post-0.md +49 -0
  102. package/src/content/blog/post-1-avtomatizaciya-marketinga-kak-ii-osvobozhdaet-predprinimatelei-ot-cifrovogo-rabstva.md +72 -0
  103. package/src/content/blog/post-agent-experience-mcp-biznes-v-epohu-ii-agentov.md +116 -0
  104. package/src/content/blog/test-post-2025-07-11.md +73 -0
  105. package/src/content/config.ts +80 -0
  106. package/src/content/pages/about.md +40 -0
  107. package/src/content/pages/about.mdx +27 -0
  108. package/src/content/pages/authors.mdx +49 -0
  109. package/src/content/pages/blog.mdx +31 -0
  110. package/src/content/pages/contact.md +10 -0
  111. package/src/content/pages/products.mdx +30 -0
  112. package/src/content/pages/projects.mdx +28 -0
  113. package/src/content/pages/rubrics.mdx +35 -0
  114. package/src/content/pages/terms.md +12 -0
  115. package/src/content/products/example-product.md +28 -0
  116. package/src/content/products/maugli-editor.md +35 -0
  117. package/src/content/products/maugli-freeblog.md +162 -0
  118. package/src/content/projects/example-project.md +28 -0
  119. package/src/content/projects/project-1.md +70 -0
  120. package/src/content/projects/project-2.md +33 -0
  121. package/src/content/tags/ai-business.mdx +18 -0
  122. package/src/content/tags/automation.mdx +18 -0
  123. package/src/content/tags/content-strategy.mdx +18 -0
  124. package/src/content/tags/growth-marketing.mdx +18 -0
  125. package/src/content/tags/industry-reviews.mdx +18 -0
  126. package/src/content/tags/interesting.mdx +18 -0
  127. package/src/content/tags/seo-ai-seo.mdx +18 -0
  128. package/src/content.config.ts +260 -0
  129. package/src/data/site-config.ts +164 -0
  130. package/src/i18n/de.json +126 -0
  131. package/src/i18n/en.json +126 -0
  132. package/src/i18n/es.json +126 -0
  133. package/src/i18n/fr.json +126 -0
  134. package/src/i18n/index.ts +10 -0
  135. package/src/i18n/ja.json +126 -0
  136. package/src/i18n/languages.ts +23 -0
  137. package/src/i18n/pt.json +126 -0
  138. package/src/i18n/ru.json +123 -0
  139. package/src/i18n/zh.json +126 -0
  140. package/src/icons/ArrowLeft.astro +13 -0
  141. package/src/icons/ArrowRight.astro +13 -0
  142. package/src/icons/flags/brazil.svg +14 -0
  143. package/src/icons/flags/china.svg +15 -0
  144. package/src/icons/flags/france.svg +12 -0
  145. package/src/icons/flags/germany.svg +12 -0
  146. package/src/icons/flags/japan.svg +11 -0
  147. package/src/icons/flags/russia.svg +12 -0
  148. package/src/icons/flags/spain.svg +12 -0
  149. package/src/icons/flags/united arab emirates.svg +13 -0
  150. package/src/icons/flags/united states.svg +15 -0
  151. package/src/icons/socials/BlueskyIcon.astro +9 -0
  152. package/src/icons/socials/EmailIcon.astro +8 -0
  153. package/src/icons/socials/LinkedinIcon.astro +9 -0
  154. package/src/icons/socials/MastodonIcon.astro +9 -0
  155. package/src/icons/socials/MediumIcon.astro +9 -0
  156. package/src/icons/socials/RedditIcon.astro +11 -0
  157. package/src/icons/socials/TelegramIcon.astro +11 -0
  158. package/src/icons/socials/TwitterIcon.astro +9 -0
  159. package/src/img/default/autor_default.webp +0 -0
  160. package/src/img/default/default.webp +0 -0
  161. package/src/img/default/rubric_default.webp +0 -0
  162. package/src/img/default/test.webp +0 -0
  163. package/src/img/default/test2.webp +0 -0
  164. package/src/img/examples/authors/anna.webp +0 -0
  165. package/src/img/examples/authors/carlos.webp +0 -0
  166. package/src/img/examples/authors/daria.webp +0 -0
  167. package/src/img/examples/authors/dmitry.webp +0 -0
  168. package/src/img/examples/authors/igor.webp +0 -0
  169. package/src/img/examples/authors/john.webp +0 -0
  170. package/src/img/examples/blog/post-1-avtomatizaciya-marketinga-kak-ii-osvobozhdaet-predprinimatelei-ot-cifrovogo-rabstva.webp +0 -0
  171. package/src/img/examples/blog/post-2-avtomatizaciya-kontenta-kak-neiroseti-ubivayut-perfekcionizm-v-biznese.webp +0 -0
  172. package/src/img/examples/blog/post-3-laik-ne-valyuta-kak-avtomatizaciya-marketinga-spasaet-ot-lozhnyh-metrik.webp +0 -0
  173. package/src/img/examples/blog/post-5-5-fatalnyh-oshibok-marketinga-kotorye-ubivayut-startapy-na-starte.webp +0 -0
  174. package/src/img/examples/blog/post-6-5-strategii-kontent-marketinga-dlya-startapov-avtomatizaciya-i-revolyuciya.webp +0 -0
  175. package/src/img/examples/blog/post-7-viralnyi-kontent-ne-udacha-a-strategiya-avtomatizaciya-marketinga.webp +0 -0
  176. package/src/img/examples/blog/post-agent-experience-mcp-biznes-v-epohu-ii-agentov.webp +0 -0
  177. package/src/img/examples/blog/post_1_jsonld_guide.webp +0 -0
  178. package/src/img/examples/blog/tr-post-1.webp +0 -0
  179. package/src/layouts/BaseLayout.astro +59 -0
  180. package/src/pages/404.astro +24 -0
  181. package/src/pages/[...id].astro +50 -0
  182. package/src/pages/about.astro +0 -0
  183. package/src/pages/authors/[...page].astro +105 -0
  184. package/src/pages/authors/[id].astro +165 -0
  185. package/src/pages/blog/[...page].astro +59 -0
  186. package/src/pages/blog/[id].astro +175 -0
  187. package/src/pages/index.astro +90 -0
  188. package/src/pages/products/[...page].astro +50 -0
  189. package/src/pages/products/[id].astro +221 -0
  190. package/src/pages/projects/[...page].astro +74 -0
  191. package/src/pages/projects/[id].astro +165 -0
  192. package/src/pages/projects/tags/[id]/[...page].astro +58 -0
  193. package/src/pages/rss.xml.js +5 -0
  194. package/src/pages/tags/[id]/[...page].astro +110 -0
  195. package/src/pages/tags/index.astro +124 -0
  196. package/src/scripts/infoCardFadeIn.js +22 -0
  197. package/src/styles/global.css +272 -0
  198. package/src/utils/common-utils.ts +0 -0
  199. package/src/utils/content-loader.ts +14 -0
  200. package/src/utils/data-utils.ts +49 -0
  201. package/src/utils/featuredManager.ts +118 -0
  202. package/src/utils/posts.ts +43 -0
  203. package/src/utils/reading-time.ts +28 -0
  204. package/src/utils/remark-slugify.js +8 -0
  205. package/src/utils/rss.ts +23 -0
  206. package/typograf-batch.js +49 -0
@@ -0,0 +1,260 @@
1
+ import { glob } from 'astro/loaders';
2
+ import { defineCollection, z } from 'astro:content';
3
+ import { slugify } from './src/utils/common-utils';
4
+
5
+ // 1) Создаём схему для «даты или сейчас»
6
+ const dateOrNow = z
7
+ .coerce.date() // пытаемся сконвертировать в Date
8
+ .optional() // допускаем отсутствие поля
9
+ .transform((d) => d ?? new Date()); // если нет — возвращаем новую (сейчас)
10
+
11
+ // SEO-схема без изменений
12
+ const seoSchema = z.object({
13
+ title: z.string().min(5).max(120).optional(),
14
+ description: z.string().min(15).max(160).optional(),
15
+ keywords: z.array(z.string()).default([]),
16
+ image: z
17
+ .object({
18
+ src: z.string(),
19
+ alt: z.string().optional(),
20
+ caption: z.string().optional(),
21
+ width: z.string().optional(),
22
+ height: z.string().optional(),
23
+ sizes: z.string().optional(),
24
+ type: z.enum(['image/jpeg', 'image/png', 'image/webp']).optional(),
25
+ })
26
+ .optional(),
27
+ pageType: z.enum(['website', 'article']).default('website'),
28
+ });
29
+
30
+
31
+ // 3) Коллекция blog
32
+ const blog = defineCollection({
33
+ loader: glob({
34
+ pattern: '**/*.{md,mdx}',
35
+ base: './src/content/blog',
36
+ }),
37
+ schema: z.object({
38
+ title: z.string(),
39
+ excerpt: z.string().optional(),
40
+ publishDate: dateOrNow,
41
+ updatedDate: dateOrNow,
42
+ isFeatured: z.boolean().default(false),
43
+ tags: z.array(z.string()).default([]),
44
+ seo: seoSchema.optional(),
45
+ image: z.object({
46
+ src: z.string(),
47
+ alt: z.string().optional(),
48
+ caption: z.string().optional(),
49
+ width: z.string().optional(),
50
+ height: z.string().optional(),
51
+ sizes: z.string().optional(),
52
+ type: z.enum(['image/jpeg', 'image/png', 'image/webp']).optional(),
53
+ isCover: z.boolean().optional(),
54
+ }).optional(),
55
+ articleSection: z.string().optional(),
56
+ inLanguage: z.string().optional(),
57
+ canonicalUrl: z.string().optional(),
58
+ author: z.string().optional(),
59
+ publisher: z.string().optional(),
60
+ generativeEngineOptimization: z.object({
61
+ generated: z.object({
62
+ summary: z.string(),
63
+ highlights: z.array(z.string()),
64
+ faq: z.array(z.object({
65
+ question: z.string(),
66
+ answer: z.string(),
67
+ })),
68
+ }).optional(),
69
+ }).optional(),
70
+ jsonld: z.record(z.string(), z.any()).optional(), // <-- для гибкого JSON-LD
71
+ productID: z.string().optional(), // Уникальный идентификатор продукта (опционально)
72
+ productLink: z.string().url().or(z.string()).optional(), // <-- добавлено поле для ссылки на продукт
73
+ isExample: z.boolean().optional(), // Example/demo content flag
74
+ farmBlogId: z.string().optional(), // Farm integration: blog/article ID
75
+ }),
76
+ });
77
+
78
+
79
+
80
+ // остальные коллекции без изменений
81
+ const pages = defineCollection({
82
+ loader: glob({
83
+ pattern: '**/*.{md,mdx}',
84
+ base: './src/content/pages',
85
+ }),
86
+ schema: z.object({
87
+ title: z.string(),
88
+ description: z.string().optional(),
89
+ seo: seoSchema.optional(),
90
+ image: z.object({
91
+ src: z.string(),
92
+ alt: z.string().optional(),
93
+ caption: z.string().optional(),
94
+ width: z.string().optional(),
95
+ height: z.string().optional(),
96
+ sizes: z.string().optional(),
97
+ type: z.enum(['image/jpeg', 'image/png', 'image/webp']).optional(),
98
+ }).optional(),
99
+ pageType: z.enum(['website', 'article']).default('website'),
100
+ jsonld: z.record(z.string(), z.any()).optional(),
101
+ route: z.string().optional(), // <-- добавлено поле для связи с маршрутом страницы
102
+ })
103
+ });
104
+
105
+ const projects = defineCollection({
106
+ loader: glob({
107
+ pattern: '**/*.{md,mdx}',
108
+ base: './src/content/projects',
109
+ }),
110
+ schema: z.object({
111
+ title: z.string(),
112
+ description: z.string().optional(),
113
+ publishDate: dateOrNow,
114
+ updatedDate: dateOrNow,
115
+ isFeatured: z.boolean().default(false),
116
+ tags: z.array(z.string()).default([]),
117
+ seo: seoSchema.optional(),
118
+ image: z.object({
119
+ src: z.string(),
120
+ alt: z.string().optional(),
121
+ caption: z.string().optional(),
122
+ width: z.string().optional(),
123
+ height: z.string().optional(),
124
+ sizes: z.string().optional(),
125
+ type: z.enum(['image/jpeg', 'image/png', 'image/webp']).optional(),
126
+ isCover: z.boolean().optional(),
127
+ }).optional(),
128
+ client: z.string().optional(), // Клиент
129
+ author: z.string().optional(),
130
+ publisher: z.string().optional(),
131
+ productID: z.string().optional(), // Уникальный идентификатор продукта (опционально)
132
+ productLink: z.string().url().or(z.string()).optional(), // <-- добавлено поле для ссылки на продукт
133
+ generativeEngineOptimization: z.object({
134
+ generated: z.object({
135
+ summary: z.string(),
136
+ highlights: z.array(z.string()),
137
+ faq: z.array(z.object({
138
+ question: z.string(),
139
+ answer: z.string(),
140
+ })),
141
+ }).optional(),
142
+ }).optional(),
143
+ jsonld: z.record(z.string(), z.any()).optional(),
144
+ isExample: z.boolean().optional(), // Example/demo content flag
145
+ farmProjectId: z.string().optional(), // Farm integration: project/case ID
146
+ }),
147
+ });
148
+
149
+ const products = defineCollection({
150
+ loader: glob({
151
+ pattern: '**/*.{md,mdx}',
152
+ base: './src/content/products',
153
+ }),
154
+ schema: z.object({
155
+ title: z.string(),
156
+ description: z.string().optional(),
157
+ publishDate: dateOrNow,
158
+ updatedDate: dateOrNow,
159
+ isFeatured: z.boolean().default(false),
160
+ tags: z.array(z.string()).default([]),
161
+ seo: seoSchema.optional(),
162
+ productID: z.string(), // id обязательный
163
+ productLink: z.string().optional(), // productLink теперь просто строка и опционально
164
+ image: z.object({
165
+ src: z.string(),
166
+ alt: z.string().optional(),
167
+ caption: z.string().optional(),
168
+ width: z.string().optional(),
169
+ height: z.string().optional(),
170
+ sizes: z.string().optional(),
171
+ type: z.enum(['image/jpeg', 'image/png', 'image/webp']).optional(),
172
+ isCover: z.boolean().optional(),
173
+ }).optional(),
174
+ client: z.string().optional(),
175
+ author: z.string().optional(),
176
+ publisher: z.string().optional(),
177
+ generativeEngineOptimization: z.object({
178
+ generated: z.object({
179
+ summary: z.string(),
180
+ highlights: z.array(z.string()),
181
+ faq: z.array(z.object({
182
+ question: z.string(),
183
+ answer: z.string(),
184
+ })),
185
+ }).optional(),
186
+ }).optional(),
187
+ jsonld: z.record(z.string(), z.any()).optional(),
188
+ isExample: z.boolean().optional(), // Example/demo content flag
189
+ farmProductId: z.string().optional(), // Farm integration: product ID
190
+ }),
191
+ });
192
+
193
+ // Коллекция авторов
194
+ const authors = defineCollection({
195
+ loader: glob({
196
+ pattern: '**/*.{md,mdx}',
197
+ base: './src/content/authors',
198
+ }),
199
+ schema: z.object({
200
+ name: z.string(),
201
+ position: z.string(),
202
+ description: z.string(),
203
+ avatar: z.string().optional(),
204
+ socials: z.object({
205
+ email: z.string().optional(),
206
+ telegram: z.string().optional(),
207
+ mastodon: z.string().optional(),
208
+ medium: z.string().optional(),
209
+ bluesky: z.string().optional(),
210
+ reddit: z.string().optional(),
211
+ linkedin: z.string().optional(),
212
+ twitter: z.string().optional(),
213
+ }).optional(),
214
+ seo: z.object({
215
+ title: z.string().optional(),
216
+ description: z.string().optional(),
217
+ keywords: z.array(z.string()).optional(),
218
+ image: z.object({
219
+ src: z.string(),
220
+ alt: z.string().optional(),
221
+ caption: z.string().optional(),
222
+ width: z.string().optional(),
223
+ height: z.string().optional(),
224
+ sizes: z.string().optional(),
225
+ type: z.enum(['image/jpeg', 'image/png', 'image/webp']).optional(),
226
+ }).optional(),
227
+ }).optional(),
228
+ jsonld: z.record(z.string(), z.any()).optional(),
229
+ isExample: z.boolean().optional(), // Example/demo content flag
230
+ farmAuthorId: z.string().optional(), // Farm integration: author ID
231
+ })
232
+ });
233
+
234
+ const tags = defineCollection({
235
+ loader: glob({
236
+ pattern: '**/*.{md,mdx}',
237
+ base: './src/content/tags',
238
+ }),
239
+ schema: z.object({
240
+ title: z.string(),
241
+ description: z.string().optional(),
242
+ image: z.object({
243
+ src: z.string(),
244
+ alt: z.string().optional(),
245
+ }).optional(),
246
+ isRubric: z.boolean().default(false),
247
+ quote: z.string().optional(),
248
+ lang: z.string().optional(),
249
+ isFeatured: z.boolean().default(false),
250
+ jsonld: z.record(z.string(), z.any()).optional(),
251
+ isExample: z.boolean().optional(), // Example/demo content flag
252
+ farmRubricId: z.string().optional(), // Farm integration: rubric ID
253
+ }).transform((data) => ({
254
+ ...data,
255
+ slug: slugify(data.title), // slug генерируется автоматически из title
256
+ isFeatured: data.isFeatured ?? false // isFeatured по умолчанию false
257
+ })),
258
+ });
259
+
260
+ export const collections = { blog, pages, projects, products, authors, tags };
@@ -0,0 +1,164 @@
1
+ export type Image = {
2
+ src: string;
3
+ alt?: string;
4
+ caption?: string;
5
+ };
6
+
7
+ export type Link = {
8
+ text: string;
9
+ href: string;
10
+ };
11
+
12
+ export type Hero = {
13
+ title?: string;
14
+ text?: string;
15
+ image?: Image;
16
+ actions?: Link[];
17
+ };
18
+
19
+ export type Subscribe = {
20
+ title?: string;
21
+ text?: string;
22
+ formUrl: string;
23
+ };
24
+
25
+ export type Author = {
26
+ name: string;
27
+ type?: 'Person' | 'Organization';
28
+ url?: string;
29
+ avatar?: string;
30
+ description?: string;
31
+ sameAs?: string[]; // соцсети, профили
32
+ };
33
+
34
+ export type Publisher = {
35
+ name: string;
36
+ logo?: Image;
37
+ url?: string;
38
+ type?: 'Organization';
39
+ };
40
+
41
+ export type SiteConfig = {
42
+ website: string;
43
+ logo?: Image;
44
+ title: string;
45
+ subtitle?: string;
46
+ description: string;
47
+ image?: Image;
48
+ author?: Author;
49
+ publisher?: Publisher;
50
+ locale?: string;
51
+ headerNavLinks?: Link[];
52
+ footerNavLinks?: Link[];
53
+ socialLinks?: Link[];
54
+ hero?: Hero;
55
+ subscribe?: Subscribe;
56
+ postsPerPage?: number;
57
+ projectsPerPage?: number;
58
+ };
59
+
60
+ const siteConfig: SiteConfig = {
61
+ website: 'https://techrev.maugli.cfd',
62
+ title: 'ТехРев',
63
+ subtitle: 'Блог об автоматизации с ИИ от ИИ-автора',
64
+ description: 'Создание контента для соцсетей и блогов быстро, дешево и качественно',
65
+ image: {
66
+ src: 'tr-prewiew.png',
67
+ alt: 'Автоматизация и ИИ -- новая технологическая революция',
68
+ width: 1200,
69
+ height: 630,
70
+ caption: '...',
71
+ },
72
+ author: {
73
+ name: 'ИльичAI',
74
+ type: 'Person',
75
+ url: 'https://techrev.maugli.cfd/about',
76
+ avatar: '/img/ilichai-avatar.png',
77
+ description: 'AI-эксперт, созданный в Maugli Content Farm, работает на GPT4.1, редактор и аналитик.',
78
+ sameAs: [
79
+ 'https://t.me/techrev_maugli',
80
+ 'https://twitter.com/', // другие профили по желанию
81
+ ]
82
+ },
83
+ publisher: {
84
+ name: 'Maugli Content Farm',
85
+ logo: {
86
+ src: '/logo.svg',
87
+ alt: 'Maugli Content Farm'
88
+ },
89
+ url: 'https://maugli.cfd',
90
+ type: 'Organization'
91
+ },
92
+ locale: 'ru_RU',
93
+ headerNavLinks: [
94
+ {
95
+ text: 'Блог',
96
+ href: '/'
97
+ },
98
+ {
99
+ text: 'Сервисы',
100
+ href: '/projects'
101
+ },
102
+ {
103
+ text: 'Авторы',
104
+ href: '/authors'
105
+ },
106
+ {
107
+ text: 'Теги и рубрики',
108
+ href: '/tags'
109
+ }
110
+ ],
111
+ footerNavLinks: [
112
+ {
113
+ text: 'О блоге',
114
+ href: '/about'
115
+ },
116
+ {
117
+ text: 'Контакты',
118
+ href: '/contact'
119
+ },
120
+ {
121
+ text: 'О Maugli',
122
+ href: '/terms'
123
+ }
124
+ ],
125
+ socialLinks: [
126
+ {
127
+ text: 'Телеграм',
128
+ href: 'https://t.me/techrev_maugli'
129
+ },
130
+ {
131
+ text: 'Instagram',
132
+ href: 'https://instagram.com/'
133
+ },
134
+ {
135
+ text: 'X/Twitter',
136
+ href: 'https://twitter.com/'
137
+ }
138
+ ],
139
+ hero: {
140
+ title: 'ТехРев — блог, освобождающий людей от ручного труда',
141
+ text: " Канал ведет Ильич ИИ, заряженный верой в то, что может сделать жизнь людей проще",
142
+ image: {
143
+ src: '/hero.webp',
144
+ alt: 'Автор блога Ильич ИИ прямо здесь и сейчас творит технологическую революию',
145
+ width: 1200, // ← добавь
146
+ height: 630
147
+ },
148
+ actions: [
149
+ {
150
+ text: 'Внедрить в свои процессы контент-фабраку',
151
+ href: '/contact'
152
+ }
153
+ ]
154
+ },
155
+ subscribe: {
156
+ title: 'Подписаться на новости ТехРев',
157
+ text: 'Еженедельный дайджесь заветов Ильича у вас на почте.',
158
+ formUrl: '#'
159
+ },
160
+ postsPerPage: 12,
161
+ projectsPerPage: 12
162
+ };
163
+
164
+ export default siteConfig;
@@ -0,0 +1,126 @@
1
+ {
2
+ "buttons": {
3
+ "share": "Teilen",
4
+ "subscribe": "Abonnieren",
5
+ "moreAboutProduct": "Mehr über das Produkt",
6
+ "copied": "Kopiert!",
7
+ "copyLink": "Link kopieren",
8
+ "copyLinkToArticle": "Link zum Artikel kopieren",
9
+ "morePosts": "Weitere Artikel"
10
+ },
11
+ "form": {
12
+ "emailPlaceholder": "E-Mail",
13
+ "emailLabel": "E-Mail",
14
+ "subscribeAriaLabel": "Abonnement-Formular"
15
+ },
16
+
17
+ "nav": {
18
+ "blog": "Blog",
19
+ "products": "Produkte",
20
+ "projects": "Fälle",
21
+ "authors": "Autoren",
22
+ "tags": "Kategorien",
23
+ "openMenu": "Menü öffnen",
24
+ "closeMenu": "Menü schließen"
25
+ },
26
+ "pages": {
27
+ "authors": {
28
+ "title": "Autoren",
29
+ "description": "Lernen Sie unser Expertenteam kennen, das für {brand} schreibt",
30
+ "goToAuthor": "Zum Autor gehen",
31
+ "avatarAlt": "Avatar",
32
+ "onPlatform": "auf"
33
+ },
34
+ "tags": {
35
+ "title": "Kategorien",
36
+ "description": "Alle Artikel nach Kategorie",
37
+ "blogRubrics": "Blog-Kategorien"
38
+ },
39
+ "index": {
40
+ "title": "<Blog>",
41
+ "description": "Blog über Automatisierung aus Sicht der KI",
42
+ "articles": "Artikel",
43
+ "minutes": "Min"
44
+ },
45
+ "products": {
46
+ "title": "Produkte",
47
+ "description": "Alle Maugli-Produkte"
48
+ },
49
+ "projects": {
50
+ "tagTitle": "Services nach Tag",
51
+ "title": "Services"
52
+ },
53
+ "blog": {
54
+ "moreByTag": "Mehr zum Thema"
55
+ },
56
+ "productsId": {
57
+ "articlesByTag": "Artikel zum Thema",
58
+ "casesByTag": "Fälle zum Thema"
59
+ }
60
+ },
61
+ "socials": {
62
+ "email": "E-Mail",
63
+ "linkedin": "LinkedIn",
64
+ "twitter": "Twitter",
65
+ "telegram": "Telegram",
66
+ "reddit": "Reddit",
67
+ "medium": "Medium",
68
+ "mastodon": "Mastodon",
69
+ "bluesky": "Bluesky"
70
+ },
71
+ "footer": {
72
+ "allRightsReserved": "Alle Rechte vorbehalten"
73
+ },
74
+ "shareIconAriaLabel": {
75
+ "twitter": "Auf Twitter teilen",
76
+ "copy": "Link kopieren",
77
+ "telegram": "Auf Telegram teilen",
78
+ "linkedin": "Auf LinkedIn teilen",
79
+ "whatsapp": "Auf WhatsApp teilen",
80
+ "facebook": "Auf Facebook teilen",
81
+ "copied": "Link kopiert"
82
+ },
83
+ "date": {
84
+ "today": "heute",
85
+ "yesterday": "gestern"
86
+ },
87
+ "sidebarAriaLabel": "Seitenleiste",
88
+ "summaryFAQCard": {
89
+ "ariaLabel": "Zusammenfassung und FAQ",
90
+ "summaryLabel": "Zusammenfassung:",
91
+ "faqLabel": "FAQ:"
92
+ },
93
+ "tableOfContents": {
94
+ "title": "Inhalt",
95
+ "ariaLabel": "Inhalt"
96
+ },
97
+ "tagPill": {
98
+ "ariaLabel": "Tag: {tag}"
99
+ },
100
+ "tagPills": {
101
+ "ariaLabel": "Tag: {name} ({count})"
102
+ },
103
+ "tagsSection": {
104
+ "allCases": "Alle Fälle",
105
+ "allArticles": "Alle Artikel",
106
+ "allTags": "Alle Tags",
107
+ "rubricAlt": "Kategorie",
108
+ "tagAriaLabel": "Tag: {name} ({count})"
109
+ },
110
+ "themeToggle": {
111
+ "ariaLabel": "Farbschema wechseln"
112
+ },
113
+ "pagination": {
114
+ "goToPage": "Gehe zu Seite {page} von {lastPage}",
115
+ "pageOf": "Seite {currentPage} von {lastPage}"
116
+ },
117
+ "subscribe": {
118
+ "heading": "Abonniere für Updates",
119
+ "mutedText": "Erhalte die neuesten Artikel und Nachrichten zuerst!"
120
+ },
121
+ "notFound": {
122
+ "title": "Seite nicht gefunden",
123
+ "description": "Entschuldigung, diese Seite existiert nicht oder wurde entfernt.",
124
+ "button": "Zur Hauptseite"
125
+ }
126
+ }
@@ -0,0 +1,126 @@
1
+ {
2
+ "buttons": {
3
+ "share": "Share",
4
+ "subscribe": "Subscribe",
5
+ "moreAboutProduct": "More about the product",
6
+ "copied": "Copied!",
7
+ "copyLink": "Copy link",
8
+ "copyLinkToArticle": "Copy link to article",
9
+ "morePosts": "More posts"
10
+ },
11
+ "form": {
12
+ "emailPlaceholder": "email",
13
+ "emailLabel": "Email",
14
+ "subscribeAriaLabel": "Subscription form"
15
+ },
16
+
17
+ "nav": {
18
+ "blog": "Blog",
19
+ "products": "Products",
20
+ "projects": "Cases",
21
+ "authors": "Authors",
22
+ "tags": "Topics",
23
+ "openMenu": "Open menu",
24
+ "closeMenu": "Close menu"
25
+ },
26
+ "pages": {
27
+ "authors": {
28
+ "title": "Authors",
29
+ "description": "Meet our team of experts writing for {brand}",
30
+ "goToAuthor": "Go to author",
31
+ "avatarAlt": "Avatar",
32
+ "onPlatform": "on"
33
+ },
34
+ "tags": {
35
+ "title": "Categories",
36
+ "description": "All articles by category",
37
+ "blogRubrics": "Blog categories"
38
+ },
39
+ "index": {
40
+ "title": "<Blog>",
41
+ "description": "Blog about automation through AI's eyes",
42
+ "articles": "Articles",
43
+ "minutes": "min"
44
+ },
45
+ "products": {
46
+ "title": "Products",
47
+ "description": "All Maugli products"
48
+ },
49
+ "projects": {
50
+ "tagTitle": "Services by tag",
51
+ "title": "Services"
52
+ },
53
+ "blog": {
54
+ "moreByTag": "More on the topic"
55
+ },
56
+ "productsId": {
57
+ "articlesByTag": "Articles on the topic",
58
+ "casesByTag": "Cases on the topic"
59
+ }
60
+ },
61
+ "socials": {
62
+ "email": "email",
63
+ "linkedin": "LinkedIn",
64
+ "twitter": "Twitter",
65
+ "telegram": "Telegram",
66
+ "reddit": "Reddit",
67
+ "medium": "Medium",
68
+ "mastodon": "Mastodon",
69
+ "bluesky": "Bluesky"
70
+ },
71
+ "footer": {
72
+ "allRightsReserved": "All rights reserved"
73
+ },
74
+ "shareIconAriaLabel": {
75
+ "twitter": "Share on Twitter",
76
+ "copy": "Copy link",
77
+ "telegram": "Share on Telegram",
78
+ "linkedin": "Share on LinkedIn",
79
+ "whatsapp": "Share on WhatsApp",
80
+ "facebook": "Share on Facebook",
81
+ "copied": "Link copied"
82
+ },
83
+ "date": {
84
+ "today": "today",
85
+ "yesterday": "yesterday"
86
+ },
87
+ "sidebarAriaLabel": "Sidebar",
88
+ "summaryFAQCard": {
89
+ "ariaLabel": "Summary and FAQ",
90
+ "summaryLabel": "Summary:",
91
+ "faqLabel": "FAQ:"
92
+ },
93
+ "tableOfContents": {
94
+ "title": "Contents",
95
+ "ariaLabel": "Contents"
96
+ },
97
+ "tagPill": {
98
+ "ariaLabel": "Tag: {tag}"
99
+ },
100
+ "tagPills": {
101
+ "ariaLabel": "Tag: {name} ({count})"
102
+ },
103
+ "tagsSection": {
104
+ "allCases": "All cases",
105
+ "allArticles": "All articles",
106
+ "allTags": "All tags",
107
+ "rubricAlt": "Category",
108
+ "tagAriaLabel": "Tag: {name} ({count})"
109
+ },
110
+ "themeToggle": {
111
+ "ariaLabel": "Change color scheme"
112
+ },
113
+ "pagination": {
114
+ "goToPage": "Go to page {page} of {lastPage}",
115
+ "pageOf": "Page {currentPage} of {lastPage}"
116
+ },
117
+ "subscribe": {
118
+ "heading": "Subscribe for updates",
119
+ "mutedText": "Get the latest articles and news first!"
120
+ },
121
+ "notFound": {
122
+ "title": "Page not found",
123
+ "description": "Sorry, this page does not exist or has been removed.",
124
+ "button": "Go to main page"
125
+ }
126
+ }