@sonardigital/carbon-ui 1.1.61 → 1.1.67

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 (80) hide show
  1. package/README.md +13 -3
  2. package/package.json +76 -62
  3. package/src/App.css +17 -17
  4. package/src/components/atoms/alert/Alert.tsx +31 -27
  5. package/src/components/atoms/cursor/Cursor.tsx +10 -6
  6. package/src/components/form/fields/FormDatePicker.tsx +26 -17
  7. package/src/components/form/fields/FormInput.tsx +22 -16
  8. package/src/components/form/fields/FormMultiselect.tsx +40 -38
  9. package/src/components/form/fields/FormPassword.tsx +46 -38
  10. package/src/components/form/fields/FormSelect.tsx +46 -28
  11. package/src/components/form/fields/FormSwitch.tsx +36 -21
  12. package/src/components/form/fields/FormTextArea.tsx +36 -25
  13. package/src/components/form/fields/form-list/FormList.tsx +84 -72
  14. package/src/components/form/fields/form-list/Row.tsx +25 -25
  15. package/src/components/form/layout/FormError.tsx +11 -7
  16. package/src/components/form/layout/FormLabel.tsx +12 -12
  17. package/src/components/inputs/DatePicker.tsx +102 -98
  18. package/src/components/inputs/MultiselectAutocomplete.tsx +92 -75
  19. package/src/components/inputs/SelectAutocomplete.tsx +58 -44
  20. package/src/components/inputs/Switch.tsx +8 -8
  21. package/src/components/layout/bottom-navigation/BottomNavigation.tsx +10 -6
  22. package/src/components/layout/delay/index.tsx +11 -11
  23. package/src/components/layout/drawer/components/DrawerContent.tsx +10 -7
  24. package/src/components/layout/drawer/components/DrawerTrigger.tsx +19 -11
  25. package/src/components/layout/drawer/hooks/useDrawer.ts +16 -16
  26. package/src/components/layout/drawer/hooks/useDrawerContext.ts +5 -5
  27. package/src/components/layout/drawer/provider/DrawerContext.ts +11 -10
  28. package/src/components/layout/drawer/provider/DrawerProvider.tsx +17 -12
  29. package/src/components/layout/dropdown/components/DropdownItem.tsx +12 -0
  30. package/src/components/layout/dropdown/components/DropdownPopover.tsx +27 -0
  31. package/src/components/layout/dropdown/components/DropdownTrigger.tsx +38 -0
  32. package/src/components/layout/dropdown/hooks/useDropdown.ts +22 -0
  33. package/src/components/layout/dropdown/hooks/useDropdownContext.ts +13 -0
  34. package/src/components/layout/dropdown/provider/DropdownContext.ts +22 -0
  35. package/src/components/layout/dropdown/provider/DropdownProvider.tsx +35 -0
  36. package/src/components/layout/error-boundary/index.tsx +40 -40
  37. package/src/components/layout/index.ts +3 -3
  38. package/src/components/layout/modal/components/ModalContent.tsx +47 -0
  39. package/src/components/layout/modal/components/ModalTrigger.tsx +19 -0
  40. package/src/components/layout/modal/hooks/useModal.ts +19 -0
  41. package/src/components/layout/{Modal → modal}/hooks/useModalContext.ts +5 -5
  42. package/src/components/layout/{Modal → modal}/provider/ModalContext.ts +10 -8
  43. package/src/components/layout/{Modal → modal}/provider/ModalProvider.tsx +7 -5
  44. package/src/components/layout/multisteps/components/MultistepsBar.tsx +32 -22
  45. package/src/components/layout/multisteps/components/MultistepsBottomSteps.tsx +12 -8
  46. package/src/components/layout/multisteps/components/MultistepsContent.tsx +6 -6
  47. package/src/components/layout/multisteps/components/MultistepsStep.tsx +22 -20
  48. package/src/components/layout/multisteps/components/MultistepsStepper.tsx +63 -48
  49. package/src/components/layout/multisteps/hooks/useMultisteps.ts +55 -52
  50. package/src/components/layout/multisteps/hooks/useMultistepsContext.ts +12 -7
  51. package/src/components/layout/multisteps/models/index.ts +3 -0
  52. package/src/components/layout/multisteps/provider/MultistepsContext.ts +18 -17
  53. package/src/components/layout/multisteps/provider/MultistepsProvider.tsx +15 -10
  54. package/src/components/layout/scroll-to-top/ScrollToTop.tsx +16 -0
  55. package/src/hooks/useAccordion.ts +7 -7
  56. package/src/index.css +3 -3
  57. package/src/provider/CarbonProvider.tsx +5 -5
  58. package/src/theme/constants/components.ts +475 -475
  59. package/src/theme/constants/palette.ts +39 -39
  60. package/src/theme/constants/typography.ts +44 -44
  61. package/src/theme/theme.ts +7 -7
  62. package/src/components/layout/Dropdown/components/DropdownItem.tsx +0 -8
  63. package/src/components/layout/Dropdown/components/DropdownPopover.tsx +0 -24
  64. package/src/components/layout/Dropdown/components/DropdownTrigger.tsx +0 -35
  65. package/src/components/layout/Dropdown/hooks/useDropdown.ts +0 -22
  66. package/src/components/layout/Dropdown/hooks/useDropdownContext.ts +0 -11
  67. package/src/components/layout/Dropdown/provider/DropdownContext.ts +0 -21
  68. package/src/components/layout/Dropdown/provider/DropdownProvider.tsx +0 -28
  69. package/src/components/layout/Modal/components/ModalContent.tsx +0 -44
  70. package/src/components/layout/Modal/components/ModalTrigger.tsx +0 -17
  71. package/src/components/layout/Modal/hooks/useModal.ts +0 -19
  72. package/src/components/layout/ScrollToTop/ScrollToTop.tsx +0 -12
  73. /package/src/components/layout/{Dropdown → dropdown}/components/index.ts +0 -0
  74. /package/src/components/layout/{Dropdown → dropdown}/hooks/index.ts +0 -0
  75. /package/src/components/layout/{Dropdown → dropdown}/index.ts +0 -0
  76. /package/src/components/layout/{Dropdown → dropdown}/provider/index.ts +0 -0
  77. /package/src/components/layout/{Modal → modal}/components/index.ts +0 -0
  78. /package/src/components/layout/{Modal → modal}/hooks/index.ts +0 -0
  79. /package/src/components/layout/{Modal → modal}/index.ts +0 -0
  80. /package/src/components/layout/{Modal → modal}/provider/index.ts +0 -0
