pixel-react 1.0.5 → 1.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. package/.yarn/install-state.gz +0 -0
  2. package/lib/StyleGuide/ColorPalette/types.d.ts +2 -0
  3. package/lib/assets/utils/functionUtils.d.ts +3 -0
  4. package/lib/components/DatePicker/DatePicker.d.ts +5 -0
  5. package/lib/components/DatePicker/DatePicker.stories.d.ts +9 -0
  6. package/lib/components/DatePicker/Timepicker.d.ts +4 -0
  7. package/lib/components/DatePicker/index.d.ts +1 -0
  8. package/lib/components/DatePicker/types.d.ts +81 -0
  9. package/lib/components/DragAndDrop/DragAndDrop.d.ts +9 -0
  10. package/lib/components/DragAndDrop/DragAndDrop.stories.d.ts +6 -0
  11. package/lib/components/DragAndDrop/DragAndDropList.d.ts +20 -0
  12. package/lib/components/DragAndDrop/index.d.ts +1 -0
  13. package/lib/components/Drawer/Drawer.d.ts +2 -1
  14. package/lib/components/IconButton/IconButton.d.ts +5 -0
  15. package/lib/components/IconButton/IconButton.stories.d.ts +6 -0
  16. package/lib/components/IconButton/index.d.ts +1 -0
  17. package/lib/components/{AddButton → IconButton}/types.d.ts +3 -2
  18. package/lib/components/InputWithDropdown/InputWithDropdown.d.ts +1 -1
  19. package/lib/components/InputWithDropdown/types.d.ts +3 -7
  20. package/lib/components/Modal/Modal.d.ts +5 -0
  21. package/lib/components/Modal/Modal.stories.d.ts +7 -0
  22. package/lib/components/Modal/index.d.ts +1 -0
  23. package/lib/components/Modal/types.d.ts +26 -0
  24. package/lib/components/TableTree/TableTree.d.ts +2 -2
  25. package/lib/components/ThemeProvider/CustomThemeProvider.d.ts +8 -0
  26. package/lib/hooks/useCustomThemeProvider.d.ts +11 -0
  27. package/lib/index.d.ts +76 -16
  28. package/lib/index.esm.js +13365 -414
  29. package/lib/index.esm.js.map +1 -1
  30. package/lib/index.js +13368 -415
  31. package/lib/index.js.map +1 -1
  32. package/lib/tsconfig.tsbuildinfo +1 -1
  33. package/package.json +28 -23
  34. package/src/StyleGuide/ColorPalette/ColorPalette.scss +5 -0
  35. package/src/StyleGuide/ColorPalette/ColorPalette.tsx +10 -1
  36. package/src/StyleGuide/ColorPalette/colorPaletteList.ts +2 -2
  37. package/src/StyleGuide/ColorPalette/types.ts +2 -0
  38. package/src/assets/Themes/BaseTheme.scss +9 -1
  39. package/src/assets/Themes/DarkTheme.scss +8 -1
  40. package/src/assets/icons/add_variable_icon.svg +5 -0
  41. package/src/assets/icons/calendar_icon.svg +9 -0
  42. package/src/assets/icons/clock_icon.svg +11 -0
  43. package/src/assets/icons/collapse-icon.svg +6 -0
  44. package/src/assets/icons/copy-icon.svg +3 -0
  45. package/src/assets/icons/download-icon.svg +3 -0
  46. package/src/assets/icons/expand-icon.svg +6 -0
  47. package/src/assets/icons/info_icon.svg +4 -0
  48. package/src/assets/icons/left_arrow_icon.svg +3 -0
  49. package/src/assets/icons/license_info.svg +28 -0
  50. package/src/assets/icons/license_warning.svg +10 -0
  51. package/src/assets/icons/refresh-icon.svg +4 -0
  52. package/src/assets/icons/right_arrow_icon.svg +4 -0
  53. package/src/assets/styles/_mixins.scss +1 -0
  54. package/src/assets/utils/functionUtils.ts +37 -0
  55. package/src/components/DatePicker/DatePicker.scss +387 -0
  56. package/src/components/DatePicker/DatePicker.stories.tsx +161 -0
  57. package/src/components/DatePicker/DatePicker.tsx +438 -0
  58. package/src/components/DatePicker/Timepicker.tsx +372 -0
  59. package/src/components/DatePicker/index.ts +1 -0
  60. package/src/components/DatePicker/types.ts +100 -0
  61. package/src/components/DragAndDrop/DragAndDrop.d.ts +5 -0
  62. package/src/components/DragAndDrop/DragAndDrop.stories.tsx +25 -0
  63. package/src/components/DragAndDrop/DragAndDrop.ts +7 -0
  64. package/src/components/DragAndDrop/DragAndDropList.scss +69 -0
  65. package/src/components/DragAndDrop/DragAndDropList.tsx +150 -0
  66. package/src/components/DragAndDrop/index.ts +1 -0
  67. package/src/components/Drawer/Drawer.scss +0 -1
  68. package/src/components/Drawer/Drawer.tsx +7 -15
  69. package/src/components/Icon/iconList.ts +31 -9
  70. package/src/components/{AddButton/AddButton.scss → IconButton/IconButton.scss} +6 -2
  71. package/src/components/IconButton/IconButton.stories.tsx +25 -0
  72. package/src/components/{AddButton/AddButton.tsx → IconButton/IconButton.tsx} +10 -7
  73. package/src/components/IconButton/index.ts +1 -0
  74. package/src/components/{AddButton → IconButton}/types.ts +3 -2
  75. package/src/components/InputWithDropdown/InputWithDropdown.scss +1 -1
  76. package/src/components/InputWithDropdown/InputWithDropdown.stories.tsx +10 -13
  77. package/src/components/InputWithDropdown/InputWithDropdown.tsx +10 -8
  78. package/src/components/InputWithDropdown/types.ts +4 -7
  79. package/src/components/Modal/Modal.stories.tsx +63 -0
  80. package/src/components/Modal/Modal.tsx +71 -0
  81. package/src/components/Modal/index.tsx +1 -0
  82. package/src/components/Modal/modal.scss +37 -0
  83. package/src/components/Modal/types.ts +37 -0
  84. package/src/components/RadioButton/RadioButton.scss +3 -3
  85. package/src/components/Select/Select.scss +1 -1
  86. package/src/components/TableTree/TableTree.tsx +5 -1
  87. package/src/components/ThemeProvider/ThemeProvider.tsx +11 -8
  88. package/src/index.ts +6 -6
  89. package/lib/components/AddButton/AddButton.d.ts +0 -5
  90. package/lib/components/AddButton/AddButton.stories.d.ts +0 -6
  91. package/lib/components/AddButton/index.d.ts +0 -1
  92. package/src/assets/icons/expired_license_icon.svg +0 -3
  93. package/src/assets/icons/expiringSoon_license_icon.svg +0 -3
  94. package/src/components/AddButton/AddButton.stories.tsx +0 -24
  95. package/src/components/AddButton/index.ts +0 -1
