@transferwise/components 0.0.0-experimental-5ff6475 → 0.0.0-experimental-f16de49

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.
Files changed (50) hide show
  1. package/build/Calendar/Calendar.js +9 -3
  2. package/build/Calendar/Calendar.js.map +1 -1
  3. package/build/Calendar/Calendar.mjs +9 -3
  4. package/build/Calendar/Calendar.mjs.map +1 -1
  5. package/build/Carousel/Carousel.js +17 -10
  6. package/build/Carousel/Carousel.js.map +1 -1
  7. package/build/Carousel/Carousel.mjs +17 -10
  8. package/build/Carousel/Carousel.mjs.map +1 -1
  9. package/build/SegmentedControl/SegmentedControl.js +2 -9
  10. package/build/SegmentedControl/SegmentedControl.js.map +1 -1
  11. package/build/SegmentedControl/SegmentedControl.mjs +2 -9
  12. package/build/SegmentedControl/SegmentedControl.mjs.map +1 -1
  13. package/build/Tooltip/Tooltip.js +6 -1
  14. package/build/Tooltip/Tooltip.js.map +1 -1
  15. package/build/Tooltip/Tooltip.mjs +6 -1
  16. package/build/Tooltip/Tooltip.mjs.map +1 -1
  17. package/build/main.css +10 -28
  18. package/build/styles/AvatarLayout/AvatarLayout.css +9 -26
  19. package/build/styles/SegmentedControl/SegmentedControl.css +1 -2
  20. package/build/styles/main.css +10 -28
  21. package/build/types/Calendar/Calendar.d.ts.map +1 -1
  22. package/build/types/Carousel/Carousel.d.ts.map +1 -1
  23. package/build/types/Carousel/_stories/constants.d.ts +3 -0
  24. package/build/types/Carousel/_stories/constants.d.ts.map +1 -0
  25. package/build/types/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  26. package/build/types/Tooltip/Tooltip.d.ts.map +1 -1
  27. package/package.json +4 -4
  28. package/src/AvatarLayout/AvatarLayout.css +9 -26
  29. package/src/AvatarLayout/AvatarLayout.less +22 -46
  30. package/src/AvatarLayout/_stories/AvatarLayout.test.story.tsx +42 -17
  31. package/src/Calendar/Calendar.test.tsx +82 -0
  32. package/src/Calendar/Calendar.tsx +6 -3
  33. package/src/Carousel/Carousel.tsx +13 -10
  34. package/src/Carousel/_stories/Carousel.story.tsx +12 -52
  35. package/src/Carousel/_stories/Carousel.test.story.tsx +7 -43
  36. package/src/Carousel/_stories/constants.tsx +46 -0
  37. package/src/DateLookup/_stories/DateLookup.rtl.test.story.tsx +48 -59
  38. package/src/Field/_stories/Field.test.story.tsx +37 -48
  39. package/src/FlowNavigation/_stories/FlowNavigation.test.story.tsx +44 -0
  40. package/src/Label/_stories/Label.test.story.tsx +22 -35
  41. package/src/Popover/_stories/Popover.rtl.test.story.tsx +50 -40
  42. package/src/SegmentedControl/SegmentedControl.css +1 -2
  43. package/src/SegmentedControl/SegmentedControl.less +2 -4
  44. package/src/SegmentedControl/SegmentedControl.tsx +2 -8
  45. package/src/SegmentedControl/_stories/SegmentedControl.test.story.tsx +8 -16
  46. package/src/Tooltip/Tooltip.test.tsx +51 -0
  47. package/src/Tooltip/Tooltip.tsx +6 -1
  48. package/src/Tooltip/_stories/Tooltip.rtl.test.story.tsx +16 -34
  49. package/src/main.css +10 -28
  50. package/src/FlowNavigation/_stories/FlowNavigation.rtl.test.story.tsx +0 -78
@@ -20354,53 +20354,36 @@ a[data-toggle="tooltip"] {
20354
20354
  block-size: var(--np-avatar-layout-size);
20355
20355
  }
20356
20356
  .np-avatar-layout-diagonal-mask {
20357
- --np-avatar-layout-mask-direction: right;
20358
20357
  -webkit-mask-image: radial-gradient(circle at bottom calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)) right calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)), transparent 0, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
20359
20358
  mask-image: radial-gradient(circle at bottom calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)) right calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)), transparent 0, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
20360
- -webkit-mask-image: radial-gradient(circle at bottom calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)) var(--np-avatar-layout-mask-direction) calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)), transparent 0, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
20361
- mask-image: radial-gradient(circle at bottom calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)) var(--np-avatar-layout-mask-direction) calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)), transparent 0, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
20362
20359
  }
20363
20360
  [dir="rtl"] .np-avatar-layout-diagonal-mask {
20364
- --np-avatar-layout-mask-direction: left;
20365
- margin-inline-start: calc(var(--np-avatar-layout-size) - var(--np-avatar-size) * 2);
20366
- margin-inline-end: unset;
20361
+ -webkit-mask-image: radial-gradient(circle at bottom calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)) left calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)), transparent 0, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
20362
+ mask-image: radial-gradient(circle at bottom calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)) left calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)), transparent 0, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
20367
20363
  }
