リポジトリ外のアプリにインストール
@werft-ai/ui を tarball にまとめ、別の React アプリにインストールする
@werft-ai/ui をこのリポジトリの外にある React アプリで使う方法である。リポジトリでパッケージをビルドして tarball にまとめ、アプリでそのファイルを npm install する。アプリに Tailwind はなくてもよい。
まだレジストリには公開していない。そのため、今は以下のように tarball ファイルからしかインストールできない。@werft-ai/react(hook とセッションブロック)は配布対象ではないため、リポジトリ外のアプリでは使えない。
このリポジトリは PolyForm Small Business License 1.0.0 に基づく source-available のリポジトリであり、パッケージにもリポジトリの LICENSE が同梱されている。従業員と独立請負人の合計が 100 人未満で、前課税年度の総売上が 100 万米ドル(2019 年基準、インフレ調整あり)未満の会社は無料で利用できる。会社を支配する組織、会社が支配する組織、共通の支配下にある組織も合わせて数える。それより大きい会社には商用ライセンスが必要である。評価・商用ライセンスのお問い合わせ: jaesoon@94soon.dev
tarball を作る
リポジトリのルートで実行する。リポジトリが固定している Bun 1.3.14(ルートの package.json の packageManager)と npm が必要である。
bun install
bun run --cwd packages/ui build:package
npm pack ./packages/ui/distbuild:package は packages/ui/dist に、ビルド済みの JavaScript と型宣言、CSS、配布用の package.json、LICENSE を作る。npm pack はそのディレクトリをまとめ、カレントディレクトリに werft-ai-ui-<バージョン>.tgz を置く。バージョンは packages/ui/package.json の version である。
アプリにインストールする
Vite + React + TypeScript のアプリを例にする。アプリがなければ npm create vite@latest my-app -- --template react-ts で作る。
@werft-ai/ui は react と react-dom の ^19.3.0 を peer dependency として受け取る。アプリの React がこれより古ければ先に上げてから、作った tarball をインストールする。
npm install react@^19.3.0 react-dom@^19.3.0
npm install <リポジトリのパス>/werft-ai-ui-0.0.0.tgzRadix、class-variance-authority、clsx、tailwind-merge、lucide-react はパッケージの dependency なので一緒にインストールされる。
CSS を読み込む
ビルド済みの styles.css を一度 import する。トークン、キット要素のルール、キットが使うユーティリティクラスがすべて入っているので、Tailwind なしで描画される。
import "@werft-ai/ui/styles.css";
import { Button, Card } from "@werft-ai/ui";styles.css には Tailwind の preflight(グローバルなリセット)が入っていない。グローバルに適用されるルールは一つだけで、すべての要素の既定の border-color を --werft-color-border にする。そのため、アプリが border-width と border-style だけを与えて色を決めていない要素は、この色で描画される(border ショートハンドは色も決めるので該当しない)。キットが前提とするリセット(枠線、margin、ボタンの背景、リンクの下線など)は、キット要素とその内側にだけ specificity 0 で適用される。そのため、キットの中に置いたアプリのマークアップもブラウザ既定の margin と下線が外れる。キットのルールは cascade layer の中にあるので、layer の外に書いたアプリの CSS が常に勝つ。
Tailwind v4 のアプリ
アプリのマークアップでもキットのユーティリティ名(bg-primary、text-control、rounded-control など)を使うには、アプリの CSS で styles.css の後に theme.css を import する。theme.css がトークンを Tailwind のユーティリティにつなぐ。
@import "tailwindcss";
@import "@werft-ai/ui/styles.css";
@import "@werft-ai/ui/theme.css";キットのコンポーネントが使うクラスは styles.css にすでに入っているので、node_modules を @source でスキャンする必要はない。
フォント
パッケージにフォントは含まれていない。書体のリストは --werft-font-sans(Geist、Pretendard Variable の順)と --werft-font-mono(Geist Mono から)にあるが、styles.css はこの変数をキットの werft-* 要素にしか当てない。ボタンやセグメントコントロールなどのコントロールはアプリの書体を継承するため、アプリが body(または :root)に書体を指定しないと、ブラウザ既定の書体(多くは Times のような serif)で描画される。アプリの CSS に 1 行を置く。
body { font-family: var(--werft-font-sans); }こうしておけば、アプリが Geist・Pretendard を読み込まなくてもリスト末尾のシステムフォントで描画される。ハングルを Pretendard で表示するには、アプリが自分で読み込む。このリポジトリの Web コンソールは pretendard パッケージの dynamic subset を使っている。
npm install pretendardimport "pretendard/dist/web/variable/pretendardvariable-dynamic-subset.css";テーマ
ライトが既定である。ダークテーマの有効化はテーマの適用と同じである。
import できるパス
| パス | 内容 |
|---|---|
@werft-ai/ui | 下の二つの層と foundations(cn など)すべて |
@werft-ai/ui/primitives | Button、Card、Dialog、Tabs、Input、Skeleton など |
@werft-ai/ui/patterns | ConfirmDialog、EmptyState、ErrorState、PageHeader、Stepper など |
@werft-ai/ui/styles.css | ビルド済みの CSS。通常はこれだけを import する |
@werft-ai/ui/theme.css | Tailwind v4 アプリ向けのトークン接続 |
@werft-ai/ui/tokens.css | --werft-* 変数のみ |
次のステップ
- テーマの適用: ダークテーマと上書きのルール