クロスプラットフォームおよびモバイルUI · 新しいリソース

Tamaguiデザインシステム.

ネイティブコンポーネントを使用した完全な習慣管理ボードで、Tamaguiの実際のv5トークンカテゴリとライト/ダークのブルーテーマを確認できます。入力検証、進捗表示、空の状態からの復帰も備えています。

OpenDesign ガイド8章リファレンス項目50件オリジナルアプリケーションガイド
01

Tamaguiデザインシステムのインターフェースプレビュー

習慣を追加し、進捗を記録し、未完了の項目を絞り込み、青のテーマを切り替えます。

小さな習慣のボードを作成完全な例を開く
Tamagui 2.7.7のネイティブWebコンポーネント、v5設定、オリジナルのローカル状態。 · 実装リファレンス
02

Tamaguiデザインシステムの設計リファレンス

2.7.7の@tamagui/config/v5と@tamagui/themesが出力する値、および検証済みのネイティブコンポーネントの仕様。

v5のサイズトークン

ソース
名前 / ルール値 / 設定用途
size.$120実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。
size.$228実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。
size.$336実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。
size.$444実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。
size.$552実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。
size.$664実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。

v5のスペーストークン

ソース
名前 / ルール値 / 設定用途
space.$12実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。
space.$1.54実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。
space.$27実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。
space.$2.510実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。
space.$313実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。
space.$3.516実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。
space.$418実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。
space.$524実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。
space.$632実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。

v5の角丸トークン

ソース
名前 / ルール値 / 設定用途
radius.00実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。
radius.13実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。
radius.25実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。
radius.37実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。
radius.49実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。
radius.510実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。
radius.616実際のv5設定値。同じ数値のトークンラベルでも、サイズ、スペース、角丸では意味が異なります。$4を共通のピクセル値として扱わないでください。

light_blueセマンティックテーマ

ソース
名前 / ルール値 / 設定用途
light_blue.backgroundhsla(207, 100%, 98%, 1)v5のブルーテーマから解決されるセマンティックな役割。ホバー、押下、アクティブ状態では、コンポーネントがさらに具体的な子テーマを選ぶ場合があります。
light_blue.backgroundHoverhsla(210, 100%, 99%, 1)v5のブルーテーマから解決されるセマンティックな役割。ホバー、押下、アクティブ状態では、コンポーネントがさらに具体的な子テーマを選ぶ場合があります。
light_blue.backgroundPresshsla(205, 92%, 95%, 1)v5のブルーテーマから解決されるセマンティックな役割。ホバー、押下、アクティブ状態では、コンポーネントがさらに具体的な子テーマを選ぶ場合があります。
light_blue.colorhsla(216, 71%, 23%, 1)v5のブルーテーマから解決されるセマンティックな役割。ホバー、押下、アクティブ状態では、コンポーネントがさらに具体的な子テーマを選ぶ場合があります。
light_blue.borderColorhsla(203, 100%, 92%, 1)v5のブルーテーマから解決されるセマンティックな役割。ホバー、押下、アクティブ状態では、コンポーネントがさらに具体的な子テーマを選ぶ場合があります。
light_blue.borderColorFocushsla(203, 100%, 92%, 1)v5のブルーテーマから解決されるセマンティックな役割。ホバー、押下、アクティブ状態では、コンポーネントがさらに具体的な子テーマを選ぶ場合があります。
light_blue.placeholderColorhsla(206, 100%, 50%, 1)v5のブルーテーマから解決されるセマンティックな役割。ホバー、押下、アクティブ状態では、コンポーネントがさらに具体的な子テーマを選ぶ場合があります。

dark_blueセマンティックテーマ