20368
20364
  .np-avatar-layout-diagonal-child {
20369
20365
  margin-inline-start: calc(var(--np-avatar-layout-size) - var(--np-avatar-size) * 2);
20370
20366
  margin-block-start: calc(var(--np-avatar-layout-size) - var(--np-avatar-size));
20371
20367
  }
20372
20368
  [dir="rtl"] .np-avatar-layout-diagonal-child {
20373
- -webkit-mask-image: initial;
20374
- mask-image: initial;
20369
+ margin-inline-start: 0;
20370
+ margin-inline-end: calc(var(--np-avatar-layout-size) - var(--np-avatar-size) * 2);
20375
20371
  }
20376
20372
  .np-avatar-layout-horizontal {
20377
- --np-avatar-layout-mask-direction: left;
20378
20373
  inline-size: calc(var(--np-avatar-size) * var(--np-avatar-avatars-count) - (var(--np-avatar-offset) * (var(--np-avatar-avatars-count) - 1)));
20379
20374
  inline-size: calc(var(--np-avatar-size) * var(--np-avatar-avatars-count) - calc(var(--np-avatar-offset) * calc(var(--np-avatar-avatars-count) - 1)));
20380
20375
  block-size: var(--np-avatar-layout-size);
20381
20376
  }
20382
- [dir="rtl"] .np-avatar-layout-horizontal {
20383
- --np-avatar-layout-mask-direction: right;
20384
- }
20385
- .np-avatar-layout-horizontal-mask,
20386
- [dir="rtl"] .np-avatar-layout-horizontal-child {
20387
- -webkit-mask-image: radial-gradient(circle at top calc(100% - (var(--np-avatar-size) / 2)) var(--np-avatar-layout-mask-direction) calc(100% + (var(--np-avatar-size) / 2) - var(--np-avatar-offset)), transparent, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
20388
- mask-image: radial-gradient(circle at top calc(100% - (var(--np-avatar-size) / 2)) var(--np-avatar-layout-mask-direction) calc(100% + (var(--np-avatar-size) / 2) - var(--np-avatar-offset)), transparent, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
20389
- -webkit-mask-image: radial-gradient(circle at top calc(100% - calc(var(--np-avatar-size) / 2)) var(--np-avatar-layout-mask-direction) calc(100% + calc(var(--np-avatar-size) / 2) - var(--np-avatar-offset)), transparent, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
20390
- mask-image: radial-gradient(circle at top calc(100% - calc(var(--np-avatar-size) / 2)) var(--np-avatar-layout-mask-direction) calc(100% + calc(var(--np-avatar-size) / 2) - var(--np-avatar-offset)), transparent, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
20391
- }
20392
- [dir="rtl"] .np-avatar-layout-horizontal-mask {
20393
- margin-inline-end: calc(var(--np-avatar-offset) * -1);
20394
- }
20395
- [dir="rtl"] .np-avatar-layout-horizontal-mask:last-child {
20396
- -webkit-mask-image: initial;
20397
- mask-image: initial;
20377
+ .np-avatar-layout-horizontal-mask {
20378
+ -webkit-mask-image: radial-gradient(circle at top calc(100% - (var(--np-avatar-size) / 2)) left calc(100% + (var(--np-avatar-size) / 2) - var(--np-avatar-offset)), transparent, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
20379
+ mask-image: radial-gradient(circle at top calc(100% - (var(--np-avatar-size) / 2)) left calc(100% + (var(--np-avatar-size) / 2) - var(--np-avatar-offset)), transparent, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
20380
+ -webkit-mask-image: radial-gradient(circle at top calc(100% - calc(var(--np-avatar-size) / 2)) left calc(100% + calc(var(--np-avatar-size) / 2) - var(--np-avatar-offset)), transparent, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
20381
+ mask-image: radial-gradient(circle at top calc(100% - calc(var(--np-avatar-size) / 2)) left calc(100% + calc(var(--np-avatar-size) / 2) - var(--np-avatar-offset)), transparent, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
20398
20382
  }
20399
20383
  .np-avatar-layout-horizontal-child {
20400
20384
  margin-inline-start: calc(var(--np-avatar-offset) * -1);
20401
20385
  }
20402
20386
  [dir="rtl"] .np-avatar-layout-horizontal-child {
20403
- margin-inline-start: unset;
20404
20387
  margin-inline-end: calc(var(--np-avatar-offset) * -1);
20405
20388
  }
20406
20389
  .np-icon-button {
@@ -25818,8 +25801,7 @@ button.np-link {
25818
25801
  background: var(--color-background-screen);
25819
25802
  border-radius: 24px;
25820
25803
  border-radius: var(--size-24);
25821
- transition: left 300ms,
25822
- right 300ms;
25804
+ transition: left 300ms;
25823
25805
  }
25824
25806
  .segmented-control__segments--no-animate::after {
25825
25807
  transition: none !important;
@@ -1 +1 @@
1
- {"version":3,"file":"Calendar.d.ts","sourceRoot":"","sources":["../../../src/Calendar/Calendar.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAKxC,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOtE,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,8HAA8H;IAC9H,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,2HAA2H;IAC3H,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,GAAG,WAAW,EAAE,CAAC;IAC/B,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uNAAuN;IACvN,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,yJAAyJ;IACzJ,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IAChE,sFAAsF;IACtF,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;CACxC;AAQD;;GAEG;AACH,QAAA,MAAM,QAAQ,GAAI,wGASf,aAAa,gCAmQf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"Calendar.d.ts","sourceRoot":"","sources":["../../../src/Calendar/Calendar.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAMxC,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOtE,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,8HAA8H;IAC9H,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,2HAA2H;IAC3H,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,GAAG,WAAW,EAAE,CAAC;IAC/B,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uNAAuN;IACvN,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,yJAAyJ;IACzJ,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IAChE,sFAAsF;IACtF,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;CACxC;AAQD;;GAEG;AACH,QAAA,MAAM,QAAQ,GAAI,wGASf,aAAa,gCAqQf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Carousel.d.ts","sourceRoot":"","sources":["../../../src/Carousel/Carousel.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAA+B,MAAM,OAAO,CAAC;AAIxF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGjE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,kBAAkB,GAAG;IACrD,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,OAAO,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,kBAAkB,GAAG;IACnD,IAAI,EAAE,OAAO,CAAC;CACf,GAAG,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAErC,MAAM,MAAM,YAAY,GAAG,mBAAmB,GAAG,iBAAiB,CAAC;AACnE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAUD,QAAA,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAmSrC,CAAC;AAYF,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"Carousel.d.ts","sourceRoot":"","sources":["../../../src/Carousel/Carousel.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAA+B,MAAM,OAAO,CAAC;AAKxF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGjE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,kBAAkB,GAAG;IACrD,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,OAAO,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,kBAAkB,GAAG;IACnD,IAAI,EAAE,OAAO,CAAC;CACf,GAAG,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAErC,MAAM,MAAM,YAAY,GAAG,mBAAmB,GAAG,iBAAiB,CAAC;AACnE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAUD,QAAA,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAqSrC,CAAC;AAYF,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CarouselCard } from '../Carousel';
2
+ export declare const stubbedCarouselCards: CarouselCard[];
3
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/Carousel/_stories/constants.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,eAAO,MAAM,oBAAoB,EAAE,YAAY,EAyC9C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"SegmentedControl.d.ts","sourceRoot":"","sources":["../../../src/SegmentedControl/SegmentedControl.tsx"],"names":[],"mappings":"AAOA,KAAK,WAAW,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhE,KAAK,OAAO,GAAG,WAAW,GAAG;IAAE,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAClD,KAAK,mBAAmB,GAAG,WAAW,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,MAAM,MAAM,QAAQ,GAAG,SAAS,OAAO,EAAE,GAAG,SAAS,mBAAmB,EAAE,CAAC;AAE3E,KAAK,yBAAyB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AAEF,KAAK,yBAAyB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC1C,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,yBAAyB,GAC3D,CAAC,yBAAyB,GAAG,0BAA0B,CAAC,CAAC;AAE3D,QAAA,MAAM,gBAAgB,GAAI,4CAMvB,qBAAqB,gCAqIvB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"SegmentedControl.d.ts","sourceRoot":"","sources":["../../../src/SegmentedControl/SegmentedControl.tsx"],"names":[],"mappings":"AAMA,KAAK,WAAW,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhE,KAAK,OAAO,GAAG,WAAW,GAAG;IAAE,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAClD,KAAK,mBAAmB,GAAG,WAAW,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,MAAM,MAAM,QAAQ,GAAG,SAAS,OAAO,EAAE,GAAG,SAAS,mBAAmB,EAAE,CAAC;AAE3E,KAAK,yBAAyB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AAEF,KAAK,yBAAyB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC1C,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,yBAAyB,GAC3D,CAAC,yBAAyB,GAAG,0BAA0B,CAAC,CAAC;AAE3D,QAAA,MAAM,gBAAgB,GAAI,4CAMvB,qBAAqB,gCAgIvB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../../src/Tooltip/Tooltip.tsx"],"names":[],"mappings":"AAQA,OAAO,EAGL,iBAAiB,EAEjB,SAAS,EAKV,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,WAAW,EAAY,MAAM,WAAW,CAAC;AAClD,OAAO,EACL,cAAc,EACd,YAAY,EACZ,aAAa,EACb,WAAW,EACZ,MAAM,gCAAgC,CAAC;AAExC,MAAM,MAAM,YAAY,GAAG,iBAAiB,CAAC;IAC3C,QAAQ,CAAC,EAAE,WAAW,GAAG,aAAa,GAAG,cAAc,GAAG,YAAY,CAAC;IACvE,KAAK,EAAE,SAAS,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,CAAC,GACA,WAAW,CAAC;AAEd,QAAA,MAAM,OAAO,GAAI,+CAMd,YAAY,gCA6Dd,CAAC;AAEF,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../../src/Tooltip/Tooltip.tsx"],"names":[],"mappings":"AAQA,OAAO,EAGL,iBAAiB,EAEjB,SAAS,EAKV,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,WAAW,EAAY,MAAM,WAAW,CAAC;AAElD,OAAO,EACL,cAAc,EACd,YAAY,EACZ,aAAa,EACb,WAAW,EACZ,MAAM,gCAAgC,CAAC;AAExC,MAAM,MAAM,YAAY,GAAG,iBAAiB,CAAC;IAC3C,QAAQ,CAAC,EAAE,WAAW,GAAG,aAAa,GAAG,cAAc,GAAG,YAAY,CAAC;IACvE,KAAK,EAAE,SAAS,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,CAAC,GACA,WAAW,CAAC;AAEd,QAAA,MAAM,OAAO,GAAI,+CAMd,YAAY,gCAiEd,CAAC;AAEF,eAAe,OAAO,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transferwise/components",
3
- "version": "0.0.0-experimental-5ff6475",
3
+ "version": "0.0.0-experimental-f16de49",
4
4
  "description": "Neptune React components",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -91,9 +91,9 @@
91
91
  "storybook": "^10.5.4",
92
92
  "storybook-addon-tag-badges": "^3.1.0",
93
93
  "storybook-addon-test-codegen": "^3.0.4",
94
- "@transferwise/less-config": "0.0.0-experimental-5ff6475",
95
- "@wise/wds-configs": "0.0.0",
96
- "@wise/components-theming": "1.10.3"
94
+ "@transferwise/less-config": "0.0.0-experimental-f16de49",
95
+ "@wise/components-theming": "1.10.3",
96
+ "@wise/wds-configs": "0.0.0"
97
97
  },
98
98
  "peerDependencies": {
99
99
  "@transferwise/icons": "^3 || ^4",
@@ -8,52 +8,35 @@
8
8
  block-size: var(--np-avatar-layout-size);
9
9
  }
10
10
  .np-avatar-layout-diagonal-mask {
11
- --np-avatar-layout-mask-direction: right;
12
11
  -webkit-mask-image: radial-gradient(circle at bottom calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)) right calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)), transparent 0, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
13
12
  mask-image: radial-gradient(circle at bottom calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)) right calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)), transparent 0, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
14
- -webkit-mask-image: radial-gradient(circle at bottom calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)) var(--np-avatar-layout-mask-direction) calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)), transparent 0, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
15
- mask-image: radial-gradient(circle at bottom calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)) var(--np-avatar-layout-mask-direction) calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)), transparent 0, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
16
13
  }
17
14
  [dir="rtl"] .np-avatar-layout-diagonal-mask {
18
- --np-avatar-layout-mask-direction: left;
19
- margin-inline-start: calc(var(--np-avatar-layout-size) - var(--np-avatar-size) * 2);
20
- margin-inline-end: unset;
15
+ -webkit-mask-image: radial-gradient(circle at bottom calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)) left calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)), transparent 0, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
16
+ mask-image: radial-gradient(circle at bottom calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)) left calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)), transparent 0, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
21
17
  }
