core-maugli 1.1.8 → 1.2.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 (72) hide show
  1. package/README.md +12 -6
  2. package/bin/init.js +64 -5
  3. package/package.json +2 -2
  4. package/src/components/ArticleMeta.astro +1 -1
  5. package/src/components/AuthorCard.astro +1 -1
  6. package/src/components/Avatar.astro +1 -1
  7. package/src/components/NetlifyButton.astro +22 -0
  8. package/src/config/maugli.config.ts +16 -6
  9. package/src/content/authors/daria-zorina.md +3 -3
  10. package/src/content/authors/default-autor.md +3 -3
  11. package/src/content/authors/igor-sokolov.md +3 -3
  12. package/src/content/authors/john-walker.md +3 -3
  13. package/src/content/blog/jsonld-guide.md +3 -3
  14. package/src/content/blog/post-0.md +1 -1
  15. package/src/content/blog/post-1-avtomatizaciya-marketinga-kak-ii-osvobozhdaet-predprinimatelei-ot-cifrovogo-rabstva.md +1 -1
  16. package/src/content/blog/post-agent-experience-mcp-biznes-v-epohu-ii-agentov.md +1 -1
  17. package/src/content/blog/test-post-2025-07-11.md +1 -1
  18. package/src/content/pages/blog.mdx +1 -1
  19. package/src/content/products/maugli-editor.md +1 -1
  20. package/src/content/products/maugli-freeblog.md +2 -2
  21. package/src/content/projects/project-1.md +1 -1
  22. package/src/content/projects/project-2.md +1 -1
  23. package/src/content/tags/ai-business.mdx +1 -1
  24. package/src/content/tags/automation.mdx +1 -1
  25. package/src/content/tags/content-strategy.mdx +1 -1
  26. package/src/content/tags/growth-marketing.mdx +1 -1
  27. package/src/content/tags/industry-reviews.mdx +1 -1
  28. package/src/content/tags/interesting.mdx +1 -1
  29. package/src/content/tags/seo-ai-seo.mdx +1 -1
  30. package/src/pages/authors/[...page].astro +1 -1
  31. package/src/pages/authors/[id].astro +2 -2
  32. package/src/img/default/autor_default.webp +0 -0
  33. package/src/img/default/rubric_default.webp +0 -0
  34. package/src/img/examples/authors/anna.webp +0 -0
  35. package/src/img/examples/authors/carlos.webp +0 -0
  36. package/src/img/examples/authors/daria.webp +0 -0
  37. package/src/img/examples/authors/dmitry.webp +0 -0
  38. package/src/img/examples/authors/igor.webp +0 -0
  39. package/src/img/examples/authors/john.webp +0 -0
  40. package/src/img/examples/blog/post-1-avtomatizaciya-marketinga-kak-ii-osvobozhdaet-predprinimatelei-ot-cifrovogo-rabstva.webp +0 -0
  41. package/src/img/examples/blog/post_1_jsonld_guide.webp +0 -0
  42. package/src/img/examples/blog/tr-post-1.webp +0 -0
  43. /package/{src/assets → public}/img/default/autor_default.webp +0 -0
  44. /package/{src/assets → public}/img/default/blog_default.webp +0 -0
  45. /package/{src → public}/img/default/default.webp +0 -0
  46. /package/{src/assets → public}/img/default/product_default.webp +0 -0
  47. /package/{src/assets → public}/img/default/project_default.webp +0 -0
  48. /package/{src/assets → public}/img/default/rubric_default.webp +0 -0
  49. /package/{src → public}/img/default/test.webp +0 -0
  50. /package/{src → public}/img/default/test2.webp +0 -0
  51. /package/{src/assets → public}/img/examples/authors/anna.webp +0 -0
  52. /package/{src/assets → public}/img/examples/authors/carlos.webp +0 -0
  53. /package/{src/assets → public}/img/examples/authors/daria.webp +0 -0
  54. /package/{src/assets → public}/img/examples/authors/dmitry.webp +0 -0
  55. /package/{src/assets → public}/img/examples/authors/igor.webp +0 -0
  56. /package/{src/assets → public}/img/examples/authors/john.webp +0 -0
  57. /package/{src/assets → public}/img/examples/blog/post-1-avtomatizaciya-marketinga-kak-ii-osvobozhdaet-predprinimatelei-ot-cifrovogo-rabstva.webp +0 -0
  58. /package/{src → public}/img/examples/blog/post-2-avtomatizaciya-kontenta-kak-neiroseti-ubivayut-perfekcionizm-v-biznese.webp +0 -0
  59. /package/{src → public}/img/examples/blog/post-3-laik-ne-valyuta-kak-avtomatizaciya-marketinga-spasaet-ot-lozhnyh-metrik.webp +0 -0
  60. /package/{src → public}/img/examples/blog/post-5-5-fatalnyh-oshibok-marketinga-kotorye-ubivayut-startapy-na-starte.webp +0 -0
  61. /package/{src → public}/img/examples/blog/post-6-5-strategii-kontent-marketinga-dlya-startapov-avtomatizaciya-i-revolyuciya.webp +0 -0
  62. /package/{src → public}/img/examples/blog/post-7-viralnyi-kontent-ne-udacha-a-strategiya-avtomatizaciya-marketinga.webp +0 -0
  63. /package/{src → public}/img/examples/blog/post-agent-experience-mcp-biznes-v-epohu-ii-agentov.webp +0 -0
  64. /package/{src/assets → public}/img/examples/blog/post_11.webp +0 -0
  65. /package/{src/assets → public}/img/examples/blog/post_12.webp +0 -0
  66. /package/{src/assets → public}/img/examples/blog/post_1_jsonld_guide.webp +0 -0
  67. /package/{src/assets → public}/img/examples/blog/test-post.webp +0 -0
  68. /package/{src/assets → public}/img/examples/blog/tr-post-1.webp +0 -0
  69. /package/{src/assets → public}/img/examples/products/product_1.webp +0 -0
  70. /package/{src/assets → public}/img/examples/products/product_2.webp +0 -0
  71. /package/{src/assets → public}/img/examples/projects/project_1.webp +0 -0
  72. /package/{src/assets → public}/img/examples/projects/project_2.webp +0 -0
