Skip to content

Commit

Permalink
Spinner: VR implementation changes (#3774)
Browse files Browse the repository at this point in the history
  • Loading branch information
diyorbek authored Oct 1, 2024
1 parent 05183a6 commit b1506ea
Show file tree
Hide file tree
Showing 7 changed files with 223 additions and 8 deletions.
1 change: 1 addition & 0 deletions packages/gestalt-design-tokens/build.js
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,7 @@ function getSources({ theme, modeTheme, platform, language }) {
'tokens/vr-theme/sema/space.json',
`tokens/vr-theme/sema/text/language/${language}.json`,
'tokens/vr-theme/sema/motion.json',
'tokens/vr-theme/comp/spinner.json',
...(theme === 'vr-theme-web-mapping'
? [
`tokens/vr-theme-web-mapping/base-color-dataviz-${modeTheme}.json`,
Expand Down

Large diffs are not rendered by default.

22 changes: 22 additions & 0 deletions packages/gestalt-design-tokens/tokens/vr-theme/comp/spinner.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"comp": {
"spinner": {
"color": {
"background": {
"pink": {
"type": "color",
"value": "#d452d1"
},
"orange": {
"type": "color",
"value": "#ff7c36"
},
"blue": {
"type": "color",
"value": "#24ccb0"
}
}
}
}
}
}
14 changes: 14 additions & 0 deletions packages/gestalt/src/Spinner.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import Box from './Box';
import { useDefaultLabelContext } from './contexts/DefaultLabelProvider';
import Icon from './Icon';
import styles from './Spinner.css';
import VRSpinner from './Spinner/VRSpinner';
import useInExperiment from './useInExperiment';

const SIZE_NAME_TO_PIXEL = {
sm: 32,
Expand Down Expand Up @@ -46,6 +48,18 @@ export default function Spinner({
size = 'md',
}: Props) {
const { accessibilityLabel: accessibilityLabelDefault } = useDefaultLabelContext('Spinner');

const isInVRExperiment = useInExperiment({
webExperimentName: 'web_gestalt_visualRefresh',
mwebExperimentName: 'web_gestalt_visualRefresh',
});

if (isInVRExperiment) {
return (
<VRSpinner accessibilityLabel={accessibilityLabel} delay={delay} show={show} size={size} />
);
}

return show ? (
<Box display="flex" justifyContent="around" overflow="hidden">
<div className={classnames(styles.icon, { [styles.delay]: delay })}>
Expand Down
94 changes: 94 additions & 0 deletions packages/gestalt/src/Spinner/VRSpinner.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
.spinner {
--g-size: 40px;
--g-dot-size: calc(var(--g-size) / 3);
--g-dot-space: calc(var(--g-dot-size) * 1.75);

height: var(--g-size);
width: var(--g-size);
}

.spinnerFrame {
animation: spin 1500ms linear infinite;
box-sizing: border-box;
height: calc(var(--g-dot-space) * sqrt(3) / 2);
left: calc(var(--g-dot-size) * 0.625);
position: relative;
top: calc(var(--g-dot-size) / 2);
transform-origin: center calc(var(--g-dot-space) / sqrt(3));
width: var(--g-dot-space);
}

.spinnerFrame > div {
animation-composition: add;
animation-duration: 800ms, 1.8s;
animation-iteration-count: infinite;
animation-name: scale, colors;
animation-timing-function: linear;
border-radius: 50%;
height: var(--g-dot-size);
position: absolute;
width: var(--g-dot-size);
}

.dot1 {
animation-delay: 0s;
left: 50%;
top: 0;
transform: translate3d(-50%, -50%, 0);
}

.dot2 {
animation-delay: 100ms, 0s;
bottom: 0;
left: 0;
transform: translate3d(-50%, 50%, 0);
}

.dot3 {
animation-delay: 200ms, 0s;
bottom: 0;
right: 0;
transform: translate3d(50%, 50%, 0);
}

.spinner.delay .spinnerFrame > div {
animation-delay: 300ms;
}

.delay {
animation-delay: 300ms;
}

@keyframes spin {
to {
transform: rotate(360deg);
}
}

@keyframes scale {
50% {
transform: scale(0.8);
}

100% {
transform: scale(1);
}
}

@keyframes colors {
0% {
background-color: var(--comp-spinner-color-background-pink);
}

33.333% {
background-color: var(--comp-spinner-color-background-orange);
}

66.666% {
background-color: var(--comp-spinner-color-background-blue);
}

100% {
background-color: var(--comp-spinner-color-background-pink);
}
}
45 changes: 45 additions & 0 deletions packages/gestalt/src/Spinner/VRSpinner.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import classnames from 'classnames';
import styles from './VRSpinner.css';
import Box from '../Box';
import { useDefaultLabelContext } from '../contexts/DefaultLabelProvider';

const SIZE_NAME_TO_PIXEL = {
sm: 32,
md: 40,
lg: 48,
} as const;

type Props = {
accessibilityLabel?: string;
delay?: boolean;
show: boolean;
size?: 'sm' | 'md' | 'lg';
};

export default function Spinner({ accessibilityLabel, delay = true, show, size = 'md' }: Props) {
const { accessibilityLabel: accessibilityLabelDefault } = useDefaultLabelContext('Spinner');

if (!show) return null;

return (
<Box display="flex" justifyContent="around">
<div
aria-label={accessibilityLabel ?? accessibilityLabelDefault}
className={classnames(styles.spinner, { [styles.delay]: delay })}
style={
{
'--g-size': `${SIZE_NAME_TO_PIXEL[size]}px`,
} as React.CSSProperties
}
>
<div className={styles.spinnerFrame}>
<div className={styles.dot1} />
<div className={styles.dot2} />
<div className={styles.dot3} />
</div>
</div>
</Box>
);
}

Spinner.displayName = 'Spinner';
Original file line number Diff line number Diff line change
Expand Up @@ -2879,6 +2879,9 @@ exports[`visual refresh tokens uses visual refresh dark mode theme when specifie
--sema-motion-opacity-duration-instant: 0ms;
--sema-motion-opacity-easing-default: cubic-bezier(0, 0, 1, 1);
--sema-motion-opacity-easing-instant: cubic-bezier(0, 0, 1, 1);
--comp-spinner-color-background-pink: #d452d1;
--comp-spinner-color-background-orange: #ff7c36;
--comp-spinner-color-background-blue: #24ccb0;
--color-data-visualization-10: #007a72;
--color-data-visualization-11: #f76593;
--color-data-visualization-12: #ffc58f;
Expand Down Expand Up @@ -3821,6 +3824,9 @@ exports[`visual refresh tokens uses visual refresh light mode theme when specifi
--sema-motion-opacity-duration-instant: 0ms;
--sema-motion-opacity-easing-default: cubic-bezier(0, 0, 1, 1);
--sema-motion-opacity-easing-instant: cubic-bezier(0, 0, 1, 1);
--comp-spinner-color-background-pink: #d452d1;
--comp-spinner-color-background-orange: #ff7c36;
--comp-spinner-color-background-blue: #24ccb0;
--color-data-visualization-10: #005062;
--color-data-visualization-11: #de2c62;
--color-data-visualization-12: #660e00;
Expand Down Expand Up @@ -4761,6 +4767,9 @@ exports[`visual refresh tokens uses visual refresh with ck line height 1`] = `
--sema-motion-opacity-duration-instant: 0ms;
--sema-motion-opacity-easing-default: cubic-bezier(0, 0, 1, 1);
--sema-motion-opacity-easing-instant: cubic-bezier(0, 0, 1, 1);
--comp-spinner-color-background-pink: #d452d1;
--comp-spinner-color-background-orange: #ff7c36;
--comp-spinner-color-background-blue: #24ccb0;
--color-data-visualization-10: #005062;
--color-data-visualization-11: #de2c62;
--color-data-visualization-12: #660e00;
Expand Down Expand Up @@ -5701,6 +5710,9 @@ exports[`visual refresh tokens uses visual refresh with ja line height 1`] = `
--sema-motion-opacity-duration-instant: 0ms;
--sema-motion-opacity-easing-default: cubic-bezier(0, 0, 1, 1);
--sema-motion-opacity-easing-instant: cubic-bezier(0, 0, 1, 1);
--comp-spinner-color-background-pink: #d452d1;
--comp-spinner-color-background-orange: #ff7c36;
--comp-spinner-color-background-blue: #24ccb0;
--color-data-visualization-10: #005062;
--color-data-visualization-11: #de2c62;
--color-data-visualization-12: #660e00;
Expand Down Expand Up @@ -6641,6 +6653,9 @@ exports[`visual refresh tokens uses visual refresh with tall line height 1`] = `
--sema-motion-opacity-duration-instant: 0ms;
--sema-motion-opacity-easing-default: cubic-bezier(0, 0, 1, 1);
--sema-motion-opacity-easing-instant: cubic-bezier(0, 0, 1, 1);
--comp-spinner-color-background-pink: #d452d1;
--comp-spinner-color-background-orange: #ff7c36;
--comp-spinner-color-background-blue: #24ccb0;
--color-data-visualization-10: #005062;
--color-data-visualization-11: #de2c62;
--color-data-visualization-12: #660e00;
Expand Down Expand Up @@ -7581,6 +7596,9 @@ exports[`visual refresh tokens uses visual refresh with th line height 1`] = `
--sema-motion-opacity-duration-instant: 0ms;
--sema-motion-opacity-easing-default: cubic-bezier(0, 0, 1, 1);
--sema-motion-opacity-easing-instant: cubic-bezier(0, 0, 1, 1);
--comp-spinner-color-background-pink: #d452d1;
--comp-spinner-color-background-orange: #ff7c36;
--comp-spinner-color-background-blue: #24ccb0;
--color-data-visualization-10: #005062;
--color-data-visualization-11: #de2c62;
--color-data-visualization-12: #660e00;
Expand Down Expand Up @@ -8521,6 +8539,9 @@ exports[`visual refresh tokens uses visual refresh with vi line height 1`] = `
--sema-motion-opacity-duration-instant: 0ms;
--sema-motion-opacity-easing-default: cubic-bezier(0, 0, 1, 1);
--sema-motion-opacity-easing-instant: cubic-bezier(0, 0, 1, 1);
--comp-spinner-color-background-pink: #d452d1;
--comp-spinner-color-background-orange: #ff7c36;
--comp-spinner-color-background-blue: #24ccb0;
--color-data-visualization-10: #005062;
--color-data-visualization-11: #de2c62;
--color-data-visualization-12: #660e00;
Expand Down

0 comments on commit b1506ea

Please sign in to comment.