Skip to content

feat(design): Home, and the feed at /feedback - #846

Closed
mortondev wants to merge 3 commits into
feat/portal-design-v2-phase3-releasefrom
feat/portal-design-v2-phase4-home
Closed

mortondev wants to merge 3 commits into
feat/portal-design-v2-phase3-releasefrom
feat/portal-design-v2-phase4-home

Conversation

@mortondev

@mortondev mortondev commented Oct 31, 2026 •

Copy link
Copy Markdown
Member

The thirteenth of the stack that builds a new design engine for the portal, and the first of phase 4. On the design engine Home is a page of its own, and the feed gains its own address. Behind the portalDesignV2 Labs switch; with it off, nothing changes.

Home

Home sits at the root: the band with Home's headline, then blocks on a grid of six columns at large sizes (thirds become halves below lg, and every block is full width below md). Blocks fill rows in order and wrap when the next does not fit; there is no free positioning.

The ten blocks: Welcome, Share an idea (which opens the feed's composer with what was typed), Top ideas (3 or 5, with their vote counts), Roadmap (each column's first two items), Latest updates (2 to 4), Help search (with popular articles), Help topics, Status, Contact and Links (with an optional title). Each shows live data in the brand's cards and type, is a home-block part and a section the preview can select, and draws nothing when its page is off or it has nothing to show. Their data starts in the loader and streams into the first response, as the feed's does; the help and status blocks load their pages' strings with the page.

Where the feed lives

  • Home on: the feed is at /feedback. An old link to the feed at the root (/?board=…) follows it there with a 301.
  • Home off: the root is the first page the menu shows. When that is Feedback the root renders the feed as before and /feedback points its canonical tag at it; otherwise the root redirects (302, since the menu can change).
  • Legacy theme: unchanged, the feed stays at the root.

portalPaths (lib/shared/design/paths.ts) decides this from the design's menu and which pages exist, and every portal link to the feed takes its path from it. A test keeps a literal '/' out of portal code. The sitemap and canonical tags follow the same rule.

The menu from the design

On the design engine the header's menu comes from the design: Feedback can be hidden, Home can have a tab, and custom links keep their place. The legacy theme keeps its saved navigation. The page gates are one shared function, so the loader, the header and the settings page agree.

Upgrades

The cached workspace settings are now kept per build. Branding the local workspaces caught the first requests after an upgrade reading a cached shape an older build wrote, and every page failing. The e2e cache helpers match the per-build copies.

Performance

  • The root's landing stays in the route module and renders the feed route's own chunk, so a portal on the feed still loads one route chunk. The server preloads a route's chunks, the ones holding a split of its file, so the feed's split also re-exports the root's component split (sharedComponents in routeChunksImportTheirParent). The feed's chunk is then preloaded at / as before, and at /feedback.
  • Home's code and its block queries load only for a portal on Home, through one import that serves both its loader and its page. Its module is linked to the portal layout as the root's own split would be (lazyChildren), so code it shares with the layout stays in the layout's chunk instead of becoming new chunks every portal and admin page loads.
  • Share an idea on Home is a light form. What a visitor types goes with them to /feedback in the navigation's history state, and the feed's composer opens with it, once per arrival. Home loads neither the composer nor the anonymous-session code.
  • The post actions read the feed's address from saved-feedback-path.ts, and the sitemap's paths live in sitemap-paths.ts, so neither reaches the entry.
  • What remains is about 1.1 KB compressed in the entry: the choice between Home, the feed and a redirect runs before any route chunk loads. Thirteen admin and visitor pages that sat within it of their script ceilings take their new readings; every core journey stays inside its ceiling.

Verification

  • Four local brand workspaces were given Homes from the design plan and published through Appearance: each renders without error, on desktop and phone, and their /feedback pages light the Feedback tab. Critique led to a bare composer, a compact popular-articles list and titled link blocks.
  • New tests, each checked by breaking the code it covers: the landing rule, the feed's address and the sitemap paths; the root loader (Home, an old feed link, a redirect to the first page, the legacy feed and its chunk); the design's menu (hidden Feedback, a Home tab, links); the active tab; the filters following the feed; no literal root in portal code; the message-area guard; Share an idea's hand-off to the feed, through a real navigation; the build links for Home's chunk and the shared feed chunk.
  • Benched in full against the build of the PR below: the request counts and core journeys hold, and the feed's chunk is preloaded at / and /feedback again.

On the design engine, Home is a page of its own at the root, built from
blocks on a six-column grid: Welcome, Share an idea, Top ideas, Roadmap,
Latest updates, Help search, Help topics, Status, Contact and Links. Each
block shows live data in the brand's cards and type, draws nothing when its
page is off or it has nothing to show, and streams into the first response.

With Home on, the feed moves to /feedback and an old link to the feed at the
root follows it there for good. With Home off, the root is the first page
the menu shows: the feed as before when that is Feedback, else a redirect.
The legacy theme keeps the feed at the root. The menu comes from the design,
where Feedback can be hidden and Home can have a tab, and every portal link
to the feed takes its path from portalPaths; a test keeps a literal root out
of portal code. The sitemap and canonical tags follow the same rule.

The cached workspace settings are now kept per build, so the first requests
after an upgrade never read a shape an older build wrote.
@mortondev
mortondev added this pull request to stack #833 October 31, 2026 00:55
The cached workspace settings are kept per build, so the tests that seed or
forget that copy use CACHE_KEYS.WORKSPACE_SETTINGS rather than the old literal
key, which no longer reaches it.
Home's code reached pages that never show it, and the feed's chunk lost its
preload at the root.

- Share an idea on Home is a light form. What a visitor types goes to
  /feedback in the navigation's history state, and the feed's composer opens
  with it once per arrival, so Home loads neither the composer nor the
  anonymous-session code.
- Home takes the page gates from the loader, and its module is linked to the
  portal layout as the root's own split would be, so what it shares with the
  layout stays in the layout's chunk.
- The feed's split also re-exports the root's component split. The server
  preloads the chunks holding a route's splits, so the feed is preloaded at
  the root again, and at /feedback.
- The post actions, the sitemap's paths and the feed-search check live
  outside the modules every page loads.

The choice between Home, the feed and a redirect still runs before any route
chunk loads, about 1.1 KB in the entry, so the pages that sat within it of
their script ceilings take their new readings.
@mortondev

Copy link
Copy Markdown
Member Author

Condensed into #879. The stack is now five PRs, #878 to #882; this branch is kept as it was.

@mortondev mortondev closed this Nov 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant