Skip to content

fix(ui): improve logo#1770

Open
vladh wants to merge 1 commit intonpmx-dev:mainfrom
vladh:main
Open

fix(ui): improve logo#1770
vladh wants to merge 1 commit intonpmx-dev:mainfrom
vladh:main

Conversation

@vladh
Copy link

@vladh vladh commented Feb 28, 2026

🔗 Linked issue

It was easier to just create the PR to demonstrate the fix — hope that's okay.

🧭 Context

The logo, on the homepage, and in the navigation, had various issues. Most significantly, the kerning and spacing seemed wrong to me.

📚 Description

I've create a new logo SVG and applied it throughout the website. Here are the benefits, which are visible in the below screenshots. Please look at the screenshots in full size to be able to see the differences properly.

  1. The logo is now an SVG made up of <path>s, ensuring the logo is rendered identically across all browsers.
  2. The kerning is now consistent between the letter pairs of “npmx”. Previously, the kerning for the {np} pair was too wide, and the kerning for the other pairs was too tight.
  3. The slash is now less tall, leaving more space for the “npmx” text to stand out, especially as small sizes.
  4. The environment text (“dev”, “canary” etc) is now a little bit more spaced out from the “npmx”, avoiding visual clashing.
  5. The space between the “./” and “npmx” is now smaller, tying the “./” mark into the text more, and also making the logo more consistent with the OpenGraph image (see below).
  6. On mobile, the left edge of the “./” logo is now correctly aligned with the content underneath.
  7. On non-homepage pages, the “npmx” text and the environment text are now larger and more readable.
  8. On non-heomapge pages, the logo is now properly spaced away from the search box.
  9. There is now both an AppLogo and an AppMark component, making it easier to use either the full logo, or just the “./” mark.
  10. AppLogo now contains the full logo, allowing it to be more easily used across the website.
  11. AppLogo previously incorrectly had a background colour and rounded corners, which has been fixed.
  12. The logo.svg file has been renamed to logo-icon.svg, creating space for the new logo.svg which contains the full logo, and logo-mark.svg which contains just the “./” mark on a transparent background. This should be handy for future use, in eg marketing materials.
shapes at 26-02-28 22 42 24 shapes at 26-02-28 22 42 27 shapes at 26-02-28 22 42 30

@vercel
Copy link

vercel bot commented Feb 28, 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 1, 2026 11:22pm
2 Skipped Deployments
Project Deployment Actions Updated (UTC)
docs.npmx.dev Ignored Ignored Preview Mar 1, 2026 11:22pm
npmx-lunaria Ignored Ignored Mar 1, 2026 11:22pm

Request Review

@codecov
Copy link

codecov bot commented Feb 28, 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!

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 28, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c722fb7 and d1e7378.