@@ -0,0 +1,150 @@
1
+ import { useState } from 'react';
2
+ import DragAndDrop from './DragAndDrop';
3
+ const {
4
+ DNDCore: {
5
+ DndContext,
6
+ KeyboardSensor,
7
+ PointerSensor,
8
+ useSensor,
9
+ useSensors,
10
+ closestCorners,
11
+ },
12
+ DNDSortable: {
13
+ useSortable,
14
+ arrayMove,
15
+ sortableKeyboardCoordinates,
16
+ SortableContext,
17
+ verticalListSortingStrategy,
18
+ },
19
+ DNDUtilities: { CSS },
20
+ } = DragAndDrop;
21
+ import Typography from '../Typography';
22
+
23
+ import './DragAndDropList.scss';
24
+
25
+ interface TaskProps {
26
+ id: number;
27
+ title: string;
28
+ }
29
+
30
+ export const Task = ({ id, title }: TaskProps) => {
31
+ const { attributes, listeners, setNodeRef, transform, transition } =
32
+ useSortable({ id });
33
+
34
+ const style = {
35
+ transition,
36
+ transform: CSS.Transform.toString(transform),
37
+ };
38
+
39
+ return (
40
+ <div
41
+ ref={setNodeRef}
42
+ style={style}
43
+ {...attributes}
44
+ {...listeners}
45
+ className="task"
46
+ >
47
+ <Typography as='h1' fontSize={16} className='task-title'>{title}</Typography>
48
+ </div>
49
+ );
50
+ };
51
+
52
+ interface ColumnProps {
53
+ id: string;
54
+ tasks: { id: number; title: string }[];
55
+ }
56
+
57
+ export const Column: React.FC<ColumnProps> = ({ tasks }) => {
58
+ return (
59
+ <div className="column">
60
+ <SortableContext items={tasks} strategy={verticalListSortingStrategy}>
61
+ {tasks.map((task) => (
62
+ <Task key={task.id} id={task.id} title={task.title} />
63
+ ))}
64
+ </SortableContext>
65
+ </div>
66
+ );
67
+ };
68
+
69
+ interface InputProps {
70
+ onSubmit: (input: string) => void;
71
+ }
72
+
73
+ export const Input: React.FC<InputProps> = ({ onSubmit }) => {
74
+ const [input, setInput] = useState('');
75
+
76
+ const handleSubmit = () => {
77
+ if (!input) return;
78
+
79
+ onSubmit(input);
80
+
81
+ setInput('');
82
+ };
83
+
84
+ return (
85
+ <div className="container">
86
+ <input
87
+ className="input"
88
+ type="text"
89
+ value={input}
90
+ onChange={(e) => setInput(e.target.value)}
91
+ />
92
+ <button onClick={handleSubmit} className="button">
93
+ <Typography fontSize={14}>Add</Typography>
94
+ </button>
95
+ </div>
96
+ );
97
+ };
98
+
99
+ const DragAndDropList = () => {
100
+ const [tasks, setTasks] = useState([
101
+ { id: 1, title: 'Add tests to homepage' },
102
+ { id: 2, title: 'Fix styling in about section' },
103
+ { id: 3, title: 'Learn how to center a div' },
104
+ ]);
105
+
106
+ const addTask = (title: any) => {
107
+ setTasks((tasks) => [...tasks, { id: tasks.length + 1, title }]);
108
+ };
109
+
110
+ const sensors = useSensors(
111
+ useSensor(PointerSensor),
112
+ useSensor(KeyboardSensor, {
113
+ coordinateGetter: sortableKeyboardCoordinates,
114
+ })
115
+ );
116
+
117
+ const getTaskPos = (id: number): number =>
118
+ tasks.findIndex((task) => task.id === id);
119
+
120
+ const handleDragEnd = (event: any) => {
121
+ const { active, over } = event;
122
+
123
+ if (active.id === over.id) return;
124
+
125
+ setTasks((tasks) => {
126
+ const originalPos = getTaskPos(active.id);
127
+ const newPos = getTaskPos(over.id);
128
+
129
+ return arrayMove(tasks, originalPos, newPos);
130
+ });
131
+ };
132
+
133
+ return (
134
+ <div className="drag-and-drop-list">
135
+ <Typography fontSize={32} fontWeight="semi-bold">
136
+ Drag and Drop test ✅
137
+ </Typography>
138
+ <Input onSubmit={addTask} />
139
+ <DndContext
140
+ sensors={sensors}
141
+ collisionDetection={closestCorners}
142
+ onDragEnd={handleDragEnd}
143
+ >
144
+ <Column id="toDo" tasks={tasks} />
145
+ </DndContext>
146
+ </div>
147
+ );
148
+ };
149
+
150
+ export default DragAndDropList;
@@ -0,0 +1 @@
1
+ export * from './DragAndDrop';
@@ -91,7 +91,6 @@
91
91
 
