@transferwise/components 0.0.0-experimental-b7402e7 → 0.0.0-experimental-3d4c2d5
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/index.esm.js +105 -2
- package/build/index.esm.js.map +1 -1
- package/build/index.js +105 -1
- package/build/index.js.map +1 -1
- package/build/main.css +101 -0
- package/build/styles/main.css +101 -0
- package/build/styles/segmentedControl/SegmentedControl.css +101 -0
- package/build/types/index.d.ts +2 -0
- package/build/types/index.d.ts.map +1 -1
- package/build/types/segmentedControl/SegmentedControl.d.ts +31 -0
- package/build/types/segmentedControl/SegmentedControl.d.ts.map +1 -0
- package/build/types/segmentedControl/index.d.ts +3 -0
- package/build/types/segmentedControl/index.d.ts.map +1 -0
- package/package.json +4 -4
- package/src/index.ts +2 -0
- package/src/main.css +101 -0
- package/src/main.less +1 -0
- package/src/segmentedControl/SegmentedControl.css +101 -0
- package/src/segmentedControl/SegmentedControl.less +101 -0
- package/src/segmentedControl/SegmentedControl.spec.tsx +106 -0
- package/src/segmentedControl/SegmentedControl.story.tsx +55 -0
- package/src/segmentedControl/SegmentedControl.tsx +175 -0
- package/src/segmentedControl/index.ts +2 -0
- package/src/ssr.spec.js +17 -0
- package/src/withDisplayFormat/WithDisplayFormat.spec.js +1 -1
- package/src/withDisplayFormat/WithDisplayFormat.tsx +1 -1
package/build/index.js
CHANGED
|
@@ -7544,7 +7544,7 @@ class WithDisplayFormat extends React.Component {
|
|
|
7544
7544
|
const cursorPosition = getCursorPositionAfterKeystroke(action, selectionStart, selectionEnd, displayPattern, pastedLength);
|
|
7545
7545
|
setTimeout(() => {
|
|
7546
7546
|
if (triggerEvent) {
|
|
7547
|
-
triggerEvent.
|
|
7547
|
+
triggerEvent.target.setSelectionRange(cursorPosition, cursorPosition);
|
|
7548
7548
|
}
|
|
7549
7549
|
this.setState({
|
|
7550
7550
|
selectionStart: cursorPosition,
|
|
@@ -11076,6 +11076,109 @@ Select.defaultProps = {
|
|
|
11076
11076
|
dropdownProps: {}
|
|
11077
11077
|
};
|
|
11078
11078
|
|
|
11079
|
+
const SegmentedControl = ({
|
|
11080
|
+
name,
|
|
11081
|
+
defaultValue,
|
|
11082
|
+
mode = 'input',
|
|
11083
|
+
segments,
|
|
11084
|
+
onChange
|
|
11085
|
+
}) => {
|
|
11086
|
+
const [selectedValue, setSelectedValue] = React.useState(defaultValue || segments[0].value);
|
|
11087
|
+
const [animate, setAnimate] = React.useState(false);
|
|
11088
|
+
const segmentsRef = React.useRef(null);
|
|
11089
|
+
if (segments.length > 3) {
|
|
11090
|
+
throw new Error('SegmentedControl only supports up to 3 segments. Please refer to: https://wise.design/components/segmented-control');
|
|
11091
|
+
}
|
|
11092
|
+
const segmentsWithRefs = segments.map(segment => ({
|
|
11093
|
+
...segment,
|
|
11094
|
+
ref: /*#__PURE__*/React.createRef()
|
|
11095
|
+
}));
|
|
11096
|
+
const updateSegmentPosition = () => {
|
|
11097
|
+
const selectedSegmentRef = segmentsWithRefs.find(segment => segment.value === selectedValue)?.ref;
|
|
11098
|
+
// We grab the active segments style object from the ref
|
|
11099
|
+
// and set the css variables to the selected segments width and x position.
|
|
11100
|
+
// This is so we can animate the highlight to the selected segment
|
|
11101
|
+
if (selectedSegmentRef?.current && segmentsRef.current) {
|
|
11102
|
+
const {
|
|
11103
|
+
style
|
|
11104
|
+
} = segmentsRef.current;
|
|
11105
|
+
style.setProperty('--segment-highlight-width', `${selectedSegmentRef.current.offsetWidth}px`);
|
|
11106
|
+
style.setProperty('--segment-highlight-x', `${selectedSegmentRef.current.offsetLeft}px`);
|
|
11107
|
+
}
|
|
11108
|
+
};
|
|
11109
|
+
React.useEffect(() => {
|
|
11110
|
+
updateSegmentPosition();
|
|
11111
|
+
const handleWindowSizeChange = () => {
|
|
11112
|
+
setAnimate(false);
|
|
11113
|
+
updateSegmentPosition();
|
|
11114
|
+
};
|
|
11115
|
+
window.addEventListener('resize', handleWindowSizeChange);
|
|
11116
|
+
return () => {
|
|
11117
|
+
window.removeEventListener('resize', handleWindowSizeChange);
|
|
11118
|
+
};
|
|
11119
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
11120
|
+
}, [segmentsWithRefs, selectedValue]);
|
|
11121
|
+
React.useEffect(() => {
|
|
11122
|
+
onChange(selectedValue);
|
|
11123
|
+
}, [onChange, selectedValue]);
|
|
11124
|
+
return /*#__PURE__*/jsxRuntime.jsx("div", {
|
|
11125
|
+
ref: segmentsRef,
|
|
11126
|
+
"data-testid": "segmented-control",
|
|
11127
|
+
className: classNames__default.default('segmented-control', {
|
|
11128
|
+
'segmented-control--input': mode === 'input'
|
|
11129
|
+
}),
|
|
11130
|
+
children: /*#__PURE__*/jsxRuntime.jsx("div", {
|
|
11131
|
+
className: classNames__default.default('segmented-control__segments', {
|
|
11132
|
+
'segmented-control__segments--no-animate': !animate
|
|
11133
|
+
}),
|
|
11134
|
+
children: segmentsWithRefs.map(segment => mode === 'input' ? /*#__PURE__*/jsxRuntime.jsxs("label", {
|
|
11135
|
+
ref: segment.ref,
|
|
11136
|
+
htmlFor: segment.id,
|
|
11137
|
+
className: classNames__default.default('segmented-control__segment', {
|
|
11138
|
+
'segmented-control__selected-segment': selectedValue === segment.value
|
|
11139
|
+
}),
|
|
11140
|
+
children: [/*#__PURE__*/jsxRuntime.jsx("input", {
|
|
11141
|
+
type: "radio",
|
|
11142
|
+
className: "segmented-control__radio-input",
|
|
11143
|
+
id: segment.id,
|
|
11144
|
+
name: name,
|
|
11145
|
+
value: segment.value,
|
|
11146
|
+
checked: selectedValue === segment.value,
|
|
11147
|
+
onChange: () => {
|
|
11148
|
+
setAnimate(true);
|
|
11149
|
+
setSelectedValue(segment.value);
|
|
11150
|
+
}
|
|
11151
|
+
}), /*#__PURE__*/jsxRuntime.jsx(Body, {
|
|
11152
|
+
className: "segmented-control__text",
|
|
11153
|
+
as: "span",
|
|
11154
|
+
type: selectedValue === segment.value ? exports.Typography.BODY_DEFAULT_BOLD : exports.Typography.BODY_DEFAULT,
|
|
11155
|
+
children: segment.label
|
|
11156
|
+
})]
|
|
11157
|
+
}, segment.id) : /*#__PURE__*/jsxRuntime.jsx("button", {
|
|
11158
|
+
ref: segment.ref,
|
|
11159
|
+
type: "button",
|
|
11160
|
+
role: "tab",
|
|
11161
|
+
id: segment.id,
|
|
11162
|
+
"aria-controls": segment.controls,
|
|
11163
|
+
"aria-selected": selectedValue === segment.value,
|
|
11164
|
+
className: classNames__default.default('segmented-control__segment', 'segmented-control__button', {
|
|
11165
|
+
'segmented-control__selected-segment': selectedValue === segment.value
|
|
11166
|
+
}),
|
|
11167
|
+
onClick: () => {
|
|
11168
|
+
setAnimate(true);
|
|
11169
|
+
setSelectedValue(segment.value);
|
|
11170
|
+
},
|
|
11171
|
+
children: /*#__PURE__*/jsxRuntime.jsx(Body, {
|
|
11172
|
+
as: "span",
|
|
11173
|
+
className: "segmented-control__text",
|
|
11174
|
+
type: selectedValue === segment.value ? exports.Typography.BODY_DEFAULT_BOLD : exports.Typography.BODY_DEFAULT,
|
|
11175
|
+
children: segment.label
|
|
11176
|
+
})
|
|
11177
|
+
}, segment.id))
|
|
11178
|
+
})
|
|
11179
|
+
});
|
|
11180
|
+
};
|
|
11181
|
+
|
|
11079
11182
|
const CSS_TRANSITION_DURATION = 400;
|
|
11080
11183
|
class Snackbar extends React.Component {
|
|
11081
11184
|
bodyRef = /*#__PURE__*/React.createRef();
|
|
@@ -15521,6 +15624,7 @@ exports.RadioOption = RadioOption$1;
|
|
|
15521
15624
|
exports.SUPPORTED_LANGUAGES = SUPPORTED_LANGUAGES;
|
|
15522
15625
|
exports.SearchInput = SearchInput;
|
|
15523
15626
|
exports.Section = Section;
|
|
15627
|
+
exports.SegmentedControl = SegmentedControl;
|
|
15524
15628
|
exports.Select = Select;
|
|
15525
15629
|
exports.SelectInput = SelectInput;
|
|
15526
15630
|
exports.SelectInputOptionContent = SelectInputOptionContent;
|