⛔ Files ignored due to path filters (9)
  • public-dev/logo-icon.svg is excluded by !**/*.svg
  • public-dev/logo-mark.svg is excluded by !**/*.svg
  • public-dev/logo.svg is excluded by !**/*.svg
  • public-staging/logo-icon.svg is excluded by !**/*.svg
  • public-staging/logo-mark.svg is excluded by !**/*.svg
  • public-staging/logo.svg is excluded by !**/*.svg
  • public/logo-icon.svg is excluded by !**/*.svg
  • public/logo-mark.svg is excluded by !**/*.svg
  • public/logo.svg is excluded by !**/*.svg
📒 Files selected for processing (7)
  • app/components/AppHeader.vue
  • app/components/AppLogo.vue
  • app/components/AppMark.vue
  • app/pages/index.vue
  • pwa-assets.config.ts
  • test/nuxt/a11y.spec.ts
  • test/unit/server/utils/file-tree.spec.ts
🚧 Files skipped from review as they are similar to previous changes (5)
  • test/nuxt/a11y.spec.ts
  • app/components/AppLogo.vue
  • app/pages/index.vue
  • test/unit/server/utils/file-tree.spec.ts
  • app/components/AppMark.vue

📝 Walkthrough

Walkthrough

Replaces the previous text-based logo glyph with new SVG paths and a changed viewBox in AppLogo; adds a new AppMark component (small SVG) and uses it for the mobile home link while enlarging the desktop AppLogo and removing the adjacent "npmx" text label. Adjusts spacing and badge positioning in AppHeader and the index page to suit the larger desktop logo. Updates pwa-assets config to reference logo-icon.svg and test fixtures to match; adds accessibility tests for AppMark.

Possibly related PRs

  • npmx-dev/npmx.dev PR 1343: Directly modifies how the logo’s slash/glyph is rendered (text vs SVG path), matching the SVG geometry changes.
  • npmx-dev/npmx.dev PR 971: Modifies AppLogo.vue and AppHeader.vue with overlapping logo SVG and header spacing changes.
  • npmx-dev/npmx.dev PR 798: Changes mobile home link/logo markup and behaviour in AppHeader.vue, overlapping the mobile-logo adjustments.

Suggested labels

front, a11y

Suggested reviewers

  • danielroe
  • alexdln
🚥 Pre-merge checks | ✅ 1
✅ Passed checks (1 passed)
Check name Status Explanation
Description check ✅ Passed The pull request description comprehensively explains the logo redesign changes, listing 12 specific improvements with clear rationale for the visual and technical modifications across components and files.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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.

@danielroe
Copy link
Member

would you mind resolving the conflict? 🙏

@vladh
Copy link
Author

vladh commented Mar 1, 2026

@danielroe Fixed!

7a0fc21 updated public/logo.svg but not public-staging/logo.svg or public-dev/logo.svg. I'm assuming the intent was to also update the latter two, so I updated those to be the same as the public/logo.svg that was created in 7a0fc21.

Then, as before, I renamed public{-dev,-staging}/logo.svg to public{-dev,-staging}/logo-icon.svg. Now, public/logo.svg is the new full logo that I created.

@vladh
Copy link
Author

vladh commented Mar 1, 2026

The test failures seem unrelated?

malloc_consolidate(): invalid chunk size

@danielroe
Copy link
Member

seems a takumi/og image flakiness (cc: @harlan-zw)

@danielroe
Copy link
Member

I'm sorry! reverted the og image change due to the flakiness (was also apparent per-route and on other PRs ...)

@vladh
Copy link
Author

vladh commented Mar 1, 2026

seems a takumi/og image flakiness (cc: @harlan-zw)

Assuming it is an issue with takumi as @danielroe said, I investigated the aforementioned message: malloc_consolidate(): invalid chunk size.

Here's what the dependency chain looks like:

  • npmx.dev (JS)
    • @takumi-rs/core (JS) 0.69.5 (source)
      • takumi (Rust) 0.69.5

We use takumi to generate images, and takumi uses mimalloc_rust as its memory allocator. But there's a recent issue on mimalloc_rust purpleprotocol/mimalloc_rust#153 where people are reporting:

Since we upgrade mimalloc crate from 0.1.47 to 0.1.48, we started seeing Unhandled signal SIGSEGV error from our error logs.

… in malloc_consolidate (av=0x7e3a6c000030) at ./malloc/malloc.c:4876

And in fact, the transition from mimalloc_rust 0.1.47 to 0.1.48 seems significant, because mimalloc_rust commit 747b5b bumps the version of the underlying C library (Microsoft's mimalloc) from v2 to v3.

Could this be the cause of our problem? Maybe, but it doesn't look like a recent dependency change would have caused it.

The version of mimalloc we depend on is based on the version that takumi depends on, and takumi bumped to mimalloc 0.1.48 in commit be28f9f, made on 31 Aug 2025. (cc @andrew, this was a great use of git-pkgs, thanks)

So it might be that the above mimalloc change is causing our issue, but if so, it's either happening intermittently, or only with certain inputs.

@danielroe Should I just create a new issue for this, so we can keep track of it?

@vladh
Copy link
Author

vladh commented Mar 1, 2026

@danielroe No problem, rebased!

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.

🧹 Nitpick comments (1)
app/components/AppLogo.vue (1)

7-43: LGTM!

The updated SVG implementation looks good:

  • Uses viewBox with explicit dimensions for consistent scaling
  • fill="currentColor" enables flexible colour theming
  • The accent slash uses var(--accent) CSS variable appropriately
  • aria-hidden="true" with <title> is a valid pattern for decorative logos

Minor note (optional): The stroke-width=".26458" attributes on all paths have no effect since no stroke colour is defined. These appear to be leftover from SVG export tooling and could be removed for cleaner output, but they cause no functional issues.


ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 86e26af and 0edd124.

⛔ Files ignored due to path filters (9)
  • public-dev/logo-icon.svg is excluded by !**/*.svg
  • public-dev/logo-mark.svg is excluded by !**/*.svg
  • public-dev/logo.svg is excluded by !**/*.svg
  • public-staging/logo-icon.svg is excluded by !**/*.svg
  • public-staging/logo-mark.svg is excluded by !**/*.svg
  • public-staging/logo.svg is excluded by !**/*.svg
  • public/logo-icon.svg is excluded by !**/*.svg
  • public/logo-mark.svg is excluded by !**/*.svg
  • public/logo.svg is excluded by !**/*.svg
