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.
@@ -5,12 +5,12 @@ interface VideoItem {
5
5
  id: number;
6
6
  attr: {
7
7
  playerType: 'Video' | 'Youtube' | 'Vimeo' | 'Dailymotion';
8
- controls?: boolean;
9
- loop?: boolean;
10
- alt?: string;
11
- url: string;
12
- autoplay?: boolean;
13
- muted?: boolean;
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
- height: 8px;
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::-webkit-scrollbar-thumb:hover {
469
- background: #a1a1a1;
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
- {showHeader && (
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
- backgroundColor: props.headerBackground,
494
- padding: '12px 16px',
495
- borderRadius: '0px',
496
- marginBottom: '4px',
497
- display: 'flex',
498
- alignItems: 'center',
499
- justifyContent: 'space-between',
500
- flexWrap: 'wrap',
501
- gap: '12px',
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
- <p style={{
505
- color: props.headerTextStyle.fontColor,
506
- fontSize: `${props.headerTextStyle.fontSize}px`,
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
- width: '32px',
521
- height: '32px',
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
- border: '1px solid #ddd',
524
- backgroundColor: '#fff',
587
+ width: '40px',
588
+ height: '40px',
525
589
  cursor: 'pointer',
526
590
  display: 'flex',
527
591
  alignItems: 'center',
528
592
  justifyContent: 'center',
529
- fontSize: '16px',
530
- fontWeight: 'bold'
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
- width: '32px',
541
- height: '32px',
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
- border: '1px solid #ddd',
544
- backgroundColor: '#fff',
619
+ width: '40px',
620
+ height: '40px',
545
621
  cursor: 'pointer',
546
622
  display: 'flex',
547
623
  alignItems: 'center',
548
624
  justifyContent: 'center',
549
- fontSize: '16px',
550
- fontWeight: 'bold'
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
- </div>
640
+ </>
558
641
  )}
559
- </div>
560
- )}
561
-
562
- <div
563
- style={{
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
- ) : null
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 ?? props.images?.all?.url ?? ''}`;
133
- const altText = props.images?.alt ?? props.images?.all?.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 && !props.images?.all?.url)) {
136
+ if (!props.images || (!props.images?.url)) {
137
137
  return (
138
138
  <div
139
139
  className="image-box"