beem-component 2.1.28 → 2.1.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/Dockerfile +3 -1
  2. package/Jenkinsfile +20 -5
  3. package/dist/assets/voiceCallIcon.svg +5 -0
  4. package/dist/components/Alert/Alert.js +83 -0
  5. package/dist/components/Alert/Alert.stories.js +66 -0
  6. package/dist/components/BmCustomCardTitle/CustomCardTitle.js +181 -0
  7. package/dist/components/BmCustomCardTitle/CustomCardTitle.stories.js +92 -0
  8. package/dist/components/BmSelector/BmSelector.js +31 -4
  9. package/dist/components/BmSelector/BmSelector.stories.js +14 -1
  10. package/dist/components/BmTabv2/BmTabv2.js +51 -0
  11. package/dist/components/BmTabv2/BmTabv2.stories.js +73 -0
  12. package/dist/components/Card_v2/Card.js +53 -13
  13. package/dist/components/ChatComponents/ChatBody/chatBody.js +404 -104
  14. package/dist/components/DepartmentCard/DepartmentCard.js +99 -0
  15. package/dist/components/DepartmentCard/DepartmentCard.stories.js +53 -0
  16. package/dist/components/HorizontalCard/HorizontalCard.js +142 -0
  17. package/dist/components/HorizontalCard/HorizontalCard.stories.js +40 -0
  18. package/dist/components/InfoPanel/InfoPanel.js +72 -21
  19. package/dist/components/InfoPanel/InfoPanel.stories.js +56 -4
  20. package/dist/components/Modals/modal.js +26 -10
  21. package/dist/components/Modals/modals.stories.js +13 -6
  22. package/dist/components/ProfileIcon/ProfileIcon.js +5 -0
  23. package/dist/components/ProgressIndicator/ProgressIndicator.js +17 -3
  24. package/dist/components/ResourceCard/ResourceCard.js +132 -0
  25. package/dist/components/ResourceCard/ResourceCard.stories.js +94 -0
  26. package/dist/components/SelectionNotice/SelectionNotice.js +17 -3
  27. package/dist/components/globalStyles.js +1 -1
  28. package/dist/components/index.js +42 -0
  29. package/dist/components/text.js +11 -10
  30. package/dist/components/typography.js +3 -2
  31. package/nginx.conf +26 -12
  32. package/package.json +2 -1
  33. package/public/index.html +1 -0
  34. package/src/App.js +805 -1412
  35. package/src/fonts/Inter-Black.woff2 +0 -0
  36. package/src/fonts/Inter-Bold.woff2 +0 -0
  37. package/src/fonts/Inter-ExtraBold.woff2 +0 -0
  38. package/src/fonts/Inter-ExtraLight.woff2 +0 -0
  39. package/src/fonts/Inter-Light.woff2 +0 -0
  40. package/src/fonts/Inter-Medium.woff2 +0 -0
  41. package/src/fonts/Inter-Regular.woff2 +0 -0
  42. package/src/fonts/Inter-SemiBold.woff2 +0 -0
  43. package/src/fonts/Inter-Thin.woff2 +0 -0
  44. package/src/fonts/Inter-VariableFont_opsz,wght.ttf +0 -0
  45. package/src/fonts/InterDisplay-Black.woff2 +0 -0
  46. package/src/fonts/InterDisplay-Bold.woff2 +0 -0
  47. package/src/fonts/InterDisplay-ExtraBold.woff2 +0 -0
  48. package/src/fonts/InterDisplay-ExtraLight.woff2 +0 -0
  49. package/src/fonts/InterDisplay-Light.woff2 +0 -0
  50. package/src/fonts/InterDisplay-Medium.woff2 +0 -0
  51. package/src/fonts/InterDisplay-SemiBold.woff2 +0 -0
  52. package/src/fonts/InterDisplay-Thin.woff2 +0 -0
  53. package/src/fonts.scss +4 -1
  54. package/src/lib/assets/voiceCallIcon.svg +5 -0
  55. package/src/lib/components/Alert/Alert.js +111 -0
  56. package/src/lib/components/Alert/Alert.stories.jsx +66 -0
  57. package/src/lib/components/BmCustomCardTitle/CustomCardTitle.js +162 -0
  58. package/src/lib/components/BmCustomCardTitle/CustomCardTitle.stories.jsx +92 -0
  59. package/src/lib/components/BmSelector/BmSelector.js +34 -2
  60. package/src/lib/components/BmSelector/BmSelector.stories.jsx +10 -0
  61. package/src/lib/components/BmTabv2/BmTabv2.js +109 -0
  62. package/src/lib/components/BmTabv2/BmTabv2.stories.jsx +51 -0
  63. package/src/lib/components/Card_v2/Card.js +63 -12
  64. package/src/lib/components/ChatComponents/ChatBody/chatBody.js +553 -57
  65. package/src/lib/components/DepartmentCard/DepartmentCard.js +130 -0
  66. package/src/lib/components/DepartmentCard/DepartmentCard.stories.jsx +38 -0
  67. package/src/lib/components/HorizontalCard/HorizontalCard.js +276 -0
  68. package/src/lib/components/HorizontalCard/HorizontalCard.stories.jsx +33 -0
  69. package/src/lib/components/InfoPanel/InfoPanel.js +55 -12
  70. package/src/lib/components/InfoPanel/InfoPanel.stories.jsx +42 -2
  71. package/src/lib/components/Modals/modal.js +17 -4
  72. package/src/lib/components/Modals/modals.stories.js +10 -6
  73. package/src/lib/components/ProfileIcon/ProfileIcon.js +4 -0
  74. package/src/lib/components/ProgressIndicator/ProgressIndicator.js +19 -1
  75. package/src/lib/components/ResourceCard/ResourceCard.js +213 -0
  76. package/src/lib/components/ResourceCard/ResourceCard.stories.jsx +68 -0
  77. package/src/lib/components/SelectionNotice/SelectionNotice.js +19 -1
  78. package/src/lib/components/globalStyles.js +2 -1
  79. package/src/lib/components/index.js +13 -0
  80. package/src/lib/components/text.js +17 -11
  81. package/src/lib/components/typography.js +1 -0
