@licklist/design 0.78.44 → 0.78.45
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/dist/custom-fields/constants.d.ts +9 -8
- package/dist/custom-fields/constants.d.ts.map +1 -1
- package/dist/events/event-venue-map/utils/index.d.ts +1 -1
- package/dist/events/event-venue-map/utils/index.d.ts.map +1 -1
- package/dist/iframe/event/event-venue-map/IframeEventVenueMap.d.ts +3 -3
- package/dist/iframe/order-process/components/BookingSummary/utils/index.d.ts +1 -1
- package/dist/iframe/order-process/components/BookingSummary/utils/index.d.ts.map +1 -1
- package/dist/iframe/payment/order-items-table/hooks/useTableData.d.ts +5 -15
- package/dist/iframe/payment/order-items-table/hooks/useTableData.d.ts.map +1 -1
- package/dist/iframe/payment/order-items-table/utils/index.d.ts +4 -4
- package/dist/iframe/payment/order-items-table/utils/index.d.ts.map +1 -1
- package/dist/product-set/form/SelectCategoryModal.d.ts +5 -5
- package/dist/product-set/utils/index.d.ts +12 -12
- package/dist/sales/coupon/utils/index.d.ts +2 -2
- package/dist/v2/icons/index.d.ts +10 -0
- package/dist/v2/icons/index.d.ts.map +1 -1
- package/dist/v2/index.d.ts +2 -0
- package/dist/v2/index.d.ts.map +1 -1
- package/dist/v2/pages/SettingsSubPage/SettingsSubPage.d.ts +12 -0
- package/dist/v2/pages/SettingsSubPage/SettingsSubPage.d.ts.map +1 -0
- package/dist/v2/pages/SettingsSubPage/index.d.ts +3 -0
- package/dist/v2/pages/SettingsSubPage/index.d.ts.map +1 -0
- package/dist/v2/pages/auth/AuthLayout/AuthLayout.d.ts +14 -0
- package/dist/v2/pages/auth/AuthLayout/AuthLayout.d.ts.map +1 -0
- package/dist/v2/pages/auth/AuthLayout/index.d.ts +3 -0
- package/dist/v2/pages/auth/AuthLayout/index.d.ts.map +1 -0
- package/dist/v2/pages/auth/CreatePassword/CreatePasswordPage.d.ts +10 -0
- package/dist/v2/pages/auth/CreatePassword/CreatePasswordPage.d.ts.map +1 -0
- package/dist/v2/pages/auth/CreatePassword/index.d.ts +3 -0
- package/dist/v2/pages/auth/CreatePassword/index.d.ts.map +1 -0
- package/dist/v2/pages/auth/Login/LoginPage.d.ts +11 -0
- package/dist/v2/pages/auth/Login/LoginPage.d.ts.map +1 -0
- package/dist/v2/pages/auth/Login/index.d.ts +3 -0
- package/dist/v2/pages/auth/Login/index.d.ts.map +1 -0
- package/dist/v2/pages/auth/ResetPassword/ResetPasswordPage.d.ts +12 -0
- package/dist/v2/pages/auth/ResetPassword/ResetPasswordPage.d.ts.map +1 -0
- package/dist/v2/pages/auth/ResetPassword/index.d.ts +3 -0
- package/dist/v2/pages/auth/ResetPassword/index.d.ts.map +1 -0
- package/dist/v2/pages/auth/VerifyEmail/VerifyEmailPage.d.ts +9 -0
- package/dist/v2/pages/auth/VerifyEmail/VerifyEmailPage.d.ts.map +1 -0
- package/dist/v2/pages/auth/VerifyEmail/index.d.ts +3 -0
- package/dist/v2/pages/auth/VerifyEmail/index.d.ts.map +1 -0
- package/dist/v2/pages/auth/index.d.ts +11 -0
- package/dist/v2/pages/auth/index.d.ts.map +1 -0
- package/package.json +3 -3
- package/rollup.config.js +1 -0
- package/src/auth/Authorizer.tsx +1 -1
- package/src/v2/icons/Icons.stories.tsx +253 -0
- package/src/v2/icons/index.tsx +14 -0
- package/src/v2/index.ts +4 -0
- package/src/v2/pages/SettingsSubPage/SettingsSubPage.tsx +49 -0
- package/src/v2/pages/SettingsSubPage/index.ts +2 -0
- package/src/v2/pages/auth/AuthLayout/AuthLayout.scss +140 -0
- package/src/v2/pages/auth/AuthLayout/AuthLayout.tsx +61 -0
- package/src/v2/pages/auth/AuthLayout/index.ts +2 -0
- package/src/v2/pages/auth/CreatePassword/CreatePasswordPage.scss +149 -0
- package/src/v2/pages/auth/CreatePassword/CreatePasswordPage.stories.tsx +45 -0
- package/src/v2/pages/auth/CreatePassword/CreatePasswordPage.tsx +179 -0
- package/src/v2/pages/auth/CreatePassword/index.ts +2 -0
- package/src/v2/pages/auth/Login/LoginPage.scss +49 -0
- package/src/v2/pages/auth/Login/LoginPage.stories.tsx +45 -0
- package/src/v2/pages/auth/Login/LoginPage.tsx +98 -0
- package/src/v2/pages/auth/Login/index.ts +2 -0
- package/src/v2/pages/auth/ResetPassword/ResetPasswordPage.scss +84 -0
- package/src/v2/pages/auth/ResetPassword/ResetPasswordPage.stories.tsx +53 -0
- package/src/v2/pages/auth/ResetPassword/ResetPasswordPage.tsx +109 -0
- package/src/v2/pages/auth/ResetPassword/index.ts +2 -0
- package/src/v2/pages/auth/VerifyEmail/VerifyEmailPage.scss +72 -0
- package/src/v2/pages/auth/VerifyEmail/VerifyEmailPage.stories.tsx +41 -0
- package/src/v2/pages/auth/VerifyEmail/VerifyEmailPage.tsx +110 -0
- package/src/v2/pages/auth/VerifyEmail/index.ts +2 -0
- package/src/v2/pages/auth/index.ts +14 -0
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import {
|
|
3
|
+
DashboardIcon,
|
|
4
|
+
CompanyIcon,
|
|
5
|
+
VenueIcon,
|
|
6
|
+
MarketingIcon,
|
|
7
|
+
AdminIcon,
|
|
8
|
+
ProfileIcon,
|
|
9
|
+
CustomersIcon,
|
|
10
|
+
ReportsIcon,
|
|
11
|
+
AnalyticsIcon,
|
|
12
|
+
PaymentsIcon,
|
|
13
|
+
SettingsIcon,
|
|
14
|
+
LoyaltyIcon,
|
|
15
|
+
WaiversIcon,
|
|
16
|
+
CalendarIcon,
|
|
17
|
+
BookingsIcon,
|
|
18
|
+
BookingTypesIcon,
|
|
19
|
+
EditIcon,
|
|
20
|
+
CalendarSmallIcon,
|
|
21
|
+
SearchIcon,
|
|
22
|
+
RefreshIcon,
|
|
23
|
+
SendIcon,
|
|
24
|
+
ExternalLinkIcon,
|
|
25
|
+
ExportIcon,
|
|
26
|
+
ClearIcon,
|
|
27
|
+
ChevronLeftIcon,
|
|
28
|
+
ChevronRightIcon,
|
|
29
|
+
ArrowRightIcon,
|
|
30
|
+
ArrowLeftIcon,
|
|
31
|
+
InfoIcon,
|
|
32
|
+
TableHeaderArrowUpIcon,
|
|
33
|
+
TableHeaderArrowDownIcon,
|
|
34
|
+
ArrowUpIcon,
|
|
35
|
+
ArrowDownIcon,
|
|
36
|
+
GripVerticalIcon,
|
|
37
|
+
PlusIcon,
|
|
38
|
+
CloseIcon,
|
|
39
|
+
EllipsisIcon,
|
|
40
|
+
CircleIcon,
|
|
41
|
+
SecurityIcon,
|
|
42
|
+
NewPasswordIcon,
|
|
43
|
+
PasswordRequirementIcon,
|
|
44
|
+
VerifyEmailIcon,
|
|
45
|
+
PasswordTypeIcon,
|
|
46
|
+
BookedLogo,
|
|
47
|
+
DeleteIcon,
|
|
48
|
+
UserAddIcon,
|
|
49
|
+
UserImportIcon,
|
|
50
|
+
SlidersIcon,
|
|
51
|
+
ProviderPlusIcon,
|
|
52
|
+
ClockIcon,
|
|
53
|
+
WarningTriangleIcon,
|
|
54
|
+
CheckCircleIcon,
|
|
55
|
+
XCircleIcon,
|
|
56
|
+
UserGroupIcon,
|
|
57
|
+
UploadIcon,
|
|
58
|
+
ArrowDownSmallIcon,
|
|
59
|
+
ToggleCheckIcon,
|
|
60
|
+
ToggleCrossIcon,
|
|
61
|
+
TrendUpIcon,
|
|
62
|
+
TrendDownIcon,
|
|
63
|
+
TrendSteadyIcon,
|
|
64
|
+
TrendUpSmallIcon,
|
|
65
|
+
TrendDownSmallIcon,
|
|
66
|
+
TrendSteadySmallIcon,
|
|
67
|
+
NPSHappyIcon,
|
|
68
|
+
NPSNeutralIcon,
|
|
69
|
+
NPSSadIcon,
|
|
70
|
+
NPSSadFaceIcon,
|
|
71
|
+
NPSNeutralFaceIcon,
|
|
72
|
+
NPSHappyFaceIcon,
|
|
73
|
+
AnalyticsEmptyIcon,
|
|
74
|
+
PaymentsEmptyIcon,
|
|
75
|
+
ReportsEmptyIcon,
|
|
76
|
+
SelectCheckIcon,
|
|
77
|
+
} from './index'
|
|
78
|
+
|
|
79
|
+
export default {
|
|
80
|
+
title: 'v2/Icons',
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const iconCardStyle: React.CSSProperties = {
|
|
84
|
+
display: 'flex',
|
|
85
|
+
flexDirection: 'column',
|
|
86
|
+
alignItems: 'center',
|
|
87
|
+
justifyContent: 'center',
|
|
88
|
+
gap: 8,
|
|
89
|
+
padding: 16,
|
|
90
|
+
border: '1px solid #E8E9EF',
|
|
91
|
+
borderRadius: 8,
|
|
92
|
+
minWidth: 120,
|
|
93
|
+
minHeight: 100,
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const labelStyle: React.CSSProperties = {
|
|
97
|
+
fontSize: 11,
|
|
98
|
+
color: '#6B7280',
|
|
99
|
+
fontFamily: 'monospace',
|
|
100
|
+
textAlign: 'center',
|
|
101
|
+
wordBreak: 'break-all',
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const gridStyle: React.CSSProperties = {
|
|
105
|
+
display: 'grid',
|
|
106
|
+
gridTemplateColumns: 'repeat(auto-fill, minmax(140px, 1fr))',
|
|
107
|
+
gap: 12,
|
|
108
|
+
padding: 24,
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const sectionStyle: React.CSSProperties = {
|
|
112
|
+
marginBottom: 32,
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const sectionTitleStyle: React.CSSProperties = {
|
|
116
|
+
fontSize: 16,
|
|
117
|
+
fontWeight: 600,
|
|
118
|
+
marginBottom: 12,
|
|
119
|
+
paddingLeft: 24,
|
|
120
|
+
color: '#111827',
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const IconCard = ({ name, children }: { name: string; children: React.ReactNode }) => (
|
|
124
|
+
<div style={iconCardStyle}>
|
|
125
|
+
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
|
|
126
|
+
{children}
|
|
127
|
+
</div>
|
|
128
|
+
<span style={labelStyle}>{name}</span>
|
|
129
|
+
</div>
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
const Section = ({ title, children }: { title: string; children: React.ReactNode }) => (
|
|
133
|
+
<div style={sectionStyle}>
|
|
134
|
+
<h3 style={sectionTitleStyle}>{title}</h3>
|
|
135
|
+
<div style={gridStyle}>{children}</div>
|
|
136
|
+
</div>
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
export const AllIcons = () => (
|
|
140
|
+
<div>
|
|
141
|
+
<Section title="Navigation">
|
|
142
|
+
<IconCard name="DashboardIcon"><DashboardIcon /></IconCard>
|
|
143
|
+
<IconCard name="CompanyIcon"><CompanyIcon /></IconCard>
|
|
144
|
+
<IconCard name="VenueIcon"><VenueIcon /></IconCard>
|
|
145
|
+
<IconCard name="MarketingIcon"><MarketingIcon /></IconCard>
|
|
146
|
+
<IconCard name="AdminIcon"><AdminIcon /></IconCard>
|
|
147
|
+
<IconCard name="ProfileIcon"><ProfileIcon /></IconCard>
|
|
148
|
+
<IconCard name="CustomersIcon"><CustomersIcon /></IconCard>
|
|
149
|
+
<IconCard name="ReportsIcon"><ReportsIcon /></IconCard>
|
|
150
|
+
<IconCard name="AnalyticsIcon"><AnalyticsIcon /></IconCard>
|
|
151
|
+
<IconCard name="PaymentsIcon"><PaymentsIcon /></IconCard>
|
|
152
|
+
<IconCard name="SettingsIcon"><SettingsIcon /></IconCard>
|
|
153
|
+
<IconCard name="LoyaltyIcon"><LoyaltyIcon /></IconCard>
|
|
154
|
+
<IconCard name="WaiversIcon"><WaiversIcon /></IconCard>
|
|
155
|
+
<IconCard name="CalendarIcon"><CalendarIcon /></IconCard>
|
|
156
|
+
<IconCard name="BookingsIcon"><BookingsIcon /></IconCard>
|
|
157
|
+
<IconCard name="BookingTypesIcon"><BookingTypesIcon /></IconCard>
|
|
158
|
+
</Section>
|
|
159
|
+
|
|
160
|
+
<Section title="Actions">
|
|
161
|
+
<IconCard name="EditIcon"><EditIcon /></IconCard>
|
|
162
|
+
<IconCard name="SearchIcon"><SearchIcon /></IconCard>
|
|
163
|
+
<IconCard name="RefreshIcon"><RefreshIcon /></IconCard>
|
|
164
|
+
<IconCard name="SendIcon"><SendIcon /></IconCard>
|
|
165
|
+
<IconCard name="ExternalLinkIcon"><ExternalLinkIcon /></IconCard>
|
|
166
|
+
<IconCard name="ExportIcon"><ExportIcon /></IconCard>
|
|
167
|
+
<IconCard name="ClearIcon"><ClearIcon /></IconCard>
|
|
168
|
+
<IconCard name="DeleteIcon"><DeleteIcon /></IconCard>
|
|
169
|
+
<IconCard name="PlusIcon"><PlusIcon /></IconCard>
|
|
170
|
+
<IconCard name="CloseIcon"><CloseIcon /></IconCard>
|
|
171
|
+
<IconCard name="UploadIcon"><UploadIcon /></IconCard>
|
|
172
|
+
</Section>
|
|
173
|
+
|
|
174
|
+
<Section title="Arrows & Chevrons">
|
|
175
|
+
<IconCard name="ArrowLeftIcon"><ArrowLeftIcon /></IconCard>
|
|
176
|
+
<IconCard name="ArrowRightIcon"><ArrowRightIcon /></IconCard>
|
|
177
|
+
<IconCard name="ArrowUpIcon"><ArrowUpIcon /></IconCard>
|
|
178
|
+
<IconCard name="ArrowDownIcon"><ArrowDownIcon /></IconCard>
|
|
179
|
+
<IconCard name="ArrowDownSmallIcon"><ArrowDownSmallIcon /></IconCard>
|
|
180
|
+
<IconCard name="ChevronLeftIcon"><ChevronLeftIcon /></IconCard>
|
|
181
|
+
<IconCard name="ChevronRightIcon"><ChevronRightIcon /></IconCard>
|
|
182
|
+
<IconCard name="TableHeaderArrowUpIcon"><TableHeaderArrowUpIcon /></IconCard>
|
|
183
|
+
<IconCard name="TableHeaderArrowDownIcon"><TableHeaderArrowDownIcon /></IconCard>
|
|
184
|
+
</Section>
|
|
185
|
+
|
|
186
|
+
<Section title="Form & Input">
|
|
187
|
+
<IconCard name="CalendarSmallIcon"><CalendarSmallIcon /></IconCard>
|
|
188
|
+
<IconCard name="ClockIcon"><ClockIcon /></IconCard>
|
|
189
|
+
<IconCard name="InfoIcon"><InfoIcon /></IconCard>
|
|
190
|
+
<IconCard name="EllipsisIcon"><EllipsisIcon /></IconCard>
|
|
191
|
+
<IconCard name="CircleIcon"><CircleIcon /></IconCard>
|
|
192
|
+
<IconCard name="GripVerticalIcon"><GripVerticalIcon /></IconCard>
|
|
193
|
+
<IconCard name="SlidersIcon"><SlidersIcon /></IconCard>
|
|
194
|
+
<IconCard name="SelectCheckIcon"><SelectCheckIcon /></IconCard>
|
|
195
|
+
<IconCard name="ToggleCheckIcon"><ToggleCheckIcon /></IconCard>
|
|
196
|
+
<IconCard name="ToggleCrossIcon"><ToggleCrossIcon /></IconCard>
|
|
197
|
+
</Section>
|
|
198
|
+
|
|
199
|
+
<Section title="Users">
|
|
200
|
+
<IconCard name="UserAddIcon"><UserAddIcon /></IconCard>
|
|
201
|
+
<IconCard name="UserImportIcon"><UserImportIcon /></IconCard>
|
|
202
|
+
<IconCard name="UserGroupIcon"><UserGroupIcon /></IconCard>
|
|
203
|
+
<IconCard name="ProviderPlusIcon"><ProviderPlusIcon /></IconCard>
|
|
204
|
+
</Section>
|
|
205
|
+
|
|
206
|
+
<Section title="Status & Feedback">
|
|
207
|
+
<IconCard name="CheckCircleIcon"><CheckCircleIcon /></IconCard>
|
|
208
|
+
<IconCard name="XCircleIcon"><XCircleIcon /></IconCard>
|
|
209
|
+
<IconCard name="WarningTriangleIcon"><WarningTriangleIcon /></IconCard>
|
|
210
|
+
<IconCard name="SecurityIcon"><SecurityIcon /></IconCard>
|
|
211
|
+
</Section>
|
|
212
|
+
|
|
213
|
+
<Section title="Trends">
|
|
214
|
+
<IconCard name="TrendUpIcon"><TrendUpIcon /></IconCard>
|
|
215
|
+
<IconCard name="TrendDownIcon"><TrendDownIcon /></IconCard>
|
|
216
|
+
<IconCard name="TrendSteadyIcon"><TrendSteadyIcon /></IconCard>
|
|
217
|
+
<IconCard name="TrendUpSmallIcon"><TrendUpSmallIcon /></IconCard>
|
|
218
|
+
<IconCard name="TrendDownSmallIcon"><TrendDownSmallIcon /></IconCard>
|
|
219
|
+
<IconCard name="TrendSteadySmallIcon"><TrendSteadySmallIcon /></IconCard>
|
|
220
|
+
</Section>
|
|
221
|
+
|
|
222
|
+
<Section title="NPS">
|
|
223
|
+
<IconCard name="NPSHappyIcon"><NPSHappyIcon /></IconCard>
|
|
224
|
+
<IconCard name="NPSNeutralIcon"><NPSNeutralIcon /></IconCard>
|
|
225
|
+
<IconCard name="NPSSadIcon"><NPSSadIcon /></IconCard>
|
|
226
|
+
<IconCard name="NPSHappyFaceIcon"><NPSHappyFaceIcon /></IconCard>
|
|
227
|
+
<IconCard name="NPSNeutralFaceIcon"><NPSNeutralFaceIcon /></IconCard>
|
|
228
|
+
<IconCard name="NPSSadFaceIcon"><NPSSadFaceIcon /></IconCard>
|
|
229
|
+
</Section>
|
|
230
|
+
|
|
231
|
+
<Section title="Auth & Branding">
|
|
232
|
+
<IconCard name="NewPasswordIcon"><NewPasswordIcon /></IconCard>
|
|
233
|
+
<IconCard name="PasswordRequirementIcon"><PasswordRequirementIcon met={false} /></IconCard>
|
|
234
|
+
<IconCard name="PasswordRequirementIcon (met)"><PasswordRequirementIcon met /></IconCard>
|
|
235
|
+
<IconCard name="VerifyEmailIcon"><VerifyEmailIcon /></IconCard>
|
|
236
|
+
<IconCard name="PasswordTypeIcon"><PasswordTypeIcon /></IconCard>
|
|
237
|
+
<IconCard name="BookedLogo"><BookedLogo /></IconCard>
|
|
238
|
+
</Section>
|
|
239
|
+
|
|
240
|
+
<Section title="Empty States">
|
|
241
|
+
<IconCard name="AnalyticsEmptyIcon"><AnalyticsEmptyIcon /></IconCard>
|
|
242
|
+
<IconCard name="PaymentsEmptyIcon"><PaymentsEmptyIcon /></IconCard>
|
|
243
|
+
<IconCard name="ReportsEmptyIcon"><ReportsEmptyIcon /></IconCard>
|
|
244
|
+
</Section>
|
|
245
|
+
|
|
246
|
+
</div>
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
AllIcons.story = {
|
|
250
|
+
parameters: {
|
|
251
|
+
info: 'All v2 icons in the design system',
|
|
252
|
+
},
|
|
253
|
+
}
|
package/src/v2/icons/index.tsx
CHANGED
|
@@ -388,6 +388,20 @@ export const SettingsPageDashboardIcon = ({ size = 24, className = '' }: { size?
|
|
|
388
388
|
</svg>
|
|
389
389
|
)
|
|
390
390
|
|
|
391
|
+
// Logo icons (used by auth pages)
|
|
392
|
+
export const LogoDesktop1 = ({ width = 18, height = 18, className = '' }: { width?: number; height?: number; className?: string } = {}) => (
|
|
393
|
+
<svg width={width} height={height} viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg" className={className}>
|
|
394
|
+
<path d="M9 1L11.5 5.5L16.5 6L13 9L14 14L9 11.5L4 14L5 9L1.5 6L6.5 5.5L9 1Z" fill="var(--fills-main-fill-primary, #14215A)" stroke="var(--fills-main-fill-primary, #14215A)" strokeWidth="0.5" />
|
|
395
|
+
</svg>
|
|
396
|
+
)
|
|
397
|
+
|
|
398
|
+
export const LogoDesktop2 = ({ width = 112, height = 29, className = '' }: { width?: number; height?: number; className?: string } = {}) => (
|
|
399
|
+
<svg width={width} height={height} viewBox="0 0 112 29" fill="none" xmlns="http://www.w3.org/2000/svg" className={className}>
|
|
400
|
+
<rect x="0" y="0" width="112" height="29" rx="4" fill="var(--surfaces-main-background-primary, #ffffff)" stroke="var(--borders-main-border-primary, #E8E9EF)" strokeWidth="1" />
|
|
401
|
+
<text x="56" y="18" textAnchor="middle" fontFamily="Geist" fontSize="11" fontWeight="600" fill="var(--labels-main-label-primary, #121E52)">Booked it</text>
|
|
402
|
+
</svg>
|
|
403
|
+
)
|
|
404
|
+
|
|
391
405
|
export const SettingsPageWaiversIcon = ({ size = 24, className = '', ...props }: React.SVGProps<SVGSVGElement> & { size?: number; className?: string } = {}) => (
|
|
392
406
|
<svg width={size} height={size} viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" className={className} {...props}>
|
|
393
407
|
<path d="M29.3657 27.8354C31.4117 26.4405 34.0772 25.7503 37.729 26.1685L38.4731 26.2661L38.6235 26.2974C39.3599 26.4857 39.8491 27.2053 39.7339 27.9731C39.6184 28.741 38.9395 29.2849 38.1802 29.2485L38.0278 29.2339L37.395 29.1489C34.308 28.7933 32.394 29.4019 31.0562 30.314C29.5595 31.3345 28.5809 32.8586 27.5396 34.6099C26.5775 36.2279 25.4604 38.2594 23.6812 39.4409C21.8382 40.6643 19.5533 40.8605 16.5776 39.8687L15.9731 39.6548L15.8325 39.5933C15.1516 39.2557 14.8228 38.4502 15.0952 37.7231C15.3681 36.996 16.1461 36.6045 16.8813 36.7983L17.0278 36.8452L17.5229 37.021C19.9234 37.8245 21.1853 37.498 22.0229 36.9419C23.1024 36.2249 23.8614 34.9277 24.9614 33.0776C25.9824 31.3606 27.2536 29.2757 29.3657 27.8354ZM22.0132 6.82178C22.3878 6.08288 23.2909 5.78703 24.0298 6.16162L30.855 9.62256L30.9878 9.69775C31.6279 10.1082 31.8654 10.9454 31.5142 11.6382L21.6284 31.1382C21.5083 31.375 21.327 31.5762 21.104 31.7202L14.7261 35.8394C14.2781 36.1287 13.7106 36.1585 13.2349 35.9175C12.759 35.6762 12.4459 35.2001 12.4146 34.6675L11.9673 27.0884C11.9517 26.8234 12.0075 26.5586 12.1274 26.3218L22.0132 6.82178ZM14.9878 27.3149L15.2583 31.9224L19.1372 29.4185L28.1606 11.6196L24.0112 9.51611L14.9878 27.3149Z" fill="currentColor"/>
|
package/src/v2/index.ts
CHANGED
|
@@ -151,6 +151,10 @@ export type { AuthCredentials } from './types/navigation'
|
|
|
151
151
|
export { SettingsPage, SettingsTabs, SidebarCustomisation, defaultSidebarItems, SidebarNavItem } from './pages/Settings'
|
|
152
152
|
export type { SettingsPageProps, SettingsTabsProps, SettingsTab, SidebarCustomisationProps, SidebarItem, SidebarNavItemProps } from './pages/Settings'
|
|
153
153
|
|
|
154
|
+
// Auth Pages
|
|
155
|
+
export { AuthLayout, LoginPage, ResetPasswordPage, CreatePasswordPage } from './pages/auth'
|
|
156
|
+
export type { AuthLayoutProps, LoginPageProps, ResetPasswordPageProps, CreatePasswordPageProps } from './pages/auth'
|
|
157
|
+
|
|
154
158
|
// ============================================================================
|
|
155
159
|
// Design Tokens
|
|
156
160
|
// ============================================================================
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { GhostButton } from '../../components/Button'
|
|
3
|
+
import { NewPageHeader } from '../../components/NewPageHeader'
|
|
4
|
+
import { ArrowLeftIcon, PlusIcon } from '../../icons'
|
|
5
|
+
import './SettingsSubPage.scss'
|
|
6
|
+
|
|
7
|
+
export interface SettingsSubPageProps {
|
|
8
|
+
title?: string
|
|
9
|
+
backLabel?: string
|
|
10
|
+
onBack?: () => void
|
|
11
|
+
actionLabel?: string
|
|
12
|
+
onAction?: () => void
|
|
13
|
+
children?: React.ReactNode
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const SettingsSubPage: React.FC<SettingsSubPageProps> = ({
|
|
17
|
+
title = '',
|
|
18
|
+
backLabel = 'Back to Settings',
|
|
19
|
+
onBack,
|
|
20
|
+
actionLabel,
|
|
21
|
+
onAction,
|
|
22
|
+
children,
|
|
23
|
+
}) => {
|
|
24
|
+
return (
|
|
25
|
+
<div className="settings-sub-page">
|
|
26
|
+
{onBack && (
|
|
27
|
+
<div className="settings-sub-page__back">
|
|
28
|
+
<GhostButton onClick={onBack} icon={<ArrowLeftIcon />}>
|
|
29
|
+
{backLabel}
|
|
30
|
+
</GhostButton>
|
|
31
|
+
</div>
|
|
32
|
+
)}
|
|
33
|
+
<NewPageHeader
|
|
34
|
+
title={title}
|
|
35
|
+
showDivider
|
|
36
|
+
/>
|
|
37
|
+
<div className="settings-sub-page__content">
|
|
38
|
+
{onAction && actionLabel && (
|
|
39
|
+
<div className="settings-sub-page__action">
|
|
40
|
+
<GhostButton onClick={onAction} icon={<PlusIcon width={16} height={16} />}>
|
|
41
|
+
{actionLabel}
|
|
42
|
+
</GhostButton>
|
|
43
|
+
</div>
|
|
44
|
+
)}
|
|
45
|
+
{children}
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
)
|
|
49
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
.auth-layout {
|
|
2
|
+
position: relative;
|
|
3
|
+
width: 100%;
|
|
4
|
+
min-height: 100vh;
|
|
5
|
+
display: flex;
|
|
6
|
+
flex-direction: column;
|
|
7
|
+
align-items: center;
|
|
8
|
+
justify-content: flex-start;
|
|
9
|
+
background-color: var(--surface-secondary);
|
|
10
|
+
padding: 0 16px;
|
|
11
|
+
|
|
12
|
+
&__alert {
|
|
13
|
+
width: 846px;
|
|
14
|
+
max-width: 100%;
|
|
15
|
+
margin-top: 24px;
|
|
16
|
+
position: relative;
|
|
17
|
+
z-index: 1;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
&__bg-decoration {
|
|
21
|
+
position: fixed;
|
|
22
|
+
top: 0;
|
|
23
|
+
left: 0;
|
|
24
|
+
width: 489px;
|
|
25
|
+
height: 588px;
|
|
26
|
+
pointer-events: none;
|
|
27
|
+
z-index: 0;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
&__card {
|
|
31
|
+
position: relative;
|
|
32
|
+
z-index: 10;
|
|
33
|
+
width: 846px;
|
|
34
|
+
max-width: 100%;
|
|
35
|
+
min-height: 400px;
|
|
36
|
+
background-color: var(--surface-primary);
|
|
37
|
+
border-radius: 16px;
|
|
38
|
+
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.08);
|
|
39
|
+
overflow: hidden;
|
|
40
|
+
margin-top: 80px;
|
|
41
|
+
|
|
42
|
+
@media (max-width: 768px) {
|
|
43
|
+
margin-top: 40px;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
&__alert + &__card {
|
|
48
|
+
margin-top: 16px;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
&__header {
|
|
52
|
+
display: flex;
|
|
53
|
+
align-items: center;
|
|
54
|
+
justify-content: space-between;
|
|
55
|
+
padding: 16px;
|
|
56
|
+
border-bottom: 1px solid var(--border-primary);
|
|
57
|
+
|
|
58
|
+
.new-badge {
|
|
59
|
+
padding: 6px 10px;
|
|
60
|
+
font-size: 11px;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
&__body {
|
|
65
|
+
padding: 42px;
|
|
66
|
+
|
|
67
|
+
@media (max-width: 768px) {
|
|
68
|
+
padding: 20px;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
&__content {
|
|
73
|
+
display: flex;
|
|
74
|
+
width: 100%;
|
|
75
|
+
gap: 64px;
|
|
76
|
+
flex-wrap: wrap;
|
|
77
|
+
|
|
78
|
+
@media (max-width: 768px) {
|
|
79
|
+
gap: 32px;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
&__info {
|
|
84
|
+
min-width: 240px;
|
|
85
|
+
flex: 1;
|
|
86
|
+
flex-shrink: 0;
|
|
87
|
+
flex-basis: 0;
|
|
88
|
+
max-width: 260px;
|
|
89
|
+
color: var(--label-primary);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
&__icon {
|
|
93
|
+
width: 64px;
|
|
94
|
+
height: 64px;
|
|
95
|
+
color: var(--fill-primary);
|
|
96
|
+
|
|
97
|
+
svg {
|
|
98
|
+
width: 100%;
|
|
99
|
+
height: 100%;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
&__title {
|
|
104
|
+
font-family: var(--font-family-sans, 'Geist', sans-serif);
|
|
105
|
+
font-size: 32px;
|
|
106
|
+
font-weight: 700;
|
|
107
|
+
line-height: 1;
|
|
108
|
+
color: var(--label-primary);
|
|
109
|
+
margin: 8px 0 0;
|
|
110
|
+
padding: 0;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
&__subtitle {
|
|
114
|
+
font-family: var(--font-family-sans, 'Geist', sans-serif);
|
|
115
|
+
font-size: 18px;
|
|
116
|
+
font-weight: 400;
|
|
117
|
+
line-height: 1;
|
|
118
|
+
color: var(--label-secondary);
|
|
119
|
+
margin: 16px 0 0;
|
|
120
|
+
padding: 0;
|
|
121
|
+
|
|
122
|
+
@media (max-width: 768px) {
|
|
123
|
+
margin-top: 4px;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
&__form-area {
|
|
128
|
+
display: flex;
|
|
129
|
+
min-width: 240px;
|
|
130
|
+
flex-direction: column;
|
|
131
|
+
align-items: stretch;
|
|
132
|
+
flex: 1;
|
|
133
|
+
flex-shrink: 0;
|
|
134
|
+
flex-basis: 0;
|
|
135
|
+
|
|
136
|
+
@media (max-width: 768px) {
|
|
137
|
+
max-width: 100%;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import React, { useState, useEffect } from 'react'
|
|
2
|
+
import './AuthLayout.scss'
|
|
3
|
+
import { DashboardFooter } from '../../../navigation/DashboardLayout/DashboardFooter'
|
|
4
|
+
import { AuthBgDecorationIcon, BookedLogo } from '../../../icons'
|
|
5
|
+
import { Badge } from '../../../components/Badge'
|
|
6
|
+
import { Alert } from '../../../components/Alert'
|
|
7
|
+
|
|
8
|
+
export interface AuthLayoutProps {
|
|
9
|
+
badgeLabel: string
|
|
10
|
+
icon: React.ReactNode
|
|
11
|
+
title: string
|
|
12
|
+
subtitle: string
|
|
13
|
+
children: React.ReactNode
|
|
14
|
+
version?: string
|
|
15
|
+
error?: string
|
|
16
|
+
successMessage?: string
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const AuthLayout: React.FC<AuthLayoutProps> = ({ badgeLabel, icon, title, subtitle, children, version, error, successMessage }) => {
|
|
20
|
+
const [dismissed, setDismissed] = useState(false)
|
|
21
|
+
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
setDismissed(false)
|
|
24
|
+
}, [error, successMessage])
|
|
25
|
+
|
|
26
|
+
const showError = error && !dismissed
|
|
27
|
+
const showSuccess = successMessage && !dismissed
|
|
28
|
+
|
|
29
|
+
return (
|
|
30
|
+
<div className="auth-layout">
|
|
31
|
+
<AuthBgDecorationIcon />
|
|
32
|
+
|
|
33
|
+
{showError && (
|
|
34
|
+
<Alert variant="error" title="Error" message={error} className="auth-layout__alert" onDismiss={() => setDismissed(true)} />
|
|
35
|
+
)}
|
|
36
|
+
{showSuccess && (
|
|
37
|
+
<Alert variant="success" title="Success" message={successMessage} className="auth-layout__alert" onDismiss={() => setDismissed(true)} />
|
|
38
|
+
)}
|
|
39
|
+
|
|
40
|
+
<div className="auth-layout__card">
|
|
41
|
+
<div className="auth-layout__header">
|
|
42
|
+
<BookedLogo />
|
|
43
|
+
<Badge>{badgeLabel}</Badge>
|
|
44
|
+
</div>
|
|
45
|
+
<div className="auth-layout__body">
|
|
46
|
+
<div className="auth-layout__content">
|
|
47
|
+
<div className="auth-layout__info">
|
|
48
|
+
<div className="auth-layout__icon">{icon}</div>
|
|
49
|
+
<h1 className="auth-layout__title">{title}</h1>
|
|
50
|
+
<p className="auth-layout__subtitle">{subtitle}</p>
|
|
51
|
+
</div>
|
|
52
|
+
<div className="auth-layout__form-area">
|
|
53
|
+
{children}
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
<DashboardFooter version={version} />
|
|
59
|
+
</div>
|
|
60
|
+
)
|
|
61
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
.auth-create-password {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: column;
|
|
4
|
+
gap: 0;
|
|
5
|
+
|
|
6
|
+
&__requirements {
|
|
7
|
+
margin-bottom: 24px;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
&__requirements-title {
|
|
11
|
+
font-family: var(--font-family-sans, 'Geist', sans-serif);
|
|
12
|
+
font-size: 15px;
|
|
13
|
+
font-weight: 600;
|
|
14
|
+
line-height: 1.4;
|
|
15
|
+
color: var(--label-primary);
|
|
16
|
+
margin: 0 0 8px;
|
|
17
|
+
padding: 0;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
&__requirements-list {
|
|
21
|
+
list-style: none;
|
|
22
|
+
margin: 0;
|
|
23
|
+
padding: 0;
|
|
24
|
+
display: flex;
|
|
25
|
+
flex-direction: column;
|
|
26
|
+
gap: 6px;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
&__requirement-item {
|
|
30
|
+
display: flex;
|
|
31
|
+
align-items: center;
|
|
32
|
+
gap: 8px;
|
|
33
|
+
font-family: var(--font-family-sans, 'Geist', sans-serif);
|
|
34
|
+
font-size: 15px;
|
|
35
|
+
font-weight: 400;
|
|
36
|
+
line-height: 1.4;
|
|
37
|
+
color: var(--label-primary);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
&__requirement-icon {
|
|
41
|
+
width: 16px;
|
|
42
|
+
height: 16px;
|
|
43
|
+
flex-shrink: 0;
|
|
44
|
+
border-radius: 50%;
|
|
45
|
+
display: flex;
|
|
46
|
+
align-items: center;
|
|
47
|
+
justify-content: center;
|
|
48
|
+
|
|
49
|
+
&--met {
|
|
50
|
+
color: var(--label-status-success);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
&--unmet {
|
|
54
|
+
color: var(--label-status-error);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
&--neutral {
|
|
58
|
+
color: var(--label-tertiary);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
&__field {
|
|
63
|
+
margin-bottom: 16px;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
&__field--last {
|
|
67
|
+
margin-bottom: 24px;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
&__strength {
|
|
71
|
+
margin-top: 8px;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
&__strength-header {
|
|
75
|
+
display: flex;
|
|
76
|
+
justify-content: space-between;
|
|
77
|
+
margin-bottom: 4px;
|
|
78
|
+
font-family: var(--font-family-sans, 'Geist', sans-serif);
|
|
79
|
+
font-size: 12px;
|
|
80
|
+
color: var(--label-secondary);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
&__strength-bar-track {
|
|
84
|
+
height: 4px;
|
|
85
|
+
background-color: var(--surface-tertiary);
|
|
86
|
+
border-radius: 4px;
|
|
87
|
+
overflow: hidden;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
&__strength-bar-fill {
|
|
91
|
+
height: 100%;
|
|
92
|
+
border-radius: 4px;
|
|
93
|
+
transition: width 0.3s ease, background-color 0.3s ease;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
&__match {
|
|
97
|
+
display: flex;
|
|
98
|
+
align-items: center;
|
|
99
|
+
gap: 8px;
|
|
100
|
+
margin-top: 8px;
|
|
101
|
+
font-family: var(--font-family-sans, 'Geist', sans-serif);
|
|
102
|
+
font-size: 13px;
|
|
103
|
+
|
|
104
|
+
&--match {
|
|
105
|
+
color: var(--label-status-success);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
&--no-match {
|
|
109
|
+
color: var(--label-status-error);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
&__actions {
|
|
114
|
+
display: flex;
|
|
115
|
+
flex-direction: column;
|
|
116
|
+
gap: 12px;
|
|
117
|
+
align-items: flex-start;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
&__reset-link {
|
|
121
|
+
font-family: var(--font-family-sans, 'Geist', sans-serif);
|
|
122
|
+
font-size: 15px;
|
|
123
|
+
font-weight: 400;
|
|
124
|
+
color: var(--label-action);
|
|
125
|
+
text-decoration: underline;
|
|
126
|
+
background: none;
|
|
127
|
+
border: none;
|
|
128
|
+
padding: 0;
|
|
129
|
+
cursor: pointer;
|
|
130
|
+
|
|
131
|
+
&:hover {
|
|
132
|
+
opacity: 0.8;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
&__error {
|
|
137
|
+
display: flex;
|
|
138
|
+
align-items: center;
|
|
139
|
+
gap: 8px;
|
|
140
|
+
padding: 10px 12px;
|
|
141
|
+
border-radius: 8px;
|
|
142
|
+
background-color: var(--surface-status-error);
|
|
143
|
+
border: 1px solid var(--border-status-error);
|
|
144
|
+
font-family: var(--font-family-sans, 'Geist', sans-serif);
|
|
145
|
+
font-size: 13px;
|
|
146
|
+
color: var(--label-status-error);
|
|
147
|
+
margin-bottom: 16px;
|
|
148
|
+
}
|
|
149
|
+
}
|