@squiz/resource-browser 1.35.1-alpha.6 → 1.38.0-alpha.2

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 (164) hide show
  1. package/lib/Hooks/useChildResources.d.ts +1 -1
  2. package/lib/Hooks/useChildResources.js +2 -2
  3. package/lib/Hooks/useResource.js +2 -2
  4. package/lib/PreviewPanel/PreviewPanel.d.ts +5 -13
  5. package/lib/PreviewPanel/PreviewPanel.js +2 -53
  6. package/lib/PreviewPanel/details/MatrixResource.js +2 -2
  7. package/lib/ResourceBreadcrumb/ResourceBreadcrumb.js +2 -5
  8. package/lib/ResourceList/ResourceList.js +9 -15
  9. package/lib/ResourcePicker/ResourcePicker.js +2 -2
  10. package/lib/ResourcePicker/States/Error.js +3 -4
  11. package/lib/ResourcePicker/States/Loading.js +2 -2
  12. package/lib/ResourcePicker/States/Selected.js +3 -4
  13. package/lib/ResourcePickerContainer/ResourcePickerContainer.js +4 -3
  14. package/lib/SourceDropdown/SourceDropdown.js +9 -10
  15. package/lib/SourceList/SourceList.js +10 -13
  16. package/lib/index.css +3 -51
  17. package/package.json +4 -3
  18. package/src/Hooks/useChildResources.ts +1 -1
  19. package/src/Hooks/useResource.ts +1 -1
  20. package/src/Hooks/useSources.ts +1 -1
  21. package/src/PreviewPanel/PreviewPanel.tsx +3 -84
  22. package/src/PreviewPanel/details/MatrixResource.tsx +1 -1
  23. package/src/ResourceBreadcrumb/ResourceBreadcrumb.tsx +1 -1
  24. package/src/ResourceList/ResourceList.tsx +9 -18
  25. package/src/ResourcePicker/ResourcePicker.tsx +1 -1
  26. package/src/ResourcePicker/States/Error.tsx +1 -3
  27. package/src/ResourcePicker/States/Loading.tsx +1 -2
  28. package/src/ResourcePicker/States/Selected.tsx +1 -2
  29. package/src/ResourcePickerContainer/ResourcePickerContainer.spec.tsx +28 -0
  30. package/src/ResourcePickerContainer/ResourcePickerContainer.tsx +11 -9
  31. package/src/SourceDropdown/SourceDropdown.spec.tsx +5 -1
  32. package/src/SourceDropdown/SourceDropdown.tsx +2 -3
  33. package/src/SourceList/SourceList.tsx +16 -20
  34. package/src/index.scss +1 -3
  35. package/tailwind.config.cjs +6 -1
  36. package/vite.config.js +20 -0
  37. package/lib/Hooks/useAsync.d.ts +0 -21
  38. package/lib/Hooks/useAsync.js +0 -53
  39. package/lib/Icons/Generics/ArrowDown.d.ts +0 -15
  40. package/lib/Icons/Generics/ArrowDown.js +0 -23
  41. package/lib/Icons/Generics/ArrowRight.d.ts +0 -15
  42. package/lib/Icons/Generics/ArrowRight.js +0 -23
  43. package/lib/Icons/Generics/Back.d.ts +0 -4
  44. package/lib/Icons/Generics/Back.js +0 -12
  45. package/lib/Icons/Generics/Close.d.ts +0 -15
  46. package/lib/Icons/Generics/Close.js +0 -23
  47. package/lib/Icons/Generics/Empty.d.ts +0 -4
  48. package/lib/Icons/Generics/Empty.js +0 -12
  49. package/lib/Icons/Generics/Error.d.ts +0 -4
  50. package/lib/Icons/Generics/Error.js +0 -12
  51. package/lib/Icons/Generics/GenericIconMap.d.ts +0 -14
  52. package/lib/Icons/Generics/GenericIconMap.js +0 -18
  53. package/lib/Icons/Generics/ResourceSelect.d.ts +0 -15
  54. package/lib/Icons/Generics/ResourceSelect.js +0 -28
  55. package/lib/Icons/Generics/Retry.d.ts +0 -4
  56. package/lib/Icons/Generics/Retry.js +0 -12
  57. package/lib/Icons/Generics/Root.d.ts +0 -15
  58. package/lib/Icons/Generics/Root.js +0 -23
  59. package/lib/Icons/Generics/Selected.d.ts +0 -15
  60. package/lib/Icons/Generics/Selected.js +0 -23
  61. package/lib/Icons/Generics/index.d.ts +0 -10
  62. package/lib/Icons/Generics/index.js +0 -27
  63. package/lib/Icons/Icon.d.ts +0 -51
  64. package/lib/Icons/Icon.js +0 -42
  65. package/lib/Icons/MatrixResources/Audio.d.ts +0 -15
  66. package/lib/Icons/MatrixResources/Audio.js +0 -28
  67. package/lib/Icons/MatrixResources/Excel.d.ts +0 -15
  68. package/lib/Icons/MatrixResources/Excel.js +0 -27
  69. package/lib/Icons/MatrixResources/Folder.d.ts +0 -15
  70. package/lib/Icons/MatrixResources/Folder.js +0 -24
  71. package/lib/Icons/MatrixResources/GenericFile.d.ts +0 -15
  72. package/lib/Icons/MatrixResources/GenericFile.js +0 -28
  73. package/lib/Icons/MatrixResources/Image.d.ts +0 -15
  74. package/lib/Icons/MatrixResources/Image.js +0 -26
  75. package/lib/Icons/MatrixResources/MatrixResourceMap.d.ts +0 -15
  76. package/lib/Icons/MatrixResources/MatrixResourceMap.js +0 -19
  77. package/lib/Icons/MatrixResources/Page.d.ts +0 -15
  78. package/lib/Icons/MatrixResources/Page.js +0 -30
  79. package/lib/Icons/MatrixResources/Pdf.d.ts +0 -15
  80. package/lib/Icons/MatrixResources/Pdf.js +0 -31
  81. package/lib/Icons/MatrixResources/Powerpoint.d.ts +0 -15
  82. package/lib/Icons/MatrixResources/Powerpoint.js +0 -28
  83. package/lib/Icons/MatrixResources/Site.d.ts +0 -15
  84. package/lib/Icons/MatrixResources/Site.js +0 -30
  85. package/lib/Icons/MatrixResources/Video.d.ts +0 -15
  86. package/lib/Icons/MatrixResources/Video.js +0 -24
  87. package/lib/Icons/MatrixResources/Word.d.ts +0 -17
  88. package/lib/Icons/MatrixResources/Word.js +0 -28
  89. package/lib/Icons/MatrixResources/index.d.ts +0 -11
  90. package/lib/Icons/MatrixResources/index.js +0 -29
  91. package/lib/Modal/Modal.d.ts +0 -11
  92. package/lib/Modal/Modal.js +0 -46
  93. package/lib/Modal/ModalOpeningButton.d.ts +0 -10
  94. package/lib/Modal/ModalOpeningButton.js +0 -13
  95. package/lib/Modal/ModalTrigger.d.ts +0 -10
  96. package/lib/Modal/ModalTrigger.js +0 -25
  97. package/lib/PreviewPanel/PreviewModal.d.ts +0 -11
  98. package/lib/PreviewPanel/PreviewModal.js +0 -81
  99. package/lib/ResourceItem/ResourceItem.d.ts +0 -16
  100. package/lib/ResourceItem/ResourceItem.js +0 -28
  101. package/lib/ResourcePicker/ResetButton.d.ts +0 -5
  102. package/lib/ResourcePicker/ResetButton.js +0 -11
  103. package/lib/ResourceState/ResourceState.d.ts +0 -7
  104. package/lib/ResourceState/ResourceState.js +0 -16
  105. package/lib/Skeleton/List/SkeletonList.d.ts +0 -5
  106. package/lib/Skeleton/List/SkeletonList.js +0 -13
  107. package/lib/Skeleton/ListItem/SkeletonListItem.d.ts +0 -1
  108. package/lib/Skeleton/ListItem/SkeletonListItem.js +0 -15
  109. package/lib/Spinner/Spinner.d.ts +0 -8
  110. package/lib/Spinner/Spinner.js +0 -12
  111. package/src/Hooks/useAsync.spec.ts +0 -106
  112. package/src/Hooks/useAsync.ts +0 -62
  113. package/src/Icons/Generics/ArrowDown.tsx +0 -27
  114. package/src/Icons/Generics/ArrowRight.tsx +0 -27
  115. package/src/Icons/Generics/Back.tsx +0 -13
  116. package/src/Icons/Generics/Close.tsx +0 -26
  117. package/src/Icons/Generics/Empty.tsx +0 -13
  118. package/src/Icons/Generics/Error.tsx +0 -13
  119. package/src/Icons/Generics/GenericIconMap.ts +0 -18
  120. package/src/Icons/Generics/ResourceSelect.tsx +0 -40
  121. package/src/Icons/Generics/Retry.tsx +0 -13
  122. package/src/Icons/Generics/Root.tsx +0 -24
  123. package/src/Icons/Generics/Selected.tsx +0 -27
  124. package/src/Icons/Generics/index.tsx +0 -11
  125. package/src/Icons/Icon.spec.tsx +0 -62
  126. package/src/Icons/Icon.stories.tsx +0 -110
  127. package/src/Icons/Icon.tsx +0 -56
  128. package/src/Icons/MatrixResources/Audio.tsx +0 -30
  129. package/src/Icons/MatrixResources/Excel.tsx +0 -29
  130. package/src/Icons/MatrixResources/Folder.tsx +0 -29
  131. package/src/Icons/MatrixResources/GenericFile.tsx +0 -34
  132. package/src/Icons/MatrixResources/Image.tsx +0 -36
  133. package/src/Icons/MatrixResources/MatrixResourceMap.ts +0 -19
  134. package/src/Icons/MatrixResources/Page.tsx +0 -33
  135. package/src/Icons/MatrixResources/Pdf.tsx +0 -34
  136. package/src/Icons/MatrixResources/Powerpoint.tsx +0 -34
  137. package/src/Icons/MatrixResources/Site.tsx +0 -37
  138. package/src/Icons/MatrixResources/Video.tsx +0 -27
  139. package/src/Icons/MatrixResources/Word.tsx +0 -30
  140. package/src/Icons/MatrixResources/index.tsx +0 -12
  141. package/src/Modal/Modal.spec.tsx +0 -269
  142. package/src/Modal/Modal.tsx +0 -58
  143. package/src/Modal/ModalContainer.stories.tsx +0 -33
  144. package/src/Modal/ModalOpeningButton.tsx +0 -20
  145. package/src/Modal/ModalTrigger.tsx +0 -57
  146. package/src/PreviewPanel/PreviewModal.spec.tsx +0 -164
  147. package/src/PreviewPanel/PreviewModal.tsx +0 -92
  148. package/src/ResourceItem/ResourceItem.spec.tsx +0 -65
  149. package/src/ResourceItem/ResourceItem.tsx +0 -84
  150. package/src/ResourcePicker/ResetButton.tsx +0 -20
  151. package/src/ResourceState/ResourceState.spec.tsx +0 -26
  152. package/src/ResourceState/ResourceState.stories.tsx +0 -24
  153. package/src/ResourceState/ResourceState.tsx +0 -31
  154. package/src/Skeleton/List/SkeletonList.spec.tsx +0 -18
  155. package/src/Skeleton/List/SkeletonList.stories.tsx +0 -15
  156. package/src/Skeleton/List/SkeletonList.tsx +0 -16
  157. package/src/Skeleton/ListItem/SkeletonListItem.stories.tsx +0 -15
  158. package/src/Skeleton/ListItem/SkeletonListItem.tsx +0 -14
  159. package/src/Skeleton/_skeleton.scss +0 -15
  160. package/src/Spinner/Spinner.spec.tsx +0 -18
  161. package/src/Spinner/Spinner.stories.tsx +0 -26
  162. package/src/Spinner/Spinner.tsx +0 -18
  163. package/src/Spinner/_spinner.scss +0 -14
  164. /package/src/ResourceBreadcrumb/{ResourceBreadcrumb.scss → resource-breadcrumb.scss} +0 -0
