diff --git a/src/templates/types.go b/src/templates/types.go index b53e832c..cac1a3e0 100644 --- a/src/templates/types.go +++ b/src/templates/types.go @@ -75,6 +75,7 @@ type Header struct { Project *ProjectHeader Breadcrumbs []Breadcrumb + Actions []Action SuppressBreadcrumbs bool BannerEvent *BannerEvent @@ -451,6 +452,11 @@ type Breadcrumb struct { Project *Project } +type Action struct { + Name, Url string + Icon string +} + type Pagination struct { Current int Total int diff --git a/src/website/breadcrumb_helper.go b/src/website/breadcrumb_helper.go index b9d74d6e..0759672c 100644 --- a/src/website/breadcrumb_helper.go +++ b/src/website/breadcrumb_helper.go @@ -22,9 +22,6 @@ func ForumBreadcrumb(projectUrlContext *hmnurl.UrlContext) templates.Breadcrumb func SubforumBreadcrumbs(projectUrlContext *hmnurl.UrlContext, lineageBuilder *models.SubforumLineageBuilder, subforumID int) []templates.Breadcrumb { var result []templates.Breadcrumb - // if projectUrlContext.ProjectID != models.HMNProjectID { - // result = append(result, ProjectBreadcrumb(projectUrlContext)) - // } result = append(result, ForumBreadcrumb(projectUrlContext)) subforums := lineageBuilder.GetSubforumLineage(subforumID) slugs := lineageBuilder.GetSubforumLineageSlugs(subforumID) diff --git a/src/website/projects.go b/src/website/projects.go index 3f882f71..2af39423 100644 --- a/src/website/projects.go +++ b/src/website/projects.go @@ -377,6 +377,16 @@ func ProjectHomepage(c *RequestContext) ResponseData { if err != nil { return c.ErrorResponse(http.StatusInternalServerError, oops.New(err, "failed to fetch following status")) } + + if c.CurrentUserCanEditCurrentProject { + templateData.Header.Actions = []templates.Action{ + { + Name: "Edit Project", + Url: c.UrlContext.BuildProjectEdit(""), + Icon: "edit-line", + }, + } + } } templateData.FollowUrl = followUrl templateData.Following = following From 2ef3bd8ef1b983e099f8d877cd46d8d9a19bd0b7 Mon Sep 17 00:00:00 2001 From: Ben Visness Date: Wed, 29 Apr 2026 22:28:33 -0500 Subject: [PATCH 2/3] Add foundation breadcrumbs --- src/website/base_data.go | 3 ++- src/website/hsf.go | 17 +++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/website/base_data.go b/src/website/base_data.go index fb8c54b4..dd7b761c 100644 --- a/src/website/base_data.go +++ b/src/website/base_data.go @@ -43,7 +43,8 @@ func getBaseData(c *RequestContext, title string, breadcrumbs []templates.Breadc loginUrl = hmnurl.BuildLoginPage(c.FullUrl(), "") } - if !c.UrlContext.IsHMN() { + // Prepend the project breadcrumb, if doing breadcrumbs + if !c.UrlContext.IsHMN() && len(breadcrumbs) > 0 { projectUrl := c.UrlContext.BuildHomepage() rootBreadcrumb := templates.Breadcrumb{ Name: project.Name, diff --git a/src/website/hsf.go b/src/website/hsf.go index 2184f0b4..78e61c8e 100644 --- a/src/website/hsf.go +++ b/src/website/hsf.go @@ -1,6 +1,7 @@ package website import ( + "git.handmade.network/hmn/hmn/src/hmnurl" "git.handmade.network/hmn/hmn/src/templates" ) @@ -11,13 +12,23 @@ func HSFLanding(c *RequestContext) ResponseData { } func HSFDetails(c *RequestContext) ResponseData { + breadcrumbs := []templates.Breadcrumb{ + hsfBaseBreadcrumb, + {Name: "Details", Url: hmnurl.BuildHSFDetails()}, + } + var res ResponseData - res.MustWriteTemplate("hsf_details.html", getHSFBaseData(c, "Details", nil), c.Perf) + res.MustWriteTemplate("hsf_details.html", getHSFBaseData(c, "Details", breadcrumbs), c.Perf) return res } func HSFMembership(c *RequestContext) ResponseData { - baseData := getHSFBaseData(c, "Membership", nil) + breadcrumbs := []templates.Breadcrumb{ + hsfBaseBreadcrumb, + {Name: "Membership", Url: hmnurl.BuildHSFMembership()}, + } + + baseData := getHSFBaseData(c, "Membership", breadcrumbs) baseData.HideMembershipCTA = true var res ResponseData @@ -25,6 +36,8 @@ func HSFMembership(c *RequestContext) ResponseData { return res } +var hsfBaseBreadcrumb = templates.Breadcrumb{Name: "Handmade Software Foundation", Url: hmnurl.BuildHSFLanding()} + func getHSFBaseData(c *RequestContext, title string, breadcrumbs []templates.Breadcrumb) templates.BaseData { baseData := getBaseData(c, title, breadcrumbs) baseData.SiteTitleOverride = "Handmade Software Foundation" From 3c7d4cdc50dd8d6ee283656dd5b42e8ab9ab4f60 Mon Sep 17 00:00:00 2001 From: Ben Visness Date: Thu, 30 Apr 2026 00:32:14 -0500 Subject: [PATCH 3/3] Rework blog actions to use breadcrumb bar --- src/templates/img/add-small.svg | 5 ++ src/templates/img/delete.svg | 6 ++- src/templates/src/blog_index.html | 56 +++++++++++----------- src/templates/src/blog_post.html | 5 +- src/templates/src/include/header-2024.html | 4 +- src/templates/src/include/link_editor.html | 2 +- src/website/base_data.go | 4 +- src/website/blogs.go | 30 +++++++++--- 8 files changed, 67 insertions(+), 45 deletions(-) create mode 100644 src/templates/img/add-small.svg diff --git a/src/templates/img/add-small.svg b/src/templates/img/add-small.svg new file mode 100644 index 00000000..b5b64301 --- /dev/null +++ b/src/templates/img/add-small.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/templates/img/delete.svg b/src/templates/img/delete.svg index 7d0fc587..372c9425 100644 --- a/src/templates/img/delete.svg +++ b/src/templates/img/delete.svg @@ -1 +1,5 @@ - \ No newline at end of file + + + + + diff --git a/src/templates/src/blog_index.html b/src/templates/src/blog_index.html index ee25eb91..0c52f63a 100644 --- a/src/templates/src/blog_index.html +++ b/src/templates/src/blog_index.html @@ -39,41 +39,39 @@