@bytebrand/fe-ui-core-autobahn 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. package/assets/autode-logo.svg +6 -6
  2. package/cards/CarCard.tsx +174 -174
  3. package/cards/CarRow.tsx +186 -182
  4. package/cards/cardParts.tsx +529 -489
  5. package/cards/index.ts +37 -35
  6. package/cards/types.ts +124 -114
  7. package/chrome/Footer.tsx +189 -189
  8. package/chrome/TopBar.tsx +405 -405
  9. package/chrome/index.ts +20 -20
  10. package/chrome/svg.d.ts +11 -11
  11. package/compat/AccardionSection/AccardionSection.styl +45 -45
  12. package/compat/AccardionSection/AccardionSection.tsx +56 -56
  13. package/compat/AccordionWidget/AccordionWidget.styl +220 -220
  14. package/compat/AccordionWidget/AccordionWidget.tsx +257 -257
  15. package/compat/AccordionWrapper/AccordionItem/AccordionItem.styl +34 -34
  16. package/compat/AccordionWrapper/AccordionItem/AccordionItem.tsx +64 -64
  17. package/compat/AccordionWrapper/AccordionWrapper.tsx +34 -34
  18. package/compat/AdvantageItem/AdvantageItem.styl +47 -47
  19. package/compat/AdvantageItem/AdvantageItem.tsx +26 -26
  20. package/compat/Alternative/DealerInfo.styl +116 -116
  21. package/compat/Alternative/DealerInfo.tsx +171 -171
  22. package/compat/Badge/Badge.styl +44 -44
  23. package/compat/Badge/Badge.tsx +25 -25
  24. package/compat/BodyTypeIcons/Audi.tsx +9 -9
  25. package/compat/BodyTypeIcons/Bmw.tsx +860 -860
  26. package/compat/BodyTypeIcons/Ford.tsx +31 -31
  27. package/compat/BodyTypeIcons/IconsConfig.tsx +44 -44
  28. package/compat/BodyTypeIcons/IconsConfigCompact.tsx +30 -30
  29. package/compat/BodyTypeIcons/Mazda.tsx +44 -44
  30. package/compat/BodyTypeIcons/MercedesBenz.tsx +38 -38
  31. package/compat/BodyTypeIcons/Opel.tsx +19 -19
  32. package/compat/BodyTypeIcons/Search.tsx +19 -19
  33. package/compat/BodyTypeIcons/SelectorCategoryCombi.tsx +68 -68
  34. package/compat/BodyTypeIcons/SelectorCategoryCompact.tsx +20 -20
  35. package/compat/BodyTypeIcons/SelectorCategoryConvertible.tsx +68 -68
  36. package/compat/BodyTypeIcons/SelectorCategoryCoupe.tsx +60 -60
  37. package/compat/BodyTypeIcons/SelectorCategoryMinibus.tsx +64 -64
  38. package/compat/BodyTypeIcons/SelectorCategorySedan.tsx +69 -69
  39. package/compat/BodyTypeIcons/SelectorCategorySuv.tsx +77 -77
  40. package/compat/BodyTypeIcons/SelectorCategoryTransporter.tsx +68 -68
  41. package/compat/BodyTypeIcons/SelectorCategoryVan.tsx +72 -72
  42. package/compat/BodyTypeIcons/Volkswagen.tsx +330 -330
  43. package/compat/BodyTypeIcons/index.ts +17 -17
  44. package/compat/Button/Button.tsx +65 -65
  45. package/compat/ButtonOld/Button.styl +65 -65
  46. package/compat/ButtonOld/Button.tsx +84 -84
  47. package/compat/Checkbox/Checkbox.styl +119 -119
  48. package/compat/Checkbox/Checkbox.tsx +151 -151
  49. package/compat/Checkbox/FormCheckbox.styl +22 -22
  50. package/compat/Checkbox/FormCheckbox.tsx +86 -86
  51. package/compat/Co2Widget/CO2Efficiency.styl +219 -219
  52. package/compat/Co2Widget/CO2Efficiency.tsx +93 -93
  53. package/compat/ContactInfo/ContactInfo.styl +22 -22
  54. package/compat/ContactInfo/ContactInfo.tsx +161 -161
  55. package/compat/ContactInfo/TemporaryTranslation.ts +11 -11
  56. package/compat/CookieModal/CookieModal.tsx +49 -49
  57. package/compat/CookieModal/Modal.tsx +43 -43
  58. package/compat/CookieModal/ModalsConfig.tsx +23 -23
  59. package/compat/CookieModal/modals/ManageCookieModal/ManageCookieModal.styl +86 -86
  60. package/compat/CookieModal/modals/ManageCookieModal/ManageCookieModal.tsx +184 -184
  61. package/compat/CookieModal/modals/PreviewCookieModal/PreviewCookieModal.styl +66 -66
  62. package/compat/CookieModal/modals/PreviewCookieModal/PreviewCookieModal.tsx +51 -51
  63. package/compat/CookieModal/modals/TestModal.tsx +7 -7
  64. package/compat/CookieModal/useModal.ts +13 -13
  65. package/compat/CustomerQuote/CustomerQuote.styl +79 -79
  66. package/compat/CustomerQuote/CustomerQuote.tsx +68 -68
  67. package/compat/CustomerQuotesSlider/CustomerQuotesSlider.styl +46 -46
  68. package/compat/CustomerQuotesSlider/CustomerQuotesSlider.tsx +79 -79
  69. package/compat/CustomerQuotesSlider/SliderArrow.tsx +20 -20
  70. package/compat/CustomerQuotesSlider/slider.global.styl +2 -2
  71. package/compat/ExpansionPanel/ExpansionPanel.tsx +68 -68
  72. package/compat/FirstInfoBlock/FirstInfoBlock.styl +33 -33
  73. package/compat/FirstInfoBlock/FirstInfoBlock.tsx +49 -49
  74. package/compat/FirstInfoBlock/FirstInfoBlockItem/FirstInfoBlockItem.styl +66 -66
  75. package/compat/FirstInfoBlock/FirstInfoBlockItem/FirstInfoBlockItem.tsx +21 -21
  76. package/compat/FormattedNumber/FormattedNumber.styl +1 -1
  77. package/compat/FormattedNumber/FormattedNumber.tsx +90 -90
  78. package/compat/IconContainer/IconContainer.styl +23 -23
  79. package/compat/IconContainer/IconContainer.tsx +34 -34
  80. package/compat/Image/Image.styl +109 -109
  81. package/compat/Image/Image.tsx +302 -302
  82. package/compat/ImageSettings/EditableOptionsTable/CustomCheckbox/CustomCheckbox.styl +7 -7
  83. package/compat/ImageSettings/EditableOptionsTable/CustomCheckbox/CustomCheckbox.tsx +30 -30
  84. package/compat/ImageSettings/EditableOptionsTable/EditableOptionsTable.styl +122 -122
  85. package/compat/ImageSettings/EditableOptionsTable/EditableOptionsTable.tsx +199 -199
  86. package/compat/ImageSettings/EditableOptionsTable/ImageIcon/ImageIcon.styl +3 -3
  87. package/compat/ImageSettings/EditableOptionsTable/ImageIcon/ImageIcon.tsx +15 -15
  88. package/compat/ImageSettings/OptionsTable/OptionsTable.styl +47 -47
  89. package/compat/ImageSettings/OptionsTable/OptionsTable.tsx +122 -122
  90. package/compat/ImageSettings/PricePlan/PricePlan.styl +63 -63
  91. package/compat/ImageSettings/PricePlan/PricePlan.tsx +32 -32
  92. package/compat/ImageSettings/index.ts +42 -42
  93. package/compat/ImagesSet/ImagesSet.styl +27 -27
  94. package/compat/ImagesSet/ImagesSet.tsx +76 -76
  95. package/compat/InfoBlockWrapper/InfoBlockWrapper.styl +41 -41
  96. package/compat/InfoBlockWrapper/InfoBlockWrapper.tsx +46 -46
  97. package/compat/Loader/Loader.styl +39 -39
  98. package/compat/Loader/Loader.tsx +32 -32
  99. package/compat/MagnifyGlass/MagnifyGlass.styl +33 -33
  100. package/compat/MagnifyGlass/MagnifyGlass.tsx +213 -213
  101. package/compat/MdAccordionGroup/MdAccordionGroup.tsx +53 -53
  102. package/compat/MdCheckbox/MdCheckbox.tsx +69 -69
  103. package/compat/MdField/MdField.tsx +100 -100
  104. package/compat/MdSelect/MdSelect.tsx +103 -103
  105. package/compat/MdSwitch/MdSwitch.tsx +29 -29
  106. package/compat/MdTabs/MdTabs.tsx +47 -47
  107. package/compat/MdTooltip/MdTooltip.tsx +31 -31
  108. package/compat/OfferDetailedSection/OfferDetailedSection.styl +31 -31
  109. package/compat/OfferDetailedSection/OfferDetailedSection.tsx +100 -100
  110. package/compat/OfferDetailedSection/partials/PanelConfig.styl +131 -131
  111. package/compat/OfferDetailedSection/partials/PanelConfig.tsx +121 -121
  112. package/compat/OfferPanel/AboAccordion/AboAccordion.styl +24 -24
  113. package/compat/OfferPanel/AboAccordion/AboAccordion.tsx +128 -128
  114. package/compat/OfferPanel/AboAccordion/AboColorOptions/AboColorOptions.styl +11 -11
  115. package/compat/OfferPanel/AboAccordion/AboColorOptions/AboColorOptions.tsx +35 -35
  116. package/compat/OfferPanel/AboAccordion/AboFaq/AboFaq.styl +20 -20
  117. package/compat/OfferPanel/AboAccordion/AboFaq/AboFaq.tsx +25 -25
  118. package/compat/OfferPanel/AboAccordion/AboIncludedServices/AboIncludedServices.styl +13 -13
  119. package/compat/OfferPanel/AboAccordion/AboIncludedServices/AboIncludedServices.tsx +39 -39
  120. package/compat/OfferPanel/MuiOfferPeriod/MuiOfferPeriod.tsx +42 -42
  121. package/compat/OfferPanel/OfferCheckboxGroup/CheckboxContainer.tsx +140 -140
  122. package/compat/OfferPanel/OfferCheckboxGroup/OfferCheckboxGroup.styl +144 -144
  123. package/compat/OfferPanel/OfferCheckboxGroup/OfferCheckboxGroup.tsx +23 -23
  124. package/compat/OfferPanel/OfferPanel.styl +193 -193
  125. package/compat/OfferPanel/OfferPanel.tsx +81 -81
  126. package/compat/OfferPanel/OfferPeriod/OfferPeriod.styl +24 -24
  127. package/compat/OfferPanel/OfferPeriod/OfferPeriod.tsx +45 -45
  128. package/compat/OfferPanel/RangeGroup/RangeGroup.tsx +39 -39
  129. package/compat/OfferRequestButtonWrapper/OfferRequestButtonWrapper.styl +119 -119
  130. package/compat/OfferRequestButtonWrapper/OfferRequestButtonWrapper.styled.tsx +33 -33
  131. package/compat/OfferRequestButtonWrapper/OfferRequestButtonWrapper.tsx +122 -122
  132. package/compat/PriceRating/PriceRating.styl +47 -47
  133. package/compat/PriceRating/PriceRating.tsx +64 -64
  134. package/compat/PriceRatingDetailed/PriceRatingDetailed.styl +120 -120
  135. package/compat/PriceRatingDetailed/PriceRatingDetailed.tsx +191 -191
  136. package/compat/PricingToolBlock/PricingTool.styl +6 -6
  137. package/compat/PricingToolBlock/PricingTool.tsx +29 -29
  138. package/compat/Radio/Radio.styl +115 -115
  139. package/compat/Radio/Radio.tsx +141 -141
  140. package/compat/Radio/RadioGroup.styl +5 -5
  141. package/compat/Radio/RadioGroup.tsx +65 -65
  142. package/compat/Range/Range.tsx +79 -79
  143. package/compat/RateSearchValue/RateSearchValue.styl +22 -22
  144. package/compat/RateSearchValue/RateSearchValue.tsx +55 -55
  145. package/compat/RateSearchWidget/RateSearchWidget.styl +106 -106
  146. package/compat/RateSearchWidget/RateSearchWidget.tsx +163 -163
  147. package/compat/ServiceBlockItem/ServiceBlockItem.styl +47 -47
  148. package/compat/ServiceBlockItem/ServiceBlockItem.tsx +25 -25
  149. package/compat/SkeletonItem/SkeletonItem.styl +80 -80
  150. package/compat/SkeletonItem/SkeletonItem.tsx +80 -80
  151. package/compat/StarButton/StarButton.styl +39 -39
  152. package/compat/StarButton/StarButton.tsx +31 -31
  153. package/compat/TabPanel/TabPanel.tsx +28 -28
  154. package/compat/TimePicker/TimePicker.styl +22 -22
  155. package/compat/TimePicker/TimePicker.tsx +156 -156
  156. package/compat/Tooltip/Tooltip.styl +117 -117
  157. package/compat/Tooltip/Tooltip.tsx +63 -63
  158. package/compat/Usp/Usp.styl +78 -78
  159. package/compat/Usp/Usp.tsx +30 -30
  160. package/compat/Usp/uspTranslate.ts +12 -12
  161. package/compat/VehicleDetailedSidebar/VehicleDetailedSidebar.styl +36 -36
  162. package/compat/VehicleDetailedSidebar/VehicleDetailedSidebar.tsx +178 -178
  163. package/compat/VehicleDetailedSidebar/partials/Price.styl +27 -27
  164. package/compat/VehicleDetailedSidebar/partials/Price.tsx +41 -41
  165. package/compat/VehicleDetailedSidebar/partials/PriceContent.styl +123 -123
  166. package/compat/VehicleDetailedSidebar/partials/PriceContent.tsx +128 -128
  167. package/compat/VehicleDetailedSidebar/partials/Properties.styl +58 -58
  168. package/compat/VehicleDetailedSidebar/partials/Properties.tsx +155 -155
  169. package/compat/VehicleDetailedSidebar/partials/Title.styl +35 -35
  170. package/compat/VehicleDetailedSidebar/partials/Title.tsx +33 -33
  171. package/compat/VehicleDetailedSlider/VehicleDetailedSlider.styl +146 -146
  172. package/compat/VehicleDetailedSlider/VehicleDetailedSlider.tsx +382 -382
  173. package/compat/VehicleDetailedSlider/partials/MobileStast.tsx +61 -61
  174. package/compat/VehicleDetailedSlider/partials/MobileStats.styl +71 -71
  175. package/compat/VehicleDetailedSlider/partials/PriceData.styl +50 -50
  176. package/compat/VehicleDetailedSlider/partials/PriceData.tsx +67 -67
  177. package/compat/VehicleDetailedSlider/partials/Stats.styl +80 -80
  178. package/compat/VehicleDetailedSlider/partials/Stats.tsx +62 -62
  179. package/compat/VehicleDetailedSlider/partials/Title.styl +44 -44
  180. package/compat/VehicleDetailedSlider/partials/Title.tsx +36 -36
  181. package/compat/VehicleFormattedPrice/VehicleFormattedPrice.styl +148 -148
  182. package/compat/VehicleFormattedPrice/VehicleFormattedPrice.tsx +163 -163
  183. package/compat/VehicleSlider/VehicleSlider.styl +62 -62
  184. package/compat/VehicleSlider/VehicleSlider.tsx +125 -125
  185. package/compat/VehicleSlider/VehicleSliderForSRL.tsx +175 -175
  186. package/compat/VehicleSmallCard/SeoText/SeoText.styl +8 -8
  187. package/compat/VehicleSmallCard/SeoText/SeoText.tsx +16 -16
  188. package/compat/VehicleSmallCard/VehicleData/VechiclePriceItem/VechiclePriceItem.styl +204 -204
  189. package/compat/VehicleSmallCard/VehicleData/VechiclePriceItem/VechiclePriceItem.tsx +199 -199
  190. package/compat/VehicleSmallCard/VehicleData/VehicleInfo/VehicleInfo.styl +273 -273
  191. package/compat/VehicleSmallCard/VehicleData/VehicleInfo/VehicleInfo.tsx +179 -179
  192. package/compat/VehicleSmallCard/VehicleData/VehiclePrice/VehiclePrice.styl +165 -165
  193. package/compat/VehicleSmallCard/VehicleData/VehiclePrice/VehiclePrice.tsx +299 -299
  194. package/compat/VehicleSmallCard/VehicleData/VehicleProperty/VehicleProperty.styl +32 -32
  195. package/compat/VehicleSmallCard/VehicleData/VehicleProperty/VehicleProperty.tsx +35 -35
  196. package/compat/VehicleSmallCard/VehicleData/VehicleTitle/VehicleTitle.styl +135 -135
  197. package/compat/VehicleSmallCard/VehicleData/VehicleTitle/VehicleTitle.tsx +91 -91
  198. package/compat/VehicleSmallCard/VehicleSmallCard.styl +309 -309
  199. package/compat/VehicleSmallCard/VehicleSmallCard.tsx +448 -448
  200. package/compat/index.ts +77 -77
  201. package/compat/legacy-theme/mixins.styl +93 -93
  202. package/compat/legacy-theme/priceReviewColors.styl +12 -12
  203. package/compat/legacy-theme/slider.global.styl +5 -5
  204. package/compat/legacy-theme/theme.styl +136 -136
  205. package/compat/withLabel/withLabel.styl +33 -33
  206. package/compat/withLabel/withLabel.tsx +44 -44
  207. package/compat/withStats/withStats.styl +174 -174
  208. package/compat/withStats/withStats.tsx +238 -238
  209. package/constants/RateSearchWidget.ts +15 -15
  210. package/constants/Search.ts +290 -290
  211. package/constants/SearchWidget.ts +108 -108
  212. package/constants/app.ts +223 -223
  213. package/constants/common.ts +127 -127
  214. package/constants/core.ts +131 -131
  215. package/constants/highlights.ts +165 -165
  216. package/constants/price.ts +9 -9
  217. package/constants/selectors.ts +38 -38
  218. package/constants.ts +91 -91
  219. package/data/DataTransformers.ts +88 -88
  220. package/data/fieldMapping.ts +364 -342
  221. package/data/toAutobahnCar.ts +455 -442
  222. package/iconsvg/IconSVG.tsx +30 -30
  223. package/iconsvg/IconSVGConfig.tsx +768 -768
  224. package/iconsvg/SVG/AboPartner.tsx +16 -16
  225. package/iconsvg/SVG/ArrowQuotes.tsx +22 -22
  226. package/iconsvg/SVG/CloseIcon.tsx +17 -17
  227. package/iconsvg/SVG/CloseIconSelect.tsx +18 -18
  228. package/iconsvg/SVG/ClosedLockIcon.tsx +18 -18
  229. package/iconsvg/SVG/DealerCheckIcon.tsx +18 -18
  230. package/iconsvg/SVG/DealerPopoverMail.tsx +21 -21
  231. package/iconsvg/SVG/DealerPopoverPhone.tsx +21 -21
  232. package/iconsvg/SVG/GrayPhoneIcon.tsx +22 -22
  233. package/iconsvg/SVG/InternetIcon.tsx +18 -18
  234. package/iconsvg/SVG/WhiteEnvelopeIcon.tsx +21 -21
  235. package/iconsvg/SVG/bodyType/Cabrio.tsx +23 -23
  236. package/iconsvg/SVG/bodyType/Coupe.tsx +22 -22
  237. package/iconsvg/SVG/bodyType/Minibus.tsx +22 -22
  238. package/iconsvg/SVG/bodyType/Other.tsx +25 -25
  239. package/iconsvg/SVG/bodyType/Sedan.tsx +22 -22
  240. package/iconsvg/SVG/bodyType/SelectorCategoryCombi.tsx +68 -68
  241. package/iconsvg/SVG/bodyType/SelectorCategoryCompact.tsx +20 -20
  242. package/iconsvg/SVG/bodyType/SelectorCategoryConvertible.tsx +68 -68
  243. package/iconsvg/SVG/bodyType/SelectorCategoryCoupe.tsx +60 -60
  244. package/iconsvg/SVG/bodyType/SelectorCategoryMinibus.tsx +64 -64
  245. package/iconsvg/SVG/bodyType/SelectorCategoryOther.tsx +60 -60
  246. package/iconsvg/SVG/bodyType/SelectorCategorySedan.tsx +69 -69
  247. package/iconsvg/SVG/bodyType/SelectorCategorySuv.tsx +77 -77
  248. package/iconsvg/SVG/bodyType/SelectorCategoryTransporter.tsx +68 -68
  249. package/iconsvg/SVG/bodyType/SelectorCategoryVan.tsx +72 -72
  250. package/iconsvg/SVG/bodyType/Small.tsx +23 -23
  251. package/iconsvg/SVG/bodyType/Suv.tsx +23 -23
  252. package/iconsvg/SVG/bodyType/Van.tsx +23 -23
  253. package/iconsvg/SVG/bodyType/Wagon.tsx +23 -23
  254. package/iconsvg/SVG/common/AddIcon.tsx +16 -16
  255. package/iconsvg/SVG/common/AddPlus.tsx +16 -16
  256. package/iconsvg/SVG/common/AddressDashboard.tsx +29 -29
  257. package/iconsvg/SVG/common/AddressIcon.tsx +20 -20
  258. package/iconsvg/SVG/common/ArrowDetailedAccordionBlue.tsx +26 -26
  259. package/iconsvg/SVG/common/ArrowDownBlue.tsx +21 -21
  260. package/iconsvg/SVG/common/ArrowSelect.tsx +23 -23
  261. package/iconsvg/SVG/common/ArrowStepDown.tsx +18 -18
  262. package/iconsvg/SVG/common/Autocheck.tsx +19 -19
  263. package/iconsvg/SVG/common/AutodeLogo.tsx +36 -36
  264. package/iconsvg/SVG/common/Avatar.tsx +17 -17
  265. package/iconsvg/SVG/common/BellGray.tsx +19 -19
  266. package/iconsvg/SVG/common/BigInfoTransparent.tsx +13 -13
  267. package/iconsvg/SVG/common/Browse.tsx +20 -20
  268. package/iconsvg/SVG/common/Calendar.tsx +24 -24
  269. package/iconsvg/SVG/common/CallbackDashboard.tsx +30 -30
  270. package/iconsvg/SVG/common/Camera.tsx +17 -17
  271. package/iconsvg/SVG/common/Car.tsx +16 -16
  272. package/iconsvg/SVG/common/CarBody.tsx +19 -19
  273. package/iconsvg/SVG/common/CarFront.tsx +43 -43
  274. package/iconsvg/SVG/common/CarInspectionCheck.tsx +21 -21
  275. package/iconsvg/SVG/common/CarInspectionScheme0.tsx +32 -32
  276. package/iconsvg/SVG/common/CarInspectionScheme1.tsx +53 -53
  277. package/iconsvg/SVG/common/CarInspectionScheme2.tsx +52 -52
  278. package/iconsvg/SVG/common/CarInspectionScheme3.tsx +32 -32
  279. package/iconsvg/SVG/common/CarInspectionScheme4.tsx +32 -32
  280. package/iconsvg/SVG/common/CarInspectionScheme5.tsx +32 -32
  281. package/iconsvg/SVG/common/CarInspectionScheme6.tsx +32 -32
  282. package/iconsvg/SVG/common/CarInspectionSchemeGeneral copy.tsx +24 -24
  283. package/iconsvg/SVG/common/CarInspectionSchemeGeneral.tsx +24 -24
  284. package/iconsvg/SVG/common/CheckBlue.tsx +18 -18
  285. package/iconsvg/SVG/common/CheckGreen.tsx +22 -22
  286. package/iconsvg/SVG/common/CheckMark.tsx +16 -16
  287. package/iconsvg/SVG/common/CheckWhite.tsx +19 -19
  288. package/iconsvg/SVG/common/Chevron.tsx +17 -17
  289. package/iconsvg/SVG/common/CircledCheckmark.tsx +25 -25
  290. package/iconsvg/SVG/common/Clock.tsx +18 -18
  291. package/iconsvg/SVG/common/Close.tsx +19 -19
  292. package/iconsvg/SVG/common/CloseGrey.tsx +22 -22
  293. package/iconsvg/SVG/common/ContactEmail.tsx +21 -21
  294. package/iconsvg/SVG/common/ContactPhone.tsx +28 -28
  295. package/iconsvg/SVG/common/CopyIcon copy.tsx +22 -22
  296. package/iconsvg/SVG/common/CopyIcon.tsx +22 -22
  297. package/iconsvg/SVG/common/CopyIconForDealer.tsx +21 -21
  298. package/iconsvg/SVG/common/DashboardIcon.tsx +20 -20
  299. package/iconsvg/SVG/common/DashboardQuestionMark.tsx +20 -20
  300. package/iconsvg/SVG/common/DealersIcon.tsx +20 -20
  301. package/iconsvg/SVG/common/DeleteCircle.tsx +31 -31
  302. package/iconsvg/SVG/common/DeleteV1Icon.tsx +18 -18
  303. package/iconsvg/SVG/common/DeliveryDashboard.tsx +25 -25
  304. package/iconsvg/SVG/common/DeliveryMail.tsx +24 -24
  305. package/iconsvg/SVG/common/Discount100De.tsx +18 -18
  306. package/iconsvg/SVG/common/Discount100En.tsx +19 -19
  307. package/iconsvg/SVG/common/Discount66De.tsx +28 -28
  308. package/iconsvg/SVG/common/Discount66En.tsx +20 -20
  309. package/iconsvg/SVG/common/DoneIcon.tsx +18 -18
  310. package/iconsvg/SVG/common/EditCircle.tsx +32 -32
  311. package/iconsvg/SVG/common/EditPriceIcon.tsx +20 -20
  312. package/iconsvg/SVG/common/EuroCurrency.tsx +18 -18
  313. package/iconsvg/SVG/common/Export.tsx +20 -20
  314. package/iconsvg/SVG/common/Eye.tsx +17 -17
  315. package/iconsvg/SVG/common/EyeCatch.tsx +19 -19
  316. package/iconsvg/SVG/common/FavoritesIcon.tsx +20 -20
  317. package/iconsvg/SVG/common/FilterRange.tsx +16 -16
  318. package/iconsvg/SVG/common/FilterToolBlack.tsx +23 -23
  319. package/iconsvg/SVG/common/FlagDe.tsx +21 -21
  320. package/iconsvg/SVG/common/FlagEn.tsx +43 -43
  321. package/iconsvg/SVG/common/GrayEnvelopeIcon.tsx +19 -19
  322. package/iconsvg/SVG/common/HamburgerMenuIcon.tsx +18 -18
  323. package/iconsvg/SVG/common/HandingOverDashboard.tsx +32 -32
  324. package/iconsvg/SVG/common/ImageSettingsIcon.tsx +20 -20
  325. package/iconsvg/SVG/common/Info.tsx +16 -16
  326. package/iconsvg/SVG/common/InfoIcon.tsx +17 -17
  327. package/iconsvg/SVG/common/InfoTransparent.tsx +18 -18
  328. package/iconsvg/SVG/common/LogoutIcon.tsx +20 -20
  329. package/iconsvg/SVG/common/MagnifyingGlass.tsx +31 -31
  330. package/iconsvg/SVG/common/MenuArrow.tsx +16 -16
  331. package/iconsvg/SVG/common/MenuGrey.tsx +22 -22
  332. package/iconsvg/SVG/common/MobileDeLogo.tsx +108 -108
  333. package/iconsvg/SVG/common/MyOrderIcon.tsx +20 -20
  334. package/iconsvg/SVG/common/MyVehiclesIcon.tsx +20 -20
  335. package/iconsvg/SVG/common/NewFlagDe.tsx +25 -25
  336. package/iconsvg/SVG/common/NewFlagEn.tsx +34 -34
  337. package/iconsvg/SVG/common/OrderReceivedDashboard.tsx +27 -27
  338. package/iconsvg/SVG/common/Package.tsx +30 -30
  339. package/iconsvg/SVG/common/Phone.tsx +18 -18
  340. package/iconsvg/SVG/common/PhoneGrey.tsx +22 -22
  341. package/iconsvg/SVG/common/PickupDashboard.tsx +30 -30
  342. package/iconsvg/SVG/common/Picture.tsx +24 -24
  343. package/iconsvg/SVG/common/Pictures.tsx +32 -32
  344. package/iconsvg/SVG/common/Plus.tsx +16 -16
  345. package/iconsvg/SVG/common/PlusNew.tsx +16 -16
  346. package/iconsvg/SVG/common/PreparationDashboard.tsx +29 -29
  347. package/iconsvg/SVG/common/ProfileDashboard.tsx +24 -24
  348. package/iconsvg/SVG/common/ProfileIcon.tsx +17 -17
  349. package/iconsvg/SVG/common/Question.tsx +19 -19
  350. package/iconsvg/SVG/common/QuestionBold.tsx +25 -25
  351. package/iconsvg/SVG/common/RegistrationDashboard.tsx +31 -31
  352. package/iconsvg/SVG/common/SavedSearchsIcon.tsx +20 -20
  353. package/iconsvg/SVG/common/Search.tsx +19 -19
  354. package/iconsvg/SVG/common/SearchGrey.tsx +22 -22
  355. package/iconsvg/SVG/common/SettingPenIcon.tsx +20 -20
  356. package/iconsvg/SVG/common/Share.tsx +16 -16
  357. package/iconsvg/SVG/common/ShoppingCart.tsx +18 -18
  358. package/iconsvg/SVG/common/SliderArrow.tsx +21 -21
  359. package/iconsvg/SVG/common/SliderEye.tsx +17 -17
  360. package/iconsvg/SVG/common/SortUpDownArrows.tsx +18 -18
  361. package/iconsvg/SVG/common/Speedometer.tsx +23 -23
  362. package/iconsvg/SVG/common/Star.tsx +20 -20
  363. package/iconsvg/SVG/common/StarNew.tsx +16 -16
  364. package/iconsvg/SVG/common/StarOutline.tsx +20 -20
  365. package/iconsvg/SVG/common/StarRoundedCorners.tsx +18 -18
  366. package/iconsvg/SVG/common/Stats.tsx +17 -17
  367. package/iconsvg/SVG/common/Step1.tsx +21 -21
  368. package/iconsvg/SVG/common/Step2.tsx +20 -20
  369. package/iconsvg/SVG/common/Step3.tsx +21 -21
  370. package/iconsvg/SVG/common/SupportCallbackIcon.tsx +20 -20
  371. package/iconsvg/SVG/common/Telephone.tsx +22 -22
  372. package/iconsvg/SVG/common/Time.tsx +17 -17
  373. package/iconsvg/SVG/common/Timetable.tsx +18 -18
  374. package/iconsvg/SVG/common/Trash.tsx +22 -22
  375. package/iconsvg/SVG/common/TrashRed.tsx +23 -23
  376. package/iconsvg/SVG/common/Upload.tsx +17 -17
  377. package/iconsvg/SVG/common/UserGrey.tsx +22 -22
  378. package/iconsvg/SVG/common/UserProfileIcon.tsx +20 -20
  379. package/iconsvg/SVG/common/ValidateFailure.tsx +21 -21
  380. package/iconsvg/SVG/common/ValidateSuccess.tsx +21 -21
  381. package/iconsvg/SVG/common/WarningTriangle.tsx +20 -20
  382. package/iconsvg/SVG/common/WhiteArrowUp.tsx +21 -21
  383. package/iconsvg/SVG/common/WhiteKey.tsx +21 -21
  384. package/iconsvg/SVG/common/WhitePeople.tsx +23 -23
  385. package/iconsvg/SVG/common/WhiteTick.tsx +19 -19
  386. package/iconsvg/SVG/flags/AT.tsx +19 -19
  387. package/iconsvg/SVG/flags/BE.tsx +20 -20
  388. package/iconsvg/SVG/flags/BG.tsx +20 -20
  389. package/iconsvg/SVG/flags/CH.tsx +22 -22
  390. package/iconsvg/SVG/flags/CZ.tsx +18 -18
  391. package/iconsvg/SVG/flags/DE.tsx +18 -18
  392. package/iconsvg/SVG/flags/DK.tsx +18 -18
  393. package/iconsvg/SVG/flags/ES.tsx +2585 -2585
  394. package/iconsvg/SVG/flags/FI.tsx +18 -18
  395. package/iconsvg/SVG/flags/FR.tsx +20 -20
  396. package/iconsvg/SVG/flags/GB.tsx +26 -26
  397. package/iconsvg/SVG/flags/HR.tsx +135 -135
  398. package/iconsvg/SVG/flags/HU.tsx +20 -20
  399. package/iconsvg/SVG/flags/IT.tsx +20 -20
  400. package/iconsvg/SVG/flags/LI.tsx +106 -106
  401. package/iconsvg/SVG/flags/LU.tsx +18 -18
  402. package/iconsvg/SVG/flags/NL.tsx +18 -18
  403. package/iconsvg/SVG/flags/NO.tsx +20 -20
  404. package/iconsvg/SVG/flags/PL.tsx +19 -19
  405. package/iconsvg/SVG/flags/RO.tsx +20 -20
  406. package/iconsvg/SVG/flags/RU.tsx +20 -20
  407. package/iconsvg/SVG/flags/SE.tsx +20 -20
  408. package/iconsvg/SVG/flags/SI.tsx +54 -54
  409. package/iconsvg/SVG/flags/SK.tsx +34 -34
  410. package/iconsvg/SVG/flags/UA.tsx +19 -19
  411. package/iconsvg/SVG/infoBlocks/14DaysReturnPolicy.tsx +18 -18
  412. package/iconsvg/SVG/infoBlocks/AlertInfo.tsx +19 -19
  413. package/iconsvg/SVG/infoBlocks/Autocheck.tsx +19 -19
  414. package/iconsvg/SVG/infoBlocks/CheckTheStory.tsx +22 -22
  415. package/iconsvg/SVG/infoBlocks/CustomerServiceWhite.tsx +16 -16
  416. package/iconsvg/SVG/infoBlocks/Guarantee.tsx +16 -16
  417. package/iconsvg/SVG/infoBlocks/OrderWhite.tsx +13 -13
  418. package/iconsvg/SVG/infoBlocks/PriceGuarantee.tsx +19 -19
  419. package/iconsvg/SVG/infoBlocks/PriceGuaranteeWhite.tsx +17 -17
  420. package/iconsvg/SVG/infoBlocks/TransportAndDelivery.tsx +21 -21
  421. package/iconsvg/SVG/infoBlocks/Warranty.tsx +23 -23
  422. package/iconsvg/SVG/popower/Mail.tsx +18 -18
  423. package/iconsvg/SVG/popower/Phone.tsx +19 -19
  424. package/iconsvg/SVG/popower/Schedule.tsx +18 -18
  425. package/iconsvg/SVG/searchWidgets/drive/AAllWheelDrive.tsx +26 -26
  426. package/iconsvg/SVG/searchWidgets/drive/AllWheelDrive.tsx +26 -26
  427. package/iconsvg/SVG/searchWidgets/drive/FrontWheelDrive.tsx +25 -25
  428. package/iconsvg/SVG/searchWidgets/drive/OtherWheelDrive.tsx +26 -26
  429. package/iconsvg/SVG/searchWidgets/drive/RearWheelDrive.tsx +25 -25
  430. package/iconsvg/SVG/searchWidgets/fuel/FuelDiesel.tsx +18 -18
  431. package/iconsvg/SVG/searchWidgets/fuel/FuelElectrical.tsx +19 -19
  432. package/iconsvg/SVG/searchWidgets/fuel/FuelElectricalDiesel.tsx +34 -34
  433. package/iconsvg/SVG/searchWidgets/fuel/FuelElectricalPetrol.tsx +20 -20
  434. package/iconsvg/SVG/searchWidgets/fuel/FuelEthanol.tsx +53 -53
  435. package/iconsvg/SVG/searchWidgets/fuel/FuelHydrogen.tsx +24 -24
  436. package/iconsvg/SVG/searchWidgets/fuel/FuelLpg.tsx +24 -24
  437. package/iconsvg/SVG/searchWidgets/fuel/FuelNaturalGas.tsx +23 -23
  438. package/iconsvg/SVG/searchWidgets/fuel/FuelOther.tsx +28 -28
  439. package/iconsvg/SVG/searchWidgets/fuel/FuelPetrol.tsx +18 -18
  440. package/iconsvg/SVG/settings/Account.tsx +17 -17
  441. package/iconsvg/SVG/settings/DataUsage.tsx +17 -17
  442. package/iconsvg/SVG/settings/MarketResearch.tsx +17 -17
  443. package/iconsvg/SVG/settings/Newsletter.tsx +17 -17
  444. package/iconsvg/SVG/settings/RemoveEye.tsx +17 -17
  445. package/iconsvg/SVG/settings/RemoveEyeOff.tsx +17 -17
  446. package/iconsvg/SVG/settings/Security.tsx +17 -17
  447. package/iconsvg/SVG/settings/Warning.tsx +17 -17
  448. package/iconsvg/SVG/slider/360.tsx +23 -23
  449. package/iconsvg/SVG/slider/360New.tsx +20 -20
  450. package/iconsvg/SVG/slider/Checked.tsx +19 -19
  451. package/iconsvg/SVG/slider/DiscountRibbon.tsx +51 -51
  452. package/iconsvg/SVG/slider/DiscountRibbonMobile.tsx +47 -47
  453. package/iconsvg/SVG/slider/DiscountRibbonNew.tsx +29 -29
  454. package/iconsvg/SVG/slider/Easy.tsx +19 -19
  455. package/iconsvg/SVG/slider/Fullscreen.tsx +16 -16
  456. package/iconsvg/SVG/slider/FullscreenWindow.tsx +23 -23
  457. package/iconsvg/SVG/slider/Safe.tsx +19 -19
  458. package/iconsvg/SVG/slider/ToBuy.tsx +19 -19
  459. package/iconsvg/SVG/slider/YoutubeButton.tsx +26 -26
  460. package/iconsvg/SVG/slider/ZoomIn.tsx +21 -21
  461. package/iconsvg/SVG/slider/ZoomOut.tsx +21 -21
  462. package/iconsvg/SVG/social/AndroidLogo.tsx +18 -18
  463. package/iconsvg/SVG/social/Apple.tsx +19 -19
  464. package/iconsvg/SVG/social/FacebookF.tsx +19 -19
  465. package/iconsvg/SVG/social/GooglePlusG.tsx +19 -19
  466. package/iconsvg/SVG/social/Instagram.tsx +17 -17
  467. package/iconsvg/SVG/social/Pinterest.tsx +19 -19
  468. package/iconsvg/SVG/social/SharingInterface.tsx +21 -21
  469. package/iconsvg/SVG/social/Twitter.tsx +19 -19
  470. package/iconsvg/SVG/social/Youtube.tsx +19 -19
  471. package/iconsvg/SVG/vehicle/AboIcon.tsx +11 -11
  472. package/iconsvg/SVG/vehicle/Abs.tsx +24 -24
  473. package/iconsvg/SVG/vehicle/AirCond.tsx +34 -34
  474. package/iconsvg/SVG/vehicle/Airbag.tsx +21 -21
  475. package/iconsvg/SVG/vehicle/AuxiliaryHeating.tsx +23 -23
  476. package/iconsvg/SVG/vehicle/Bluetooth.tsx +22 -22
  477. package/iconsvg/SVG/vehicle/BuyIcon.tsx +15 -15
  478. package/iconsvg/SVG/vehicle/CarAvailability.tsx +22 -22
  479. package/iconsvg/SVG/vehicle/CarInspectionCheck.tsx +21 -21
  480. package/iconsvg/SVG/vehicle/CarInspectionCross.tsx +21 -21
  481. package/iconsvg/SVG/vehicle/CheckoutChecked.tsx +15 -15
  482. package/iconsvg/SVG/vehicle/Co2.tsx +24 -24
  483. package/iconsvg/SVG/vehicle/CruiseControl.tsx +25 -25
  484. package/iconsvg/SVG/vehicle/Date.tsx +21 -21
  485. package/iconsvg/SVG/vehicle/Delivery.tsx +12 -12
  486. package/iconsvg/SVG/vehicle/Diesel.tsx +28 -28
  487. package/iconsvg/SVG/vehicle/Display.tsx +25 -25
  488. package/iconsvg/SVG/vehicle/Done.tsx +11 -11
  489. package/iconsvg/SVG/vehicle/Door.tsx +19 -19
  490. package/iconsvg/SVG/vehicle/DoubleDone.tsx +18 -18
  491. package/iconsvg/SVG/vehicle/EditIcon.tsx +11 -11
  492. package/iconsvg/SVG/vehicle/EmergencyBrakeAssistant.tsx +27 -27
  493. package/iconsvg/SVG/vehicle/Eps.tsx +24 -24
  494. package/iconsvg/SVG/vehicle/Esp.tsx +24 -24
  495. package/iconsvg/SVG/vehicle/FinancingIcon.tsx +20 -20
  496. package/iconsvg/SVG/vehicle/FuelConsumption.tsx +20 -20
  497. package/iconsvg/SVG/vehicle/Fueling.tsx +22 -22
  498. package/iconsvg/SVG/vehicle/FullDrive.tsx +24 -24
  499. package/iconsvg/SVG/vehicle/GasElectric.tsx +28 -28
  500. package/iconsvg/SVG/vehicle/HandsFreePhoneSystem.tsx +24 -24
  501. package/iconsvg/SVG/vehicle/Kw.tsx +23 -23
  502. package/iconsvg/SVG/vehicle/LastCrawledAt.tsx +22 -22
  503. package/iconsvg/SVG/vehicle/LeasingIcon.tsx +14 -14
  504. package/iconsvg/SVG/vehicle/Led.tsx +24 -24
  505. package/iconsvg/SVG/vehicle/LightSensor.tsx +22 -22
  506. package/iconsvg/SVG/vehicle/LinkAlternative.tsx +15 -15
  507. package/iconsvg/SVG/vehicle/Location.tsx +17 -17
  508. package/iconsvg/SVG/vehicle/MinusIcon.tsx +11 -11
  509. package/iconsvg/SVG/vehicle/Mirror.tsx +19 -19
  510. package/iconsvg/SVG/vehicle/Navigation.tsx +27 -27
  511. package/iconsvg/SVG/vehicle/NewCar.tsx +21 -21
  512. package/iconsvg/SVG/vehicle/NoImage.tsx +17 -17
  513. package/iconsvg/SVG/vehicle/Owner.tsx +18 -18
  514. package/iconsvg/SVG/vehicle/PanoramicRoof.tsx +23 -23
  515. package/iconsvg/SVG/vehicle/ParkingAssistants.tsx +24 -24
  516. package/iconsvg/SVG/vehicle/PickYourself.tsx +18 -18
  517. package/iconsvg/SVG/vehicle/PlusIcon.tsx +11 -11
  518. package/iconsvg/SVG/vehicle/Power.tsx +21 -21
  519. package/iconsvg/SVG/vehicle/Ps.tsx +19 -19
  520. package/iconsvg/SVG/vehicle/Question.tsx +24 -24
  521. package/iconsvg/SVG/vehicle/Seats.tsx +21 -21
  522. package/iconsvg/SVG/vehicle/SeatsHeating.tsx +26 -26
  523. package/iconsvg/SVG/vehicle/SelectorGearboxAutomatic.tsx +24 -24
  524. package/iconsvg/SVG/vehicle/SelectorGearboxManualShift.tsx +19 -19
  525. package/iconsvg/SVG/vehicle/SelectorGearboxOther.tsx +24 -24
  526. package/iconsvg/SVG/vehicle/SelectorGearboxSemiAutomatic.tsx +30 -30
  527. package/iconsvg/SVG/vehicle/SelectorInteriorTypeAlcantara.tsx +225 -225
  528. package/iconsvg/SVG/vehicle/SelectorInteriorTypeFabric.tsx +29 -29
  529. package/iconsvg/SVG/vehicle/SelectorInteriorTypeFullLeather.tsx +29 -29
  530. package/iconsvg/SVG/vehicle/SelectorInteriorTypeOther.tsx +26 -26
  531. package/iconsvg/SVG/vehicle/SelectorInteriorTypePartLeather.tsx +142 -142
  532. package/iconsvg/SVG/vehicle/SelectorInteriorTypeSyntheticLeather.tsx +27 -27
  533. package/iconsvg/SVG/vehicle/SelectorInteriorTypeVelours.tsx +39 -39
  534. package/iconsvg/SVG/vehicle/Shield.tsx +39 -39
  535. package/iconsvg/SVG/vehicle/Speedometer.tsx +17 -17
  536. package/iconsvg/SVG/vehicle/StartStopSystem.tsx +30 -30
  537. package/iconsvg/SVG/vehicle/Stop.tsx +25 -25
  538. package/iconsvg/SVG/vehicle/TickMark.tsx +21 -21
  539. package/iconsvg/SVG/vehicle/TrafficSignRecognition.tsx +29 -29
  540. package/iconsvg/SVG/vehicle/TrailerCoupling.tsx +24 -24
  541. package/iconsvg/SVG/vehicle/Transmission.tsx +27 -27
  542. package/iconsvg/SVG/vehicle/Wheel.tsx +43 -43
  543. package/iconsvg/SVG/vehicle/Wipers.tsx +22 -22
  544. package/iconsvg/SVG/vehicle/Wrench.tsx +17 -17
  545. package/iconsvg/index.ts +7 -7
  546. package/index.ts +18 -18
  547. package/locales/de/autobahn.json +676 -671
  548. package/locales/en/autobahn.json +676 -671
  549. package/locales/legacy/SearchDetailedPage.ts +205 -205
  550. package/locales/legacy/cbd.ts +719 -719
  551. package/locales/legacy/common.ts +109 -109
  552. package/locales/legacy/data.ts +1118 -1118
  553. package/locales/legacy/priceRating.ts +10 -10
  554. package/locales/legacy/sortingOptions.ts +21 -21
  555. package/media/images/raiting-stars-min.svg +7 -7
  556. package/media/images/refresh-button.svg +49 -49
  557. package/media/images/user-icon.svg +16 -16
  558. package/media/svg/infoBlocks/whyAutodeIconSet-F.svg +9 -9
  559. package/media/svg/infoBlocks/whyAutodeIconSet-G.svg +8 -8
  560. package/media/svg/infoBlocks/whyAutodeIconSet-Q.svg +6 -6
  561. package/media/svg/infoBlocks/whyAutodeIconSet-R.svg +9 -9
  562. package/media/svg/usp/icon1.svg +16 -16
  563. package/media/svg/usp/icon2.svg +13 -13
  564. package/media/svg/usp/icon3.svg +10 -10
  565. package/media/svg/usp/icon4.svg +14 -14
  566. package/package.json +30 -30
  567. package/schemes/AggregationScheme.ts +73 -73
  568. package/searchFilters/filterOptions.ts +119 -119
  569. package/searchFilters/filterProps.ts +35 -35
  570. package/searchFilters/index.ts +15 -15
  571. package/theme/autobahn.css +25 -25
  572. package/theme/colors_and_type.css +113 -113
  573. package/theme/md3.css +2045 -2034
  574. package/types/types.ts +373 -373
  575. package/types.ts +8 -8
  576. package/ui/Accordion.tsx +134 -134
  577. package/ui/Button.tsx +62 -62
  578. package/ui/CardCarousel.tsx +133 -133
  579. package/ui/Chip.tsx +29 -29
  580. package/ui/DatePicker.tsx +145 -145
  581. package/ui/Dropdown.tsx +205 -205
  582. package/ui/FileUpload.tsx +154 -154
  583. package/ui/FormCheckbox.tsx +79 -79
  584. package/ui/FormDropdown.tsx +327 -327
  585. package/ui/FormField.tsx +88 -88
  586. package/ui/FormRadio.tsx +93 -93
  587. package/ui/FormRadioGroup.tsx +106 -106
  588. package/ui/Icon.tsx +391 -391
  589. package/ui/IconButton.tsx +44 -44
  590. package/ui/Modal.tsx +187 -187
  591. package/ui/Pagination.tsx +140 -140
  592. package/ui/Price.tsx +25 -25
  593. package/ui/PriceEvalBar.tsx +48 -48
  594. package/ui/SaveChip.tsx +34 -34
  595. package/ui/Segmented.tsx +48 -48
  596. package/ui/Skeleton.tsx +75 -75
  597. package/ui/Spec.tsx +24 -24
  598. package/ui/Stars.tsx +29 -29
  599. package/ui/StatChip.tsx +21 -21
  600. package/ui/Stepper.tsx +106 -106
  601. package/ui/Switch.tsx +65 -65
  602. package/ui/Table.tsx +156 -156
  603. package/ui/Textarea.tsx +58 -58
  604. package/ui/index.ts +88 -88
  605. package/utils/CommonUtils.ts +648 -648
  606. package/utils/DateUtils.ts +101 -101
  607. package/utils/index.ts +74 -74
  608. package/utils/power.ts +11 -11
  609. package/utils/query.ts +21 -21
  610. package/vdp/FinanceCalculator.tsx +465 -465
  611. package/vdp/VdpModules.tsx +1490 -1490
  612. package/vdp/VdpViewer.tsx +209 -209
  613. package/vdp/index.ts +75 -75
  614. package/vdp/types.ts +197 -197
  615. package/vehiclesProps/cbdSelectors.ts +117 -117
  616. package/vehiclesProps/decoratedLightProps.tsx +572 -572
  617. package/vehiclesProps/decoratedProps.tsx +1746 -1746
  618. package/vehiclesProps/equipment.ts +129 -129
  619. package/vehiclesProps/vehicleDetails.ts +428 -428
  620. package/widgets/SearchBox.tsx +256 -256
  621. package/widgets/index.ts +5 -5
