xtablo-source/go-backend/internal/web/ui/catalog/pages.go
2026-05-09 20:18:24 +02:00

99 lines
2.4 KiB
Go

package catalog
import "slices"
type Example struct {
Title string
Description string
Preview anyComponent
Snippet string
}
type Page struct {
Slug string
Title string
Description string
Examples []Example
}
func Pages() []Page {
return []Page{
{
Slug: "tokens",
Title: "Tokens",
Description: "Semantic colors and status roles used by the Go design system.",
Examples: tokenExamples(),
},
{
Slug: "buttons",
Title: "Buttons",
Description: "Primary, secondary, ghost, and destructive actions built from shared templ primitives.",
Examples: buttonExamples(),
},
{
Slug: "badges",
Title: "Badges",
Description: "Semantic status labels for todo, in-progress, success, and destructive states.",
Examples: badgeExamples(),
},
{
Slug: "icon-buttons",
Title: "Icon Buttons",
Description: "Compact icon-only actions for destructive and neutral controls.",
Examples: iconButtonExamples(),
},
{
Slug: "inputs",
Title: "Inputs",
Description: "Shared single-line and multiline text controls.",
Examples: inputExamples(),
},
{
Slug: "form-fields",
Title: "Form Fields",
Description: "Labeled controls with optional hint and error messaging.",
Examples: formFieldExamples(),
},
{
Slug: "modals",
Title: "Modals",
Description: "Shared modal shell for focused create, edit, and confirm flows.",
Examples: modalExamples(),
},
{
Slug: "tables",
Title: "Tables",
Description: "Shared table shell for server-rendered list views.",
Examples: tableExamples(),
},
{
Slug: "empty-states",
Title: "Empty States",
Description: "Centered fallback messaging with optional icon and action.",
Examples: emptyStateExamples(),
},
{
Slug: "cards",
Title: "Cards",
Description: "Reusable bordered surfaces with optional header, body, and footer regions.",
Examples: cardExamples(),
},
}
}
func FindPage(slug string) (Page, bool) {
index := slices.IndexFunc(Pages(), func(page Page) bool {
return page.Slug == slug
})
if index == -1 {
return Page{}, false
}
return Pages()[index], true
}
func catalogNavLinkClass(active bool) string {
if active {
return "catalog-nav-link is-active"
}
return "catalog-nav-link"
}