ワンクリックで
data-files
Static data - contact.ts, projects.ts, sidebar-items.ts. Use when displaying contact/projects info or adding navigation items.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Static data - contact.ts, projects.ts, sidebar-items.ts. Use when displaying contact/projects info or adding navigation items.
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.
Create/edit blog articles in EN/ES - frontmatter, collections, images, Markdown features. Use when writing content under content/{en,es}/blog/.
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.
GSAP + ScrollTrigger - animateInOnEnter, getMainScroller, useGsapAnimations. Use when adding enter/scroll animations.
| name | data-files |
| description | Static data - contact.ts, projects.ts, sidebar-items.ts. Use when displaying contact/projects info or adding navigation items. |
Static TypeScript data for contact, projects and navigation.
app/data/contact.ts - owner contact informationapp/data/projects.ts - array of projects with translationsapp/data/sidebar-items.ts - sidebar navigation itemsimport { contactInfo } from '~/data/contact'
// Available fields
contactInfo.name // string
contactInfo.title // 'Full Stack Developer'
contactInfo.location // 'San Salvador, El Salvador'
contactInfo.city // 'San Salvador'
contactInfo.country // 'El Salvador'
contactInfo.countryCode // 'SV'
contactInfo.email // 'david@deras.dev'
contactInfo.siteUrl // 'https://deras.dev' (or NUXT_PUBLIC_SITE_URL)
contactInfo.socials.github // 'https://github.com/daiv05'
contactInfo.socials.linkedin // 'https://linkedin.com/in/dderas'
contactInfo.socials.twitter // 'https://twitter.com/daiv_09'
Do not hardcode these values in components; always import from this file.
import { sidebarItems, type SidebarItem } from '~/data/sidebar-items'
interface SidebarItem {
titleKey: string // i18n key, e.g. 'navigation.items.home'
value: string // unique identifier, e.g. 'home'
icon: string // SVG path from @mdi/js
to: string // route without localePath (applied in the layout)
openInNewTab?: boolean
}
| value | to | titleKey |
|---|---|---|
home | / | navigation.items.home |
about | /about | navigation.items.about |
projects | /projects | navigation.items.projects |
blog | /blog | navigation.items.blog |
resources | /resources | navigation.items.resources |
// 1. In sidebar-items.ts:
import { mdiNewIcon } from '@mdi/js'
{ titleKey: 'navigation.items.new', value: 'new', icon: mdiNewIcon, to: '/new' }
// 2. In app/locales/en.json and es.json → navigation.items.new: "..."
import { projects } from '~/data/projects'
// Structure (with en/es translations)
interface Project {
id: string
title: string
description: { en: string; es: string }
tags: string[]
url?: string
github?: string
image?: string
featured?: boolean
}
To display with the current locale:
const { locale } = useI18n()
const description = project.description[locale.value as 'en' | 'es']
contact.tssidebar-items.ts without adding the corresponding i18n key in both localesprojects.ts is static; do not use useBlog() for projects