@@ -0,0 +1,130 @@
1
+ import React from 'react';
2
+ import styled from 'styled-components';
3
+
4
+ const CardWrapper = styled.div`
5
+ overflow: hidden;
6
+
7
+ border-radius: 0.5rem;
8
+ border: 1px solid #e5e7eb;
9
+ border-top: 4px solid ${({ borderTopColor }) => borderTopColor || '#cccccc'};
10
+
11
+ background-color: #ffffff;
12
+ opacity: ${({ isActive }) => (isActive ? 1 : 0.5)};
13
+ transition: opacity 0.3s;
14
+ `;
15
+
16
+ const Header = styled.div`
17
+ padding: 1rem 1rem 0.5rem 1rem;
18
+ `;
19
+
20
+ const TitleRow = styled.div`
21
+ display: flex;
22
+ justify-content: space-between;
23
+ align-items: flex-start;
24
+ `;
25
+
26
+ const CardTitle = styled.h3`
27
+ font-size: 1.125rem;
28
+ margin: 0;
29
+ `;
30
+
31
+ const CardDescription = styled.p`
32
+ font-size: 0.875rem;
33
+ color: #6b7280;
34
+ margin-top: 0.25rem;
35
+ `;
36
+
37
+ const Content = styled.div`
38
+ margin-top: 1rem;
39
+ padding: 0 1rem 0.5rem 1rem;
40
+ display: flex;
41
+ justify-content: space-between;
42
+ align-items: center;
43
+ `;
44
+
45
+ const ResourceText = styled.span`
46
+ font-size: 0.875rem;
47
+ color: #6b7280;
48
+ `;
49
+
50
+ const StatusRow = styled.div`
51
+ display: flex;
52
+ align-items: center;
53
+ `;
54
+
55
+ const StatusDot = styled.span`
56
+ flex-shrink: 0;
57
+ width: 0.5rem;
58
+ height: 0.5rem;
59
+ margin-right: 0.5rem;
60
+ border-radius: 9999px;
61
+ background-color: ${({ isActive }) => (isActive ? '#22c55e' : '#9ca3af')};
62
+ `;
63
+
64
+ const StatusText = styled.span`
65
+ font-size: 0.75rem;
66
+ color: #6b7280;
67
+ `;
68
+
69
+ const IconButtonsContainer = styled.div`
70
+ display: flex;
71
+ gap: 0.25rem;
72
+ `;
73
+
74
+ const IconButton = styled.button`
75
+ background: none;
76
+ border: none;
77
+ padding: 0;
78
+ height: 2rem;
79
+ width: 2rem;
80
+ display: flex;
81
+ align-items: center;
82
+ justify-content: center;
83
+ cursor: pointer;
84
+ color: ${({ destructive }) => (destructive ? '#ef4444' : 'inherit')};
85
+
86
+ &:hover {
87
+ color: ${({ destructive }) => (destructive ? '#ef4444' : '#374151')};
88
+ }
89
+ `;
90
+
91
+ const BmDepartmentCard = ({
92
+ borderTopColor = '#cccccc',
93
+ isActive = true,
94
+ name,
95
+ description,
96
+ resourcesCount,
97
+ onEdit,
98
+ onDelete,
99
+ EditIcon,
100
+ DeleteIcon,
101
+ }) => {
102
+ return (
103
+ <CardWrapper borderTopColor={borderTopColor} isActive={isActive}>
104
+ <Header>
105
+ <TitleRow>
106
+ <CardTitle>{name}</CardTitle>
107
+ <IconButtonsContainer>
108
+ <IconButton onClick={onEdit}>
109
+ {EditIcon && <EditIcon fontSize="small" />}
110
+ </IconButton>
111
+ <IconButton destructive onClick={onDelete}>
112
+ {DeleteIcon && <DeleteIcon fontSize="small" />}
113
+ </IconButton>
114
+ </IconButtonsContainer>
115
+ </TitleRow>
116
+ <CardDescription>{description}</CardDescription>
117
+ </Header>
118
+ <Content>
119
+ <ResourceText>{resourcesCount} Resources</ResourceText>
120
+
121
+ <StatusRow>
122
+ <StatusDot isActive={isActive} />
123
+ <StatusText>{isActive ? 'Active' : 'Inactive'}</StatusText>
124
+ </StatusRow>
125
+ </Content>
126
+ </CardWrapper>
127
+ );
128
+ };
129
+
130
+ export default BmDepartmentCard;
@@ -0,0 +1,38 @@
1
+ import React from 'react';
2
+ import EditIcon from '@mui/icons-material/Edit';
3
+ import DeleteIcon from '@mui/icons-material/Delete';
4
+ import BmDepartmentCard from './DepartmentCard';
5
+
6
+ export default {
7
+ title: 'Components/BmDepartmentCard',
8
+ component: BmDepartmentCard,
9
+ argTypes: {
10
+ borderTopColor: { control: 'color' },
11
+ isActive: { control: 'boolean' },
12
+ name: { control: 'text' },
13
+ description: { control: 'text' },
14
+ resourcesCount: { control: 'number' },
15
+ },
16
+ };
17
+
18
+ const Template = (args) => (
19
+ <BmDepartmentCard {...args} EditIcon={EditIcon} DeleteIcon={DeleteIcon} />
20
+ );
21
+
22
+ export const Active = Template.bind({});
23
+ Active.args = {
24
+ borderTopColor: '#3b82f6',
25
+ isActive: true,
26
+ name: 'Radiology',
27
+ description: 'Handles imaging and scans for diagnosis',
28
+ resourcesCount: 5,
29
+ };
30
+
31
+ export const Inactive = Template.bind({});
32
+ Inactive.args = {
33
+ borderTopColor: '#ef4444',
34
+ isActive: false,
35
+ name: 'Cardiology',
36
+ description: 'Provides heart-related care and surgeries',
37
+ resourcesCount: 3,
38
+ };
@@ -0,0 +1,276 @@
1
+ import React from 'react';
2
+ import styled, { css } from 'styled-components';
3
+ import AccessTimeIcon from '@mui/icons-material/AccessTime';
4
+ import AttachMoneyIcon from '@mui/icons-material/AttachMoney';
5
+ import LocationOnOutlinedIcon from '@mui/icons-material/LocationOnOutlined';
6
+ import LinkIcon from '@mui/icons-material/Link';
7
+ import EditIcon from '@mui/icons-material/Edit';
8
+ import DeleteIcon from '@mui/icons-material/Delete';
9
+ import Groups2OutlinedIcon from '@mui/icons-material/Groups2Outlined';
10
+ import PeopleAltOutlinedIcon from '@mui/icons-material/PeopleAltOutlined';
11
+ import { lowerCase } from 'lodash';
12
+
13
+ const RowContainer = styled.div`
14
+ position: relative;
15
+ border: 1px solid rgba(0, 0, 0, 0.1);
16
+ border-radius: 8px;
17
+ padding: 16px;
18
+ transition: all 0.2s;
19
+ display: flex;
20
+ justify-content: space-between;
21
+ align-items: flex-start;
22
+ cursor: pointer;
23
+ gap: 12px;
24
+
25
+ &:hover {
26
+ border-color: rgba(0, 0, 0, 0.2);
27
+ }
28
+
29
+ ${({ isActive }) =>
30
+ !isActive &&
31
+ css`
32
+ opacity: 0.7;
33
+ `}
34
+
35
+ @media (max-width: 600px) {
36
+ flex-direction: column;
37
+ align-items: flex-start;
38
+ }
39
+ `;
40
+
41
+ const ColorBar = styled.div`
42
+ position: absolute;
43
+ top: 0;
44
+ left: 0;
45
+ width: 4px;
46
+ height: 100%;
47
+ border-top-left-radius: 8px;
48
+ border-bottom-left-radius: 8px;
49
+ background-color: ${(props) => props.color || '#ccc'};
50
+ `;
51
+
52
+ const InfoContainer = styled.div`
53
+ flex: 1;
54
+ padding-left: 12px;
55
+ `;
56
+
57
+ const TitleRow = styled.div`
58
+ display: flex;
59
+ align-items: center;
60
+ gap: 8px;
61
+ flex-wrap: wrap;
62
+ `;
63
+
64
+ const Name = styled.h3`
65
+ margin: 0;
66
+ font-weight: 500;
67
+ `;
68
+
69
+ const Badge = styled.span`
70
+ display: inline-flex;
71
+ align-items: center;
72
+ padding: 2px 6px;
73
+ font-size: 12px;
74
+ border-radius: 4px;
75
+ ${({ variant }) =>
76
+ variant === 'outline'
77
+ ? css`
78
+ border: 1px solid #d1d5db;
79
+ color: #4b5563;
80
+ background-color: rgba(0, 0, 0, 0.04);
81
+ `
82
+ : css`
83
+ background-color: #e6f4ea;
84
+ color: #166534;
85
+ border: none;
86
+ `}
87
+ `;
88
+
89
+ const Description = styled.p`
90
+ margin-top: 4px;
91
+ font-size: 0.9rem;
92
+ color: #6b7280;
93
+ display: -webkit-box;
94
+ -webkit-line-clamp: 1;
95
+ -webkit-box-orient: vertical;
96
+ overflow: hidden;
97
+ text-overflow: ellipsis;
98
+ word-break: break-word;
99
+ `;
100
+
101
+ const MetaRow = styled.div`
102
+ display: flex;
103
+ flex-wrap: wrap;
104
+ gap: 16px;
105
+ margin-top: 12px;
106
+ `;
107
+
108
+ const MetaItem = styled.div`
109
+ display: flex;
110
+ align-items: center;
111
+ font-size: 0.875rem;
112
+ color: #374151;
113
+
114
+ svg {
115
+ margin-right: 4px;
116
+ width: 18px;
117
+ height: 18px;
118
+ }
119
+ `;
120
+
121
+ const ActionButtons = styled.div`
122
+ display: flex;
123
+ align-items: center;
124
+ gap: 4px;
125
+ opacity: 0;
126
+ transition: opacity 0.2s;
127
+ ${RowContainer}:hover & {
128
+ opacity: 1;
129
+ }
130
+ `;
131
+
132
+ const IconButton = styled.button`
133
+ background: transparent;
134
+ border: none;
135
+ padding: 4px;
136
+ cursor: pointer;
137
+ color: ${({ iconColor }) => iconColor || '#111827'};
138
+ transition: color 0.2s;
139
+
140
+ &:hover {
141
+ color: #111827;
142
+ }
143
+
144
+ &.danger:hover {
145
+ color: #dc2626;
146
+ }
147
+
148
+ @media (max-width: 600px) {
149
+ padding: 2px;
150
+ }
151
+ `;
152
+ const formatDuration = (duration) => {
153
+ if (duration > 60) {
154
+ const hours = Math.floor(duration / 60);
155
+ const mins = duration % 60;
156
+ return `${hours}h ${mins > 0 ? `${mins}m` : ''}`;
157
+ }
158
+ return `${duration}m`;
159
+ };
160
+ const BmHorizontalCard = ({
161
+ onView,
162
+ onDelete,
163
+ onCopyLink,
164
+ name,
165
+ description,
166
+ price,
167
+ color,
168
+ isActive,
169
+ location,
170
+ paymentRequired,
171
+ selectedResources,
172
+ address,
173
+ duration,
174
+ guest_limit,
175
+ deleteToolTip,
176
+ editToolTip,
177
+ copyToolTip,
178
+ }) => {
179
+ return (
180
+ <RowContainer isActive={isActive}>
181
+ <ColorBar color={color} />
182
+
183
+ <InfoContainer>
184
+ <TitleRow>
185
+ <Name>{name}</Name>
186
+
187
+ {!isActive && <Badge variant="outline">Inactive</Badge>}
188
+
189
+ {paymentRequired && (
190
+ <Badge>
191
+ <AttachMoneyIcon fontSize="small" />
192
+ Payment Required
193
+ </Badge>
194
+ )}
195
+ </TitleRow>
196
+
197
+ <Description>{description}</Description>
198
+
199
+ <MetaRow>
200
+ {duration && (
201
+ <MetaItem>
202
+ <AccessTimeIcon fontSize="small" />
203
+ <span>{formatDuration(duration)}</span>
204
+ </MetaItem>
205
+ )}
206
+ {price && (
207
+ <MetaItem>
208
+ <AttachMoneyIcon fontSize="small" />
209
+ <span>{price === 0 ? 'Free' : `${price}`}</span>
210
+ </MetaItem>
211
+ )}
212
+ <MetaItem>
213
+ <LocationOnOutlinedIcon fontSize="small" />
214
+ <span>
215
+ {location}
216
+ {lowerCase(location) === 'physical' && address
217
+ ? ` (${address.split(',')[0]}...)`
218
+ : ''}
219
+ </span>
220
+ </MetaItem>
221
+ {guest_limit && (
222
+ <MetaItem>
223
+ <Groups2OutlinedIcon fontSize="small" />
224
+ <span>
225
+ Max {guest_limit} attendee{guest_limit > 1 ? 's' : ''}
226
+ </span>
227
+ </MetaItem>
228
+ )}
229
+ {selectedResources && selectedResources.length > 0 && (
230
+ <MetaItem>
231
+ <PeopleAltOutlinedIcon fontSize="small" />
232
+ <span>
233
+ {selectedResources.length} resource
234
+ {selectedResources.length > 1 ? 's' : ''}
235
+ </span>
236
+ </MetaItem>
237
+ )}
238
+ </MetaRow>
239
+ </InfoContainer>
240
+
241
+ <ActionButtons>
242
+ <IconButton
243
+ onClick={(e) => {
244
+ e.stopPropagation();
245
+ onCopyLink();
246
+ }}
247
+ title={copyToolTip || ''}
248
+ >
249
+ <LinkIcon fontSize="small" />
250
+ </IconButton>
251
+ <IconButton
252
+ onClick={(e) => {
253
+ e.stopPropagation();
254
+ onView();
255
+ }}
256
+ title={editToolTip || ''}
257
+ >
258
+ <EditIcon fontSize="small" />
259
+ </IconButton>
260
+ <IconButton
261
+ iconColor="#dc2626"
262
+ className="danger"
263
+ onClick={(e) => {
264
+ e.stopPropagation();
265
+ onDelete();
266
+ }}
267
+ title={deleteToolTip || ''}
268
+ >
269
+ <DeleteIcon fontSize="small" />
270
+ </IconButton>
271
+ </ActionButtons>
272
+ </RowContainer>
273
+ );
274
+ };
275
+
276
+ export default BmHorizontalCard;
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+ import { action } from '@storybook/addon-actions';
3
+ import BmHorizontalCard from './HorizontalCard';
4
+
5
+ export default {
6
+ title: 'Components/BmHorizontalCard',
7
+ component: BmHorizontalCard,
8
+ tags: ['autodocs'],
9
+ };
10
+
11
+ const sampleResources = [{ id: 1 }, { id: 2 }];
12
+
13
+ export const Example = () => (
14
+ <BmHorizontalCard
15
+ onView={action('View clicked')}
16
+ onDelete={action('Delete clicked')}
17
+ onCopyLink={action('Copy link clicked')}
18
+ name="Strategy Session"
19
+ description="Deep dive on your business strategy and next steps."
20
+ price={150}
21
+ color="#10b981"
22
+ isActive
23
+ location="physical"
24
+ paymentRequired="true"
25
+ selectedResources={sampleResources}
26
+ address="456 Innovation Avenue, Tech City"
27
+ duration={60}
28
+ guest_limit={10}
29
+ editToolTip="edit appointment type"
30
+ deleteToolTip="delete appointment type"
31
+ copyToolTip="copy appointment type link"
32
+ />
33
+ );
@@ -1,6 +1,25 @@
1
1
  import React from 'react';