@@ -8,7 +8,7 @@ type UseChildResourcesProps = {
8
8
  * Triggers a reload of the child resources when the source or current resource change.
9
9
  */
10
10
  export declare const useChildResources: ({ source, currentResource, onRequestChildren }: UseChildResourcesProps) => {
11
- data: never[] | Resource[];
11
+ data: Resource[] | never[];
12
12
  error: Error | null;
13
13
  isLoading: boolean;
14
14
  reload: () => void;
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useChildResources = void 0;
4
- const useAsync_1 = require("./useAsync");
4
+ const generic_browser_lib_1 = require("@squiz/generic-browser-lib");
5
5
  /**
6
6
  * Triggers a reload of the child resources when the source or current resource change.
7
7
  */
8
- const useChildResources = ({ source, currentResource, onRequestChildren }) => (0, useAsync_1.useAsync)({
8
+ const useChildResources = ({ source, currentResource, onRequestChildren }) => (0, generic_browser_lib_1.useAsync)({
9
9
  callback: () => (source ? onRequestChildren(source.source, currentResource || source.resource) : []),
10
10
  defaultValue: [],
11
11
  }, [source, currentResource]);
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useResource = void 0;
4
- const useAsync_1 = require("./useAsync");
4
+ const generic_browser_lib_1 = require("@squiz/generic-browser-lib");
5
5
  /**
6
6
  * Loads the resource indicated by the provided reference.
7
7
  */
8
- const useResource = ({ onRequestResource, reference }) => (0, useAsync_1.useAsync)({
8
+ const useResource = ({ onRequestResource, reference }) => (0, generic_browser_lib_1.useAsync)({
9
9
  callback: () => (reference ? onRequestResource(reference) : null),
10
10
  defaultValue: null,
11
11
  }, [reference?.source, reference?.resource]);
@@ -1,13 +1,5 @@
1
- import { OverlayTriggerState } from 'react-stately';
2
- import { DOMAttributes, FocusableElement } from '@react-types/shared';
3
- import { Resource } from '../types';
4
- export interface PreviewPanelProps {
5
- resource: Resource | null;
6
- modalState: OverlayTriggerState;
7
- previewModalOverlayProps: DOMAttributes<FocusableElement>;
8
- allowedTypes: string[] | undefined;
9
- onSelect: (resource: Resource) => void;
10
- onClose: () => void;
11
- }
12
- declare const PreviewPanel: ({ resource, previewModalOverlayProps, modalState, onSelect, onClose, }: PreviewPanelProps) => JSX.Element;
13
- export default PreviewPanel;
1
+ /// <reference types="react" />
2
+ import { PreviewPanelProps } from '@squiz/generic-browser-lib';
3
+ export type { PreviewPanelProps };
4
+ declare const _default: import("react").FC<import("@squiz/generic-browser-lib").PreviewPanelHOCProps & PreviewPanelProps>;
5
+ export default _default;
@@ -1,59 +1,8 @@
1
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
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
26
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
4
  };
28
5
  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"));
6
+ const generic_browser_lib_1 = require("@squiz/generic-browser-lib");
32
7
  const MatrixResource_1 = __importDefault(require("./details/MatrixResource"));
33
- const PreviewModal_1 = __importDefault(require("./PreviewModal"));
34
- const PreviewPanel = function ({ resource, previewModalOverlayProps, modalState, onSelect, onClose, }) {
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" },
45
- react_1.default.createElement(MatrixResource_1.default, { resource: resource })),
46
- react_1.default.createElement("div", { className: "flex justify-end border-t border-gray-300" },
47
- 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"))));
48
- return (react_1.default.createElement("div", { className: "sm:overflow-y-scroll sm:flex-1 sm:grow-[2] bg-white" },
49
- !isMobile && react_1.default.createElement("h3", { className: "sr-only" }, "Resource Details"),
50
- resource === null && (react_1.default.createElement("div", { className: "max-sm:hidden flex flex-col h-full" },
51
- react_1.default.createElement("div", { className: "flex flex-col grow items-center mt-20 mx-20" },
52
- react_1.default.createElement(Icon_1.default, { icon: 'resource-select', "aria-hidden": true }),
53
- react_1.default.createElement("div", { className: "text-sm text-gray-600 text-center mt-4" }, "Make a selection to see more info here.")),
54
- react_1.default.createElement("div", { className: "flex justify-end border-t border-gray-300" },
55
- 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")))),
56
- resource && isMobile && modalState.isOpen && (react_1.default.createElement(PreviewModal_1.default, { state: modalState, overlayProps: previewModalOverlayProps, onClose: onClose }, previewPanel)),
57
- resource && !isMobile && react_1.default.createElement("div", { className: "flex flex-col h-full" }, previewPanel)));
58
- };
59
- exports.default = PreviewPanel;
8
+ exports.default = (0, generic_browser_lib_1.PreviewPanelHOC)(MatrixResource_1.default);
@@ -4,12 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const react_1 = __importDefault(require("react"));
7
- const Icon_1 = __importDefault(require("../../Icons/Icon"));
7
+ const generic_browser_lib_1 = require("@squiz/generic-browser-lib");
8
8
  const StatusIndicator_1 = __importDefault(require("../../StatusIndicator/StatusIndicator"));
9
9
  const MatrixResource = ({ resource: { id, type, name, status } }) => {
10
10
  return (react_1.default.createElement("div", null,
11
11
  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" },
12
- react_1.default.createElement(Icon_1.default, { icon: type.code, resourceSource: "matrix", className: "w-14 h-14" }),
12
+ react_1.default.createElement(generic_browser_lib_1.Icon, { icon: type.code, resourceSource: "matrix", className: "w-14 h-14" }),
13
13
  react_1.default.createElement("div", { className: "mt-4 font-semibold text-base" }, name)),
14
14
  react_1.default.createElement("div", { className: "text-gray-800 mx-6 mt-4" },
15
15
  react_1.default.createElement("dl", { className: "flex flex-col text-sm" },
@@ -22,12 +22,9 @@ var __importStar = (this && this.__importStar) || function (mod) {
22
22
  __setModuleDefault(result, mod);
23
23
  return result;
24
24
  };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
25
  Object.defineProperty(exports, "__esModule", { value: true });
29
26
  const react_1 = __importStar(require("react"));
30
- const Icon_1 = __importDefault(require("../Icons/Icon"));
27
+ const generic_browser_lib_1 = require("@squiz/generic-browser-lib");
31
28
  const ResourceBreadcrumb = function ({ hierarchy, onBreadcrumbSelect, onReturnToRoot }) {
32
29
  // Track expanded state
33
30
  const [expandedHierarchy, setExpandedHierarchy] = (0, react_1.useState)(false);
@@ -43,7 +40,7 @@ const ResourceBreadcrumb = function ({ hierarchy, onBreadcrumbSelect, onReturnTo
43
40
  react_1.default.createElement("ol", { className: "flex flex-wrap items-center" },
44
41
  react_1.default.createElement("li", { className: "flex items-center mr-3" },
45
42
  react_1.default.createElement("button", { type: "button", onClick: onReturnToRoot },
46
- react_1.default.createElement(Icon_1.default, { icon: 'root', "aria-label": "Return to source list", className: "" }))),
43
+ react_1.default.createElement(generic_browser_lib_1.Icon, { icon: 'root', "aria-label": "Return to source list", className: "" }))),
47
44
  hierarchy.map(({ key, label, node }, index) => {
48
45
  return (react_1.default.createElement("li", { key: `${key}`, className: "resource-breadcrumb__item max-md:hidden flex items-center mr-2 before:content-['/'] before:mr-2" },
49
46
  index !== hierarchy.length - 1 && (react_1.default.createElement("button", { type: "button", onClick: () => onBreadcrumbSelect(node) },
@@ -22,14 +22,9 @@ var __importStar = (this && this.__importStar) || function (mod) {
22
22
  __setModuleDefault(result, mod);
23
23
  return result;
24
24
  };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
25
  Object.defineProperty(exports, "__esModule", { value: true });
29
26
  const react_1 = __importStar(require("react"));
30
- const ResourceItem_1 = __importDefault(require("../ResourceItem/ResourceItem"));
31
- const SkeletonListItem_1 = require("../Skeleton/ListItem/SkeletonListItem");
32
- const ResourceState_1 = __importDefault(require("../ResourceState/ResourceState"));
27
+ const generic_browser_lib_1 = require("@squiz/generic-browser-lib");
33
28
  const ResourceList = function ({ resources, selectedResource, previewModalState, isLoading, onResourceSelect, onResourceDrillDown, allowedTypes, handleReturnToRoot, handleReload, error, }) {
34
29
  const listRef = (0, react_1.useRef)(null);
35
30
  // When resources change, because we are on a new page, reset focus to the list
@@ -40,16 +35,15 @@ const ResourceList = function ({ resources, selectedResource, previewModalState,
40
35
  });
41
36
  }
42
37
  }, [resources]);
43
- 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 focus-visible:outline-0" },
44
- isLoading && (react_1.default.createElement(react_1.default.Fragment, null, [...Array(8)].map((_item, index) => {
45
- return react_1.default.createElement(SkeletonListItem_1.SkeletonListItem, { key: index });
46
- }))),
47
- !isLoading && error && react_1.default.createElement(ResourceState_1.default, { state: "error", message: error.message, handleReload: handleReload }),
48
- !isLoading && !error && resources.length === 0 && (react_1.default.createElement(ResourceState_1.default, { state: "empty", handleReload: handleReturnToRoot })),
49
- !isLoading &&
50
- !error &&
38
+ if (isLoading) {
39
+ return react_1.default.createElement(generic_browser_lib_1.SkeletonList, { itemCount: 8, ariaLabel: "loading Resource list", className: "text-sm font-semibold" });
40
+ }
41
+ return (react_1.default.createElement("ul", { ref: listRef, tabIndex: -1, "aria-label": `Resource list`, className: "flex flex-col text-sm font-semibold px-7 my-4 focus-visible:outline-0" },
42
+ error && react_1.default.createElement(generic_browser_lib_1.ResourceState, { state: "error", message: error.message, handleReload: handleReload }),
43
+ !error && resources.length === 0 && react_1.default.createElement(generic_browser_lib_1.ResourceState, { state: "empty", handleReload: handleReturnToRoot }),
44
+ !error &&
51
45
  resources.map((resource) => {
52
- return (react_1.default.createElement(ResourceItem_1.default, { key: resource.id, item: resource, selected: resource.id == selectedResource?.id, label: resource.name, type: resource.type.code, childCount: resource.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 }));
46
+ return (react_1.default.createElement(generic_browser_lib_1.ResourceItem, { key: resource.id, item: resource, selected: resource.id == selectedResource?.id, label: resource.name, type: resource.type.code, childCount: resource.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 }));
53
47
  })));
54
48
  };
55
49
  exports.default = ResourceList;
@@ -7,7 +7,7 @@ const react_1 = __importDefault(require("react"));
7
7
  const AdsClickRounded_1 = __importDefault(require("@mui/icons-material/AdsClickRounded"));
8
8
  const AddCircleOutlineRounded_1 = __importDefault(require("@mui/icons-material/AddCircleOutlineRounded"));
9
9
  const PhotoLibraryRounded_1 = __importDefault(require("@mui/icons-material/PhotoLibraryRounded"));
10
- const ModalTrigger_1 = __importDefault(require("../Modal/ModalTrigger"));
10
+ const generic_browser_lib_1 = require("@squiz/generic-browser-lib");
11
11
  const Error_1 = require("./States/Error");
12
12
  const Loading_1 = require("./States/Loading");
13
13
  const Selected_1 = require("./States/Selected");
@@ -17,7 +17,7 @@ const ResourcePicker = ({ resource, allowedTypes, error, isLoading, isDisabled,
17
17
  const isEmpty = resource === null && !isLoading && !error;
18
18
  return (react_1.default.createElement("div", { className: (0, clsx_1.default)('resource-picker', isDisabled && 'bg-gray-300') },
19
19
  isImagePicker ? (react_1.default.createElement(PhotoLibraryRounded_1.default, { "aria-hidden": true, className: "w-6 h-6" })) : (react_1.default.createElement(AdsClickRounded_1.default, { "aria-hidden": true, className: "w-6 h-6" })),
20
- isEmpty ? (react_1.default.createElement(ModalTrigger_1.default, { showLabel: true, label: isImagePicker ? `Choose image` : `Choose asset`, icon: react_1.default.createElement(AddCircleOutlineRounded_1.default, { "aria-hidden": true, className: `!w-4 !h-4 text-blue-300 ${isDisabled ? 'text-gray-600' : ''}` }), isDisabled: isDisabled }, children)) : (react_1.default.createElement("div", { className: "resource-picker-info" },
20
+ isEmpty ? (react_1.default.createElement(generic_browser_lib_1.ModalTrigger, { showLabel: true, label: isImagePicker ? `Choose image` : `Choose asset`, icon: react_1.default.createElement(AddCircleOutlineRounded_1.default, { "aria-hidden": true, className: `!w-4 !h-4 text-blue-300 ${isDisabled ? 'text-gray-600' : ''}` }), isDisabled: isDisabled }, children)) : (react_1.default.createElement("div", { className: "resource-picker-info" },
21
21
  react_1.default.createElement("div", { className: "resource-picker-info__layout" },
22
22
  isLoading && react_1.default.createElement(Loading_1.LoadingState, null),
23
23
  error && react_1.default.createElement(Error_1.ErrorState, { error: error, isDisabled: isDisabled, onClear: onClear }),
@@ -5,10 +5,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.ErrorState = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
- const Icon_1 = __importDefault(require("../../Icons/Icon"));
9
- const ResetButton_1 = require("../ResetButton");
8
+ const generic_browser_lib_1 = require("@squiz/generic-browser-lib");
10
9
  const ErrorState = ({ error, isDisabled, onClear }) => (react_1.default.createElement(react_1.default.Fragment, null,
11
- react_1.default.createElement(Icon_1.default, { icon: 'error', "aria-hidden": true, className: "w-6 h-6 text-red-300" }),
10
+ react_1.default.createElement(generic_browser_lib_1.Icon, { icon: 'error', "aria-hidden": true, className: "w-6 h-6 text-red-300" }),
12
11
  react_1.default.createElement("div", { className: "text-red-300 w-full" }, error.message),
13
- react_1.default.createElement(ResetButton_1.ResetButton, { isDisabled: isDisabled, onClick: onClear })));
12
+ react_1.default.createElement(generic_browser_lib_1.ResetButton, { isDisabled: isDisabled, onClick: onClear })));
14
13
  exports.ErrorState = ErrorState;
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.LoadingState = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
- const Spinner_1 = __importDefault(require("../../Spinner/Spinner"));
8
+ const generic_browser_lib_1 = require("@squiz/generic-browser-lib");
9
9
  const LoadingState = () => (react_1.default.createElement("div", { className: "col-start-2 col-end-2" },
10
- react_1.default.createElement(Spinner_1.default, { label: "Loading selection", className: "m-2" })));
10
+ react_1.default.createElement(generic_browser_lib_1.Spinner, { label: "Loading selection", className: "m-2" })));
11
11
  exports.LoadingState = LoadingState;
@@ -6,18 +6,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.SelectedState = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
8
  const pretty_bytes_1 = __importDefault(require("pretty-bytes"));
9
- const Icon_1 = __importDefault(require("../../Icons/Icon"));
9
+ const generic_browser_lib_1 = require("@squiz/generic-browser-lib");
10
10
  const StatusIndicator_1 = __importDefault(require("../../StatusIndicator/StatusIndicator"));
11
- const ResetButton_1 = require("../ResetButton");
12
11
  const SelectedState = ({ resource: { id, type, name, status, squizImage }, isDisabled, onClear, }) => {
13
12
  const fileSize = squizImage?.imageVariations?.original?.byteSize;
14
13
  const fileWidth = squizImage?.imageVariations?.original?.width;
15
14
  const fileHeight = squizImage?.imageVariations?.original?.height;
16
15
  return (react_1.default.createElement(react_1.default.Fragment, null,
17
16
  react_1.default.createElement(react_1.default.Fragment, null,
18
- react_1.default.createElement(Icon_1.default, { icon: type.code, resourceSource: "matrix", className: "w-4 h-4 flex self-center" }),
17
+ react_1.default.createElement(generic_browser_lib_1.Icon, { icon: type.code, resourceSource: "matrix", className: "w-4 h-4 flex self-center" }),
19
18
  react_1.default.createElement("div", { className: "justify-self-start self-center" }, name),
20
- react_1.default.createElement(ResetButton_1.ResetButton, { isDisabled: isDisabled, onClick: onClear })),
19
+ react_1.default.createElement(generic_browser_lib_1.ResetButton, { isDisabled: isDisabled, onClick: onClear })),
21
20
  react_1.default.createElement("dl", { className: "col-start-2 col-end-2 flex flex-row gap-1 justify-self-start items-center font-normal text-sm" },
22
21
  react_1.default.createElement("div", null,
23
22
  react_1.default.createElement("dt", { className: "hidden" },
@@ -28,20 +28,20 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  const react_1 = __importStar(require("react"));
30
30
  const react_stately_1 = require("react-stately");
31
+ const generic_browser_lib_1 = require("@squiz/generic-browser-lib");
31
32
  const SourceList_1 = __importDefault(require("../SourceList/SourceList"));
32
33
  const ResourceList_1 = __importDefault(require("../ResourceList/ResourceList"));
33
34
  const ResourceBreadcrumb_1 = __importDefault(require("../ResourceBreadcrumb/ResourceBreadcrumb"));
34
35
  const PreviewPanel_1 = __importDefault(require("../PreviewPanel/PreviewPanel"));
35
36
  const SourceDropdown_1 = __importDefault(require("../SourceDropdown/SourceDropdown"));
36
37
  const useResourcePath_1 = require("../Hooks/useResourcePath");
37
- const useAsync_1 = require("../Hooks/useAsync");
38
38
  const useChildResources_1 = require("../Hooks/useChildResources");
39
39
  function ResourcePickerContainer({ title, titleAriaProps, allowedTypes, onRequestSources, onRequestChildren, onChange, onClose, }) {
40
40
  const previewModalState = (0, react_stately_1.useOverlayTriggerState)({});
41
41
  const [selectedResource, setSelectedResource] = (0, react_1.useState)(null);
42
42
  const [previewModalOverlayProps, setPreviewModalOverlayProps] = (0, react_1.useState)({});
43
43
  const { source, currentResource, hierarchy, setSource, push, popUntil } = (0, useResourcePath_1.useResourcePath)();
44
- const { data: sources, isLoading: isSourceLoading, reload: handleSourceReload, error: sourceError, } = (0, useAsync_1.useAsync)({ callback: onRequestSources, defaultValue: [] }, []);
44
+ const { data: sources, isLoading: isSourceLoading, reload: handleSourceReload, error: sourceError, } = (0, generic_browser_lib_1.useAsync)({ callback: onRequestSources, defaultValue: [] }, []);
45
45
  const { data: resources, isLoading: isResourcesLoading, reload: handleResourceReload, error: resourceError, } = (0, useChildResources_1.useChildResources)({ source, currentResource, onRequestChildren });
46
46
  const handleResourceDrillDown = (0, react_1.useCallback)((resource) => {
47
47
  push(resource);
@@ -81,6 +81,7 @@ function ResourcePickerContainer({ title, titleAriaProps, allowedTypes, onReques
81
81
  hierarchy.length > 0 && (react_1.default.createElement(ResourceBreadcrumb_1.default, { hierarchy: hierarchy, onBreadcrumbSelect: popUntil, onReturnToRoot: handleReturnToRoot })),
82
82
  !source && (react_1.default.createElement(SourceList_1.default, { sources: sources, previewModalState: previewModalState, isLoading: isSourceLoading, onSourceSelect: handleSourceDrilldown, handleReload: handleSourceReload, error: sourceError })),
83
83
  source && (react_1.default.createElement(ResourceList_1.default, { previewModalState: previewModalState, resources: resources, selectedResource: selectedResource, isLoading: isResourcesLoading, onResourceSelect: handleResourceSelected, onResourceDrillDown: handleResourceDrillDown, allowedTypes: allowedTypes, handleReturnToRoot: handleReturnToRoot, handleReload: handleResourceReload, error: resourceError }))),
84
- react_1.default.createElement(PreviewPanel_1.default, { resource: selectedResource, modalState: previewModalState, previewModalOverlayProps: previewModalOverlayProps, allowedTypes: allowedTypes, onSelect: handleDetailSelect, onClose: handleDetailClose }))));
84
+ react_1.default.createElement("div", { className: "sm:overflow-y-scroll sm:flex-1 sm:grow-[2] bg-white" },
85
+ react_1.default.createElement(PreviewPanel_1.default, { resource: selectedResource, modalState: previewModalState, previewModalOverlayProps: previewModalOverlayProps, allowedTypes: allowedTypes, onSelect: handleDetailSelect, onClose: handleDetailClose })))));
85
86
  }
86
87
  exports.default = ResourcePickerContainer;
@@ -28,8 +28,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  const react_1 = __importStar(require("react"));
30
30
  const interactions_1 = require("@react-aria/interactions");
31
- const Spinner_1 = __importDefault(require("../Spinner/Spinner"));
32
- const Icon_1 = __importDefault(require("../Icons/Icon"));
31
+ const generic_browser_lib_1 = require("@squiz/generic-browser-lib");
33
32
  const uuid_1 = __importDefault(require("../uuid"));
34
33
  const useCategorisedSources_1 = require("../Hooks/useCategorisedSources");
35
34
  function SourceDropdown({ sources, selectedSource, isLoading, onRootSelect, onSourceSelect, }) {
@@ -66,20 +65,20 @@ function SourceDropdown({ sources, selectedSource, isLoading, onRootSelect, onSo
66
65
  react_1.default.createElement("button", { ref: buttonRef, type: "button", "aria-label": "Source quick select", "aria-expanded": isOpen, "aria-controls": `${uniqueId}-button-menu`, onClick: () => setIsOpen(!isOpen), className: "relative flex items-center text-sm font-semibold p-1.5 w-full" },
67
66
  selectedSource && (react_1.default.createElement(react_1.default.Fragment, null,
68
67
  react_1.default.createElement("span", { className: "sr-only" }, "current source "),
69
- react_1.default.createElement(Icon_1.default, { icon: selectedSource.resource?.type.code, resourceSource: "matrix", "aria-hidden": true, className: "mr-2.5 h-[20px] w-[20px]" }),
68
+ react_1.default.createElement(generic_browser_lib_1.Icon, { icon: selectedSource.resource?.type.code, resourceSource: "matrix", "aria-hidden": true, className: "mr-2.5 h-[20px] w-[20px]" }),
70
69
  react_1.default.createElement("div", { className: "truncate max-w-[200px]" }, selectedSource.resource?.name || selectedSource.source.name))),
71
70
  !selectedSource && (react_1.default.createElement(react_1.default.Fragment, null,
72
71
  react_1.default.createElement("span", { className: "sr-only" }, "view "),
73
- react_1.default.createElement(Icon_1.default, { icon: 'root', "aria-hidden": true, className: "mr-2.5 h-[20px] w-[20px]" }),
72
+ react_1.default.createElement(generic_browser_lib_1.Icon, { icon: 'root', "aria-hidden": true, className: "mr-2.5 h-[20px] w-[20px]" }),
74
73
  "All available sources")),
75
- react_1.default.createElement(Icon_1.default, { icon: 'arrow-down', "aria-hidden": true, className: "absolute right-3" })),
76
- react_1.default.createElement("ul", { id: `${uniqueId}-button-menu`, "aria-hidden": !isOpen, className: `absolute z-50 top-[calc(100%+5px)] -left-0.5 w-[calc(100%+4px)] bg-gray-100 border-2 rounded border-gray-300 p-2 ${!isOpen ? 'hidden' : ''}` },
74
+ react_1.default.createElement(generic_browser_lib_1.Icon, { icon: 'arrow-down', "aria-hidden": true, className: "absolute right-3" })),
75
+ react_1.default.createElement("ul", { id: `${uniqueId}-button-menu`, "aria-hidden": !isOpen, className: `absolute z-50 top-[calc(100%+5px)] -left-0.5 w-[calc(100%+4px)] bg-gray-100 border-2 rounded border-gray-300 p-2 overflow-y-scroll max-h-80 ${!isOpen ? 'hidden' : ''}` },
77
76
  react_1.default.createElement("li", { key: "return-root", className: "flex items-center text-sm font-semibold mb-2 bg-white border-1 rounded border-grey-200" },
78
77
  react_1.default.createElement("button", { type: "button", onClick: handleRootSelect, className: `relative grow flex items-center p-2.5 hover:bg-gray-100 focus:bg-gray-100` },
79
- react_1.default.createElement(Icon_1.default, { icon: 'root', "aria-hidden": true, className: "mr-2.5" }),
78
+ react_1.default.createElement(generic_browser_lib_1.Icon, { icon: 'root', "aria-hidden": true, className: "mr-2.5" }),
80
79
  "All available sources")),
81
80
  isLoading && (react_1.default.createElement("li", { className: "mt-2" },
82
- react_1.default.createElement(Spinner_1.default, { size: "sm", label: "Loading sources", className: "m-3" }))),
81
+ react_1.default.createElement(generic_browser_lib_1.Spinner, { size: "sm", label: "Loading sources", className: "m-3" }))),
83
82
  !isLoading &&
84
83
  categorisedSources.map(({ key, label, sources }, index) => {
85
84
  return (react_1.default.createElement("li", { key: key, className: `flex flex-col text-sm font-semibold text-grey-800 ${index > 0 ? 'mt-3' : ''}` },
@@ -89,9 +88,9 @@ function SourceDropdown({ sources, selectedSource, isLoading, onRootSelect, onSo
89
88
  const isSelectedSource = source.id === selectedSource?.source.id && resource?.id === selectedSource?.resource?.id;
90
89
  return (react_1.default.createElement("li", { key: `${source.id}-${resource?.id}`, className: "flex items-center bg-white border border-b-0 last:border-b border-grey-200 first:rounded-t last:rounded-b" },
91
90
  react_1.default.createElement("button", { type: "button", onClick: () => handleSourceClick({ source, resource }), className: `relative grow flex items-center p-2.5 hover:bg-gray-100 focus:bg-gray-100` },
92
- react_1.default.createElement(Icon_1.default, { icon: resource?.type.code, resourceSource: "matrix", "aria-label": resource?.type.name, className: "shrink-0 mr-2.5" }),
91
+ react_1.default.createElement(generic_browser_lib_1.Icon, { icon: resource?.type.code, resourceSource: "matrix", "aria-label": resource?.type.name, className: "shrink-0 mr-2.5" }),
93
92
  react_1.default.createElement("span", { className: "text-left mr-7" }, resource?.name || source.name),
94
- isSelectedSource && (react_1.default.createElement(Icon_1.default, { icon: 'selected', "aria-label": "selected", className: "absolute right-4" })))));
93
+ isSelectedSource && (react_1.default.createElement(generic_browser_lib_1.Icon, { icon: 'selected', "aria-label": "selected", className: "absolute right-4" })))));
95
94
  })))));
96
95
  }))));
97
96
  }
@@ -27,11 +27,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  const react_1 = __importStar(require("react"));
30
- const ResourceItem_1 = __importDefault(require("../ResourceItem/ResourceItem"));
31
- const SkeletonList_1 = require("../Skeleton/List/SkeletonList");
30
+ const generic_browser_lib_1 = require("@squiz/generic-browser-lib");
32
31
  const clsx_1 = __importDefault(require("clsx"));
33
32
  const useCategorisedSources_1 = require("../Hooks/useCategorisedSources");
34
- const ResourceState_1 = __importDefault(require("../ResourceState/ResourceState"));
35
33
  const SourceList = function ({ sources, previewModalState, isLoading, onSourceSelect, handleReload, error, }) {
36
34
  const categorisedSources = (0, useCategorisedSources_1.useCategorisedSources)(sources);
37
35
  const listRef = (0, react_1.useRef)(null);
@@ -42,21 +40,20 @@ const SourceList = function ({ sources, previewModalState, isLoading, onSourceSe
42
40
  });
43
41
  }
44
42
  }, []);
45
- return (react_1.default.createElement("ul", { ref: listRef, tabIndex: -1, "aria-label": `${isLoading ? 'loading' : ''} Source list`, className: (0, clsx_1.default)('flex flex-col bg-gray-100 min-h-full focus-visible:outline-0', !isLoading && 'px-7 py-4') },
46
- isLoading && (react_1.default.createElement(react_1.default.Fragment, null,
47
- react_1.default.createElement("li", null,
48
- react_1.default.createElement(SkeletonList_1.SkeletonList, { itemCount: 3 })),
49
- react_1.default.createElement("li", null,
50
- react_1.default.createElement(SkeletonList_1.SkeletonList, { itemCount: 3 })))),
51
- !isLoading && error && react_1.default.createElement(ResourceState_1.default, { state: "error", message: error.message, handleReload: handleReload }),
52
- !isLoading &&
53
- !error &&
43
+ if (isLoading) {
44
+ return (react_1.default.createElement("div", { className: "flex flex-col bg-gray-100 min-h-full", "aria-label": "loading Source list" },
45
+ react_1.default.createElement(generic_browser_lib_1.SkeletonList, { itemCount: 3 }),
46
+ react_1.default.createElement(generic_browser_lib_1.SkeletonList, { itemCount: 3 })));
47
+ }
48
+ return (react_1.default.createElement("ul", { ref: listRef, tabIndex: -1, "aria-label": `Source list`, className: (0, clsx_1.default)('flex flex-col bg-gray-100 min-h-full focus-visible:outline-0 px-7 py-4') },
49
+ error && react_1.default.createElement(generic_browser_lib_1.ResourceState, { state: "error", message: error.message, handleReload: handleReload }),
50
+ !error &&
54
51
  categorisedSources.map(({ key, label, sources }, index) => {
55
52
  return (react_1.default.createElement("li", { key: key, className: `flex flex-col text-sm font-semibold text-grey-800 ${index > 0 ? 'mt-3' : ''}` },
56
53
  react_1.default.createElement("div", { className: "relative flex justify-center before:w-full before:h-px before:bg-gray-300 before:absolute before:top-2/4 before:z-0" },
57
54
  react_1.default.createElement("span", { className: "z-10 bg-gray-100 px-2.5" }, label)),
58
55
  sources.length > 0 && (react_1.default.createElement("ul", { "aria-label": `${label} nodes`, className: "flex flex-col" }, sources.map(({ source, resource }) => {
59
- return (react_1.default.createElement(ResourceItem_1.default, { key: `${source.id}-${resource?.id}`, item: { source, resource }, label: resource?.name || source.name, type: resource?.type.code || 'folder', previewModalState: previewModalState, onSelect: onSourceSelect, className: "mt-3 rounded-lg" }));
56
+ return (react_1.default.createElement(generic_browser_lib_1.ResourceItem, { key: `${source.id}-${resource?.id}`, item: { source, resource }, label: resource?.name || source.name, type: resource?.type.code || 'folder', previewModalState: previewModalState, onSelect: onSourceSelect, className: "mt-3 rounded-lg", showChevron: true }));
60
57
  })))));
61
58
  })));
62
59
  };
package/lib/index.css CHANGED
@@ -577,6 +577,9 @@
577
577
  .squiz-rb-scope .h-screen {
578
578
  height: 100vh;
579
579
  }
580
+ .squiz-rb-scope .max-h-80 {
581
+ max-height: 20rem;
582
+ }
580
583
  .squiz-rb-scope .min-h-\[64px\] {
581
584
  min-height: 64px;
582
585
  }
@@ -920,57 +923,6 @@
920
923
  --tw-blur: blur(8px);
921
924
  filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
922
925
  }
923
- .squiz-rb-scope .spinner {
924
- display: inline-block;
925
- border-radius: 9999px;
926
- border-width: 2px;
927
- border-style: solid;
928
- border-color: currentColor;
929
- border-right-color: transparent;
930
- }
931
- @keyframes spin {
932
- to {
933
- transform: rotate(360deg);
934
- }
935
- }
936
- .squiz-rb-scope .spinner {
937
- animation: spin 1s linear infinite;
938
- vertical-align: -0.125em;
939
- }
940
- @media (prefers-reduced-motion: reduce) {
941
- @keyframes spin {
942
- }
943
- .squiz-rb-scope .spinner {
944
- animation: spin 1.5s linear infinite;
945
- }
946
- }
947
- .squiz-rb-scope .spinner {
948
- height: 20px;
949
- width: 20px;
950
- }
951
- .squiz-rb-scope .spinner__wrapper {
952
- display: flex;
953
- align-items: center;
954
- justify-content: center;
955
- }
956
- .squiz-rb-scope .spinner--md {
957
- height: 32px;
958
- width: 32px;
959
- }
960
- .squiz-rb-scope .animate-skeleton-pulse {
961
- animation: pulse 2s linear infinite;
962
- }
963
- @keyframes pulse {
964
- 0% {
965
- opacity: 1;
966
- }
967
- 50% {
968
- opacity: 0.45;
969
- }
970
- 100% {
971
- opacity: 1;
972
- }
973
- }
974
926
  .squiz-rb-scope .resource-breadcrumb--collapsed .resource-breadcrumb__label {
975
927
  max-width: 250px;
976
928
  cursor: pointer;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@squiz/resource-browser",
3
- "version": "1.35.1-alpha.6",
3
+ "version": "1.38.0-alpha.2",
4
4
  "main": "lib/index.js",
5
5
  "types": "lib/index.d.ts",
6
6
  "scripts": {
@@ -15,7 +15,8 @@
15
15
  },
16
16
  "dependencies": {
17
17
  "@mui/icons-material": "5.11.16",
18
- "@squiz/dx-json-schema-lib": "1.35.1-alpha.6",
18
+ "@squiz/dx-json-schema-lib": "1.38.0-alpha.2",
19
+ "@squiz/generic-browser-lib": "1.38.0-alpha.2",
19
20
  "pretty-bytes": "5.6.0",
20
21
  "react-aria": "3.23.1",
21
22
  "react-responsive": "9.0.2",
@@ -73,5 +74,5 @@
73
74
  "volta": {
74
75
  "node": "18.15.0"
75
76
  },
76
- "gitHead": "59c19bcba89607f7909e83d5d9f6895841870a3a"
77
+ "gitHead": "9c2f775a7d6607a73e5b25577d82be939d74ffec"
77
78
  }
@@ -1,5 +1,5 @@
1
1
  import { Resource, ScopedSource, Source } from '../types';
2
- import { useAsync } from './useAsync';
2
+ import { useAsync } from '@squiz/generic-browser-lib';
3
3
 
4
4
  type UseChildResourcesProps = {
5
5
  source: ScopedSource | null;
@@ -1,4 +1,4 @@
1
- import { useAsync } from './useAsync';
1
+ import { useAsync } from '@squiz/generic-browser-lib';
2
2
  import { Resource, ResourceReference } from '../types';
3
3
 
4
4
  type UseResourceProps = {
@@ -1,5 +1,5 @@
1
1
  import { Source } from '../types';
2
- import { useAsync } from './useAsync';
2
+ import { useAsync } from '@squiz/generic-browser-lib';
3
3
 
4
4
  type UseSourcesProps = {
5
5
  onRequestSources: () => Promise<Source[]>;
@@ -1,87 +1,6 @@
1
- import React, { useEffect } from 'react';
2
- import { useMediaQuery } from 'react-responsive';
3
- import { OverlayTriggerState } from 'react-stately';
4
- import { DOMAttributes, FocusableElement } from '@react-types/shared';
5
-
6
- import Icon, { IconOptions } from '../Icons/Icon';
1
+ import { PreviewPanelHOC, PreviewPanelProps } from '@squiz/generic-browser-lib';
7
2
  import MatrixResource from './details/MatrixResource';
8
- import { Resource } from '../types';
9
- import PreviewModal from './PreviewModal';
10
-
11
- export interface PreviewPanelProps {
12
- resource: Resource | null;
13
- modalState: OverlayTriggerState;
14
- previewModalOverlayProps: DOMAttributes<FocusableElement>;
15
- allowedTypes: string[] | undefined;
16
- onSelect: (resource: Resource) => void;
17
- onClose: () => void;
18
- }
19
-
20
- const PreviewPanel = function ({
21
- resource,
22
- previewModalOverlayProps,
23
- modalState,
24
- onSelect,
25
- onClose,
26
- }: PreviewPanelProps) {
27
- // Watch the media size to see if we are on mobile size
28
- const isMobile = useMediaQuery({ query: '(max-width: 640px)' });
29
-
30
- // If we are on mobile and the selected resource changes show the preview panel modal.
31
- useEffect(() => {
32
- if (!modalState.isOpen) {
33
- modalState.setOpen(Boolean(resource && isMobile));
34
- }
35
- }, [resource, isMobile]);
36
-
37
- const previewPanel = resource && (
38
- <>
39
- <div className="flex flex-col grow">
40
- <MatrixResource resource={resource} />
41
- </div>
42
- <div className="flex justify-end border-t border-gray-300">
43
- <button
44
- type="button"
45
- onClick={() => onSelect(resource)}
46
- className="rounded text-sm text-white bg-blue-300 py-2 px-2.5 m-5"
47
- >
48
- Select
49
- </button>
50
- </div>
51
- </>
52
- );
53
-
54
- return (
55
- <div className="sm:overflow-y-scroll sm:flex-1 sm:grow-[2] bg-white">
56
- {/* Dialog has its own title */}
57
- {!isMobile && <h3 className="sr-only">Resource Details</h3>}
58
-
59
- {/* Nothing selected, show an info message */}
60
- {resource === null && (
61
- <div className="max-sm:hidden flex flex-col h-full">
62
- <div className="flex flex-col grow items-center mt-20 mx-20">
63
- <Icon icon={'resource-select' as IconOptions} aria-hidden />
64
- <div className="text-sm text-gray-600 text-center mt-4">Make a selection to see more info here.</div>
65
- </div>
66
- <div className="flex justify-end border-t border-gray-300">
67
- <button disabled type="button" className="rounded text-sm text-white bg-blue-300/[.6] py-2 px-2.5 m-5">
68
- Select
69
- </button>
70
- </div>
71
- </div>
72
- )}
73
-
74
- {/* Resource details shows in a new modal / bottom popover on mobile size */}
75
- {resource && isMobile && modalState.isOpen && (
76
- <PreviewModal state={modalState} overlayProps={previewModalOverlayProps} onClose={onClose}>
77
- {previewPanel}
78
- </PreviewModal>
79
- )}
80
3
 
81
- {/* If not mobile, just print the details out */}
82
- {resource && !isMobile && <div className="flex flex-col h-full">{previewPanel}</div>}
83
- </div>
84
- );
85
- };
4
+ export type { PreviewPanelProps };
86
5
 
87
- export default PreviewPanel;
6
+ export default PreviewPanelHOC(MatrixResource);