📒 Files selected for processing (7)
  • app/components/AppHeader.vue
  • app/components/AppLogo.vue
  • app/components/AppMark.vue
  • app/pages/index.vue
  • pwa-assets.config.ts
  • test/nuxt/a11y.spec.ts
  • test/unit/server/utils/file-tree.spec.ts
🚧 Files skipped from review as they are similar to previous changes (5)
  • app/pages/index.vue
  • test/unit/server/utils/file-tree.spec.ts
  • app/components/AppMark.vue
  • test/nuxt/a11y.spec.ts
  • app/components/AppHeader.vue

@vladh
Copy link
Author

vladh commented Mar 1, 2026

Minor note (optional): The stroke-width=".26458" attributes on all paths have no effect since no stroke colour is defined. These appear to be leftover from SVG export tooling and could be removed for cleaner output, but they cause no functional issues.

This originates from the original logo.svg (the one with just the “./”). Let's leave it, it's just a few extra bytes, won't do any harm, and it saves me some testing.

@danielroe danielroe requested a review from alexdln March 1, 2026 22:07
@alexdln
Copy link
Member

alexdln commented Mar 1, 2026

@vladh Wow, excellent work, thank you for all the changes and unifications

A bit about details:

image

I'm aware that the slash is too low at the top. All the fonts create a different experience and habit, and I felt the difference here - you get *that* feeling that something is wrong, but you can't explain what

The stage text looks too far away when it's in the header. It's like it's at a different distance on the home page where it looks comfortable, and in the header - where it's a bit too far away

@vladh
Copy link
Author

vladh commented Mar 1, 2026

Hey @alexdln, thanks for the feedback!

I'm very aware that the slash is too low at the top. All the fonts create a different experience and habit, and I felt the difference here - you get that feeling that something is wrong, but you can't explain what

Am I correct in understanding that you would like the slash to be a little bit taller? Initially, I thought it was too tall and a bit distracting — of course, the font designer will have chosen an appropriate height for normal text, but it felt a bit tall in a “display” scenario like this logo. But, I may have overdone the change, making it too short. Maybe I can find a middle ground — does that sound good?

The stage text looks too far away when it's in the header. It's like it's at a different distance on the home page where it looks comfortable, and in the header - where it's a bit too far away

No problem, I'll make the spacing of the environment text a bit tighter in the header.

@alexdln
Copy link
Member

alexdln commented Mar 1, 2026

Maybe I can find a middle ground — does that sound good?

Yes, I think a good option would probably be somewhere in between. Maybe make the distance between the top and bottom of the lowercase roughly equal. Maybe just a liiittle bit more at the top

@vladh
Copy link
Author

vladh commented Mar 1, 2026

Yes, I think a good option would probably be somewhere in between. Maybe make the distance between the top and bottom of the lowercase roughly equal. Maybe just a liiittle bit more at the top

On it! 🫡

Copy link
Member

Choose a reason for hiding this comment

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

Can you please make the same distance at the top and bottom, otherwise it will always be sth like mt-0.125

