@transferwise/components 46.160.1 → 46.160.2

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 (69) 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 +9 -2
  10. package/build/SegmentedControl/SegmentedControl.js.map +1 -1
  11. package/build/SegmentedControl/SegmentedControl.mjs +9 -2
  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/i18n/tr.json +5 -0
  18. package/build/i18n/tr.json.js +5 -0
  19. package/build/i18n/tr.json.js.map +1 -1
  20. package/build/i18n/tr.json.mjs +5 -0
  21. package/build/i18n/tr.json.mjs.map +1 -1
  22. package/build/i18n/zh-CN.json +5 -0
  23. package/build/i18n/zh-CN.json.js +5 -0
  24. package/build/i18n/zh-CN.json.js.map +1 -1
  25. package/build/i18n/zh-CN.json.mjs +5 -0
  26. package/build/i18n/zh-CN.json.mjs.map +1 -1
  27. package/build/main.css +34 -22
  28. package/build/styles/AvatarLayout/AvatarLayout.css +26 -9
  29. package/build/styles/SegmentedControl/SegmentedControl.css +2 -1
  30. package/build/styles/Tooltip/Tooltip.css +0 -6
  31. package/build/styles/common/Panel/Panel.css +6 -6
  32. package/build/styles/main.css +34 -22
  33. package/build/types/Calendar/Calendar.d.ts.map +1 -1
  34. package/build/types/Carousel/Carousel.d.ts.map +1 -1
  35. package/build/types/Carousel/_stories/constants.d.ts +3 -0
  36. package/build/types/Carousel/_stories/constants.d.ts.map +1 -0
  37. package/build/types/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  38. package/build/types/Tooltip/Tooltip.d.ts.map +1 -1
  39. package/package.json +4 -4
  40. package/src/AvatarLayout/AvatarLayout.css +26 -9
  41. package/src/AvatarLayout/AvatarLayout.less +46 -22
  42. package/src/AvatarLayout/_stories/AvatarLayout.test.story.tsx +17 -42
  43. package/src/Calendar/Calendar.test.tsx +82 -0
  44. package/src/Calendar/Calendar.tsx +6 -3
  45. package/src/Carousel/Carousel.test.tsx +50 -2
  46. package/src/Carousel/Carousel.tsx +13 -10
  47. package/src/Carousel/_stories/Carousel.story.tsx +12 -52
  48. package/src/Carousel/_stories/Carousel.test.story.tsx +7 -43
  49. package/src/Carousel/_stories/constants.tsx +46 -0
  50. package/src/DateLookup/_stories/DateLookup.rtl.test.story.tsx +59 -48
  51. package/src/Field/_stories/Field.test.story.tsx +48 -37
  52. package/src/FlowNavigation/_stories/FlowNavigation.rtl.test.story.tsx +78 -0
  53. package/src/FlowNavigation/_stories/FlowNavigation.test.story.tsx +0 -44
  54. package/src/Label/_stories/Label.test.story.tsx +35 -22
  55. package/src/Popover/_stories/Popover.rtl.test.story.tsx +40 -50
  56. package/src/SegmentedControl/SegmentedControl.css +2 -1
  57. package/src/SegmentedControl/SegmentedControl.less +4 -2
  58. package/src/SegmentedControl/SegmentedControl.tsx +8 -2
  59. package/src/SegmentedControl/_stories/SegmentedControl.test.story.tsx +16 -8
  60. package/src/Tooltip/Tooltip.css +0 -6
  61. package/src/Tooltip/Tooltip.less +0 -12
  62. package/src/Tooltip/Tooltip.test.tsx +51 -0
  63. package/src/Tooltip/Tooltip.tsx +11 -1
  64. package/src/Tooltip/_stories/Tooltip.rtl.test.story.tsx +16 -34
  65. package/src/common/Panel/Panel.css +6 -6
  66. package/src/common/Panel/Panel.less +6 -6
  67. package/src/i18n/tr.json +5 -0
  68. package/src/i18n/zh-CN.json +5 -0
  69. package/src/main.css +34 -22