22
18
  .np-avatar-layout-diagonal-child {
23
19
  margin-inline-start: calc(var(--np-avatar-layout-size) - var(--np-avatar-size) * 2);
24
20
  margin-block-start: calc(var(--np-avatar-layout-size) - var(--np-avatar-size));
25
21
  }
26
22
  [dir="rtl"] .np-avatar-layout-diagonal-child {
27
- -webkit-mask-image: initial;
28
- mask-image: initial;
23
+ margin-inline-start: 0;
24
+ margin-inline-end: calc(var(--np-avatar-layout-size) - var(--np-avatar-size) * 2);
29
25
  }
30
26
  .np-avatar-layout-horizontal {
31
- --np-avatar-layout-mask-direction: left;
32
27
  inline-size: calc(var(--np-avatar-size) * var(--np-avatar-avatars-count) - (var(--np-avatar-offset) * (var(--np-avatar-avatars-count) - 1)));
33
28
  inline-size: calc(var(--np-avatar-size) * var(--np-avatar-avatars-count) - calc(var(--np-avatar-offset) * calc(var(--np-avatar-avatars-count) - 1)));
34
29
  block-size: var(--np-avatar-layout-size);
35
30
  }
36
- [dir="rtl"] .np-avatar-layout-horizontal {
37
- --np-avatar-layout-mask-direction: right;
38
- }
39
- .np-avatar-layout-horizontal-mask,
40
- [dir="rtl"] .np-avatar-layout-horizontal-child {
41
- -webkit-mask-image: radial-gradient(circle at top calc(100% - (var(--np-avatar-size) / 2)) var(--np-avatar-layout-mask-direction) calc(100% + (var(--np-avatar-size) / 2) - var(--np-avatar-offset)), transparent, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
42
- mask-image: radial-gradient(circle at top calc(100% - (var(--np-avatar-size) / 2)) var(--np-avatar-layout-mask-direction) calc(100% + (var(--np-avatar-size) / 2) - var(--np-avatar-offset)), transparent, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
43
- -webkit-mask-image: radial-gradient(circle at top calc(100% - calc(var(--np-avatar-size) / 2)) var(--np-avatar-layout-mask-direction) calc(100% + calc(var(--np-avatar-size) / 2) - var(--np-avatar-offset)), transparent, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
44
- mask-image: radial-gradient(circle at top calc(100% - calc(var(--np-avatar-size) / 2)) var(--np-avatar-layout-mask-direction) calc(100% + calc(var(--np-avatar-size) / 2) - var(--np-avatar-offset)), transparent, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
45
- }
46
- [dir="rtl"] .np-avatar-layout-horizontal-mask {
47
- margin-inline-end: calc(var(--np-avatar-offset) * -1);
48
- }
49
- [dir="rtl"] .np-avatar-layout-horizontal-mask:last-child {
50
- -webkit-mask-image: initial;
51
- mask-image: initial;
31
+ .np-avatar-layout-horizontal-mask {
32
+ -webkit-mask-image: radial-gradient(circle at top calc(100% - (var(--np-avatar-size) / 2)) left calc(100% + (var(--np-avatar-size) / 2) - var(--np-avatar-offset)), transparent, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
33
+ mask-image: radial-gradient(circle at top calc(100% - (var(--np-avatar-size) / 2)) left calc(100% + (var(--np-avatar-size) / 2) - var(--np-avatar-offset)), transparent, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
34
+ -webkit-mask-image: radial-gradient(circle at top calc(100% - calc(var(--np-avatar-size) / 2)) left calc(100% + calc(var(--np-avatar-size) / 2) - var(--np-avatar-offset)), transparent, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
35
+ mask-image: radial-gradient(circle at top calc(100% - calc(var(--np-avatar-size) / 2)) left calc(100% + calc(var(--np-avatar-size) / 2) - var(--np-avatar-offset)), transparent, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
52
36
  }
53
37
  .np-avatar-layout-horizontal-child {
54
38
  margin-inline-start: calc(var(--np-avatar-offset) * -1);
55
39
  }
56
40
  [dir="rtl"] .np-avatar-layout-horizontal-child {
57
- margin-inline-start: unset;
58
41
  margin-inline-end: calc(var(--np-avatar-offset) * -1);
59
42
  }
@@ -8,20 +8,18 @@
8
8
  height: var(--np-avatar-layout-size);
9
9
 
10
10
  &-mask {
11
- --np-avatar-layout-mask-direction: right;
12
- mask-image: radial-gradient(
13
- circle at bottom calc(100% - var(--np-avatar-size) - var(--np-avatar-offset))
14
- var(--np-avatar-layout-mask-direction)
15
- calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)),
16
- transparent 0,
17
- transparent calc(var(--np-avatar-size) / 2 + 2px),
18
- black 0
19
- );
20
-
21
- [dir="rtl"] & {
22
- --np-avatar-layout-mask-direction: left;
23
- margin-left: calc(var(--np-avatar-layout-size) - var(--np-avatar-size) * 2);
24
- margin-right: unset;
11
+ mask-image:
12
+ radial-gradient(circle at bottom calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)) right calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)),
13
+ transparent 0,
14
+ transparent calc(var(--np-avatar-size) / 2 + 2px),
15
+ black 0);
16
+
17
+ :dir(rtl) & {
18
+ mask-image:
19
+ radial-gradient(circle at bottom calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)) left calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)),
20
+ transparent 0,
21
+ transparent calc(var(--np-avatar-size) / 2 + 2px),
22
+ black 0);
25
23
  }
26
24
  }
