테마 컴포넌트 시스템 · 신규 리소스

Nuxt UI 디자인 시스템.

실제 Vue 컴포넌트, 의미에 맞는 테마 참조, 입력 유효성 검사, 명확한 로컬 임시 저장 동작을 갖춘 완전한 Nuxt UI 4.11.3 브리프 작성기를 만드세요.

OpenDesign 가이드8개 챕터참고 항목 37개독자적 적용 가이드
01

Nuxt UI 디자인 시스템 인터페이스 미리보기

완성된 샘플 입력을 수정하고, 체크리스트를 선택한 다음 유효성 검사와 초기화 동작을 확인하세요.

읽기 쉬운 로컬 프로젝트 개요 작성전체 예시 열기
Nuxt UI 4.11.3 기본 Vue 컴포넌트와 공식 Vite/Vue 플러그인, 오리지널 로컬 상태. · 구현 레퍼런스
02

Nuxt UI 디자인 시스템 디자인 참고 자료

Nuxt UI 4.11.3 기본값, 실제 컴파일된 의미 기반 CSS 및 기본 Vue 컴포넌트 계약입니다. 오리지널 레이아웃과 유효성 검사 방식은 별도로 표시했습니다.

기본 의미 색상 별칭

출처
이름 / 규칙값 / 구성용도
primarygreen실제 Nuxt UI 4.11.3 기본 별칭입니다. 컴포넌트 색상 속성은 의미 이름을 참조하고, 설정된 팔레트가 해당 색상 값을 제공합니다.
secondaryblue실제 Nuxt UI 4.11.3 기본 별칭입니다. 컴포넌트 색상 속성은 의미 이름을 참조하고, 설정된 팔레트가 해당 색상 값을 제공합니다.
successgreen실제 Nuxt UI 4.11.3 기본 별칭입니다. 컴포넌트 색상 속성은 의미 이름을 참조하고, 설정된 팔레트가 해당 색상 값을 제공합니다.
infoblue실제 Nuxt UI 4.11.3 기본 별칭입니다. 컴포넌트 색상 속성은 의미 이름을 참조하고, 설정된 팔레트가 해당 색상 값을 제공합니다.
warningyellow실제 Nuxt UI 4.11.3 기본 별칭입니다. 컴포넌트 색상 속성은 의미 이름을 참조하고, 설정된 팔레트가 해당 색상 값을 제공합니다.
errorred실제 Nuxt UI 4.11.3 기본 별칭입니다. 컴포넌트 색상 속성은 의미 이름을 참조하고, 설정된 팔레트가 해당 색상 값을 제공합니다.
neutralslate실제 Nuxt UI 4.11.3 기본 별칭입니다. 컴포넌트 색상 속성은 의미 이름을 참조하고, 설정된 팔레트가 해당 색상 값을 제공합니다.

밝은 테마의 텍스트 역할

출처
이름 / 규칙값 / 구성용도
--ui-text-dimmedvar(--ui-color-neutral-400)강조가 가장 낮은 보조 텍스트입니다. 필수 필드 레이블이나 유효성 검사 메시지에는 이 역할을 사용하지 마세요.
--ui-text-mutedvar(--ui-color-neutral-500)필드 힌트와 미리보기 소개 문단 등 보조 설명에 사용합니다.
--ui-text-tonedvar(--ui-color-neutral-600)보조 읽기 위계에 사용합니다. 대비를 더 낮추기 전에 일반 텍스트 역할과 비교하세요.
--ui-textvar(--ui-color-neutral-700)주요 읽기 흐름과 사용자가 입력한 콘텐츠에 적용되는 기본 텍스트 역할입니다.
--ui-text-highlightedvar(--ui-color-neutral-900)미리보기의 주요 제목을 비롯해 강조도가 높은 제목과 전경 요소에 사용합니다.
--ui-text-inverted#fff반전된 어두운 표면에 사용할 전경색입니다. 모든 강조 색상에 흰색 텍스트를 적용하는 범용 재정의가 아닙니다.

밝은 표면 및 테두리

