一键导入
blog-content
Create/edit blog articles in EN/ES - frontmatter, collections, images, Markdown features. Use when writing content under content/{en,es}/blog/.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Create/edit blog articles in EN/ES - frontmatter, collections, images, Markdown features. Use when writing content under content/{en,es}/blog/.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Global Pinia store (useAppStore) for theme and language with cookie persistence. Use when changing theme or language, or touching app/stores/app.ts.
Auto-imported global and content components plus layouts (default/blog). Use when using/creating components or working with ContentRenderer.
Project composables - useBlog, usePageSeo, useEnterAnimations, useBlogScroll, useGsapAnimations. Use when consuming blog/SEO/animation logic.
CSS custom properties, utility classes and theme colors. Use when editing styles, working in app/assets/styles/*, writing <style scoped>, or touching colors, spacing or typography.
Static data - contact.ts, projects.ts, sidebar-items.ts. Use when displaying contact/projects info or adding navigation items.
GSAP + ScrollTrigger - animateInOnEnter, getMainScroller, useGsapAnimations. Use when adding enter/scroll animations.
| name | blog-content |
| description | Create/edit blog articles in EN/ES - frontmatter, collections, images, Markdown features. Use when writing content under content/{en,es}/blog/. |
Create and edit blog articles in both languages (EN and ES).
content/en/blog/*.md - articles in Englishcontent/es/blog/*.md - articles in Spanishcontent.config.ts - collections and schema (Zod)public/blog/[slug]/shared/*.webp - article images---
id: "my-article" # recommended, same as the slug
title: "My article" # REQUIRED
slug: "my-article" # recommended; MUST be the same in EN and ES
order: 5 # optional; higher number = appears earlier in the list
date: 2026-01-15 # REQUIRED, YYYY-MM-DD format
lastmod: 2026-01-20 # optional, last modified date
author: David Deras # optional
tags: # optional
- Vue
- TypeScript
summary: "Short summary" # optional, used in cards and SEO
image: /blog/my-article/shared/cover.webp # optional
sitemap: # optional
priority: 0.7
loc: /blog/my-article # /es/blog/my-article for ES
lastmod: 2026-01-20
---
| Field | Type | Required |
|---|---|---|
title | string | Yes |
date | string (YYYY-MM-DD) | Yes |
id | string | No (recommended) |
slug | string | No (recommended) |
order | number | No |
lastmod | string | No |
author | string | No |
tags | string[] | No |
summary | string | No |
image | string (/public path) | No |
sitemap | object | No |
order: sorts by order descending (higher number = more recent)order: sorts by date descending---
[frontmatter]
---
Short intro paragraph.
::table-of-contents
::
---
## Section 1
Content...
## Section 2
More content...
public/blog/[slug]/
├── shared/ # shared EN/ES images (most cases)
│ └── cover.webp
├── en/ # EN-specific images (only if they differ)
└── es/ # ES-specific images (only if they differ)
.webp format mandatoryimage: /blog/my-article/shared/cover.webpcontent_en - source: en/**/*.md, path prefix: /blogcontent_es - source: es/**/*.md, path prefix: /blogqueryCollection() directly in pages; use useBlog() (see the composables skill)# Automatic table of contents
::table-of-contents
::
# Math formulas (KaTeX)
$$E = mc^2$$
Inline: $\alpha + \beta = \gamma$
# Mermaid diagram
::mermaid-diagram{content="graph TD; A-->B"}
::
# Code tabs
:code-group
```ts [TypeScript]
const x: number = 1
const x = 1
::
## Conventions
- The `slug` must be **identical** in `content/en/blog/` and `content/es/blog/`
- `.md` file name = slug (e.g. `my-article.md`)
- ES articles are translations of the same EN content (same slug = same post)
- External links: `[text](url){target="_blank" rel="noopener noreferrer"}`
## Restrictions
- Do not change the slug between EN and ES - it breaks `findEquivalentPost()` on language switch
- Images must exist in `/public` before the build (static prerendering)
- Do not use `queryCollection()` directly in pages; always go through `useBlog()`