@lunit/oui 1.0.1-alpha.13 → 1.0.1-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 (212) hide show
  1. package/dist/index.js +0 -1
  2. package/dist/types/index.d.ts +0 -1
  3. package/package.json +7 -20
  4. package/src/assets/ic-bell-noti-outlined-20px.tsx +21 -0
  5. package/src/assets/ic-close-large-outlined-20px.tsx +17 -0
  6. package/src/assets/ic-close-small-outlined-20px.tsx +17 -0
  7. package/src/assets/ic-download-pdf-outlined-20px.tsx +18 -0
  8. package/src/assets/ic-ellipse-outlined-20px.tsx +17 -0
  9. package/src/assets/ic-filter-noti-outlined-20px.tsx +21 -0
  10. package/src/assets/ic-hide-large-outlined-20px.tsx +13 -0
  11. package/src/assets/ic-hide-small-outlined-20px.tsx +17 -0
  12. package/src/assets/ic-information-large-outlined-20px.tsx +17 -0
  13. package/src/assets/ic-information-small-outlined-20px.tsx +17 -0
  14. package/src/assets/ic-manufacturer-outlined-20px.tsx +19 -0
  15. package/src/assets/ic-rectangle-outlined-20px.tsx +17 -0
  16. package/src/assets/ic-refresh-left-outlined-20px.tsx +17 -0
  17. package/src/assets/ic-refresh-right-outlined-20px.tsx +13 -0
  18. package/src/assets/ic-show-large-outlined-20px.tsx +17 -0
  19. package/src/assets/ic-show-small-outlined-20px.tsx +17 -0
  20. package/src/assets/ic_bell_noti=outlined_20px.svg +5 -0
  21. package/src/assets/ic_close_large=outlined_20px.svg +4 -0
  22. package/src/assets/ic_close_small=outlined_20px.svg +4 -0
  23. package/src/assets/ic_download_pdf=outlined_20px.svg +7 -0
  24. package/src/assets/ic_ellipse=outlined_20px.svg +4 -0
  25. package/src/assets/ic_filter_noti=outlined_20px.svg +5 -0
  26. package/src/assets/ic_hide_large=outlined_20px.svg +4 -0
  27. package/src/assets/ic_hide_small=outlined_20px.svg +4 -0
  28. package/src/assets/ic_information_large=outlined_20px.svg +4 -0
  29. package/src/assets/ic_information_small=outlined_20px.svg +4 -0
  30. package/src/assets/ic_manufacturer=outlined_20px.svg +3 -0
  31. package/src/assets/ic_rectangle=outlined_20px.svg +4 -0
  32. package/src/assets/ic_refresh_left=outlined_20px.svg +4 -0
  33. package/src/assets/ic_refresh_right=outlined_20px.svg +4 -0
  34. package/src/assets/ic_show_large=outlined_20px.svg +4 -0
  35. package/src/assets/ic_show_small=outlined_20px.svg +4 -0
  36. package/src/assets/index.ts +16 -0
  37. package/src/components/Alert/Alert.styled.ts +44 -0
  38. package/src/components/Alert/Alert.tsx +39 -0
  39. package/src/components/Alert/Alert.types.ts +5 -0
  40. package/src/components/Alert/Alert.utils.tsx +43 -0
  41. package/src/components/Alert/index.ts +5 -0
  42. package/src/components/BaseTextField/BaseTextField.styled.ts +110 -0
  43. package/src/components/BaseTextField/BaseTextField.types.ts +25 -0
  44. package/src/components/BaseTextField/BaseTextField.utils.ts +10 -0
  45. package/src/components/Button/BaseButton.tsx +19 -0
  46. package/src/components/Button/Button.tsx +117 -0
  47. package/src/components/Button/Button.types.ts +36 -0
  48. package/src/components/Button/Button.utils.ts +13 -0
  49. package/src/components/Button/index.ts +6 -0
  50. package/src/components/Button/styleds/BaseButton.styled.ts +57 -0
  51. package/src/components/Button/styleds/ContainedButton.styled.ts +123 -0
  52. package/src/components/Button/styleds/GhostButton.styled.ts +139 -0
  53. package/src/components/Button/styleds/IconButton.styled.ts +25 -0
  54. package/src/components/Button/styleds/OutlinedButton.styled.ts +144 -0
  55. package/src/components/Card/Card.styled.tsx +18 -0
  56. package/src/components/Card/Card.tsx +18 -0
  57. package/src/components/Card/Card.types.ts +10 -0
  58. package/src/components/Card/index.ts +5 -0
  59. package/src/components/Checkbox/Checkbox.styled.tsx +27 -0
  60. package/src/components/Checkbox/Checkbox.tsx +64 -0
  61. package/src/components/Checkbox/Checkbox.types.ts +16 -0
  62. package/src/components/Checkbox/Checkbox.utils.tsx +42 -0
  63. package/src/components/Checkbox/index.ts +5 -0
  64. package/src/components/Chip/Chip.styled.ts +120 -0
  65. package/src/components/Chip/Chip.tsx +33 -0
  66. package/src/components/Chip/Chip.types.ts +18 -0
  67. package/src/components/Chip/Chip.utils.tsx +50 -0
  68. package/src/components/Chip/index.ts +4 -0
  69. package/src/components/DataTable/DataTable.styled.ts +66 -0
  70. package/src/components/DataTable/DataTable.tsx +29 -0
  71. package/src/components/DataTable/index.ts +1 -0
  72. package/src/components/DatePicker/DatePicker.styled.ts +19 -0
  73. package/src/components/DatePicker/DatePicker.tsx +194 -0
  74. package/src/components/DatePicker/DatePicker.types.ts +8 -0
  75. package/src/components/DatePicker/index.ts +4 -0
  76. package/src/components/Dialog/Dialog.styled.ts +87 -0
  77. package/src/components/Dialog/Dialog.tsx +111 -0
  78. package/src/components/Dialog/Dialog.types.ts +19 -0
  79. package/src/components/Dialog/index.ts +5 -0
  80. package/src/components/Divider/Divider.styled.ts +24 -0
  81. package/src/components/Divider/Divider.tsx +13 -0
  82. package/src/components/Divider/Divider.types.ts +7 -0
  83. package/src/components/Divider/index.ts +5 -0
  84. package/src/components/Dropdown/Dropdown.styled.tsx +127 -0
  85. package/src/components/Dropdown/Dropdown.tsx +116 -0
  86. package/src/components/Dropdown/Dropdown.types.ts +31 -0
  87. package/src/components/Dropdown/Dropdown.utils.ts +13 -0
  88. package/src/components/Dropdown/DropdownItem.styled.tsx +66 -0
  89. package/src/components/Dropdown/DropdownItem.tsx +45 -0
  90. package/src/components/Dropdown/DropdownItem.types.ts +14 -0
  91. package/src/components/Dropdown/DropdownItem.utils.ts +14 -0
  92. package/src/components/Dropdown/DropdownSubtitle.styled.ts +13 -0
  93. package/src/components/Dropdown/DropdownSubtitle.tsx +9 -0
  94. package/src/components/Dropdown/DropdownSubtitle.types.ts +6 -0
  95. package/src/components/Dropdown/IconDropdown.styled.tsx +82 -0
  96. package/src/components/Dropdown/IconDropdown.tsx +56 -0
  97. package/src/components/Dropdown/IconDropdown.types.ts +22 -0
  98. package/src/components/Dropdown/index.ts +22 -0
  99. package/src/components/FileDnDZone/FileDnDZone.styled.ts +43 -0
  100. package/src/components/FileDnDZone/FileDnDZone.tsx +81 -0
  101. package/src/components/FileDnDZone/FileDnDZone.types.ts +14 -0
  102. package/src/components/FileDnDZone/FileDnDZone.utils.ts +3 -0
  103. package/src/components/FileDnDZone/index.ts +5 -0
  104. package/src/components/List/List.styled.ts +31 -0
  105. package/src/components/List/List.tsx +71 -0
  106. package/src/components/List/List.types.ts +24 -0
  107. package/src/components/List/List.utils.ts +14 -0
  108. package/src/components/List/ListItem.styled.tsx +61 -0
  109. package/src/components/List/ListItem.tsx +66 -0
  110. package/src/components/List/ListItem.types.ts +40 -0
  111. package/src/components/List/ListItemCaption.styled.tsx +7 -0
  112. package/src/components/List/ListItemCaption.tsx +18 -0
  113. package/src/components/List/ListItemCaption.types.ts +2 -0
  114. package/src/components/List/index.ts +8 -0
  115. package/src/components/LoadingIndicator/LoadingIndicator.styled.tsx +40 -0
  116. package/src/components/LoadingIndicator/LoadingIndicator.tsx +44 -0
  117. package/src/components/LoadingIndicator/LoadingIndicator.types.ts +7 -0
  118. package/src/components/LoadingIndicator/assets/DnaLoadingAnimation.json +769 -0
  119. package/src/components/LoadingIndicator/assets/DotLoadingAnimation.json +426 -0
  120. package/src/components/LoadingIndicator/index.ts +5 -0
  121. package/src/components/Menu/Menu.styled.tsx +42 -0
  122. package/src/components/Menu/Menu.tsx +28 -0
  123. package/src/components/Menu/Menu.types.ts +18 -0
  124. package/src/components/Menu/MenuItem.styled.ts +62 -0
  125. package/src/components/Menu/MenuItem.tsx +45 -0
  126. package/src/components/Menu/MenuItem.types.ts +14 -0
  127. package/src/components/Menu/index.ts +5 -0
  128. package/src/components/MuiCssBaseline.ts +78 -0
  129. package/src/components/MuiInputBase.ts +25 -0
  130. package/src/components/MuiOutlinedInput.ts +57 -0
  131. package/src/components/MuiTextField.ts +17 -0
  132. package/src/components/Pagination/Pagination.styled.tsx +71 -0
  133. package/src/components/Pagination/Pagination.tsx +182 -0
  134. package/src/components/Pagination/Pagination.types.ts +39 -0
  135. package/src/components/Pagination/index.ts +2 -0
  136. package/src/components/ProductLabel/ProductLabel.styled.ts +61 -0
  137. package/src/components/ProductLabel/ProductLabel.tsx +57 -0
  138. package/src/components/ProductLabel/ProductLabel.types.ts +10 -0
  139. package/src/components/ProductLabel/index.ts +5 -0
  140. package/src/components/Progress/CircularProgress.styled.ts +10 -0
  141. package/src/components/Progress/CircularProgress.tsx +15 -0
  142. package/src/components/Progress/CircularProgress.types.ts +6 -0
  143. package/src/components/Progress/LinearProgress.styled.ts +15 -0
  144. package/src/components/Progress/LinearProgress.tsx +16 -0
  145. package/src/components/Progress/LinearProgress.types.ts +7 -0
  146. package/src/components/Progress/index.ts +4 -0
  147. package/src/components/Radio/Radio.styled.ts +35 -0
  148. package/src/components/Radio/Radio.tsx +60 -0
  149. package/src/components/Radio/Radio.types.ts +15 -0
  150. package/src/components/Radio/RadioGroup.styled.ts +6 -0
  151. package/src/components/Radio/RadioGroup.tsx +23 -0
  152. package/src/components/Radio/RadioGroup.types.ts +10 -0
  153. package/src/components/Radio/index.ts +7 -0
  154. package/src/components/Stepper/Stepper.styled.ts +38 -0
  155. package/src/components/Stepper/Stepper.tsx +24 -0
  156. package/src/components/Stepper/Stepper.types.ts +13 -0
  157. package/src/components/Stepper/index.ts +5 -0
  158. package/src/components/TabbedPanel/TabbedPanel.styled.ts +129 -0
  159. package/src/components/TabbedPanel/TabbedPanel.tsx +70 -0
  160. package/src/components/TabbedPanel/TabbedPanel.types.ts +36 -0
  161. package/src/components/TabbedPanel/TabbedPanel.utils.ts +21 -0
  162. package/src/components/TabbedPanel/index.ts +5 -0
  163. package/src/components/TextField/TextArea.styled.tsx +36 -0
  164. package/src/components/TextField/TextArea.tsx +35 -0
  165. package/src/components/TextField/TextArea.types.ts +28 -0
  166. package/src/components/TextField/TextInput.styled.tsx +115 -0
  167. package/src/components/TextField/TextInput.tsx +27 -0
  168. package/src/components/TextField/TextInput.types.ts +46 -0
  169. package/src/components/TextField/TextInput.utils.ts +7 -0
  170. package/src/components/TextField/components/Buttons.tsx +26 -0
  171. package/src/components/TextField/components/NormalTextInput.tsx +95 -0
  172. package/src/components/TextField/components/PasswordInput.tsx +92 -0
  173. package/src/components/TextField/index.ts +7 -0
  174. package/src/components/Tooltip/Tooltip.styled.tsx +36 -0
  175. package/src/components/Tooltip/Tooltip.tsx +58 -0
  176. package/src/components/Tooltip/Tooltip.types.ts +24 -0
  177. package/src/components/Tooltip/Tooltip.utils.ts +46 -0
  178. package/src/components/Tooltip/index.ts +5 -0
  179. package/src/components/UploadManager/UploadManager.styled.ts +49 -0
  180. package/src/components/UploadManager/UploadManager.tsx +271 -0
  181. package/src/components/UploadManager/UploadManager.types.ts +16 -0
  182. package/src/components/UploadManager/index.ts +5 -0
  183. package/src/components/index.ts +23 -0
  184. package/src/foundations/index.ts +4 -0
  185. package/src/foundations/palette.ts +418 -0
  186. package/src/foundations/spacing.ts +5 -0
  187. package/src/foundations/styles.ts +9 -0
  188. package/src/foundations/typography.ts +492 -0
  189. package/src/icons/BellNoti/index.tsx +28 -0
  190. package/src/icons/CloseLarge/index.tsx +28 -0
  191. package/src/icons/CloseSmall/index.tsx +28 -0
  192. package/src/icons/DownloadPdf/index.tsx +28 -0
  193. package/src/icons/Ellipse/index.tsx +28 -0
  194. package/src/icons/FilterNoti/index.tsx +28 -0
  195. package/src/icons/HideLarge/index.tsx +28 -0
  196. package/src/icons/HideSmall/index.tsx +28 -0
  197. package/src/icons/InformationLarge/index.tsx +28 -0
  198. package/src/icons/InformationSmall/index.tsx +28 -0
  199. package/src/icons/Manufacturer/index.tsx +28 -0
  200. package/src/icons/Rectangle/index.tsx +28 -0
  201. package/src/icons/RefreshLeft/index.tsx +28 -0
  202. package/src/icons/RefreshRight/index.tsx +28 -0
  203. package/src/icons/ShowLarge/index.tsx +28 -0
  204. package/src/icons/ShowSmall/index.tsx +28 -0
  205. package/src/icons/index.ts +180 -0
  206. package/src/index.ts +4 -0
  207. package/src/react-app-env.d.ts +71 -0
  208. package/src/reportWebVitals.ts +15 -0
  209. package/src/setupTests.ts +5 -0
  210. package/src/systems/drawer.ts +27 -0
  211. package/src/systems/index.ts +7 -0
  212. package/src/theme.ts +22 -0