출처
이름 / 규칙값 / 구성용도
--ui-bg#fff완성된 작성기의 기본 캔버스 및 밝은 카드 표면입니다.
--ui-bg-mutedvar(--ui-color-neutral-50)밝은 테마의 보조 영역에 사용하는 절제된 보조 표면입니다.
--ui-bg-elevatedvar(--ui-color-neutral-100)흰색 캔버스와 대비를 더 높이는 표면으로, 돌출되거나 강조된 보조 표면에 사용합니다.
--ui-bg-accentedvar(--ui-color-neutral-200)중립적인 배경을 더 뚜렷하게 표현합니다. 이 배경 위에서도 필드 값이 잘 읽히도록 하세요.
--ui-bg-invertedvar(--ui-color-neutral-900)반전된 전경 역할과 함께 사용하는 어두운 중립 표면입니다.
--ui-bordervar(--ui-color-neutral-200)필드와 카드 윤곽선에 적용되는 기본 중립 구분선입니다.
--ui-border-mutedvar(--ui-color-neutral-200)강한 섹션 경계가 아닌, 관련 블록 사이의 낮은 강조도 구분선입니다.
--ui-border-accentedvar(--ui-color-neutral-300)기본 테두리만으로 구분이 충분하지 않을 때 사용하는 더 뚜렷한 중립 윤곽선입니다.
--ui-border-invertedvar(--ui-color-neutral-900)반전된 표면에 사용하는 테두리 역할입니다. 지정된 배경과 함께 적용하세요.

공통 형태 및 Tailwind 타이포그래피

출처
이름 / 규칙값 / 구성용도
--ui-radius.25rem실제 컴파일된 결과물에 포함된 공개 Nuxt UI 또는 Tailwind 기본값입니다. 오리지널 레이아웃에는 최대 너비 1100px와 간격 24px를 사용합니다.
--ui-container80rem실제 컴파일된 결과물에 포함된 공개 Nuxt UI 또는 Tailwind 기본값입니다. 오리지널 레이아웃에는 최대 너비 1100px와 간격 24px를 사용합니다.
--spacing.25rem실제 컴파일된 결과물에 포함된 공개 Nuxt UI 또는 Tailwind 기본값입니다. 오리지널 레이아웃에는 최대 너비 1100px와 간격 24px를 사용합니다.
--text-sm.875rem실제 컴파일된 결과물에 포함된 공개 Nuxt UI 또는 Tailwind 기본값입니다. 오리지널 레이아웃에는 최대 너비 1100px와 간격 24px를 사용합니다.
--text-xl1.25rem실제 컴파일된 결과물에 포함된 공개 Nuxt UI 또는 Tailwind 기본값입니다. 오리지널 레이아웃에는 최대 너비 1100px와 간격 24px를 사용합니다.
--text-4xl2.25rem실제 컴파일된 결과물에 포함된 공개 Nuxt UI 또는 Tailwind 기본값입니다. 오리지널 레이아웃에는 최대 너비 1100px와 간격 24px를 사용합니다.

Vue 컴포넌트 계약

출처
이름 / 규칙값 / 구성용도
Vite pluginui({ colorMode: false })컴포넌트 및 테마 가져오기와 필수 브라우저 통합을 설정합니다.
Vue plugincreateApp(App).use(ui)ui를 @nuxt/ui/vue-plugin에서 가져오세요. 컴포넌트만 직접 가져와서는 독립형 설정을 완성할 수 없습니다.
UAppApplication wrapper컴포넌트 트리에 기본 앱 컨텍스트를 제공합니다.
UFormFieldlabel, description, name필드 컨텍스트와 읽기 쉬운 보조 텍스트를 컨트롤에 연결합니다.
UInput / UTextareav-model두 입력 모두 Vue ref로 제어됩니다. 텍스트 영역에는 자동 크기 조절과 행 설정도 적용됩니다.
USwitchv-model + label체크리스트 선택 여부는 실제 boolean 상태로 관리됩니다.
UButton@click / color / variant기본 구성과 중립 윤곽선의 복구 동작에 기본 변형을 사용합니다.
UCardheader slot + default body필드 콘텐츠와 읽기 쉬운 결과를 동일한 기본 표면에 표시합니다.
UBadgecolor + variant="subtle"텍스트와 모양으로 대기 상태와 로컬에서 작성된 결과를 구분합니다.
03

