@squiz/resource-browser 1.32.1-alpha.12

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.
Files changed (160) hide show
  1. package/.storybook/main.ts +23 -0
  2. package/.storybook/preview-head.html +15 -0
  3. package/.storybook/preview.ts +16 -0
  4. package/build.js +21 -0
  5. package/jest.config.ts +18 -0
  6. package/lib/Icons/Generics/ArrowDown.d.ts +15 -0
  7. package/lib/Icons/Generics/ArrowDown.js +23 -0
  8. package/lib/Icons/Generics/ArrowRight.d.ts +15 -0
  9. package/lib/Icons/Generics/ArrowRight.js +23 -0
  10. package/lib/Icons/Generics/Close.d.ts +15 -0
  11. package/lib/Icons/Generics/Close.js +23 -0
  12. package/lib/Icons/Generics/GenericIconMap.d.ts +10 -0
  13. package/lib/Icons/Generics/GenericIconMap.js +14 -0
  14. package/lib/Icons/Generics/ResourceSelect.d.ts +15 -0
  15. package/lib/Icons/Generics/ResourceSelect.js +28 -0
  16. package/lib/Icons/Generics/Root.d.ts +15 -0
  17. package/lib/Icons/Generics/Root.js +23 -0
  18. package/lib/Icons/Generics/Selected.d.ts +15 -0
  19. package/lib/Icons/Generics/Selected.js +23 -0
  20. package/lib/Icons/Generics/index.d.ts +6 -0
  21. package/lib/Icons/Generics/index.js +19 -0
  22. package/lib/Icons/Icon.d.ts +47 -0
  23. package/lib/Icons/Icon.js +44 -0
  24. package/lib/Icons/MatrixResources/Audio.d.ts +15 -0
  25. package/lib/Icons/MatrixResources/Audio.js +28 -0
  26. package/lib/Icons/MatrixResources/Excel.d.ts +15 -0
  27. package/lib/Icons/MatrixResources/Excel.js +27 -0
  28. package/lib/Icons/MatrixResources/Folder.d.ts +15 -0
  29. package/lib/Icons/MatrixResources/Folder.js +24 -0
  30. package/lib/Icons/MatrixResources/GenericFile.d.ts +15 -0
  31. package/lib/Icons/MatrixResources/GenericFile.js +28 -0
  32. package/lib/Icons/MatrixResources/Image.d.ts +15 -0
  33. package/lib/Icons/MatrixResources/Image.js +26 -0
  34. package/lib/Icons/MatrixResources/MatrixResourceMap.d.ts +15 -0
  35. package/lib/Icons/MatrixResources/MatrixResourceMap.js +19 -0
  36. package/lib/Icons/MatrixResources/Page.d.ts +15 -0
  37. package/lib/Icons/MatrixResources/Page.js +30 -0
  38. package/lib/Icons/MatrixResources/Pdf.d.ts +15 -0
  39. package/lib/Icons/MatrixResources/Pdf.js +31 -0
  40. package/lib/Icons/MatrixResources/Powerpoint.d.ts +15 -0
  41. package/lib/Icons/MatrixResources/Powerpoint.js +28 -0
  42. package/lib/Icons/MatrixResources/Site.d.ts +15 -0
  43. package/lib/Icons/MatrixResources/Site.js +30 -0
  44. package/lib/Icons/MatrixResources/Video.d.ts +15 -0
  45. package/lib/Icons/MatrixResources/Video.js +24 -0
  46. package/lib/Icons/MatrixResources/Word.d.ts +17 -0
  47. package/lib/Icons/MatrixResources/Word.js +28 -0
  48. package/lib/Icons/MatrixResources/index.d.ts +11 -0
  49. package/lib/Icons/MatrixResources/index.js +29 -0
  50. package/lib/Modal/Modal.d.ts +11 -0
  51. package/lib/Modal/Modal.js +46 -0
  52. package/lib/Modal/ModalOpeningButton.d.ts +10 -0
  53. package/lib/Modal/ModalOpeningButton.js +13 -0
  54. package/lib/Modal/ModalTrigger.d.ts +9 -0
  55. package/lib/Modal/ModalTrigger.js +24 -0
  56. package/lib/PreviewPanel/PreviewModal.d.ts +11 -0
  57. package/lib/PreviewPanel/PreviewModal.js +81 -0
  58. package/lib/PreviewPanel/PreviewPanel.d.ts +16 -0
  59. package/lib/PreviewPanel/PreviewPanel.js +87 -0
  60. package/lib/PreviewPanel/details/MatrixResource.d.ts +12 -0
  61. package/lib/PreviewPanel/details/MatrixResource.js +41 -0
  62. package/lib/ResourceBreadcrumb/ResourceBreadcrumb.d.ts +9 -0
  63. package/lib/ResourceBreadcrumb/ResourceBreadcrumb.js +20 -0
  64. package/lib/ResourceItem/ResourceItem.d.ts +19 -0
  65. package/lib/ResourceItem/ResourceItem.js +26 -0
  66. package/lib/ResourceList/ResourceList.d.ts +14 -0
  67. package/lib/ResourceList/ResourceList.js +51 -0
  68. package/lib/ResourcePickerContainer/ResourcePickerContainer.d.ts +15 -0
  69. package/lib/ResourcePickerContainer/ResourcePickerContainer.js +145 -0
  70. package/lib/Skeleton/List/SkeletonList.d.ts +6 -0
  71. package/lib/Skeleton/List/SkeletonList.js +13 -0
  72. package/lib/Skeleton/ListItem/SkeletonListItem.d.ts +2 -0
  73. package/lib/Skeleton/ListItem/SkeletonListItem.js +15 -0
  74. package/lib/SourceDropdown/SourceDropdown.d.ts +9 -0
  75. package/lib/SourceDropdown/SourceDropdown.js +106 -0
  76. package/lib/SourceList/SourceList.d.ts +14 -0
  77. package/lib/SourceList/SourceList.js +58 -0
  78. package/lib/Spinner/Spinner.d.ts +8 -0
  79. package/lib/Spinner/Spinner.js +12 -0
  80. package/lib/index.css +968 -0
  81. package/lib/index.d.ts +37 -0
  82. package/lib/index.js +15 -0
  83. package/lib/uuid.d.ts +1 -0
  84. package/lib/uuid.js +8 -0
  85. package/package.json +74 -0
  86. package/postcss.config.js +11 -0
  87. package/src/Icons/Generics/ArrowDown.tsx +27 -0
  88. package/src/Icons/Generics/ArrowRight.tsx +27 -0
  89. package/src/Icons/Generics/Close.tsx +26 -0
  90. package/src/Icons/Generics/GenericIconMap.ts +14 -0
  91. package/src/Icons/Generics/ResourceSelect.tsx +40 -0
  92. package/src/Icons/Generics/Root.tsx +24 -0
  93. package/src/Icons/Generics/Selected.tsx +27 -0
  94. package/src/Icons/Generics/index.tsx +7 -0
  95. package/src/Icons/Icon.spec.tsx +62 -0
  96. package/src/Icons/Icon.stories.tsx +105 -0
  97. package/src/Icons/Icon.tsx +61 -0
  98. package/src/Icons/MatrixResources/Audio.tsx +30 -0
  99. package/src/Icons/MatrixResources/Excel.tsx +29 -0
  100. package/src/Icons/MatrixResources/Folder.tsx +29 -0
  101. package/src/Icons/MatrixResources/GenericFile.tsx +34 -0
  102. package/src/Icons/MatrixResources/Image.tsx +36 -0
  103. package/src/Icons/MatrixResources/MatrixResourceMap.ts +19 -0
  104. package/src/Icons/MatrixResources/Page.tsx +33 -0
  105. package/src/Icons/MatrixResources/Pdf.tsx +34 -0
  106. package/src/Icons/MatrixResources/Powerpoint.tsx +34 -0
  107. package/src/Icons/MatrixResources/Site.tsx +37 -0
  108. package/src/Icons/MatrixResources/Video.tsx +27 -0
  109. package/src/Icons/MatrixResources/Word.tsx +30 -0
  110. package/src/Icons/MatrixResources/index.tsx +12 -0
  111. package/src/Modal/Modal.spec.tsx +244 -0
  112. package/src/Modal/Modal.tsx +58 -0
  113. package/src/Modal/ModalContainer.stories.tsx +33 -0
  114. package/src/Modal/ModalOpeningButton.tsx +20 -0
  115. package/src/Modal/ModalTrigger.tsx +45 -0
  116. package/src/PreviewPanel/PreviewModal.spec.tsx +164 -0
  117. package/src/PreviewPanel/PreviewModal.tsx +92 -0
  118. package/src/PreviewPanel/PreviewPanel.spec.tsx +197 -0
  119. package/src/PreviewPanel/PreviewPanel.stories.tsx +61 -0
  120. package/src/PreviewPanel/PreviewPanel.tsx +123 -0
  121. package/src/PreviewPanel/details/MatrixResource.tsx +59 -0
  122. package/src/ResourceBreadcrumb/ResourceBreadcrumb.spec.tsx +76 -0
  123. package/src/ResourceBreadcrumb/ResourceBreadcrumb.stories.tsx +24 -0
  124. package/src/ResourceBreadcrumb/ResourceBreadcrumb.tsx +39 -0
  125. package/src/ResourceBreadcrumb/sample-hierarchy.json +23 -0
  126. package/src/ResourceItem/ResourceItem.spec.tsx +69 -0
  127. package/src/ResourceItem/ResourceItem.tsx +82 -0
  128. package/src/ResourceList/ResourceList.spec.tsx +196 -0
  129. package/src/ResourceList/ResourceList.stories.tsx +40 -0
  130. package/src/ResourceList/ResourceList.tsx +74 -0
  131. package/src/ResourceList/sample-resources.json +75 -0
  132. package/src/ResourcePickerContainer/ResourcePickerContainer.spec.tsx +706 -0
  133. package/src/ResourcePickerContainer/ResourcePickerContainer.stories.tsx +56 -0
  134. package/src/ResourcePickerContainer/ResourcePickerContainer.tsx +224 -0
  135. package/src/Skeleton/List/SkeletonList.spec.tsx +18 -0
  136. package/src/Skeleton/List/SkeletonList.stories.tsx +15 -0
  137. package/src/Skeleton/List/SkeletonList.tsx +16 -0
  138. package/src/Skeleton/ListItem/SkeletonListItem.stories.tsx +15 -0
  139. package/src/Skeleton/ListItem/SkeletonListItem.tsx +14 -0
  140. package/src/SourceDropdown/SourceDropdown.spec.tsx +263 -0
  141. package/src/SourceDropdown/SourceDropdown.stories.tsx +36 -0
  142. package/src/SourceDropdown/SourceDropdown.tsx +175 -0
  143. package/src/SourceDropdown/sample-sources.json +110 -0
  144. package/src/SourceList/SourceList.spec.tsx +224 -0
  145. package/src/SourceList/SourceList.stories.tsx +40 -0
  146. package/src/SourceList/SourceList.tsx +93 -0
  147. package/src/SourceList/sample-sources.json +110 -0
  148. package/src/Spinner/Spinner.spec.tsx +18 -0
  149. package/src/Spinner/Spinner.stories.tsx +26 -0
  150. package/src/Spinner/Spinner.tsx +18 -0
  151. package/src/Spinner/_spinner.scss +11 -0
  152. package/src/__mocks__/JestHelpers.ts +65 -0
  153. package/src/__mocks__/jestHelpers.spec.ts +38 -0
  154. package/src/__mocks__/styleMock.ts +1 -0
  155. package/src/index.scss +7 -0
  156. package/src/index.stories.tsx +70 -0
  157. package/src/index.tsx +71 -0
  158. package/src/uuid.ts +7 -0
  159. package/tailwind.config.cjs +84 -0
  160. package/tsconfig.json +22 -0