@@ -0,0 +1,81 @@
1
+ import React from 'react';
2
+ import { Typography } from '@mui/material';
3
+ import {
4
+ BaseFileDnDZone,
5
+ DnDSection,
6
+ DnDMainBox,
7
+ FileDnDZoneContainer,
8
+ } from './FileDnDZone.styled';
9
+ import FileDnDZoneProps from './FileDnDZone.types';
10
+
11
+ import theme from '../../theme';
12
+ import { DEFAULT_FILE_FORMATS } from './FileDnDZone.utils';
13
+
14
+ const FileDnDZone = ({
15
+ slidesUploaded,
16
+ maxSlideLimit = 500,
17
+ acceptedFileFormats = DEFAULT_FILE_FORMATS,
18
+ disabled,
19
+ WrapperProps,
20
+ OuterBoxProps,
21
+ InnerBoxProps,
22
+ SectionBoxProps,
23
+ }: FileDnDZoneProps) => {
24
+ const disabledSX = {
25
+ opacity: 0.4,
26
+ };
27
+
28
+ return (
29
+ <FileDnDZoneContainer
30
+ sx={disabled ? disabledSX : {}}
31
+ {...WrapperProps}
32
+ >
33
+ <BaseFileDnDZone {...OuterBoxProps}>
34
+ <Typography
35
+ variant="h7"
36
+ sx={{ color: theme.palette.neutralGrey[25] }}
37
+ >
38
+ Drag and drop your slide files here
39
+ </Typography>
40
+ <DnDMainBox {...InnerBoxProps}>
41
+ <DnDSection {...SectionBoxProps}>
42
+ <Typography
43
+ variant="body_sb1"
44
+ sx={{ color: theme.palette.neutralGrey[45] }}
45
+ >
46
+ Supported file formats
47
+ </Typography>
48
+ <Typography
49
+ variant="body_sb1"
50
+ sx={{ color: theme.palette.neutralGrey[25], padding: '0 18px', textAlign: 'center' }}
51
+ >
52
+ {acceptedFileFormats}
53
+ </Typography>
54
+ </DnDSection>
55
+ <DnDSection {...SectionBoxProps}>
56
+ <Typography
57
+ variant="body_sb1"
58
+ sx={{ color: theme.palette.neutralGrey[45] }}
59
+ >
60
+ Allowed number of slides
61
+ </Typography>
62
+ <Typography
63
+ variant="body_sb1"
64
+ sx={{ color: theme.palette.neutralGrey[25] }}
65
+ >
66
+ {`You have uploaded ${slidesUploaded.toLocaleString()} slides on Lunit SCOPE.`}
67
+ </Typography>
68
+ <Typography
69
+ variant="body_sb1"
70
+ sx={{ color: theme.palette.neutralGrey[25] }}
71
+ >
72
+ {`The number of slides cannot exceed ${maxSlideLimit.toLocaleString()}.`}
73
+ </Typography>
74
+ </DnDSection>
75
+ </DnDMainBox>
76
+ </BaseFileDnDZone>
77
+ </FileDnDZoneContainer>
78
+ );
79
+ };
80
+
81
+ export default FileDnDZone;
@@ -0,0 +1,14 @@
1
+ import type { BoxProps } from '@mui/material';
2
+
3
+ interface FileDnDZoneProps {
4
+ slidesUploaded: number;
5
+ maxSlideLimit?: number;
6
+ acceptedFileFormats?: string;
7
+ disabled?: boolean;
8
+ WrapperProps?: BoxProps;
9
+ OuterBoxProps?: BoxProps;
10
+ InnerBoxProps?: BoxProps;
11
+ SectionBoxProps?: BoxProps;
12
+ }
13
+
14
+ export default FileDnDZoneProps;
@@ -0,0 +1,3 @@
1
+ const DEFAULT_FILE_FORMATS = 'Leica(.svs), 3DHistech(.mrxs), and Philips(.isyntax, .tiff)';
2
+
3
+ export { DEFAULT_FILE_FORMATS };
@@ -0,0 +1,5 @@
1
+ import FileDnDZone from './FileDnDZone';
2
+ import type FileDnDZoneProps from './FileDnDZone.types';
3
+
4
+ export { FileDnDZone };
5
+ export type { FileDnDZoneProps };
@@ -0,0 +1,31 @@
1
+ import { styled, List, ListSubheader } from '@mui/material';
2
+ import type { ListSubheaderProps } from './List.types';
3
+
4
+ export const MuiList = styled(List)(({ theme }) => ({
5
+ padding: theme.spacing(2),
6
+ }));
7
+
8
+ export const MuiListSubheader = styled(ListSubheader, {
9
+ shouldForwardProp: (prop) => !['type', 'clickable'].includes(prop.toString()),
10
+ })<ListSubheaderProps>(({ type, clickable, theme }) => ({
11
+ display: 'flex',
12
+ justifyContent: 'space-between',
13
+ alignItems: 'center',
14
+ height: '36px',
15
+ padding: '0px 8px',
16
+ backgroundColor: 'transparent',
17
+ ...(type === 'bold'
18
+ ? {
19
+ ...theme.typography.body_b1,
20
+ color: theme.palette.neutralGrey[0],
21
+ }
22
+ : {
23
+ ...theme.typography.small_body_m1,
24
+ color: theme.palette.neutralGrey[40],
25
+ }),
26
+ ...(clickable && { cursor: 'pointer' }),
27
+ svg: {
28
+ width: '20px',
29
+ height: '20px',
30
+ },
31
+ }));
@@ -0,0 +1,71 @@
1
+ /* eslint-disable no-nested-ternary */
2
+ import React from 'react';
3
+ import { createContext, useMemo } from 'react';
4
+ import { ArrowDownSm, ArrowUpSm } from '../../icons';
5
+ import { Collapse } from '@mui/material';
6
+ import { MuiList, MuiListSubheader } from './List.styled';
7
+ import type { ListProps, ListContextValue } from './List.types';
8
+
9
+ export const ListContext = createContext<ListContextValue>({
10
+ size: 'small',
11
+ showCheck: false,
12
+ });
13
+
14
+ const List = ({
15
+ size = 'small',
16
+ showCheck = false,
17
+ subheader,
18
+ subheaderType = 'bold',
19
+ open = 'visible',
20
+ children,
21
+ onOpen,
22
+ onClose,
23
+ ...props
24
+ }: ListProps) => {
25
+ const contextValue = useMemo<ListContextValue>(() => ({ size, showCheck }), [size, showCheck]);
26
+
27
+ const collapsible = open !== 'visible';
28
+
29
+ const onSubheaderClick = ((event: React.MouseEvent<HTMLLIElement>) => {
30
+ if (open === 'visible') {
31
+ return;
32
+ }
33
+ const handler = open ? onClose : onOpen;
34
+ handler?.(event);
35
+ }) as React.ComponentProps<typeof MuiListSubheader>['onClick'];
36
+
37
+ return (
38
+ <ListContext.Provider value={contextValue}>
39
+ <MuiList
40
+ {...props}
41
+ subheader={
42
+ subheader ? (
43
+ <MuiListSubheader
44
+ type={subheaderType}
45
+ clickable={collapsible}
46
+ tabIndex={collapsible ? 0 : undefined}
47
+ onClick={onSubheaderClick}
48
+ >
49
+ {subheader}
50
+ {collapsible && (open ? <ArrowDownSm /> : <ArrowUpSm />)}
51
+ </MuiListSubheader>
52
+ ) : null
53
+ }
54
+ >
55
+ {collapsible ? (
56
+ <Collapse
57
+ in={open}
58
+ timeout="auto"
59
+ unmountOnExit
60
+ >
61
+ {children}
62
+ </Collapse>
63
+ ) : (
64
+ children
65
+ )}
66
+ </MuiList>
67
+ </ListContext.Provider>
68
+ );
69
+ };
70
+
71
+ export default List;
@@ -0,0 +1,24 @@
1
+ import type {
2
+ ListProps as MuiListProps,
3
+ ListSubheaderProps as MuiListSubheaderProps,
4
+ } from '@mui/material';
5
+
6
+ export type ListSize = 'small' | 'medium' | 'large';
7
+
8
+ export interface ListProps extends MuiListProps {
9
+ size?: ListSize;
10
+ subheaderType?: ListSubheaderProps['type'];
11
+ open?: boolean | 'visible';
12
+ onOpen?: (event: React.MouseEvent<HTMLLIElement>) => void;
13
+ onClose?: (event: React.MouseEvent<HTMLLIElement>) => void;
14
+ showCheck?: boolean;
15
+ }
16
+
17
+ export interface ListSubheaderProps extends MuiListSubheaderProps {
18
+ type?: 'bold' | 'normal';
19
+ clickable?: boolean;
20
+ }
21
+ export interface ListContextValue {
22
+ size: ListSize;
23
+ showCheck: boolean;
24
+ }
@@ -0,0 +1,14 @@
1
+ import { ListSize } from './List.types';
2
+
3
+ const getPadding = (size: ListSize) => {
4
+ if (size === 'large') {
5
+ return '14px';
6
+ }
7
+ if (size === 'medium') {
8
+ return '10px';
9
+ }
10
+ // 'small'
11
+ return '6px';
12
+ };
13
+
14
+ export default getPadding;
@@ -0,0 +1,61 @@
1
+ import React from 'react';
2
+ import {
3
+ ListItem,
4
+ ListItemButton,
5
+ ListItemIcon,
6
+ ListItemText,
7
+ styled,
8
+ typographyClasses,
9
+ } from '@mui/material';
10
+ import { Check, Dummy } from '../../icons';
11
+ import getPadding from './List.utils';
12
+ import type { StyledListItemButtonProps } from './ListItem.types';
13
+
14
+ export const StyledListItem = styled(ListItem)({
15
+ width: '100%',
16
+ });
17
+
18
+ export const StyledListItemButton = styled(({ size, ...props }: StyledListItemButtonProps) => (
19
+ <ListItemButton {...props} />
20
+ ))(({ theme, size }) => ({
21
+ borderRadius: '8px',
22
+ padding: `${getPadding(size)} 8px`,
23
+ '&.Mui-selected': {
24
+ background: 'transparent',
25
+ },
26
+ '&:hover, &.Mui-selected:hover, &.Mui-focusVisible, &.Mui-selected.Mui-focusVisible': {
27
+ backgroundColor: theme.palette.neutralGrey[75],
28
+ },
29
+ }));
30
+
31
+ export const slotStyles = {
32
+ minWidth: '20px',
33
+ height: '20px',
34
+ color: 'currentColor',
35
+ svg: {
36
+ width: '100%',
37
+ height: '100%',
38
+ color: 'currentColor !important',
39
+ },
40
+ };
41
+
42
+ export const StyledListItemText = styled(ListItemText)(({ theme }) => ({
43
+ margin: 0,
44
+ [`& .${typographyClasses.body1}`]: {
45
+ ...theme.typography.body5,
46
+ },
47
+ }));
48
+
49
+ export const StyledListItemStartSlot = styled(ListItemIcon)(({ theme }) => ({
50
+ ...slotStyles,
51
+ marginRight: theme.spacing(2),
52
+ }));
53
+
54
+ export const StyledListItemEndSlot = styled(ListItemIcon)(({ theme }) => ({
55
+ ...slotStyles,
56
+ justifyContent: 'flex-end',
57
+ marginLeft: theme.spacing(2),
58
+ }));
59
+
60
+ export const CheckIcon = styled(Check)({ color: '#fff' });
61
+ export const EmptyIcon = styled(Dummy)({ visibility: 'hidden' });
@@ -0,0 +1,66 @@
1
+ import React, { useContext } from 'react';
2
+ import { ListContext } from '../List/List';
3
+ import {
4
+ StyledListItem,
5
+ StyledListItemButton,
6
+ StyledListItemText,
7
+ StyledListItemStartSlot,
8
+ StyledListItemEndSlot,
9
+ CheckIcon,
10
+ EmptyIcon,
11
+ } from './ListItem.styled';
12
+ import type { ListItemComponent, ListItemProps } from './ListItem.types';
13
+
14
+ const ListItem = (({
15
+ // Root props
16
+ rootProps,
17
+ className,
18
+ classes,
19
+ style,
20
+ sx,
21
+ // Button props
22
+ label,
23
+ startElement,
24
+ endElement,
25
+ selected,
26
+ ...props
27
+ }: ListItemProps) => {
28
+ const { size, showCheck } = useContext(ListContext);
29
+
30
+ const checkElement = (() => {
31
+ if (showCheck) {
32
+ if (selected) {
33
+ return <CheckIcon />;
34
+ }
35
+ return <EmptyIcon />;
36
+ }
37
+ return null;
38
+ })();
39
+
40
+ return (
41
+ <StyledListItem
42
+ {...rootProps}
43
+ disablePadding
44
+ className={className}
45
+ classes={classes}
46
+ style={style}
47
+ sx={sx}
48
+ >
49
+ <StyledListItemButton
50
+ {...props}
51
+ disableRipple
52
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
53
+ component={(props as any).component ?? 'span'}
54
+ size={size}
55
+ selected={selected}
56
+ >
57
+ {checkElement && <StyledListItemStartSlot>{checkElement}</StyledListItemStartSlot>}
58
+ {startElement && <StyledListItemStartSlot>{startElement}</StyledListItemStartSlot>}
59
+ <StyledListItemText primary={label} />
60
+ {endElement && <StyledListItemEndSlot>{endElement}</StyledListItemEndSlot>}
61
+ </StyledListItemButton>
62
+ </StyledListItem>
63
+ );
64
+ }) as ListItemComponent;
65
+
66
+ export default ListItem;
@@ -0,0 +1,40 @@
1
+ import {
2
+ ExtendButtonBase,
3
+ ExtendButtonBaseTypeMap,
4
+ ListItemProps as MuiListItemProps,
5
+ ListItemButtonProps as MuiListItemButtonProps,
6
+ } from '@mui/material';
7
+ import { OverrideProps } from '@mui/material/OverridableComponent';
8
+ import type { ListSize } from '../List/List.types';
9
+
10
+ type ListItemRootBasePropsKey = 'className' | 'classes' | 'style' | 'sx';
11
+
12
+ export interface ListItemBaseProps
13
+ extends Omit<MuiListItemButtonProps, ListItemRootBasePropsKey>,
14
+ Pick<MuiListItemProps, ListItemRootBasePropsKey> {
15
+ label?: React.ReactNode | string;
16
+ startElement?: React.ReactNode;
17
+ endElement?: React.ReactNode;
18
+ rootProps?: MuiListItemProps;
19
+ }
20
+
21
+ export type ListItemTypeMap<
22
+ P = {},
23
+ D extends React.ElementType = 'span',
24
+ > = ExtendButtonBaseTypeMap<{
25
+ props: P & ListItemBaseProps;
26
+ defaultComponent: D;
27
+ }>;
28
+
29
+ /** @see ListItemButton {@link @mui/material/ListItemButton} */
30
+ export type ListItemComponent = ExtendButtonBase<ListItemTypeMap>;
31
+
32
+ export type ListItemProps<
33
+ D extends React.ElementType = ListItemTypeMap['defaultComponent'],
34
+ P = {},
35
+ > = OverrideProps<ListItemTypeMap<P, D>, D>;
36
+
37
+ export interface StyledListItemButtonProps extends MuiListItemButtonProps {
38
+ component?: React.ElementType;
39
+ size: ListSize;
40
+ }
@@ -0,0 +1,7 @@
1
+ import { styled, Typography } from '@mui/material';
2
+
3
+ // eslint-disable-next-line import/prefer-default-export
4
+ export const StyledListItemCaption = styled(Typography)(({ theme }) => ({
5
+ ...theme.typography.body_m1,
6
+ color: theme.palette.neutralGrey[45],
7
+ }));
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import clsx from 'clsx';
3
+ import { StyledListItemCaption } from './ListItemCaption.styled';
4
+ import { ListItemCaptionProps } from './ListItemCaption.types';
5
+
6
+ export const ListItemCaptionClassName = 'ListItemCaption';
7
+
8
+ const ListItemCaption = (props: ListItemCaptionProps) => {
9
+ const { className, ...otherProps } = props;
10
+ return (
11
+ <StyledListItemCaption
12
+ {...otherProps}
13
+ className={clsx(ListItemCaptionClassName, className)}
14
+ />
15
+ );
16
+ };
17
+
18
+ export default ListItemCaption;
@@ -0,0 +1,2 @@
1
+ // eslint-disable-next-line import/prefer-default-export
2
+ export { TypographyProps as ListItemCaptionProps } from '@mui/material';
@@ -0,0 +1,8 @@
1
+ export { default as List } from './List';
2
+ export type { ListProps } from './List.types';
3
+
4
+ export { default as ListItem } from './ListItem';
5
+ export type { ListItemProps } from './ListItem.types';
6
+
7
+ export { default as ListItemCaption } from './ListItemCaption';
8
+ export type { ListItemCaptionProps } from './ListItemCaption.types';
@@ -0,0 +1,40 @@
1
+ import { Box, styled, Typography } from '@mui/material';
2
+
3
+ export const LoadingOverlay = styled(Box)({
4
+ position: 'fixed',
5
+ top: 0,
6
+ left: 0,
7
+ right: 0,
8
+ bottom: 0,
9
+ backgroundColor: 'rgba(0, 0, 0, 0.5)',
10
+ zIndex: 99999,
11
+ });
12
+
13
+ export const LoadingIndicatorBox = styled(Box)(({ theme }) => ({
14
+ display: 'flex',
15
+ flexDirection: 'column',
16
+ justifyContent: 'center',
17
+ alignItems: 'center',
18
+ position: 'absolute',
19
+ top: '50%',
20
+ left: '50%',
21
+ transform: 'translate(-50%, -50%)',
22
+ width: '440px',
23
+ height: '360px',
24
+ padding: `${theme.spacing(13)} ${theme.spacing(4)}`,
25
+ borderRadius: '12px',
26
+ backgroundColor: theme.palette.neutralGrey[85],
27
+ color: theme.palette.neutralGrey[0],
28
+ boxSizing: 'border-box',
29
+ }));
30
+
31
+ export const LoadingMessage = styled(Typography)(({ theme }) => ({
32
+ ...theme.typography.h8,
33
+ marginTop: theme.spacing(12),
34
+ marginBottom: theme.spacing(5),
35
+ }));
36
+
37
+ export const LoadingDetails = styled(Typography)(({ theme }) => ({
38
+ ...theme.typography.body1,
39
+ textAlign: 'center',
40
+ }));
@@ -0,0 +1,44 @@
1
+ import React from 'react';
2
+ /* eslint-disable @typescript-eslint/no-var-requires */
3
+ import { Player } from '@lottiefiles/react-lottie-player';
4
+ import {
5
+ LoadingOverlay,
6
+ LoadingIndicatorBox,
7
+ LoadingMessage,
8
+ LoadingDetails,
9
+ } from './LoadingIndicator.styled';
10
+ import type { LoadingIndicatorProps } from './LoadingIndicator.types';
11
+
12
+ const DotLoadingAnimation = require('./assets/DotLoadingAnimation.json');
13
+ const DnaLoadingAnimation = require('./assets/DnaLoadingAnimation.json');
14
+
15
+ const LoadingIndicator = ({
16
+ message,
17
+ details,
18
+ loadingAnimation = 'dot',
19
+ }: LoadingIndicatorProps) => {
20
+ return (
21
+ <LoadingOverlay>
22
+ <LoadingIndicatorBox>
23
+ <Player
24
+ autoplay
25
+ loop
26
+ src={loadingAnimation === 'dot' ? DotLoadingAnimation : DnaLoadingAnimation}
27
+ style={{ height: '112px', width: '140px' }}
28
+ />
29
+ <LoadingMessage>{message}</LoadingMessage>
30
+ <LoadingDetails>
31
+ {details || (
32
+ <>
33
+ Please wait.
34
+ <br />
35
+ It may take a few minutes.
36
+ </>
37
+ )}
38
+ </LoadingDetails>
39
+ </LoadingIndicatorBox>
40
+ </LoadingOverlay>
41
+ );
42
+ };
43
+
44
+ export default LoadingIndicator;
@@ -0,0 +1,7 @@
1
+ import { ReactNode } from 'react';
2
+
3
+ export interface LoadingIndicatorProps {
4
+ message?: string;
5
+ details?: ReactNode;
6
+ loadingAnimation?: 'dot' | 'dna';
7
+ }