From cdf47b5ecd27cfee1711375fa4df0f158dea3c3b Mon Sep 17 00:00:00 2001 From: logikonline Date: Mon, 16 Mar 2026 23:05:10 -0400 Subject: [PATCH] feat(pages): add comparison table section to landing pages Add configurable comparison matrix section for feature comparisons. Supports 3 columns (e.g., your product vs competitors, or pricing tiers) with optional highlight column. Features can be organized into groups. Each cell accepts "true" for checkmark, "false" for X, or custom text. Includes settings UI with up to 10 groups and 20 features per group. Renders in all 9 page templates with responsive table styling. --- modules/pages/config.go | 43 +++++++ options/locale/custom_keys.json | 10 ++ routers/web/repo/setting/pages.go | 31 +++++ templates/pages/architecture-deep-dive.tmpl | 51 +++++++++ templates/pages/bold-marketing.tmpl | 52 +++++++++ templates/pages/cli-terminal.tmpl | 51 +++++++++ templates/pages/developer-tool.tmpl | 51 +++++++++ templates/pages/documentation-first.tmpl | 51 +++++++++ templates/pages/minimalist-docs.tmpl | 52 +++++++++ templates/pages/open-source-hero.tmpl | 51 +++++++++ templates/pages/saas-conversion.tmpl | 52 +++++++++ templates/pages/visual-showcase.tmpl | 51 +++++++++ templates/repo/settings/pages_content.tmpl | 119 ++++++++++++++++++++ 13 files changed, 665 insertions(+) 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" .}}