27
25
 
@@ -29,52 +27,30 @@
29
27
  margin-left: calc(var(--np-avatar-layout-size) - var(--np-avatar-size) * 2);
30
28
  margin-top: calc(var(--np-avatar-layout-size) - var(--np-avatar-size));
31
29
 
32
- [dir="rtl"] & {
33
- mask-image: unset;
30
+ :dir(rtl) & {
31
+ margin-left: 0;
32
+ margin-right: calc(var(--np-avatar-layout-size) - var(--np-avatar-size) * 2);
34
33
  }
35
34
  }
36
35
  }
37
36
 
38
37
  &-horizontal {
39
- --np-avatar-layout-mask-direction: left;
40
- width: calc(
41
- var(--np-avatar-size) * var(--np-avatar-avatars-count) -
42
- calc(var(--np-avatar-offset) * calc(var(--np-avatar-avatars-count) - 1))
43
- );
38
+ width: calc(var(--np-avatar-size) * var(--np-avatar-avatars-count) - calc(var(--np-avatar-offset) * calc(var(--np-avatar-avatars-count) - 1)));
44
39
  height: var(--np-avatar-layout-size);
45
40
 
46
- [dir="rtl"] & {
47
- --np-avatar-layout-mask-direction: right;
48
- }
49
-
50
- &-mask,
51
- [dir="rtl"] &-child {
52
- mask-image: radial-gradient(
53
- circle at top calc(100% - calc(var(--np-avatar-size) / 2))
54
- var(--np-avatar-layout-mask-direction)
55
- calc(100% + calc(var(--np-avatar-size) / 2) - var(--np-avatar-offset)),
56
- transparent,
57
- transparent calc(var(--np-avatar-size) / 2 + 2px),
58
- black 0
59
- );
60
- }
61
-
62
41
  &-mask {
63
- [dir="rtl"] & {
64
- &:last-child {
65
- mask-image: unset;
66
- }
67
- margin-right: calc(var(--np-avatar-offset) * -1);
68
- }
42
+ mask-image: radial-gradient(circle at top calc(100% - calc(var(--np-avatar-size) / 2)) left calc(100% + calc(var(--np-avatar-size) / 2) - var(--np-avatar-offset)),
43
+ transparent,
44
+ transparent calc(var(--np-avatar-size) / 2 + 2px),
45
+ black 0);
69
46
  }
70
47
 
71
48
  &-child {
72
49
  margin-left: calc(var(--np-avatar-offset) * -1);
73
50
 
74
- [dir="rtl"] & {
75
- margin-left: unset;
51
+ :dir(rtl) & {
76
52
  margin-right: calc(var(--np-avatar-offset) * -1);
77
53
  }
78
54
  }
79
55
  }
80
- }
56
+ }
@@ -117,26 +117,27 @@ export const EdgeInstances: Story = {
117
117
  ),
