@squiz/generic-browser-lib 1.35.1-alpha.34
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/.storybook/main.ts +23 -0
- package/.storybook/preview-head.html +15 -0
- package/.storybook/preview.ts +16 -0
- package/README.md +10 -0
- package/build.js +21 -0
- package/jest.config.ts +29 -0
- package/lib/Hooks/useAsync.d.ts +21 -0
- package/lib/Hooks/useAsync.js +53 -0
- package/lib/Icons/Generics/ArrowDown.d.ts +15 -0
- package/lib/Icons/Generics/ArrowDown.js +23 -0
- package/lib/Icons/Generics/ArrowRight.d.ts +15 -0
- package/lib/Icons/Generics/ArrowRight.js +23 -0
- package/lib/Icons/Generics/Back.d.ts +4 -0
- package/lib/Icons/Generics/Back.js +12 -0
- package/lib/Icons/Generics/Close.d.ts +15 -0
- package/lib/Icons/Generics/Close.js +23 -0
- package/lib/Icons/Generics/Empty.d.ts +4 -0
- package/lib/Icons/Generics/Empty.js +12 -0
- package/lib/Icons/Generics/Error.d.ts +4 -0
- package/lib/Icons/Generics/Error.js +12 -0
- package/lib/Icons/Generics/GenericIconMap.d.ts +14 -0
- package/lib/Icons/Generics/GenericIconMap.js +18 -0
- package/lib/Icons/Generics/ResourceSelect.d.ts +15 -0
- package/lib/Icons/Generics/ResourceSelect.js +28 -0
- package/lib/Icons/Generics/Retry.d.ts +4 -0
- package/lib/Icons/Generics/Retry.js +12 -0
- package/lib/Icons/Generics/Root.d.ts +15 -0
- package/lib/Icons/Generics/Root.js +23 -0
- package/lib/Icons/Generics/Selected.d.ts +15 -0
- package/lib/Icons/Generics/Selected.js +23 -0
- package/lib/Icons/Generics/index.d.ts +10 -0
- package/lib/Icons/Generics/index.js +27 -0
- package/lib/Icons/Icon.d.ts +50 -0
- package/lib/Icons/Icon.js +42 -0
- package/lib/Icons/MatrixResources/Audio.d.ts +15 -0
- package/lib/Icons/MatrixResources/Audio.js +28 -0
- package/lib/Icons/MatrixResources/Excel.d.ts +15 -0
- package/lib/Icons/MatrixResources/Excel.js +27 -0
- package/lib/Icons/MatrixResources/Folder.d.ts +15 -0
- package/lib/Icons/MatrixResources/Folder.js +24 -0
- package/lib/Icons/MatrixResources/GenericFile.d.ts +15 -0
- package/lib/Icons/MatrixResources/GenericFile.js +28 -0
- package/lib/Icons/MatrixResources/Image.d.ts +15 -0
- package/lib/Icons/MatrixResources/Image.js +26 -0
- package/lib/Icons/MatrixResources/MatrixResourceMap.d.ts +15 -0
- package/lib/Icons/MatrixResources/MatrixResourceMap.js +19 -0
- package/lib/Icons/MatrixResources/Page.d.ts +15 -0
- package/lib/Icons/MatrixResources/Page.js +30 -0
- package/lib/Icons/MatrixResources/Pdf.d.ts +15 -0
- package/lib/Icons/MatrixResources/Pdf.js +31 -0
- package/lib/Icons/MatrixResources/Powerpoint.d.ts +15 -0
- package/lib/Icons/MatrixResources/Powerpoint.js +28 -0
- package/lib/Icons/MatrixResources/Site.d.ts +15 -0
- package/lib/Icons/MatrixResources/Site.js +30 -0
- package/lib/Icons/MatrixResources/Video.d.ts +15 -0
- package/lib/Icons/MatrixResources/Video.js +24 -0
- package/lib/Icons/MatrixResources/Word.d.ts +17 -0
- package/lib/Icons/MatrixResources/Word.js +28 -0
- package/lib/Icons/MatrixResources/index.d.ts +11 -0
- package/lib/Icons/MatrixResources/index.js +29 -0
- package/lib/Modal/Modal.d.ts +10 -0
- package/lib/Modal/Modal.js +47 -0
- package/lib/Modal/ModalOpeningButton.d.ts +10 -0
- package/lib/Modal/ModalOpeningButton.js +14 -0
- package/lib/Modal/ModalTrigger.d.ts +9 -0
- package/lib/Modal/ModalTrigger.js +26 -0
- package/lib/PreviewPanel/PreviewModal.d.ts +11 -0
- package/lib/PreviewPanel/PreviewModal.js +79 -0
- package/lib/PreviewPanel/PreviewPanel.d.ts +13 -0
- package/lib/PreviewPanel/PreviewPanel.js +58 -0
- package/lib/PreviewPanel/PreviewPanelHOC.d.ts +6 -0
- package/lib/PreviewPanel/PreviewPanelHOC.js +16 -0
- package/lib/ResetButton/ResetButton.d.ts +5 -0
- package/lib/ResetButton/ResetButton.js +12 -0
- package/lib/ResourceItem/ResourceItem.d.ts +19 -0
- package/lib/ResourceItem/ResourceItem.js +29 -0
- package/lib/ResourceState/ResourceState.d.ts +7 -0
- package/lib/ResourceState/ResourceState.js +17 -0
- package/lib/Skeleton/List/SkeletonList.d.ts +6 -0
- package/lib/Skeleton/List/SkeletonList.js +13 -0
- package/lib/Skeleton/ListItem/SkeletonListItem.d.ts +1 -0
- package/lib/Skeleton/ListItem/SkeletonListItem.js +15 -0
- package/lib/Spinner/Spinner.d.ts +7 -0
- package/lib/Spinner/Spinner.js +13 -0
- package/lib/index.css +885 -0
- package/lib/index.d.ts +12 -0
- package/lib/index.js +28 -0
- package/package.json +76 -0
- package/postcss.config.js +11 -0
- package/src/Hooks/useAsync.spec.ts +106 -0
- package/src/Hooks/useAsync.ts +62 -0
- package/src/Icons/Generics/ArrowDown.tsx +27 -0
- package/src/Icons/Generics/ArrowRight.tsx +27 -0
- package/src/Icons/Generics/Back.tsx +13 -0
- package/src/Icons/Generics/Close.tsx +26 -0
- package/src/Icons/Generics/Empty.tsx +13 -0
- package/src/Icons/Generics/Error.tsx +13 -0
- package/src/Icons/Generics/GenericIconMap.ts +18 -0
- package/src/Icons/Generics/ResourceSelect.tsx +40 -0
- package/src/Icons/Generics/Retry.tsx +13 -0
- package/src/Icons/Generics/Root.tsx +24 -0
- package/src/Icons/Generics/Selected.tsx +27 -0
- package/src/Icons/Generics/index.tsx +11 -0
- package/src/Icons/Icon.spec.tsx +62 -0
- package/src/Icons/Icon.stories.tsx +110 -0
- package/src/Icons/Icon.tsx +54 -0
- package/src/Icons/MatrixResources/Audio.tsx +30 -0
- package/src/Icons/MatrixResources/Excel.tsx +29 -0
- package/src/Icons/MatrixResources/Folder.tsx +29 -0
- package/src/Icons/MatrixResources/GenericFile.tsx +34 -0
- package/src/Icons/MatrixResources/Image.tsx +36 -0
- package/src/Icons/MatrixResources/MatrixResourceMap.ts +19 -0
- package/src/Icons/MatrixResources/Page.tsx +33 -0
- package/src/Icons/MatrixResources/Pdf.tsx +34 -0
- package/src/Icons/MatrixResources/Powerpoint.tsx +34 -0
- package/src/Icons/MatrixResources/Site.tsx +37 -0
- package/src/Icons/MatrixResources/Video.tsx +27 -0
- package/src/Icons/MatrixResources/Word.tsx +30 -0
- package/src/Icons/MatrixResources/index.tsx +12 -0
- package/src/Modal/Modal.spec.tsx +269 -0
- package/src/Modal/Modal.tsx +55 -0
- package/src/Modal/ModalContainer.stories.tsx +33 -0
- package/src/Modal/ModalOpeningButton.tsx +20 -0
- package/src/Modal/ModalTrigger.tsx +54 -0
- package/src/PreviewPanel/PreviewModal.spec.tsx +164 -0
- package/src/PreviewPanel/PreviewModal.tsx +94 -0
- package/src/PreviewPanel/PreviewPanel.spec.tsx +162 -0
- package/src/PreviewPanel/PreviewPanel.stories.tsx +66 -0
- package/src/PreviewPanel/PreviewPanel.tsx +83 -0
- package/src/PreviewPanel/PreviewPanelHOC.spec.tsx +45 -0
- package/src/PreviewPanel/PreviewPanelHOC.tsx +17 -0
- package/src/ResetButton/ResetButton.spec.tsx +42 -0
- package/src/ResetButton/ResetButton.tsx +22 -0
- package/src/ResourceItem/ResourceItem.spec.tsx +65 -0
- package/src/ResourceItem/ResourceItem.tsx +90 -0
- package/src/ResourceState/ResourceState.spec.tsx +26 -0
- package/src/ResourceState/ResourceState.stories.tsx +24 -0
- package/src/ResourceState/ResourceState.tsx +31 -0
- package/src/Skeleton/List/SkeletonList.spec.tsx +18 -0
- package/src/Skeleton/List/SkeletonList.stories.tsx +15 -0
- package/src/Skeleton/List/SkeletonList.tsx +20 -0
- package/src/Skeleton/ListItem/SkeletonListItem.stories.tsx +15 -0
- package/src/Skeleton/ListItem/SkeletonListItem.tsx +14 -0
- package/src/Skeleton/_skeleton.scss +15 -0
- package/src/Spinner/Spinner.spec.tsx +18 -0
- package/src/Spinner/Spinner.stories.tsx +26 -0
- package/src/Spinner/Spinner.tsx +16 -0
- package/src/Spinner/_spinner.scss +14 -0
- package/src/index.scss +22 -0
- package/src/index.stories.tsx +26 -0
- package/src/index.ts +20 -0
- package/tailwind.config.cjs +89 -0
- package/tsconfig.json +22 -0
@@ -0,0 +1,11 @@
|
|
1
|
+
export { default as Audio } from './Audio';
|
2
|
+
export { default as Excel } from './Excel';
|
3
|
+
export { default as Folder } from './Folder';
|
4
|
+
export { default as GenericFile } from './GenericFile';
|
5
|
+
export { default as Image } from './Image';
|
6
|
+
export { default as Page } from './Page';
|
7
|
+
export { default as Pdf } from './Pdf';
|
8
|
+
export { default as Powerpoint } from './Powerpoint';
|
9
|
+
export { default as Site } from './Site';
|
10
|
+
export { default as Video } from './Video';
|
11
|
+
export { default as Word } from './Word';
|
@@ -0,0 +1,29 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.Word = exports.Video = exports.Site = exports.Powerpoint = exports.Pdf = exports.Page = exports.Image = exports.GenericFile = exports.Folder = exports.Excel = exports.Audio = void 0;
|
7
|
+
// Export all the icons from the MatrixResources folder
|
8
|
+
var Audio_1 = require("./Audio");
|
9
|
+
Object.defineProperty(exports, "Audio", { enumerable: true, get: function () { return __importDefault(Audio_1).default; } });
|
10
|
+
var Excel_1 = require("./Excel");
|
11
|
+
Object.defineProperty(exports, "Excel", { enumerable: true, get: function () { return __importDefault(Excel_1).default; } });
|
12
|
+
var Folder_1 = require("./Folder");
|
13
|
+
Object.defineProperty(exports, "Folder", { enumerable: true, get: function () { return __importDefault(Folder_1).default; } });
|
14
|
+
var GenericFile_1 = require("./GenericFile");
|
15
|
+
Object.defineProperty(exports, "GenericFile", { enumerable: true, get: function () { return __importDefault(GenericFile_1).default; } });
|
16
|
+
var Image_1 = require("./Image");
|
17
|
+
Object.defineProperty(exports, "Image", { enumerable: true, get: function () { return __importDefault(Image_1).default; } });
|
18
|
+
var Page_1 = require("./Page");
|
19
|
+
Object.defineProperty(exports, "Page", { enumerable: true, get: function () { return __importDefault(Page_1).default; } });
|
20
|
+
var Pdf_1 = require("./Pdf");
|
21
|
+
Object.defineProperty(exports, "Pdf", { enumerable: true, get: function () { return __importDefault(Pdf_1).default; } });
|
22
|
+
var Powerpoint_1 = require("./Powerpoint");
|
23
|
+
Object.defineProperty(exports, "Powerpoint", { enumerable: true, get: function () { return __importDefault(Powerpoint_1).default; } });
|
24
|
+
var Site_1 = require("./Site");
|
25
|
+
Object.defineProperty(exports, "Site", { enumerable: true, get: function () { return __importDefault(Site_1).default; } });
|
26
|
+
var Video_1 = require("./Video");
|
27
|
+
Object.defineProperty(exports, "Video", { enumerable: true, get: function () { return __importDefault(Video_1).default; } });
|
28
|
+
var Word_1 = require("./Word");
|
29
|
+
Object.defineProperty(exports, "Word", { enumerable: true, get: function () { return __importDefault(Word_1).default; } });
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { OverlayTriggerState } from 'react-stately';
|
3
|
+
import { DOMAttributes, FocusableElement } from '@react-types/shared';
|
4
|
+
export type ModalProps = {
|
5
|
+
isDismissable?: boolean;
|
6
|
+
state: OverlayTriggerState;
|
7
|
+
overlayProps: DOMAttributes<FocusableElement>;
|
8
|
+
children: (titleProps: DOMAttributes<FocusableElement>) => React.ReactElement;
|
9
|
+
};
|
10
|
+
export declare function Modal({ isDismissable, state, overlayProps, children, ...props }: ModalProps): JSX.Element;
|
@@ -0,0 +1,47 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
+
}) : function(o, v) {
|
16
|
+
o["default"] = v;
|
17
|
+
});
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
19
|
+
if (mod && mod.__esModule) return mod;
|
20
|
+
var result = {};
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22
|
+
__setModuleDefault(result, mod);
|
23
|
+
return result;
|
24
|
+
};
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
26
|
+
exports.Modal = void 0;
|
27
|
+
const react_1 = __importStar(require("react"));
|
28
|
+
const react_aria_1 = require("react-aria");
|
29
|
+
/*
|
30
|
+
This has to be a separate element otherwise the focus trap fails. Assuming this is because it needs
|
31
|
+
to fit inside the 'Overlay' as a form of context.
|
32
|
+
*/
|
33
|
+
function ModalContent({ children, ...props }) {
|
34
|
+
const ref = (0, react_1.useRef)(null);
|
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)));
|
37
|
+
}
|
38
|
+
function Modal({ isDismissable, state, overlayProps, children, ...props }) {
|
39
|
+
const ref = (0, react_1.useRef)(null);
|
40
|
+
const { modalProps, underlayProps } = (0, react_aria_1.useModalOverlay)({ isDismissable, ...props }, state, ref);
|
41
|
+
return (react_1.default.createElement(react_aria_1.Overlay, null,
|
42
|
+
react_1.default.createElement("div", { className: "squiz-gb-scope" },
|
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
|
+
react_1.default.createElement("div", { ...modalProps, ref: ref, className: "h-full flex items-center justify-center" },
|
45
|
+
react_1.default.createElement(ModalContent, { ...overlayProps }, (titleProps) => children(titleProps)))))));
|
46
|
+
}
|
47
|
+
exports.Modal = Modal;
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { AriaButtonProps } from 'react-aria';
|
3
|
+
interface ModalOpeningButtonProps extends AriaButtonProps<'button'> {
|
4
|
+
className?: string;
|
5
|
+
children?: React.ReactNode;
|
6
|
+
isDisabled?: boolean;
|
7
|
+
title?: string;
|
8
|
+
}
|
9
|
+
export declare function ModalOpeningButton({ className, children, title, ...props }: ModalOpeningButtonProps): JSX.Element;
|
10
|
+
export {};
|
@@ -0,0 +1,14 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.ModalOpeningButton = void 0;
|
7
|
+
const react_1 = __importDefault(require("react"));
|
8
|
+
const react_aria_1 = require("react-aria");
|
9
|
+
function ModalOpeningButton({ className, children, title, ...props }) {
|
10
|
+
const ref = react_1.default.useRef(null);
|
11
|
+
const { buttonProps } = (0, react_aria_1.useButton)(props, ref);
|
12
|
+
return (react_1.default.createElement("button", { ...buttonProps, ref: ref, className: className, title: title }, children));
|
13
|
+
}
|
14
|
+
exports.ModalOpeningButton = ModalOpeningButton;
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { DOMAttributes, FocusableElement } from '@react-types/shared';
|
3
|
+
export declare function ModalTrigger({ label, showLabel, icon, isDisabled, children, ...props }: {
|
4
|
+
label: string;
|
5
|
+
showLabel?: boolean;
|
6
|
+
icon?: React.ReactNode;
|
7
|
+
isDisabled?: boolean;
|
8
|
+
children: (onClose: () => void, titleProps: DOMAttributes<FocusableElement>) => React.ReactElement;
|
9
|
+
}): JSX.Element;
|
@@ -0,0 +1,26 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.ModalTrigger = void 0;
|
7
|
+
const react_1 = __importDefault(require("react"));
|
8
|
+
const react_aria_1 = require("react-aria");
|
9
|
+
const react_stately_1 = require("react-stately");
|
10
|
+
const clsx_1 = __importDefault(require("clsx"));
|
11
|
+
const Modal_1 = require("./Modal");
|
12
|
+
const ModalOpeningButton_1 = require("./ModalOpeningButton");
|
13
|
+
function ModalTrigger({ label, showLabel, icon, isDisabled, children, ...props }) {
|
14
|
+
const state = (0, react_stately_1.useOverlayTriggerState)(props);
|
15
|
+
const { triggerProps, overlayProps } = (0, react_aria_1.useOverlayTrigger)({ type: 'dialog' }, state);
|
16
|
+
let ariaAttr = {};
|
17
|
+
if (!showLabel) {
|
18
|
+
ariaAttr = { ...ariaAttr, 'aria-label': label };
|
19
|
+
}
|
20
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
21
|
+
react_1.default.createElement(ModalOpeningButton_1.ModalOpeningButton, { type: "button", ...triggerProps, ...ariaAttr, isDisabled: isDisabled, className: (0, clsx_1.default)('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') },
|
22
|
+
icon,
|
23
|
+
showLabel && react_1.default.createElement("span", { className: "ml-1 text-sm font-semibold leading-4" }, label)),
|
24
|
+
state.isOpen && (react_1.default.createElement(Modal_1.Modal, { isDismissable: true, state: state, overlayProps: overlayProps }, (titleProps) => children(state.close, titleProps)))));
|
25
|
+
}
|
26
|
+
exports.ModalTrigger = ModalTrigger;
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import { ReactNode } from 'react';
|
2
|
+
import { OverlayTriggerState } from 'react-stately';
|
3
|
+
import { DOMAttributes, FocusableElement } from '@react-types/shared';
|
4
|
+
export type PreviewModalProps = {
|
5
|
+
state: OverlayTriggerState;
|
6
|
+
overlayProps: DOMAttributes<FocusableElement>;
|
7
|
+
children?: ReactNode;
|
8
|
+
onClose: () => void;
|
9
|
+
};
|
10
|
+
declare function PreviewModal({ state, overlayProps, children, onClose, ...props }: PreviewModalProps): JSX.Element;
|
11
|
+
export default PreviewModal;
|
@@ -0,0 +1,79 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
+
}) : function(o, v) {
|
16
|
+
o["default"] = v;
|
17
|
+
});
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
19
|
+
if (mod && mod.__esModule) return mod;
|
20
|
+
var result = {};
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22
|
+
__setModuleDefault(result, mod);
|
23
|
+
return result;
|
24
|
+
};
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
26
|
+
const react_1 = __importStar(require("react"));
|
27
|
+
const react_aria_1 = require("react-aria");
|
28
|
+
const Icon_1 = require("../Icons/Icon");
|
29
|
+
/*
|
30
|
+
This has to be a separate element otherwise the focus trap fails. Assuming this is because it needs
|
31
|
+
to fit inside the 'Overlay' as a form of context.
|
32
|
+
*/
|
33
|
+
function PreviewModalContent({ children, onClose, ...props }) {
|
34
|
+
const ref = (0, react_1.useRef)(null);
|
35
|
+
const { dialogProps, titleProps } = (0, react_aria_1.useDialog)(props, ref);
|
36
|
+
return (react_1.default.createElement("div", { ...dialogProps, ref: ref, className: "h-full flex flex-col" },
|
37
|
+
react_1.default.createElement("h3", { ...titleProps, className: "sr-only" }, "Resource Details"),
|
38
|
+
react_1.default.createElement("button", { type: "button", "aria-label": "Close details", onClick: onClose, className: "absolute top-3 right-3" },
|
39
|
+
react_1.default.createElement(Icon_1.Icon, { icon: 'close', className: "" })),
|
40
|
+
children));
|
41
|
+
}
|
42
|
+
// Accept a ref for the top level modal
|
43
|
+
function PreviewModal({ state, overlayProps, children, onClose, ...props }) {
|
44
|
+
const modalRef = (0, react_1.useRef)(null);
|
45
|
+
const overlayRef = (0, react_1.useRef)(null);
|
46
|
+
const { modalProps, underlayProps } = (0, react_aria_1.useModalOverlay)({ isKeyboardDismissDisabled: true, ...props }, state, overlayRef);
|
47
|
+
// Need to handle the ESC escape hatch ourselves as we need to run onClose to deselect the current node
|
48
|
+
const { keyboardProps } = (0, react_aria_1.useKeyboard)({
|
49
|
+
onKeyDown: (e) => {
|
50
|
+
if (e.key === 'Escape') {
|
51
|
+
onClose();
|
52
|
+
}
|
53
|
+
else {
|
54
|
+
// Need to do this so TAB get handled up higher and cycles though the focus trap
|
55
|
+
e.continuePropagation();
|
56
|
+
}
|
57
|
+
},
|
58
|
+
});
|
59
|
+
(0, react_1.useEffect)(() => {
|
60
|
+
// Check if the click event has happened outside the modal
|
61
|
+
function handleClickOutside(event) {
|
62
|
+
if (modalRef.current && !modalRef.current.contains(event?.target)) {
|
63
|
+
onClose();
|
64
|
+
}
|
65
|
+
}
|
66
|
+
// Bind the event listener
|
67
|
+
document.addEventListener('mousedown', handleClickOutside);
|
68
|
+
return () => {
|
69
|
+
// Unbind the event listener on clean up
|
70
|
+
document.removeEventListener('mousedown', handleClickOutside);
|
71
|
+
};
|
72
|
+
}, [modalRef]);
|
73
|
+
return (react_1.default.createElement(react_aria_1.Overlay, null,
|
74
|
+
react_1.default.createElement("div", { className: "squiz-gb-scope" },
|
75
|
+
react_1.default.createElement("div", { ref: modalRef, ...underlayProps, ...keyboardProps, className: "fixed z-[9999] overflow-y-scroll bottom-0 w-full h-[50vh] bg-white border-t border-gray-300" },
|
76
|
+
react_1.default.createElement("div", { ref: overlayRef, ...modalProps, className: "h-full" },
|
77
|
+
react_1.default.createElement(PreviewModalContent, { ...overlayProps, onClose: onClose }, children))))));
|
78
|
+
}
|
79
|
+
exports.default = PreviewModal;
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { OverlayTriggerState } from 'react-stately';
|
3
|
+
import { DOMAttributes, FocusableElement } from '@react-types/shared';
|
4
|
+
export interface PreviewPanelProps {
|
5
|
+
resource: any | null;
|
6
|
+
modalState: OverlayTriggerState;
|
7
|
+
previewModalOverlayProps: DOMAttributes<FocusableElement>;
|
8
|
+
allowedTypes: string[] | undefined;
|
9
|
+
onSelect: (resource: any) => void;
|
10
|
+
onClose: () => void;
|
11
|
+
ResourceComponent?: React.ElementType;
|
12
|
+
}
|
13
|
+
export declare const PreviewPanel: ({ resource, previewModalOverlayProps, modalState, onSelect, onClose, ResourceComponent, }: PreviewPanelProps) => JSX.Element;
|
@@ -0,0 +1,58 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
+
}) : function(o, v) {
|
16
|
+
o["default"] = v;
|
17
|
+
});
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
19
|
+
if (mod && mod.__esModule) return mod;
|
20
|
+
var result = {};
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22
|
+
__setModuleDefault(result, mod);
|
23
|
+
return result;
|
24
|
+
};
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
27
|
+
};
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
29
|
+
exports.PreviewPanel = void 0;
|
30
|
+
const react_1 = __importStar(require("react"));
|
31
|
+
const react_responsive_1 = require("react-responsive");
|
32
|
+
const Icon_1 = require("../Icons/Icon");
|
33
|
+
const PreviewModal_1 = __importDefault(require("./PreviewModal"));
|
34
|
+
const PreviewPanel = function ({ resource, previewModalOverlayProps, modalState, onSelect, onClose, ResourceComponent, }) {
|
35
|
+
// Watch the media size to see if we are on mobile size
|
36
|
+
const isMobile = (0, react_responsive_1.useMediaQuery)({ query: '(max-width: 640px)' });
|
37
|
+
// If we are on mobile and the selected resource changes show the preview panel modal.
|
38
|
+
(0, react_1.useEffect)(() => {
|
39
|
+
if (!modalState.isOpen) {
|
40
|
+
modalState.setOpen(Boolean(resource && isMobile));
|
41
|
+
}
|
42
|
+
}, [resource, isMobile]);
|
43
|
+
const previewPanel = resource && (react_1.default.createElement(react_1.default.Fragment, null,
|
44
|
+
react_1.default.createElement("div", { className: "flex flex-col grow" }, ResourceComponent && react_1.default.createElement(ResourceComponent, { resource: resource })),
|
45
|
+
react_1.default.createElement("div", { className: "flex justify-end border-t border-gray-300" },
|
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("div", { className: "sm:overflow-y-scroll sm:flex-1 sm:grow-[2] bg-white" },
|
48
|
+
!isMobile && react_1.default.createElement("h3", { className: "sr-only" }, "Resource Details"),
|
49
|
+
resource === null && (react_1.default.createElement("div", { className: "max-sm:hidden flex flex-col h-full" },
|
50
|
+
react_1.default.createElement("div", { className: "flex flex-col grow items-center mt-20 mx-20" },
|
51
|
+
react_1.default.createElement(Icon_1.Icon, { icon: 'resource-select', "aria-hidden": true }),
|
52
|
+
react_1.default.createElement("div", { className: "text-sm text-gray-600 text-center mt-4" }, "Make a selection to see more info here.")),
|
53
|
+
react_1.default.createElement("div", { className: "flex justify-end border-t border-gray-300" },
|
54
|
+
react_1.default.createElement("button", { disabled: true, type: "button", className: "rounded text-sm text-white bg-blue-300/[.6] py-2 px-2.5 m-5" }, "Select")))),
|
55
|
+
resource && isMobile && modalState.isOpen && (react_1.default.createElement(PreviewModal_1.default, { state: modalState, overlayProps: previewModalOverlayProps, onClose: onClose }, previewPanel)),
|
56
|
+
resource && !isMobile && react_1.default.createElement("div", { className: "flex flex-col h-full" }, previewPanel)));
|
57
|
+
};
|
58
|
+
exports.PreviewPanel = PreviewPanel;
|
@@ -0,0 +1,6 @@
|
|
1
|
+
import React, { ComponentType } from 'react';
|
2
|
+
import { PreviewPanelProps } from './PreviewPanel';
|
3
|
+
export interface PreviewPanelHOCProps {
|
4
|
+
ResourceComponent?: ComponentType<any>;
|
5
|
+
}
|
6
|
+
export declare const PreviewPanelHOC: (ResourceComponent: ComponentType<any>) => React.FC<PreviewPanelHOCProps & PreviewPanelProps>;
|
@@ -0,0 +1,16 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.PreviewPanelHOC = void 0;
|
7
|
+
const react_1 = __importDefault(require("react"));
|
8
|
+
const PreviewPanel_1 = require("./PreviewPanel");
|
9
|
+
const PreviewPanelHOC = (ResourceComponent) => {
|
10
|
+
const NewComponent = (props) => {
|
11
|
+
// Render OriginalComponent and pass on its props.
|
12
|
+
return react_1.default.createElement(PreviewPanel_1.PreviewPanel, { ...props, ResourceComponent: ResourceComponent });
|
13
|
+
};
|
14
|
+
return NewComponent;
|
15
|
+
};
|
16
|
+
exports.PreviewPanelHOC = PreviewPanelHOC;
|
@@ -0,0 +1,12 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.ResetButton = void 0;
|
7
|
+
const react_1 = __importDefault(require("react"));
|
8
|
+
const CloseRounded_1 = __importDefault(require("@mui/icons-material/CloseRounded"));
|
9
|
+
const ResetButton = ({ onClick, isDisabled }) => (react_1.default.createElement("div", { className: "squiz-gb-scope" },
|
10
|
+
react_1.default.createElement("button", { type: "button", "aria-label": `Remove selection`, title: `Remove selection`, className: "text-gray-500 hover:text-gray-800 focus:text-gray-800 w-6 h-6 disabled:text-gray-500 disabled:cursor-not-allowed", disabled: isDisabled, onClick: onClick },
|
11
|
+
react_1.default.createElement(CloseRounded_1.default, null))));
|
12
|
+
exports.ResetButton = ResetButton;
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import { DOMAttributes, FocusableElement } from '@react-types/shared';
|
2
|
+
import { OverlayTriggerState } from 'react-stately';
|
3
|
+
import { ResourceSources } from '../Icons/Icon';
|
4
|
+
interface ResourceItem<T> {
|
5
|
+
item: T;
|
6
|
+
selected?: boolean;
|
7
|
+
label: string;
|
8
|
+
type: string;
|
9
|
+
childCount?: number;
|
10
|
+
previewModalState: OverlayTriggerState;
|
11
|
+
onSelect: (node: T, overlayProps: DOMAttributes<FocusableElement>) => void;
|
12
|
+
onDrillDown?: (node: T) => void;
|
13
|
+
className: string;
|
14
|
+
allowedTypes?: string[] | undefined;
|
15
|
+
iconSource?: ResourceSources;
|
16
|
+
showChevron?: boolean;
|
17
|
+
}
|
18
|
+
declare const ResourceItem: <T>({ item, selected, label, type, childCount, previewModalState, onSelect, onDrillDown, className, allowedTypes, iconSource, showChevron, }: ResourceItem<T>) => JSX.Element;
|
19
|
+
export { ResourceItem };
|
@@ -0,0 +1,29 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.ResourceItem = void 0;
|
7
|
+
const react_1 = __importDefault(require("react"));
|
8
|
+
const react_aria_1 = require("react-aria");
|
9
|
+
const ModalOpeningButton_1 = require("../Modal/ModalOpeningButton");
|
10
|
+
const Icon_1 = require("../Icons/Icon");
|
11
|
+
const ResourceItem = ({ item, selected, label, type, childCount, previewModalState, onSelect, onDrillDown, className, allowedTypes, iconSource = 'matrix', showChevron = false, }) => {
|
12
|
+
const { triggerProps, overlayProps } = (0, react_aria_1.useOverlayTrigger)({ type: 'dialog' }, previewModalState);
|
13
|
+
const isDisabled = allowedTypes !== undefined && !allowedTypes.includes(type);
|
14
|
+
const title = isDisabled ? "You can't select this item" : label;
|
15
|
+
return (react_1.default.createElement("li", { className: `flex items-stretch p-1 bg-white border-1 border-grey-200 min-h-[64px] ${className}` },
|
16
|
+
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: `
|
17
|
+
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'}
|
18
|
+
`, title: title },
|
19
|
+
react_1.default.createElement(Icon_1.Icon, { icon: type, resourceSource: iconSource, "aria-label": type, className: `mr-4 shrink-0 ${isDisabled && 'opacity-40'}` }),
|
20
|
+
react_1.default.createElement("span", { className: `relative flex items-center ${selected ? 'mr-8' : ''}` },
|
21
|
+
react_1.default.createElement("span", { className: "line-clamp-2 text-left break-word" }, label),
|
22
|
+
selected && react_1.default.createElement(Icon_1.Icon, { icon: 'selected', "aria-label": "selected", className: "absolute -right-8" })),
|
23
|
+
childCount === undefined && showChevron && (react_1.default.createElement(Icon_1.Icon, { icon: 'arrow-right', className: "absolute right-5" }))),
|
24
|
+
childCount !== undefined && childCount > 0 && onDrillDown && (react_1.default.createElement("button", { type: "button", "aria-label": `Drill down to ${label} children`, onClick: () => onDrillDown(item), className: `relative shrink-0 flex items-center p-4 rounded outline-0 before:w-px before:h-[calc(100%-0.75rem)] before:bg-gray-200 before:absolute before:top-1.5 before:-left-1 hover:bg-gray-50 focus:bg-gray-50` },
|
25
|
+
react_1.default.createElement("span", { className: "ml-auto flex items-center" },
|
26
|
+
react_1.default.createElement("span", { className: "truncate w-14 text-right", title: String(childCount) }, childCount),
|
27
|
+
react_1.default.createElement(Icon_1.Icon, { icon: 'arrow-right', className: "ml-1" }))))));
|
28
|
+
};
|
29
|
+
exports.ResourceItem = ResourceItem;
|
@@ -0,0 +1,17 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.ResourceState = void 0;
|
7
|
+
const react_1 = __importDefault(require("react"));
|
8
|
+
const Icon_1 = require("../Icons/Icon");
|
9
|
+
const ResourceState = function ({ state, message, handleReload }) {
|
10
|
+
return (react_1.default.createElement("div", { className: "flex flex-col items-center rounded-lg py-8 bg-white h-204 gap-3" },
|
11
|
+
react_1.default.createElement(Icon_1.Icon, { icon: state, "aria-hidden": true }),
|
12
|
+
react_1.default.createElement("span", { className: "text-md text-gray-800 font-semibold leading-5" }, state === 'empty' ? 'There are no items to display' : message),
|
13
|
+
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" },
|
14
|
+
react_1.default.createElement(Icon_1.Icon, { icon: state === 'empty' ? 'back' : 'retry', "aria-hidden": true }),
|
15
|
+
state === 'empty' ? 'Back to source list' : 'Try again')));
|
16
|
+
};
|
17
|
+
exports.ResourceState = ResourceState;
|
@@ -0,0 +1,13 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.SkeletonList = void 0;
|
7
|
+
const react_1 = __importDefault(require("react"));
|
8
|
+
const SkeletonListItem_1 = require("../ListItem/SkeletonListItem");
|
9
|
+
const clsx_1 = __importDefault(require("clsx"));
|
10
|
+
const SkeletonList = ({ itemCount = 8, className, ariaLabel }) => (react_1.default.createElement("ul", { className: (0, clsx_1.default)(`flex flex-col px-7 my-4 focus-visible:outline-0`, className), "aria-label": `${ariaLabel || 'Skeleton loader list'}` }, [...Array(itemCount)].map((_item, index) => {
|
11
|
+
return react_1.default.createElement(SkeletonListItem_1.SkeletonListItem, { key: index });
|
12
|
+
})));
|
13
|
+
exports.SkeletonList = SkeletonList;
|
@@ -0,0 +1 @@
|
|
1
|
+
export declare const SkeletonListItem: () => JSX.Element;
|
@@ -0,0 +1,15 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.SkeletonListItem = void 0;
|
7
|
+
const react_1 = __importDefault(require("react"));
|
8
|
+
const SkeletonListItem = () => (react_1.default.createElement("li", { className: "flex items-center p-1 first:mt-0 bg-white border-1 border-b-0 border-grey-200 first:rounded-t-lg last:rounded-b-lg last:border-b" },
|
9
|
+
react_1.default.createElement("div", { className: "animate-skeleton-pulse grid grid-cols-[24px_1fr_45px] w-full flex items-center p-4 rounded" },
|
10
|
+
react_1.default.createElement("span", { className: "w-6 h-6 bg-gray-200 rounded-full" }),
|
11
|
+
react_1.default.createElement("div", { className: "w-full d-flex flex-col mx-4" },
|
12
|
+
react_1.default.createElement("div", { className: "mb-1 w-3/4 h-2 bg-gray-200 rounded" }),
|
13
|
+
react_1.default.createElement("div", { className: "w-1/2 h-2 bg-gray-200 rounded" })),
|
14
|
+
react_1.default.createElement("div", { className: "ml-auto mx-4 w-12 h-2 bg-gray-200 rounded" }))));
|
15
|
+
exports.SkeletonListItem = SkeletonListItem;
|
@@ -0,0 +1,13 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.Spinner = void 0;
|
7
|
+
const react_1 = __importDefault(require("react"));
|
8
|
+
const clsx_1 = __importDefault(require("clsx"));
|
9
|
+
const Spinner = ({ size = 'sm', className, label = 'Loading' }) => {
|
10
|
+
return (react_1.default.createElement("div", { className: "spinner__wrapper text-gray-600", "aria-label": label },
|
11
|
+
react_1.default.createElement("div", { className: (0, clsx_1.default)('spinner', size && `spinner--${size}`, className), role: "status" })));
|
12
|
+
};
|
13
|
+
exports.Spinner = Spinner;
|