@rabbitio/ui-kit 1.0.0-beta.60 → 1.0.0-beta.63
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/coverage/clover.xml +112 -14
- package/coverage/coverage-final.json +8 -5
- package/coverage/index.html +34 -19
- package/coverage/ui-kit/index.html +1 -1
- package/coverage/ui-kit/index.js.html +1 -1
- package/coverage/ui-kit/src/assets/wrappedImages/arrowIcon.jsx.html +1 -1
- package/coverage/ui-kit/src/assets/wrappedImages/arrowTosca.jsx.html +1 -1
- package/coverage/ui-kit/src/assets/wrappedImages/arrowWhite.jsx.html +1 -1
- package/coverage/ui-kit/src/assets/wrappedImages/darkRectangle.jsx.html +1 -1
- package/coverage/ui-kit/src/assets/wrappedImages/determinedError.jsx.html +1 -1
- package/coverage/ui-kit/src/assets/wrappedImages/failedValidationIcon.jsx.html +1 -1
- package/coverage/ui-kit/src/assets/wrappedImages/index.html +1 -1
- package/coverage/ui-kit/src/assets/wrappedImages/infoIcon.jsx.html +1 -1
- package/coverage/ui-kit/src/assets/wrappedImages/noticeQuestionIcon.jsx.html +1 -1
- package/coverage/ui-kit/src/assets/wrappedImages/successfulValidationIcon.jsx.html +1 -1
- package/coverage/ui-kit/src/assets/wrappedImages/walletIcon.jsx.html +1 -1
- package/coverage/ui-kit/src/common/adapters/axiosAdapter.js.html +1 -1
- package/coverage/ui-kit/src/common/adapters/index.html +1 -1
- package/coverage/ui-kit/src/common/adapters/qrUtils.js.html +1 -1
- package/coverage/ui-kit/src/common/amountUtils.js.html +1 -1
- package/coverage/ui-kit/src/common/errorUtils.js.html +1 -1
- package/coverage/ui-kit/src/common/external-apis/apiGroups.js.html +1 -1
- package/coverage/ui-kit/src/common/external-apis/index.html +1 -1
- package/coverage/ui-kit/src/common/external-apis/ipAddressProviders.js.html +1 -1
- package/coverage/ui-kit/src/common/fiatCurrenciesService.js.html +1 -1
- package/coverage/ui-kit/src/common/index.html +1 -1
- package/coverage/ui-kit/src/common/models/blockchain.js.html +1 -1
- package/coverage/ui-kit/src/common/models/coin.js.html +1 -1
- package/coverage/ui-kit/src/common/models/index.html +1 -1
- package/coverage/ui-kit/src/common/models/protocol.js.html +1 -1
- package/coverage/ui-kit/src/common/utils/cache.js.html +1 -1
- package/coverage/ui-kit/src/common/utils/emailAPI.js.html +1 -1
- package/coverage/ui-kit/src/common/utils/index.html +1 -1
- package/coverage/ui-kit/src/common/utils/logging/index.html +1 -1
- package/coverage/ui-kit/src/common/utils/logging/logger.js.html +1 -1
- package/coverage/ui-kit/src/common/utils/logging/logsStorage.js.html +1 -1
- package/coverage/ui-kit/src/common/utils/postponeExecution.js.html +1 -1
- package/coverage/ui-kit/src/common/utils/safeStringify.js.html +1 -1
- package/coverage/ui-kit/src/components/atoms/AssetIcon/AssetIcon.jsx.html +1 -1
- package/coverage/ui-kit/src/components/atoms/AssetIcon/index.html +1 -1
- package/coverage/ui-kit/src/components/atoms/AssetSelection/AssetSelection.jsx.html +1 -1
- package/coverage/ui-kit/src/components/atoms/AssetSelection/index.html +1 -1
- package/coverage/ui-kit/src/components/atoms/BackgroundTitle/BackgroundTitle.jsx.html +1 -1
- package/coverage/ui-kit/src/components/atoms/BackgroundTitle/index.html +1 -1
- package/coverage/ui-kit/src/components/atoms/InformationMessage/InformationMessage.jsx.html +1 -1
- package/coverage/ui-kit/src/components/atoms/InformationMessage/index.html +1 -1
- package/coverage/ui-kit/src/components/atoms/Input/Input.jsx.html +1 -1
- package/coverage/ui-kit/src/components/atoms/Input/index.html +1 -1
- package/coverage/ui-kit/src/components/atoms/LoadingDots/LoadingDots.jsx.html +1 -1
- package/coverage/ui-kit/src/components/atoms/LoadingDots/index.html +1 -1
- package/coverage/ui-kit/src/components/atoms/NoticeIcon/NoticeIcon.jsx.html +1 -1
- package/coverage/ui-kit/src/components/atoms/NoticeIcon/index.html +1 -1
- package/coverage/ui-kit/src/components/atoms/QrCode/QrCode.jsx.html +1 -1
- package/coverage/ui-kit/src/components/atoms/QrCode/index.html +1 -1
- package/coverage/ui-kit/src/components/atoms/RateSelector/RateSelector.jsx.html +196 -0
- package/coverage/ui-kit/src/components/atoms/RateSelector/index.html +116 -0
- package/coverage/ui-kit/src/components/atoms/SupportChat/SupportChat.jsx.html +1 -1
- package/coverage/ui-kit/src/components/atoms/SupportChat/index.html +1 -1
- package/coverage/ui-kit/src/components/atoms/Textarea/Textarea.jsx.html +1 -1
- package/coverage/ui-kit/src/components/atoms/Textarea/index.html +1 -1
- package/coverage/ui-kit/src/components/atoms/TitleBox/TitleBox.jsx.html +1 -1
- package/coverage/ui-kit/src/components/atoms/TitleBox/index.html +1 -1
- package/coverage/ui-kit/src/components/atoms/Tooltip/Tooltip.jsx.html +1 -1
- package/coverage/ui-kit/src/components/atoms/Tooltip/index.html +1 -1
- package/coverage/ui-kit/src/components/atoms/TwoLinesOfText/LinesOfText.jsx.html +1 -1
- package/coverage/ui-kit/src/components/atoms/TwoLinesOfText/index.html +1 -1
- package/coverage/ui-kit/src/components/atoms/Validation/Validation.jsx.html +1 -1
- package/coverage/ui-kit/src/components/atoms/Validation/index.html +1 -1
- package/coverage/ui-kit/src/components/atoms/buttons/Button/Button.jsx.html +1 -1
- package/coverage/ui-kit/src/components/atoms/buttons/Button/index.html +1 -1
- package/coverage/ui-kit/src/components/atoms/buttons/Close/Close.jsx.html +1 -1
- package/coverage/ui-kit/src/components/atoms/buttons/Close/index.html +1 -1
- package/coverage/ui-kit/src/components/atoms/buttons/LinkButton/LinkButton.jsx.html +1 -1
- package/coverage/ui-kit/src/components/atoms/buttons/LinkButton/index.html +1 -1
- package/coverage/ui-kit/src/components/atoms/buttons/RadioButtonWithText/RadioButtonWithText.jsx.html +1 -1
- package/coverage/ui-kit/src/components/atoms/buttons/RadioButtonWithText/index.html +1 -1
- package/coverage/ui-kit/src/components/hooks/index.html +1 -1
- package/coverage/ui-kit/src/components/hooks/useCallHandlingErrors.js.html +1 -1
- package/coverage/ui-kit/src/components/hooks/useReferredState.js.html +1 -1
- package/coverage/ui-kit/src/components/molecules/AmountInput/AmountInput.jsx.html +1 -1
- package/coverage/ui-kit/src/components/molecules/AmountInput/index.html +1 -1
- package/coverage/ui-kit/src/components/molecules/CoinPicker/CoinPicker.jsx.html +1 -1
- package/coverage/ui-kit/src/components/molecules/CoinPicker/index.html +1 -1
- package/coverage/ui-kit/src/components/molecules/LineWithIconLink/LineWithIconLink.jsx.html +1 -1
- package/coverage/ui-kit/src/components/molecules/LineWithIconLink/index.html +1 -1
- package/coverage/ui-kit/src/components/molecules/TitledLineWithIconLink/TitledLineWithIconLink.jsx.html +1 -1
- package/coverage/ui-kit/src/components/molecules/TitledLineWithIconLink/index.html +1 -1
- package/coverage/ui-kit/src/components/organisms/CoinPickerDialogStep/CoinPickerDialogStep.jsx.html +1 -1
- package/coverage/ui-kit/src/components/organisms/CoinPickerDialogStep/index.html +1 -1
- package/coverage/ui-kit/src/components/organisms/Dialog/Dialog.jsx.html +1 -1
- package/coverage/ui-kit/src/components/organisms/Dialog/DialogButtons/DialogButtons.jsx.html +1 -1
- package/coverage/ui-kit/src/components/organisms/Dialog/DialogButtons/index.html +1 -1
- package/coverage/ui-kit/src/components/organisms/Dialog/DialogStep/DialogStep.jsx.html +1 -1
- package/coverage/ui-kit/src/components/organisms/Dialog/DialogStep/index.html +1 -1
- package/coverage/ui-kit/src/components/organisms/Dialog/index.html +1 -1
- package/coverage/ui-kit/src/components/organisms/SwapForm/SwapForm.jsx.html +97 -4
- package/coverage/ui-kit/src/components/organisms/SwapForm/index.html +5 -5
- package/coverage/ui-kit/src/components/templates/DeterminedErrorDialogStep/DeterminedErrorDialogStep.jsx.html +1 -1
- package/coverage/ui-kit/src/components/templates/DeterminedErrorDialogStep/index.html +1 -1
- package/coverage/ui-kit/src/components/utils/index.html +1 -1
- package/coverage/ui-kit/src/components/utils/inputValueProviders.js.html +1 -1
- package/coverage/ui-kit/src/components/utils/textUtils.js.html +1 -1
- package/coverage/ui-kit/src/components/utils/uiUtils.js.html +1 -1
- package/coverage/ui-kit/src/components/utils/urlQueryUtils.js.html +1 -1
- package/coverage/ui-kit/src/constants/atoms/Close/close.jsx.html +1 -1
- package/coverage/ui-kit/src/constants/atoms/Close/index.html +1 -1
- package/coverage/ui-kit/src/constants/atoms/LinkButton/index.html +1 -1
- package/coverage/ui-kit/src/constants/atoms/LinkButton/linkButton.jsx.html +1 -1
- package/coverage/ui-kit/src/constants/atoms/Tooltip/index.html +1 -1
- package/coverage/ui-kit/src/constants/atoms/Tooltip/tooltip.jsx.html +1 -1
- package/coverage/ui-kit/src/constants/globalConstants.jsx.html +1 -1
- package/coverage/ui-kit/src/constants/index.html +1 -1
- package/coverage/ui-kit/src/constants/organisms/dialog/DialogStep/dialogStep.js.html +1 -1
- package/coverage/ui-kit/src/constants/organisms/dialog/DialogStep/index.html +1 -1
- package/coverage/ui-kit/src/constants/organisms/dialog/dialog.js.html +1 -1
- package/coverage/ui-kit/src/constants/organisms/dialog/index.html +1 -1
- package/coverage/ui-kit/src/index.html +1 -1
- package/coverage/ui-kit/src/index.js.html +1 -1
- package/coverage/ui-kit/src/robustExteranlApiCallerService/cacheAndConcurrentRequestsResolver.js.html +1 -1
- package/coverage/ui-kit/src/robustExteranlApiCallerService/cachedRobustExternalApiCallerService.js.html +1 -1
- package/coverage/ui-kit/src/robustExteranlApiCallerService/cancelProcessing.js.html +1 -1
- package/coverage/ui-kit/src/robustExteranlApiCallerService/concurrentCalculationsMetadataHolder.js.html +1 -1
- package/coverage/ui-kit/src/robustExteranlApiCallerService/externalApiProvider.js.html +1 -1
- package/coverage/ui-kit/src/robustExteranlApiCallerService/externalServicesStatsCollector.js.html +1 -1
- package/coverage/ui-kit/src/robustExteranlApiCallerService/index.html +1 -1
- package/coverage/ui-kit/src/robustExteranlApiCallerService/robustExternalAPICallerService.js.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/external-apis/index.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/external-apis/swapProvider.js.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/external-apis/swapspaceSwapProvider.js.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/models/baseSwapCreationInfo.js.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/models/existingSwap.js.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/models/existingSwapWithFiatData.js.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/models/index.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/services/index.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/services/publicSwapService.js.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/utils/index.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/utils/swapUtils.js.html +1 -1
- package/coverage/ui-kit/stories/atoms/BackgroundTitle.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/atoms/LinesOfText.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/atoms/LoadingDots.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/atoms/QrCode.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/atoms/RateSelector.stories.jsx.html +136 -0
- package/coverage/ui-kit/stories/atoms/Validation.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/atoms/buttons/Button.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/atoms/buttons/Close.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/atoms/buttons/LinkButton.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/atoms/buttons/index.html +1 -1
- package/coverage/ui-kit/stories/atoms/index.html +20 -5
- package/coverage/ui-kit/stories/molecules/LineWithIconLink.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/molecules/TitledLineWithIconLink.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/molecules/index.html +1 -1
- package/coverage/ui-kit/stories/organisms/Dialog/Dialog.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/organisms/Dialog/DialogButtons/DialogButtons.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/organisms/Dialog/DialogButtons/index.html +1 -1
- package/coverage/ui-kit/stories/organisms/Dialog/DialogStep/DialogStep.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/organisms/Dialog/DialogStep/index.html +1 -1
- package/coverage/ui-kit/stories/organisms/Dialog/index.html +1 -1
- package/coverage/ui-kit/stories/stubs/exampleContent.jsx.html +1 -1
- package/coverage/ui-kit/stories/stubs/index.html +1 -1
- package/coverage/ui-kit/stories/templates/DeterminedErrorDialogStep.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/templates/index.html +1 -1
- package/dist/index.cjs +176 -123
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +3095 -239
- package/dist/index.css.map +1 -1
- package/dist/index.modern.js +157 -112
- package/dist/index.modern.js.map +1 -1
- package/dist/index.module.js +176 -123
- package/dist/index.module.js.map +1 -1
- package/dist/index.umd.js +176 -123
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
- package/src/components/atoms/RateSelector/RateSelector.jsx +37 -0
- package/src/components/atoms/RateSelector/rate-selector.module.scss +47 -0
- package/src/components/atoms/TwoLinesOfText/lines-of-text.module.scss +1 -0
- package/src/components/organisms/SwapForm/SwapForm.jsx +31 -0
- package/src/components/organisms/SwapForm/swap-form.module.scss +6 -0
package/package.json
CHANGED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
import s from "./rate-selector.module.scss";
|
|
4
|
+
|
|
5
|
+
export const RateSelector = ({
|
|
6
|
+
isFixed = false,
|
|
7
|
+
setIsFixed = () => {},
|
|
8
|
+
translations = {
|
|
9
|
+
floatingRate: "Floating rate",
|
|
10
|
+
fixedRate: "Fixed rate",
|
|
11
|
+
},
|
|
12
|
+
}) => {
|
|
13
|
+
return (
|
|
14
|
+
<div className={s["rate-selector"]}>
|
|
15
|
+
<div
|
|
16
|
+
className={`${s["rate-selector-item"]} ${
|
|
17
|
+
!isFixed ? s["selected"] : ""
|
|
18
|
+
}`}
|
|
19
|
+
onClick={() => setIsFixed(false)}
|
|
20
|
+
>
|
|
21
|
+
<div className={s["rate-selector-item-text"]}>
|
|
22
|
+
{translations.floatingRate}
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
<div
|
|
26
|
+
className={`${s["rate-selector-item"]} ${
|
|
27
|
+
isFixed ? s["selected"] : ""
|
|
28
|
+
}`}
|
|
29
|
+
onClick={() => setIsFixed(true)}
|
|
30
|
+
>
|
|
31
|
+
<div className={s["rate-selector-item-text"]}>
|
|
32
|
+
{translations.fixedRate}
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
);
|
|
37
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
@import "../../../../styles/index";
|
|
2
|
+
|
|
3
|
+
.rate-selector {
|
|
4
|
+
background-color: SolidColor("lightsmoke");
|
|
5
|
+
border-radius: 8px;
|
|
6
|
+
padding: 4px;
|
|
7
|
+
display: flex;
|
|
8
|
+
flex-direction: row;
|
|
9
|
+
gap: Margin("1");
|
|
10
|
+
user-select: none;
|
|
11
|
+
width: 100%;
|
|
12
|
+
|
|
13
|
+
&-item {
|
|
14
|
+
display: flex;
|
|
15
|
+
flex-direction: row;
|
|
16
|
+
justify-content: center;
|
|
17
|
+
align-items: center;
|
|
18
|
+
padding: Padding("3") Padding("3");
|
|
19
|
+
flex: 1 1;
|
|
20
|
+
border-radius: 4px;
|
|
21
|
+
gap: Margin("1");
|
|
22
|
+
cursor: pointer;
|
|
23
|
+
transition: 0.2s all $transitionEaseOut;
|
|
24
|
+
box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0);
|
|
25
|
+
|
|
26
|
+
@media (hover: hover) {
|
|
27
|
+
&:not(.selected):hover {
|
|
28
|
+
box-shadow: 0px 0px 0px 1px SolidColor("smoke");
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
&:not(.selected):active {
|
|
33
|
+
box-shadow: 0px 0px 0px 1px SolidColor("smoke");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
&.selected {
|
|
37
|
+
background: $white;
|
|
38
|
+
color: SolidColor("tosca");
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
&-text {
|
|
42
|
+
font-weight: $semi-bold;
|
|
43
|
+
text-align: center;
|
|
44
|
+
font-size: 16px;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -14,6 +14,7 @@ import { Validation } from "../../atoms/Validation/Validation.jsx";
|
|
|
14
14
|
import { Button } from "../../atoms/buttons/Button/Button.jsx";
|
|
15
15
|
import { Textarea } from "../../atoms/Textarea/Textarea.jsx";
|
|
16
16
|
import { TOOLTIP_POSITIONS } from "../../../constants/atoms/Tooltip/tooltip.jsx";
|
|
17
|
+
import { RateSelector } from "../../atoms/RateSelector/RateSelector.jsx";
|
|
17
18
|
|
|
18
19
|
/**
|
|
19
20
|
* This is the type definition of a function used inside SwapForm to compose the URL for the hero button.
|
|
@@ -259,6 +260,10 @@ export const SwapForm = ({
|
|
|
259
260
|
extraIdNotice:
|
|
260
261
|
"Please check if your recipient address requires a 'Memo' or 'Destination Tag' - sometimes called a tag, ID, label, or a note. Exchanges may require such ID for the deposit. Including this identifier is crucial when required, as omitting or misentering it can result in lost assets.",
|
|
261
262
|
},
|
|
263
|
+
rateSelector: {
|
|
264
|
+
floatingRate: "Floating rate",
|
|
265
|
+
fixedRate: "Fixed rate",
|
|
266
|
+
},
|
|
262
267
|
confirmButtonText: "Swap",
|
|
263
268
|
},
|
|
264
269
|
swapSeparatorIconSrc,
|
|
@@ -270,6 +275,8 @@ export const SwapForm = ({
|
|
|
270
275
|
setRecepientAddress,
|
|
271
276
|
setRecepientAddressExtraId,
|
|
272
277
|
recepientAddressExtraIdAvailable = false,
|
|
278
|
+
isFixed,
|
|
279
|
+
setIsFixed,
|
|
273
280
|
}) => {
|
|
274
281
|
const DETAIL_REFRESH_INTERVAL_MS = 1.5 * 60000;
|
|
275
282
|
|
|
@@ -303,6 +310,7 @@ export const SwapForm = ({
|
|
|
303
310
|
);
|
|
304
311
|
const [isLoading, setIsLoading] = useReferredState(false); // Whether the form is in the progress of loading some data (new rates, for example)
|
|
305
312
|
const [isAddressFieldEnabled, setIsAddressFieldEnabled] = useState(false);
|
|
313
|
+
const [isInitialReaction, setIsInitialReaction] = useState(true);
|
|
306
314
|
|
|
307
315
|
const [confirmButtonTo, setConfirmButtonTo] = useState(
|
|
308
316
|
composeConfirmButtonTo(
|
|
@@ -789,6 +797,14 @@ export const SwapForm = ({
|
|
|
789
797
|
setRecepientAddressExtraId,
|
|
790
798
|
]);
|
|
791
799
|
|
|
800
|
+
useEffect(() => {
|
|
801
|
+
if (typeof isFixed !== "boolean" || !setIsFixed) return;
|
|
802
|
+
if (isInitialReaction) return;
|
|
803
|
+
requestDataRefresh(sendAssetAmount.current, true);
|
|
804
|
+
setIsInitialReaction(false);
|
|
805
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
806
|
+
}, [isFixed]);
|
|
807
|
+
|
|
792
808
|
return (
|
|
793
809
|
<div className={s["swap-form"]}>
|
|
794
810
|
<TitleBox
|
|
@@ -1090,6 +1106,21 @@ export const SwapForm = ({
|
|
|
1090
1106
|
) : (
|
|
1091
1107
|
""
|
|
1092
1108
|
)}
|
|
1109
|
+
|
|
1110
|
+
{typeof isFixed === "boolean" &&
|
|
1111
|
+
setIsFixed &&
|
|
1112
|
+
typeof setIsFixed === "function" ? (
|
|
1113
|
+
<div className={s["swap-form-rate-selector"]}>
|
|
1114
|
+
<RateSelector
|
|
1115
|
+
isFixed={isFixed}
|
|
1116
|
+
setIsFixed={setIsFixed}
|
|
1117
|
+
translations={translations.rateSelector}
|
|
1118
|
+
/>
|
|
1119
|
+
</div>
|
|
1120
|
+
) : (
|
|
1121
|
+
""
|
|
1122
|
+
)}
|
|
1123
|
+
|
|
1093
1124
|
{validationContent ? (
|
|
1094
1125
|
<div className={s["swap-form-validation-text"]}>
|
|
1095
1126
|
<Validation text={validationContent} />
|