@lunit/oui 3.1.1 → 3.1.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.
- package/dist/types/components/Alert/Alert.types.d.ts +1 -0
- package/dist/types/components/BaseTextField/BaseTextField.types.d.ts +9 -0
- package/dist/types/components/Button/Button.types.d.ts +13 -0
- package/dist/types/components/Card/Card.types.d.ts +4 -0
- package/dist/types/components/Checkbox/Checkbox.types.d.ts +12 -0
- package/dist/types/components/Chip/Chip.types.d.ts +2 -0
- package/dist/types/components/DatePicker/DatePicker.types.d.ts +2 -0
- package/dist/types/components/Dialog/Dialog.types.d.ts +15 -0
- package/dist/types/components/Divider/Divider.types.d.ts +1 -0
- package/dist/types/components/Dropdown/Dropdown.types.d.ts +9 -0
- package/dist/types/components/Dropdown/DropdownItem.types.d.ts +5 -0
- package/dist/types/components/Dropdown/DropdownSubtitle.types.d.ts +2 -0
- package/dist/types/components/Dropdown/IconDropdown.types.d.ts +7 -0
- package/dist/types/components/EllipsisTypography/EllipsisTypography.types.d.ts +4 -0
- package/dist/types/components/FileDnDZone/FileDnDZone.types.d.ts +8 -0
- package/dist/types/components/List/List.types.d.ts +9 -0
- package/dist/types/components/List/ListItem.types.d.ts +6 -0
- package/dist/types/components/List/ListItemCaption.types.d.ts +1 -0
- package/dist/types/components/LoadingIndicator/LoadingIndicator.types.d.ts +4 -0
- package/dist/types/components/Menu/Menu.types.d.ts +5 -0
- package/dist/types/components/Menu/MenuItem.types.d.ts +6 -0
- package/dist/types/components/Pagination/Pagination.types.d.ts +6 -0
- package/dist/types/components/ProductLabel/ProductLabel.types.d.ts +6 -0
- package/dist/types/components/Progress/CircularProgress.types.d.ts +2 -0
- package/dist/types/components/Progress/LinearProgress.types.d.ts +3 -0
- package/dist/types/components/Radio/Radio.types.d.ts +11 -0
- package/dist/types/components/Radio/RadioGroup.types.d.ts +6 -0
- package/dist/types/components/Stepper/Stepper.types.d.ts +5 -0
- package/dist/types/components/TabbedPanel/TabbedPanel.types.d.ts +17 -0
- package/dist/types/components/TextField/TextArea.types.d.ts +10 -0
- package/dist/types/components/TextField/TextInput.types.d.ts +14 -0
- package/dist/types/components/Toggle/Toggle.types.d.ts +14 -0
- package/dist/types/components/Tooltip/Tooltip.types.d.ts +5 -0
- package/dist/types/components/UploadManager/UploadManager.types.d.ts +9 -0
- package/dist/types/presentations/Accordion/Accordion.types.d.ts +11 -0
- package/dist/types/presentations/AnalysisBar/AnalysisBar.types.d.ts +8 -0
- package/dist/types/presentations/FreeText/FreeText.types.d.ts +5 -0
- package/dist/types/presentations/Histogram/Histogram.types.d.ts +14 -0
- package/dist/types/presentations/HorizonDivider/HorizonDivider.types.d.ts +1 -0
- package/dist/types/presentations/ModelType/ModelType.types.d.ts +17 -0
- package/dist/types/presentations/Preview/Preview.types.d.ts +2 -0
- package/dist/types/presentations/Score/Score.types.d.ts +8 -0
- package/dist/types/presentations/Statistic/Statistic.types.d.ts +9 -0
- package/dist/types/presentations/Threshold/Threshold.types.d.ts +20 -0
- package/dist/types/presentations/ToggleControl/ToggleControl.types.d.ts +29 -0
- package/dist/types/presentations/ToggleControlGroup/ToggleControlGroup.types.d.ts +11 -0
- package/dist/types/presentations/presentations.types.d.ts +6 -0
- package/package.json +1 -1
|
@@ -1,17 +1,26 @@
|
|
|
1
1
|
import type { BoxProps } from '@mui/material';
|
|
2
2
|
interface BaseTextFieldContainerProps {
|
|
3
|
+
/** Width of the field; a number is treated as px */
|
|
3
4
|
width?: string | number;
|
|
4
5
|
}
|
|
5
6
|
interface RootTextFieldProps extends BaseTextFieldContainerProps {
|
|
7
|
+
/** Blocks input and renders the muted disabled style */
|
|
6
8
|
disabled?: boolean;
|
|
9
|
+
/** Allows selection and copying but blocks editing */
|
|
7
10
|
readOnly?: boolean;
|
|
11
|
+
/** Field contents, for controlled use */
|
|
8
12
|
value?: string;
|
|
13
|
+
/** Initial contents, for uncontrolled use */
|
|
9
14
|
defaultValue?: string;
|
|
15
|
+
/** Renders the field in its error state */
|
|
10
16
|
error?: boolean;
|
|
17
|
+
/** Props for the wrapper Box around the field */
|
|
11
18
|
BoxProps?: BoxProps;
|
|
12
19
|
}
|
|
13
20
|
interface HelperMsgProps {
|
|
21
|
+
/** Renders the message in the error style */
|
|
14
22
|
error?: boolean;
|
|
23
|
+
/** Helper text shown under the field */
|
|
15
24
|
helperMsg?: string;
|
|
16
25
|
}
|
|
17
26
|
export { RootTextFieldProps, BaseTextFieldContainerProps, HelperMsgProps };
|
|
@@ -3,20 +3,33 @@ type ButtonVariant = 'contained' | 'ghost' | 'outlined';
|
|
|
3
3
|
type ButtonColor = 'primary' | 'secondary' | 'error';
|
|
4
4
|
type ButtonSize = 'small' | 'medium' | 'large';
|
|
5
5
|
interface BaseButtonProps extends Omit<MuiButtonProps, 'variant' | 'color'> {
|
|
6
|
+
/** Visual style of the button. Defaults to `contained` */
|
|
6
7
|
variant?: ButtonVariant;
|
|
8
|
+
/** Colour role applied to the button */
|
|
7
9
|
color?: ButtonColor;
|
|
10
|
+
/** Height and padding preset */
|
|
8
11
|
size?: ButtonSize;
|
|
12
|
+
/** Blocks interaction and renders the muted disabled style */
|
|
9
13
|
disabled?: boolean;
|
|
14
|
+
/** Draws a 2px outline on focus and active; `outlined` variant only. Defaults to `false` */
|
|
10
15
|
focusOutline?: boolean;
|
|
16
|
+
/** Set internally to pick the icon-only layout; use `IconButtonProps` or `NormalButtonProps` instead */
|
|
11
17
|
isIconOnly: boolean;
|
|
18
|
+
/** Swaps the content for a spinner and swallows clicks */
|
|
12
19
|
loading?: boolean;
|
|
20
|
+
/** Text shown in the button */
|
|
13
21
|
label?: string;
|
|
14
22
|
}
|
|
23
|
+
/** A button whose content is an icon only */
|
|
15
24
|
interface IconButtonProps extends Omit<BaseButtonProps, 'isIconOnly'> {
|
|
25
|
+
/** Icon rendered as the whole button content */
|
|
16
26
|
icon: React.ReactNode;
|
|
17
27
|
}
|
|
28
|
+
/** A button with a text label, optionally preceded by an icon */
|
|
18
29
|
interface NormalButtonProps extends Omit<BaseButtonProps, 'isIconOnly'> {
|
|
30
|
+
/** Text shown in the button */
|
|
19
31
|
label: string;
|
|
32
|
+
/** Icon rendered before the label */
|
|
20
33
|
icon?: React.ReactNode;
|
|
21
34
|
}
|
|
22
35
|
type ButtonProps = IconButtonProps | NormalButtonProps;
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import type { CardProps as MuiCardProps } from '@mui/material';
|
|
2
2
|
export type CardSize = 'small' | 'large';
|
|
3
3
|
export interface CardProps extends MuiCardProps {
|
|
4
|
+
/** Fixed card dimensions: `small` is 480x156, `large` is 520x284. Defaults to `large` */
|
|
4
5
|
size?: CardSize;
|
|
6
|
+
/** Not read by this component; forwarded to the underlying MUI Card */
|
|
5
7
|
open?: boolean;
|
|
8
|
+
/** Renders the card on the lighter selected background */
|
|
6
9
|
selected?: boolean;
|
|
10
|
+
/** Called when the card is clicked */
|
|
7
11
|
onClick?: () => void;
|
|
8
12
|
}
|
|
@@ -1,15 +1,27 @@
|
|
|
1
1
|
import type { BoxProps, CheckboxProps as MuiCheckboxProps } from '@mui/material';
|
|
2
2
|
export interface CheckboxProps extends Omit<BoxProps<'span'>, 'onChange' | 'onChangeCapture'> {
|
|
3
|
+
/** Value submitted with the surrounding form */
|
|
3
4
|
value?: MuiCheckboxProps['value'];
|
|
5
|
+
/** Name of the underlying input */
|
|
4
6
|
name?: MuiCheckboxProps['name'];
|
|
7
|
+
/** Whether the box is ticked, for controlled use */
|
|
5
8
|
checked?: MuiCheckboxProps['checked'];
|
|
9
|
+
/** Initial state, for uncontrolled use */
|
|
6
10
|
defaultChecked?: MuiCheckboxProps['defaultChecked'];
|
|
11
|
+
/** Blocks interaction and renders the muted disabled style */
|
|
7
12
|
disabled?: MuiCheckboxProps['disabled'];
|
|
13
|
+
/** Marks the input as required in the surrounding form */
|
|
8
14
|
required?: MuiCheckboxProps['required'];
|
|
15
|
+
/** Renders the dash state used when only some children are ticked */
|
|
9
16
|
indeterminate?: MuiCheckboxProps['indeterminate'];
|
|
17
|
+
/** Called when the box is ticked or unticked */
|
|
10
18
|
onChange?: MuiCheckboxProps['onChange'];
|
|
19
|
+
/** Capture-phase change handler */
|
|
11
20
|
onChangeCapture?: MuiCheckboxProps['onChangeCapture'];
|
|
21
|
+
/** Text shown beside the box; makes the container a `<label>` */
|
|
12
22
|
label?: string;
|
|
23
|
+
/** Attributes applied to the underlying input element */
|
|
13
24
|
inputProps?: React.InputHTMLAttributes<HTMLInputElement>;
|
|
25
|
+
/** Ref to the underlying input element */
|
|
14
26
|
inputRef?: React.Ref<HTMLInputElement>;
|
|
15
27
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { ChipProps as MuiChipProps } from '@mui/material';
|
|
2
2
|
export type ChipsPreset = 'default' | 'uploaded' | 'analyzing' | 'analyzed' | 'analysis_failed' | 'qc_failed' | 'ready' | 'inferred' | 'inferencing' | 'invalid' | 'requested';
|
|
3
3
|
export interface ChipProps extends MuiChipProps {
|
|
4
|
+
/** Analysis status preset that supplies the colour and default label; every `*_failed` preset shares one style */
|
|
4
5
|
preset?: ChipsPreset;
|
|
6
|
+
/** Text shown in the chip; overrides the preset's default label */
|
|
5
7
|
label?: string;
|
|
6
8
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { DatePickerProps as MuiDatePickerProps } from '@mui/x-date-pickers/DatePicker';
|
|
2
2
|
export type DatePickerAlignment = 'left' | 'center' | 'right';
|
|
3
3
|
export interface DatePickerProps extends MuiDatePickerProps {
|
|
4
|
+
/** Horizontal alignment of the date text inside the field */
|
|
4
5
|
alignment?: DatePickerAlignment;
|
|
6
|
+
/** Placeholder shown while no date is selected */
|
|
5
7
|
placeholder?: string;
|
|
6
8
|
}
|
|
@@ -1,18 +1,33 @@
|
|
|
1
1
|
import type { SxProps } from '@mui/system';
|
|
2
2
|
export interface DialogProps {
|
|
3
|
+
/** Whether the dialog is shown */
|
|
3
4
|
open: boolean;
|
|
5
|
+
/** Heading shown in the dialog header */
|
|
4
6
|
title?: string;
|
|
7
|
+
/** Icon rendered before the title */
|
|
5
8
|
icon?: React.ReactNode;
|
|
9
|
+
/** Renders a close button in the header */
|
|
6
10
|
closable?: boolean;
|
|
11
|
+
/** Keeps the dialog at the narrow 320px prompt width even when `children` is used */
|
|
7
12
|
isPrompt?: boolean;
|
|
13
|
+
/** Label for the cancel button; the default footer renders only when this or `submitText` is set */
|
|
8
14
|
cancelText?: string;
|
|
15
|
+
/** Label for the submit button */
|
|
9
16
|
submitText?: string;
|
|
17
|
+
/** Called when the dialog requests to close, with the reason MUI reports */
|
|
10
18
|
onClose?: (event: object | null, reason: string) => void;
|
|
19
|
+
/** Plain body text; takes precedence over `children` */
|
|
11
20
|
text?: string;
|
|
21
|
+
/** Body content, used when `text` is not set. Widens the dialog unless `isPrompt` is set */
|
|
12
22
|
children?: React.ReactNode;
|
|
23
|
+
/** Replaces the default cancel/submit footer entirely */
|
|
13
24
|
dialogAction?: React.ReactNode;
|
|
25
|
+
/** Size preset applied to the footer buttons. Defaults to `small` */
|
|
14
26
|
buttonSize?: 'small' | 'medium' | 'large';
|
|
27
|
+
/** Shows a spinner on the submit button and blocks it */
|
|
15
28
|
loading?: boolean;
|
|
29
|
+
/** Blocks the submit button without showing a spinner */
|
|
16
30
|
disableSubmit?: boolean;
|
|
31
|
+
/** Style overrides for the dialog paper */
|
|
17
32
|
sx?: SxProps;
|
|
18
33
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { DividerProps as MuiDividerProps } from '@mui/material';
|
|
2
2
|
interface DividerProps extends MuiDividerProps {
|
|
3
|
+
/** Direction the rule runs in. Defaults to `vertical`, unlike MUI's `horizontal` */
|
|
3
4
|
orientation?: 'horizontal' | 'vertical';
|
|
4
5
|
}
|
|
5
6
|
export type { DividerProps };
|
|
@@ -1,19 +1,28 @@
|
|
|
1
1
|
import type { BoxProps, SelectProps, TypographyProps } from '@mui/material';
|
|
2
2
|
import { IconDropdownOption } from './IconDropdown.types';
|
|
3
3
|
interface DropdownContainerProps extends BoxProps {
|
|
4
|
+
/** Stretches the container to the full width of its parent */
|
|
4
5
|
fullWidth?: boolean;
|
|
5
6
|
}
|
|
6
7
|
type BaseDropdownProps<T = unknown> = SelectProps<T>;
|
|
7
8
|
interface DropdownProps<T = unknown> extends Omit<BaseDropdownProps<T>, 'IconComponent' | 'error' | 'sx' | 'style'> {
|
|
9
|
+
/** Error message shown under the field; also puts the field in its error state */
|
|
8
10
|
error?: string;
|
|
11
|
+
/** Helper text shown under the field when there is no `error` */
|
|
9
12
|
helperMsg?: string;
|
|
13
|
+
/** Text shown while nothing is selected */
|
|
10
14
|
placeholder?: string;
|
|
15
|
+
/** Props for the wrapper around the select and its messages */
|
|
11
16
|
ContainerProps?: BoxProps;
|
|
17
|
+
/** Style overrides for the select */
|
|
12
18
|
sx?: SelectProps['sx'];
|
|
19
|
+
/** Inline styles for the select */
|
|
13
20
|
style?: SelectProps['style'];
|
|
21
|
+
/** Options to render; an alternative to passing DropdownItem children */
|
|
14
22
|
options?: IconDropdownOption[];
|
|
15
23
|
}
|
|
16
24
|
interface PlaceholderProps extends TypographyProps {
|
|
25
|
+
/** Renders the placeholder in the muted disabled style */
|
|
17
26
|
disabled?: boolean;
|
|
18
27
|
}
|
|
19
28
|
type DropdownComponent = <T>(props: DropdownProps<T>) => JSX.Element;
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import type { MenuItemProps } from '@mui/material';
|
|
2
2
|
interface BaseDropdownItemProps extends MenuItemProps {
|
|
3
|
+
/** Reserves leading space so the label lines up with items that show an icon */
|
|
3
4
|
emptyIcon?: boolean;
|
|
4
5
|
}
|
|
5
6
|
interface DropdownItemProps extends BaseDropdownItemProps {
|
|
7
|
+
/** Treats the item as an action rather than a value, so selecting it does not change the field */
|
|
6
8
|
asButton?: boolean;
|
|
9
|
+
/** Shows a check mark while the item is selected */
|
|
7
10
|
checkIcon?: boolean;
|
|
11
|
+
/** Icon rendered before the label, taking precedence over `checkIcon` */
|
|
8
12
|
customIcon?: React.ReactElement;
|
|
13
|
+
/** Shortcut hint pinned to the right of the label */
|
|
9
14
|
keyboardShortcut?: string;
|
|
10
15
|
}
|
|
11
16
|
export { DropdownItemProps, BaseDropdownItemProps };
|
|
@@ -1,17 +1,24 @@
|
|
|
1
1
|
import type { TypographyProps } from '@mui/system';
|
|
2
2
|
import type { BaseDropdownProps } from '../Dropdown/Dropdown.types';
|
|
3
3
|
type BaseIconDropdownProps = BaseDropdownProps & {
|
|
4
|
+
/** Renders the trigger in its active, pressed-in style */
|
|
4
5
|
isToggled?: boolean;
|
|
5
6
|
};
|
|
6
7
|
type IconDropdownProps = BaseIconDropdownProps;
|
|
7
8
|
interface PlaceholderProps extends TypographyProps {
|
|
9
|
+
/** Renders the placeholder in the muted disabled style */
|
|
8
10
|
disabled?: boolean;
|
|
9
11
|
}
|
|
10
12
|
interface IconDropdownOption {
|
|
13
|
+
/** Value selected when the option is picked */
|
|
11
14
|
value: string;
|
|
15
|
+
/** Icon rendered before the label */
|
|
12
16
|
icon: React.ReactElement;
|
|
17
|
+
/** Text shown for the option */
|
|
13
18
|
label: string;
|
|
19
|
+
/** Shortcut hint pinned to the right of the label */
|
|
14
20
|
shortcut?: string;
|
|
21
|
+
/** Marks the option as the default choice */
|
|
15
22
|
default?: boolean;
|
|
16
23
|
}
|
|
17
24
|
export { IconDropdownProps, BaseIconDropdownProps, PlaceholderProps, IconDropdownOption };
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import type { TypographyProps as MuiTypographyProps } from '@mui/material';
|
|
2
2
|
export interface BaseEllipsisTypographyProps extends MuiTypographyProps {
|
|
3
|
+
/** `row` clamps to a single line, `column` clamps to `maxLines`. Defaults to `row` */
|
|
3
4
|
direction?: 'row' | 'column';
|
|
5
|
+
/** Lines to show before truncating; `column` direction only. Defaults to 1 */
|
|
4
6
|
maxLines?: number;
|
|
5
7
|
}
|
|
6
8
|
export interface EllipsisTypographyProps extends BaseEllipsisTypographyProps {
|
|
9
|
+
/** Where the overflow tooltip opens. Defaults to `bottom` */
|
|
7
10
|
tooltipPlacement?: 'top' | 'right' | 'bottom' | 'left';
|
|
11
|
+
/** Slack in px before overflow counts as truncated, to absorb sub-pixel rounding */
|
|
8
12
|
heightThreshold?: number;
|
|
9
13
|
}
|
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
import type { BoxProps } from '@mui/material';
|
|
2
2
|
interface FileDnDZoneProps {
|
|
3
|
+
/** Slides already uploaded, shown in the usage message */
|
|
3
4
|
slidesUploaded: number;
|
|
5
|
+
/** Upper bound shown in the usage message. Defaults to 500 */
|
|
4
6
|
maxSlideLimit?: number;
|
|
7
|
+
/** Accepted extensions listed in the guidance text */
|
|
5
8
|
acceptedFileFormats?: string;
|
|
9
|
+
/** Blocks dropping and renders the muted disabled style */
|
|
6
10
|
disabled?: boolean;
|
|
11
|
+
/** Props for the outermost wrapper */
|
|
7
12
|
WrapperProps?: BoxProps;
|
|
13
|
+
/** Props for the dashed drop-target box */
|
|
8
14
|
OuterBoxProps?: BoxProps;
|
|
15
|
+
/** Props for the content box inside the drop target */
|
|
9
16
|
InnerBoxProps?: BoxProps;
|
|
17
|
+
/** Props for the guidance text section */
|
|
10
18
|
SectionBoxProps?: BoxProps;
|
|
11
19
|
}
|
|
12
20
|
export default FileDnDZoneProps;
|
|
@@ -1,17 +1,26 @@
|
|
|
1
1
|
import type { ListProps as MuiListProps, ListSubheaderProps as MuiListSubheaderProps } from '@mui/material';
|
|
2
2
|
export type ListSize = 'small' | 'medium' | 'large';
|
|
3
3
|
export interface ListProps extends MuiListProps {
|
|
4
|
+
/** Row height and typography preset applied to every item. Defaults to `medium` */
|
|
4
5
|
size?: ListSize;
|
|
6
|
+
/** Weight of the subheader text. Defaults to `bold` */
|
|
5
7
|
subheaderType?: ListSubheaderProps['type'];
|
|
8
|
+
/** `visible` keeps the list always open; a boolean makes the subheader a collapse toggle. Defaults to `visible` */
|
|
6
9
|
open?: boolean | 'visible';
|
|
10
|
+
/** Called when a collapsed list is expanded via the subheader */
|
|
7
11
|
onOpen?: (event: React.MouseEvent<HTMLLIElement>) => void;
|
|
12
|
+
/** Called when an expanded list is collapsed via the subheader */
|
|
8
13
|
onClose?: (event: React.MouseEvent<HTMLLIElement>) => void;
|
|
14
|
+
/** Reserves leading space in every item so labels line up with checked ones */
|
|
9
15
|
showCheck?: boolean;
|
|
10
16
|
}
|
|
11
17
|
export interface ListSubheaderProps extends MuiListSubheaderProps {
|
|
18
|
+
/** Weight of the subheader text */
|
|
12
19
|
type?: 'bold' | 'normal';
|
|
20
|
+
/** Renders the subheader with hover and pointer affordances */
|
|
13
21
|
clickable?: boolean;
|
|
14
22
|
}
|
|
23
|
+
/** Size and check settings shared with the list's items */
|
|
15
24
|
export interface ListContextValue {
|
|
16
25
|
size: ListSize;
|
|
17
26
|
showCheck: boolean;
|
|
@@ -3,9 +3,13 @@ import { OverrideProps } from '@mui/material/OverridableComponent';
|
|
|
3
3
|
import type { ListSize } from '../List/List.types';
|
|
4
4
|
type ListItemRootBasePropsKey = 'className' | 'classes' | 'style' | 'sx';
|
|
5
5
|
export interface ListItemBaseProps extends Omit<MuiListItemButtonProps, ListItemRootBasePropsKey>, Pick<MuiListItemProps, ListItemRootBasePropsKey> {
|
|
6
|
+
/** Primary content of the row */
|
|
6
7
|
label?: React.ReactNode | string;
|
|
8
|
+
/** Content rendered before the label, e.g. an icon or checkbox */
|
|
7
9
|
startElement?: React.ReactNode;
|
|
10
|
+
/** Content rendered after the label, e.g. a caption or action */
|
|
8
11
|
endElement?: React.ReactNode;
|
|
12
|
+
/** Props applied to the outer `li`, separate from the inner button */
|
|
9
13
|
rootProps?: MuiListItemProps;
|
|
10
14
|
}
|
|
11
15
|
export type ListItemTypeMap<P = {}, D extends React.ElementType = 'span'> = ExtendButtonBaseTypeMap<{
|
|
@@ -16,7 +20,9 @@ export type ListItemTypeMap<P = {}, D extends React.ElementType = 'span'> = Exte
|
|
|
16
20
|
export type ListItemComponent = ExtendButtonBase<ListItemTypeMap>;
|
|
17
21
|
export type ListItemProps<D extends React.ElementType = ListItemTypeMap['defaultComponent'], P = {}> = OverrideProps<ListItemTypeMap<P, D>, D>;
|
|
18
22
|
export interface StyledListItemButtonProps extends MuiListItemButtonProps {
|
|
23
|
+
/** Element the button renders as */
|
|
19
24
|
component?: React.ElementType;
|
|
25
|
+
/** Row height and typography preset, supplied by the parent List */
|
|
20
26
|
size: ListSize;
|
|
21
27
|
}
|
|
22
28
|
export {};
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
2
|
export interface LoadingIndicatorProps {
|
|
3
|
+
/** Primary line of text shown under the animation */
|
|
3
4
|
message?: string;
|
|
5
|
+
/** Secondary content shown under the message; replaces the default detail text */
|
|
4
6
|
details?: ReactNode;
|
|
7
|
+
/** Which Lottie animation to play. Defaults to `dot` */
|
|
5
8
|
loadingAnimation?: 'dot' | 'dna';
|
|
9
|
+
/** `data-testid` applied to the container. Defaults to `loading-indicator` */
|
|
6
10
|
dataTestId?: string;
|
|
7
11
|
}
|
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
import type { MenuProps as MuiMenuProps, PaperProps } from '@mui/material';
|
|
2
2
|
export type MenuSize = 'small' | 'medium';
|
|
3
3
|
export interface MenuProps extends StyledMenuProps {
|
|
4
|
+
/** Row height and typography preset applied to every item. Defaults to `medium` */
|
|
4
5
|
size?: MenuSize;
|
|
6
|
+
/** Content pinned above the item list */
|
|
5
7
|
subheader?: React.ReactNode;
|
|
8
|
+
/** Reserves leading space in every item so labels line up with checked ones */
|
|
6
9
|
showCheck?: boolean;
|
|
7
10
|
}
|
|
8
11
|
export interface StyledMenuProps extends MuiMenuProps {
|
|
12
|
+
/** Row height and typography preset */
|
|
9
13
|
size?: MenuSize;
|
|
10
14
|
/** @deprecated Use slotProps={{ paper: ... }} instead */
|
|
11
15
|
PaperProps?: PaperProps;
|
|
12
16
|
}
|
|
17
|
+
/** Size and check settings shared with the menu's items */
|
|
13
18
|
export interface MenuContextValue {
|
|
14
19
|
size: MenuSize;
|
|
15
20
|
showCheck: boolean;
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import type { MenuItemProps as MuiMenuItemProps } from '@mui/material';
|
|
2
2
|
import type { MenuSize } from '../Menu/Menu.types';
|
|
3
3
|
export interface MenuItemProps extends MuiMenuItemProps {
|
|
4
|
+
/** Icon rendered before the label. Falls back to a spacer when the menu sets `showCheck` */
|
|
4
5
|
icon?: React.ReactNode;
|
|
6
|
+
/** Secondary text pinned to the right of the row, e.g. a keyboard shortcut */
|
|
5
7
|
caption?: React.ReactNode;
|
|
8
|
+
/** Primary text of the row */
|
|
6
9
|
label?: React.ReactNode;
|
|
10
|
+
/** Not read by this component; forwarded to the underlying MUI MenuItem */
|
|
7
11
|
open?: boolean;
|
|
12
|
+
/** Not rendered; use `label` for the row's text */
|
|
8
13
|
children?: React.ReactNode;
|
|
9
14
|
}
|
|
10
15
|
export interface StyledMenuItemProps extends MuiMenuItemProps {
|
|
16
|
+
/** Row height and typography preset */
|
|
11
17
|
size: MenuSize;
|
|
12
18
|
}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
export interface PaginationProps {
|
|
2
|
+
/** Current page, 1-based. Defaults to 1 */
|
|
2
3
|
page?: number;
|
|
4
|
+
/** Rows shown per page */
|
|
3
5
|
perPage: number;
|
|
6
|
+
/** Total number of pages */
|
|
4
7
|
totalPage: number;
|
|
8
|
+
/** Called with the page the user picked */
|
|
5
9
|
onPageChange?: (event: React.MouseEvent<HTMLLIElement> | React.MouseEvent<HTMLButtonElement> | null, page: number) => void;
|
|
10
|
+
/** Called with the rows-per-page value the user picked */
|
|
6
11
|
onPerPageChange?: (event: React.MouseEvent<HTMLLIElement> | null, perPage: number) => void;
|
|
7
12
|
}
|
|
8
13
|
interface SortObject {
|
|
@@ -18,6 +23,7 @@ interface Pageable {
|
|
|
18
23
|
pageNumber: number;
|
|
19
24
|
pageSize: number;
|
|
20
25
|
}
|
|
26
|
+
/** Page metadata as returned by a Spring Data paged response */
|
|
21
27
|
export interface PaginationViewInfo {
|
|
22
28
|
totalElements: number;
|
|
23
29
|
totalPages: number;
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import type { SxProps } from '@mui/system';
|
|
2
2
|
export interface ProductLabelProps {
|
|
3
|
+
/** Called when the label is dismissed */
|
|
3
4
|
onClose: () => void;
|
|
5
|
+
/** Whether the label is shown */
|
|
4
6
|
open: boolean;
|
|
7
|
+
/** Body content of the label */
|
|
5
8
|
children: React.ReactNode;
|
|
9
|
+
/** Content pinned to the left of the footer; the footer renders only when this or `footerEnd` is set */
|
|
6
10
|
footerStart?: string | React.ReactNode;
|
|
11
|
+
/** Content pinned to the right of the footer */
|
|
7
12
|
footerEnd?: string | React.ReactNode;
|
|
13
|
+
/** Style overrides for the container */
|
|
8
14
|
sx?: SxProps;
|
|
9
15
|
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { CircularProgressProps as MuiCircularProgressProps } from '@mui/material';
|
|
2
2
|
export interface CircularProgressProps extends MuiCircularProgressProps {
|
|
3
|
+
/** Colour of the progress arc */
|
|
3
4
|
circleColor?: string;
|
|
5
|
+
/** Completion percentage, 0-100. Spins indefinitely when omitted */
|
|
4
6
|
progress?: number;
|
|
5
7
|
}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { LinearProgressProps as MuiLinearProgressProps } from '@mui/material';
|
|
2
2
|
export interface LinearProgressProps extends Omit<MuiLinearProgressProps, 'color'> {
|
|
3
|
+
/** Colour of the filled portion of the bar */
|
|
3
4
|
barColor?: string;
|
|
5
|
+
/** Completion percentage, 0-100. Animates indefinitely when omitted */
|
|
4
6
|
progress?: number;
|
|
7
|
+
/** Bar thickness in px. Defaults to 4 */
|
|
5
8
|
height?: number;
|
|
6
9
|
}
|
|
@@ -1,14 +1,25 @@
|
|
|
1
1
|
import type { BoxProps, RadioProps as MuiRadioProps } from '@mui/material';
|
|
2
2
|
export interface RadioProps extends Omit<BoxProps<'span'>, 'onChange' | 'onChangeCapture'> {
|
|
3
|
+
/** Value submitted with the surrounding form, and matched against the group's value */
|
|
3
4
|
value?: MuiRadioProps['value'];
|
|
5
|
+
/** Name of the underlying input; shared across a group */
|
|
4
6
|
name?: MuiRadioProps['name'];
|
|
7
|
+
/** Whether this option is selected, for controlled use */
|
|
5
8
|
checked?: MuiRadioProps['checked'];
|
|
9
|
+
/** Initial state, for uncontrolled use */
|
|
6
10
|
defaultChecked?: MuiRadioProps['defaultChecked'];
|
|
11
|
+
/** Blocks interaction and renders the muted disabled style */
|
|
7
12
|
disabled?: MuiRadioProps['disabled'];
|
|
13
|
+
/** Marks the input as required in the surrounding form */
|
|
8
14
|
required?: MuiRadioProps['required'];
|
|
15
|
+
/** Called when this option is selected */
|
|
9
16
|
onChange?: MuiRadioProps['onChange'];
|
|
17
|
+
/** Capture-phase change handler */
|
|
10
18
|
onChangeCapture?: MuiRadioProps['onChangeCapture'];
|
|
19
|
+
/** Text shown beside the button; makes the container a `<label>` */
|
|
11
20
|
label?: string;
|
|
21
|
+
/** Attributes applied to the underlying input element */
|
|
12
22
|
inputProps?: React.InputHTMLAttributes<HTMLInputElement>;
|
|
23
|
+
/** Ref to the underlying input element */
|
|
13
24
|
inputRef?: React.Ref<HTMLInputElement>;
|
|
14
25
|
}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import type { FormGroupProps, RadioGroupProps as MuiRadioGroupProps } from '@mui/material';
|
|
2
2
|
export interface RadioGroupProps extends MuiRadioGroupProps {
|
|
3
|
+
/** Radio options belonging to this group */
|
|
3
4
|
children?: FormGroupProps['children'];
|
|
5
|
+
/** Initially selected value, for uncontrolled use */
|
|
4
6
|
defaultValue?: MuiRadioGroupProps['defaultValue'];
|
|
7
|
+
/** Name shared by every input in the group */
|
|
5
8
|
name?: MuiRadioGroupProps['name'];
|
|
9
|
+
/** Called with the newly selected value */
|
|
6
10
|
onChange?: MuiRadioGroupProps['onChange'];
|
|
11
|
+
/** Selected value, for controlled use */
|
|
7
12
|
value?: MuiRadioGroupProps['value'];
|
|
13
|
+
/** Lays the options out in a row instead of a column */
|
|
8
14
|
row?: FormGroupProps['row'];
|
|
9
15
|
}
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import type { TypographyProps } from '@mui/material';
|
|
2
2
|
import type { SxProps } from '@mui/system';
|
|
3
3
|
export interface StepperProps {
|
|
4
|
+
/** Step number, rendered as `STEP {step}` */
|
|
4
5
|
step: number;
|
|
6
|
+
/** Step description shown next to the step number */
|
|
5
7
|
title: string;
|
|
8
|
+
/** Renders the step number and title in the muted disabled style */
|
|
6
9
|
disabled?: boolean;
|
|
10
|
+
/** Style overrides for the container */
|
|
7
11
|
sx?: SxProps;
|
|
8
12
|
}
|
|
9
13
|
export interface StepperTypographyProps extends TypographyProps {
|
|
14
|
+
/** Renders the text in the muted disabled style */
|
|
10
15
|
disabled?: boolean;
|
|
11
16
|
}
|
|
@@ -3,28 +3,45 @@ import type { TabProps, TabsProps } from '@mui/material';
|
|
|
3
3
|
type TabSize = 'small' | 'medium';
|
|
4
4
|
type ButtonVariant = 'normal' | 'toggle';
|
|
5
5
|
interface TabConfig {
|
|
6
|
+
/** Identifier matched against `activatedTab` */
|
|
6
7
|
value: string;
|
|
8
|
+
/** Panel content shown while this tab is active */
|
|
7
9
|
element: React.ReactNode;
|
|
10
|
+
/** Blocks selection of this tab */
|
|
8
11
|
disabled?: boolean;
|
|
9
12
|
}
|
|
10
13
|
interface BaseTabProps extends TabProps {
|
|
14
|
+
/** Height and typography preset */
|
|
11
15
|
size?: TabSize;
|
|
16
|
+
/** `normal` underlines the active tab, `toggle` renders a segmented control */
|
|
12
17
|
buttonVariant?: ButtonVariant;
|
|
13
18
|
}
|
|
14
19
|
interface BaseTabsProps extends TabsProps {
|
|
20
|
+
/** Height and typography preset */
|
|
15
21
|
size?: TabSize;
|
|
22
|
+
/** `normal` underlines the active tab, `toggle` renders a segmented control */
|
|
16
23
|
buttonVariant?: ButtonVariant;
|
|
17
24
|
}
|
|
18
25
|
interface TabbedPanelProps {
|
|
26
|
+
/** Tabs and their panel content, in display order */
|
|
19
27
|
tabs: TabConfig[];
|
|
28
|
+
/** `value` of the tab currently shown */
|
|
20
29
|
activatedTab: string;
|
|
30
|
+
/** Height and typography preset. Defaults to `medium` */
|
|
21
31
|
size?: TabSize;
|
|
32
|
+
/** `normal` underlines the active tab, `toggle` renders a segmented control. Defaults to `normal` */
|
|
22
33
|
buttonVariant?: ButtonVariant;
|
|
34
|
+
/** How the tab strip distributes width; falls back to `fullWidth` for two or more tabs */
|
|
23
35
|
menuVariant?: TabsProps['variant'];
|
|
36
|
+
/** Props forwarded to the underlying MUI Tabs */
|
|
24
37
|
TabsProps?: Partial<TabsProps>;
|
|
38
|
+
/** Props forwarded to each underlying MUI Tab */
|
|
25
39
|
TabProps?: Partial<TabProps>;
|
|
40
|
+
/** Props forwarded to each underlying MUI TabPanel */
|
|
26
41
|
TabPanelProps?: Partial<TabPanelProps>;
|
|
42
|
+
/** Called with the newly selected tab's `value` */
|
|
27
43
|
onActivatedTab: (tab: string) => void;
|
|
44
|
+
/** Called before `onActivatedTab` with the same value, for side effects */
|
|
28
45
|
onTabChangeListener?: (newTabValue: string) => void;
|
|
29
46
|
}
|
|
30
47
|
export type { TabbedPanelProps, TabConfig, TabSize, BaseTabProps, BaseTabsProps };
|
|
@@ -1,17 +1,27 @@
|
|
|
1
1
|
import type { BoxProps, SxProps } from '@mui/material';
|
|
2
2
|
import type { HelperMsgProps, RootTextFieldProps } from '../BaseTextField/BaseTextField.types';
|
|
3
3
|
interface RootTextAreaProps extends Omit<RootTextFieldProps, 'BoxProps'> {
|
|
4
|
+
/** Marks the element as a textarea; always `'true'` */
|
|
4
5
|
multiline: 'true';
|
|
6
|
+
/** Called on every keystroke */
|
|
5
7
|
onChange?: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;
|
|
8
|
+
/** Renders the field in its error state */
|
|
6
9
|
error?: boolean;
|
|
10
|
+
/** Ref to the underlying textarea element */
|
|
7
11
|
ref?: React.ForwardedRef<HTMLTextAreaElement> | undefined;
|
|
12
|
+
/** Text shown while the field is empty */
|
|
8
13
|
placeholder?: string;
|
|
14
|
+
/** Width of the field; a number is treated as px */
|
|
9
15
|
width?: string | number;
|
|
16
|
+
/** Height of the field; a number is treated as px */
|
|
10
17
|
height?: string | number;
|
|
18
|
+
/** Props for the wrapper Box around the field and its helper message */
|
|
11
19
|
OuterBoxProps?: BoxProps;
|
|
20
|
+
/** Style overrides for the textarea */
|
|
12
21
|
sx?: SxProps;
|
|
13
22
|
}
|
|
14
23
|
interface TextAreaWithHelperMsgProps extends Omit<RootTextAreaProps, 'error' | 'multiline'>, Omit<HelperMsgProps, 'error'> {
|
|
24
|
+
/** Error message shown under the field; also puts the field in its error state */
|
|
15
25
|
error?: string;
|
|
16
26
|
}
|
|
17
27
|
interface TextAreaProps extends TextAreaWithHelperMsgProps {
|
|
@@ -1,27 +1,41 @@
|
|
|
1
1
|
import type { BoxProps, InputProps as MuiInputProps } from '@mui/material';
|
|
2
2
|
import type { RootTextFieldProps, HelperMsgProps } from '../BaseTextField/BaseTextField.types';
|
|
3
3
|
interface RootTextInputProps extends RootTextFieldProps, Omit<MuiInputProps, 'size' | 'error' | 'ref' | 'value' | 'defaultValue' | 'onChange'> {
|
|
4
|
+
/** Uses the taller input height */
|
|
4
5
|
large?: boolean;
|
|
6
|
+
/** Icon rendered inside the field, before the text */
|
|
5
7
|
leftIcon?: React.ReactNode;
|
|
8
|
+
/** Icon rendered inside the field, after the text; replaces the clear button */
|
|
6
9
|
rightIcon?: React.ReactNode;
|
|
10
|
+
/** Called on every keystroke */
|
|
7
11
|
onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;
|
|
12
|
+
/** Props for the wrapper Box around the field and its helper message */
|
|
8
13
|
OuterBoxProps?: BoxProps;
|
|
14
|
+
/** Props for the Box wrapping the input and its icons */
|
|
9
15
|
InputContainerProps?: BoxProps;
|
|
16
|
+
/** Style overrides for the input element itself, replacing the default icon padding */
|
|
10
17
|
inputSX?: MuiInputProps['sx'];
|
|
11
18
|
}
|
|
12
19
|
interface InputWithHelperMsgProps extends Omit<RootTextInputProps, 'error'>, Omit<HelperMsgProps, 'error'> {
|
|
20
|
+
/** Error message shown under the field; also puts the field in its error state */
|
|
13
21
|
error?: string;
|
|
14
22
|
}
|
|
15
23
|
interface PasswordInputWithHelperMsgProps extends Omit<InputWithHelperMsgProps, 'rightIcon' | 'readOnly' | 'onClearButtonClick' | 'InputContainerProps'> {
|
|
24
|
+
/** Renders a password field with a built-in reveal toggle */
|
|
16
25
|
type: 'password';
|
|
17
26
|
}
|
|
18
27
|
interface NormalTextInputProps extends InputWithHelperMsgProps {
|
|
28
|
+
/** Called when the clear button is pressed; the button only renders when this is set */
|
|
19
29
|
onClearButtonClick?: () => void;
|
|
30
|
+
/** Icon rendered inside the field, after the text; replaces the clear button */
|
|
20
31
|
rightIcon?: React.ReactNode;
|
|
21
32
|
}
|
|
22
33
|
interface FileInputProps extends NormalTextInputProps {
|
|
34
|
+
/** Renders a file picker field */
|
|
23
35
|
type: 'file';
|
|
36
|
+
/** Extensions the picker accepts, as an `accept` attribute value */
|
|
24
37
|
accept: string;
|
|
38
|
+
/** Called when the field is clicked to open the picker */
|
|
25
39
|
onClick: () => void;
|
|
26
40
|
}
|
|
27
41
|
interface PasswordTextInputProps extends PasswordInputWithHelperMsgProps {
|
|
@@ -1,17 +1,31 @@
|
|
|
1
1
|
import type { BoxProps, Color, SwitchProps as MuiSwitchProps } from '@mui/material';
|
|
2
2
|
export interface ToggleProps extends Omit<BoxProps<'span'>, 'onChange' | 'onChangeCapture'> {
|
|
3
|
+
/** Value submitted with the surrounding form */
|
|
3
4
|
value?: MuiSwitchProps['value'];
|
|
5
|
+
/** Name of the underlying input */
|
|
4
6
|
name?: MuiSwitchProps['name'];
|
|
7
|
+
/** Whether the switch is on, for controlled use */
|
|
5
8
|
checked?: MuiSwitchProps['checked'];
|
|
9
|
+
/** Initial state, for uncontrolled use */
|
|
6
10
|
defaultChecked?: MuiSwitchProps['defaultChecked'];
|
|
11
|
+
/** Blocks interaction and renders the muted disabled style */
|
|
7
12
|
disabled?: MuiSwitchProps['disabled'];
|
|
13
|
+
/** Marks the input as required in the surrounding form */
|
|
8
14
|
required?: MuiSwitchProps['required'];
|
|
15
|
+
/** Called when the switch is flipped */
|
|
9
16
|
onChange?: MuiSwitchProps['onChange'];
|
|
17
|
+
/** Capture-phase change handler */
|
|
10
18
|
onChangeCapture?: MuiSwitchProps['onChangeCapture'];
|
|
19
|
+
/** Attributes applied to the underlying input element */
|
|
11
20
|
inputProps?: React.InputHTMLAttributes<HTMLInputElement>;
|
|
21
|
+
/** Ref to the underlying input element */
|
|
12
22
|
inputRef?: React.Ref<HTMLInputElement>;
|
|
23
|
+
/** Renders the partial state; the change event still reports `checked: true` */
|
|
13
24
|
indeterminate?: boolean;
|
|
25
|
+
/** Text shown beside the switch; makes the container a `<label>` */
|
|
14
26
|
label?: string;
|
|
27
|
+
/** Which side of the switch the label sits on. Defaults to `right` */
|
|
15
28
|
labelPlacement?: 'left' | 'right';
|
|
29
|
+
/** Track colour while the switch is on */
|
|
16
30
|
toggleColor?: React.CSSProperties['color'] | Color;
|
|
17
31
|
}
|
|
@@ -3,14 +3,19 @@ import type { TooltipClasses, TooltipProps as MuiTooltipProps } from '@mui/mater
|
|
|
3
3
|
export type Position = Pick<TooltipProps, 'placement'>;
|
|
4
4
|
export type TooltipSizes = 'small' | 'large';
|
|
5
5
|
export interface TooltipSize {
|
|
6
|
+
/** Arrow width in px */
|
|
6
7
|
width: number;
|
|
8
|
+
/** Arrow height in px */
|
|
7
9
|
height: number;
|
|
8
10
|
}
|
|
9
11
|
export type TooltipPlacement = TooltipClasses['tooltipPlacementBottom'] | TooltipClasses['tooltipPlacementLeft'] | TooltipClasses['tooltipPlacementRight'] | TooltipClasses['tooltipPlacementTop'];
|
|
10
12
|
export type ArrowSizeBySize = Record<TooltipSizes, TooltipSize>;
|
|
11
13
|
export type TooltipPlacementToSize = Record<TooltipPlacement, ArrowSizeBySize>;
|
|
12
14
|
export interface TooltipProps extends MuiTooltipProps {
|
|
15
|
+
/** Icon rendered before the title; `small` size only */
|
|
13
16
|
icon?: ReactNode;
|
|
17
|
+
/** Padding and typography preset. Defaults to `small` */
|
|
14
18
|
size?: TooltipSizes;
|
|
19
|
+
/** Removes the tooltip's inner padding, for content that brings its own */
|
|
15
20
|
noPadding?: boolean;
|
|
16
21
|
}
|
|
@@ -1,14 +1,23 @@
|
|
|
1
1
|
import { UppyFile } from '@uppy/core';
|
|
2
2
|
export interface UploadFileProps {
|
|
3
|
+
/** Uppy file whose name, size and progress are rendered */
|
|
3
4
|
file: UppyFile;
|
|
5
|
+
/** Called with the file id when its cancel button is clicked */
|
|
4
6
|
onCancel?: (id: string) => void;
|
|
7
|
+
/** Called with the file id when a failed upload is retried */
|
|
5
8
|
onRetry?: (id: string) => void;
|
|
6
9
|
}
|
|
7
10
|
export interface UploadManagerProps {
|
|
11
|
+
/** Heading of the upload panel */
|
|
8
12
|
title: string;
|
|
13
|
+
/** Secondary line under the title, e.g. overall progress */
|
|
9
14
|
subTitle?: string;
|
|
15
|
+
/** Files listed in the panel */
|
|
10
16
|
files: UppyFile[];
|
|
17
|
+
/** Called when the panel's close button is clicked */
|
|
11
18
|
onClose?: () => void;
|
|
19
|
+
/** Called with the file id when a file's cancel button is clicked */
|
|
12
20
|
onCancel?: (id: string) => void;
|
|
21
|
+
/** Called with the file id when a failed upload is retried */
|
|
13
22
|
onRetry?: (id: string) => void;
|
|
14
23
|
}
|
|
@@ -4,18 +4,29 @@ import { FreeTextProps } from '../FreeText';
|
|
|
4
4
|
import { StatisticProps } from '../Statistic';
|
|
5
5
|
import { ScoreProps } from '../Score';
|
|
6
6
|
export interface AccordionSpec {
|
|
7
|
+
/** Discriminator identifying this spec as an accordion */
|
|
7
8
|
componentType: 'accordion';
|
|
9
|
+
/** Section heading shown in the summary row */
|
|
8
10
|
title: string;
|
|
11
|
+
/** Text size and weight preset for the summary row */
|
|
9
12
|
size?: PresentationElementSize;
|
|
13
|
+
/** Components rendered inside the expanded section; must contain at least one item */
|
|
10
14
|
items: (StatisticProps | FreeTextProps | ScoreProps)[];
|
|
15
|
+
/** Whether the section starts expanded */
|
|
11
16
|
isOpen?: boolean;
|
|
17
|
+
/** Components rendered in a tooltip behind an info icon before the title */
|
|
12
18
|
tooltip?: (StatisticProps | FreeTextProps)[];
|
|
19
|
+
/** Value appended to the title as `title: metrics` */
|
|
13
20
|
metrics?: string;
|
|
14
21
|
}
|
|
15
22
|
interface AccordionProps extends AccordionSpec {
|
|
23
|
+
/** Props forwarded to the underlying MUI Accordion */
|
|
16
24
|
MuiAccordionProps?: MuiAccordionProps;
|
|
25
|
+
/** Props forwarded to the underlying MUI AccordionSummary */
|
|
17
26
|
AccordionSummaryProps?: AccordionSummaryProps;
|
|
27
|
+
/** Props forwarded to the underlying MUI AccordionDetails */
|
|
18
28
|
AccordionDetailsProps?: AccordionDetailsProps;
|
|
29
|
+
/** Called with the next expanded state when the summary row is clicked */
|
|
19
30
|
onChange?: (event: React.SyntheticEvent, expanded: boolean) => void;
|
|
20
31
|
}
|
|
21
32
|
export type { AccordionProps };
|
|
@@ -8,15 +8,23 @@ export interface AnalysisBarLevel {
|
|
|
8
8
|
/** Either a numeric string ('20', '20%') that doubles as its own label, or an explicitly positioned label */
|
|
9
9
|
export type AnalysisBarExpressionLevel = string | AnalysisBarLevel;
|
|
10
10
|
export interface AnalysisBarProps {
|
|
11
|
+
/** Discriminator identifying this spec as an analysis bar */
|
|
11
12
|
componentType: 'analysisBar';
|
|
13
|
+
/** Widens segments of 1% or less to a fixed 12px so they stay visible */
|
|
12
14
|
isCutoff?: boolean;
|
|
15
|
+
/** Axis labels under the bar. Numeric strings are placed at their own value; objects at their `position` */
|
|
13
16
|
expressionLevels?: AnalysisBarExpressionLevel[];
|
|
17
|
+
/** Caption rendered at the midpoint of the bar */
|
|
14
18
|
caption?: string;
|
|
19
|
+
/** Colour segments making up the bar; widths are normalised to 100%. A `jet` colour renders a heatmap gradient */
|
|
15
20
|
segments?: {
|
|
16
21
|
color: 'jet' | string;
|
|
17
22
|
width: number;
|
|
18
23
|
}[];
|
|
24
|
+
/** Value of the point indicator, which also sets its position on the bar */
|
|
19
25
|
expressionValue?: string;
|
|
26
|
+
/** Overrides the displayed text of the axis label at the same index, leaving its position unchanged */
|
|
20
27
|
expressionLabels?: string[];
|
|
28
|
+
/** Renders the whole bar at reduced opacity */
|
|
21
29
|
isDimmed?: boolean;
|
|
22
30
|
}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import type { PresentationElementSize } from '../presentations.types';
|
|
2
2
|
interface FreeTextProps {
|
|
3
|
+
/** Discriminator identifying this spec as free text */
|
|
3
4
|
componentType: 'freeText';
|
|
5
|
+
/** Text size and weight preset */
|
|
4
6
|
size?: PresentationElementSize;
|
|
7
|
+
/** Text to render; line breaks are preserved */
|
|
5
8
|
content: string;
|
|
9
|
+
/** Fixed height in px; the text scrolls when it overflows. Grows with the content when omitted */
|
|
6
10
|
height?: number;
|
|
11
|
+
/** Wraps the text in a rounded grey panel with padding */
|
|
7
12
|
background?: boolean;
|
|
8
13
|
}
|
|
9
14
|
export type { FreeTextProps };
|
|
@@ -1,24 +1,38 @@
|
|
|
1
1
|
import { FreeTextProps } from '../FreeText';
|
|
2
2
|
export interface HistogramTab {
|
|
3
|
+
/** Tab label shown above the chart */
|
|
3
4
|
label: string;
|
|
5
|
+
/** Bar heights, one entry per bucket */
|
|
4
6
|
data: number[];
|
|
5
7
|
}
|
|
6
8
|
export interface HistogramProps {
|
|
9
|
+
/** Discriminator identifying this spec as a histogram */
|
|
7
10
|
componentType: 'histogram';
|
|
11
|
+
/** Heading shown above the tabs */
|
|
8
12
|
title?: string;
|
|
13
|
+
/** Free text blocks rendered under the chart */
|
|
9
14
|
description?: FreeTextProps[];
|
|
15
|
+
/** Tick values along the x axis; must contain at least one item */
|
|
10
16
|
xAxisLabels: number[];
|
|
17
|
+
/** Tick values along the y axis; must contain at least one item */
|
|
11
18
|
yAxisLabels: number[];
|
|
19
|
+
/** Datasets selectable by tab; the first one is shown initially */
|
|
12
20
|
tabs: HistogramTab[];
|
|
13
21
|
}
|
|
14
22
|
export interface HistogramTabsProps {
|
|
23
|
+
/** Tab labels in display order */
|
|
15
24
|
options: string[];
|
|
25
|
+
/** Index of the selected tab */
|
|
16
26
|
active: number;
|
|
27
|
+
/** Called with the index of the newly selected tab */
|
|
17
28
|
onChange: (index: number) => void;
|
|
18
29
|
}
|
|
19
30
|
export interface HistogramChartProps {
|
|
31
|
+
/** Dataset to plot */
|
|
20
32
|
dataset: HistogramTab;
|
|
33
|
+
/** Tick values along the x axis */
|
|
21
34
|
xAxisLabels: number[];
|
|
35
|
+
/** Tick values along the y axis */
|
|
22
36
|
yAxisLabels: number[];
|
|
23
37
|
}
|
|
24
38
|
interface HistogramDatapoint {
|
|
@@ -1,33 +1,50 @@
|
|
|
1
1
|
import { SelectChangeEvent } from '@mui/material/Select';
|
|
2
2
|
import { ScoreProps } from '../Score';
|
|
3
3
|
interface ModelTypeOption {
|
|
4
|
+
/** Option label shown in the dropdown */
|
|
4
5
|
title: string;
|
|
6
|
+
/** Visualization this option switches the viewer to. Read by the host app, not by this component */
|
|
5
7
|
target: {
|
|
6
8
|
visualizationType: string;
|
|
7
9
|
annotation: {
|
|
10
|
+
/** Annotation name; must match the LOAR annotation it refers to */
|
|
8
11
|
name: string;
|
|
12
|
+
/** Measurement region, also used as the option's dropdown value */
|
|
9
13
|
dimension: string;
|
|
10
14
|
color: string;
|
|
11
15
|
};
|
|
12
16
|
};
|
|
13
17
|
key: string;
|
|
14
18
|
value: number;
|
|
19
|
+
/** Sensitivity of this model type; must be a number */
|
|
15
20
|
sensitivity: number;
|
|
21
|
+
/** Specificity of this model type; must be a number */
|
|
16
22
|
specificity: number;
|
|
17
23
|
}
|
|
18
24
|
export interface ModelTypeSpec {
|
|
25
|
+
/** Discriminator identifying this spec as a model type selector */
|
|
19
26
|
componentType: 'modelType';
|
|
27
|
+
/** Heading shown above the sensitivity and specificity scores */
|
|
20
28
|
title: string;
|
|
29
|
+
/** Subtitle rendered at the top of the dropdown list */
|
|
21
30
|
optionTitle?: string;
|
|
31
|
+
/** Scores to show per model type, keyed by the option's `target.annotation.dimension` */
|
|
22
32
|
scoreItems: Record<string, ScoreProps[]>;
|
|
33
|
+
/** Sensitivity of the currently applied model type */
|
|
23
34
|
currentSensitivity: ScoreProps;
|
|
35
|
+
/** Specificity of the currently applied model type */
|
|
24
36
|
currentSpecificity: ScoreProps;
|
|
37
|
+
/** Selectable model types; must contain at least one item */
|
|
25
38
|
options: ModelTypeOption[];
|
|
39
|
+
/** Dimension of the model type currently applied; selects the initial dropdown value */
|
|
26
40
|
userModelType: string;
|
|
41
|
+
/** Guidance text rendered under the update button */
|
|
27
42
|
description?: string;
|
|
28
43
|
}
|
|
29
44
|
export interface ModelTypeProps extends ModelTypeSpec {
|
|
45
|
+
/** Called when a different model type is picked from the dropdown */
|
|
30
46
|
onChangeDropdown: (event: SelectChangeEvent) => void;
|
|
47
|
+
/** Called when the update button is pressed; the button is disabled until the selection changes */
|
|
31
48
|
onClickUpdateConfiguration: () => void;
|
|
32
49
|
}
|
|
33
50
|
export {};
|
|
@@ -9,7 +9,9 @@ import { ThresholdProps } from '../Threshold';
|
|
|
9
9
|
import { HistogramProps } from '../Histogram';
|
|
10
10
|
import { ModelTypeProps } from '../ModelType';
|
|
11
11
|
interface PreviewProps {
|
|
12
|
+
/** Layer toggles rendered in the upper section, in display order */
|
|
12
13
|
visualizationControls: (ToggleControlProps | ToggleControlGroupProps | AnalysisBarProps)[];
|
|
14
|
+
/** Result summary components rendered in the lower section, in display order */
|
|
13
15
|
analysisSummary: (AccordionProps | AnalysisBarProps | StatisticProps | ScoreProps | FreeTextProps | ThresholdProps | HistogramProps | ModelTypeProps)[];
|
|
14
16
|
}
|
|
15
17
|
export type { PreviewProps };
|
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
import { PresentationElementSize } from '../presentations.types';
|
|
2
2
|
interface ScoreProps {
|
|
3
|
+
/** Discriminator identifying this spec as a score */
|
|
3
4
|
componentType: 'score';
|
|
5
|
+
/** Score name shown before the value */
|
|
4
6
|
title: string;
|
|
7
|
+
/** Text size and weight preset */
|
|
5
8
|
size?: PresentationElementSize;
|
|
9
|
+
/** The score value and how it is coloured */
|
|
6
10
|
metrics: {
|
|
11
|
+
/** Formatted score value shown after the title */
|
|
7
12
|
value?: string;
|
|
13
|
+
/** Qualitative result appended after the value, capitalised on render */
|
|
8
14
|
scoreType?: 'positive' | 'negative';
|
|
15
|
+
/** Colour applied to the score type, and to the whole line when `isFullColored` is set */
|
|
9
16
|
color?: string;
|
|
17
|
+
/** Applies `color` to the title and value as well, not just the score type */
|
|
10
18
|
isFullColored?: boolean;
|
|
11
19
|
};
|
|
12
20
|
}
|
|
@@ -1,15 +1,24 @@
|
|
|
1
1
|
import { BoxProps } from '@mui/material';
|
|
2
2
|
import { PresentationSymbolProps } from '../presentations.types';
|
|
3
3
|
export interface StatisticSpec extends BoxProps {
|
|
4
|
+
/** Discriminator identifying this spec as a statistic */
|
|
4
5
|
componentType: 'statistic';
|
|
6
|
+
/** Label describing the metric */
|
|
5
7
|
title: string;
|
|
8
|
+
/** `horizontal` puts the value on the same line as the title, `vertical` stacks them */
|
|
6
9
|
layout?: 'horizontal' | 'vertical';
|
|
10
|
+
/** Formatted value shown next to the title */
|
|
7
11
|
metrics?: string;
|
|
12
|
+
/** Text size and weight preset */
|
|
8
13
|
size?: 'small-dimmed' | 'small' | 'small-bold' | 'medium' | 'medium-bold' | 'large-bold';
|
|
14
|
+
/** Shape of the legend marker drawn before the title; horizontal layout only */
|
|
9
15
|
symbol?: PresentationSymbolProps['symbol'];
|
|
16
|
+
/** Fill colour of the legend marker */
|
|
10
17
|
color?: string;
|
|
18
|
+
/** DOM id applied to the container */
|
|
11
19
|
id?: string;
|
|
12
20
|
}
|
|
13
21
|
export interface StatisticProps extends StatisticSpec {
|
|
22
|
+
/** Renders the marker and title at reduced opacity */
|
|
14
23
|
isDimmed?: boolean;
|
|
15
24
|
}
|
|
@@ -4,9 +4,13 @@ import { SelectChangeEvent } from '@mui/material/Select';
|
|
|
4
4
|
import { ScoreProps } from '../Score';
|
|
5
5
|
import { StatisticProps } from '../Statistic';
|
|
6
6
|
export interface ThresholdOption {
|
|
7
|
+
/** Option label shown in the dropdown, also used as its value */
|
|
7
8
|
title: string;
|
|
9
|
+
/** Grouping key for the option. Read by the host app, not by this component */
|
|
8
10
|
category: string;
|
|
11
|
+
/** Threshold this option applies, on the 0-100 intensity scale */
|
|
9
12
|
value: number;
|
|
13
|
+
/** Marks the option as a fixed preset, which locks the slider. Read by the host app, not by this component */
|
|
10
14
|
isPreset?: boolean;
|
|
11
15
|
}
|
|
12
16
|
export interface ThresholdMark {
|
|
@@ -16,33 +20,49 @@ export interface ThresholdMark {
|
|
|
16
20
|
label?: string;
|
|
17
21
|
}
|
|
18
22
|
export interface ThresholdSpec {
|
|
23
|
+
/** Discriminator identifying this spec as a threshold control */
|
|
19
24
|
componentType: 'threshold';
|
|
20
25
|
/** Overall score summary shown above the cell statistics; omitted when the analysis has no score */
|
|
21
26
|
totalScore?: ScoreProps;
|
|
27
|
+
/** Total cell count shown above the per-category statistics */
|
|
22
28
|
totalCells: StatisticProps;
|
|
29
|
+
/** Per-category cell statistics shown under the total */
|
|
23
30
|
statisticItems: StatisticProps[];
|
|
31
|
+
/** Heading shown above the option dropdown */
|
|
24
32
|
title?: string;
|
|
33
|
+
/** Guidance text shown under the slider, chosen by whether a preset is selected */
|
|
25
34
|
description?: {
|
|
26
35
|
/** Guidance shown while a preset option is selected */
|
|
27
36
|
preset?: string;
|
|
28
37
|
/** Guidance shown while a user-adjustable option is selected */
|
|
29
38
|
user?: string;
|
|
30
39
|
};
|
|
40
|
+
/** Selectable threshold options listed in the dropdown */
|
|
31
41
|
options: ThresholdOption[];
|
|
42
|
+
/** Slider increment; defaults to 1 */
|
|
32
43
|
controlStep?: number;
|
|
33
44
|
/** Labels the selected option's threshold on the slider, e.g. `Default: 40`; off by default */
|
|
34
45
|
showDefaultMark?: boolean;
|
|
35
46
|
}
|
|
36
47
|
export interface ThresholdProps extends ThresholdSpec {
|
|
48
|
+
/** Current selection and slider position, owned by the host app */
|
|
37
49
|
thresholdState?: {
|
|
50
|
+
/** Title of the selected option */
|
|
38
51
|
selectedItem: string;
|
|
52
|
+
/** Current slider position on the 0-100 intensity scale */
|
|
39
53
|
sliderValue: number;
|
|
54
|
+
/** Locks the slider and shows `description.preset` instead of `description.user` */
|
|
40
55
|
isPresetSelected: boolean;
|
|
41
56
|
};
|
|
57
|
+
/** Called when a different option is picked from the dropdown */
|
|
42
58
|
onChangeDropdown: (event: SelectChangeEvent) => void;
|
|
59
|
+
/** Called on every slider movement */
|
|
43
60
|
onChangeSlider: (event: Event | SyntheticEvent, value: number | number[]) => void;
|
|
61
|
+
/** Called once the slider is released */
|
|
44
62
|
onSliderChangeCommitted: (event: Event | SyntheticEvent, value: number | number[]) => void;
|
|
63
|
+
/** Called when the update button is pressed */
|
|
45
64
|
onClickUpdateConfiguration: () => void;
|
|
65
|
+
/** Shows a spinner on the update button and blocks it */
|
|
46
66
|
isLoading?: boolean;
|
|
47
67
|
}
|
|
48
68
|
export interface BaseSliderProps extends SliderProps {
|
|
@@ -3,47 +3,76 @@ import type { AnalysisBarProps } from '../AnalysisBar';
|
|
|
3
3
|
import type { PresentationElementSize, PresentationSymbol } from '../presentations.types';
|
|
4
4
|
import { StatisticProps } from '../Statistic';
|
|
5
5
|
export interface ToggleControlSpec {
|
|
6
|
+
/** Discriminator identifying this spec as a toggle */
|
|
6
7
|
componentType: 'toggle';
|
|
8
|
+
/** Label shown next to the switch */
|
|
7
9
|
title: string;
|
|
10
|
+
/** Text size and weight preset */
|
|
8
11
|
size?: PresentationElementSize;
|
|
12
|
+
/** Shape of the legend marker drawn before the title */
|
|
9
13
|
symbol?: PresentationSymbol;
|
|
14
|
+
/** Fill colour of the legend marker */
|
|
10
15
|
color?: string;
|
|
16
|
+
/** Whether the switch is on; required */
|
|
11
17
|
checked: boolean;
|
|
18
|
+
/** Components rendered in a tooltip behind an info icon before the title */
|
|
12
19
|
tooltip?: (StatisticProps | FreeTextProps)[];
|
|
20
|
+
/** Statistics rendered under the toggle row */
|
|
13
21
|
content?: StatisticProps[];
|
|
22
|
+
/** Analysis bar rendered under the toggle row, below `content` */
|
|
14
23
|
bar?: AnalysisBarProps;
|
|
15
24
|
}
|
|
16
25
|
interface PixelAnnotationSpec {
|
|
26
|
+
/** Annotation name; must match the LOAR `pixelAnnotations` entry */
|
|
17
27
|
name: string;
|
|
28
|
+
/** Single measurement region to render */
|
|
18
29
|
dimension?: string;
|
|
30
|
+
/** Multiple measurement regions to render */
|
|
19
31
|
dimensions?: string[];
|
|
20
32
|
}
|
|
21
33
|
interface CellAnnotationSpec {
|
|
34
|
+
/** Annotation name; must match the LOAR `cellAnnotations` entry */
|
|
22
35
|
name: string;
|
|
23
36
|
}
|
|
24
37
|
interface GridAnnotationSpec {
|
|
38
|
+
/** Annotation name; must match the LOAR `gridAnnotations` entry */
|
|
25
39
|
name: string;
|
|
26
40
|
}
|
|
27
41
|
interface CutOffLabelProps {
|
|
42
|
+
/** Colour applied to the label's segment */
|
|
28
43
|
color: string;
|
|
44
|
+
/** Index of the label within the annotation's label set */
|
|
29
45
|
labelIndex: number;
|
|
30
46
|
}
|
|
47
|
+
/** Visualization layer a toggle controls. Read by the host app, not by this component */
|
|
31
48
|
interface TargetSpec {
|
|
49
|
+
/** Kind of visualization to render, e.g. `cell`, `grid`, `heatmap` */
|
|
32
50
|
visualizationType: string;
|
|
33
51
|
annotationId?: string;
|
|
52
|
+
/** Annotation to render, either a spec object or the annotation name */
|
|
34
53
|
annotation: PixelAnnotationSpec | CellAnnotationSpec | GridAnnotationSpec | string;
|
|
54
|
+
/** Single annotation label to render */
|
|
35
55
|
label?: string;
|
|
36
56
|
labelId?: string;
|
|
57
|
+
/** Multiple annotation labels to render, optionally with per-label colours */
|
|
37
58
|
labels?: (string | CutOffLabelProps)[];
|
|
59
|
+
/** Single colour applied to the layer */
|
|
38
60
|
color?: string;
|
|
61
|
+
/** Per-label colours applied to the layer */
|
|
39
62
|
colors?: string[];
|
|
40
63
|
}
|
|
41
64
|
export interface ToggleControlProps extends ToggleControlSpec {
|
|
65
|
+
/** Marks this toggle as a group header, adding spacing below it. Set by ToggleControlGroup */
|
|
42
66
|
isParent?: boolean;
|
|
67
|
+
/** Renders the marker and title at reduced opacity, and blocks the switch */
|
|
43
68
|
isDimmed?: boolean;
|
|
69
|
+
/** Blocks interaction with the switch */
|
|
44
70
|
disabled?: boolean;
|
|
71
|
+
/** Visualization layer this toggle controls. Read by the host app, not by this component */
|
|
45
72
|
target?: TargetSpec;
|
|
73
|
+
/** Marks this toggle as the master switch for every layer. Read by the host app, not by this component */
|
|
46
74
|
isMaster?: boolean;
|
|
75
|
+
/** Called when the switch is flipped */
|
|
47
76
|
onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
|
|
48
77
|
}
|
|
49
78
|
export {};
|
|
@@ -5,17 +5,28 @@ import { StatisticProps } from '../Statistic';
|
|
|
5
5
|
import type { ToggleControlProps } from '../ToggleControl';
|
|
6
6
|
export type ToggleControlGroupBehavior = 'exclusive' | 'multi';
|
|
7
7
|
export interface ToggleGroupControlSpec {
|
|
8
|
+
/** Discriminator identifying this spec as a toggle group */
|
|
8
9
|
componentType: 'toggleGroup';
|
|
10
|
+
/** Label shown next to the group's own switch */
|
|
9
11
|
title: string;
|
|
12
|
+
/** Whether the children may be on together (`multi`) or only one at a time (`exclusive`). Read by the host app, not by this component */
|
|
10
13
|
behavior?: ToggleControlGroupBehavior;
|
|
14
|
+
/** Text size and weight preset for the group header */
|
|
11
15
|
size?: PresentationElementSize;
|
|
16
|
+
/** Components rendered in a tooltip behind an info icon before the title */
|
|
12
17
|
tooltip?: (StatisticProps | FreeTextProps)[];
|
|
18
|
+
/** Analysis bar rendered under the group header row */
|
|
13
19
|
bar?: AnalysisBarProps;
|
|
20
|
+
/** Whether the group switch is on; turning it off dims and disables every child. Required */
|
|
14
21
|
checked: boolean;
|
|
22
|
+
/** Toggles rendered under the group header; must contain at least one item */
|
|
15
23
|
childToggles: ToggleControlProps[];
|
|
16
24
|
}
|
|
17
25
|
export interface ToggleControlGroupProps extends ToggleGroupControlSpec {
|
|
26
|
+
/** Called when the group switch is flipped */
|
|
18
27
|
onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
|
|
28
|
+
/** Blocks interaction with the group switch */
|
|
19
29
|
disabled?: boolean;
|
|
30
|
+
/** Renders the group and its children at reduced opacity */
|
|
20
31
|
isDimmed?: boolean;
|
|
21
32
|
}
|
|
@@ -2,13 +2,19 @@ import { TypographyProps } from '@mui/material';
|
|
|
2
2
|
export type PresentationElementSize = 'small-dimmed' | 'small' | 'small-bold' | 'medium' | 'medium-bold' | 'large-bold';
|
|
3
3
|
export type PresentationSymbol = 'circle' | 'rectangle' | 'border-circle' | 'border-rectangle';
|
|
4
4
|
interface PresentationSymbolProps {
|
|
5
|
+
/** Shape of the legend marker drawn next to a label */
|
|
5
6
|
symbol?: PresentationSymbol;
|
|
7
|
+
/** Fill colour of the legend marker */
|
|
6
8
|
color?: string;
|
|
9
|
+
/** Renders the marker at reduced opacity */
|
|
7
10
|
isDimmed?: boolean;
|
|
8
11
|
}
|
|
9
12
|
interface PresentationTypographyProps extends TypographyProps {
|
|
13
|
+
/** Text size and weight preset */
|
|
10
14
|
size?: PresentationElementSize;
|
|
15
|
+
/** Renders the text at reduced opacity */
|
|
11
16
|
isDimmed?: boolean;
|
|
17
|
+
/** CSS display mode of the text element */
|
|
12
18
|
display?: 'block' | 'inline-block' | 'flex' | 'inherit';
|
|
13
19
|
}
|
|
14
20
|
export type { PresentationSymbolProps, PresentationTypographyProps };
|
package/package.json
CHANGED