Skip to content

feat: add an interactive World Emoji Day noodle#3038

Merged
ghostdevv merged 10 commits into
npmx-dev:mainfrom
jviide:emoji-day
Jul 14, 2026
Merged

feat: add an interactive World Emoji Day noodle#3038
ghostdevv merged 10 commits into
npmx-dev:mainfrom
jviide:emoji-day

Conversation

@jviide

@jviide jviide commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

🔗 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 14, 2026 12:39pm
2 Skipped Deployments
Project Deployment Actions Updated (UTC)
docs.npmx.dev Ignored Ignored Preview Jul 14, 2026 12:39pm
npmx-lunaria Ignored Ignored Jul 14, 2026 12:39pm

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
Contributor 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
Contributor 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
Contributor 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
Contributor 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

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
Contributor Author

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

@ghostdevv ghostdevv added this pull request to the merge queue Jul 14, 2026
Merged via the queue into npmx-dev:main with commit 368b2b7 Jul 14, 2026
23 checks passed
@github-actions

Copy link
Copy Markdown

Thanks for your first contribution, @jviide! 🥳

We'd love to welcome you to the npmx community. Come and say hi on Discord! And once you've joined, visit npmx.wamellow.com to claim the contributor role.

@jviide jviide deleted the emoji-day branch July 14, 2026 13:59
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.

6 participants