Nuxt UI 디자인 시스템 종합 가이드

실제 인터페이스를 위해 이 시스템을 선택하고 적용하고 검토하는 실용 가이드.

DESIGN-nuxt-ui.md

완전한 안내와 구현 시작점, 소스 링크.

가이드 다운로드

Nuxt UI 디자인 시스템 독립형 Vue 런타임

공식 Vue 통합 경로 사용

이 연구는 Vite를 사용하는 Vue 3에서 @nuxt/ui 4.11.3을 실행합니다. Nuxt 서버 렌더링 애플리케이션이 아닙니다. Vite 플러그인은 생성된 UI 템플릿, 자동 컴포넌트 가져오기 및 프레임워크 별칭을 처리하고, Vue 플러그인은 필수 런타임 통합을 등록합니다. 패키지만 설치한 뒤 #build 또는 #imports를 찾지 못하는 잘못된 설정을 방지하도록 두 플러그인을 모두 포함한 완성된 예제를 제공합니다.

이 OpenDesign 가이드에서
  • @nuxt/ui/vite는 빌드 시 통합 기능을 제공합니다.
  • @nuxt/ui/vue-plugin은 런타임 등록을 제공합니다.
  • UApp이 기본 컴포넌트 트리를 감쌉니다.

앱 래퍼와 스타일시트 유지

UApp이 구성을 감쌉니다. 스타일시트는 Tailwind CSS와 @nuxt/ui를 가져오며, 앱을 마운트하기 전에 메인 엔트리에서 해당 스타일시트를 가져옵니다. 빌드 결과물에는 카드와 스위치를 정적으로 흉내 낸 것이 아니라 실제 컴포넌트 CSS와 동작이 포함됩니다. 라이브러리를 살펴볼 수 있는 구체적인 브라우저 설정입니다. Nuxt 애플리케이션에서는 해당 애플리케이션에 맞는 문서화된 모듈 설정을 사용해야 합니다.

Nuxt UI 디자인 시스템의 의미 기반 색상 및 컴포넌트 변형

복사한 녹색 대신 의미 기반 색상을 사용하세요.

기본 구성에서는 primary와 success에 초록색, secondary와 info에 파란색, warning에 노란색, error에 빨간색, neutral에 슬레이트색을 매핑합니다. 네이티브 컴포넌트는 색상 props를 통해 이러한 별칭을 사용합니다. 따라서 기본 작성 버튼과 중립색 아웃라인 초기화 버튼은 Nuxt UI 기본값이라고 잘못 설명되는 사용자 지정 팔레트를 도입하지 않고도 서로 다른 동작 역할을 나타냅니다.

스타일 적용 범위를 명확히 하세요

이 라이트 모드 전용 예제에서는 Vite 플러그인의 colorMode:false로 설정합니다. 참조 표에는 이에 해당하는 라이트 모드 텍스트, 표면, 테두리 선언이 나와 있습니다. 이 값이 다크 테마에도 그대로 적용된다고 주장하지 않습니다. 제품에 색상 모드를 추가하려면 선택한 통합 방식을 활성화하고 컨트롤, 표면, 저장된 환경설정을 함께 확인해야 합니다.

Nuxt UI 디자인 시스템의 텍스트 역할, 표면, 기하 구조

의미에 따른 CSS 관계를 살펴보세요

보조 문구는 --ui-text-muted를 사용하며, 이 변수는 neutral-500을 참조합니다. 기본 제목은 --ui-text-highlighted를 사용하며, 이 변수는 neutral-900을 참조합니다. 표면 및 테두리 변수도 마찬가지로 설정된 neutral 스케일을 참조합니다. 가이드에서는 이러한 관계를 유지하고, 관련 없는 몇 가지 16진수 값으로 단순화하지 않습니다. 따라서 neutral 팔레트를 변경해도 컴포넌트 테마의 일관성을 유지할 수 있습니다.

공통 기본값과 페이지별 결정을 구분하세요

