diff --git a/README.md b/README.md index 9dce3e746..4bbd7ec0d 100644 --- a/README.md +++ b/README.md @@ -1,60 +1,173 @@ -# 🍥Fuwari +# Fuwari -A static blog template built with [Astro](https://astro.build). +一个基于 Astro 构建的现代化个人博客主题,专注于技术分享与实践。 -[**🖥️ Live Demo (Vercel)**](https://fuwari.vercel.app)   /    -[**📦 Old Hexo Version**](https://github.com/saicaca/hexo-theme-vivia)   /    +## ✨ 特性 +- 🚀 基于 Astro 4.0+ 构建,性能卓越 +- 📱 完全响应式设计,支持移动端 +- 🌙 支持深色/浅色主题切换 +- 📝 支持 Markdown 和 MDX 格式 +- 🔍 内置搜索功能 +- 📊 文章阅读时间统计 +- 🏷️ 标签和分类系统 +- 📈 SEO 优化 +- 🎨 可自定义配置 +- 💬 评论系统支持 +- 📡 RSS 订阅支持 -> README version: `2024-09-10` +## 🛠️ 技术栈 -![Preview Image](https://raw.githubusercontent.com/saicaca/resource/main/fuwari/home.png) +- **框架**: Astro +- **样式**: Tailwind CSS + Stylus +- **交互**: Svelte +- **构建工具**: Vite +- **包管理**: pnpm +- **代码规范**: Biome -## ✨ Features +## 🚀 快速开始 -- [x] Built with [Astro](https://astro.build) and [Tailwind CSS](https://tailwindcss.com) -- [x] Smooth animations and page transitions -- [x] Light / dark mode -- [x] Customizable theme colors & banner -- [x] Responsive design -- [ ] Comments -- [x] Search -- [ ] TOC +### 环境要求 -## 🚀 How to Use +- Node.js 18+ +- pnpm -1. [Generate a new repository](https://github.com/saicaca/fuwari/generate) from this template or fork this repository. -2. To edit your blog locally, clone your repository, run `pnpm install` AND `pnpm add sharp` to install dependencies. - - Install [pnpm](https://pnpm.io) `npm install -g pnpm` if you haven't. -3. Edit the config file `src/config.ts` to customize your blog. -4. Run `pnpm new-post ` to create a new post and edit it in `src/content/posts/`. -5. Deploy your blog to Vercel, Netlify, GitHub Pages, etc. following [the guides](https://docs.astro.build/en/guides/deploy/). You need to edit the site configuration in `astro.config.mjs` before deployment. +### 安装依赖 -## ⚙️ Frontmatter of Posts - -```yaml ---- -title: My First Blog Post -published: 2023-09-09 -description: This is the first post of my new Astro blog. -image: ./cover.jpg -tags: [Foo, Bar] -category: Front-end -draft: false -lang: jp # Set only if the post's language differs from the site's language in `config.ts` ---- +```bash +pnpm install ``` -## 🧞 Commands +### 开发模式 -All commands are run from the root of the project, from a terminal: +```bash +pnpm dev +``` -| Command | Action | -|:------------------------------------|:-------------------------------------------------| -| `pnpm install` AND `pnpm add sharp` | Installs dependencies | -| `pnpm dev` | Starts local dev server at `localhost:4321` | -| `pnpm build` | Build your production site to `./dist/` | -| `pnpm preview` | Preview your build locally, before deploying | -| `pnpm new-post ` | Create a new post | -| `pnpm astro ...` | Run CLI commands like `astro add`, `astro check` | -| `pnpm astro --help` | Get help using the Astro CLI | +### 构建生产版本 + +```bash +pnpm build +``` + +### 预览构建结果 + +```bash +pnpm preview +``` + +## 📝 使用指南 + +### 创建新文章 + +使用内置脚本快速创建新文章: + +```bash +pnpm new-post helloword +``` + +### 清理未使用的图片 + +清理 `src/content/assets` 目录下未被引用的图片文件: + +```bash +pnpm clean +``` + +### 配置博客 + +编辑 `src/config.ts` 文件来自定义博客配置: + +```typescript +export const siteConfig: SiteConfig = { + title: "Fuwari", + subtitle: "技术分享与实践", + lang: "zh_CN", + themeColor: { + hue: 250, + fixed: false, + }, + banner: { + enable: false, + src: "assets/images/demo-banner.png", + position: "center", + }, + favicon: [ + { + src: "/favicon/icon.png", + } + ] +} +``` + +### 文章格式 + +文章使用 Markdown 格式,支持 frontmatter: + +```markdown +--- +title: 文章标题 +published: 2024-01-01 +description: 文章描述 +image: ./cover.jpg +tags: [标签1, 标签2] +category: 分类 +draft: false +--- + +# 文章内容 + +这里是文章正文... +``` + +## 📁 项目结构 + +``` +├── public/ # 静态资源 +├── src/ +│ ├── components/ # 组件 +│ ├── content/ # 内容 +│ │ ├── posts/ # 博客文章 +│ │ └── assets/ # 资源文件 +│ ├── layouts/ # 布局 +│ ├── pages/ # 页面 +│ ├── styles/ # 样式 +│ └── config.ts # 配置文件 +├── scripts/ # 脚本工具 +└── package.json +``` + +## 🎨 自定义 + +### 主题颜色 + +在 `src/config.ts` 中修改 `themeColor` 配置: + +```typescript +themeColor: { + hue: 250, // 主色调 (0-360) + fixed: false, // 是否固定颜色 +} +``` + +### 样式定制 + +- 全局样式:`src/styles/main.css` +- Markdown 样式:`src/styles/markdown.css` +- 变量定义:`src/styles/variables.styl` + +## 📦 部署 + +构建后的静态文件位于 `dist/` 目录,可部署到任何静态托管平台。 + +## 🤝 贡献 + +欢迎提交 Issue 和 Pull Request! + +## 📄 许可证 + +[MIT License](LICENSE) + +## 🙏 致谢 + +感谢所有为这个项目做出贡献的开发者们!尤其感谢[上游仓库](https://github.com/saicaca/fuwari) \ No newline at end of file diff --git a/package.json b/package.json index 40afb85ca..73c637468 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "astro": "astro", "type-check": "tsc --noEmit --isolatedDeclarations", "new-post": "node scripts/new-post.js", + "clean": "node scripts/clean-unused-images.js", "format": "biome format --write ./src", "lint": "biome check --write ./src" }, @@ -37,6 +38,7 @@ "astro": "5.7.9", "astro-expressive-code": "^0.41.3", "astro-icon": "^1.1.5", + "glob": "^11.0.3", "hastscript": "^9.0.1", "katex": "^0.16.22", "markdown-it": "^14.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 96153b636..fdb8bb73f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -77,6 +77,9 @@ importers: astro-icon: specifier: ^1.1.5 version: 1.1.5 + glob: + specifier: ^11.0.3 + version: 11.0.3 hastscript: specifier: ^9.0.1 version: 9.0.1 @@ -1385,6 +1388,14 @@ packages: cpu: [x64] os: [win32] + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -2908,6 +2919,11 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@11.0.3: + resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} + engines: {node: 20 || >=22} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -3280,6 +3296,10 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} + jake@10.9.2: resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} engines: {node: '>=10'} @@ -3482,6 +3502,10 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.2.1: + resolution: {integrity: sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -3686,6 +3710,10 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -3973,6 +4001,10 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + path-to-regexp@6.1.0: resolution: {integrity: sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==} @@ -6745,6 +6777,12 @@ snapshots: '@img/sharp-win32-x64@0.34.1': optional: true + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -8523,6 +8561,15 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@11.0.3: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.0.3 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -8979,6 +9026,10 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jackspeak@4.1.1: + dependencies: + '@isaacs/cliui': 8.0.2 + jake@10.9.2: dependencies: async: 3.2.6 @@ -9132,6 +9183,8 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@11.2.1: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -9606,6 +9659,10 @@ snapshots: dependencies: mime-db: 1.52.0 + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -9877,6 +9934,11 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-scurry@2.0.0: + dependencies: + lru-cache: 11.2.1 + minipass: 7.1.2 + path-to-regexp@6.1.0: {} path-to-regexp@6.3.0: {} diff --git a/scripts/clean-unused-images.js b/scripts/clean-unused-images.js new file mode 100644 index 000000000..96a80a81c --- /dev/null +++ b/scripts/clean-unused-images.js @@ -0,0 +1,246 @@ +#!/usr/bin/env node + +import fs from 'fs'; +import path from 'path'; +import { glob } from 'glob'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +/** + * 清理未使用的图片资源脚本 + * 扫描 src/content/posts 下的所有 markdown 文件, + * 查找 src/content/assets 中未被引用的图片并删除 + */ + +const CONTENT_DIR = path.join(process.cwd(), 'src/content'); +const POSTS_DIR = path.join(CONTENT_DIR, 'posts'); +const ASSETS_DIR = path.join(CONTENT_DIR, 'assets'); + +// 支持的图片格式 +const IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg', '.avif']; + +/** + * 获取所有 markdown 文件 + */ +async function getAllMarkdownFiles() { + try { + const pattern = path.join(POSTS_DIR, '**/*.md').replace(/\\/g, '/'); + return await glob(pattern); + } catch (error) { + console.error('获取 markdown 文件失败:', error.message); + return []; + } +} + +/** + * 获取所有图片文件 + */ +async function getAllImageFiles() { + try { + const extensions = IMAGE_EXTENSIONS.join(','); + const pattern = path.join(ASSETS_DIR, `**/*{${extensions}}`).replace(/\\/g, '/'); + return await glob(pattern); + } catch (error) { + console.error('获取图片文件失败:', error.message); + return []; + } +} + +/** + * 从 markdown 内容中提取图片引用 + */ +function extractImageReferences(content) { + const references = new Set(); + + // 匹配 YAML frontmatter 中的 image 字段(支持带引号和不带引号的值) + const yamlImageRegex = /^---[\s\S]*?image:\s*(?:['"]([^'"]+)['"]|([^\s\n]+))[\s\S]*?^---/m; + let match = yamlImageRegex.exec(content); + if (match) { + // match[1] 是带引号的值,match[2] 是不带引号的值 + references.add(match[1] || match[2]); + } + + // 匹配 markdown 图片语法: ![alt](path) + const markdownImageRegex = /!\[.*?\]\(([^)]+)\)/g; + while ((match = markdownImageRegex.exec(content)) !== null) { + references.add(match[1]); + } + + // 匹配 HTML img 标签: + const htmlImageRegex = /]+src=["']([^"']+)["'][^>]*>/gi; + while ((match = htmlImageRegex.exec(content)) !== null) { + references.add(match[1]); + } + + // 匹配 Astro Image 组件引用 + const astroImageRegex = /import\s+.*?\s+from\s+["']([^"']+\.(jpg|jpeg|png|gif|webp|svg|avif))["']/gi; + while ((match = astroImageRegex.exec(content)) !== null) { + references.add(match[1]); + } + + return Array.from(references); +} + +/** + * 规范化路径,处理相对路径和绝对路径 + */ +function normalizePath(imagePath, markdownFilePath) { + // 跳过外部 URL + if (imagePath.startsWith('http://') || imagePath.startsWith('https://')) { + return null; + } + + // 跳过以 / 开头的绝对路径(通常指向 public 目录) + if (imagePath.startsWith('/')) { + return null; + } + + // 处理相对路径 + if (imagePath.startsWith('./') || imagePath.startsWith('../')) { + const markdownDir = path.dirname(markdownFilePath); + return path.resolve(markdownDir, imagePath); + } + + // 处理直接的文件名或相对路径 + const markdownDir = path.dirname(markdownFilePath); + return path.resolve(markdownDir, imagePath); +} + +/** + * 主函数 + */ +async function cleanUnusedImages() { + console.log('🔍 开始扫描未使用的图片资源...'); + + // 检查目录是否存在 + if (!fs.existsSync(POSTS_DIR)) { + console.error(`❌ Posts 目录不存在: ${POSTS_DIR}`); + return; + } + + if (!fs.existsSync(ASSETS_DIR)) { + console.log(`ℹ️ Assets 目录不存在: ${ASSETS_DIR}`); + return; + } + + // 获取所有文件 + const markdownFiles = await getAllMarkdownFiles(); + const imageFiles = await getAllImageFiles(); + + console.log(`📄 找到 ${markdownFiles.length} 个 markdown 文件`); + console.log(`🖼️ 找到 ${imageFiles.length} 个图片文件`); + + if (imageFiles.length === 0) { + console.log('✅ 没有找到图片文件,无需清理'); + return; + } + + // 收集所有被引用的图片 + const referencedImages = new Set(); + + for (const mdFile of markdownFiles) { + try { + const content = fs.readFileSync(mdFile, 'utf-8'); + const references = extractImageReferences(content); + + for (const ref of references) { + const normalizedPath = normalizePath(ref, mdFile); + if (normalizedPath) { + const resolvedPath = path.resolve(normalizedPath); + referencedImages.add(resolvedPath); + } + } + } catch (error) { + console.warn(`⚠️ 读取文件失败: ${mdFile} - ${error.message}`); + } + } + + console.log(`🔗 找到 ${referencedImages.size} 个被引用的图片`); + + // 找出未被引用的图片 + const unusedImages = []; + + for (const imageFile of imageFiles) { + const resolvedImagePath = path.resolve(imageFile); + const isReferenced = referencedImages.has(resolvedImagePath); + + if (!isReferenced) { + unusedImages.push(imageFile); + } + } + + console.log(`🗑️ 找到 ${unusedImages.length} 个未使用的图片`); + + if (unusedImages.length === 0) { + console.log('✅ 所有图片都在使用中,无需清理'); + return; + } + + // 删除未使用的图片 + let deletedCount = 0; + + for (const unusedImage of unusedImages) { + try { + fs.unlinkSync(unusedImage); + console.log(`🗑️ 已删除: ${path.relative(process.cwd(), unusedImage)}`); + deletedCount++; + } catch (error) { + console.error(`❌ 删除失败: ${unusedImage} - ${error.message}`); + } + } + + // 清理空目录 + try { + cleanEmptyDirectories(ASSETS_DIR); + } catch (error) { + console.warn(`⚠️ 清理空目录时出错: ${error.message}`); + } + + console.log(`\n✅ 清理完成!删除了 ${deletedCount} 个未使用的图片文件`); +} + +/** + * 递归清理空目录 + */ +function cleanEmptyDirectories(dir) { + if (!fs.existsSync(dir)) return; + + const files = fs.readdirSync(dir); + + if (files.length === 0) { + fs.rmdirSync(dir); + console.log(`🗑️ 已删除空目录: ${path.relative(process.cwd(), dir)}`); + return; + } + + for (const file of files) { + const filePath = path.join(dir, file); + if (fs.statSync(filePath).isDirectory()) { + cleanEmptyDirectories(filePath); + } + } + + // 再次检查目录是否为空 + const remainingFiles = fs.readdirSync(dir); + if (remainingFiles.length === 0) { + fs.rmdirSync(dir); + console.log(`🗑️ 已删除空目录: ${path.relative(process.cwd(), dir)}`); + } +} + +// 运行脚本 +// 检查是否直接运行此脚本 +const scriptPath = fileURLToPath(import.meta.url); +const isMainModule = process.argv[1] && path.resolve(process.argv[1]) === path.resolve(scriptPath); + +if (isMainModule) { + cleanUnusedImages().catch(error => { + console.error('❌ 脚本执行失败:', error.message); + console.error(error.stack); + process.exit(1); + }); +} + +export { cleanUnusedImages }; \ No newline at end of file diff --git a/src/content/assets/images/19a39c25-7dfc-4817-8fd0-379e7f6dd6c2.webp b/src/content/assets/images/19a39c25-7dfc-4817-8fd0-379e7f6dd6c2.webp deleted file mode 100644 index bc3b84386..000000000 Binary files a/src/content/assets/images/19a39c25-7dfc-4817-8fd0-379e7f6dd6c2.webp and /dev/null differ diff --git a/src/content/assets/images/2025-08-04-12-04-27-image.png b/src/content/assets/images/2025-08-04-12-04-27-image.png deleted file mode 100644 index 109791e3b..000000000 Binary files a/src/content/assets/images/2025-08-04-12-04-27-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-04-12-29-00-image.png b/src/content/assets/images/2025-08-04-12-29-00-image.png deleted file mode 100644 index c4f7f9c63..000000000 Binary files a/src/content/assets/images/2025-08-04-12-29-00-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-07-03-21-24-7e7ef9cfe96c44171c559f87978c04e5.jpg b/src/content/assets/images/2025-08-07-03-21-24-7e7ef9cfe96c44171c559f87978c04e5.jpg deleted file mode 100644 index 646b161c2..000000000 Binary files a/src/content/assets/images/2025-08-07-03-21-24-7e7ef9cfe96c44171c559f87978c04e5.jpg and /dev/null differ diff --git a/src/content/assets/images/2025-08-07-04-12-23-1b90d24d7612fd6c374f5d5f23c6ce41.jpg b/src/content/assets/images/2025-08-07-04-12-23-1b90d24d7612fd6c374f5d5f23c6ce41.jpg deleted file mode 100644 index 0c6683a6a..000000000 Binary files a/src/content/assets/images/2025-08-07-04-12-23-1b90d24d7612fd6c374f5d5f23c6ce41.jpg and /dev/null differ diff --git a/src/content/assets/images/2025-08-07-04-13-28-13b847d4e4e01c1780dbf18828172ebe_720.jpg b/src/content/assets/images/2025-08-07-04-13-28-13b847d4e4e01c1780dbf18828172ebe_720.jpg deleted file mode 100644 index 04efc64f5..000000000 Binary files a/src/content/assets/images/2025-08-07-04-13-28-13b847d4e4e01c1780dbf18828172ebe_720.jpg and /dev/null differ diff --git a/src/content/assets/images/2025-08-07-04-21-02-f921ca7da5b09069e14f3c8d84c4f288.png b/src/content/assets/images/2025-08-07-04-21-02-f921ca7da5b09069e14f3c8d84c4f288.png deleted file mode 100644 index 94c210000..000000000 Binary files a/src/content/assets/images/2025-08-07-04-21-02-f921ca7da5b09069e14f3c8d84c4f288.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-11-21-24-33-image.png b/src/content/assets/images/2025-08-11-21-24-33-image.png deleted file mode 100644 index 4a8176741..000000000 Binary files a/src/content/assets/images/2025-08-11-21-24-33-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-11-21-29-44-image.png b/src/content/assets/images/2025-08-11-21-29-44-image.png deleted file mode 100644 index 140566bbd..000000000 Binary files a/src/content/assets/images/2025-08-11-21-29-44-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-11-21-50-35-image.png b/src/content/assets/images/2025-08-11-21-50-35-image.png deleted file mode 100644 index 1f13c06a6..000000000 Binary files a/src/content/assets/images/2025-08-11-21-50-35-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-11-21-55-32-image.png b/src/content/assets/images/2025-08-11-21-55-32-image.png deleted file mode 100644 index 2d15e5efd..000000000 Binary files a/src/content/assets/images/2025-08-11-21-55-32-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-12-19-25-25-image.png b/src/content/assets/images/2025-08-12-19-25-25-image.png deleted file mode 100644 index ec7d712d9..000000000 Binary files a/src/content/assets/images/2025-08-12-19-25-25-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-13-18-51-49-image.png b/src/content/assets/images/2025-08-13-18-51-49-image.png deleted file mode 100644 index c8c353e96..000000000 Binary files a/src/content/assets/images/2025-08-13-18-51-49-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-13-22-19-51-3481f6426521084b7530d34dcb33d6ac.jpg b/src/content/assets/images/2025-08-13-22-19-51-3481f6426521084b7530d34dcb33d6ac.jpg deleted file mode 100644 index 52364eb5a..000000000 Binary files a/src/content/assets/images/2025-08-13-22-19-51-3481f6426521084b7530d34dcb33d6ac.jpg and /dev/null differ diff --git a/src/content/assets/images/2025-08-18-22-44-04-image.png b/src/content/assets/images/2025-08-18-22-44-04-image.png deleted file mode 100644 index 7350cd530..000000000 Binary files a/src/content/assets/images/2025-08-18-22-44-04-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-18-22-46-23-9815172ea70ca4afa6e6b9258a421a50.png b/src/content/assets/images/2025-08-18-22-46-23-9815172ea70ca4afa6e6b9258a421a50.png deleted file mode 100644 index bdb140714..000000000 Binary files a/src/content/assets/images/2025-08-18-22-46-23-9815172ea70ca4afa6e6b9258a421a50.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-18-22-46-34-042f8144edbd91ffff2bca438dd52c6e.png b/src/content/assets/images/2025-08-18-22-46-34-042f8144edbd91ffff2bca438dd52c6e.png deleted file mode 100644 index 1783a0d35..000000000 Binary files a/src/content/assets/images/2025-08-18-22-46-34-042f8144edbd91ffff2bca438dd52c6e.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-18-22-49-15-image.png b/src/content/assets/images/2025-08-18-22-49-15-image.png deleted file mode 100644 index fe6427e9f..000000000 Binary files a/src/content/assets/images/2025-08-18-22-49-15-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-18-22-49-50-image.png b/src/content/assets/images/2025-08-18-22-49-50-image.png deleted file mode 100644 index 4eb40aa35..000000000 Binary files a/src/content/assets/images/2025-08-18-22-49-50-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-18-22-50-07-image.png b/src/content/assets/images/2025-08-18-22-50-07-image.png deleted file mode 100644 index 4eb40aa35..000000000 Binary files a/src/content/assets/images/2025-08-18-22-50-07-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-18-22-51-53-image.png b/src/content/assets/images/2025-08-18-22-51-53-image.png deleted file mode 100644 index 507a97bc1..000000000 Binary files a/src/content/assets/images/2025-08-18-22-51-53-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-18-22-52-35-image.png b/src/content/assets/images/2025-08-18-22-52-35-image.png deleted file mode 100644 index a01c88f29..000000000 Binary files a/src/content/assets/images/2025-08-18-22-52-35-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-18-22-52-57-image.png b/src/content/assets/images/2025-08-18-22-52-57-image.png deleted file mode 100644 index fa7a5a11e..000000000 Binary files a/src/content/assets/images/2025-08-18-22-52-57-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-18-22-53-31-image.png b/src/content/assets/images/2025-08-18-22-53-31-image.png deleted file mode 100644 index ecb41adea..000000000 Binary files a/src/content/assets/images/2025-08-18-22-53-31-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-18-22-54-38-image.png b/src/content/assets/images/2025-08-18-22-54-38-image.png deleted file mode 100644 index 28145a205..000000000 Binary files a/src/content/assets/images/2025-08-18-22-54-38-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-24-01-19-31-image.png b/src/content/assets/images/2025-08-24-01-19-31-image.png deleted file mode 100644 index 2f7487e43..000000000 Binary files a/src/content/assets/images/2025-08-24-01-19-31-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-28-10-18-51-image.png b/src/content/assets/images/2025-08-28-10-18-51-image.png deleted file mode 100644 index c61f0bad3..000000000 Binary files a/src/content/assets/images/2025-08-28-10-18-51-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-28-10-24-07-image.png b/src/content/assets/images/2025-08-28-10-24-07-image.png deleted file mode 100644 index 9164e7684..000000000 Binary files a/src/content/assets/images/2025-08-28-10-24-07-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-28-10-24-41-image.png b/src/content/assets/images/2025-08-28-10-24-41-image.png deleted file mode 100644 index a28f9c047..000000000 Binary files a/src/content/assets/images/2025-08-28-10-24-41-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-28-10-28-03-image.png b/src/content/assets/images/2025-08-28-10-28-03-image.png deleted file mode 100644 index 26008dbb0..000000000 Binary files a/src/content/assets/images/2025-08-28-10-28-03-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-28-18-54-49-image.png b/src/content/assets/images/2025-08-28-18-54-49-image.png deleted file mode 100644 index e9c021c2e..000000000 Binary files a/src/content/assets/images/2025-08-28-18-54-49-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-28-18-55-04-image.png b/src/content/assets/images/2025-08-28-18-55-04-image.png deleted file mode 100644 index 702f80f3d..000000000 Binary files a/src/content/assets/images/2025-08-28-18-55-04-image.png and /dev/null differ diff --git a/src/content/assets/images/2025-08-30-20-46-15-image.png b/src/content/assets/images/2025-08-30-20-46-15-image.png deleted file mode 100644 index 5c02657fd..000000000 Binary files a/src/content/assets/images/2025-08-30-20-46-15-image.png and /dev/null differ diff --git a/src/content/assets/images/483f87e6-4a78-4c88-a889-04b63363cf04.webp b/src/content/assets/images/483f87e6-4a78-4c88-a889-04b63363cf04.webp deleted file mode 100644 index 271a19fa8..000000000 Binary files a/src/content/assets/images/483f87e6-4a78-4c88-a889-04b63363cf04.webp and /dev/null differ diff --git a/src/content/assets/images/8e580f70-d291-4755-b52e-319ba3b9618f.webp b/src/content/assets/images/8e580f70-d291-4755-b52e-319ba3b9618f.webp deleted file mode 100644 index 1fb17dbb5..000000000 Binary files a/src/content/assets/images/8e580f70-d291-4755-b52e-319ba3b9618f.webp and /dev/null differ diff --git a/src/content/assets/images/bc4981b2-5343-46d6-a428-94d7ae7af4e1.webp b/src/content/assets/images/bc4981b2-5343-46d6-a428-94d7ae7af4e1.webp deleted file mode 100644 index c706dc0d9..000000000 Binary files a/src/content/assets/images/bc4981b2-5343-46d6-a428-94d7ae7af4e1.webp and /dev/null differ