Guidebook
ComponentsStorybook

Components · 4

기본 요소

다른 컴포넌트와 패턴의 기반이 되는 가장 작은 표현 및 인터랙션 단위입니다.

기본 요소는 화면의 의미와 상호작용을 만드는 최소 단위입니다. 단순해 보여도 HTML 요소, 접근 가능한 이름, 상태 표현이 잘못되면 다른 모든 조합 컴포넌트의 품질에 영향을 줍니다.

컴포넌트 목록

컴포넌트 사용 목적 사용 시점과 주의사항
Button 저장, 삭제, 제출처럼 현재 화면에서 동작 실행 동사형 레이블을 사용하고 로딩 중 중복 실행을 방지합니다. 이동 용도로 사용하지 않습니다.
Icon 기능, 상태, 콘텐츠 종류를 시각적으로 보조 텍스트와 함께 사용하며 아이콘 단독 제어에는 aria-label을 제공합니다. 장식용 아이콘은 보조기술에서 숨깁니다.
Link 다른 페이지, 문서 위치 또는 외부 리소스로 이동 목적지를 예측할 수 있는 링크 텍스트를 사용합니다. 새 창을 열 때는 시각적·접근성 안내를 함께 제공합니다.
Typography 제목, 본문, 캡션 등 정보 위계 표현 시각적 크기만이 아니라 올바른 제목 순서와 의미 구조를 유지합니다. 임의의 글꼴 값을 추가하지 않습니다.

선택 기준

페이지나 URL이 바뀌면 Link, 현재 맥락에서 데이터나 상태가 바뀌면 Button을 사용합니다. 클릭 모양이 같다는 이유로 div나 span에 동작을 추가하지 않습니다. 제목은 Typography 스타일과 별개로 h1부터 h6까지 문서 구조가 건너뛰지 않도록 선택합니다.

상태와 접근성

  • Button은 기본, hover, focus, disabled, loading 상태를 구분하고 focus 표시를 제거하지 않습니다.
  • Link는 방문 여부보다 현재 위치와 외부 이동 여부를 명확히 전달합니다.
  • Icon의 색상만으로 성공·경고·오류를 구분하지 않고 텍스트나 접근 가능한 이름을 제공합니다.
  • Typography는 확대와 반응형 환경에서도 내용이 잘리거나 겹치지 않는지 확인합니다.

실제 UI 페이지 만들기

컴포넌트 하나를 확인하는 Storybook 예제와 실제 application page는 목적이 다릅니다. 실제 페이지에는 제목 구조, 본문 폭, 이동 링크와 여러 컴포넌트의 상태를 함께 배치합니다. 예를 들어 /components/basic 화면은 다음 구조로 만듭니다.

jsximport Button from '@uxkm/react/button';
import Link from '@uxkm/react/link';
import { TypoTitle } from '@uxkm/react/typography';

export default function BasicPage() {
  return (
    <main className="guide_content">
      <TypoTitle level={1}>기본 요소</TypoTitle>
      <p>Button, Icon, Link와 Typography의 실제 조합을 확인합니다.</p>
      <div className="flex flex_gap-lg">
        <Button variant="filled">저장</Button>
        <Button variant="outlined" disabled>처리 중</Button>
        <Link href="/components/layout">레이아웃 보기</Link>
      </div>
    </main>
  );
}

Vue에서는 같은 구조를 <script setup>의 @uxkm/vue/* import와 <template>으로 작성합니다. HTML·Gulp는 공통 class와 semantic element를 직접 사용하고, WebSquare는 화면 XML fragment에 같은 class와 event를 연결합니다.

페이지 경로 연결

환경 페이지 파일 결과 경로 연결 방식
HTML src/pages/components/basic.html /src/pages/components/basic.html HTML 파일 경로
Gulp src/pages/components/basic.njk /components/basic.html glob build가 자동 출력
Vue src/pages/BasicPage.vue /components/basic Vue Router에 route 등록
Nuxt app/pages/components/basic.vue /components/basic 파일 기반 route 자동 생성
React src/pages/BasicPage.jsx /components/basic React Router에 route 등록
Next.js app/components/basic/page.jsx /components/basic App Router가 자동 생성
WebSquare 프로젝트의 basic.xml 프로젝트 화면 URL 화면 등록·이동 API는 프로젝트 규칙 적용

Vue·Nuxt의 전체 예제는 Vue 페이지와 라우팅, React·Next.js는 React 페이지와 라우팅에서 확인합니다.

가이드북소개기초디자인 토큰기초접근성컴포넌트기본 요소컴포넌트레이아웃컴포넌트폼컴포넌트네비게이션컴포넌트데이터 표시컴포넌트피드백컴포넌트기타활용 가이드UI 패턴활용 가이드작성 지침프레임워크프레임워크 구현프레임워크Gulp프레임워크GulpGulp 시작프레임워크GulpGulp 기본 설정프레임워크GulpGulp 기본 API프레임워크GulpHTML 편집 (Gulp NJK)프레임워크GulpWeb Server & Watching Files프레임워크GulpAssets 세팅프레임워크Gulp배포 (Deploying)프레임워크Vue프레임워크Vue빠른 시작프레임워크Vue핵심 기초프레임워크Vue상태와 반응성프레임워크Vue컴포넌트 심화프레임워크Vue페이지와 라우팅프레임워크Vue재사용성프레임워크Vue내장 컴포넌트프레임워크Vue확장하기프레임워크Vue베스트 프랙티스프레임워크VueTypeScript프레임워크Vue추가 주제프레임워크React프레임워크React빠르게 시작하기프레임워크ReactUI 표현프레임워크React조건과 목록프레임워크React상호작용프레임워크React페이지와 라우팅프레임워크ReactState 관리프레임워크React탈출구프레임워크ReactReact로 사고하기프레임워크WebSquare프레임워크WebSquare스튜디오프레임워크WebSquare화면과 이벤트프레임워크WebSquare컴포넌트프레임워크WebSquareDataCollection프레임워크WebSquareSubmission프레임워크WebSquare사용하기프레임워크WebSquareSP5 설정프레임워크WebSquare심화 가이드프레임워크Svelte프레임워크Svelte빠른 시작프레임워크Svelte핵심 기초프레임워크Svelte상태와 반응성프레임워크Svelte컴포넌트 심화프레임워크Svelte페이지와 라우팅프레임워크SvelteTypeScript프레임워크Svelte베스트 프랙티스프레임워크SolidJS프레임워크SolidJS빠른 시작프레임워크SolidJSUI 표현프레임워크SolidJSSignals와 Effects프레임워크SolidJS컴포넌트 심화프레임워크SolidJS페이지와 라우팅프레임워크SolidJS베스트 프랙티스프레임워크Qwik프레임워크Qwik빠른 시작프레임워크Qwik컴포넌트프레임워크Qwik상태와 반응성프레임워크Qwik페이지와 라우팅프레임워크Qwik베스트 프랙티스프레임워크Remix프레임워크Remix빠른 시작프레임워크RemixUI 표현프레임워크Remix페이지와 라우팅프레임워크RemixLoader와 Action프레임워크Remix베스트 프랙티스프레임워크Angular프레임워크Angular빠른 시작프레임워크Angular핵심 기초프레임워크Angular상태와 반응성프레임워크Angular컴포넌트 심화프레임워크Angular페이지와 라우팅프레임워크AngularTypeScript프레임워크Angular베스트 프랙티스프레임워크Astro프레임워크Astro빠른 시작프레임워크Astro페이지와 라우팅프레임워크AstroIslands프레임워크Astro컴포넌트 통합프레임워크Astro베스트 프랙티스