# Asuka ドキュメント

Asuka を使うと、Go で書いたアプリを iOS、Android、macOS、Windows、Linux、Web で、各プラットフォーム純正のウィジェットを使って動かせます。アプリの画面は、ビューを返す Go の関数として書きます。Asuka はそれをプラットフォームのウィジェットで表示し、シグナルが変わったときは、そのシグナルを読んでいるビューだけを更新します。

```go
func Counter() ui.Node {
	count := signal.New(0)
	label := signal.Func(func() string {
		return fmt.Sprintf("Count: %d", count.Get())
	})
	return ui.SafeArea(ui.Style{Align: ui.AlignCenter, Justify: ui.JustifyCenter},
		ui.Text(label),
		ui.Button(ui.ButtonProps{
			Title:   ui.Val("Add"),
			Variant: ui.ButtonFilled,
			OnPress: func() { count.Set(count.Peek() + 1) },
		}),
	)
}

func main() { app.Run(Counter) }
```

## 仕組み

アプリはすべて Go で書きます。コンポーネントも、状態も、そのほかのコードも Go です。Asuka のコアはコンポーネントを実行してビューをレイアウトし（flexbox と grid を Go で実装しています）、変わった部分をフレームごとに一つのバッチにまとめて、プラットフォームの**ホスト**に送ります。ホストはそれを受けて、プラットフォーム純正のビューを作成・更新します。

| プラットフォーム | ホスト                                         | 使うビュー                                |
| -------- | ------------------------------------------- | ------------------------------------ |
| iOS      | Swift。アプリの Go コードをライブラリとして組み込む              | UIKit                                |
| Android  | Kotlin。アプリの Go コードをライブラリとして組み込む             | Android Views と Material 3           |
| macOS    | Go。アプリと同じプロセスで動く（purego 経由で AppKit を呼び出す）   | AppKit                               |
| Windows  | Go。アプリと同じプロセスで動く（`syscall` 経由で Win32 を呼び出す） | Win32 とコモンコントロール（Windows 11 の見た目で描画） |
| Linux    | Go。アプリと同じプロセスで動く（purego 経由で GTK を呼び出す）      | GTK 4 と libadwaita                   |
| Web      | JavaScript。アプリの Go コードは WebAssembly として動く   | ページの DOM とブラウザー標準のコントロール             |

たとえばテキストフィールドは、プラットフォームに応じて `UITextField`、`EditText`、`NSTextField`、`EDIT` コントロール、`GtkEntry`、`<input>` のいずれかになります。画面のスタックなら、`UINavigationController`、戻るジェスチャーに対応した Material のアプリバー、戻るボタンの付いた Mac のウィンドウのツールバー、libadwaita のナビゲーションビューのいずれかです。そのため、スタイルを何も指定しないアプリは、そのプラットフォームのほかのアプリと同じ見た目になり、アクセシビリティやテキスト入力、スクロールもほかのアプリと同じように振る舞います。デスクトップのホストは cgo を使わずに Go からシステムのライブラリを呼び出すので、Windows や Linux のアプリは Go だけで、しかもどのシステムからでもビルドできます。

状態はシグナルが保持します。コンポーネントは一度だけ実行されます。シグナルが変わると、そのシグナルを読んでいるプロパティだけが送り直されます。ツリーの差分を取ることはありません。

一つのアプリが、どのプラットフォームでもそのまま動きます。スマートフォンでは画面全体に表示され、デスクトップではユーザーがサイズを変えられるウィンドウになります。デスクトップでは、ウィンドウを追加で開いたり（`ui.Window`。スマートフォンにはない機能です）、キーボードショートカット付きのメニューバーを持たせたり（`ui.MenuBar`。スマートフォンでは無視されます）もできます。あるプラットフォームにない機能を扱うパッケージ（たとえば Mac でのセンサーやホーム画面ウィジェット）は、そのプラットフォームでは「利用できない」と答えます。そのためアプリは、使えるかどうかを確かめたうえで、その機能なしで動作できます。

Asuka には Go 1.26 以降が必要です。アプリが動作するのは、iOS 16、Android 13 (API 33)、macOS 11、Windows 10 以降と、GTK 4.14 以降および libadwaita 1.5 以降を備えた Linux、そして最新のブラウザーです。開発中は `asuka dev` でアプリを実行でき、ファイルを保存するたびにリロードされます。実行先は、シミュレーター、エミュレーター、実機（いずれも Go のコードは手元のコンピューターで動きます）、コンピューターそのもの、ブラウザーから選べます。

## ガイド