ソース
名前 / ルール値 / 設定用途
dark_blue.backgroundhsla(218, 39%, 11%, 1)v5のブルーテーマから解決されるセマンティックな役割。ホバー、押下、アクティブ状態では、コンポーネントがさらに具体的な子テーマを選ぶ場合があります。
dark_blue.backgroundHoverhsla(212, 69%, 16%, 1)v5のブルーテーマから解決されるセマンティックな役割。ホバー、押下、アクティブ状態では、コンポーネントがさらに具体的な子テーマを選ぶ場合があります。
dark_blue.backgroundPresshsla(215, 42%, 9%, 1)v5のブルーテーマから解決されるセマンティックな役割。ホバー、押下、アクティブ状態では、コンポーネントがさらに具体的な子テーマを選ぶ場合があります。
dark_blue.colorhsla(205, 100%, 88%, 1)v5のブルーテーマから解決されるセマンティックな役割。ホバー、押下、アクティブ状態では、コンポーネントがさらに具体的な子テーマを選ぶ場合があります。
dark_blue.borderColorhsla(209, 100%, 19%, 1)v5のブルーテーマから解決されるセマンティックな役割。ホバー、押下、アクティブ状態では、コンポーネントがさらに具体的な子テーマを選ぶ場合があります。
dark_blue.borderColorFocushsla(209, 100%, 19%, 1)v5のブルーテーマから解決されるセマンティックな役割。ホバー、押下、アクティブ状態では、コンポーネントがさらに具体的な子テーマを選ぶ場合があります。
dark_blue.placeholderColorhsla(206, 100%, 50%, 1)v5のブルーテーマから解決されるセマンティックな役割。ホバー、押下、アクティブ状態では、コンポーネントがさらに具体的な子テーマを選ぶ場合があります。

システムフォントの役割

ソース
名前 / ルール値 / 設定用途
body.family-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serifv5のシステムフォントスタックは、外部フォントのリクエストを必要としません。
body.$213px / 20pxサイズと行の高さは、コンポーネントのサイズトークンとは別に定義されたフォントの役割です。同じラベルでも連動しません。
body.$314px / 21pxサイズと行の高さは、コンポーネントのサイズトークンとは別に定義されたフォントの役割です。同じラベルでも連動しません。
body.$415px / 23pxサイズと行の高さは、コンポーネントのサイズトークンとは別に定義されたフォントの役割です。同じラベルでも連動しません。
body.$516px / 24pxサイズと行の高さは、コンポーネントのサイズトークンとは別に定義されたフォントの役割です。同じラベルでも連動しません。
body.$618px / 27pxサイズと行の高さは、コンポーネントのサイズトークンとは別に定義されたフォントの役割です。同じラベルでも連動しません。
body.$826px / 38pxサイズと行の高さは、コンポーネントのサイズトークンとは別に定義されたフォントの役割です。同じラベルでも連動しません。

ネイティブの組み合わせ仕様

ソース
名前 / ルール値 / 設定用途
createTamaguidefaultConfig from @tamagui/config/v5Reactの外側で設定インスタンスを1つ作成し、getCSS()でWebテーマのCSSを提供します。
TamaguiProviderconfig + defaultThemeボードの状態を保ったまま、アプリケーションでライトまたはダークを選択します。
Themename="blue"現在の外観に対応するブルーの子テーマを解決します。
Checkboxchecked + onCheckedChangeボードではvalue === trueの場合のみ完了として扱います。中間状態は完了ではありません。
Inputvalue + onChangeText制御された下書き、トリム検証、重複時の明示的な処理。
Progressvalue from 0 to 100完了数を全行数で割った値からインジケーターを算出します。
YStack / XStackdirectional layout with token gap別の模倣用スタイルシートを用意せず、読みやすいレイアウトを画面幅に応じて調整します。
03

Tamaguiデザインシステム完全ガイド

実際のインターフェースで、このデザインシステムを選び、適用し、レビューするための実践ガイドです。

DESIGN-tamagui.md

詳しいガイダンス、実装の出発点、ソースへのリンクをまとめています。

ガイドをダウンロード

Tamaguiデザインシステムのバージョン管理された設定とCSS

指定されたv5プリセットを使用する

この例ではtamaguiと@tamagui/configのバージョンを2.7.7に固定し、@tamagui/config/v5からdefaultConfigをインポートします。設定名はv5であり、npmパッケージのメジャーバージョンではありません。この2つの数字を混同すると、インストールコマンドを誤って案内することになります。createTamaguiはコンポーネントの外側で1度だけ実行し、生成されたCSSをボードのレンダリング前に挿入して、テーマ変数とネイティブスタイルをWeb上で実際に定義します。

この OpenDesign ガイドから

小規模な設定の上書きを明示する

このサンプルでは、paddingやbackgroundColorのように読みやすい長形式のプロパティを使うため、指定されたソースでonlyAllowShorthandsをfalseに設定しています。これはプリセットに加えたアプリケーション側の選択です。v5のベースにはアニメーションドライバーが含まれません。この例でもアニメーションドライバーを追加したり、アニメーション付きの遷移があると主張したりしません。シンプルな進捗表示とチェックボックスの動作に、別途アニメーションの依存関係を追加する必要はありません。

Tamaguiデザインシステムのサイズ、スペース、角丸のトークン

同じトークンラベルを混同しない

