Skip to content

Commit a9ae730

Browse files
committed
feat: add overlay spinner component
1 parent 17209b7 commit a9ae730

File tree

10 files changed

+110
-4
lines changed

10 files changed

+110
-4
lines changed

package-lock.json

Lines changed: 4 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/components/_provisional/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@
3030
"@react-ck/button": "^1.4.8",
3131
"@react-ck/icon": "^1.5.8",
3232
"@react-ck/layers": "^1.1.13",
33+
"@react-ck/overlay": "^1.1.17",
3334
"@react-ck/react-utils": "^1.2.8",
3435
"@react-ck/scss-utils": "^1.1.4",
3536
"@react-ck/skeleton": "^1.1.11",
37+
"@react-ck/spinner": "^1.1.13",
3638
"@react-ck/text": "^1.4.8",
3739
"classnames": "*"
3840
}

packages/components/_provisional/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,5 @@ export * from "./position-engine";
1515
export * from "./top-bar";
1616

1717
export * from "./snackbar";
18+
19+
export * from "./overlay-spinner";
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import React from "react";
2+
import styles from "./styles/index.module.scss";
3+
import classNames from "classnames";
4+
5+
export type OverlaySpinnerContainerProps = React.HTMLAttributes<HTMLDivElement>;
6+
7+
export const OverlaySpinnerContainer = ({
8+
className,
9+
...otherProps
10+
}: Readonly<React.HTMLAttributes<HTMLDivElement>>): React.ReactElement => (
11+
<div className={classNames(styles.container, className)} {...otherProps} />
12+
);
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import React from "react";
2+
import styles from "./styles/index.module.scss";
3+
import classNames from "classnames";
4+
import { Overlay, type OverlayProps } from "@react-ck/overlay";
5+
import { Spinner } from "@react-ck/spinner";
6+
import { OverlaySpinnerContainer } from "./Container";
7+
8+
interface OverlaySpinnerProps extends OverlayProps {
9+
active?: boolean;
10+
}
11+
12+
const OverlaySpinner = ({
13+
active = true,
14+
className,
15+
...otherProps
16+
}: Readonly<OverlaySpinnerProps>): React.ReactElement => (
17+
<Overlay
18+
skin="light"
19+
{...otherProps}
20+
className={classNames(styles.overlay, className, {
21+
[`${styles.overlay__active}`]: active,
22+
})}>
23+
<Spinner />
24+
</Overlay>
25+
);
26+
27+
OverlaySpinner.Container = OverlaySpinnerContainer;
28+
29+
export { type OverlaySpinnerProps, OverlaySpinner };
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
@import "@react-ck/theme";
2+
@import "@react-ck/text";
3+
4+
.container {
5+
position: relative;
6+
}
7+
8+
.overlay {
9+
backdrop-filter: blur(5px);
10+
opacity: 0;
11+
transition: opacity 0.3s ease-in-out;
12+
pointer-events: none;
13+
14+
&__active {
15+
opacity: 1;
16+
pointer-events: all;
17+
}
18+
}

packages/components/overlay/src/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React from "react";
22
import styles from "./styles/index.module.scss";
33
import classNames from "classnames";
44

5-
export interface OverlayProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
5+
export interface OverlayProps extends React.HTMLAttributes<HTMLDivElement> {
66
/** Specifies the visual style of the overlay */
77
skin?: "light" | "dark";
88
}

packages/components/overlay/src/styles/index.module.scss

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
left: 0;
99
height: 100%;
1010
width: 100%;
11+
display: flex;
12+
align-items: center;
13+
justify-content: center;
1114
}
1215

1316
@each $variation in (dark, light) {
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import React from "react";
2+
import { type Meta, type StoryObj } from "@storybook/react";
3+
import { Manager } from "@react-ck/manager";
4+
import { configureStory } from "@react-ck/story-config";
5+
import { OverlaySpinner } from "@react-ck/provisional/src";
6+
import { faker } from "@faker-js/faker";
7+
import { Text } from "@react-ck/text";
8+
9+
type Story = StoryObj<typeof OverlaySpinner>;
10+
11+
const meta: Meta<typeof OverlaySpinner> = {
12+
title: "Loading/Overlay Spinner",
13+
...configureStory(OverlaySpinner, {
14+
parameters: {
15+
layout: "padded",
16+
// FIXME: not working https://storybook.js.org/docs/api/doc-block-source#excludedecorators
17+
// docs: { source: { type: "auto", excludeDecorators: false } },
18+
},
19+
decorators: [
20+
(Story): React.ReactElement => (
21+
<Manager>
22+
<OverlaySpinner.Container>
23+
<Text>{faker.lorem.paragraphs(5)}</Text>
24+
<Story />
25+
</OverlaySpinner.Container>
26+
</Manager>
27+
),
28+
],
29+
}),
30+
};
31+
32+
export default meta;
33+
34+
export const Component: Story = {
35+
args: {
36+
active: true,
37+
},
38+
};

packages/providers/theme/src/themes/default.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export const defaultTheme: Theme = {
3030
"status-negative-light": "#fed7d7",
3131
"status-negative": "#ed6d6d",
3232
"status-negative-dark": "#9b2c2c",
33-
"overlay-light": "rgba(255,255,255, .2)",
33+
"overlay-light": "rgba(255,255,255, .4)",
3434
"overlay-dark": "rgba(0,0,0,.2)",
3535
},
3636
font: {

0 commit comments

Comments
 (0)