Skip to content

feat(ui): redesign Wolfstar homepage with bento grid layout#288

Open
RedStar071 wants to merge 64 commits into
mainfrom
refactor/create-new-home-page
Open

feat(ui): redesign Wolfstar homepage with bento grid layout#288
RedStar071 wants to merge 64 commits into
mainfrom
refactor/create-new-home-page

Conversation

@RedStar071

@RedStar071 RedStar071 commented Jul 8, 2026

Copy link
Copy Markdown
Member

🔗 Linked issue

#XXXX

🧭 Context

The Wolfstar marketing homepage needed a full visual refresh to match design option 1c — a bold bento grid layout with spectrum accent colors, updated header/footer chrome, and section-based composition instead of the previous carousel-driven feature showcase.

High-level summary: Redesigned /wolfstar with modular section components (hero, features, dashboard preview, stats, testimonials, CTA), new shared layout primitives (Section, SurfaceCard), spectrum design tokens, and updated Header/Footer composables.

📚 Description

This PR completes the Wolfstar homepage redesign across three commits:

  • refactor: redesigned the Wolfstar homepage — Introduces the new section-based page structure and component architecture.
  • fix(home): align the redesigned home page with design 1c — Finishes the half-done redesign to match design 1c: fixes HomeAccent typing, deduplicates constants, adds spectrum CSS tokens/utilities, expands dashboard mockup to 6 members, and replaces the removed feature carousel with a static ShowcaseSection (mod-log "In Action" showcase).
  • feat(home): enhance home page with new components and styles — Polishes components and styles for the final layout.

Notable changes:

  • New @components/ under app/pages/(marketing)/wolfstar/HeroSection, FeaturesSection, FeatureShowcase, DashboardSection, StatsSection, TestimonialsSection, ShowcaseSection, CtaSection, etc.
  • Shared primitives: Section.vue, SurfaceCard.vue, discord/slash-command.vue
  • Spectrum palette as :root tokens + bg-spectrum-* utilities in main.css / utilities.css
  • Updated useHeader / useFooter composables and tests
  • Removed FeatureCarousel.client.vue, FeatureShowcase.client.vue, and app/themes/header.ts
  • Dependency updates in pnpm-lock.yaml

Testing:

  • Updated useHeader and useFooter Nuxt composable specs
  • Manual verification of homepage sections, accents, and responsive layout recommended

Notes for reviewers:

  • Large pnpm-lock.yaml diff — verify intentional dependency changes alongside package.json
  • Untracked .skills/ directory in working tree is not included in this PR

View with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is enabled.

Confidence Score: 4/5

Mostly safe to merge after fixing the mobile navigation regression.

The redesign is primarily UI-focused, but the changed header model leaves mobile feature menu items without destinations.

app/composables/useHeader.ts

T-Rex T-Rex Logs

What T-Rex did

  • I inspected the targeted header composable and noted the mobile Features items lack to targets while desktop items include anchors, and I attempted the narrow Nuxt build path but the build blocker persisted due to stale dependencies, even after trying a frozen-lockfile install.
  • I created a Playwright repro harness to start Nuxt dev and exercise the mobile Features submenu, with the aim to capture screenshots and log href/click results, but the harness run timed out before producing usable artifacts.
  • I captured a desktop screenshot of /wolfstar as rendered by Nuxt and reviewed dev-server logs showing the server built and HTML validated, with Prisma client generation performed to unblock startup.
  • I reviewed the Playwright run and mobile capture artifacts and noted a blocker/timeout path rather than usable mobile interaction data.

View all artifacts

T-Rex Ran code and verified through T-Rex

Fix All in Claude Code Fix All in Cursor Fix All in Cursor Cloud Agents

Prompt To Fix All With AI
Fix the following 1 code review issue. Work through them one at a time, proposing concise fixes.

---

### Issue 1 of 1
app/composables/useHeader.ts:62-72
**Restore mobile feature links**
The mobile `Features` submenu items no longer have `to` targets, while the matching desktop items still point to `#moderation-tools`, `#advanced-logging`, and `#moderation-logs`. On small screens these entries render as non-navigating labels, so users cannot jump to the redesigned feature sections from the header. Add the same anchors used by `desktopLinks` to each mobile child.

Reviews (24): Last reviewed commit: "feat(discord): enhance StringSelectMenu ..." | Re-trigger Greptile

Context used:

  • Context used - CLAUDE.md (source)

Complete the half-finished home redesign so it matches design option
"1c" (bold bento grid + spectrum accents).

- Fix broken typecheck: define the HomeAccent type (semantic ∪ spectrum)
  and make homeAccentClass total; drop an unused env in AppHeader.
- Dedupe constants.ts (remove the unused wolfstar* copies); ship honest
  stats with spectrum accents and the 3 mockup testimonials.
- Add the design's spectrum palette as :root tokens + bg-spectrum-*
  utilities; wire the hero rule and stat accent stripes to them.
- Add the 6th dashboard member and a band background for testimonials.
- Replace the removed FeatureCarousel/FeatureShowcase "Explore" with a
  static ShowcaseSection reproducing the c1 "In Action" mod-log.