이 버전에서 공통 --ui-radius는 .25rem이고 --ui-container는 80rem입니다. 반면 원래 브리프 레이아웃에서는 바깥쪽 최대 너비를 1100px, 두 열 사이 간격을 24px로 지정하고 700px 미만에서는 한 열로 표시합니다. 제목과 보조 문구의 크기는 Tailwind의 실제 텍스트 역할을 따릅니다. 이러한 페이지별 결정은 제공된 CSS에 명시되어 있으며, 라이브러리 전체에 적용되는 요구사항을 임의로 만들어 낸 것이 아닙니다.

Nuxt UI 디자인 시스템의 입력 필드 구성 및 로컬 검증

모든 입력 필드에 실제 필드 맥락을 제공하세요

UFormField는 UInput 또는 UTextarea를 감싸 표시되는 레이블과 name을 제공합니다. 컨텍스트 필드에는 앞뒤 공백을 제거한 내용을 기준으로 계산되는 단어 수도 표시됩니다. 두 컨트롤 모두 v-model을 사용하므로 화면에 보이는 값과 작성 핸들러가 같은 refs를 읽습니다. 텍스트 영역에는 적절한 초기 행 수와 자동 크기 조정 기능이 있어 긴 사용자 입력도 잘린 고정 상자에 갇히지 않고 확장되어 표시됩니다.

작성하기 전에 검증하세요

Nuxt UI 디자인 시스템의 파생 초안 및 오래된 상태 방지

입력된 텍스트만 조합하세요

출력은 제공된 제목과 컨텍스트에 선택 항목인 고정 공유 체크리스트를 결합합니다. 결과는 AI 응답이 아니라 로컬 초안임을 분명히 알립니다. 모델 호출, 대기 시간, 임의로 생성한 콘텐츠는 없습니다. 선택 가능한 체크리스트는 네이티브 USwitch 불리언 값으로 제어되며, 조합된 텍스트에는 해당 선택이 그대로 반영됩니다.

입력이 바뀌면 이전 결과를 지우세요

제목, 컨텍스트, 체크리스트를 감시하는 Vue watch는 편집이 발생할 때마다 이전에 조합한 결과를 제거합니다. 그러면 상태 배지가 다시 Waiting for your text를 표시합니다. 이 동작은 사용자가 새 입력을 편집하는 동안 오래된 초안이 최신 결과처럼 보이지 않도록 합니다. 단어 수는 computed 값으로 유지되므로 현재 컨텍스트와 어긋나지 않습니다.

Nuxt UI 디자인 시스템의 완전한 빈 상태 및 초기화 상태

대기 패널을 유용하게 구성하세요

작성 전 오른쪽 카드에는 표시될 내용과 편집, 개인정보 보호, 초기화 동작에 대한 자세한 설명이 들어 있습니다. 비어 있는 콘텐츠 영역이 아닙니다. 작성한 뒤에는 해당 영역에 줄바꿈과 자동 줄바꿈이 유지된 읽기 쉬운 전체 초안이 표시됩니다. 상태 배지도 텍스트로 상태를 알려 주므로 색상만으로 상태를 전달하지 않습니다.

초기화하면 샘플 입력을 모두 복원하세요

샘플 초기화는 원래 제목과 전체 컨텍스트를 복원하고 체크리스트를 활성화하며, 결과와 오류를 지웁니다. 독자가 어떤 내용을 입력해야 하는지 추측하게 만드는 빈 시연 상태를 남기지 않습니다. 브라우저 검사에서는 브리프를 수정해 작성한 다음 초기화 후 전체 샘플 제목이 돌아오는지 확인합니다.

Nuxt UI 디자인 시스템의 반응형 카드 및 텍스트 흐름

좁은 화면에서도 결과를 읽기 쉽게 유지하세요

700px 미만에서는 카드 두 개가 한 열로 바뀌고 모든 입력 필드가 가용 너비를 사용합니다. 초안에는 줄바꿈할 수 없는 사전 서식 텍스트 대신 pre-wrap을 적용하므로 긴 제목이나 문장도 자연스럽게 줄바꿈됩니다. 버튼은 동작 그룹 안에서 다음 줄로 배치됩니다. 실제로 내용을 수정하고 작성한 뒤 280px뿐 아니라 휴대폰, 태블릿, 데스크톱 화면 크기에서도 확인합니다.