@@ -1,465 +1,465 @@
1
- // Autobahn (auto.de redesign) — VDP offer / finance card (Finanzierung / Leasing /
2
- // Barzahlung).
3
- //
4
- // Structure (desktop rethink, tabs-on-top): payment-type TABS at the top (MD3 underline tabs),
5
- // then the rate (with any discount), then the "Rate anpassen" rate-editor, then the primary
6
- // "Angebot sichern" request CTA, and finally the Finanzierungs-/Leasingdetails info + popup link
7
- // at the foot. Laufzeit is chosen via chips (discrete terms), not a slider.
8
- //
9
- // CONTROLLED / PRESENTATIONAL — computes NOTHING financial: `mode`, `monthly`, `down`, `term` and
10
- // the slider/chip bounds all arrive as props; segment/slider/chip changes are reported back via
11
- // `onModeChange` / `onDownChange` / `onTermChange`. The real numbers come from `financingStore`.
12
- // The only local state is the `adjust` expander (pure view state).
13
- //
14
- // Renders correctly only inside a `<div className="md3">` subtree.
15
-
16
- import React, { useState } from 'react';
17
- import { TranslationFunction } from '../types';
18
-
19
- import { Button, Icon } from '../ui';
20
- import { TIER_LABELS, TIER_KEYS, TIER_COLORS } from '../constants';
21
-
22
- /** Payment mode segment keys. Mirrors the design's ['fin','leasing','cash']. */
23
- export type FinanceMode = 'fin' | 'leasing' | 'cash';
24
-
25
- export interface SliderProps {
26
- min: number;
27
- max: number;
28
- step?: number;
29
- value: number;
30
- onChange: (value: number) => void;
31
- /** formats the min/max end labels (and is reused by callers for the value). */
32
- fmt?: (v: number) => React.ReactNode;
33
- }
34
-
35
- /**
36
- * Range slider with a filled track and min/max end labels. The track fill is a
37
- * linear-gradient driven by the value's position; the design's `.mslider` class
38
- * styles the thumb/rail.
39
- */
40
- export const Slider: React.FunctionComponent<SliderProps> = ({ min, max, step = 1, value, onChange, fmt = (v) => v }) => {
41
- const span = max - min;
42
- const pct = span > 0 ? ((value - min) / span) * 100 : 0;
43
- return (
44
- <div>
45
- <input
46
- type="range"
47
- className="mslider"
48
- min={min}
49
- max={max}
50
- step={step}
51
- value={value}
52
- onChange={(e) => onChange(Number(e.target.value))}
53
- style={{ background: `linear-gradient(90deg, var(--md-primary) ${pct}%, var(--md-sc-highest) ${pct}%)` }}
54
- />
55
- <div style={{ display: 'flex', justifyContent: 'space-between', marginTop: 4 }}>
56
- <span className="md-label-sm">{fmt(min)}</span>
57
- <span className="md-label-sm">{fmt(max)}</span>
58
- </div>
59
- </div>
60
- );
61
- };
62
-
63
- export interface TermChipsProps {
64
- /** the selectable term values (months), e.g. [12,24,36,48,60,72]. */
65
- options: number[];
66
- value: number;
67
- onChange: (term: number) => void;
68
- /** i18n function (drilled from the page). */
69
- t: TranslationFunction;
70
- }
71
-
72
- /** Laufzeit selector — discrete term values as tappable chips (replaces the fiddly slider). */
73
- export const TermChips: React.FunctionComponent<TermChipsProps> = ({ options, value, onChange, t }) => (
74
- <div className="term-chips" role="group" aria-label={t('autobahn:finance.termSelection')}>
75
- {options.map((m) => (
76
- <button
77
- key={m}
78
- type="button"
79
- aria-pressed={m === value}
80
- className={'term-chip' + (m === value ? ' on' : '')}
81
- onClick={() => onChange(m)}
82
- >
83
- {m}
84
- <span className="tc-unit">{t('autobahn:finance.monthUnit')}</span>
85
- </button>
86
- ))}
87
- </div>
88
- );
89
-
90
- export interface CalcRowProps {
91
- label: React.ReactNode;
92
- /** when true, drops the bottom hairline (last row). */
93
- last?: boolean;
94
- children?: React.ReactNode;
95
- }
96
-
97
- /** One label/value row inside the "Rate anpassen" / "Details" expander. */
98
- export const CalcRow: React.FunctionComponent<CalcRowProps> = ({ label, last, children }) => (
99
- <div
100
- style={{
101
- display: 'flex',
102
- justifyContent: 'space-between',
103
- alignItems: 'baseline',
104
- gap: 12,
105
- padding: '8px 0',
106
- borderBottom: last ? 0 : '1px solid var(--md-outline-variant)',
107
- }}
108
- >
109
- <span className="md-label-sm">{label}</span>
110
- <span className="num" style={{ fontSize: 13.5, fontWeight: 600 }}>
111
- {children}
112
- </span>
113
- </div>
114
- );
115
-
116
- export interface FinanceCalculatorProps {
117
- /** active payment mode (controlled). */
118
- mode: FinanceMode;
119
- /** purchase price in EUR (the cash mode hero). */
120
- price: number;
121
- /** previous/list price — when > price, shown struck through as the UVP in cash mode (real discount). */
122
- listPrice?: number;
123
- /** auto.de-ID reference code — shown with the financing/leasing condition line. */
124
- autoDeId?: string;
125
- /** price-rating label, e.g. 'Guter Preis' — drives the Preisbewertung indicator. */
126
- ratingLabel?: string;
127
- /** computed monthly rate in EUR for the current mode — supplied, NOT computed here. */
128
- monthly: number;
129
- /** effective annual rate (%) for the current mode — supplied, NOT computed here. */
130
- apr: number;
131
- /** current down payment in EUR (controlled). */
132
- down: number;
133
- /** current term in months (controlled). */
134
- term: number;
135
- /** down-payment slider bounds. */
136
- downMin: number;
137
- downMax: number;
138
- /** down-payment slider step (EUR). */
139
- downStep?: number;
140
- /** term slider bounds (months) — used to derive chip options when termOptions is absent. */
141
- termMin: number;
142
- termMax: number;
143
- /** term slider step (months). */
144
- termStep?: number;
145
- /** the discrete selectable terms (months) for the Laufzeit chips. */
146
- termOptions?: number[];
147
- /** annual mileage in km (controlled) — leasing/financing Laufleistung/Jahr. Omit to hide the slider. */
148
- annualMileage?: number;
149
- /** annual-mileage slider bounds + step (km). */
150
- annualMileageMin?: number;
151
- annualMileageMax?: number;
152
- annualMileageStep?: number;
153
- /** annual-mileage slider changed. */
154
- onAnnualMileageChange?: (km: number) => void;
155
- /** phone number shown on the secondary CTA (touch only). */
156
- phone?: string;
157
- /** primary CTA click (Angebot sichern). */
158
- onSecure?: () => void;
159
- /** secondary CTA click (phone). */
160
- onCall?: () => void;
161
- /** open the Finanzierungs-/Leasingdetails popup (full breakdown + legal). Omit to hide the link. */
162
- onShowDetails?: () => void;
163
- /** mode segment changed. */
164
- onModeChange: (mode: FinanceMode) => void;
165
- /** down-payment slider changed. */
166
- onDownChange: (down: number) => void;
167
- /** term changed. */
168
- onTermChange: (term: number) => void;
169
- /** i18n function (drilled from the page). */
170
- t: TranslationFunction;
171
- }
172
-
173
- const eur = (n: number): string => n.toLocaleString('de-DE');
174
-
175
- /** build a [min..max] step range (fallback term options when none are supplied). */
176
- const range = (min: number, max: number, step: number): number[] => {
177
- const out: number[] = [];
178
- for (let v = min; v <= max; v += step || 12) out.push(v);
179
- return out.length ? out : [min];
180
- };
181
-
182
- /** quiet primary-colored text link (Finanzierungsdetails / Details anzeigen). */
183
- const DetailsLink: React.FunctionComponent<{ label: string; onClick: () => void }> = ({ label, onClick }) => (
184
- <button
185
- type="button"
186
- onClick={onClick}
187
- style={{
188
- display: 'inline-flex',
189
- alignItems: 'center',
190
- gap: 5,
191
- background: 'none',
192
- border: 0,
193
- padding: 0,
194
- cursor: 'pointer',
195
- color: 'var(--md-primary)',
196
- font: 'inherit',
197
- fontSize: 13,
198
- fontWeight: 600,
199
- }}
200
- >
201
- <Icon name="info" size={15} color="var(--md-primary)" />
202
- {label}
203
- </button>
204
- );
205
-
206
- /** "Rate anpassen" / "Details anzeigen" expander toggle button. */
207
- const expanderBtnStyle: React.CSSProperties = {
208
- width: '100%',
209
- background: 'none',
210
- border: 0,
211
- cursor: 'pointer',
212
- display: 'flex',
213
- alignItems: 'center',
214
- justifyContent: 'space-between',
215
- padding: '10px 0 2px',
216
- color: 'var(--md-primary)',
217
- fontWeight: 600,
218
- fontSize: 14,
219
- };
220
-
221
- const FinanceCalculator: React.FunctionComponent<FinanceCalculatorProps> = ({
222
- mode,
223
- price,
224
- listPrice,
225
- autoDeId,
226
- ratingLabel,
227
- monthly,
228
- down,
229
- term,
230
- downMin,
231
- downMax,
232
- downStep = 500,
233
- termMin,
234
- termMax,
235
- termStep = 6,
236
- termOptions,
237
- annualMileage,
238
- annualMileageMin = 5000,
239
- annualMileageMax = 60000,
240
- annualMileageStep = 5000,
241
- onAnnualMileageChange,
242
- phone = '0800 40 30 182',
243
- onSecure,
244
- onCall,
245
- onShowDetails,
246
- onModeChange,
247
- onDownChange,
248
- onTermChange,
249
- t,
250
- }) => {
251
- // Pure view state only — whether the adjust/details expander is open.
252
- const [adjust, setAdjust] = useState(false);
253
- const isCash = mode === 'cash';
254
- const terms = termOptions && termOptions.length ? termOptions : range(termMin, termMax, termStep);
255
- const showStrike = listPrice != null && listPrice > price;
256
- // price-evaluation tier from the rating label (defaults to 'Guter Preis' tier when unmapped).
257
- const tierIdx = TIER_LABELS.indexOf(ratingLabel as (typeof TIER_LABELS)[number]);
258
- const evalTier = tierIdx >= 0 ? tierIdx : 1;
259
- const evalTierLabel = t('autobahn:tier.' + TIER_KEYS[evalTier]);
260
- // condition summary (current selection) — the auto.de-ID lives with the details link, not here.
261
- const condParts: string[] = [];
262
- if (!isCash) {
263
- condParts.push(
264
- mode === 'leasing' && annualMileage != null
265
- ? t('autobahn:finance.kmPerYear', { value: eur(annualMileage) })
266
- : t('autobahn:finance.downPaymentLabel', { value: eur(down) }),
267
- );
268
- condParts.push(t('autobahn:finance.monthsLabel', { months: term, count: term }));
269
- }
270
- const condLine = condParts.join(' · ');
271
-
272
- return (
273
- <div className="mcard mcard--elevated" style={{ padding: 20 }}>
274
- {/* header */}
275
- <div style={{ display: 'flex', alignItems: 'center', gap: 10, marginBottom: 14 }}>
276
- <span
277
- style={{
278
- width: 34,
279
- height: 34,
280
- borderRadius: 'var(--md-r-full)',
281
- background: 'var(--md-primary-container)',
282
- display: 'flex',
283
- alignItems: 'center',
284
- justifyContent: 'center',
285
- flex: 'none',
286
- }}
287
- >
288
- <Icon name="tag" size={18} color="var(--md-on-primary-container)" />
289
- </span>
290
- <div style={{ fontFamily: 'var(--md-font-display)', fontSize: 18, fontWeight: 700 }}>{t('autobahn:finance.headerTitle')}</div>
291
- </div>
292
-
293
- {/* payment-type TABS on top */}
294
- <div className="fin-tabs" role="tablist">
295
- {(
296
- [
297
- ['fin', 'autobahn:finance.mode.financing'],
298
- ['leasing', 'autobahn:finance.mode.leasing'],
299
- ['cash', 'autobahn:finance.mode.cash'],
300
- ] as Array<[FinanceMode, string]>
301
- ).map(([k, labelKey]) => (
302
- <button
303
- key={k}
304
- type="button"
305
- role="tab"
306
- aria-selected={mode === k}
307
- className={'fin-tab' + (mode === k ? ' on' : '')}
308
- onClick={() => onModeChange(k)}
309
- >
310
- {t(labelKey)}
311
- </button>
312
- ))}
313
- </div>
314
-
315
- {/* 2-col grid: rate|pill (row 1) + condLine|bar (row 2) — fixed right column prevents wrapping */}
316
- <div className="fin-price-grid">
317
- {/* col 1 row 1: hero rate */}
318
- <div className="fin-rate-main">
319
- <div style={{ display: 'flex', alignItems: 'baseline', gap: 5 }}>
320
- <span
321
- className="num"
322
- style={{ fontSize: 48, fontWeight: 800, color: 'var(--md-primary)', letterSpacing: '-2px' }}
323
- >
324
- {isCash ? eur(price) : eur(Math.round(monthly))}
325
- </span>
326
- <span className="md-body-sm" style={{ fontWeight: 600 }}>
327
- {isCash ? '€' : `€ ${t('autobahn:finance.perMonth')}`}
328
- </span>
329
- </div>
330
- {isCash && <div className="md-label-sm">{t('autobahn:finance.fixedPrice')}</div>}
331
- {isCash && showStrike && (
332
- <div className="fin-kauf">
333
- {t('autobahn:finance.uvp')} <s>{eur(listPrice as number)} €</s>
334
- </div>
335
- )}
336
- </div>
337
- {/* col 2 row 1: price-rating pill */}
338
- <div>
339
- {ratingLabel && (
340
- <span
341
- className="fin-eval-pill"
342
- style={{ color: TIER_COLORS[evalTier], background: `color-mix(in srgb, ${TIER_COLORS[evalTier]} 16%, transparent)` }}
343
- aria-label={t('autobahn:finance.priceRatingAria', { rating: evalTierLabel })}
344
- >
345
- <Icon
346
- name={evalTier <= 1 ? 'check' : evalTier === 2 ? 'minus' : 'trending-up'}
347
- size={14}
348
- stroke={2.6}
349
- color={TIER_COLORS[evalTier]}
350
- />
351
- {evalTierLabel}
352
- </span>
353
- )}
354
- </div>
355
- {/* col 1 row 2: condition line */}
356
- <div className="fin-cond">{condLine}</div>
357
- {/* col 2 row 2: gradient evaluation bar */}
358
- <div>
359
- {ratingLabel && (
360
- <div className="fin-eval-bar">
361
- <div className="fin-eval-thumb" style={{ left: `${(evalTier + 0.5) * 20}%`, borderColor: TIER_COLORS[evalTier] }} />
362
- </div>
363
- )}
364
- </div>
365
- </div>
366
-
367
- {/* RATE EDIT (Rate anpassen) — between the rate and the request CTA */}
368
- <div className="fin-adjust">
369
- <button onClick={() => setAdjust((a) => !a)} style={expanderBtnStyle}>
370
- <span style={{ display: 'inline-flex', alignItems: 'center', gap: 7 }}>
371
- <Icon name={isCash ? 'list' : 'sliders-horizontal'} size={16} color="var(--md-primary)" />
372
- {isCash ? t('autobahn:finance.detailsShow') : t('autobahn:finance.adjustRate')}
373
- </span>
374
- <Icon name={adjust ? 'chevron-up' : 'chevron-down'} size={18} color="var(--md-primary)" />
375
- </button>
376
- {adjust &&
377
- (isCash ? (
378
- <div style={{ marginTop: 4 }}>
379
- <CalcRow label={t('autobahn:finance.paymentLabel')}>{t('autobahn:finance.paymentValue')}</CalcRow>
380
- <CalcRow label={t('autobahn:finance.warrantyLabel')}>{t('autobahn:finance.warrantyValue')}</CalcRow>
381
- <CalcRow label={t('autobahn:finance.deliveryLabel')} last>
382
- {t('autobahn:finance.deliveryValue')}
383
- </CalcRow>
384
- </div>
385
- ) : (
386
- <div style={{ display: 'flex', flexDirection: 'column', gap: 16, marginTop: 8 }}>
387
- <div>
388
- <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 6 }}>
389
- <span className="md-title-sm">{t('autobahn:finance.downPaymentSliderLabel')}</span>
390
- <span className="num" style={{ fontWeight: 700 }}>
391
- {eur(down)} €
392
- </span>
393
- </div>
394
- <Slider
395
- min={downMin}
396
- max={downMax}
397
- step={downStep}
398
- value={down}
399
- onChange={onDownChange}
400
- fmt={(v) => `${eur(Number(v))} €`}
401
- />
402
- </div>
403
- {annualMileage != null && onAnnualMileageChange && (
404
- <div>
405
- <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 6 }}>
406
- <span className="md-title-sm">{t('autobahn:finance.annualMileageLabel')}</span>
407
- <span className="num" style={{ fontWeight: 700 }}>
408
- {eur(annualMileage)} km
409
- </span>
410
- </div>
411
- <Slider
412
- min={annualMileageMin}
413
- max={annualMileageMax}
414
- step={annualMileageStep}
415
- value={annualMileage}
416
- onChange={onAnnualMileageChange}
417
- fmt={(v) => `${eur(Number(v))} km`}
418
- />
419
- </div>
420
- )}
421
- <div>
422
- <div className="md-title-sm" style={{ marginBottom: 8 }}>
423
- {t('autobahn:finance.termSelection')}
424
- </div>
425
- <TermChips options={terms} value={term} onChange={onTermChange} t={t} />
426
- </div>
427
- <div>
428
- <CalcRow label={t('autobahn:finance.purchasePrice')}>{eur(price)} €</CalcRow>
429
- <CalcRow label={t('autobahn:finance.warrantyLabel')}>{t('autobahn:finance.warrantyValue')}</CalcRow>
430
- <CalcRow label={t('autobahn:finance.deliveryLabel')} last>
431
- {t('autobahn:finance.deliveryValue')}
432
- </CalcRow>
433
- </div>
434
- </div>
435
- ))}
436
- </div>
437
-
438
- {/* REQUEST CTA */}
439
- <Button variant="filled" block size="lg" icon="shield-check" style={{ marginTop: 14 }} onClick={onSecure}>
440
- {t('autobahn:finance.secureOffer')}
441
- </Button>
442
- {/* phone CTA — touch only (hidden on desktop via .fin-call) */}
443
- <div className="fin-call">
444
- <Button variant="outlined" block icon="phone" onClick={onCall}>
445
- {phone}
446
- </Button>
447
- </div>
448
-
449
- {/* auto.de-ID in front of the Finanzierungs-/Leasingdetails link — one row, under everything */}
450
- {(autoDeId || (!isCash && onShowDetails)) && (
451
- <div className="fin-info">
452
- {autoDeId && <span className="fin-id">auto.de-ID {autoDeId}</span>}
453
- {!isCash && onShowDetails && (
454
- <DetailsLink
455
- label={mode === 'leasing' ? t('autobahn:finance.leasingDetails') : t('autobahn:finance.financingDetails')}
456
- onClick={onShowDetails}
457
- />
458
- )}
459
- </div>
460
- )}
461
- </div>
462
- );
463
- };
464
-
465
- export default FinanceCalculator;
1
+ // Autobahn (auto.de redesign) — VDP offer / finance card (Finanzierung / Leasing /
2
+ // Barzahlung).
3
+ //
4
+ // Structure (desktop rethink, tabs-on-top): payment-type TABS at the top (MD3 underline tabs),
5
+ // then the rate (with any discount), then the "Rate anpassen" rate-editor, then the primary
6
+ // "Angebot sichern" request CTA, and finally the Finanzierungs-/Leasingdetails info + popup link
7
+ // at the foot. Laufzeit is chosen via chips (discrete terms), not a slider.
8
+ //
9
+ // CONTROLLED / PRESENTATIONAL — computes NOTHING financial: `mode`, `monthly`, `down`, `term` and
10
+ // the slider/chip bounds all arrive as props; segment/slider/chip changes are reported back via
11
+ // `onModeChange` / `onDownChange` / `onTermChange`. The real numbers come from `financingStore`.
12
+ // The only local state is the `adjust` expander (pure view state).
13
+ //
14
+ // Renders correctly only inside a `<div className="md3">` subtree.
15
+
16
+ import React, { useState } from 'react';
17
+ import { TranslationFunction } from '../types';
18
+
19
+ import { Button, Icon } from '../ui';
20
+ import { TIER_LABELS, TIER_KEYS, TIER_COLORS } from '../constants';
21
+
22
+ /** Payment mode segment keys. Mirrors the design's ['fin','leasing','cash']. */
23
+ export type FinanceMode = 'fin' | 'leasing' | 'cash';
24
+
25
+ export interface SliderProps {
26
+ min: number;
27
+ max: number;
28
+ step?: number;
29
+ value: number;
30
+ onChange: (value: number) => void;
31
+ /** formats the min/max end labels (and is reused by callers for the value). */
32
+ fmt?: (v: number) => React.ReactNode;
33
+ }
34
+
35
+ /**
36
+ * Range slider with a filled track and min/max end labels. The track fill is a
37
+ * linear-gradient driven by the value's position; the design's `.mslider` class
38
+ * styles the thumb/rail.
39
+ */
40
+ export const Slider: React.FunctionComponent<SliderProps> = ({ min, max, step = 1, value, onChange, fmt = (v) => v }) => {
41
+ const span = max - min;
42
+ const pct = span > 0 ? ((value - min) / span) * 100 : 0;
43
+ return (
44
+ <div>
45
+ <input
46
+ type="range"
47
+ className="mslider"
48
+ min={min}
49
+ max={max}
50
+ step={step}
51
+ value={value}
52
+ onChange={(e) => onChange(Number(e.target.value))}
53
+ style={{ background: `linear-gradient(90deg, var(--md-primary) ${pct}%, var(--md-sc-highest) ${pct}%)` }}
54
+ />
55
+ <div style={{ display: 'flex', justifyContent: 'space-between', marginTop: 4 }}>
56
+ <span className="md-label-sm">{fmt(min)}</span>
57
+ <span className="md-label-sm">{fmt(max)}</span>
58
+ </div>
59
+ </div>
60
+ );
61
+ };
62
+
63
+ export interface TermChipsProps {
64
+ /** the selectable term values (months), e.g. [12,24,36,48,60,72]. */
65
+ options: number[];
66
+ value: number;
67
+ onChange: (term: number) => void;
68
+ /** i18n function (drilled from the page). */
69
+ t: TranslationFunction;
70
+ }
71
+
72
+ /** Laufzeit selector — discrete term values as tappable chips (replaces the fiddly slider). */
73
+ export const TermChips: React.FunctionComponent<TermChipsProps> = ({ options, value, onChange, t }) => (
74
+ <div className="term-chips" role="group" aria-label={t('autobahn:finance.termSelection')}>
75
+ {options.map((m) => (
76
+ <button
77
+ key={m}
78
+ type="button"
79
+ aria-pressed={m === value}
80
+ className={'term-chip' + (m === value ? ' on' : '')}
81
+ onClick={() => onChange(m)}
82
+ >
83
+ {m}
84
+ <span className="tc-unit">{t('autobahn:finance.monthUnit')}</span>
85
+ </button>
86
+ ))}
87
+ </div>
88
+ );
89
+
90
+ export interface CalcRowProps {
91
+ label: React.ReactNode;
92
+ /** when true, drops the bottom hairline (last row). */
93
+ last?: boolean;
94
+ children?: React.ReactNode;
95
+ }
96
+
97
+ /** One label/value row inside the "Rate anpassen" / "Details" expander. */
98
+ export const CalcRow: React.FunctionComponent<CalcRowProps> = ({ label, last, children }) => (
99
+ <div
100
+ style={{
101
+ display: 'flex',
102
+ justifyContent: 'space-between',
103
+ alignItems: 'baseline',
104
+ gap: 12,
105
+ padding: '8px 0',
106
+ borderBottom: last ? 0 : '1px solid var(--md-outline-variant)',
107
+ }}
108
+ >
109
+ <span className="md-label-sm">{label}</span>
110
+ <span className="num" style={{ fontSize: 13.5, fontWeight: 600 }}>
111
+ {children}
112
+ </span>
113
+ </div>
114
+ );
115
+
116
+ export interface FinanceCalculatorProps {
117
+ /** active payment mode (controlled). */
118
+ mode: FinanceMode;
119
+ /** purchase price in EUR (the cash mode hero). */
120
+ price: number;
121
+ /** previous/list price — when > price, shown struck through as the UVP in cash mode (real discount). */
122
+ listPrice?: number;
123
+ /** auto.de-ID reference code — shown with the financing/leasing condition line. */
124
+ autoDeId?: string;
125
+ /** price-rating label, e.g. 'Guter Preis' — drives the Preisbewertung indicator. */
126
+ ratingLabel?: string;
127
+ /** computed monthly rate in EUR for the current mode — supplied, NOT computed here. */
128
+ monthly: number;
129
+ /** effective annual rate (%) for the current mode — supplied, NOT computed here. */
130
+ apr: number;
131
+ /** current down payment in EUR (controlled). */
132
+ down: number;
133
+ /** current term in months (controlled). */
134
+ term: number;
135
+ /** down-payment slider bounds. */
136
+ downMin: number;
137
+ downMax: number;
138
+ /** down-payment slider step (EUR). */
139
+ downStep?: number;
140
+ /** term slider bounds (months) — used to derive chip options when termOptions is absent. */
141
+ termMin: number;
142
+ termMax: number;
143
+ /** term slider step (months). */
144
+ termStep?: number;
145
+ /** the discrete selectable terms (months) for the Laufzeit chips. */
146
+ termOptions?: number[];
147
+ /** annual mileage in km (controlled) — leasing/financing Laufleistung/Jahr. Omit to hide the slider. */
148
+ annualMileage?: number;
149
+ /** annual-mileage slider bounds + step (km). */
150
+ annualMileageMin?: number;
151
+ annualMileageMax?: number;
152
+ annualMileageStep?: number;
153
+ /** annual-mileage slider changed. */
154
+ onAnnualMileageChange?: (km: number) => void;
155
+ /** phone number shown on the secondary CTA (touch only). */
156
+ phone?: string;
157
+ /** primary CTA click (Angebot sichern). */
158
+ onSecure?: () => void;
159
+ /** secondary CTA click (phone). */
160
+ onCall?: () => void;
161
+ /** open the Finanzierungs-/Leasingdetails popup (full breakdown + legal). Omit to hide the link. */
162
+ onShowDetails?: () => void;
163
+ /** mode segment changed. */
164
+ onModeChange: (mode: FinanceMode) => void;
165
+ /** down-payment slider changed. */
166
+ onDownChange: (down: number) => void;
167
+ /** term changed. */
168
+ onTermChange: (term: number) => void;
169
+ /** i18n function (drilled from the page). */
170
+ t: TranslationFunction;
171
+ }
172
+
173
+ const eur = (n: number): string => n.toLocaleString('de-DE');
174
+
175
+ /** build a [min..max] step range (fallback term options when none are supplied). */
176
+ const range = (min: number, max: number, step: number): number[] => {
177
+ const out: number[] = [];
178
+ for (let v = min; v <= max; v += step || 12) out.push(v);
179
+ return out.length ? out : [min];
180
+ };
181
+
182
+ /** quiet primary-colored text link (Finanzierungsdetails / Details anzeigen). */
183
+ const DetailsLink: React.FunctionComponent<{ label: string; onClick: () => void }> = ({ label, onClick }) => (
184
+ <button
185
+ type="button"
186
+ onClick={onClick}
187
+ style={{
188
+ display: 'inline-flex',
189
+ alignItems: 'center',
190
+ gap: 5,
191
+ background: 'none',
192
+ border: 0,
193
+ padding: 0,
194
+ cursor: 'pointer',
195
+ color: 'var(--md-primary)',
196
+ font: 'inherit',
197
+ fontSize: 13,
198
+ fontWeight: 600,
199
+ }}
200
+ >
201
+ <Icon name="info" size={15} color="var(--md-primary)" />
202
+ {label}
203
+ </button>
204
+ );
205
+
206
+ /** "Rate anpassen" / "Details anzeigen" expander toggle button. */
207
+ const expanderBtnStyle: React.CSSProperties = {
208
+ width: '100%',
209
+ background: 'none',
210
+ border: 0,
211
+ cursor: 'pointer',
212
+ display: 'flex',
213
+ alignItems: 'center',
214
+ justifyContent: 'space-between',
215
+ padding: '10px 0 2px',
216
+ color: 'var(--md-primary)',
217
+ fontWeight: 600,
218
+ fontSize: 14,
219
+ };
220
+
221
+ const FinanceCalculator: React.FunctionComponent<FinanceCalculatorProps> = ({
222
+ mode,
223
+ price,
224
+ listPrice,
225
+ autoDeId,
226
+ ratingLabel,
227
+ monthly,
228
+ down,
229
+ term,
230
+ downMin,
231
+ downMax,
232
+ downStep = 500,
233
+ termMin,
234
+ termMax,
235
+ termStep = 6,
236
+ termOptions,
237
+ annualMileage,
238
+ annualMileageMin = 5000,
239
+ annualMileageMax = 60000,
240
+ annualMileageStep = 5000,
241
+ onAnnualMileageChange,
242
+ phone = '0800 40 30 182',
243
+ onSecure,
244
+ onCall,
245
+ onShowDetails,
246
+ onModeChange,
247
+ onDownChange,
248
+ onTermChange,
249
+ t,
250
+ }) => {
251
+ // Pure view state only — whether the adjust/details expander is open.
252
+ const [adjust, setAdjust] = useState(false);
253
+ const isCash = mode === 'cash';
254
+ const terms = termOptions && termOptions.length ? termOptions : range(termMin, termMax, termStep);
255
+ const showStrike = listPrice != null && listPrice > price;
256
+ // price-evaluation tier from the rating label (defaults to 'Guter Preis' tier when unmapped).
257
+ const tierIdx = TIER_LABELS.indexOf(ratingLabel as (typeof TIER_LABELS)[number]);
258
+ const evalTier = tierIdx >= 0 ? tierIdx : 1;
259
+ const evalTierLabel = t('autobahn:tier.' + TIER_KEYS[evalTier]);
260
+ // condition summary (current selection) — the auto.de-ID lives with the details link, not here.
261
+ const condParts: string[] = [];
262
+ if (!isCash) {
263
+ condParts.push(
264
+ mode === 'leasing' && annualMileage != null
265
+ ? t('autobahn:finance.kmPerYear', { value: eur(annualMileage) })
266
+ : t('autobahn:finance.downPaymentLabel', { value: eur(down) }),
267
+ );
268
+ condParts.push(t('autobahn:finance.monthsLabel', { months: term, count: term }));
269
+ }
270
+ const condLine = condParts.join(' · ');
271
+
272
+ return (
273
+ <div className="mcard mcard--elevated" style={{ padding: 20 }}>
274
+ {/* header */}
275
+ <div style={{ display: 'flex', alignItems: 'center', gap: 10, marginBottom: 14 }}>
276
+ <span
277
+ style={{
278
+ width: 34,
279
+ height: 34,
280
+ borderRadius: 'var(--md-r-full)',
281
+ background: 'var(--md-primary-container)',
282
+ display: 'flex',
283
+ alignItems: 'center',
284
+ justifyContent: 'center',
285
+ flex: 'none',
286
+ }}
287
+ >
288
+ <Icon name="tag" size={18} color="var(--md-on-primary-container)" />
289
+ </span>
290
+ <div style={{ fontFamily: 'var(--md-font-display)', fontSize: 18, fontWeight: 700 }}>{t('autobahn:finance.headerTitle')}</div>
291
+ </div>
292
+
293
+ {/* payment-type TABS on top */}
294
+ <div className="fin-tabs" role="tablist">
295
+ {(
296
+ [
297
+ ['fin', 'autobahn:finance.mode.financing'],
298
+ ['leasing', 'autobahn:finance.mode.leasing'],
299
+ ['cash', 'autobahn:finance.mode.cash'],
300
+ ] as Array<[FinanceMode, string]>
301
+ ).map(([k, labelKey]) => (
302
+ <button
303
+ key={k}
304
+ type="button"
305
+ role="tab"
306
+ aria-selected={mode === k}
307
+ className={'fin-tab' + (mode === k ? ' on' : '')}
308
+ onClick={() => onModeChange(k)}
309
+ >
310
+ {t(labelKey)}
311
+ </button>
312
+ ))}
313
+ </div>
314
+
315
+ {/* 2-col grid: rate|pill (row 1) + condLine|bar (row 2) — fixed right column prevents wrapping */}
316
+ <div className="fin-price-grid">
317
+ {/* col 1 row 1: hero rate */}
318
+ <div className="fin-rate-main">
319
+ <div style={{ display: 'flex', alignItems: 'baseline', gap: 5 }}>
320
+ <span
321
+ className="num"
322
+ style={{ fontSize: 48, fontWeight: 800, color: 'var(--md-primary)', letterSpacing: '-2px' }}
323
+ >
324
+ {isCash ? eur(price) : eur(Math.round(monthly))}
325
+ </span>
326
+ <span className="md-body-sm" style={{ fontWeight: 600 }}>
327
+ {isCash ? '€' : `€ ${t('autobahn:finance.perMonth')}`}
328
+ </span>
329
+ </div>
330
+ {isCash && <div className="md-label-sm">{t('autobahn:finance.fixedPrice')}</div>}
331
+ {isCash && showStrike && (
332
+ <div className="fin-kauf">
333
+ {t('autobahn:finance.uvp')} <s>{eur(listPrice as number)} €</s>
334
+ </div>
335
+ )}
336
+ </div>
337
+ {/* col 2 row 1: price-rating pill */}
338
+ <div>
339
+ {ratingLabel && (
340
+ <span
341
+ className="fin-eval-pill"
342
+ style={{ color: TIER_COLORS[evalTier], background: `color-mix(in srgb, ${TIER_COLORS[evalTier]} 16%, transparent)` }}
343
+ aria-label={t('autobahn:finance.priceRatingAria', { rating: evalTierLabel })}
344
+ >
345
+ <Icon
346
+ name={evalTier <= 1 ? 'check' : evalTier === 2 ? 'minus' : 'trending-up'}
347
+ size={14}
348
+ stroke={2.6}
349
+ color={TIER_COLORS[evalTier]}
350
+ />
351
+ {evalTierLabel}
352
+ </span>
353
+ )}
354
+ </div>
355
+ {/* col 1 row 2: condition line */}
356
+ <div className="fin-cond">{condLine}</div>
357
+ {/* col 2 row 2: gradient evaluation bar */}
358
+ <div>
359
+ {ratingLabel && (
360
+ <div className="fin-eval-bar">
361
+ <div className="fin-eval-thumb" style={{ left: `${(evalTier + 0.5) * 20}%`, borderColor: TIER_COLORS[evalTier] }} />
362
+ </div>
363
+ )}
364
+ </div>
365
+ </div>
366
+
367
+ {/* RATE EDIT (Rate anpassen) — between the rate and the request CTA */}
368
+ <div className="fin-adjust">
369
+ <button onClick={() => setAdjust((a) => !a)} style={expanderBtnStyle}>
370
+ <span style={{ display: 'inline-flex', alignItems: 'center', gap: 7 }}>
371
+ <Icon name={isCash ? 'list' : 'sliders-horizontal'} size={16} color="var(--md-primary)" />
372
+ {isCash ? t('autobahn:finance.detailsShow') : t('autobahn:finance.adjustRate')}
373
+ </span>
374
+ <Icon name={adjust ? 'chevron-up' : 'chevron-down'} size={18} color="var(--md-primary)" />
375
+ </button>
376
+ {adjust &&
377
+ (isCash ? (
378
+ <div style={{ marginTop: 4 }}>
379
+ <CalcRow label={t('autobahn:finance.paymentLabel')}>{t('autobahn:finance.paymentValue')}</CalcRow>
380
+ <CalcRow label={t('autobahn:finance.warrantyLabel')}>{t('autobahn:finance.warrantyValue')}</CalcRow>
381
+ <CalcRow label={t('autobahn:finance.deliveryLabel')} last>
382
+ {t('autobahn:finance.deliveryValue')}
383
+ </CalcRow>
384
+ </div>
385
+ ) : (
386
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 16, marginTop: 8 }}>
387
+ <div>
388
+ <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 6 }}>
389
+ <span className="md-title-sm">{t('autobahn:finance.downPaymentSliderLabel')}</span>
390
+ <span className="num" style={{ fontWeight: 700 }}>
391
+ {eur(down)} €
392
+ </span>
393
+ </div>
394
+ <Slider
395
+ min={downMin}
396
+ max={downMax}
397
+ step={downStep}
398
+ value={down}
399
+ onChange={onDownChange}
400
+ fmt={(v) => `${eur(Number(v))} €`}
401
+ />
402
+ </div>
403
+ {annualMileage != null && onAnnualMileageChange && (
404
+ <div>
405
+ <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 6 }}>
406
+ <span className="md-title-sm">{t('autobahn:finance.annualMileageLabel')}</span>
407
+ <span className="num" style={{ fontWeight: 700 }}>
408
+ {eur(annualMileage)} km
409
+ </span>
410
+ </div>
411
+ <Slider
412
+ min={annualMileageMin}
413
+ max={annualMileageMax}
414
+ step={annualMileageStep}
415
+ value={annualMileage}
416
+ onChange={onAnnualMileageChange}
417
+ fmt={(v) => `${eur(Number(v))} km`}
418
+ />
419
+ </div>
420
+ )}
421
+ <div>
422
+ <div className="md-title-sm" style={{ marginBottom: 8 }}>
423
+ {t('autobahn:finance.termSelection')}
424
+ </div>
425
+ <TermChips options={terms} value={term} onChange={onTermChange} t={t} />
426
+ </div>
427
+ <div>
428
+ <CalcRow label={t('autobahn:finance.purchasePrice')}>{eur(price)} €</CalcRow>
429
+ <CalcRow label={t('autobahn:finance.warrantyLabel')}>{t('autobahn:finance.warrantyValue')}</CalcRow>
430
+ <CalcRow label={t('autobahn:finance.deliveryLabel')} last>
431
+ {t('autobahn:finance.deliveryValue')}
432
+ </CalcRow>
433
+ </div>
434
+ </div>
435
+ ))}
436
+ </div>
437
+
438
+ {/* REQUEST CTA */}
439
+ <Button variant="filled" block size="lg" icon="shield-check" style={{ marginTop: 14 }} onClick={onSecure}>
440
+ {t('autobahn:finance.secureOffer')}
441
+ </Button>
442
+ {/* phone CTA — touch only (hidden on desktop via .fin-call) */}
443
+ <div className="fin-call">
444
+ <Button variant="outlined" block icon="phone" onClick={onCall}>
445
+ {phone}
446
+ </Button>
447
+ </div>
448
+
449
+ {/* auto.de-ID in front of the Finanzierungs-/Leasingdetails link — one row, under everything */}
450
+ {(autoDeId || (!isCash && onShowDetails)) && (
451
+ <div className="fin-info">
452
+ {autoDeId && <span className="fin-id">auto.de-ID {autoDeId}</span>}
453
+ {!isCash && onShowDetails && (
454
+ <DetailsLink
455
+ label={mode === 'leasing' ? t('autobahn:finance.leasingDetails') : t('autobahn:finance.financingDetails')}
456
+ onClick={onShowDetails}
457
+ />
458
+ )}
459
+ </div>
460
+ )}
461
+ </div>
462
+ );
463
+ };
464
+
465
+ export default FinanceCalculator;