Claude-Session: https://claude.ai/code/session_01GN9bmtSthtLtzPvy92qhr4
@blacksmith-sh blacksmith-sh Bot changed the title feat(home): redesign Wolfstar homepage with bento grid layout feat(ui): redesign Wolfstar homepage with bento grid layout Jul 8, 2026
@codecov

codecov Bot commented Jul 8, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 77.04918% with 126 lines in your changes missing coverage. Please review.
✅ Project coverage is 70.99%. Comparing base (5c8cd13) to head (ddf9b7b).
⚠️ Report is 2 commits behind head on main.
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
...eting)/wolfstar/@components/ModerationShowcase.vue 68.70% 15 Missing and 26 partials ⚠️
app/components/discord/v2/string-select-menu.vue 79.16% 3 Missing and 12 partials ⚠️
app/components/discord/scrollbar.vue 63.88% 10 Missing and 3 partials ⚠️
app/components/OtherApps.vue 50.00% 4 Missing and 3 partials ⚠️
shared/utils/format-slash-command-display-name.ts 68.18% 1 Missing and 6 partials ⚠️
shared/utils/slash-command.ts 33.33% 0 Missing and 6 partials ⚠️
...pp/components/discord/slash-command-suggestion.vue 66.66% 1 Missing and 4 partials ⚠️
...p/components/discord/slash-command-suggestions.vue 69.23% 3 Missing and 1 partial ⚠️
app/components/discord/message-reply.vue 81.25% 2 Missing and 1 partial ⚠️
...nents/discord/slash-command-suggestion-matched.vue 72.72% 1 Missing and 2 partials ⚠️
... and 10 more
Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main     #288      +/-   ##
==========================================
+ Coverage   69.68%   70.99%   +1.30%     
==========================================
  Files         136      170      +34     
  Lines        3002     3496     +494     
  Branches      648      751     +103     
