Skip to content

sparkle/add SpinnerBrand component#23660

Merged
ClementAupiais merged 6 commits intomainfrom
sparkle/SpinnerBrand
Apr 3, 2026
Merged

sparkle/add SpinnerBrand component#23660
ClementAupiais merged 6 commits intomainfrom
sparkle/SpinnerBrand

Conversation

@ClementAupiais
Copy link
Copy Markdown
Contributor

Description

New Lottie-based spinner using the Dust logo animation with three variants: mono, colored, and colored-gray. Includes Storybook stories with a full size × variant gallery.

Tests

Manually tested via Storybook. Added stories including a Playground story for individual testing and a Gallery story that displays all size × variant combinations.

Risk

None. This is a new component addition with no impact on existing code.

Deploy Plan

Deploy sparkle

New Lottie-based spinner using the Dust logo animation with three variants:
mono, colored, and colored-gray. Includes Storybook stories with a full
size × variant gallery.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@vercel
Copy link
Copy Markdown

vercel bot commented Apr 2, 2026

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

Project Deployment Actions Updated (UTC)
storybook Ready Ready Preview, Comment Apr 3, 2026 2:14pm
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
playground Ignored Ignored Preview Apr 3, 2026 2:14pm

Request Review

Copy link
Copy Markdown
Contributor

@dust-agent dust-agent bot left a comment

Choose a reason for hiding this comment

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

Coding Rules LGTM \o/

Copy link
Copy Markdown
Contributor

@ykmsd ykmsd left a comment

Choose a reason for hiding this comment

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

As discussed IRL, I'm not sure about it and would love to see the version that is a bit slower