2
2
  import styled from 'styled-components';
3
- import hexToRgba from '../../../util/convertToRGBA';
3
+
4
+ const hexToRgba = (hex, opacity = 0.6) => {
5
+ try {
6
+ const normalizedHex = hex?.replace('#', '');
7
+ if (
8
+ !normalizedHex ||
9
+ normalizedHex.length !== 6 ||
10
+ !/^[0-9a-fA-F]{6}$/.test(normalizedHex)
11
+ ) {
12
+ throw new Error('Invalid hex');
13
+ }
14
+
15
+ const r = parseInt(normalizedHex.slice(0, 2), 16);
16
+ const g = parseInt(normalizedHex.slice(2, 4), 16);
17
+ const b = parseInt(normalizedHex.slice(4, 6), 16);
18
+ return `rgba(${r}, ${g}, ${b}, ${opacity})`;
19
+ } catch (e) {
20
+ return `rgba(0, 0, 0, ${opacity})`;
21
+ }
22
+ };
4
23
 
5
24
  const Panel = styled.div`
6
25
  border: 0.0714rem solid rgba(51, 177, 186, 0.1);
@@ -34,8 +53,8 @@ const IconBox = styled.div`
34
53
  color: ${({ iconColor }) => iconColor || '#00000'};
35
54
 
