mirror of
https://github.com/mineracks/seedhammer-v1-companion.git
synced 2026-06-26 22:01:05 +10:00
The Phase 2 scaffolding boot screen is replaced with the actual
upstream v1.3.0 gui package running in browser. cmd/emulator now
calls gui.NewApp(plat, version) + drives a.Frame() in a goroutine.
Lifts:
gui/ (top-level UI + state machine)
gui/assets (icons, fonts, 9-patch images)
gui/layout (constraint-based UI layout)
gui/op (drawing op primitives)
gui/saver (screensaver + idle timeout)
gui/text (text shaping)
gui/widget (button/menu/keyboard widgets)
All 11 .go files lifted verbatim from seedhammer/seedhammer @ v1.3.0
(commit 2f071c1d...), import paths rewritten seedhammer.com → mineracks.
browserPlatform now implements gui.Platform (12 methods):
Events(deadline) — drains v1.Event chan, maps to gui.ButtonEvent
(gui.Button enum order matches platform/v1.Button,
so the conversion is a direct uint cast)
Wakeup() — no-op (no sleep state in browser)
PlateSizes() — backup.SquarePlate, backup.LargePlate
Engraver() — nullEngraver stub (browser can't punch metal)
EngraverParams() — copy of mjolnir.Params {StrokeWidth: 38,
Millimeter: 126}. Inlined because tarm/serial
(mjolnir's USB dep) doesn't compile to js/wasm.
CameraFrame(size) — emits FrameEvent{Error: stubbed} so QR-scan
screens fall through cleanly; real handoff
lands when SeedSigner sim wires up (Phase 2.5)
Now() — time.Now()
DisplaySize() — 240×240
Dirty(r) — records rect, resets chunk cursor
NextChunk() — one-shot: returns full sub-image once per
Dirty cycle, then flushes the whole frame
buffer to JS via emulatorPaint()
ScanQR() — returns nil decodes (stub)
Debug() — false
The Engraver interface is satisfied by nullEngraver — Engrave() returns
"engraver not connected" so the GUI's engrave flow fails cleanly
instead of looking like it's working.
WASM grows 2.7MB → 8.0MB (gui package + btcd + crypto deps + fonts
all linked in). Acceptable for the v1 emulator one-time cache.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
277 lines
12 KiB
Go
277 lines
12 KiB
Go
// Code generated by gui/assets/gen.go; DO NOT EDIT.
|
|
package assets
|
|
|
|
import (
|
|
_ "embed"
|
|
"unsafe"
|
|
|
|
"github.com/mineracks/seedhammer-v1-companion/image/ninepatch"
|
|
"github.com/mineracks/seedhammer-v1-companion/image/paletted"
|
|
)
|
|
|
|
var (
|
|
ArrowDown = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(ArrowDownData[:135]), len(ArrowDownData[:135])),
|
|
Rect: paletted.Rectangle{MinX: 0, MinY: 0, MaxX: 15, MaxY: 9},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(ArrowDownData[135:]), len(ArrowDownData[135:]))),
|
|
}
|
|
//go:embed arrow-down.bin
|
|
ArrowDownData string
|
|
|
|
ArrowLeft = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(ArrowLeftData[:135]), len(ArrowLeftData[:135])),
|
|
Rect: paletted.Rectangle{MinX: 0, MinY: 0, MaxX: 9, MaxY: 15},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(ArrowLeftData[135:]), len(ArrowLeftData[135:]))),
|
|
}
|
|
//go:embed arrow-left.bin
|
|
ArrowLeftData string
|
|
|
|
ArrowRight = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(ArrowRightData[:135]), len(ArrowRightData[:135])),
|
|
Rect: paletted.Rectangle{MinX: 0, MinY: 0, MaxX: 9, MaxY: 15},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(ArrowRightData[135:]), len(ArrowRightData[135:]))),
|
|
}
|
|
//go:embed arrow-right.bin
|
|
ArrowRightData string
|
|
|
|
ArrowUp = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(ArrowUpData[:135]), len(ArrowUpData[:135])),
|
|
Rect: paletted.Rectangle{MinX: 0, MinY: 0, MaxX: 15, MaxY: 9},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(ArrowUpData[135:]), len(ArrowUpData[135:]))),
|
|
}
|
|
//go:embed arrow-up.bin
|
|
ArrowUpData string
|
|
|
|
ButtonFocused = ninepatch.New(&paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(ButtonFocusedData[:850]), len(ButtonFocusedData[:850])),
|
|
Rect: paletted.Rectangle{MinX: 0, MinY: 0, MaxX: 34, MaxY: 25},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(ButtonFocusedData[850:]), len(ButtonFocusedData[850:]))),
|
|
})
|
|
//go:embed button-focused.bin
|
|
ButtonFocusedData string
|
|
|
|
CameraCorners = ninepatch.New(&paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(CameraCornersData[:3249]), len(CameraCornersData[:3249])),
|
|
Rect: paletted.Rectangle{MinX: 0, MinY: 0, MaxX: 57, MaxY: 57},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(CameraCornersData[3249:]), len(CameraCornersData[3249:]))),
|
|
})
|
|
//go:embed camera-corners.bin
|
|
CameraCornersData string
|
|
|
|
CircleFilled = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(CircleFilledData[:169]), len(CircleFilledData[:169])),
|
|
Rect: paletted.Rectangle{MinX: 0, MinY: 0, MaxX: 13, MaxY: 13},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(CircleFilledData[169:]), len(CircleFilledData[169:]))),
|
|
}
|
|
//go:embed circle-filled.bin
|
|
CircleFilledData string
|
|
|
|
Circle = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(CircleData[:169]), len(CircleData[:169])),
|
|
Rect: paletted.Rectangle{MinX: 0, MinY: 0, MaxX: 13, MaxY: 13},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(CircleData[169:]), len(CircleData[169:]))),
|
|
}
|
|
//go:embed circle.bin
|
|
CircleData string
|
|
|
|
Hammer = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(HammerData[:14760]), len(HammerData[:14760])),
|
|
Rect: paletted.Rectangle{MinX: 0, MinY: 0, MaxX: 120, MaxY: 123},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(HammerData[14760:]), len(HammerData[14760:]))),
|
|
}
|
|
//go:embed hammer.bin
|
|
HammerData string
|
|
|
|
IconBack = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(IconBackData[:270]), len(IconBackData[:270])),
|
|
Rect: paletted.Rectangle{MinX: 8, MinY: 10, MaxX: 26, MaxY: 25},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(IconBackData[270:]), len(IconBackData[270:]))),
|
|
}
|
|
//go:embed icon-back.bin
|
|
IconBackData string
|
|
|
|
IconBackspace = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(IconBackspaceData[:260]), len(IconBackspaceData[:260])),
|
|
Rect: paletted.Rectangle{MinX: 7, MinY: 11, MaxX: 27, MaxY: 24},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(IconBackspaceData[260:]), len(IconBackspaceData[260:]))),
|
|
}
|
|
//go:embed icon-backspace.bin
|
|
IconBackspaceData string
|
|
|
|
IconCheckmark = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(IconCheckmarkData[:414]), len(IconCheckmarkData[:414])),
|
|
Rect: paletted.Rectangle{MinX: 6, MinY: 8, MaxX: 29, MaxY: 26},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(IconCheckmarkData[414:]), len(IconCheckmarkData[414:]))),
|
|
}
|
|
//go:embed icon-checkmark.bin
|
|
IconCheckmarkData string
|
|
|
|
IconDiscard = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(IconDiscardData[:460]), len(IconDiscardData[:460])),
|
|
Rect: paletted.Rectangle{MinX: 7, MinY: 6, MaxX: 27, MaxY: 29},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(IconDiscardData[460:]), len(IconDiscardData[460:]))),
|
|
}
|
|
//go:embed icon-discard.bin
|
|
IconDiscardData string
|
|
|
|
IconDot = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(IconDotData[:121]), len(IconDotData[:121])),
|
|
Rect: paletted.Rectangle{MinX: 12, MinY: 12, MaxX: 23, MaxY: 23},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(IconDotData[121:]), len(IconDotData[121:]))),
|
|
}
|
|
//go:embed icon-dot.bin
|
|
IconDotData string
|
|
|
|
IconEdit = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(IconEditData[:441]), len(IconEditData[:441])),
|
|
Rect: paletted.Rectangle{MinX: 7, MinY: 7, MaxX: 28, MaxY: 28},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(IconEditData[441:]), len(IconEditData[441:]))),
|
|
}
|
|
//go:embed icon-edit.bin
|
|
IconEditData string
|
|
|
|
IconFlip = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(IconFlipData[:360]), len(IconFlipData[:360])),
|
|
Rect: paletted.Rectangle{MinX: 8, MinY: 9, MaxX: 28, MaxY: 27},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(IconFlipData[360:]), len(IconFlipData[360:]))),
|
|
}
|
|
//go:embed icon-flip.bin
|
|
IconFlipData string
|
|
|
|
IconHammer = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(IconHammerData[:506]), len(IconHammerData[:506])),
|
|
Rect: paletted.Rectangle{MinX: 6, MinY: 7, MaxX: 29, MaxY: 29},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(IconHammerData[506:]), len(IconHammerData[506:]))),
|
|
}
|
|
//go:embed icon-hammer.bin
|
|
IconHammerData string
|
|
|
|
IconInfo = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(IconInfoData[:152]), len(IconInfoData[:152])),
|
|
Rect: paletted.Rectangle{MinX: 14, MinY: 8, MaxX: 22, MaxY: 27},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(IconInfoData[152:]), len(IconInfoData[152:]))),
|
|
}
|
|
//go:embed icon-info.bin
|
|
IconInfoData string
|
|
|
|
IconLeft = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(IconLeftData[:270]), len(IconLeftData[:270])),
|
|
Rect: paletted.Rectangle{MinX: 8, MinY: 10, MaxX: 26, MaxY: 25},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(IconLeftData[270:]), len(IconLeftData[270:]))),
|
|
}
|
|
//go:embed icon-left.bin
|
|
IconLeftData string
|
|
|
|
IconProgress = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(IconProgressData[:529]), len(IconProgressData[:529])),
|
|
Rect: paletted.Rectangle{MinX: 6, MinY: 6, MaxX: 29, MaxY: 29},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(IconProgressData[529:]), len(IconProgressData[529:]))),
|
|
}
|
|
//go:embed icon-progress.bin
|
|
IconProgressData string
|
|
|
|
IconRight = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(IconRightData[:270]), len(IconRightData[:270])),
|
|
Rect: paletted.Rectangle{MinX: 9, MinY: 10, MaxX: 27, MaxY: 25},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(IconRightData[270:]), len(IconRightData[270:]))),
|
|
}
|
|
//go:embed icon-right.bin
|
|
IconRightData string
|
|
|
|
IconSkip = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(IconSkipData[:270]), len(IconSkipData[:270])),
|
|
Rect: paletted.Rectangle{MinX: 8, MinY: 10, MaxX: 26, MaxY: 25},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(IconSkipData[270:]), len(IconSkipData[270:]))),
|
|
}
|
|
//go:embed icon-skip.bin
|
|
IconSkipData string
|
|
|
|
KeyActive = ninepatch.New(&paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(KeyActiveData[:112]), len(KeyActiveData[:112])),
|
|
Rect: paletted.Rectangle{MinX: 0, MinY: 0, MaxX: 8, MaxY: 14},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(KeyActiveData[112:]), len(KeyActiveData[112:]))),
|
|
})
|
|
//go:embed key-active.bin
|
|
KeyActiveData string
|
|
|
|
KeyBackspace = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(KeyBackspaceData[:187]), len(KeyBackspaceData[:187])),
|
|
Rect: paletted.Rectangle{MinX: 2, MinY: 0, MaxX: 19, MaxY: 11},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(KeyBackspaceData[187:]), len(KeyBackspaceData[187:]))),
|
|
}
|
|
//go:embed key-backspace.bin
|
|
KeyBackspaceData string
|
|
|
|
Key = ninepatch.New(&paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(KeyData[:112]), len(KeyData[:112])),
|
|
Rect: paletted.Rectangle{MinX: 0, MinY: 0, MaxX: 8, MaxY: 14},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(KeyData[112:]), len(KeyData[112:]))),
|
|
})
|
|
//go:embed key.bin
|
|
KeyData string
|
|
|
|
LogoSmall = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(LogoSmallData[:441]), len(LogoSmallData[:441])),
|
|
Rect: paletted.Rectangle{MinX: 0, MinY: 0, MaxX: 21, MaxY: 21},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(LogoSmallData[441:]), len(LogoSmallData[441:]))),
|
|
}
|
|
//go:embed logo-small.bin
|
|
LogoSmallData string
|
|
|
|
NavBtnPrimary = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(NavBtnPrimaryData[:1225]), len(NavBtnPrimaryData[:1225])),
|
|
Rect: paletted.Rectangle{MinX: 0, MinY: 0, MaxX: 35, MaxY: 35},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(NavBtnPrimaryData[1225:]), len(NavBtnPrimaryData[1225:]))),
|
|
}
|
|
//go:embed nav-btn-primary.bin
|
|
NavBtnPrimaryData string
|
|
|
|
NavBtnSecondary = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(NavBtnSecondaryData[:1225]), len(NavBtnSecondaryData[:1225])),
|
|
Rect: paletted.Rectangle{MinX: 0, MinY: 0, MaxX: 35, MaxY: 35},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(NavBtnSecondaryData[1225:]), len(NavBtnSecondaryData[1225:]))),
|
|
}
|
|
//go:embed nav-btn-secondary.bin
|
|
NavBtnSecondaryData string
|
|
|
|
ProgressCircle = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(ProgressCircleData[:16384]), len(ProgressCircleData[:16384])),
|
|
Rect: paletted.Rectangle{MinX: 0, MinY: 0, MaxX: 128, MaxY: 128},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(ProgressCircleData[16384:]), len(ProgressCircleData[16384:]))),
|
|
}
|
|
//go:embed progress-circle.bin
|
|
ProgressCircleData string
|
|
|
|
Sh02 = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(Sh02Data[:5720]), len(Sh02Data[:5720])),
|
|
Rect: paletted.Rectangle{MinX: 1, MinY: 0, MaxX: 89, MaxY: 65},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(Sh02Data[5720:]), len(Sh02Data[5720:]))),
|
|
}
|
|
//go:embed sh02.bin
|
|
Sh02Data string
|
|
|
|
Sh03 = &paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(Sh03Data[:5720]), len(Sh03Data[:5720])),
|
|
Rect: paletted.Rectangle{MinX: 1, MinY: 0, MaxX: 89, MaxY: 65},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(Sh03Data[5720:]), len(Sh03Data[5720:]))),
|
|
}
|
|
//go:embed sh03.bin
|
|
Sh03Data string
|
|
|
|
WarningBoxBg = ninepatch.New(&paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(WarningBoxBgData[:405]), len(WarningBoxBgData[:405])),
|
|
Rect: paletted.Rectangle{MinX: 0, MinY: 0, MaxX: 27, MaxY: 15},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(WarningBoxBgData[405:]), len(WarningBoxBgData[405:]))),
|
|
})
|
|
//go:embed warning-box-bg.bin
|
|
WarningBoxBgData string
|
|
|
|
WarningBoxBorder = ninepatch.New(&paletted.Image{
|
|
Pix: unsafe.Slice(unsafe.StringData(WarningBoxBorderData[:405]), len(WarningBoxBorderData[:405])),
|
|
Rect: paletted.Rectangle{MinX: 0, MinY: 0, MaxX: 27, MaxY: 15},
|
|
Palette: paletted.Palette(unsafe.Slice(unsafe.StringData(WarningBoxBorderData[405:]), len(WarningBoxBorderData[405:]))),
|
|
})
|
|
//go:embed warning-box-border.bin
|
|
WarningBoxBorderData string
|
|
)
|