HORON
Get Started Foundations Components Updates

Get Started

Get Started

HORON 디자인 시스템은 하나의 토큰 소스에서 웹과 네이티브 값을 함께 냅니다. 아래 절차대로 설치하고, 토큰을 생성하고, 컴포넌트를 가져다 쓰면 됩니다.

무엇인가요

HORON의 UI는 중성 백본 + 단일 액센트로 정리됩니다. 표면과 텍스트는 sand 무채색 램프 하나를 쓰고, gold는 포커스 링과 링크, 하이라이트에만 절제해 씁니다. 버튼의 채움색은 잉크입니다. 이 규칙은 토큰에 값으로 들어 있고, 컴포넌트는 그 값만 참조합니다.

토큰 정본은 @horon/tokens 하나입니다. 이 패키지가 웹용 CSS (theme.css)와 네이티브용 hex·숫자를 함께 내기 때문에, 웹과 앱의 색·간격·타이포가 어긋나지 않습니다.

설치

terminal
# 저장소 루트에서
bun install
bun run tokens        # packages/tokens/theme.css 생성
bun run storybook     # http://localhost:6006

웹에서 쓰기

엔트리에서 @horon/web/globals.css를 한 번 불러오고, 컴포넌트는 배럴 또는 하위 경로로 가져옵니다. Tailwind CSS v4를 쓰는 프로젝트라면 같은 스타일시트를 그대로 공유할 수 있습니다.

example.tsx
import { Button, Card, CardHeader, CardTitle } from "@horon/web";
import "@horon/web/globals.css";

export function Example() {
  return (
    <Card>
      <CardHeader>
        <CardTitle>제목</CardTitle>
      </CardHeader>
      <Button variant="outline">취소</Button>
    </Card>
  );
}

네이티브에서 쓰기

앱 레이어는 @horon/app입니다. 같은 토큰을 StyleSheet 값으로 소비하므로 웹과 색·간격이 일치합니다. 두 레이어는 서로를 import 하지 않습니다.

screen.tsx
import { Button, Card, CardTitle, Text } from "@horon/app";

export function Screen() {
  return (
    <Card>
      <CardTitle>제목</CardTitle>
      <Text variant="bodySm" tone="muted">설명</Text>
      <Button>확인</Button>
    </Card>
  );
}

import 경계

두 레이어를 섞으면 경계 규칙에 걸립니다. 정적 검사는 oxlint가 맡습니다.

  • packages/app, apps/native — @horon/app, @horon/tokens만
  • packages/web, 웹 앱 — @horon/web, @horon/tokens만
  • 예외는 Storybook 하나입니다. 두 레이어를 함께 렌더하는 미리보기 도구입니다.

다음 단계

  • Foundations — 색, 타이포, 간격, 반경, 모션, 유리 표면의 값과 규칙
  • Components — 75개 컴포넌트의 프리뷰와 코드 예시
  • Storybook — 모든 상태와 변형을 직접 조작