Skip to content

feat: add an interactive World Emoji Day noodle#3038

Open
jviide wants to merge 9 commits into
npmx-dev:mainfrom
jviide:emoji-day
Open

feat: add an interactive World Emoji Day noodle#3038
jviide wants to merge 9 commits into
npmx-dev:mainfrom
jviide:emoji-day

Conversation

@jviide

@jviide jviide commented Jul 13, 2026

Copy link
Copy Markdown

🔗 Linked issue

🧭 Context

Noodle World Emoji Day on 17. July. @trueberryless submitted #3029 to add a noodle to mark the occasion.

In the related Discord conversations @graphieros suggested animations.

📚 Description

This pull request adds an animated World Emoji Day noodle based on the design by @trueberryless.

The noodle is set to be shown on July 17-19, giving a couple of days of leeway similarly to the Tetris Day noodle.

Each character in "./npmx" is split into parts, and each contains a rough polyline approximating a part of the character. Each part is also associated with a bunch of emojis.

The emojis keep track of their speed and position. For each frame each emoji is attracted to the closest point of its corresponding polyline. Each emoji is also attracted to a position on their polyline as if they were evenly distributed on the polyline, sorted by their current closest point on it.

If emojis (within the same character) get too close, they repel each other. This calculation is O(n^2) relative to the number of emojis in that character, which should be relatively small.

The code also keeps track of the pointer position, and the pointer also repels the emojis.

Instead of using the browser's built-in emojis, for compatibility reasons the code uses vertical PNG spritesheets of emojis, one per emoji "category" (like "red", "blue", "faces" etc.) The images were produced by rendering the emojis into vertical strips on my local browser, then compressed and color-reduced with squoosh.app.

As a related change, the tagline in the IntroHeader component is now centered.

@vercel

vercel Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

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

Project Deployment Actions Updated (UTC)
npmx.dev Ready Ready Preview, Comment Jul 13, 2026 9:17pm
2 Skipped Deployments
Project Deployment Actions Updated (UTC)
docs.npmx.dev Ignored Ignored Preview Jul 13, 2026 9:17pm
npmx-lunaria Ignored Ignored Jul 13, 2026 9:17pm

Request Review

@coderabbitai

coderabbitai Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

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
📝 Walkthrough

Walkthrough

The PR adds a dated Emoji Day animated noodle with lazy-loaded emoji sprites, viewport-aware animation controls, registry integration, and centred landing-page tagline text.

Changes

Emoji Day noodle

Layer / File(s) Summary
Emoji glyph model and geometry
app/components/Noodle/EmojiDay/emoji-thing.js
Defines emoji glyph paths, sprite parameters, physics constants, and polyline projection/interpolation utilities.
Emoji sprite animation runtime
app/components/Noodle/EmojiDay/emoji-thing.js
Creates emoji sprites, applies path, collision, and pointer physics, updates transforms, and exposes lifecycle controls.
Lazy loading and registry integration
app/components/Noodle/EmojiDay/Logo.vue, app/components/Noodle/index.ts, app/components/Landing/IntroHeader.vue
Loads emoji assets lazily, controls animation by viewport visibility, registers the noodle for 17–19 July 2026, and centres the intro tagline.

Sequence Diagram(s)

sequenceDiagram
  participant LogoVue
  participant EmojiThing
  participant EmojiSprites
  participant Browser
  LogoVue->>EmojiThing: init(sizer, emojiSetImages)
  EmojiThing->>EmojiSprites: create canvases and glyph state
  Browser->>EmojiThing: requestAnimationFrame
  EmojiThing->>EmojiSprites: update positions and transforms
  LogoVue->>EmojiThing: start(), pause(), or destroy()
Loading

Possibly related PRs

Suggested reviewers: ghostdevv

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly matches the main change: an interactive World Emoji Day noodle.
Description check ✅ Passed The description directly describes the animated emoji noodle and the tagline centring change.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ 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.

@codecov

codecov Bot commented Jul 13, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 36.73469% with 31 lines in your changes missing coverage. Please review.
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
app/components/Noodle/EmojiDay/ThemedLogo.vue 32.55% 25 Missing and 4 partials ⚠️
app/noodles.ts 0.00% 2 Missing ⚠️

