diff --git a/abi/proto/v1/render.proto b/abi/proto/v1/render.proto
index 54f62c8..dda13fa 100644
--- a/abi/proto/v1/render.proto
+++ b/abi/proto/v1/render.proto
@@ -55,7 +55,27 @@ message RenderTemplateRequest {
}
message RenderTemplateResponse {
- bytes html = 1;
+ // Field 1 was `bytes html` — the guest-rendered full document, retired
+ // flag-day in P3 (host-side chrome composition). Reserved so a stale
+ // pre-v0.2.0 artifact decodes to an EMPTY document and the host can fail
+ // that render with an explicit republish error instead of mis-parsing.
+ reserved 1;
+ TemplateDocument document = 2;
+}
+
+// TemplateDocument is a guest template's contribution to a page. The HOST
+// owns the document envelope: it composes doctype//
/ with
+// the cms-authored bn chrome, built from the same doc map it sent the guest
+// as doc_json (see cms docs/superpowers/specs/2026-07-07-host-chrome-injection-design.md).
+message TemplateDocument {
+ bytes body_html = 1; // inner content
+ string body_class = 2; //
+ string lang = 3; // ; empty means host default "en"
+ bytes head_extra_html = 4; // appended inside , after bn.Head
+ bytes body_end_extra_html = 5; // appended before , after bn.BodyEnd
+ // Extra -element attributes (e.g. data-theme). A "lang" key here is
+ // ignored — the lang field wins.
+ map html_attrs = 6;
}
// RenderTagRequest invokes a plugin-declared template tag (HOOK_RENDER_TAG).
diff --git a/abi/v1/render.pb.go b/abi/v1/render.pb.go
index 8238edb..2f2841e 100644
--- a/abi/v1/render.pb.go
+++ b/abi/v1/render.pb.go
@@ -274,7 +274,7 @@ func (x *RenderTemplateRequest) GetRenderContext() *RenderContext {
type RenderTemplateResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
- Html []byte `protobuf:"bytes,1,opt,name=html,proto3" json:"html,omitempty"`
+ Document *TemplateDocument `protobuf:"bytes,2,opt,name=document,proto3" json:"document,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
@@ -309,9 +309,99 @@ func (*RenderTemplateResponse) Descriptor() ([]byte, []int) {
return file_v1_render_proto_rawDescGZIP(), []int{4}
}
-func (x *RenderTemplateResponse) GetHtml() []byte {
+func (x *RenderTemplateResponse) GetDocument() *TemplateDocument {
if x != nil {
- return x.Html
+ return x.Document
+ }
+ return nil
+}
+
+// TemplateDocument is a guest template's contribution to a page. The HOST
+// owns the document envelope: it composes doctype/// with
+// the cms-authored bn chrome, built from the same doc map it sent the guest
+// as doc_json (see cms docs/superpowers/specs/2026-07-07-host-chrome-injection-design.md).
+type TemplateDocument struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ BodyHtml []byte `protobuf:"bytes,1,opt,name=body_html,json=bodyHtml,proto3" json:"body_html,omitempty"` // inner content
+ BodyClass string `protobuf:"bytes,2,opt,name=body_class,json=bodyClass,proto3" json:"body_class,omitempty"` //
+ Lang string `protobuf:"bytes,3,opt,name=lang,proto3" json:"lang,omitempty"` // ; empty means host default "en"
+ HeadExtraHtml []byte `protobuf:"bytes,4,opt,name=head_extra_html,json=headExtraHtml,proto3" json:"head_extra_html,omitempty"` // appended inside , after bn.Head
+ BodyEndExtraHtml []byte `protobuf:"bytes,5,opt,name=body_end_extra_html,json=bodyEndExtraHtml,proto3" json:"body_end_extra_html,omitempty"` // appended before , after bn.BodyEnd
+ // Extra -element attributes (e.g. data-theme). A "lang" key here is
+ // ignored — the lang field wins.
+ HtmlAttrs map[string]string `protobuf:"bytes,6,rep,name=html_attrs,json=htmlAttrs,proto3" json:"html_attrs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *TemplateDocument) Reset() {
+ *x = TemplateDocument{}
+ mi := &file_v1_render_proto_msgTypes[5]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *TemplateDocument) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TemplateDocument) ProtoMessage() {}
+
+func (x *TemplateDocument) ProtoReflect() protoreflect.Message {
+ mi := &file_v1_render_proto_msgTypes[5]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use TemplateDocument.ProtoReflect.Descriptor instead.
+func (*TemplateDocument) Descriptor() ([]byte, []int) {
+ return file_v1_render_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *TemplateDocument) GetBodyHtml() []byte {
+ if x != nil {
+ return x.BodyHtml
+ }
+ return nil
+}
+
+func (x *TemplateDocument) GetBodyClass() string {
+ if x != nil {
+ return x.BodyClass
+ }
+ return ""
+}
+
+func (x *TemplateDocument) GetLang() string {
+ if x != nil {
+ return x.Lang
+ }
+ return ""
+}
+
+func (x *TemplateDocument) GetHeadExtraHtml() []byte {
+ if x != nil {
+ return x.HeadExtraHtml
+ }
+ return nil
+}
+
+func (x *TemplateDocument) GetBodyEndExtraHtml() []byte {
+ if x != nil {
+ return x.BodyEndExtraHtml
+ }
+ return nil
+}
+
+func (x *TemplateDocument) GetHtmlAttrs() map[string]string {
+ if x != nil {
+ return x.HtmlAttrs
}
return nil
}
@@ -334,7 +424,7 @@ type RenderTagRequest struct {
func (x *RenderTagRequest) Reset() {
*x = RenderTagRequest{}
- mi := &file_v1_render_proto_msgTypes[5]
+ mi := &file_v1_render_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -346,7 +436,7 @@ func (x *RenderTagRequest) String() string {
func (*RenderTagRequest) ProtoMessage() {}
func (x *RenderTagRequest) ProtoReflect() protoreflect.Message {
- mi := &file_v1_render_proto_msgTypes[5]
+ mi := &file_v1_render_proto_msgTypes[6]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -359,7 +449,7 @@ func (x *RenderTagRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use RenderTagRequest.ProtoReflect.Descriptor instead.
func (*RenderTagRequest) Descriptor() ([]byte, []int) {
- return file_v1_render_proto_rawDescGZIP(), []int{5}
+ return file_v1_render_proto_rawDescGZIP(), []int{6}
}
func (x *RenderTagRequest) GetTagName() string {
@@ -396,7 +486,7 @@ type RenderTagResponse struct {
func (x *RenderTagResponse) Reset() {
*x = RenderTagResponse{}
- mi := &file_v1_render_proto_msgTypes[6]
+ mi := &file_v1_render_proto_msgTypes[7]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -408,7 +498,7 @@ func (x *RenderTagResponse) String() string {
func (*RenderTagResponse) ProtoMessage() {}
func (x *RenderTagResponse) ProtoReflect() protoreflect.Message {
- mi := &file_v1_render_proto_msgTypes[6]
+ mi := &file_v1_render_proto_msgTypes[7]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -421,7 +511,7 @@ func (x *RenderTagResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use RenderTagResponse.ProtoReflect.Descriptor instead.
func (*RenderTagResponse) Descriptor() ([]byte, []int) {
- return file_v1_render_proto_rawDescGZIP(), []int{6}
+ return file_v1_render_proto_rawDescGZIP(), []int{7}
}
func (x *RenderTagResponse) GetHtml() string {
@@ -454,7 +544,7 @@ type ApplyFilterRequest struct {
func (x *ApplyFilterRequest) Reset() {
*x = ApplyFilterRequest{}
- mi := &file_v1_render_proto_msgTypes[7]
+ mi := &file_v1_render_proto_msgTypes[8]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -466,7 +556,7 @@ func (x *ApplyFilterRequest) String() string {
func (*ApplyFilterRequest) ProtoMessage() {}
func (x *ApplyFilterRequest) ProtoReflect() protoreflect.Message {
- mi := &file_v1_render_proto_msgTypes[7]
+ mi := &file_v1_render_proto_msgTypes[8]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -479,7 +569,7 @@ func (x *ApplyFilterRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use ApplyFilterRequest.ProtoReflect.Descriptor instead.
func (*ApplyFilterRequest) Descriptor() ([]byte, []int) {
- return file_v1_render_proto_rawDescGZIP(), []int{7}
+ return file_v1_render_proto_rawDescGZIP(), []int{8}
}
func (x *ApplyFilterRequest) GetFilterName() string {
@@ -515,7 +605,7 @@ type ApplyFilterResponse struct {
func (x *ApplyFilterResponse) Reset() {
*x = ApplyFilterResponse{}
- mi := &file_v1_render_proto_msgTypes[8]
+ mi := &file_v1_render_proto_msgTypes[9]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -527,7 +617,7 @@ func (x *ApplyFilterResponse) String() string {
func (*ApplyFilterResponse) ProtoMessage() {}
func (x *ApplyFilterResponse) ProtoReflect() protoreflect.Message {
- mi := &file_v1_render_proto_msgTypes[8]
+ mi := &file_v1_render_proto_msgTypes[9]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -540,7 +630,7 @@ func (x *ApplyFilterResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use ApplyFilterResponse.ProtoReflect.Descriptor instead.
func (*ApplyFilterResponse) Descriptor() ([]byte, []int) {
- return file_v1_render_proto_rawDescGZIP(), []int{8}
+ return file_v1_render_proto_rawDescGZIP(), []int{9}
}
func (x *ApplyFilterResponse) GetOutput() string {
@@ -604,7 +694,7 @@ type RenderContext struct {
func (x *RenderContext) Reset() {
*x = RenderContext{}
- mi := &file_v1_render_proto_msgTypes[9]
+ mi := &file_v1_render_proto_msgTypes[10]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -616,7 +706,7 @@ func (x *RenderContext) String() string {
func (*RenderContext) ProtoMessage() {}
func (x *RenderContext) ProtoReflect() protoreflect.Message {
- mi := &file_v1_render_proto_msgTypes[9]
+ mi := &file_v1_render_proto_msgTypes[10]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -629,7 +719,7 @@ func (x *RenderContext) ProtoReflect() protoreflect.Message {
// Deprecated: Use RenderContext.ProtoReflect.Descriptor instead.
func (*RenderContext) Descriptor() ([]byte, []int) {
- return file_v1_render_proto_rawDescGZIP(), []int{9}
+ return file_v1_render_proto_rawDescGZIP(), []int{10}
}
func (x *RenderContext) GetRequest() *RequestInfo {
@@ -778,7 +868,7 @@ type RequestInfo struct {
func (x *RequestInfo) Reset() {
*x = RequestInfo{}
- mi := &file_v1_render_proto_msgTypes[10]
+ mi := &file_v1_render_proto_msgTypes[11]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -790,7 +880,7 @@ func (x *RequestInfo) String() string {
func (*RequestInfo) ProtoMessage() {}
func (x *RequestInfo) ProtoReflect() protoreflect.Message {
- mi := &file_v1_render_proto_msgTypes[10]
+ mi := &file_v1_render_proto_msgTypes[11]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -803,7 +893,7 @@ func (x *RequestInfo) ProtoReflect() protoreflect.Message {
// Deprecated: Use RequestInfo.ProtoReflect.Descriptor instead.
func (*RequestInfo) Descriptor() ([]byte, []int) {
- return file_v1_render_proto_rawDescGZIP(), []int{10}
+ return file_v1_render_proto_rawDescGZIP(), []int{11}
}
func (x *RequestInfo) GetMethod() string {
@@ -890,7 +980,7 @@ type PageContext struct {
func (x *PageContext) Reset() {
*x = PageContext{}
- mi := &file_v1_render_proto_msgTypes[11]
+ mi := &file_v1_render_proto_msgTypes[12]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -902,7 +992,7 @@ func (x *PageContext) String() string {
func (*PageContext) ProtoMessage() {}
func (x *PageContext) ProtoReflect() protoreflect.Message {
- mi := &file_v1_render_proto_msgTypes[11]
+ mi := &file_v1_render_proto_msgTypes[12]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -915,7 +1005,7 @@ func (x *PageContext) ProtoReflect() protoreflect.Message {
// Deprecated: Use PageContext.ProtoReflect.Descriptor instead.
func (*PageContext) Descriptor() ([]byte, []int) {
- return file_v1_render_proto_rawDescGZIP(), []int{11}
+ return file_v1_render_proto_rawDescGZIP(), []int{12}
}
func (x *PageContext) GetId() string {
@@ -971,7 +1061,7 @@ type PostContext struct {
func (x *PostContext) Reset() {
*x = PostContext{}
- mi := &file_v1_render_proto_msgTypes[12]
+ mi := &file_v1_render_proto_msgTypes[13]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -983,7 +1073,7 @@ func (x *PostContext) String() string {
func (*PostContext) ProtoMessage() {}
func (x *PostContext) ProtoReflect() protoreflect.Message {
- mi := &file_v1_render_proto_msgTypes[12]
+ mi := &file_v1_render_proto_msgTypes[13]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -996,7 +1086,7 @@ func (x *PostContext) ProtoReflect() protoreflect.Message {
// Deprecated: Use PostContext.ProtoReflect.Descriptor instead.
func (*PostContext) Descriptor() ([]byte, []int) {
- return file_v1_render_proto_rawDescGZIP(), []int{12}
+ return file_v1_render_proto_rawDescGZIP(), []int{13}
}
func (x *PostContext) GetId() string {
@@ -1076,7 +1166,7 @@ type AuthorContext struct {
func (x *AuthorContext) Reset() {
*x = AuthorContext{}
- mi := &file_v1_render_proto_msgTypes[13]
+ mi := &file_v1_render_proto_msgTypes[14]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1088,7 +1178,7 @@ func (x *AuthorContext) String() string {
func (*AuthorContext) ProtoMessage() {}
func (x *AuthorContext) ProtoReflect() protoreflect.Message {
- mi := &file_v1_render_proto_msgTypes[13]
+ mi := &file_v1_render_proto_msgTypes[14]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1101,7 +1191,7 @@ func (x *AuthorContext) ProtoReflect() protoreflect.Message {
// Deprecated: Use AuthorContext.ProtoReflect.Descriptor instead.
func (*AuthorContext) Descriptor() ([]byte, []int) {
- return file_v1_render_proto_rawDescGZIP(), []int{13}
+ return file_v1_render_proto_rawDescGZIP(), []int{14}
}
func (x *AuthorContext) GetId() string {
@@ -1151,7 +1241,7 @@ type CategoryContext struct {
func (x *CategoryContext) Reset() {
*x = CategoryContext{}
- mi := &file_v1_render_proto_msgTypes[14]
+ mi := &file_v1_render_proto_msgTypes[15]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1163,7 +1253,7 @@ func (x *CategoryContext) String() string {
func (*CategoryContext) ProtoMessage() {}
func (x *CategoryContext) ProtoReflect() protoreflect.Message {
- mi := &file_v1_render_proto_msgTypes[14]
+ mi := &file_v1_render_proto_msgTypes[15]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1176,7 +1266,7 @@ func (x *CategoryContext) ProtoReflect() protoreflect.Message {
// Deprecated: Use CategoryContext.ProtoReflect.Descriptor instead.
func (*CategoryContext) Descriptor() ([]byte, []int) {
- return file_v1_render_proto_rawDescGZIP(), []int{14}
+ return file_v1_render_proto_rawDescGZIP(), []int{15}
}
func (x *CategoryContext) GetId() string {
@@ -1212,7 +1302,7 @@ type MasterPageContext struct {
func (x *MasterPageContext) Reset() {
*x = MasterPageContext{}
- mi := &file_v1_render_proto_msgTypes[15]
+ mi := &file_v1_render_proto_msgTypes[16]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1224,7 +1314,7 @@ func (x *MasterPageContext) String() string {
func (*MasterPageContext) ProtoMessage() {}
func (x *MasterPageContext) ProtoReflect() protoreflect.Message {
- mi := &file_v1_render_proto_msgTypes[15]
+ mi := &file_v1_render_proto_msgTypes[16]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1237,7 +1327,7 @@ func (x *MasterPageContext) ProtoReflect() protoreflect.Message {
// Deprecated: Use MasterPageContext.ProtoReflect.Descriptor instead.
func (*MasterPageContext) Descriptor() ([]byte, []int) {
- return file_v1_render_proto_rawDescGZIP(), []int{15}
+ return file_v1_render_proto_rawDescGZIP(), []int{16}
}
func (x *MasterPageContext) GetId() string {
@@ -1274,7 +1364,7 @@ type HumanProofBanner struct {
func (x *HumanProofBanner) Reset() {
*x = HumanProofBanner{}
- mi := &file_v1_render_proto_msgTypes[16]
+ mi := &file_v1_render_proto_msgTypes[17]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1286,7 +1376,7 @@ func (x *HumanProofBanner) String() string {
func (*HumanProofBanner) ProtoMessage() {}
func (x *HumanProofBanner) ProtoReflect() protoreflect.Message {
- mi := &file_v1_render_proto_msgTypes[16]
+ mi := &file_v1_render_proto_msgTypes[17]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1299,7 +1389,7 @@ func (x *HumanProofBanner) ProtoReflect() protoreflect.Message {
// Deprecated: Use HumanProofBanner.ProtoReflect.Descriptor instead.
func (*HumanProofBanner) Descriptor() ([]byte, []int) {
- return file_v1_render_proto_rawDescGZIP(), []int{16}
+ return file_v1_render_proto_rawDescGZIP(), []int{17}
}
func (x *HumanProofBanner) GetActiveTimeMinutes() int32 {
@@ -1343,7 +1433,7 @@ type DetailRow struct {
func (x *DetailRow) Reset() {
*x = DetailRow{}
- mi := &file_v1_render_proto_msgTypes[17]
+ mi := &file_v1_render_proto_msgTypes[18]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1355,7 +1445,7 @@ func (x *DetailRow) String() string {
func (*DetailRow) ProtoMessage() {}
func (x *DetailRow) ProtoReflect() protoreflect.Message {
- mi := &file_v1_render_proto_msgTypes[17]
+ mi := &file_v1_render_proto_msgTypes[18]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1368,7 +1458,7 @@ func (x *DetailRow) ProtoReflect() protoreflect.Message {
// Deprecated: Use DetailRow.ProtoReflect.Descriptor instead.
func (*DetailRow) Descriptor() ([]byte, []int) {
- return file_v1_render_proto_rawDescGZIP(), []int{17}
+ return file_v1_render_proto_rawDescGZIP(), []int{18}
}
func (x *DetailRow) GetTableId() string {
@@ -1440,7 +1530,7 @@ type BlockContext struct {
func (x *BlockContext) Reset() {
*x = BlockContext{}
- mi := &file_v1_render_proto_msgTypes[18]
+ mi := &file_v1_render_proto_msgTypes[19]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1452,7 +1542,7 @@ func (x *BlockContext) String() string {
func (*BlockContext) ProtoMessage() {}
func (x *BlockContext) ProtoReflect() protoreflect.Message {
- mi := &file_v1_render_proto_msgTypes[18]
+ mi := &file_v1_render_proto_msgTypes[19]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1465,7 +1555,7 @@ func (x *BlockContext) ProtoReflect() protoreflect.Message {
// Deprecated: Use BlockContext.ProtoReflect.Descriptor instead.
func (*BlockContext) Descriptor() ([]byte, []int) {
- return file_v1_render_proto_rawDescGZIP(), []int{18}
+ return file_v1_render_proto_rawDescGZIP(), []int{19}
}
func (x *BlockContext) GetUrl() string {
@@ -1752,9 +1842,21 @@ const file_v1_render_proto_rawDesc = "" +
"\x15RenderTemplateRequest\x12!\n" +
"\ftemplate_key\x18\x01 \x01(\tR\vtemplateKey\x12\x19\n" +
"\bdoc_json\x18\x02 \x01(\fR\adocJson\x12<\n" +
- "\x0erender_context\x18\x03 \x01(\v2\x15.abi.v1.RenderContextR\rrenderContext\",\n" +
- "\x16RenderTemplateResponse\x12\x12\n" +
- "\x04html\x18\x01 \x01(\fR\x04html\"\x88\x01\n" +
+ "\x0erender_context\x18\x03 \x01(\v2\x15.abi.v1.RenderContextR\rrenderContext\"T\n" +
+ "\x16RenderTemplateResponse\x124\n" +
+ "\bdocument\x18\x02 \x01(\v2\x18.abi.v1.TemplateDocumentR\bdocumentJ\x04\b\x01\x10\x02\"\xbf\x02\n" +
+ "\x10TemplateDocument\x12\x1b\n" +
+ "\tbody_html\x18\x01 \x01(\fR\bbodyHtml\x12\x1d\n" +
+ "\n" +
+ "body_class\x18\x02 \x01(\tR\tbodyClass\x12\x12\n" +
+ "\x04lang\x18\x03 \x01(\tR\x04lang\x12&\n" +
+ "\x0fhead_extra_html\x18\x04 \x01(\fR\rheadExtraHtml\x12-\n" +
+ "\x13body_end_extra_html\x18\x05 \x01(\fR\x10bodyEndExtraHtml\x12F\n" +
+ "\n" +
+ "html_attrs\x18\x06 \x03(\v2'.abi.v1.TemplateDocument.HtmlAttrsEntryR\thtmlAttrs\x1a<\n" +
+ "\x0eHtmlAttrsEntry\x12\x10\n" +
+ "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" +
+ "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x88\x01\n" +
"\x10RenderTagRequest\x12\x19\n" +
"\btag_name\x18\x01 \x01(\tR\atagName\x12\x1b\n" +
"\targs_json\x18\x02 \x01(\fR\bargsJson\x12<\n" +
@@ -1923,62 +2025,66 @@ func file_v1_render_proto_rawDescGZIP() []byte {
return file_v1_render_proto_rawDescData
}
-var file_v1_render_proto_msgTypes = make([]protoimpl.MessageInfo, 25)
+var file_v1_render_proto_msgTypes = make([]protoimpl.MessageInfo, 27)
var file_v1_render_proto_goTypes = []any{
(*RenderBlockRequest)(nil), // 0: abi.v1.RenderBlockRequest
(*RenderBlockResponse)(nil), // 1: abi.v1.RenderBlockResponse
(*PoweredBlock)(nil), // 2: abi.v1.PoweredBlock
(*RenderTemplateRequest)(nil), // 3: abi.v1.RenderTemplateRequest
(*RenderTemplateResponse)(nil), // 4: abi.v1.RenderTemplateResponse
- (*RenderTagRequest)(nil), // 5: abi.v1.RenderTagRequest
- (*RenderTagResponse)(nil), // 6: abi.v1.RenderTagResponse
- (*ApplyFilterRequest)(nil), // 7: abi.v1.ApplyFilterRequest
- (*ApplyFilterResponse)(nil), // 8: abi.v1.ApplyFilterResponse
- (*RenderContext)(nil), // 9: abi.v1.RenderContext
- (*RequestInfo)(nil), // 10: abi.v1.RequestInfo
- (*PageContext)(nil), // 11: abi.v1.PageContext
- (*PostContext)(nil), // 12: abi.v1.PostContext
- (*AuthorContext)(nil), // 13: abi.v1.AuthorContext
- (*CategoryContext)(nil), // 14: abi.v1.CategoryContext
- (*MasterPageContext)(nil), // 15: abi.v1.MasterPageContext
- (*HumanProofBanner)(nil), // 16: abi.v1.HumanProofBanner
- (*DetailRow)(nil), // 17: abi.v1.DetailRow
- (*BlockContext)(nil), // 18: abi.v1.BlockContext
- nil, // 19: abi.v1.RenderContext.InjectedSlotsEntry
- nil, // 20: abi.v1.RequestInfo.HeadersEntry
- nil, // 21: abi.v1.RequestInfo.CookiesEntry
- nil, // 22: abi.v1.BlockContext.QueryEntry
- nil, // 23: abi.v1.BlockContext.CookiesEntry
- nil, // 24: abi.v1.BlockContext.HeadersEntry
- (*timestamppb.Timestamp)(nil), // 25: google.protobuf.Timestamp
+ (*TemplateDocument)(nil), // 5: abi.v1.TemplateDocument
+ (*RenderTagRequest)(nil), // 6: abi.v1.RenderTagRequest
+ (*RenderTagResponse)(nil), // 7: abi.v1.RenderTagResponse
+ (*ApplyFilterRequest)(nil), // 8: abi.v1.ApplyFilterRequest
+ (*ApplyFilterResponse)(nil), // 9: abi.v1.ApplyFilterResponse
+ (*RenderContext)(nil), // 10: abi.v1.RenderContext
+ (*RequestInfo)(nil), // 11: abi.v1.RequestInfo
+ (*PageContext)(nil), // 12: abi.v1.PageContext
+ (*PostContext)(nil), // 13: abi.v1.PostContext
+ (*AuthorContext)(nil), // 14: abi.v1.AuthorContext
+ (*CategoryContext)(nil), // 15: abi.v1.CategoryContext
+ (*MasterPageContext)(nil), // 16: abi.v1.MasterPageContext
+ (*HumanProofBanner)(nil), // 17: abi.v1.HumanProofBanner
+ (*DetailRow)(nil), // 18: abi.v1.DetailRow
+ (*BlockContext)(nil), // 19: abi.v1.BlockContext
+ nil, // 20: abi.v1.TemplateDocument.HtmlAttrsEntry
+ nil, // 21: abi.v1.RenderContext.InjectedSlotsEntry
+ nil, // 22: abi.v1.RequestInfo.HeadersEntry
+ nil, // 23: abi.v1.RequestInfo.CookiesEntry
+ nil, // 24: abi.v1.BlockContext.QueryEntry
+ nil, // 25: abi.v1.BlockContext.CookiesEntry
+ nil, // 26: abi.v1.BlockContext.HeadersEntry
+ (*timestamppb.Timestamp)(nil), // 27: google.protobuf.Timestamp
}
var file_v1_render_proto_depIdxs = []int32{
- 9, // 0: abi.v1.RenderBlockRequest.render_context:type_name -> abi.v1.RenderContext
+ 10, // 0: abi.v1.RenderBlockRequest.render_context:type_name -> abi.v1.RenderContext
2, // 1: abi.v1.RenderBlockResponse.powered:type_name -> abi.v1.PoweredBlock
- 9, // 2: abi.v1.RenderTemplateRequest.render_context:type_name -> abi.v1.RenderContext
- 9, // 3: abi.v1.RenderTagRequest.render_context:type_name -> abi.v1.RenderContext
- 10, // 4: abi.v1.RenderContext.request:type_name -> abi.v1.RequestInfo
- 18, // 5: abi.v1.RenderContext.block_context:type_name -> abi.v1.BlockContext
- 11, // 6: abi.v1.RenderContext.page:type_name -> abi.v1.PageContext
- 12, // 7: abi.v1.RenderContext.post:type_name -> abi.v1.PostContext
- 13, // 8: abi.v1.RenderContext.author:type_name -> abi.v1.AuthorContext
- 14, // 9: abi.v1.RenderContext.category:type_name -> abi.v1.CategoryContext
- 15, // 10: abi.v1.RenderContext.master_page:type_name -> abi.v1.MasterPageContext
- 19, // 11: abi.v1.RenderContext.injected_slots:type_name -> abi.v1.RenderContext.InjectedSlotsEntry
- 16, // 12: abi.v1.RenderContext.human_proof_banner:type_name -> abi.v1.HumanProofBanner
- 17, // 13: abi.v1.RenderContext.detail_row:type_name -> abi.v1.DetailRow
- 20, // 14: abi.v1.RequestInfo.headers:type_name -> abi.v1.RequestInfo.HeadersEntry
- 21, // 15: abi.v1.RequestInfo.cookies:type_name -> abi.v1.RequestInfo.CookiesEntry
- 25, // 16: abi.v1.PostContext.published_at:type_name -> google.protobuf.Timestamp
- 25, // 17: abi.v1.BlockContext.now:type_name -> google.protobuf.Timestamp
- 22, // 18: abi.v1.BlockContext.query:type_name -> abi.v1.BlockContext.QueryEntry
- 23, // 19: abi.v1.BlockContext.cookies:type_name -> abi.v1.BlockContext.CookiesEntry
- 24, // 20: abi.v1.BlockContext.headers:type_name -> abi.v1.BlockContext.HeadersEntry
- 21, // [21:21] is the sub-list for method output_type
- 21, // [21:21] is the sub-list for method input_type
- 21, // [21:21] is the sub-list for extension type_name
- 21, // [21:21] is the sub-list for extension extendee
- 0, // [0:21] is the sub-list for field type_name
+ 10, // 2: abi.v1.RenderTemplateRequest.render_context:type_name -> abi.v1.RenderContext
+ 5, // 3: abi.v1.RenderTemplateResponse.document:type_name -> abi.v1.TemplateDocument
+ 20, // 4: abi.v1.TemplateDocument.html_attrs:type_name -> abi.v1.TemplateDocument.HtmlAttrsEntry
+ 10, // 5: abi.v1.RenderTagRequest.render_context:type_name -> abi.v1.RenderContext
+ 11, // 6: abi.v1.RenderContext.request:type_name -> abi.v1.RequestInfo
+ 19, // 7: abi.v1.RenderContext.block_context:type_name -> abi.v1.BlockContext
+ 12, // 8: abi.v1.RenderContext.page:type_name -> abi.v1.PageContext
+ 13, // 9: abi.v1.RenderContext.post:type_name -> abi.v1.PostContext
+ 14, // 10: abi.v1.RenderContext.author:type_name -> abi.v1.AuthorContext
+ 15, // 11: abi.v1.RenderContext.category:type_name -> abi.v1.CategoryContext
+ 16, // 12: abi.v1.RenderContext.master_page:type_name -> abi.v1.MasterPageContext
+ 21, // 13: abi.v1.RenderContext.injected_slots:type_name -> abi.v1.RenderContext.InjectedSlotsEntry
+ 17, // 14: abi.v1.RenderContext.human_proof_banner:type_name -> abi.v1.HumanProofBanner
+ 18, // 15: abi.v1.RenderContext.detail_row:type_name -> abi.v1.DetailRow
+ 22, // 16: abi.v1.RequestInfo.headers:type_name -> abi.v1.RequestInfo.HeadersEntry
+ 23, // 17: abi.v1.RequestInfo.cookies:type_name -> abi.v1.RequestInfo.CookiesEntry
+ 27, // 18: abi.v1.PostContext.published_at:type_name -> google.protobuf.Timestamp
+ 27, // 19: abi.v1.BlockContext.now:type_name -> google.protobuf.Timestamp
+ 24, // 20: abi.v1.BlockContext.query:type_name -> abi.v1.BlockContext.QueryEntry
+ 25, // 21: abi.v1.BlockContext.cookies:type_name -> abi.v1.BlockContext.CookiesEntry
+ 26, // 22: abi.v1.BlockContext.headers:type_name -> abi.v1.BlockContext.HeadersEntry
+ 23, // [23:23] is the sub-list for method output_type
+ 23, // [23:23] is the sub-list for method input_type
+ 23, // [23:23] is the sub-list for extension type_name
+ 23, // [23:23] is the sub-list for extension extendee
+ 0, // [0:23] is the sub-list for field type_name
}
func init() { file_v1_render_proto_init() }
@@ -1992,7 +2098,7 @@ func file_v1_render_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_v1_render_proto_rawDesc), len(file_v1_render_proto_rawDesc)),
NumEnums: 0,
- NumMessages: 25,
+ NumMessages: 27,
NumExtensions: 0,
NumServices: 0,
},