* [はじめに](https://asuka.egoist.dev/ja/docs/getting-started.md)：CLI のインストールから、アプリの作成、実機・シミュレーター・コンピューター・ブラウザーでの実行まで
* [基本概念](https://asuka.egoist.dev/ja/docs/concepts.md)：コンポーネント、シグナル、オーナー、メインスレッド、環境
* [レイアウトとスタイル](https://asuka.egoist.dev/ja/docs/layout.md)：flexbox、サイズ、セーフエリア、色、テキスト、影、グラデーション
* [コンポーネント](https://asuka.egoist.dev/ja/docs/components.md)：テキスト、ボタン、入力欄、画像、リスト、動画、Web ビュー、描画
* [ナビゲーション](https://asuka.egoist.dev/ja/docs/navigation.md)：スタック、タブ、シート、アラート、メニュー、ウィンドウとメニューバー、アプリを開くリンク、ほかのアプリからの共有
* [モーションとジェスチャー](https://asuka.egoist.dev/ja/docs/motion.md)：アニメーション、トランジション、共有要素、ジェスチャー、キー入力、触覚フィードバック
* [アクセシビリティ](https://asuka.egoist.dev/ja/docs/accessibility.md)：ラベル、ロール、カスタムアクション、読み上げのアナウンス、文字サイズの設定に合わせて拡大するテキスト
* [多言語対応](https://asuka.egoist.dev/ja/docs/i18n.md)：複数形に対応した翻訳メッセージ、ユーザーの地域の書式に合わせた数値と日付、右から左（RTL）のレイアウト、言語を切り替えての確認
* [データ](https://asuka.egoist.dev/ja/docs/data.md)：アプリを再起動しても残る値、ライブクエリに対応した SQLite、セキュアストレージ、ファイルの変更の監視
* [デバイスとサービス](https://asuka.egoist.dev/ja/docs/device.md)：各プラットフォームでのカメラ、コードのスキャン、写真とファイル、プレビュー、印刷と PDF、メールとメッセージの作成画面、位置情報、通知とプッシュ通知、オーディオ、再生中の情報（Now Playing）と録音、ネットワーク、メディアライブラリ、バックグラウンド処理、サインインと生体認証、画面と起動画面、地図、ストアのサービス、センサー、画像編集、音声、連絡先とカレンダー、ホーム画面ウィジェットとショートカット、クラッシュレポート
* [デスクトップ](https://asuka.egoist.dev/ja/docs/desktop.md)：トレイアイコンと Dock メニュー、バックグラウンドで動くアプリ、グローバルショートカット、ファイルダイアログとファイルマネージャー、ファイルを開く処理、単一インスタンス、終了、最近使った書類、ログイン時の起動、アップデート、ディスプレイ、電源、アプリのアイコンでの進捗表示
* [プラグイン](https://asuka.egoist.dev/ja/docs/plugins.md)：ネイティブライブラリを各プラットフォーム向けにビルド済みの状態で持ち込み、アプリに同梱するパッケージ（SQLite もその一つです）
* [ネイティブコード](https://asuka.egoist.dev/ja/docs/native.md)：ネイティブパッケージ。Go で宣言し、各プラットフォームのプロジェクトで実装する型付きのモジュールとビュー（iOS と macOS は Swift、Android は Kotlin、Web は JavaScript、Windows と Linux は Go）
* [開発](https://asuka.egoist.dev/ja/docs/development.md)：各プラットフォームでの `asuka dev` の詳細、デバイス、`asuka vet`、テスト、よくある問題
* [テスト](https://asuka.egoist.dev/ja/docs/testing.md)：デバイスもディスプレイも使わない、`go test` でのアプリの UI のテスト。タップや入力と画面の表示内容の確認、スナップショット、アプリのゴルーチンの待機
* [配布](https://asuka.egoist.dev/ja/docs/shipping.md)：App Store と Google Play 向けのビルド、署名・公証済みの Mac アプリ、Windows 向けのフォルダー、Linux のアーカイブと Flatpak マニフェスト、デスクトップアプリの署名付きアップデート、`asuka.json` に記述するアプリの情報
* [Web](https://asuka.egoist.dev/ja/docs/web.md)：同じアプリを WebAssembly とページの DOM でブラウザーで動かす仕組み、`asuka dev --platform web`、デプロイできる静的サイト、ほかのページへの埋め込み、まだできないこと

## リファレンス

* [asuka.json](https://asuka.egoist.dev/ja/docs/asuka-json.md)：アプリの `asuka.json` のすべてのキーについて、型、デフォルト値、各プラットフォームでの働き
* [SwiftUI・Expo との比較](https://asuka.egoist.dev/ja/docs/parity.md)：Asuka にあるもの、まだないもの
* [Asuka と MyGo](https://asuka.egoist.dev/ja/docs/mygo.md)：プラットフォーム純正のウィジェットか、フレームワークが描く UI か。それぞれが動く環境（MyGo のスマートフォン対応は近日公開予定）と、どちらを使うべきか
* Go の API：`go doc -all github.com/egoist/asuka/ui` と、モジュール内のほかのパッケージ