118
118
  };
119
119
 
120
- const horizontalSizes = [16, 24, 32, 40, 48, 56, 72, 88, 96] as const;
121
- const diagonalSizes = [24, 32, 40, 48, 56, 72, 88, 96] as const;
122
-
123
- const rowStyle = { display: 'flex', alignItems: 'center', gap: '16px', flexWrap: 'wrap' } as const;
124
- const twoAvatars = [{ asset: <Plane /> }, { asset: <Plane /> }] as const;
125
-
126
120
  export const RTLDiff: Story = {
127
121
  render: () => (
128
122
  <>
129
- <div style={rowStyle}>
130
- {horizontalSizes.map((size) => (
131
- <AvatarLayout key={size} orientation="horizontal" size={size} avatars={[...twoAvatars]} />
132
- ))}
133
- </div>
123
+ <AvatarLayout
124
+ orientation="horizontal"
125
+ size={48}
126
+ avatars={[{ asset: <Flag code="br" /> }, { asset: <Flag code="jp" /> }]}
127
+ />
128
+
129
+ <AvatarLayout
130
+ orientation="horizontal"
131
+ size={48}
132
+ interactive
133
+ avatars={[{ asset: <Freeze /> }, { asset: <Freeze /> }]}
134
+ />
134
135
 
135
- <div style={rowStyle}>
136
- {diagonalSizes.map((size) => (
137
- <AvatarLayout key={size} orientation="diagonal" size={size} avatars={[...twoAvatars]} />
138
- ))}
139
- </div>
136
+ <AvatarLayout
137
+ orientation="horizontal"
138
+ size={48}
139
+ avatars={[{ profileName: 'Jay Jay' }, { profileName: 'Amy Amy' }]}
140
+ />
140
141
 
141
142
  <AvatarLayout
142
143
  orientation="horizontal"
@@ -147,8 +148,32 @@ export const RTLDiff: Story = {
147
148
 
148
149
  <AvatarLayout
149
150
  orientation="horizontal"
151
+ size={32}
152
+ avatars={[{ asset: <Flag code="eu" /> }, { asset: <Flag code="gb" /> }]}
153
+ />
154
+
155
+ <AvatarLayout
156
+ orientation="horizontal"
157
+ size={72}
158
+ avatars={[{ asset: <Freeze /> }, { asset: <Freeze /> }, { asset: <Freeze /> }]}
159
+ />
160
+
161
+ <AvatarLayout
162
+ orientation="diagonal"
163
+ size={48}
164
+ avatars={[{ asset: <Flag code="br" /> }, { asset: <Flag code="jp" /> }]}
165
+ />
166
+
167
+ <AvatarLayout
168
+ orientation="diagonal"
169
+ size={48}
170
+ avatars={[{ profileName: 'Jay Jay' }, { profileName: 'Amy Amy' }]}
171
+ />
172
+
173
+ <AvatarLayout
174
+ orientation="diagonal"
150
175
  size={72}
151
- avatars={[{ asset: <Plane /> }, { asset: <Plane /> }, { asset: <Plane /> }]}
176
+ avatars={[{ asset: <Freeze /> }, { asset: <Freeze /> }]}
152
177
  />
153
178
  </>
154
179
  ),
@@ -1,4 +1,5 @@
1
1
  import { fireEvent, mockMatchMedia, render, screen, userEvent } from '../test-utils';
2
+ import { DirectionProvider } from '../Provider/Direction/DirectionProvider';
2
3
  import Calendar from './Calendar';
3
4
  import type { DisabledRules } from './Calendar.types';
4
5
 
@@ -445,4 +446,85 @@ describe('Calendar', () => {
445
446
  expect(handleChange).not.toHaveBeenCalled();
446
447
  });
447
448
  });