@@ -1 +1 @@
1
- {"version":3,"file":"Carousel.mjs","sources":["../../src/Carousel/Carousel.tsx"],"sourcesContent":["import { ChevronLeft, ChevronRight } from '@transferwise/icons';\nimport { clsx } from 'clsx';\nimport { type CSSProperties, type ReactNode, useEffect, useRef, useState } from 'react';\n\nimport IconButton from '../IconButton';\nimport Title from '../Title';\nimport type { PromoCardLinkProps } from '../PromoCard/PromoCard';\nimport PromoCard from '../PromoCard/PromoCard';\n\nexport type CarouselCardCommon = {\n id: string;\n href?: string;\n hrefTarget?: HTMLAnchorElement['target'];\n onClick?: () => void;\n className?: string;\n styles?: CSSProperties;\n};\n\nexport type CarouselDefaultCard = CarouselCardCommon & {\n type: 'anchor' | 'button';\n content: ReactNode;\n};\n\nexport type CarouselPromoCard = CarouselCardCommon & {\n type: 'promo';\n} & Omit<PromoCardLinkProps, 'type'>;\n\nexport type CarouselCard = CarouselDefaultCard | CarouselPromoCard;\nexport interface CarouselProps {\n header: string | ReactNode;\n className?: string;\n cards: CarouselCard[];\n onClick?: (cardId: string) => void;\n}\n\ntype CardsReference = {\n type: 'promo' | 'default';\n cardElement: HTMLDivElement | HTMLAnchorElement;\n anchorElement?: HTMLAnchorElement;\n};\n\nconst LEFT_SCROLL_OFFSET = 8;\n\nconst Carousel: React.FC<CarouselProps> = ({ header, className, cards, onClick }) => {\n const [scrollPosition, setScrollPosition] = useState(0);\n const [previousScrollPosition, setPreviousScrollPosition] = useState(0);\n const [scrollIsAtEnd, setScrollIsAtEnd] = useState(false);\n const [visibleCardOnMobileView, setVisibleCardOnMobileView] = useState<string>('');\n const carouselElementRef = useRef<HTMLDivElement>(null);\n const carouselCardsRef = useRef<CardsReference[]>([]);\n\n const isLeftActionButtonEnabled = scrollPosition > LEFT_SCROLL_OFFSET;\n\n const areActionButtonsEnabled = isLeftActionButtonEnabled || !scrollIsAtEnd;\n\n const [focusedCard, setFocusedCard] = useState(cards?.[0]?.id);\n\n const updateScrollButtonsState = () => {\n if (carouselElementRef.current) {\n const { scrollWidth, offsetWidth } = carouselElementRef.current;\n\n const scrollAtEnd = scrollWidth - offsetWidth <= scrollPosition + LEFT_SCROLL_OFFSET;\n setScrollIsAtEnd(scrollAtEnd);\n }\n\n const scrollDirecton = scrollPosition > previousScrollPosition ? 'right' : 'left';\n\n const cardsInFullViewIds: string[] = [];\n carouselCardsRef.current.forEach((card) => {\n if (isVisible(carouselElementRef.current as HTMLElement, card.cardElement as HTMLElement)) {\n // eslint-disable-next-line functional/immutable-data\n cardsInFullViewIds.push(card.cardElement.getAttribute('id') ?? '');\n }\n });\n\n if (cardsInFullViewIds.length >= 1) {\n const visibleCardIndex = scrollDirecton === 'right' ? cardsInFullViewIds.length - 1 : 0;\n const visibleCardId = cardsInFullViewIds[visibleCardIndex];\n setVisibleCardOnMobileView(visibleCardId);\n setFocusedCard(visibleCardId);\n }\n\n setPreviousScrollPosition(scrollPosition);\n };\n\n const scrollCarousel = (direction: 'left' | 'right' = 'right') => {\n if (carouselElementRef.current) {\n const { scrollWidth } = carouselElementRef.current;\n\n const cardWidth = scrollWidth / carouselCardsRef.current.length;\n\n const res = Math.floor(cardWidth - cardWidth * 0.05);\n\n carouselElementRef.current.scrollBy({\n left: direction === 'right' ? res : -res,\n behavior: 'smooth',\n });\n }\n };\n\n const handleOnKeyDown = (\n event: React.KeyboardEvent<HTMLAnchorElement | HTMLDivElement>,\n index: number,\n ) => {\n if (event.key === 'ArrowRight' || event.key === 'ArrowLeft') {\n const nextIndex = event.key === 'ArrowRight' ? index + 1 : index - 1;\n const nextCard = cards[nextIndex];\n if (nextCard) {\n const ref = carouselCardsRef.current[nextIndex];\n if (ref.type === 'promo') {\n ref.anchorElement?.focus();\n } else {\n ref.cardElement?.focus();\n }\n\n scrollCardIntoView(carouselCardsRef.current[nextIndex].cardElement, nextCard);\n event.preventDefault();\n }\n }\n\n if (event.key === 'Enter' || event.key === ' ') {\n event.currentTarget.click();\n }\n };\n\n const scrollCardIntoView = (element: HTMLElement, card: CarouselCard) => {\n element.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n\n setFocusedCard(card.id);\n };\n\n useEffect(() => {\n updateScrollButtonsState();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scrollPosition]);\n\n useEffect(() => {\n window.addEventListener('resize', updateScrollButtonsState);\n\n return () => {\n window.removeEventListener('resize', updateScrollButtonsState);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const addElementToCardsRefArray = (index: number, ref: Partial<CardsReference>) => {\n if (ref) {\n // eslint-disable-next-line functional/immutable-data\n carouselCardsRef.current[index] = {\n type: ref.type ?? carouselCardsRef.current?.[index]?.type,\n cardElement: ref.cardElement ?? carouselCardsRef.current?.[index]?.cardElement,\n anchorElement: ref.anchorElement ?? carouselCardsRef.current?.[index]?.anchorElement,\n };\n }\n };\n\n return (\n <div className={clsx('carousel-wrapper', className)}>\n <div className=\"d-flex justify-content-between carousel__header\">\n {typeof header === 'string' ? (\n <Title as=\"span\" type=\"title-body\">\n {header}\n </Title>\n ) : (\n header\n )}\n {areActionButtonsEnabled ? (\n <div className=\"hidden-xs d-inline-flex\">\n <IconButton\n size={32}\n tabIndex={-1}\n priority=\"tertiary\"\n disabled={!isLeftActionButtonEnabled}\n aria-hidden=\"true\"\n data-testid=\"scroll-carousel-left\"\n onClick={() => scrollCarousel('left')}\n >\n <ChevronLeft />\n </IconButton>\n <IconButton\n size={32}\n tabIndex={-1}\n className=\"m-l-1\"\n priority=\"tertiary\"\n aria-hidden=\"true\"\n data-testid=\"scroll-carousel-right\"\n disabled={scrollIsAtEnd}\n onClick={() => scrollCarousel()}\n >\n <ChevronRight />\n </IconButton>\n </div>\n ) : null}\n </div>\n <div\n ref={carouselElementRef}\n tabIndex={-1}\n role=\"list\"\n className=\"carousel\"\n onScroll={(event) => {\n const target = event.target as HTMLElement;\n setScrollPosition(target.scrollLeft);\n }}\n >\n {cards?.map((card, index) => {\n const sharedProps = {\n id: card.id,\n className: clsx('carousel__card', {\n 'carousel__card--focused': card.id === focusedCard,\n }),\n onClick: () => {\n card.onClick?.();\n onClick?.(card.id);\n },\n onFocus: (event: React.FocusEvent<HTMLAnchorElement | HTMLDivElement>) => {\n scrollCardIntoView(event.currentTarget, card);\n },\n };\n\n const cardContent =\n card.type !== 'promo' ? (\n <div\n id={`${card.id}-content`}\n className={clsx('carousel__card-content', {\n [card.className ?? '']: !!card.className,\n })}\n style={card.styles}\n >\n {card.content}\n </div>\n ) : null;\n\n if (card.type === 'button') {\n return (\n <div key={card.id} aria-labelledby={`${card.id}-content`} role=\"listitem\">\n <div\n {...sharedProps}\n ref={(el) => {\n if (el) {\n // eslint-disable-next-line functional/immutable-data\n carouselCardsRef.current[index] = {\n type: 'default',\n cardElement: el,\n };\n }\n }}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(event) => handleOnKeyDown(event, index)}\n >\n {cardContent}\n </div>\n </div>\n );\n }\n\n if (card.type === 'promo') {\n return (\n <div key={card.id} id={card.id} role=\"listitem\" aria-labelledby={`${card.id}-anchor`}>\n <PromoCard\n {...{ ...card, type: undefined }}\n {...{ ...sharedProps }}\n ref={(el: HTMLDivElement | null) => {\n if (el) {\n addElementToCardsRefArray(index, {\n type: 'promo',\n cardElement: el,\n });\n }\n }}\n anchorRef={(el: HTMLAnchorElement) => {\n if (el) {\n addElementToCardsRefArray(index, {\n type: 'promo',\n anchorElement: el,\n });\n }\n }}\n anchorId={`${card.id}-anchor`}\n onKeyDown={(event) => handleOnKeyDown(event, index)}\n />\n </div>\n );\n }\n\n return (\n <div key={card.id} aria-labelledby={`${card.id}-content`} role=\"listitem\">\n <a\n {...sharedProps}\n ref={(el) => {\n if (el) {\n // eslint-disable-next-line functional/immutable-data\n carouselCardsRef.current[index] = {\n type: 'default',\n cardElement: el,\n };\n }\n }}\n href={card.href}\n target={card.hrefTarget}\n rel=\"noreferrer\"\n onKeyDown={(event) => handleOnKeyDown(event, index)}\n >\n {cardContent}\n </a>\n </div>\n );\n })}\n </div>\n <div className=\"visible-xs\">\n <div className=\"carousel__indicators\">\n {cards?.map((card, index) => (\n <button\n key={`${card.id}-indicator`}\n data-testid={`${card.id}-indicator`}\n tabIndex={-1}\n aria-hidden\n type=\"button\"\n className={clsx('carousel__indicator', {\n 'carousel__indicator--selected': card.id === visibleCardOnMobileView,\n })}\n onClick={() => {\n scrollCardIntoView(carouselCardsRef.current[index].cardElement, card);\n }}\n />\n ))}\n </div>\n </div>\n </div>\n );\n};\n\nconst isVisible = (container: HTMLElement, el: HTMLElement) => {\n const cWidth = container.offsetWidth;\n const cScrollOffset = container.scrollLeft;\n\n const elemLeft = el.offsetLeft - container.offsetLeft;\n const elemRight = elemLeft + el.offsetWidth;\n\n return elemLeft >= cScrollOffset && elemRight <= cScrollOffset + cWidth;\n};\n\nexport default Carousel;\n"],"names":["LEFT_SCROLL_OFFSET","Carousel","header","className","cards","onClick","scrollPosition","setScrollPosition","useState","previousScrollPosition","setPreviousScrollPosition","scrollIsAtEnd","setScrollIsAtEnd","visibleCardOnMobileView","setVisibleCardOnMobileView","carouselElementRef","useRef","carouselCardsRef","isLeftActionButtonEnabled","areActionButtonsEnabled","focusedCard","setFocusedCard","id","updateScrollButtonsState","current","scrollWidth","offsetWidth","scrollAtEnd","scrollDirecton","cardsInFullViewIds","forEach","card","isVisible","cardElement","push","getAttribute","length","visibleCardIndex","visibleCardId","scrollCarousel","direction","cardWidth","res","Math","floor","scrollBy","left","behavior","handleOnKeyDown","event","index","key","nextIndex","nextCard","ref","type","anchorElement","focus","scrollCardIntoView","preventDefault","currentTarget","click","element","scrollIntoView","block","inline","useEffect","window","addEventListener","removeEventListener","addElementToCardsRefArray","_jsxs","clsx","children","_jsx","Title","as","IconButton","size","tabIndex","priority","disabled","ChevronLeft","ChevronRight","role","onScroll","target","scrollLeft","map","sharedProps","onFocus","cardContent","style","styles","content","el","onKeyDown","PromoCard","undefined","anchorRef","anchorId","href","hrefTarget","rel","container","cWidth","cScrollOffset","elemLeft","offsetLeft","elemRight"],"mappings":"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"}
1
+ {"version":3,"file":"Carousel.mjs","sources":["../../src/Carousel/Carousel.tsx"],"sourcesContent":["import { ChevronLeft, ChevronRight } from '@transferwise/icons';\nimport { clsx } from 'clsx';\nimport { type CSSProperties, type ReactNode, useEffect, useRef, useState } from 'react';\n\nimport { useDirection } from '../common/hooks';\nimport IconButton from '../IconButton';\nimport Title from '../Title';\nimport type { PromoCardLinkProps } from '../PromoCard/PromoCard';\nimport PromoCard from '../PromoCard/PromoCard';\n\nexport type CarouselCardCommon = {\n id: string;\n href?: string;\n hrefTarget?: HTMLAnchorElement['target'];\n onClick?: () => void;\n className?: string;\n styles?: CSSProperties;\n};\n\nexport type CarouselDefaultCard = CarouselCardCommon & {\n type: 'anchor' | 'button';\n content: ReactNode;\n};\n\nexport type CarouselPromoCard = CarouselCardCommon & {\n type: 'promo';\n} & Omit<PromoCardLinkProps, 'type'>;\n\nexport type CarouselCard = CarouselDefaultCard | CarouselPromoCard;\nexport interface CarouselProps {\n header: string | ReactNode;\n className?: string;\n cards: CarouselCard[];\n onClick?: (cardId: string) => void;\n}\n\ntype CardsReference = {\n type: 'promo' | 'default';\n cardElement: HTMLDivElement | HTMLAnchorElement;\n anchorElement?: HTMLAnchorElement;\n};\n\nconst LEFT_SCROLL_OFFSET = 8;\n\nconst Carousel: React.FC<CarouselProps> = ({ header, className, cards, onClick }) => {\n const [scrollPosition, setScrollPosition] = useState(0);\n const [previousScrollPosition, setPreviousScrollPosition] = useState(0);\n const [scrollIsAtEnd, setScrollIsAtEnd] = useState(false);\n const [visibleCardOnMobileView, setVisibleCardOnMobileView] = useState<string>('');\n const carouselElementRef = useRef<HTMLDivElement>(null);\n const carouselCardsRef = useRef<CardsReference[]>([]);\n const { isRTL } = useDirection();\n\n const isPrevButtonEnabled = scrollPosition > LEFT_SCROLL_OFFSET;\n\n const areActionButtonsEnabled = isPrevButtonEnabled || !scrollIsAtEnd;\n\n const [focusedCard, setFocusedCard] = useState(cards?.[0]?.id);\n\n const updateScrollButtonsState = () => {\n if (carouselElementRef.current) {\n const { scrollWidth, offsetWidth } = carouselElementRef.current;\n\n const scrollAtEnd = scrollWidth - offsetWidth <= scrollPosition + LEFT_SCROLL_OFFSET;\n setScrollIsAtEnd(scrollAtEnd);\n }\n\n const scrollDirecton = scrollPosition > previousScrollPosition ? 'right' : 'left';\n\n const cardsInFullViewIds: string[] = [];\n carouselCardsRef.current.forEach((card) => {\n if (isVisible(carouselElementRef.current as HTMLElement, card.cardElement as HTMLElement)) {\n // eslint-disable-next-line functional/immutable-data\n cardsInFullViewIds.push(card.cardElement.getAttribute('id') ?? '');\n }\n });\n\n if (cardsInFullViewIds.length >= 1) {\n const visibleCardIndex = scrollDirecton === 'right' ? cardsInFullViewIds.length - 1 : 0;\n const visibleCardId = cardsInFullViewIds[visibleCardIndex];\n setVisibleCardOnMobileView(visibleCardId);\n setFocusedCard(visibleCardId);\n }\n\n setPreviousScrollPosition(scrollPosition);\n };\n\n const scrollCarousel = (direction: 'forward' | 'backward') => {\n if (carouselElementRef.current) {\n const { scrollWidth } = carouselElementRef.current;\n\n const cardWidth = scrollWidth / carouselCardsRef.current.length;\n\n const distance = Math.floor(cardWidth - cardWidth * 0.05);\n const sign = direction === 'forward' ? 1 : -1;\n\n carouselElementRef.current.scrollBy({\n left: isRTL ? -sign * distance : sign * distance,\n behavior: 'smooth',\n });\n }\n };\n\n const handleOnKeyDown = (\n event: React.KeyboardEvent<HTMLAnchorElement | HTMLDivElement>,\n index: number,\n ) => {\n if (event.key === 'ArrowRight' || event.key === 'ArrowLeft') {\n const nextIndex = event.key === 'ArrowRight' ? index + 1 : index - 1;\n const nextCard = cards[nextIndex];\n if (nextCard) {\n const ref = carouselCardsRef.current[nextIndex];\n if (ref.type === 'promo') {\n ref.anchorElement?.focus();\n } else {\n ref.cardElement?.focus();\n }\n\n scrollCardIntoView(carouselCardsRef.current[nextIndex].cardElement, nextCard);\n event.preventDefault();\n }\n }\n\n if (event.key === 'Enter' || event.key === ' ') {\n event.currentTarget.click();\n }\n };\n\n const scrollCardIntoView = (element: HTMLElement, card: CarouselCard) => {\n element.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n\n setFocusedCard(card.id);\n };\n\n useEffect(() => {\n updateScrollButtonsState();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scrollPosition]);\n\n useEffect(() => {\n window.addEventListener('resize', updateScrollButtonsState);\n\n return () => {\n window.removeEventListener('resize', updateScrollButtonsState);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const addElementToCardsRefArray = (index: number, ref: Partial<CardsReference>) => {\n if (ref) {\n // eslint-disable-next-line functional/immutable-data\n carouselCardsRef.current[index] = {\n type: ref.type ?? carouselCardsRef.current?.[index]?.type,\n cardElement: ref.cardElement ?? carouselCardsRef.current?.[index]?.cardElement,\n anchorElement: ref.anchorElement ?? carouselCardsRef.current?.[index]?.anchorElement,\n };\n }\n };\n\n return (\n <div className={clsx('carousel-wrapper', className)}>\n <div className=\"d-flex justify-content-between carousel__header\">\n {typeof header === 'string' ? (\n <Title as=\"span\" type=\"title-body\">\n {header}\n </Title>\n ) : (\n header\n )}\n {areActionButtonsEnabled ? (\n <div className=\"hidden-xs d-inline-flex\">\n <IconButton\n size={32}\n tabIndex={-1}\n priority=\"tertiary\"\n disabled={!isPrevButtonEnabled}\n aria-hidden=\"true\"\n data-testid=\"scroll-carousel-left\"\n onClick={() => scrollCarousel('backward')}\n >\n <ChevronLeft />\n </IconButton>\n <IconButton\n size={32}\n tabIndex={-1}\n className=\"m-l-1\"\n priority=\"tertiary\"\n aria-hidden=\"true\"\n data-testid=\"scroll-carousel-right\"\n disabled={scrollIsAtEnd}\n onClick={() => scrollCarousel('forward')}\n >\n <ChevronRight />\n </IconButton>\n </div>\n ) : null}\n </div>\n <div\n ref={carouselElementRef}\n tabIndex={-1}\n role=\"list\"\n className=\"carousel\"\n onScroll={(event) => {\n const target = event.target as HTMLElement;\n setScrollPosition(Math.abs(target.scrollLeft));\n }}\n >\n {cards?.map((card, index) => {\n const sharedProps = {\n id: card.id,\n className: clsx('carousel__card', {\n 'carousel__card--focused': card.id === focusedCard,\n }),\n onClick: () => {\n card.onClick?.();\n onClick?.(card.id);\n },\n onFocus: (event: React.FocusEvent<HTMLAnchorElement | HTMLDivElement>) => {\n scrollCardIntoView(event.currentTarget, card);\n },\n };\n\n const cardContent =\n card.type !== 'promo' ? (\n <div\n id={`${card.id}-content`}\n className={clsx('carousel__card-content', {\n [card.className ?? '']: !!card.className,\n })}\n style={card.styles}\n >\n {card.content}\n </div>\n ) : null;\n\n if (card.type === 'button') {\n return (\n <div key={card.id} aria-labelledby={`${card.id}-content`} role=\"listitem\">\n <div\n {...sharedProps}\n ref={(el) => {\n if (el) {\n // eslint-disable-next-line functional/immutable-data\n carouselCardsRef.current[index] = {\n type: 'default',\n cardElement: el,\n };\n }\n }}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(event) => handleOnKeyDown(event, index)}\n >\n {cardContent}\n </div>\n </div>\n );\n }\n\n if (card.type === 'promo') {\n return (\n <div key={card.id} id={card.id} role=\"listitem\" aria-labelledby={`${card.id}-anchor`}>\n <PromoCard\n {...{ ...card, type: undefined }}\n {...{ ...sharedProps }}\n ref={(el: HTMLDivElement | null) => {\n if (el) {\n addElementToCardsRefArray(index, {\n type: 'promo',\n cardElement: el,\n });\n }\n }}\n anchorRef={(el: HTMLAnchorElement) => {\n if (el) {\n addElementToCardsRefArray(index, {\n type: 'promo',\n anchorElement: el,\n });\n }\n }}\n anchorId={`${card.id}-anchor`}\n onKeyDown={(event) => handleOnKeyDown(event, index)}\n />\n </div>\n );\n }\n\n return (\n <div key={card.id} aria-labelledby={`${card.id}-content`} role=\"listitem\">\n <a\n {...sharedProps}\n ref={(el) => {\n if (el) {\n // eslint-disable-next-line functional/immutable-data\n carouselCardsRef.current[index] = {\n type: 'default',\n cardElement: el,\n };\n }\n }}\n href={card.href}\n target={card.hrefTarget}\n rel=\"noreferrer\"\n onKeyDown={(event) => handleOnKeyDown(event, index)}\n >\n {cardContent}\n </a>\n </div>\n );\n })}\n </div>\n <div className=\"visible-xs\">\n <div className=\"carousel__indicators\">\n {cards?.map((card, index) => (\n <button\n key={`${card.id}-indicator`}\n data-testid={`${card.id}-indicator`}\n tabIndex={-1}\n aria-hidden\n type=\"button\"\n className={clsx('carousel__indicator', {\n 'carousel__indicator--selected': card.id === visibleCardOnMobileView,\n })}\n onClick={() => {\n scrollCardIntoView(carouselCardsRef.current[index].cardElement, card);\n }}\n />\n ))}\n </div>\n </div>\n </div>\n );\n};\n\nconst isVisible = (container: HTMLElement, el: HTMLElement) => {\n const cWidth = container.offsetWidth;\n const cScrollOffset = Math.abs(container.scrollLeft);\n\n const elemLeft = el.offsetLeft - container.offsetLeft;\n const elemRight = elemLeft + el.offsetWidth;\n\n return elemLeft >= cScrollOffset && elemRight <= cScrollOffset + cWidth;\n};\n\nexport default Carousel;\n"],"names":["LEFT_SCROLL_OFFSET","Carousel","header","className","cards","onClick","scrollPosition","setScrollPosition","useState","previousScrollPosition","setPreviousScrollPosition","scrollIsAtEnd","setScrollIsAtEnd","visibleCardOnMobileView","setVisibleCardOnMobileView","carouselElementRef","useRef","carouselCardsRef","isRTL","useDirection","isPrevButtonEnabled","areActionButtonsEnabled","focusedCard","setFocusedCard","id","updateScrollButtonsState","current","scrollWidth","offsetWidth","scrollAtEnd","scrollDirecton","cardsInFullViewIds","forEach","card","isVisible","cardElement","push","getAttribute","length","visibleCardIndex","visibleCardId","scrollCarousel","direction","cardWidth","distance","Math","floor","sign","scrollBy","left","behavior","handleOnKeyDown","event","index","key","nextIndex","nextCard","ref","type","anchorElement","focus","scrollCardIntoView","preventDefault","currentTarget","click","element","scrollIntoView","block","inline","useEffect","window","addEventListener","removeEventListener","addElementToCardsRefArray","_jsxs","clsx","children","_jsx","Title","as","IconButton","size","tabIndex","priority","disabled","ChevronLeft","ChevronRight","role","onScroll","target","abs","scrollLeft","map","sharedProps","onFocus","cardContent","style","styles","content","el","onKeyDown","PromoCard","undefined","anchorRef","anchorId","href","hrefTarget","rel","container","cWidth","cScrollOffset","elemLeft","offsetLeft","elemRight"],"mappings":"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"}
@@ -29,6 +29,8 @@ require('@transferwise/icons');
29
29
  require('react-intl');
