Skip to content

feat: reorganize footer links into labeled columns#2211

Open
thealxlabs wants to merge 5 commits intonpmx-dev:mainfrom
thealxlabs:feat/footer-column-layout
Open

feat: reorganize footer links into labeled columns#2211
thealxlabs wants to merge 5 commits intonpmx-dev:mainfrom
thealxlabs:feat/footer-column-layout

Conversation

@thealxlabs
Copy link

🔗 Linked issue

resolves #1364

🧭 Context

The app footer displayed links in an unorganized flat list. Grouping them into labeled columns (Product, Legal, Community) makes the footer easier to scan and aligns with common web conventions.

📚 Description

Refactored AppFooter.vue to organize links into three labeled column groups:

  • Product: About, Blog, Docs, Keyboard Shortcuts
  • Legal: Privacy Policy, Accessibility, Translation Status
  • Community: Source, Social, Discord, Builders Chat

Column labels use tracking-wide uppercase text in text-fg-subtle for a subtle separator. The layout uses a responsive grid (2 columns on sm, 3 on lg).

A regression test added to test/nuxt/components/AppFooter.spec.ts verifies that all three column label spans (Product, Legal, Community) are present in the rendered footer.

@vercel
Copy link

vercel bot commented Mar 22, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
npmx.dev Ready Ready Preview, Comment Mar 22, 2026 7:41pm
2 Skipped Deployments
Project Deployment Actions Updated (UTC)
docs.npmx.dev Ignored Ignored Preview Mar 22, 2026 7:41pm
npmx-lunaria Ignored Ignored Mar 22, 2026 7:41pm

Request Review

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 22, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 9a072f69-ce42-4986-88d8-a1443ecc3d74

📥 Commits

Reviewing files that changed from the base of the PR and between 86a7ac3 and 0dba940.

📒 Files selected for processing (2)
  • i18n/locales/en.json
  • i18n/schema.json
✅ Files skipped from review due to trivial changes (1)
  • i18n/locales/en.json

📝 Walkthrough

Walkthrough

The desktop footer was changed from a single horizontal flex row to a responsive three-column grid and links were redistributed into three columns labelled Product, Legal (Legal & Info), and Community. The keyboard shortcuts button was restyled for left-aligned text while retaining its modal trigger behaviour. i18n keys for the footer were updated to include product, legal, and community, and the i18n schema was extended accordingly. Two tests were added to assert the presence of the three column labels and that the About link appears under Product when mounted on /about.

Possibly related PRs

Suggested reviewers

  • danielroe
  • alexdln
  • whitep4nth3r
🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description check ✅ Passed The pull request description clearly describes the refactoring of AppFooter.vue to organize links into three labeled columns with specific groupings and styling details.
Linked Issues check ✅ Passed The pull request successfully implements all objectives from issue #1364: replaced flat single-line layout with multi-column grid layout, grouped links under headings (Product, Legal, Community), and added regression tests.
Out of Scope Changes check ✅ Passed All changes are directly scoped to the footer reorganisation objective. The modifications to AppFooter.vue, tests, i18n keys, and schema are all necessary and justified for the columnar layout implementation.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
app/components/AppFooter.vue (2)

23-25: Trim structural template comments that restate obvious markup.

Line [23], Line [25], Line [122], and Line [134] describe self-evident layout blocks; removing them will keep the template leaner.

As per coding guidelines: "Add comments only to explain complex logic or non-obvious implementations".

Also applies to: 122-122, 134-134


35-35: Prefer global focus-visible styling for this button.

Line [35] applies inline focus-visible:(...) utilities on a <button>. In this codebase, button focus-visible styling should come from the global rule to keep behaviour consistent.

Suggested minimal class adjustment
-              class="text-start cursor-pointer inline-flex gap-x-1 items-center underline-offset-[0.2rem] underline decoration-1 decoration-fg/30 font-mono text-fg hover:(decoration-accent text-accent) focus-visible:(decoration-accent text-accent) transition-colors duration-200"
+              class="text-start cursor-pointer inline-flex gap-x-1 items-center underline-offset-[0.2rem] underline decoration-1 decoration-fg/30 font-mono text-fg hover:(decoration-accent text-accent) transition-colors duration-200"

Based on learnings: focus-visible styling for button/select elements should be handled globally in app/assets/main.css, and per-element inline focus-visible utility classes should be avoided.


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: d1b18a4a-2880-49a8-a60d-63772fefabfd

📥 Commits

Reviewing files that changed from the base of the PR and between 7f2fc1a and 86a7ac3.

📒 Files selected for processing (2)
  • app/components/AppFooter.vue
  • test/nuxt/components/AppFooter.spec.ts

Comment on lines +27 to +30
// The Product column should link to /about and /blog
const aboutLink = component.find('a[href="/about"]')
expect(aboutLink.exists()).toBe(true)
})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Test intent and assertions are out of sync.

Line [27] states /about and /blog should be present, but only /about is asserted. Please assert /blog too (or narrow the test description/comment).

Suggested test completion
     // The Product column should link to /about and /blog
     const aboutLink = component.find('a[href="/about"]')
     expect(aboutLink.exists()).toBe(true)
+    const blogLink = component.find('a[href="/blog"]')
+    expect(blogLink.exists()).toBe(true)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// The Product column should link to /about and /blog
const aboutLink = component.find('a[href="/about"]')
expect(aboutLink.exists()).toBe(true)
})
// The Product column should link to /about and /blog
const aboutLink = component.find('a[href="/about"]')
expect(aboutLink.exists()).toBe(true)
const blogLink = component.find('a[href="/blog"]')
expect(blogLink.exists()).toBe(true)
})

@github-actions
Copy link

Lunaria Status Overview

🌕 This pull request will trigger status changes.

Learn more

By default, every PR changing files present in the Lunaria configuration's files property will be considered and trigger status changes accordingly.

You can change this by adding one of the keywords present in the ignoreKeywords property in your Lunaria configuration file in the PR's title (ignoring all files) or by including a tracker directive in the merged commit's description.

Tracked Files

File Note
i18n/locales/en.json Source changed, localizations will be marked as outdated.
Warnings reference
Icon Description
🔄️ The source for this localization has been updated since the creation of this pull request, make sure all changes in the source have been applied.

@codecov
Copy link

codecov bot commented Mar 22, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ All tests successful. No failed tests found.

📢 Thoughts on this report? Let us know!

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.

Switch to columnar footer to support future link

1 participant