固定されたv5設定では、サイズの$4は44、スペースの$4は18、角丸の4は9です。コンポーネントのサイズ、レイアウトの間隔、角丸は、それぞれ異なるため、共通の倍率で換算できません。リファレンスでは各カテゴリを分けて掲載し、サンプルではカテゴリに応じた実際のTamaguiプロパティを使っています。設定で使われていない汎用的な4px刻みの一覧よりも、こちらの方が実用的です。

  • size.$4 = 44
  • space.$4 = 18
  • radius.4 = 9
  • 本文フォント$4 = 15px、行の高さ23px

文字のスケールも分けて扱う

本文フォントの $4 は15px、行の高さは23pxです。一方、コンポーネントサイズの $4 は44のままです。システムフォントスタックはv5から提供されるため、フォントファイルのダウンロードは不要です。H1、H2、Textにはそれぞれネイティブのフォントコンテキストが適用されます。ソースに明示されたfontSizeとlineHeightの値が、元のボードの階層を決めます。外側の幅880pxはローカルなレイアウト上の選択であり、グローバルなTamaguiトークンではありません。

Tamagui デザインシステムのセマンティックテーマと外観

ライトまたはダークにブルーの子テーマを組み合わせる

TamaguiProviderに選択したdefaultThemeを渡し、Theme name="blue"で対応する子テーマを適用します。ソースでは、コンポーネントツリー全体で16進数の値を繰り返すのではなく、background、backgroundHover、color、borderColorの役割を使用しています。この表には実際のlight_blueとdark_blueの値を記載しているため、固定のブランドカラーを想定せず、設定に応じた値を比較できます。

外観を切り替えてもボードの状態を維持する

darkフラグは、行、入力欄の下書き、フィルターとは独立しています。外観を切り替えるとネイティブコンポーネントの表示は更新されますが、ボードの内容は維持されます。ボタンやチェックボックスには、それぞれ独自のコンポーネント子テーマの値を設定できるため、計算後の色は親の背景トークンと同じとは限りません。階層を独自のCSSに平坦化する前に、実際の表示状態を確認してください。

Tamagui デザインシステムのチェックボックスと進捗の算出

完了状態は1つの行データに保持する

各行は、安定したID、読みやすいテキスト、doneの真偽値を持ちます。CheckboxにはcheckedとonCheckedChangeを渡し、値が文字どおりtrueの場合にのみ完了として扱います。チェック済みのマークにはCheckbox.Indicatorを使用します。隣接するテキストとアクセシブルネームは同じ習慣を示し、取り消し線でも完了状態を視覚的に表現します。ソースでは、行と同期しなくなる可能性のある別個の件数を作成していません。

ボード全体から進捗を算出する

Tamagui デザインシステムの入力検証と重複時の復旧

実際に操作できる入力欄を用意する

InputはvalueとonChangeTextを使って、現在の下書きを保持します。「習慣を追加」アクションでは入力をトリミングし、空の場合は目に見えるメッセージ、aria-invalid、エラーの説明を表示して追加を拒否します。空のまま送信した場合は、入力欄にフォーカスを戻します。大文字と小文字を区別しない重複チェックにより、同じテキストの行が2つ追加されるのを防ぎ、修正できるよう下書きは残します。これらのルールは元のボードに属するもので、ライブラリ自体の機能ではありません。

有効な追加内容だけでボードを更新する

有効な下書きを追加すると、新しい未完了の行が作成され、入力欄がクリアされてエラーが消えます。行のコレクションから算出されるため、分母もすぐに更新されます。習慣を追加しても、リマインダーが登録されたりアカウントが作成されたりすることはありません。ボードの状態は意図的にローカルのReactに保持され、ドキュメントを再読み込みするとサンプルの状態に戻ります。

Tamagui デザインシステムの絞り込み表示と空状態からの復旧

フィルターの対象範囲を明示する

「未完了のみを表示」では、完了した行をコレクションに保持したまま表示から隠します。この表示に残るものがない場合は、全リストは引き続き存在することを説明する空状態を表示し、全リストに直接戻れるようにします。これは、任意のプレースホルダーカードを切り替える装飾的なトグルではなく、ユーザーの選択によって生じる意味のある空状態です。

リセットと外観の切り替えを分ける

「サンプルボードをリセット」では、最初の3行を復元し、下書きとエラーをクリアして、全リスト表示に戻します。現在の外観は変更しません。それぞれの変更が明示的な状態として扱われるため、リセットのためにドキュメントを再読み込みしたり、設定済みのプロバイダーを破棄したりする必要はありません。テーマとコンテンツの復旧は、それぞれ独立してテストできます。