@@ -0,0 +1,2 @@
const animation = {"nm":"Logo-Spin-plan","ddd":0,"h":40,"w":40,"meta":{"g":"LottieFiles Figma v111"},"layers":[{"ty":0,"nm":"blue","sr":1,"st":0,"op":109,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[20,20]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[-20,20],"t":0},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[-20,20],"t":12},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[-20,20],"t":24},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[-20,20],"t":36},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[20,20],"t":48},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[20,20],"t":60},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[-20,20],"t":72},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[-20,20],"t":96},{"s":[-20,20],"t":120}]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"w":40,"h":40,"refId":"1","ind":1},{"ty":4,"nm":"orange","sr":1,"st":0,"op":109,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[20,20]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[20,-20],"t":0},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[20,-20],"t":12},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[20,-20],"t":36},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[60,20],"t":48},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[60,20],"t":60},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[20,20],"t":72},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[20,20],"t":96},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[20,-20],"t":108},{"s":[20,-20],"t":120}]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[],"ind":2},{"ty":4,"nm":"Union","sr":1,"st":0,"op":109,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[20,20]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[20,20]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[40,20],[20,20],[20,40],[0,40],[0,0],[40,0],[40,20]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"","c":{"a":0,"k":[0.2118,0.2549,0.3255]},"r":1,"o":{"a":0,"k":100}}],"ind":3,"parent":2},{"ty":4,"nm":"Union","sr":1,"st":0,"op":109,"ip":60,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[20,20]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[20,20]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[40,20],[20,20],[20,40],[0,40],[0,0],[40,0],[40,20]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"","c":{"a":0,"k":[0.2118,0.2549,0.3255]},"r":1,"o":{"a":0,"k":100}}],"ind":4,"parent":2},{"ty":4,"nm":"green","sr":1,"st":0,"op":109,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[20,20]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[20,20],"t":0},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[20,20],"t":12},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[20,60],"t":24},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[20,60],"t":36},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[20,60],"t":60},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[20,60],"t":72},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[20,60],"t":96},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[20,20],"t":108},{"s":[20,20],"t":120}]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[],"ind":5},{"ty":4,"nm":"Union","sr":1,"st":0,"op":109,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[20,20]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[20,20]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-11.05],[11.05,0],[0,0],[0,0],[0,0]],"o":[[11.05,0],[0,11.05],[0,0],[0,0],[0,0],[0,0]],"v":[[20,0],[40,20],[20,40],[0,40],[0,0],[20,0]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"","c":{"a":0,"k":[0.2118,0.2549,0.3255]},"r":1,"o":{"a":0,"k":100}}],"ind":6,"parent":5},{"ty":4,"nm":"Union","sr":1,"st":0,"op":109,"ip":60,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[20,20]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[20,20]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-11.05],[11.05,0],[0,0],[0,0],[0,0]],"o":[[11.05,0],[0,11.05],[0,0],[0,0],[0,0],[0,0]],"v":[[20,0],[40,20],[20,40],[0,40],[0,0],[20,0]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"","c":{"a":0,"k":[0.2118,0.2549,0.3255]},"r":1,"o":{"a":0,"k":100}}],"ind":7,"parent":5},{"ty":4,"nm":"red","sr":1,"st":0,"op":109,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[20,20]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[20,-20],"t":0},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[20,-20],"t":12},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[20,20],"t":24},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[20,20],"t":36},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[60,20],"t":48},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[60,20],"t":60},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[60,20],"t":96},{"o":{"x":0.33,"y":1},"i":{"x":0.68,"y":1},"s":[20,-20],"t":108},{"s":[20,-20],"t":120}]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[],"ind":8},{"ty":4,"nm":"Union","sr":1,"st":0,"op":109,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[20,20]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[20,20]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[11.05,0],[0,11.05],[0,0],[0,0]],"o":[[0,0],[0,11.05],[-11.05,0],[0,0],[0,0],[0,0]],"v":[[40,0],[40,20],[20,40],[0,20],[0,0],[40,0]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"","c":{"a":0,"k":[0.2118,0.2549,0.3255]},"r":1,"o":{"a":0,"k":100}}],"ind":9,"parent":8},{"ty":4,"nm":"Union","sr":1,"st":0,"op":109,"ip":36,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[20,20]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[20,20]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[11.05,0],[0,11.05],[0,0],[0,0]],"o":[[0,0],[0,11.05],[-11.05,0],[0,0],[0,0],[0,0]],"v":[[40,0],[40,20],[20,40],[0,20],[0,0],[40,0]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"","c":{"a":0,"k":[0.2118,0.2549,0.3255]},"r":1,"o":{"a":0,"k":100}}],"ind":10,"parent":8}],"v":"5.7.0","fr":60,"op":108,"ip":0,"assets":[{"nm":"[Asset] blue","id":"1","fr":30,"layers":[{"ty":4,"nm":"blue Bg","sr":1,"st":0,"op":109,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[20,20]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[20,20]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-0.01],[0,0],[0.01,0],[0,0],[0,0.01],[0,0],[-0.01,0],[0,0]],"o":[[0,0],[0,0.01],[0,0],[-0.01,0],[0,0],[0,-0.01],[0,0],[0.01,0]],"v":[[40,0.01],[40,39.99],[39.99,40],[0.01,40],[0,39.99],[0,0.01],[0.01,0],[39.99,0]]}}}],"ind":1},{"ty":4,"nm":"Union","sr":1,"st":0,"op":109,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[20,20]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[20,20]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.52],[5.52,0],[0,0],[0,0],[0,0]],"o":[[5.52,0],[0,5.52],[0,0],[0,0],[0,0],[0,0]],"v":[[20,20],[30,30],[20,40],[0,40],[0,20],[20,20]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,5.52],[-5.52,0],[0,0],[0,0]],"o":[[0,0],[-5.52,0],[0,-5.52],[0,0],[0,0],[0,0]],"v":[[40,20],[20,20],[10,10],[20,0],[40,0],[40,20]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"","c":{"a":0,"k":[0.2118,0.2549,0.3255]},"r":1,"o":{"a":0,"k":100}}],"ind":2},{"ty":4,"nm":"Union","sr":1,"st":0,"op":109,"ip":36,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[20,20]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[20,20]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.52],[5.52,0],[0,0],[0,0],[0,0]],"o":[[5.52,0],[0,5.52],[0,0],[0,0],[0,0],[0,0]],"v":[[20,20],[30,30],[20,40],[0,40],[0,20],[20,20]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,5.52],[-5.52,0],[0,0],[0,0]],"o":[[0,0],[-5.52,0],[0,-5.52],[0,0],[0,0],[0,0]],"v":[[40,20],[20,20],[10,10],[20,0],[40,0],[40,20]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"","c":{"a":0,"k":[0.2118,0.2549,0.3255]},"r":1,"o":{"a":0,"k":100}}],"ind":3},{"ty":4,"nm":"Union","sr":1,"st":0,"op":109,"ip":60,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[20,20]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[20,20]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-5.52],[5.52,0],[0,0],[0,0],[0,0]],"o":[[5.52,0],[0,5.52],[0,0],[0,0],[0,0],[0,0]],"v":[[20,20],[30,30],[20,40],[0,40],[0,20],[20,20]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,5.52],[-5.52,0],[0,0],[0,0]],"o":[[0,0],[-5.52,0],[0,-5.52],[0,0],[0,0],[0,0]],"v":[[40,20],[20,20],[10,10],[20,0],[40,0],[40,20]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"","c":{"a":0,"k":[0.2118,0.2549,0.3255]},"r":1,"o":{"a":0,"k":100}}],"ind":4}]}]} as const;
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.

wtf is this 🥶

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.

okay so this is how you define animation lottie 🙃

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Yes ahah its a gigantic json

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Exposes animation speed multiplier via lottieRef for testing
and runtime control. Storybook Playground includes a number
control (0.1–5, default 1).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@ClementAupiais
Copy link
Copy Markdown
Contributor Author

@ykmsd just added a speed props to it, indeed 0.5 seems a bit better. WDYT

@ykmsd
Copy link
Copy Markdown
Contributor

ykmsd commented Apr 2, 2026

I'm team 0.4 but might change my opinion once the animation gets smoother 😄

- Replace FullColored animation with v2 (fixed version)
- Strip opacity keyframes for clean transitions
- Apply ease-in-out easing to all keyframes
- Set default speed to 0.4

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Mono: updated to v2 with ease-in-out easing
- Colored: updated to v2 fix with ease-in-out easing
- ColoredGray: updated to v2 fix with ease-in-out easing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds a forced-white version of the mono animation using replaceColors,
handling both 3 and 4-element color arrays for compatibility.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@ClementAupiais ClementAupiais merged commit 2bec847 into main Apr 3, 2026
36 checks passed
@ClementAupiais ClementAupiais deleted the sparkle/SpinnerBrand branch April 3, 2026 14:24
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.

2 participants