package/README.md CHANGED
@@ -8,14 +8,19 @@ Maugli is a lightweight, agent-friendly blog that can integrate into an existing
8
8
 
9
9
  The theme includes a `product` entity for showcasing offerings. Rename it (for example, to "services") and hide or customize related menu items by editing the `navLinks` array in the same configuration file.
10
10
 
11
- [![Deploy to Netlify Button](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/dashapps/maugli-astro-theme)
11
+ [![Deploy to Netlify Button](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/dashapps/core-maugli-blog)
12
12
 
13
- Before deploying, push this project to your own Git repository. Update the
14
- `repository=` parameter in the link above so it points to your repository or
15
- connect the repo through the Netlify UI.
13
+ The Netlify deployment button automatically uses your repository URL configured in [`src/config/maugli.config.ts`](src/config/maugli.config.ts). When you run `npx core-maugli init`, it will ask for your repository URL and configure the deployment button accordingly.
16
14
 
17
- Example link:
18
- `https://app.netlify.com/start/deploy?repository=https://github.com/your-user/your-repo`
15
+ You can also use the dynamic `<NetlifyButton />` component in your Astro pages:
16
+
17
+ ```astro
18
+ ---
19
+ import NetlifyButton from '../components/NetlifyButton.astro';
20
+ ---
21
+
22
+ <NetlifyButton />
23
+ ```
19
24
 
20
25
  Using Netlify CLI instead:
21
26
 
@@ -239,3 +244,4 @@ commercial license.
239
244
 
240
245
  Contact <licensing@maugli.cfd> or visit
241
246
  <https://maugli.cfd/licensing> for more information.
247
+
package/bin/init.js CHANGED
@@ -31,7 +31,47 @@ function promptLang(codes) {
31
31
  });
32
32
  }
33
33
 
