Render home and project pages with the design system #5
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/orbit-design-system-port"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
PR #4 committed to orbit's visual direction in
design/but left thelive web layer on its MVP-era generic styles. This PR ports the
styleguide into production:
web/static/orbit.cssis now the designsystem,
web/templates/*render with the new components, and both pagesreflect the new flow-based structure.
Home page
A single column of
.project-rowentries ordered by last-activitydescending. Each row shows the project slug and name, a one-line summary
of the most recent history entry, and a relative time (
3h,2d,1w).The leading dot glows sodium if the project moved within the last 7 days,
muted grey otherwise.
Project detail page
Five flow sections — Ideas, Design, Build, Review,
History — with the mapping specified in #4's spec. Empty stages
collapse. History is grouped by calendar day with
.day-dividerheaders,and entries beyond the first 12 collapse into a
<details class="entry-expand">withshow N earlier entriesas the summary.Activity helpers
New
web/activity.gomodule exposesActiveWindow,isActive(t time.Time), andprojectLastActivity(project, ideas, issues, history).The latter aggregates timestamps across all child entities so a project's
dot state reflects its most recent movement across any flow domain.
Font loading
Iosevka
.woff2files vendored underweb/static/fonts/and loaded via<link rel="preload">inweb/templates/layout.html, matching thedesign spec's FOUT-elimination approach.
Also: UTC timestamp bugfix
While evaluating this PR live against the production orbit instance we
hit a latent sync bug:
sync.goandapi/webhooks.gowere callingtime.Parse(time.RFC3339, ...)which returns atime.Timewith afixed-offset zone. The
modernc.org/sqlitedriver serializes those viaTime.String()(producing"2026-04-05 13:11:46 +0200 +0200") and thencannot scan them back into
time.Time. Store tests passed because theyused
.UTC(), but production data was unreadable once the new home andproject handlers started reading
Issue.ForgejoUpdatedAtfor theactivity rule.
Fixed at the store boundary in
UpsertIssue: everyforgejoUpdatedAtis normalized with
.UTC()before hitting the driver. The fix is bundledinto this PR because it blocked live evaluation.
Known cuts
Per-issue triage between Ideas/Design/Build stages (no schema yet),
open-PR tracking for the Review stage (addressed in #13), and design-spec
last-activity from file mtime (
designs.Filedoesn't expose one) — alldeferred to follow-up work.
arne referenced this pull request2026-04-05 13:11:05 +02:00
arne referenced this pull request2026-04-05 13:11:09 +02:00
arne referenced this pull request2026-04-05 13:11:14 +02:00
arne referenced this pull request2026-04-05 13:11:46 +02:00
- Template used relative 'design-preview/' href which resolved to /projects/design-preview/ instead of /projects/{slug}/design-preview/ since the project URL has no trailing slash. Rewrite button and design-spec hrefs as absolute paths including .Project.Slug. - UpsertIssue stored forgejoUpdatedAt via time.Parse(RFC3339) which returns a fixed-offset zone; modernc.org/sqlite serializes that via Time.String() as '2006-01-02 15:04:05 +0200 +0200' and then cannot scan it back. Normalize to UTC inside the store layer so both sync.go and webhooks.go paths round-trip. Latent bug: exposed by the new home/project handlers that read ForgejoUpdatedAt for activity computation.arne referenced this pull request2026-04-05 15:59:49 +02:00
feat: port design system to web layer (home + project detail)to Render home and project pages with the design system