449
+
450
+ describe('RTL keyboard navigation', () => {
451
+ describe('in day view', () => {
452
+ it.each([
453
+ ['{ArrowLeft}', +1],
454
+ ['{ArrowRight}', -1],
455
+ ['{ArrowUp}', -7],
456
+ ['{ArrowDown}', +7],
457
+ ])(
458
+ "handles '%s' to step %d day(s) — horizontal arrows are reversed",
459
+ async (text: string, step: number) => {
460
+ const handleDateFocus = jest.fn();
461
+ render(
462
+ <DirectionProvider direction="rtl">
463
+ <Calendar value={initialValue} onDateFocus={handleDateFocus} />
464
+ </DirectionProvider>,
465
+ );
466
+
467
+ await user.click(screen.getByRole('button', { name: /selected day/iu }));
468
+ await user.keyboard(text);
469
+
470
+ const expected = new Date(initialValue);
471
+ expected.setDate(initialValue.getDate() + step);
472
+ expect(handleDateFocus).toHaveBeenCalledWith(expected, { isEnabled: true });
473
+ },
474
+ );
475
+ });
476
+
477
+ describe('in year view', () => {
478
+ it.each([
479
+ ['{ArrowLeft}', +1],
480
+ ['{ArrowRight}', -1],
481
+ ['{ArrowUp}', -4],
482
+ ['{ArrowDown}', +4],
483
+ ])(
484
+ "handles '%s' to step %d year(s) — horizontal arrows are reversed",
485
+ async (text: string, step: number) => {
486
+ const handleDateFocus = jest.fn();
487
+ render(
488
+ <DirectionProvider direction="rtl">
489
+ <Calendar value={initialValue} onDateFocus={handleDateFocus} />
490
+ </DirectionProvider>,
491
+ );
492
+
493
+ await user.click(screen.getByRole('button', { name: /year view/iu }));
494
+ await user.keyboard(text);
495
+
496
+ const expected = new Date(initialValue);
497
+ expected.setFullYear(initialValue.getFullYear() + step);
498
+ expect(handleDateFocus).toHaveBeenCalledWith(expected, { isEnabled: true });
499
+ },
500
+ );
501
+ });
502
+
503
+ describe('in month view', () => {
504
+ it.each([
505
+ ['{ArrowLeft}', +1],
506
+ ['{ArrowRight}', -1],
507
+ ['{ArrowUp}', -4],
508
+ ['{ArrowDown}', +4],
509
+ ])(
510
+ "handles '%s' to step %d month(s) — horizontal arrows are reversed",
511
+ async (text: string, step: number) => {
512
+ const handleDateFocus = jest.fn();
513
+ render(
514
+ <DirectionProvider direction="rtl">
515
+ <Calendar value={initialValue} onDateFocus={handleDateFocus} />
516
+ </DirectionProvider>,
517
+ );
518
+
519
+ await user.click(screen.getByRole('button', { name: /year view/iu }));
520
+ await user.keyboard(' ');
521
+ await user.keyboard(text);
522
+
523
+ const expected = new Date(initialValue);
524
+ expected.setMonth(initialValue.getMonth() + step);
525
+ expect(handleDateFocus).toHaveBeenCalledWith(expected, { isEnabled: true });
526
+ },
527
+ );
528
+ });
529
+ });
448
530
  });
