Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { spinnerConfig, spinnerTokens } from '../Spinner';
import { progressBarCircularConfig, progressBarCircularTokens } from '../ProgressBarCircular';
import { component, mergeConfig } from '../../engines';

import { tokens } from './Loader.tokens';
import { tokens, classes } from './Loader.tokens';

const mergedSpinnerConfig = mergeConfig(spinnerConfig);
const Spinner = component(mergedSpinnerConfig);
Expand All @@ -21,6 +21,14 @@ export const base = css`

width: var(${tokens.width});
height: var(${tokens.height});

&.${classes.loaderHorizontal} {
flex-direction: row;
}

&.${classes.loaderVertical} {
flex-direction: column;
}
`;

export const StyledSpinner = styled(Spinner)`
Expand Down Expand Up @@ -77,3 +85,23 @@ export const LoaderContentWrapper = styled.div`
position: relative;
z-index: 1;
`;

export const LoaderText = styled.div`
color: var(${tokens.textColor});
font-family: var(${tokens.textFontFamily});
font-size: var(${tokens.textFontSize});
font-style: var(${tokens.textFontStyle});
font-weight: var(${tokens.textFontWeight});
letter-spacing: var(${tokens.textLetterSpacing});
line-height: var(${tokens.textLineHeight});

&.${classes.loaderHorizontal} {
margin-left: var(${tokens.textMarginLeft});
margin-top: 0;
}