92
92
  .ff-drawer-body {
93
93
  background-color: var(--drawer-footer-bg);
94
- padding: 8px;
95
94
  height: calc(100vh - 76px);
96
95
  overflow: hidden auto;
97
96
  }
@@ -3,11 +3,11 @@ import { DrawerProps } from './Types.js';
3
3
  import Button from '../Button/Button.js';
4
4
  import classNames from 'classnames';
5
5
  import './Drawer.scss';
6
- import { useEffect, useState } from 'react';
6
+ import { FC, useContext, useEffect, useState } from 'react';
7
7
  import Icon from '../Icon';
8
8
  import useEscapeKey from '../../hooks/keyboardevents/useEscKeyEvent.js';
9
-
10
- const Drawer = ({
9
+ import { ThemeContext } from '../ThemeProvider/ThemeProvider.js';
10
+ const Drawer: FC<DrawerProps> = ({
11
11
  isOpen = true,
12
12
  children = 'Drawer content area',
13
13
  onClose = () => {},
@@ -57,9 +57,10 @@ const Drawer = ({
57
57
  };
58
58
 
59
59
  const drawerSize = isExpanded ? 'x-large' : size;
60
-
60
+ const themeContext = useContext(ThemeContext);
61
+ const currentTheme = themeContext?.currentTheme;
61
62
  return createPortal(
62
- <div className="ff-drawer-container">
63
+ <div className={classNames('ff-drawer-container', currentTheme)}>
63
64
  {overlay && <div className="ff-overlay" />}
64
65
 
65
66
  <div
@@ -102,16 +103,7 @@ const Drawer = ({
102
103
  <div className="ff-drawer-title">{title}</div>
103
104
  </div>
104
105
  {_isCloseModalButtonVisible && (
105
- <div>
106
- <button onClick={onClose}>
107
- <Icon
108
- name="info"
109
- height={16}
110
- width={16}
111
- hoverEffect={false}
112
- />
113
- </button>
114
- </div>
106
+ <Icon name="close" hoverEffect={false} onClick={onClose} />
115
107
  )}
116
108
  </div>
117
109
  </div>
@@ -29,23 +29,34 @@ import WrongMarkIcon from '../../assets/icons/wrong_mark.svg?react';
29
29
  import Tick from '../../assets/Icons/tick_icon.svg?react';
30
30
  import Search from '../../assets/icons/search.svg?react';
31
31
  import Filter from '../../assets/icons/filter.svg?react';
32
+ import RightArrow from '../../assets/icons/right_arrow_icon.svg?react';
33
+ import LeftArrow from '../../assets/icons/left_arrow_icon.svg?react';
34
+ import ClockIcon from '../../assets/icons/clock_icon.svg?react';
32
35
  import Edit from '../../assets/icons/edit_icon.svg?react';
33
36
  import ViewIcon from '../../assets/icons/view_icon.svg?react';
34
- import HideIcon from '../../assets/icons/hide_icon.svg?react';
35
37
  import ExportCollection from '../../assets/icons/export_collection_icon.svg?react';
36
38
  import RunIcon from '../../assets/icons/run_icon.svg?react';
39
+ import AddVariable from '../../assets/icons/add_variable_icon.svg?react';
37
40
 
38
- import ActiveLicenseIcon from '../../assets/icons/active_license_icon.svg?react';
39
- import ExpiredLicenseIcon from '../../assets/icons/expired_license_icon.svg?react';
40
- import ExpiringSoonLicenseIcon from '../../assets/icons/expiringSoon_license_icon.svg?react';
41
+ import LicenseIcon from '../../assets/icons/active_license_icon.svg?react';
41
42
  import DeleteIcon from '../../assets/icons/delete.svg?react';
42
43
  import DetailsIcon from '../../assets/icons/details.svg?react';
43
44
  import ImpactListIcon from '../../assets/icons/impactList.svg?react';
45
+ import InfoIcon from '../../assets/icons/info_icon.svg?react';
46
+ import CalendarIcon from '../../assets/icons/calendar_icon.svg?react';
47
+ import HideIcon from '../../assets/icons/hide_icon.svg?react';
48
+ import CollapseIcon from '../../assets/icons/collapse-icon.svg?react';
49
+ import ExpandIcon from '../../assets/icons/expand-icon.svg?react';
50
+ import CopyIcon from '../../assets/icons/copy-icon.svg?react';
51
+ import DownloadFile from '../../assets/icons/download-icon.svg?react';
52
+ import RefreshIcon from '../../assets/icons/refresh-icon.svg?react';
53
+ import LicenseInfo from '../../assets/icons/license_info.svg?react';
54
+ import LicenseWarning from '../../assets/icons/license_warning.svg?react';
44
55
  //icons
45
56
  Components['delete_info'] = DeleteInfoIcon;
46
57
  Components['success'] = ToastSuccessIcon;
47
58
  Components['warning'] = WarningIcon;
48
- Components['info'] = ToastInfoIcon;
59
+ Components['toast_info'] = ToastInfoIcon;
49
60
  Components['error'] = ToastErrorIcon;
50
61
  Components['close'] = ToastCloseIcon;
51
62
  Components['more'] = MoreIcon;
@@ -71,16 +82,27 @@ Components['tick'] = Tick;
71
82
  Components['arrow_right'] = ArrowRight;
72
83
  Components['search'] = Search;
73
84
  Components['filter'] = Filter;
85
+ Components['right_arrow_icon'] = RightArrow;
86
+ Components['left_arrow_icon'] = LeftArrow;
87
+ Components['clock_icon'] = ClockIcon;
74
88
  Components['edit'] = Edit;
75
89
  Components['view_icon'] = ViewIcon;
76
- Components['hide_icon'] = HideIcon;
77
90
  Components['export_collection'] = ExportCollection;
78
91
  Components['run_icon'] = RunIcon;
79
- Components['active_license_icon'] = ActiveLicenseIcon;
80
- Components['expired_license_icon'] = ExpiredLicenseIcon;
81
- Components['expiringSoon_license_icon'] = ExpiringSoonLicenseIcon;
92
+ Components['license'] = LicenseIcon;
82
93
  Components['delete'] = DeleteIcon;
83
94
  Components['details'] = DetailsIcon;
84
95
  Components['impactList'] = ImpactListIcon;
96
+ Components['add_variable'] = AddVariable;
97
+ Components['info'] = InfoIcon;
98
+ Components['calendar_icon'] = CalendarIcon;
99
+ Components['hide_icon'] = HideIcon;
100
+ Components['collapse_icon'] = CollapseIcon;
101
+ Components['refresh_icon'] = RefreshIcon;
102
+ Components['download_file'] = DownloadFile;
103
+ Components['copy_icon'] = CopyIcon;
104
+ Components['expand_icon'] = ExpandIcon;
105
+ Components['license_info'] = LicenseInfo;
106
+ Components['license_warning'] = LicenseWarning;
85
107
 
86
108
  export default Components;
@@ -15,7 +15,9 @@
15
15
  padding: 2px 8px 2px 2px;
16
16
  border: 1px solid transparent;
17
17
  .ff-icon-color {
18
- color: var(--primary-icon-color);
18
+ path {
19
+ color: var(--primary-icon-color);
20
+ }
19
21
  }
20
22
  .icon-name {
21
23
  min-width: 33px;
@@ -32,7 +34,9 @@
32
34
  color: var(--secondary-icon-color);
33
35
  }
34
36
  .ff-icon-color {
35
- color: var(--secondary-icon-color);
37
+ path {
38
+ color: var(--secondary-icon-color);
39
+ }
36
40
  }
37
41
  }
38
42
  }
@@ -0,0 +1,25 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import IconButton from './IconButton';
3
+
4
+ const meta: Meta<typeof IconButton> = {
5
+ title: 'Components/IconButton',
6
+ component: IconButton,
7
+ parameters: {
8
+ layout: 'centered',
9
+ },
10
+ tags: ['autodocs'],
11
+ };
12
+
13
+ type Story = StoryObj<typeof IconButton>;
14
+
15
+ export const PrimaryIconButton: Story = {
16
+ render: () => {
17
+ const name = 'Project';
18
+ const icon = 'plus_icon';
19
+ const onClick = () => {};
20
+
21
+ return <IconButton label={name} iconName={icon} onClick={onClick} />;
22
+ },
23
+ };
24
+
25
+ export default meta;
@@ -1,25 +1,28 @@
1
1
  import React from 'react';
2
2
  import Icon from '../Icon';
3
- import './AddButton.scss';
3
+ import './IconButton.scss';
4
4
  import classNames from 'classnames';
5
5
  import Typography from '../Typography';
6
- import { AddButtonProps } from './types';
6
+ import { IconButtonProps } from './types';
7
7
 
8
- const AddButton: React.FC<AddButtonProps> = ({ name, onClick }) => {
8
+ const IconButton: React.FC<IconButtonProps> = ({
9
+ label,
10
+ iconName = 'plus_icon',
11
+ onClick,
12
+ }) => {
9
13
  return (
10
14
  <button onClick={onClick} className={classNames('ff-plus-icon')}>
11
15
  <Icon
12
16
  height={20}
13
17
  width={20}
14
- name={'plus_icon'}
15
- color=''
18
+ name={iconName}
16
19
  className={'ff-icon-color'}
17
20
  />
18
21
  <Typography as="div" textAlign="center" className="icon-name">
19
- {name}
22
+ {label}
20
23
  </Typography>
21
24
  </button>
22
25
  );
23
26
  };
24
27
 
25
- export default AddButton;
28
+ export default IconButton;
@@ -0,0 +1 @@
1
+ export { default } from './IconButton';
@@ -1,4 +1,5 @@
1
- export interface AddButtonProps {
2
- name: string;
1
+ export interface IconButtonProps {
2
+ label: string;
3
+ iconName: string;
3
4
  onClick?: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;
4
5
  }
@@ -14,7 +14,7 @@
14
14
  .ff-floating-label-input-container {
15
15
  .ff-floating-label {
16
16
  position: absolute;
17
- z-index: 99;
17
+ z-index: 9;
18
18
  color: var(--input-default-border-color);
19
19
  top: 7px;
20
20
  left: 7px;
@@ -43,8 +43,7 @@ export const DisabledWithValue: Story = {
43
43
  args: {
44
44
  ...defaultArgs,
45
45
  variant: 'primary',
46
- type: 'text',
47
- value: 'Disabled',
46
+ value: 12345,
48
47
  disabled: true,
49
48
  required: true,
50
49
  },
@@ -52,7 +51,7 @@ export const DisabledWithValue: Story = {
52
51
 
53
52
  export const Controlled: Story = {
54
53
  render: () => {
55
- const [value, setValue] = useState<string | number>('');
54
+ const [value, setValue] = useState<number>(0);
56
55
  const [error, setError] = useState<boolean>(false);
57
56
  const [helperText, setHelperText] = useState<string>('');
58
57
 
@@ -70,18 +69,18 @@ export const Controlled: Story = {
70
69
 
71
70
  const onDropdownChangeHandler = (option: Option) => {
72
71
  setSelectedOption(option);
73
- setValue('0');
72
+ setValue(0);
74
73
  };
75
74
 
76
75
  const onInputChangeHandler = (event: ChangeEvent<HTMLInputElement>) => {
77
- const inputValue = event.target.value;
76
+ const inputValue = parseInt(event.target.value);
78
77
  setValue(inputValue);
79
78
 
80
79
  if (event.target) {
81
- if (inputValue.length <= 0) {
80
+ if (inputValue < 0 || checkEmpty(value)) {
82
81
  setError(true);
83
82
  setHelperText(`${event.target.name} is required`);
84
- } else if (inputValue.length > 4) {
83
+ } else if (inputValue > 999) {
85
84
  setError(true);
86
85
  setHelperText(`${event.target.name} should be upto 999`);
87
86
  } else {
@@ -98,7 +97,6 @@ export const Controlled: Story = {
98
97
  label="ImplicitTime"
99
98
  placeholder={`Enter ImplicitTime here`}
100
99
  value={value}
101
- type="number"
102
100
  required={true}
103
101
  error={error}
104
102
  helperText={helperText}
@@ -113,7 +111,7 @@ export const Controlled: Story = {
113
111
 
114
112
  export const InputWithStaticLabelWithoutOptions: Story = {
115
113
  render: () => {
116
- const [value, setValue] = useState<string | number>('');
114
+ const [value, setValue] = useState<number>(0);
117
115
  const [error, setError] = useState<boolean>(false);
118
116
  const [helperText, setHelperText] = useState<string>('');
119
117
 
@@ -126,18 +124,18 @@ export const InputWithStaticLabelWithoutOptions: Story = {
126
124
 
127
125
  const onDropdownChangeHandler = (option: Option) => {
128
126
  setSelectedOption(option);
129
- setValue('0');
127
+ setValue(0);
130
128
  };
131
129
 
132
130
  const onInputChangeHandler = (event: ChangeEvent<HTMLInputElement>) => {
133
- const inputValue = event.target.value;
131
+ const inputValue = parseInt(event.target.value);
134
132
  setValue(inputValue);
135
133
 
136
134
  if (event.target) {
137
135
  if (checkEmpty(inputValue)) {
138
136
  setError(true);
139
137
  setHelperText(`${event.target.name} is required`);
140
- } else if (parseInt(inputValue, 10) >= 366) {
138
+ } else if (inputValue >= 366) {
141
139
  setError(true);
142
140
  setHelperText(`${event.target.name} should be upto 365`);
143
141
  } else {
@@ -154,7 +152,6 @@ export const InputWithStaticLabelWithoutOptions: Story = {
154
152
  label="Duration"
155
153
  placeholder={`Enter Duration here`}
156
154
  value={value}
157
- type="number"
158
155
  required={true}
159
156
  error={error}
160
157
  helperText={helperText}
@@ -8,7 +8,6 @@ const InputWithDropdown = ({
8
8
  name = '',
9
9
  label,
10
10
  value,
11
- type,
12
11
  disabled = false,
13
12
  required = false,
14
13
  placeholder,
@@ -18,18 +17,20 @@ const InputWithDropdown = ({
18
17
  selectedOption,
19
18
  onDropdownChangeHandler = () => {},
20
19
  onInputChangeHandler,
20
+ onInputBlurHandler,
21
21
  optionsRequired = true,
22
22
  }: InputWithDropdownProps) => {
23
+ const isValueFilled = value !== undefined && value >= 0;
23
24
  return (
24
25
  <div
25
26
  className={classNames('ff-input-with-dropdown-container', {
26
- 'ff-input-with-dropdown-container--filled': !!value,
27
+ 'ff-input-with-dropdown-container--filled': isValueFilled,
27
28
  })}
28
29
  >
29
30
  <fieldset
30
31
  className={classNames('ff-input-with-dropdown', {
31
- 'ff-input-with-dropdown--filled': !!value,
32
- 'ff-input-with-dropdown--no-hover': !!value,
32
+ 'ff-input-with-dropdown--filled': isValueFilled,
33
+ 'ff-input-with-dropdown--no-hover': isValueFilled,
33
34
  'ff-input-with-dropdown--disabled': !!disabled,
34
35
  'ff-input-with-dropdown--error': !!error,
35
36
  })}
@@ -39,8 +40,8 @@ const InputWithDropdown = ({
39
40
  as="label"
40
41
  htmlFor={name}
41
42
  className={classNames('ff-floating-label', {
42
- 'ff-floating-label--filled': !!value,
43
- 'ff-floating-label--no-hover': !!value,
43
+ 'ff-floating-label--filled': isValueFilled,
44
+ 'ff-floating-label--no-hover': isValueFilled,
44
45
  'ff-floating-label--error': !!error,
45
46
  })}
46
47
  >
@@ -49,15 +50,16 @@ const InputWithDropdown = ({
49
50
  </Typography>
50
51
  <input
51
52
  name={name}
52
- type={type}
53
+ type="number"
53
54
  id={name}
54
55
  value={value}
55
56
  onChange={onInputChangeHandler}
57
+ onBlur={onInputBlurHandler}
56
58
  placeholder={placeholder}
57
59
  required={required}
58
60
  disabled={disabled}
59
61
  className={classNames('ff-floating-input', {
60
- 'ff-floating-input--filled': !!value,
62
+ 'ff-floating-input--filled': isValueFilled,
61
63
  'ff-floating-input--disabled': !!disabled,
62
64
  'ff-floating-input--error': !!error,
63
65
  })}
@@ -19,17 +19,14 @@ export interface InputWithDropdownProps {
19
19
  /**
20
20
  * value | input field value
21
21
  */
22
- value: string | number;
22
+ value?: number;
23
23
 
24
24
  /**
25
25
  * variants to set color/style of the input field
26
26
  */
27
27
  variant?: 'default' | 'primary';
28
28
 
29
- /**
30
- * type to set the input field type
31
- */
32
- type: 'text' | 'password' | 'number' | 'time';
29
+
33
30
 
34
31
  /**
35
32
  * error | If true, error message will be displayed
@@ -82,9 +79,9 @@ export interface InputWithDropdownProps {
82
79
  onDropdownChangeHandler?: (option: Option) => void;
83
80
 
84
81
  /**
85
- * onFocus action for input field
82
+ * onInputBlurHandler action for input field
86
83
  */
87
- onFocus?: (event: React.FocusEvent<HTMLInputElement>) => void;
84
+ onInputBlurHandler?: (event: React.FocusEvent<HTMLInputElement>) => void;
88
85
 
89
86
  /**
90
87
  * id to select the input field uniquely
@@ -0,0 +1,63 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import Modal from './Modal';
3
+ import { useState } from 'react';
4
+ import Button from '../Button';
5
+
6
+ const meta: Meta<typeof Modal> = {
7
+ title: 'Components/Modal',
8
+ component: Modal,
9
+ parameters: {
10
+ layout: 'centered',
11
+ },
12
+ tags: ['autodocs'],
13
+ };
14
+
15
+ type Story = StoryObj<typeof Modal>;
16
+
17
+ export const DefaultModalStory: Story = {
18
+ args: {
19
+ isOpen: true,
20
+ contentLabel: 'modal',
21
+ ariaHideApp: true,
22
+ isHeaderDisplayed: true,
23
+ headerContent: <h2>title</h2>,
24
+ children: <h2>Hello</h2>,
25
+ isFooterDisplayed:true,
26
+ footerContent: <Button variant="primary" label="continue" />,
27
+ },
28
+ };
29
+
30
+ export const Controlled: Story = {
31
+ render: () => {
32
+ const [openModal, setModal] = useState(false);
33
+ return (
34
+ <>
35
+ <Button
36
+ variant="primary"
37
+ onClick={() => {
38
+ setModal(true);
39
+ }}
40
+ >
41
+ Show Modal
42
+ </Button>
43
+ {openModal && (
44
+ <Modal
45
+ overlayClassName="custom-overlay"
46
+ isOpen={openModal}
47
+ onClose={() => {
48
+ setModal(false);
49
+ }}
50
+ headerContent={<div>title</div>}
51
+ isHeaderDisplayed={true}
52
+ children={<div>Hello</div>}
53
+ ariaHideApp={true}
54
+ isFooterDisplayed={true}
55
+ footerContent={<Button variant="primary" label='continue'/>}
56
+ />
57
+ )}
58
+ </>
59
+ );
60
+ },
61
+ };
62
+
63
+ export default meta;