@@ -4,34 +4,52 @@ import { FormLabel } from '../layout';
4
4
  import { FormError } from '../layout/FormError';
5
5
  import { SelectAutocomplete } from '../../inputs';
6
6
 
7
- interface SelectAutocompleteProps
8
- extends Omit<
9
- AutocompleteProps<{ label: string; value: string | number }, false, false, false>,
10
- 'renderInput' | 'options' | 'value' | 'onChange'
11
- > {
12
- name: string;
13
- label: string;
14
- placeholder?: string;
15
- options?: { label: string; value: string | number }[];
16
- helperText?: string;
17
- fetchOptions?: () => Promise<{ label: string; value: string | number }[]>;
7
+ // eslint-disable-next-line
8
+ interface SelectAutocompleteProps extends Omit<
9
+ AutocompleteProps<
10
+ { label: string; value: string | number },
11
+ false,
12
+ false,
13
+ false
14
+ >,
15
+ 'renderInput' | 'options' | 'value' | 'onChange'
16
+ > {
17
+ name: string;
18
+ label: string;
19
+ placeholder?: string;
20
+ options?: { label: string; value: string | number }[];
21
+ helperText?: string;
22
+ fetchOptions?: () => Promise<{ label: string; value: string | number }[]>;
18
23
  }
19
24
 
20
- export function FormSelect({ name, label, options, ...rest }: SelectAutocompleteProps): React.ReactElement {
21
- return (
22
- <Controller
23
- name={name}
24
- render={({ field, fieldState }) => {
25
- const { value, onChange } = field;
26
- return (
27
- <FormLabel label={label}>
28
- <Stack gap={0.8}>
29
- <SelectAutocomplete {...field} {...rest} options={options} value={value} onChange={onChange} />
30
- {fieldState.error && <FormError label={fieldState.error?.message ?? ''} />}
31
- </Stack>
32
- </FormLabel>
33
- );
34
- }}
35
- />
36
- );
25
+ export function FormSelect({
26
+ name,
27
+ label,
28
+ options,
29
+ ...rest
30
+ }: SelectAutocompleteProps): React.ReactElement {
31
+ return (
32
+ <Controller
33
+ name={name}
34
+ render={({ field, fieldState }) => {
35
+ const { value, onChange } = field;
36
+ return (
37
+ <FormLabel label={label}>
38
+ <Stack gap={0.8}>
39
+ <SelectAutocomplete
40
+ {...field}
41
+ {...rest}
42
+ options={options}
43
+ value={value}
44
+ onChange={onChange}
45
+ />
46
+ {fieldState.error && (
47
+ <FormError label={fieldState.error?.message ?? ''} />
48
+ )}
49
+ </Stack>
50
+ </FormLabel>
51
+ );
52
+ }}
53
+ />
54
+ );
37
55
  }
@@ -4,27 +4,42 @@ import { FormError } from '../layout/FormError';
4
4
  import { Switch } from '../../inputs/Switch';
5
5
 
6
6
  interface FormSwitchProps extends SwitchProps {
7
- name: string;
8
- label: string;
7
+ name: string;
8
+ label: string;
9
9
  }
10
10
 
11
- export function FormSwitch({ name, label, ...props }: FormSwitchProps): React.ReactElement {
12
- return (
13
- <Controller
14
- name={name}
15
- render={({ field, fieldState }) => (
16
- <Stack width="100%" flexDirection="row" alignItems="center" justifyContent="space-between" gap={0.8}>
17
- <Typography variant="body2" fontWeight={400}>
18
- {label}
19
- </Typography>
20
- <Switch
21
- value={field.value}
22
- onChange={(_: React.ChangeEvent<HTMLInputElement>, newValue: boolean) => field.onChange(newValue)}
23
- {...props}
24
- />
25
- {fieldState.error && <FormError label={fieldState.error?.message ?? ''} />}
26
- </Stack>
27
- )}
28
- />
29
- );
11
+ export function FormSwitch({
12
+ name,
13
+ label,
14
+ ...props
15
+ }: FormSwitchProps): React.ReactElement {
16
+ return (
17
+ <Controller
18
+ name={name}
19
+ render={({ field, fieldState }) => (
20
+ <Stack
21
+ width="100%"
22
+ flexDirection="row"
23
+ alignItems="center"
24
+ justifyContent="space-between"
25
+ gap={0.8}
26
+ >
27
+ <Typography variant="body2" fontWeight={400}>
28
+ {label}
29
+ </Typography>
30
+ <Switch
31
+ value={field.value}
32
+ onChange={(
33
+ _: React.ChangeEvent<HTMLInputElement>,
34
+ newValue: boolean,
35
+ ) => field.onChange(newValue)}
36
+ {...props}
37
+ />
38
+ {fieldState.error && (
39
+ <FormError label={fieldState.error?.message ?? ''} />
40
+ )}
41
+ </Stack>
42
+ )}
43
+ />
44
+ );
30
45
  }
@@ -1,34 +1,45 @@
1
- import { Stack, TextareaAutosize, TextareaAutosizeProps, useTheme } from '@mui/material';
1
+ import {
2
+ Stack,
3
+ TextareaAutosize,
4
+ TextareaAutosizeProps,
5
+ useTheme,
6
+ } from '@mui/material';
2
7
  import { Controller } from 'react-hook-form';
3
8
  import { FormLabel } from '../layout';
4
9
  import { FormError } from '../layout/FormError';
5
10
 
6
11
  interface FormTextareaProps extends TextareaAutosizeProps {
7
- name: string;
8
- label: string;
12
+ name: string;
13
+ label: string;
9
14
  }
10
15
 
11
- export function FormTextarea({ name, label, ...props }: FormTextareaProps): React.ReactElement {
12
- const theme = useTheme();
16
+ export function FormTextarea({
17
+ name,
18
+ label,
19
+ ...props
20
+ }: FormTextareaProps): React.ReactElement {
21
+ const theme = useTheme();
13
22
 
14
- return (
15
- <Controller
16
- name={name}
17
- render={({ field, fieldState }) => (
18
- <FormLabel label={label}>
19
- <Stack gap={0.8}>
20
- <TextareaAutosize
21
- minRows={5}
22
- {...field}
23
- {...props}
24
- style={{
25
- borderRadius: theme.shape.borderRadius,
26
- }}
27
- />
28
- {fieldState.error && <FormError label={fieldState.error?.message ?? ''} />}
29
- </Stack>
30
- </FormLabel>
31
- )}
32
- />
33
- );
23
+ return (
24
+ <Controller
25
+ name={name}
26
+ render={({ field, fieldState }) => (
27
+ <FormLabel label={label}>
28
+ <Stack gap={0.8}>
29
+ <TextareaAutosize
30
+ minRows={5}
31
+ {...field}
32
+ {...props}
33
+ style={{
34
+ borderRadius: theme.shape.borderRadius,
35
+ }}
36
+ />
37
+ {fieldState.error && (
38
+ <FormError label={fieldState.error?.message ?? ''} />
39
+ )}
40
+ </Stack>
41
+ </FormLabel>
42
+ )}
43
+ />
44
+ );
34
45
  }
@@ -1,97 +1,109 @@
1
1
  import { Button, IconButton, Stack } from '@mui/material';
2
2
  import { useFieldArray, useFormContext } from 'react-hook-form';
3
3
  import { Row } from './Row';
4
- import { RemoveCircleOutline, AddCircleOutline, CheckOutlined } from '@mui/icons-material';
4
+ import {
5
+ RemoveCircleOutline,
6
+ AddCircleOutline,
7
+ CheckOutlined,
8
+ } from '@mui/icons-material';
5
9
  import { FormError } from '../../layout';
6
10
 
7
11
  export interface FormListField {
8
- component: React.ReactElement;
9
- size?: number;
12
+ component: React.ReactElement;
13
+ size?: number;
10
14
  }
11
15
 
12
16
  export interface FormListProps {
13
- name: string;
14
- label: string;
15
- fields: FormListField[];
16
- maxItems?: number;
17
- defaultValues?: Record<string, unknown>;
17
+ name: string;
18
+ label: string;
19
+ fields: FormListField[];
20
+ maxItems?: number;
21
+ defaultValues?: Record<string, unknown>;
18
22
  }
19
23
 
20
24
  // eslint-disable-next-line
21
25
  const getErrorMessage = (error: any): string | undefined => {
22
- if (!error) return;
23
- if (typeof error === 'string') return error;
24
- return error.message;
26
+ if (!error) return;
27
+ if (typeof error === 'string') return error;
28
+ return error.message;
25
29
  };
26
30
 
27
31
  export function FormList({
28
- name,
29
- label,
30
- fields,
31
- maxItems,
32
- defaultValues,
32
+ name,
33
+ label,
34
+ fields,
35
+ maxItems,
36
+ defaultValues,
33
37
  }: FormListProps): React.ReactElement {
34
- const {
35
- control,
36
- formState: { errors },
37
- } = useFormContext();
38
+ const {
39
+ control,
40
+ formState: { errors },
41
+ } = useFormContext();
38
42
 
39
- const {
40
- fields: arrayFields,
41
- append,
42
- remove,
43
- } = useFieldArray({
44
- control,
45
- name,
46
- });
43
+ const {
44
+ fields: arrayFields,
45
+ append,
46
+ remove,
47
+ } = useFieldArray({
48
+ control,
49
+ name,
50
+ });
47
51
 
48
- const errorMessage = getErrorMessage(errors[name]);
52
+ const errorMessage = getErrorMessage(errors[name]);
49
53
 
50
- return (
51
- <Stack direction="column" gap={1.5}>
52
- {arrayFields.map((f, index) => (
53
- <Stack
54
- key={f.id}
55
- width="100%"
56
- flexDirection="row"
57
- alignItems="center"
58
- justifyContent="space-between"
59
- gap={1.5}
60
- >
61
- <IconButton size="large" onClick={() => remove(index)} style={{ marginTop: 30 }}>
62
- <RemoveCircleOutline sx={{ width: 20, height: 20 }} />
63
- </IconButton>
54
+ return (
55
+ <Stack direction="column" gap={1.5}>
56
+ {arrayFields.map((f, index) => (
57
+ <Stack
58
+ key={f.id}
59
+ width="100%"
60
+ flexDirection="row"
61
+ alignItems="center"
62
+ justifyContent="space-between"
63
+ gap={1.5}
64
+ >
65
+ <IconButton
66
+ size="large"
67
+ onClick={() => remove(index)}
68
+ style={{ marginTop: 30 }}
69
+ >
70
+ <RemoveCircleOutline sx={{ width: 20, height: 20 }} />
71
+ </IconButton>
64
72
 
65
- <Row name={name} fields={fields} index={index} />
73
+ <Row name={name} fields={fields} index={index} />
66
74
 
67
- {index === arrayFields.length - 1 ? (
68
- <IconButton
69
- size="large"
70
- disabled={arrayFields.length === maxItems}
71
- onClick={() => append(defaultValues ?? {})}
72
- style={{ marginTop: 30 }}
73
- >
74
- <AddCircleOutline sx={{ width: 20, height: 20 }} />
75
- </IconButton>
76
- ) : (
77
- <IconButton
78
- size="large"
79
- disabled={arrayFields.length === maxItems}
80
- sx={{ marginTop: 3, cursor: 'default' }}
81
- >
82
- <CheckOutlined sx={{ width: 20, height: 20 }} />
83
- </IconButton>
84
- )}
85
- </Stack>
86
- ))}
75
+ {index === arrayFields.length - 1 ? (
76
+ <IconButton
77
+ size="large"
78
+ disabled={arrayFields.length === maxItems}
79
+ onClick={() => append(defaultValues ?? {})}
80
+ style={{ marginTop: 30 }}
81
+ >
82
+ <AddCircleOutline sx={{ width: 20, height: 20 }} />
83
+ </IconButton>
84
+ ) : (
85
+ <IconButton
86
+ size="large"
87
+ disabled={arrayFields.length === maxItems}
88
+ sx={{ marginTop: 3, cursor: 'default' }}
89
+ >
90
+ <CheckOutlined sx={{ width: 20, height: 20 }} />
91
+ </IconButton>
92
+ )}
93
+ </Stack>
94
+ ))}
87
95
 
88
- {arrayFields.length === 0 && (
89
- <Button variant="contained" color="info" onClick={() => append(defaultValues ?? {})}>
90
- {label}
91
- </Button>
92
- )}
96
+ {arrayFields.length === 0 && (
97
+ <Button
98
+ variant="contained"
99
+ color="info"
100
+ onClick={() => append(defaultValues ?? {})}
101
+ >
102
+ {label}
103
+ </Button>
104
+ )}
93
105
 
94
- {errorMessage && <FormError label={errorMessage} />}
95
- </Stack>
96
- );
106
+ {errorMessage && <FormError label={errorMessage} />}
107
+ </Stack>
108
+ );
97
109
  }
@@ -4,31 +4,31 @@ import { UseFieldArrayRemove } from 'react-hook-form';
4
4
  import { FormListField } from './FormList';
5
5
 
6
6
  export function Row(props: {
7
- name: string;
8
- fields: FormListField[];
9
- index: number;
10
- remove?: UseFieldArrayRemove;
7
+ name: string;
8
+ fields: FormListField[];
9
+ index: number;
10
+ remove?: UseFieldArrayRemove;
11
11
  }): React.ReactElement {
12
- const { name, fields, index } = props;
12
+ const { name, fields, index } = props;
13
13
 
14
- return (
15
- <Stack width="100%" direction="row" alignItems="start" gap={0.5}>
16
- <Grid width="100%" container spacing={2}>
17
- {fields?.map((field: FormListField, i: number) => {
18
- const Component = field.component;
19
- return (
20
- <Grid size={field?.size || 3} key={i}>
21
- {{
22
- ...Component,
23
- props: {
24
- ...((Component?.props as object) || {}),
25
- name: `${name}[${index}].${(Component?.props as unknown as { name?: string })?.name}`,
26
- },
27
- }}
28
- </Grid>
29
- );
30
- })}
31
- </Grid>
32
- </Stack>
33
- );
14
+ return (
15
+ <Stack width="100%" direction="row" alignItems="start" gap={0.5}>
16
+ <Grid width="100%" container spacing={2}>
17
+ {fields?.map((field: FormListField, i: number) => {
18
+ const Component = field.component;
19
+ return (
20
+ <Grid size={field?.size || 3} key={i}>
21
+ {{
22
+ ...Component,
23
+ props: {
24
+ ...((Component?.props as object) || {}),
25
+ name: `${name}[${index}].${(Component?.props as unknown as { name?: string })?.name}`,
26
+ },
27
+ }}
28
+ </Grid>
29
+ );
30
+ })}
31
+ </Grid>
32
+ </Stack>
33
+ );
34
34
  }
@@ -1,11 +1,15 @@
1
1
  import { Alert, Typography } from '@mui/material';
2
2
 
3
3
  export function FormError({ label }: { label: string }): React.ReactElement {
4
- return (
5
- <Alert severity="error" icon={false} sx={{ bgcolor: 'error.light' }}>
6
- <Typography variant="body2" color="error" sx={{ opacity: 1, color: 'error.main' }}>
7
- {label}
8
- </Typography>
9
- </Alert>
10
- );
4
+ return (
5
+ <Alert severity="error" icon={false} sx={{ bgcolor: 'error.light' }}>
6
+ <Typography
7
+ variant="body2"
8
+ color="error"
9
+ sx={{ opacity: 1, color: 'error.main' }}
10
+ >
11
+ {label}
12
+ </Typography>
13
+ </Alert>
14
+ );
11
15
  }
@@ -2,18 +2,18 @@ import { Stack, Typography } from '@mui/material';
2
2
  import React from 'react';
3
3
 
4
4
  export function FormLabel({
5
- label,
6
- children,
5
+ label,
6
+ children,
7
7
  }: {
8
- label: string;
9
- children: React.ReactNode;
8
+ label: string;
9
+ children: React.ReactNode;
10
10
  }): React.ReactElement {
11
- return (
12
- <Stack width="100%" gap={0.5}>
13
- <Typography variant="body2" fontWeight={400}>
14
- {label}
15
- </Typography>
16
- {children}
17
- </Stack>
18
- );
11
+ return (
12
+ <Stack width="100%" gap={0.5}>
13
+ <Typography variant="body2" fontWeight={400}>
14
+ {label}
15
+ </Typography>
16
+ {children}
17
+ </Stack>
18
+ );
19
19
  }