diff --git a/modules/pages/config.go b/modules/pages/config.go index d51ca12a58..e7c746f731 100644 --- a/modules/pages/config.go +++ b/modules/pages/config.go @@ -50,6 +50,9 @@ type LandingConfig struct { // Gallery section Gallery GallerySectionConfig `yaml:"gallery,omitempty"` + // Comparison section + Comparison ComparisonSectionConfig `yaml:"comparison,omitempty"` + // Navigation visibility Navigation NavigationConfig `yaml:"navigation,omitempty"` @@ -208,6 +211,46 @@ type GallerySectionConfig struct { Columns int `yaml:"columns,omitempty"` // grid columns, default 3 } +// ComparisonSectionConfig represents a feature comparison matrix section +type ComparisonSectionConfig struct { + Enabled bool `yaml:"enabled,omitempty"` + Headline string `yaml:"headline,omitempty"` + Subheadline string `yaml:"subheadline,omitempty"` + Columns []ComparisonColumnConfig `yaml:"columns,omitempty"` + Groups []ComparisonGroupConfig `yaml:"groups,omitempty"` +} + +// HasData returns true if the comparison section has columns and at least one feature +func (c *ComparisonSectionConfig) HasData() bool { + if len(c.Columns) == 0 || len(c.Groups) == 0 { + return false + } + for _, g := range c.Groups { + if len(g.Features) > 0 { + return true + } + } + return false +} + +// ComparisonColumnConfig represents a column header in the comparison table +type ComparisonColumnConfig struct { + Name string `yaml:"name,omitempty"` + Highlight bool `yaml:"highlight,omitempty"` +} + +// ComparisonGroupConfig represents a group of features in the comparison table +type ComparisonGroupConfig struct { + Name string `yaml:"name,omitempty"` + Features []ComparisonFeatureConfig `yaml:"features,omitempty"` +} + +// ComparisonFeatureConfig represents a single feature row in the comparison table +type ComparisonFeatureConfig struct { + Name string `yaml:"name,omitempty"` + Values []string `yaml:"values,omitempty"` // "true"/"false" for check/x, anything else displayed as text +} + // NavigationConfig controls which built-in navigation links appear in the header and footer type NavigationConfig struct { ShowDocs bool `yaml:"show_docs,omitempty"` diff --git a/options/locale/custom_keys.json b/options/locale/custom_keys.json index 39e36900b7..7df4e768fb 100644 --- a/options/locale/custom_keys.json +++ b/options/locale/custom_keys.json @@ -744,6 +744,16 @@ "repo.settings.pages.gallery_max_images": "Maximum Images to Show", "repo.settings.pages.gallery_columns": "Grid Columns", "repo.settings.pages.gallery_help_link": "Upload and manage gallery images in Settings > Gallery.", + "repo.settings.pages.comparison_section": "Comparison Section", + "repo.settings.pages.comparison_enabled_desc": "Show a feature comparison table on the landing page", + "repo.settings.pages.comparison_headline": "Headline", + "repo.settings.pages.comparison_subheadline": "Subheadline", + "repo.settings.pages.comparison_columns": "Comparison Columns", + "repo.settings.pages.comparison_columns_help": "Define three columns for your comparison table (e.g., your product vs. two competitors, or three tiers).", + "repo.settings.pages.comparison_highlight": "Highlight", + "repo.settings.pages.comparison_features": "Features & Groups", + "repo.settings.pages.comparison_features_help": "Organize features into optional groups. For each cell, enter \"true\" for a checkmark, \"false\" for an X, or any text.", + "repo.settings.pages.comparison_group_name": "Group Name", "repo.settings.pages.company_logos": "Company Logos", "repo.settings.pages.testimonials": "Testimonials", "repo.settings.pages.pricing_headline": "Pricing Headline", diff --git a/routers/web/repo/setting/pages.go b/routers/web/repo/setting/pages.go index 61d1f0aedb..ead87d663c 100644 --- a/routers/web/repo/setting/pages.go +++ b/routers/web/repo/setting/pages.go @@ -499,6 +499,37 @@ func PagesContentPost(ctx *context.Context) { } config.Features = append(config.Features, pages_module.FeatureConfig{Title: title, Description: desc, Icon: icon, ImageURL: imageURL}) } + // Comparison section + config.Comparison.Enabled = ctx.FormBool("comparison_enabled") + config.Comparison.Headline = ctx.FormString("comparison_headline") + config.Comparison.Subheadline = ctx.FormString("comparison_subheadline") + config.Comparison.Columns = make([]pages_module.ComparisonColumnConfig, 3) + for c := range 3 { + config.Comparison.Columns[c] = pages_module.ComparisonColumnConfig{ + Name: ctx.FormString(fmt.Sprintf("comparison_col_name_%d", c)), + Highlight: ctx.FormBool(fmt.Sprintf("comparison_col_highlight_%d", c)), + } + } + config.Comparison.Groups = nil + for g := range 10 { + groupName := ctx.FormString(fmt.Sprintf("comparison_group_name_%d", g)) + var features []pages_module.ComparisonFeatureConfig + for f := range 20 { + featName := ctx.FormString(fmt.Sprintf("comparison_feat_name_%d_%d", g, f)) + if featName == "" { + continue + } + var values []string + for c := range 3 { + values = append(values, ctx.FormString(fmt.Sprintf("comparison_feat_val_%d_%d_%d", g, f, c))) + } + features = append(features, pages_module.ComparisonFeatureConfig{Name: featName, Values: values}) + } + if groupName == "" && len(features) == 0 { + continue + } + config.Comparison.Groups = append(config.Comparison.Groups, pages_module.ComparisonGroupConfig{Name: groupName, Features: features}) + } if err := savePagesLandingConfig(ctx, config); err != nil { ctx.ServerError("SavePagesConfig", err) return diff --git a/templates/pages/architecture-deep-dive.tmpl b/templates/pages/architecture-deep-dive.tmpl index e1d17f021d..f76914c9ae 100644 --- a/templates/pages/architecture-deep-dive.tmpl +++ b/templates/pages/architecture-deep-dive.tmpl @@ -1015,6 +1015,7 @@ {{if .Config.Pricing.Plans}}Pricing{{end}} {{if .Config.Blog.Enabled}}Blog{{end}} {{if .Config.Gallery.Enabled}}Gallery{{end}} + {{if and .Config.Comparison.Enabled .Config.Comparison.HasData}}Compare{{end}} {{if .Config.Navigation.ShowRepository}} GitCaddy @@ -1475,6 +1476,56 @@ {{end}} + + {{if and .Config.Comparison.Enabled .Config.Comparison.HasData}} +
+
+
+ +

{{if .Config.Comparison.Headline}}{{.Config.Comparison.Headline}}{{else}}How We Compare{{end}}

+ {{if .Config.Comparison.Subheadline}}

{{.Config.Comparison.Subheadline}}

{{end}} +
+
+ + + + + {{range .Config.Comparison.Columns}} + + {{end}} + + + + {{range .Config.Comparison.Groups}} + {{if .Name}} + + + + {{end}} + {{range .Features}} + + + {{range .Values}} + + {{end}} + + {{end}} + {{end}} + +
+ {{.Name}} + {{if .Highlight}}
{{end}} +
{{.Name}}
{{.Name}} + {{if eq . "true"}}{{svg "octicon-check-circle-fill" 18}} + {{else if eq . "false"}}{{svg "octicon-x-circle" 18}} + {{else}}{{.}} + {{end}} +
+
+
+
+ {{end}} + {{end}}{{/* end PageIsBlogDetail / PageIsBlogList / else */}} diff --git a/templates/pages/bold-marketing.tmpl b/templates/pages/bold-marketing.tmpl index 741b8b8c23..19486819a0 100644 --- a/templates/pages/bold-marketing.tmpl +++ b/templates/pages/bold-marketing.tmpl @@ -1137,6 +1137,7 @@ {{if .Config.Pricing.Plans}}
Pricing{{end}} {{if .Config.Blog.Enabled}}Blog{{end}} {{if .Config.Gallery.Enabled}}Gallery{{end}} + {{if and .Config.Comparison.Enabled .Config.Comparison.HasData}}Compare{{end}} {{if .Config.Navigation.ShowRepository}} GitCaddy @@ -1176,6 +1177,7 @@ {{if .Config.Pricing.Plans}}Pricing{{end}} {{if .Config.Blog.Enabled}}Blog{{end}} {{if .Config.Gallery.Enabled}}Gallery{{end}} + {{if and .Config.Comparison.Enabled .Config.Comparison.HasData}}Compare{{end}} {{if .Config.Navigation.ShowRepository}} GitCaddy @@ -1583,6 +1585,56 @@ {{end}} + + {{if and .Config.Comparison.Enabled .Config.Comparison.HasData}} +
+
+
+ +

{{if .Config.Comparison.Headline}}{{.Config.Comparison.Headline}}{{else}}How We Compare{{end}}

+ {{if .Config.Comparison.Subheadline}}

{{.Config.Comparison.Subheadline}}

{{end}} +
+
+ + + + + {{range .Config.Comparison.Columns}} + + {{end}} + + + + {{range .Config.Comparison.Groups}} + {{if .Name}} + + + + {{end}} + {{range .Features}} + + + {{range .Values}} + + {{end}} + + {{end}} + {{end}} + +
+ {{.Name}} + {{if .Highlight}}
{{end}} +
{{.Name}}
{{.Name}} + {{if eq . "true"}}{{svg "octicon-check-circle-fill" 18}} + {{else if eq . "false"}}{{svg "octicon-x-circle" 18}} + {{else}}{{.}} + {{end}} +
+
+
+
+ {{end}} + {{end}}{{/* end PageIsBlogDetail / PageIsBlogList / else */}} diff --git a/templates/pages/cli-terminal.tmpl b/templates/pages/cli-terminal.tmpl index 3d3d213b06..76d481021e 100644 --- a/templates/pages/cli-terminal.tmpl +++ b/templates/pages/cli-terminal.tmpl @@ -1021,6 +1021,7 @@ {{if .Config.Pricing.Plans}}
Pricing{{end}} {{if .Config.Blog.Enabled}}Blog{{end}} {{if .Config.Gallery.Enabled}}Gallery{{end}} + {{if and .Config.Comparison.Enabled .Config.Comparison.HasData}}Compare{{end}} {{if .Config.Navigation.ShowRepository}} GitCaddy @@ -1490,6 +1491,56 @@ {{end}} + + {{if and .Config.Comparison.Enabled .Config.Comparison.HasData}} +
+
+
+ +

{{if .Config.Comparison.Headline}}{{.Config.Comparison.Headline}}{{else}}How We Compare{{end}}

+ {{if .Config.Comparison.Subheadline}}

{{.Config.Comparison.Subheadline}}

{{end}} +
+
+ + + + + {{range .Config.Comparison.Columns}} + + {{end}} + + + + {{range .Config.Comparison.Groups}} + {{if .Name}} + + + + {{end}} + {{range .Features}} + + + {{range .Values}} + + {{end}} + + {{end}} + {{end}} + +
+ {{.Name}} + {{if .Highlight}}
{{end}} +
{{.Name}}
{{.Name}} + {{if eq . "true"}}{{svg "octicon-check-circle-fill" 18}} + {{else if eq . "false"}}{{svg "octicon-x-circle" 18}} + {{else}}{{.}} + {{end}} +
+
+
+
+ {{end}} + {{end}}{{/* end PageIsBlogDetail / PageIsBlogList / else */}} diff --git a/templates/pages/developer-tool.tmpl b/templates/pages/developer-tool.tmpl index ffebb06225..720a5fb6d4 100644 --- a/templates/pages/developer-tool.tmpl +++ b/templates/pages/developer-tool.tmpl @@ -904,6 +904,7 @@ {{if .Config.Pricing.Plans}}
Pricing{{end}} {{if .Config.Blog.Enabled}}Blog{{end}} {{if .Config.Gallery.Enabled}}Gallery{{end}} + {{if and .Config.Comparison.Enabled .Config.Comparison.HasData}}Compare{{end}} {{if .Config.Navigation.ShowRepository}} GitCaddy @@ -1363,6 +1364,56 @@ {{end}} + + {{if and .Config.Comparison.Enabled .Config.Comparison.HasData}} +
+
+
+ +

{{if .Config.Comparison.Headline}}{{.Config.Comparison.Headline}}{{else}}How We Compare{{end}}

+ {{if .Config.Comparison.Subheadline}}

{{.Config.Comparison.Subheadline}}

{{end}} +
+
+ + + + + {{range .Config.Comparison.Columns}} + + {{end}} + + + + {{range .Config.Comparison.Groups}} + {{if .Name}} + + + + {{end}} + {{range .Features}} + + + {{range .Values}} + + {{end}} + + {{end}} + {{end}} + +
+ {{.Name}} + {{if .Highlight}}
{{end}} +
{{.Name}}
{{.Name}} + {{if eq . "true"}}{{svg "octicon-check-circle-fill" 18}} + {{else if eq . "false"}}{{svg "octicon-x-circle" 18}} + {{else}}{{.}} + {{end}} +
+
+
+
+ {{end}} + {{end}}{{/* end PageIsBlogDetail / PageIsBlogList / else */}} diff --git a/templates/pages/documentation-first.tmpl b/templates/pages/documentation-first.tmpl index ea9076f50d..772fa51a13 100644 --- a/templates/pages/documentation-first.tmpl +++ b/templates/pages/documentation-first.tmpl @@ -929,6 +929,7 @@ {{if .Config.Pricing.Plans}}
Pricing{{end}} {{if .Config.Blog.Enabled}}Blog{{end}} {{if .Config.Gallery.Enabled}}Gallery{{end}} + {{if and .Config.Comparison.Enabled .Config.Comparison.HasData}}Compare{{end}} {{if .Config.Navigation.ShowRepository}} GitCaddy @@ -1387,6 +1388,56 @@ {{end}} + + {{if and .Config.Comparison.Enabled .Config.Comparison.HasData}} +
+
+
+ +

{{if .Config.Comparison.Headline}}{{.Config.Comparison.Headline}}{{else}}How We Compare{{end}}

+ {{if .Config.Comparison.Subheadline}}

{{.Config.Comparison.Subheadline}}

{{end}} +
+
+ + + + + {{range .Config.Comparison.Columns}} + + {{end}} + + + + {{range .Config.Comparison.Groups}} + {{if .Name}} + + + + {{end}} + {{range .Features}} + + + {{range .Values}} + + {{end}} + + {{end}} + {{end}} + +
+ {{.Name}} + {{if .Highlight}}
{{end}} +
{{.Name}}
{{.Name}} + {{if eq . "true"}}{{svg "octicon-check-circle-fill" 18}} + {{else if eq . "false"}}{{svg "octicon-x-circle" 18}} + {{else}}{{.}} + {{end}} +
+
+
+
+ {{end}} + {{end}}{{/* end PageIsBlogDetail / PageIsBlogList / else */}} diff --git a/templates/pages/minimalist-docs.tmpl b/templates/pages/minimalist-docs.tmpl index f08238519a..5957d70960 100644 --- a/templates/pages/minimalist-docs.tmpl +++ b/templates/pages/minimalist-docs.tmpl @@ -1004,6 +1004,7 @@ {{if .Config.Pricing.Plans}}
Pricing{{end}} {{if .Config.Blog.Enabled}}Blog{{end}} {{if .Config.Gallery.Enabled}}Gallery{{end}} + {{if and .Config.Comparison.Enabled .Config.Comparison.HasData}}Compare{{end}} {{if .Config.Navigation.ShowRepository}} GitCaddy @@ -1038,6 +1039,7 @@ {{if .Config.Pricing.Plans}}Pricing{{end}} {{if .Config.Blog.Enabled}}Blog{{end}} {{if .Config.Gallery.Enabled}}Gallery{{end}} + {{if and .Config.Comparison.Enabled .Config.Comparison.HasData}}Compare{{end}} {{if .Config.Navigation.ShowRepository}} GitCaddy @@ -1455,6 +1457,56 @@ {{end}} + + {{if and .Config.Comparison.Enabled .Config.Comparison.HasData}} +
+
+
+ +

{{if .Config.Comparison.Headline}}{{.Config.Comparison.Headline}}{{else}}How We Compare{{end}}

+ {{if .Config.Comparison.Subheadline}}

{{.Config.Comparison.Subheadline}}

{{end}} +
+
+ + + + + {{range .Config.Comparison.Columns}} + + {{end}} + + + + {{range .Config.Comparison.Groups}} + {{if .Name}} + + + + {{end}} + {{range .Features}} + + + {{range .Values}} + + {{end}} + + {{end}} + {{end}} + +
+ {{.Name}} + {{if .Highlight}}
{{end}} +
{{.Name}}
{{.Name}} + {{if eq . "true"}}{{svg "octicon-check-circle-fill" 18}} + {{else if eq . "false"}}{{svg "octicon-x-circle" 18}} + {{else}}{{.}} + {{end}} +
+
+
+
+ {{end}} + {{end}}{{/* end PageIsBlogDetail / PageIsBlogList / else */}} diff --git a/templates/pages/open-source-hero.tmpl b/templates/pages/open-source-hero.tmpl index 835885719d..e95eb13666 100644 --- a/templates/pages/open-source-hero.tmpl +++ b/templates/pages/open-source-hero.tmpl @@ -995,6 +995,7 @@ {{if .Config.Pricing.Plans}}
Pricing{{end}} {{if .Config.Blog.Enabled}}Blog{{end}} {{if .Config.Gallery.Enabled}}Gallery{{end}} + {{if and .Config.Comparison.Enabled .Config.Comparison.HasData}}Compare{{end}} {{if .Config.Navigation.ShowRepository}} GitCaddy @@ -1455,6 +1456,56 @@ {{end}} + + {{if and .Config.Comparison.Enabled .Config.Comparison.HasData}} +
+
+
+ +

{{if .Config.Comparison.Headline}}{{.Config.Comparison.Headline}}{{else}}How We Compare{{end}}

+ {{if .Config.Comparison.Subheadline}}

{{.Config.Comparison.Subheadline}}

{{end}} +
+
+ + + + + {{range .Config.Comparison.Columns}} + + {{end}} + + + + {{range .Config.Comparison.Groups}} + {{if .Name}} + + + + {{end}} + {{range .Features}} + + + {{range .Values}} + + {{end}} + + {{end}} + {{end}} + +
+ {{.Name}} + {{if .Highlight}}
{{end}} +
{{.Name}}
{{.Name}} + {{if eq . "true"}}{{svg "octicon-check-circle-fill" 18}} + {{else if eq . "false"}}{{svg "octicon-x-circle" 18}} + {{else}}{{.}} + {{end}} +
+
+
+
+ {{end}} + {{end}}{{/* end PageIsBlogDetail / PageIsBlogList / else */}} diff --git a/templates/pages/saas-conversion.tmpl b/templates/pages/saas-conversion.tmpl index 5524c641cb..8fe97ce97a 100644 --- a/templates/pages/saas-conversion.tmpl +++ b/templates/pages/saas-conversion.tmpl @@ -1112,6 +1112,7 @@ {{if .Config.Pricing.Plans}}
Pricing{{end}} {{if .Config.Blog.Enabled}}Blog{{end}} {{if .Config.Gallery.Enabled}}Gallery{{end}} + {{if and .Config.Comparison.Enabled .Config.Comparison.HasData}}Compare{{end}} {{if .Config.Navigation.ShowRepository}} GitCaddy @@ -1149,6 +1150,7 @@ {{if .Config.Pricing.Plans}}Pricing{{end}} {{if .Config.Blog.Enabled}}Blog{{end}} {{if .Config.Gallery.Enabled}}Gallery{{end}} + {{if and .Config.Comparison.Enabled .Config.Comparison.HasData}}Compare{{end}} {{if .Config.Navigation.ShowRepository}} GitCaddy @@ -1594,6 +1596,56 @@ {{end}} + + {{if and .Config.Comparison.Enabled .Config.Comparison.HasData}} +
+
+
+ +

{{if .Config.Comparison.Headline}}{{.Config.Comparison.Headline}}{{else}}How We Compare{{end}}

+ {{if .Config.Comparison.Subheadline}}

{{.Config.Comparison.Subheadline}}

{{end}} +
+
+ + + + + {{range .Config.Comparison.Columns}} + + {{end}} + + + + {{range .Config.Comparison.Groups}} + {{if .Name}} + + + + {{end}} + {{range .Features}} + + + {{range .Values}} + + {{end}} + + {{end}} + {{end}} + +
+ {{.Name}} + {{if .Highlight}}
{{end}} +
{{.Name}}
{{.Name}} + {{if eq . "true"}}{{svg "octicon-check-circle-fill" 18}} + {{else if eq . "false"}}{{svg "octicon-x-circle" 18}} + {{else}}{{.}} + {{end}} +
+
+
+
+ {{end}} + {{end}}{{/* end PageIsBlogDetail / PageIsBlogList / else */}} diff --git a/templates/pages/visual-showcase.tmpl b/templates/pages/visual-showcase.tmpl index c0a644baf4..db3315a76c 100644 --- a/templates/pages/visual-showcase.tmpl +++ b/templates/pages/visual-showcase.tmpl @@ -1031,6 +1031,7 @@ {{if .Config.Pricing.Plans}}
Pricing{{end}} {{if .Config.Blog.Enabled}}Blog{{end}} {{if .Config.Gallery.Enabled}}Gallery{{end}} + {{if and .Config.Comparison.Enabled .Config.Comparison.HasData}}Compare{{end}} {{if .Config.Navigation.ShowRepository}} GitCaddy @@ -1495,6 +1496,56 @@ {{end}} + + {{if and .Config.Comparison.Enabled .Config.Comparison.HasData}} +
+
+
+ +

{{if .Config.Comparison.Headline}}{{.Config.Comparison.Headline}}{{else}}How We Compare{{end}}

+ {{if .Config.Comparison.Subheadline}}

{{.Config.Comparison.Subheadline}}

{{end}} +
+
+ + + + + {{range .Config.Comparison.Columns}} + + {{end}} + + + + {{range .Config.Comparison.Groups}} + {{if .Name}} + + + + {{end}} + {{range .Features}} + + + {{range .Values}} + + {{end}} + + {{end}} + {{end}} + +
+ {{.Name}} + {{if .Highlight}}
{{end}} +
{{.Name}}
{{.Name}} + {{if eq . "true"}}{{svg "octicon-check-circle-fill" 18}} + {{else if eq . "false"}}{{svg "octicon-x-circle" 18}} + {{else}}{{.}} + {{end}} +
+
+
+
+ {{end}} + {{end}}{{/* end PageIsBlogDetail / PageIsBlogList / else */}} diff --git a/templates/repo/settings/pages_content.tmpl b/templates/repo/settings/pages_content.tmpl index 0879734983..b174053132 100644 --- a/templates/repo/settings/pages_content.tmpl +++ b/templates/repo/settings/pages_content.tmpl @@ -116,6 +116,98 @@

{{ctx.Locale.Tr "repo.settings.pages.gallery_help_link"}}

+
{{ctx.Locale.Tr "repo.settings.pages.comparison_section"}}
+
+
+ + +
+
+
+ + +
+
+ + +
+
{{ctx.Locale.Tr "repo.settings.pages.comparison_columns"}}
+

{{ctx.Locale.Tr "repo.settings.pages.comparison_columns_help"}}

+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+
{{ctx.Locale.Tr "repo.settings.pages.comparison_features"}}
+

{{ctx.Locale.Tr "repo.settings.pages.comparison_features_help"}}

+
+ {{if .Config.Comparison.Groups}} + {{range $g, $group := .Config.Comparison.Groups}} +
+
+ + +
+
+ {{range $f, $feat := $group.Features}} +
+
+
+
+
+
+ {{end}} +
+ +
+ {{end}} + {{else}} +
+
+ + +
+
+
+
+
+
+
+
+
+ +
+ {{end}} +
+ +
{{ctx.Locale.Tr "repo.settings.pages.stats"}}
{{range $i, $stat := .Config.Stats}} @@ -320,5 +412,32 @@ c.insertAdjacentHTML('beforeend', `
`); featCount++; } + + let compGroupCount = {{len .Config.Comparison.Groups}}; + let compFeatCounts = {}; + {{range $g, $group := .Config.Comparison.Groups}} + compFeatCounts[{{$g}}] = {{len $group.Features}}; + {{end}} + if (compGroupCount === 0) { compGroupCount = 1; compFeatCounts[0] = 1; } + + function addComparisonFeature(g) { + if (!compFeatCounts[g]) compFeatCounts[g] = 0; + const f = compFeatCounts[g]; + const container = document.querySelector(`.comparison-features[data-group="${g}"]`); + container.insertAdjacentHTML('beforeend', + `
` + ); + compFeatCounts[g]++; + } + + function addComparisonGroup() { + const g = compGroupCount; + compFeatCounts[g] = 1; + const container = document.getElementById('comparison-groups-container'); + container.insertAdjacentHTML('beforeend', + `
` + ); + compGroupCount++; + } {{template "repo/settings/layout_footer" .}}