@vladh
Copy link
Author

vladh commented Mar 1, 2026

@alexdln Changes done!

  • Made the slash taller, and a bit taller on the top than the bottom relative to lowercase letter size
  • Centered contents of logo-mark.svg
  • Reduced space above environment text in the navbar
  • Cleaned up SVG to remove miscellaneous extra bits, like the stroke info mentioned above

Here are screenshots, though you might want to open them in separate tabs and flip back/forth between them.

Of course, let me know if you have any additional feedback.

Before/after screenshots

Homepage

Before

Screen Shot 2026-03-01 at 23 09 53

After

Screen Shot 2026-03-01 at 23 09 51

Header

Before

Screen Shot 2026-03-01 at 23 10 24

After

Screen Shot 2026-03-01 at 23 10 23

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.

🧹 Nitpick comments (1)
app/components/AppMark.vue (1)

9-17: Align SVG accessibility semantics.

aria-hidden="true" means assistive tech will ignore this SVG, so the <title> on Line 16 is effectively unused. Either remove the <title> or expose the SVG semantics intentionally (e.g. no aria-hidden, with explicit labelling).


ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0edd124 and c722fb7.

⛔ Files ignored due to path filters (9)
  • public-dev/logo-icon.svg is excluded by !**/*.svg
  • public-dev/logo-mark.svg is excluded by !**/*.svg
  • public-dev/logo.svg is excluded by !**/*.svg
  • public-staging/logo-icon.svg is excluded by !**/*.svg
  • public-staging/logo-mark.svg is excluded by !**/*.svg
  • public-staging/logo.svg is excluded by !**/*.svg
  • public/logo-icon.svg is excluded by !**/*.svg
  • public/logo-mark.svg is excluded by !**/*.svg
  • public/logo.svg is excluded by !**/*.svg
📒 Files selected for processing (7)
  • app/components/AppHeader.vue
  • app/components/AppLogo.vue
  • app/components/AppMark.vue
  • app/pages/index.vue
  • pwa-assets.config.ts
  • test/nuxt/a11y.spec.ts
  • test/unit/server/utils/file-tree.spec.ts
🚧 Files skipped from review as they are similar to previous changes (4)
  • test/unit/server/utils/file-tree.spec.ts
  • test/nuxt/a11y.spec.ts
  • app/components/AppLogo.vue
  • pwa-assets.config.ts

@vladh
Copy link
Author

vladh commented Mar 1, 2026

9-17: Align SVG accessibility semantics.

aria-hidden="true" means assistive tech will ignore this SVG, so the <title> on Line 16 is effectively unused. Either remove the <title> or expose the SVG semantics intentionally (e.g. no aria-hidden, with explicit labelling).

Looks like both AppMark and AppLogo have aria-hidden, but this was there previously, so I'm setting it aside for the purposes of this PR.

@vladh
Copy link
Author

vladh commented Mar 2, 2026

FWIW this PR will require updating all OG image snapshots (or templates), as they were using logo.svg. I rasterized the / in the PR #1654?

I see the following templates:

  • app/components/OgImage/BlogPost.vue
  • app/components/OgImage/Default.vue
  • app/components/OgImage/Package.vue

None of them seem to refer to any .svg files.

On the other hand, I do see that Default.vue has a logo SVG embedded within it, and Package.vue has the logo “./” embedded, too. I think we can update those files in a different PR, because the logo in the OG image looked different from the logo on the homepage to begin with.

So I don't immediately see any additional OG image work that needs to be done as part of this PR specifically, but @harlan-zw please let me know if I missed something! 🙏🏻

@harlan-zw
Copy link
Contributor

harlan-zw commented Mar 2, 2026

Sorry, I was going based on the previous PR being merged, didn't realize it got reverted #1654. I can swap around the paths when I recreate it so please ignore me 😄

@vladh
Copy link
Author

vladh commented Mar 2, 2026

Sorry, I was going based on the previous PR being merged, didn't realize it got reverted #1654. I can swap around the paths when I recreate it so please ignore me 😄

No problem! 🙌🏻

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.

4 participants