@@ -0,0 +1,81 @@
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
+ const react_1 = __importStar(require("react"));
30
+ const react_aria_1 = require("react-aria");
31
+ const Icon_1 = __importDefault(require("../Icons/Icon"));
32
+ /*
33
+ This has to be a separate element otherwise the focus trap fails. Assuming this is because it needs
34
+ to fit inside the 'Overlay' as a form of context.
35
+ */
36
+ function PreviewModalContent({ children, onClose, ...props }) {
37
+ const ref = (0, react_1.useRef)(null);
38
+ const { dialogProps, titleProps } = (0, react_aria_1.useDialog)(props, ref);
39
+ return (react_1.default.createElement("div", { ...dialogProps, ref: ref, className: "h-full flex flex-col" },
40
+ react_1.default.createElement("h3", { ...titleProps, className: "sr-only" }, "Resource Details"),
41
+ react_1.default.createElement("button", { type: "button", "aria-label": "Close details", onClick: onClose, className: "absolute top-3 right-3" },
42
+ react_1.default.createElement(Icon_1.default, { icon: 'close', className: "" })),
43
+ children));
44
+ }
45
+ // Accept a ref for the top level modal
46
+ function PreviewModal({ state, overlayProps, children, onClose, ...props }) {
47
+ const modalRef = (0, react_1.useRef)(null);
48
+ const overlayRef = (0, react_1.useRef)(null);
49
+ const { modalProps, underlayProps } = (0, react_aria_1.useModalOverlay)({ isKeyboardDismissDisabled: true, ...props }, state, overlayRef);
50
+ // Need to handle the ESC escape hatch ourselves as we need to run onClose to deselect the current node
51
+ const { keyboardProps } = (0, react_aria_1.useKeyboard)({
52
+ onKeyDown: (e) => {
53
+ if (e.key === 'Escape') {
54
+ onClose();
55
+ }
56
+ else {
57
+ // Need to do this so TAB get handled up higher and cycles though the focus trap
58
+ e.continuePropagation();
59
+ }
60
+ },
61
+ });
62
+ (0, react_1.useEffect)(() => {
63
+ // Check if the click event has happened outside the modal
64
+ function handleClickOutside(event) {
65
+ if (modalRef.current && !modalRef.current.contains(event?.target)) {
66
+ onClose();
67
+ }
68
+ }
69
+ // Bind the event listener
70
+ document.addEventListener('mousedown', handleClickOutside);
71
+ return () => {
72
+ // Unbind the event listener on clean up
73
+ document.removeEventListener('mousedown', handleClickOutside);
74
+ };
75
+ }, [modalRef]);
76
+ return (react_1.default.createElement(react_aria_1.Overlay, null,
77
+ react_1.default.createElement("div", { ref: modalRef, ...underlayProps, ...keyboardProps, className: "fixed z-50 overflow-y-scroll bottom-0 w-full h-[50vh] bg-white border-t border-gray-300" },
78
+ react_1.default.createElement("div", { ref: overlayRef, ...modalProps, className: "h-full" },
79
+ react_1.default.createElement(PreviewModalContent, { ...overlayProps, onClose: onClose }, children)))));
80
+ }
81
+ exports.default = PreviewModal;
@@ -0,0 +1,16 @@
1
+ /// <reference types="react" />
2
+ import { OverlayTriggerState } from 'react-stately';
3
+ import { DOMAttributes, FocusableElement } from '@react-types/shared';
4
+ import { NodeIdentifier, ResourceDetail } from '../index';
5
+ export interface PreviewPanelProps {
6
+ node: NodeIdentifier | null;
7
+ resourceDetail: ResourceDetail | null;
8
+ isLoading: boolean;
9
+ modalState: OverlayTriggerState;
10
+ previewModalOverlayProps: DOMAttributes<FocusableElement>;
11
+ allowedTypes: string[] | undefined;
12
+ onSelect: (node: NodeIdentifier) => void;
13
+ onClose: () => void;
14
+ }
15
+ declare const PreviewPanel: ({ node, resourceDetail, isLoading, previewModalOverlayProps, modalState, onSelect, onClose, }: PreviewPanelProps) => JSX.Element;
16
+ export default PreviewPanel;
@@ -0,0 +1,87 @@
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
+ const react_1 = __importStar(require("react"));
30
+ const react_responsive_1 = require("react-responsive");
31
+ const Icon_1 = __importDefault(require("../Icons/Icon"));
32
+ const MatrixResource_1 = __importDefault(require("./details/MatrixResource"));
33
+ const PreviewModal_1 = __importDefault(require("./PreviewModal"));
34
+ const Spinner_1 = __importDefault(require("../Spinner/Spinner"));
35
+ const PreviewPanel = function ({ node, resourceDetail, isLoading, previewModalOverlayProps, modalState, onSelect, onClose, }) {
36
+ // Watch the media size to see if we are on mobile size
37
+ const isMobile = (0, react_responsive_1.useMediaQuery)({ query: '(max-width: 640px)' });
38
+ const previousIsMobile = (0, react_1.useRef)(null);
39
+ (0, react_1.useEffect)(() => {
40
+ if (node && isMobile) {
41
+ modalState.setOpen(true);
42
+ previousIsMobile.current = true;
43
+ }
44
+ else {
45
+ previousIsMobile.current = false;
46
+ }
47
+ }, []);
48
+ // If the media changes from mobile to non mobile or reverse toggle modal showing to undo the aria-hidden etc
49
+ (0, react_1.useEffect)(() => {
50
+ // Only trigger if we have a node selected, otherwise the modal will re-open itself as soon as its closed
51
+ if (node) {
52
+ if (previousIsMobile.current !== isMobile) {
53
+ previousIsMobile.current = isMobile;
54
+ if (isMobile) {
55
+ // If no mobile open the modal automatically
56
+ modalState.setOpen(true);
57
+ }
58
+ else {
59
+ // If not in mobile close the modal automatically
60
+ modalState.setOpen(false);
61
+ }
62
+ }
63
+ }
64
+ }, [node, isMobile, modalState]);
65
+ let previewPanel = node && resourceDetail && (react_1.default.createElement(react_1.default.Fragment, null,
66
+ react_1.default.createElement("div", { className: "flex flex-col grow" },
67
+ react_1.default.createElement(MatrixResource_1.default, { ...resourceDetail })),
68
+ react_1.default.createElement("div", { className: "flex justify-end border-t border-gray-300" },
69
+ react_1.default.createElement("button", { type: "button", onClick: () => onSelect(node), className: "rounded text-sm text-white bg-blue-300 py-2 px-2.5 m-5" }, "Select"))));
70
+ if (isLoading) {
71
+ previewPanel = (react_1.default.createElement("div", { className: "flex flex-col grow" },
72
+ react_1.default.createElement("div", { className: "flex flex-col grow items-center mt-20 mx-20" },
73
+ react_1.default.createElement(Spinner_1.default, null),
74
+ react_1.default.createElement("div", { className: "text-sm text-gray-600 text-center mt-4" }, "Loading info"))));
75
+ }
76
+ return (react_1.default.createElement("div", { className: "sm:overflow-y-scroll sm:flex-1 sm:grow-[2] bg-white" },
77
+ !isMobile && react_1.default.createElement("h3", { className: "sr-only" }, "Resource Details"),
78
+ node === null && (react_1.default.createElement("div", { className: "max-sm:hidden flex flex-col h-full" },
79
+ react_1.default.createElement("div", { className: "flex flex-col grow items-center mt-20 mx-20" },
80
+ react_1.default.createElement(Icon_1.default, { icon: 'resource-select', "aria-hidden": true }),
81
+ react_1.default.createElement("div", { className: "text-sm text-gray-600 text-center mt-4" }, "Make a selection to see more info here.")),
82
+ react_1.default.createElement("div", { className: "flex justify-end border-t border-gray-300" },
83
+ 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")))),
84
+ node && isMobile && modalState.isOpen && (react_1.default.createElement(PreviewModal_1.default, { state: modalState, overlayProps: previewModalOverlayProps, onClose: onClose }, previewPanel)),
85
+ node && !isMobile && react_1.default.createElement("div", { className: "flex flex-col h-full" }, previewPanel)));
86
+ };
87
+ exports.default = PreviewPanel;
@@ -0,0 +1,12 @@
1
+ /// <reference types="react" />
2
+ import { ResourceDetail } from '../../index';
3
+ export declare enum MatrixStatus {
4
+ UnderConstruction = "Under Construction",
5
+ Live = "Live"
6
+ }
7
+ export type MatrixAsset = ResourceDetail & {
8
+ assetId?: string;
9
+ status?: MatrixStatus;
10
+ };
11
+ declare const MatrixResource: ({ type, name, properties }: ResourceDetail) => JSX.Element;
12
+ export default MatrixResource;
@@ -0,0 +1,41 @@
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.MatrixStatus = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const Icon_1 = __importDefault(require("../../Icons/Icon"));
9
+ const statusColour = {
10
+ UnderConstruction: '#94D1F9',
11
+ Live: '#BEE509',
12
+ };
13
+ var MatrixStatus;
14
+ (function (MatrixStatus) {
15
+ MatrixStatus["UnderConstruction"] = "Under Construction";
16
+ MatrixStatus["Live"] = "Live";
17
+ })(MatrixStatus = exports.MatrixStatus || (exports.MatrixStatus = {}));
18
+ const MatrixResource = ({ type, name, properties }) => {
19
+ const assetId = properties.get('assetId');
20
+ const status = properties.get('status');
21
+ return (react_1.default.createElement("div", null,
22
+ react_1.default.createElement("div", { className: "flex flex-col items-center text-gray-800 mt-7 mx-5 pb-4 border-b border-gray-300" },
23
+ react_1.default.createElement(Icon_1.default, { icon: type, resourceSource: "matrix", className: "w-14 h-14" }),
24
+ react_1.default.createElement("div", { className: "mt-4 font-semibold text-base" }, name)),
25
+ react_1.default.createElement("div", { className: "text-gray-800 mx-6 mt-4" },
26
+ react_1.default.createElement("dl", { className: "flex flex-col text-sm" },
27
+ react_1.default.createElement("div", { className: "flex mb-2" },
28
+ react_1.default.createElement("dt", { className: "w-[60px] mr-4 text-gray-600" }, "Type"),
29
+ react_1.default.createElement("dd", { className: "font-semibold" }, type)),
30
+ react_1.default.createElement("div", { className: "flex mb-2" },
31
+ react_1.default.createElement("dt", { className: "w-[60px] mr-4 text-gray-600" }, "Asset ID"),
32
+ react_1.default.createElement("dd", { className: "font-semibold" },
33
+ "#",
34
+ assetId)),
35
+ react_1.default.createElement("div", { className: "flex mb-2" },
36
+ react_1.default.createElement("dt", { className: "w-[60px] mr-4 text-gray-600" }, "Status"),
37
+ react_1.default.createElement("dd", { className: "flex items-center font-semibold" },
38
+ react_1.default.createElement("span", { style: { backgroundColor: statusColour[status] }, className: "block rounded-full w-3 h-3 mr-1 border border-solid border-black border-opacity-20" }),
39
+ MatrixStatus[status]))))));
40
+ };
41
+ exports.default = MatrixResource;
@@ -0,0 +1,9 @@
1
+ /// <reference types="react" />
2
+ import { NodeIdentifier, Hierarchy } from '../index';
3
+ export interface ResourceBreadcrumbProps {
4
+ hierarchy: Array<Hierarchy>;
5
+ onBreadcrumbSelect: (node: NodeIdentifier) => void;
6
+ onReturnToRoot: () => void;
7
+ }
8
+ declare const ResourceBreadcrumb: ({ hierarchy, onBreadcrumbSelect, onReturnToRoot }: ResourceBreadcrumbProps) => JSX.Element;
9
+ export default ResourceBreadcrumb;
@@ -0,0 +1,20 @@
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
+ const react_1 = __importDefault(require("react"));
7
+ const Icon_1 = __importDefault(require("../Icons/Icon"));
8
+ const ResourceBreadcrumb = function ({ hierarchy, onBreadcrumbSelect, onReturnToRoot }) {
9
+ return (react_1.default.createElement("nav", { "aria-label": "Resource breadcrumb", className: "text-sm text-gray-600 px-7 my-5" },
10
+ react_1.default.createElement("ol", { className: "flex items-center" },
11
+ react_1.default.createElement("li", { className: "flex items-center mr-3" },
12
+ react_1.default.createElement("button", { type: "button", onClick: onReturnToRoot },
13
+ react_1.default.createElement(Icon_1.default, { icon: 'root', "aria-label": "Return to source list", className: "" }))),
14
+ hierarchy.map(({ id, label }, index) => {
15
+ return (react_1.default.createElement("li", { key: `${id.source}-${id.id}`, className: "mr-2 before:content-['/'] before:mr-2" },
16
+ index !== hierarchy.length - 1 && (react_1.default.createElement("button", { type: "button", onClick: () => onBreadcrumbSelect(id) }, label)),
17
+ index === hierarchy.length - 1 && react_1.default.createElement("span", { className: "font-semibold" }, label)));
18
+ }))));
19
+ };
20
+ exports.default = ResourceBreadcrumb;
@@ -0,0 +1,19 @@
1
+ /// <reference types="react" />
2
+ import { DOMAttributes, FocusableElement } from '@react-types/shared';
3
+ import { OverlayTriggerState } from 'react-stately';
4
+ import { NodeIdentifier } from '../index';
5
+ interface ResourceItem {
6
+ key: string;
7
+ id: NodeIdentifier;
8
+ selected: boolean;
9
+ label: string;
10
+ type: string;
11
+ childCount: number;
12
+ previewModalState: OverlayTriggerState;
13
+ onSelect: (node: NodeIdentifier, overlayProps: DOMAttributes<FocusableElement>) => void;
14
+ onDrillDown: (node: NodeIdentifier) => void;
15
+ className: string;
16
+ allowedTypes?: string[] | undefined;
17
+ }
18
+ declare const ResourceItem: ({ id, selected, label, type, childCount, previewModalState, onSelect, onDrillDown, className, allowedTypes, }: ResourceItem) => JSX.Element;
19
+ export default ResourceItem;
@@ -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
+ const react_1 = __importDefault(require("react"));
7
+ const react_aria_1 = require("react-aria");
8
+ const Icon_1 = __importDefault(require("../Icons/Icon"));
9
+ const ModalOpeningButton_1 = __importDefault(require("../Modal/ModalOpeningButton"));
10
+ const ResourceItem = ({ id, selected, label, type, childCount, previewModalState, onSelect, onDrillDown, className, allowedTypes, }) => {
11
+ const { triggerProps, overlayProps } = (0, react_aria_1.useOverlayTrigger)({ type: 'dialog' }, previewModalState);
12
+ const isDisabled = allowedTypes !== undefined && !allowedTypes.includes(type);
13
+ const title = isDisabled ? "You can't select this item" : label;
14
+ return (react_1.default.createElement("li", { className: `flex items-stretch p-1 bg-white border border-grey-200 ${className}` },
15
+ react_1.default.createElement(ModalOpeningButton_1.default, { type: "button", ...triggerProps, isDisabled: isDisabled, onPress: () => onSelect(id, overlayProps), className: `
16
+ relative grow flex items-center p-4 rounded ${selected ? 'bg-blue-100 text-blue-400' : ''} ${childCount > 0 ? 'mr-2' : ''} ${isDisabled ? 'font-normal text-gray-600 cursor-not-allowed' : 'hover:bg-gray-100 focus:bg-gray-100'}
17
+ `, title: title },
18
+ react_1.default.createElement(Icon_1.default, { icon: type, resourceSource: "matrix", "aria-label": type, className: `mr-4 shrink-0 ${isDisabled && 'opacity-40'}` }),
19
+ react_1.default.createElement("span", { className: "text-left break-all" }, label),
20
+ childCount <= 0 && react_1.default.createElement(Icon_1.default, { icon: 'arrow-right', className: "absolute right-5" })),
21
+ childCount > 0 && (react_1.default.createElement("button", { type: "button", "aria-label": `Drill down to ${label} children`, onClick: () => onDrillDown(id), className: `relative shrink-0 flex items-center p-4 rounded 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-100 focus:bg-gray-100` },
22
+ react_1.default.createElement("span", { className: "ml-auto flex items-center" },
23
+ react_1.default.createElement("span", { className: "truncate w-10 text-right", title: String(childCount) }, childCount),
24
+ react_1.default.createElement(Icon_1.default, { icon: 'arrow-right', className: "ml-1" }))))));
25
+ };
26
+ exports.default = ResourceItem;
@@ -0,0 +1,14 @@
1
+ /// <reference types="react" />
2
+ import { OverlayTriggerState } from 'react-stately';
3
+ import { DOMAttributes, FocusableElement } from '@react-types/shared';
4
+ import { NodeIdentifier, Resource } from '../index';
5
+ export interface ResourceListProps {
6
+ resources: Array<Resource>;
7
+ previewModalState: OverlayTriggerState;
8
+ isLoading: boolean;
9
+ onResourceSelect: (node: NodeIdentifier, overlayProps: DOMAttributes<FocusableElement>) => void;
10
+ onResourceDrillDown: (node: NodeIdentifier) => void;
11
+ allowedTypes?: string[] | undefined;
12
+ }
13
+ declare const ResourceList: ({ resources, previewModalState, isLoading, onResourceSelect, onResourceDrillDown, allowedTypes, }: ResourceListProps) => JSX.Element;
14
+ export default ResourceList;
@@ -0,0 +1,51 @@
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
+ const react_1 = __importStar(require("react"));
30
+ const ResourceItem_1 = __importDefault(require("../ResourceItem/ResourceItem"));
31
+ const SkeletonListItem_1 = require("../Skeleton/ListItem/SkeletonListItem");
32
+ const ResourceList = function ({ resources, previewModalState, isLoading, onResourceSelect, onResourceDrillDown, allowedTypes, }) {
33
+ const listRef = (0, react_1.useRef)(null);
34
+ // When resources change, because we are on a new page, reset focus to the list
35
+ (0, react_1.useEffect)(() => {
36
+ if (listRef.current) {
37
+ listRef.current?.focus({
38
+ preventScroll: true,
39
+ });
40
+ }
41
+ }, [resources]);
42
+ return (react_1.default.createElement("ul", { ref: listRef, tabIndex: -1, "aria-label": `${isLoading ? 'loading' : ''} Resource list`, className: "flex flex-col text-sm font-semibold px-7 my-4" },
43
+ isLoading && (react_1.default.createElement(react_1.default.Fragment, null, [...Array(8)].map((_item, index) => {
44
+ return react_1.default.createElement(SkeletonListItem_1.SkeletonListItem, { key: index });
45
+ }))),
46
+ !isLoading &&
47
+ resources.map(({ type, id, selected, label, childCount }) => {
48
+ return (react_1.default.createElement(ResourceItem_1.default, { key: `${id.source}-${id.id}`, id: id, selected: selected, label: label, type: type, childCount: childCount, previewModalState: previewModalState, onSelect: onResourceSelect, onDrillDown: onResourceDrillDown, className: "border-b-0 first:mt-0 first:rounded-t-lg last:rounded-b-lg last:border-b", allowedTypes: allowedTypes }));
49
+ })));
50
+ };
51
+ exports.default = ResourceList;
@@ -0,0 +1,15 @@
1
+ /// <reference types="react" />
2
+ import { DOMAttributes, FocusableElement } from '@react-types/shared';
3
+ import { NodeIdentifier, Source, Resource, ResourceDetail } from '../index';
4
+ interface ResourcePickerContainerProps {
5
+ title: string;
6
+ titleAriaProps: DOMAttributes<FocusableElement>;
7
+ allowedTypes: string[] | undefined;
8
+ onRequestSources: () => Promise<Source[]>;
9
+ onRequestChildren(id: NodeIdentifier): Promise<Resource[]>;
10
+ onRequestResource(id: NodeIdentifier): Promise<ResourceDetail | null>;
11
+ onChange(resource: NodeIdentifier | null): void;
12
+ onClose: () => void;
13
+ }
14
+ declare function ResourcePickerContainer({ title, titleAriaProps, allowedTypes, onRequestSources, onRequestChildren, onRequestResource, onChange, onClose, }: ResourcePickerContainerProps): JSX.Element;
15
+ export default ResourcePickerContainer;
@@ -0,0 +1,145 @@
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
+ const react_1 = __importStar(require("react"));
30
+ const react_stately_1 = require("react-stately");
31
+ const SourceList_1 = __importDefault(require("../SourceList/SourceList"));
32
+ const ResourceList_1 = __importDefault(require("../ResourceList/ResourceList"));
33
+ const ResourceBreadcrumb_1 = __importDefault(require("../ResourceBreadcrumb/ResourceBreadcrumb"));
34
+ const PreviewPanel_1 = __importDefault(require("../PreviewPanel/PreviewPanel"));
35
+ const SourceDropdown_1 = __importDefault(require("../SourceDropdown/SourceDropdown"));
36
+ function ResourcePickerContainer({ title, titleAriaProps, allowedTypes, onRequestSources, onRequestChildren, onRequestResource, onChange, onClose, }) {
37
+ const previewModalState = (0, react_stately_1.useOverlayTriggerState)({});
38
+ const [isSourceLoading, setIsSourceLoading] = (0, react_1.useState)(false);
39
+ const [isMainLoading, setIsMainLoading] = (0, react_1.useState)(false);
40
+ const [isSecondaryLoading, setIsSecondaryLoading] = (0, react_1.useState)(false);
41
+ const [currentNode, setCurrentNode] = (0, react_1.useState)(null);
42
+ const [selectedId, setSelectedId] = (0, react_1.useState)(null);
43
+ const [previewModalOverlayProps, setPreviewModalOverlayProps] = (0, react_1.useState)({});
44
+ const [hierarchy, setHierarchy] = (0, react_1.useState)([]);
45
+ const [sources, setSources] = (0, react_1.useState)([]);
46
+ const [resources, setResources] = (0, react_1.useState)([]);
47
+ const [selectedNodeDetails, setSelectedNodeDetails] = (0, react_1.useState)(null);
48
+ const adjustHierarchy = (node, resetHierarchy) => {
49
+ const isInHierarchy = hierarchy.find((hNode) => hNode.id === node);
50
+ let newHierarchy = [];
51
+ // If the node is already in the hierarchy we need to 'jump' back to it
52
+ if (isInHierarchy) {
53
+ let reachedNode = false;
54
+ // Read though the hierarchy and add any nodes before and including the current to the array
55
+ hierarchy.forEach((hNode) => {
56
+ if (reachedNode === false) {
57
+ newHierarchy.push(hNode);
58
+ if (hNode.id === node) {
59
+ reachedNode = true;
60
+ }
61
+ }
62
+ });
63
+ }
64
+ else {
65
+ let label = resources.find((resource) => resource.id === node)?.label || '';
66
+ // Might be a source
67
+ if (!label) {
68
+ const source = sources.find((source) => source.id === node.source);
69
+ if (source) {
70
+ label = source.nodes.find((resource) => resource.id === node)?.label || '';
71
+ }
72
+ }
73
+ // If we are jumping to a complete other spot and the container knows it, it can request a complete reset
74
+ if (!resetHierarchy) {
75
+ newHierarchy = hierarchy.slice();
76
+ }
77
+ newHierarchy.push({
78
+ id: node,
79
+ label,
80
+ });
81
+ }
82
+ setHierarchy(newHierarchy);
83
+ };
84
+ const handleResourceSelected = (0, react_1.useCallback)((node, overlayProps) => {
85
+ setPreviewModalOverlayProps(overlayProps);
86
+ setIsSecondaryLoading(true);
87
+ setSelectedId(node);
88
+ setSelectedNodeDetails(null);
89
+ onRequestResource(node).then((detail) => {
90
+ setSelectedNodeDetails(detail);
91
+ setIsSecondaryLoading(false);
92
+ });
93
+ }, []);
94
+ const handleResourceDrillDown = (0, react_1.useCallback)((node, resetHierarchy) => {
95
+ setIsMainLoading(true);
96
+ setCurrentNode(node);
97
+ adjustHierarchy(node, resetHierarchy || false);
98
+ setSelectedId(null);
99
+ setSelectedNodeDetails(null);
100
+ setResources([]);
101
+ onRequestChildren(node).then((resources) => {
102
+ setResources(resources);
103
+ setIsMainLoading(false);
104
+ });
105
+ }, [resources, sources]);
106
+ const handleReturnToRoot = (0, react_1.useCallback)(() => {
107
+ setCurrentNode(null);
108
+ setSelectedId(null);
109
+ setResources([]);
110
+ setHierarchy([]);
111
+ setSelectedNodeDetails(null);
112
+ }, []);
113
+ const handleDetailSelect = (0, react_1.useCallback)((node) => {
114
+ onChange(node);
115
+ onClose();
116
+ }, []);
117
+ const handleDetailClose = (0, react_1.useCallback)(() => {
118
+ setSelectedId(null);
119
+ }, []);
120
+ // On load of component fetch the list of sources
121
+ (0, react_1.useEffect)(() => {
122
+ setIsSourceLoading(true);
123
+ onRequestSources().then((sources) => {
124
+ setSources(sources);
125
+ setIsSourceLoading(false);
126
+ });
127
+ }, []);
128
+ return (react_1.default.createElement("div", { className: "relative flex flex-col h-full" },
129
+ react_1.default.createElement("div", { className: "flex items-center p-6" },
130
+ react_1.default.createElement("h2", { ...titleAriaProps, className: "text-xl leading-6 text-gray-800 font-semibold mr-6" }, title),
131
+ react_1.default.createElement("div", { className: "px-3 border-l border-grey-300 w-300px" },
132
+ react_1.default.createElement(SourceDropdown_1.default, { sources: sources, currentSource: hierarchy[0]?.id, isLoading: isSourceLoading, onSourceSelect: handleResourceDrillDown, onRootSelect: handleReturnToRoot })),
133
+ react_1.default.createElement("button", { type: "button", "aria-label": `Close ${title} dialog`, onClick: onClose, className: "absolute top-2 right-2 p-2.5 rounded hover:bg-blue-100 focus:bg-blue-100" },
134
+ react_1.default.createElement("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
135
+ react_1.default.createElement("path", { d: "M13.3 0.710017C13.1131 0.522765 12.8595 0.417532 12.595 0.417532C12.3305 0.417532 12.0768 0.522765 11.89 0.710017L6.99997 5.59002L2.10997 0.700017C1.92314 0.512765 1.66949 0.407532 1.40497 0.407532C1.14045 0.407532 0.886802 0.512765 0.699971 0.700017C0.309971 1.09002 0.309971 1.72002 0.699971 2.11002L5.58997 7.00002L0.699971 11.89C0.309971 12.28 0.309971 12.91 0.699971 13.3C1.08997 13.69 1.71997 13.69 2.10997 13.3L6.99997 8.41002L11.89 13.3C12.28 13.69 12.91 13.69 13.3 13.3C13.69 12.91 13.69 12.28 13.3 11.89L8.40997 7.00002L13.3 2.11002C13.68 1.73002 13.68 1.09002 13.3 0.710017Z", fill: "currentColor" })))),
136
+ react_1.default.createElement("div", { className: "flex border-t border-grey-300 h-[calc(100%-92px)]" },
137
+ react_1.default.createElement("div", { className: "overflow-y-scroll flex-1 grow-[3] border-r border-gray-300" },
138
+ react_1.default.createElement("h3", { className: "sr-only" }, "Resource List"),
139
+ currentNode === null && (react_1.default.createElement(SourceList_1.default, { sources: sources, previewModalState: previewModalState, isLoading: isSourceLoading, onSourceSelect: handleResourceSelected, onSourceDrillDown: handleResourceDrillDown, allowedTypes: allowedTypes })),
140
+ currentNode && (react_1.default.createElement(react_1.default.Fragment, null,
141
+ react_1.default.createElement(ResourceBreadcrumb_1.default, { hierarchy: hierarchy, onBreadcrumbSelect: handleResourceDrillDown, onReturnToRoot: handleReturnToRoot }),
142
+ react_1.default.createElement(ResourceList_1.default, { previewModalState: previewModalState, resources: resources, isLoading: isMainLoading, onResourceSelect: handleResourceSelected, onResourceDrillDown: handleResourceDrillDown, allowedTypes: allowedTypes })))),
143
+ react_1.default.createElement(PreviewPanel_1.default, { node: selectedId, resourceDetail: selectedNodeDetails, modalState: previewModalState, isLoading: isSecondaryLoading, previewModalOverlayProps: previewModalOverlayProps, allowedTypes: allowedTypes, onSelect: handleDetailSelect, onClose: handleDetailClose }))));
144
+ }
145
+ exports.default = ResourcePickerContainer;
@@ -0,0 +1,6 @@
1
+ /// <reference types="react" />
2
+ export type SkeletonListProps = {
3
+ itemCount: number;
4
+ className?: string;
5
+ };
6
+ export declare const SkeletonList: ({ itemCount, className }: SkeletonListProps) => JSX.Element;
@@ -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 }) => (react_1.default.createElement("ul", { className: (0, clsx_1.default)(`flex flex-col px-7 my-4`, className), "aria-label": "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,2 @@
1
+ /// <reference types="react" />
2
+ 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 border-b-0 border-grey-200 first:rounded-t-lg last:rounded-b-lg last:border-b" },
9
+ react_1.default.createElement("div", { className: "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,9 @@
1
+ /// <reference types="react" />
2
+ import type { Source, NodeIdentifier } from '../index';
3
+ export default function SourceDropdown({ sources, currentSource, isLoading, onRootSelect, onSourceSelect, }: {
4
+ sources: Array<Source>;
5
+ currentSource: NodeIdentifier | null;
6
+ isLoading: boolean;
7
+ onRootSelect: () => void;
8
+ onSourceSelect: (node: NodeIdentifier, resetHierarchy: boolean) => void;
9
+ }): JSX.Element;