From 1bc8849ed26928654051e1b978ee78eb4b041ebd Mon Sep 17 00:00:00 2001
From: "google-labs-jules[bot]"
<161369871+google-labs-jules[bot]@users.noreply.github.com>
Date: Wed, 15 Apr 2026 01:23:24 +0000
Subject: [PATCH 01/15] feat: add rightpanel layout
- Implement RightPanel layout in `rightpanel/` sub-package.
- Add `Module` interface for ID provision.
- Implement `Render()` using `tinywasm/dom`.
- Add `rightpanel.css` with responsive design.
- Add SSR support via `ssr.go`.
- Add unit tests in `rightpanel_test.go`.
- Update root `layout.go` for package documentation.
Co-authored-by: cdvelop <44058491+cdvelop@users.noreply.github.com>
---
go.mod | 4 ++
go.sum | 4 ++
layout.go | 9 +--
rightpanel/rightpanel.css | 130 ++++++++++++++++++++++++++++++++++
rightpanel/rightpanel.go | 116 ++++++++++++++++++++++++++++++
rightpanel/rightpanel_test.go | 87 +++++++++++++++++++++++
rightpanel/ssr.go | 14 ++++
7 files changed, 358 insertions(+), 6 deletions(-)
create mode 100644 go.sum
create mode 100644 rightpanel/rightpanel.css
create mode 100644 rightpanel/rightpanel.go
create mode 100644 rightpanel/rightpanel_test.go
create mode 100644 rightpanel/ssr.go
diff --git a/go.mod b/go.mod
index 8403f74..43edaf2 100644
--- a/go.mod
+++ b/go.mod
@@ -1,3 +1,7 @@
module github.com/tinywasm/layout
go 1.25.2
+
+require github.com/tinywasm/dom v0.7.0
+
+require github.com/tinywasm/fmt v0.23.2 // indirect
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..ba05431
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,4 @@
+github.com/tinywasm/dom v0.7.0 h1:drVhHRUptrBTLun/uZA3n+lbrS6vX5Q5iIDek2ZnGko=
+github.com/tinywasm/dom v0.7.0/go.mod h1:9c27al9CgnLgQQg1CIhxbfxHSDeYP0R4MasOEW7O2bs=
+github.com/tinywasm/fmt v0.23.2 h1:NWHfT3Lpi57V5yMytfCuyM65tqHBNrT5HDeqo+Nh//Q=
+github.com/tinywasm/fmt v0.23.2/go.mod h1:L2GCAi6asgytPV6TVvGrRq5Ml+DkUt1Ijo5i/2J1jOY=
diff --git a/layout.go b/layout.go
index 4c26c63..c380162 100644
--- a/layout.go
+++ b/layout.go
@@ -1,7 +1,4 @@
+// Package layout provides pre-built, consistent, reusable UI layout skeletons for
+// tinywasm modules. A layout defines WHERE elements are placed (structure, grid, spacing)
+// but NOT what those elements contain — that is the consumer's responsibility.
package layout
-
-type Layout struct {}
-
-func New() *Layout {
- return &Layout{}
-}
diff --git a/rightpanel/rightpanel.css b/rightpanel/rightpanel.css
new file mode 100644
index 0000000..172b8a3
--- /dev/null
+++ b/rightpanel/rightpanel.css
@@ -0,0 +1,130 @@
+/* ── RightPanel layout tokens (with fallbacks) ───────────────── */
+:root {
+ --rp-title-height: var(--title-height, 8vh);
+ --rp-content-height: var(--content-height, 89vh);
+ --rp-controls-height: var(--controls-height, 3vh);
+ --rp-main-width: 66vw;
+ --rp-aside-width: 30vw;
+ --rp-gap: var(--mag-pri, 0.5rem);
+ --rp-border-color: var(--color-tertiary, #94a3b8);
+ --rp-bg: var(--color-gray, #f8fafc);
+ --rp-aside-bg: var(--color-quaternary,#1e293b);
+ --rp-title-color: var(--color-secondary, #7c3aed);
+}
+
+/* ── Wrapper ─────────────────────────────────────────────────── */
+.rp-wrapper {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+ height: var(--rp-content-height);
+ overflow: hidden;
+}
+
+/* ── Main section ────────────────────────────────────────────── */
+.rp-main {
+ display: grid;
+ grid-template-rows:
+ auto /* rp-header */
+ 1fr; /* rp-article */
+ width: var(--rp-main-width);
+ height: 100%;
+ overflow: hidden;
+ border-right: 0.1vw solid var(--rp-border-color);
+}
+
+/* ── Header ──────────────────────────────────────────────────── */
+.rp-header {
+ display: flex;
+ flex-direction: column;
+ background: var(--rp-bg);
+ padding: var(--mag-sec, 0.2rem) var(--mag-pri, 0.5rem);
+}
+
+.rp-title-row {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: var(--rp-gap);
+ min-height: var(--rp-title-height);
+}
+
+.rp-title-row h1 {
+ font-size: 1.5rem;
+ color: var(--rp-title-color);
+ margin: 0;
+}
+
+.rp-head-controls {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ min-height: var(--rp-controls-height);
+ padding-bottom: var(--mag-sec, 0.2rem);
+}
+
+/* ── Article ─────────────────────────────────────────────────── */
+.rp-article {
+ overflow-y: auto;
+ padding: var(--mag-pri, 0.5rem);
+ background: var(--color-gray, #f8fafc);
+ border-radius: 0.4em 0.4em 0 0;
+}
+
+.rp-article::-webkit-scrollbar { width: 0.2em; background: none; }
+.rp-article::-webkit-scrollbar-thumb { background: var(--color-tertiary, #94a3b8); border-radius: 0.1em; }
+
+/* ── Aside panel ─────────────────────────────────────────────── */
+.rp-aside {
+ display: grid;
+ grid-template-rows:
+ auto /* rp-aside-header */
+ 1fr; /* rp-aside-content */
+ width: var(--rp-aside-width);
+ height: 100%;
+ overflow: hidden;
+}
+
+.rp-aside-header {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ min-height: var(--rp-controls-height);
+ padding: var(--mag-sec, 0.2rem) var(--mag-pri, 0.5rem);
+ background: var(--rp-aside-bg);
+}
+
+.rp-aside-content {
+ overflow-y: auto;
+ padding: var(--mag-pri, 0.5rem);
+ background: var(--rp-aside-bg);
+}
+
+.rp-aside-content::-webkit-scrollbar { width: 0.2em; background: none; }
+.rp-aside-content::-webkit-scrollbar-thumb { background: var(--color-tertiary, #94a3b8); border-radius: 0.1em; }
+
+/* ── Mobile (<640px): stack vertically ───────────────────────── */
+@media (max-width: 640px) {
+ .rp-wrapper {
+ flex-direction: column;
+ height: auto;
+ }
+
+ .rp-main {
+ width: 100%;
+ height: auto;
+ }
+
+ .rp-aside {
+ width: 100%;
+ height: auto;
+ }
+
+ .rp-article {
+ overflow-y: visible;
+ }
+
+ .rp-aside-content {
+ overflow-y: visible;
+ }
+}
diff --git a/rightpanel/rightpanel.go b/rightpanel/rightpanel.go
new file mode 100644
index 0000000..16190f9
--- /dev/null
+++ b/rightpanel/rightpanel.go
@@ -0,0 +1,116 @@
+package rightpanel
+
+import "github.com/tinywasm/dom"
+
+// Module is the interface the consumer must satisfy to provide the layout ID.
+// Any struct with a ModelName() string method qualifies (e.g. ORM model structs).
+type Module interface {
+ ModelName() string
+}
+
+// RightPanel is a two-column layout skeleton:
+// - Left: main content area with header (title + controls) and article.
+// - Right: aside panel with its own header (controls) and content.
+//
+// All slots are optional. A nil slot is simply not rendered.
+// The layout does not define what the slots contain — that is the consumer's job.
+//
+// Usage:
+//
+// panel := &rightpanel.RightPanel{
+// Module: myModel, // implements ModelName() string
+// Title: "Users",
+// HeadControls: mySelectSearch,
+// Article: myTable,
+// AsideControls: myFilterBar,
+// Aside: myDetailPanel,
+// }
+// panel.Render()
+type RightPanel struct {
+ *dom.Element
+
+ // Module provides the ID for the root wrapper element.
+ Module Module
+
+ // Title is rendered as
in the header.
+ Title string
+
+ // Head is rendered beside the (e.g. status badge, icon).
+ Head dom.Component
+
+ // HeadControls is rendered below the title row (e.g. select with search).
+ HeadControls dom.Component
+
+ // Article is the main content area.
+ Article dom.Component
+
+ // AsideControls is rendered at the top of the aside panel (e.g. search + filter).
+ AsideControls dom.Component
+
+ // Aside is the content area of the aside panel (e.g. detail view, info card).
+ Aside dom.Component
+}
+
+// Render builds the layout element tree.
+// Implements dom.ViewRenderer.
+func (r *RightPanel) Render() *dom.Element {
+ if r.Element == nil {
+ r.Element = &dom.Element{}
+ }
+
+ // ── root wrapper ─────────────────────────────────────────────────────────
+ id := ""
+ if r.Module != nil {
+ id = r.Module.ModelName()
+ }
+
+ wrapper := dom.Div().Class("rp-wrapper")
+ if id != "" {
+ wrapper.ID(id)
+ }
+
+ // ── main section ─────────────────────────────────────────────────────────
+ main := dom.Section().Class("rp-main")
+
+ // header row: title + Head slot + HeadControls slot
+ header := dom.Div().Class("rp-header")
+
+ titleRow := dom.Div().Class("rp-title-row")
+ if r.Title != "" {
+ titleRow.Add(dom.H1().Text(r.Title))
+ }
+ if r.Head != nil {
+ titleRow.Add(r.Head)
+ }
+ header.Add(titleRow)
+
+ if r.HeadControls != nil {
+ header.Add(dom.Div().Class("rp-head-controls").Add(r.HeadControls))
+ }
+ main.Add(header)
+
+ // article
+ if r.Article != nil {
+ main.Add(dom.Article().Class("rp-article").Add(r.Article))
+ } else {
+ main.Add(dom.Article().Class("rp-article"))
+ }
+
+ wrapper.Add(main)
+
+ // ── aside panel ──────────────────────────────────────────────────────────
+ if r.AsideControls != nil || r.Aside != nil {
+ aside := dom.Aside().Class("rp-aside")
+
+ if r.AsideControls != nil {
+ aside.Add(dom.Div().Class("rp-aside-header").Add(r.AsideControls))
+ }
+ if r.Aside != nil {
+ aside.Add(dom.Div().Class("rp-aside-content").Add(r.Aside))
+ }
+
+ wrapper.Add(aside)
+ }
+
+ return wrapper
+}
diff --git a/rightpanel/rightpanel_test.go b/rightpanel/rightpanel_test.go
new file mode 100644
index 0000000..d25d54e
--- /dev/null
+++ b/rightpanel/rightpanel_test.go
@@ -0,0 +1,87 @@
+package rightpanel_test
+
+import (
+ "strings"
+ "testing"
+
+ "github.com/tinywasm/dom"
+ "github.com/tinywasm/layout/rightpanel"
+)
+
+// stubModule implements Module for tests.
+type stubModule struct{ name string }
+
+func (s stubModule) ModelName() string { return s.name }
+
+// stubComponent implements dom.Component for tests.
+type stubComponent struct{ html string }
+
+func (s *stubComponent) GetID() string { return "stub" }
+func (s *stubComponent) SetID(_ string) {}
+func (s *stubComponent) RenderHTML() string { return s.html }
+func (s *stubComponent) Children() []dom.Component { return nil }
+
+func TestRightPanel_RenderHTML_WithAllSlots(t *testing.T) {
+ panel := &rightpanel.RightPanel{
+ Module: stubModule{"users"},
+ Title: "Users",
+ Head: &stubComponent{"badge"},
+ HeadControls: &stubComponent{""},
+ Article: &stubComponent{"
"},
+ AsideControls: &stubComponent{""},
+ Aside: &stubComponent{""},
+ }
+
+ el := panel.Render()
+ html := el.RenderHTML()
+
+ checks := []struct {
+ label, want string
+ }{
+ {"root id", "id='users'"},
+ {"wrapper class", "class='rp-wrapper'"},
+ {"main class", "class='rp-main'"},
+ {"header class", "class='rp-header'"},
+ {"title row", "class='rp-title-row'"},
+ {"h1 title", "Users
"},
+ {"Head slot", "badge"},
+ {"HeadControls slot", ""},
+ {"article class", "class='rp-article'"},
+ {"Article slot", ""},
+ {"aside class", "class='rp-aside'"},
+ {"aside header", "class='rp-aside-header'"},
+ {"AsideControls slot", ""},
+ {"aside content", "class='rp-aside-content'"},
+ {"Aside slot", ""},
+ }
+
+ for _, c := range checks {
+ if !strings.Contains(html, c.want) {
+ t.Errorf("[%s] expected %q in HTML:\n%s", c.label, c.want, html)
+ }
+ }
+}
+
+func TestRightPanel_RenderHTML_AsideOmittedWhenNil(t *testing.T) {
+ panel := &rightpanel.RightPanel{
+ Module: stubModule{"orders"},
+ Title: "Orders",
+ Article: &stubComponent{""},
+ // No AsideControls, no Aside
+ }
+
+ html := panel.Render().RenderHTML()
+
+ if strings.Contains(html, "rp-aside") {
+ t.Error("expected rp-aside to be absent when both AsideControls and Aside are nil")
+ }
+}
+
+func TestRightPanel_RenderHTML_NoModuleNoID(t *testing.T) {
+ panel := &rightpanel.RightPanel{Title: "No ID"}
+ html := panel.Render().RenderHTML()
+
+ if strings.Contains(html, "id=") {
+ t.Error("expected no id attribute when Module is nil")
+ }
+}
diff --git a/rightpanel/ssr.go b/rightpanel/ssr.go
new file mode 100644
index 0000000..cb9c489
--- /dev/null
+++ b/rightpanel/ssr.go
@@ -0,0 +1,14 @@
+//go:build !wasm
+
+package rightpanel
+
+import _ "embed"
+
+//go:embed rightpanel.css
+var css string
+
+// RenderCSS implements dom.CSSProvider.
+// tinywasm/site collects this during SSR to inject into .
+func (r *RightPanel) RenderCSS() string {
+ return css
+}
From 87391f56c8135e99117a02bc6327b8a7f5102d0c Mon Sep 17 00:00:00 2001
From: Cesar Solis <44058491+cdvelop@users.noreply.github.com>
Date: Thu, 16 Apr 2026 11:18:24 -0400
Subject: [PATCH 02/15] deps: update fmt to v0.23.3
---
README.md | 1 +
docs/{PLAN.md => CHECK_PLAN.md} | 0
docs/img/badges.svg | 83 +++++++++++++++++++++++++++++++++
go.mod | 2 +-
go.sum | 4 +-
5 files changed, 87 insertions(+), 3 deletions(-)
rename docs/{PLAN.md => CHECK_PLAN.md} (100%)
create mode 100644 docs/img/badges.svg
diff --git a/README.md b/README.md
index 0b04a91..ecc6f02 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
# layout
+
Predefined UI layouts for tinywasm modules
diff --git a/docs/PLAN.md b/docs/CHECK_PLAN.md
similarity index 100%
rename from docs/PLAN.md
rename to docs/CHECK_PLAN.md
diff --git a/docs/img/badges.svg b/docs/img/badges.svg
new file mode 100644
index 0000000..989509e
--- /dev/null
+++ b/docs/img/badges.svg
@@ -0,0 +1,83 @@
+
+
+
\ No newline at end of file
diff --git a/go.mod b/go.mod
index 43edaf2..38c63b6 100644
--- a/go.mod
+++ b/go.mod
@@ -4,4 +4,4 @@ go 1.25.2
require github.com/tinywasm/dom v0.7.0
-require github.com/tinywasm/fmt v0.23.2 // indirect
+require github.com/tinywasm/fmt v0.23.3 // indirect
diff --git a/go.sum b/go.sum
index ba05431..af6fcd1 100644
--- a/go.sum
+++ b/go.sum
@@ -1,4 +1,4 @@
github.com/tinywasm/dom v0.7.0 h1:drVhHRUptrBTLun/uZA3n+lbrS6vX5Q5iIDek2ZnGko=
github.com/tinywasm/dom v0.7.0/go.mod h1:9c27al9CgnLgQQg1CIhxbfxHSDeYP0R4MasOEW7O2bs=
-github.com/tinywasm/fmt v0.23.2 h1:NWHfT3Lpi57V5yMytfCuyM65tqHBNrT5HDeqo+Nh//Q=
-github.com/tinywasm/fmt v0.23.2/go.mod h1:L2GCAi6asgytPV6TVvGrRq5Ml+DkUt1Ijo5i/2J1jOY=
+github.com/tinywasm/fmt v0.23.3 h1:THlrMnZaxfRWh0++Klx7iHcEmfHGc2pX8uFk4PyYWBE=
+github.com/tinywasm/fmt v0.23.3/go.mod h1:L2GCAi6asgytPV6TVvGrRq5Ml+DkUt1Ijo5i/2J1jOY=
From 96781fa1834c02c5a19bc7552f66fb35a6653639 Mon Sep 17 00:00:00 2001
From: Cesar Solis <44058491+cdvelop@users.noreply.github.com>
Date: Sat, 18 Apr 2026 10:10:58 -0400
Subject: [PATCH 03/15] deps: update fmt to v0.23.4
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index 38c63b6..7b630c2 100644
--- a/go.mod
+++ b/go.mod
@@ -4,4 +4,4 @@ go 1.25.2
require github.com/tinywasm/dom v0.7.0
-require github.com/tinywasm/fmt v0.23.3 // indirect
+require github.com/tinywasm/fmt v0.23.4 // indirect
diff --git a/go.sum b/go.sum
index af6fcd1..77f0bc7 100644
--- a/go.sum
+++ b/go.sum
@@ -1,4 +1,4 @@
github.com/tinywasm/dom v0.7.0 h1:drVhHRUptrBTLun/uZA3n+lbrS6vX5Q5iIDek2ZnGko=
github.com/tinywasm/dom v0.7.0/go.mod h1:9c27al9CgnLgQQg1CIhxbfxHSDeYP0R4MasOEW7O2bs=
-github.com/tinywasm/fmt v0.23.3 h1:THlrMnZaxfRWh0++Klx7iHcEmfHGc2pX8uFk4PyYWBE=
-github.com/tinywasm/fmt v0.23.3/go.mod h1:L2GCAi6asgytPV6TVvGrRq5Ml+DkUt1Ijo5i/2J1jOY=
+github.com/tinywasm/fmt v0.23.4 h1:55wPqse8p66MW2U275OqNb48hjgIv92C28zr7tBVXig=
+github.com/tinywasm/fmt v0.23.4/go.mod h1:L2GCAi6asgytPV6TVvGrRq5Ml+DkUt1Ijo5i/2J1jOY=
From 632ac28e7cef3012697e311c3413ef13d7be2f50 Mon Sep 17 00:00:00 2001
From: Cesar Solis <44058491+cdvelop@users.noreply.github.com>
Date: Tue, 21 Apr 2026 11:59:29 -0400
Subject: [PATCH 04/15] deps: update fmt to v0.23.5
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index 7b630c2..d2d14d2 100644
--- a/go.mod
+++ b/go.mod
@@ -4,4 +4,4 @@ go 1.25.2
require github.com/tinywasm/dom v0.7.0
-require github.com/tinywasm/fmt v0.23.4 // indirect
+require github.com/tinywasm/fmt v0.23.5 // indirect
diff --git a/go.sum b/go.sum
index 77f0bc7..eb069ab 100644
--- a/go.sum
+++ b/go.sum
@@ -1,4 +1,4 @@
github.com/tinywasm/dom v0.7.0 h1:drVhHRUptrBTLun/uZA3n+lbrS6vX5Q5iIDek2ZnGko=
github.com/tinywasm/dom v0.7.0/go.mod h1:9c27al9CgnLgQQg1CIhxbfxHSDeYP0R4MasOEW7O2bs=
-github.com/tinywasm/fmt v0.23.4 h1:55wPqse8p66MW2U275OqNb48hjgIv92C28zr7tBVXig=
-github.com/tinywasm/fmt v0.23.4/go.mod h1:L2GCAi6asgytPV6TVvGrRq5Ml+DkUt1Ijo5i/2J1jOY=
+github.com/tinywasm/fmt v0.23.5 h1:Z4KG6xQ0bvFXrJAKz/GjAb1FkLcH0Ckwmdn4KCXLnUo=
+github.com/tinywasm/fmt v0.23.5/go.mod h1:L2GCAi6asgytPV6TVvGrRq5Ml+DkUt1Ijo5i/2J1jOY=
From 483cd48c94c23fc6adc267a7d2f3b139fa917963 Mon Sep 17 00:00:00 2001
From: Cesar Solis <44058491+cdvelop@users.noreply.github.com>
Date: Wed, 22 Apr 2026 13:01:04 -0400
Subject: [PATCH 05/15] deps: update dom to v0.7.1
---
docs/PLAN.md | 37 +++++++++++++++++++++++++++++++++++++
go.mod | 2 +-
go.sum | 4 ++--
rightpanel/rightpanel.go | 3 +++
4 files changed, 43 insertions(+), 3 deletions(-)
create mode 100644 docs/PLAN.md
diff --git a/docs/PLAN.md b/docs/PLAN.md
new file mode 100644
index 0000000..55e2bcd
--- /dev/null
+++ b/docs/PLAN.md
@@ -0,0 +1,37 @@
+# PLAN: layout/rightpanel — Component slot embedding rule
+
+## Problem
+
+Passing a `dom.Component` implementor with a nil `*dom.Element` pointer to any RightPanel slot
+(Head, HeadControls, Article, AsideControls, Aside) causes a nil pointer panic in `dom` during render.
+
+**Root cause:** documented in `tinywasm/dom/docs/PLAN.md`. Summary: `dom.renderToHTML` calls
+`GetID()` on every Component child before rendering, which panics on a nil embedded pointer.
+
+## Rule for consumers of RightPanel
+
+All structs passed as RightPanel slots must embed `dom.Element` as a **value**, not a pointer.
+
+```go
+// ❌ Will panic at runtime
+type MyArticle struct {
+ *dom.Element
+ ...
+}
+
+// ✅ Correct
+type MyArticle struct {
+ dom.Element
+ ...
+}
+```
+
+## Action items
+
+- [x] Add this rule to the RightPanel usage docs in `rightpanel.go`
+ - Added IMPORTANT note in RightPanel docstring referencing tinywasm/dom rules
+- [ ] Add a compile-time or runtime check that rejects nil-embedded components
+ - Deferred: runtime guard in dom_frontend.go is sufficient for now
+- [ ] Consider accepting `dom.ViewRenderer` instead of (or in addition to) `dom.Component`
+ for slots, since all practical consumers implement `Render() *dom.Element`
+ - Deferred: architectural decision, beyond immediate scope
diff --git a/go.mod b/go.mod
index d2d14d2..8fcacb5 100644
--- a/go.mod
+++ b/go.mod
@@ -2,6 +2,6 @@ module github.com/tinywasm/layout
go 1.25.2
-require github.com/tinywasm/dom v0.7.0
+require github.com/tinywasm/dom v0.7.1
require github.com/tinywasm/fmt v0.23.5 // indirect
diff --git a/go.sum b/go.sum
index eb069ab..9cfc0b8 100644
--- a/go.sum
+++ b/go.sum
@@ -1,4 +1,4 @@
-github.com/tinywasm/dom v0.7.0 h1:drVhHRUptrBTLun/uZA3n+lbrS6vX5Q5iIDek2ZnGko=
-github.com/tinywasm/dom v0.7.0/go.mod h1:9c27al9CgnLgQQg1CIhxbfxHSDeYP0R4MasOEW7O2bs=
+github.com/tinywasm/dom v0.7.1 h1:BFtUeZwRQU6ZN09odeWrNn2mJ8ImvDGEWLrVdnBJ9Uo=
+github.com/tinywasm/dom v0.7.1/go.mod h1:/Ob8r/cDtjJzwKLXz9zaTeHG1FmxwEXCz45VDDMxiKo=
github.com/tinywasm/fmt v0.23.5 h1:Z4KG6xQ0bvFXrJAKz/GjAb1FkLcH0Ckwmdn4KCXLnUo=
github.com/tinywasm/fmt v0.23.5/go.mod h1:L2GCAi6asgytPV6TVvGrRq5Ml+DkUt1Ijo5i/2J1jOY=
diff --git a/rightpanel/rightpanel.go b/rightpanel/rightpanel.go
index 16190f9..d944757 100644
--- a/rightpanel/rightpanel.go
+++ b/rightpanel/rightpanel.go
@@ -15,6 +15,9 @@ type Module interface {
// All slots are optional. A nil slot is simply not rendered.
// The layout does not define what the slots contain — that is the consumer's job.
//
+// IMPORTANT: All dom.Component implementors passed as slots MUST embed dom.Element as a value,
+// not as a pointer. See tinywasm/dom interface.dom.go for details.
+//
// Usage:
//
// panel := &rightpanel.RightPanel{
From 86ffc9827816a86746258a0d776f50ebe0ec871c Mon Sep 17 00:00:00 2001
From: Cesar Solis <44058491+cdvelop@users.noreply.github.com>
Date: Wed, 22 Apr 2026 20:29:56 -0400
Subject: [PATCH 06/15] deps: update dom to v0.7.2
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index 8fcacb5..be515a0 100644
--- a/go.mod
+++ b/go.mod
@@ -2,6 +2,6 @@ module github.com/tinywasm/layout
go 1.25.2
-require github.com/tinywasm/dom v0.7.1
+require github.com/tinywasm/dom v0.7.2
require github.com/tinywasm/fmt v0.23.5 // indirect
diff --git a/go.sum b/go.sum
index 9cfc0b8..88577eb 100644
--- a/go.sum
+++ b/go.sum
@@ -1,4 +1,4 @@
-github.com/tinywasm/dom v0.7.1 h1:BFtUeZwRQU6ZN09odeWrNn2mJ8ImvDGEWLrVdnBJ9Uo=
-github.com/tinywasm/dom v0.7.1/go.mod h1:/Ob8r/cDtjJzwKLXz9zaTeHG1FmxwEXCz45VDDMxiKo=
+github.com/tinywasm/dom v0.7.2 h1:0Lxl5BSIh1tqp1ZXyuoU/W27O2m6hhktoNfKz1Y7wlU=
+github.com/tinywasm/dom v0.7.2/go.mod h1:/Ob8r/cDtjJzwKLXz9zaTeHG1FmxwEXCz45VDDMxiKo=
github.com/tinywasm/fmt v0.23.5 h1:Z4KG6xQ0bvFXrJAKz/GjAb1FkLcH0Ckwmdn4KCXLnUo=
github.com/tinywasm/fmt v0.23.5/go.mod h1:L2GCAi6asgytPV6TVvGrRq5Ml+DkUt1Ijo5i/2J1jOY=
From 9d77721aa482fa78676760959222ef40abb73492 Mon Sep 17 00:00:00 2001
From: Cesar Solis <44058491+cdvelop@users.noreply.github.com>
Date: Thu, 23 Apr 2026 19:51:11 -0400
Subject: [PATCH 07/15] deps: update dom to v0.7.3
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index be515a0..b41e4dc 100644
--- a/go.mod
+++ b/go.mod
@@ -2,6 +2,6 @@ module github.com/tinywasm/layout
go 1.25.2
-require github.com/tinywasm/dom v0.7.2
+require github.com/tinywasm/dom v0.7.3
require github.com/tinywasm/fmt v0.23.5 // indirect
diff --git a/go.sum b/go.sum
index 88577eb..3112983 100644
--- a/go.sum
+++ b/go.sum
@@ -1,4 +1,4 @@
-github.com/tinywasm/dom v0.7.2 h1:0Lxl5BSIh1tqp1ZXyuoU/W27O2m6hhktoNfKz1Y7wlU=
-github.com/tinywasm/dom v0.7.2/go.mod h1:/Ob8r/cDtjJzwKLXz9zaTeHG1FmxwEXCz45VDDMxiKo=
+github.com/tinywasm/dom v0.7.3 h1:d30m9mvjk4VRwjq2x9w6tRsZaZOUJ8burN2Ou7U9v6U=
+github.com/tinywasm/dom v0.7.3/go.mod h1:/Ob8r/cDtjJzwKLXz9zaTeHG1FmxwEXCz45VDDMxiKo=
github.com/tinywasm/fmt v0.23.5 h1:Z4KG6xQ0bvFXrJAKz/GjAb1FkLcH0Ckwmdn4KCXLnUo=
github.com/tinywasm/fmt v0.23.5/go.mod h1:L2GCAi6asgytPV6TVvGrRq5Ml+DkUt1Ijo5i/2J1jOY=
From 280d7bba36513a051480c68d9b9827963c2187c0 Mon Sep 17 00:00:00 2001
From: Cesar Solis <44058491+cdvelop@users.noreply.github.com>
Date: Sat, 25 Apr 2026 11:52:25 -0400
Subject: [PATCH 08/15] deps: update fmt to v0.23.6
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index b41e4dc..5309c90 100644
--- a/go.mod
+++ b/go.mod
@@ -4,4 +4,4 @@ go 1.25.2
require github.com/tinywasm/dom v0.7.3
-require github.com/tinywasm/fmt v0.23.5 // indirect
+require github.com/tinywasm/fmt v0.23.6 // indirect
diff --git a/go.sum b/go.sum
index 3112983..ad0f885 100644
--- a/go.sum
+++ b/go.sum
@@ -1,4 +1,4 @@
github.com/tinywasm/dom v0.7.3 h1:d30m9mvjk4VRwjq2x9w6tRsZaZOUJ8burN2Ou7U9v6U=
github.com/tinywasm/dom v0.7.3/go.mod h1:/Ob8r/cDtjJzwKLXz9zaTeHG1FmxwEXCz45VDDMxiKo=
-github.com/tinywasm/fmt v0.23.5 h1:Z4KG6xQ0bvFXrJAKz/GjAb1FkLcH0Ckwmdn4KCXLnUo=
-github.com/tinywasm/fmt v0.23.5/go.mod h1:L2GCAi6asgytPV6TVvGrRq5Ml+DkUt1Ijo5i/2J1jOY=
+github.com/tinywasm/fmt v0.23.6 h1:DXugqAD98VEeBKeguQqAWHzUnxhuESHRTDinyNHlSpk=
+github.com/tinywasm/fmt v0.23.6/go.mod h1:L2GCAi6asgytPV6TVvGrRq5Ml+DkUt1Ijo5i/2J1jOY=
From 085d787f966f629c3ad40cc746a2e8e7b6b76582 Mon Sep 17 00:00:00 2001
From: Cesar Solis <44058491+cdvelop@users.noreply.github.com>
Date: Mon, 27 Apr 2026 11:16:24 -0400
Subject: [PATCH 09/15] deps: update dom to v0.7.4
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index 5309c90..5d71af7 100644
--- a/go.mod
+++ b/go.mod
@@ -2,6 +2,6 @@ module github.com/tinywasm/layout
go 1.25.2
-require github.com/tinywasm/dom v0.7.3
+require github.com/tinywasm/dom v0.7.4
require github.com/tinywasm/fmt v0.23.6 // indirect
diff --git a/go.sum b/go.sum
index ad0f885..b79062d 100644
--- a/go.sum
+++ b/go.sum
@@ -1,4 +1,4 @@
-github.com/tinywasm/dom v0.7.3 h1:d30m9mvjk4VRwjq2x9w6tRsZaZOUJ8burN2Ou7U9v6U=
-github.com/tinywasm/dom v0.7.3/go.mod h1:/Ob8r/cDtjJzwKLXz9zaTeHG1FmxwEXCz45VDDMxiKo=
+github.com/tinywasm/dom v0.7.4 h1:qpREsvZDS8RVvPTfUC6HpynEDNxtENTQ969BSmmmSLY=
+github.com/tinywasm/dom v0.7.4/go.mod h1:z2iJL8qpP4dwcaIm441jc9XfM5bGUVtlH2YG+pfG45c=
github.com/tinywasm/fmt v0.23.6 h1:DXugqAD98VEeBKeguQqAWHzUnxhuESHRTDinyNHlSpk=
github.com/tinywasm/fmt v0.23.6/go.mod h1:L2GCAi6asgytPV6TVvGrRq5Ml+DkUt1Ijo5i/2J1jOY=
From c89646c927d3f02c045c3d0459a28d2ef8edd2d8 Mon Sep 17 00:00:00 2001
From: Cesar Solis <44058491+cdvelop@users.noreply.github.com>
Date: Mon, 27 Apr 2026 12:34:39 -0400
Subject: [PATCH 10/15] deps: update dom to v0.7.5
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index 5d71af7..dd7365e 100644
--- a/go.mod
+++ b/go.mod
@@ -2,6 +2,6 @@ module github.com/tinywasm/layout
go 1.25.2
-require github.com/tinywasm/dom v0.7.4
+require github.com/tinywasm/dom v0.7.5
require github.com/tinywasm/fmt v0.23.6 // indirect
diff --git a/go.sum b/go.sum
index b79062d..7a44e8c 100644
--- a/go.sum
+++ b/go.sum
@@ -1,4 +1,4 @@
-github.com/tinywasm/dom v0.7.4 h1:qpREsvZDS8RVvPTfUC6HpynEDNxtENTQ969BSmmmSLY=
-github.com/tinywasm/dom v0.7.4/go.mod h1:z2iJL8qpP4dwcaIm441jc9XfM5bGUVtlH2YG+pfG45c=
+github.com/tinywasm/dom v0.7.5 h1:mfPu/CoCy9rl5rGnA0/jEcLytoprqDXtJWjYaw7hnHI=
+github.com/tinywasm/dom v0.7.5/go.mod h1:z2iJL8qpP4dwcaIm441jc9XfM5bGUVtlH2YG+pfG45c=
github.com/tinywasm/fmt v0.23.6 h1:DXugqAD98VEeBKeguQqAWHzUnxhuESHRTDinyNHlSpk=
github.com/tinywasm/fmt v0.23.6/go.mod h1:L2GCAi6asgytPV6TVvGrRq5Ml+DkUt1Ijo5i/2J1jOY=
From 86cac23bf79537b60ace7f418a280faab7c6cbc7 Mon Sep 17 00:00:00 2001
From: Cesar Solis <44058491+cdvelop@users.noreply.github.com>
Date: Mon, 27 Apr 2026 13:30:15 -0400
Subject: [PATCH 11/15] deps: update dom to v0.7.6
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index dd7365e..a95dcd3 100644
--- a/go.mod
+++ b/go.mod
@@ -2,6 +2,6 @@ module github.com/tinywasm/layout
go 1.25.2
-require github.com/tinywasm/dom v0.7.5
+require github.com/tinywasm/dom v0.7.6
require github.com/tinywasm/fmt v0.23.6 // indirect
diff --git a/go.sum b/go.sum
index 7a44e8c..2f6ebe3 100644
--- a/go.sum
+++ b/go.sum
@@ -1,4 +1,4 @@
-github.com/tinywasm/dom v0.7.5 h1:mfPu/CoCy9rl5rGnA0/jEcLytoprqDXtJWjYaw7hnHI=
-github.com/tinywasm/dom v0.7.5/go.mod h1:z2iJL8qpP4dwcaIm441jc9XfM5bGUVtlH2YG+pfG45c=
+github.com/tinywasm/dom v0.7.6 h1:whZS4TPdqKF2wzQdFdflxuuPYevHN0OiwmzN0a4071g=
+github.com/tinywasm/dom v0.7.6/go.mod h1:z2iJL8qpP4dwcaIm441jc9XfM5bGUVtlH2YG+pfG45c=
github.com/tinywasm/fmt v0.23.6 h1:DXugqAD98VEeBKeguQqAWHzUnxhuESHRTDinyNHlSpk=
github.com/tinywasm/fmt v0.23.6/go.mod h1:L2GCAi6asgytPV6TVvGrRq5Ml+DkUt1Ijo5i/2J1jOY=
From eaf9928aeac917d2b34201699cedfd0d43513bdc Mon Sep 17 00:00:00 2001
From: Cesar Solis <44058491+cdvelop@users.noreply.github.com>
Date: Mon, 27 Apr 2026 13:35:21 -0400
Subject: [PATCH 12/15] deps: update dom to v0.7.7
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index a95dcd3..869d0e1 100644
--- a/go.mod
+++ b/go.mod
@@ -2,6 +2,6 @@ module github.com/tinywasm/layout
go 1.25.2
-require github.com/tinywasm/dom v0.7.6
+require github.com/tinywasm/dom v0.7.7
require github.com/tinywasm/fmt v0.23.6 // indirect
diff --git a/go.sum b/go.sum
index 2f6ebe3..8986702 100644
--- a/go.sum
+++ b/go.sum
@@ -1,4 +1,4 @@
-github.com/tinywasm/dom v0.7.6 h1:whZS4TPdqKF2wzQdFdflxuuPYevHN0OiwmzN0a4071g=
-github.com/tinywasm/dom v0.7.6/go.mod h1:z2iJL8qpP4dwcaIm441jc9XfM5bGUVtlH2YG+pfG45c=
+github.com/tinywasm/dom v0.7.7 h1:6NLFq14c/ao4AzyUu2vqvvb2hQQHslyZpCEipUGkCGw=
+github.com/tinywasm/dom v0.7.7/go.mod h1:z2iJL8qpP4dwcaIm441jc9XfM5bGUVtlH2YG+pfG45c=
github.com/tinywasm/fmt v0.23.6 h1:DXugqAD98VEeBKeguQqAWHzUnxhuESHRTDinyNHlSpk=
github.com/tinywasm/fmt v0.23.6/go.mod h1:L2GCAi6asgytPV6TVvGrRq5Ml+DkUt1Ijo5i/2J1jOY=
From 9fdaf7eecfc701a1f30662790d662eee6e36b47c Mon Sep 17 00:00:00 2001
From: Cesar Solis <44058491+cdvelop@users.noreply.github.com>
Date: Tue, 28 Apr 2026 10:30:26 -0400
Subject: [PATCH 13/15] deps: update dom to v0.7.8
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index 869d0e1..122613c 100644
--- a/go.mod
+++ b/go.mod
@@ -2,6 +2,6 @@ module github.com/tinywasm/layout
go 1.25.2
-require github.com/tinywasm/dom v0.7.7
+require github.com/tinywasm/dom v0.7.8
require github.com/tinywasm/fmt v0.23.6 // indirect
diff --git a/go.sum b/go.sum
index 8986702..7f2c5b3 100644
--- a/go.sum
+++ b/go.sum
@@ -1,4 +1,4 @@
-github.com/tinywasm/dom v0.7.7 h1:6NLFq14c/ao4AzyUu2vqvvb2hQQHslyZpCEipUGkCGw=
-github.com/tinywasm/dom v0.7.7/go.mod h1:z2iJL8qpP4dwcaIm441jc9XfM5bGUVtlH2YG+pfG45c=
+github.com/tinywasm/dom v0.7.8 h1:PPZjzJjnUXAqBdho9gG7fsiDtySQcOPmVxxQhSOPGaI=
+github.com/tinywasm/dom v0.7.8/go.mod h1:z2iJL8qpP4dwcaIm441jc9XfM5bGUVtlH2YG+pfG45c=
github.com/tinywasm/fmt v0.23.6 h1:DXugqAD98VEeBKeguQqAWHzUnxhuESHRTDinyNHlSpk=
github.com/tinywasm/fmt v0.23.6/go.mod h1:L2GCAi6asgytPV6TVvGrRq5Ml+DkUt1Ijo5i/2J1jOY=
From 44570af5a0c4cbee5d9fac070ef0e7f00ab1564e Mon Sep 17 00:00:00 2001
From: Cesar Solis <44058491+cdvelop@users.noreply.github.com>
Date: Tue, 28 Apr 2026 10:55:06 -0400
Subject: [PATCH 14/15] deps: update dom to v0.7.9
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index 122613c..5c1dcf1 100644
--- a/go.mod
+++ b/go.mod
@@ -2,6 +2,6 @@ module github.com/tinywasm/layout
go 1.25.2
-require github.com/tinywasm/dom v0.7.8
+require github.com/tinywasm/dom v0.7.9
require github.com/tinywasm/fmt v0.23.6 // indirect
diff --git a/go.sum b/go.sum
index 7f2c5b3..84f443e 100644
--- a/go.sum
+++ b/go.sum
@@ -1,4 +1,4 @@
-github.com/tinywasm/dom v0.7.8 h1:PPZjzJjnUXAqBdho9gG7fsiDtySQcOPmVxxQhSOPGaI=
-github.com/tinywasm/dom v0.7.8/go.mod h1:z2iJL8qpP4dwcaIm441jc9XfM5bGUVtlH2YG+pfG45c=
+github.com/tinywasm/dom v0.7.9 h1:b3sxrHZlwofhJAmugiE7ZRP1q+qVMYoNT1Jsm2eBwIc=
+github.com/tinywasm/dom v0.7.9/go.mod h1:z2iJL8qpP4dwcaIm441jc9XfM5bGUVtlH2YG+pfG45c=
github.com/tinywasm/fmt v0.23.6 h1:DXugqAD98VEeBKeguQqAWHzUnxhuESHRTDinyNHlSpk=
github.com/tinywasm/fmt v0.23.6/go.mod h1:L2GCAi6asgytPV6TVvGrRq5Ml+DkUt1Ijo5i/2J1jOY=
From 6df2f1f55a8aac63c10e0f1de91a94f70cf76447 Mon Sep 17 00:00:00 2001
From: Cesar Solis <44058491+cdvelop@users.noreply.github.com>
Date: Thu, 30 Apr 2026 10:48:52 -0400
Subject: [PATCH 15/15] deps: update dom to v0.7.10
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index 5c1dcf1..25e0d66 100644
--- a/go.mod
+++ b/go.mod
@@ -2,6 +2,6 @@ module github.com/tinywasm/layout
go 1.25.2
-require github.com/tinywasm/dom v0.7.9
+require github.com/tinywasm/dom v0.7.10
require github.com/tinywasm/fmt v0.23.6 // indirect
diff --git a/go.sum b/go.sum
index 84f443e..0965d24 100644
--- a/go.sum
+++ b/go.sum
@@ -1,4 +1,4 @@
-github.com/tinywasm/dom v0.7.9 h1:b3sxrHZlwofhJAmugiE7ZRP1q+qVMYoNT1Jsm2eBwIc=
-github.com/tinywasm/dom v0.7.9/go.mod h1:z2iJL8qpP4dwcaIm441jc9XfM5bGUVtlH2YG+pfG45c=
+github.com/tinywasm/dom v0.7.10 h1:ioiZ0ZsdXyzss83AkHKs98yDEjFk5fbAO3sODerPyTU=
+github.com/tinywasm/dom v0.7.10/go.mod h1:z2iJL8qpP4dwcaIm441jc9XfM5bGUVtlH2YG+pfG45c=
github.com/tinywasm/fmt v0.23.6 h1:DXugqAD98VEeBKeguQqAWHzUnxhuESHRTDinyNHlSpk=
github.com/tinywasm/fmt v0.23.6/go.mod h1:L2GCAi6asgytPV6TVvGrRq5Ml+DkUt1Ijo5i/2J1jOY=