@squiz/generic-browser-lib 1.39.1-alpha.9 → 1.40.1-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/Hooks/useAsync.d.ts +4 -4
- package/lib/Hooks/useAsync.js +17 -19
- package/lib/Modal/Modal.js +2 -2
- package/lib/Modal/ModalTrigger.js +1 -1
- package/lib/PreviewPanel/PreviewPanel.js +1 -1
- package/lib/ResourceItem/ResourceItem.js +1 -1
- package/lib/ResourceState/ResourceState.js +1 -1
- package/lib/Spinner/Spinner.js +1 -1
- package/package.json +2 -2
- package/postcss.config.js +6 -0
- package/src/Hooks/useAsync.spec.ts +30 -1
- package/src/Hooks/useAsync.ts +22 -21
- package/src/Modal/Modal.tsx +2 -2
- package/src/Modal/ModalTrigger.tsx +2 -2
- package/src/PreviewPanel/PreviewPanel.tsx +2 -2
- package/src/ResourceItem/ResourceItem.tsx +4 -1
- package/src/ResourceState/ResourceState.tsx +1 -1
- package/src/Spinner/Spinner.tsx +1 -1
package/lib/Hooks/useAsync.d.ts
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
import { DependencyList } from 'react';
|
2
2
|
export type UseAsyncProps<TReturnType, TDefaultValueType> = {
|
3
|
-
/** The async callback to call for fetching data. */
|
4
|
-
callback: () => TReturnType | Promise<TReturnType
|
3
|
+
/** The async callback or an array of async callbacks to call for fetching data. */
|
4
|
+
callback: (() => TReturnType | Promise<TReturnType>) | Array<() => TReturnType | Promise<TReturnType>>;
|
5
5
|
/** The default value to populate the data as when initially mounted or reloading data. */
|
6
6
|
defaultValue: TReturnType | TDefaultValueType;
|
7
7
|
};
|
8
8
|
/**
|
9
|
-
* Hook for invoking
|
9
|
+
* Hook for invoking async code and keeping track of its state.
|
10
10
|
*
|
11
11
|
* Data is loaded in 3 different ways:
|
12
12
|
* 1. On initial mount.
|
13
13
|
* 2. When any of the `deps` change.
|
14
|
-
* 3. When the `
|
14
|
+
* 3. When the `reload` function is called.
|
15
15
|
*/
|
16
16
|
export declare const useAsync: <TReturnType, TDefaultValueType>({ callback, defaultValue }: UseAsyncProps<TReturnType, TDefaultValueType>, deps: DependencyList) => {
|
17
17
|
data: TReturnType | TDefaultValueType;
|
package/lib/Hooks/useAsync.js
CHANGED
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.useAsync = void 0;
|
4
4
|
const react_1 = require("react");
|
5
5
|
/**
|
6
|
-
* Hook for invoking
|
6
|
+
* Hook for invoking async code and keeping track of its state.
|
7
7
|
*
|
8
8
|
* Data is loaded in 3 different ways:
|
9
9
|
* 1. On initial mount.
|
10
10
|
* 2. When any of the `deps` change.
|
11
|
-
* 3. When the `
|
11
|
+
* 3. When the `reload` function is called.
|
12
12
|
*/
|
13
13
|
const useAsync = ({ callback, defaultValue }, deps) => {
|
14
14
|
const [data, setData] = (0, react_1.useState)(defaultValue);
|
@@ -19,32 +19,30 @@ const useAsync = ({ callback, defaultValue }, deps) => {
|
|
19
19
|
setError(null);
|
20
20
|
setData(defaultValue);
|
21
21
|
try {
|
22
|
-
const
|
23
|
-
|
24
|
-
|
25
|
-
result
|
26
|
-
.then((resolved) => {
|
27
|
-
setData(resolved);
|
28
|
-
setIsLoading(false);
|
29
|
-
})
|
30
|
-
.catch((e) => {
|
31
|
-
setError(e instanceof Error ? e : new Error(String(e)));
|
32
|
-
setIsLoading(false);
|
33
|
-
});
|
34
|
-
}
|
35
|
-
else {
|
36
|
-
// if the callback returned something other than a promise assume it is the data we want.
|
22
|
+
const isArrayOfCallbacks = Array.isArray(callback);
|
23
|
+
const promises = isArrayOfCallbacks ? callback.map((cb) => cb()) : [callback()];
|
24
|
+
if (!(promises[0] instanceof Promise)) {
|
25
|
+
const result = promises[0];
|
37
26
|
setData(result);
|
38
27
|
setIsLoading(false);
|
28
|
+
return;
|
39
29
|
}
|
30
|
+
Promise.all(promises)
|
31
|
+
.then((resolved) => {
|
32
|
+
setData(isArrayOfCallbacks ? resolved : resolved[0]);
|
33
|
+
setIsLoading(false);
|
34
|
+
})
|
35
|
+
.catch((e) => {
|
36
|
+
setError(e instanceof Error ? e : new Error(String(e)));
|
37
|
+
setIsLoading(false);
|
38
|
+
});
|
40
39
|
}
|
41
40
|
catch (e) {
|
42
|
-
// callback threw outside of the scope of the promise.
|
43
41
|
setError(e instanceof Error ? e : new Error(String(e)));
|
44
42
|
setIsLoading(false);
|
45
43
|
}
|
46
44
|
}, deps);
|
47
|
-
//
|
45
|
+
// Reload data on dependency change (and initial mount)
|
48
46
|
(0, react_1.useEffect)(() => {
|
49
47
|
reload();
|
50
48
|
}, deps);
|
package/lib/Modal/Modal.js
CHANGED
@@ -33,13 +33,13 @@ const react_aria_1 = require("react-aria");
|
|
33
33
|
function ModalContent({ children, ...props }) {
|
34
34
|
const ref = (0, react_1.useRef)(null);
|
35
35
|
const { dialogProps, titleProps } = (0, react_aria_1.useDialog)(props, ref);
|
36
|
-
return (react_1.default.createElement("div", { ...dialogProps, ref: ref, className: "z-50 relative bg-white rounded-lg h-screen lg:h-[calc(100vh-3.5rem)] w-screen max-w-screen-lg" }, children(titleProps)));
|
36
|
+
return (react_1.default.createElement("div", { ...dialogProps, ref: ref, className: "z-50 relative bg-white rounded-lg h-screen lg:h-[calc(100vh-3.5rem)] w-screen max-w-screen-lg outline-0" }, children(titleProps)));
|
37
37
|
}
|
38
38
|
function Modal({ isDismissable, state, overlayProps, children, ...props }) {
|
39
39
|
const ref = (0, react_1.useRef)(null);
|
40
40
|
const { modalProps, underlayProps } = (0, react_aria_1.useModalOverlay)({ isDismissable, ...props }, state, ref);
|
41
41
|
return (react_1.default.createElement(react_aria_1.Overlay, null,
|
42
|
-
react_1.default.createElement("div", { className: "squiz-gb-scope
|
42
|
+
react_1.default.createElement("div", { className: "squiz-gb-scope" },
|
43
43
|
react_1.default.createElement("div", { ...underlayProps, className: "h-full z-[9998] fixed inset-0 before:z-40 before:fixed before:inset-0 before:bg-black before:bg-opacity-25" },
|
44
44
|
react_1.default.createElement("div", { ...modalProps, ref: ref, className: "h-full flex items-center justify-center" },
|
45
45
|
react_1.default.createElement(ModalContent, { ...overlayProps }, (titleProps) => children(titleProps)))))));
|
@@ -17,7 +17,7 @@ function ModalTrigger({ label, labelClasses, showLabel, containerClasses, icon,
|
|
17
17
|
if (!showLabel) {
|
18
18
|
ariaAttr = { ...ariaAttr, 'aria-label': label };
|
19
19
|
}
|
20
|
-
return (react_1.default.createElement(
|
20
|
+
return (react_1.default.createElement("div", { className: "squiz-gb-scope" },
|
21
21
|
react_1.default.createElement(ModalOpeningButton_1.ModalOpeningButton, { type: "button", ...triggerProps, ...ariaAttr, isDisabled: isDisabled, className: (0, clsx_1.default)(`${containerClasses ||
|
22
22
|
'flex p-1 px-1.5 rounded mr-auto text-blue-300 hover:bg-blue-100 focus:bg-blue-100 focus:outline-none'}`, isDisabled && 'hover:bg-transparent cursor-not-allowed text-gray-600') },
|
23
23
|
icon,
|
@@ -44,7 +44,7 @@ const PreviewPanel = function ({ resource, previewModalOverlayProps, modalState,
|
|
44
44
|
react_1.default.createElement("div", { className: "flex flex-col grow" }, ResourceComponent && react_1.default.createElement(ResourceComponent, { resource: resource, selectionCallback: selectionCallback })),
|
45
45
|
react_1.default.createElement("div", { className: "flex justify-end border-t border-gray-300" },
|
46
46
|
react_1.default.createElement("button", { type: "button", onClick: () => onSelect(resource), className: "rounded text-sm text-white bg-blue-300 py-2 px-2.5 m-5" }, "Select"))));
|
47
|
-
return (react_1.default.createElement(
|
47
|
+
return (react_1.default.createElement("div", { className: "squiz-gb-scope h-full" },
|
48
48
|
!isMobile && react_1.default.createElement("h3", { className: "sr-only" }, "Resource Details"),
|
49
49
|
resource === null && (react_1.default.createElement("div", { className: "max-sm:hidden flex flex-col h-full" },
|
50
50
|
react_1.default.createElement("div", { className: "flex flex-col grow items-center mt-20 mx-20" },
|
@@ -13,7 +13,7 @@ const ResourceItem = ({ item, selected, label, type, childCount, previewModalSta
|
|
13
13
|
const { triggerProps, overlayProps } = (0, react_aria_1.useOverlayTrigger)({ type: 'dialog' }, previewModalState);
|
14
14
|
const isDisabled = allowedTypes !== undefined && !allowedTypes.includes(type);
|
15
15
|
const title = isDisabled ? "You can't select this item" : label;
|
16
|
-
return (react_1.default.createElement("li", { className: `flex items-stretch p-1 bg-white border-1 border-grey-200 min-h-[64px] ${className}`, key: (0, uuid_1.uuid)() },
|
16
|
+
return (react_1.default.createElement("li", { className: `squiz-gb-scope flex items-stretch p-1 bg-white border-1 border-grey-200 min-h-[64px] ${className}`, key: (0, uuid_1.uuid)() },
|
17
17
|
react_1.default.createElement(ModalOpeningButton_1.ModalOpeningButton, { type: "button", ...triggerProps, isDisabled: isDisabled, onPress: () => onSelect(item, overlayProps), "aria-label": childCount === undefined ? `Drill down to ${label} children` : '', className: `
|
18
18
|
relative grow flex items-center px-4 py-2 rounded outline-0 ${selected ? 'bg-blue-100 text-blue-400' : ''} ${childCount !== undefined && childCount > 0 ? 'mr-2' : ''} ${isDisabled ? 'font-normal text-gray-600 cursor-not-allowed' : 'hover:bg-gray-50 focus:bg-gray-50'}
|
19
19
|
`, title: title },
|
@@ -10,7 +10,7 @@ const ResourceState = function ({ state, message, handleReload, showButton = tru
|
|
10
10
|
const RetryButton = (react_1.default.createElement("button", { type: "button", onClick: handleReload, className: "flex flex-row items-center justify-center gap-3 bg-black bg-opacity-10 h-9 mt-3 rounded text-md font-bold text-gray-700 py-2 px-3" },
|
11
11
|
react_1.default.createElement(Icon_1.Icon, { icon: state === 'empty' ? 'back' : 'retry', "aria-hidden": true }),
|
12
12
|
state === 'empty' ? 'Back to source list' : 'Try again'));
|
13
|
-
return (react_1.default.createElement("div", { className: "flex flex-col items-center rounded-lg py-8 bg-white h-204 gap-3" },
|
13
|
+
return (react_1.default.createElement("div", { className: "squiz-gb-scope flex flex-col items-center rounded-lg py-8 bg-white h-204 gap-3" },
|
14
14
|
react_1.default.createElement(Icon_1.Icon, { icon: state, "aria-hidden": true }),
|
15
15
|
react_1.default.createElement("span", { className: "text-md text-gray-800 font-semibold leading-5" }, state === 'empty' ? 'There are no items to display' : message),
|
16
16
|
showButton && RetryButton));
|
package/lib/Spinner/Spinner.js
CHANGED
@@ -7,7 +7,7 @@ exports.Spinner = void 0;
|
|
7
7
|
const react_1 = __importDefault(require("react"));
|
8
8
|
const clsx_1 = __importDefault(require("clsx"));
|
9
9
|
const Spinner = ({ size = 'sm', className, label = 'Loading' }) => {
|
10
|
-
return (react_1.default.createElement("div", { className: "spinner__wrapper text-gray-600", "aria-label": label },
|
10
|
+
return (react_1.default.createElement("div", { className: "squiz-gb-scope spinner__wrapper text-gray-600", "aria-label": label },
|
11
11
|
react_1.default.createElement("div", { className: (0, clsx_1.default)('spinner', size && `spinner--${size}`, className), role: "status" })));
|
12
12
|
};
|
13
13
|
exports.Spinner = Spinner;
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@squiz/generic-browser-lib",
|
3
|
-
"version": "1.
|
3
|
+
"version": "1.40.1-alpha.0",
|
4
4
|
"description": "Package with reusable components used by resource/component browsers",
|
5
5
|
"main": "lib/index.js",
|
6
6
|
"types": "lib/index.d.ts",
|
@@ -72,5 +72,5 @@
|
|
72
72
|
"volta": {
|
73
73
|
"node": "18.15.0"
|
74
74
|
},
|
75
|
-
"gitHead": "
|
75
|
+
"gitHead": "81931ba6a9e9e62f6a5a9e8aac73b3c50418f478"
|
76
76
|
}
|
package/postcss.config.js
CHANGED
@@ -6,6 +6,12 @@ module.exports = {
|
|
6
6
|
require('postcss-prefix-selector')({
|
7
7
|
prefix: '.squiz-gb-scope',
|
8
8
|
includeFiles: ['./src/index.scss'],
|
9
|
+
transform(prefix, selector, prefixedSelector, filePath, rule) {
|
10
|
+
if (selector.match(/(squiz-gb-scope)/)) {
|
11
|
+
return selector;
|
12
|
+
}
|
13
|
+
return prefixedSelector;
|
14
|
+
},
|
9
15
|
}),
|
10
16
|
],
|
11
17
|
};
|
@@ -3,7 +3,7 @@ import { renderHook, waitFor } from '@testing-library/react';
|
|
3
3
|
import { useAsync } from './useAsync';
|
4
4
|
|
5
5
|
describe('useAsync', () => {
|
6
|
-
const renderAsyncHook = (callback: () => any, deps: DependencyList) => {
|
6
|
+
const renderAsyncHook = (callback: () => any | [], deps: DependencyList) => {
|
7
7
|
return renderHook(
|
8
8
|
({ deps }: { deps: DependencyList }) => useAsync({ callback, defaultValue: 'Initial state' }, deps),
|
9
9
|
{ initialProps: { deps } },
|
@@ -103,4 +103,33 @@ describe('useAsync', () => {
|
|
103
103
|
expect(result.current.data).toBe('Initial state');
|
104
104
|
},
|
105
105
|
);
|
106
|
+
|
107
|
+
test('useAsync handles multiple asynchronous callbacks', async () => {
|
108
|
+
const asyncCallbackOne = jest.fn(() => Promise.resolve('First Async Data'));
|
109
|
+
const asyncCallbackTwo = jest.fn(() => Promise.resolve('Second Async Data'));
|
110
|
+
|
111
|
+
const { result } = renderHook(() =>
|
112
|
+
useAsync(
|
113
|
+
{
|
114
|
+
callback: [asyncCallbackOne, asyncCallbackTwo],
|
115
|
+
defaultValue: 'Default Value',
|
116
|
+
},
|
117
|
+
[],
|
118
|
+
),
|
119
|
+
);
|
120
|
+
|
121
|
+
// Initial state
|
122
|
+
expect(result.current.data).toBe('Default Value');
|
123
|
+
expect(result.current.isLoading).toBe(true);
|
124
|
+
expect(result.current.error).toBe(null);
|
125
|
+
|
126
|
+
await waitFor(() => {
|
127
|
+
expect(result.current.data).toStrictEqual(['First Async Data', 'Second Async Data']);
|
128
|
+
expect(result.current.isLoading).toBe(false);
|
129
|
+
expect(result.current.error).toBe(null);
|
130
|
+
});
|
131
|
+
|
132
|
+
expect(asyncCallbackOne).toHaveBeenCalled();
|
133
|
+
expect(asyncCallbackTwo).toHaveBeenCalled();
|
134
|
+
});
|
106
135
|
});
|
package/src/Hooks/useAsync.ts
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
import { DependencyList, useState, useCallback, useEffect } from 'react';
|
2
2
|
|
3
3
|
export type UseAsyncProps<TReturnType, TDefaultValueType> = {
|
4
|
-
/** The async callback to call for fetching data. */
|
5
|
-
callback: () => TReturnType | Promise<TReturnType
|
4
|
+
/** The async callback or an array of async callbacks to call for fetching data. */
|
5
|
+
callback: (() => TReturnType | Promise<TReturnType>) | Array<() => TReturnType | Promise<TReturnType>>;
|
6
6
|
/** The default value to populate the data as when initially mounted or reloading data. */
|
7
7
|
defaultValue: TReturnType | TDefaultValueType;
|
8
8
|
};
|
9
9
|
|
10
10
|
/**
|
11
|
-
* Hook for invoking
|
11
|
+
* Hook for invoking async code and keeping track of its state.
|
12
12
|
*
|
13
13
|
* Data is loaded in 3 different ways:
|
14
14
|
* 1. On initial mount.
|
15
15
|
* 2. When any of the `deps` change.
|
16
|
-
* 3. When the `
|
16
|
+
* 3. When the `reload` function is called.
|
17
17
|
*/
|
18
18
|
export const useAsync = <TReturnType, TDefaultValueType>(
|
19
19
|
{ callback, defaultValue }: UseAsyncProps<TReturnType, TDefaultValueType>,
|
@@ -22,38 +22,39 @@ export const useAsync = <TReturnType, TDefaultValueType>(
|
|
22
22
|
const [data, setData] = useState(defaultValue);
|
23
23
|
const [isLoading, setIsLoading] = useState(false);
|
24
24
|
const [error, setError] = useState<Error | null>(null);
|
25
|
+
|
25
26
|
const reload = useCallback(() => {
|
26
27
|
setIsLoading(true);
|
27
28
|
setError(null);
|
28
29
|
setData(defaultValue);
|
29
30
|
|
30
31
|
try {
|
31
|
-
const
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
result
|
36
|
-
.then((resolved: TReturnType) => {
|
37
|
-
setData(resolved);
|
38
|
-
setIsLoading(false);
|
39
|
-
})
|
40
|
-
.catch((e: unknown) => {
|
41
|
-
setError(e instanceof Error ? e : new Error(String(e)));
|
42
|
-
setIsLoading(false);
|
43
|
-
});
|
44
|
-
} else {
|
45
|
-
// if the callback returned something other than a promise assume it is the data we want.
|
32
|
+
const isArrayOfCallbacks = Array.isArray(callback);
|
33
|
+
const promises = isArrayOfCallbacks ? callback.map((cb) => cb()) : [callback()];
|
34
|
+
|
35
|
+
if (!(promises[0] instanceof Promise)) {
|
36
|
+
const result = promises[0];
|
46
37
|
setData(result);
|
47
38
|
setIsLoading(false);
|
39
|
+
return;
|
48
40
|
}
|
41
|
+
|
42
|
+
Promise.all(promises)
|
43
|
+
.then((resolved: TReturnType[]) => {
|
44
|
+
setData(isArrayOfCallbacks ? (resolved as TReturnType) : resolved[0]);
|
45
|
+
setIsLoading(false);
|
46
|
+
})
|
47
|
+
.catch((e: unknown) => {
|
48
|
+
setError(e instanceof Error ? e : new Error(String(e)));
|
49
|
+
setIsLoading(false);
|
50
|
+
});
|
49
51
|
} catch (e: unknown) {
|
50
|
-
// callback threw outside of the scope of the promise.
|
51
52
|
setError(e instanceof Error ? e : new Error(String(e)));
|
52
53
|
setIsLoading(false);
|
53
54
|
}
|
54
55
|
}, deps);
|
55
56
|
|
56
|
-
//
|
57
|
+
// Reload data on dependency change (and initial mount)
|
57
58
|
useEffect(() => {
|
58
59
|
reload();
|
59
60
|
}, deps);
|
package/src/Modal/Modal.tsx
CHANGED
@@ -21,7 +21,7 @@ function ModalContent({
|
|
21
21
|
<div
|
22
22
|
{...dialogProps}
|
23
23
|
ref={ref}
|
24
|
-
className="z-50 relative bg-white rounded-lg h-screen lg:h-[calc(100vh-3.5rem)] w-screen max-w-screen-lg"
|
24
|
+
className="z-50 relative bg-white rounded-lg h-screen lg:h-[calc(100vh-3.5rem)] w-screen max-w-screen-lg outline-0"
|
25
25
|
>
|
26
26
|
{children(titleProps)}
|
27
27
|
</div>
|
@@ -40,7 +40,7 @@ export function Modal({ isDismissable, state, overlayProps, children, ...props }
|
|
40
40
|
|
41
41
|
return (
|
42
42
|
<Overlay>
|
43
|
-
<div className="squiz-gb-scope
|
43
|
+
<div className="squiz-gb-scope">
|
44
44
|
<div
|
45
45
|
{...underlayProps}
|
46
46
|
className="h-full z-[9998] fixed inset-0 before:z-40 before:fixed before:inset-0 before:bg-black before:bg-opacity-25"
|
@@ -34,7 +34,7 @@ export function ModalTrigger({
|
|
34
34
|
}
|
35
35
|
|
36
36
|
return (
|
37
|
-
|
37
|
+
<div className="squiz-gb-scope">
|
38
38
|
<ModalOpeningButton
|
39
39
|
type="button"
|
40
40
|
{...triggerProps}
|
@@ -56,6 +56,6 @@ export function ModalTrigger({
|
|
56
56
|
{(titleProps) => children(state.close, titleProps)}
|
57
57
|
</Modal>
|
58
58
|
)}
|
59
|
-
|
59
|
+
</div>
|
60
60
|
);
|
61
61
|
}
|
@@ -54,7 +54,7 @@ export const PreviewPanel = function ({
|
|
54
54
|
);
|
55
55
|
|
56
56
|
return (
|
57
|
-
|
57
|
+
<div className="squiz-gb-scope h-full">
|
58
58
|
{/* Dialog has its own title */}
|
59
59
|
{!isMobile && <h3 className="sr-only">Resource Details</h3>}
|
60
60
|
|
@@ -82,6 +82,6 @@ export const PreviewPanel = function ({
|
|
82
82
|
|
83
83
|
{/* If not mobile, just print the details out */}
|
84
84
|
{resource && !isMobile && <div className="flex flex-col h-full">{previewPanel}</div>}
|
85
|
-
|
85
|
+
</div>
|
86
86
|
);
|
87
87
|
};
|
@@ -43,7 +43,10 @@ const ResourceItem = <T,>({
|
|
43
43
|
const title = isDisabled ? "You can't select this item" : label;
|
44
44
|
|
45
45
|
return (
|
46
|
-
<li
|
46
|
+
<li
|
47
|
+
className={`squiz-gb-scope flex items-stretch p-1 bg-white border-1 border-grey-200 min-h-[64px] ${className}`}
|
48
|
+
key={uuid()}
|
49
|
+
>
|
47
50
|
<ModalOpeningButton
|
48
51
|
type="button"
|
49
52
|
{...triggerProps}
|
@@ -21,7 +21,7 @@ const ResourceState = function ({ state, message, handleReload, showButton = tru
|
|
21
21
|
);
|
22
22
|
|
23
23
|
return (
|
24
|
-
<div className="flex flex-col items-center rounded-lg py-8 bg-white h-204 gap-3">
|
24
|
+
<div className="squiz-gb-scope flex flex-col items-center rounded-lg py-8 bg-white h-204 gap-3">
|
25
25
|
<Icon icon={state as IconOptions} aria-hidden />
|
26
26
|
{/* Message */}
|
27
27
|
<span className="text-md text-gray-800 font-semibold leading-5">
|
package/src/Spinner/Spinner.tsx
CHANGED
@@ -9,7 +9,7 @@ export type SpinnerProps = {
|
|
9
9
|
|
10
10
|
export const Spinner = ({ size = 'sm', className, label = 'Loading' }: SpinnerProps): ReactElement => {
|
11
11
|
return (
|
12
|
-
<div className="spinner__wrapper text-gray-600" aria-label={label}>
|
12
|
+
<div className="squiz-gb-scope spinner__wrapper text-gray-600" aria-label={label}>
|
13
13
|
<div className={clsx('spinner', size && `spinner--${size}`, className)} role="status" />
|
14
14
|
</div>
|
15
15
|
);
|