@@ -3,6 +3,7 @@ import { useIntl } from 'react-intl';
3
3
  import { formatDate } from '@transferwise/formatting';
4
4
 
5
5
  import { MonthFormat } from '../common';
6
+ import { useDirection } from '../common/hooks';
6
7
  import { isWithinRange, moveToWithinRange, returnDateView } from '../common/DateUtils';
7
8
  import { clampToDayViewBoundary, isDateDisabled, hasDisabledDatesInMonth } from './_helpers';
8
9
  import { LONG_DAY_FORMAT } from './Calendar.constants';
@@ -53,6 +54,7 @@ const Calendar = ({
53
54
  onChange,
54
55
  }: CalendarProps) => {
55
56
  const intl = useIntl();
57
+ const { isRTL } = useDirection();
56
58
  const selectedDate = getStartOfDay(value);
57
59
  const min = getStartOfDay(minProp);
58
60
  const max = getStartOfDay(maxProp);
@@ -185,9 +187,10 @@ const Calendar = ({
185
187
 
186
188
  const handleKeyDown = useCallback(
187
189
  (event: KeyboardEvent<HTMLDivElement>) => {
190
+ const orientationSign = isRTL ? -1 : 1;
188
191
  switch (event.key) {
189
192
  case 'ArrowLeft':
190
- adjustDate(-1, -1, -1);
193
+ adjustDate(-1 * orientationSign, -1 * orientationSign, -1 * orientationSign);
191
194
  event.preventDefault();
192
195
  break;
193
196
  case 'ArrowUp':
@@ -195,7 +198,7 @@ const Calendar = ({
195
198
  event.preventDefault();
196
199
  break;
197
200
  case 'ArrowRight':
198
- adjustDate(1, 1, 1);
201
+ adjustDate(1 * orientationSign, 1 * orientationSign, 1 * orientationSign);
199
202
  event.preventDefault();
200
203
  break;
201
204
  case 'ArrowDown':
@@ -217,7 +220,7 @@ const Calendar = ({
217
220
  break;
218
221
  }
219
222
  },
220
- [adjustDate, focusedDate, mode, handleSelectedDateUpdate],
223
+ [adjustDate, focusedDate, mode, handleSelectedDateUpdate, isRTL],
221
224
  );
222
225
 
223
226
  const focusedDateOutOfRange = focusedDate ? !isWithinRange(focusedDate, min, max) : false;
@@ -2,6 +2,7 @@ import { ChevronLeft, ChevronRight } from '@transferwise/icons';
2
2
  import { clsx } from 'clsx';
3
3
  import { type CSSProperties, type ReactNode, useEffect, useRef, useState } from 'react';
4
4
 
5
+ import { useDirection } from '../common/hooks';
5
6
  import IconButton from '../IconButton';
6
7
  import Title from '../Title';
7
8
  import type { PromoCardLinkProps } from '../PromoCard/PromoCard';
@@ -48,10 +49,11 @@ const Carousel: React.FC<CarouselProps> = ({ header, className, cards, onClick }
48
49
  const [visibleCardOnMobileView, setVisibleCardOnMobileView] = useState<string>('');
49
50
  const carouselElementRef = useRef<HTMLDivElement>(null);
50
51
  const carouselCardsRef = useRef<CardsReference[]>([]);
52
+ const { isRTL } = useDirection();
51
53
 
52
- const isLeftActionButtonEnabled = scrollPosition > LEFT_SCROLL_OFFSET;
54
+ const isPrevButtonEnabled = scrollPosition > LEFT_SCROLL_OFFSET;
53
55
 
54
- const areActionButtonsEnabled = isLeftActionButtonEnabled || !scrollIsAtEnd;
56
+ const areActionButtonsEnabled = isPrevButtonEnabled || !scrollIsAtEnd;
55
57
 
56
58
  const [focusedCard, setFocusedCard] = useState(cards?.[0]?.id);
57
59
 
@@ -83,16 +85,17 @@ const Carousel: React.FC<CarouselProps> = ({ header, className, cards, onClick }
83
85
  setPreviousScrollPosition(scrollPosition);
84
86
  };
85
87
 
86
- const scrollCarousel = (direction: 'left' | 'right' = 'right') => {
88
+ const scrollCarousel = (direction: 'forward' | 'backward') => {
87
89
  if (carouselElementRef.current) {
88
90
  const { scrollWidth } = carouselElementRef.current;
89
91
 
90
92
  const cardWidth = scrollWidth / carouselCardsRef.current.length;
91
93
 
92
- const res = Math.floor(cardWidth - cardWidth * 0.05);
94
+ const distance = Math.floor(cardWidth - cardWidth * 0.05);
95
+ const sign = direction === 'forward' ? 1 : -1;
93
96
 
94
97
  carouselElementRef.current.scrollBy({
95
- left: direction === 'right' ? res : -res,
98
+ left: isRTL ? -sign * distance : sign * distance,
96
99
  behavior: 'smooth',
97
100
  });
98
101
  }
@@ -174,10 +177,10 @@ const Carousel: React.FC<CarouselProps> = ({ header, className, cards, onClick }
174
177
  size={32}
175
178
  tabIndex={-1}
176
179
  priority="tertiary"
177
- disabled={!isLeftActionButtonEnabled}
180
+ disabled={!isPrevButtonEnabled}
178
181
  aria-hidden="true"
179
182
  data-testid="scroll-carousel-left"
180
- onClick={() => scrollCarousel('left')}
183
+ onClick={() => scrollCarousel('backward')}
181
184
  >
182
185
  <ChevronLeft />
183
186
  </IconButton>
@@ -189,7 +192,7 @@ const Carousel: React.FC<CarouselProps> = ({ header, className, cards, onClick }
189
192
  aria-hidden="true"
190
193
  data-testid="scroll-carousel-right"
191
194
  disabled={scrollIsAtEnd}
192
- onClick={() => scrollCarousel()}
195
+ onClick={() => scrollCarousel('forward')}
193
196
  >
194
197
  <ChevronRight />
195
198
  </IconButton>
@@ -203,7 +206,7 @@ const Carousel: React.FC<CarouselProps> = ({ header, className, cards, onClick }
203
206
  className="carousel"
204
207
  onScroll={(event) => {
205
208
  const target = event.target as HTMLElement;
206
- setScrollPosition(target.scrollLeft);
209
+ setScrollPosition(Math.abs(target.scrollLeft));
207
210
  }}
208
211
  >
209
212
  {cards?.map((card, index) => {
@@ -336,7 +339,7 @@ const Carousel: React.FC<CarouselProps> = ({ header, className, cards, onClick }
336
339
 
337
340
  const isVisible = (container: HTMLElement, el: HTMLElement) => {
338
341
  const cWidth = container.offsetWidth;
339
- const cScrollOffset = container.scrollLeft;
342
+ const cScrollOffset = Math.abs(container.scrollLeft);
340
343
 
341
344
  const elemLeft = el.offsetLeft - container.offsetLeft;
342
345
  const elemRight = elemLeft + el.offsetWidth;