36
55
  @media (min-width: 45.7143rem) {
37
- height: 1.5rem;
38
- width: 1.5rem;
56
+ height: 1.4rem;
57
+ width: 1.4rem;
39
58
  }
40
59
  }
41
60
  `;
@@ -62,7 +81,7 @@ const SummarySubtitle = styled.p`
62
81
  `;
63
82
 
64
83
  const SectionContainer = styled.div`
65
- padding: 0.75rem 1rem;
84
+ padding: 0.6rem 1rem;
66
85
  display: flex;
67
86
  align-items: center;
68
87
  gap: 0.5rem;
@@ -115,8 +134,7 @@ const RowContainer = styled.div`
115
134
  `;
116
135
 
117
136
  const Label = styled.span`
118
- color: rgba(0, 0, 0, 0.6);
119
-
137
+ color: ${({ labelTextColor }) => hexToRgba(labelTextColor || '#000000', 0.6)};
120
138
  @media (max-width: 42.8571rem) {
121
139
  font-size: 0.75rem;
122
140
  }
@@ -124,7 +142,7 @@ const Label = styled.span`
124
142
 
125
143
  const Value = styled.span`
126
144
  font-weight: 500;
127
-
145
+ color: ${({ valueTextColor }) => hexToRgba(valueTextColor || '#000000', 1)};
128
146
  @media (max-width: 42.8571rem) {
129
147
  font-size: 0.75rem;
130
148
  }
@@ -132,7 +150,20 @@ const Value = styled.span`
132
150
 
