本文へスキップ

スタイルとレイアウト

要素または ui.Style() にスタイルメソッドをチェーンします。子は .Child(...) または .Children(...) で追加し、スタイルの再利用は .Style(shared) で行います。

return ui.View().Children(ui.Text("hello"), ui.Input().Value("xxx")).
	FlexCol().PaddingLeft(20).RoundedLg().TextAlign("center")

#スタイルメソッド

あとから書いた値が同じプロパティを上書きします。長さは論理ピクセルです。文字列ではパーセントも使えます。

func Card() *ui.Element {
	return ui.View().Child(ui.Text("Hello").TextColor("#e2e8f0")).
		Padding(20).BorderRadius(12).Bg("#111827")
}

.FlexCol()、.P4()、.GridCols(3)、.RoundedLg() などのヘルパーは TypeScript のプリセットに対応します。

#スタイルのマージ

.Style(base).Style(overrides) は宣言を順に適用します。再利用できるビルダーの合成には .Merge(...) を使います。

func MergedCard() *ui.Element {
	base := ui.Style().Padding(20).BorderRadius(8).Bg("#111827")
	overrides := ui.Style().BorderRadius(12)
	return ui.View().Child("Merged styles").Style(base).Style(overrides)
}

#スタイルの再利用

ui.Style() は値を返します。メソッドは新しい値を返すので、共有スタイルが書き換えられることはありません。バリエーションを派生するときは戻り値を代入してください。

func SharedCard() *ui.Element {
	card := ui.Style().Padding(20).BorderRadius(12)
	emphasized := card.PaddingLeft(28).Bg("#1e293b")
	return ui.View().Gap(12).Children(
		ui.View().Child("Hello").Style(card).Bg("#111827"),
		ui.View().Child("Another card").Style(emphasized),
	)
}

.When(condition, style) は条件が真のあいだ、追加のスタイルを適用します。リアクティブな条件には getter を渡します:.When(selected, ui.Style().Bg("#2563eb"))。セットアップ中に width() を渡すと現在の数値がキャプチャされます。更新し続けるときは width(getter)を渡してください。

#Flexbox

.Flex()、.FlexRow()、.FlexCol() で flex レイアウトを開始します。スクロールする子には .MinHeight(0) または .MinWidth(0) を付けて、縮小できるようにします。

func Row() *ui.Element {
	return ui.View().Children(
		ui.Text("Flexible content").Flex1().MinWidth(0),
		ui.Button().Child("Action").FlexShrink(0),
	).Flex().Gap(12).ItemsCenter()
}

#グリッド

func Grid() *ui.Element {
	return ui.View().Children(ui.Text("Sidebar"), ui.Text("Content")).
		Display("grid").GridTemplateColumns("220px 1fr").Gap(16)
}

.GridCols(3) と .ColSpanFull() も使えます。

#テキストと色

タイポグラフィは子に継承されます。色は hex、rgb() / rgba()、またはパックされた RGBA 値を受け付けます。パディングとボーダーは継承されません。

func TypographyExample() *ui.Element {
	return ui.View().Children(
		ui.Text("Inbox").FontSize(24).FontWeight(600),
		ui.Text("All caught up."),
	).TextColor("#334155").FontSize(14).Padding(20)
}

#インタラクション状態

.Hover(...)、.Active(...)、.FocusStyle(...)、.DisabledStyle(...)、.SelectedStyle(...) を使います。ベーススタイルに .Transition(...) を付けると、描画の変化をアニメーションできます。トランジションとアニメーションを参照してください。

func SelectableButton() *ui.Element {
	selected, setSelected := ui.CreateSignal(false)
	button := ui.Style().Padding(12).Bg("#e5e7eb").
		Hover(func(s ui.StyleBuilder) ui.StyleBuilder { return s.Opacity(0.85) })
	return ui.Button().Child("Toggle selection").Style(button).
		When(selected(), ui.Style().Bg("#2563eb").TextColor("white")).
		OnClick(func() { setSelected(!selected()) })
}

#グループと名前付きグループのホバー

.Group(true) は名前なしグループを付け、.Group("card") は名前を付けます。.GroupHover(...) は一番近い祖先グループに従います。.GroupHoverNamed("card", ...) はその名前を持つ一番近い祖先に従います。

func GroupExample() *ui.Element {
	return ui.View().Child(
		ui.Text("Changes when the card is hovered").
			TextColor("#64748b").
			GroupHoverNamed("card", func(s ui.StyleBuilder) ui.StyleBuilder {
				return s.TextColor("#2563eb")
			}),
	).Group("card").Padding(20)
}

.GroupActive(...) と .FocusWithin(...) は、押されたグループとフォーカスされたグループでも同じように動きます。これらの状態は描画プロパティを受け付けます。カーソルは設定できません。