Tamagui デザインシステムのレスポンシブなスタックとアクセシブルな読みやすさ

コンテンツに合わせてスタックの高さを決める

YStackで主要な読み進めの流れを配置し、XStackで見出しのコントロール、チェックボックスの行、アクションを整列させます。コントロールのグループは折り返されるため、デスクトップ向けの固定幅を強制しません。外側のコンテナは最大幅880pxで、余白には実際のspaceトークン$4を使用します。各行ではテキストが縮んで折り返せる一方、280pxの幅でも、それ以上のテスト幅でもコントロールを操作できます。

リフロー後の操作性をテストする

ブラウザーでの確認では、はみ出しを測定する前に、習慣の追加、完了への変更、リストの絞り込み、外観の切り替えを行います。初期レイアウトのスクリーンショットだけでは、エラー、長いラベル、絞り込み後の状態によって狭い画面のレイアウトが崩れるかどうかは分かりません。ネイティブのチェックボックスのセマンティクスと表示テキストを、算出される進捗とあわせて操作して確認しており、実装されているものと見なして動作確認を省くことはしていません。

Tamagui デザインシステムのブラウザー向け完全ビルド

プロバイダー、CSS、ビルド定義を用意する

ローカルで動作を確認するには、提供された3つのファイルで十分です。JSXには、プロバイダー、1つの設定、生成されたテーマCSS、ボード全体が含まれています。build.mjsではWebターゲットと本番環境を固定し、ブラウザー専用環境でほかの環境変数を読み取る際に使用する空のprocess.envフォールバックを指定します。この定義がないと、コンパイルできても、プレーンなバンドルでprocess is not definedというエラーが発生することがあります。

  1. tamagui.jsx、build.mjs、index.htmlを同じディレクトリに保存します。
  2. バージョンを固定したReactとTamaguiのパッケージをインストールします。
  3. ローカルディレクトリをビルドして配信します。
  4. 空の入力と重複した追加、完了、フィルター、テーマ、リセットをテストします。

ネイティブ版とWeb版の導入を分ける

Tamagui デザインシステムのコンポーネント例

tamagui.jsx

設定、生成されたCSS、ネイティブコンポーネント、ボードの完全な状態。