&.${classes.loaderVertical} {
margin-left: 0;
margin-top: var(${tokens.textMarginTop});
}
`;
12 changes: 12 additions & 0 deletions packages/plasma-new-hope/src/components/Loader/Loader.tokens.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
export const classes = {
loaderOverlay: '--plasma-loader-overlay',
loaderHorizontal: '--plasma-loader-horizontal',
loaderVertical: '--plasma-loader-vertical',
};

export const tokens = {
Expand Down Expand Up @@ -28,6 +30,16 @@ export const tokens = {

spinnerSize: '--plasma-loader-spinner-size',
spinnerColor: '--plasma-loader-spinner-color',

textColor: '--plasma-loader-text-color',
textFontFamily: '--plasma-loader-text-font-family',
textFontSize: '--plasma-loader-text-font-size',
textFontStyle: '--plasma-loader-text-font-style',
textFontWeight: '--plasma-loader-text-font-weight',
textLetterSpacing: '--plasma-loader-text-letter-spacing',
textLineHeight: '--plasma-loader-text-line-height',
textMarginLeft: '--plasma-loader-text-margin-left',
textMarginTop: '--plasma-loader-text-margin-top',
};

export const privateTokens = {};
24 changes: 23 additions & 1 deletion packages/plasma-new-hope/src/components/Loader/Loader.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import React, { forwardRef } from 'react';
import cls from 'classnames';

import type { RootProps } from '../../engines';
import { DEFAULT_Z_INDEX } from '../Popup/utils';
Expand All @@ -13,6 +14,7 @@ import {
StyledOverlay,
StyledProgressBarCircular,
StyledSpinner,
LoaderText,
} from './Loader.styles';
import { classes, tokens } from './Loader.tokens';

Expand All @@ -34,11 +36,30 @@ export const loaderRoot = (Root: RootProps<HTMLDivElement, LoaderProps>) =>
style,
zIndex = DEFAULT_Z_INDEX,
onOverlayClick,
text,
textPosition = 'bottom',
...rest
} = props;

const isHorizontalLayout = text && textPosition === 'right';
const isVerticalLayout = text && textPosition === 'bottom';

const loaderClassName = [
isHorizontalLayout && classes.loaderHorizontal,
isVerticalLayout && classes.loaderVertical,
]
.filter(Boolean)
.join(' ');

const loaderContent = (
<Root ref={ref} view={view} size={size} className={className} style={style} {...rest}>
<Root
ref={ref}
view={view}
size={size}
className={cls(className, ...loaderClassName)}
style={style}
{...rest}
>
{type === 'spinner' ? (
<StyledSpinner size={size} view={view} />
) : (
Expand All @@ -53,6 +74,7 @@ export const loaderRoot = (Root: RootProps<HTMLDivElement, LoaderProps>) =>
{children}
</StyledProgressBarCircular>
)}
{text && <LoaderText className={cls(...loaderClassName)}>{text}</LoaderText>}
</Root>
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,15 @@ export type CustomLoaderProps = {
* Контент в центре progress bar
*/
children?: ReactNode;
/**
* Текст, отображаемый рядом с loader
*/
text?: ReactNode;
/**
* Положение текста относительно loader
* @default bottom
*/
textPosition?: 'right' | 'bottom';
};

export type LoaderProps = HTMLAttributes<HTMLDivElement> & CustomLoaderProps;
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ export const config = {
${loaderTokens.spinnerColor}: var(--text-primary);

${loaderTokens.overlayColor}: var(--overlay-soft);

${loaderTokens.textColor}: var(--text-primary);
`,
secondary: css`
${loaderTokens.progressBarCircularBackgroundStroke}: var(--surface-transparent-tertiary);
Expand All @@ -26,6 +28,8 @@ export const config = {
${loaderTokens.spinnerColor}: var(--text-secondary);

${loaderTokens.overlayColor}: var(--overlay-soft);

${loaderTokens.textColor}: var(--text-primary);
`,
accent: css`
${loaderTokens.progressBarCircularBackgroundStroke}: var(--surface-transparent-tertiary);
Expand All @@ -35,6 +39,8 @@ export const config = {
${loaderTokens.spinnerColor}: var(--text-accent);

${loaderTokens.overlayColor}: var(--overlay-soft);

${loaderTokens.textColor}: var(--text-primary);
`,
positive: css`
${loaderTokens.progressBarCircularBackgroundStroke}: var(--surface-transparent-tertiary);
Expand All @@ -44,6 +50,8 @@ export const config = {
${loaderTokens.spinnerColor}: var(--text-positive);

${loaderTokens.overlayColor}: var(--overlay-soft);

${loaderTokens.textColor}: var(--text-primary);
`,
warning: css`
${loaderTokens.progressBarCircularBackgroundStroke}: var(--surface-transparent-tertiary);
Expand All @@ -53,6 +61,8 @@ export const config = {
${loaderTokens.spinnerColor}: var(--text-warning);

${loaderTokens.overlayColor}: var(--overlay-soft);

${loaderTokens.textColor}: var(--text-primary);
`,
negative: css`
${loaderTokens.progressBarCircularBackgroundStroke}: var(--surface-transparent-tertiary);
Expand All @@ -62,6 +72,8 @@ export const config = {
${loaderTokens.spinnerColor}: var(--text-negative);

${loaderTokens.overlayColor}: var(--overlay-soft);

${loaderTokens.textColor}: var(--text-primary);
`,
info: css`
${loaderTokens.progressBarCircularBackgroundStroke}: var(--surface-transparent-tertiary);
Expand All @@ -71,6 +83,8 @@ export const config = {
${loaderTokens.spinnerColor}: var(--text-info);

${loaderTokens.overlayColor}: var(--overlay-soft);

${loaderTokens.textColor}: var(--text-primary);
`,
},
size: {
Expand All @@ -91,6 +105,24 @@ export const config = {
${loaderTokens.progressBarCircularContentLineHeight}: var(--plasma-typo-h2-line-height);

${loaderTokens.spinnerSize}: 8rem;

${loaderTokens.textFontFamily}: var(--plasma-typo-body-l-font-family);
${loaderTokens.textFontSize}: var(--plasma-typo-body-l-font-size);
${loaderTokens.textFontStyle}: var(--plasma-typo-body-l-font-style);
${loaderTokens.textFontWeight}: var(--plasma-typo-body-l-font-weight);
${loaderTokens.textLetterSpacing}: var(--plasma-typo-body-l-letter-spacing);
${loaderTokens.textLineHeight}: var(--plasma-typo-body-l-line-height);
${loaderTokens.textMarginLeft}: 1rem;
${loaderTokens.textMarginTop}: 1rem;

${loaderTokens.textFontFamily}: var(--plasma-typo-body-l-font-family);
${loaderTokens.textFontSize}: var(--plasma-typo-body-l-font-size);
${loaderTokens.textFontStyle}: var(--plasma-typo-body-l-font-style);
${loaderTokens.textFontWeight}: var(--plasma-typo-body-l-font-weight);
${loaderTokens.textLetterSpacing}: var(--plasma-typo-body-l-letter-spacing);
${loaderTokens.textLineHeight}: var(--plasma-typo-body-l-line-height);
${loaderTokens.textMarginLeft}: 1rem;
${loaderTokens.textMarginTop}: 1rem;
`,
xl: css`
${loaderTokens.width}: 100%;
Expand All @@ -109,6 +141,15 @@ export const config = {
${loaderTokens.progressBarCircularContentLineHeight}: var(--plasma-typo-h5-line-height);

${loaderTokens.spinnerSize}: 5.5rem;

${loaderTokens.textFontFamily}: var(--plasma-typo-body-l-font-family);
${loaderTokens.textFontSize}: var(--plasma-typo-body-l-font-size);
${loaderTokens.textFontStyle}: var(--plasma-typo-body-l-font-style);
${loaderTokens.textFontWeight}: var(--plasma-typo-body-l-font-weight);
${loaderTokens.textLetterSpacing}: var(--plasma-typo-body-l-letter-spacing);
${loaderTokens.textLineHeight}: var(--plasma-typo-body-l-line-height);
${loaderTokens.textMarginLeft}: 1rem;
${loaderTokens.textMarginTop}: 1rem;
`,
l: css`
${loaderTokens.width}: 100%;
Expand All @@ -127,6 +168,15 @@ export const config = {
${loaderTokens.progressBarCircularContentLineHeight}: var(--plasma-typo-body-l-line-height);

${loaderTokens.spinnerSize}: 3.5rem;

${loaderTokens.textFontFamily}: var(--plasma-typo-body-l-font-family);
${loaderTokens.textFontSize}: var(--plasma-typo-body-l-font-size);
${loaderTokens.textFontStyle}: var(--plasma-typo-body-l-font-style);
${loaderTokens.textFontWeight}: var(--plasma-typo-body-l-font-weight);
${loaderTokens.textLetterSpacing}: var(--plasma-typo-body-l-letter-spacing);
${loaderTokens.textLineHeight}: var(--plasma-typo-body-l-line-height);
${loaderTokens.textMarginLeft}: 1rem;
${loaderTokens.textMarginTop}: 1rem;
`,
m: css`
${loaderTokens.width}: 100%;
Expand All @@ -145,6 +195,15 @@ export const config = {
${loaderTokens.progressBarCircularContentLineHeight}: var(--plasma-typo-body-m-line-height);

${loaderTokens.spinnerSize}: 3rem;

${loaderTokens.textFontFamily}: var(--plasma-typo-body-m-font-family);
${loaderTokens.textFontSize}: var(--plasma-typo-body-m-font-size);
${loaderTokens.textFontStyle}: var(--plasma-typo-body-m-font-style);
${loaderTokens.textFontWeight}: var(--plasma-typo-body-m-font-weight);
${loaderTokens.textLetterSpacing}: var(--plasma-typo-body-m-letter-spacing);
${loaderTokens.textLineHeight}: var(--plasma-typo-body-m-line-height);
${loaderTokens.textMarginLeft}: 0.75rem;
${loaderTokens.textMarginTop}: 0.625rem;
`,
s: css`
${loaderTokens.width}: 100%;
Expand All @@ -163,6 +222,15 @@ export const config = {
${loaderTokens.progressBarCircularContentLineHeight}: var(--plasma-typo-body-s-line-height);

${loaderTokens.spinnerSize}: 2.25rem;

${loaderTokens.textFontFamily}: var(--plasma-typo-body-s-font-family);
${loaderTokens.textFontSize}: var(--plasma-typo-body-s-font-size);
${loaderTokens.textFontStyle}: var(--plasma-typo-body-s-font-style);
${loaderTokens.textFontWeight}: var(--plasma-typo-body-s-font-weight);
${loaderTokens.textLetterSpacing}: var(--plasma-typo-body-s-letter-spacing);
${loaderTokens.textLineHeight}: var(--plasma-typo-body-s-line-height);
${loaderTokens.textMarginLeft}: 0.5rem;
${loaderTokens.textMarginTop}: 0.5rem;
`,
xs: css`
${loaderTokens.width}: 100%;
Expand All @@ -181,6 +249,15 @@ export const config = {
${loaderTokens.progressBarCircularContentLineHeight}: var(--plasma-typo-body-xs-line-height);

${loaderTokens.spinnerSize}: 1.5rem;

${loaderTokens.textFontFamily}: var(--plasma-typo-body-xs-font-family);
${loaderTokens.textFontSize}: var(--plasma-typo-body-xs-font-size);
${loaderTokens.textFontStyle}: var(--plasma-typo-body-xs-font-style);
${loaderTokens.textFontWeight}: var(--plasma-typo-body-xs-font-weight);
${loaderTokens.textLetterSpacing}: var(--plasma-typo-body-xs-letter-spacing);
${loaderTokens.textLineHeight}: var(--plasma-typo-body-xs-line-height);
${loaderTokens.textMarginLeft}: 0.5rem;
${loaderTokens.textMarginTop}: 0.5rem;
`,
xxs: css`
${loaderTokens.width}: 100%;
Expand All @@ -199,6 +276,15 @@ export const config = {
${loaderTokens.progressBarCircularContentLineHeight}: var(--plasma-typo-body-xxs-line-height);

${loaderTokens.spinnerSize}: 1rem;

${loaderTokens.textFontFamily}: var(--plasma-typo-body-xxs-font-family);
${loaderTokens.textFontSize}: var(--plasma-typo-body-xxs-font-size);
${loaderTokens.textFontStyle}: var(--plasma-typo-body-xxs-font-style);
${loaderTokens.textFontWeight}: var(--plasma-typo-body-xxs-font-weight);
${loaderTokens.textLetterSpacing}: var(--plasma-typo-body-xxs-letter-spacing);
${loaderTokens.textLineHeight}: var(--plasma-typo-body-xxs-line-height);
${loaderTokens.textMarginLeft}: 0.5rem;
${loaderTokens.textMarginTop}: 0.5rem;
`,
},
},
Expand Down
Loading
Loading