@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
package/chrome/TopBar.tsx CHANGED
@@ -1,405 +1,405 @@
1
- import React, { useState } from 'react';
2
- import { TranslationFunction } from '../types';
3
-
4
- import { Button, Icon, IconButton } from '../ui';
5
- import logoUrl from '../assets/autode-logo.svg';
6
-
7
- /** Where the logo navigates on click. '/' is NOT an SPA route — traefik serves the WordPress
8
- * homepage there (generate-routes.py: wp-home at higher priority) — so the logo must be a FULL
9
- * navigation (<a href>), never history.push, or the SPA renders its 404 page. */
10
- const HOME_PATH = '/';
11
- /** The flagged Autobahn search entry point (pilot). */
12
- const SEARCH_PATH = '/search';
13
-
14
- /**
15
- * Primary nav (German UI copy — matches the legacy Header destinations, NOT the design's
16
- * "everything routes to SRP" stub). Car-listing entries stay inside the SPA pilot (/search);
17
- * the content pages (Finanzierung/Magazin) are real WP routes opened as full navigations.
18
- */
19
- const NAV_LINKS: ReadonlyArray<{ labelKey: string; to?: string; href?: string }> = [
20
- { labelKey: 'autobahn:chrome.navSearch', to: SEARCH_PATH },
21
- { labelKey: 'autobahn:chrome.navInform', href: '/magazin/' },
22
- { labelKey: 'autobahn:chrome.navFinancing', href: '/finanzieren/' },
23
- { labelKey: 'autobahn:chrome.navInsurance', href: '/versichern/' },
24
- { labelKey: 'autobahn:chrome.navService', href: '/service/kontakt/' },
25
- { labelKey: 'autobahn:chrome.navBafa', href: '/magazin/bafa-praemie-fuer-elektroautos-ab-2026/' },
26
- { labelKey: 'autobahn:chrome.navJobs', href: 'https://jobs.auto.de/' },
27
- ];
28
-
29
- /** Account-menu routes (all real fe-main SPA routes — see GuestMenu/ProfileMenu + AppRouter). */
30
- const R_SIGN_IN = '/login/sign-in';
31
- const R_SIGN_UP = '/login/sign-up';
32
- const R_DEALER = '/dealer/sign-up';
33
- const R_FAVOURITES = '/favourites';
34
- const R_SAVED_SEARCHES = '/my-searches';
35
- const R_MY_VEHICLES = '/my-vehicles/overview';
36
- const R_SETTINGS = '/my-settings';
37
- const R_MY_ORDERS = '/account/my-orders';
38
- const R_DEALER_DASHBOARD = '/account/dashboard';
39
- const R_IMAGE_SETTINGS = '/account/image-settings';
40
-
41
- /** Languages offered in the account menu (legacy supports de/en/ru). Labels are proper nouns
42
- * (endonyms) and stay untranslated. */
43
- const LANGS: ReadonlyArray<readonly [code: string, label: string]> = [
44
- ['de', 'Deutsch'],
45
- ['en', 'English'],
46
- ];
47
-
48
- /** Tiny inline flag (self-contained SVG — no external asset, CSP-safe). DE tricolor / UK union jack. */
49
- const Flag: React.FunctionComponent<{ code: string }> = ({ code }) =>
50
- code === 'en' ? (
51
- <svg viewBox="0 0 60 30" width="20" height="14" style={{ borderRadius: 2, flex: 'none', display: 'block' }} aria-hidden="true">
52
- <clipPath id="uk-clip"><rect width="60" height="30" /></clipPath>
53
- <g clipPath="url(#uk-clip)">
54
- <rect width="60" height="30" fill="#012169" />
55
- <path d="M0,0 60,30 M60,0 0,30" stroke="#fff" strokeWidth="6" />
56
- <path d="M0,0 60,30 M60,0 0,30" stroke="#C8102E" strokeWidth="4" />
57
- <path d="M30,0 V30 M0,15 H60" stroke="#fff" strokeWidth="10" />
58
- <path d="M30,0 V30 M0,15 H60" stroke="#C8102E" strokeWidth="6" />
59
- </g>
60
- </svg>
61
- ) : (
62
- <svg viewBox="0 0 5 3" width="20" height="14" style={{ borderRadius: 2, flex: 'none', display: 'block' }} aria-hidden="true">
63
- <rect width="5" height="1" y="0" fill="#000" />
64
- <rect width="5" height="1" y="1" fill="#DD0000" />
65
- <rect width="5" height="1" y="2" fill="#FFCE00" />
66
- </svg>
67
- );
68
-
69
- export interface TopBarProps {
70
- /** i18n function (drilled from the page wrapper's this.props.t). */
71
- t: TranslationFunction;
72
- /** real auth state (authStore.isAuthorized) — guest vs profile menu. */
73
- isAuthorized?: boolean;
74
- /** label for the authed menu header (authStore.userEmail / profile name). */
75
- userLabel?: string;
76
- /** Merkliste count (favoriteStore.favoritesIDs.length) — badge on the heart + menu row. */
77
- favoritesCount?: number;
78
- /** unread Suchaufträge count — badge on the bell. Defaults to 0 (no badge). */
79
- notificationCount?: number;
80
- /** placed-orders count (profileStore.totalOrdered) — badge on the my-orders menu row. */
81
- ordersCount?: number;
82
- /** active language tag (appStore.language) — ticks the current language row. */
83
- language?: string;
84
- /** dealer-main account (authStore.isDealerMain) — shows the dealer menu section. */
85
- isDealerMain?: boolean;
86
- /** attached dealerships (profileStore.dealers: { dealer: {id, email}, isActive }[]). */
87
- dealers?: ReadonlyArray<{ dealer: { id: string; email: string }; isActive: boolean }>;
88
- /** switch the active dealership (App.setMainDealer → profileStore.switchDealer). */
89
- onDealerSelect?: (dealerId: string) => void;
90
- /** sign out (authStore.signOut). */
91
- onSignOut?: () => void;
92
- /** switch language (appStore.changeLang). */
93
- onLangSelect?: (lang: string) => void;
94
- /** SPA navigation for internal routes (fe-main passes history.push). Hosts without a
95
- * client-side router (fe-landing, WP widgets) omit it → full page navigation. */
96
- onNavigate?: (to: string) => void;
97
- }
98
-
99
- /**
100
- * Sticky global top app bar (h64) for the Autobahn pilot: mobile hamburger, logo, desktop
101
- * inline nav, action icons (search / Merkliste / Suchaufträge) and a tonal "Konto" button that
102
- * opens a REAL MD3 account menu (guest: Anmelden/Registrieren/Händler/Merkliste/Sprache;
103
- * authed: profile links/Merkliste/Abmelden/Sprache) wired to the live auth routes/actions —
104
- * replacing the legacy mobile-only SidePanel UserMenu (which rendered unstyled on desktop).
105
- *
106
- * Pure MD3 chrome — renders correctly only inside a `<div className="md3">` subtree.
107
- */
108
- const TopBar: React.FunctionComponent<TopBarProps> = ({
109
- t,
110
- isAuthorized = false,
111
- userLabel,
112
- favoritesCount = 0,
113
- notificationCount = 0,
114
- ordersCount = 0,
115
- language = 'de',
116
- isDealerMain = false,
117
- dealers = [],
118
- onDealerSelect,
119
- onSignOut,
120
- onLangSelect,
121
- onNavigate,
122
- }) => {
123
- const [menu, setMenu] = useState(false); // mobile hamburger dropdown
124
- const [account, setAccount] = useState(false); // account popover
125
-
126
- const navigate = onNavigate || ((to: string): void => { window.location.href = to; });
127
-
128
- const goSearch = (): void => {
129
- setMenu(false);
130
- navigate(SEARCH_PATH);
131
- };
132
- /** navigate a nav/menu entry: SPA push for `to`, full navigation for external `href`. */
133
- const goNav = (item: { to?: string; href?: string }): void => {
134
- setMenu(false);
135
- setAccount(false);
136
- if (item.to) {
137
- navigate(item.to);
138
- } else if (item.href) {
139
- window.location.href = item.href;
140
- }
141
- };
142
- const goRoute = (to: string): void => {
143
- setMenu(false);
144
- setAccount(false);
145
- navigate(to);
146
- };
147
-
148
- const renderNav = (cls: string, itemStyle: React.CSSProperties): JSX.Element => (
149
- <nav className={cls} style={cls === 'hide-mobile' ? { display: 'flex', gap: 4, marginLeft: 8 } : { flexDirection: 'column', gap: 2 }}>
150
- {NAV_LINKS.map((item) => (
151
- <a
152
- key={item.labelKey}
153
- onClick={() => goNav(item)}
154
- className={cls === 'hide-mobile' ? 'md-label' : 'md-title-sm'}
155
- style={itemStyle}
156
- >
157
- {t(item.labelKey)}
158
- </a>
159
- ))}
160
- </nav>
161
- );
162
-
163
- /** one account-menu row. `key` is a stable identifier; `label` is the (translated) display text. */
164
- const row = (key: string, label: string, onClick: () => void, opts?: { icon?: string; primary?: boolean; badge?: number }): JSX.Element => (
165
- <button
166
- key={key}
167
- type="button"
168
- className="amenu-row"
169
- onClick={onClick}
170
- style={{
171
- display: 'flex',
172
- alignItems: 'center',
173
- gap: 10,
174
- width: '100%',
175
- padding: '10px 14px',
176
- border: 0,
177
- background: opts && opts.primary ? 'var(--md-primary)' : 'transparent',
178
- color: opts && opts.primary ? '#fff' : 'var(--md-on-surface)',
179
- borderRadius: opts && opts.primary ? 'var(--md-r-full)' : 0,
180
- margin: opts && opts.primary ? '0 0 6px' : 0,
181
- cursor: 'pointer',
182
- font: 'inherit',
183
- fontWeight: opts && opts.primary ? 700 : 500,
184
- justifyContent: opts && opts.primary ? 'center' : 'flex-start',
185
- textAlign: 'left',
186
- }}
187
- >
188
- {opts && opts.icon && <Icon name={opts.icon} size={17} style={{ flex: 'none' }} />}
189
- <span style={{ flex: 1 }}>{label}</span>
190
- {opts && typeof opts.badge === 'number' && (
191
- <span className="md-label-sm" style={{ fontWeight: 700 }}>{opts.badge}</span>
192
- )}
193
- </button>
194
- );
195
-
196
- const divider = (key: string): JSX.Element => (
197
- <div key={key} style={{ height: 1, background: 'var(--md-outline-variant)', margin: '6px 0' }} />
198
- );
199
-
200
- const renderAccountMenu = (): JSX.Element => (
201
- <div
202
- className="amenu mcard"
203
- style={{
204
- position: 'absolute',
205
- top: 'calc(100% + 8px)',
206
- right: 0,
207
- width: 264,
208
- padding: 8,
209
- zIndex: 60,
210
- boxShadow: 'var(--md-elev-2)',
211
- }}
212
- >
213
- {isAuthorized ? (
214
- <>
215
- <div className="md-label-sm" style={{ padding: '6px 14px 8px', color: 'var(--md-on-surface-variant)' }}>
216
- {userLabel || t('autobahn:chrome.myAccount')}
217
- </div>
218
- {row('autobahn:chrome.myVehicles', t('autobahn:chrome.myVehicles'), () => goRoute(R_MY_VEHICLES), { icon: 'car' })}
219
- {row('autobahn:chrome.myOrders', t('autobahn:chrome.myOrders'), () => goRoute(R_MY_ORDERS), { icon: 'package', badge: ordersCount > 0 ? ordersCount : undefined })}
220
- {row('autobahn:chrome.savedSearches', t('autobahn:chrome.savedSearches'), () => goRoute(R_SAVED_SEARCHES), { icon: 'bell' })}
221
- {row('autobahn:chrome.favorites', t('autobahn:chrome.favorites'), () => goRoute(R_FAVOURITES), { icon: 'heart', badge: favoritesCount })}
222
- {row('autobahn:chrome.settings', t('autobahn:chrome.settings'), () => goRoute(R_SETTINGS), { icon: 'settings' })}
223
- {isDealerMain && (
224
- <>
225
- {divider('d-dealer')}
226
- {row('autobahn:chrome.dealerDashboard', t('autobahn:chrome.dealerDashboard'), () => goRoute(R_DEALER_DASHBOARD), { icon: 'store' })}
227
- {row('autobahn:chrome.imageSettings', t('autobahn:chrome.imageSettings'), () => goRoute(R_IMAGE_SETTINGS), { icon: 'image' })}
228
- </>
229
- )}
230
- {dealers.length > 1 && (
231
- <>
232
- <div className="md-label-sm" style={{ padding: '8px 14px 4px', color: 'var(--md-on-surface-variant)' }}>
233
- {t('autobahn:chrome.myDealers')} ({dealers.length})
234
- </div>
235
- {dealers.map((d) =>
236
- row(`dealer-${d.dealer.id}`, d.dealer.email, () => {
237
- setAccount(false);
238
- if (!d.isActive && onDealerSelect) onDealerSelect(d.dealer.id);
239
- }, { icon: d.isActive ? 'check' : 'store' }),
240
- )}
241
- </>
242
- )}
243
- {divider('d1')}
244
- {row('autobahn:chrome.signOut', t('autobahn:chrome.signOut'), () => { setAccount(false); if (onSignOut) onSignOut(); }, { icon: 'log-out' })}
245
- </>
246
- ) : (
247
- <>
248
- {row('autobahn:chrome.signIn', t('autobahn:chrome.signIn'), () => goRoute(R_SIGN_IN), { primary: true })}
249
- {row('autobahn:chrome.register', t('autobahn:chrome.register'), () => goRoute(R_SIGN_UP), { icon: 'user-plus' })}
250
- {row('autobahn:chrome.dealerSignUp', t('autobahn:chrome.dealerSignUp'), () => goRoute(R_DEALER), { icon: 'store' })}
251
- {divider('d1')}
252
- {row('autobahn:chrome.favorites', t('autobahn:chrome.favorites'), () => goRoute(R_FAVOURITES), { icon: 'heart', badge: favoritesCount })}
253
- </>
254
- )}
255
- {divider('d2')}
256
- <div className="md-label-sm" style={{ padding: '4px 14px', color: 'var(--md-on-surface-variant)' }}>{t('autobahn:chrome.language')}</div>
257
- {LANGS.map(([code, label]) =>
258
- row(`lang-${code}`, label, () => { setAccount(false); if (onLangSelect) onLangSelect(code); }, {
259
- icon: language === code ? 'check' : 'globe',
260
- }),
261
- )}
262
- </div>
263
- );
264
-
265
- return (
266
- <header
267
- style={{
268
- position: 'sticky',
269
- top: 0,
270
- zIndex: 50,
271
- background: 'var(--md-surface)',
272
- borderBottom: '1px solid var(--md-outline-variant)',
273
- }}
274
- >
275
- <div
276
- className="container"
277
- style={{ height: 64, display: 'flex', alignItems: 'center', gap: 16, padding: '0 16px' }}
278
- >
279
- {/* mobile hamburger */}
280
- <button
281
- className="icon-btn show-mobile"
282
- aria-label={t('autobahn:chrome.menu')}
283
- aria-expanded={menu}
284
- onClick={() => setMenu((m) => !m)}
285
- >
286
- <Icon name={menu ? 'x' : 'menu'} size={22} />
287
- </button>
288
-
289
- {/* full navigation — '/' belongs to WordPress behind traefik, not the SPA (see HOME_PATH). */}
290
- <a href={HOME_PATH} style={{ flex: 'none', display: 'inline-flex' }}>
291
- <img src={logoUrl} height="32" style={{ cursor: 'pointer', display: 'block' }} alt="auto.de" />
292
- </a>
293
-
294
- {renderNav('hide-mobile', {
295
- cursor: 'pointer',
296
- padding: '8px 12px',
297
- borderRadius: 'var(--md-r-full)',
298
- color: 'var(--md-on-surface-variant)',
299
- })}
300
-
301
- <div style={{ flex: 1 }} />
302
-
303
- <IconButton name="search" label={t('autobahn:chrome.search')} onClick={goSearch} />
304
- {/* Merkliste → /favourites with a real count badge */}
305
- <span style={{ position: 'relative', display: 'inline-flex' }}>
306
- <IconButton name="heart" label={t('autobahn:chrome.favorites')} onClick={() => goRoute(R_FAVOURITES)} />
307
- {favoritesCount > 0 && (
308
- <span style={badgeStyle}>{favoritesCount}</span>
309
- )}
310
- </span>
311
- {/* Suchaufträge → /my-searches (saved searches list) */}
312
- <span style={{ position: 'relative', display: 'inline-flex' }}>
313
- <IconButton name="bell" label={t('autobahn:chrome.savedSearches')} onClick={() => goRoute(R_SAVED_SEARCHES)} />
314
- {notificationCount > 0 && (
315
- <span style={badgeStyle}>{notificationCount}</span>
316
- )}
317
- </span>
318
-
319
- {/* language segmented control — hidden ≤600px (the account menu carries language rows). */}
320
- {onLangSelect && (
321
- <div className="lang-seg hide-mobile" aria-label={t('autobahn:chrome.switchLanguage')}>
322
- <button type="button" className={'lang-seg-btn' + (language !== 'en' ? ' on' : '')} onClick={() => onLangSelect('de')}>DE</button>
323
- <button type="button" className={'lang-seg-btn' + (language === 'en' ? ' on' : '')} onClick={() => onLangSelect('en')}>EN</button>
324
- </div>
325
- )}
326
-
327
- {/* Konto button + MD3 account popover — visible at EVERY width: this menu is the only
328
- place sign-out / settings / dealer switching exist, so it must never be display:none'd
329
- (the pre-cutover hide-tablet left 601–980px with no logout at all). */}
330
- <span style={{ position: 'relative', display: 'inline-flex' }}>
331
- <button
332
- className="mbtn mbtn--tonal mbtn--sm"
333
- style={{ marginLeft: 4 }}
334
- onClick={() => setAccount((a) => !a)}
335
- aria-expanded={account}
336
- >
337
- <Icon name="user" size={18} />
338
- {t('autobahn:chrome.account')}
339
- </button>
340
- {account && renderAccountMenu()}
341
- </span>
342
- </div>
343
-
344
- {/* click-away backdrop for the account popover */}
345
- {account && (
346
- <div
347
- onClick={() => setAccount(false)}
348
- style={{ position: 'fixed', inset: 0, zIndex: 40, background: 'transparent' }}
349
- />
350
- )}
351
-
352
- {/* mobile dropdown */}
353
- {menu && (
354
- <div className="topbar-menu show-mobile" style={{ flexDirection: 'column', gap: 2 }}>
355
- {NAV_LINKS.map((item) => (
356
- <a
357
- key={item.labelKey}
358
- onClick={() => goNav(item)}
359
- className="md-title-sm"
360
- style={{
361
- cursor: 'pointer',
362
- padding: '14px 8px',
363
- borderBottom: '1px solid var(--md-outline-variant)',
364
- color: 'var(--md-on-surface)',
365
- }}
366
- >
367
- {t(item.labelKey)}
368
- </a>
369
- ))}
370
- <div style={{ display: 'flex', gap: 10, marginTop: 12 }}>
371
- <Button variant="outlined" icon="heart" style={{ flex: 1 }} onClick={() => goRoute(R_FAVOURITES)}>
372
- {t('autobahn:chrome.favorites')}{favoritesCount > 0 ? ` (${favoritesCount})` : ''}
373
- </Button>
374
- <Button variant="filled" icon="user" style={{ flex: 1 }} onClick={() => goRoute(isAuthorized ? R_MY_VEHICLES : R_SIGN_IN)}>
375
- {isAuthorized ? t('autobahn:chrome.mobileMyAccount') : t('autobahn:chrome.signIn')}
376
- </Button>
377
- </div>
378
- </div>
379
- )}
380
- </header>
381
- );
382
- };
383
-
384
- /** small red count badge shared by the heart + bell. */
385
- const badgeStyle: React.CSSProperties = {
386
- position: 'absolute',
387
- top: 4,
388
- right: 4,
389
- minWidth: 15,
390
- height: 15,
391
- padding: '0 4px',
392
- borderRadius: 999,
393
- background: 'var(--md-error)',
394
- color: '#fff',
395
- fontSize: 9.5,
396
- fontWeight: 700,
397
- lineHeight: 1,
398
- display: 'flex',
399
- alignItems: 'center',
400
- justifyContent: 'center',
401
- boxShadow: '0 0 0 2px var(--md-surface)',
402
- pointerEvents: 'none',
403
- };
404
-
405
- export default TopBar;
1
+ import React, { useState } from 'react';
2
+ import { TranslationFunction } from '../types';
3
+
4
+ import { Button, Icon, IconButton } from '../ui';
5
+ import logoUrl from '../assets/autode-logo.svg';
6
+
7
+ /** Where the logo navigates on click. '/' is NOT an SPA route — traefik serves the WordPress
8
+ * homepage there (generate-routes.py: wp-home at higher priority) — so the logo must be a FULL
9
+ * navigation (<a href>), never history.push, or the SPA renders its 404 page. */
10
+ const HOME_PATH = '/';
11
+ /** The flagged Autobahn search entry point (pilot). */
12
+ const SEARCH_PATH = '/search';
13
+
14
+ /**
15
+ * Primary nav (German UI copy — matches the legacy Header destinations, NOT the design's
16
+ * "everything routes to SRP" stub). Car-listing entries stay inside the SPA pilot (/search);
17
+ * the content pages (Finanzierung/Magazin) are real WP routes opened as full navigations.
18
+ */
19
+ const NAV_LINKS: ReadonlyArray<{ labelKey: string; to?: string; href?: string }> = [
20
+ { labelKey: 'autobahn:chrome.navSearch', to: SEARCH_PATH },
21
+ { labelKey: 'autobahn:chrome.navInform', href: '/magazin/' },
22
+ { labelKey: 'autobahn:chrome.navFinancing', href: '/finanzieren/' },
23
+ { labelKey: 'autobahn:chrome.navInsurance', href: '/versichern/' },
24
+ { labelKey: 'autobahn:chrome.navService', href: '/service/kontakt/' },
25
+ { labelKey: 'autobahn:chrome.navBafa', href: '/magazin/bafa-praemie-fuer-elektroautos-ab-2026/' },
26
+ { labelKey: 'autobahn:chrome.navJobs', href: 'https://jobs.auto.de/' },
27
+ ];
28
+
29
+ /** Account-menu routes (all real fe-main SPA routes — see GuestMenu/ProfileMenu + AppRouter). */
30
+ const R_SIGN_IN = '/login/sign-in';
31
+ const R_SIGN_UP = '/login/sign-up';
32
+ const R_DEALER = '/dealer/sign-up';
33
+ const R_FAVOURITES = '/favourites';
34
+ const R_SAVED_SEARCHES = '/my-searches';
35
+ const R_MY_VEHICLES = '/my-vehicles/overview';
36
+ const R_SETTINGS = '/my-settings';
37
+ const R_MY_ORDERS = '/account/my-orders';
38
+ const R_DEALER_DASHBOARD = '/account/dashboard';
39
+ const R_IMAGE_SETTINGS = '/account/image-settings';
40
+
41
+ /** Languages offered in the account menu (legacy supports de/en/ru). Labels are proper nouns
42
+ * (endonyms) and stay untranslated. */
43
+ const LANGS: ReadonlyArray<readonly [code: string, label: string]> = [
44
+ ['de', 'Deutsch'],
45
+ ['en', 'English'],
46
+ ];
47
+
48
+ /** Tiny inline flag (self-contained SVG — no external asset, CSP-safe). DE tricolor / UK union jack. */
49
+ const Flag: React.FunctionComponent<{ code: string }> = ({ code }) =>
50
+ code === 'en' ? (
51
+ <svg viewBox="0 0 60 30" width="20" height="14" style={{ borderRadius: 2, flex: 'none', display: 'block' }} aria-hidden="true">
52
+ <clipPath id="uk-clip"><rect width="60" height="30" /></clipPath>
53
+ <g clipPath="url(#uk-clip)">
54
+ <rect width="60" height="30" fill="#012169" />
55
+ <path d="M0,0 60,30 M60,0 0,30" stroke="#fff" strokeWidth="6" />
56
+ <path d="M0,0 60,30 M60,0 0,30" stroke="#C8102E" strokeWidth="4" />
57
+ <path d="M30,0 V30 M0,15 H60" stroke="#fff" strokeWidth="10" />
58
+ <path d="M30,0 V30 M0,15 H60" stroke="#C8102E" strokeWidth="6" />
59
+ </g>
60
+ </svg>
61
+ ) : (
62
+ <svg viewBox="0 0 5 3" width="20" height="14" style={{ borderRadius: 2, flex: 'none', display: 'block' }} aria-hidden="true">
63
+ <rect width="5" height="1" y="0" fill="#000" />
64
+ <rect width="5" height="1" y="1" fill="#DD0000" />
65
+ <rect width="5" height="1" y="2" fill="#FFCE00" />
66
+ </svg>
67
+ );
68
+
69
+ export interface TopBarProps {
70
+ /** i18n function (drilled from the page wrapper's this.props.t). */
71
+ t: TranslationFunction;
72
+ /** real auth state (authStore.isAuthorized) — guest vs profile menu. */
73
+ isAuthorized?: boolean;
74
+ /** label for the authed menu header (authStore.userEmail / profile name). */
75
+ userLabel?: string;
76
+ /** Merkliste count (favoriteStore.favoritesIDs.length) — badge on the heart + menu row. */
77
+ favoritesCount?: number;
78
+ /** unread Suchaufträge count — badge on the bell. Defaults to 0 (no badge). */
79
+ notificationCount?: number;
80
+ /** placed-orders count (profileStore.totalOrdered) — badge on the my-orders menu row. */
81
+ ordersCount?: number;
82
+ /** active language tag (appStore.language) — ticks the current language row. */
83
+ language?: string;
84
+ /** dealer-main account (authStore.isDealerMain) — shows the dealer menu section. */
85
+ isDealerMain?: boolean;
86
+ /** attached dealerships (profileStore.dealers: { dealer: {id, email}, isActive }[]). */
87
+ dealers?: ReadonlyArray<{ dealer: { id: string; email: string }; isActive: boolean }>;
88
+ /** switch the active dealership (App.setMainDealer → profileStore.switchDealer). */
89
+ onDealerSelect?: (dealerId: string) => void;
90
+ /** sign out (authStore.signOut). */
91
+ onSignOut?: () => void;
92
+ /** switch language (appStore.changeLang). */
93
+ onLangSelect?: (lang: string) => void;
94
+ /** SPA navigation for internal routes (fe-main passes history.push). Hosts without a
95
+ * client-side router (fe-landing, WP widgets) omit it → full page navigation. */
96
+ onNavigate?: (to: string) => void;
97
+ }
98
+
99
+ /**
100
+ * Sticky global top app bar (h64) for the Autobahn pilot: mobile hamburger, logo, desktop
101
+ * inline nav, action icons (search / Merkliste / Suchaufträge) and a tonal "Konto" button that
102
+ * opens a REAL MD3 account menu (guest: Anmelden/Registrieren/Händler/Merkliste/Sprache;
103
+ * authed: profile links/Merkliste/Abmelden/Sprache) wired to the live auth routes/actions —
104
+ * replacing the legacy mobile-only SidePanel UserMenu (which rendered unstyled on desktop).
105
+ *
106
+ * Pure MD3 chrome — renders correctly only inside a `<div className="md3">` subtree.
107
+ */
108
+ const TopBar: React.FunctionComponent<TopBarProps> = ({
109
+ t,
110
+ isAuthorized = false,
111
+ userLabel,
112
+ favoritesCount = 0,
113
+ notificationCount = 0,
114
+ ordersCount = 0,
115
+ language = 'de',
116
+ isDealerMain = false,
117
+ dealers = [],
118
+ onDealerSelect,
119
+ onSignOut,
120
+ onLangSelect,
121
+ onNavigate,
122
+ }) => {
123
+ const [menu, setMenu] = useState(false); // mobile hamburger dropdown
124
+ const [account, setAccount] = useState(false); // account popover
125
+
126
+ const navigate = onNavigate || ((to: string): void => { window.location.href = to; });
127
+
128
+ const goSearch = (): void => {
129
+ setMenu(false);
130
+ navigate(SEARCH_PATH);
131
+ };
132
+ /** navigate a nav/menu entry: SPA push for `to`, full navigation for external `href`. */
133
+ const goNav = (item: { to?: string; href?: string }): void => {
134
+ setMenu(false);
135
+ setAccount(false);
136
+ if (item.to) {
137
+ navigate(item.to);
138
+ } else if (item.href) {
139
+ window.location.href = item.href;
140
+ }
141
+ };
142
+ const goRoute = (to: string): void => {
143
+ setMenu(false);
144
+ setAccount(false);
145
+ navigate(to);
146
+ };
147
+
148
+ const renderNav = (cls: string, itemStyle: React.CSSProperties): JSX.Element => (
149
+ <nav className={cls} style={cls === 'hide-mobile' ? { display: 'flex', gap: 4, marginLeft: 8 } : { flexDirection: 'column', gap: 2 }}>
150
+ {NAV_LINKS.map((item) => (
151
+ <a
152
+ key={item.labelKey}
153
+ onClick={() => goNav(item)}
154
+ className={cls === 'hide-mobile' ? 'md-label' : 'md-title-sm'}
155
+ style={itemStyle}
156
+ >
157
+ {t(item.labelKey)}
158
+ </a>
159
+ ))}
160
+ </nav>
161
+ );
162
+
163
+ /** one account-menu row. `key` is a stable identifier; `label` is the (translated) display text. */
164
+ const row = (key: string, label: string, onClick: () => void, opts?: { icon?: string; primary?: boolean; badge?: number }): JSX.Element => (
165
+ <button
166
+ key={key}
167
+ type="button"
168
+ className="amenu-row"
169
+ onClick={onClick}
170
+ style={{
171
+ display: 'flex',
172
+ alignItems: 'center',
173
+ gap: 10,
174
+ width: '100%',
175
+ padding: '10px 14px',
176
+ border: 0,
177
+ background: opts && opts.primary ? 'var(--md-primary)' : 'transparent',
178
+ color: opts && opts.primary ? '#fff' : 'var(--md-on-surface)',
179
+ borderRadius: opts && opts.primary ? 'var(--md-r-full)' : 0,
180
+ margin: opts && opts.primary ? '0 0 6px' : 0,
181
+ cursor: 'pointer',
182
+ font: 'inherit',
183
+ fontWeight: opts && opts.primary ? 700 : 500,
184
+ justifyContent: opts && opts.primary ? 'center' : 'flex-start',
185
+ textAlign: 'left',
186
+ }}
187
+ >
188
+ {opts && opts.icon && <Icon name={opts.icon} size={17} style={{ flex: 'none' }} />}
189
+ <span style={{ flex: 1 }}>{label}</span>
190
+ {opts && typeof opts.badge === 'number' && (
191
+ <span className="md-label-sm" style={{ fontWeight: 700 }}>{opts.badge}</span>
192
+ )}
193
+ </button>
194
+ );
195
+
196
+ const divider = (key: string): JSX.Element => (
197
+ <div key={key} style={{ height: 1, background: 'var(--md-outline-variant)', margin: '6px 0' }} />
198
+ );
199
+
200
+ const renderAccountMenu = (): JSX.Element => (
201
+ <div
202
+ className="amenu mcard"
203
+ style={{
204
+ position: 'absolute',
205
+ top: 'calc(100% + 8px)',
206
+ right: 0,
207
+ width: 264,
208
+ padding: 8,
209
+ zIndex: 60,
210
+ boxShadow: 'var(--md-elev-2)',
211
+ }}
212
+ >
213
+ {isAuthorized ? (
214
+ <>
215
+ <div className="md-label-sm" style={{ padding: '6px 14px 8px', color: 'var(--md-on-surface-variant)' }}>
216
+ {userLabel || t('autobahn:chrome.myAccount')}
217
+ </div>
218
+ {row('autobahn:chrome.myVehicles', t('autobahn:chrome.myVehicles'), () => goRoute(R_MY_VEHICLES), { icon: 'car' })}
219
+ {row('autobahn:chrome.myOrders', t('autobahn:chrome.myOrders'), () => goRoute(R_MY_ORDERS), { icon: 'package', badge: ordersCount > 0 ? ordersCount : undefined })}
220
+ {row('autobahn:chrome.savedSearches', t('autobahn:chrome.savedSearches'), () => goRoute(R_SAVED_SEARCHES), { icon: 'bell' })}
221
+ {row('autobahn:chrome.favorites', t('autobahn:chrome.favorites'), () => goRoute(R_FAVOURITES), { icon: 'heart', badge: favoritesCount })}
222
+ {row('autobahn:chrome.settings', t('autobahn:chrome.settings'), () => goRoute(R_SETTINGS), { icon: 'settings' })}
223
+ {isDealerMain && (
224
+ <>
225
+ {divider('d-dealer')}
226
+ {row('autobahn:chrome.dealerDashboard', t('autobahn:chrome.dealerDashboard'), () => goRoute(R_DEALER_DASHBOARD), { icon: 'store' })}
227
+ {row('autobahn:chrome.imageSettings', t('autobahn:chrome.imageSettings'), () => goRoute(R_IMAGE_SETTINGS), { icon: 'image' })}
228
+ </>
229
+ )}
230
+ {dealers.length > 1 && (
231
+ <>
232
+ <div className="md-label-sm" style={{ padding: '8px 14px 4px', color: 'var(--md-on-surface-variant)' }}>
233
+ {t('autobahn:chrome.myDealers')} ({dealers.length})
234
+ </div>
235
+ {dealers.map((d) =>
236
+ row(`dealer-${d.dealer.id}`, d.dealer.email, () => {
237
+ setAccount(false);
238
+ if (!d.isActive && onDealerSelect) onDealerSelect(d.dealer.id);
239
+ }, { icon: d.isActive ? 'check' : 'store' }),
240
+ )}
241
+ </>
242
+ )}
243
+ {divider('d1')}
244
+ {row('autobahn:chrome.signOut', t('autobahn:chrome.signOut'), () => { setAccount(false); if (onSignOut) onSignOut(); }, { icon: 'log-out' })}
245
+ </>
246
+ ) : (
247
+ <>
248
+ {row('autobahn:chrome.signIn', t('autobahn:chrome.signIn'), () => goRoute(R_SIGN_IN), { primary: true })}
249
+ {row('autobahn:chrome.register', t('autobahn:chrome.register'), () => goRoute(R_SIGN_UP), { icon: 'user-plus' })}
250
+ {row('autobahn:chrome.dealerSignUp', t('autobahn:chrome.dealerSignUp'), () => goRoute(R_DEALER), { icon: 'store' })}
251
+ {divider('d1')}
252
+ {row('autobahn:chrome.favorites', t('autobahn:chrome.favorites'), () => goRoute(R_FAVOURITES), { icon: 'heart', badge: favoritesCount })}
253
+ </>
254
+ )}
255
+ {divider('d2')}
256
+ <div className="md-label-sm" style={{ padding: '4px 14px', color: 'var(--md-on-surface-variant)' }}>{t('autobahn:chrome.language')}</div>
257
+ {LANGS.map(([code, label]) =>
258
+ row(`lang-${code}`, label, () => { setAccount(false); if (onLangSelect) onLangSelect(code); }, {
259
+ icon: language === code ? 'check' : 'globe',
260
+ }),
261
+ )}
262
+ </div>
263
+ );
264
+
265
+ return (
266
+ <header
267
+ style={{
268
+ position: 'sticky',
269
+ top: 0,
270
+ zIndex: 50,
271
+ background: 'var(--md-surface)',
272
+ borderBottom: '1px solid var(--md-outline-variant)',
273
+ }}
274
+ >
275
+ <div
276
+ className="container"
277
+ style={{ height: 64, display: 'flex', alignItems: 'center', gap: 16, padding: '0 16px' }}
278
+ >
279
+ {/* mobile hamburger */}
280
+ <button
281
+ className="icon-btn show-mobile"
282
+ aria-label={t('autobahn:chrome.menu')}
283
+ aria-expanded={menu}
284
+ onClick={() => setMenu((m) => !m)}
285
+ >
286
+ <Icon name={menu ? 'x' : 'menu'} size={22} />
287
+ </button>
288
+
289
+ {/* full navigation — '/' belongs to WordPress behind traefik, not the SPA (see HOME_PATH). */}
290
+ <a href={HOME_PATH} style={{ flex: 'none', display: 'inline-flex' }}>
291
+ <img src={logoUrl} height="32" style={{ cursor: 'pointer', display: 'block' }} alt="auto.de" />
292
+ </a>
293
+
294
+ {renderNav('hide-mobile', {
295
+ cursor: 'pointer',
296
+ padding: '8px 12px',
297
+ borderRadius: 'var(--md-r-full)',
298
+ color: 'var(--md-on-surface-variant)',
299
+ })}
300
+
301
+ <div style={{ flex: 1 }} />
302
+
303
+ <IconButton name="search" label={t('autobahn:chrome.search')} onClick={goSearch} />
304
+ {/* Merkliste → /favourites with a real count badge */}
305
+ <span style={{ position: 'relative', display: 'inline-flex' }}>
306
+ <IconButton name="heart" label={t('autobahn:chrome.favorites')} onClick={() => goRoute(R_FAVOURITES)} />
307
+ {favoritesCount > 0 && (
308
+ <span style={badgeStyle}>{favoritesCount}</span>
309
+ )}
310
+ </span>
311
+ {/* Suchaufträge → /my-searches (saved searches list) */}
312
+ <span style={{ position: 'relative', display: 'inline-flex' }}>
313
+ <IconButton name="bell" label={t('autobahn:chrome.savedSearches')} onClick={() => goRoute(R_SAVED_SEARCHES)} />
314
+ {notificationCount > 0 && (
315
+ <span style={badgeStyle}>{notificationCount}</span>
316
+ )}
317
+ </span>
318
+
319
+ {/* language segmented control — hidden ≤600px (the account menu carries language rows). */}
320
+ {onLangSelect && (
321
+ <div className="lang-seg hide-mobile" aria-label={t('autobahn:chrome.switchLanguage')}>
322
+ <button type="button" className={'lang-seg-btn' + (language !== 'en' ? ' on' : '')} onClick={() => onLangSelect('de')}>DE</button>
323
+ <button type="button" className={'lang-seg-btn' + (language === 'en' ? ' on' : '')} onClick={() => onLangSelect('en')}>EN</button>
324
+ </div>
325
+ )}
326
+
327
+ {/* Konto button + MD3 account popover — visible at EVERY width: this menu is the only
328
+ place sign-out / settings / dealer switching exist, so it must never be display:none'd
329
+ (the pre-cutover hide-tablet left 601–980px with no logout at all). */}
330
+ <span style={{ position: 'relative', display: 'inline-flex' }}>
331
+ <button
332
+ className="mbtn mbtn--tonal mbtn--sm"
333
+ style={{ marginLeft: 4 }}
334
+ onClick={() => setAccount((a) => !a)}
335
+ aria-expanded={account}
336
+ >
337
+ <Icon name="user" size={18} />
338
+ {t('autobahn:chrome.account')}
339
+ </button>
340
+ {account && renderAccountMenu()}
341
+ </span>
342
+ </div>
343
+
344
+ {/* click-away backdrop for the account popover */}
345
+ {account && (
346
+ <div
347
+ onClick={() => setAccount(false)}
348
+ style={{ position: 'fixed', inset: 0, zIndex: 40, background: 'transparent' }}
349
+ />
350
+ )}
351
+
352
+ {/* mobile dropdown */}
353
+ {menu && (
354
+ <div className="topbar-menu show-mobile" style={{ flexDirection: 'column', gap: 2 }}>
355
+ {NAV_LINKS.map((item) => (
356
+ <a
357
+ key={item.labelKey}
358
+ onClick={() => goNav(item)}
359
+ className="md-title-sm"
360
+ style={{
361
+ cursor: 'pointer',
362
+ padding: '14px 8px',
363
+ borderBottom: '1px solid var(--md-outline-variant)',
364
+ color: 'var(--md-on-surface)',
365
+ }}
366
+ >
367
+ {t(item.labelKey)}
368
+ </a>
369
+ ))}
370
+ <div style={{ display: 'flex', gap: 10, marginTop: 12 }}>
371
+ <Button variant="outlined" icon="heart" style={{ flex: 1 }} onClick={() => goRoute(R_FAVOURITES)}>
372
+ {t('autobahn:chrome.favorites')}{favoritesCount > 0 ? ` (${favoritesCount})` : ''}
373
+ </Button>
374
+ <Button variant="filled" icon="user" style={{ flex: 1 }} onClick={() => goRoute(isAuthorized ? R_MY_VEHICLES : R_SIGN_IN)}>
375
+ {isAuthorized ? t('autobahn:chrome.mobileMyAccount') : t('autobahn:chrome.signIn')}
376
+ </Button>
377
+ </div>
378
+ </div>
379
+ )}
380
+ </header>
381
+ );
382
+ };
383
+
384
+ /** small red count badge shared by the heart + bell. */
385
+ const badgeStyle: React.CSSProperties = {
386
+ position: 'absolute',
387
+ top: 4,
388
+ right: 4,
389
+ minWidth: 15,
390
+ height: 15,
391
+ padding: '0 4px',
392
+ borderRadius: 999,
393
+ background: 'var(--md-error)',
394
+ color: '#fff',
395
+ fontSize: 9.5,
396
+ fontWeight: 700,
397
+ lineHeight: 1,
398
+ display: 'flex',
399
+ alignItems: 'center',
400
+ justifyContent: 'center',
401
+ boxShadow: '0 0 0 2px var(--md-surface)',
402
+ pointerEvents: 'none',
403
+ };
404
+
405
+ export default TopBar;