jsx
import React,{useState} from 'react';import{createRoot}from'react-dom/client';
import{createTamagui,TamaguiProvider,Theme,YStack,XStack,Text,H1,H2,Button,Input,Checkbox,Progress,Separator}from'tamagui';import{defaultConfig}from'@tamagui/config/v5';
const config=createTamagui({...defaultConfig,settings:{...defaultConfig.settings,onlyAllowShorthands:false}});const sheet=document.createElement('style');sheet.textContent=config.getCSS();document.head.append(sheet);
const initial=[{id:1,text:'Read ten pages',done:false},{id:2,text:'Step outside for a break',done:true},{id:3,text:'Write one useful note',done:false}];
function App(){const[dark,setDark]=useState(false),[rows,setRows]=useState(initial),[draft,setDraft]=useState(''),[error,setError]=useState(''),[filter,setFilter]=useState(false);const done=rows.filter(x=>x.done).length;let shown=rows.filter(x=>!filter||!x.done);function add(){let text=draft.trim();if(!text){setError('Write a small habit before adding it.');document.querySelector('#habit-input')?.focus();return}if(rows.some(x=>x.text.toLowerCase()===text.toLowerCase())){setError('That habit is already in this list.');return}setRows([...rows,{id:Date.now(),text,done:false}]);setDraft('');setError('')}return <TamaguiProvider config={config} defaultTheme={dark?'dark':'light'}><Theme name="blue"><YStack backgroundColor="$background" color="$color" padding="$4" gap="$4" maxWidth={880} margin="auto" width="100%" minHeight={0}><XStack justifyContent="space-between" alignItems="center" flexWrap="wrap" gap="$3"><Text fontSize="$2" fontWeight="700">TAMAGUI / ORIGINAL HABIT BOARD</Text><Button size="$3" onPress={()=>setDark(!dark)}>{dark?'Light appearance':'Dark appearance'}</Button></XStack><H1 fontSize="$8" lineHeight="$8">A little progress, every day.</H1><Text fontSize="$4" lineHeight="$5">A local board built with Tamagui 2.7.7 and its v5 blue theme. Your changes stay in this page; no account or daily reminder is connected.</Text><YStack backgroundColor="$backgroundHover" borderWidth={1} borderColor="$borderColor" borderRadius="$4" padding="$4" gap="$3"><XStack justifyContent="space-between" gap="$3" flexWrap="wrap"><H2 fontSize="$5">Today’s small steps</H2><Text id="progress-count" aria-live="polite">{done} of {rows.length} complete</Text></XStack><Progress value={rows.length?done/rows.length*100:0} size="$2" aria-label="Completed habits"><Progress.Indicator animation={undefined}/></Progress><Button size="$3" alignSelf="flex-start" onPress={()=>setFilter(!filter)}>{filter?'Show all habits':'Show unfinished only'}</Button><Separator/>{shown.length?shown.map(row=><XStack key={row.id} gap="$3" alignItems="center" paddingVertical="$2"><Checkbox id={'habit-'+row.id} checked={row.done} onCheckedChange={value=>setRows(rows.map(x=>x.id===row.id?{...x,done:value===true}:x))} aria-label={row.text} size="$4"><Checkbox.Indicator><Text fontWeight="700">✓</Text></Checkbox.Indicator></Checkbox><Text flex={1} fontSize="$4" lineHeight="$5" textDecorationLine={row.done?'line-through':'none'} opacity={row.done?.65:1}>{row.text}</Text></XStack>):<YStack gap="$3"><Text fontWeight="700">Nothing unfinished in this view</Text><Text>All your habits remain in the full list. You can revisit any completed item.</Text><Button onPress={()=>setFilter(false)}>Return to all habits</Button></YStack>}</YStack><YStack gap="$3"><Text htmlFor="habit-input" tag="label" fontWeight="700">Add one small habit</Text><Input id="habit-input" value={draft} onChangeText={v=>{setDraft(v);setError('')}} placeholder="For example, stretch for five minutes" aria-describedby={error?'habit-error':undefined} aria-invalid={!!error} onKeyPress={e=>{if(e.nativeEvent.key==='Enter')add()}}/><Text id="habit-error" color="$color" aria-live="polite">{error}</Text><XStack gap="$3" flexWrap="wrap"><Button theme="active" onPress={add}>Add habit</Button><Button onPress={()=>{setRows(initial);setDraft('');setError('');setFilter(false)}}>Reset sample board</Button></XStack></YStack><Text fontSize="$2" lineHeight="$3">Native Checkbox, Input, Button and Progress components; original board content and state. Theme changes preserve the current board.</Text></YStack></Theme></TamaguiProvider>}
createRoot(document.getElementById('root')).render(<App/>);

コードリファレンス

  • この3つのファイルをすべて一緒に使用してください。

build.mjs

テスト済みバンドルで使用するブラウザー環境の定義。

JavaScript
import {build} from 'esbuild';
await build({entryPoints:['tamagui.jsx'],bundle:true,minify:true,outfile:'tamagui.bundle.js',define:{'process.env.NODE_ENV':'"production"','process.env.TAMAGUI_TARGET':'"web"','process.env':'{}'}});

コードリファレンス

  • この3つのファイルをすべて一緒に使用してください。

index.html

単独で使用できるルートドキュメントとバンドルのインポート。

html
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Small habits board</title><style>body{margin:0}*{box-sizing:border-box}button,input{max-width:100%}</style></head><body><div id="root"></div><script src="./tamagui.bundle.js"></script></body></html>

コードリファレンス

  • この3つのファイルをすべて一緒に使用してください。
04

Tamagui デザインシステムのエージェントセットアップ

実装の出発点

まず提供されたファイルを保存し、http://localhost:8000/ を開いてください。このセットアップはブラウザーでの使用を前提としています。

シェル
npm init -y
npm install [email protected] [email protected] [email protected] @tamagui/[email protected]
npm install --save-dev esbuild
node build.mjs
python3 -m http.server 8000

あなたのプロジェクト向けプロンプト

AI エージェント用プロンプト
v5プリセットを使用して、Tamagui 2.7.7のWebハビットボード全体を実装してください。サイズ、スペース、角丸、フォントのトークンカテゴリは区別したままにし、生成されたテーマCSS、ライト/ダークのブルー系子テーマ、制御されたチェックボックス、前後の空白文字の除去と重複の検証、全行を分母とする進捗計算、未完了表示からの復帰、見た目を変えないリセットを維持してください。
05

Tamagui デザインシステムのソースと適用範囲

v5プリセットを使用した、実際のTamagui 2.7.7 Webコンポーネント。ハビットボードと状態ルールは独自のOpenDesignコードであり、アカウント、リマインダー、ネイティブデバイスの動作には接続されていません。