30
30
  require('../common/CloseButton/CloseButton.messages.js');
31
31
  var jsxRuntime = require('react/jsx-runtime');
32
+ require('@transferwise/neptune-validation');
33
+ var useDirection = require('../common/hooks/useDirection/useDirection.js');
32
34
 
33
35
  const SegmentedControl = ({
34
36
  name,
@@ -39,6 +41,9 @@ const SegmentedControl = ({
39
41
  }) => {
40
42
  const isMountedRef = React.useRef(false);
41
43
  const [animate, setAnimate] = React.useState(false);
44
+ const {
45
+ isRTL
46
+ } = useDirection.useDirection();
42
47
  const segmentsRef = React.useRef(null);
43
48
  if (segments.length > 3) {
44
49
  throw new Error('SegmentedControl only supports up to 3 segments. Please refer to: https://docs.wise.design/components/segmented-control');
@@ -56,8 +61,10 @@ const SegmentedControl = ({
56
61
  const {
57
62
  style
58
63
  } = segmentsRef.current;
59
- style.setProperty('--segment-highlight-width', `${selectedSegmentRef.current.offsetWidth}px`);
60
- style.setProperty('--segment-highlight-x', `${selectedSegmentRef.current.offsetLeft}px`);
64
+ const segment = selectedSegmentRef.current;
65
+ const inlineOffset = isRTL ? segmentsRef.current.offsetWidth - segment.offsetLeft - segment.offsetWidth : segment.offsetLeft;
66
+ style.setProperty('--segment-highlight-width', `${segment.offsetWidth}px`);
67
+ style.setProperty('--segment-highlight-x', `${inlineOffset}px`);
61
68
  }
62
69
  };
63
70
  React.useEffect(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"SegmentedControl.js","sources":["../../src/SegmentedControl/SegmentedControl.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport { createRef, useEffect, useRef, useState } from 'react';\n\nimport Body from '../Body';\nimport { Typography } from '../common';\n\ntype SegmentBase = { id: string; label: string; value: string };\n\ntype Segment = SegmentBase & { controls?: never };\ntype SegmentWithControls = SegmentBase & { controls: string };\n\nexport type Segments = readonly Segment[] | readonly SegmentWithControls[];\n\ntype SegmentedControlPropsBase = {\n name: string;\n value: string;\n mode: 'input' | 'view';\n onChange: (value: string) => void;\n};\n\ntype SegmentedControlViewProps = {\n mode: 'view';\n segments: readonly SegmentWithControls[];\n};\n\ntype SegmentedControlInputProps = {\n mode: 'input';\n segments: readonly Segment[];\n};\n\nexport type SegmentedControlProps = SegmentedControlPropsBase &\n (SegmentedControlViewProps | SegmentedControlInputProps);\n\nconst SegmentedControl = ({\n name,\n value,\n mode = 'input',\n segments,\n onChange,\n}: SegmentedControlProps) => {\n const isMountedRef = useRef(false);\n const [animate, setAnimate] = useState(false);\n\n const segmentsRef = useRef<HTMLDivElement>(null);\n\n if (segments.length > 3) {\n throw new Error(\n 'SegmentedControl only supports up to 3 segments. Please refer to: https://docs.wise.design/components/segmented-control',\n );\n }\n\n const segmentsWithRefs = segments.map((segment) => ({\n ...segment,\n ref: createRef<HTMLLabelElement | HTMLButtonElement>(),\n }));\n\n const updateSegmentPosition = () => {\n const selectedSegmentRef = segmentsWithRefs.find((segment) => segment.value === value)?.ref;\n\n // We grab the active segments style object from the ref\n // and set the css variables to the selected segments width and x position.\n // This is so we can animate the highlight to the selected segment\n if (selectedSegmentRef?.current && segmentsRef.current) {\n const { style } = segmentsRef.current;\n style.setProperty('--segment-highlight-width', `${selectedSegmentRef.current.offsetWidth}px`);\n style.setProperty('--segment-highlight-x', `${selectedSegmentRef.current.offsetLeft}px`);\n }\n };\n\n useEffect(() => {\n if (isMountedRef.current) {\n setAnimate(true);\n } else {\n isMountedRef.current = true;\n }\n\n updateSegmentPosition();\n\n const handleWindowSizeChange = () => {\n setAnimate(false);\n updateSegmentPosition();\n };\n\n window.addEventListener('resize', handleWindowSizeChange);\n return () => {\n window.removeEventListener('resize', handleWindowSizeChange);\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [segmentsWithRefs, value]);\n\n return (\n <div\n ref={segmentsRef}\n data-testid=\"segmented-control\"\n className={clsx('segmented-control', {\n 'segmented-control--input': mode === 'input',\n })}\n >\n <div\n className={clsx('segmented-control__segments', {\n 'segmented-control__segments--no-animate': !animate,\n })}\n role={mode !== 'input' ? 'tablist' : undefined}\n >\n {segmentsWithRefs.map((segment) => {\n const onSelect = () => {\n setAnimate(true);\n onChange(segment.value);\n };\n return mode === 'input' ? (\n <label\n ref={segment.ref as React.MutableRefObject<HTMLLabelElement | null>}\n key={segment.id}\n htmlFor={segment.id}\n className={clsx('segmented-control__segment', {\n 'segmented-control__selected-segment': value === segment.value,\n })}\n >\n <input\n type=\"radio\"\n className=\"segmented-control__radio-input\"\n id={segment.id}\n name={name}\n value={segment.value}\n checked={value === segment.value}\n onChange={onSelect}\n />\n <Body\n className=\"segmented-control__text\"\n as=\"span\"\n type={\n value === segment.value ? Typography.BODY_DEFAULT_BOLD : Typography.BODY_DEFAULT\n }\n >\n {segment.label}\n </Body>\n </label>\n ) : (\n <button\n ref={segment.ref as React.MutableRefObject<HTMLButtonElement | null>}\n key={segment.id}\n type=\"button\"\n role=\"tab\"\n id={segment.id}\n aria-controls={segment.controls}\n aria-selected={value === segment.value}\n className={clsx('segmented-control__segment', 'segmented-control__button', {\n 'segmented-control__selected-segment': value === segment.value,\n })}\n onClick={onSelect}\n >\n <Body\n as=\"span\"\n className=\"segmented-control__text\"\n type={\n value === segment.value ? Typography.BODY_DEFAULT_BOLD : Typography.BODY_DEFAULT\n }\n >\n {segment.label}\n </Body>\n </button>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default SegmentedControl;\n"],"names":["SegmentedControl","name","value","mode","segments","onChange","isMountedRef","useRef","animate","setAnimate","useState","segmentsRef","length","Error","segmentsWithRefs","map","segment","ref","createRef","updateSegmentPosition","selectedSegmentRef","find","current","style","setProperty","offsetWidth","offsetLeft","useEffect","handleWindowSizeChange","window","addEventListener","removeEventListener","_jsx","className","clsx","children","role","undefined","onSelect","_jsxs","htmlFor","id","type","checked","Body","as","Typography","BODY_DEFAULT_BOLD","BODY_DEFAULT","label","controls","onClick"],"mappings":"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"}
1
+ {"version":3,"file":"SegmentedControl.js","sources":["../../src/SegmentedControl/SegmentedControl.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport { createRef, useEffect, useRef, useState } from 'react';\n\nimport Body from '../Body';\nimport { Typography } from '../common';\nimport { useDirection } from '../common/hooks';\n\ntype SegmentBase = { id: string; label: string; value: string };\n\ntype Segment = SegmentBase & { controls?: never };\ntype SegmentWithControls = SegmentBase & { controls: string };\n\nexport type Segments = readonly Segment[] | readonly SegmentWithControls[];\n\ntype SegmentedControlPropsBase = {\n name: string;\n value: string;\n mode: 'input' | 'view';\n onChange: (value: string) => void;\n};\n\ntype SegmentedControlViewProps = {\n mode: 'view';\n segments: readonly SegmentWithControls[];\n};\n\ntype SegmentedControlInputProps = {\n mode: 'input';\n segments: readonly Segment[];\n};\n\nexport type SegmentedControlProps = SegmentedControlPropsBase &\n (SegmentedControlViewProps | SegmentedControlInputProps);\n\nconst SegmentedControl = ({\n name,\n value,\n mode = 'input',\n segments,\n onChange,\n}: SegmentedControlProps) => {\n const isMountedRef = useRef(false);\n const [animate, setAnimate] = useState(false);\n const { isRTL } = useDirection();\n\n const segmentsRef = useRef<HTMLDivElement>(null);\n\n if (segments.length > 3) {\n throw new Error(\n 'SegmentedControl only supports up to 3 segments. Please refer to: https://docs.wise.design/components/segmented-control',\n );\n }\n\n const segmentsWithRefs = segments.map((segment) => ({\n ...segment,\n ref: createRef<HTMLLabelElement | HTMLButtonElement>(),\n }));\n\n const updateSegmentPosition = () => {\n const selectedSegmentRef = segmentsWithRefs.find((segment) => segment.value === value)?.ref;\n\n // We grab the active segments style object from the ref\n // and set the css variables to the selected segments width and x position.\n // This is so we can animate the highlight to the selected segment\n if (selectedSegmentRef?.current && segmentsRef.current) {\n const { style } = segmentsRef.current;\n const segment = selectedSegmentRef.current;\n const inlineOffset = isRTL\n ? segmentsRef.current.offsetWidth - segment.offsetLeft - segment.offsetWidth\n : segment.offsetLeft;\n style.setProperty('--segment-highlight-width', `${segment.offsetWidth}px`);\n style.setProperty('--segment-highlight-x', `${inlineOffset}px`);\n }\n };\n\n useEffect(() => {\n if (isMountedRef.current) {\n setAnimate(true);\n } else {\n isMountedRef.current = true;\n }\n\n updateSegmentPosition();\n\n const handleWindowSizeChange = () => {\n setAnimate(false);\n updateSegmentPosition();\n };\n\n window.addEventListener('resize', handleWindowSizeChange);\n return () => {\n window.removeEventListener('resize', handleWindowSizeChange);\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [segmentsWithRefs, value]);\n\n return (\n <div\n ref={segmentsRef}\n data-testid=\"segmented-control\"\n className={clsx('segmented-control', {\n 'segmented-control--input': mode === 'input',\n })}\n >\n <div\n className={clsx('segmented-control__segments', {\n 'segmented-control__segments--no-animate': !animate,\n })}\n role={mode !== 'input' ? 'tablist' : undefined}\n >\n {segmentsWithRefs.map((segment) => {\n const onSelect = () => {\n setAnimate(true);\n onChange(segment.value);\n };\n return mode === 'input' ? (\n <label\n ref={segment.ref as React.MutableRefObject<HTMLLabelElement | null>}\n key={segment.id}\n htmlFor={segment.id}\n className={clsx('segmented-control__segment', {\n 'segmented-control__selected-segment': value === segment.value,\n })}\n >\n <input\n type=\"radio\"\n className=\"segmented-control__radio-input\"\n id={segment.id}\n name={name}\n value={segment.value}\n checked={value === segment.value}\n onChange={onSelect}\n />\n <Body\n className=\"segmented-control__text\"\n as=\"span\"\n type={\n value === segment.value ? Typography.BODY_DEFAULT_BOLD : Typography.BODY_DEFAULT\n }\n >\n {segment.label}\n </Body>\n </label>\n ) : (\n <button\n ref={segment.ref as React.MutableRefObject<HTMLButtonElement | null>}\n key={segment.id}\n type=\"button\"\n role=\"tab\"\n id={segment.id}\n aria-controls={segment.controls}\n aria-selected={value === segment.value}\n className={clsx('segmented-control__segment', 'segmented-control__button', {\n 'segmented-control__selected-segment': value === segment.value,\n })}\n onClick={onSelect}\n >\n <Body\n as=\"span\"\n className=\"segmented-control__text\"\n type={\n value === segment.value ? Typography.BODY_DEFAULT_BOLD : Typography.BODY_DEFAULT\n }\n >\n {segment.label}\n </Body>\n </button>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default SegmentedControl;\n"],"names":["SegmentedControl","name","value","mode","segments","onChange","isMountedRef","useRef","animate","setAnimate","useState","isRTL","useDirection","segmentsRef","length","Error","segmentsWithRefs","map","segment","ref","createRef","updateSegmentPosition","selectedSegmentRef","find","current","style","inlineOffset","offsetWidth","offsetLeft","setProperty","useEffect","handleWindowSizeChange","window","addEventListener","removeEventListener","_jsx","className","clsx","children","role","undefined","onSelect","_jsxs","htmlFor","id","type","checked","Body","as","Typography","BODY_DEFAULT_BOLD","BODY_DEFAULT","label","controls","onClick"],"mappings":"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"}
@@ -25,6 +25,8 @@ import '@transferwise/icons';
25
25
  import 'react-intl';
26
26
  import '../common/CloseButton/CloseButton.messages.mjs';
27
27
  import { jsx, jsxs } from 'react/jsx-runtime';
28
+ import '@transferwise/neptune-validation';
29
+ import { useDirection } from '../common/hooks/useDirection/useDirection.mjs';
28
30
 
29
31
  const SegmentedControl = ({
30
32
  name,
@@ -35,6 +37,9 @@ const SegmentedControl = ({
35
37
  }) => {
36
38
  const isMountedRef = useRef(false);
37
39
  const [animate, setAnimate] = useState(false);
40
+ const {
41
+ isRTL
42
+ } = useDirection();
38
43
  const segmentsRef = useRef(null);
39
44
  if (segments.length > 3) {
40
45
  throw new Error('SegmentedControl only supports up to 3 segments. Please refer to: https://docs.wise.design/components/segmented-control');
@@ -52,8 +57,10 @@ const SegmentedControl = ({
52
57
  const {
53
58
  style
54
59
  } = segmentsRef.current;
55
- style.setProperty('--segment-highlight-width', `${selectedSegmentRef.current.offsetWidth}px`);
56
- style.setProperty('--segment-highlight-x', `${selectedSegmentRef.current.offsetLeft}px`);
60
+ const segment = selectedSegmentRef.current;
61
+ const inlineOffset = isRTL ? segmentsRef.current.offsetWidth - segment.offsetLeft - segment.offsetWidth : segment.offsetLeft;
62
+ style.setProperty('--segment-highlight-width', `${segment.offsetWidth}px`);
63
+ style.setProperty('--segment-highlight-x', `${inlineOffset}px`);
57
64
  }
58
65
  };
59
66
  useEffect(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"SegmentedControl.mjs","sources":["../../src/SegmentedControl/SegmentedControl.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport { createRef, useEffect, useRef, useState } from 'react';\n\nimport Body from '../Body';\nimport { Typography } from '../common';\n\ntype SegmentBase = { id: string; label: string; value: string };\n\ntype Segment = SegmentBase & { controls?: never };\ntype SegmentWithControls = SegmentBase & { controls: string };\n\nexport type Segments = readonly Segment[] | readonly SegmentWithControls[];\n\ntype SegmentedControlPropsBase = {\n name: string;\n value: string;\n mode: 'input' | 'view';\n onChange: (value: string) => void;\n};\n\ntype SegmentedControlViewProps = {\n mode: 'view';\n segments: readonly SegmentWithControls[];\n};\n\ntype SegmentedControlInputProps = {\n mode: 'input';\n segments: readonly Segment[];\n};\n\nexport type SegmentedControlProps = SegmentedControlPropsBase &\n (SegmentedControlViewProps | SegmentedControlInputProps);\n\nconst SegmentedControl = ({\n name,\n value,\n mode = 'input',\n segments,\n onChange,\n}: SegmentedControlProps) => {\n const isMountedRef = useRef(false);\n const [animate, setAnimate] = useState(false);\n\n const segmentsRef = useRef<HTMLDivElement>(null);\n\n if (segments.length > 3) {\n throw new Error(\n 'SegmentedControl only supports up to 3 segments. Please refer to: https://docs.wise.design/components/segmented-control',\n );\n }\n\n const segmentsWithRefs = segments.map((segment) => ({\n ...segment,\n ref: createRef<HTMLLabelElement | HTMLButtonElement>(),\n }));\n\n const updateSegmentPosition = () => {\n const selectedSegmentRef = segmentsWithRefs.find((segment) => segment.value === value)?.ref;\n\n // We grab the active segments style object from the ref\n // and set the css variables to the selected segments width and x position.\n // This is so we can animate the highlight to the selected segment\n if (selectedSegmentRef?.current && segmentsRef.current) {\n const { style } = segmentsRef.current;\n style.setProperty('--segment-highlight-width', `${selectedSegmentRef.current.offsetWidth}px`);\n style.setProperty('--segment-highlight-x', `${selectedSegmentRef.current.offsetLeft}px`);\n }\n };\n\n useEffect(() => {\n if (isMountedRef.current) {\n setAnimate(true);\n } else {\n isMountedRef.current = true;\n }\n\n updateSegmentPosition();\n\n const handleWindowSizeChange = () => {\n setAnimate(false);\n updateSegmentPosition();\n };\n\n window.addEventListener('resize', handleWindowSizeChange);\n return () => {\n window.removeEventListener('resize', handleWindowSizeChange);\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [segmentsWithRefs, value]);\n\n return (\n <div\n ref={segmentsRef}\n data-testid=\"segmented-control\"\n className={clsx('segmented-control', {\n 'segmented-control--input': mode === 'input',\n })}\n >\n <div\n className={clsx('segmented-control__segments', {\n 'segmented-control__segments--no-animate': !animate,\n })}\n role={mode !== 'input' ? 'tablist' : undefined}\n >\n {segmentsWithRefs.map((segment) => {\n const onSelect = () => {\n setAnimate(true);\n onChange(segment.value);\n };\n return mode === 'input' ? (\n <label\n ref={segment.ref as React.MutableRefObject<HTMLLabelElement | null>}\n key={segment.id}\n htmlFor={segment.id}\n className={clsx('segmented-control__segment', {\n 'segmented-control__selected-segment': value === segment.value,\n })}\n >\n <input\n type=\"radio\"\n className=\"segmented-control__radio-input\"\n id={segment.id}\n name={name}\n value={segment.value}\n checked={value === segment.value}\n onChange={onSelect}\n />\n <Body\n className=\"segmented-control__text\"\n as=\"span\"\n type={\n value === segment.value ? Typography.BODY_DEFAULT_BOLD : Typography.BODY_DEFAULT\n }\n >\n {segment.label}\n </Body>\n </label>\n ) : (\n <button\n ref={segment.ref as React.MutableRefObject<HTMLButtonElement | null>}\n key={segment.id}\n type=\"button\"\n role=\"tab\"\n id={segment.id}\n aria-controls={segment.controls}\n aria-selected={value === segment.value}\n className={clsx('segmented-control__segment', 'segmented-control__button', {\n 'segmented-control__selected-segment': value === segment.value,\n })}\n onClick={onSelect}\n >\n <Body\n as=\"span\"\n className=\"segmented-control__text\"\n type={\n value === segment.value ? Typography.BODY_DEFAULT_BOLD : Typography.BODY_DEFAULT\n }\n >\n {segment.label}\n </Body>\n </button>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default SegmentedControl;\n"],"names":["SegmentedControl","name","value","mode","segments","onChange","isMountedRef","useRef","animate","setAnimate","useState","segmentsRef","length","Error","segmentsWithRefs","map","segment","ref","createRef","updateSegmentPosition","selectedSegmentRef","find","current","style","setProperty","offsetWidth","offsetLeft","useEffect","handleWindowSizeChange","window","addEventListener","removeEventListener","_jsx","className","clsx","children","role","undefined","onSelect","_jsxs","htmlFor","id","type","checked","Body","as","Typography","BODY_DEFAULT_BOLD","BODY_DEFAULT","label","controls","onClick"],"mappings":"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"}
1
+ {"version":3,"file":"SegmentedControl.mjs","sources":["../../src/SegmentedControl/SegmentedControl.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport { createRef, useEffect, useRef, useState } from 'react';\n\nimport Body from '../Body';\nimport { Typography } from '../common';\nimport { useDirection } from '../common/hooks';\n\ntype SegmentBase = { id: string; label: string; value: string };\n\ntype Segment = SegmentBase & { controls?: never };\ntype SegmentWithControls = SegmentBase & { controls: string };\n\nexport type Segments = readonly Segment[] | readonly SegmentWithControls[];\n\ntype SegmentedControlPropsBase = {\n name: string;\n value: string;\n mode: 'input' | 'view';\n onChange: (value: string) => void;\n};\n\ntype SegmentedControlViewProps = {\n mode: 'view';\n segments: readonly SegmentWithControls[];\n};\n\ntype SegmentedControlInputProps = {\n mode: 'input';\n segments: readonly Segment[];\n};\n\nexport type SegmentedControlProps = SegmentedControlPropsBase &\n (SegmentedControlViewProps | SegmentedControlInputProps);\n\nconst SegmentedControl = ({\n name,\n value,\n mode = 'input',\n segments,\n onChange,\n}: SegmentedControlProps) => {\n const isMountedRef = useRef(false);\n const [animate, setAnimate] = useState(false);\n const { isRTL } = useDirection();\n\n const segmentsRef = useRef<HTMLDivElement>(null);\n\n if (segments.length > 3) {\n throw new Error(\n 'SegmentedControl only supports up to 3 segments. Please refer to: https://docs.wise.design/components/segmented-control',\n );\n }\n\n const segmentsWithRefs = segments.map((segment) => ({\n ...segment,\n ref: createRef<HTMLLabelElement | HTMLButtonElement>(),\n }));\n\n const updateSegmentPosition = () => {\n const selectedSegmentRef = segmentsWithRefs.find((segment) => segment.value === value)?.ref;\n\n // We grab the active segments style object from the ref\n // and set the css variables to the selected segments width and x position.\n // This is so we can animate the highlight to the selected segment\n if (selectedSegmentRef?.current && segmentsRef.current) {\n const { style } = segmentsRef.current;\n const segment = selectedSegmentRef.current;\n const inlineOffset = isRTL\n ? segmentsRef.current.offsetWidth - segment.offsetLeft - segment.offsetWidth\n : segment.offsetLeft;\n style.setProperty('--segment-highlight-width', `${segment.offsetWidth}px`);\n style.setProperty('--segment-highlight-x', `${inlineOffset}px`);\n }\n };\n\n useEffect(() => {\n if (isMountedRef.current) {\n setAnimate(true);\n } else {\n isMountedRef.current = true;\n }\n\n updateSegmentPosition();\n\n const handleWindowSizeChange = () => {\n setAnimate(false);\n updateSegmentPosition();\n };\n\n window.addEventListener('resize', handleWindowSizeChange);\n return () => {\n window.removeEventListener('resize', handleWindowSizeChange);\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [segmentsWithRefs, value]);\n\n return (\n <div\n ref={segmentsRef}\n data-testid=\"segmented-control\"\n className={clsx('segmented-control', {\n 'segmented-control--input': mode === 'input',\n })}\n >\n <div\n className={clsx('segmented-control__segments', {\n 'segmented-control__segments--no-animate': !animate,\n })}\n role={mode !== 'input' ? 'tablist' : undefined}\n >\n {segmentsWithRefs.map((segment) => {\n const onSelect = () => {\n setAnimate(true);\n onChange(segment.value);\n };\n return mode === 'input' ? (\n <label\n ref={segment.ref as React.MutableRefObject<HTMLLabelElement | null>}\n key={segment.id}\n htmlFor={segment.id}\n className={clsx('segmented-control__segment', {\n 'segmented-control__selected-segment': value === segment.value,\n })}\n >\n <input\n type=\"radio\"\n className=\"segmented-control__radio-input\"\n id={segment.id}\n name={name}\n value={segment.value}\n checked={value === segment.value}\n onChange={onSelect}\n />\n <Body\n className=\"segmented-control__text\"\n as=\"span\"\n type={\n value === segment.value ? Typography.BODY_DEFAULT_BOLD : Typography.BODY_DEFAULT\n }\n >\n {segment.label}\n </Body>\n </label>\n ) : (\n <button\n ref={segment.ref as React.MutableRefObject<HTMLButtonElement | null>}\n key={segment.id}\n type=\"button\"\n role=\"tab\"\n id={segment.id}\n aria-controls={segment.controls}\n aria-selected={value === segment.value}\n className={clsx('segmented-control__segment', 'segmented-control__button', {\n 'segmented-control__selected-segment': value === segment.value,\n })}\n onClick={onSelect}\n >\n <Body\n as=\"span\"\n className=\"segmented-control__text\"\n type={\n value === segment.value ? Typography.BODY_DEFAULT_BOLD : Typography.BODY_DEFAULT\n }\n >\n {segment.label}\n </Body>\n </button>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default SegmentedControl;\n"],"names":["SegmentedControl","name","value","mode","segments","onChange","isMountedRef","useRef","animate","setAnimate","useState","isRTL","useDirection","segmentsRef","length","Error","segmentsWithRefs","map","segment","ref","createRef","updateSegmentPosition","selectedSegmentRef","find","current","style","inlineOffset","offsetWidth","offsetLeft","setProperty","useEffect","handleWindowSizeChange","window","addEventListener","removeEventListener","_jsx","className","clsx","children","role","undefined","onSelect","_jsxs","htmlFor","id","type","checked","Body","as","Typography","BODY_DEFAULT_BOLD","BODY_DEFAULT","label","controls","onClick"],"mappings":"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"}
@@ -29,6 +29,7 @@ require('@transferwise/icons');
29
29
  require('react-intl');
30
30
  require('../common/CloseButton/CloseButton.messages.js');
31
31
  var jsxRuntime = require('react/jsx-runtime');
32
+ var useDirection = require('../common/hooks/useDirection/useDirection.js');
32
33
 
33
34
  const Tooltip = ({
34
35
  position: position$1 = position.Position.TOP,
@@ -39,6 +40,10 @@ const Tooltip = ({
39
40
  }) => {
40
41
  const [open, setOpen] = React.useState(false);
41
42
  const arrowRef = React.useRef(null);
43
+ const {
44
+ isRTL
45
+ } = useDirection.useDirection();
46
+ const resolvedPosition = isRTL ? position$1 === 'left' ? 'right' : position$1 === 'right' ? 'left' : position$1 : position$1;
42
47
  const fallbackId = React.useId();
43
48
  const tooltipId = id ?? fallbackId;
44
49
  const {
@@ -47,7 +52,7 @@ const Tooltip = ({
47
52
  placement,
48
53
  middlewareData
49
54
  } = react.useFloating({
50
- placement: position$1,
55
+ placement: resolvedPosition,
51
56
  middleware: [react.offset(16), react.flip({
52
57
  fallbackPlacements: [position.Position.TOP]
53
58
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.js","sources":["../../src/Tooltip/Tooltip.tsx"],"sourcesContent":["import {\n arrow as arrowMiddleware,\n autoUpdate,\n flip,\n offset,\n useFloating,\n} from '@floating-ui/react';\nimport { clsx } from 'clsx';\nimport {\n AriaAttributes,\n CSSProperties,\n PropsWithChildren,\n ReactElement,\n ReactNode,\n cloneElement,\n useId,\n useRef,\n useState,\n} from 'react';\n\nimport { CommonProps, Position } from '../common';\nimport {\n PositionBottom,\n PositionLeft,\n PositionRight,\n PositionTop,\n} from '../common/PropsValues/position';\n\nexport type TooltipProps = PropsWithChildren<{\n position?: PositionTop | PositionRight | PositionBottom | PositionLeft;\n label: ReactNode;\n id?: string;\n}> &\n CommonProps;\n\nconst Tooltip = ({\n position = Position.TOP,\n children = undefined,\n label,\n id,\n className,\n}: TooltipProps) => {\n const [open, setOpen] = useState(false);\n const arrowRef = useRef<HTMLDivElement | null>(null);\n\n const fallbackId = useId();\n const tooltipId = id ?? fallbackId;\n\n const { refs, floatingStyles, placement, middlewareData } = useFloating({\n placement: position,\n middleware: [\n offset(16),\n flip({ fallbackPlacements: [Position.TOP] }),\n // eslint-disable-next-line react-hooks/refs -- arrowRef is passed to floating-ui middleware, legitimate API usage\n arrowMiddleware({ element: arrowRef, padding: 8 }),\n ],\n whileElementsMounted: open ? autoUpdate : undefined,\n open,\n });\n\n const arrowStyle: CSSProperties = {\n ...(middlewareData.arrow?.x != null ? { left: middlewareData.arrow.x } : {}),\n ...(middlewareData.arrow?.y != null ? { top: middlewareData.arrow.y } : {}),\n };\n\n return (\n /* eslint-disable react-hooks/refs -- setReference and setFloating are callback refs from floating-ui, safe to pass during render */\n <span\n ref={refs.setReference}\n className=\"tw-tooltip-container\"\n onMouseOver={() => setOpen(true)}\n onFocus={() => setOpen(true)}\n onMouseOut={() => setOpen(false)}\n onBlur={() => setOpen(false)}\n >\n {children\n ? cloneElement(children as ReactElement<Pick<AriaAttributes, 'aria-describedby'>>, {\n 'aria-describedby': `${tooltipId}-tooltip`,\n })\n : null}\n <div\n ref={refs.setFloating}\n className={clsx(\n 'np-tooltip',\n 'np-panel',\n open ? `np-panel--open np-tooltip--open` : null,\n className,\n )}\n style={floatingStyles}\n data-popper-placement={placement}\n aria-hidden={!open}\n role=\"tooltip\"\n id={`${tooltipId}-tooltip`}\n >\n <div className=\"np-panel__content tooltip-inner\">\n {label}\n <div ref={arrowRef} className={clsx('np-panel__arrow')} style={arrowStyle} />\n </div>\n </div>\n </span>\n /* eslint-enable react-hooks/refs */\n );\n};\n\nexport default Tooltip;\n"],"names":["Tooltip","position","Position","TOP","children","undefined","label","id","className","open","setOpen","useState","arrowRef","useRef","fallbackId","useId","tooltipId","refs","floatingStyles","placement","middlewareData","useFloating","middleware","offset","flip","fallbackPlacements","arrowMiddleware","element","padding","whileElementsMounted","autoUpdate","arrowStyle","arrow","x","left","y","top","_jsxs","ref","setReference","onMouseOver","onFocus","onMouseOut","onBlur","cloneElement","_jsx","setFloating","clsx","style","role"],"mappings":"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"}
1
+ {"version":3,"file":"Tooltip.js","sources":["../../src/Tooltip/Tooltip.tsx"],"sourcesContent":["import {\n arrow as arrowMiddleware,\n autoUpdate,\n flip,\n offset,\n useFloating,\n} from '@floating-ui/react';\nimport { clsx } from 'clsx';\nimport {\n AriaAttributes,\n CSSProperties,\n PropsWithChildren,\n ReactElement,\n ReactNode,\n cloneElement,\n useId,\n useRef,\n useState,\n} from 'react';\n\nimport { CommonProps, Position } from '../common';\nimport useDirection from '../common/hooks/useDirection';\nimport {\n PositionBottom,\n PositionLeft,\n PositionRight,\n PositionTop,\n} from '../common/PropsValues/position';\n\nexport type TooltipProps = PropsWithChildren<{\n position?: PositionTop | PositionRight | PositionBottom | PositionLeft;\n label: ReactNode;\n id?: string;\n}> &\n CommonProps;\n\nconst Tooltip = ({\n position = Position.TOP,\n children = undefined,\n label,\n id,\n className,\n}: TooltipProps) => {\n const [open, setOpen] = useState(false);\n const arrowRef = useRef<HTMLDivElement | null>(null);\n const { isRTL } = useDirection();\n\n const resolvedPosition = isRTL\n ? position === 'left'\n ? 'right'\n : position === 'right'\n ? 'left'\n : position\n : position;\n\n const fallbackId = useId();\n const tooltipId = id ?? fallbackId;\n\n const { refs, floatingStyles, placement, middlewareData } = useFloating({\n placement: resolvedPosition,\n middleware: [\n offset(16),\n flip({ fallbackPlacements: [Position.TOP] }),\n // eslint-disable-next-line react-hooks/refs -- arrowRef is passed to floating-ui middleware, legitimate API usage\n arrowMiddleware({ element: arrowRef, padding: 8 }),\n ],\n whileElementsMounted: open ? autoUpdate : undefined,\n open,\n });\n\n const arrowStyle: CSSProperties = {\n ...(middlewareData.arrow?.x != null ? { left: middlewareData.arrow.x } : {}),\n ...(middlewareData.arrow?.y != null ? { top: middlewareData.arrow.y } : {}),\n };\n\n return (\n /* eslint-disable react-hooks/refs -- setReference and setFloating are callback refs from floating-ui, safe to pass during render */\n <span\n ref={refs.setReference}\n className=\"tw-tooltip-container\"\n onMouseOver={() => setOpen(true)}\n onFocus={() => setOpen(true)}\n onMouseOut={() => setOpen(false)}\n onBlur={() => setOpen(false)}\n >\n {children\n ? cloneElement(children as ReactElement<Pick<AriaAttributes, 'aria-describedby'>>, {\n 'aria-describedby': `${tooltipId}-tooltip`,\n })\n : null}\n <div\n ref={refs.setFloating}\n className={clsx(\n 'np-tooltip',\n 'np-panel',\n open ? `np-panel--open np-tooltip--open` : null,\n className,\n )}\n style={floatingStyles}\n data-popper-placement={placement}\n aria-hidden={!open}\n role=\"tooltip\"\n id={`${tooltipId}-tooltip`}\n >\n <div className=\"np-panel__content tooltip-inner\">\n {label}\n <div ref={arrowRef} className={clsx('np-panel__arrow')} style={arrowStyle} />\n </div>\n </div>\n </span>\n /* eslint-enable react-hooks/refs */\n );\n};\n\nexport default Tooltip;\n"],"names":["Tooltip","position","Position","TOP","children","undefined","label","id","className","open","setOpen","useState","arrowRef","useRef","isRTL","useDirection","resolvedPosition","fallbackId","useId","tooltipId","refs","floatingStyles","placement","middlewareData","useFloating","middleware","offset","flip","fallbackPlacements","arrowMiddleware","element","padding","whileElementsMounted","autoUpdate","arrowStyle","arrow","x","left","y","top","_jsxs","ref","setReference","onMouseOver","onFocus","onMouseOut","onBlur","cloneElement","_jsx","setFloating","clsx","style","role"],"mappings":"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"}
@@ -25,6 +25,7 @@ import '@transferwise/icons';
25
25
  import 'react-intl';
26
26
  import '../common/CloseButton/CloseButton.messages.mjs';
27
27
  import { jsxs, jsx } from 'react/jsx-runtime';
28
+ import { useDirection } from '../common/hooks/useDirection/useDirection.mjs';
28
29
 
29
30
  const Tooltip = ({
30
31
  position = Position.TOP,
@@ -35,6 +36,10 @@ const Tooltip = ({
35
36
  }) => {
36
37
  const [open, setOpen] = useState(false);
37
38
  const arrowRef = useRef(null);
39
+ const {
40
+ isRTL
41
+ } = useDirection();
42
+ const resolvedPosition = isRTL ? position === 'left' ? 'right' : position === 'right' ? 'left' : position : position;
38
43
  const fallbackId = useId();
39
44
  const tooltipId = id ?? fallbackId;
40
45
  const {
@@ -43,7 +48,7 @@ const Tooltip = ({
43
48
  placement,
44
49
  middlewareData
45
50
  } = useFloating({
46
- placement: position,
51
+ placement: resolvedPosition,
47
52
  middleware: [offset(16), flip({
48
53
  fallbackPlacements: [Position.TOP]
49
54
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.mjs","sources":["../../src/Tooltip/Tooltip.tsx"],"sourcesContent":["import {\n arrow as arrowMiddleware,\n autoUpdate,\n flip,\n offset,\n useFloating,\n} from '@floating-ui/react';\nimport { clsx } from 'clsx';\nimport {\n AriaAttributes,\n CSSProperties,\n PropsWithChildren,\n ReactElement,\n ReactNode,\n cloneElement,\n useId,\n useRef,\n useState,\n} from 'react';\n\nimport { CommonProps, Position } from '../common';\nimport {\n PositionBottom,\n PositionLeft,\n PositionRight,\n PositionTop,\n} from '../common/PropsValues/position';\n\nexport type TooltipProps = PropsWithChildren<{\n position?: PositionTop | PositionRight | PositionBottom | PositionLeft;\n label: ReactNode;\n id?: string;\n}> &\n CommonProps;\n\nconst Tooltip = ({\n position = Position.TOP,\n children = undefined,\n label,\n id,\n className,\n}: TooltipProps) => {\n const [open, setOpen] = useState(false);\n const arrowRef = useRef<HTMLDivElement | null>(null);\n\n const fallbackId = useId();\n const tooltipId = id ?? fallbackId;\n\n const { refs, floatingStyles, placement, middlewareData } = useFloating({\n placement: position,\n middleware: [\n offset(16),\n flip({ fallbackPlacements: [Position.TOP] }),\n // eslint-disable-next-line react-hooks/refs -- arrowRef is passed to floating-ui middleware, legitimate API usage\n arrowMiddleware({ element: arrowRef, padding: 8 }),\n ],\n whileElementsMounted: open ? autoUpdate : undefined,\n open,\n });\n\n const arrowStyle: CSSProperties = {\n ...(middlewareData.arrow?.x != null ? { left: middlewareData.arrow.x } : {}),\n ...(middlewareData.arrow?.y != null ? { top: middlewareData.arrow.y } : {}),\n };\n\n return (\n /* eslint-disable react-hooks/refs -- setReference and setFloating are callback refs from floating-ui, safe to pass during render */\n <span\n ref={refs.setReference}\n className=\"tw-tooltip-container\"\n onMouseOver={() => setOpen(true)}\n onFocus={() => setOpen(true)}\n onMouseOut={() => setOpen(false)}\n onBlur={() => setOpen(false)}\n >\n {children\n ? cloneElement(children as ReactElement<Pick<AriaAttributes, 'aria-describedby'>>, {\n 'aria-describedby': `${tooltipId}-tooltip`,\n })\n : null}\n <div\n ref={refs.setFloating}\n className={clsx(\n 'np-tooltip',\n 'np-panel',\n open ? `np-panel--open np-tooltip--open` : null,\n className,\n )}\n style={floatingStyles}\n data-popper-placement={placement}\n aria-hidden={!open}\n role=\"tooltip\"\n id={`${tooltipId}-tooltip`}\n >\n <div className=\"np-panel__content tooltip-inner\">\n {label}\n <div ref={arrowRef} className={clsx('np-panel__arrow')} style={arrowStyle} />\n </div>\n </div>\n </span>\n /* eslint-enable react-hooks/refs */\n );\n};\n\nexport default Tooltip;\n"],"names":["Tooltip","position","Position","TOP","children","undefined","label","id","className","open","setOpen","useState","arrowRef","useRef","fallbackId","useId","tooltipId","refs","floatingStyles","placement","middlewareData","useFloating","middleware","offset","flip","fallbackPlacements","arrowMiddleware","element","padding","whileElementsMounted","autoUpdate","arrowStyle","arrow","x","left","y","top","_jsxs","ref","setReference","onMouseOver","onFocus","onMouseOut","onBlur","cloneElement","_jsx","setFloating","clsx","style","role"],"mappings":"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"}
1
+ {"version":3,"file":"Tooltip.mjs","sources":["../../src/Tooltip/Tooltip.tsx"],"sourcesContent":["import {\n arrow as arrowMiddleware,\n autoUpdate,\n flip,\n offset,\n useFloating,\n} from '@floating-ui/react';\nimport { clsx } from 'clsx';\nimport {\n AriaAttributes,\n CSSProperties,\n PropsWithChildren,\n ReactElement,\n ReactNode,\n cloneElement,\n useId,\n useRef,\n useState,\n} from 'react';\n\nimport { CommonProps, Position } from '../common';\nimport useDirection from '../common/hooks/useDirection';\nimport {\n PositionBottom,\n PositionLeft,\n PositionRight,\n PositionTop,\n} from '../common/PropsValues/position';\n\nexport type TooltipProps = PropsWithChildren<{\n position?: PositionTop | PositionRight | PositionBottom | PositionLeft;\n label: ReactNode;\n id?: string;\n}> &\n CommonProps;\n\nconst Tooltip = ({\n position = Position.TOP,\n children = undefined,\n label,\n id,\n className,\n}: TooltipProps) => {\n const [open, setOpen] = useState(false);\n const arrowRef = useRef<HTMLDivElement | null>(null);\n const { isRTL } = useDirection();\n\n const resolvedPosition = isRTL\n ? position === 'left'\n ? 'right'\n : position === 'right'\n ? 'left'\n : position\n : position;\n\n const fallbackId = useId();\n const tooltipId = id ?? fallbackId;\n\n const { refs, floatingStyles, placement, middlewareData } = useFloating({\n placement: resolvedPosition,\n middleware: [\n offset(16),\n flip({ fallbackPlacements: [Position.TOP] }),\n // eslint-disable-next-line react-hooks/refs -- arrowRef is passed to floating-ui middleware, legitimate API usage\n arrowMiddleware({ element: arrowRef, padding: 8 }),\n ],\n whileElementsMounted: open ? autoUpdate : undefined,\n open,\n });\n\n const arrowStyle: CSSProperties = {\n ...(middlewareData.arrow?.x != null ? { left: middlewareData.arrow.x } : {}),\n ...(middlewareData.arrow?.y != null ? { top: middlewareData.arrow.y } : {}),\n };\n\n return (\n /* eslint-disable react-hooks/refs -- setReference and setFloating are callback refs from floating-ui, safe to pass during render */\n <span\n ref={refs.setReference}\n className=\"tw-tooltip-container\"\n onMouseOver={() => setOpen(true)}\n onFocus={() => setOpen(true)}\n onMouseOut={() => setOpen(false)}\n onBlur={() => setOpen(false)}\n >\n {children\n ? cloneElement(children as ReactElement<Pick<AriaAttributes, 'aria-describedby'>>, {\n 'aria-describedby': `${tooltipId}-tooltip`,\n })\n : null}\n <div\n ref={refs.setFloating}\n className={clsx(\n 'np-tooltip',\n 'np-panel',\n open ? `np-panel--open np-tooltip--open` : null,\n className,\n )}\n style={floatingStyles}\n data-popper-placement={placement}\n aria-hidden={!open}\n role=\"tooltip\"\n id={`${tooltipId}-tooltip`}\n >\n <div className=\"np-panel__content tooltip-inner\">\n {label}\n <div ref={arrowRef} className={clsx('np-panel__arrow')} style={arrowStyle} />\n </div>\n </div>\n </span>\n /* eslint-enable react-hooks/refs */\n );\n};\n\nexport default Tooltip;\n"],"names":["Tooltip","position","Position","TOP","children","undefined","label","id","className","open","setOpen","useState","arrowRef","useRef","isRTL","useDirection","resolvedPosition","fallbackId","useId","tooltipId","refs","floatingStyles","placement","middlewareData","useFloating","middleware","offset","flip","fallbackPlacements","arrowMiddleware","element","padding","whileElementsMounted","autoUpdate","arrowStyle","arrow","x","left","y","top","_jsxs","ref","setReference","onMouseOver","onFocus","onMouseOut","onBlur","cloneElement","_jsx","setFloating","clsx","style","role"],"mappings":"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"}
@@ -12,6 +12,10 @@
12
12
  "neptune.DateLookup.goTo20YearView": "20 yıl görünümüne git",
13
13
  "neptune.DateLookup.month": "ay",
14
14
  "neptune.DateLookup.next": "devam et",
15
+ "neptune.DateLookup.notAvailable": "kullanılamaz",
16
+ "neptune.DateLookup.outOfRangeAfter": "Lütfen {min} veya daha sonraki bir tarih girin.",
17
+ "neptune.DateLookup.outOfRangeBefore": "Lütfen {max} veya daha önceki bir tarih girin.",
18
+ "neptune.DateLookup.outOfRangeBetween": "Lütfen {min} ile {max} arasında bir tarih girin.",
15
19
  "neptune.DateLookup.previous": "önceki",
16
20
  "neptune.DateLookup.selected": "seçili",
17
21
  "neptune.DateLookup.twentyYears": "20 yıl",
@@ -46,6 +50,7 @@
46
50
  "neptune.Table.loaded": "Tablo verileri yüklendi",
47
51
  "neptune.Table.loading": "Tablo verileri yükleniyor",
48
52
  "neptune.Table.refreshPage": "Sayfayı yenile",
53
+ "neptune.Typeahead.suggestionsLabel": "Öneriler",
49
54
  "neptune.Upload.csButtonText": "Başka bir dosya yükleyin?",
50
55
  "neptune.Upload.csFailureText": "Yükleme başarısız. Lütfen yine deneyin",
51
56
  "neptune.Upload.csSuccessText": "Yükleme tamamlandı!",
@@ -16,6 +16,10 @@ var tr = {
16
16
  "neptune.DateLookup.goTo20YearView": "20 yıl görünümüne git",
17
17
  "neptune.DateLookup.month": "ay",
18
18
  "neptune.DateLookup.next": "devam et",
19
+ "neptune.DateLookup.notAvailable": "kullanılamaz",
20
+ "neptune.DateLookup.outOfRangeAfter": "Lütfen {min} veya daha sonraki bir tarih girin.",
21
+ "neptune.DateLookup.outOfRangeBefore": "Lütfen {max} veya daha önceki bir tarih girin.",
22
+ "neptune.DateLookup.outOfRangeBetween": "Lütfen {min} ile {max} arasında bir tarih girin.",
19
23
  "neptune.DateLookup.previous": "önceki",
20
24
  "neptune.DateLookup.selected": "seçili",
21
25
  "neptune.DateLookup.twentyYears": "20 yıl",
@@ -50,6 +54,7 @@ var tr = {
50
54
  "neptune.Table.loaded": "Tablo verileri yüklendi",
51
55
  "neptune.Table.loading": "Tablo verileri yükleniyor",
52
56
  "neptune.Table.refreshPage": "Sayfayı yenile",
57
+ "neptune.Typeahead.suggestionsLabel": "Öneriler",
53
58
  "neptune.Upload.csButtonText": "Başka bir dosya yükleyin?",
54
59
  "neptune.Upload.csFailureText": "Yükleme başarısız. Lütfen yine deneyin",
55
60
  "neptune.Upload.csSuccessText": "Yükleme tamamlandı!",
@@ -1 +1 @@
1
- {"version":3,"file":"tr.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"tr.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -12,6 +12,10 @@ var tr = {
12
12
  "neptune.DateLookup.goTo20YearView": "20 yıl görünümüne git",
13
13
  "neptune.DateLookup.month": "ay",
14
14
  "neptune.DateLookup.next": "devam et",
15
+ "neptune.DateLookup.notAvailable": "kullanılamaz",
16
+ "neptune.DateLookup.outOfRangeAfter": "Lütfen {min} veya daha sonraki bir tarih girin.",
17
+ "neptune.DateLookup.outOfRangeBefore": "Lütfen {max} veya daha önceki bir tarih girin.",
18
+ "neptune.DateLookup.outOfRangeBetween": "Lütfen {min} ile {max} arasında bir tarih girin.",
15
19
  "neptune.DateLookup.previous": "önceki",
16
20
  "neptune.DateLookup.selected": "seçili",
17
21
  "neptune.DateLookup.twentyYears": "20 yıl",
@@ -46,6 +50,7 @@ var tr = {
46
50
  "neptune.Table.loaded": "Tablo verileri yüklendi",
47
51
  "neptune.Table.loading": "Tablo verileri yükleniyor",
48
52
  "neptune.Table.refreshPage": "Sayfayı yenile",
53
+ "neptune.Typeahead.suggestionsLabel": "Öneriler",
49
54
  "neptune.Upload.csButtonText": "Başka bir dosya yükleyin?",
50
55
  "neptune.Upload.csFailureText": "Yükleme başarısız. Lütfen yine deneyin",
51
56
  "neptune.Upload.csSuccessText": "Yükleme tamamlandı!",
@@ -1 +1 @@
1
- {"version":3,"file":"tr.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"tr.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -12,6 +12,10 @@
12
12
  "neptune.DateLookup.goTo20YearView": "转到 20 年视图",
13
13
  "neptune.DateLookup.month": "月",
14
14
  "neptune.DateLookup.next": "下一页",
15
+ "neptune.DateLookup.notAvailable": "不可用",
16
+ "neptune.DateLookup.outOfRangeAfter": "请输入 {min}或之后的日期。",
17
+ "neptune.DateLookup.outOfRangeBefore": "请输入 {max}或之前的日期。",
18
+ "neptune.DateLookup.outOfRangeBetween": "请输入 {min}与 {max}之间的日期。",
15
19
  "neptune.DateLookup.previous": "上一页",
16
20
  "neptune.DateLookup.selected": "已选",
17
21
  "neptune.DateLookup.twentyYears": "20 年",
@@ -46,6 +50,7 @@
46
50
  "neptune.Table.loaded": "表数据已加载",
47
51
  "neptune.Table.loading": "表数据正在加载",
48
52
  "neptune.Table.refreshPage": "刷新页面",
53
+ "neptune.Typeahead.suggestionsLabel": "建议",
49
54
  "neptune.Upload.csButtonText": "上传另一个文件?",
50
55
  "neptune.Upload.csFailureText": "上传失败。请重试",
51
56
  "neptune.Upload.csSuccessText": "上传完毕!",
@@ -16,6 +16,10 @@ var zhCN = {
16
16
  "neptune.DateLookup.goTo20YearView": "转到 20 年视图",
17
17
  "neptune.DateLookup.month": "月",
18
18
  "neptune.DateLookup.next": "下一页",
19
+ "neptune.DateLookup.notAvailable": "不可用",
20
+ "neptune.DateLookup.outOfRangeAfter": "请输入 {min}或之后的日期。",
21
+ "neptune.DateLookup.outOfRangeBefore": "请输入 {max}或之前的日期。",
22
+ "neptune.DateLookup.outOfRangeBetween": "请输入 {min}与 {max}之间的日期。",
19
23
  "neptune.DateLookup.previous": "上一页",
20
24
  "neptune.DateLookup.selected": "已选",
21
25
  "neptune.DateLookup.twentyYears": "20 年",
@@ -50,6 +54,7 @@ var zhCN = {
50
54
  "neptune.Table.loaded": "表数据已加载",
51
55
  "neptune.Table.loading": "表数据正在加载",
52
56
  "neptune.Table.refreshPage": "刷新页面",
57
+ "neptune.Typeahead.suggestionsLabel": "建议",
53
58
  "neptune.Upload.csButtonText": "上传另一个文件?",
54
59
  "neptune.Upload.csFailureText": "上传失败。请重试",
55
60
  "neptune.Upload.csSuccessText": "上传完毕!",
@@ -1 +1 @@
1
- {"version":3,"file":"zh-CN.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"zh-CN.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -12,6 +12,10 @@ var zhCN = {
12
12
  "neptune.DateLookup.goTo20YearView": "转到 20 年视图",
13
13
  "neptune.DateLookup.month": "月",
14
14
  "neptune.DateLookup.next": "下一页",
15
+ "neptune.DateLookup.notAvailable": "不可用",
16
+ "neptune.DateLookup.outOfRangeAfter": "请输入 {min}或之后的日期。",
17
+ "neptune.DateLookup.outOfRangeBefore": "请输入 {max}或之前的日期。",
18
+ "neptune.DateLookup.outOfRangeBetween": "请输入 {min}与 {max}之间的日期。",
15
19
  "neptune.DateLookup.previous": "上一页",
16
20
  "neptune.DateLookup.selected": "已选",
17
21
  "neptune.DateLookup.twentyYears": "20 年",
@@ -46,6 +50,7 @@ var zhCN = {
46
50
  "neptune.Table.loaded": "表数据已加载",
47
51
  "neptune.Table.loading": "表数据正在加载",
48
52
  "neptune.Table.refreshPage": "刷新页面",
53
+ "neptune.Typeahead.suggestionsLabel": "建议",
49
54
  "neptune.Upload.csButtonText": "上传另一个文件?",
50
55
  "neptune.Upload.csFailureText": "上传失败。请重试",
51
56
  "neptune.Upload.csSuccessText": "上传完毕!",
@@ -1 +1 @@
1
- {"version":3,"file":"zh-CN.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"zh-CN.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}