initial port of the UI kit
This commit is contained in:
52
go/webui/remoteupdateflash.go
Normal file
52
go/webui/remoteupdateflash.go
Normal file
@@ -0,0 +1,52 @@
|
||||
// Port of web/kit/RemoteUpdateFlash.tsx.
|
||||
|
||||
package webui
|
||||
|
||||
import "kjol/vdom"
|
||||
|
||||
// RemoteFlash is the trigger/signal pair from createRemoteFlash: Fire() shows
|
||||
// the flash, Visible() reports whether it is currently shown, and Clear() hides
|
||||
// it. Create one with NewRemoteFlash and render RemoteUpdateFlash(flash.Visible())
|
||||
// wherever the pill should appear.
|
||||
type RemoteFlash struct {
|
||||
visible *vdom.Signal[bool]
|
||||
}
|
||||
|
||||
// NewRemoteFlash creates a flash controller.
|
||||
//
|
||||
// NOTE: the TSX createRemoteFlash auto-clears after durationMs via setTimeout.
|
||||
// The neutral runtime has no timer, so the auto-clear is dropped — the caller
|
||||
// must call Clear() when the flash should end (durationMs is retained only for
|
||||
// API/documentation parity).
|
||||
func NewRemoteFlash(durationMs int) *RemoteFlash {
|
||||
_ = durationMs
|
||||
return &RemoteFlash{visible: vdom.NewSignal(false)}
|
||||
}
|
||||
|
||||
// Visible reports whether the flash is currently showing.
|
||||
func (f *RemoteFlash) Visible() bool { return f.visible.Get() }
|
||||
|
||||
// Fire shows the flash (call when a remote update arrives).
|
||||
func (f *RemoteFlash) Fire() { f.visible.Set(true) }
|
||||
|
||||
// Clear hides the flash.
|
||||
func (f *RemoteFlash) Clear() { f.visible.Set(false) }
|
||||
|
||||
const remoteUpdateFlashCls = "remote-update-flash inline-flex items-center gap-1 rounded-full bg-emerald-100 border border-emerald-300 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-widest text-emerald-700"
|
||||
|
||||
// RemoteUpdateFlash is a small pill that briefly shows "Updated". It renders
|
||||
// nothing (nil) when when is false, mirroring the TSX <Show when=…>.
|
||||
func RemoteUpdateFlash(when bool) *vdom.VNode {
|
||||
if !when {
|
||||
return nil
|
||||
}
|
||||
return vdom.El("div",
|
||||
vdom.Attr("class", remoteUpdateFlashCls),
|
||||
vdom.El("svg",
|
||||
vdom.Attr("viewBox", "0 0 12 12"),
|
||||
vdom.Attr("class", "w-2.5 h-2.5 fill-current"),
|
||||
vdom.Raw(`<circle cx="6" cy="6" r="6"/>`),
|
||||
),
|
||||
vdom.Text("Updated"),
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user