本文へスキップ

コンポーネント

通常の関数から JSX を返します。レイアウト、タイポグラフィ、色は style に書きます。

#コンポーネントの定義

function Greeting(props: { name: string }) {
  return <Text>Hello, {props.name}</Text>;
}

function Example() {
  const [name] = createSignal("Ada");
  return <Greeting name={name()} />;
}

<View> はテキストを直接受け取れます。<div> と <span> は View と Text のエイリアスです。class も className もありません。見た目に関することはすべて style に書きます。

<div style={{ flexCol: true, gap2: true }}>
  some text
  <span style={{ textLg: true, fontSemibold: true }}>Styled text</span>
</div>

#プリミティブ

View、Text、Button、Input、TextArea、Image、Svg、Shader、VirtualList が基本の部品です。TextInput は Input と同じです。Terminal は terminal パッケージを追加すると使えます。

bun add @quickgui/extension-editor で Editor、CodeBlock、DiffView を追加できます。

bun add @quickgui/extension-markdown で Markdown を追加できます。

#複合コンポーネント

<Checkbox.Root checked={checked()} onCheckedChange={setChecked}>
  <Checkbox.Indicator>
    <Text>✓</Text>
  </Checkbox.Indicator>
  <Text>Remember this device</Text>
</Checkbox.Root>

フォーカスと値がつながったままになるよう、パーツは所属するルートの下に置きます。

#制御された状態

現在の値と変更コールバックを渡すか、コンポーネント自身に状態を持たせる場合は defaultValue、defaultChecked、defaultOpen を使います。

const [name, setName] = createSignal("");
<Input value={name()} onInput={(event) => setName(event.value ?? "")} />;

#コンポーネントの種類

コンポーネントリファレンスでは、フォーム、オーバーレイ、メニュー、テーブル、ツリーなどを扱っています。このリポジトリにはギャラリーとして examples/components-typescript があります。

#各パーツのスタイル

見えるパーツごとに style を指定します。パーツはスタイルなしで提供されるので、色とレイアウトはアプリ側で決めます。useTabsState や useSelectState のようなフックは、独自の見た目のために現在の状態を公開します。