네이티브 전환 후 상태를 확인하세요

스위치 스타일에는 네이티브 상태 전환이 포함됩니다. 화면을 캡처하기 전에 잠시 기다려 전환 도중의 손잡이 또는 트랙 색상을 전환이 완료된 상태로 오인하지 않도록 합니다. 기능 검사에서는 스위치를 끄면 조합된 텍스트에서 체크리스트가 실제로 제거되는지 확인해 불리언 값의 효과를 검증합니다.

Nuxt UI 디자인 시스템 완전한 Vue 및 Vite 프로젝트

제공된 파일 다섯 개를 모두 사용하세요

예제에는 App.vue, main.js, style.css, vite.config.mjs, index.html이 포함되어 있습니다. 구성에는 @vitejs/plugin-vue와 @nuxt/ui/vite가 포함되며, 메인 진입점에서는 @nuxt/ui/vue-plugin을 설치합니다. @nuxt/ui만 설치하고 App.vue를 붙여 넣는 것으로는 실행 가능한 프로젝트가 완성되지 않습니다. 버전을 고정한 설정을 사용하면 네이티브 컴포넌트와 의미에 따른 스타일이 실제로 적용된 로컬 미리보기를 재현할 수 있습니다.

  1. 제공된 파일 다섯 개를 모두 함께 저장하세요.
  2. 버전이 고정된 종속 항목을 설치하세요.
  3. 해당 디렉터리에서 Vite를 실행하세요.
  4. 입력 누락, 출력 수정, 체크리스트 제거, 초기화를 테스트하세요.

이 브라우저 예제를 배포 환경과 분리하세요

Nuxt UI 디자인 시스템 컴포넌트 예제

App.vue

네이티브 컴포넌트의 전체 구성과 반응형 상태입니다.

vue
<script setup>
import{ref,computed,watch}from'vue';
const title=ref('A calmer project handoff'),context=ref('Help a small team understand what is ready, what needs a decision, and who owns the next step.'),checklist=ref(true),error=ref(''),brief=ref('');const words=computed(()=>context.value.trim()?context.value.trim().split(/\s+/).length:0);watch([title,context,checklist],()=>{brief.value='';error.value=''});function compose(){if(!title.value.trim()||!context.value.trim()){error.value='Add both a title and context before composing.';return}brief.value=title.value.trim()+'\n\nPurpose\n'+context.value.trim()+(checklist.value?'\n\nBefore sharing\n• Name the next decision.\n• Identify an owner.\n• Include the source materials.':'')+'\n\nThis is a local draft, not a generated AI response.';}function reset(){title.value='A calmer project handoff';context.value='Help a small team understand what is ready, what needs a decision, and who owns the next step.';checklist.value=true;brief.value='';error.value=''}
</script>
<template><UApp><main><p class="text-primary font-semibold text-sm">NUXT UI / ORIGINAL BRIEF COMPOSER</p><h1 class="text-4xl font-bold tracking-tight mt-4 text-highlighted">Put the next step into words.</h1><p class="text-muted mt-5 max-w-2xl leading-7">A local composition tool using Nuxt UI 4.11.3 in a standalone Vue application. The preview assembles your text; it does not call an AI model.</p><div class="layout"><UCard><template #header><h2 class="font-semibold text-xl">Write the essentials</h2></template><div class="stack"><UFormField label="Brief title" name="title"><UInput v-model="title" class="w-full" placeholder="Name the work" aria-label="Brief title"/></UFormField><UFormField label="Context" name="context" :description="words+' words in your context'"><UTextarea v-model="context" class="w-full" autoresize :rows="5" placeholder="What should the next person understand?" aria-label="Context"/></UFormField><USwitch v-model="checklist" label="Include the sharing checklist"/><p v-if="error" role="alert" class="text-error text-sm">{{error}}</p><div class="flex flex-wrap gap-3"><UButton @click="compose">Compose local brief</UButton><UButton color="neutral" variant="outline" @click="reset">Reset sample</UButton></div></div></UCard><UCard><template #header><div class="flex justify-between gap-3 flex-wrap"><h2 class="font-semibold text-xl">Readable draft</h2><UBadge :color="brief?'success':'neutral'" variant="subtle">{{brief?'Composed locally':'Waiting for your text'}}</UBadge></div></template><div v-if="brief" class="brief" role="status">{{brief}}</div><div v-else class="space-y-4 text-muted leading-7"><p>Your draft will keep the title and context you provide, with an optional sharing checklist.</p><ul class="list-disc pl-5 space-y-2"><li>Editing any input clears an older composed result.</li><li>No content leaves the browser.</li><li>Reset returns to the complete sample inputs.</li></ul></div></UCard></div><p class="notes text-muted">Actual UCard, UFormField, UInput, UTextarea, USwitch, UButton and UBadge components with Nuxt UI’s default semantic theme. Original application content and state; this example uses Vue/Vite, not a Nuxt server.</p></main></UApp></template>

