v0.1.0

フレームワーク:

明日香

全機種純正部品、Go で。

UIKit、Material、AppKit、Win32、GTK、そして DOM。キャンバス描画でも、Web View でもない。

Go だけでアプリを一つ書けば、スマートフォンでも、デスクトップでも、Web でも動きます。表示するのは各プラットフォーム純正のコントロールで、文字入力もアクセシビリティもそのまま。Asuka が更新するのは、変わった部分だけです。

はじめる

動作環境: iOS (UIKit), Android (Android Views · Material 3), macOS (AppKit), Windows (Win32(Windows 11 の外観)), Linux (GTK 4 · libadwaita), Web (DOM).

仕様

Go、ただ Go だけ
言語は一つ。
iOS · Android · macOS · Windows · Linux · Web
舞台は六つ。
すべて各プラットフォーム純正のウィジェット
Web View はゼロ。

変換

書くのは Go。
動くのはネイティブ。

ui.Column(ui.Style{Gap: 12},
  1. ui.TextField(ui.TextFieldProps{Value: name}),UITextField
  2. ui.Toggle(ui.ToggleProps{Value: alerts}),UISwitch
  3. ui.Slider(ui.SliderProps{Value: volume}),UISlider
  4. ui.Button(ui.ButtonProps{Title: ui.Val("保存")}),UIButton
)

ここに描いたウィジェットは各プラットフォームの配色によるスケッチです。実機では、プラットフォーム純正のウィジェットそのものが表示されます。

出撃

パイロットは一人。
機体は六機。

  1. 初号機 稼働中

    iOS

    UIKit

    シンクロ率 100%
  2. 弐号機 稼働中

    Android

    Android Views · Material 3

    シンクロ率 100%
  3. 参号機 稼働中

    macOS

    AppKit

    シンクロ率 100%
  4. 四号機 稼働中

    Windows

    Win32(Windows 11 の外観)

    シンクロ率 100%
  5. 伍号機 稼働中

    Linux

    GTK 4 · libadwaita

    シンクロ率 100%
  6. 六号機 稼働中

    Web

    DOM

    シンクロ率 100%

第 00 話 / Hello

こんにちは、ネイティブ。

main.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) }
Counter() · 実行
1 回
label · 実行
1 回
直前のフラッシュ
14 op

稼働中

Count: 0

ホストへの op

  1. フラッシュ 01 · 14 op · 2 バッチ
  2. Create 1 View
  3. Command 1 Locale 00656e
  4. Create 2 Text
  5. SetProp 2 Text="Count: 0"
  6. Create 3 Button
  7. SetProp 3 Variant=1
  8. SetProp 3 Title="Add"
  9. Listen 3 Press
  10. Insert 1 2 @0
  11. Insert 1 3 @1
  12. SetRoot 1
  13. SetFrame 2 163,396.66666 64x20
  14. SetFrame 3 171,416.66666 48x44
  15. SetFrame 1 0,0 390x844

このコードについて host/fake が記録した op です。画面は iPhone の 390 × 844。

実行全プラットフォーム

$ asuka new hello && cd hello$ asuka dev                     # このコンピューター:Mac、PC、Linux$ asuka dev --platform ios      # iOS シミュレーター$ asuka dev --platform android  # Android エミュレーターか実機$ asuka dev --platform web      # ブラウザー

Go のファイルを保存すると、アプリはすぐにリロードされ、状態もそのまま残ります。ほかの使い方はサンプルをどうぞ。gallery ではすべてのコンポーネントを見られます。

全六話

できること

  1. 第壱話Episode 01

    純正のウィジェット

    ナビゲーション、リスト、入力欄、ピッカー、シート、メニュー。見た目も手触りも各プラットフォームのものと同じです。各プラットフォームのウィジェットそのものなのですから。

  2. 第弐話Episode 02

    きめ細かなシグナル

    コンポーネントは一度しか実行されません。シグナルが変わると、それを読むビューだけがフレームごとに一つのバッチで更新されます。ツリーの差分は取りません。

  3. 第参話Episode 03

    保存すれば、すぐ動く

    asuka dev はアプリをコンピューター、シミュレーター、エミュレーター、実機、ブラウザーで動かし、保存するたびに状態を保ったままリロードします。

  4. 第肆話Episode 04

    モーション

    アニメーション、スプリング、変形、表示と退場のトランジション、あるビューから別のビューへと姿を変える共有要素、そしてジェスチャー。

  5. 第伍話Episode 05

    全部入り

    ライブクエリ付きの SQLite、セキュアストレージ、カメラとコードスキャン、写真、位置情報、通知、オーディオ、ビデオ、Web ビュー。

  6. 第陸話Episode 06

    すぐにリリース

    asuka build は、App Store 向けの署名済み .ipa、Google Play 向けの .aab、公証済みの Mac アプリ、署名済みの Windows .exe、Linux のアーカイブと Flatpak マニフェスト、そして静的サイトを作ります。

次回予告

Go はコアにいまし、すべて画面はネイティブなり。