@transferwise/components 46.160.0 → 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.
- package/build/Calendar/Calendar.js +9 -3
- package/build/Calendar/Calendar.js.map +1 -1
- package/build/Calendar/Calendar.mjs +9 -3
- package/build/Calendar/Calendar.mjs.map +1 -1
- package/build/Carousel/Carousel.js +17 -10
- package/build/Carousel/Carousel.js.map +1 -1
- package/build/Carousel/Carousel.mjs +17 -10
- package/build/Carousel/Carousel.mjs.map +1 -1
- package/build/ExpressiveMoneyInput/Chevron/Chevron.js +10 -2
- package/build/ExpressiveMoneyInput/Chevron/Chevron.js.map +1 -1
- package/build/ExpressiveMoneyInput/Chevron/Chevron.mjs +11 -3
- package/build/ExpressiveMoneyInput/Chevron/Chevron.mjs.map +1 -1
- package/build/ProcessIndicator/ProcessIndicator.js +1 -1
- package/build/ProcessIndicator/ProcessIndicator.js.map +1 -1
- package/build/ProcessIndicator/ProcessIndicator.mjs +1 -1
- package/build/ProcessIndicator/ProcessIndicator.mjs.map +1 -1
- package/build/Prompt/CriticalBanner/CriticalBanner.js +10 -1
- package/build/Prompt/CriticalBanner/CriticalBanner.js.map +1 -1
- package/build/Prompt/CriticalBanner/CriticalBanner.mjs +10 -1
- package/build/Prompt/CriticalBanner/CriticalBanner.mjs.map +1 -1
- package/build/SegmentedControl/SegmentedControl.js +9 -2
- package/build/SegmentedControl/SegmentedControl.js.map +1 -1
- package/build/SegmentedControl/SegmentedControl.mjs +9 -2
- package/build/SegmentedControl/SegmentedControl.mjs.map +1 -1
- package/build/Tooltip/Tooltip.js +6 -1
- package/build/Tooltip/Tooltip.js.map +1 -1
- package/build/Tooltip/Tooltip.mjs +6 -1
- package/build/Tooltip/Tooltip.mjs.map +1 -1
- package/build/common/Panel/Panel.js +13 -25
- package/build/common/Panel/Panel.js.map +1 -1
- package/build/common/Panel/Panel.mjs +10 -22
- package/build/common/Panel/Panel.mjs.map +1 -1
- package/build/common/Panel/Panel.positionUtils.js +68 -0
- package/build/common/Panel/Panel.positionUtils.js.map +1 -0
- package/build/common/Panel/Panel.positionUtils.mjs +63 -0
- package/build/common/Panel/Panel.positionUtils.mjs.map +1 -0
- package/build/common/PropsValues/position.js +0 -25
- package/build/common/PropsValues/position.js.map +1 -1
- package/build/common/PropsValues/position.mjs +1 -24
- package/build/common/PropsValues/position.mjs.map +1 -1
- package/build/i18n/tr.json +5 -0
- package/build/i18n/tr.json.js +5 -0
- package/build/i18n/tr.json.js.map +1 -1
- package/build/i18n/tr.json.mjs +5 -0
- package/build/i18n/tr.json.mjs.map +1 -1
- package/build/i18n/zh-CN.json +5 -0
- package/build/i18n/zh-CN.json.js +5 -0
- package/build/i18n/zh-CN.json.js.map +1 -1
- package/build/i18n/zh-CN.json.mjs +5 -0
- package/build/i18n/zh-CN.json.mjs.map +1 -1
- package/build/main.css +134 -88
- package/build/styles/AvatarLayout/AvatarLayout.css +26 -9
- package/build/styles/AvatarView/AvatarView.css +8 -0
- package/build/styles/AvatarView/Dot/Dot.css +8 -0
- package/build/styles/CheckboxButton/CheckboxButton.css +3 -0
- package/build/styles/Nudge/Nudge.css +4 -38
- package/build/styles/Prompt/CriticalBanner/CriticalBanner.css +34 -0
- package/build/styles/SegmentedControl/SegmentedControl.css +2 -1
- package/build/styles/SlidingPanel/SlidingPanel.css +8 -0
- package/build/styles/Tooltip/Tooltip.css +0 -6
- package/build/styles/UploadInput/UploadItem/UploadItem.css +4 -5
- package/build/styles/_deprecated/Badge/Badge.css +4 -2
- package/build/styles/common/Panel/Panel.css +16 -8
- package/build/styles/css/accordion.css +3 -0
- package/build/styles/css/buttons.css +1 -7
- package/build/styles/css/chevron.css +3 -0
- package/build/styles/css/neptune.css +25 -19
- package/build/styles/css/process.css +15 -9
- package/build/styles/css/tick.css +6 -3
- package/build/styles/main.css +134 -88
- package/build/styles/styles/less/accordion.css +3 -0
- package/build/styles/styles/less/buttons.css +1 -7
- package/build/styles/styles/less/chevron.css +3 -0
- package/build/styles/styles/less/neptune.css +25 -19
- package/build/styles/styles/less/process.css +15 -9
- package/build/styles/styles/less/tick.css +6 -3
- package/build/types/Calendar/Calendar.d.ts.map +1 -1
- package/build/types/Carousel/Carousel.d.ts.map +1 -1
- package/build/types/Carousel/_stories/constants.d.ts +3 -0
- package/build/types/Carousel/_stories/constants.d.ts.map +1 -0
- package/build/types/ExpressiveMoneyInput/Chevron/Chevron.d.ts.map +1 -1
- package/build/types/Prompt/CriticalBanner/CriticalBanner.d.ts +6 -1
- package/build/types/Prompt/CriticalBanner/CriticalBanner.d.ts.map +1 -1
- package/build/types/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/build/types/Tooltip/Tooltip.d.ts.map +1 -1
- package/build/types/common/Panel/Panel.d.ts +1 -1
- package/build/types/common/Panel/Panel.d.ts.map +1 -1
- package/build/types/common/Panel/Panel.positionUtils.d.ts +7 -0
- package/build/types/common/Panel/Panel.positionUtils.d.ts.map +1 -0
- package/build/types/common/PropsValues/position.d.ts +0 -13
- package/build/types/common/PropsValues/position.d.ts.map +1 -1
- package/build/types/common/ResponsivePanel/ResponsivePanel.d.ts +1 -1
- package/package.json +8 -8
- package/src/AvatarLayout/AvatarLayout.css +26 -9
- package/src/AvatarLayout/AvatarLayout.less +46 -22
- package/src/AvatarLayout/_stories/AvatarLayout.test.story.tsx +17 -42
- package/src/AvatarView/AvatarView.css +8 -0
- package/src/AvatarView/Dot/Dot.css +8 -0
- package/src/AvatarView/Dot/Dot.less +7 -1
- package/src/Button/_stories/Button.test.story.tsx +1 -1
- package/src/Calendar/Calendar.test.tsx +82 -0
- package/src/Calendar/Calendar.tsx +6 -3
- package/src/Carousel/Carousel.test.tsx +50 -2
- package/src/Carousel/Carousel.tsx +13 -10
- package/src/Carousel/_stories/Carousel.story.tsx +12 -52
- package/src/Carousel/_stories/Carousel.test.story.tsx +7 -43
- package/src/Carousel/_stories/constants.tsx +46 -0
- package/src/Checkbox/_stories/Checkbox.story.tsx +1 -1
- package/src/Checkbox/_stories/Checkbox.test.story.tsx +3 -2
- package/src/CheckboxButton/CheckboxButton.css +3 -0
- package/src/CheckboxButton/CheckboxButton.less +4 -0
- package/src/Chevron/_stories/Chevron.test.story.tsx +2 -2
- package/src/DateLookup/_stories/DateLookup.rtl.test.story.tsx +59 -48
- package/src/ExpressiveMoneyInput/Chevron/Chevron.tsx +8 -3
- package/src/Field/_stories/Field.test.story.tsx +48 -37
- package/src/FlowNavigation/_stories/FlowNavigation.rtl.test.story.tsx +78 -0
- package/src/FlowNavigation/_stories/FlowNavigation.test.story.tsx +0 -44
- package/src/Header/_stories/Header.test.story.tsx +1 -1
- package/src/Info/_stories/Info.rtl.test.story.tsx +35 -10
- package/src/Info/_stories/Info.story.tsx +1 -1
- package/src/Inputs/SelectInput/_stories/SelectInput.test.story.tsx +1 -1
- package/src/Label/_stories/Label.test.story.tsx +35 -22
- package/src/ListItem/_stories/subcomponents.tsx +1 -1
- package/src/Loader/_stories/Loader.test.story.tsx +23 -0
- package/src/MoneyInput/_stories/MoneyInput.rtl.test.story.tsx +1 -1
- package/src/Nudge/Nudge.css +4 -38
- package/src/Nudge/Nudge.less +4 -4
- package/src/Nudge/_stories/Nudge.test.story.tsx +29 -12
- package/src/PhoneNumberInput/_stories/{PhoneNumberInput.test.story.tsx → PhoneNumberInput.rtl.test.story.tsx} +18 -10
- package/src/Popover/_stories/Popover.rtl.test.story.tsx +40 -50
- package/src/ProcessIndicator/ProcessIndicator.tsx +1 -1
- package/src/ProcessIndicator/_stories/ProcessIndicator.test.story.tsx +32 -0
- package/src/ProgressBar/_stories/ProgressBar.test.story.tsx +33 -19
- package/src/Prompt/CriticalBanner/CriticalBanner.css +34 -0
- package/src/Prompt/CriticalBanner/CriticalBanner.less +45 -0
- package/src/Prompt/CriticalBanner/CriticalBanner.test.tsx +26 -3
- package/src/Prompt/CriticalBanner/CriticalBanner.tsx +15 -1
- package/src/Prompt/CriticalBanner/_stories/CriticalBanner.accessibility.docs.mdx +4 -1
- package/src/Prompt/CriticalBanner/_stories/CriticalBanner.story.tsx +52 -0
- package/src/Prompt/CriticalBanner/_stories/CriticalBanner.test.story.tsx +22 -1
- package/src/SegmentedControl/SegmentedControl.css +2 -1
- package/src/SegmentedControl/SegmentedControl.less +4 -2
- package/src/SegmentedControl/SegmentedControl.tsx +8 -2
- package/src/SegmentedControl/_stories/SegmentedControl.test.story.tsx +16 -8
- package/src/SlidingPanel/SlidingPanel.css +8 -0
- package/src/SlidingPanel/SlidingPanel.less +8 -0
- package/src/SlidingPanel/_stories/SlidingPanel.rtl.test.story.tsx +4 -3
- package/src/Snackbar/_stories/Snackbar.rtl.test.story.tsx +14 -16
- package/src/Snackbar/_stories/Snackbar.story.tsx +1 -1
- package/src/Snackbar/_stories/Snackbar.test.story.tsx +1 -1
- package/src/StatusIcon/_stories/StatusIcon.test.story.tsx +12 -4
- package/src/Tooltip/Tooltip.css +0 -6
- package/src/Tooltip/Tooltip.less +0 -12
- package/src/Tooltip/Tooltip.test.tsx +51 -0
- package/src/Tooltip/Tooltip.tsx +11 -1
- package/src/Tooltip/_stories/Tooltip.rtl.test.story.tsx +16 -34
- package/src/UploadInput/UploadItem/UploadItem.css +4 -5
- package/src/UploadInput/UploadItem/UploadItem.less +7 -6
- package/src/UploadInput/_stories/UploadInput.test.story.tsx +1 -1
- package/src/_deprecated/Badge/Badge.css +4 -2
- package/src/_deprecated/Badge/Badge.less +7 -14
- package/src/_deprecated/CriticalBanner/_stories/CriticalCommsBanner.test.story.tsx +0 -16
- package/src/_deprecated/OverlayHeader/_stories/OverlayHeader.test.story.tsx +15 -0
- package/src/common/Panel/Panel.css +16 -8
- package/src/common/Panel/Panel.less +31 -13
- package/src/common/Panel/Panel.positionUtils.ts +79 -0
- package/src/common/Panel/Panel.test.tsx +40 -0
- package/src/common/Panel/Panel.tsx +13 -24
- package/src/common/Panel/_stories/Panel.rtl.test.story.tsx +110 -0
- package/src/common/PropsValues/position.ts +0 -50
- package/src/i18n/tr.json +5 -0
- package/src/i18n/zh-CN.json +5 -0
- package/src/main.css +134 -88
- package/src/styles/less/accordion.css +3 -0
- package/src/styles/less/buttons.css +1 -7
- package/src/styles/less/buttons.less +3 -11
- package/src/styles/less/chevron.css +3 -0
- package/src/styles/less/chevron.less +4 -0
- package/src/styles/less/neptune.css +25 -19
- package/src/styles/less/process.css +15 -9
- package/src/styles/less/process.less +13 -6
- package/src/styles/less/tick.css +6 -3
- package/src/styles/less/tick.less +7 -3
|
@@ -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
|
-
|
|
56
|
-
|
|
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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"}
|
package/build/Tooltip/Tooltip.js
CHANGED
|
@@ -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:
|
|
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:
|
|
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:
|
|
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:
|
|
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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"}
|
|
@@ -5,6 +5,9 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
var react = require('@floating-ui/react');
|
|
6
6
|
var clsx = require('clsx');
|
|
7
7
|
var React = require('react');
|
|
8
|
+
var OverlayIdProvider = require('../../Provider/overlay/OverlayIdProvider.js');
|
|
9
|
+
var Dimmer = require('../../Dimmer/Dimmer.js');
|
|
10
|
+
var useDirection = require('../hooks/useDirection/useDirection.js');
|
|
8
11
|
require('../theme.js');
|
|
9
12
|
require('../direction.js');
|
|
10
13
|
require('@transferwise/neptune-tokens');
|
|
@@ -29,27 +32,8 @@ require('@transferwise/icons');
|
|
|
29
32
|
require('react-intl');
|
|
30
33
|
require('../CloseButton/CloseButton.messages.js');
|
|
31
34
|
var jsxRuntime = require('react/jsx-runtime');
|
|
32
|
-
var
|
|
33
|
-
var OverlayIdProvider = require('../../Provider/overlay/OverlayIdProvider.js');
|
|
35
|
+
var Panel_positionUtils = require('./Panel.positionUtils.js');
|
|
34
36
|
|
|
35
|
-
const POPOVER_OFFSET = 16;
|
|
36
|
-
// By default the flip positioning explores only the opposite alternative. So if left is passed and there's no enough space
|
|
37
|
-
// the right one gets chosen. If there's no space on both sides popover goes back to the initially chosen one left.
|
|
38
|
-
// This mapping forces popover to try the four available positions before going back to the initial chosen one.
|
|
39
|
-
const fallbackPlacements = {
|
|
40
|
-
[position.Position.TOP]: [position.Position.BOTTOM, position.Position.RIGHT, position.Position.LEFT],
|
|
41
|
-
[position.Position.BOTTOM]: [position.Position.TOP, position.Position.RIGHT, position.Position.LEFT],
|
|
42
|
-
[position.Position.LEFT]: [position.Position.RIGHT, position.Position.TOP, position.Position.BOTTOM],
|
|
43
|
-
[position.Position.RIGHT]: [position.Position.LEFT, position.Position.TOP, position.Position.BOTTOM],
|
|
44
|
-
'top-start': ['bottom-start', 'top-end', 'bottom-end'],
|
|
45
|
-
'top-end': ['bottom-end', 'top-start', 'bottom-start'],
|
|
46
|
-
'bottom-start': ['top-start', 'bottom-end', 'top-end'],
|
|
47
|
-
'bottom-end': ['top-end', 'bottom-start', 'top-start'],
|
|
48
|
-
'left-start': ['right-start', 'left-end', 'right-end'],
|
|
49
|
-
'left-end': ['right-end', 'left-start', 'right-start'],
|
|
50
|
-
'right-start': ['left-start', 'right-end', 'left-end'],
|
|
51
|
-
'right-end': ['left-end', 'right-start', 'left-start']
|
|
52
|
-
};
|
|
53
37
|
const Panel = /*#__PURE__*/React.forwardRef(function Panel({
|
|
54
38
|
arrow = false,
|
|
55
39
|
flip = true,
|
|
@@ -64,14 +48,18 @@ const Panel = /*#__PURE__*/React.forwardRef(function Panel({
|
|
|
64
48
|
...rest
|
|
65
49
|
}, reference) {
|
|
66
50
|
const arrowRef = React.useRef(null);
|
|
67
|
-
const
|
|
51
|
+
const {
|
|
52
|
+
isRTL
|
|
53
|
+
} = useDirection.useDirection();
|
|
54
|
+
const resolvedPosition = isRTL ? Panel_positionUtils.mirrorPositionForRtl(position$1) : position$1;
|
|
55
|
+
const floatingPlacement = Panel_positionUtils.positionToPlacement(resolvedPosition);
|
|
68
56
|
const middleware = [];
|
|
69
57
|
if (arrow) {
|
|
70
|
-
middleware.push(react.offset(POPOVER_OFFSET));
|
|
58
|
+
middleware.push(react.offset(Panel_positionUtils.POPOVER_OFFSET));
|
|
71
59
|
}
|
|
72
|
-
if (flip && fallbackPlacements[floatingPlacement]) {
|
|
60
|
+
if (flip && Panel_positionUtils.fallbackPlacements[floatingPlacement]) {
|
|
73
61
|
middleware.push(react.flip({
|
|
74
|
-
fallbackPlacements: fallbackPlacements[floatingPlacement]
|
|
62
|
+
fallbackPlacements: Panel_positionUtils.fallbackPlacements[floatingPlacement]
|
|
75
63
|
}));
|
|
76
64
|
}
|
|
77
65
|
if (altAxis) {
|
|
@@ -85,7 +73,7 @@ const Panel = /*#__PURE__*/React.forwardRef(function Panel({
|
|
|
85
73
|
}
|
|
86
74
|
if (considerHeight) {
|
|
87
75
|
middleware.push(react.size({
|
|
88
|
-
padding: POPOVER_OFFSET,
|
|
76
|
+
padding: Panel_positionUtils.POPOVER_OFFSET,
|
|
89
77
|
apply: ({
|
|
90
78
|
elements,
|
|
91
79
|
availableHeight
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Panel.js","sources":["../../../src/common/Panel/Panel.tsx"],"sourcesContent":["import {\n arrow as arrowMiddleware,\n autoUpdate,\n flip as flipMiddleware,\n offset,\n
|
|
1
|
+
{"version":3,"file":"Panel.js","sources":["../../../src/common/Panel/Panel.tsx"],"sourcesContent":["import {\n arrow as arrowMiddleware,\n autoUpdate,\n flip as flipMiddleware,\n offset,\n shift,\n size as sizeMiddleware,\n useFloating,\n} from '@floating-ui/react';\nimport { clsx } from 'clsx';\nimport {\n CSSProperties,\n HTMLAttributes,\n PropsWithChildren,\n RefObject,\n SyntheticEvent,\n forwardRef,\n useContext,\n useRef,\n} from 'react';\n\nimport { OverlayIdContext } from '../../Provider/overlay/OverlayIdProvider';\nimport Dimmer from '../../Dimmer';\nimport useDirection from '../hooks/useDirection';\nimport { Position } from '..';\nimport {\n type FloatingPlacement,\n POPOVER_OFFSET,\n fallbackPlacements,\n mirrorPositionForRtl,\n positionToPlacement,\n} from './Panel.positionUtils';\n\nexport type PanelProps = PropsWithChildren<{\n arrow?: boolean;\n flip?: boolean;\n altAxis?: boolean;\n open?: boolean;\n onClose?: (event: Event | SyntheticEvent) => void;\n position?: FloatingPlacement;\n anchorRef: RefObject<Element | null>;\n anchorWidth?: boolean;\n considerHeight?: boolean;\n}> &\n HTMLAttributes<HTMLDivElement>;\n\nconst Panel = forwardRef<HTMLDivElement, PanelProps>(function Panel(\n {\n arrow = false,\n flip = true,\n altAxis = false,\n children,\n open = false,\n onClose,\n position = Position.BOTTOM,\n anchorRef,\n anchorWidth = false,\n considerHeight = false,\n ...rest\n }: PanelProps,\n reference,\n) {\n const arrowRef = useRef<HTMLDivElement | null>(null);\n const { isRTL } = useDirection();\n const resolvedPosition = isRTL ? mirrorPositionForRtl(position) : position;\n const floatingPlacement = positionToPlacement(resolvedPosition);\n\n const middleware = [];\n\n if (arrow) {\n middleware.push(offset(POPOVER_OFFSET));\n }\n\n if (flip && fallbackPlacements[floatingPlacement]) {\n middleware.push(\n flipMiddleware({\n fallbackPlacements: fallbackPlacements[floatingPlacement],\n }),\n );\n }\n\n if (altAxis) {\n middleware.push(shift());\n }\n\n if (arrow) {\n middleware.push(arrowMiddleware({ element: arrowRef, padding: 8 }));\n }\n\n if (considerHeight) {\n middleware.push(\n sizeMiddleware({\n padding: POPOVER_OFFSET,\n apply: ({ elements, availableHeight }) => {\n elements.floating.style.setProperty(\n '--np-panel-available-height',\n `${availableHeight}px`,\n );\n },\n }),\n );\n }\n\n const { refs, floatingStyles, placement, middlewareData } = useFloating({\n placement: floatingPlacement,\n middleware,\n elements: {\n reference: anchorRef.current,\n },\n whileElementsMounted: open ? autoUpdate : undefined,\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 const contentStyle: CSSProperties = {\n ...(anchorWidth ? { width: anchorRef.current?.clientWidth } : undefined),\n };\n\n const overlayId = useContext(OverlayIdContext);\n\n return (\n <Dimmer open={open} transparent fadeContentOnEnter fadeContentOnExit onClose={onClose}>\n <div\n id={overlayId}\n {...rest}\n ref={refs.setFloating}\n role=\"dialog\"\n style={floatingStyles}\n data-popper-placement={placement}\n className={clsx('np-panel', { 'np-panel--open': open }, rest.className)}\n >\n <div ref={reference} style={contentStyle} className={clsx('np-panel__content')}>\n {children}\n {/* Arrow has to stay inside content to get the same animations as the \"dialog\" and to get hidden when panel is closed. */}\n {arrow && <div ref={arrowRef} className={clsx('np-panel__arrow')} style={arrowStyle} />}\n </div>\n </div>\n </Dimmer>\n );\n});\n\nexport default Panel;\n"],"names":["Panel","forwardRef","arrow","flip","altAxis","children","open","onClose","position","Position","BOTTOM","anchorRef","anchorWidth","considerHeight","rest","reference","arrowRef","useRef","isRTL","useDirection","resolvedPosition","mirrorPositionForRtl","floatingPlacement","positionToPlacement","middleware","push","offset","POPOVER_OFFSET","fallbackPlacements","flipMiddleware","shift","arrowMiddleware","element","padding","sizeMiddleware","apply","elements","availableHeight","floating","style","setProperty","refs","floatingStyles","placement","middlewareData","useFloating","current","whileElementsMounted","autoUpdate","undefined","arrowStyle","x","left","y","top","contentStyle","width","clientWidth","overlayId","useContext","OverlayIdContext","_jsx","Dimmer","transparent","fadeContentOnEnter","fadeContentOnExit","id","ref","setFloating","role","className","clsx","_jsxs"],"mappings":"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"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { offset, flip, shift, arrow, size, useFloating, autoUpdate } from '@floating-ui/react';
|
|
2
2
|
import { clsx } from 'clsx';
|
|
3
3
|
import { forwardRef, useRef, useContext } from 'react';
|
|
4
|
+
import { OverlayIdContext } from '../../Provider/overlay/OverlayIdProvider.mjs';
|
|
5
|
+
import Dimmer from '../../Dimmer/Dimmer.mjs';
|
|
6
|
+
import { useDirection } from '../hooks/useDirection/useDirection.mjs';
|
|
4
7
|
import '../theme.mjs';
|
|
5
8
|
import '../direction.mjs';
|
|
6
9
|
import '@transferwise/neptune-tokens';
|
|
@@ -11,7 +14,7 @@ import '../PropsValues/width.mjs';
|
|
|
11
14
|
import '../PropsValues/type.mjs';
|
|
12
15
|
import '../PropsValues/dateMode.mjs';
|
|
13
16
|
import '../PropsValues/monthFormat.mjs';
|
|
14
|
-
import { Position
|
|
17
|
+
import { Position } from '../PropsValues/position.mjs';
|
|
15
18
|
import '../PropsValues/layouts.mjs';
|
|
16
19
|
import '../PropsValues/status.mjs';
|
|
17
20
|
import '../PropsValues/sentiment.mjs';
|
|
@@ -25,27 +28,8 @@ import '@transferwise/icons';
|
|
|
25
28
|
import 'react-intl';
|
|
26
29
|
import '../CloseButton/CloseButton.messages.mjs';
|
|
27
30
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
28
|
-
import
|
|
29
|
-
import { OverlayIdContext } from '../../Provider/overlay/OverlayIdProvider.mjs';
|
|
31
|
+
import { POPOVER_OFFSET, fallbackPlacements, positionToPlacement, mirrorPositionForRtl } from './Panel.positionUtils.mjs';
|
|
30
32
|
|
|
31
|
-
const POPOVER_OFFSET = 16;
|
|
32
|
-
// By default the flip positioning explores only the opposite alternative. So if left is passed and there's no enough space
|
|
33
|
-
// the right one gets chosen. If there's no space on both sides popover goes back to the initially chosen one left.
|
|
34
|
-
// This mapping forces popover to try the four available positions before going back to the initial chosen one.
|
|
35
|
-
const fallbackPlacements = {
|
|
36
|
-
[Position.TOP]: [Position.BOTTOM, Position.RIGHT, Position.LEFT],
|
|
37
|
-
[Position.BOTTOM]: [Position.TOP, Position.RIGHT, Position.LEFT],
|
|
38
|
-
[Position.LEFT]: [Position.RIGHT, Position.TOP, Position.BOTTOM],
|
|
39
|
-
[Position.RIGHT]: [Position.LEFT, Position.TOP, Position.BOTTOM],
|
|
40
|
-
'top-start': ['bottom-start', 'top-end', 'bottom-end'],
|
|
41
|
-
'top-end': ['bottom-end', 'top-start', 'bottom-start'],
|
|
42
|
-
'bottom-start': ['top-start', 'bottom-end', 'top-end'],
|
|
43
|
-
'bottom-end': ['top-end', 'bottom-start', 'top-start'],
|
|
44
|
-
'left-start': ['right-start', 'left-end', 'right-end'],
|
|
45
|
-
'left-end': ['right-end', 'left-start', 'right-start'],
|
|
46
|
-
'right-start': ['left-start', 'right-end', 'left-end'],
|
|
47
|
-
'right-end': ['left-end', 'right-start', 'left-start']
|
|
48
|
-
};
|
|
49
33
|
const Panel = /*#__PURE__*/forwardRef(function Panel({
|
|
50
34
|
arrow: arrow$1 = false,
|
|
51
35
|
flip: flip$1 = true,
|
|
@@ -60,7 +44,11 @@ const Panel = /*#__PURE__*/forwardRef(function Panel({
|
|
|
60
44
|
...rest
|
|
61
45
|
}, reference) {
|
|
62
46
|
const arrowRef = useRef(null);
|
|
63
|
-
const
|
|
47
|
+
const {
|
|
48
|
+
isRTL
|
|
49
|
+
} = useDirection();
|
|
50
|
+
const resolvedPosition = isRTL ? mirrorPositionForRtl(position) : position;
|
|
51
|
+
const floatingPlacement = positionToPlacement(resolvedPosition);
|
|
64
52
|
const middleware = [];
|
|
65
53
|
if (arrow$1) {
|
|
66
54
|
middleware.push(offset(POPOVER_OFFSET));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Panel.mjs","sources":["../../../src/common/Panel/Panel.tsx"],"sourcesContent":["import {\n arrow as arrowMiddleware,\n autoUpdate,\n flip as flipMiddleware,\n offset,\n
|
|
1
|
+
{"version":3,"file":"Panel.mjs","sources":["../../../src/common/Panel/Panel.tsx"],"sourcesContent":["import {\n arrow as arrowMiddleware,\n autoUpdate,\n flip as flipMiddleware,\n offset,\n shift,\n size as sizeMiddleware,\n useFloating,\n} from '@floating-ui/react';\nimport { clsx } from 'clsx';\nimport {\n CSSProperties,\n HTMLAttributes,\n PropsWithChildren,\n RefObject,\n SyntheticEvent,\n forwardRef,\n useContext,\n useRef,\n} from 'react';\n\nimport { OverlayIdContext } from '../../Provider/overlay/OverlayIdProvider';\nimport Dimmer from '../../Dimmer';\nimport useDirection from '../hooks/useDirection';\nimport { Position } from '..';\nimport {\n type FloatingPlacement,\n POPOVER_OFFSET,\n fallbackPlacements,\n mirrorPositionForRtl,\n positionToPlacement,\n} from './Panel.positionUtils';\n\nexport type PanelProps = PropsWithChildren<{\n arrow?: boolean;\n flip?: boolean;\n altAxis?: boolean;\n open?: boolean;\n onClose?: (event: Event | SyntheticEvent) => void;\n position?: FloatingPlacement;\n anchorRef: RefObject<Element | null>;\n anchorWidth?: boolean;\n considerHeight?: boolean;\n}> &\n HTMLAttributes<HTMLDivElement>;\n\nconst Panel = forwardRef<HTMLDivElement, PanelProps>(function Panel(\n {\n arrow = false,\n flip = true,\n altAxis = false,\n children,\n open = false,\n onClose,\n position = Position.BOTTOM,\n anchorRef,\n anchorWidth = false,\n considerHeight = false,\n ...rest\n }: PanelProps,\n reference,\n) {\n const arrowRef = useRef<HTMLDivElement | null>(null);\n const { isRTL } = useDirection();\n const resolvedPosition = isRTL ? mirrorPositionForRtl(position) : position;\n const floatingPlacement = positionToPlacement(resolvedPosition);\n\n const middleware = [];\n\n if (arrow) {\n middleware.push(offset(POPOVER_OFFSET));\n }\n\n if (flip && fallbackPlacements[floatingPlacement]) {\n middleware.push(\n flipMiddleware({\n fallbackPlacements: fallbackPlacements[floatingPlacement],\n }),\n );\n }\n\n if (altAxis) {\n middleware.push(shift());\n }\n\n if (arrow) {\n middleware.push(arrowMiddleware({ element: arrowRef, padding: 8 }));\n }\n\n if (considerHeight) {\n middleware.push(\n sizeMiddleware({\n padding: POPOVER_OFFSET,\n apply: ({ elements, availableHeight }) => {\n elements.floating.style.setProperty(\n '--np-panel-available-height',\n `${availableHeight}px`,\n );\n },\n }),\n );\n }\n\n const { refs, floatingStyles, placement, middlewareData } = useFloating({\n placement: floatingPlacement,\n middleware,\n elements: {\n reference: anchorRef.current,\n },\n whileElementsMounted: open ? autoUpdate : undefined,\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 const contentStyle: CSSProperties = {\n ...(anchorWidth ? { width: anchorRef.current?.clientWidth } : undefined),\n };\n\n const overlayId = useContext(OverlayIdContext);\n\n return (\n <Dimmer open={open} transparent fadeContentOnEnter fadeContentOnExit onClose={onClose}>\n <div\n id={overlayId}\n {...rest}\n ref={refs.setFloating}\n role=\"dialog\"\n style={floatingStyles}\n data-popper-placement={placement}\n className={clsx('np-panel', { 'np-panel--open': open }, rest.className)}\n >\n <div ref={reference} style={contentStyle} className={clsx('np-panel__content')}>\n {children}\n {/* Arrow has to stay inside content to get the same animations as the \"dialog\" and to get hidden when panel is closed. */}\n {arrow && <div ref={arrowRef} className={clsx('np-panel__arrow')} style={arrowStyle} />}\n </div>\n </div>\n </Dimmer>\n );\n});\n\nexport default Panel;\n"],"names":["Panel","forwardRef","arrow","flip","altAxis","children","open","onClose","position","Position","BOTTOM","anchorRef","anchorWidth","considerHeight","rest","reference","arrowRef","useRef","isRTL","useDirection","resolvedPosition","mirrorPositionForRtl","floatingPlacement","positionToPlacement","middleware","push","offset","POPOVER_OFFSET","fallbackPlacements","flipMiddleware","shift","arrowMiddleware","element","padding","sizeMiddleware","apply","elements","availableHeight","floating","style","setProperty","refs","floatingStyles","placement","middlewareData","useFloating","current","whileElementsMounted","autoUpdate","undefined","arrowStyle","x","left","y","top","contentStyle","width","clientWidth","overlayId","useContext","OverlayIdContext","_jsx","Dimmer","transparent","fadeContentOnEnter","fadeContentOnExit","id","ref","setFloating","role","className","clsx","_jsxs"],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const POPOVER_OFFSET = 16;
|
|
4
|
+
// By default the flip positioning explores only the opposite alternative. So if left is passed and there's no enough space
|
|
5
|
+
// the right one gets chosen. If there's no space on both sides popover goes back to the initially chosen one left.
|
|
6
|
+
// This mapping forces popover to try the four available positions before going back to the initial chosen one.
|
|
7
|
+
const fallbackPlacements = {
|
|
8
|
+
top: ['bottom', 'right', 'left'],
|
|
9
|
+
bottom: ['top', 'right', 'left'],
|
|
10
|
+
left: ['right', 'top', 'bottom'],
|
|
11
|
+
right: ['left', 'top', 'bottom'],
|
|
12
|
+
'top-start': ['bottom-start', 'top-end', 'bottom-end'],
|
|
13
|
+
'top-end': ['bottom-end', 'top-start', 'bottom-start'],
|
|
14
|
+
'bottom-start': ['top-start', 'bottom-end', 'top-end'],
|
|
15
|
+
'bottom-end': ['top-end', 'bottom-start', 'top-start'],
|
|
16
|
+
'left-start': ['right-start', 'left-end', 'right-end'],
|
|
17
|
+
'left-end': ['right-end', 'left-start', 'right-start'],
|
|
18
|
+
'right-start': ['left-start', 'right-end', 'left-end'],
|
|
19
|
+
'right-end': ['left-end', 'right-start', 'left-start']
|
|
20
|
+
};
|
|
21
|
+
const positionToPlacement = position => {
|
|
22
|
+
switch (position) {
|
|
23
|
+
case 'top-left':
|
|
24
|
+
return 'top-start';
|
|
25
|
+
case 'top-right':
|
|
26
|
+
return 'top-end';
|
|
27
|
+
case 'bottom-left':
|
|
28
|
+
return 'bottom-start';
|
|
29
|
+
case 'bottom-right':
|
|
30
|
+
return 'bottom-end';
|
|
31
|
+
case 'left-top':
|
|
32
|
+
return 'left-start';
|
|
33
|
+
case 'left-bottom':
|
|
34
|
+
return 'left-end';
|
|
35
|
+
case 'right-top':
|
|
36
|
+
return 'right-start';
|
|
37
|
+
case 'right-bottom':
|
|
38
|
+
return 'right-end';
|
|
39
|
+
default:
|
|
40
|
+
return position;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const mirrorPositionForRtl = position => {
|
|
44
|
+
switch (position) {
|
|
45
|
+
case 'left':
|
|
46
|
+
return 'right';
|
|
47
|
+
case 'right':
|
|
48
|
+
return 'left';
|
|
49
|
+
case 'left-top':
|
|
50
|
+
return 'right-top';
|
|
51
|
+
case 'left-bottom':
|
|
52
|
+
return 'right-bottom';
|
|
53
|
+
case 'right-top':
|
|
54
|
+
return 'left-top';
|
|
55
|
+
case 'right-bottom':
|
|
56
|
+
return 'left-bottom';
|
|
57
|
+
default:
|
|
58
|
+
// top-left/top-right/bottom-left/bottom-right map to start/end via
|
|
59
|
+
// positionToPlacement, and floating-ui already flips start/end in RTL.
|
|
60
|
+
return position;
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
exports.POPOVER_OFFSET = POPOVER_OFFSET;
|
|
65
|
+
exports.fallbackPlacements = fallbackPlacements;
|
|
66
|
+
exports.mirrorPositionForRtl = mirrorPositionForRtl;
|
|
67
|
+
exports.positionToPlacement = positionToPlacement;
|
|
68
|
+
//# sourceMappingURL=Panel.positionUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Panel.positionUtils.js","sources":["../../../src/common/Panel/Panel.positionUtils.ts"],"sourcesContent":["import type { Placement } from '@floating-ui/react';\n\nexport type FloatingPlacement =\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-left'\n | 'top-right'\n | 'right-top'\n | 'right-bottom'\n | 'bottom-left'\n | 'bottom-right'\n | 'left-top'\n | 'left-bottom';\n\nexport const POPOVER_OFFSET = 16;\n\n// By default the flip positioning explores only the opposite alternative. So if left is passed and there's no enough space\n// the right one gets chosen. If there's no space on both sides popover goes back to the initially chosen one left.\n// This mapping forces popover to try the four available positions before going back to the initial chosen one.\nexport const fallbackPlacements: Record<Placement, Placement[]> = {\n top: ['bottom', 'right', 'left'],\n bottom: ['top', 'right', 'left'],\n left: ['right', 'top', 'bottom'],\n right: ['left', 'top', 'bottom'],\n 'top-start': ['bottom-start', 'top-end', 'bottom-end'],\n 'top-end': ['bottom-end', 'top-start', 'bottom-start'],\n 'bottom-start': ['top-start', 'bottom-end', 'top-end'],\n 'bottom-end': ['top-end', 'bottom-start', 'top-start'],\n 'left-start': ['right-start', 'left-end', 'right-end'],\n 'left-end': ['right-end', 'left-start', 'right-start'],\n 'right-start': ['left-start', 'right-end', 'left-end'],\n 'right-end': ['left-end', 'right-start', 'left-start'],\n};\n\nexport const positionToPlacement = (position: FloatingPlacement): Placement => {\n switch (position) {\n case 'top-left':\n return 'top-start';\n case 'top-right':\n return 'top-end';\n case 'bottom-left':\n return 'bottom-start';\n case 'bottom-right':\n return 'bottom-end';\n case 'left-top':\n return 'left-start';\n case 'left-bottom':\n return 'left-end';\n case 'right-top':\n return 'right-start';\n case 'right-bottom':\n return 'right-end';\n default:\n return position;\n }\n};\n\nexport const mirrorPositionForRtl = (position: FloatingPlacement): FloatingPlacement => {\n switch (position) {\n case 'left':\n return 'right';\n case 'right':\n return 'left';\n case 'left-top':\n return 'right-top';\n case 'left-bottom':\n return 'right-bottom';\n case 'right-top':\n return 'left-top';\n case 'right-bottom':\n return 'left-bottom';\n default:\n // top-left/top-right/bottom-left/bottom-right map to start/end via\n // positionToPlacement, and floating-ui already flips start/end in RTL.\n return position;\n }\n};\n"],"names":["POPOVER_OFFSET","fallbackPlacements","top","bottom","left","right","positionToPlacement","position","mirrorPositionForRtl"],"mappings":";;AAgBO,MAAMA,cAAc,GAAG;AAE9B;AACA;AACA;AACO,MAAMC,kBAAkB,GAAmC;AAChEC,EAAAA,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC;AAChCC,EAAAA,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC;AAChCC,EAAAA,IAAI,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC;AAChCC,EAAAA,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;AAChC,EAAA,WAAW,EAAE,CAAC,cAAc,EAAE,SAAS,EAAE,YAAY,CAAC;AACtD,EAAA,SAAS,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,cAAc,CAAC;AACtD,EAAA,cAAc,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC;AACtD,EAAA,YAAY,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,WAAW,CAAC;AACtD,EAAA,YAAY,EAAE,CAAC,aAAa,EAAE,UAAU,EAAE,WAAW,CAAC;AACtD,EAAA,UAAU,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,CAAC;AACtD,EAAA,aAAa,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,UAAU,CAAC;AACtD,EAAA,WAAW,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,YAAY;;AAGhD,MAAMC,mBAAmB,GAAIC,QAA2B,IAAe;AAC5E,EAAA,QAAQA,QAAQ;AACd,IAAA,KAAK,UAAU;AACb,MAAA,OAAO,WAAW;AACpB,IAAA,KAAK,WAAW;AACd,MAAA,OAAO,SAAS;AAClB,IAAA,KAAK,aAAa;AAChB,MAAA,OAAO,cAAc;AACvB,IAAA,KAAK,cAAc;AACjB,MAAA,OAAO,YAAY;AACrB,IAAA,KAAK,UAAU;AACb,MAAA,OAAO,YAAY;AACrB,IAAA,KAAK,aAAa;AAChB,MAAA,OAAO,UAAU;AACnB,IAAA,KAAK,WAAW;AACd,MAAA,OAAO,aAAa;AACtB,IAAA,KAAK,cAAc;AACjB,MAAA,OAAO,WAAW;AACpB,IAAA;AACE,MAAA,OAAOA,QAAQ;AACnB;AACF;AAEO,MAAMC,oBAAoB,GAAID,QAA2B,IAAuB;AACrF,EAAA,QAAQA,QAAQ;AACd,IAAA,KAAK,MAAM;AACT,MAAA,OAAO,OAAO;AAChB,IAAA,KAAK,OAAO;AACV,MAAA,OAAO,MAAM;AACf,IAAA,KAAK,UAAU;AACb,MAAA,OAAO,WAAW;AACpB,IAAA,KAAK,aAAa;AAChB,MAAA,OAAO,cAAc;AACvB,IAAA,KAAK,WAAW;AACd,MAAA,OAAO,UAAU;AACnB,IAAA,KAAK,cAAc;AACjB,MAAA,OAAO,aAAa;AACtB,IAAA;AACE;AACA;AACA,MAAA,OAAOA,QAAQ;AACnB;AACF;;;;;;;"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
const POPOVER_OFFSET = 16;
|
|
2
|
+
// By default the flip positioning explores only the opposite alternative. So if left is passed and there's no enough space
|
|
3
|
+
// the right one gets chosen. If there's no space on both sides popover goes back to the initially chosen one left.
|
|
4
|
+
// This mapping forces popover to try the four available positions before going back to the initial chosen one.
|
|
5
|
+
const fallbackPlacements = {
|
|
6
|
+
top: ['bottom', 'right', 'left'],
|
|
7
|
+
bottom: ['top', 'right', 'left'],
|
|
8
|
+
left: ['right', 'top', 'bottom'],
|
|
9
|
+
right: ['left', 'top', 'bottom'],
|
|
10
|
+
'top-start': ['bottom-start', 'top-end', 'bottom-end'],
|
|
11
|
+
'top-end': ['bottom-end', 'top-start', 'bottom-start'],
|
|
12
|
+
'bottom-start': ['top-start', 'bottom-end', 'top-end'],
|
|
13
|
+
'bottom-end': ['top-end', 'bottom-start', 'top-start'],
|
|
14
|
+
'left-start': ['right-start', 'left-end', 'right-end'],
|
|
15
|
+
'left-end': ['right-end', 'left-start', 'right-start'],
|
|
16
|
+
'right-start': ['left-start', 'right-end', 'left-end'],
|
|
17
|
+
'right-end': ['left-end', 'right-start', 'left-start']
|
|
18
|
+
};
|
|
19
|
+
const positionToPlacement = position => {
|
|
20
|
+
switch (position) {
|
|
21
|
+
case 'top-left':
|
|
22
|
+
return 'top-start';
|
|
23
|
+
case 'top-right':
|
|
24
|
+
return 'top-end';
|
|
25
|
+
case 'bottom-left':
|
|
26
|
+
return 'bottom-start';
|
|
27
|
+
case 'bottom-right':
|
|
28
|
+
return 'bottom-end';
|
|
29
|
+
case 'left-top':
|
|
30
|
+
return 'left-start';
|
|
31
|
+
case 'left-bottom':
|
|
32
|
+
return 'left-end';
|
|
33
|
+
case 'right-top':
|
|
34
|
+
return 'right-start';
|
|
35
|
+
case 'right-bottom':
|
|
36
|
+
return 'right-end';
|
|
37
|
+
default:
|
|
38
|
+
return position;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const mirrorPositionForRtl = position => {
|
|
42
|
+
switch (position) {
|
|
43
|
+
case 'left':
|
|
44
|
+
return 'right';
|
|
45
|
+
case 'right':
|
|
46
|
+
return 'left';
|
|
47
|
+
case 'left-top':
|
|
48
|
+
return 'right-top';
|
|
49
|
+
case 'left-bottom':
|
|
50
|
+
return 'right-bottom';
|
|
51
|
+
case 'right-top':
|
|
52
|
+
return 'left-top';
|
|
53
|
+
case 'right-bottom':
|
|
54
|
+
return 'left-bottom';
|
|
55
|
+
default:
|
|
56
|
+
// top-left/top-right/bottom-left/bottom-right map to start/end via
|
|
57
|
+
// positionToPlacement, and floating-ui already flips start/end in RTL.
|
|
58
|
+
return position;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export { POPOVER_OFFSET, fallbackPlacements, mirrorPositionForRtl, positionToPlacement };
|
|
63
|
+
//# sourceMappingURL=Panel.positionUtils.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Panel.positionUtils.mjs","sources":["../../../src/common/Panel/Panel.positionUtils.ts"],"sourcesContent":["import type { Placement } from '@floating-ui/react';\n\nexport type FloatingPlacement =\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-left'\n | 'top-right'\n | 'right-top'\n | 'right-bottom'\n | 'bottom-left'\n | 'bottom-right'\n | 'left-top'\n | 'left-bottom';\n\nexport const POPOVER_OFFSET = 16;\n\n// By default the flip positioning explores only the opposite alternative. So if left is passed and there's no enough space\n// the right one gets chosen. If there's no space on both sides popover goes back to the initially chosen one left.\n// This mapping forces popover to try the four available positions before going back to the initial chosen one.\nexport const fallbackPlacements: Record<Placement, Placement[]> = {\n top: ['bottom', 'right', 'left'],\n bottom: ['top', 'right', 'left'],\n left: ['right', 'top', 'bottom'],\n right: ['left', 'top', 'bottom'],\n 'top-start': ['bottom-start', 'top-end', 'bottom-end'],\n 'top-end': ['bottom-end', 'top-start', 'bottom-start'],\n 'bottom-start': ['top-start', 'bottom-end', 'top-end'],\n 'bottom-end': ['top-end', 'bottom-start', 'top-start'],\n 'left-start': ['right-start', 'left-end', 'right-end'],\n 'left-end': ['right-end', 'left-start', 'right-start'],\n 'right-start': ['left-start', 'right-end', 'left-end'],\n 'right-end': ['left-end', 'right-start', 'left-start'],\n};\n\nexport const positionToPlacement = (position: FloatingPlacement): Placement => {\n switch (position) {\n case 'top-left':\n return 'top-start';\n case 'top-right':\n return 'top-end';\n case 'bottom-left':\n return 'bottom-start';\n case 'bottom-right':\n return 'bottom-end';\n case 'left-top':\n return 'left-start';\n case 'left-bottom':\n return 'left-end';\n case 'right-top':\n return 'right-start';\n case 'right-bottom':\n return 'right-end';\n default:\n return position;\n }\n};\n\nexport const mirrorPositionForRtl = (position: FloatingPlacement): FloatingPlacement => {\n switch (position) {\n case 'left':\n return 'right';\n case 'right':\n return 'left';\n case 'left-top':\n return 'right-top';\n case 'left-bottom':\n return 'right-bottom';\n case 'right-top':\n return 'left-top';\n case 'right-bottom':\n return 'left-bottom';\n default:\n // top-left/top-right/bottom-left/bottom-right map to start/end via\n // positionToPlacement, and floating-ui already flips start/end in RTL.\n return position;\n }\n};\n"],"names":["POPOVER_OFFSET","fallbackPlacements","top","bottom","left","right","positionToPlacement","position","mirrorPositionForRtl"],"mappings":"AAgBO,MAAMA,cAAc,GAAG;AAE9B;AACA;AACA;AACO,MAAMC,kBAAkB,GAAmC;AAChEC,EAAAA,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC;AAChCC,EAAAA,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC;AAChCC,EAAAA,IAAI,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC;AAChCC,EAAAA,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;AAChC,EAAA,WAAW,EAAE,CAAC,cAAc,EAAE,SAAS,EAAE,YAAY,CAAC;AACtD,EAAA,SAAS,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,cAAc,CAAC;AACtD,EAAA,cAAc,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC;AACtD,EAAA,YAAY,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,WAAW,CAAC;AACtD,EAAA,YAAY,EAAE,CAAC,aAAa,EAAE,UAAU,EAAE,WAAW,CAAC;AACtD,EAAA,UAAU,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,CAAC;AACtD,EAAA,aAAa,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,UAAU,CAAC;AACtD,EAAA,WAAW,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,YAAY;;AAGhD,MAAMC,mBAAmB,GAAIC,QAA2B,IAAe;AAC5E,EAAA,QAAQA,QAAQ;AACd,IAAA,KAAK,UAAU;AACb,MAAA,OAAO,WAAW;AACpB,IAAA,KAAK,WAAW;AACd,MAAA,OAAO,SAAS;AAClB,IAAA,KAAK,aAAa;AAChB,MAAA,OAAO,cAAc;AACvB,IAAA,KAAK,cAAc;AACjB,MAAA,OAAO,YAAY;AACrB,IAAA,KAAK,UAAU;AACb,MAAA,OAAO,YAAY;AACrB,IAAA,KAAK,aAAa;AAChB,MAAA,OAAO,UAAU;AACnB,IAAA,KAAK,WAAW;AACd,MAAA,OAAO,aAAa;AACtB,IAAA,KAAK,cAAc;AACjB,MAAA,OAAO,WAAW;AACpB,IAAA;AACE,MAAA,OAAOA,QAAQ;AACnB;AACF;AAEO,MAAMC,oBAAoB,GAAID,QAA2B,IAAuB;AACrF,EAAA,QAAQA,QAAQ;AACd,IAAA,KAAK,MAAM;AACT,MAAA,OAAO,OAAO;AAChB,IAAA,KAAK,OAAO;AACV,MAAA,OAAO,MAAM;AACf,IAAA,KAAK,UAAU;AACb,MAAA,OAAO,WAAW;AACpB,IAAA,KAAK,aAAa;AAChB,MAAA,OAAO,cAAc;AACvB,IAAA,KAAK,WAAW;AACd,MAAA,OAAO,UAAU;AACnB,IAAA,KAAK,cAAc;AACjB,MAAA,OAAO,aAAa;AACtB,IAAA;AACE;AACA;AACA,MAAA,OAAOA,QAAQ;AACnB;AACF;;;;"}
|