@squiz/resource-browser 1.32.1-alpha.28 → 1.32.1-alpha.30

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 (58) hide show
  1. package/lib/Modal/ModalTrigger.d.ts +2 -1
  2. package/lib/Modal/ModalTrigger.js +5 -4
  3. package/lib/PreviewPanel/PreviewPanel.d.ts +0 -1
  4. package/lib/PreviewPanel/details/MatrixResource.d.ts +0 -1
  5. package/lib/PreviewPanel/details/MatrixResource.js +2 -17
  6. package/lib/ResourceBreadcrumb/ResourceBreadcrumb.d.ts +0 -1
  7. package/lib/ResourceError/ResourceError.d.ts +0 -1
  8. package/lib/ResourceItem/ResourceItem.d.ts +0 -1
  9. package/lib/ResourceItem/ResourceItem.js +7 -6
  10. package/lib/ResourceList/ResourceList.d.ts +0 -1
  11. package/lib/ResourcePickerContainer/ResourcePickerContainer.d.ts +0 -1
  12. package/lib/ResourcePickerContainer/ResourcePickerContainer.js +4 -4
  13. package/lib/Skeleton/List/SkeletonList.d.ts +0 -1
  14. package/lib/Skeleton/ListItem/SkeletonListItem.d.ts +0 -1
  15. package/lib/Skeleton/ListItem/SkeletonListItem.js +1 -1
  16. package/lib/SourceDropdown/SourceDropdown.d.ts +0 -1
  17. package/lib/SourceDropdown/SourceDropdown.js +5 -5
  18. package/lib/SourceList/SourceList.d.ts +0 -1
  19. package/lib/Spinner/Spinner.d.ts +1 -1
  20. package/lib/Spinner/Spinner.js +1 -1
  21. package/lib/StatusIndicator/StatusIndicator.d.ts +6 -0
  22. package/lib/StatusIndicator/StatusIndicator.js +26 -0
  23. package/lib/index.css +187 -23
  24. package/lib/index.d.ts +2 -5
  25. package/lib/index.js +9 -3
  26. package/package.json +5 -3
  27. package/src/Icons/Icon.stories.tsx +5 -0
  28. package/src/Modal/Modal.spec.tsx +25 -0
  29. package/src/Modal/ModalTrigger.tsx +14 -2
  30. package/src/PreviewPanel/details/MatrixResource.tsx +2 -22
  31. package/src/ResourceError/ResourceError.spec.tsx +0 -4
  32. package/src/ResourceItem/ResourceItem.spec.tsx +0 -4
  33. package/src/ResourceItem/ResourceItem.tsx +9 -7
  34. package/src/ResourcePicker/ResetButton.tsx +14 -0
  35. package/src/ResourcePicker/ResourcePicker.spec.tsx +81 -0
  36. package/src/ResourcePicker/ResourcePicker.stories.tsx +62 -0
  37. package/src/ResourcePicker/ResourcePicker.tsx +55 -0
  38. package/src/ResourcePicker/States/Error.tsx +12 -0
  39. package/src/ResourcePicker/States/Loading.tsx +9 -0
  40. package/src/ResourcePicker/States/Selected.tsx +51 -0
  41. package/src/ResourcePicker/mock-image-resource.json +51 -0
  42. package/src/ResourcePicker/mock-resource.json +15 -0
  43. package/src/ResourcePicker/resource-picker.scss +13 -0
  44. package/src/ResourcePickerContainer/ResourcePickerContainer.stories.tsx +1 -1
  45. package/src/ResourcePickerContainer/ResourcePickerContainer.tsx +4 -4
  46. package/src/Skeleton/ListItem/SkeletonListItem.tsx +1 -1
  47. package/src/Skeleton/_skeleton.scss +15 -0
  48. package/src/SourceDropdown/SourceDropdown.tsx +5 -7
  49. package/src/Spinner/Spinner.stories.tsx +2 -2
  50. package/src/Spinner/Spinner.tsx +2 -2
  51. package/src/Spinner/_spinner.scss +8 -5
  52. package/src/StatusIndicator/StatusIndicator.stories.tsx +83 -0
  53. package/src/StatusIndicator/StatusIndicator.tsx +35 -0
  54. package/src/index.scss +15 -0
  55. package/src/index.spec.tsx +44 -0
  56. package/src/index.stories.tsx +15 -17
  57. package/src/index.tsx +41 -20
  58. package/src/types.d.ts +5 -4
