Add input components 066-085; gallery chrome on real components; deploy warms the edge

This commit is contained in:
ZacharyZhang-NY committed 2026-10-11 19:05:42 -04:00
1 parent 0247a130f5
commit 095eab2b4c
38 files changed
+2340 -172

No files matched your search

+138
View File
@@ -0,0 +1,138 @@
// Package input takes the player's choices: buttons, boxes, fields.
package input
import (
"fmt"
"strconv"
"git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/pixel"
)
type Variant uint8
const (
Normal Variant = iota
Primary
Ghost
Danger
)
type Size uint8
const (
Medium Size = iota
Small
Large
)
// metrics are a size's height, padding, text top and scale.
func (s Size) metrics() (h, pad, top, scale int) {
switch s {
case Small:
return pixel.LineHeight, 4, 0, 1
case Medium:
return pixel.LineHeight + 4, 8, 2, 1
case Large:
return 2*pixel.LineHeight + 4, 12, 2, 2
}
panic(fmt.Sprintf("input: unknown Size %d", s))
}
// face paints a button body, returning ink and press shift.
func face(g pixel.Canvas, v Variant, st pixel.State, on bool) (ink pixel.Slot, dy int) {
fill, ink := pixel.Face, pixel.Ink
switch v {
case Primary:
fill, ink = pixel.Accent, pixel.AccentInk
case Danger:
fill, ink = pixel.Bad, pixel.AccentInk
case Normal, Ghost:
default:
panic(fmt.Sprintf("input: unknown Variant %d", v))
}
if st.Press || on {
dy = 1
}
if g.W < 3 || g.H < 3 {
return ink, dy
}
if v == Ghost && !st.Hover && !st.Press && !on {
return ink, dy
}
if v == Ghost {
fill = pixel.Lit
}
if on {
fill = pixel.Shade
}
g.Frame(0, dy, g.W, g.H-dy, pixel.Notched, fill)
switch {
case on || st.Press:
g.HLine(1, dy+1, g.W-2, pixel.Edge)
default:
g.Bevel(1, 1, g.W-2, g.H-2, pixel.Lit, pixel.Shade)
if st.Hover {
g.Veil(2, 2, g.W-4, g.H-4, pixel.Lit, 4)
}
}
return ink, dy
}
// finish dithers out a disabled control and marks focus.
func finish(g pixel.Canvas, st pixel.State) {
if st.Disabled {
g.Checker(0, 0, g.W, g.H, pixel.Face)
}
if st.Focus {
g.FocusMark(0, 0, g.W, g.H)
}
}
// orDef is v, or def for zero; negative panics.
func orDef(name string, v, def int) int {
if v < 0 {
panic(fmt.Sprintf("input: %s %d is negative", name, v))
}
if v == 0 {
return def
}
return v
}
// label is s, or the fallback when s is empty.
func label(s, fallback string) string {
if s != "" {
return s
}
return fallback
}
// fmtValue prints a number without trailing zeros.
func fmtValue(v float64) string { return strconv.FormatFloat(v, 'g', 4, 64) }
var (
tinyUp = pixel.MustSprite(`
..#..
.###.
#####
`)
tinyDown = pixel.MustSprite(`
#####
.###.
..#..
`)
tinyLeft = pixel.MustSprite(`
..#
.##
###
.##
..#
`)
tinyRight = pixel.MustSprite(`
#..
##.
###
##.
#..
`)
)