📢 Thoughts on this report? Let us know!

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@app/components/Noodle/EmojiDay/Logo.vue`:
- Around line 48-59: Update the emoji image-loading promise in the Logo
component so each Image rejects on load failure as well as resolving on load
success. Ensure the cached emojiSetImagesPromise is cleared when Promise.all
fails, allowing later intersections to retry, and handle the rejected promise in
the caller’s initialization flow around the intersection logic.
- Around line 18-66: Enable TypeScript in the component by changing the script
setup language to ts and add strict types for loadEmojiSetImages and its image
promise, the animation handle, observer, and sizer template reference. Update
related callbacks and state declarations in loadEmojiSetImages and the lifecycle
logic to remain type-safe without changing behavior.
- Line 10: Remove the touch-action: none declaration from the logo’s styling so
the full-width region preserves native page scrolling and pinch-zoom behavior.
- Around line 86-89: Update the branch that sets running to false in the Logo
component so it only calls handle.pause() when handle exists. Preserve the
running state update and avoid throwing for instances paused before image
loading completes or before intersection initialization.

In `@app/components/Noodle/index.ts`:
- Around line 71-72: Update the World Emoji Day noodle configuration in the
visible date block to remove the dateTo property, leaving only the 17 July 2026
date so the noodle is active on that day alone.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: b1d33625-df1b-4175-9ef3-1b1e75c3b55d

📥 Commits

Reviewing files that changed from the base of the PR and between ff8b5a0 and 7d44813.

⛔ Files ignored due to path filters (8)
  • app/components/Noodle/EmojiDay/emojisets/blue.png is excluded by !**/*.png
  • app/components/Noodle/EmojiDay/emojisets/cloud.png is excluded by !**/*.png
  • app/components/Noodle/EmojiDay/emojisets/earth.png is excluded by !**/*.png
  • app/components/Noodle/EmojiDay/emojisets/faces.png is excluded by !**/*.png
  • app/components/Noodle/EmojiDay/emojisets/gold.png is excluded by !**/*.png
  • app/components/Noodle/EmojiDay/emojisets/green.png is excluded by !**/*.png
  • app/components/Noodle/EmojiDay/emojisets/hearts.png is excluded by !**/*.png
  • app/components/Noodle/EmojiDay/emojisets/red.png is excluded by !**/*.png
📒 Files selected for processing (4)
  • app/components/Landing/IntroHeader.vue
  • app/components/Noodle/EmojiDay/Logo.vue
  • app/components/Noodle/EmojiDay/emoji-thing.js
  • app/components/Noodle/index.ts

Comment thread app/components/Noodle/EmojiDay/Logo.vue Outdated
Comment thread app/components/Noodle/EmojiDay/Logo.vue Outdated
Comment thread app/components/Noodle/EmojiDay/Logo.vue Outdated
Comment thread app/components/Noodle/EmojiDay/Logo.vue Outdated
Comment thread app/components/Noodle/index.ts Outdated
@jviide

jviide commented Jul 13, 2026

Copy link
Copy Markdown
Author

The high tech cutting edge solution used to generate the vertical emoji PNGs:

image

@jviide

jviide commented Jul 13, 2026

Copy link
Copy Markdown
Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@jviide

jviide commented Jul 13, 2026

Copy link
Copy Markdown
Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Full review finished.


Your plan includes PR reviews subject to rate limits. More reviews will be available in 13 minutes.

@trueberryless

Copy link
Copy Markdown
Member

I love this 🧡💐

Thanks for implementing your amazing animated version in here. As this supersedes my PR, I'm gonna close mine 👍

@jviide

jviide commented Jul 13, 2026

Copy link
Copy Markdown
Author

@trueberryless Thank you, without your design this wouldn't exist.

@trueberryless

Copy link
Copy Markdown
Member

After a very quick skim, just a little "don't forget": We should still add the Noodle to the archive page: docs

@jviide

jviide commented Jul 13, 2026

Copy link
Copy Markdown
Author

After a very quick skim, just a little "don't forget": We should still add the Noodle to the archive page: docs

Thanks for the reminder. With the permission of @trueberryless I took the metadata from #3038 and added @trueberryless as a co-author for the commit and as an author for the noodle itself.

@trueberryless

Copy link
Copy Markdown
Member

Thanks for the reminder. With the permission of @trueberryless I took the metadata from #3038 and added @trueberryless as a co-author for the commit and as an author for the noodle itself.

Team work makes the dream work 🩵

@Adebesin-Cell Adebesin-Cell left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

In https://npmx.dev/noodles, the bowl is complete.

Image

Looks broken here, https://npmx-hb7g7prmu-npmx.vercel.app/noodles

Image

It must have diverted in some commits but could you please take a look at it? Thanks!

@gameroman gameroman left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Beautiful

Comment thread app/noodles.ts Outdated

@graphieros graphieros left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I believe this PR is just missing a test case in a11y.spec.ts, and we're good ?

@trueberryless trueberryless left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I took the liberty to update the PR so it's ready to merge 🏁

@trueberryless

Copy link
Copy Markdown
Member

oops, nvm 😅
Let me take a look

@graphieros graphieros left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This is marvellous 🌿

@jviide

jviide commented Jul 13, 2026

Copy link
Copy Markdown
Author

Fixed an issue where the logo couldn't discover its width on iOS.

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.

5 participants