beem-component 2.1.29 → 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.
- package/Dockerfile +1 -1
- package/Jenkinsfile +20 -5
- package/dist/assets/voiceCallIcon.svg +5 -0
- package/dist/components/Alert/Alert.js +83 -0
- package/dist/components/Alert/Alert.stories.js +66 -0
- package/dist/components/BmCustomCardTitle/CustomCardTitle.js +181 -0
- package/dist/components/BmCustomCardTitle/CustomCardTitle.stories.js +92 -0
- package/dist/components/BmSelector/BmSelector.js +15 -2
- package/dist/components/BmSelector/BmSelector.stories.js +14 -1
- package/dist/components/BmTabv2/BmTabv2.js +51 -0
- package/dist/components/BmTabv2/BmTabv2.stories.js +73 -0
- package/dist/components/Card_v2/Card.js +38 -12
- package/dist/components/ChatComponents/ChatBody/chatBody.js +404 -104
- package/dist/components/DepartmentCard/DepartmentCard.js +99 -0
- package/dist/components/DepartmentCard/DepartmentCard.stories.js +53 -0
- package/dist/components/HorizontalCard/HorizontalCard.js +142 -0
- package/dist/components/HorizontalCard/HorizontalCard.stories.js +40 -0
- package/dist/components/InfoPanel/InfoPanel.js +54 -17
- package/dist/components/InfoPanel/InfoPanel.stories.js +56 -4
- package/dist/components/Modals/modal.js +26 -10
- package/dist/components/Modals/modals.stories.js +13 -6
- package/dist/components/ProfileIcon/ProfileIcon.js +5 -0
- package/dist/components/ResourceCard/ResourceCard.js +132 -0
- package/dist/components/ResourceCard/ResourceCard.stories.js +94 -0
- package/dist/components/globalStyles.js +1 -1
- package/dist/components/index.js +42 -0
- package/dist/components/text.js +11 -10
- package/dist/components/typography.js +3 -2
- package/package.json +2 -1
- package/public/index.html +1 -0
- package/src/App.js +805 -1412
- package/src/fonts/Inter-Black.woff2 +0 -0
- package/src/fonts/Inter-Bold.woff2 +0 -0
- package/src/fonts/Inter-ExtraBold.woff2 +0 -0
- package/src/fonts/Inter-ExtraLight.woff2 +0 -0
- package/src/fonts/Inter-Light.woff2 +0 -0
- package/src/fonts/Inter-Medium.woff2 +0 -0
- package/src/fonts/Inter-Regular.woff2 +0 -0
- package/src/fonts/Inter-SemiBold.woff2 +0 -0
- package/src/fonts/Inter-Thin.woff2 +0 -0
- package/src/fonts/Inter-VariableFont_opsz,wght.ttf +0 -0
- package/src/fonts/InterDisplay-Black.woff2 +0 -0
- package/src/fonts/InterDisplay-Bold.woff2 +0 -0
- package/src/fonts/InterDisplay-ExtraBold.woff2 +0 -0
- package/src/fonts/InterDisplay-ExtraLight.woff2 +0 -0
- package/src/fonts/InterDisplay-Light.woff2 +0 -0
- package/src/fonts/InterDisplay-Medium.woff2 +0 -0
- package/src/fonts/InterDisplay-SemiBold.woff2 +0 -0
- package/src/fonts/InterDisplay-Thin.woff2 +0 -0
- package/src/fonts.scss +4 -1
- package/src/lib/assets/voiceCallIcon.svg +5 -0
- package/src/lib/components/Alert/Alert.js +111 -0
- package/src/lib/components/Alert/Alert.stories.jsx +66 -0
- package/src/lib/components/BmCustomCardTitle/CustomCardTitle.js +162 -0
- package/src/lib/components/BmCustomCardTitle/CustomCardTitle.stories.jsx +92 -0
- package/src/lib/components/BmSelector/BmSelector.js +14 -1
- package/src/lib/components/BmSelector/BmSelector.stories.jsx +10 -0
- package/src/lib/components/BmTabv2/BmTabv2.js +109 -0
- package/src/lib/components/BmTabv2/BmTabv2.stories.jsx +51 -0
- package/src/lib/components/Card_v2/Card.js +46 -13
- package/src/lib/components/ChatComponents/ChatBody/chatBody.js +553 -57
- package/src/lib/components/DepartmentCard/DepartmentCard.js +130 -0
- package/src/lib/components/DepartmentCard/DepartmentCard.stories.jsx +38 -0
- package/src/lib/components/HorizontalCard/HorizontalCard.js +276 -0
- package/src/lib/components/HorizontalCard/HorizontalCard.stories.jsx +33 -0
- package/src/lib/components/InfoPanel/InfoPanel.js +35 -11
- package/src/lib/components/InfoPanel/InfoPanel.stories.jsx +42 -2
- package/src/lib/components/Modals/modal.js +17 -4
- package/src/lib/components/Modals/modals.stories.js +10 -6
- package/src/lib/components/ProfileIcon/ProfileIcon.js +4 -0
- package/src/lib/components/ResourceCard/ResourceCard.js +213 -0
- package/src/lib/components/ResourceCard/ResourceCard.stories.jsx +68 -0
- package/src/lib/components/globalStyles.js +2 -1
- package/src/lib/components/index.js +13 -0
- package/src/lib/components/text.js +17 -11
- 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
|
+
);
|
|
@@ -53,8 +53,8 @@ const IconBox = styled.div`
|
|
|
53
53
|
color: ${({ iconColor }) => iconColor || '#00000'};
|
|
54
54
|
|
|
55
55
|
@media (min-width: 45.7143rem) {
|
|
56
|
-
height: 1.
|
|
57
|
-
width: 1.
|
|
56
|
+
height: 1.4rem;
|
|
57
|
+
width: 1.4rem;
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
`;
|
|
@@ -81,7 +81,7 @@ const SummarySubtitle = styled.p`
|
|
|
81
81
|
`;
|
|
82
82
|
|
|
83
83
|
const SectionContainer = styled.div`
|
|
84
|
-
padding: 0.
|
|
84
|
+
padding: 0.6rem 1rem;
|
|
85
85
|
display: flex;
|
|
86
86
|
align-items: center;
|
|
87
87
|
gap: 0.5rem;
|
|
@@ -134,8 +134,7 @@ const RowContainer = styled.div`
|
|
|
134
134
|
`;
|
|
135
135
|
|
|
136
136
|
const Label = styled.span`
|
|
137
|
-
color:
|
|
138
|
-
|
|
137
|
+
color: ${({ labelTextColor }) => hexToRgba(labelTextColor || '#000000', 0.6)};
|
|
139
138
|
@media (max-width: 42.8571rem) {
|
|
140
139
|
font-size: 0.75rem;
|
|
141
140
|
}
|
|
@@ -143,7 +142,7 @@ const Label = styled.span`
|
|
|
143
142
|
|
|
144
143
|
const Value = styled.span`
|
|
145
144
|
font-weight: 500;
|
|
146
|
-
|
|
145
|
+
color: ${({ valueTextColor }) => hexToRgba(valueTextColor || '#000000', 1)};
|
|
147
146
|
@media (max-width: 42.8571rem) {
|
|
148
147
|
font-size: 0.75rem;
|
|
149
148
|
}
|
|
@@ -151,7 +150,20 @@ const Value = styled.span`
|
|
|
151
150
|
|
|
152
151
|
const Divider = styled.hr`
|
|
153
152
|
border: none;
|
|
154
|
-
border-top:
|
|
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
|
+
}};
|
|
155
167
|
margin: 1rem auto;
|
|
156
168
|
max-width: 97%;
|
|
157
169
|
@media (max-width: 42.8571rem) {
|
|
@@ -189,9 +201,21 @@ const Section = ({
|
|
|
189
201
|
backgroundColor,
|
|
190
202
|
iconColor,
|
|
191
203
|
iconBackgroundColor,
|
|
204
|
+
dividerColor,
|
|
205
|
+
dividerWitdh,
|
|
206
|
+
dividerType,
|
|
207
|
+
dividerOpacity,
|
|
192
208
|
}) => (
|
|
193
209
|
<>
|
|
194
|
-
{showDivider &&
|
|
210
|
+
{showDivider && (
|
|
211
|
+
<Divider
|
|
212
|
+
dividerColor={dividerColor}
|
|
213
|
+
showDivider={showDivider}
|
|
214
|
+
dividerWitdh={dividerWitdh}
|
|
215
|
+
dividerType={dividerType}
|
|
216
|
+
dividerOpacity={dividerOpacity}
|
|
217
|
+
/>
|
|
218
|
+
)}
|
|
195
219
|
<SectionContainer backgroundColor={backgroundColor}>
|
|
196
220
|
{Icon && (
|
|
197
221
|
<IconBox
|
|
@@ -207,10 +231,10 @@ const Section = ({
|
|
|
207
231
|
</>
|
|
208
232
|
);
|
|
209
233
|
|
|
210
|
-
const Row = ({ label, value }) => (
|
|
234
|
+
const Row = ({ label, value, labelTextColor, valueTextColor }) => (
|
|
211
235
|
<RowContainer>
|
|
212
|
-
<Label>{label}:</Label>
|
|
213
|
-
<Value>{value}</Value>
|
|
236
|
+
<Label labelTextColor={labelTextColor}>{label}:</Label>
|
|
237
|
+
<Value valueTextColor={valueTextColor}>{value}</Value>
|
|
214
238
|
</RowContainer>
|
|
215
239
|
);
|
|
216
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
|
|
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
|
|
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} />
|
|
@@ -15,7 +15,7 @@ export const Overlay = styled.div`
|
|
|
15
15
|
position: fixed;
|
|
16
16
|
top: 0;
|
|
17
17
|
left: 0;
|
|
18
|
-
z-index:
|
|
18
|
+
z-index: ${({ zIndex }) => zIndex || 20};
|
|
19
19
|
width: 100vw;
|
|
20
20
|
height: 100vh;
|
|
21
21
|
background-color: ${BmBgGrey45};
|
|
@@ -34,7 +34,12 @@ export const ModalContent = styled.div`
|
|
|
34
34
|
margin-bottom: 0.5rem;
|
|
35
35
|
}
|
|
36
36
|
@media (min-width: 576px) {
|
|
37
|
-
width:
|
|
37
|
+
width: ${({ size }) => {
|
|
38
|
+
if (size) {
|
|
39
|
+
return size;
|
|
40
|
+
}
|
|
41
|
+
return '500px';
|
|
42
|
+
}};
|
|
38
43
|
}
|
|
39
44
|
`;
|
|
40
45
|
|
|
@@ -53,7 +58,15 @@ export const ModalWrapper = styled.div`
|
|
|
53
58
|
overflow-y: auto;
|
|
54
59
|
`;
|
|
55
60
|
|
|
56
|
-
const BmModal = ({
|
|
61
|
+
const BmModal = ({
|
|
62
|
+
children,
|
|
63
|
+
show,
|
|
64
|
+
size,
|
|
65
|
+
zIndex,
|
|
66
|
+
onHide,
|
|
67
|
+
centered,
|
|
68
|
+
...rest
|
|
69
|
+
}) => {
|
|
57
70
|
const [toggle, setToggle] = useState(show);
|
|
58
71
|
useEffect(() => {
|
|
59
72
|
setToggle(show);
|
|
@@ -77,7 +90,7 @@ const BmModal = ({ children, show, size, onHide, centered, ...rest }) => {
|
|
|
77
90
|
<>
|
|
78
91
|
{toggle && (
|
|
79
92
|
<>
|
|
80
|
-
<Overlay />
|
|
93
|
+
<Overlay zIndex={zIndex} />
|
|
81
94
|
<ModalWrapper showModal={show} centered={centered} onHide={onHide}>
|
|
82
95
|
<Provider value={{ toggle, setToggle, size, show, onHide }}>
|
|
83
96
|
<ModalContent size={size} {...rest}>
|