@bytebrand/fe-ui-core-autobahn 1.0.0
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/assets/autode-logo.svg +7 -0
- package/cards/CarCard.tsx +174 -0
- package/cards/CarRow.tsx +182 -0
- package/cards/cardParts.tsx +489 -0
- package/cards/index.ts +35 -0
- package/cards/types.ts +114 -0
- package/chrome/Footer.tsx +189 -0
- package/chrome/TopBar.tsx +405 -0
- package/chrome/index.ts +20 -0
- package/chrome/svg.d.ts +11 -0
- package/compat/AccardionSection/AccardionSection.styl +45 -0
- package/compat/AccardionSection/AccardionSection.tsx +56 -0
- package/compat/AccordionWidget/AccordionWidget.styl +221 -0
- package/compat/AccordionWidget/AccordionWidget.tsx +257 -0
- package/compat/AccordionWrapper/AccordionItem/AccordionItem.styl +34 -0
- package/compat/AccordionWrapper/AccordionItem/AccordionItem.tsx +64 -0
- package/compat/AccordionWrapper/AccordionWrapper.tsx +34 -0
- package/compat/AdvantageItem/AdvantageItem.styl +47 -0
- package/compat/AdvantageItem/AdvantageItem.tsx +26 -0
- package/compat/Alternative/DealerInfo.styl +116 -0
- package/compat/Alternative/DealerInfo.tsx +171 -0
- package/compat/Badge/Badge.styl +44 -0
- package/compat/Badge/Badge.tsx +25 -0
- package/compat/BodyTypeIcons/Audi.tsx +9 -0
- package/compat/BodyTypeIcons/Bmw.tsx +860 -0
- package/compat/BodyTypeIcons/Ford.tsx +31 -0
- package/compat/BodyTypeIcons/IconsConfig.tsx +44 -0
- package/compat/BodyTypeIcons/IconsConfigCompact.tsx +30 -0
- package/compat/BodyTypeIcons/Mazda.tsx +44 -0
- package/compat/BodyTypeIcons/MercedesBenz.tsx +38 -0
- package/compat/BodyTypeIcons/Opel.tsx +19 -0
- package/compat/BodyTypeIcons/Search.tsx +19 -0
- package/compat/BodyTypeIcons/SelectorCategoryCombi.tsx +68 -0
- package/compat/BodyTypeIcons/SelectorCategoryCompact.tsx +20 -0
- package/compat/BodyTypeIcons/SelectorCategoryConvertible.tsx +68 -0
- package/compat/BodyTypeIcons/SelectorCategoryCoupe.tsx +60 -0
- package/compat/BodyTypeIcons/SelectorCategoryMinibus.tsx +64 -0
- package/compat/BodyTypeIcons/SelectorCategorySedan.tsx +69 -0
- package/compat/BodyTypeIcons/SelectorCategorySuv.tsx +77 -0
- package/compat/BodyTypeIcons/SelectorCategoryTransporter.tsx +68 -0
- package/compat/BodyTypeIcons/SelectorCategoryVan.tsx +72 -0
- package/compat/BodyTypeIcons/Volkswagen.tsx +330 -0
- package/compat/BodyTypeIcons/index.ts +17 -0
- package/compat/Button/Button.tsx +65 -0
- package/compat/ButtonOld/Button.styl +65 -0
- package/compat/ButtonOld/Button.tsx +84 -0
- package/compat/Checkbox/Checkbox.styl +120 -0
- package/compat/Checkbox/Checkbox.tsx +151 -0
- package/compat/Checkbox/FormCheckbox.styl +22 -0
- package/compat/Checkbox/FormCheckbox.tsx +86 -0
- package/compat/Co2Widget/CO2Efficiency.styl +219 -0
- package/compat/Co2Widget/CO2Efficiency.tsx +93 -0
- package/compat/ContactInfo/ContactInfo.styl +22 -0
- package/compat/ContactInfo/ContactInfo.tsx +161 -0
- package/compat/ContactInfo/TemporaryTranslation.ts +11 -0
- package/compat/CookieModal/CookieModal.tsx +49 -0
- package/compat/CookieModal/Modal.tsx +43 -0
- package/compat/CookieModal/ModalsConfig.tsx +23 -0
- package/compat/CookieModal/modals/ManageCookieModal/ManageCookieModal.styl +87 -0
- package/compat/CookieModal/modals/ManageCookieModal/ManageCookieModal.tsx +184 -0
- package/compat/CookieModal/modals/PreviewCookieModal/PreviewCookieModal.styl +67 -0
- package/compat/CookieModal/modals/PreviewCookieModal/PreviewCookieModal.tsx +51 -0
- package/compat/CookieModal/modals/TestModal.tsx +7 -0
- package/compat/CookieModal/useModal.ts +13 -0
- package/compat/CustomerQuote/CustomerQuote.styl +80 -0
- package/compat/CustomerQuote/CustomerQuote.tsx +68 -0
- package/compat/CustomerQuotesSlider/CustomerQuotesSlider.styl +46 -0
- package/compat/CustomerQuotesSlider/CustomerQuotesSlider.tsx +79 -0
- package/compat/CustomerQuotesSlider/SliderArrow.tsx +20 -0
- package/compat/CustomerQuotesSlider/slider.global.styl +2 -0
- package/compat/ExpansionPanel/ExpansionPanel.tsx +68 -0
- package/compat/FirstInfoBlock/FirstInfoBlock.styl +33 -0
- package/compat/FirstInfoBlock/FirstInfoBlock.tsx +49 -0
- package/compat/FirstInfoBlock/FirstInfoBlockItem/FirstInfoBlockItem.styl +66 -0
- package/compat/FirstInfoBlock/FirstInfoBlockItem/FirstInfoBlockItem.tsx +21 -0
- package/compat/FormattedNumber/FormattedNumber.styl +2 -0
- package/compat/FormattedNumber/FormattedNumber.tsx +90 -0
- package/compat/IconContainer/IconContainer.styl +23 -0
- package/compat/IconContainer/IconContainer.tsx +34 -0
- package/compat/Image/Image.styl +109 -0
- package/compat/Image/Image.tsx +302 -0
- package/compat/ImageSettings/EditableOptionsTable/CustomCheckbox/CustomCheckbox.styl +7 -0
- package/compat/ImageSettings/EditableOptionsTable/CustomCheckbox/CustomCheckbox.tsx +30 -0
- package/compat/ImageSettings/EditableOptionsTable/EditableOptionsTable.styl +122 -0
- package/compat/ImageSettings/EditableOptionsTable/EditableOptionsTable.tsx +199 -0
- package/compat/ImageSettings/EditableOptionsTable/ImageIcon/ImageIcon.styl +3 -0
- package/compat/ImageSettings/EditableOptionsTable/ImageIcon/ImageIcon.tsx +15 -0
- package/compat/ImageSettings/OptionsTable/OptionsTable.styl +47 -0
- package/compat/ImageSettings/OptionsTable/OptionsTable.tsx +122 -0
- package/compat/ImageSettings/PricePlan/PricePlan.styl +63 -0
- package/compat/ImageSettings/PricePlan/PricePlan.tsx +32 -0
- package/compat/ImageSettings/index.ts +42 -0
- package/compat/ImagesSet/ImagesSet.styl +28 -0
- package/compat/ImagesSet/ImagesSet.tsx +76 -0
- package/compat/InfoBlockWrapper/InfoBlockWrapper.styl +41 -0
- package/compat/InfoBlockWrapper/InfoBlockWrapper.tsx +46 -0
- package/compat/Loader/Loader.styl +39 -0
- package/compat/Loader/Loader.tsx +32 -0
- package/compat/MagnifyGlass/MagnifyGlass.styl +33 -0
- package/compat/MagnifyGlass/MagnifyGlass.tsx +213 -0
- package/compat/MdAccordionGroup/MdAccordionGroup.tsx +53 -0
- package/compat/MdCheckbox/MdCheckbox.tsx +69 -0
- package/compat/MdField/MdField.tsx +100 -0
- package/compat/MdSelect/MdSelect.tsx +103 -0
- package/compat/MdSwitch/MdSwitch.tsx +29 -0
- package/compat/MdTabs/MdTabs.tsx +47 -0
- package/compat/MdTooltip/MdTooltip.tsx +31 -0
- package/compat/OfferDetailedSection/OfferDetailedSection.styl +31 -0
- package/compat/OfferDetailedSection/OfferDetailedSection.tsx +100 -0
- package/compat/OfferDetailedSection/partials/PanelConfig.styl +132 -0
- package/compat/OfferDetailedSection/partials/PanelConfig.tsx +121 -0
- package/compat/OfferPanel/AboAccordion/AboAccordion.styl +25 -0
- package/compat/OfferPanel/AboAccordion/AboAccordion.tsx +128 -0
- package/compat/OfferPanel/AboAccordion/AboColorOptions/AboColorOptions.styl +12 -0
- package/compat/OfferPanel/AboAccordion/AboColorOptions/AboColorOptions.tsx +35 -0
- package/compat/OfferPanel/AboAccordion/AboFaq/AboFaq.styl +21 -0
- package/compat/OfferPanel/AboAccordion/AboFaq/AboFaq.tsx +25 -0
- package/compat/OfferPanel/AboAccordion/AboIncludedServices/AboIncludedServices.styl +14 -0
- package/compat/OfferPanel/AboAccordion/AboIncludedServices/AboIncludedServices.tsx +39 -0
- package/compat/OfferPanel/MuiOfferPeriod/MuiOfferPeriod.tsx +42 -0
- package/compat/OfferPanel/OfferCheckboxGroup/CheckboxContainer.tsx +140 -0
- package/compat/OfferPanel/OfferCheckboxGroup/OfferCheckboxGroup.styl +144 -0
- package/compat/OfferPanel/OfferCheckboxGroup/OfferCheckboxGroup.tsx +23 -0
- package/compat/OfferPanel/OfferPanel.styl +194 -0
- package/compat/OfferPanel/OfferPanel.tsx +81 -0
- package/compat/OfferPanel/OfferPeriod/OfferPeriod.styl +25 -0
- package/compat/OfferPanel/OfferPeriod/OfferPeriod.tsx +45 -0
- package/compat/OfferPanel/RangeGroup/RangeGroup.tsx +39 -0
- package/compat/OfferRequestButtonWrapper/OfferRequestButtonWrapper.styl +120 -0
- package/compat/OfferRequestButtonWrapper/OfferRequestButtonWrapper.styled.tsx +33 -0
- package/compat/OfferRequestButtonWrapper/OfferRequestButtonWrapper.tsx +122 -0
- package/compat/PriceRating/PriceRating.styl +47 -0
- package/compat/PriceRating/PriceRating.tsx +64 -0
- package/compat/PriceRatingDetailed/PriceRatingDetailed.styl +120 -0
- package/compat/PriceRatingDetailed/PriceRatingDetailed.tsx +191 -0
- package/compat/PricingToolBlock/PricingTool.styl +7 -0
- package/compat/PricingToolBlock/PricingTool.tsx +29 -0
- package/compat/Radio/Radio.styl +115 -0
- package/compat/Radio/Radio.tsx +141 -0
- package/compat/Radio/RadioGroup.styl +5 -0
- package/compat/Radio/RadioGroup.tsx +65 -0
- package/compat/Range/Range.tsx +79 -0
- package/compat/RateSearchValue/RateSearchValue.styl +22 -0
- package/compat/RateSearchValue/RateSearchValue.tsx +55 -0
- package/compat/RateSearchWidget/RateSearchWidget.styl +107 -0
- package/compat/RateSearchWidget/RateSearchWidget.tsx +163 -0
- package/compat/ServiceBlockItem/ServiceBlockItem.styl +48 -0
- package/compat/ServiceBlockItem/ServiceBlockItem.tsx +25 -0
- package/compat/SkeletonItem/SkeletonItem.styl +81 -0
- package/compat/SkeletonItem/SkeletonItem.tsx +80 -0
- package/compat/StarButton/StarButton.styl +39 -0
- package/compat/StarButton/StarButton.tsx +31 -0
- package/compat/TabPanel/TabPanel.tsx +29 -0
- package/compat/TimePicker/TimePicker.styl +23 -0
- package/compat/TimePicker/TimePicker.tsx +156 -0
- package/compat/Tooltip/Tooltip.styl +117 -0
- package/compat/Tooltip/Tooltip.tsx +63 -0
- package/compat/Usp/Usp.styl +78 -0
- package/compat/Usp/Usp.tsx +30 -0
- package/compat/Usp/uspTranslate.ts +12 -0
- package/compat/VehicleDetailedSidebar/VehicleDetailedSidebar.styl +37 -0
- package/compat/VehicleDetailedSidebar/VehicleDetailedSidebar.tsx +178 -0
- package/compat/VehicleDetailedSidebar/partials/Price.styl +27 -0
- package/compat/VehicleDetailedSidebar/partials/Price.tsx +41 -0
- package/compat/VehicleDetailedSidebar/partials/PriceContent.styl +124 -0
- package/compat/VehicleDetailedSidebar/partials/PriceContent.tsx +128 -0
- package/compat/VehicleDetailedSidebar/partials/Properties.styl +58 -0
- package/compat/VehicleDetailedSidebar/partials/Properties.tsx +155 -0
- package/compat/VehicleDetailedSidebar/partials/Title.styl +35 -0
- package/compat/VehicleDetailedSidebar/partials/Title.tsx +33 -0
- package/compat/VehicleDetailedSlider/VehicleDetailedSlider.styl +147 -0
- package/compat/VehicleDetailedSlider/VehicleDetailedSlider.tsx +382 -0
- package/compat/VehicleDetailedSlider/partials/MobileStast.tsx +61 -0
- package/compat/VehicleDetailedSlider/partials/MobileStats.styl +71 -0
- package/compat/VehicleDetailedSlider/partials/PriceData.styl +51 -0
- package/compat/VehicleDetailedSlider/partials/PriceData.tsx +67 -0
- package/compat/VehicleDetailedSlider/partials/Stats.styl +80 -0
- package/compat/VehicleDetailedSlider/partials/Stats.tsx +62 -0
- package/compat/VehicleDetailedSlider/partials/Title.styl +45 -0
- package/compat/VehicleDetailedSlider/partials/Title.tsx +36 -0
- package/compat/VehicleFormattedPrice/VehicleFormattedPrice.styl +149 -0
- package/compat/VehicleFormattedPrice/VehicleFormattedPrice.tsx +163 -0
- package/compat/VehicleSlider/VehicleSlider.styl +63 -0
- package/compat/VehicleSlider/VehicleSlider.tsx +125 -0
- package/compat/VehicleSlider/VehicleSliderForSRL.tsx +175 -0
- package/compat/VehicleSmallCard/SeoText/SeoText.styl +8 -0
- package/compat/VehicleSmallCard/SeoText/SeoText.tsx +16 -0
- package/compat/VehicleSmallCard/VehicleData/VechiclePriceItem/VechiclePriceItem.styl +204 -0
- package/compat/VehicleSmallCard/VehicleData/VechiclePriceItem/VechiclePriceItem.tsx +199 -0
- package/compat/VehicleSmallCard/VehicleData/VehicleInfo/VehicleInfo.styl +273 -0
- package/compat/VehicleSmallCard/VehicleData/VehicleInfo/VehicleInfo.tsx +179 -0
- package/compat/VehicleSmallCard/VehicleData/VehiclePrice/VehiclePrice.styl +165 -0
- package/compat/VehicleSmallCard/VehicleData/VehiclePrice/VehiclePrice.tsx +299 -0
- package/compat/VehicleSmallCard/VehicleData/VehicleProperty/VehicleProperty.styl +33 -0
- package/compat/VehicleSmallCard/VehicleData/VehicleProperty/VehicleProperty.tsx +35 -0
- package/compat/VehicleSmallCard/VehicleData/VehicleTitle/VehicleTitle.styl +136 -0
- package/compat/VehicleSmallCard/VehicleData/VehicleTitle/VehicleTitle.tsx +91 -0
- package/compat/VehicleSmallCard/VehicleSmallCard.styl +310 -0
- package/compat/VehicleSmallCard/VehicleSmallCard.tsx +448 -0
- package/compat/index.ts +77 -0
- package/compat/legacy-theme/mixins.styl +93 -0
- package/compat/legacy-theme/priceReviewColors.styl +12 -0
- package/compat/legacy-theme/slider.global.styl +5 -0
- package/compat/legacy-theme/theme.styl +136 -0
- package/compat/withLabel/withLabel.styl +33 -0
- package/compat/withLabel/withLabel.tsx +44 -0
- package/compat/withStats/withStats.styl +174 -0
- package/compat/withStats/withStats.tsx +238 -0
- package/constants/RateSearchWidget.ts +15 -0
- package/constants/Search.ts +290 -0
- package/constants/SearchWidget.ts +108 -0
- package/constants/app.ts +223 -0
- package/constants/common.ts +127 -0
- package/constants/core.ts +131 -0
- package/constants/highlights.ts +165 -0
- package/constants/price.ts +9 -0
- package/constants/selectors.ts +38 -0
- package/constants.ts +91 -0
- package/data/DataTransformers.ts +88 -0
- package/data/fieldMapping.ts +342 -0
- package/data/toAutobahnCar.ts +442 -0
- package/iconsvg/IconSVG.tsx +30 -0
- package/iconsvg/IconSVGConfig.tsx +768 -0
- package/iconsvg/SVG/AboPartner.tsx +16 -0
- package/iconsvg/SVG/ArrowQuotes.tsx +22 -0
- package/iconsvg/SVG/CloseIcon.tsx +17 -0
- package/iconsvg/SVG/CloseIconSelect.tsx +18 -0
- package/iconsvg/SVG/ClosedLockIcon.tsx +18 -0
- package/iconsvg/SVG/DealerCheckIcon.tsx +18 -0
- package/iconsvg/SVG/DealerPopoverMail.tsx +21 -0
- package/iconsvg/SVG/DealerPopoverPhone.tsx +21 -0
- package/iconsvg/SVG/GrayPhoneIcon.tsx +22 -0
- package/iconsvg/SVG/InternetIcon.tsx +18 -0
- package/iconsvg/SVG/WhiteEnvelopeIcon.tsx +21 -0
- package/iconsvg/SVG/bodyType/Cabrio.tsx +23 -0
- package/iconsvg/SVG/bodyType/Coupe.tsx +22 -0
- package/iconsvg/SVG/bodyType/Minibus.tsx +22 -0
- package/iconsvg/SVG/bodyType/Other.tsx +25 -0
- package/iconsvg/SVG/bodyType/Sedan.tsx +22 -0
- package/iconsvg/SVG/bodyType/SelectorCategoryCombi.tsx +68 -0
- package/iconsvg/SVG/bodyType/SelectorCategoryCompact.tsx +20 -0
- package/iconsvg/SVG/bodyType/SelectorCategoryConvertible.tsx +68 -0
- package/iconsvg/SVG/bodyType/SelectorCategoryCoupe.tsx +60 -0
- package/iconsvg/SVG/bodyType/SelectorCategoryMinibus.tsx +64 -0
- package/iconsvg/SVG/bodyType/SelectorCategoryOther.tsx +60 -0
- package/iconsvg/SVG/bodyType/SelectorCategorySedan.tsx +69 -0
- package/iconsvg/SVG/bodyType/SelectorCategorySuv.tsx +77 -0
- package/iconsvg/SVG/bodyType/SelectorCategoryTransporter.tsx +68 -0
- package/iconsvg/SVG/bodyType/SelectorCategoryVan.tsx +72 -0
- package/iconsvg/SVG/bodyType/Small.tsx +23 -0
- package/iconsvg/SVG/bodyType/Suv.tsx +23 -0
- package/iconsvg/SVG/bodyType/Van.tsx +23 -0
- package/iconsvg/SVG/bodyType/Wagon.tsx +23 -0
- package/iconsvg/SVG/common/AddIcon.tsx +16 -0
- package/iconsvg/SVG/common/AddPlus.tsx +16 -0
- package/iconsvg/SVG/common/AddressDashboard.tsx +29 -0
- package/iconsvg/SVG/common/AddressIcon.tsx +20 -0
- package/iconsvg/SVG/common/ArrowDetailedAccordionBlue.tsx +26 -0
- package/iconsvg/SVG/common/ArrowDownBlue.tsx +21 -0
- package/iconsvg/SVG/common/ArrowSelect.tsx +23 -0
- package/iconsvg/SVG/common/ArrowStepDown.tsx +18 -0
- package/iconsvg/SVG/common/Autocheck.tsx +19 -0
- package/iconsvg/SVG/common/AutodeLogo.tsx +36 -0
- package/iconsvg/SVG/common/Avatar.tsx +17 -0
- package/iconsvg/SVG/common/BellGray.tsx +19 -0
- package/iconsvg/SVG/common/BigInfoTransparent.tsx +13 -0
- package/iconsvg/SVG/common/Browse.tsx +20 -0
- package/iconsvg/SVG/common/Calendar.tsx +24 -0
- package/iconsvg/SVG/common/CallbackDashboard.tsx +30 -0
- package/iconsvg/SVG/common/Camera.tsx +17 -0
- package/iconsvg/SVG/common/Car.tsx +16 -0
- package/iconsvg/SVG/common/CarBody.tsx +19 -0
- package/iconsvg/SVG/common/CarFront.tsx +43 -0
- package/iconsvg/SVG/common/CarInspectionCheck.tsx +21 -0
- package/iconsvg/SVG/common/CarInspectionScheme0.tsx +32 -0
- package/iconsvg/SVG/common/CarInspectionScheme1.tsx +53 -0
- package/iconsvg/SVG/common/CarInspectionScheme2.tsx +52 -0
- package/iconsvg/SVG/common/CarInspectionScheme3.tsx +32 -0
- package/iconsvg/SVG/common/CarInspectionScheme4.tsx +32 -0
- package/iconsvg/SVG/common/CarInspectionScheme5.tsx +32 -0
- package/iconsvg/SVG/common/CarInspectionScheme6.tsx +32 -0
- package/iconsvg/SVG/common/CarInspectionSchemeGeneral copy.tsx +24 -0
- package/iconsvg/SVG/common/CarInspectionSchemeGeneral.tsx +24 -0
- package/iconsvg/SVG/common/CheckBlue.tsx +18 -0
- package/iconsvg/SVG/common/CheckGreen.tsx +22 -0
- package/iconsvg/SVG/common/CheckMark.tsx +16 -0
- package/iconsvg/SVG/common/CheckWhite.tsx +19 -0
- package/iconsvg/SVG/common/Chevron.tsx +17 -0
- package/iconsvg/SVG/common/CircledCheckmark.tsx +25 -0
- package/iconsvg/SVG/common/Clock.tsx +18 -0
- package/iconsvg/SVG/common/Close.tsx +19 -0
- package/iconsvg/SVG/common/CloseGrey.tsx +22 -0
- package/iconsvg/SVG/common/ContactEmail.tsx +21 -0
- package/iconsvg/SVG/common/ContactPhone.tsx +28 -0
- package/iconsvg/SVG/common/CopyIcon copy.tsx +22 -0
- package/iconsvg/SVG/common/CopyIcon.tsx +22 -0
- package/iconsvg/SVG/common/CopyIconForDealer.tsx +21 -0
- package/iconsvg/SVG/common/DashboardIcon.tsx +20 -0
- package/iconsvg/SVG/common/DashboardQuestionMark.tsx +20 -0
- package/iconsvg/SVG/common/DealersIcon.tsx +20 -0
- package/iconsvg/SVG/common/DeleteCircle.tsx +31 -0
- package/iconsvg/SVG/common/DeleteV1Icon.tsx +18 -0
- package/iconsvg/SVG/common/DeliveryDashboard.tsx +25 -0
- package/iconsvg/SVG/common/DeliveryMail.tsx +24 -0
- package/iconsvg/SVG/common/Discount100De.tsx +18 -0
- package/iconsvg/SVG/common/Discount100En.tsx +19 -0
- package/iconsvg/SVG/common/Discount66De.tsx +28 -0
- package/iconsvg/SVG/common/Discount66En.tsx +20 -0
- package/iconsvg/SVG/common/DoneIcon.tsx +18 -0
- package/iconsvg/SVG/common/EditCircle.tsx +32 -0
- package/iconsvg/SVG/common/EditPriceIcon.tsx +20 -0
- package/iconsvg/SVG/common/EuroCurrency.tsx +18 -0
- package/iconsvg/SVG/common/Export.tsx +20 -0
- package/iconsvg/SVG/common/Eye.tsx +17 -0
- package/iconsvg/SVG/common/EyeCatch.tsx +19 -0
- package/iconsvg/SVG/common/FavoritesIcon.tsx +20 -0
- package/iconsvg/SVG/common/FilterRange.tsx +16 -0
- package/iconsvg/SVG/common/FilterToolBlack.tsx +23 -0
- package/iconsvg/SVG/common/FlagDe.tsx +21 -0
- package/iconsvg/SVG/common/FlagEn.tsx +43 -0
- package/iconsvg/SVG/common/GrayEnvelopeIcon.tsx +19 -0
- package/iconsvg/SVG/common/HamburgerMenuIcon.tsx +18 -0
- package/iconsvg/SVG/common/HandingOverDashboard.tsx +32 -0
- package/iconsvg/SVG/common/ImageSettingsIcon.tsx +20 -0
- package/iconsvg/SVG/common/Info.tsx +16 -0
- package/iconsvg/SVG/common/InfoIcon.tsx +17 -0
- package/iconsvg/SVG/common/InfoTransparent.tsx +18 -0
- package/iconsvg/SVG/common/LogoutIcon.tsx +20 -0
- package/iconsvg/SVG/common/MagnifyingGlass.tsx +31 -0
- package/iconsvg/SVG/common/MenuArrow.tsx +16 -0
- package/iconsvg/SVG/common/MenuGrey.tsx +22 -0
- package/iconsvg/SVG/common/MobileDeLogo.tsx +108 -0
- package/iconsvg/SVG/common/MyOrderIcon.tsx +20 -0
- package/iconsvg/SVG/common/MyVehiclesIcon.tsx +20 -0
- package/iconsvg/SVG/common/NewFlagDe.tsx +25 -0
- package/iconsvg/SVG/common/NewFlagEn.tsx +34 -0
- package/iconsvg/SVG/common/OrderReceivedDashboard.tsx +27 -0
- package/iconsvg/SVG/common/Package.tsx +30 -0
- package/iconsvg/SVG/common/Phone.tsx +18 -0
- package/iconsvg/SVG/common/PhoneGrey.tsx +22 -0
- package/iconsvg/SVG/common/PickupDashboard.tsx +30 -0
- package/iconsvg/SVG/common/Picture.tsx +24 -0
- package/iconsvg/SVG/common/Pictures.tsx +32 -0
- package/iconsvg/SVG/common/Plus.tsx +16 -0
- package/iconsvg/SVG/common/PlusNew.tsx +16 -0
- package/iconsvg/SVG/common/PreparationDashboard.tsx +29 -0
- package/iconsvg/SVG/common/ProfileDashboard.tsx +24 -0
- package/iconsvg/SVG/common/ProfileIcon.tsx +17 -0
- package/iconsvg/SVG/common/Question.tsx +19 -0
- package/iconsvg/SVG/common/QuestionBold.tsx +25 -0
- package/iconsvg/SVG/common/RegistrationDashboard.tsx +31 -0
- package/iconsvg/SVG/common/SavedSearchsIcon.tsx +20 -0
- package/iconsvg/SVG/common/Search.tsx +19 -0
- package/iconsvg/SVG/common/SearchGrey.tsx +22 -0
- package/iconsvg/SVG/common/SettingPenIcon.tsx +20 -0
- package/iconsvg/SVG/common/Share.tsx +16 -0
- package/iconsvg/SVG/common/ShoppingCart.tsx +18 -0
- package/iconsvg/SVG/common/SliderArrow.tsx +21 -0
- package/iconsvg/SVG/common/SliderEye.tsx +17 -0
- package/iconsvg/SVG/common/SortUpDownArrows.tsx +18 -0
- package/iconsvg/SVG/common/Speedometer.tsx +23 -0
- package/iconsvg/SVG/common/Star.tsx +20 -0
- package/iconsvg/SVG/common/StarNew.tsx +16 -0
- package/iconsvg/SVG/common/StarOutline.tsx +20 -0
- package/iconsvg/SVG/common/StarRoundedCorners.tsx +18 -0
- package/iconsvg/SVG/common/Stats.tsx +17 -0
- package/iconsvg/SVG/common/Step1.tsx +21 -0
- package/iconsvg/SVG/common/Step2.tsx +20 -0
- package/iconsvg/SVG/common/Step3.tsx +21 -0
- package/iconsvg/SVG/common/SupportCallbackIcon.tsx +20 -0
- package/iconsvg/SVG/common/Telephone.tsx +22 -0
- package/iconsvg/SVG/common/Time.tsx +17 -0
- package/iconsvg/SVG/common/Timetable.tsx +18 -0
- package/iconsvg/SVG/common/Trash.tsx +22 -0
- package/iconsvg/SVG/common/TrashRed.tsx +23 -0
- package/iconsvg/SVG/common/Upload.tsx +17 -0
- package/iconsvg/SVG/common/UserGrey.tsx +22 -0
- package/iconsvg/SVG/common/UserProfileIcon.tsx +20 -0
- package/iconsvg/SVG/common/ValidateFailure.tsx +21 -0
- package/iconsvg/SVG/common/ValidateSuccess.tsx +21 -0
- package/iconsvg/SVG/common/WarningTriangle.tsx +20 -0
- package/iconsvg/SVG/common/WhiteArrowUp.tsx +21 -0
- package/iconsvg/SVG/common/WhiteKey.tsx +21 -0
- package/iconsvg/SVG/common/WhitePeople.tsx +23 -0
- package/iconsvg/SVG/common/WhiteTick.tsx +19 -0
- package/iconsvg/SVG/flags/AT.tsx +19 -0
- package/iconsvg/SVG/flags/BE.tsx +20 -0
- package/iconsvg/SVG/flags/BG.tsx +20 -0
- package/iconsvg/SVG/flags/CH.tsx +22 -0
- package/iconsvg/SVG/flags/CZ.tsx +18 -0
- package/iconsvg/SVG/flags/DE.tsx +18 -0
- package/iconsvg/SVG/flags/DK.tsx +18 -0
- package/iconsvg/SVG/flags/ES.tsx +2585 -0
- package/iconsvg/SVG/flags/FI.tsx +18 -0
- package/iconsvg/SVG/flags/FR.tsx +20 -0
- package/iconsvg/SVG/flags/GB.tsx +26 -0
- package/iconsvg/SVG/flags/HR.tsx +135 -0
- package/iconsvg/SVG/flags/HU.tsx +20 -0
- package/iconsvg/SVG/flags/IT.tsx +20 -0
- package/iconsvg/SVG/flags/LI.tsx +106 -0
- package/iconsvg/SVG/flags/LU.tsx +18 -0
- package/iconsvg/SVG/flags/NL.tsx +18 -0
- package/iconsvg/SVG/flags/NO.tsx +20 -0
- package/iconsvg/SVG/flags/PL.tsx +19 -0
- package/iconsvg/SVG/flags/RO.tsx +20 -0
- package/iconsvg/SVG/flags/RU.tsx +20 -0
- package/iconsvg/SVG/flags/SE.tsx +20 -0
- package/iconsvg/SVG/flags/SI.tsx +54 -0
- package/iconsvg/SVG/flags/SK.tsx +34 -0
- package/iconsvg/SVG/flags/UA.tsx +19 -0
- package/iconsvg/SVG/infoBlocks/14DaysReturnPolicy.tsx +18 -0
- package/iconsvg/SVG/infoBlocks/AlertInfo.tsx +19 -0
- package/iconsvg/SVG/infoBlocks/Autocheck.tsx +19 -0
- package/iconsvg/SVG/infoBlocks/CheckTheStory.tsx +22 -0
- package/iconsvg/SVG/infoBlocks/CustomerServiceWhite.tsx +16 -0
- package/iconsvg/SVG/infoBlocks/Guarantee.tsx +16 -0
- package/iconsvg/SVG/infoBlocks/OrderWhite.tsx +13 -0
- package/iconsvg/SVG/infoBlocks/PriceGuarantee.tsx +19 -0
- package/iconsvg/SVG/infoBlocks/PriceGuaranteeWhite.tsx +17 -0
- package/iconsvg/SVG/infoBlocks/TransportAndDelivery.tsx +21 -0
- package/iconsvg/SVG/infoBlocks/Warranty.tsx +23 -0
- package/iconsvg/SVG/popower/Mail.tsx +18 -0
- package/iconsvg/SVG/popower/Phone.tsx +19 -0
- package/iconsvg/SVG/popower/Schedule.tsx +18 -0
- package/iconsvg/SVG/searchWidgets/drive/AAllWheelDrive.tsx +26 -0
- package/iconsvg/SVG/searchWidgets/drive/AllWheelDrive.tsx +26 -0
- package/iconsvg/SVG/searchWidgets/drive/FrontWheelDrive.tsx +25 -0
- package/iconsvg/SVG/searchWidgets/drive/OtherWheelDrive.tsx +26 -0
- package/iconsvg/SVG/searchWidgets/drive/RearWheelDrive.tsx +25 -0
- package/iconsvg/SVG/searchWidgets/fuel/FuelDiesel.tsx +18 -0
- package/iconsvg/SVG/searchWidgets/fuel/FuelElectrical.tsx +19 -0
- package/iconsvg/SVG/searchWidgets/fuel/FuelElectricalDiesel.tsx +34 -0
- package/iconsvg/SVG/searchWidgets/fuel/FuelElectricalPetrol.tsx +20 -0
- package/iconsvg/SVG/searchWidgets/fuel/FuelEthanol.tsx +53 -0
- package/iconsvg/SVG/searchWidgets/fuel/FuelHydrogen.tsx +24 -0
- package/iconsvg/SVG/searchWidgets/fuel/FuelLpg.tsx +24 -0
- package/iconsvg/SVG/searchWidgets/fuel/FuelNaturalGas.tsx +23 -0
- package/iconsvg/SVG/searchWidgets/fuel/FuelOther.tsx +28 -0
- package/iconsvg/SVG/searchWidgets/fuel/FuelPetrol.tsx +18 -0
- package/iconsvg/SVG/settings/Account.tsx +17 -0
- package/iconsvg/SVG/settings/DataUsage.tsx +17 -0
- package/iconsvg/SVG/settings/MarketResearch.tsx +17 -0
- package/iconsvg/SVG/settings/Newsletter.tsx +17 -0
- package/iconsvg/SVG/settings/RemoveEye.tsx +17 -0
- package/iconsvg/SVG/settings/RemoveEyeOff.tsx +17 -0
- package/iconsvg/SVG/settings/Security.tsx +17 -0
- package/iconsvg/SVG/settings/Warning.tsx +17 -0
- package/iconsvg/SVG/slider/360.tsx +23 -0
- package/iconsvg/SVG/slider/360New.tsx +20 -0
- package/iconsvg/SVG/slider/Checked.tsx +19 -0
- package/iconsvg/SVG/slider/DiscountRibbon.tsx +51 -0
- package/iconsvg/SVG/slider/DiscountRibbonMobile.tsx +47 -0
- package/iconsvg/SVG/slider/DiscountRibbonNew.tsx +29 -0
- package/iconsvg/SVG/slider/Easy.tsx +19 -0
- package/iconsvg/SVG/slider/Fullscreen.tsx +16 -0
- package/iconsvg/SVG/slider/FullscreenWindow.tsx +23 -0
- package/iconsvg/SVG/slider/Safe.tsx +19 -0
- package/iconsvg/SVG/slider/ToBuy.tsx +19 -0
- package/iconsvg/SVG/slider/YoutubeButton.tsx +26 -0
- package/iconsvg/SVG/slider/ZoomIn.tsx +21 -0
- package/iconsvg/SVG/slider/ZoomOut.tsx +21 -0
- package/iconsvg/SVG/social/AndroidLogo.tsx +18 -0
- package/iconsvg/SVG/social/Apple.tsx +19 -0
- package/iconsvg/SVG/social/FacebookF.tsx +19 -0
- package/iconsvg/SVG/social/GooglePlusG.tsx +19 -0
- package/iconsvg/SVG/social/Instagram.tsx +17 -0
- package/iconsvg/SVG/social/Pinterest.tsx +19 -0
- package/iconsvg/SVG/social/SharingInterface.tsx +21 -0
- package/iconsvg/SVG/social/Twitter.tsx +19 -0
- package/iconsvg/SVG/social/Youtube.tsx +19 -0
- package/iconsvg/SVG/vehicle/AboIcon.tsx +11 -0
- package/iconsvg/SVG/vehicle/Abs.tsx +24 -0
- package/iconsvg/SVG/vehicle/AirCond.tsx +34 -0
- package/iconsvg/SVG/vehicle/Airbag.tsx +21 -0
- package/iconsvg/SVG/vehicle/AuxiliaryHeating.tsx +23 -0
- package/iconsvg/SVG/vehicle/Bluetooth.tsx +22 -0
- package/iconsvg/SVG/vehicle/BuyIcon.tsx +15 -0
- package/iconsvg/SVG/vehicle/CarAvailability.tsx +22 -0
- package/iconsvg/SVG/vehicle/CarInspectionCheck.tsx +21 -0
- package/iconsvg/SVG/vehicle/CarInspectionCross.tsx +21 -0
- package/iconsvg/SVG/vehicle/CheckoutChecked.tsx +15 -0
- package/iconsvg/SVG/vehicle/Co2.tsx +24 -0
- package/iconsvg/SVG/vehicle/CruiseControl.tsx +25 -0
- package/iconsvg/SVG/vehicle/Date.tsx +21 -0
- package/iconsvg/SVG/vehicle/Delivery.tsx +12 -0
- package/iconsvg/SVG/vehicle/Diesel.tsx +28 -0
- package/iconsvg/SVG/vehicle/Display.tsx +25 -0
- package/iconsvg/SVG/vehicle/Done.tsx +11 -0
- package/iconsvg/SVG/vehicle/Door.tsx +19 -0
- package/iconsvg/SVG/vehicle/DoubleDone.tsx +18 -0
- package/iconsvg/SVG/vehicle/EditIcon.tsx +11 -0
- package/iconsvg/SVG/vehicle/EmergencyBrakeAssistant.tsx +27 -0
- package/iconsvg/SVG/vehicle/Eps.tsx +24 -0
- package/iconsvg/SVG/vehicle/Esp.tsx +24 -0
- package/iconsvg/SVG/vehicle/FinancingIcon.tsx +20 -0
- package/iconsvg/SVG/vehicle/FuelConsumption.tsx +20 -0
- package/iconsvg/SVG/vehicle/Fueling.tsx +22 -0
- package/iconsvg/SVG/vehicle/FullDrive.tsx +24 -0
- package/iconsvg/SVG/vehicle/GasElectric.tsx +28 -0
- package/iconsvg/SVG/vehicle/HandsFreePhoneSystem.tsx +24 -0
- package/iconsvg/SVG/vehicle/Kw.tsx +23 -0
- package/iconsvg/SVG/vehicle/LastCrawledAt.tsx +22 -0
- package/iconsvg/SVG/vehicle/LeasingIcon.tsx +14 -0
- package/iconsvg/SVG/vehicle/Led.tsx +24 -0
- package/iconsvg/SVG/vehicle/LightSensor.tsx +22 -0
- package/iconsvg/SVG/vehicle/LinkAlternative.tsx +15 -0
- package/iconsvg/SVG/vehicle/Location.tsx +17 -0
- package/iconsvg/SVG/vehicle/MinusIcon.tsx +11 -0
- package/iconsvg/SVG/vehicle/Mirror.tsx +19 -0
- package/iconsvg/SVG/vehicle/Navigation.tsx +27 -0
- package/iconsvg/SVG/vehicle/NewCar.tsx +21 -0
- package/iconsvg/SVG/vehicle/NoImage.tsx +17 -0
- package/iconsvg/SVG/vehicle/Owner.tsx +18 -0
- package/iconsvg/SVG/vehicle/PanoramicRoof.tsx +23 -0
- package/iconsvg/SVG/vehicle/ParkingAssistants.tsx +24 -0
- package/iconsvg/SVG/vehicle/PickYourself.tsx +18 -0
- package/iconsvg/SVG/vehicle/PlusIcon.tsx +11 -0
- package/iconsvg/SVG/vehicle/Power.tsx +21 -0
- package/iconsvg/SVG/vehicle/Ps.tsx +19 -0
- package/iconsvg/SVG/vehicle/Question.tsx +24 -0
- package/iconsvg/SVG/vehicle/Seats.tsx +21 -0
- package/iconsvg/SVG/vehicle/SeatsHeating.tsx +26 -0
- package/iconsvg/SVG/vehicle/SelectorGearboxAutomatic.tsx +24 -0
- package/iconsvg/SVG/vehicle/SelectorGearboxManualShift.tsx +19 -0
- package/iconsvg/SVG/vehicle/SelectorGearboxOther.tsx +24 -0
- package/iconsvg/SVG/vehicle/SelectorGearboxSemiAutomatic.tsx +30 -0
- package/iconsvg/SVG/vehicle/SelectorInteriorTypeAlcantara.tsx +225 -0
- package/iconsvg/SVG/vehicle/SelectorInteriorTypeFabric.tsx +29 -0
- package/iconsvg/SVG/vehicle/SelectorInteriorTypeFullLeather.tsx +29 -0
- package/iconsvg/SVG/vehicle/SelectorInteriorTypeOther.tsx +26 -0
- package/iconsvg/SVG/vehicle/SelectorInteriorTypePartLeather.tsx +142 -0
- package/iconsvg/SVG/vehicle/SelectorInteriorTypeSyntheticLeather.tsx +27 -0
- package/iconsvg/SVG/vehicle/SelectorInteriorTypeVelours.tsx +39 -0
- package/iconsvg/SVG/vehicle/Shield.tsx +39 -0
- package/iconsvg/SVG/vehicle/Speedometer.tsx +17 -0
- package/iconsvg/SVG/vehicle/StartStopSystem.tsx +30 -0
- package/iconsvg/SVG/vehicle/Stop.tsx +25 -0
- package/iconsvg/SVG/vehicle/TickMark.tsx +21 -0
- package/iconsvg/SVG/vehicle/TrafficSignRecognition.tsx +29 -0
- package/iconsvg/SVG/vehicle/TrailerCoupling.tsx +24 -0
- package/iconsvg/SVG/vehicle/Transmission.tsx +27 -0
- package/iconsvg/SVG/vehicle/Wheel.tsx +43 -0
- package/iconsvg/SVG/vehicle/Wipers.tsx +22 -0
- package/iconsvg/SVG/vehicle/Wrench.tsx +17 -0
- package/iconsvg/index.ts +7 -0
- package/index.ts +18 -0
- package/locales/de/autobahn.json +671 -0
- package/locales/en/autobahn.json +671 -0
- package/locales/legacy/SearchDetailedPage.ts +205 -0
- package/locales/legacy/cbd.ts +719 -0
- package/locales/legacy/common.ts +109 -0
- package/locales/legacy/data.ts +1118 -0
- package/locales/legacy/priceRating.ts +10 -0
- package/locales/legacy/sortingOptions.ts +21 -0
- package/media/images/question.svg +1 -0
- package/media/images/raiting-stars-min.svg +7 -0
- package/media/images/refresh-button.svg +49 -0
- package/media/images/searchWidget/selector_emissionSticker_green.png +0 -0
- package/media/images/searchWidget/selector_emissionSticker_red.png +0 -0
- package/media/images/searchWidget/selector_emissionSticker_yellow.png +0 -0
- package/media/images/slider-arrow-new.svg +1 -0
- package/media/images/user-icon.svg +16 -0
- package/media/svg/common/eye.svg +1 -0
- package/media/svg/common/star.svg +1 -0
- package/media/svg/infoBlocks/whyAutodeIconSet-F.svg +9 -0
- package/media/svg/infoBlocks/whyAutodeIconSet-G.svg +8 -0
- package/media/svg/infoBlocks/whyAutodeIconSet-Q.svg +6 -0
- package/media/svg/infoBlocks/whyAutodeIconSet-R.svg +9 -0
- package/media/svg/usp/icon1.svg +16 -0
- package/media/svg/usp/icon2.svg +13 -0
- package/media/svg/usp/icon3.svg +10 -0
- package/media/svg/usp/icon4.svg +14 -0
- package/package.json +30 -0
- package/schemes/AggregationScheme.ts +73 -0
- package/searchFilters/filterOptions.ts +119 -0
- package/searchFilters/filterProps.ts +35 -0
- package/searchFilters/index.ts +15 -0
- package/theme/autobahn.css +25 -0
- package/theme/colors_and_type.css +113 -0
- package/theme/md3.css +2034 -0
- package/types/types.ts +374 -0
- package/types.ts +8 -0
- package/ui/Accordion.tsx +134 -0
- package/ui/Button.tsx +62 -0
- package/ui/CardCarousel.tsx +133 -0
- package/ui/Chip.tsx +29 -0
- package/ui/DatePicker.tsx +145 -0
- package/ui/Dropdown.tsx +205 -0
- package/ui/FileUpload.tsx +154 -0
- package/ui/FormCheckbox.tsx +79 -0
- package/ui/FormDropdown.tsx +327 -0
- package/ui/FormField.tsx +88 -0
- package/ui/FormRadio.tsx +93 -0
- package/ui/FormRadioGroup.tsx +106 -0
- package/ui/Icon.tsx +391 -0
- package/ui/IconButton.tsx +44 -0
- package/ui/Modal.tsx +187 -0
- package/ui/Pagination.tsx +140 -0
- package/ui/Price.tsx +25 -0
- package/ui/PriceEvalBar.tsx +48 -0
- package/ui/SaveChip.tsx +34 -0
- package/ui/Segmented.tsx +48 -0
- package/ui/Skeleton.tsx +75 -0
- package/ui/Spec.tsx +24 -0
- package/ui/Stars.tsx +29 -0
- package/ui/StatChip.tsx +21 -0
- package/ui/Stepper.tsx +106 -0
- package/ui/Switch.tsx +65 -0
- package/ui/Table.tsx +156 -0
- package/ui/Textarea.tsx +58 -0
- package/ui/index.ts +88 -0
- package/utils/CommonUtils.ts +649 -0
- package/utils/DateUtils.ts +101 -0
- package/utils/index.ts +74 -0
- package/utils/power.ts +11 -0
- package/utils/query.ts +21 -0
- package/vdp/FinanceCalculator.tsx +465 -0
- package/vdp/VdpModules.tsx +1490 -0
- package/vdp/VdpViewer.tsx +139 -0
- package/vdp/index.ts +75 -0
- package/vdp/types.ts +197 -0
- package/vehiclesProps/cbdSelectors.ts +117 -0
- package/vehiclesProps/decoratedLightProps.tsx +572 -0
- package/vehiclesProps/decoratedProps.tsx +1746 -0
- package/vehiclesProps/equipment.ts +129 -0
- package/vehiclesProps/vehicleDetails.ts +428 -0
- package/widgets/SearchBox.tsx +256 -0
- package/widgets/index.ts +5 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// Autobahn (auto.de redesign) — md3 checkbox bound to a mobx-react-form field.
|
|
2
|
+
//
|
|
3
|
+
// Drop-in visual replacement for the legacy fe-ui-core `FormCheckbox` / `CheckboxMaterial`
|
|
4
|
+
// (DealerEmployeeSetPage AccessRights role flags, EmailPermissionBlock T&C/permission box with
|
|
5
|
+
// the 'boolean'/'accepted' rule, SettingsPage data-usage, etc.). Same data contract — only the
|
|
6
|
+
// markup is re-skinned to the `.mcheck` md3 box + check icon. Renders correctly only inside a
|
|
7
|
+
// `<div className="md3">` subtree (scoped theme).
|
|
8
|
+
//
|
|
9
|
+
// BINDING (must match the legacy signature EXACTLY or validation/submit breaks):
|
|
10
|
+
// mobx-react-form fields expose `field.checked` (boolean) and `field.onChange`, which is a
|
|
11
|
+
// NATIVE change-event handler — it reads `event.target.checked` itself and updates field.checked.
|
|
12
|
+
// So we bind `checked={!!field.checked}` and forward the raw native event straight to
|
|
13
|
+
// `field.onChange` — no wrapping, no boolean coercion, no `(event, checked, value)` re-call.
|
|
14
|
+
// This is the same contract the sibling Switch primitive uses, and the same one the legacy
|
|
15
|
+
// fe-ui-core Checkbox got via `field.bind()` (it forwarded the event onward and the field
|
|
16
|
+
// handler ignored the extra args). Validation rules ('required' / 'boolean' / 'accepted') then
|
|
17
|
+
// surface through field.hasError + field.error, shown inline — identical to the legacy FormCheckbox.
|
|
18
|
+
//
|
|
19
|
+
// observer-wrapped so it re-renders when field.checked / field.error change. Beyond the injected
|
|
20
|
+
// field it is pure/presentational.
|
|
21
|
+
|
|
22
|
+
import * as React from 'react';
|
|
23
|
+
import { observer } from 'mobx-react';
|
|
24
|
+
|
|
25
|
+
import Icon from './Icon';
|
|
26
|
+
|
|
27
|
+
export interface FormCheckboxProps {
|
|
28
|
+
/** mobx-react-form field (DealerProfileForm.$('emailPermission'), EmplDataForm.$('isDadmin'), …). Typed any — the lib ships no TS types. */
|
|
29
|
+
field: any;
|
|
30
|
+
/** i18n translate — used ONLY to resolve field.label when no `label`/`children` is supplied (mirrors the legacy CheckboxMaterial). Callers that already translate pass the result as `label`. */
|
|
31
|
+
t?: (key: string, options?: object) => string;
|
|
32
|
+
/** label as plain text OR pre-built JSX (e.g. a translated string, or a <Trans> with links). */
|
|
33
|
+
label?: React.ReactNode;
|
|
34
|
+
/** rich label content (T&C/permission text with links). Takes precedence over `label`. */
|
|
35
|
+
children?: React.ReactNode;
|
|
36
|
+
/** override the field's own disabled flag. */
|
|
37
|
+
disabled?: boolean;
|
|
38
|
+
id?: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const FormCheckbox: React.FunctionComponent<FormCheckboxProps> = observer(
|
|
42
|
+
({ field, t, label, children, disabled, id }) => {
|
|
43
|
+
const isChecked = !!field.checked;
|
|
44
|
+
const isDisabled = disabled != null ? disabled : !!field.disabled;
|
|
45
|
+
const hasError = !!field.hasError && !!field.error;
|
|
46
|
+
|
|
47
|
+
// children (rich) > explicit label > translated field.label (legacy CheckboxMaterial behaviour).
|
|
48
|
+
// We do NOT re-translate a passed `label`: callers (AccessRights, EmailPermissionBlock) already
|
|
49
|
+
// pass an already-translated string or a <Trans> element, so re-running t() would risk a miss.
|
|
50
|
+
let content: React.ReactNode = null;
|
|
51
|
+
if (children != null) content = children;
|
|
52
|
+
else if (label != null) content = label;
|
|
53
|
+
else if (field.label) content = t ? t(field.label) : field.label;
|
|
54
|
+
|
|
55
|
+
return (
|
|
56
|
+
<div className={'mcheck-group' + (hasError ? ' mcheck-group--error' : '')}>
|
|
57
|
+
<label className={'mcheck' + (isDisabled ? ' mcheck--disabled' : '')}>
|
|
58
|
+
<input
|
|
59
|
+
id={id}
|
|
60
|
+
type="checkbox"
|
|
61
|
+
className="mcheck-input"
|
|
62
|
+
checked={isChecked}
|
|
63
|
+
disabled={isDisabled}
|
|
64
|
+
aria-checked={isChecked}
|
|
65
|
+
aria-invalid={hasError || undefined}
|
|
66
|
+
onChange={field.onChange}
|
|
67
|
+
/>
|
|
68
|
+
<span className="mcheck-box" aria-hidden="true">
|
|
69
|
+
{isChecked ? <Icon name="check" size={16} stroke={3} cls="mcheck-tick" /> : null}
|
|
70
|
+
</span>
|
|
71
|
+
{content != null ? <span className="mcheck-label">{content}</span> : null}
|
|
72
|
+
</label>
|
|
73
|
+
{hasError ? <span className="mcheck-error-text">{field.error}</span> : null}
|
|
74
|
+
</div>
|
|
75
|
+
);
|
|
76
|
+
},
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
export default FormCheckbox;
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
// Autobahn (auto.de redesign) — mobx-react-form-bound dropdown adapter.
|
|
2
|
+
//
|
|
3
|
+
// A drop-in md3 replacement for the legacy fe-ui-core FormDropDown
|
|
4
|
+
// (components/ui/FormDropDown/FormDropDown.tsx). It is the #1 form dependency
|
|
5
|
+
// (11+ pages, 60+ vehicle-form selects: BasicData/EngineData/Chassis/…,
|
|
6
|
+
// Settings gender/title, …). The visual control is the md3 `Dropdown`
|
|
7
|
+
// (single-select) reused as-is; multi-select is implemented here on the same
|
|
8
|
+
// `mselect-*` classes as a checklist with selected chips on the trigger.
|
|
9
|
+
//
|
|
10
|
+
// THE DATA CONTRACT MIRRORS THE LEGACY EXACTLY so validation/output/submit are
|
|
11
|
+
// unchanged — only the markup is re-skinned:
|
|
12
|
+
//
|
|
13
|
+
// • single (default): field.value is the option OBJECT `{value,label}` (legacy
|
|
14
|
+
// `getValue`). We read `field.value.value` and commit
|
|
15
|
+
// `field.onChange({value,label}, field.name)`; clear -> `onChange('', name)`.
|
|
16
|
+
// • isObj: field.value IS the source option object (e.g. a GENDERS item
|
|
17
|
+
// `{value:number,label}`). On change we resolve the matching object out of
|
|
18
|
+
// `field.extra` and `onChange(obj, field.name)` (legacy parity — form.output
|
|
19
|
+
// keeps the object).
|
|
20
|
+
// • isMulti: field.value is a primitive array; the menu is a checklist; the
|
|
21
|
+
// trigger shows the selected labels as chips; `onChange(values, field.name)`.
|
|
22
|
+
//
|
|
23
|
+
// Option shapes in `field.extra` are normalized: primitive lists (['2','3',…]),
|
|
24
|
+
// `{value,label}` and `{key,value}`. Label resolution mirrors the legacy
|
|
25
|
+
// getOptions(): with a namespace, 'cbd' -> t('cbd:'+opt), else a labelled option
|
|
26
|
+
// -> t(namespace+':'+label), else t(opt). When `isApiTranslated`, `field.extra`
|
|
27
|
+
// already carries translated labels, so they are used verbatim.
|
|
28
|
+
//
|
|
29
|
+
// observer-wrapped (re-renders on value/error). Renders correctly only inside a
|
|
30
|
+
// `.md3` subtree.
|
|
31
|
+
|
|
32
|
+
import * as React from 'react';
|
|
33
|
+
import { observer } from 'mobx-react';
|
|
34
|
+
|
|
35
|
+
import Icon from './Icon';
|
|
36
|
+
import Dropdown, { DropdownOption } from './Dropdown';
|
|
37
|
+
|
|
38
|
+
export interface FormDropdownProps {
|
|
39
|
+
/** mobx-react-form field (form.$('basicDataForm.mainData_make') etc.). Untyped — the lib ships no TS types. */
|
|
40
|
+
field: any;
|
|
41
|
+
/** i18n translate — resolves option labels and the field's placeholder/label key. */
|
|
42
|
+
t: (key: string, options?: object) => string;
|
|
43
|
+
/** translation namespace for option labels (e.g. 'common', 'cbd', 'mainData'). */
|
|
44
|
+
namespace?: string;
|
|
45
|
+
/** field.value is the source option OBJECT, not a scalar (GENDERS/TITLES item). */
|
|
46
|
+
isObj?: boolean;
|
|
47
|
+
/** option labels in field.extra are already translated (came from a request). */
|
|
48
|
+
isApiTranslated?: boolean;
|
|
49
|
+
/** multiple selection — value is a primitive array, rendered as chips + checklist. */
|
|
50
|
+
isMulti?: boolean;
|
|
51
|
+
/** hide the clear ("×") affordance on a single select. */
|
|
52
|
+
disableClearable?: boolean;
|
|
53
|
+
/** suppress the built-in label (when an outer wrapper — e.g. FormFieldDropDown — owns the label). */
|
|
54
|
+
hideLabel?: boolean;
|
|
55
|
+
/** accepted for legacy-surface parity (the md3 control never free-types). */
|
|
56
|
+
freeSolo?: boolean;
|
|
57
|
+
disabled?: boolean;
|
|
58
|
+
/** layout passthrough (e.g. grid-area), mirrors legacy `style`. */
|
|
59
|
+
style?: React.CSSProperties;
|
|
60
|
+
/** extra class on the wrapper (legacy `className`). */
|
|
61
|
+
className?: string;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Raw option as it can appear in field.extra. */
|
|
65
|
+
type RawOption =
|
|
66
|
+
| string
|
|
67
|
+
| number
|
|
68
|
+
| { value: any; label?: any; key?: any; isDisabled?: boolean; isSeries?: boolean };
|
|
69
|
+
|
|
70
|
+
/** Normalize one raw option to a stable { value, label, disabled } shape (label not yet translated). */
|
|
71
|
+
function normalizeOption(opt: RawOption): { value: string; rawLabel: any; disabled: boolean } {
|
|
72
|
+
if (opt !== null && typeof opt === 'object') {
|
|
73
|
+
// {value,label} | {key,value} | {value,...}
|
|
74
|
+
const hasKey = 'key' in opt && !('label' in opt);
|
|
75
|
+
const value = hasKey ? (opt as any).key : (opt as any).value;
|
|
76
|
+
const rawLabel = hasKey
|
|
77
|
+
? (opt as any).value
|
|
78
|
+
: 'label' in opt && (opt as any).label != null
|
|
79
|
+
? (opt as any).label
|
|
80
|
+
: (opt as any).value;
|
|
81
|
+
const disabled = !!((opt as any).isDisabled || (opt as any).isSeries);
|
|
82
|
+
return { value: String(value), rawLabel, disabled };
|
|
83
|
+
}
|
|
84
|
+
// primitive
|
|
85
|
+
return { value: String(opt), rawLabel: opt, disabled: false };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const FormDropdown: React.FunctionComponent<FormDropdownProps> = observer(
|
|
89
|
+
({ field, t, namespace, isObj, isApiTranslated, isMulti, disableClearable, freeSolo, disabled, style, className, hideLabel }) => {
|
|
90
|
+
// ---- label resolution (legacy getOptions parity) -------------------------------------------
|
|
91
|
+
const labelFor = React.useCallback(
|
|
92
|
+
(rawLabel: any): string => {
|
|
93
|
+
const s = rawLabel == null ? '' : String(rawLabel);
|
|
94
|
+
if (isApiTranslated) return s; // already translated in field.extra
|
|
95
|
+
if (namespace) {
|
|
96
|
+
if (namespace === 'cbd') return t(`cbd:${s}`);
|
|
97
|
+
// a "labelled" option translates under the namespace; a bare primitive translates as-is.
|
|
98
|
+
return t(s) === s ? t(`${namespace}:${s}`) : t(s);
|
|
99
|
+
}
|
|
100
|
+
return t(s);
|
|
101
|
+
},
|
|
102
|
+
[t, namespace, isApiTranslated],
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
// ---- options (memoized off field.extra) -----------------------------------------------------
|
|
106
|
+
const raw: RawOption[] = Array.isArray(field.extra) ? field.extra : [];
|
|
107
|
+
const options: DropdownOption[] = React.useMemo(
|
|
108
|
+
() =>
|
|
109
|
+
raw.map((o) => {
|
|
110
|
+
const n = normalizeOption(o);
|
|
111
|
+
return { value: n.value, label: labelFor(n.rawLabel), disabled: n.disabled };
|
|
112
|
+
}),
|
|
113
|
+
// field.extra identity changes when the form `.set('extra', …)` runs (make->models).
|
|
114
|
+
[raw, labelFor],
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
const hasError = !!field.hasError && !!field.error;
|
|
118
|
+
const label = field.placeholder ? t(field.placeholder) : field.label ? t(field.label) : '';
|
|
119
|
+
const isDisabled = !!field.disabled || !!disabled;
|
|
120
|
+
|
|
121
|
+
// =========================================================================================
|
|
122
|
+
// MULTI — primitive array value, checklist menu, chips on the trigger.
|
|
123
|
+
// =========================================================================================
|
|
124
|
+
if (isMulti) {
|
|
125
|
+
return (
|
|
126
|
+
<MultiDropdown
|
|
127
|
+
field={field}
|
|
128
|
+
options={options}
|
|
129
|
+
label={hideLabel ? '' : label}
|
|
130
|
+
hasError={hasError}
|
|
131
|
+
disabled={isDisabled}
|
|
132
|
+
ariaLabel={label}
|
|
133
|
+
style={style}
|
|
134
|
+
className={className}
|
|
135
|
+
/>
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// =========================================================================================
|
|
140
|
+
// SINGLE — value is {value,label} (default) or the source object (isObj).
|
|
141
|
+
// =========================================================================================
|
|
142
|
+
// current scalar value to highlight in the menu (legacy reads value.value ?? value).
|
|
143
|
+
const rawValue = field.value;
|
|
144
|
+
const currentValue =
|
|
145
|
+
rawValue && typeof rawValue === 'object'
|
|
146
|
+
? String(rawValue.value != null ? rawValue.value : '')
|
|
147
|
+
: rawValue != null
|
|
148
|
+
? String(rawValue)
|
|
149
|
+
: '';
|
|
150
|
+
|
|
151
|
+
const commit = (next: string) => {
|
|
152
|
+
if (next === '') {
|
|
153
|
+
// clear (only reachable when !disableClearable).
|
|
154
|
+
field.onChange(isObj ? null : '', field.name);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
if (isObj) {
|
|
158
|
+
// resolve the SOURCE option object out of field.extra (matched by value/key) so
|
|
159
|
+
// form.output keeps receiving the object (GENDERS/TITLES parity).
|
|
160
|
+
const match = raw.find((o) => {
|
|
161
|
+
const n = normalizeOption(o);
|
|
162
|
+
return n.value === next;
|
|
163
|
+
});
|
|
164
|
+
field.onChange(match != null ? match : null, field.name);
|
|
165
|
+
} else {
|
|
166
|
+
// legacy getValue(): commit the {value,label} pair.
|
|
167
|
+
const chosen = options.find((o) => o.value === next);
|
|
168
|
+
field.onChange({ value: next, label: chosen ? chosen.label : next }, field.name);
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
// a clear option is prepended (mirrors MaterialAutocomplete's clear) unless disabled.
|
|
173
|
+
const menuOptions: DropdownOption[] =
|
|
174
|
+
disableClearable || !currentValue ? options : [{ value: '', label: '—' }, ...options];
|
|
175
|
+
|
|
176
|
+
return (
|
|
177
|
+
<div className={'mfd' + (className ? ' ' + className : '')} style={style}>
|
|
178
|
+
{label && !hideLabel ? <label className="md-label-sm mfield-label mfd-label">{label}</label> : null}
|
|
179
|
+
<Dropdown
|
|
180
|
+
value={currentValue}
|
|
181
|
+
options={menuOptions}
|
|
182
|
+
onChange={commit}
|
|
183
|
+
placeholder={label || '—'}
|
|
184
|
+
ariaLabel={label}
|
|
185
|
+
disabled={isDisabled}
|
|
186
|
+
className={hasError ? 'mfd-invalid' : undefined}
|
|
187
|
+
/>
|
|
188
|
+
{hasError ? <span className="mfield-error-text mfd-error">{field.error}</span> : null}
|
|
189
|
+
</div>
|
|
190
|
+
);
|
|
191
|
+
},
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
// ---------------------------------------------------------------------------------------------
|
|
195
|
+
// Multi-select — built on the same mselect-* classes as the base Dropdown, with a checklist
|
|
196
|
+
// menu and chips on the trigger. Value is a primitive string[] (legacy MaterialSelect parity:
|
|
197
|
+
// onChange(values, field.name); field.output keeps Array.isArray(values) ? values : null).
|
|
198
|
+
// ---------------------------------------------------------------------------------------------
|
|
199
|
+
interface MultiProps {
|
|
200
|
+
field: any;
|
|
201
|
+
options: DropdownOption[];
|
|
202
|
+
label: string;
|
|
203
|
+
hasError: boolean;
|
|
204
|
+
disabled: boolean;
|
|
205
|
+
ariaLabel: string;
|
|
206
|
+
style?: React.CSSProperties;
|
|
207
|
+
className?: string;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
const MultiDropdown: React.FunctionComponent<MultiProps> = observer(
|
|
211
|
+
({ field, options, label, hasError, disabled, ariaLabel, style, className }) => {
|
|
212
|
+
const [open, setOpen] = React.useState(false);
|
|
213
|
+
const rootRef = React.useRef<HTMLDivElement | null>(null);
|
|
214
|
+
const btnRef = React.useRef<HTMLButtonElement | null>(null);
|
|
215
|
+
|
|
216
|
+
const selected: string[] = Array.isArray(field.value) ? field.value.map(String) : [];
|
|
217
|
+
|
|
218
|
+
// click-away (guarded for SSR), matching the base Dropdown.
|
|
219
|
+
React.useEffect(() => {
|
|
220
|
+
if (!open || typeof document === 'undefined') return undefined;
|
|
221
|
+
const onDocMouseDown = (e: MouseEvent) => {
|
|
222
|
+
if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false);
|
|
223
|
+
};
|
|
224
|
+
document.addEventListener('mousedown', onDocMouseDown);
|
|
225
|
+
return () => document.removeEventListener('mousedown', onDocMouseDown);
|
|
226
|
+
}, [open]);
|
|
227
|
+
|
|
228
|
+
const toggle = (value: string) => {
|
|
229
|
+
if (disabled) return;
|
|
230
|
+
const next = selected.indexOf(value) > -1 ? selected.filter((v) => v !== value) : [...selected, value];
|
|
231
|
+
field.onChange(next, field.name);
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
const removeChip = (e: React.MouseEvent, value: string) => {
|
|
235
|
+
e.stopPropagation();
|
|
236
|
+
if (disabled) return;
|
|
237
|
+
field.onChange(selected.filter((v) => v !== value), field.name);
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
const onTriggerKeyDown = (e: React.KeyboardEvent) => {
|
|
241
|
+
if (disabled) return;
|
|
242
|
+
if (e.key === 'Escape') {
|
|
243
|
+
setOpen(false);
|
|
244
|
+
if (btnRef.current) btnRef.current.focus();
|
|
245
|
+
} else if (e.key === 'Tab') {
|
|
246
|
+
setOpen(false);
|
|
247
|
+
} else if (!open && (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ')) {
|
|
248
|
+
e.preventDefault();
|
|
249
|
+
setOpen(true);
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
const labelOf = (value: string) => {
|
|
254
|
+
const o = options.find((opt) => opt.value === value);
|
|
255
|
+
return o ? o.label : value;
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
return (
|
|
259
|
+
<div className={'mfd' + (className ? ' ' + className : '')} style={style}>
|
|
260
|
+
{label ? <label className="md-label-sm mfield-label mfd-label">{label}</label> : null}
|
|
261
|
+
<div className="mselect mselect--block mfd-multi" ref={rootRef}>
|
|
262
|
+
<button
|
|
263
|
+
ref={btnRef}
|
|
264
|
+
type="button"
|
|
265
|
+
className={'mselect-btn mfd-multi-btn' + (hasError ? ' mfd-invalid' : '')}
|
|
266
|
+
aria-haspopup="listbox"
|
|
267
|
+
aria-expanded={open}
|
|
268
|
+
aria-label={ariaLabel}
|
|
269
|
+
disabled={disabled}
|
|
270
|
+
onClick={() => setOpen((o) => !o)}
|
|
271
|
+
onKeyDown={onTriggerKeyDown}
|
|
272
|
+
>
|
|
273
|
+
{selected.length ? (
|
|
274
|
+
<span className="mfd-chips">
|
|
275
|
+
{selected.map((v) => (
|
|
276
|
+
<span className="mfd-chip" key={v}>
|
|
277
|
+
<span className="mfd-chip-label">{labelOf(v)}</span>
|
|
278
|
+
<span
|
|
279
|
+
className="mfd-chip-x"
|
|
280
|
+
role="button"
|
|
281
|
+
tabIndex={-1}
|
|
282
|
+
aria-label="remove"
|
|
283
|
+
onMouseDown={(e) => e.preventDefault()}
|
|
284
|
+
onClick={(e) => removeChip(e, v)}
|
|
285
|
+
>
|
|
286
|
+
<Icon name="x" size={13} />
|
|
287
|
+
</span>
|
|
288
|
+
</span>
|
|
289
|
+
))}
|
|
290
|
+
</span>
|
|
291
|
+
) : (
|
|
292
|
+
<span className="mselect-label mselect-label--ph">{label || '—'}</span>
|
|
293
|
+
)}
|
|
294
|
+
<Icon name="chevron-down" cls="mselect-chev" />
|
|
295
|
+
</button>
|
|
296
|
+
{open && (
|
|
297
|
+
<ul className="mselect-menu mfd-multi-menu" role="listbox" aria-multiselectable="true" tabIndex={-1}>
|
|
298
|
+
{options.map((opt, i) => {
|
|
299
|
+
const checked = selected.indexOf(opt.value) > -1;
|
|
300
|
+
return (
|
|
301
|
+
<li key={`${opt.value}_${i}`} role="presentation">
|
|
302
|
+
<button
|
|
303
|
+
type="button"
|
|
304
|
+
role="option"
|
|
305
|
+
aria-selected={checked}
|
|
306
|
+
disabled={opt.disabled}
|
|
307
|
+
className={'mselect-opt mfd-multi-opt' + (checked ? ' is-checked' : '')}
|
|
308
|
+
onClick={() => toggle(opt.value)}
|
|
309
|
+
>
|
|
310
|
+
<span className={'mfd-check' + (checked ? ' mfd-check--on' : '')}>
|
|
311
|
+
{checked ? <Icon name="check" size={14} /> : null}
|
|
312
|
+
</span>
|
|
313
|
+
<span className="mselect-opt-label">{opt.label}</span>
|
|
314
|
+
</button>
|
|
315
|
+
</li>
|
|
316
|
+
);
|
|
317
|
+
})}
|
|
318
|
+
</ul>
|
|
319
|
+
)}
|
|
320
|
+
</div>
|
|
321
|
+
{hasError ? <span className="mfield-error-text mfd-error">{field.error}</span> : null}
|
|
322
|
+
</div>
|
|
323
|
+
);
|
|
324
|
+
},
|
|
325
|
+
);
|
|
326
|
+
|
|
327
|
+
export default FormDropdown;
|
package/ui/FormField.tsx
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// Autobahn (auto.de redesign) — md3 form field bound to a mobx-react-form field.
|
|
2
|
+
//
|
|
3
|
+
// The Wave-0 form-kit input: a labelled, outlined MD3 text field that binds directly to a
|
|
4
|
+
// mobx-react-form field via field.bind() — the SAME field objects the legacy FormInput used
|
|
5
|
+
// (LoginForm.$('email'), RegisterForm.$('password'), …). So every existing validation rule,
|
|
6
|
+
// onChange/onBlur, submit hook and error works unchanged; only the markup is re-skinned.
|
|
7
|
+
//
|
|
8
|
+
// Observer-wrapped so it re-renders on field value/error changes. Renders correctly only inside
|
|
9
|
+
// a `.md3` subtree (scoped theme). Pure/presentational beyond the injected field.
|
|
10
|
+
|
|
11
|
+
import * as React from 'react';
|
|
12
|
+
import { observer } from 'mobx-react';
|
|
13
|
+
|
|
14
|
+
import Icon from './Icon';
|
|
15
|
+
|
|
16
|
+
export interface FormFieldProps {
|
|
17
|
+
/** mobx-react-form field (LoginForm.$('email') etc.). Typed any — the lib ships no TS types. */
|
|
18
|
+
field: any;
|
|
19
|
+
/** i18n translate (AuthRegisterPage ns) — resolves the field's placeholder/label key. */
|
|
20
|
+
t: (key: string, options?: object) => string;
|
|
21
|
+
/** override the field's own type (e.g. force 'password'). */
|
|
22
|
+
type?: string;
|
|
23
|
+
id?: string;
|
|
24
|
+
autoComplete?: 'on' | 'off';
|
|
25
|
+
disabled?: boolean;
|
|
26
|
+
onKeyPress?: (event: React.KeyboardEvent<HTMLInputElement>) => void;
|
|
27
|
+
/** suppress the built-in label (for layouts that supply their own external label next to the field). */
|
|
28
|
+
hideLabel?: boolean;
|
|
29
|
+
/** opt-in: show a green check + green border when the field is filled and valid (checkout). */
|
|
30
|
+
showValid?: boolean;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const FormField: React.FunctionComponent<FormFieldProps> = observer(
|
|
34
|
+
({ field, t, type, id, autoComplete, disabled, onKeyPress, hideLabel, showValid }) => {
|
|
35
|
+
const [reveal, setReveal] = React.useState<boolean>(false);
|
|
36
|
+
// Auto-generate a stable id (React 18 useId) when the caller doesn't pass one, so the
|
|
37
|
+
// <label htmlFor> below is ALWAYS wired to a real input id — ~30 call sites (incl. the
|
|
38
|
+
// checkout money-path) never pass `id` and previously rendered an unassociated label.
|
|
39
|
+
// useId() is called unconditionally (rules-of-hooks) even when `id` is supplied; the
|
|
40
|
+
// generated value is simply discarded in that case (`id ||` wins), so it never appears
|
|
41
|
+
// for `id`-bearing fields.
|
|
42
|
+
const generatedId = React.useId();
|
|
43
|
+
const inputId = id || generatedId;
|
|
44
|
+
const bound = field.bind();
|
|
45
|
+
const fieldType: string = type || field.type || 'text';
|
|
46
|
+
const isPassword = fieldType === 'password';
|
|
47
|
+
const inputType = isPassword && reveal ? 'text' : fieldType;
|
|
48
|
+
const hasError = !!field.hasError && !!field.error;
|
|
49
|
+
const isValid = !!showValid && !disabled && !isPassword && !hasError && !!field.value;
|
|
50
|
+
// Visible label (a11y). Prefer the translated placeholder key (Auth forms), else translate the
|
|
51
|
+
// field's label key (Checkout forms use i18n keys as `label`). t() returns the input unchanged
|
|
52
|
+
// when there's no translation (Auth labels are plain strings), so this is safe for both.
|
|
53
|
+
const label = field.placeholder ? t(field.placeholder) : field.label ? t(field.label) : '';
|
|
54
|
+
|
|
55
|
+
return (
|
|
56
|
+
<div className="mfield-group">
|
|
57
|
+
{label && !hideLabel ? <label className="md-label-sm mfield-label" htmlFor={inputId}>{label}</label> : null}
|
|
58
|
+
<div className={'mfield' + (hasError ? ' mfield--error' : '') + (disabled ? ' mfield--disabled' : '') + (isValid ? ' mfield--valid' : '')}>
|
|
59
|
+
<input
|
|
60
|
+
{...bound}
|
|
61
|
+
id={inputId}
|
|
62
|
+
type={inputType}
|
|
63
|
+
autoComplete={autoComplete}
|
|
64
|
+
disabled={disabled}
|
|
65
|
+
placeholder=""
|
|
66
|
+
onKeyPress={onKeyPress}
|
|
67
|
+
style={{ width: '100%' }}
|
|
68
|
+
/>
|
|
69
|
+
{isPassword ? (
|
|
70
|
+
<button
|
|
71
|
+
type="button"
|
|
72
|
+
className="mfield-eye"
|
|
73
|
+
tabIndex={-1}
|
|
74
|
+
aria-label={t('autobahn:auth.togglePassword')}
|
|
75
|
+
onClick={() => setReveal((r) => !r)}
|
|
76
|
+
>
|
|
77
|
+
<Icon name={reveal ? 'eye-off' : 'eye'} size={18} />
|
|
78
|
+
</button>
|
|
79
|
+
) : null}
|
|
80
|
+
{isValid ? <span className="mfield-ok"><Icon name="check" size={18} /></span> : null}
|
|
81
|
+
</div>
|
|
82
|
+
{hasError ? <span className="mfield-error-text">{field.error}</span> : null}
|
|
83
|
+
</div>
|
|
84
|
+
);
|
|
85
|
+
},
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
export default FormField;
|
package/ui/FormRadio.tsx
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// Autobahn (auto.de redesign) — md3 selectable radio wrapper.
|
|
2
|
+
//
|
|
3
|
+
// The leaf of the md3 radio pair (used with FormRadioGroup). It is a SELECTABLE WRAPPER around
|
|
4
|
+
// ARBITRARY children, re-skinning the legacy fe-ui-core radio child (a `CheckboxMaterial radio`
|
|
5
|
+
// or `_common/Radio`) used across 5 pages — including the RICH custom-label radios in
|
|
6
|
+
// VehicleEdit/VehicleAdd: exterior/interior color swatches, Feinstaub emission stickers,
|
|
7
|
+
// interior-material icons, energy-efficiency bars, and DAT-model spec grids. Text-only is just
|
|
8
|
+
// the simple case; the mandatory case is arbitrary children, so a radio can contain any markup.
|
|
9
|
+
//
|
|
10
|
+
// LEGACY SIGNATURE (replicated so a structure-preserving re-skin is a drop-in):
|
|
11
|
+
// In the legacy tree the group (`fe-ui-core` RadioGroup / our FormMaterialRadioGroup → MUI
|
|
12
|
+
// RadioGroup) CLONES each child injecting `checked` (computed from `child.value === group.value`)
|
|
13
|
+
// plus an `onChange`. The child carries the option key in `value` and renders its visual via
|
|
14
|
+
// `content` / `icon` / `label`. Here the SAME shape is preserved: `value` is the option key,
|
|
15
|
+
// the children are the visual, and FormRadioGroup injects `checked` + `onSelect` (and the shared
|
|
16
|
+
// `name` / `disabled` / `error`) by cloning. The child fires `onSelect(value)` on activation —
|
|
17
|
+
// the group is what talks to the mobx field, never the leaf.
|
|
18
|
+
//
|
|
19
|
+
// A native hidden `<input type="radio">` is kept (as the legacy `_common/Radio` did) so the control
|
|
20
|
+
// is real radio semantics for a11y + forms; the visible chrome is the md3 `.mradio` surface with a
|
|
21
|
+
// selected ring/outline driven by `checked`. Pure/presentational. Renders correctly only inside a
|
|
22
|
+
// `<div className="md3">` subtree (scoped theme).
|
|
23
|
+
|
|
24
|
+
import * as React from 'react';
|
|
25
|
+
|
|
26
|
+
export interface FormRadioProps {
|
|
27
|
+
/** the option key this radio represents (compared against the group's field.value). */
|
|
28
|
+
value: any;
|
|
29
|
+
/** arbitrary visual: plain text, a color swatch, an emission-sticker <img>, an icon, a spec grid… */
|
|
30
|
+
children?: React.ReactNode;
|
|
31
|
+
disabled?: boolean;
|
|
32
|
+
/** accessible label when `children` is non-text (swatch/icon/img) and needs a name. */
|
|
33
|
+
ariaLabel?: string;
|
|
34
|
+
/** extra class(es) on the wrapper (layout hooks from the caller). */
|
|
35
|
+
className?: string;
|
|
36
|
+
/** inline style on the wrapper `<label>` (layout hooks the caller cannot express as a class,
|
|
37
|
+
* e.g. a full-width stacked DAT-model row). Optional; merged onto the `.mradio` surface. */
|
|
38
|
+
style?: React.CSSProperties;
|
|
39
|
+
|
|
40
|
+
// ---- injected by FormRadioGroup via React.cloneElement (do not pass by hand) ----
|
|
41
|
+
/** true when this radio's `value` is the group's selected value. */
|
|
42
|
+
checked?: boolean;
|
|
43
|
+
/** group callback — fires with this radio's `value` on activation. */
|
|
44
|
+
onSelect?: (value: any) => void;
|
|
45
|
+
/** shared radio-group name (so the native inputs form one exclusive group). */
|
|
46
|
+
name?: string;
|
|
47
|
+
/** mirrors the group's error state (red ring), matching the legacy `error` clone prop. */
|
|
48
|
+
error?: boolean;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const FormRadio: React.FunctionComponent<FormRadioProps> = ({
|
|
52
|
+
value,
|
|
53
|
+
children,
|
|
54
|
+
disabled = false,
|
|
55
|
+
ariaLabel,
|
|
56
|
+
className,
|
|
57
|
+
style,
|
|
58
|
+
checked = false,
|
|
59
|
+
onSelect,
|
|
60
|
+
name,
|
|
61
|
+
error = false,
|
|
62
|
+
}) => {
|
|
63
|
+
const handleChange = () => {
|
|
64
|
+
if (disabled) return;
|
|
65
|
+
if (onSelect) onSelect(value);
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const cls =
|
|
69
|
+
'mradio' +
|
|
70
|
+
(checked ? ' mradio--on' : '') +
|
|
71
|
+
(disabled ? ' mradio--disabled' : '') +
|
|
72
|
+
(error && !checked ? ' mradio--error' : '') +
|
|
73
|
+
(className ? ` ${className}` : '');
|
|
74
|
+
|
|
75
|
+
return (
|
|
76
|
+
<label className={cls} style={style}>
|
|
77
|
+
{/* Real radio input (hidden) — keeps native exclusive-group + keyboard + a11y semantics. */}
|
|
78
|
+
<input
|
|
79
|
+
type="radio"
|
|
80
|
+
className="mradio-input"
|
|
81
|
+
name={name}
|
|
82
|
+
value={value}
|
|
83
|
+
checked={checked}
|
|
84
|
+
disabled={disabled}
|
|
85
|
+
aria-label={ariaLabel}
|
|
86
|
+
onChange={handleChange}
|
|
87
|
+
/>
|
|
88
|
+
<span className="mradio-body">{children}</span>
|
|
89
|
+
</label>
|
|
90
|
+
);
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export default FormRadio;
|