tee3apps-cms-sdk-react 0.0.32 → 0.0.34
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/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/PageComponents/BoxComponent.tsx +4 -7
- package/src/PageComponents/Visual-Components/CarouselComponent.tsx +39 -31
- package/src/PageComponents/Visual-Components/GroupBrandComponent.tsx +176 -163
- package/src/PageComponents/Visual-Components/GroupCategoryComponent.tsx +235 -222
- package/src/PageComponents/Visual-Components/GroupImageList.tsx +216 -203
- package/src/PageComponents/Visual-Components/GroupProductComponent.tsx +100 -32
- package/src/PageComponents/Visual-Components/GroupVideoList.tsx +207 -215
- package/src/PageComponents/Visual-Components/ImageComponent.tsx +3 -3
- package/src/PageComponents/Visual-Components/Styles/ProductListViewOne.tsx +54 -33
- package/src/PageComponents/Visual-Components/Styles/ProductListViewTwo.tsx +57 -32
- package/src/PageComponents/Visual-Components/TextComponent.tsx +8 -6
|
@@ -5,12 +5,12 @@ interface VideoItem {
|
|
|
5
5
|
id: number;
|
|
6
6
|
attr: {
|
|
7
7
|
playerType: 'Video' | 'Youtube' | 'Vimeo' | 'Dailymotion';
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
controls?: boolean;
|
|
9
|
+
loop?: boolean;
|
|
10
|
+
alt?: string;
|
|
11
|
+
url: string;
|
|
12
|
+
autoplay?: boolean;
|
|
13
|
+
muted?: boolean;
|
|
14
14
|
};
|
|
15
15
|
title: string;
|
|
16
16
|
subTitle: string;
|
|
@@ -111,7 +111,7 @@ const extractYouTubeId = (url: string): string | null => {
|
|
|
111
111
|
return parsed.pathname.split('/embed/')[1] || null;
|
|
112
112
|
}
|
|
113
113
|
}
|
|
114
|
-
} catch {}
|
|
114
|
+
} catch { }
|
|
115
115
|
return null;
|
|
116
116
|
};
|
|
117
117
|
|
|
@@ -127,7 +127,7 @@ const extractVimeoId = (url: string): string | null => {
|
|
|
127
127
|
const parts = parsed.pathname.split('/').filter(Boolean);
|
|
128
128
|
return parts[1] || null;
|
|
129
129
|
}
|
|
130
|
-
} catch {}
|
|
130
|
+
} catch { }
|
|
131
131
|
return null;
|
|
132
132
|
};
|
|
133
133
|
|
|
@@ -141,7 +141,7 @@ const extractDailymotionId = (url: string): string | null => {
|
|
|
141
141
|
if (parsed.hostname.includes('dai.ly')) {
|
|
142
142
|
return parsed.pathname.replace('/', '') || null;
|
|
143
143
|
}
|
|
144
|
-
} catch {}
|
|
144
|
+
} catch { }
|
|
145
145
|
return null;
|
|
146
146
|
};
|
|
147
147
|
|
|
@@ -271,13 +271,13 @@ const GroupVideoList: React.FC<GroupVideoListMainProps> = ({ props, deviceMode =
|
|
|
271
271
|
const showHeader = getCurrentBooleanProp(props.showHeader);
|
|
272
272
|
const isHorizontalScroll = getCurrentBooleanProp(props.isHorizontalScroll);
|
|
273
273
|
const currentLayout = getCurrentLayout();
|
|
274
|
-
|
|
274
|
+
|
|
275
275
|
// Handle showTitle and showSubtitle - can be boolean or DeviceBooleanProps
|
|
276
|
-
const showTitle = typeof props.showTitle === 'boolean'
|
|
277
|
-
? props.showTitle
|
|
276
|
+
const showTitle = typeof props.showTitle === 'boolean'
|
|
277
|
+
? props.showTitle
|
|
278
278
|
: getCurrentBooleanProp(props.showTitle as DeviceBooleanProps | undefined);
|
|
279
|
-
const showSubtitle = typeof props.showSubtitle === 'boolean'
|
|
280
|
-
? props.showSubtitle
|
|
279
|
+
const showSubtitle = typeof props.showSubtitle === 'boolean'
|
|
280
|
+
? props.showSubtitle
|
|
281
281
|
: getCurrentBooleanProp(props.showSubtitle as DeviceBooleanProps | undefined);
|
|
282
282
|
|
|
283
283
|
const getVideos = (): VideoItem[] => {
|
|
@@ -297,7 +297,7 @@ const GroupVideoList: React.FC<GroupVideoListMainProps> = ({ props, deviceMode =
|
|
|
297
297
|
const subtitleHeight = showSubtitle ? 20 : 0;
|
|
298
298
|
const spacing = (showTitle ? 8 : 0) + (showSubtitle && showTitle ? 4 : (showSubtitle ? 8 : 0));
|
|
299
299
|
const cardPadding = large ? 32 : 24; // 16px top + 16px bottom or 12px top + 12px bottom
|
|
300
|
-
|
|
300
|
+
|
|
301
301
|
if (!boxHeight) {
|
|
302
302
|
// When no boxHeight, use a default video height
|
|
303
303
|
const defaultVideoHeight = 200;
|
|
@@ -311,18 +311,18 @@ const GroupVideoList: React.FC<GroupVideoListMainProps> = ({ props, deviceMode =
|
|
|
311
311
|
videoMarginBottom: showTitle || showSubtitle ? '8px' : '0px'
|
|
312
312
|
};
|
|
313
313
|
}
|
|
314
|
-
|
|
314
|
+
|
|
315
315
|
const totalHeight = parseInt(boxHeight);
|
|
316
316
|
const headerHeight = showHeader ? 60 : 0;
|
|
317
317
|
const containerPadding = 24; // 12px top + 12px bottom
|
|
318
|
-
|
|
318
|
+
|
|
319
319
|
// Calculate available height for video
|
|
320
320
|
const availableHeight = totalHeight - headerHeight - containerPadding - cardPadding - titleHeight - subtitleHeight - spacing;
|
|
321
321
|
const videoHeight = Math.max(availableHeight, 150);
|
|
322
|
-
|
|
322
|
+
|
|
323
323
|
// Card height should match the container height minus header and container padding
|
|
324
324
|
const cardHeight = totalHeight - headerHeight - containerPadding;
|
|
325
|
-
|
|
325
|
+
|
|
326
326
|
return {
|
|
327
327
|
cardHeight: `${cardHeight}px`,
|
|
328
328
|
videoHeight: `${videoHeight}px`,
|
|
@@ -351,7 +351,7 @@ const GroupVideoList: React.FC<GroupVideoListMainProps> = ({ props, deviceMode =
|
|
|
351
351
|
const VideoCard = ({ item, large = false }: { item: VideoItem; large?: boolean }) => {
|
|
352
352
|
const [isHovered, setIsHovered] = useState(false);
|
|
353
353
|
const dimensions = calculateCardDimensions(large);
|
|
354
|
-
|
|
354
|
+
|
|
355
355
|
return (
|
|
356
356
|
<div
|
|
357
357
|
className="videoCard"
|
|
@@ -375,9 +375,9 @@ const GroupVideoList: React.FC<GroupVideoListMainProps> = ({ props, deviceMode =
|
|
|
375
375
|
onMouseOver={() => setIsHovered(true)}
|
|
376
376
|
onMouseOut={() => setIsHovered(false)}
|
|
377
377
|
>
|
|
378
|
-
<div
|
|
379
|
-
style={{
|
|
380
|
-
width: '100%',
|
|
378
|
+
<div
|
|
379
|
+
style={{
|
|
380
|
+
width: '100%',
|
|
381
381
|
height: dimensions.videoHeight,
|
|
382
382
|
minHeight: dimensions.videoHeight,
|
|
383
383
|
maxHeight: dimensions.videoHeight,
|
|
@@ -402,14 +402,14 @@ const GroupVideoList: React.FC<GroupVideoListMainProps> = ({ props, deviceMode =
|
|
|
402
402
|
/>
|
|
403
403
|
</div>
|
|
404
404
|
{showTitle && (
|
|
405
|
-
<div style={{
|
|
406
|
-
textAlign: 'center',
|
|
407
|
-
fontSize: props.titleStyle ? `${props.titleStyle.fontSize}px` : (large ? '16px' : '14px'),
|
|
408
|
-
fontWeight: props.titleStyle?.isBold ? 'bold' : (large ? 600 : 500),
|
|
409
|
-
color: props.titleStyle?.fontColor || '#333',
|
|
405
|
+
<div style={{
|
|
406
|
+
textAlign: 'center',
|
|
407
|
+
fontSize: props.titleStyle ? `${props.titleStyle.fontSize}px` : (large ? '16px' : '14px'),
|
|
408
|
+
fontWeight: props.titleStyle?.isBold ? 'bold' : (large ? 600 : 500),
|
|
409
|
+
color: props.titleStyle?.fontColor || '#333',
|
|
410
410
|
fontStyle: props.titleStyle?.isItalic ? 'italic' : 'normal',
|
|
411
411
|
textDecoration: props.titleStyle?.isUnderline ? 'underline' : 'none',
|
|
412
|
-
lineHeight: '1.4',
|
|
412
|
+
lineHeight: '1.4',
|
|
413
413
|
height: dimensions.titleHeight,
|
|
414
414
|
minHeight: dimensions.titleHeight,
|
|
415
415
|
marginBottom: dimensions.titleMarginBottom,
|
|
@@ -425,11 +425,11 @@ const GroupVideoList: React.FC<GroupVideoListMainProps> = ({ props, deviceMode =
|
|
|
425
425
|
</div>
|
|
426
426
|
)}
|
|
427
427
|
{showSubtitle && (
|
|
428
|
-
<div style={{
|
|
429
|
-
textAlign: 'center',
|
|
430
|
-
fontSize: props.subtitleStyle ? `${props.subtitleStyle.fontSize}px` : (large ? '14px' : '12px'),
|
|
431
|
-
fontWeight: props.subtitleStyle?.isBold ? 'bold' : 400,
|
|
432
|
-
color: props.subtitleStyle?.fontColor || '#666',
|
|
428
|
+
<div style={{
|
|
429
|
+
textAlign: 'center',
|
|
430
|
+
fontSize: props.subtitleStyle ? `${props.subtitleStyle.fontSize}px` : (large ? '14px' : '12px'),
|
|
431
|
+
fontWeight: props.subtitleStyle?.isBold ? 'bold' : 400,
|
|
432
|
+
color: props.subtitleStyle?.fontColor || '#666',
|
|
433
433
|
fontStyle: props.subtitleStyle?.isItalic ? 'italic' : 'normal',
|
|
434
434
|
textDecoration: props.subtitleStyle?.isUnderline ? 'underline' : 'none',
|
|
435
435
|
lineHeight: '1.3',
|
|
@@ -454,19 +454,11 @@ const GroupVideoList: React.FC<GroupVideoListMainProps> = ({ props, deviceMode =
|
|
|
454
454
|
<>
|
|
455
455
|
<style>{`
|
|
456
456
|
.groupVideoCarousel::-webkit-scrollbar {
|
|
457
|
-
|
|
458
|
-
width: 8px;
|
|
459
|
-
}
|
|
460
|
-
.groupVideoCarousel::-webkit-scrollbar-track {
|
|
461
|
-
background: transparent;
|
|
462
|
-
border-radius: 4px;
|
|
463
|
-
}
|
|
464
|
-
.groupVideoCarousel::-webkit-scrollbar-thumb {
|
|
465
|
-
background: #c1c1c1;
|
|
466
|
-
border-radius: 4px;
|
|
457
|
+
display: none;
|
|
467
458
|
}
|
|
468
|
-
.groupVideoCarousel
|
|
469
|
-
|
|
459
|
+
.groupVideoCarousel {
|
|
460
|
+
scrollbar-width: none;
|
|
461
|
+
-ms-overflow-style: none;
|
|
470
462
|
}
|
|
471
463
|
`}</style>
|
|
472
464
|
<div
|
|
@@ -486,207 +478,207 @@ const GroupVideoList: React.FC<GroupVideoListMainProps> = ({ props, deviceMode =
|
|
|
486
478
|
}}
|
|
487
479
|
className='GroupVideoListComponent'
|
|
488
480
|
>
|
|
489
|
-
|
|
481
|
+
{showHeader && (
|
|
482
|
+
<div
|
|
483
|
+
className="groupVideoHeader"
|
|
484
|
+
style={{
|
|
485
|
+
backgroundColor: props.headerBackground,
|
|
486
|
+
padding: '12px 16px',
|
|
487
|
+
borderRadius: '0px',
|
|
488
|
+
marginBottom: '4px',
|
|
489
|
+
display: 'flex',
|
|
490
|
+
alignItems: 'center',
|
|
491
|
+
justifyContent: 'space-between',
|
|
492
|
+
flexWrap: 'wrap',
|
|
493
|
+
gap: '12px',
|
|
494
|
+
}}
|
|
495
|
+
>
|
|
496
|
+
<p style={{
|
|
497
|
+
color: props.headerTextStyle.fontColor,
|
|
498
|
+
fontSize: `${props.headerTextStyle.fontSize}px`,
|
|
499
|
+
fontWeight: props.headerTextStyle.isBold ? 'bold' : 'normal',
|
|
500
|
+
fontStyle: props.headerTextStyle.isItalic ? 'italic' : 'normal',
|
|
501
|
+
textDecoration: props.headerTextStyle.isUnderline ? 'underline' : 'none',
|
|
502
|
+
margin: 0
|
|
503
|
+
}}>
|
|
504
|
+
{props.headerText || 'Video List'}
|
|
505
|
+
</p>
|
|
506
|
+
|
|
507
|
+
{currentLayout === 'NONE' && isHorizontalScroll && videos.length > 1 && (
|
|
508
|
+
<div style={{ display: 'flex', gap: '8px' }}>
|
|
509
|
+
<button
|
|
510
|
+
onClick={scrollLeft}
|
|
511
|
+
style={{
|
|
512
|
+
width: '32px',
|
|
513
|
+
height: '32px',
|
|
514
|
+
borderRadius: '50%',
|
|
515
|
+
border: '1px solid #ddd',
|
|
516
|
+
backgroundColor: '#fff',
|
|
517
|
+
cursor: 'pointer',
|
|
518
|
+
display: 'flex',
|
|
519
|
+
alignItems: 'center',
|
|
520
|
+
justifyContent: 'center',
|
|
521
|
+
fontSize: '16px',
|
|
522
|
+
fontWeight: 'bold'
|
|
523
|
+
}}
|
|
524
|
+
onMouseOver={(e) => { e.currentTarget.style.backgroundColor = '#f8f9fa'; }}
|
|
525
|
+
onMouseOut={(e) => { e.currentTarget.style.backgroundColor = '#fff'; }}
|
|
526
|
+
>
|
|
527
|
+
‹
|
|
528
|
+
</button>
|
|
529
|
+
<button
|
|
530
|
+
onClick={scrollRight}
|
|
531
|
+
style={{
|
|
532
|
+
width: '32px',
|
|
533
|
+
height: '32px',
|
|
534
|
+
borderRadius: '50%',
|
|
535
|
+
border: '1px solid #ddd',
|
|
536
|
+
backgroundColor: '#fff',
|
|
537
|
+
cursor: 'pointer',
|
|
538
|
+
display: 'flex',
|
|
539
|
+
alignItems: 'center',
|
|
540
|
+
justifyContent: 'center',
|
|
541
|
+
fontSize: '16px',
|
|
542
|
+
fontWeight: 'bold'
|
|
543
|
+
}}
|
|
544
|
+
onMouseOver={(e) => { e.currentTarget.style.backgroundColor = '#f8f9fa'; }}
|
|
545
|
+
onMouseOut={(e) => { e.currentTarget.style.backgroundColor = '#fff'; }}
|
|
546
|
+
>
|
|
547
|
+
›
|
|
548
|
+
</button>
|
|
549
|
+
</div>
|
|
550
|
+
)}
|
|
551
|
+
</div>
|
|
552
|
+
)}
|
|
553
|
+
|
|
490
554
|
<div
|
|
491
|
-
className="groupVideoHeader"
|
|
492
555
|
style={{
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
556
|
+
display: currentLayout === 'NONE' ? 'flex' : 'block',
|
|
557
|
+
overflowX: currentLayout === 'NONE' ? (isHorizontalScroll ? 'auto' : 'hidden') : 'visible',
|
|
558
|
+
overflowY: currentLayout === 'NONE' ? 'hidden' : (boxHeight ? 'auto' : 'visible'),
|
|
559
|
+
gap: currentLayout === 'NONE' ? '12px' : '0',
|
|
560
|
+
padding: '12px',
|
|
561
|
+
scrollBehavior: 'smooth',
|
|
562
|
+
backgroundColor: props.carouselBackground || '#fff',
|
|
563
|
+
scrollbarWidth: 'thin',
|
|
564
|
+
borderRadius: '8px',
|
|
565
|
+
position: 'relative',
|
|
566
|
+
scrollbarColor: '#c1c1c1 transparent',
|
|
567
|
+
flex: 1,
|
|
568
|
+
minHeight: 0,
|
|
569
|
+
height: boxHeight ? `calc(${boxHeight} - ${showHeader ? '60px' : '0px'})` : 'auto'
|
|
502
570
|
}}
|
|
571
|
+
className="groupVideoCarousel"
|
|
503
572
|
>
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
fontWeight: props.headerTextStyle.isBold ? 'bold' : 'normal',
|
|
508
|
-
fontStyle: props.headerTextStyle.isItalic ? 'italic' : 'normal',
|
|
509
|
-
textDecoration: props.headerTextStyle.isUnderline ? 'underline' : 'none',
|
|
510
|
-
margin: 0
|
|
511
|
-
}}>
|
|
512
|
-
{props.headerText || 'Video List'}
|
|
513
|
-
</p>
|
|
514
|
-
|
|
515
|
-
{currentLayout === 'NONE' && isHorizontalScroll && videos.length > 1 && (
|
|
516
|
-
<div style={{ display: 'flex', gap: '8px' }}>
|
|
573
|
+
{/* Navigation buttons - positioned like carousel */}
|
|
574
|
+
{!showHeader && currentLayout === 'NONE' && isHorizontalScroll && videos.length > 1 && (
|
|
575
|
+
<>
|
|
517
576
|
<button
|
|
518
577
|
onClick={scrollLeft}
|
|
519
578
|
style={{
|
|
520
|
-
|
|
521
|
-
|
|
579
|
+
position: 'absolute',
|
|
580
|
+
left: '10px',
|
|
581
|
+
top: '50%',
|
|
582
|
+
transform: 'translateY(-50%)',
|
|
583
|
+
background: 'rgba(0,0,0,0.5)',
|
|
584
|
+
color: 'white',
|
|
585
|
+
border: 'none',
|
|
522
586
|
borderRadius: '50%',
|
|
523
|
-
|
|
524
|
-
|
|
587
|
+
width: '40px',
|
|
588
|
+
height: '40px',
|
|
525
589
|
cursor: 'pointer',
|
|
526
590
|
display: 'flex',
|
|
527
591
|
alignItems: 'center',
|
|
528
592
|
justifyContent: 'center',
|
|
529
|
-
fontSize: '
|
|
530
|
-
|
|
593
|
+
fontSize: '18px',
|
|
594
|
+
zIndex: 10,
|
|
595
|
+
transition: 'all 0.2s ease'
|
|
596
|
+
}}
|
|
597
|
+
onMouseOver={(e) => {
|
|
598
|
+
e.currentTarget.style.background = 'rgba(0,0,0,0.7)';
|
|
599
|
+
e.currentTarget.style.transform = 'translateY(-50%) scale(1.1)';
|
|
600
|
+
}}
|
|
601
|
+
onMouseOut={(e) => {
|
|
602
|
+
e.currentTarget.style.background = 'rgba(0,0,0,0.5)';
|
|
603
|
+
e.currentTarget.style.transform = 'translateY(-50%) scale(1)';
|
|
531
604
|
}}
|
|
532
|
-
onMouseOver={(e) => { e.currentTarget.style.backgroundColor = '#f8f9fa'; }}
|
|
533
|
-
onMouseOut={(e) => { e.currentTarget.style.backgroundColor = '#fff'; }}
|
|
534
605
|
>
|
|
535
606
|
‹
|
|
536
607
|
</button>
|
|
537
608
|
<button
|
|
538
609
|
onClick={scrollRight}
|
|
539
610
|
style={{
|
|
540
|
-
|
|
541
|
-
|
|
611
|
+
position: 'absolute',
|
|
612
|
+
right: '10px',
|
|
613
|
+
top: '50%',
|
|
614
|
+
transform: 'translateY(-50%)',
|
|
615
|
+
background: 'rgba(0,0,0,0.5)',
|
|
616
|
+
color: 'white',
|
|
617
|
+
border: 'none',
|
|
542
618
|
borderRadius: '50%',
|
|
543
|
-
|
|
544
|
-
|
|
619
|
+
width: '40px',
|
|
620
|
+
height: '40px',
|
|
545
621
|
cursor: 'pointer',
|
|
546
622
|
display: 'flex',
|
|
547
623
|
alignItems: 'center',
|
|
548
624
|
justifyContent: 'center',
|
|
549
|
-
fontSize: '
|
|
550
|
-
|
|
625
|
+
fontSize: '18px',
|
|
626
|
+
zIndex: 10,
|
|
627
|
+
transition: 'all 0.2s ease'
|
|
628
|
+
}}
|
|
629
|
+
onMouseOver={(e) => {
|
|
630
|
+
e.currentTarget.style.background = 'rgba(0,0,0,0.7)';
|
|
631
|
+
e.currentTarget.style.transform = 'translateY(-50%) scale(1.1)';
|
|
632
|
+
}}
|
|
633
|
+
onMouseOut={(e) => {
|
|
634
|
+
e.currentTarget.style.background = 'rgba(0,0,0,0.5)';
|
|
635
|
+
e.currentTarget.style.transform = 'translateY(-50%) scale(1)';
|
|
551
636
|
}}
|
|
552
|
-
onMouseOver={(e) => { e.currentTarget.style.backgroundColor = '#f8f9fa'; }}
|
|
553
|
-
onMouseOut={(e) => { e.currentTarget.style.backgroundColor = '#fff'; }}
|
|
554
637
|
>
|
|
555
638
|
›
|
|
556
639
|
</button>
|
|
557
|
-
|
|
640
|
+
</>
|
|
558
641
|
)}
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
display: currentLayout === 'NONE' ? 'flex' : 'block',
|
|
565
|
-
overflowX: currentLayout === 'NONE' ? (isHorizontalScroll ? 'auto' : 'hidden') : 'visible',
|
|
566
|
-
overflowY: currentLayout === 'NONE' ? 'hidden' : (boxHeight ? 'auto' : 'visible'),
|
|
567
|
-
gap: currentLayout === 'NONE' ? '12px' : '0',
|
|
568
|
-
padding: '12px',
|
|
569
|
-
scrollBehavior: 'smooth',
|
|
570
|
-
backgroundColor: props.carouselBackground || '#fff',
|
|
571
|
-
scrollbarWidth: 'thin',
|
|
572
|
-
borderRadius: '8px',
|
|
573
|
-
position: 'relative',
|
|
574
|
-
scrollbarColor: '#c1c1c1 transparent',
|
|
575
|
-
flex: 1,
|
|
576
|
-
minHeight: 0,
|
|
577
|
-
height: boxHeight ? `calc(${boxHeight} - ${showHeader ? '60px' : '0px'})` : 'auto'
|
|
578
|
-
}}
|
|
579
|
-
className="groupVideoCarousel"
|
|
580
|
-
>
|
|
581
|
-
{/* Navigation buttons - positioned like carousel */}
|
|
582
|
-
{!showHeader && currentLayout === 'NONE' && isHorizontalScroll && videos.length > 1 && (
|
|
583
|
-
<>
|
|
584
|
-
<button
|
|
585
|
-
onClick={scrollLeft}
|
|
586
|
-
style={{
|
|
587
|
-
position: 'absolute',
|
|
588
|
-
left: '10px',
|
|
589
|
-
top: '50%',
|
|
590
|
-
transform: 'translateY(-50%)',
|
|
591
|
-
background: 'rgba(0,0,0,0.5)',
|
|
592
|
-
color: 'white',
|
|
593
|
-
border: 'none',
|
|
594
|
-
borderRadius: '50%',
|
|
595
|
-
width: '40px',
|
|
596
|
-
height: '40px',
|
|
597
|
-
cursor: 'pointer',
|
|
598
|
-
display: 'flex',
|
|
599
|
-
alignItems: 'center',
|
|
600
|
-
justifyContent: 'center',
|
|
601
|
-
fontSize: '18px',
|
|
602
|
-
zIndex: 10,
|
|
603
|
-
transition: 'all 0.2s ease'
|
|
604
|
-
}}
|
|
605
|
-
onMouseOver={(e) => {
|
|
606
|
-
e.currentTarget.style.background = 'rgba(0,0,0,0.7)';
|
|
607
|
-
e.currentTarget.style.transform = 'translateY(-50%) scale(1.1)';
|
|
608
|
-
}}
|
|
609
|
-
onMouseOut={(e) => {
|
|
610
|
-
e.currentTarget.style.background = 'rgba(0,0,0,0.5)';
|
|
611
|
-
e.currentTarget.style.transform = 'translateY(-50%) scale(1)';
|
|
612
|
-
}}
|
|
613
|
-
>
|
|
614
|
-
‹
|
|
615
|
-
</button>
|
|
616
|
-
<button
|
|
617
|
-
onClick={scrollRight}
|
|
618
|
-
style={{
|
|
619
|
-
position: 'absolute',
|
|
620
|
-
right: '10px',
|
|
621
|
-
top: '50%',
|
|
622
|
-
transform: 'translateY(-50%)',
|
|
623
|
-
background: 'rgba(0,0,0,0.5)',
|
|
624
|
-
color: 'white',
|
|
625
|
-
border: 'none',
|
|
626
|
-
borderRadius: '50%',
|
|
627
|
-
width: '40px',
|
|
628
|
-
height: '40px',
|
|
629
|
-
cursor: 'pointer',
|
|
630
|
-
display: 'flex',
|
|
631
|
-
alignItems: 'center',
|
|
632
|
-
justifyContent: 'center',
|
|
633
|
-
fontSize: '18px',
|
|
634
|
-
zIndex: 10,
|
|
635
|
-
transition: 'all 0.2s ease'
|
|
636
|
-
}}
|
|
637
|
-
onMouseOver={(e) => {
|
|
638
|
-
e.currentTarget.style.background = 'rgba(0,0,0,0.7)';
|
|
639
|
-
e.currentTarget.style.transform = 'translateY(-50%) scale(1.1)';
|
|
640
|
-
}}
|
|
641
|
-
onMouseOut={(e) => {
|
|
642
|
-
e.currentTarget.style.background = 'rgba(0,0,0,0.5)';
|
|
643
|
-
e.currentTarget.style.transform = 'translateY(-50%) scale(1)';
|
|
644
|
-
}}
|
|
645
|
-
>
|
|
646
|
-
›
|
|
647
|
-
</button>
|
|
648
|
-
</>
|
|
649
|
-
)}
|
|
650
|
-
{videos.length > 0 ? (
|
|
651
|
-
currentLayout === 'NONE' ? (
|
|
652
|
-
videos.map((video) => (
|
|
653
|
-
<div key={video.id} style={{ minWidth: '280px', width: '280px', height: '100%', display: 'flex', alignItems: 'stretch' }}>
|
|
654
|
-
<VideoCard item={video} />
|
|
655
|
-
</div>
|
|
656
|
-
))
|
|
657
|
-
) : currentLayout === 'SMALL' ? (
|
|
658
|
-
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(2, 1fr)', gap: '16px', padding: '8px' }}>
|
|
659
|
-
{videos.map((video) => (
|
|
660
|
-
<VideoCard key={video.id} item={video} />
|
|
661
|
-
))}
|
|
662
|
-
</div>
|
|
663
|
-
) : currentLayout === 'MEDIUM' ? (
|
|
664
|
-
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: '16px', padding: '8px' }}>
|
|
665
|
-
{videos.map((video) => (
|
|
666
|
-
<VideoCard key={video.id} item={video} />
|
|
667
|
-
))}
|
|
668
|
-
</div>
|
|
669
|
-
) : currentLayout === 'MEDIUM_THREE' ? (
|
|
670
|
-
<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', padding: '8px' }}>
|
|
671
|
-
{videos.length > 0 && (
|
|
672
|
-
<VideoCard item={videos[0]} large />
|
|
673
|
-
)}
|
|
674
|
-
{videos.length > 1 && (
|
|
675
|
-
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(2, 1fr)', gap: '16px' }}>
|
|
676
|
-
{videos.slice(1).map((video) => (
|
|
677
|
-
<VideoCard key={video.id} item={video} />
|
|
678
|
-
))}
|
|
642
|
+
{videos.length > 0 ? (
|
|
643
|
+
currentLayout === 'NONE' ? (
|
|
644
|
+
videos.map((video) => (
|
|
645
|
+
<div key={video.id} style={{ minWidth: '280px', width: '280px', height: '100%', display: 'flex', alignItems: 'stretch' }}>
|
|
646
|
+
<VideoCard item={video} />
|
|
679
647
|
</div>
|
|
680
|
-
)
|
|
648
|
+
))
|
|
649
|
+
) : currentLayout === 'SMALL' ? (
|
|
650
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(2, 1fr)', gap: '16px', padding: '8px' }}>
|
|
651
|
+
{videos.map((video) => (
|
|
652
|
+
<VideoCard key={video.id} item={video} />
|
|
653
|
+
))}
|
|
654
|
+
</div>
|
|
655
|
+
) : currentLayout === 'MEDIUM' ? (
|
|
656
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: '16px', padding: '8px' }}>
|
|
657
|
+
{videos.map((video) => (
|
|
658
|
+
<VideoCard key={video.id} item={video} />
|
|
659
|
+
))}
|
|
660
|
+
</div>
|
|
661
|
+
) : currentLayout === 'MEDIUM_THREE' ? (
|
|
662
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', padding: '8px' }}>
|
|
663
|
+
{videos.length > 0 && (
|
|
664
|
+
<VideoCard item={videos[0]} large />
|
|
665
|
+
)}
|
|
666
|
+
{videos.length > 1 && (
|
|
667
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(2, 1fr)', gap: '16px' }}>
|
|
668
|
+
{videos.slice(1).map((video) => (
|
|
669
|
+
<VideoCard key={video.id} item={video} />
|
|
670
|
+
))}
|
|
671
|
+
</div>
|
|
672
|
+
)}
|
|
673
|
+
</div>
|
|
674
|
+
) : null
|
|
675
|
+
) : (
|
|
676
|
+
<div style={{ textAlign: 'center', color: '#666', padding: '40px', width: '100%', border: '2px dashed #ddd', borderRadius: '8px', backgroundColor: '#f9f9f9' }}>
|
|
677
|
+
<p>No videos available.</p>
|
|
681
678
|
</div>
|
|
682
|
-
)
|
|
683
|
-
|
|
684
|
-
<div style={{ textAlign: 'center', color: '#666', padding: '40px', width: '100%', border: '2px dashed #ddd', borderRadius: '8px', backgroundColor: '#f9f9f9' }}>
|
|
685
|
-
<p>No videos available.</p>
|
|
686
|
-
</div>
|
|
687
|
-
)}
|
|
679
|
+
)}
|
|
680
|
+
</div>
|
|
688
681
|
</div>
|
|
689
|
-
</div>
|
|
690
682
|
</>
|
|
691
683
|
);
|
|
692
684
|
};
|
|
@@ -129,11 +129,11 @@ const ImageComponent: React.FC<ImageComponentMainProps> = ({
|
|
|
129
129
|
const link = bannerLink(props);
|
|
130
130
|
|
|
131
131
|
// Use nullish coalescing to safely access image properties
|
|
132
|
-
const imageUrl = `${Linodeurl}${props.images?.url
|
|
133
|
-
const altText = props.images?.alt ??
|
|
132
|
+
const imageUrl = `${Linodeurl}${props.images?.url}`;
|
|
133
|
+
const altText = props.images?.alt ?? '';
|
|
134
134
|
|
|
135
135
|
// Don't render if no image URL is available
|
|
136
|
-
if (!props.images || (!props.images?.url
|
|
136
|
+
if (!props.images || (!props.images?.url)) {
|
|
137
137
|
return (
|
|
138
138
|
<div
|
|
139
139
|
className="image-box"
|