@royaloperahouse/harmonic 0.1.8-k → 0.1.8-l

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.
@@ -7314,6 +7314,8 @@ var GRID_VALUES = {
7314
7314
  desktop: {
7315
7315
  gapsNumber: 13,
7316
7316
  columnsNumber: 13,
7317
+ gapsNumberOffset: 15,
7318
+ columnsNumberOffset: 14,
7317
7319
  largeCard: {
7318
7320
  gapsPerSlide: 4,
7319
7321
  columnsPerSlide: 5
@@ -7341,16 +7343,20 @@ var calculateSlideGapsSpace = function calculateSlideGapsSpace(gapsPerSlide) {
7341
7343
  return "calc(" + GRID_COLUMN_GAP + " * " + gapsPerSlide + ")";
7342
7344
  };
7343
7345
  // Slide styles
7344
- var getCardSlideDesktopStyles = function getCardSlideDesktopStyles(type) {
7346
+ var getCardSlideDesktopStyles = function getCardSlideDesktopStyles(type, isActive) {
7345
7347
  var _GRID_VALUES$desktop = GRID_VALUES.desktop,
7346
7348
  gapsNumber = _GRID_VALUES$desktop.gapsNumber,
7347
- columnsNumber = _GRID_VALUES$desktop.columnsNumber;
7349
+ columnsNumber = _GRID_VALUES$desktop.columnsNumber,
7350
+ columnsNumberOffset = _GRID_VALUES$desktop.columnsNumberOffset,
7351
+ gapsNumberOffset = _GRID_VALUES$desktop.gapsNumberOffset;
7348
7352
  var _ref = type === CarouselType.LargeCard ? GRID_VALUES.desktop.largeCard : GRID_VALUES.desktop.smallCard,
7349
7353
  gapsPerSlide = _ref.gapsPerSlide,
7350
7354
  columnsPerSlide = _ref.columnsPerSlide;
7351
- var gapsSpaceInMainGrid = calculateGapsSpaceInMainGrid(gapsNumber);
7355
+ var columns = isActive ? columnsNumberOffset : columnsNumber;
7356
+ var gaps = isActive ? gapsNumberOffset : gapsNumber;
7357
+ var gapsSpaceInMainGrid = calculateGapsSpaceInMainGrid(gaps);
7352
7358
  var slideGapsSpace = calculateSlideGapsSpace(gapsPerSlide);
7353
- return "\n width: calc( (" + columnsPerSlide + " * (100% - " + gapsSpaceInMainGrid + ") / " + columnsNumber + ") + " + slideGapsSpace + " );\n margin-right: " + GRID_COLUMN_GAP + ";\n ";
7359
+ return "\n width: calc( (" + columnsPerSlide + " * (100% - " + gapsSpaceInMainGrid + ") / " + columns + ") + " + slideGapsSpace + " );\n margin-right: " + GRID_COLUMN_GAP + ";\n ";
7354
7360
  };
7355
7361
  var getCardSlideMobileStyles = function getCardSlideMobileStyles() {
7356
7362
  var _GRID_VALUES$mobile = GRID_VALUES.mobile,
@@ -7374,8 +7380,9 @@ var ImageCarouselWrapper = /*#__PURE__*/styled.div(_templateObject$N || (_templa
7374
7380
  return "&&& {\n .swipe-slide > figure {\n " + getImageSlideStyles(imagesHeightDevice) + "\n }\n }";
7375
7381
  });
7376
7382
  var CardsCarouselWrapper = /*#__PURE__*/styled.div(_templateObject2$A || (_templateObject2$A = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n ", "\n\n @media ", " {\n && {\n .swipe-slide {\n ", "\n }\n }\n}}"])), function (_ref3) {
7377
- var type = _ref3.type;
7378
- return "\n & {\n .swipe-slide {\n " + getCardSlideDesktopStyles(type) + "\n }\n }\n ";
7383
+ var type = _ref3.type,
7384
+ isActive = _ref3.isActive;
7385
+ return "\n & {\n .swipe-slide {\n " + getCardSlideDesktopStyles(type, isActive) + "\n }\n }\n ";
7379
7386
  }, devices.mobile, /*#__PURE__*/getCardSlideMobileStyles());
7380
7387
  var TitleButtonsGrid = /*#__PURE__*/styled(Grid)(_templateObject3$o || (_templateObject3$o = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n margin-bottom: 28px;\n\n @media ", " {\n padding-bottom: 0;\n }\n\n @media ", " {\n margin-bottom: 20px;\n }\n"])), devices.mobile, devices.mobile);
7381
7388
  var CarouselInfoWrapper = /*#__PURE__*/styled.div(_templateObject4$j || (_templateObject4$j = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n user-select: text;\n"])));
@@ -7393,10 +7400,12 @@ var SwipeGridWrapper = /*#__PURE__*/styled(GridItem)(_templateObject8$5 || (_tem
7393
7400
  var _templateObject$O, _templateObject2$B;
7394
7401
  var SWIPE_SLIDE_CLASS_NAME = 'swipe-slide';
7395
7402
  var SwipeContainer = /*#__PURE__*/styled.div(_templateObject$O || (_templateObject$O = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n position: relative;\n overflow: hidden;\n width: 100%;\n touch-action: pan-y;\n"])));
7396
- var SwipeTrack = /*#__PURE__*/styled.div(_templateObject2$B || (_templateObject2$B = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n display: flex;\n transition: ", ";\n transform: translateX(", "px);\n\n .", " {\n flex-shrink: 0;\n }\n"])), function (props) {
7397
- return props.transitioning ? 'transform 0.3s ease-in-out' : 'none';
7398
- }, function (props) {
7399
- return props.translateX;
7403
+ var SwipeTrack = /*#__PURE__*/styled.div(_templateObject2$B || (_templateObject2$B = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n display: flex;\n transition: ", ";\n transform: translateX(", ");\n\n .", " {\n flex-shrink: 0;\n }\n"])), function (_ref) {
7404
+ var transitioning = _ref.transitioning;
7405
+ return transitioning ? 'transform 0.3s ease' : 'none';
7406
+ }, function (_ref2) {
7407
+ var translateX = _ref2.translateX;
7408
+ return translateX + "px";
7400
7409
  }, SWIPE_SLIDE_CLASS_NAME);
7401
7410
 
7402
7411
  /**
@@ -7424,9 +7433,26 @@ var getVisibleIndexes = function getVisibleIndexes(currentIndex, slideWidths, co
7424
7433
  }
7425
7434
  return visible;
7426
7435
  };
7436
+ var getMovedSlides = function getMovedSlides(delta, slideWidths) {
7437
+ var absDelta = Math.abs(delta);
7438
+ var movedSlides = 0;
7439
+ var accumulated = 0;
7440
+ for (var i = 0; i < slideWidths.length; i++) {
7441
+ accumulated += slideWidths[i];
7442
+ // Allow partial slide (e.g. 50% of next slide) to count
7443
+ var partialThreshold = slideWidths[i] * 0.5;
7444
+ if (absDelta > accumulated - partialThreshold) {
7445
+ movedSlides++;
7446
+ } else {
7447
+ break;
7448
+ }
7449
+ }
7450
+ return movedSlides;
7451
+ };
7427
7452
 
7428
- var _excluded$h = ["children", "infinite", "onIndexChange", "slidesOffsetBefore"];
7453
+ var _excluded$h = ["children", "infinite", "onIndexChange", "slidesOffsetBefore", "onActiveChange"];
7429
7454
  var MAX_CLONES_NUMBER = 6;
7455
+ var CLICK_DRAG_THRESHOLD = 20;
7430
7456
  var getClonesCount = function getClonesCount(infinite, childrenLength) {
7431
7457
  if (!infinite) return 0;
7432
7458
  if (childrenLength > MAX_CLONES_NUMBER) return MAX_CLONES_NUMBER;
@@ -7446,13 +7472,29 @@ var Swipe = /*#__PURE__*/forwardRef(function (_ref, ref) {
7446
7472
  onIndexChange = _ref.onIndexChange,
7447
7473
  _ref$slidesOffsetBefo = _ref.slidesOffsetBefore,
7448
7474
  slidesOffsetBefore = _ref$slidesOffsetBefo === void 0 ? 0 : _ref$slidesOffsetBefo,
7475
+ onActiveChange = _ref.onActiveChange,
7449
7476
  props = _objectWithoutPropertiesLoose(_ref, _excluded$h);
7450
7477
  var containerRef = useRef(null);
7451
7478
  var childRefs = useRef([]);
7452
7479
  var startX = useRef(0);
7453
7480
  var currentTranslate = useRef(0);
7454
7481
  var isDragging = useRef(false);
7482
+ var isMouseDown = useRef(false);
7483
+ var isActive = useRef(false);
7484
+ var isClickPrevented = useRef(false);
7455
7485
  var uniqueIdRef = useRef(generateDomElementId());
7486
+ var _useState = useState(null),
7487
+ dragTranslateX = _useState[0],
7488
+ setDragTranslateX = _useState[1];
7489
+ var _useState2 = useState(false),
7490
+ transitioning = _useState2[0],
7491
+ setTransitioning = _useState2[1];
7492
+ var _useState3 = useState([]),
7493
+ slideWidths = _useState3[0],
7494
+ setSlideWidths = _useState3[1];
7495
+ var _useState4 = useState(0),
7496
+ containerWidth = _useState4[0],
7497
+ setContainerWidth = _useState4[1];
7456
7498
  var _useMemo = useMemo(function () {
7457
7499
  var count = getClonesCount(infinite, children.length);
7458
7500
  var leftClones = infinite ? children.slice(-count) : [];
@@ -7465,65 +7507,74 @@ var Swipe = /*#__PURE__*/forwardRef(function (_ref, ref) {
7465
7507
  }, [children, infinite]),
7466
7508
  slides = _useMemo.slides,
7467
7509
  clonesCount = _useMemo.clonesCount;
7468
- // Set the initial index to clonesCount (so the first real slide is shown)
7469
- var _useState = useState(infinite ? clonesCount : 0),
7470
- currentIndex = _useState[0],
7471
- setCurrentIndex = _useState[1];
7472
- var _useState2 = useState(false),
7473
- transitioning = _useState2[0],
7474
- setTransitioning = _useState2[1];
7475
- var _useState3 = useState([]),
7476
- slideWidths = _useState3[0],
7477
- setSlideWidths = _useState3[1];
7478
- var _useState4 = useState(0),
7479
- containerWidth = _useState4[0],
7480
- setContainerWidth = _useState4[1];
7510
+ var _useState5 = useState(infinite ? clonesCount : 0),
7511
+ currentIndex = _useState5[0],
7512
+ setCurrentIndex = _useState5[1];
7481
7513
  useEffect(function () {
7482
7514
  if (!onIndexChange) return;
7483
7515
  if (!infinite) {
7484
7516
  onIndexChange(currentIndex);
7485
- return;
7517
+ } else {
7518
+ var offset = currentIndex - clonesCount + children.length;
7519
+ var realIndex = offset % children.length;
7520
+ onIndexChange(realIndex);
7486
7521
  }
7487
- var offset = currentIndex - clonesCount + children.length;
7488
- var realIndex = offset % children.length;
7489
- onIndexChange(realIndex);
7490
- }, [currentIndex, onIndexChange, infinite, children.length]);
7491
- // Update dimensions
7522
+ }, [currentIndex, onIndexChange, infinite, children.length, clonesCount]);
7492
7523
  var updateDimensions = useCallback(function () {
7493
7524
  if (containerRef.current) setContainerWidth(containerRef.current.offsetWidth);
7494
7525
  if (childRefs.current.length) setSlideWidths(childRefs.current.map(getSlidedWidth));
7495
7526
  }, []);
7496
7527
  useEffect(function () {
7497
- var animationFrameRequestId = requestAnimationFrame(function () {
7498
- updateDimensions();
7499
- });
7528
+ var animationFrameRequestId = requestAnimationFrame(updateDimensions);
7500
7529
  return function () {
7501
- cancelAnimationFrame(animationFrameRequestId);
7530
+ return cancelAnimationFrame(animationFrameRequestId);
7502
7531
  };
7503
7532
  }, [children]);
7504
7533
  useEffect(function () {
7505
7534
  var observer = new ResizeObserver(updateDimensions);
7506
7535
  if (containerRef.current) observer.observe(containerRef.current);
7507
7536
  return function () {
7508
- observer.disconnect();
7537
+ return observer.disconnect();
7509
7538
  };
7510
7539
  }, [children]);
7511
- // Compute current translate X value by summing widths of all slides before currentIndex.
7540
+ var setIsActive = function setIsActive() {
7541
+ if (!isActive.current) {
7542
+ isActive.current = true;
7543
+ onActiveChange == null || onActiveChange(true);
7544
+ }
7545
+ };
7512
7546
  var getTranslateX = function getTranslateX() {
7513
- var slideOffset = slidesOffsetBefore - slideWidths.slice(0, currentIndex).reduce(function (acc, width) {
7547
+ var offset = slidesOffsetBefore - slideWidths.slice(0, currentIndex).reduce(function (acc, width) {
7514
7548
  return acc + width;
7515
7549
  }, 0);
7516
- return slideOffset + (slidesOffsetBefore || 0); // Apply offsetBefore
7550
+ return offset + (slidesOffsetBefore || 0);
7551
+ };
7552
+ var navigateOnSwipeEnd = function navigateOnSwipeEnd() {
7553
+ var delta = currentTranslate.current - getTranslateX();
7554
+ var direction = delta > 0 ? -1 : 1;
7555
+ var movedSlides = getMovedSlides(delta, slideWidths);
7556
+ if (Math.abs(delta) > 20) {
7557
+ movedSlides = Math.max(1, movedSlides);
7558
+ var targetIndex = currentIndex + direction * movedSlides;
7559
+ var finalIndex = infinite ? targetIndex : Math.max(0, Math.min(slides.length - 1, targetIndex));
7560
+ setTransitioning(true);
7561
+ setCurrentIndex(finalIndex);
7562
+ } else {
7563
+ setTransitioning(true);
7564
+ setCurrentIndex(function (prev) {
7565
+ return prev;
7566
+ });
7567
+ }
7568
+ setDragTranslateX(null);
7517
7569
  };
7518
7570
  var canMoveNext = function canMoveNext() {
7519
7571
  var totalVisibleWidth = slideWidths.slice(currentIndex).reduce(function (acc, width) {
7520
7572
  return acc + width;
7521
7573
  }, 0);
7522
- // In non-infinite mode, only move if there is more to show
7523
7574
  return infinite || totalVisibleWidth > containerWidth - (slidesOffsetBefore || 0);
7524
7575
  };
7525
7576
  var handleTransitionEnd = function handleTransitionEnd() {
7526
- setTransitioning(false); // Reset transitioning after animation ends
7577
+ setTransitioning(false);
7527
7578
  if (!infinite) return;
7528
7579
  if (currentIndex >= children.length + clonesCount) {
7529
7580
  setCurrentIndex(clonesCount);
@@ -7532,22 +7583,16 @@ var Swipe = /*#__PURE__*/forwardRef(function (_ref, ref) {
7532
7583
  }
7533
7584
  };
7534
7585
  var goToPrev = function goToPrev() {
7535
- if (transitioning) return; // Prevent clicks during transition
7536
- if (currentIndex === 0 && !infinite) {
7537
- setTransitioning(false); // Reset immediately if no more slides
7538
- return;
7539
- }
7586
+ if (transitioning) return;
7587
+ setIsActive();
7540
7588
  setTransitioning(true);
7541
7589
  setCurrentIndex(function (prev) {
7542
7590
  return infinite ? prev - 1 : Math.max(0, prev - 1);
7543
7591
  });
7544
7592
  };
7545
7593
  var goToNext = function goToNext() {
7546
- if (transitioning || !canMoveNext()) return; // Prevent clicks during transition
7547
- if (currentIndex === children.length - 1 && !infinite) {
7548
- setTransitioning(false); // Reset immediately if no more slides
7549
- return;
7550
- }
7594
+ if (transitioning || !canMoveNext()) return;
7595
+ setIsActive();
7551
7596
  setTransitioning(true);
7552
7597
  setCurrentIndex(function (prev) {
7553
7598
  return infinite ? prev + 1 : Math.min(children.length - 1, prev + 1);
@@ -7560,26 +7605,70 @@ var Swipe = /*#__PURE__*/forwardRef(function (_ref, ref) {
7560
7605
  };
7561
7606
  });
7562
7607
  var handleTouchStart = function handleTouchStart(e) {
7608
+ setIsActive();
7563
7609
  startX.current = e.touches[0].clientX;
7564
7610
  isDragging.current = true;
7611
+ isClickPrevented.current = false;
7565
7612
  setTransitioning(false);
7566
7613
  };
7567
7614
  var handleTouchMove = function handleTouchMove(e) {
7568
7615
  if (!isDragging.current) return;
7569
7616
  var deltaX = e.touches[0].clientX - startX.current;
7570
- currentTranslate.current = getTranslateX() + deltaX;
7617
+ if (Math.abs(deltaX) > CLICK_DRAG_THRESHOLD) {
7618
+ isClickPrevented.current = true;
7619
+ }
7620
+ var visualOffset = getTranslateX() + deltaX;
7621
+ currentTranslate.current = visualOffset;
7622
+ setDragTranslateX(visualOffset);
7571
7623
  };
7572
7624
  var handleTouchEnd = function handleTouchEnd() {
7573
7625
  isDragging.current = false;
7574
- setTransitioning(true);
7575
- if (currentTranslate.current > getTranslateX()) {
7576
- goToPrev();
7577
- } else if (currentTranslate.current < getTranslateX()) {
7578
- goToNext();
7626
+ navigateOnSwipeEnd();
7627
+ };
7628
+ var handleMouseMove = function handleMouseMove(e) {
7629
+ if (!isDragging.current || !isMouseDown.current || transitioning) return;
7630
+ var deltaX = e.clientX - startX.current;
7631
+ if (Math.abs(deltaX) > CLICK_DRAG_THRESHOLD) {
7632
+ isClickPrevented.current = true;
7579
7633
  }
7634
+ var visualOffset = getTranslateX() + deltaX;
7635
+ currentTranslate.current = visualOffset;
7636
+ setDragTranslateX(visualOffset);
7637
+ };
7638
+ var _handleMouseUp = function handleMouseUp() {
7639
+ if (!isDragging.current || !isMouseDown.current) return;
7640
+ isDragging.current = false;
7641
+ isMouseDown.current = false;
7642
+ window.removeEventListener('mousemove', handleMouseMove);
7643
+ window.removeEventListener('mouseup', _handleMouseUp);
7644
+ if (!isClickPrevented.current) {
7645
+ setDragTranslateX(null);
7646
+ return;
7647
+ }
7648
+ navigateOnSwipeEnd();
7649
+ };
7650
+ var handleMouseDown = function handleMouseDown(e) {
7651
+ if (transitioning || e.button !== 0) return;
7652
+ e.preventDefault();
7653
+ setIsActive();
7654
+ startX.current = e.clientX;
7655
+ isDragging.current = true;
7656
+ isMouseDown.current = true;
7657
+ isClickPrevented.current = false;
7658
+ setTransitioning(false);
7659
+ window.addEventListener('mousemove', handleMouseMove);
7660
+ window.addEventListener('mouseup', _handleMouseUp);
7580
7661
  };
7581
7662
  var onSlideFocus = function onSlideFocus(isVisible, index) {
7582
- if (!isVisible) setCurrentIndex(index);
7663
+ if (!isVisible) {
7664
+ setCurrentIndex(index);
7665
+ }
7666
+ };
7667
+ var onClickCapture = function onClickCapture(e) {
7668
+ if (isClickPrevented.current) {
7669
+ e.preventDefault();
7670
+ e.stopPropagation();
7671
+ }
7583
7672
  };
7584
7673
  var visibleIndexes = getVisibleIndexes(currentIndex, slideWidths, containerWidth, slides.length);
7585
7674
  return /*#__PURE__*/React__default.createElement(SwipeContainer, Object.assign({
@@ -7587,11 +7676,12 @@ var Swipe = /*#__PURE__*/forwardRef(function (_ref, ref) {
7587
7676
  onTouchStart: handleTouchStart,
7588
7677
  onTouchMove: handleTouchMove,
7589
7678
  onTouchEnd: handleTouchEnd,
7679
+ onMouseDown: handleMouseDown,
7590
7680
  className: "swipe"
7591
7681
  }, props), /*#__PURE__*/React__default.createElement(SwipeTrack, {
7592
7682
  className: "swipe-track-wrapper",
7593
- translateX: getTranslateX(),
7594
- transitioning: transitioning,
7683
+ translateX: dragTranslateX !== null ? dragTranslateX : getTranslateX(),
7684
+ transitioning: transitioning && dragTranslateX === null,
7595
7685
  onTransitionEnd: handleTransitionEnd
7596
7686
  }, slides.map(function (child, index) {
7597
7687
  var isVisible = visibleIndexes.includes(index);
@@ -7604,7 +7694,8 @@ var Swipe = /*#__PURE__*/forwardRef(function (_ref, ref) {
7604
7694
  },
7605
7695
  onFocus: function onFocus() {
7606
7696
  return onSlideFocus(isVisible, index);
7607
- }
7697
+ },
7698
+ onClickCapture: onClickCapture
7608
7699
  });
7609
7700
  })));
7610
7701
  });
@@ -7658,19 +7749,23 @@ var Carousel = function Carousel(_ref) {
7658
7749
  }, [useOffset, active]);
7659
7750
  var onNext = function onNext() {
7660
7751
  var _swipeRef$current;
7661
- if (useOffset && !active) setActive(true);
7662
7752
  (_swipeRef$current = swipeRef.current) == null || _swipeRef$current.nextSlide();
7663
7753
  };
7664
7754
  var onPrev = function onPrev() {
7665
7755
  var _swipeRef$current2;
7666
- if (useOffset && !active) setActive(true);
7667
7756
  (_swipeRef$current2 = swipeRef.current) == null || _swipeRef$current2.prevSlide();
7668
7757
  };
7758
+ var onActiveChangeHandler = function onActiveChangeHandler(value) {
7759
+ if (useOffset && !active) {
7760
+ setActive(value);
7761
+ }
7762
+ };
7669
7763
  var carouselTitleId = "carousel-title-" + title;
7670
7764
  var Wrapper = type === CarouselType.Image ? ImageCarouselWrapper : CardsCarouselWrapper;
7671
7765
  return /*#__PURE__*/React__default.createElement(Wrapper, {
7672
7766
  className: className,
7673
7767
  type: type,
7768
+ isActive: active,
7674
7769
  imagesHeightDevice: imagesHeightDevice,
7675
7770
  imagesHeightDesktop: imagesHeightDesktop,
7676
7771
  role: "region",
@@ -7709,6 +7804,9 @@ var Carousel = function Carousel(_ref) {
7709
7804
  columnStartDevice: 2,
7710
7805
  columnSpanDevice: 13
7711
7806
  }, /*#__PURE__*/React__default.createElement(Swipe, {
7807
+ onActiveChange: function onActiveChange(value) {
7808
+ return onActiveChangeHandler(value);
7809
+ },
7712
7810
  "data-testid": "carousel-swipe",
7713
7811
  ref: swipeRef,
7714
7812
  infinite: infinite,