코드 참조

  • 소스 파일 5개를 모두 같은 위치에 두세요.

main.js

Vue 마운트와 Nuxt UI 런타임 플러그인입니다.

자바스크립트
import{createApp}from'vue';import ui from'@nuxt/ui/vue-plugin';import App from'./App.vue';import './style.css';createApp(App).use(ui).mount('#app');

코드 참조

  • 소스 파일 5개를 모두 같은 위치에 두세요.

style.css

네이티브 테마 가져오기와 기존 반응형 레이아웃입니다.

CSS
@import 'tailwindcss';
@import '@nuxt/ui';
body{margin:0}*{box-sizing:border-box}main{max-width:1100px;margin:auto;padding:32px}.layout{display:grid;grid-template-columns:1fr 1fr;gap:24px;margin-top:32px}.stack{display:grid;gap:24px}.brief{white-space:pre-wrap;line-height:1.7;overflow-wrap:anywhere}.notes{font-size:13px;line-height:1.6;margin-top:24px}@media(max-width:700px){main{padding:16px}.layout{grid-template-columns:1fr}}textarea{min-height:150px}button{max-width:100%}

코드 참조

  • 소스 파일 5개를 모두 같은 위치에 두세요.

vite.config.mjs

Vue 컴파일러와 Nuxt UI 빌드 플러그인입니다.

자바스크립트
import{defineConfig}from'vite';import vue from'@vitejs/plugin-vue';import ui from'@nuxt/ui/vite';export default defineConfig({plugins:[vue(),ui({colorMode:false})],base:'./',build:{cssCodeSplit:false}});

코드 참조

  • 소스 파일 5개를 모두 같은 위치에 두세요.

index.html

브라우저 루트 문서 전체입니다.

html
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Project brief composer</title></head><body><div id="app"></div><script type="module" src="./main.js"></script></body></html>

코드 참조

  • 소스 파일 5개를 모두 같은 위치에 두세요.
04

Nuxt UI 디자인 시스템 에이전트 설정

구현 시작점

먼저 제공된 파일 5개를 모두 저장하세요. 고정된 Vite 및 Nuxt UI 릴리스에서 지원하는 Node 버전을 사용하세요(로컬 빌드에는 Node 22.17을 사용했습니다).

sh
npm init -y
npm install [email protected] [email protected] @nuxt/[email protected] [email protected] [email protected] @vitejs/[email protected]
npx vite --host 127.0.0.1

프로젝트를 위한 프롬프트

에이전트 프롬프트
공식 Vite 및 Vue 플러그인을 사용하는 완전한 Nuxt UI 4.11.3 독립 실행형 Vue 브리프 작성기를 구현하세요. 시맨틱 색상, UFormField 컨텍스트, 제어형 입력과 스위치 ref, 공백 제거 검증, 계산된 단어 수, 오래된 결과 지우기, 대기 중 콘텐츠 전체 및 초기화를 유지하세요. AI 호출이나 백엔드 저장을 암시하지 마세요.
05

Nuxt UI 디자인 시스템의 출처와 범위

독립 실행형 Vue/Vite 브라우저 앱에서 실제 Nuxt UI 컴포넌트를 사용합니다. 브리프 작성기는 독자적인 OpenDesign 코드이며 AI 모델, Nuxt 서버 또는 영속성 서비스에 연결하지 않습니다.