@4alldigital/foundation-ui--core 3.12.1 → 3.13.0
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/package.json +5 -2
- package/src/components/AddressForm/AddressForm.tsx +16 -0
- package/src/components/AnimationSet1/AnimationSet1.tsx +1 -0
- package/src/components/Button/Button.types.ts +2 -1
- package/src/components/Header/Header.tsx +18 -2
- package/src/components/Link/Link.types.ts +1 -0
- package/src/components/Menu/Menu.tsx +18 -1
- package/src/components/ProductCard/ProductCard.tsx +1 -0
- package/src/components/Schedule/Schedule.stories.tsx +1 -3
- package/src/components/SubscriptionManager/SubscriptionManager.stories.tsx +0 -1
- package/src/context/Theme/index.tsx +1 -1
- package/src/features/Search/Search.tsx +1 -0
- package/src/features/Search/config/config-helper.ts +1 -0
- package/src/features/Search/views/Paging/Paging.tsx +1 -0
- package/src/features/Search/views/Paging/Paging.types.ts +1 -0
- package/src/features/Search/views/PagingInfo/PagingInfo.tsx +1 -0
- package/src/features/Search/views/PagingInfo/PagingInfo.types.ts +1 -0
- package/src/features/Search/views/Result/Result.tsx +1 -0
- package/src/features/Search/views/Result/Result.types.ts +1 -0
- package/src/features/Search/views/Results/Results.types.ts +1 -0
- package/src/features/Search/views/ResultsPerPage/ResultsPerPage.tsx +1 -0
- package/src/features/Search/views/ResultsPerPage/ResultsPerPage.types.ts +1 -0
- package/src/features/Search/views/SearchBox/SearchBox.tsx +1 -1
- package/src/features/Search/views/SearchBox/SearchBox.types.ts +1 -0
- package/src/features/Search/views/Sorting/Sorting.tsx +1 -0
- package/src/features/Search/views/Sorting/Sorting.types.ts +1 -0
- package/src/templates/ChallengeScreen/ChallengeScreen.stories.tsx +7 -0
- package/src/templates/ContentScreen/ContentScreen.stories.tsx +1 -1
- package/src/templates/DashboardScreen/DashboardScreen.stories.tsx +9 -9
- package/src/templates/FAQScreen/FAQScreen.stories.tsx +1 -1
- package/src/templates/PasswordResetScreen/PasswordResetScreen.stories.tsx +1 -1
- package/src/templates/ScheduleScreen/ScheduleScreen.stories.tsx +2 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@4alldigital/foundation-ui--core",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.13.0",
|
|
4
4
|
"description": "Foundation UI Core Component Library (source distribution)",
|
|
5
5
|
"main": "src/index.ts",
|
|
6
6
|
"types": "src/index.ts",
|
|
@@ -35,5 +35,8 @@
|
|
|
35
35
|
},
|
|
36
36
|
"author": "Joe Mewes",
|
|
37
37
|
"license": "MIT",
|
|
38
|
-
"
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/he": "^1.2.3"
|
|
40
|
+
},
|
|
41
|
+
"gitHead": "2394d061bf5fa814a00ffb74c334a001dbbc9bf4"
|
|
39
42
|
}
|
|
@@ -124,6 +124,8 @@ export const AddressForm = React.forwardRef<HTMLDivElement, AddressFormProps>(
|
|
|
124
124
|
{/* Full Name */}
|
|
125
125
|
<TextInput
|
|
126
126
|
id="shipping-name"
|
|
127
|
+
name="name"
|
|
128
|
+
autoComplete="shipping name"
|
|
127
129
|
placeholder="Full Name"
|
|
128
130
|
value={address.name || ''}
|
|
129
131
|
onChange={(e) => handleChange('name', e.target.value)}
|
|
@@ -136,6 +138,8 @@ export const AddressForm = React.forwardRef<HTMLDivElement, AddressFormProps>(
|
|
|
136
138
|
{/* Address Line 1 */}
|
|
137
139
|
<TextInput
|
|
138
140
|
id="shipping-line1"
|
|
141
|
+
name="address-line1"
|
|
142
|
+
autoComplete="shipping address-line1"
|
|
139
143
|
placeholder="Street Address"
|
|
140
144
|
value={address.line1 || ''}
|
|
141
145
|
onChange={(e) => handleChange('line1', e.target.value)}
|
|
@@ -148,6 +152,8 @@ export const AddressForm = React.forwardRef<HTMLDivElement, AddressFormProps>(
|
|
|
148
152
|
{/* Address Line 2 */}
|
|
149
153
|
<TextInput
|
|
150
154
|
id="shipping-line2"
|
|
155
|
+
name="address-line2"
|
|
156
|
+
autoComplete="shipping address-line2"
|
|
151
157
|
placeholder="Apartment, suite, etc. (optional)"
|
|
152
158
|
value={address.line2 || ''}
|
|
153
159
|
onChange={(e) => handleChange('line2', e.target.value)}
|
|
@@ -158,6 +164,8 @@ export const AddressForm = React.forwardRef<HTMLDivElement, AddressFormProps>(
|
|
|
158
164
|
<div className="grid gap-4 sm:grid-cols-2">
|
|
159
165
|
<TextInput
|
|
160
166
|
id="shipping-city"
|
|
167
|
+
name="address-level2"
|
|
168
|
+
autoComplete="shipping address-level2"
|
|
161
169
|
placeholder="City"
|
|
162
170
|
value={address.city || ''}
|
|
163
171
|
onChange={(e) => handleChange('city', e.target.value)}
|
|
@@ -169,6 +177,8 @@ export const AddressForm = React.forwardRef<HTMLDivElement, AddressFormProps>(
|
|
|
169
177
|
|
|
170
178
|
<TextInput
|
|
171
179
|
id="shipping-state"
|
|
180
|
+
name="address-level1"
|
|
181
|
+
autoComplete="shipping address-level1"
|
|
172
182
|
placeholder="State / County / Province"
|
|
173
183
|
value={address.state || ''}
|
|
174
184
|
onChange={(e) => handleChange('state', e.target.value)}
|
|
@@ -183,6 +193,8 @@ export const AddressForm = React.forwardRef<HTMLDivElement, AddressFormProps>(
|
|
|
183
193
|
<div className="grid gap-4 sm:grid-cols-2">
|
|
184
194
|
<TextInput
|
|
185
195
|
id="shipping-postal-code"
|
|
196
|
+
name="postal-code"
|
|
197
|
+
autoComplete="shipping postal-code"
|
|
186
198
|
placeholder="Postal / ZIP Code"
|
|
187
199
|
value={address.postal_code || ''}
|
|
188
200
|
onChange={(e) => handleChange('postal_code', e.target.value)}
|
|
@@ -194,6 +206,8 @@ export const AddressForm = React.forwardRef<HTMLDivElement, AddressFormProps>(
|
|
|
194
206
|
|
|
195
207
|
<FormSelect
|
|
196
208
|
id="shipping-country"
|
|
209
|
+
name="country"
|
|
210
|
+
autoComplete="shipping country"
|
|
197
211
|
placeholder="Country"
|
|
198
212
|
value={address.country || ''}
|
|
199
213
|
onChange={(e) => handleChange('country', e.target.value)}
|
|
@@ -208,7 +222,9 @@ export const AddressForm = React.forwardRef<HTMLDivElement, AddressFormProps>(
|
|
|
208
222
|
{/* Phone */}
|
|
209
223
|
<TextInput
|
|
210
224
|
id="shipping-phone"
|
|
225
|
+
name="phone"
|
|
211
226
|
type={InputType.TEL}
|
|
227
|
+
autoComplete="shipping tel"
|
|
212
228
|
placeholder="Phone Number (optional)"
|
|
213
229
|
value={address.phone || ''}
|
|
214
230
|
onChange={(e) => handleChange('phone', e.target.value)}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
1
2
|
import { type VariantProps } from 'class-variance-authority';
|
|
2
3
|
import { buttonVariants } from './Button';
|
|
3
4
|
import { MouseEventHandler, ReactNode } from 'react';
|
|
@@ -33,7 +34,7 @@ export enum BTN_SIZES {
|
|
|
33
34
|
// New CVA-based button props
|
|
34
35
|
export interface ButtonProps
|
|
35
36
|
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
|
|
36
|
-
VariantProps<typeof buttonVariants> {
|
|
37
|
+
Omit<VariantProps<typeof buttonVariants>, 'variant' | 'size'> {
|
|
37
38
|
// Radix UI Slot support
|
|
38
39
|
asChild?: boolean;
|
|
39
40
|
|
|
@@ -4,17 +4,16 @@ import { useCallback, useEffect, useState } from 'react';
|
|
|
4
4
|
import { clsx as cx } from 'clsx';
|
|
5
5
|
import { Props } from './Header.types';
|
|
6
6
|
import { useAppContext } from '../../context/App';
|
|
7
|
+
import { useThemeContext } from '../../context/Theme';
|
|
7
8
|
import Logo from '../Logo';
|
|
8
9
|
import Button from '../Button';
|
|
9
10
|
import Menu from '../Menu';
|
|
10
11
|
import { BTN_VARIANTS } from '../Button/Button.types';
|
|
11
|
-
// import Copy from '../Copy';
|
|
12
12
|
import Link from '../Link';
|
|
13
13
|
import { useLanguage } from '../../hooks';
|
|
14
14
|
import Container from '../Container';
|
|
15
15
|
import { twMerge } from 'tailwind-merge';
|
|
16
16
|
import Cart from '../Cart';
|
|
17
|
-
// import Avatar from '../Avatar';
|
|
18
17
|
|
|
19
18
|
const Header = ({
|
|
20
19
|
testID,
|
|
@@ -28,6 +27,7 @@ const Header = ({
|
|
|
28
27
|
}: Props) => {
|
|
29
28
|
const context = useAppContext();
|
|
30
29
|
const T = useLanguage();
|
|
30
|
+
const theme = useThemeContext();
|
|
31
31
|
|
|
32
32
|
const [mobileMenuClass, mobileMenuIcon] = useState('hidden');
|
|
33
33
|
const [showDropdown, setShowDropdown] = useState(false);
|
|
@@ -94,6 +94,13 @@ const Header = ({
|
|
|
94
94
|
</div>
|
|
95
95
|
{/* <!-- tablet/desktop --> */}
|
|
96
96
|
<div className="hidden md:flex items-center justify-center gap-2">
|
|
97
|
+
{theme?.toggleTheme && (
|
|
98
|
+
<Button
|
|
99
|
+
onClick={theme.toggleTheme}
|
|
100
|
+
icon={theme.isDarkTheme ? 'mdi:weather-sunny' : 'mdi:weather-night'}
|
|
101
|
+
ariaLabel={theme.isDarkTheme ? 'Switch to light mode' : 'Switch to dark mode'}
|
|
102
|
+
/>
|
|
103
|
+
)}
|
|
97
104
|
{!context?.app?.isAuthenticated && context?.app?.loginCallback && (
|
|
98
105
|
<div className="w-32 flex justify-end">
|
|
99
106
|
<Button rounded onClick={context?.app?.loginCallback}>{T.UI.LOGIN}</Button>
|
|
@@ -158,6 +165,15 @@ const Header = ({
|
|
|
158
165
|
<Menu links={context.header.profile} separators />
|
|
159
166
|
)}
|
|
160
167
|
</div>
|
|
168
|
+
{theme?.toggleTheme && (
|
|
169
|
+
<div className="md:hidden flex justify-center">
|
|
170
|
+
<Button
|
|
171
|
+
onClick={theme.toggleTheme}
|
|
172
|
+
icon={theme.isDarkTheme ? 'mdi:weather-sunny' : 'mdi:weather-night'}
|
|
173
|
+
ariaLabel={theme.isDarkTheme ? 'Switch to light mode' : 'Switch to dark mode'}
|
|
174
|
+
/>
|
|
175
|
+
</div>
|
|
176
|
+
)}
|
|
161
177
|
{context?.app?.isAuthenticated && (
|
|
162
178
|
<div className="md:hidden flex justify-center">
|
|
163
179
|
<Button rounded onClick={context?.app?.logoutCallback}>{T.UI.LOGOUT}</Button>
|
|
@@ -7,7 +7,20 @@ import Heading from '../Heading';
|
|
|
7
7
|
import { HEADING_TAGS } from '../Heading/Heading.types';
|
|
8
8
|
import { twMerge } from 'tailwind-merge';
|
|
9
9
|
|
|
10
|
+
function useCurrentPathname(): string | null {
|
|
11
|
+
try {
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
13
|
+
const { usePathname } = require('next/navigation');
|
|
14
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
15
|
+
return usePathname();
|
|
16
|
+
} catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
10
21
|
const Menu = ({ testID, title, links, inline = true, separators = false, className }: Props) => {
|
|
22
|
+
const pathname = useCurrentPathname();
|
|
23
|
+
|
|
11
24
|
return (
|
|
12
25
|
<div data-testid={testID || '"Menu"'} className={twMerge(cx('flex flex-col gap-2', className))}>
|
|
13
26
|
{title && (
|
|
@@ -18,13 +31,17 @@ const Menu = ({ testID, title, links, inline = true, separators = false, classNa
|
|
|
18
31
|
<div className={cx('flex gap-0 items-center md:items-start', { 'flex-col md:flex-row ': inline }, { 'flex-col ': !inline })}>
|
|
19
32
|
{links?.map((link, index) => {
|
|
20
33
|
const key = `${link.id}--${index}`;
|
|
34
|
+
const isActive = pathname ? pathname === link.url || (link.url !== '/' && pathname.startsWith(link.url)) : false;
|
|
21
35
|
return (
|
|
22
36
|
<div key={key} className='flex gap-0'>
|
|
23
37
|
<div className="relative py-2">
|
|
24
|
-
<Link href={link.url} className="flex gap-1 transition-opacity hover:opacity-70">
|
|
38
|
+
<Link href={link.url} className={cx("flex gap-1 transition-opacity hover:opacity-70", isActive && "opacity-100 font-bold")}>
|
|
25
39
|
{link.icon && <Icon name={link.icon} />}
|
|
26
40
|
{link.title && <div>{link.title}</div>}
|
|
27
41
|
</Link>
|
|
42
|
+
{isActive && (
|
|
43
|
+
<div className="absolute bottom-0 left-0 right-0 h-0.5 bg-current rounded-full" />
|
|
44
|
+
)}
|
|
28
45
|
</div>
|
|
29
46
|
{separators && index + 1 < links.length && (
|
|
30
47
|
<div className="h-full hidden md:flex self-center px-2">
|
|
@@ -70,11 +70,10 @@ const exampleData = [
|
|
|
70
70
|
},
|
|
71
71
|
];
|
|
72
72
|
|
|
73
|
-
const formattedSchedule = formatSchedule(exampleData as ESSchedule[])[0];
|
|
73
|
+
const formattedSchedule = formatSchedule(exampleData as unknown as ESSchedule[])[0];
|
|
74
74
|
|
|
75
75
|
export const Default: Story = {
|
|
76
76
|
args: {
|
|
77
|
-
raised: false,
|
|
78
77
|
scheduleItems: formattedSchedule,
|
|
79
78
|
},
|
|
80
79
|
render: args => {
|
|
@@ -84,7 +83,6 @@ export const Default: Story = {
|
|
|
84
83
|
|
|
85
84
|
export const HasAccess: Story = {
|
|
86
85
|
args: {
|
|
87
|
-
raised: false,
|
|
88
86
|
scheduleItems: formattedSchedule,
|
|
89
87
|
hasAccess: true,
|
|
90
88
|
},
|
|
@@ -50,7 +50,6 @@ export const Default: Story = {
|
|
|
50
50
|
pauseSubscriptionCallback: () => console.log('Pause Subscription'),
|
|
51
51
|
changeSubscriptionCallback: (id: string) => console.log('Change Subscription to: ', id),
|
|
52
52
|
updatePaymentMethodCallback: () => console.log('Update Payment Method'),
|
|
53
|
-
contactSupportCallback: () => console.log('Contact Support'),
|
|
54
53
|
selectedPlanCallback: (planId: string) => console.log('Selected Plan: ', planId),
|
|
55
54
|
isLoading: false,
|
|
56
55
|
},
|
|
@@ -17,7 +17,7 @@ function SearchBox({
|
|
|
17
17
|
resetTrigger = () => {},
|
|
18
18
|
}: Props) {
|
|
19
19
|
return (
|
|
20
|
-
<div className={cx('m-0
|
|
20
|
+
<div className={cx('m-0 w-full', className)}>
|
|
21
21
|
<form onSubmit={e => onSubmit(e)} className="flex items-center">
|
|
22
22
|
<div className="flex-1 bg-body-bg/80 dark:bg-body-bg-dark/80 rounded">
|
|
23
23
|
<TextInput
|
|
@@ -26,36 +26,43 @@ export const Default: Story = {
|
|
|
26
26
|
{
|
|
27
27
|
title: 'Day 1: Root Chakra',
|
|
28
28
|
image: 'https://d9r66csa6956h.cloudfront.net/styles/full_16_9/s3/2023-08/main-min.png?itok=g21nbiph',
|
|
29
|
+
video: '',
|
|
29
30
|
id: 'day-1',
|
|
30
31
|
},
|
|
31
32
|
{
|
|
32
33
|
title: 'Day 2: Sacral Chakra',
|
|
33
34
|
image: 'https://d9r66csa6956h.cloudfront.net/styles/full_16_9/s3/2023-08/main-min.png?itok=g21nbiph',
|
|
35
|
+
video: '',
|
|
34
36
|
id: 'day-2',
|
|
35
37
|
},
|
|
36
38
|
{
|
|
37
39
|
title: 'Day 3: Solar Plexus Chakra',
|
|
38
40
|
image: 'https://d9r66csa6956h.cloudfront.net/styles/full_16_9/s3/2023-08/main-min.png?itok=g21nbiph',
|
|
41
|
+
video: '',
|
|
39
42
|
id: 'day-3',
|
|
40
43
|
},
|
|
41
44
|
{
|
|
42
45
|
title: 'Day 4: Heart Chakra',
|
|
43
46
|
image: 'https://d9r66csa6956h.cloudfront.net/styles/full_16_9/s3/2023-08/main-min.png?itok=g21nbiph',
|
|
47
|
+
video: '',
|
|
44
48
|
id: 'day-4',
|
|
45
49
|
},
|
|
46
50
|
{
|
|
47
51
|
title: 'Day 5: Throat Chakra',
|
|
48
52
|
image: 'https://d9r66csa6956h.cloudfront.net/styles/full_16_9/s3/2023-08/main-min.png?itok=g21nbiph',
|
|
53
|
+
video: '',
|
|
49
54
|
id: 'day-5',
|
|
50
55
|
},
|
|
51
56
|
{
|
|
52
57
|
title: 'Day 6: Third Eye Chakra',
|
|
53
58
|
image: 'https://d9r66csa6956h.cloudfront.net/styles/full_16_9/s3/2023-08/main-min.png?itok=g21nbiph',
|
|
59
|
+
video: '',
|
|
54
60
|
id: 'day-6',
|
|
55
61
|
},
|
|
56
62
|
{
|
|
57
63
|
title: 'Day 7: Crown Chakra',
|
|
58
64
|
image: 'https://d9r66csa6956h.cloudfront.net/styles/full_16_9/s3/2023-08/main-min.png?itok=g21nbiph',
|
|
65
|
+
video: '',
|
|
59
66
|
id: 'day-7',
|
|
60
67
|
},
|
|
61
68
|
],
|
|
@@ -39,7 +39,7 @@ const ESPromos = [
|
|
|
39
39
|
sort: [1719844354],
|
|
40
40
|
},
|
|
41
41
|
];
|
|
42
|
-
const formattedPromos = formatPromos(ESPromos);
|
|
42
|
+
const formattedPromos = formatPromos(ESPromos as unknown as Parameters<typeof formatPromos>[0]);
|
|
43
43
|
|
|
44
44
|
const ESPromoNews = [
|
|
45
45
|
{
|
|
@@ -250,7 +250,7 @@ const ESPromoNews = [
|
|
|
250
250
|
},
|
|
251
251
|
];
|
|
252
252
|
|
|
253
|
-
const formattedPromoNews = formatPromos(ESPromoNews);
|
|
253
|
+
const formattedPromoNews = formatPromos(ESPromoNews as unknown as Parameters<typeof formatPromos>[0]);
|
|
254
254
|
|
|
255
255
|
export const Default: Story = {
|
|
256
256
|
parameters: {
|
|
@@ -437,9 +437,9 @@ export const Default: Story = {
|
|
|
437
437
|
},
|
|
438
438
|
],
|
|
439
439
|
promo: {
|
|
440
|
-
title: formattedPromos[0].title,
|
|
441
|
-
description: formattedPromos[0].description,
|
|
442
|
-
image: formattedPromos[0].image,
|
|
440
|
+
title: formattedPromos[0].title ?? '',
|
|
441
|
+
description: formattedPromos[0].description ?? '',
|
|
442
|
+
image: formattedPromos[0].image ?? '',
|
|
443
443
|
buttonData: {
|
|
444
444
|
variant: BTN_VARIANTS.PRIMARY,
|
|
445
445
|
size: BTN_SIZES.MEDIUM,
|
|
@@ -450,11 +450,11 @@ export const Default: Story = {
|
|
|
450
450
|
news: formattedPromoNews.map(promo => ({
|
|
451
451
|
variant: CardVariant.MEDIA,
|
|
452
452
|
data: {
|
|
453
|
-
id: promo.uuid,
|
|
454
|
-
title: promo.title,
|
|
455
|
-
description: promo.description,
|
|
453
|
+
id: promo.uuid ?? '',
|
|
454
|
+
title: promo.title ?? '',
|
|
455
|
+
description: promo.description ?? '',
|
|
456
456
|
image: {
|
|
457
|
-
src: promo.image,
|
|
457
|
+
src: promo.image ?? '',
|
|
458
458
|
alt: 'Placeholder image',
|
|
459
459
|
},
|
|
460
460
|
htmlDetails: true,
|
|
@@ -15,7 +15,7 @@ export const Default: Story = {
|
|
|
15
15
|
args: {
|
|
16
16
|
title: 'Password Reset',
|
|
17
17
|
image: 'https://picsum.photos/1600/900',
|
|
18
|
-
handleSubmitCallback: (data:
|
|
18
|
+
handleSubmitCallback: (data: Record<string, string>) => console.log(data),
|
|
19
19
|
},
|
|
20
20
|
};
|
|
21
21
|
|
|
@@ -54,7 +54,7 @@ const exampleData = [
|
|
|
54
54
|
},
|
|
55
55
|
];
|
|
56
56
|
|
|
57
|
-
const formattedSchedule = formatSchedule(exampleData)?.[0];
|
|
57
|
+
const formattedSchedule = formatSchedule(exampleData as unknown as Parameters<typeof formatSchedule>[0])?.[0];
|
|
58
58
|
|
|
59
59
|
// October 2025 example data for calendar view
|
|
60
60
|
const october2025Data = [
|
|
@@ -107,7 +107,7 @@ const october2025Data = [
|
|
|
107
107
|
},
|
|
108
108
|
];
|
|
109
109
|
|
|
110
|
-
const formattedOctober2025Schedule = formatSchedule(october2025Data)?.[0];
|
|
110
|
+
const formattedOctober2025Schedule = formatSchedule(october2025Data as unknown as Parameters<typeof formatSchedule>[0])?.[0];
|
|
111
111
|
|
|
112
112
|
export const Default: Story = {
|
|
113
113
|
parameters: {
|
|
@@ -118,7 +118,6 @@ export const Default: Story = {
|
|
|
118
118
|
title: 'Schedule',
|
|
119
119
|
image: 'https://picsum.photos/1600/900',
|
|
120
120
|
scheduleData: {
|
|
121
|
-
raised: false,
|
|
122
121
|
scheduleItems: formattedSchedule,
|
|
123
122
|
hasAccess: true,
|
|
124
123
|
},
|
|
@@ -134,7 +133,6 @@ export const AccessRestricted: Story = {
|
|
|
134
133
|
title: 'Schedule',
|
|
135
134
|
image: 'https://picsum.photos/1600/900',
|
|
136
135
|
scheduleData: {
|
|
137
|
-
raised: false,
|
|
138
136
|
scheduleItems: formattedSchedule,
|
|
139
137
|
hasAccess: false,
|
|
140
138
|
},
|