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
|
@@ -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}>
|
|
@@ -8,12 +8,11 @@ export default {
|
|
|
8
8
|
component: BmModal,
|
|
9
9
|
title: 'components/Modals',
|
|
10
10
|
argTypes: {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
// },
|
|
11
|
+
size: {
|
|
12
|
+
control: { type: 'text' },
|
|
13
|
+
description: 'Controls the width of the modal in Pixels',
|
|
14
|
+
defaultValue: '500px',
|
|
15
|
+
},
|
|
17
16
|
closeButton: {
|
|
18
17
|
description:
|
|
19
18
|
'Placed on BmModal.Header component. Displays the close button (X)',
|
|
@@ -28,6 +27,11 @@ export default {
|
|
|
28
27
|
onHide: {
|
|
29
28
|
description: 'Handling the closing of the modal',
|
|
30
29
|
},
|
|
30
|
+
zIndex: {
|
|
31
|
+
description:
|
|
32
|
+
'Controls the stacking order of the modal in an event you have multiple modals',
|
|
33
|
+
control: { type: 'number' },
|
|
34
|
+
},
|
|
31
35
|
},
|
|
32
36
|
};
|
|
33
37
|
|
|
@@ -5,6 +5,7 @@ import wa from '../../assets/wa.png';
|
|
|
5
5
|
import fb from '../../assets/fb.png';
|
|
6
6
|
import insta from '../../assets/insta.png';
|
|
7
7
|
import gbm from '../../assets/Google_Messages_logo.png';
|
|
8
|
+
import vc from '../../assets/voiceCallIcon.svg';
|
|
8
9
|
|
|
9
10
|
const handleSize = (size) => {
|
|
10
11
|
if (size) {
|
|
@@ -111,6 +112,9 @@ export const BmProfileIcon = ({ img, content, channel, size, ...rest }) => {
|
|
|
111
112
|
{channel && channel === 'google_business_messaging' && (
|
|
112
113
|
<Dot size={size} src={gbm} alt="icon" />
|
|
113
114
|
)}
|
|
115
|
+
{channel && channel === 'voice_call' && (
|
|
116
|
+
<Dot size={size} src={vc} alt="icon" />
|
|
117
|
+
)}
|
|
114
118
|
</Profile>
|
|
115
119
|
</>
|
|
116
120
|
);
|
|
@@ -1,7 +1,25 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import styled from 'styled-components';
|
|
3
3
|
|
|
4
|
-
|
|
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
|
+
};
|
|
5
23
|
|
|
6
24
|
const Container = styled.div`
|
|
7
25
|
margin-bottom: 1rem;
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/* eslint-disable react/no-array-index-key */
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import styled from 'styled-components';
|
|
4
|
+
|
|
5
|
+
const CardWrapper = styled.div`
|
|
6
|
+
overflow: hidden;
|
|
7
|
+
border: 1px solid #e5e7eb;
|
|
8
|
+
border-radius: 0.5rem;
|
|
9
|
+
border-top: 4px solid ${({ borderTopColor }) => borderTopColor || '#cccccc'};
|
|
10
|
+
background-color: #ffffff;
|
|
11
|
+
opacity: ${({ isActive }) => (isActive ? 1 : 0.5)};
|
|
12
|
+
transition: opacity 0.3s;
|
|
13
|
+
`;
|
|
14
|
+
|
|
15
|
+
const Header = styled.div`
|
|
16
|
+
padding: 1rem 1rem 0.5rem 1rem;
|
|
17
|
+
`;
|
|
18
|
+
|
|
19
|
+
const TitleRow = styled.div`
|
|
20
|
+
display: flex;
|
|
21
|
+
justify-content: space-between;
|
|
22
|
+
align-items: flex-start;
|
|
23
|
+
`;
|
|
24
|
+
|
|
25
|
+
const TitleContainer = styled.div`
|
|
26
|
+
display: flex;
|
|
27
|
+
flex-direction: column;
|
|
28
|
+
`;
|
|
29
|
+
|
|
30
|
+
const CardTitle = styled.h3`
|
|
31
|
+
font-size: 1.125rem;
|
|
32
|
+
margin: 0;
|
|
33
|
+
`;
|
|
34
|
+
|
|
35
|
+
const BadgeRow = styled.div`
|
|
36
|
+
display: flex;
|
|
37
|
+
gap: 0.5rem;
|
|
38
|
+
margin-top: 0.25rem;
|
|
39
|
+
flex-wrap: wrap;
|
|
40
|
+
`;
|
|
41
|
+
|
|
42
|
+
const Badge = styled.span`
|
|
43
|
+
display: inline-flex;
|
|
44
|
+
align-items: center;
|
|
45
|
+
border: 1px solid #e5e7eb;
|
|
46
|
+
border-radius: 0.375rem;
|
|
47
|
+
padding: 0.125rem 0.5rem;
|
|
48
|
+
font-size: 0.75rem;
|
|
49
|
+
background-color: #f9fafb;
|
|
50
|
+
color: ${({ color }) => color || 'inherit'};
|
|
51
|
+
`;
|
|
52
|
+
|
|
53
|
+
const IconsContainer = styled.div`
|
|
54
|
+
display: flex;
|
|
55
|
+
gap: 0.25rem;
|
|
56
|
+
`;
|
|
57
|
+
|
|
58
|
+
const IconButton = styled.button`
|
|
59
|
+
background: none;
|
|
60
|
+
border: none;
|
|
61
|
+
padding: 0;
|
|
62
|
+
height: 2rem;
|
|
63
|
+
width: 2rem;
|
|
64
|
+
display: flex;
|
|
65
|
+
align-items: center;
|
|
66
|
+
justify-content: center;
|
|
67
|
+
cursor: pointer;
|
|
68
|
+
color: ${({ destructive }) => (destructive ? '#ef4444' : 'inherit')};
|
|
69
|
+
|
|
70
|
+
&:hover {
|
|
71
|
+
color: ${({ destructive }) => (destructive ? '#ef4444' : '#374151')};
|
|
72
|
+
}
|
|
73
|
+
`;
|
|
74
|
+
|
|
75
|
+
const Content = styled.div`
|
|
76
|
+
margin-top: 1rem;
|
|
77
|
+
padding: 0 1rem 0.5rem 1rem;
|
|
78
|
+
display: flex;
|
|
79
|
+
flex-direction: column;
|
|
80
|
+
gap: 0.5rem;
|
|
81
|
+
font-size: 0.875rem;
|
|
82
|
+
`;
|
|
83
|
+
|
|
84
|
+
const InfoRow = styled.div`
|
|
85
|
+
display: flex;
|
|
86
|
+
flex-wrap: wrap;
|
|
87
|
+
gap: 0.25rem;
|
|
88
|
+
`;
|
|
89
|
+
|
|
90
|
+
const Label = styled.span`
|
|
91
|
+
color: #6b7280;
|
|
92
|
+
font-size: 0.875rem;
|
|
93
|
+
`;
|
|
94
|
+
|
|
95
|
+
const Value = styled.span`
|
|
96
|
+
color: #374151;
|
|
97
|
+
font-size: 0.875rem;
|
|
98
|
+
`;
|
|
99
|
+
|
|
100
|
+
const Footer = styled.div`
|
|
101
|
+
display: flex;
|
|
102
|
+
justify-content: flex-end;
|
|
103
|
+
align-items: center;
|
|
104
|
+
margin-top: 1rem;
|
|
105
|
+
padding: 0 1rem 0.75rem 1rem;
|
|
106
|
+
`;
|
|
107
|
+
|
|
108
|
+
const StatusDot = styled.span`
|
|
109
|
+
flex-shrink: 0;
|
|
110
|
+
width: 0.5rem;
|
|
111
|
+
height: 0.5rem;
|
|
112
|
+
margin-right: 0.5rem;
|
|
113
|
+
border-radius: 9999px;
|
|
114
|
+
background-color: ${({ isActive }) => (isActive ? '#22c55e' : '#9ca3af')};
|
|
115
|
+
`;
|
|
116
|
+
|
|
117
|
+
const StatusText = styled.span`
|
|
118
|
+
font-size: 0.75rem;
|
|
119
|
+
color: #6b7280;
|
|
120
|
+
`;
|
|
121
|
+
|
|
122
|
+
const BmResourceCard = ({
|
|
123
|
+
borderTopColor = '#cccccc',
|
|
124
|
+
isActive = true,
|
|
125
|
+
name,
|
|
126
|
+
type,
|
|
127
|
+
resourceBadges = [],
|
|
128
|
+
departmentName,
|
|
129
|
+
email,
|
|
130
|
+
phone,
|
|
131
|
+
capacity,
|
|
132
|
+
features,
|
|
133
|
+
availability,
|
|
134
|
+
onEdit,
|
|
135
|
+
onDelete,
|
|
136
|
+
EditIcon,
|
|
137
|
+
DeleteIcon,
|
|
138
|
+
}) => {
|
|
139
|
+
return (
|
|
140
|
+
<CardWrapper borderTopColor={borderTopColor} isActive={isActive}>
|
|
141
|
+
<Header>
|
|
142
|
+
<TitleRow>
|
|
143
|
+
<TitleContainer>
|
|
144
|
+
<CardTitle>{name}</CardTitle>
|
|
145
|
+
<BadgeRow>
|
|
146
|
+
<Badge>{type}</Badge>
|
|
147
|
+
{resourceBadges.map((badge, index) => (
|
|
148
|
+
<Badge key={index} color={badge.color}>
|
|
149
|
+
{badge.icon && (
|
|
150
|
+
<badge.icon style={{ fontSize: 14, marginRight: 4 }} />
|
|
151
|
+
)}
|
|
152
|
+
{badge.label}
|
|
153
|
+
</Badge>
|
|
154
|
+
))}
|
|
155
|
+
</BadgeRow>
|
|
156
|
+
</TitleContainer>
|
|
157
|
+
<IconsContainer>
|
|
158
|
+
<IconButton onClick={onEdit}>
|
|
159
|
+
{EditIcon && <EditIcon fontSize="small" />}
|
|
160
|
+
</IconButton>
|
|
161
|
+
<IconButton destructive onClick={onDelete}>
|
|
162
|
+
{DeleteIcon && <DeleteIcon fontSize="small" />}
|
|
163
|
+
</IconButton>
|
|
164
|
+
</IconsContainer>
|
|
165
|
+
</TitleRow>
|
|
166
|
+
</Header>
|
|
167
|
+
<Content>
|
|
168
|
+
{departmentName && (
|
|
169
|
+
<InfoRow>
|
|
170
|
+
<Label>Department:</Label>
|
|
171
|
+
<Value>{departmentName}</Value>
|
|
172
|
+
</InfoRow>
|
|
173
|
+
)}
|
|
174
|
+
{email && (
|
|
175
|
+
<InfoRow>
|
|
176
|
+
<Label>Email:</Label>
|
|
177
|
+
<Value>{email}</Value>
|
|
178
|
+
</InfoRow>
|
|
179
|
+
)}
|
|
180
|
+
{phone && (
|
|
181
|
+
<InfoRow>
|
|
182
|
+
<Label>Phone:</Label>
|
|
183
|
+
<Value>{phone}</Value>
|
|
184
|
+
</InfoRow>
|
|
185
|
+
)}
|
|
186
|
+
{type === 'room' && capacity && (
|
|
187
|
+
<InfoRow>
|
|
188
|
+
<Label>Capacity:</Label>
|
|
189
|
+
<Value>{capacity}</Value>
|
|
190
|
+
</InfoRow>
|
|
191
|
+
)}
|
|
192
|
+
{type === 'room' && features && features.length > 0 && (
|
|
193
|
+
<InfoRow>
|
|
194
|
+
<Label>Features:</Label>
|
|
195
|
+
<Value>{features.join(', ')}</Value>
|
|
196
|
+
</InfoRow>
|
|
197
|
+
)}
|
|
198
|
+
{availability && (
|
|
199
|
+
<InfoRow>
|
|
200
|
+
<Label>Availability:</Label>
|
|
201
|
+
<Value>{availability}</Value>
|
|
202
|
+
</InfoRow>
|
|
203
|
+
)}
|
|
204
|
+
</Content>
|
|
205
|
+
<Footer>
|
|
206
|
+
<StatusDot isActive={isActive} />
|
|
207
|
+
<StatusText>{isActive ? 'Active' : 'Inactive'}</StatusText>
|
|
208
|
+
</Footer>
|
|
209
|
+
</CardWrapper>
|
|
210
|
+
);
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
export default BmResourceCard;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import EditIcon from '@mui/icons-material/Edit';
|
|
3
|
+
import DeleteIcon from '@mui/icons-material/Delete';
|
|
4
|
+
import CalendarTodayIcon from '@mui/icons-material/CalendarToday';
|
|
5
|
+
import BmResourceCard from './ResourceCard';
|
|
6
|
+
|
|
7
|
+
export default {
|
|
8
|
+
title: 'Components/BmResourceCard',
|
|
9
|
+
component: BmResourceCard,
|
|
10
|
+
argTypes: {
|
|
11
|
+
borderTopColor: { control: 'color' },
|
|
12
|
+
isActive: { control: 'boolean' },
|
|
13
|
+
name: { control: 'text' },
|
|
14
|
+
type: { control: 'text' },
|
|
15
|
+
departmentName: { control: 'text' },
|
|
16
|
+
email: { control: 'text' },
|
|
17
|
+
phone: { control: 'text' },
|
|
18
|
+
capacity: { control: 'number' },
|
|
19
|
+
availability: { control: 'text' },
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const Template = (args) => (
|
|
24
|
+
<BmResourceCard {...args} EditIcon={EditIcon} DeleteIcon={DeleteIcon} />
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
export const Default = Template.bind({});
|
|
28
|
+
Default.args = {
|
|
29
|
+
borderTopColor: '#3b82f6',
|
|
30
|
+
isActive: true,
|
|
31
|
+
name: 'Room 101',
|
|
32
|
+
type: 'room',
|
|
33
|
+
resourceBadges: [
|
|
34
|
+
{ label: 'Synced', icon: CalendarTodayIcon, color: '#10b981' },
|
|
35
|
+
],
|
|
36
|
+
departmentName: 'Radiology',
|
|
37
|
+
capacity: 12,
|
|
38
|
+
features: ['Projector', 'Whiteboard'],
|
|
39
|
+
availability: 'Weekdays 9am - 5pm',
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export const StaffExample = Template.bind({});
|
|
43
|
+
StaffExample.args = {
|
|
44
|
+
borderTopColor: '#10b981',
|
|
45
|
+
isActive: true,
|
|
46
|
+
name: 'Dr. Sarah Johnson',
|
|
47
|
+
type: 'staff',
|
|
48
|
+
resourceBadges: [
|
|
49
|
+
{ label: 'Google Synced', icon: CalendarTodayIcon, color: '#3b82f6' },
|
|
50
|
+
],
|
|
51
|
+
departmentName: 'Cardiology',
|
|
52
|
+
email: 'sarah.johnson@hospital.com',
|
|
53
|
+
phone: '+1 555 123 4567',
|
|
54
|
+
availability: 'Mon - Fri, 9am - 3pm',
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export const RoomExample = Template.bind({});
|
|
58
|
+
RoomExample.args = {
|
|
59
|
+
borderTopColor: '#f59e0b',
|
|
60
|
+
isActive: false,
|
|
61
|
+
name: 'Conference Room B',
|
|
62
|
+
type: 'room',
|
|
63
|
+
resourceBadges: [],
|
|
64
|
+
departmentName: 'Oncology',
|
|
65
|
+
capacity: 20,
|
|
66
|
+
features: ['Video Conferencing', 'AC', 'Whiteboard'],
|
|
67
|
+
availability: 'Available on demand',
|
|
68
|
+
};
|
|
@@ -1,7 +1,25 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import styled from 'styled-components';
|
|
3
3
|
|
|
4
|
-
|
|
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
|
+
};
|
|
5
23
|
|
|
6
24
|
const Container = styled.div`
|
|
7
25
|
background-color: ${({ color }) => hexToRgba(color || '#33B1BA', 0.05)};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createGlobalStyle } from 'styled-components';
|
|
2
|
-
import { h1, h2, h3, h4, h5, h6, p, input, a } from './text';
|
|
2
|
+
import { h1, h2, h3, h4, h5, h6, p, input, a, span } from './text';
|
|
3
3
|
|
|
4
4
|
export const GlobalStyle = createGlobalStyle`
|
|
5
5
|
* { font-size: 14px; cursor: pointer}
|
|
@@ -12,4 +12,5 @@ export const GlobalStyle = createGlobalStyle`
|
|
|
12
12
|
p { ${p} }
|
|
13
13
|
input {${input}}
|
|
14
14
|
a {${a}}
|
|
15
|
+
span {${span}}
|
|
15
16
|
`;
|
|
@@ -81,6 +81,13 @@ import BmLabelWithIcon from './LabelWithIcon/LabelWithIcon';
|
|
|
81
81
|
import { BmCardv2 } from './Card_v2/Card';
|
|
82
82
|
import BmInfoPanel from './InfoPanel/InfoPanel';
|
|
83
83
|
import BmSelector from './BmSelector/BmSelector';
|
|
84
|
+
import BmCustomCardTitle from './BmCustomCardTitle/CustomCardTitle';
|
|
85
|
+
import BmAlertBox from './Alert/Alert';
|
|
86
|
+
import BmDepartmentCard from './DepartmentCard/DepartmentCard';
|
|
87
|
+
import BmResourceCard from './ResourceCard/ResourceCard';
|
|
88
|
+
|
|
89
|
+
import BmCustomTab from './BmTabv2/BmTabv2';
|
|
90
|
+
import BmHorizontalCard from './HorizontalCard/HorizontalCard';
|
|
84
91
|
|
|
85
92
|
export {
|
|
86
93
|
BmAccordion,
|
|
@@ -159,4 +166,10 @@ export {
|
|
|
159
166
|
BmInfoPanel,
|
|
160
167
|
BmProgressIndicator,
|
|
161
168
|
BmSelector,
|
|
169
|
+
BmCustomCardTitle,
|
|
170
|
+
BmAlertBox,
|
|
171
|
+
BmDepartmentCard,
|
|
172
|
+
BmResourceCard,
|
|
173
|
+
BmCustomTab,
|
|
174
|
+
BmHorizontalCard,
|
|
162
175
|
};
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { Inter } from './typography';
|
|
3
2
|
// 32px
|
|
4
|
-
export const h1 = `font-family: ${
|
|
3
|
+
export const h1 = `font-family: ${Inter};
|
|
5
4
|
font-style: normal;
|
|
6
5
|
font-weight: 500;
|
|
7
6
|
font-size: 2.286rem;
|
|
@@ -9,7 +8,7 @@ letter-spacing: -0.02rem;
|
|
|
9
8
|
margin: 0rem;`;
|
|
10
9
|
|
|
11
10
|
// 24px
|
|
12
|
-
export const h2 = `font-family: ${
|
|
11
|
+
export const h2 = `font-family: ${Inter};
|
|
13
12
|
font-style: normal;
|
|
14
13
|
font-weight: 500;
|
|
15
14
|
font-size: 1.714rem;
|
|
@@ -17,7 +16,7 @@ letter-spacing: -0.02em;
|
|
|
17
16
|
margin: 0rem;`;
|
|
18
17
|
|
|
19
18
|
// 18px
|
|
20
|
-
export const h3 = `font-family: ${
|
|
19
|
+
export const h3 = `font-family: ${Inter};
|
|
21
20
|
font-style: normal;
|
|
22
21
|
font-weight: 500;
|
|
23
22
|
font-size: 1.286rem;
|
|
@@ -25,7 +24,7 @@ letter-spacing: -0.02rem;
|
|
|
25
24
|
margin: 0rem;`;
|
|
26
25
|
|
|
27
26
|
// 16px
|
|
28
|
-
export const h4 = ` font-family: ${
|
|
27
|
+
export const h4 = ` font-family: ${Inter};
|
|
29
28
|
font-style: normal;
|
|
30
29
|
font-weight: 500;
|
|
31
30
|
font-size: 1.143rem;
|
|
@@ -33,7 +32,7 @@ letter-spacing: -0.02rem;
|
|
|
33
32
|
margin: 0rem;`;
|
|
34
33
|
|
|
35
34
|
// 14px
|
|
36
|
-
export const h5 = ` font-family: ${
|
|
35
|
+
export const h5 = ` font-family: ${Inter};
|
|
37
36
|
font-style: normal;
|
|
38
37
|
font-weight: 500;
|
|
39
38
|
font-size: 1rem;
|
|
@@ -41,7 +40,7 @@ letter-spacing: -0.02rem;
|
|
|
41
40
|
margin: 0rem;`;
|
|
42
41
|
|
|
43
42
|
// 12px
|
|
44
|
-
export const h6 = ` font-family: ${
|
|
43
|
+
export const h6 = ` font-family: ${Inter};
|
|
45
44
|
font-style: normal;
|
|
46
45
|
font-weight: 500;
|
|
47
46
|
font-size: .857rem;
|
|
@@ -49,21 +48,28 @@ letter-spacing: -0.02rem;
|
|
|
49
48
|
margin: 0rem;`;
|
|
50
49
|
|
|
51
50
|
// 14px
|
|
52
|
-
export const p = `font-family: ${
|
|
51
|
+
export const p = `font-family: ${Inter};
|
|
52
|
+
font-style: normal;
|
|
53
|
+
font-weight: normal;
|
|
54
|
+
font-size: 1rem;
|
|
55
|
+
letter-spacing: -0.02rem;
|
|
56
|
+
margin: 0rem;`;
|
|
57
|
+
|
|
58
|
+
export const input = ` font-family: ${Inter};
|
|
53
59
|
font-style: normal;
|
|
54
60
|
font-weight: normal;
|
|
55
61
|
font-size: 1rem;
|
|
56
62
|
letter-spacing: -0.02rem;
|
|
57
63
|
margin: 0rem;`;
|
|
58
64
|
|
|
59
|
-
export const
|
|
65
|
+
export const a = `font-family: ${Inter};
|
|
60
66
|
font-style: normal;
|
|
61
67
|
font-weight: normal;
|
|
62
68
|
font-size: 1rem;
|
|
63
69
|
letter-spacing: -0.02rem;
|
|
64
70
|
margin: 0rem;`;
|
|
65
71
|
|
|
66
|
-
export const
|
|
72
|
+
export const span = `font-family: ${Inter};
|
|
67
73
|
font-style: normal;
|
|
68
74
|
font-weight: normal;
|
|
69
75
|
font-size: 1rem;
|