원클릭으로
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