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.
- package/Dockerfile +3 -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 +31 -4
- 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 +53 -13
- 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 +72 -21
- 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/ProgressIndicator/ProgressIndicator.js +17 -3
- package/dist/components/ResourceCard/ResourceCard.js +132 -0
- package/dist/components/ResourceCard/ResourceCard.stories.js +94 -0
- package/dist/components/SelectionNotice/SelectionNotice.js +17 -3
- 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/nginx.conf +26 -12
- 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 +34 -2
- 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 +63 -12
- 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 +55 -12
- 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/ProgressIndicator/ProgressIndicator.js +19 -1
- package/src/lib/components/ResourceCard/ResourceCard.js +213 -0
- package/src/lib/components/ResourceCard/ResourceCard.stories.jsx +68 -0
- package/src/lib/components/SelectionNotice/SelectionNotice.js +19 -1
- 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
|
+
);
|
|
@@ -1,6 +1,25 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import styled from 'styled-components';
|
|
3
|
-
|
|
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.
|
|
38
|
-
width: 1.
|
|
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.
|
|
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:
|
|
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:
|
|
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 &&
|
|
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
|
|
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} />
|