34
- function updateConfig(targetDir, lang) {
34
+ function promptRepo() {
35
+ return new Promise(resolve => {
36
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
37
+ rl.question('Repository URL: ', answer => {
38
+ rl.close();
39
+ resolve(answer.trim());
40
+ });
41
+ });
42
+ }
43
+
44
+ async function getRepoUrl(targetDir, repoOption) {
45
+ if (repoOption) return repoOption;
46
+ try {
47
+ const url = execSync('git remote get-url origin', {
48
+ cwd: targetDir,
49
+ stdio: ['ignore', 'pipe', 'ignore']
50
+ })
51
+ .toString()
52
+ .trim();
53
+ if (url) return url;
54
+ } catch {
55
+ // ignore
56
+ }
57
+ return await promptRepo();
58
+ }
59
+
60
+ function updateReadme(targetDir, repoUrl) {
61
+ if (!repoUrl) return;
62
+ const readmePath = path.join(targetDir, 'README.md');
63
+ if (!existsSync(readmePath)) return;
64
+ let content = readFileSync(readmePath, 'utf8');
65
+ const pattern = /https:\/\/app\.netlify\.com\/start\/deploy\?repository=[^\)\s]+/;
66
+ content = content.replace(
67
+ pattern,
68
+ `https://app.netlify.com/start/deploy?repository=${repoUrl}`
69
+ );
70
+ writeFileSync(readmePath, content);
71
+ console.log('Updated Netlify link in README.md');
72
+ }
73
+
74
+ function updateConfig(targetDir, lang, repoUrl) {
35
75
  const configPath = path.join(targetDir, 'src', 'config', 'maugli.config.ts');
36
76
  if (!existsSync(configPath)) return;
37
77
  let content = readFileSync(configPath, 'utf8');
@@ -39,11 +79,23 @@ function updateConfig(targetDir, lang) {
39
79
  const multiMatch = content.match(/enableMultiLang:\s*(true|false)/);
40
80
  const multi = multiMatch ? multiMatch[1] === 'true' : false;
41
81
  content = content.replace(/showLangSwitcher:\s*(true|false)/, `showLangSwitcher: ${multi}`);
82
+
83
+ // Update repository URL if provided
84
+ if (repoUrl) {
85
+ content = content.replace(
86
+ /repository:\s*{[^}]*url:\s*'[^']*'/,
87
+ `repository: {\n url: '${repoUrl}'`
88
+ );
89
+ }
90
+
42
91
  writeFileSync(configPath, content);
43
92
  console.log(`Configured default language to ${lang}`);
93
+ if (repoUrl) {
94
+ console.log(`Configured repository URL to ${repoUrl}`);
95
+ }
44
96
  }
45
97
 
46
- export default async function init(targetName, langOption) {
98
+ export default async function init(targetName, langOption, repoOption) {
47
99
  const targetDir = targetName ? path.resolve(targetName) : process.cwd();
48
100
  const codes = getLanguageCodes();
49
101
  const lang = langOption && codes.includes(langOption) ? langOption : await promptLang(codes);
@@ -82,6 +134,9 @@ export default async function init(targetName, langOption) {
82
134
  ];
83
135
  items.forEach(copyItem);
84
136
 
137
+ const repoUrl = await getRepoUrl(targetDir, repoOption);
138
+ updateReadme(targetDir, repoUrl);
139
+
85
140
  // Create essential config files
86
141
  const gitignoreContent = `
87
142
  # Dependencies
@@ -122,7 +177,7 @@ dist/
122
177
  console.log('Created .prettierrc');
123
178
 
124
179
  execSync('npm install', { cwd: targetDir, stdio: 'inherit' });
125
- updateConfig(targetDir, lang);
180
+ updateConfig(targetDir, lang, repoUrl);
126
181
  }
127
182
 
128
183
  // Если скрипт запускается напрямую
@@ -130,13 +185,17 @@ if (import.meta.url === `file://${process.argv[1]}`) {
130
185
  const args = process.argv.slice(2);
131
186
  let targetName;
132
187
  let lang;
188
+ let repo;
133
189
  for (let i = 0; i < args.length; i++) {
134
190
  if (args[i] === '--lang' && i + 1 < args.length) {
135
191
  lang = args[i + 1];
136
192
  i++;
193
+ } else if (args[i] === '--repo' && i + 1 < args.length) {
194
+ repo = args[i + 1];
195
+ i++;
137
196
  } else {
138
197
  targetName = args[i];
139
198
  }
140
199
  }
141
- await init(targetName, lang);
142
- }
200
+ await init(targetName, lang, repo);
201
+ }
package/package.json CHANGED
@@ -2,11 +2,11 @@
2
2
  "name": "core-maugli",
3
3
  "description": "Astro & Tailwind CSS blog theme for Maugli.",
4
4
  "type": "module",
5
- "version": "1.1.8",
5
+ "version": "1.2.0",
6
6
  "license": "GPL-3.0-or-later OR Commercial",
7
7
  "repository": {
8
8
  "type": "git",
9
- "url": "git+https://github.com/dashapps/maugli-astro-theme.git"
9
+ "url": "git+https://github.com/dashapps/core-maugli-blog.git"
10
10
  },