==========================================
+ Hits         2092     2482     +390     
- Misses        456      484      +28     
- Partials      454      530      +76     
Flag Coverage Δ
component 64.07% <77.40%> (+3.77%) ⬆️
unit 69.18% <51.61%> (-0.37%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
app/components/Section.vue 100.00% <100.00%> (ø)
app/components/SurfaceCard.vue 100.00% <100.00%> (ø)
app/components/app/Footer.vue 100.00% <100.00%> (ø)
app/components/app/Header.vue 90.90% <100.00%> (+0.90%) ⬆️
app/components/discord/avatar.vue 100.00% <ø> (ø)
app/components/discord/embed.vue 100.00% <ø> (ø)
app/components/discord/invite.vue 75.00% <100.00%> (ø)
app/components/discord/mention.vue 100.00% <ø> (ø)
app/components/discord/message.vue 100.00% <100.00%> (ø)
app/components/discord/messages.vue 100.00% <ø> (ø)
... and 41 more
🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@codspeed-hq

codspeed-hq Bot commented Jul 8, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 44 untouched benchmarks


Comparing refactor/create-new-home-page (ddf9b7b) with main (ba9079f)

Open in CodSpeed

@blacksmith-sh

This comment has been minimized.

Comment thread pnpm-workspace.yaml Outdated
RedStar071 and others added 2 commits July 8, 2026 19:06
knip flagged app/components/discord/slash-command.vue as an unused file. It was added in this redesign but never referenced by any page, component, story, or test, so it fails the unused-code check (treatConfigHintsAsErrors).

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>
The allowBuilds map requires boolean values, but @google/genai carried a placeholder string, leaving its build-script approval unresolved. It's a transitive dep of AI tooling with no required native build, and installs already succeed with its script ignored, so deny it explicitly for a deterministic install.

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>
RedStar071 and others added 3 commits July 8, 2026 19:23
The redesign added a decorative IconsWolfstar watermark before the logo. Because IconsWolfstar bakes in role=img + aria-label="WolfStar logo", the watermark matched the logo selector first in DOM order, so the AppFooter a11y test's logo.find("svg") targeted the watermark (no nested svg) and threw "Cannot call attributes on an empty DOMWrapper". Override the watermark's role/aria-label so only the logo wrapper is exposed as the labeled image.

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>
The `^4.1.2` ranges for @vitest/browser-playwright and @vitest/coverage-v8 drifted to 4.1.10, while @vitest/ui stays pinned at 4.1.7 and vitest is aliased to vite-plus-test@0.1.19. Under 4.1.10 the v8 coverage provider calls `__vitest_takeV8Coverage`, which the vite-plus playwright browser provider does not implement, producing 100 unhandled errors that fail the Component tests job (0 test assertions fail). Pin both to 4.1.7 to match the rest of the toolchain.

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>
The /login route (alias of /oauth/login) redirects to Discord in middleware, so prerendering it only yields an empty redirect stub with no <title>/<body> and a missing lang attribute. With nitro.prerender.crawlLinks enabled and the dependency bump pulling it into the crawl set, @nuxtjs/html-validator (failOnError) fails the build. Mark the route prerender:false and add it to nitro.prerender.ignore so it is never statically rendered.

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>
Comment thread app/components/app/Header.vue Outdated
@blacksmith-sh

This comment has been minimized.

The dependency update resolved @playwright/test and playwright-core to 1.61.1 (required by nuxt-og-image 6.7.2, @nuxt/test-utils, and @vitest/browser-playwright), but the Browser tests job container was pinned to the v1.60.0-noble Playwright image. Its preinstalled Chromium build does not match 1.61.1, so every E2E test failed with "browserType.launch: Executable doesn't exist at /ms-playwright/chromium_headless_shell-1228/...". Align the container to the multi-arch (amd64+arm64) v1.61.1-noble image so the bundled browsers match the installed Playwright.

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>
Comment thread app/components/Section.vue
Comment thread app/components/OtherApps.vue
RedStar071 and others added 5 commits July 8, 2026 20:22
Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>
Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>
Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>
Keep slash-command.vue for composed command options alongside the new
suggestion, suggestions list, and input components used by CommandsShowcase.
Rename FeatureShowcase and ShowcaseSection to ModerationShowcase variants.

Co-authored-by: Cursor <cursoragent@cursor.com>
…nto refactor/create-new-home-page

Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	app/components/discord/slash-command.vue
Comment thread .github/workflows/ci.yml
RedStar071 and others added 2 commits July 11, 2026 08:29
…ome-page

# Conflicts:
#	app/pages/(marketing)/privacy.vue

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>
@RedStar071 RedStar071 closed this Jul 11, 2026
@RedStar071 RedStar071 reopened this Jul 11, 2026
RedStar071 and others added 7 commits July 11, 2026 19:15
Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>
…eration showcase

Merge ModerationLogsShowcase into ModerationShowcase, replace message-command-reply with a shared message-reply component, and fix redundant radio input labeling for accessibility.

Co-authored-by: Cursor <cursoragent@cursor.com>
…ctor

Keep consolidated ModerationShowcase and removed ModerationLogsShowcase.
Preserve radio input label cleanup from origin.

Co-authored-by: Cursor <cursoragent@cursor.com>
@blacksmith-sh

This comment has been minimized.

RedStar071 and others added 5 commits July 11, 2026 20:55
- Restore the semantic <header> for the DiscordMessage author row that the
  refactor downgraded to a <div>, fixing the "renders profile name in header"
  SSR test and keeping the message header semantics.
- Move the CommandsShowcase command-picker background into a scoped CSS custom
  property so it satisfies the design-token guardrail (no inline color literals).
- Assert the idle scrollbar thumb is not visible (v-show) instead of absent from
  the DOM, matching the component's rendering.
- Keep the test-covered DiscordSlashCommandSuggestionMatched primitive by adding
  it to knip ignoreFiles; it is exercised by component/a11y tests but not yet
  referenced in an app template.

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>
The DiscordScrollbar "idle track" test assumed short content is not
scrollable, but the component test viewport collapses (min-h-0 grid), so
isScrollable measures true and the thumb (v-show) stays visible. That makes
the thumb-absence assertion unsatisfiable in this environment. Drop it and
keep the deterministic track assertion; thumb rendering is already covered by
the scrollable-content test.

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>
The DiscordSlashCommand rewrite folds option name/value pairs into the aria-label and renders the colon separator as a CSS ::after pseudo-element. Update the composed-variant aria-label to the full formatted string and drop the colon from the subcommand text assertion (the aria-label check already covers 'scope: all').

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>
@blacksmith-sh

This comment has been minimized.

RedStar071 and others added 12 commits July 12, 2026 10:41
The header menu no longer includes an Invite App option (removed in 00efe7e), so the desktop/mobile Invite App tests are obsolete: the include cases now fail and the exclude cases pass only vacuously. Remove all four.

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>
The isCommandReply/isMessageReply type guards were introduced but never referenced, so knip flagged them as unused exports. Remove app/utils/discord.ts and demote MessageReplyKind/MessageReplyProps to file-local types (only MessageReply and MessageReplyComponentProps are consumed externally, by message.vue and message-reply.vue).

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>
…d-footer work

Checkpoint commit to unblock a cherry-pick from another branch;
work in progress on scrollable frequently-used list, sidebar scroll
container, and matched-footer section.
Adds /conf menu to CommandsShowcase using new Discord Components V2
mock components (Container, TextDisplay, Separator, ActionRow,
StringSelect, Button) under app/components/discord/v2/, since that
response shape doesn't fit the classic embed model.
Port skyra-project/discord-components' DiscordStringSelectMenu to Vue,
replacing the decorative aria-hidden string-select with an interactive
combobox/listbox: arrow navigation with wrap that skips disabled options,
Home/End, Enter/Space, Escape restoring focus, and v-model selection.

Keyboard handling runs through Nuxt UI's defineShortcuts, gated on trigger
focus because it binds to window; Tab stays unbound so its automatic
preventDefault cannot trap focus, and focusout closes the menu instead.

StringSelectMenuOption lives in its own leaf module so constants.ts can type
the showcase mocks without an import cycle through types/discord.ts.
Replace hsl/hsla custom properties and inline colors across Discord
mock components with perceptually equivalent oklch values for design
token consistency.

Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant