-
-
Notifications
You must be signed in to change notification settings - Fork 363
/
base.go
99 lines (80 loc) · 1.7 KB
/
base.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package ui
import (
"fmt"
"github.com/maxence-charriere/go-app/v10/pkg/app"
)
// IBase is the interface that describes a component that serves as a base for a
// content.
type IBase interface {
app.UI
// Sets the ID.
ID(v string) IBase
// Sets the class. Multiple classes can be defined by successive calls.
Class(v string) IBase
// The content.
Content(v ...app.UI) IBase
}
// Base creates a base for content.
func Base() IBase {
return &base{
hpadding: BaseHPadding,
vpadding: 12,
}
}
type base struct {
app.Compo
Iid string
Iclass string
Icontent []app.UI
hpadding int
vpadding int
width int
}
func (b *base) ID(v string) IBase {
b.Iid = v
return b
}
func (b *base) Class(v string) IBase {
b.Iclass = app.AppendClass(b.Iclass, v)
return b
}
func (b *base) Content(v ...app.UI) IBase {
b.Icontent = app.FilterUIElems(v...)
return b
}
func (b *base) OnMount(ctx app.Context) {
b.resize(ctx)
}
func (b *base) OnResize(ctx app.Context) {
b.resize(ctx)
}
func (b *base) OnUpdate(ctx app.Context) {
b.resize(ctx)
}
func (b *base) Render() app.UI {
return app.Div().
ID(b.Iid).
Class(b.Iclass).
Body(
app.Div().
Style("position", "relative").
Style("top", "0").
Style("left", "0").
Style("height", fmt.Sprintf("calc(100%s - %vpx)", "%", b.vpadding*2)).
Style("width", fmt.Sprintf("calc(100%s - %vpx)", "%", b.hpadding*2)).
Style("padding", fmt.Sprintf("%vpx %vpx", b.vpadding, b.hpadding)).
Style("overflow", "hidden").
Body(b.Icontent...),
)
}
func (b *base) resize(ctx app.Context) {
w, _ := ctx.Page().Size()
if w <= 480 {
b.hpadding = BaseMobileHPadding
} else {
b.hpadding = BaseHPadding
}
if w != b.width {
b.width = w
}
}