11
11
  "author": "Maugli Content Farm",
12
12
  "keywords": [
@@ -57,7 +57,7 @@ if (!authorData) {
57
57
  authorId = defaultAuthorData.id;
58
58
  }
59
59
  let authorName = authorData.data.name;
60
- let authorImg = authorData.data.avatar || 'src/img/default/autor_default.webp';
60
+ let authorImg = authorData.data.avatar || '/img/default/autor_default.webp';
61
61
  ---
62
62
 
63
63
  <!-- Метаинформация сверху -->
@@ -46,7 +46,7 @@ const postCount = getPostsByAuthor(posts, slug).length;
46
46
  <div class="flex flex-row items-start gap-4">
47
47
  <!-- Аватар автора слева -->
48
48
  <Avatar
49
- src={avatar || maugliConfig.defaultAuthorImage || 'src/img/default/autor_default.webp'}
49
+ src={avatar || maugliConfig.defaultAuthorImage || '/img/default/autor_default.webp'}
50
50
  alt={name}
51
51
  size="clamp(70px, 15vw, 100px)"
52
52
  class="no-border"
@@ -13,7 +13,7 @@ const avatarSize = typeof size === 'number' ? `${size}px` : size;
13
13
  ---
14
14
 
15
15
  <div class:list={['avatar-container', className]} style={`width: ${avatarSize}; height: ${avatarSize};`}>
16
- <img src={src || 'src/img/default/autor_default.webp'} alt={alt} loading="lazy" class="w-full h-full object-cover" />
16
+ <img src={src || '/img/default/autor_default.webp'} alt={alt} loading="lazy" class="w-full h-full object-cover" />
17
17
  </div>
18
18
 
19
19
  <style>
@@ -0,0 +1,22 @@
1
+ ---
2
+ import { maugliConfig } from '../config/maugli.config.ts';
3
+
4
+ interface Props {
5
+ class?: string;
6
+ }
7
+
8
+ const { class: className } = Astro.props;
9
+
10
+ // Use repository URL from config, fallback to default
11
+ const repositoryUrl = maugliConfig.repository?.url || 'https://github.com/dashapps/core-maugli-blog';
12
+ const netlifyEnabled = maugliConfig.repository?.netlifyEnabled !== false;
13
+ const netlifyUrl = `https://app.netlify.com/start/deploy?repository=${repositoryUrl}`;
14
+ ---
15
+
16
+ {
17
+ netlifyEnabled && (
18
+ <a href={netlifyUrl} target="_blank" rel="noopener noreferrer" class={className}>
19
+ <img src="https://www.netlify.com/img/deploy/button.svg" alt="Deploy to Netlify" />
20
+ </a>
21
+ )
22
+ }
@@ -1,5 +1,5 @@
1
1
  // MAUGLI_CONFIG_VERSION — config version for CLI/automation compatibility
2
- export const MAUGLI_CONFIG_VERSION = '0.2';
2
+ export const MAUGLI_CONFIG_VERSION = '0.3';
3
3
  // Main configuration interface for the Maugli project
4
4
  export interface MaugliConfig {
5
5
  // Show example/demo content (for CLI/empty blog setup)
@@ -19,6 +19,11 @@ export interface MaugliConfig {
19
19
  farmProductIds?: string[]; // Array of farm product IDs for API
20
20
  farmProjectIds?: string[]; // Array of farm project/case IDs for API
21
21
  };
22
+ // Repository settings for deployment
23
+ repository?: {
24
+ url?: string; // User's repository URL for Netlify deployment button
25
+ netlifyEnabled?: boolean; // Enable Netlify deployment button (default: true)
26
+ };
22
27
  // Brand and logo settings
23
28
  brand: {
24
29
  name: string; // Brand name
@@ -111,6 +116,11 @@ export const maugliConfig: MaugliConfig = {
111
116
  farmProductIds: [], // Array of farm product IDs for API
112
117
  farmProjectIds: [], // Array of farm project/case IDs for API
113
118
  },
119
+ // Repository settings for deployment
120
+ repository: {
121
+ url: 'https://github.com/dashapps/core-maugli-blog', // User's repository URL for Netlify deployment button
122
+ netlifyEnabled: true, // Enable Netlify deployment button (default: true)
123
+ },
114
124
  enableThemeSwitcher: true, // Enable theme switcher (true by default)
115
125
  seo: {
116
126
  titleSuffix: ' — Maugli', // Suffix for page titles
@@ -152,11 +162,11 @@ export const maugliConfig: MaugliConfig = {
152
162
  }
153
163
  }
154
164
  },
155
- defaultBlogImage: 'src/assets/img/default/blog_default.webp', // Default blog image
156
- defaultProductImage: 'src/assets/img/default/product_default.webp', // Default product image
157
- defaultProjectImage: 'src/assets/img/default/project_default.webp', // Default project/case image
158
- defaultAuthorImage: 'src/assets/img/default/autor_default.webp', // Default author image
159
- defaultRubricImage: 'src/assets/img/default/rubric_default.webp', // Default rubric/category image
165
+ defaultBlogImage: '/img/default/blog_default.webp', // Default blog image
166
+ defaultProductImage: '/img/default/product_default.webp', // Default product image
167
+ defaultProjectImage: '/img/default/project_default.webp', // Default project/case image
168
+ defaultAuthorImage: '/img/default/autor_default.webp', // Default author image
169
+ defaultRubricImage: '/img/default/rubric_default.webp', // Default rubric/category image
160
170
  features: {
161
171
  enableSubscribe: true, // Enable subscribe block
162
172
  enableMultiLang: false, // Enable multilingual support
@@ -2,7 +2,7 @@
2
2
  name: 'Дарья Зорина'
3
3
  position: 'Founder, CEO'
4
4
  description: 'Основатель и креативный директор Maugli AI Editorial System. Эксперт в AI-контенте, GPT-SEO и многоканальных стратегиях'
5
- avatar: 'src/img/examples/authors/daria.webp'
5
+ avatar: '/img/examples/authors/daria.webp'
6
6
  socials:
7
7
  telegram: 'https://t.me/darrrina'
8
8
  linkedin: 'https://www.linkedin.com/in/dariazorina'
@@ -23,7 +23,7 @@ seo:
23
23
  - контент-стратегии
24
24
  - AI content
25
25
  image:
26
- src: 'src/img/examples/authors/daria.webp'
26
+ src: '/img/examples/authors/daria.webp'
27
27
  alt: 'Дарья Зорина'
28
28
  caption: 'Основатель и креативный директор Maugli AI Editorial System'
29
29
  jsonld:
@@ -32,7 +32,7 @@ jsonld:
32
32
  name: 'Дарья Зорина'
33
33
  jobTitle: 'Founder, CEO'
34
34
  url: 'https://maugli.cfd'
35
- image: 'src/img/examples/authors/daria.webp'
35
+ image: '/img/examples/authors/daria.webp'
36
36
  sameAs:
37
37
  - 'https://www.linkedin.com/in/dariazorina'
38
38
 
@@ -2,7 +2,7 @@
2
2
  name: 'Default Author'
3
3
  position: 'Editor-in-Chief'
4
4
  description: 'Default author and content editor for Maugli Blog. Used by default when no custom author is configured.'
5
- avatar: 'src/img/default/autor_default.webp'
5
+ avatar: '/img/default/autor_default.webp'
6
6
  socials:
7
7
  telegram: 'https://t.me/mauglibot'
8
8
  linkedin: 'https://www.linkedin.com/company/maugli'
@@ -21,7 +21,7 @@ seo:
21
21
  - AI content
22
22
  - SEO
23
23
  image:
24
- src: 'src/img/default/autor_default.webp'
24
+ src: '/img/default/autor_default.webp'
25
25
  alt: 'Default Author'
26
26
  caption: 'Default editor of Maugli Blog'
27
27
  jsonld:
@@ -30,7 +30,7 @@ jsonld:
30
30
  name: 'Default Author'
31
31
  jobTitle: 'Editor-in-Chief'
32
32
  url: 'https://maugli.cfd'
33
- image: 'src/img/default/autor_default.webp'
33
+ image: '/img/default/autor_default.webp'
34
34
  sameAs:
35
35
  - 'https://t.me/mauglibot'
36
36
  - 'https://www.linkedin.com/company/maugli'
@@ -2,7 +2,7 @@
2
2
  name: 'Игорь Соколов'
3
3
  position: 'Редактор'
4
4
  description: 'Редактор русской версии Maugli AI Editorial System. Пишет продуктовые статьи и экспертные материалы о нейросетях, GPT-SEO и автоматизации контента.'
5
- avatar: 'src/img/examples/authors/igor.webp'
5
+ avatar: '/img/examples/authors/igor.webp'
6
6
  socials:
7
7
  medium: 'https://medium.com/@igor.sokolov_7726'
8
8
  email: 'igor.sokolov@maugli.cfd'
@@ -15,7 +15,7 @@ seo:
15
15
  - аналитика
16
16
  - конверсии
17
17
  image:
18
- src: 'src/img/examples/authors/igor.webp'
18
+ src: '/img/examples/authors/igor.webp'
19
19
  alt: 'Игорь Соколов'
20
20
  caption: 'Редактор русской версии Maugli AI Editorial System'
21
21
  jsonld:
@@ -29,7 +29,7 @@ jsonld:
29
29
  '@type': 'Organization'
30
30
  name: 'Maugli AI Editorial System'
31
31
  url: 'https://maugli.cfd'
32
- image: 'src/img/examples/authors/igor.webp'
32
+ image: '/img/examples/authors/igor.webp'
33
33
  url: 'https://medium.com/@igor.sokolov_7726'
34
34
  sameAs:
35
35
  - 'mailto:igor.sokolov@maugli.cfd'
@@ -2,7 +2,7 @@
2
2
  name: 'John Walker'
3
3
  position: 'Editor'
4
4
  description: 'AI evangelist and content strategist with over 10 years of experience at the intersection of AI, content automation, and business strategy.'
5
- avatar: 'src/img/examples/authors/john.webp'
5
+ avatar: '/img/examples/authors/john.webp'
6
6
  socials:
7
7
  linkedin: 'https://www.linkedin.com/company/maugli-ai-editorial-system'
8
8
  medium: 'https://medium.com/@john.walker_90417'
@@ -16,7 +16,7 @@ seo:
16
16
  - GPT SEO
17
17
  - editorial strategy
18
18
  image:
19
- src: 'src/img/examples/authors/john.webp'
19
+ src: '/img/examples/authors/john.webp'
20
20
  alt: 'John Walker'
21
21
  caption: 'Editor at Maugli AI Editorial System'
22
22
  jsonld:
@@ -30,7 +30,7 @@ jsonld:
30
30
  '@type': 'Organization'
31
31
  name: 'Maugli AI Editorial System'
32
32
  url: 'https://maugli.cfd/en'
33
- image: 'src/img/examples/authors/john.webp'
33
+ image: '/img/examples/authors/john.webp'
34
34
  url: 'https://medium.com/@john.walker_90417'
35
35
  sameAs:
36
36
  - 'mailto:john.walker@maugli.cfd'
@@ -25,7 +25,7 @@ seo:
25
25
  - Maugli Editorial System
26
26
  - рекомендации нейросетей
27
27
  image:
28
- src: /src/assets/img/examples/blog/test-post.webp
28
+ src: /img/examples/blog/test-post.webp
29
29
  alt: JSON-LD в Maugli Editorial System
30
30
  width: '1200'
31
31
  height: '630'
@@ -84,7 +84,7 @@ jsonld:
84
84
  height: 200
85
85
  image:
86
86
  '@type': ImageObject
87
- url: src/assets/img/examples/blog/post_1_jsonld_guide.webp
87
+ url: /img/examples/blog/post_1_jsonld_guide.webp
88
88
  width: 1200
89
89
  height: 630
90
90
  caption: JSON-LD и AI-SEO
@@ -171,7 +171,7 @@ jsonld:
171
171
  height: 200
172
172
  image:
173
173
  '@type': ImageObject
174
- url: /post_1_jsonld_guide.webp
174
+ url: /img/examples/blog/post_1_jsonld_guide.webp
175
175
  width: 1200
176
176
  height: 630
177
177
  caption: JSON-LD и AI-SEO
@@ -8,7 +8,7 @@ tags:
8
8
  - Автоматизация бизнеса
9
9
  seo:
10
10
  image:
11
- src: /src/assets/img/examples/blog/post_1_jsonld_guide.webp
11
+ src: /img/examples/blog/post_1_jsonld_guide.webp
12
12
  alt: ТехРев и ИльичAI
13
13
  isExample: true
14
14
  ---
@@ -21,7 +21,7 @@ seo:
21
21
  - нейросети в предпринимательстве
22
22
  - освобождение от рутины
23
23
  image:
24
- src: /src/assets/img/examples/blog/post_11.webp
24
+ src: /img/examples/blog/post_11.webp
25
25
  alt: >-
26
26
  Автоматизация маркетинга: как ИИ освобождает предпринимателей от цифрового
27
27
  рабства
@@ -23,7 +23,7 @@ seo:
23
23
  - протокол MCP
24
24
  - интеграция нейросетей
25
25
  image:
26
- src: /src/assets/img/examples/blog/test-post.webp
26
+ src: /img/examples/blog/test-post.webp
27
27
  alt: 'Agent Experience и MCP: новый интерфейс бизнеса и нейросетей'
28
28
  width: '1200'
29
29
  height: '630'
@@ -13,7 +13,7 @@ tags:
13
13
  - автоматизация
14
14
  - тестирование
15
15
  image:
16
- src: /src/assets/img/examples/blog/post_12.webp
16
+ src: /img/examples/blog/post_12.webp
17
17
  alt: Революция контента в 2025 году
18
18
  seo:
19
19
  title: Тестовый пост - Революция контента в 2025 году | Maugli Content Farm
@@ -3,7 +3,7 @@
3
3
  title: "About the Blog"
4
4
  slug: "blog"
5
5
  image:
6
- src: "/src/assets/img/default/blog_default.webp"
6
+ src: "/img/default/blog_default.webp"
7
7
  seo:
8
8
  description: "Maugli Blog: automated content, AI, marketing, and strategies to get featured in AI recommendations."
9
9
  keywords: ["Maugli Editorial Platform", "AI content", "automation", "content marketing", "AI recommendations"]
@@ -6,7 +6,7 @@ updatedDate: 2025-07-10
6
6
  isFeatured: true
7
7
  tags: ['контент', 'редакция', 'автоматизация']
8
8
  image:
9
- src: 'src/assets/img/examples/products/product_1.webp'
9
+ src: '/img/examples/products/product_1.webp'
10
10
  alt: 'Maugli Content Farm'
11
11
  seo:
12
12
  title: 'Редакция Maugli — умная платформа для контента'
@@ -16,7 +16,7 @@ productLink: 'https://freeblog.maugli.ru'
16
16
  author: 'Редакция Maugli'
17
17
  publisher: 'Maugli'
18
18
  image:
19
- src: 'src/assets/img/examples/products/product_2.webp'
19
+ src: '/img/examples/products/product_2.webp'
20
20
  alt: 'Логотип Maugli Free Blog'
21
21
  width: '1200'
22
22
  height: '630'
@@ -48,7 +48,7 @@ jsonld:
48
48
  '@type': 'Product'
49
49
  'name': 'Maugli Free Blog'
50
50
  'description': 'Лёгкий блог-шаблон на Astro для SEO и GPT-индексации.'
51
- 'image': 'src/assets/img/examples/products/product_2.webp'
51
+ 'image': '/img/examples/products/product_2.webp'
52
52
  'brand':
53
53
  '@type': 'Organization'
54
54
  'name': 'Maugli'
@@ -22,7 +22,7 @@ generativeEngineOptimization:
22
22
  answer: 'Да, система создает контент в соответствии с заданной тональностью и может писать от лица конкретного персонажа.'
23
23
  seo:
24
24
  image:
25
- src: 'src/assets/img/examples/projects/project_1.webp'
25
+ src: '/img/examples/projects/project_1.webp'
26
26
  alt: Смотреть
27
27
  width: '1200'
28
28
  height: '630'
@@ -4,7 +4,7 @@ description: Описание второго проекта для тестир
4
4
  publishDate: '2025-06-01'
5
5
  seo:
6
6
  image:
7
- src: 'src/assets/img/examples/projects/project_2.webp'
7
+ src: '/img/examples/projects/project_2.webp'
8
8
  alt: Второй проект
9
9
  width: '1200'
10
10
  height: '630'
@@ -2,7 +2,7 @@
2
2
  title: AI в бизнесе
3
3
  description: "Обзоры технологий (LLM, GPT, Claude и др.). Кейсы применения AI в бизнесе. Тренды в автоматизации контента."
4
4
  image:
5
- src: src/img/default/rubric_default.webp
5
+ src: '/img/default/rubric_default.webp'
6
6
  alt: AI в бизнесе
7
7
  isRubric: true
8
8
  isFeatured: false
@@ -2,7 +2,7 @@
2
2
  title: Автоматизация бизнеса
3
3
  description: "Workflow и интеграции (Airtable, Supabase, автопостинг). AI-редакторы и сценарии. «Редакция без людей» — практика и инструменты."
4
4
  image:
5
- src: src/img/default/rubric_default.webp
5
+ src: '/img/default/rubric_default.webp'
6
6
  alt: Автоматизация бизнеса
7
7
  isRubric: true
8
8
  isFeatured: false
@@ -2,7 +2,7 @@
2
2
  title: Контент-стратегии
3
3
  description: "Как строить Content Market Fit. Мультиязычные блоги. Принципы работы AI-редакции."
4
4
  image:
5
- src: src/img/default/rubric_default.webp
5
+ src: '/img/default/rubric_default.webp'
6
6
  alt: Контент-стратегии
7
7
  isRubric: true
8
8
  isFeatured: false
@@ -2,7 +2,7 @@
2
2
  title: Growth & Marketing
3
3
  description: "Growth маркетинг и автоматизация воронок. Аналитика и конверсии. Лайфхаки по продвижению."
4
4
  image:
5
- src: src/img/default/rubric_default.webp
5
+ src: '/img/default/rubric_default.webp'
6
6
  alt: Growth & Marketing
7
7
  isRubric: true
8
8
  isFeatured: false
@@ -2,7 +2,7 @@
2
2
  title: Индустриальные обзоры
3
3
  description: "Новости AI и контентного рынка. Сравнения инструментов. Влияние AI на SEO и медиа."
4
4
  image:
5
- src: src/img/default/rubric_default.webp
5
+ src: '/img/default/rubric_default.webp'
6
6
  alt: Индустриальные обзоры
7
7
  isRubric: true
8
8
  isFeatured: false
@@ -2,7 +2,7 @@
2
2
  title: Интересное
3
3
  description: "Все, что может быть интересно бизнесу, но не относится к тематикам Maugli напрямую."
4
4
  image:
5
- src: src/img/default/rubric_default.webp
5
+ src: '/img/default/rubric_default.webp'
6
6
  alt: Интересное
7
7
  isRubric: true
8
8
  isFeatured: false
@@ -2,7 +2,7 @@
2
2
  title: SEO & AI SEO
3
3
  description: "GPT-SEO и AI-выдачи. JSON-LD и структурированные данные. Оптимизация под ChatGPT, Bing Copilot, Perplexity."
4
4
  image:
5
- src: src/img/default/rubric_default.webp
5
+ src: '/img/default/rubric_default.webp'
6
6
  alt: SEO & AI SEO
7
7
  isRubric: true
8
8
  isFeatured: false
@@ -71,7 +71,7 @@ const authorsDescription =
71
71
  <BaseLayout
72
72
  title={authorsTitle}
73
73
  description={authorsDescription}
74
- image={{ src: 'src/img/default/autor_default.webp', alt: 'Команда Maugli Content Farm' }}
74
+ image={{ src: '/img/default/autor_default.webp', alt: 'Команда Maugli Content Farm' }}
75
75
  showHeader={false}
76
76
  fullWidth={true}
77
77
  >
@@ -78,7 +78,7 @@ const pageTitle = seo?.title || `${name} - ${position} | Maugli Content Farm`;
78
78
  const pageDescription = seo?.description || description;
79
79
  ---
80
80
 
81
- <BaseLayout title={pageTitle} description={pageDescription} image={{ src: avatar || 'src/img/default/autor_default.webp', alt: `Фото ${name}` }} showHeader={false} fullWidth={true}>
81
+ <BaseLayout title={pageTitle} description={pageDescription} image={{ src: avatar || '/img/default/autor_default.webp', alt: `Фото ${name}` }} showHeader={false} fullWidth={true}>
82
82
  <div class="max-w-[1280px] mx-auto">
83
83
  <!-- Хлебные крошки -->
84
84
  <Breadcrumbs />
@@ -89,7 +89,7 @@ const pageDescription = seo?.description || description;
89
89
  <div class="flex flex-col sm:flex-row gap-6 sm:gap-8 items-start">
90
90
  <!-- Аватар -->
91
91
  <div class="w-32 h-32 sm:w-40 sm:h-40 bg-[var(--bg-main)] rounded-full overflow-hidden flex-shrink-0">
92
- <img src={avatar || 'src/img/default/autor_default.webp'} alt={`Фото ${name}`} class="w-full h-full object-cover" />
92
+ <img src={avatar || '/img/default/autor_default.webp'} alt={`Фото ${name}`} class="w-full h-full object-cover" />
93
93
  </div>
94
94
 
95
95
  <!-- Информация -->
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
File without changes
File without changes
File without changes