main bcc9a45

intrinsic_container_test.go RawHistoryFolder

1package layout
2
3import (
4	"testing"
5
6	"github.com/bnema/nefergui/internal/css"
7)
8
9func TestAutoFlexColumnReservesChildrenAndGaps(t *testing.T) {
10	leaf := func(id string) *Node {
11		return node(id, Box, css.Style{Display: css.KeywordBlock, Height: px(20), Width: px(80)})
12	}
13	column := node("column", Column, css.Style{Display: css.KeywordFlex, FlexDirection: css.KeywordColumn, RowGap: px(8)}, leaf("one"), leaf("two"))
14	out, err := Layout(node("root", Box, css.Style{Display: css.KeywordBlock, Width: px(300), Height: px(200)}, column), Options{Width: 300, Height: 200})
15	if err != nil {
16		t.Fatal(err)
17	}
18	got := out.Tree.Children[0]
19	if got.Content.H != 48 || got.Children[1].Border.Y != 28 {
20		t.Fatalf("column geometry: %+v", got)
21	}
22}
23
24func TestNestedFlexPercentWidthUsesNaturalSize(t *testing.T) {
25	leaf := node("leaf", Box, css.Style{Display: css.KeywordBlock, Width: px(80), Height: px(24)})
26	percent := node("percent", Box, css.Style{Display: css.KeywordBlock, Width: css.Length{Value: 100, Unit: "%"}}, leaf)
27	nested := node("nested", Column, css.Style{Display: css.KeywordFlex, FlexDirection: css.KeywordColumn}, percent)
28	out, err := Layout(node("root", Row, css.Style{Display: css.KeywordFlex, Width: px(300), Height: px(100)}, nested), Options{Width: 300, Height: 100})
29	if err != nil {
30		t.Fatal(err)
31	}
32	if got := out.Tree.Children[0].Border.W; got != 80 {
33		t.Fatalf("nested width=%g", got)
34	}
35}
36
37func TestAutoFlexHeightBoundsBeforeDistribution(t *testing.T) {
38	for _, tc := range []struct {
39		name        string
40		min, max    css.Length
41		child, want float64
42	}{{"minimum", px(200), css.Length{}, 0, 200}, {"maximum", css.Length{}, px(40), 100, 40}} {
43		t.Run(tc.name, func(t *testing.T) {
44			child := node("child", Box, css.Style{Display: css.KeywordBlock, Height: px(tc.child), FlexGrow: 1, FlexShrink: 1})
45			column := node("column", Column, css.Style{Display: css.KeywordFlex, FlexDirection: css.KeywordColumn, MinHeight: tc.min, MaxHeight: tc.max}, child)
46			out, err := Layout(node("root", Box, css.Style{Display: css.KeywordBlock, Width: px(300), Height: px(300)}, column), Options{Width: 300, Height: 300})
47			if err != nil {
48				t.Fatal(err)
49			}
50			got := out.Tree.Children[0]
51			if got.Border.H != tc.want || got.Children[0].Border.H != tc.want {
52				t.Fatalf("container=%g child=%g want=%g", got.Border.H, got.Children[0].Border.H, tc.want)
53			}
54		})
55	}
56}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 1

Tags 12

↑↓ moveenter openesc close