PathrockNetwork Gno Explorer
HomeBlocksTransactionsTokensRealmsPackagesValidatorsAnalytics

PathrockNetwork Gno Explorer — an independent explorer for Gno.land Mainnet (gnoland-1), operated by PathrockNetwork. Not an official Gno.land service.

gnowebarchive RPC

gno.land/r/g1lnkytfqcjwllws63gvf0mv9yt04aswy4y9amhm/home/theme/v0

Realm
Open in gnoweb ↗

Overview

Kind
Realm (renderable)
Name
v0
Namespace
g1lnkytfqcjwllws63gvf0mv9yt04aswy4y9amhm / home / theme
Files
3 (gnomod.toml)
Exported functions
1
Module
gno.land/r/g1lnkytfqcjwllws63gvf0mv9yt04aswy4y9amhm/home/theme/v0
gno
0.9

Files (3)

  • gnomod.tomltoml
  • theme.gnogno
  • theme_test.gnogno
theme_test.gnogno
1package theme23import (4	"encoding/base64"5	"strings"6	"testing"78	"gno.land/p/nt/uassert/v0"9	"gno.land/r/g1lnkytfqcjwllws63gvf0mv9yt04aswy4y9amhm/home"10)1112const self = "gno.land/r/g1lnkytfqcjwllws63gvf0mv9yt04aswy4y9amhm/home/theme/v0"1314// install stands in for the deploy-and-accept sequence: the harness does not15// deliver this realm's init as a transaction, so the registration is redone16// here, then accepted by the authority.17func install(cur realm) {18	testing.SetRealm(testing.NewCodeRealm(self))19	home.Register(cross(cur), instance)20	testing.SetRealm(testing.NewUserRealm(home.Admin))21	home.Accept(cross(cur), self)22}2324func set(cur realm, slug, body string) {25	testing.SetRealm(testing.NewUserRealm(home.Admin))26	home.Set(cross(cur), slug, body)27}2829// decodeCard pulls the SVG back out of the first data: image in out.30func decodeCard(t *testing.T, out string) string {31	const marker = "data:image/svg+xml;base64,"32	i := strings.Index(out, marker)33	if i < 0 {34		t.Fatalf("no svg image in output:\n%s", out)35	}36	rest := out[i+len(marker):]37	end := strings.Index(rest, ")")38	raw, err := base64.StdEncoding.DecodeString(rest[:end])39	uassert.NoError(t, err)40	return string(raw)41}4243func TestRenderProfilePage(cur realm, t *testing.T) {44	if home.LivePath() != self {45		install(cur)46	}47	set(cur, "name", "Clockwork")48	set(cur, "tagline", "Lead Frontend Engineer <at> AiB")49	set(cur, "handle", "@clockworkgr")50	set(cur, "now", "shipping")5152	out := home.Render("")53	uassert.True(t, strings.HasPrefix(out, "![Clockwork](data:image/svg+xml;base64,"), out)54	uassert.True(t, strings.Contains(out, "## Now\n\nshipping\n"), out)55	uassert.True(t, strings.Contains(out, "<gno-columns>"), out)56	uassert.True(t, strings.Contains(out, ":intro:"), "an unset slot stays visible: "+out)57	uassert.True(t, strings.Contains(out, "theme `"+self+"`"), out)58	uassert.True(t, strings.Contains(out, "[edit](/r/g1lnkytfqcjwllws63gvf0mv9yt04aswy4y9amhm/home:edit)"), out)5960	svg := decodeCard(t, out)61	uassert.True(t, strings.Contains(svg, ">Clockwork</text>"), svg)62	uassert.True(t, strings.Contains(svg, "Lead Frontend Engineer &lt;at&gt; AiB"), "text is escaped: "+svg)63	uassert.True(t, strings.Contains(svg, "@clockworkgr · rev "), svg)64	uassert.True(t, strings.Contains(svg, `fill="#D9A441"`), "default accent: "+svg)65}6667func TestStyleKnobs(cur realm, t *testing.T) {68	if home.LivePath() != self {69		install(cur)70	}71	set(cur, "name", "Clockwork")72	set(cur, "layout", ":header:\n\n:divider:\n")7374	set(cur, "style.accent", "#00AAFF")75	svg := decodeCard(t, home.Render(""))76	uassert.True(t, strings.Contains(svg, `fill="#00AAFF"`), svg)7778	set(cur, "style.accent", "red; injected")79	svg = decodeCard(t, home.Render(""))80	uassert.True(t, strings.Contains(svg, `fill="#D9A441"`), "a malformed color falls back: "+svg)81	uassert.False(t, strings.Contains(svg, "injected"))8283	set(cur, "style.header", "plain")84	out := home.Render("")85	uassert.True(t, strings.HasPrefix(out, "# Clockwork\n"), out)86	uassert.True(t, strings.Contains(out, "data:image/svg+xml"), "the divider is still an image")8788	set(cur, "style.header", "none")89	out = home.Render("")90	uassert.True(t, strings.HasPrefix(out, "\n\n![](data:image/svg+xml"), out)91}9293func TestOtherPathsDelegate(cur realm, t *testing.T) {94	if home.LivePath() != self {95		install(cur)96	}97	uassert.True(t, strings.Contains(home.Render("slots"), "# Slots"))98	uassert.True(t, strings.Contains(home.Render("system"), "["+self+"]"))99	uassert.True(t, strings.Contains(home.Render("edit"), "<gno-form exec=\"Set\">"))100}101102func TestHexColor(t *testing.T) {103	uassert.True(t, isHexColor("#abcdef"))104	uassert.True(t, isHexColor("#ABCDEF"))105	uassert.False(t, isHexColor("abcdef"))106	uassert.False(t, isHexColor("#abc"))107	uassert.False(t, isHexColor("#abcdeg"))108	uassert.False(t, isHexColor("#abcdef\" onload=\"x"))109}110

Functions

  • Instance() interface {Render func(string) string}

Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.

Rendered

RenderedRawgnoweb ↗

Render unavailable

rate limit exceeded — the render query is served by the Gnoland archive RPC.

vm/qrender output, sanitized (docs/render-security.md) and displayed in an empty-sandbox iframe — scripts, forms and popups cannot run. Links stay inert in-preview; right-click to open.