Spinner "wobbles" on Safari (macOS Tahoe) - also I have fix for it
Maintainers usually reply within 2 days
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 74/100
- Issue type
- Bug
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- react, typescript
- Domain
- frontend
Research direction
Start with the Spinner component and reproduce the issue at the linked Primer spinner documentation page in Safari on macOS. Compare its SVG structure and animation with the proposed grouping and transform-origin approach; done means the spinner stays visually fixed while rotating in Safari without regressing other browsers.
Written by the indexing model from the issue text.
Description
Description
Spinner wobbles on Safari, but there is a solution
Hi, I thought my mind was playing an optical illusion trick on me at first, but I noticed that the Spinner component embedded inside the "Merge Pull Request" button was "wobbling".
By wobbling, I meant that the circle wasn't staying in exactly the same position as it rotated - it seemed to move ever so slightly to the left and to the right.
I recorded a video of the button, watched closely and confirmed that it wobbled from left to right - I even got ffmpeg to turn the screen recording video into frames that I then fed to ChatGPT to analyse, and it confirmed what I suspected.
I then went further and drew some vertical lines in CSS to act as rulers so I could double-check it.
It then occurred to me that perhaps this was a bug with Safari and not with Google Chrome. I checked Google Chrome and there was no wobble. Was this a bug with Safari (or as it is sometimes called these days, the new IE)?
Fear not, there is a solution
I managed to discover your UI kit and the spinner component there:
https://primer-docs-preview.github.com/product/components/spinner/#custom-size
Which gave me a suitable place to replicate the error, as well as try out some ideas for fixing it.
I discovered that it turns out that the entire SVG element is being rotated by CSS. I then had a chinwag with ChatGPT and it suggested a few ideas, one of which was to wrap the circle and path elements in a g element (group in SVG), apply the animation css class on the g element instead of the svg element, and crucially, add this CSS rule to the g class:
transform-origin: 50% 50%;
The html for the spinner should look like this:
<svg
height="64px"
width="64px"
viewBox="0 0 16 16"
fill="none"
aria-hidden="true"
aria-labelledby="_R_6beinpfiv5ujb_"
class=""
style="animation-delay: -574ms; transform-origin: 50% 50%"
>
<g
class="prc-Spinner-SpinnerAnimation-tutJZ"
style="transform-origin: 50% 50%"
>
<circle
cx="8"
cy="8"
r="7"
stroke="currentColor"
stroke-opacity="0.25"
stroke-width="2"
vector-effect="non-scaling-stroke"
></circle>
<path
d="M15 8a7.002 7.002 0 00-7-7"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
vector-effect="non-scaling-stroke"
></path>
</g>
</svg>
You can paste that in and try it out. In short, the fix is to wrap the circle and path in a g element, put the spinner css class on the g element instead, and then add the transform-origin css property to the g class.
I will let you triage this as appropriate, and I will go back to calculating what the future price of a Burrito will be 3 months from now (many factors in play).
https://github.com/user-attachments/assets/ee1543a0-9919-4d5b-b266-4256751ca40e
https://github.com/user-attachments/assets/a7e71945-461f-493b-87a9-1dba37630353
Smooth work, lifetime peace.
Steps to reproduce
- Find a human with an Apple Mac (MacBook, iMac, or even once of those beefy Studio Maxes - lucky folk) and a Retina screen display - you want the Retina screen display to really see the wobble in action.
- Get them to open Safari (not Chrome, it has to be Safari).
- Get them to visit https://primer-docs-preview.github.com/product/components/spinner/#custom-size
- Now, if you have good eyeballs, you can notice that the spinner is "wobbling". To confirm this, you can draw some lines using CSS to act as vertical rulers, and position them flush with the edges of the spinner. Then experience the wobble in 2D.
- Now try opening the same link in Google Chrome. No wobbling on the spinner.
But good news my fellow human, there is a fix, and I have it detailed in the issue description.
Version
v38.39.0
Browser
Safari
- Dominant language
- TypeScript
- Stars
- 3.9k
- Forks
- 683
- Avg merge
- 3d 5h
- Merged PRs (30d)
- 45
Getting set up
Starts the project's dev container in your browser, under your own GitHub account.
- No Dockerfile or Docker Compose file
- Has a pull request template
- No contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from primer/react
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
Maintainers usually reply within 2 days
-
PageHeader.Title does not seem to accept id propPossibly taken @minwookshin claimed this 3 days ago. Opencomponent: PageHeader react staff
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
primer/react#8474 · 1 comment · 1 reaction ·
Maintainers usually reply within 2 days
-
The padding prop seems to have no effect with PageLayout.SidebarPossibly taken @minwookshin claimed this 3 days ago. Opencomponent: PageLayout react staff
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
primer/react#8470 · 1 comment · 1 reaction ·
Maintainers usually reply within 2 days
-
waiting for author response
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
primer/react#8172 · 1 comment ·
Maintainers usually reply within 2 days
-
Checkbox: replace useLayoutEffect with ref callback for indeterminate propMay be free again A pull request for this issue was closed without being merged. Opencomponent: Checkbox react
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Maintainers usually reply within 2 days
Similar issues
-
[Bug] The shared instance selector's placeholder and no-match text ignore the display languagePossibly taken A pull request linked to this issue is open or already merged. Open
Difficulty 2/5 1-3 hours Newbie friendliness 90/100
apache/rocketmq-dashboard#5561 ·
Maintainers usually reply within 3 days
-
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
CopilotKit/OpenDots#69 ·
Maintainers usually reply within 1 day
-
sendDefaultPii is reported as deprecated on ReactNativeOptions although dataCollection is hiddenOpenBug React-Native Waiting for: Product Owner
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
getsentry/sentry-react-native#6830 · 1 comment ·
Maintainers usually reply within 1 day
-
OSCI'26
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
GauravKarakoti/SecureFlow#1215 ·
Maintainers usually reply within 1 day
-
[quality] bundle e2e never drives plain /close or the /milestone refusals through dist/index.jsPossibly taken @hivecommons-hive claimed this today. Openagent/quality hive/covered-by-pr hive/hosted-available-lke648397-260827-5q9t kind/cleanup quality testing
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
cncf/prow-github-actions#295 · 1 comment ·
Maintainers usually reply within 1 day