133
151
  const Divider = styled.hr`
134
152
  border: none;
135
- border-top: 0.0714rem dashed rgba(51, 177, 186, 0.2);
153
+ border-top: ${({
154
+ showDivider,
155
+ dividerColor = '#33b1ba',
156
+ dividerType = 'dashed',
157
+ dividerWitdh = '1px',
158
+ dividerOpacity = '0.2',
159
+ }) => {
160
+ if (showDivider) {
161
+ return `${dividerWitdh} ${dividerType} ${hexToRgba(
162
+ dividerColor,
163
+ dividerOpacity
164
+ )}`;
165
+ }
166
+ }};
136
167
  margin: 1rem auto;
137
168
  max-width: 97%;
138
169
  @media (max-width: 42.8571rem) {
@@ -170,9 +201,21 @@ const Section = ({
170
201
  backgroundColor,
171
202
  iconColor,
172
203
  iconBackgroundColor,
204
+ dividerColor,
205
+ dividerWitdh,
206
+ dividerType,
207
+ dividerOpacity,
173
208
  }) => (
174
209
  <>
175
- {showDivider && <Divider />}
210
+ {showDivider && (
211
+ <Divider
212
+ dividerColor={dividerColor}
213
+ showDivider={showDivider}
214
+ dividerWitdh={dividerWitdh}
215
+ dividerType={dividerType}
216
+ dividerOpacity={dividerOpacity}
217
+ />
218
+ )}
176
219
  <SectionContainer backgroundColor={backgroundColor}>
177
220
  {Icon && (
178
221
  <IconBox
@@ -188,10 +231,10 @@ const Section = ({
188
231
  </>
189
232
  );
190
233
 
191
- const Row = ({ label, value }) => (
234
+ const Row = ({ label, value, labelTextColor, valueTextColor }) => (
192
235
  <RowContainer>
193
- <Label>{label}:</Label>
194
- <Value>{value}</Value>
236
+ <Label labelTextColor={labelTextColor}>{label}:</Label>
237
+ <Value valueTextColor={valueTextColor}>{value}</Value>
195
238
  </RowContainer>
196
239
  );
197
240
 
@@ -31,6 +31,16 @@ export default {
31
31
  iconColor: { control: 'color' },
32
32
  textColor: { control: 'color' },
33
33
  iconBackgroundColor: { control: 'boolean' },
34
+ dividerColor: { control: 'color' },
35
+ dividerWidth: { control: { type: 'text' }, defaultValue: '3px' },
36
+ dividerOpacity: { control: { type: 'text' }, defaultValue: '0.2' },
37
+ dividerType: {
38
+ control: { type: 'select' },
39
+ options: ['dashed', 'solid'],
40
+ defaultValue: 'dashed',
41
+ },
42
+ labelTextColor: { control: 'color' },
43
+ valueTextColor: { control: 'color' },
34
44
  },
35
45
  };
36
46
 
@@ -41,6 +51,12 @@ const Template = ({
41
51
  iconColor,
42
52
  textColor,
43
53
  iconBackgroundColor,
54
+ dividerColor,
55
+ dividerOpacity,
56
+ dividerType,
57
+ dividerWidth,
58
+ labelTextColor,
59
+ valueTextColor,
44
60
  }) => {
45
61
  if (variant === 'summary') {
46
62
  return (
@@ -78,7 +94,12 @@ const Template = ({
78
94
  <BmInfoPanel.Row label="Resource" value="Dr. Smith" />
79
95
  <BmInfoPanel.Row label="Duration" value="30 minutes" />
80
96
  <BmInfoPanel.Row label="Date" value="Monday, June 24, 2025" />
81
- <BmInfoPanel.Row label="Time" value="09:00 AM" />
97
+ <BmInfoPanel.Row
98
+ labelTextColor={labelTextColor}
99
+ valueTextColor={valueTextColor}
100
+ label="Time"
101
+ value="09:00 AM"
102
+ />
82
103
  </BmInfoPanel.Section>
83
104
 
84
105
  <BmInfoPanel.Section
@@ -86,6 +107,10 @@ const Template = ({
86
107
  icon={PersonIcon}
87
108
  showDivider={showDivider}
88
109
  iconColor={iconColor}
110
+ dividerColor={dividerColor}
111
+ dividerType={dividerType}
112
+ dividerOpacity={dividerOpacity}
113
+ dividerWitdh={dividerWidth}
89
114
  >
90
115
  <BmInfoPanel.Row label="Name" value="John Doe" />
91
116
  <BmInfoPanel.Row label="Email" value="john@example.com" />
@@ -103,6 +128,12 @@ Default.args = {
103
128
  iconColor: '#33B1BA',
104
129
  textColor: '#000000',
105
130
  iconBackgroundColor: false,
131
+ dividerColor: '#33b1ba',
132
+ dividerType: 'dashed',
133
+ dividerWidth: '1px',
134
+ dividerOpacity: '0.2',
135
+ labelTextColor: '#e46a8e',
136
+ valueTextColor: '#235e92',
106
137
  };
107
138
 
108
139
  export const ExampleSummary = () => {
@@ -142,7 +173,12 @@ export const ExampleDetails = () => {
142
173
  <BmInfoPanel.Row label="Type" value={appointmentDetails.title} />
143
174
  <BmInfoPanel.Row label="Department" value={formData.departmentName} />
144
175
  <BmInfoPanel.Row label="Resource" value={formData.resourceName} />
145
- <BmInfoPanel.Row label="Duration" value={appointmentDetails.duration} />
176
+ <BmInfoPanel.Row
177
+ labelTextColor="#e46a8e"
178
+ valueTextColor="#235e92"
179
+ label="Duration"
180
+ value={appointmentDetails.duration}
181
+ />
146
182
  <BmInfoPanel.Row label="Date" value={formData.date.toDateString()} />
147
183
  <BmInfoPanel.Row
148
184
  label="Time"
@@ -154,6 +190,10 @@ export const ExampleDetails = () => {
154
190
  title="Personal Information"
155
191
  icon={PersonIcon}
156
192
  showDivider
193
+ dividerColor="#33b1ba"
194
+ dividerType="dashed"
195
+ dividerWitdh="1px"
196
+ dividerOpacity="0.2"
157
197
  >
158
198
  <BmInfoPanel.Row label="Name" value={formData.name} />
159
199
  <BmInfoPanel.Row label="Phone" value={formData.phone} />