@@ -1,9 +1,10 @@
1
1
  import React from 'react';
2
2
  import { DOMAttributes, FocusableElement } from '@react-types/shared';
3
- declare function ModalTrigger({ label, showLabel, icon, children, ...props }: {
3
+ declare function ModalTrigger({ label, showLabel, icon, isDisabled, children, ...props }: {
4
4
  label: string;
5
5
  showLabel?: boolean;
6
6
  icon?: React.ReactNode;
7
+ isDisabled?: boolean;
7
8
  children: (onClose: () => void, titleProps: DOMAttributes<FocusableElement>) => React.ReactElement;
8
9
  }): JSX.Element;
9
10
  export default ModalTrigger;
@@ -8,7 +8,8 @@ const react_aria_1 = require("react-aria");
8
8
  const react_stately_1 = require("react-stately");
9
9
  const Modal_1 = __importDefault(require("./Modal"));
10
10
  const ModalOpeningButton_1 = __importDefault(require("./ModalOpeningButton"));
11
- function ModalTrigger({ label, showLabel, icon, children, ...props }) {
11
+ const clsx_1 = __importDefault(require("clsx"));
12
+ function ModalTrigger({ label, showLabel, icon, isDisabled, children, ...props }) {
12
13
  const state = (0, react_stately_1.useOverlayTriggerState)(props);
13
14
  const { triggerProps, overlayProps } = (0, react_aria_1.useOverlayTrigger)({ type: 'dialog' }, state);
14
15
  let ariaAttr = {};
@@ -16,9 +17,9 @@ function ModalTrigger({ label, showLabel, icon, children, ...props }) {
16
17
  ariaAttr = { ...ariaAttr, 'aria-label': label };
17
18
  }
18
19
  return (react_1.default.createElement(react_1.default.Fragment, null,
19
- react_1.default.createElement(ModalOpeningButton_1.default, { type: "button", ...triggerProps, ...ariaAttr },
20
- showLabel && label,
21
- icon),
20
+ react_1.default.createElement(ModalOpeningButton_1.default, { type: "button", ...triggerProps, ...ariaAttr, isDisabled: isDisabled, className: (0, clsx_1.default)('flex p-1 px-1.5 rounded mr-auto text-blue-300 hover:bg-blue-100 focus:bg-blue-100 focus:outline-none', isDisabled && 'hover:bg-transparent cursor-not-allowed text-gray-600') },
21
+ icon,
22
+ showLabel && react_1.default.createElement("span", { className: "ml-1 text-sm leading-4" }, label)),
22
23
  state.isOpen && (react_1.default.createElement(Modal_1.default, { isDismissable: true, state: state, overlayProps: overlayProps }, (titleProps) => children(state.close, titleProps)))));
23
24
  }
24
25
  exports.default = ModalTrigger;
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import { OverlayTriggerState } from 'react-stately';
3
2
  import { DOMAttributes, FocusableElement } from '@react-types/shared';
4
3
  import { Resource } from '../types';
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import { Resource } from '../../types';
3
2
  type MatrixResourceProps = {
4
3
  resource: Resource;
@@ -5,23 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const react_1 = __importDefault(require("react"));
7
7
  const Icon_1 = __importDefault(require("../../Icons/Icon"));
8
- const statusColour = {
9
- // Duplicated from the Matrix repository.
10
- // src/Api/AssetManagementApi/Constants/AssetStatuses.php - contains a list of possible statuses.
11
- // frontend/src/styles/common/status-colors.scss - contains the colours used for those statuses in Matrix.
12
- unknown: '#ff0000',
13
- archived: '#c98a67',
14
- under_construction: '#94d1f9',
15
- pending_approval: '#d0bbf0',
16
- approved_to_go_live: '#f7eaa2',
17
- live: '#bfe60a',
18
- up_for_review: '#72cd32',
19
- safe_editing: '#ff97b0',
20
- safe_editing_pending_approval: '#d688db',
21
- safe_edit_approved_to_go_live: '#ffb34a',
22
- };
8
+ const StatusIndicator_1 = __importDefault(require("../../StatusIndicator/StatusIndicator"));
23
9
  const MatrixResource = ({ resource: { id, type, name, status } }) => {
24
- const color = statusColour[status.code] || statusColour.unknown;
25
10
  return (react_1.default.createElement("div", null,
26
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" },
27
12
  react_1.default.createElement(Icon_1.default, { icon: type.code, resourceSource: "matrix", className: "w-14 h-14" }),
@@ -39,7 +24,7 @@ const MatrixResource = ({ resource: { id, type, name, status } }) => {
39
24
  react_1.default.createElement("div", { className: "flex mb-2" },
40
25
  react_1.default.createElement("dt", { className: "w-[60px] mr-4 text-gray-600" }, "Status"),
41
26
  react_1.default.createElement("dd", { className: "flex items-center font-semibold" },
42
- react_1.default.createElement("span", { style: { backgroundColor: color }, className: "block rounded-full w-3 h-3 mr-1 border border-solid border-black border-opacity-20" }),
27
+ react_1.default.createElement(StatusIndicator_1.default, { status: status }),
43
28
  status.name))))));
44
29
  };
45
30
  exports.default = MatrixResource;
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import { Hierarchy } from '../types';
3
2
  export interface ResourceBreadcrumbProps<T> {
4
3
  hierarchy: Hierarchy<T>;
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  interface ResourceError {
3
2
  errorMessage: string;
4
3
  handleReload: () => void;
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import { DOMAttributes, FocusableElement } from '@react-types/shared';
3
2
  import { OverlayTriggerState } from 'react-stately';
4
3
  interface ResourceItem<T> {
@@ -11,16 +11,17 @@ const ResourceItem = ({ item, selected, label, type, childCount, previewModalSta
11
11
  const { triggerProps, overlayProps } = (0, react_aria_1.useOverlayTrigger)({ type: 'dialog' }, previewModalState);
12
12
  const isDisabled = allowedTypes !== undefined && !allowedTypes.includes(type);
13
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}` },
14
+ return (react_1.default.createElement("li", { className: `flex items-stretch p-1 bg-white border border-grey-200 min-h-[64px] ${className}` },
15
15
  react_1.default.createElement(ModalOpeningButton_1.default, { type: "button", ...triggerProps, isDisabled: isDisabled, onPress: () => onSelect(item, 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'}
16
+ relative grow flex items-center px-4 py-2 rounded outline-0 ${selected ? 'bg-blue-100 text-blue-400' : ''} ${childCount > 0 ? 'mr-2' : ''} ${isDisabled ? 'font-normal text-gray-600 cursor-not-allowed' : 'hover:bg-gray-50 focus:bg-gray-50'}
17
17
  `, title: title },
18
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(item), 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` },
19
+ react_1.default.createElement("span", { className: `relative flex items-center ${selected ? 'mr-8' : ''}` },
20
+ react_1.default.createElement("span", { className: "line-clamp-2 text-left break-word" }, label),
21
+ selected && react_1.default.createElement(Icon_1.default, { icon: 'selected', "aria-label": "selected", className: "absolute -right-8" }))),
22
+ childCount > 0 && (react_1.default.createElement("button", { type: "button", "aria-label": `Drill down to ${label} children`, onClick: () => onDrillDown(item), className: `relative shrink-0 flex items-center p-4 rounded outline-0 before:w-px before:h-[calc(100%-0.75rem)] before:bg-gray-200 before:absolute before:top-1.5 before:-left-1 hover:bg-gray-50 focus:bg-gray-50` },
22
23
  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("span", { className: "truncate w-14 text-right", title: String(childCount) }, childCount),
24
25
  react_1.default.createElement(Icon_1.default, { icon: 'arrow-right', className: "ml-1" }))))));
25
26
  };
26
27
  exports.default = ResourceItem;
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import { OverlayTriggerState } from 'react-stately';
3
2
  import { DOMAttributes, FocusableElement } from '@react-types/shared';
4
3
  import { Resource } from '../types';
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import { DOMAttributes, FocusableElement } from '@react-types/shared';
3
2
  import { Source, Resource, HydratedResourceReference } from '../types';
4
3
  interface ResourcePickerContainerProps {
@@ -67,15 +67,15 @@ function ResourcePickerContainer({ title, titleAriaProps, allowedTypes, onReques
67
67
  (0, react_1.useEffect)(() => {
68
68
  setSelectedResource(null);
69
69
  }, [hierarchy]);
70
- return (react_1.default.createElement("div", { className: "relative flex flex-col h-full" },
71
- react_1.default.createElement("div", { className: "flex items-center p-6" },
70
+ return (react_1.default.createElement("div", { className: "relative flex flex-col h-full text-gray-800 antialiased" },
71
+ react_1.default.createElement("div", { className: "flex items-center p-4.5" },
72
72
  react_1.default.createElement("h2", { ...titleAriaProps, className: "text-xl leading-6 text-gray-800 font-semibold mr-6" }, title),
73
- react_1.default.createElement("div", { className: "px-3 border-l border-grey-300 w-300px" },
73
+ react_1.default.createElement("div", { className: "px-3 border-l border-gray-300 w-300px" },
74
74
  react_1.default.createElement(SourceDropdown_1.default, { sources: sources, selectedSource: source, isLoading: isSourceLoading, onSourceSelect: handleSourceDrilldown, onRootSelect: handleReturnToRoot })),
75
75
  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" },
76
76
  react_1.default.createElement("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
77
77
  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" })))),
78
- react_1.default.createElement("div", { className: "flex border-t border-grey-300 h-[calc(100%-92px)]" },
78
+ react_1.default.createElement("div", { className: "flex border-t border-gray-300 h-[calc(100%-72px)]" },
79
79
  react_1.default.createElement("div", { className: "overflow-y-scroll flex-1 grow-[3] border-r border-gray-300" },
80
80
  react_1.default.createElement("h3", { className: "sr-only" }, "Resource List"),
81
81
  hierarchy.length > 0 && (react_1.default.createElement(ResourceBreadcrumb_1.default, { hierarchy: hierarchy, onBreadcrumbSelect: popUntil, onReturnToRoot: handleReturnToRoot })),
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  export type SkeletonListProps = {
3
2
  itemCount: number;
4
3
  className?: string;
@@ -1,2 +1 @@
1
- /// <reference types="react" />
2
1
  export declare const SkeletonListItem: () => JSX.Element;
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.SkeletonListItem = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
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" },
9
+ react_1.default.createElement("div", { className: "animate-skeleton-pulse grid grid-cols-[24px_1fr_45px] w-full flex items-center p-4 rounded" },
10
10
  react_1.default.createElement("span", { className: "w-6 h-6 bg-gray-200 rounded-full" }),
11
11
  react_1.default.createElement("div", { className: "w-full d-flex flex-col mx-4" },
12
12
  react_1.default.createElement("div", { className: "mb-1 w-3/4 h-2 bg-gray-200 rounded" }),
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import type { Source, ScopedSource } from '../types';
3
2
  export default function SourceDropdown({ sources, selectedSource, isLoading, onRootSelect, onSourceSelect, }: {
4
3
  sources: Source[];
@@ -63,14 +63,14 @@ function SourceDropdown({ sources, selectedSource, isLoading, onRootSelect, onSo
63
63
  onRootSelect();
64
64
  };
65
65
  return (react_1.default.createElement("div", { ...focusWithinProps, ...keyboardProps, className: "relative w-72 border border-2 rounded border-gray-300" },
66
- 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-2 w-full" },
66
+ 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
67
  selectedSource && (react_1.default.createElement(react_1.default.Fragment, null,
68
68
  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" }),
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]" }),
70
70
  react_1.default.createElement("div", { className: "truncate max-w-[200px]" }, selectedSource.resource?.name || selectedSource.source.name))),
71
71
  !selectedSource && (react_1.default.createElement(react_1.default.Fragment, null,
72
72
  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" }),
73
+ react_1.default.createElement(Icon_1.default, { icon: 'root', "aria-hidden": true, className: "mr-2.5 h-[20px] w-[20px]" }),
74
74
  "All available sources")),
75
75
  react_1.default.createElement(Icon_1.default, { icon: 'arrow-down', "aria-hidden": true, className: "absolute right-3" })),
76
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 border-2 rounded border-gray-300 p-2 ${!isOpen ? 'hidden' : ''}` },
@@ -79,7 +79,7 @@ function SourceDropdown({ sources, selectedSource, isLoading, onRootSelect, onSo
79
79
  react_1.default.createElement(Icon_1.default, { icon: 'root', "aria-hidden": true, className: "mr-2.5" }),
80
80
  "All available sources")),
81
81
  isLoading && (react_1.default.createElement("li", { className: "mt-6" },
82
- react_1.default.createElement(Spinner_1.default, { size: "lg", label: "Loading sources" }))),
82
+ react_1.default.createElement(Spinner_1.default, { size: "sm", label: "Loading sources", className: "m-3" }))),
83
83
  !isLoading &&
84
84
  categorisedSources.map(({ key, label, sources }, index) => {
85
85
  return (react_1.default.createElement("li", { key: key, className: `flex flex-col text-sm font-semibold text-grey-800 ${index > 0 ? 'mt-3' : ''}` },
@@ -88,7 +88,7 @@ function SourceDropdown({ sources, selectedSource, isLoading, onRootSelect, onSo
88
88
  sources?.length > 0 && (react_1.default.createElement("ul", { "aria-label": `${label} nodes`, className: "flex flex-col mt-2" }, sources.map(({ source, resource }) => {
89
89
  const isSelectedSource = source.id === selectedSource?.source.id && resource?.id === selectedSource?.resource?.id;
90
90
  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
- 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 ${isSelectedSource ? 'bg-blue-100 text-blue-400' : ''}` },
91
+ 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
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" }),
93
93
  react_1.default.createElement("span", { className: "text-left mr-7" }, resource?.name || source.name),
94
94
  isSelectedSource && (react_1.default.createElement(Icon_1.default, { icon: 'selected', "aria-label": "selected", className: "absolute right-4" })))));
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import { OverlayTriggerState } from 'react-stately';
3
2
  import { DOMAttributes, FocusableElement } from '@react-types/shared';
4
3
  import { Source, ScopedSource } from '../types';
@@ -1,6 +1,6 @@
1
1
  import { ReactElement } from 'react';
2
2
  export type SpinnerProps = {
3
- size?: 'md' | 'lg';
3
+ size?: 'sm' | 'md';
4
4
  className?: string;
5
5
  label?: string;
6
6
  };
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const react_1 = __importDefault(require("react"));
7
7
  const clsx_1 = __importDefault(require("clsx"));
8
- const Spinner = ({ size = 'md', className, label = 'Loading' }) => {
8
+ const Spinner = ({ size = 'sm', className, label = 'Loading' }) => {
9
9
  return (react_1.default.createElement("div", { className: "spinner__wrapper", "aria-label": label },
10
10
  react_1.default.createElement("div", { className: (0, clsx_1.default)(`spinner`, size && `spinner--${size}`, className), role: "status" })));
11
11
  };
@@ -0,0 +1,6 @@
1
+ import { Status } from '../types';
2
+ export type StatusIndicatorProps = {
3
+ status: Status;
4
+ };
5
+ declare const StatusIndicator: ({ status }: StatusIndicatorProps) => JSX.Element;
6
+ export default StatusIndicator;
@@ -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 statusColour = {
8
+ // Duplicated from the Matrix repository.
9
+ // src/Api/AssetManagementApi/Constants/AssetStatuses.php - contains a list of possible statuses.
10
+ // frontend/src/styles/common/status-colors.scss - contains the colours used for those statuses in Matrix.
11
+ unknown: '#ff0000',
12
+ archived: '#c98a67',
13
+ under_construction: '#94d1f9',
14
+ pending_approval: '#d0bbf0',
15
+ approved_to_go_live: '#f7eaa2',
16
+ live: '#bfe60a',
17
+ up_for_review: '#72cd32',
18
+ safe_editing: '#ff97b0',
19
+ safe_editing_pending_approval: '#d688db',
20
+ safe_edit_approved_to_go_live: '#ffb34a',
21
+ };
22
+ const StatusIndicator = ({ status }) => {
23
+ const color = statusColour[status.code] || statusColour.unknown;
24
+ return (react_1.default.createElement("span", { style: { backgroundColor: color }, className: "block rounded-full w-3 h-3 border border-solid border-black border-opacity-20" }));
25
+ };
26
+ exports.default = StatusIndicator;