@bytebrand/fe-ui-core-autobahn 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/autode-logo.svg +6 -6
- package/cards/CarCard.tsx +174 -174
- package/cards/CarRow.tsx +186 -182
- package/cards/cardParts.tsx +529 -489
- package/cards/index.ts +37 -35
- package/cards/types.ts +122 -114
- package/chrome/Footer.tsx +189 -189
- package/chrome/TopBar.tsx +405 -405
- package/chrome/index.ts +20 -20
- package/chrome/svg.d.ts +11 -11
- package/compat/AccardionSection/AccardionSection.styl +45 -45
- package/compat/AccardionSection/AccardionSection.tsx +56 -56
- package/compat/AccordionWidget/AccordionWidget.styl +220 -220
- package/compat/AccordionWidget/AccordionWidget.tsx +257 -257
- package/compat/AccordionWrapper/AccordionItem/AccordionItem.styl +34 -34
- package/compat/AccordionWrapper/AccordionItem/AccordionItem.tsx +64 -64
- package/compat/AccordionWrapper/AccordionWrapper.tsx +34 -34
- package/compat/AdvantageItem/AdvantageItem.styl +47 -47
- package/compat/AdvantageItem/AdvantageItem.tsx +26 -26
- package/compat/Alternative/DealerInfo.styl +116 -116
- package/compat/Alternative/DealerInfo.tsx +171 -171
- package/compat/Badge/Badge.styl +44 -44
- package/compat/Badge/Badge.tsx +25 -25
- package/compat/BodyTypeIcons/Audi.tsx +9 -9
- package/compat/BodyTypeIcons/Bmw.tsx +860 -860
- package/compat/BodyTypeIcons/Ford.tsx +31 -31
- package/compat/BodyTypeIcons/IconsConfig.tsx +44 -44
- package/compat/BodyTypeIcons/IconsConfigCompact.tsx +30 -30
- package/compat/BodyTypeIcons/Mazda.tsx +44 -44
- package/compat/BodyTypeIcons/MercedesBenz.tsx +38 -38
- package/compat/BodyTypeIcons/Opel.tsx +19 -19
- package/compat/BodyTypeIcons/Search.tsx +19 -19
- package/compat/BodyTypeIcons/SelectorCategoryCombi.tsx +68 -68
- package/compat/BodyTypeIcons/SelectorCategoryCompact.tsx +20 -20
- package/compat/BodyTypeIcons/SelectorCategoryConvertible.tsx +68 -68
- package/compat/BodyTypeIcons/SelectorCategoryCoupe.tsx +60 -60
- package/compat/BodyTypeIcons/SelectorCategoryMinibus.tsx +64 -64
- package/compat/BodyTypeIcons/SelectorCategorySedan.tsx +69 -69
- package/compat/BodyTypeIcons/SelectorCategorySuv.tsx +77 -77
- package/compat/BodyTypeIcons/SelectorCategoryTransporter.tsx +68 -68
- package/compat/BodyTypeIcons/SelectorCategoryVan.tsx +72 -72
- package/compat/BodyTypeIcons/Volkswagen.tsx +330 -330
- package/compat/BodyTypeIcons/index.ts +17 -17
- package/compat/Button/Button.tsx +65 -65
- package/compat/ButtonOld/Button.styl +65 -65
- package/compat/ButtonOld/Button.tsx +84 -84
- package/compat/Checkbox/Checkbox.styl +119 -119
- package/compat/Checkbox/Checkbox.tsx +151 -151
- package/compat/Checkbox/FormCheckbox.styl +22 -22
- package/compat/Checkbox/FormCheckbox.tsx +86 -86
- package/compat/Co2Widget/CO2Efficiency.styl +219 -219
- package/compat/Co2Widget/CO2Efficiency.tsx +93 -93
- package/compat/ContactInfo/ContactInfo.styl +22 -22
- package/compat/ContactInfo/ContactInfo.tsx +161 -161
- package/compat/ContactInfo/TemporaryTranslation.ts +11 -11
- package/compat/CookieModal/CookieModal.tsx +49 -49
- package/compat/CookieModal/Modal.tsx +43 -43
- package/compat/CookieModal/ModalsConfig.tsx +23 -23
- package/compat/CookieModal/modals/ManageCookieModal/ManageCookieModal.styl +86 -86
- package/compat/CookieModal/modals/ManageCookieModal/ManageCookieModal.tsx +184 -184
- package/compat/CookieModal/modals/PreviewCookieModal/PreviewCookieModal.styl +66 -66
- package/compat/CookieModal/modals/PreviewCookieModal/PreviewCookieModal.tsx +51 -51
- package/compat/CookieModal/modals/TestModal.tsx +7 -7
- package/compat/CookieModal/useModal.ts +13 -13
- package/compat/CustomerQuote/CustomerQuote.styl +79 -79
- package/compat/CustomerQuote/CustomerQuote.tsx +68 -68
- package/compat/CustomerQuotesSlider/CustomerQuotesSlider.styl +46 -46
- package/compat/CustomerQuotesSlider/CustomerQuotesSlider.tsx +79 -79
- package/compat/CustomerQuotesSlider/SliderArrow.tsx +20 -20
- package/compat/CustomerQuotesSlider/slider.global.styl +2 -2
- package/compat/ExpansionPanel/ExpansionPanel.tsx +68 -68
- package/compat/FirstInfoBlock/FirstInfoBlock.styl +33 -33
- package/compat/FirstInfoBlock/FirstInfoBlock.tsx +49 -49
- package/compat/FirstInfoBlock/FirstInfoBlockItem/FirstInfoBlockItem.styl +66 -66
- package/compat/FirstInfoBlock/FirstInfoBlockItem/FirstInfoBlockItem.tsx +21 -21
- package/compat/FormattedNumber/FormattedNumber.styl +1 -1
- package/compat/FormattedNumber/FormattedNumber.tsx +90 -90
- package/compat/IconContainer/IconContainer.styl +23 -23
- package/compat/IconContainer/IconContainer.tsx +34 -34
- package/compat/Image/Image.styl +109 -109
- package/compat/Image/Image.tsx +302 -302
- package/compat/ImageSettings/EditableOptionsTable/CustomCheckbox/CustomCheckbox.styl +7 -7
- package/compat/ImageSettings/EditableOptionsTable/CustomCheckbox/CustomCheckbox.tsx +30 -30
- package/compat/ImageSettings/EditableOptionsTable/EditableOptionsTable.styl +122 -122
- package/compat/ImageSettings/EditableOptionsTable/EditableOptionsTable.tsx +199 -199
- package/compat/ImageSettings/EditableOptionsTable/ImageIcon/ImageIcon.styl +3 -3
- package/compat/ImageSettings/EditableOptionsTable/ImageIcon/ImageIcon.tsx +15 -15
- package/compat/ImageSettings/OptionsTable/OptionsTable.styl +47 -47
- package/compat/ImageSettings/OptionsTable/OptionsTable.tsx +122 -122
- package/compat/ImageSettings/PricePlan/PricePlan.styl +63 -63
- package/compat/ImageSettings/PricePlan/PricePlan.tsx +32 -32
- package/compat/ImageSettings/index.ts +42 -42
- package/compat/ImagesSet/ImagesSet.styl +27 -27
- package/compat/ImagesSet/ImagesSet.tsx +76 -76
- package/compat/InfoBlockWrapper/InfoBlockWrapper.styl +41 -41
- package/compat/InfoBlockWrapper/InfoBlockWrapper.tsx +46 -46
- package/compat/Loader/Loader.styl +39 -39
- package/compat/Loader/Loader.tsx +32 -32
- package/compat/MagnifyGlass/MagnifyGlass.styl +33 -33
- package/compat/MagnifyGlass/MagnifyGlass.tsx +213 -213
- package/compat/MdAccordionGroup/MdAccordionGroup.tsx +53 -53
- package/compat/MdCheckbox/MdCheckbox.tsx +69 -69
- package/compat/MdField/MdField.tsx +100 -100
- package/compat/MdSelect/MdSelect.tsx +103 -103
- package/compat/MdSwitch/MdSwitch.tsx +29 -29
- package/compat/MdTabs/MdTabs.tsx +47 -47
- package/compat/MdTooltip/MdTooltip.tsx +31 -31
- package/compat/OfferDetailedSection/OfferDetailedSection.styl +31 -31
- package/compat/OfferDetailedSection/OfferDetailedSection.tsx +100 -100
- package/compat/OfferDetailedSection/partials/PanelConfig.styl +131 -131
- package/compat/OfferDetailedSection/partials/PanelConfig.tsx +121 -121
- package/compat/OfferPanel/AboAccordion/AboAccordion.styl +24 -24
- package/compat/OfferPanel/AboAccordion/AboAccordion.tsx +128 -128
- package/compat/OfferPanel/AboAccordion/AboColorOptions/AboColorOptions.styl +11 -11
- package/compat/OfferPanel/AboAccordion/AboColorOptions/AboColorOptions.tsx +35 -35
- package/compat/OfferPanel/AboAccordion/AboFaq/AboFaq.styl +20 -20
- package/compat/OfferPanel/AboAccordion/AboFaq/AboFaq.tsx +25 -25
- package/compat/OfferPanel/AboAccordion/AboIncludedServices/AboIncludedServices.styl +13 -13
- package/compat/OfferPanel/AboAccordion/AboIncludedServices/AboIncludedServices.tsx +39 -39
- package/compat/OfferPanel/MuiOfferPeriod/MuiOfferPeriod.tsx +42 -42
- package/compat/OfferPanel/OfferCheckboxGroup/CheckboxContainer.tsx +140 -140
- package/compat/OfferPanel/OfferCheckboxGroup/OfferCheckboxGroup.styl +144 -144
- package/compat/OfferPanel/OfferCheckboxGroup/OfferCheckboxGroup.tsx +23 -23
- package/compat/OfferPanel/OfferPanel.styl +193 -193
- package/compat/OfferPanel/OfferPanel.tsx +81 -81
- package/compat/OfferPanel/OfferPeriod/OfferPeriod.styl +24 -24
- package/compat/OfferPanel/OfferPeriod/OfferPeriod.tsx +45 -45
- package/compat/OfferPanel/RangeGroup/RangeGroup.tsx +39 -39
- package/compat/OfferRequestButtonWrapper/OfferRequestButtonWrapper.styl +119 -119
- package/compat/OfferRequestButtonWrapper/OfferRequestButtonWrapper.styled.tsx +33 -33
- package/compat/OfferRequestButtonWrapper/OfferRequestButtonWrapper.tsx +122 -122
- package/compat/PriceRating/PriceRating.styl +47 -47
- package/compat/PriceRating/PriceRating.tsx +64 -64
- package/compat/PriceRatingDetailed/PriceRatingDetailed.styl +120 -120
- package/compat/PriceRatingDetailed/PriceRatingDetailed.tsx +191 -191
- package/compat/PricingToolBlock/PricingTool.styl +6 -6
- package/compat/PricingToolBlock/PricingTool.tsx +29 -29
- package/compat/Radio/Radio.styl +115 -115
- package/compat/Radio/Radio.tsx +141 -141
- package/compat/Radio/RadioGroup.styl +5 -5
- package/compat/Radio/RadioGroup.tsx +65 -65
- package/compat/Range/Range.tsx +79 -79
- package/compat/RateSearchValue/RateSearchValue.styl +22 -22
- package/compat/RateSearchValue/RateSearchValue.tsx +55 -55
- package/compat/RateSearchWidget/RateSearchWidget.styl +106 -106
- package/compat/RateSearchWidget/RateSearchWidget.tsx +163 -163
- package/compat/ServiceBlockItem/ServiceBlockItem.styl +47 -47
- package/compat/ServiceBlockItem/ServiceBlockItem.tsx +25 -25
- package/compat/SkeletonItem/SkeletonItem.styl +80 -80
- package/compat/SkeletonItem/SkeletonItem.tsx +80 -80
- package/compat/StarButton/StarButton.styl +39 -39
- package/compat/StarButton/StarButton.tsx +31 -31
- package/compat/TabPanel/TabPanel.tsx +28 -28
- package/compat/TimePicker/TimePicker.styl +22 -22
- package/compat/TimePicker/TimePicker.tsx +156 -156
- package/compat/Tooltip/Tooltip.styl +117 -117
- package/compat/Tooltip/Tooltip.tsx +63 -63
- package/compat/Usp/Usp.styl +78 -78
- package/compat/Usp/Usp.tsx +30 -30
- package/compat/Usp/uspTranslate.ts +12 -12
- package/compat/VehicleDetailedSidebar/VehicleDetailedSidebar.styl +36 -36
- package/compat/VehicleDetailedSidebar/VehicleDetailedSidebar.tsx +178 -178
- package/compat/VehicleDetailedSidebar/partials/Price.styl +27 -27
- package/compat/VehicleDetailedSidebar/partials/Price.tsx +41 -41
- package/compat/VehicleDetailedSidebar/partials/PriceContent.styl +123 -123
- package/compat/VehicleDetailedSidebar/partials/PriceContent.tsx +128 -128
- package/compat/VehicleDetailedSidebar/partials/Properties.styl +58 -58
- package/compat/VehicleDetailedSidebar/partials/Properties.tsx +155 -155
- package/compat/VehicleDetailedSidebar/partials/Title.styl +35 -35
- package/compat/VehicleDetailedSidebar/partials/Title.tsx +33 -33
- package/compat/VehicleDetailedSlider/VehicleDetailedSlider.styl +146 -146
- package/compat/VehicleDetailedSlider/VehicleDetailedSlider.tsx +382 -382
- package/compat/VehicleDetailedSlider/partials/MobileStast.tsx +61 -61
- package/compat/VehicleDetailedSlider/partials/MobileStats.styl +71 -71
- package/compat/VehicleDetailedSlider/partials/PriceData.styl +50 -50
- package/compat/VehicleDetailedSlider/partials/PriceData.tsx +67 -67
- package/compat/VehicleDetailedSlider/partials/Stats.styl +80 -80
- package/compat/VehicleDetailedSlider/partials/Stats.tsx +62 -62
- package/compat/VehicleDetailedSlider/partials/Title.styl +44 -44
- package/compat/VehicleDetailedSlider/partials/Title.tsx +36 -36
- package/compat/VehicleFormattedPrice/VehicleFormattedPrice.styl +148 -148
- package/compat/VehicleFormattedPrice/VehicleFormattedPrice.tsx +163 -163
- package/compat/VehicleSlider/VehicleSlider.styl +62 -62
- package/compat/VehicleSlider/VehicleSlider.tsx +125 -125
- package/compat/VehicleSlider/VehicleSliderForSRL.tsx +175 -175
- package/compat/VehicleSmallCard/SeoText/SeoText.styl +8 -8
- package/compat/VehicleSmallCard/SeoText/SeoText.tsx +16 -16
- package/compat/VehicleSmallCard/VehicleData/VechiclePriceItem/VechiclePriceItem.styl +204 -204
- package/compat/VehicleSmallCard/VehicleData/VechiclePriceItem/VechiclePriceItem.tsx +199 -199
- package/compat/VehicleSmallCard/VehicleData/VehicleInfo/VehicleInfo.styl +273 -273
- package/compat/VehicleSmallCard/VehicleData/VehicleInfo/VehicleInfo.tsx +179 -179
- package/compat/VehicleSmallCard/VehicleData/VehiclePrice/VehiclePrice.styl +165 -165
- package/compat/VehicleSmallCard/VehicleData/VehiclePrice/VehiclePrice.tsx +299 -299
- package/compat/VehicleSmallCard/VehicleData/VehicleProperty/VehicleProperty.styl +32 -32
- package/compat/VehicleSmallCard/VehicleData/VehicleProperty/VehicleProperty.tsx +35 -35
- package/compat/VehicleSmallCard/VehicleData/VehicleTitle/VehicleTitle.styl +135 -135
- package/compat/VehicleSmallCard/VehicleData/VehicleTitle/VehicleTitle.tsx +91 -91
- package/compat/VehicleSmallCard/VehicleSmallCard.styl +309 -309
- package/compat/VehicleSmallCard/VehicleSmallCard.tsx +448 -448
- package/compat/index.ts +77 -77
- package/compat/legacy-theme/mixins.styl +93 -93
- package/compat/legacy-theme/priceReviewColors.styl +12 -12
- package/compat/legacy-theme/slider.global.styl +5 -5
- package/compat/legacy-theme/theme.styl +136 -136
- package/compat/withLabel/withLabel.styl +33 -33
- package/compat/withLabel/withLabel.tsx +44 -44
- package/compat/withStats/withStats.styl +174 -174
- package/compat/withStats/withStats.tsx +238 -238
- package/constants/RateSearchWidget.ts +15 -15
- package/constants/Search.ts +290 -290
- package/constants/SearchWidget.ts +108 -108
- package/constants/app.ts +223 -223
- package/constants/common.ts +127 -127
- package/constants/core.ts +131 -131
- package/constants/highlights.ts +165 -165
- package/constants/price.ts +9 -9
- package/constants/selectors.ts +38 -38
- package/constants.ts +91 -91
- package/data/DataTransformers.ts +88 -88
- package/data/fieldMapping.ts +364 -342
- package/data/toAutobahnCar.ts +455 -442
- package/iconsvg/IconSVG.tsx +30 -30
- package/iconsvg/IconSVGConfig.tsx +768 -768
- package/iconsvg/SVG/AboPartner.tsx +16 -16
- package/iconsvg/SVG/ArrowQuotes.tsx +22 -22
- package/iconsvg/SVG/CloseIcon.tsx +17 -17
- package/iconsvg/SVG/CloseIconSelect.tsx +18 -18
- package/iconsvg/SVG/ClosedLockIcon.tsx +18 -18
- package/iconsvg/SVG/DealerCheckIcon.tsx +18 -18
- package/iconsvg/SVG/DealerPopoverMail.tsx +21 -21
- package/iconsvg/SVG/DealerPopoverPhone.tsx +21 -21
- package/iconsvg/SVG/GrayPhoneIcon.tsx +22 -22
- package/iconsvg/SVG/InternetIcon.tsx +18 -18
- package/iconsvg/SVG/WhiteEnvelopeIcon.tsx +21 -21
- package/iconsvg/SVG/bodyType/Cabrio.tsx +23 -23
- package/iconsvg/SVG/bodyType/Coupe.tsx +22 -22
- package/iconsvg/SVG/bodyType/Minibus.tsx +22 -22
- package/iconsvg/SVG/bodyType/Other.tsx +25 -25
- package/iconsvg/SVG/bodyType/Sedan.tsx +22 -22
- package/iconsvg/SVG/bodyType/SelectorCategoryCombi.tsx +68 -68
- package/iconsvg/SVG/bodyType/SelectorCategoryCompact.tsx +20 -20
- package/iconsvg/SVG/bodyType/SelectorCategoryConvertible.tsx +68 -68
- package/iconsvg/SVG/bodyType/SelectorCategoryCoupe.tsx +60 -60
- package/iconsvg/SVG/bodyType/SelectorCategoryMinibus.tsx +64 -64
- package/iconsvg/SVG/bodyType/SelectorCategoryOther.tsx +60 -60
- package/iconsvg/SVG/bodyType/SelectorCategorySedan.tsx +69 -69
- package/iconsvg/SVG/bodyType/SelectorCategorySuv.tsx +77 -77
- package/iconsvg/SVG/bodyType/SelectorCategoryTransporter.tsx +68 -68
- package/iconsvg/SVG/bodyType/SelectorCategoryVan.tsx +72 -72
- package/iconsvg/SVG/bodyType/Small.tsx +23 -23
- package/iconsvg/SVG/bodyType/Suv.tsx +23 -23
- package/iconsvg/SVG/bodyType/Van.tsx +23 -23
- package/iconsvg/SVG/bodyType/Wagon.tsx +23 -23
- package/iconsvg/SVG/common/AddIcon.tsx +16 -16
- package/iconsvg/SVG/common/AddPlus.tsx +16 -16
- package/iconsvg/SVG/common/AddressDashboard.tsx +29 -29
- package/iconsvg/SVG/common/AddressIcon.tsx +20 -20
- package/iconsvg/SVG/common/ArrowDetailedAccordionBlue.tsx +26 -26
- package/iconsvg/SVG/common/ArrowDownBlue.tsx +21 -21
- package/iconsvg/SVG/common/ArrowSelect.tsx +23 -23
- package/iconsvg/SVG/common/ArrowStepDown.tsx +18 -18
- package/iconsvg/SVG/common/Autocheck.tsx +19 -19
- package/iconsvg/SVG/common/AutodeLogo.tsx +36 -36
- package/iconsvg/SVG/common/Avatar.tsx +17 -17
- package/iconsvg/SVG/common/BellGray.tsx +19 -19
- package/iconsvg/SVG/common/BigInfoTransparent.tsx +13 -13
- package/iconsvg/SVG/common/Browse.tsx +20 -20
- package/iconsvg/SVG/common/Calendar.tsx +24 -24
- package/iconsvg/SVG/common/CallbackDashboard.tsx +30 -30
- package/iconsvg/SVG/common/Camera.tsx +17 -17
- package/iconsvg/SVG/common/Car.tsx +16 -16
- package/iconsvg/SVG/common/CarBody.tsx +19 -19
- package/iconsvg/SVG/common/CarFront.tsx +43 -43
- package/iconsvg/SVG/common/CarInspectionCheck.tsx +21 -21
- package/iconsvg/SVG/common/CarInspectionScheme0.tsx +32 -32
- package/iconsvg/SVG/common/CarInspectionScheme1.tsx +53 -53
- package/iconsvg/SVG/common/CarInspectionScheme2.tsx +52 -52
- package/iconsvg/SVG/common/CarInspectionScheme3.tsx +32 -32
- package/iconsvg/SVG/common/CarInspectionScheme4.tsx +32 -32
- package/iconsvg/SVG/common/CarInspectionScheme5.tsx +32 -32
- package/iconsvg/SVG/common/CarInspectionScheme6.tsx +32 -32
- package/iconsvg/SVG/common/CarInspectionSchemeGeneral copy.tsx +24 -24
- package/iconsvg/SVG/common/CarInspectionSchemeGeneral.tsx +24 -24
- package/iconsvg/SVG/common/CheckBlue.tsx +18 -18
- package/iconsvg/SVG/common/CheckGreen.tsx +22 -22
- package/iconsvg/SVG/common/CheckMark.tsx +16 -16
- package/iconsvg/SVG/common/CheckWhite.tsx +19 -19
- package/iconsvg/SVG/common/Chevron.tsx +17 -17
- package/iconsvg/SVG/common/CircledCheckmark.tsx +25 -25
- package/iconsvg/SVG/common/Clock.tsx +18 -18
- package/iconsvg/SVG/common/Close.tsx +19 -19
- package/iconsvg/SVG/common/CloseGrey.tsx +22 -22
- package/iconsvg/SVG/common/ContactEmail.tsx +21 -21
- package/iconsvg/SVG/common/ContactPhone.tsx +28 -28
- package/iconsvg/SVG/common/CopyIcon copy.tsx +22 -22
- package/iconsvg/SVG/common/CopyIcon.tsx +22 -22
- package/iconsvg/SVG/common/CopyIconForDealer.tsx +21 -21
- package/iconsvg/SVG/common/DashboardIcon.tsx +20 -20
- package/iconsvg/SVG/common/DashboardQuestionMark.tsx +20 -20
- package/iconsvg/SVG/common/DealersIcon.tsx +20 -20
- package/iconsvg/SVG/common/DeleteCircle.tsx +31 -31
- package/iconsvg/SVG/common/DeleteV1Icon.tsx +18 -18
- package/iconsvg/SVG/common/DeliveryDashboard.tsx +25 -25
- package/iconsvg/SVG/common/DeliveryMail.tsx +24 -24
- package/iconsvg/SVG/common/Discount100De.tsx +18 -18
- package/iconsvg/SVG/common/Discount100En.tsx +19 -19
- package/iconsvg/SVG/common/Discount66De.tsx +28 -28
- package/iconsvg/SVG/common/Discount66En.tsx +20 -20
- package/iconsvg/SVG/common/DoneIcon.tsx +18 -18
- package/iconsvg/SVG/common/EditCircle.tsx +32 -32
- package/iconsvg/SVG/common/EditPriceIcon.tsx +20 -20
- package/iconsvg/SVG/common/EuroCurrency.tsx +18 -18
- package/iconsvg/SVG/common/Export.tsx +20 -20
- package/iconsvg/SVG/common/Eye.tsx +17 -17
- package/iconsvg/SVG/common/EyeCatch.tsx +19 -19
- package/iconsvg/SVG/common/FavoritesIcon.tsx +20 -20
- package/iconsvg/SVG/common/FilterRange.tsx +16 -16
- package/iconsvg/SVG/common/FilterToolBlack.tsx +23 -23
- package/iconsvg/SVG/common/FlagDe.tsx +21 -21
- package/iconsvg/SVG/common/FlagEn.tsx +43 -43
- package/iconsvg/SVG/common/GrayEnvelopeIcon.tsx +19 -19
- package/iconsvg/SVG/common/HamburgerMenuIcon.tsx +18 -18
- package/iconsvg/SVG/common/HandingOverDashboard.tsx +32 -32
- package/iconsvg/SVG/common/ImageSettingsIcon.tsx +20 -20
- package/iconsvg/SVG/common/Info.tsx +16 -16
- package/iconsvg/SVG/common/InfoIcon.tsx +17 -17
- package/iconsvg/SVG/common/InfoTransparent.tsx +18 -18
- package/iconsvg/SVG/common/LogoutIcon.tsx +20 -20
- package/iconsvg/SVG/common/MagnifyingGlass.tsx +31 -31
- package/iconsvg/SVG/common/MenuArrow.tsx +16 -16
- package/iconsvg/SVG/common/MenuGrey.tsx +22 -22
- package/iconsvg/SVG/common/MobileDeLogo.tsx +108 -108
- package/iconsvg/SVG/common/MyOrderIcon.tsx +20 -20
- package/iconsvg/SVG/common/MyVehiclesIcon.tsx +20 -20
- package/iconsvg/SVG/common/NewFlagDe.tsx +25 -25
- package/iconsvg/SVG/common/NewFlagEn.tsx +34 -34
- package/iconsvg/SVG/common/OrderReceivedDashboard.tsx +27 -27
- package/iconsvg/SVG/common/Package.tsx +30 -30
- package/iconsvg/SVG/common/Phone.tsx +18 -18
- package/iconsvg/SVG/common/PhoneGrey.tsx +22 -22
- package/iconsvg/SVG/common/PickupDashboard.tsx +30 -30
- package/iconsvg/SVG/common/Picture.tsx +24 -24
- package/iconsvg/SVG/common/Pictures.tsx +32 -32
- package/iconsvg/SVG/common/Plus.tsx +16 -16
- package/iconsvg/SVG/common/PlusNew.tsx +16 -16
- package/iconsvg/SVG/common/PreparationDashboard.tsx +29 -29
- package/iconsvg/SVG/common/ProfileDashboard.tsx +24 -24
- package/iconsvg/SVG/common/ProfileIcon.tsx +17 -17
- package/iconsvg/SVG/common/Question.tsx +19 -19
- package/iconsvg/SVG/common/QuestionBold.tsx +25 -25
- package/iconsvg/SVG/common/RegistrationDashboard.tsx +31 -31
- package/iconsvg/SVG/common/SavedSearchsIcon.tsx +20 -20
- package/iconsvg/SVG/common/Search.tsx +19 -19
- package/iconsvg/SVG/common/SearchGrey.tsx +22 -22
- package/iconsvg/SVG/common/SettingPenIcon.tsx +20 -20
- package/iconsvg/SVG/common/Share.tsx +16 -16
- package/iconsvg/SVG/common/ShoppingCart.tsx +18 -18
- package/iconsvg/SVG/common/SliderArrow.tsx +21 -21
- package/iconsvg/SVG/common/SliderEye.tsx +17 -17
- package/iconsvg/SVG/common/SortUpDownArrows.tsx +18 -18
- package/iconsvg/SVG/common/Speedometer.tsx +23 -23
- package/iconsvg/SVG/common/Star.tsx +20 -20
- package/iconsvg/SVG/common/StarNew.tsx +16 -16
- package/iconsvg/SVG/common/StarOutline.tsx +20 -20
- package/iconsvg/SVG/common/StarRoundedCorners.tsx +18 -18
- package/iconsvg/SVG/common/Stats.tsx +17 -17
- package/iconsvg/SVG/common/Step1.tsx +21 -21
- package/iconsvg/SVG/common/Step2.tsx +20 -20
- package/iconsvg/SVG/common/Step3.tsx +21 -21
- package/iconsvg/SVG/common/SupportCallbackIcon.tsx +20 -20
- package/iconsvg/SVG/common/Telephone.tsx +22 -22
- package/iconsvg/SVG/common/Time.tsx +17 -17
- package/iconsvg/SVG/common/Timetable.tsx +18 -18
- package/iconsvg/SVG/common/Trash.tsx +22 -22
- package/iconsvg/SVG/common/TrashRed.tsx +23 -23
- package/iconsvg/SVG/common/Upload.tsx +17 -17
- package/iconsvg/SVG/common/UserGrey.tsx +22 -22
- package/iconsvg/SVG/common/UserProfileIcon.tsx +20 -20
- package/iconsvg/SVG/common/ValidateFailure.tsx +21 -21
- package/iconsvg/SVG/common/ValidateSuccess.tsx +21 -21
- package/iconsvg/SVG/common/WarningTriangle.tsx +20 -20
- package/iconsvg/SVG/common/WhiteArrowUp.tsx +21 -21
- package/iconsvg/SVG/common/WhiteKey.tsx +21 -21
- package/iconsvg/SVG/common/WhitePeople.tsx +23 -23
- package/iconsvg/SVG/common/WhiteTick.tsx +19 -19
- package/iconsvg/SVG/flags/AT.tsx +19 -19
- package/iconsvg/SVG/flags/BE.tsx +20 -20
- package/iconsvg/SVG/flags/BG.tsx +20 -20
- package/iconsvg/SVG/flags/CH.tsx +22 -22
- package/iconsvg/SVG/flags/CZ.tsx +18 -18
- package/iconsvg/SVG/flags/DE.tsx +18 -18
- package/iconsvg/SVG/flags/DK.tsx +18 -18
- package/iconsvg/SVG/flags/ES.tsx +2585 -2585
- package/iconsvg/SVG/flags/FI.tsx +18 -18
- package/iconsvg/SVG/flags/FR.tsx +20 -20
- package/iconsvg/SVG/flags/GB.tsx +26 -26
- package/iconsvg/SVG/flags/HR.tsx +135 -135
- package/iconsvg/SVG/flags/HU.tsx +20 -20
- package/iconsvg/SVG/flags/IT.tsx +20 -20
- package/iconsvg/SVG/flags/LI.tsx +106 -106
- package/iconsvg/SVG/flags/LU.tsx +18 -18
- package/iconsvg/SVG/flags/NL.tsx +18 -18
- package/iconsvg/SVG/flags/NO.tsx +20 -20
- package/iconsvg/SVG/flags/PL.tsx +19 -19
- package/iconsvg/SVG/flags/RO.tsx +20 -20
- package/iconsvg/SVG/flags/RU.tsx +20 -20
- package/iconsvg/SVG/flags/SE.tsx +20 -20
- package/iconsvg/SVG/flags/SI.tsx +54 -54
- package/iconsvg/SVG/flags/SK.tsx +34 -34
- package/iconsvg/SVG/flags/UA.tsx +19 -19
- package/iconsvg/SVG/infoBlocks/14DaysReturnPolicy.tsx +18 -18
- package/iconsvg/SVG/infoBlocks/AlertInfo.tsx +19 -19
- package/iconsvg/SVG/infoBlocks/Autocheck.tsx +19 -19
- package/iconsvg/SVG/infoBlocks/CheckTheStory.tsx +22 -22
- package/iconsvg/SVG/infoBlocks/CustomerServiceWhite.tsx +16 -16
- package/iconsvg/SVG/infoBlocks/Guarantee.tsx +16 -16
- package/iconsvg/SVG/infoBlocks/OrderWhite.tsx +13 -13
- package/iconsvg/SVG/infoBlocks/PriceGuarantee.tsx +19 -19
- package/iconsvg/SVG/infoBlocks/PriceGuaranteeWhite.tsx +17 -17
- package/iconsvg/SVG/infoBlocks/TransportAndDelivery.tsx +21 -21
- package/iconsvg/SVG/infoBlocks/Warranty.tsx +23 -23
- package/iconsvg/SVG/popower/Mail.tsx +18 -18
- package/iconsvg/SVG/popower/Phone.tsx +19 -19
- package/iconsvg/SVG/popower/Schedule.tsx +18 -18
- package/iconsvg/SVG/searchWidgets/drive/AAllWheelDrive.tsx +26 -26
- package/iconsvg/SVG/searchWidgets/drive/AllWheelDrive.tsx +26 -26
- package/iconsvg/SVG/searchWidgets/drive/FrontWheelDrive.tsx +25 -25
- package/iconsvg/SVG/searchWidgets/drive/OtherWheelDrive.tsx +26 -26
- package/iconsvg/SVG/searchWidgets/drive/RearWheelDrive.tsx +25 -25
- package/iconsvg/SVG/searchWidgets/fuel/FuelDiesel.tsx +18 -18
- package/iconsvg/SVG/searchWidgets/fuel/FuelElectrical.tsx +19 -19
- package/iconsvg/SVG/searchWidgets/fuel/FuelElectricalDiesel.tsx +34 -34
- package/iconsvg/SVG/searchWidgets/fuel/FuelElectricalPetrol.tsx +20 -20
- package/iconsvg/SVG/searchWidgets/fuel/FuelEthanol.tsx +53 -53
- package/iconsvg/SVG/searchWidgets/fuel/FuelHydrogen.tsx +24 -24
- package/iconsvg/SVG/searchWidgets/fuel/FuelLpg.tsx +24 -24
- package/iconsvg/SVG/searchWidgets/fuel/FuelNaturalGas.tsx +23 -23
- package/iconsvg/SVG/searchWidgets/fuel/FuelOther.tsx +28 -28
- package/iconsvg/SVG/searchWidgets/fuel/FuelPetrol.tsx +18 -18
- package/iconsvg/SVG/settings/Account.tsx +17 -17
- package/iconsvg/SVG/settings/DataUsage.tsx +17 -17
- package/iconsvg/SVG/settings/MarketResearch.tsx +17 -17
- package/iconsvg/SVG/settings/Newsletter.tsx +17 -17
- package/iconsvg/SVG/settings/RemoveEye.tsx +17 -17
- package/iconsvg/SVG/settings/RemoveEyeOff.tsx +17 -17
- package/iconsvg/SVG/settings/Security.tsx +17 -17
- package/iconsvg/SVG/settings/Warning.tsx +17 -17
- package/iconsvg/SVG/slider/360.tsx +23 -23
- package/iconsvg/SVG/slider/360New.tsx +20 -20
- package/iconsvg/SVG/slider/Checked.tsx +19 -19
- package/iconsvg/SVG/slider/DiscountRibbon.tsx +51 -51
- package/iconsvg/SVG/slider/DiscountRibbonMobile.tsx +47 -47
- package/iconsvg/SVG/slider/DiscountRibbonNew.tsx +29 -29
- package/iconsvg/SVG/slider/Easy.tsx +19 -19
- package/iconsvg/SVG/slider/Fullscreen.tsx +16 -16
- package/iconsvg/SVG/slider/FullscreenWindow.tsx +23 -23
- package/iconsvg/SVG/slider/Safe.tsx +19 -19
- package/iconsvg/SVG/slider/ToBuy.tsx +19 -19
- package/iconsvg/SVG/slider/YoutubeButton.tsx +26 -26
- package/iconsvg/SVG/slider/ZoomIn.tsx +21 -21
- package/iconsvg/SVG/slider/ZoomOut.tsx +21 -21
- package/iconsvg/SVG/social/AndroidLogo.tsx +18 -18
- package/iconsvg/SVG/social/Apple.tsx +19 -19
- package/iconsvg/SVG/social/FacebookF.tsx +19 -19
- package/iconsvg/SVG/social/GooglePlusG.tsx +19 -19
- package/iconsvg/SVG/social/Instagram.tsx +17 -17
- package/iconsvg/SVG/social/Pinterest.tsx +19 -19
- package/iconsvg/SVG/social/SharingInterface.tsx +21 -21
- package/iconsvg/SVG/social/Twitter.tsx +19 -19
- package/iconsvg/SVG/social/Youtube.tsx +19 -19
- package/iconsvg/SVG/vehicle/AboIcon.tsx +11 -11
- package/iconsvg/SVG/vehicle/Abs.tsx +24 -24
- package/iconsvg/SVG/vehicle/AirCond.tsx +34 -34
- package/iconsvg/SVG/vehicle/Airbag.tsx +21 -21
- package/iconsvg/SVG/vehicle/AuxiliaryHeating.tsx +23 -23
- package/iconsvg/SVG/vehicle/Bluetooth.tsx +22 -22
- package/iconsvg/SVG/vehicle/BuyIcon.tsx +15 -15
- package/iconsvg/SVG/vehicle/CarAvailability.tsx +22 -22
- package/iconsvg/SVG/vehicle/CarInspectionCheck.tsx +21 -21
- package/iconsvg/SVG/vehicle/CarInspectionCross.tsx +21 -21
- package/iconsvg/SVG/vehicle/CheckoutChecked.tsx +15 -15
- package/iconsvg/SVG/vehicle/Co2.tsx +24 -24
- package/iconsvg/SVG/vehicle/CruiseControl.tsx +25 -25
- package/iconsvg/SVG/vehicle/Date.tsx +21 -21
- package/iconsvg/SVG/vehicle/Delivery.tsx +12 -12
- package/iconsvg/SVG/vehicle/Diesel.tsx +28 -28
- package/iconsvg/SVG/vehicle/Display.tsx +25 -25
- package/iconsvg/SVG/vehicle/Done.tsx +11 -11
- package/iconsvg/SVG/vehicle/Door.tsx +19 -19
- package/iconsvg/SVG/vehicle/DoubleDone.tsx +18 -18
- package/iconsvg/SVG/vehicle/EditIcon.tsx +11 -11
- package/iconsvg/SVG/vehicle/EmergencyBrakeAssistant.tsx +27 -27
- package/iconsvg/SVG/vehicle/Eps.tsx +24 -24
- package/iconsvg/SVG/vehicle/Esp.tsx +24 -24
- package/iconsvg/SVG/vehicle/FinancingIcon.tsx +20 -20
- package/iconsvg/SVG/vehicle/FuelConsumption.tsx +20 -20
- package/iconsvg/SVG/vehicle/Fueling.tsx +22 -22
- package/iconsvg/SVG/vehicle/FullDrive.tsx +24 -24
- package/iconsvg/SVG/vehicle/GasElectric.tsx +28 -28
- package/iconsvg/SVG/vehicle/HandsFreePhoneSystem.tsx +24 -24
- package/iconsvg/SVG/vehicle/Kw.tsx +23 -23
- package/iconsvg/SVG/vehicle/LastCrawledAt.tsx +22 -22
- package/iconsvg/SVG/vehicle/LeasingIcon.tsx +14 -14
- package/iconsvg/SVG/vehicle/Led.tsx +24 -24
- package/iconsvg/SVG/vehicle/LightSensor.tsx +22 -22
- package/iconsvg/SVG/vehicle/LinkAlternative.tsx +15 -15
- package/iconsvg/SVG/vehicle/Location.tsx +17 -17
- package/iconsvg/SVG/vehicle/MinusIcon.tsx +11 -11
- package/iconsvg/SVG/vehicle/Mirror.tsx +19 -19
- package/iconsvg/SVG/vehicle/Navigation.tsx +27 -27
- package/iconsvg/SVG/vehicle/NewCar.tsx +21 -21
- package/iconsvg/SVG/vehicle/NoImage.tsx +17 -17
- package/iconsvg/SVG/vehicle/Owner.tsx +18 -18
- package/iconsvg/SVG/vehicle/PanoramicRoof.tsx +23 -23
- package/iconsvg/SVG/vehicle/ParkingAssistants.tsx +24 -24
- package/iconsvg/SVG/vehicle/PickYourself.tsx +18 -18
- package/iconsvg/SVG/vehicle/PlusIcon.tsx +11 -11
- package/iconsvg/SVG/vehicle/Power.tsx +21 -21
- package/iconsvg/SVG/vehicle/Ps.tsx +19 -19
- package/iconsvg/SVG/vehicle/Question.tsx +24 -24
- package/iconsvg/SVG/vehicle/Seats.tsx +21 -21
- package/iconsvg/SVG/vehicle/SeatsHeating.tsx +26 -26
- package/iconsvg/SVG/vehicle/SelectorGearboxAutomatic.tsx +24 -24
- package/iconsvg/SVG/vehicle/SelectorGearboxManualShift.tsx +19 -19
- package/iconsvg/SVG/vehicle/SelectorGearboxOther.tsx +24 -24
- package/iconsvg/SVG/vehicle/SelectorGearboxSemiAutomatic.tsx +30 -30
- package/iconsvg/SVG/vehicle/SelectorInteriorTypeAlcantara.tsx +225 -225
- package/iconsvg/SVG/vehicle/SelectorInteriorTypeFabric.tsx +29 -29
- package/iconsvg/SVG/vehicle/SelectorInteriorTypeFullLeather.tsx +29 -29
- package/iconsvg/SVG/vehicle/SelectorInteriorTypeOther.tsx +26 -26
- package/iconsvg/SVG/vehicle/SelectorInteriorTypePartLeather.tsx +142 -142
- package/iconsvg/SVG/vehicle/SelectorInteriorTypeSyntheticLeather.tsx +27 -27
- package/iconsvg/SVG/vehicle/SelectorInteriorTypeVelours.tsx +39 -39
- package/iconsvg/SVG/vehicle/Shield.tsx +39 -39
- package/iconsvg/SVG/vehicle/Speedometer.tsx +17 -17
- package/iconsvg/SVG/vehicle/StartStopSystem.tsx +30 -30
- package/iconsvg/SVG/vehicle/Stop.tsx +25 -25
- package/iconsvg/SVG/vehicle/TickMark.tsx +21 -21
- package/iconsvg/SVG/vehicle/TrafficSignRecognition.tsx +29 -29
- package/iconsvg/SVG/vehicle/TrailerCoupling.tsx +24 -24
- package/iconsvg/SVG/vehicle/Transmission.tsx +27 -27
- package/iconsvg/SVG/vehicle/Wheel.tsx +43 -43
- package/iconsvg/SVG/vehicle/Wipers.tsx +22 -22
- package/iconsvg/SVG/vehicle/Wrench.tsx +17 -17
- package/iconsvg/index.ts +7 -7
- package/index.ts +18 -18
- package/locales/de/autobahn.json +676 -671
- package/locales/en/autobahn.json +676 -671
- package/locales/legacy/SearchDetailedPage.ts +205 -205
- package/locales/legacy/cbd.ts +719 -719
- package/locales/legacy/common.ts +109 -109
- package/locales/legacy/data.ts +1118 -1118
- package/locales/legacy/priceRating.ts +10 -10
- package/locales/legacy/sortingOptions.ts +21 -21
- package/media/images/raiting-stars-min.svg +7 -7
- package/media/images/refresh-button.svg +49 -49
- package/media/images/user-icon.svg +16 -16
- package/media/svg/infoBlocks/whyAutodeIconSet-F.svg +9 -9
- package/media/svg/infoBlocks/whyAutodeIconSet-G.svg +8 -8
- package/media/svg/infoBlocks/whyAutodeIconSet-Q.svg +6 -6
- package/media/svg/infoBlocks/whyAutodeIconSet-R.svg +9 -9
- package/media/svg/usp/icon1.svg +16 -16
- package/media/svg/usp/icon2.svg +13 -13
- package/media/svg/usp/icon3.svg +10 -10
- package/media/svg/usp/icon4.svg +14 -14
- package/package.json +30 -30
- package/schemes/AggregationScheme.ts +73 -73
- package/searchFilters/filterOptions.ts +119 -119
- package/searchFilters/filterProps.ts +35 -35
- package/searchFilters/index.ts +15 -15
- package/theme/autobahn.css +25 -25
- package/theme/colors_and_type.css +113 -113
- package/theme/md3.css +2045 -2034
- package/types/types.ts +373 -373
- package/types.ts +8 -8
- package/ui/Accordion.tsx +134 -134
- package/ui/Button.tsx +62 -62
- package/ui/CardCarousel.tsx +133 -133
- package/ui/Chip.tsx +29 -29
- package/ui/DatePicker.tsx +145 -145
- package/ui/Dropdown.tsx +205 -205
- package/ui/FileUpload.tsx +154 -154
- package/ui/FormCheckbox.tsx +79 -79
- package/ui/FormDropdown.tsx +327 -327
- package/ui/FormField.tsx +88 -88
- package/ui/FormRadio.tsx +93 -93
- package/ui/FormRadioGroup.tsx +106 -106
- package/ui/Icon.tsx +391 -391
- package/ui/IconButton.tsx +44 -44
- package/ui/Modal.tsx +187 -187
- package/ui/Pagination.tsx +140 -140
- package/ui/Price.tsx +25 -25
- package/ui/PriceEvalBar.tsx +48 -48
- package/ui/SaveChip.tsx +34 -34
- package/ui/Segmented.tsx +48 -48
- package/ui/Skeleton.tsx +75 -75
- package/ui/Spec.tsx +24 -24
- package/ui/Stars.tsx +29 -29
- package/ui/StatChip.tsx +21 -21
- package/ui/Stepper.tsx +106 -106
- package/ui/Switch.tsx +65 -65
- package/ui/Table.tsx +156 -156
- package/ui/Textarea.tsx +58 -58
- package/ui/index.ts +88 -88
- package/utils/CommonUtils.ts +648 -648
- package/utils/DateUtils.ts +101 -101
- package/utils/index.ts +74 -74
- package/utils/power.ts +11 -11
- package/utils/query.ts +21 -21
- package/vdp/FinanceCalculator.tsx +465 -465
- package/vdp/VdpModules.tsx +1490 -1490
- package/vdp/VdpViewer.tsx +209 -209
- package/vdp/index.ts +75 -75
- package/vdp/types.ts +197 -197
- package/vehiclesProps/cbdSelectors.ts +117 -117
- package/vehiclesProps/decoratedLightProps.tsx +572 -572
- package/vehiclesProps/decoratedProps.tsx +1746 -1746
- package/vehiclesProps/equipment.ts +129 -129
- package/vehiclesProps/vehicleDetails.ts +428 -428
- package/widgets/SearchBox.tsx +256 -256
- package/widgets/index.ts +5 -5
package/ui/Pagination.tsx
CHANGED
|
@@ -1,140 +1,140 @@
|
|
|
1
|
-
// Autobahn (auto.de redesign) — md3 pager.
|
|
2
|
-
//
|
|
3
|
-
// Drop-in visual replacement for the legacy components/ui/Pagination/Pagination. Same prop
|
|
4
|
-
// surface (t, className?, totalPages, step?, currentPage?, changePage?) and the SAME click
|
|
5
|
-
// behaviour: the target page is clamped into [1, totalPages] before changePage() fires, so the
|
|
6
|
-
// existing Mitarbeiter (DealerEmployeesPage) / MyVehicles (MyVehiclesPage) callers work unchanged.
|
|
7
|
-
//
|
|
8
|
-
// Visual upgrade over the legacy 3-button strip: a real md3 pager with a prev/next pill plus
|
|
9
|
-
// numbered page buttons (current = filled primary) and ellipsis when the range is long.
|
|
10
|
-
//
|
|
11
|
-
// Pure/presentational — no store/API/window. Renders correctly only inside a `<div className="md3">`
|
|
12
|
-
// subtree (scoped theme); all classes use the `mpag-` prefix.
|
|
13
|
-
|
|
14
|
-
import * as React from 'react';
|
|
15
|
-
|
|
16
|
-
import Icon from './Icon';
|
|
17
|
-
|
|
18
|
-
export interface PaginationProps {
|
|
19
|
-
/** i18n translate — supplies the prev/next labels via common:goBack / common:goForward (legacy keys). */
|
|
20
|
-
t: (key: string, options?: object) => string;
|
|
21
|
-
/** total number of pages. */
|
|
22
|
-
totalPages: number;
|
|
23
|
-
/** 1-based current page. */
|
|
24
|
-
currentPage?: number;
|
|
25
|
-
/** fired with the chosen (clamped) 1-based page. */
|
|
26
|
-
changePage?: (page: number) => void;
|
|
27
|
-
/** kept for legacy prop-surface parity (unused by the md3 pager). */
|
|
28
|
-
step?: number;
|
|
29
|
-
/** extra class on the wrapper. */
|
|
30
|
-
className?: string;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// How many numbered buttons to show before collapsing the middle into ellipsis.
|
|
34
|
-
// Window = first, last, current, and one neighbour each side (+ up to two ellipsis slots).
|
|
35
|
-
const SIBLINGS = 1;
|
|
36
|
-
const ELLIPSIS = 'ellipsis';
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Build the list of page tokens to render: numbers and 'ellipsis' gaps.
|
|
40
|
-
* Always includes page 1 and totalPages; collapses long runs around the current page.
|
|
41
|
-
*/
|
|
42
|
-
function buildRange(currentPage: number, totalPages: number): Array<number | typeof ELLIPSIS> {
|
|
43
|
-
// Small enough to show every page (first + last + 2*siblings + 2 ellipsis-or-page slots).
|
|
44
|
-
if (totalPages <= SIBLINGS * 2 + 5) {
|
|
45
|
-
const all: Array<number | typeof ELLIPSIS> = [];
|
|
46
|
-
for (let p = 1; p <= totalPages; p += 1) all.push(p);
|
|
47
|
-
return all;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const left = Math.max(currentPage - SIBLINGS, 1);
|
|
51
|
-
const right = Math.min(currentPage + SIBLINGS, totalPages);
|
|
52
|
-
const showLeftEllipsis = left > 2;
|
|
53
|
-
const showRightEllipsis = right < totalPages - 1;
|
|
54
|
-
|
|
55
|
-
const range: Array<number | typeof ELLIPSIS> = [1];
|
|
56
|
-
// If there is no left gap, fill pages 2..left so the run stays contiguous.
|
|
57
|
-
if (showLeftEllipsis) range.push(ELLIPSIS);
|
|
58
|
-
else for (let p = 2; p < left; p += 1) range.push(p);
|
|
59
|
-
|
|
60
|
-
for (let p = left; p <= right; p += 1) if (p !== 1 && p !== totalPages) range.push(p);
|
|
61
|
-
|
|
62
|
-
if (showRightEllipsis) range.push(ELLIPSIS);
|
|
63
|
-
else for (let p = right + 1; p < totalPages; p += 1) range.push(p);
|
|
64
|
-
|
|
65
|
-
range.push(totalPages);
|
|
66
|
-
return range;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const Pagination: React.FunctionComponent<PaginationProps> = ({
|
|
70
|
-
t,
|
|
71
|
-
totalPages,
|
|
72
|
-
currentPage = 1,
|
|
73
|
-
changePage,
|
|
74
|
-
className,
|
|
75
|
-
}) => {
|
|
76
|
-
if (!totalPages || totalPages < 1) return null;
|
|
77
|
-
|
|
78
|
-
// Clamp into [1, totalPages] exactly like the legacy onButtonClick, then notify.
|
|
79
|
-
const go = (value: number) => {
|
|
80
|
-
if (!changePage) return;
|
|
81
|
-
let computed = value < 1 ? 1 : value;
|
|
82
|
-
computed = computed > totalPages ? totalPages : computed;
|
|
83
|
-
changePage(computed);
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
const backDisabled = currentPage <= 1;
|
|
87
|
-
const forwardDisabled = currentPage >= totalPages;
|
|
88
|
-
const wrapCls = ['mpag', className].filter(Boolean).join(' ');
|
|
89
|
-
|
|
90
|
-
const tokens = buildRange(currentPage, totalPages);
|
|
91
|
-
|
|
92
|
-
return (
|
|
93
|
-
<nav className={wrapCls} role="navigation" aria-label="Pagination">
|
|
94
|
-
<button
|
|
95
|
-
type="button"
|
|
96
|
-
className="mpag-edge mpag-edge--prev"
|
|
97
|
-
disabled={backDisabled}
|
|
98
|
-
aria-label={t('common:goBack')}
|
|
99
|
-
onClick={() => go(currentPage - 1)}
|
|
100
|
-
>
|
|
101
|
-
<Icon name="chevron-left" size={18} />
|
|
102
|
-
<span className="mpag-edge-label">{t('common:goBack')}</span>
|
|
103
|
-
</button>
|
|
104
|
-
|
|
105
|
-
<ul className="mpag-list">
|
|
106
|
-
{tokens.map((tok, i) =>
|
|
107
|
-
tok === ELLIPSIS ? (
|
|
108
|
-
<li key={`e${i}`} className="mpag-gap" aria-hidden="true">
|
|
109
|
-
…
|
|
110
|
-
</li>
|
|
111
|
-
) : (
|
|
112
|
-
<li key={tok}>
|
|
113
|
-
<button
|
|
114
|
-
type="button"
|
|
115
|
-
className={'mpag-page' + (tok === currentPage ? ' is-current' : '')}
|
|
116
|
-
aria-current={tok === currentPage ? 'page' : undefined}
|
|
117
|
-
onClick={() => go(tok)}
|
|
118
|
-
>
|
|
119
|
-
<span className="num">{tok}</span>
|
|
120
|
-
</button>
|
|
121
|
-
</li>
|
|
122
|
-
),
|
|
123
|
-
)}
|
|
124
|
-
</ul>
|
|
125
|
-
|
|
126
|
-
<button
|
|
127
|
-
type="button"
|
|
128
|
-
className="mpag-edge mpag-edge--next"
|
|
129
|
-
disabled={forwardDisabled}
|
|
130
|
-
aria-label={t('common:goForward')}
|
|
131
|
-
onClick={() => go(currentPage + 1)}
|
|
132
|
-
>
|
|
133
|
-
<span className="mpag-edge-label">{t('common:goForward')}</span>
|
|
134
|
-
<Icon name="chevron-right" size={18} />
|
|
135
|
-
</button>
|
|
136
|
-
</nav>
|
|
137
|
-
);
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
export default Pagination;
|
|
1
|
+
// Autobahn (auto.de redesign) — md3 pager.
|
|
2
|
+
//
|
|
3
|
+
// Drop-in visual replacement for the legacy components/ui/Pagination/Pagination. Same prop
|
|
4
|
+
// surface (t, className?, totalPages, step?, currentPage?, changePage?) and the SAME click
|
|
5
|
+
// behaviour: the target page is clamped into [1, totalPages] before changePage() fires, so the
|
|
6
|
+
// existing Mitarbeiter (DealerEmployeesPage) / MyVehicles (MyVehiclesPage) callers work unchanged.
|
|
7
|
+
//
|
|
8
|
+
// Visual upgrade over the legacy 3-button strip: a real md3 pager with a prev/next pill plus
|
|
9
|
+
// numbered page buttons (current = filled primary) and ellipsis when the range is long.
|
|
10
|
+
//
|
|
11
|
+
// Pure/presentational — no store/API/window. Renders correctly only inside a `<div className="md3">`
|
|
12
|
+
// subtree (scoped theme); all classes use the `mpag-` prefix.
|
|
13
|
+
|
|
14
|
+
import * as React from 'react';
|
|
15
|
+
|
|
16
|
+
import Icon from './Icon';
|
|
17
|
+
|
|
18
|
+
export interface PaginationProps {
|
|
19
|
+
/** i18n translate — supplies the prev/next labels via common:goBack / common:goForward (legacy keys). */
|
|
20
|
+
t: (key: string, options?: object) => string;
|
|
21
|
+
/** total number of pages. */
|
|
22
|
+
totalPages: number;
|
|
23
|
+
/** 1-based current page. */
|
|
24
|
+
currentPage?: number;
|
|
25
|
+
/** fired with the chosen (clamped) 1-based page. */
|
|
26
|
+
changePage?: (page: number) => void;
|
|
27
|
+
/** kept for legacy prop-surface parity (unused by the md3 pager). */
|
|
28
|
+
step?: number;
|
|
29
|
+
/** extra class on the wrapper. */
|
|
30
|
+
className?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// How many numbered buttons to show before collapsing the middle into ellipsis.
|
|
34
|
+
// Window = first, last, current, and one neighbour each side (+ up to two ellipsis slots).
|
|
35
|
+
const SIBLINGS = 1;
|
|
36
|
+
const ELLIPSIS = 'ellipsis';
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Build the list of page tokens to render: numbers and 'ellipsis' gaps.
|
|
40
|
+
* Always includes page 1 and totalPages; collapses long runs around the current page.
|
|
41
|
+
*/
|
|
42
|
+
function buildRange(currentPage: number, totalPages: number): Array<number | typeof ELLIPSIS> {
|
|
43
|
+
// Small enough to show every page (first + last + 2*siblings + 2 ellipsis-or-page slots).
|
|
44
|
+
if (totalPages <= SIBLINGS * 2 + 5) {
|
|
45
|
+
const all: Array<number | typeof ELLIPSIS> = [];
|
|
46
|
+
for (let p = 1; p <= totalPages; p += 1) all.push(p);
|
|
47
|
+
return all;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const left = Math.max(currentPage - SIBLINGS, 1);
|
|
51
|
+
const right = Math.min(currentPage + SIBLINGS, totalPages);
|
|
52
|
+
const showLeftEllipsis = left > 2;
|
|
53
|
+
const showRightEllipsis = right < totalPages - 1;
|
|
54
|
+
|
|
55
|
+
const range: Array<number | typeof ELLIPSIS> = [1];
|
|
56
|
+
// If there is no left gap, fill pages 2..left so the run stays contiguous.
|
|
57
|
+
if (showLeftEllipsis) range.push(ELLIPSIS);
|
|
58
|
+
else for (let p = 2; p < left; p += 1) range.push(p);
|
|
59
|
+
|
|
60
|
+
for (let p = left; p <= right; p += 1) if (p !== 1 && p !== totalPages) range.push(p);
|
|
61
|
+
|
|
62
|
+
if (showRightEllipsis) range.push(ELLIPSIS);
|
|
63
|
+
else for (let p = right + 1; p < totalPages; p += 1) range.push(p);
|
|
64
|
+
|
|
65
|
+
range.push(totalPages);
|
|
66
|
+
return range;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const Pagination: React.FunctionComponent<PaginationProps> = ({
|
|
70
|
+
t,
|
|
71
|
+
totalPages,
|
|
72
|
+
currentPage = 1,
|
|
73
|
+
changePage,
|
|
74
|
+
className,
|
|
75
|
+
}) => {
|
|
76
|
+
if (!totalPages || totalPages < 1) return null;
|
|
77
|
+
|
|
78
|
+
// Clamp into [1, totalPages] exactly like the legacy onButtonClick, then notify.
|
|
79
|
+
const go = (value: number) => {
|
|
80
|
+
if (!changePage) return;
|
|
81
|
+
let computed = value < 1 ? 1 : value;
|
|
82
|
+
computed = computed > totalPages ? totalPages : computed;
|
|
83
|
+
changePage(computed);
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const backDisabled = currentPage <= 1;
|
|
87
|
+
const forwardDisabled = currentPage >= totalPages;
|
|
88
|
+
const wrapCls = ['mpag', className].filter(Boolean).join(' ');
|
|
89
|
+
|
|
90
|
+
const tokens = buildRange(currentPage, totalPages);
|
|
91
|
+
|
|
92
|
+
return (
|
|
93
|
+
<nav className={wrapCls} role="navigation" aria-label="Pagination">
|
|
94
|
+
<button
|
|
95
|
+
type="button"
|
|
96
|
+
className="mpag-edge mpag-edge--prev"
|
|
97
|
+
disabled={backDisabled}
|
|
98
|
+
aria-label={t('common:goBack')}
|
|
99
|
+
onClick={() => go(currentPage - 1)}
|
|
100
|
+
>
|
|
101
|
+
<Icon name="chevron-left" size={18} />
|
|
102
|
+
<span className="mpag-edge-label">{t('common:goBack')}</span>
|
|
103
|
+
</button>
|
|
104
|
+
|
|
105
|
+
<ul className="mpag-list">
|
|
106
|
+
{tokens.map((tok, i) =>
|
|
107
|
+
tok === ELLIPSIS ? (
|
|
108
|
+
<li key={`e${i}`} className="mpag-gap" aria-hidden="true">
|
|
109
|
+
…
|
|
110
|
+
</li>
|
|
111
|
+
) : (
|
|
112
|
+
<li key={tok}>
|
|
113
|
+
<button
|
|
114
|
+
type="button"
|
|
115
|
+
className={'mpag-page' + (tok === currentPage ? ' is-current' : '')}
|
|
116
|
+
aria-current={tok === currentPage ? 'page' : undefined}
|
|
117
|
+
onClick={() => go(tok)}
|
|
118
|
+
>
|
|
119
|
+
<span className="num">{tok}</span>
|
|
120
|
+
</button>
|
|
121
|
+
</li>
|
|
122
|
+
),
|
|
123
|
+
)}
|
|
124
|
+
</ul>
|
|
125
|
+
|
|
126
|
+
<button
|
|
127
|
+
type="button"
|
|
128
|
+
className="mpag-edge mpag-edge--next"
|
|
129
|
+
disabled={forwardDisabled}
|
|
130
|
+
aria-label={t('common:goForward')}
|
|
131
|
+
onClick={() => go(currentPage + 1)}
|
|
132
|
+
>
|
|
133
|
+
<span className="mpag-edge-label">{t('common:goForward')}</span>
|
|
134
|
+
<Icon name="chevron-right" size={18} />
|
|
135
|
+
</button>
|
|
136
|
+
</nav>
|
|
137
|
+
);
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
export default Pagination;
|
package/ui/Price.tsx
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
|
|
3
|
-
export interface PriceProps {
|
|
4
|
-
/** price in EUR; formatted with the de-DE locale. */
|
|
5
|
-
value: number;
|
|
6
|
-
size?: number;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
/** Price in strong neutral text (modern) — no green spam. */
|
|
10
|
-
const Price: React.FunctionComponent<PriceProps> = ({ value, size = 26 }) => (
|
|
11
|
-
<span
|
|
12
|
-
className="num"
|
|
13
|
-
style={{
|
|
14
|
-
fontWeight: 700,
|
|
15
|
-
fontSize: size,
|
|
16
|
-
color: 'var(--md-on-surface)',
|
|
17
|
-
letterSpacing: '-.5px',
|
|
18
|
-
whiteSpace: 'nowrap',
|
|
19
|
-
}}
|
|
20
|
-
>
|
|
21
|
-
{value.toLocaleString('de-DE')} €
|
|
22
|
-
</span>
|
|
23
|
-
);
|
|
24
|
-
|
|
25
|
-
export default Price;
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
export interface PriceProps {
|
|
4
|
+
/** price in EUR; formatted with the de-DE locale. */
|
|
5
|
+
value: number;
|
|
6
|
+
size?: number;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/** Price in strong neutral text (modern) — no green spam. */
|
|
10
|
+
const Price: React.FunctionComponent<PriceProps> = ({ value, size = 26 }) => (
|
|
11
|
+
<span
|
|
12
|
+
className="num"
|
|
13
|
+
style={{
|
|
14
|
+
fontWeight: 700,
|
|
15
|
+
fontSize: size,
|
|
16
|
+
color: 'var(--md-on-surface)',
|
|
17
|
+
letterSpacing: '-.5px',
|
|
18
|
+
whiteSpace: 'nowrap',
|
|
19
|
+
}}
|
|
20
|
+
>
|
|
21
|
+
{value.toLocaleString('de-DE')} €
|
|
22
|
+
</span>
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
export default Price;
|
package/ui/PriceEvalBar.tsx
CHANGED
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
|
|
3
|
-
import { TIER_COLORS, TIER_LABELS, RatingTier } from '../constants';
|
|
4
|
-
|
|
5
|
-
export interface PriceEvalBarProps {
|
|
6
|
-
/** price tier 0 (Top) … 4 (Hoch). */
|
|
7
|
-
tier?: RatingTier;
|
|
8
|
-
/** thinner bar (6px instead of 8px). */
|
|
9
|
-
compact?: boolean;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Preisbewertung mini bar — the trust signal: green→red gradient with a marker
|
|
14
|
-
* at the car's tier. Colors/labels come from the shared autobahn constants.
|
|
15
|
-
*/
|
|
16
|
-
const PriceEvalBar: React.FunctionComponent<PriceEvalBarProps> = ({ tier = 1, compact }) => (
|
|
17
|
-
<div style={{ width: '100%' }}>
|
|
18
|
-
<div
|
|
19
|
-
style={{
|
|
20
|
-
position: 'relative',
|
|
21
|
-
display: 'flex',
|
|
22
|
-
height: compact ? 6 : 8,
|
|
23
|
-
borderRadius: 'var(--md-r-full)',
|
|
24
|
-
overflow: 'hidden',
|
|
25
|
-
}}
|
|
26
|
-
aria-label={TIER_LABELS[tier]}
|
|
27
|
-
>
|
|
28
|
-
{TIER_COLORS.map((c, i) => (
|
|
29
|
-
<div key={i} style={{ flex: 1, background: c, opacity: i === tier ? 1 : 0.32 }} />
|
|
30
|
-
))}
|
|
31
|
-
<span
|
|
32
|
-
style={{
|
|
33
|
-
position: 'absolute',
|
|
34
|
-
top: '50%',
|
|
35
|
-
left: `calc(${(tier + 0.5) * 20}% - 6px)`,
|
|
36
|
-
transform: 'translateY(-50%)',
|
|
37
|
-
width: 12,
|
|
38
|
-
height: 12,
|
|
39
|
-
borderRadius: '50%',
|
|
40
|
-
background: '#fff',
|
|
41
|
-
boxShadow: '0 0 0 3px ' + TIER_COLORS[tier],
|
|
42
|
-
}}
|
|
43
|
-
/>
|
|
44
|
-
</div>
|
|
45
|
-
</div>
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
export default PriceEvalBar;
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
import { TIER_COLORS, TIER_LABELS, RatingTier } from '../constants';
|
|
4
|
+
|
|
5
|
+
export interface PriceEvalBarProps {
|
|
6
|
+
/** price tier 0 (Top) … 4 (Hoch). */
|
|
7
|
+
tier?: RatingTier;
|
|
8
|
+
/** thinner bar (6px instead of 8px). */
|
|
9
|
+
compact?: boolean;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Preisbewertung mini bar — the trust signal: green→red gradient with a marker
|
|
14
|
+
* at the car's tier. Colors/labels come from the shared autobahn constants.
|
|
15
|
+
*/
|
|
16
|
+
const PriceEvalBar: React.FunctionComponent<PriceEvalBarProps> = ({ tier = 1, compact }) => (
|
|
17
|
+
<div style={{ width: '100%' }}>
|
|
18
|
+
<div
|
|
19
|
+
style={{
|
|
20
|
+
position: 'relative',
|
|
21
|
+
display: 'flex',
|
|
22
|
+
height: compact ? 6 : 8,
|
|
23
|
+
borderRadius: 'var(--md-r-full)',
|
|
24
|
+
overflow: 'hidden',
|
|
25
|
+
}}
|
|
26
|
+
aria-label={TIER_LABELS[tier]}
|
|
27
|
+
>
|
|
28
|
+
{TIER_COLORS.map((c, i) => (
|
|
29
|
+
<div key={i} style={{ flex: 1, background: c, opacity: i === tier ? 1 : 0.32 }} />
|
|
30
|
+
))}
|
|
31
|
+
<span
|
|
32
|
+
style={{
|
|
33
|
+
position: 'absolute',
|
|
34
|
+
top: '50%',
|
|
35
|
+
left: `calc(${(tier + 0.5) * 20}% - 6px)`,
|
|
36
|
+
transform: 'translateY(-50%)',
|
|
37
|
+
width: 12,
|
|
38
|
+
height: 12,
|
|
39
|
+
borderRadius: '50%',
|
|
40
|
+
background: '#fff',
|
|
41
|
+
boxShadow: '0 0 0 3px ' + TIER_COLORS[tier],
|
|
42
|
+
}}
|
|
43
|
+
/>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
export default PriceEvalBar;
|
package/ui/SaveChip.tsx
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { TranslationFunction } from '../types';
|
|
3
|
-
|
|
4
|
-
import Icon from './Icon';
|
|
5
|
-
|
|
6
|
-
export interface SaveChipProps {
|
|
7
|
-
/** amount saved in EUR; formatted with the de-DE locale. */
|
|
8
|
-
amount: number;
|
|
9
|
-
t: TranslationFunction;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/** Savings chip (deal accent — used sparingly). */
|
|
13
|
-
const SaveChip: React.FunctionComponent<SaveChipProps> = ({ amount, t }) => (
|
|
14
|
-
<span
|
|
15
|
-
style={{
|
|
16
|
-
display: 'inline-flex',
|
|
17
|
-
alignItems: 'center',
|
|
18
|
-
gap: 5,
|
|
19
|
-
height: 26,
|
|
20
|
-
padding: '0 11px',
|
|
21
|
-
borderRadius: 'var(--md-r-full)',
|
|
22
|
-
background: 'var(--md-good)',
|
|
23
|
-
color: '#fff',
|
|
24
|
-
fontSize: 12.5,
|
|
25
|
-
fontWeight: 700,
|
|
26
|
-
whiteSpace: 'nowrap',
|
|
27
|
-
}}
|
|
28
|
-
>
|
|
29
|
-
<Icon name="trending-down" size={14} stroke={2.4} />
|
|
30
|
-
{t('autobahn:card.price.savedAmount', { amount: amount.toLocaleString('de-DE') })}
|
|
31
|
-
</span>
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
export default SaveChip;
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { TranslationFunction } from '../types';
|
|
3
|
+
|
|
4
|
+
import Icon from './Icon';
|
|
5
|
+
|
|
6
|
+
export interface SaveChipProps {
|
|
7
|
+
/** amount saved in EUR; formatted with the de-DE locale. */
|
|
8
|
+
amount: number;
|
|
9
|
+
t: TranslationFunction;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Savings chip (deal accent — used sparingly). */
|
|
13
|
+
const SaveChip: React.FunctionComponent<SaveChipProps> = ({ amount, t }) => (
|
|
14
|
+
<span
|
|
15
|
+
style={{
|
|
16
|
+
display: 'inline-flex',
|
|
17
|
+
alignItems: 'center',
|
|
18
|
+
gap: 5,
|
|
19
|
+
height: 26,
|
|
20
|
+
padding: '0 11px',
|
|
21
|
+
borderRadius: 'var(--md-r-full)',
|
|
22
|
+
background: 'var(--md-good)',
|
|
23
|
+
color: '#fff',
|
|
24
|
+
fontSize: 12.5,
|
|
25
|
+
fontWeight: 700,
|
|
26
|
+
whiteSpace: 'nowrap',
|
|
27
|
+
}}
|
|
28
|
+
>
|
|
29
|
+
<Icon name="trending-down" size={14} stroke={2.4} />
|
|
30
|
+
{t('autobahn:card.price.savedAmount', { amount: amount.toLocaleString('de-DE') })}
|
|
31
|
+
</span>
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
export default SaveChip;
|
package/ui/Segmented.tsx
CHANGED
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
|
|
3
|
-
import Icon from './Icon';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* [value, label, optional kebab-case lucide icon name, optional explicit aria-label].
|
|
7
|
-
*
|
|
8
|
-
* `label` doubles as the button's visible text AND (when non-empty) its accessible name.
|
|
9
|
-
* Icon-only options (empty `label`, e.g. the SRP list/grid view toggle) render no visible
|
|
10
|
-
* text, so `Segmented` derives an accessible name from `key` (Title-cased) when neither
|
|
11
|
-
* `label` nor an explicit `ariaLabel` is supplied — every rendered `<button>` always ends up
|
|
12
|
-
* with SOME discernible name (WCAG 4.1.2 / axe "button-name"). Pass `ariaLabel` explicitly for
|
|
13
|
-
* a real (ideally translated) name instead of relying on the key-derived fallback.
|
|
14
|
-
*/
|
|
15
|
-
export type SegmentedOption = readonly [key: string, label: string, icon?: string, ariaLabel?: string];
|
|
16
|
-
|
|
17
|
-
export interface SegmentedProps {
|
|
18
|
-
options: ReadonlyArray<SegmentedOption>;
|
|
19
|
-
value: string;
|
|
20
|
-
onChange: (value: string) => void;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/** Title-cases a raw option key ('list' -> 'List') as a last-resort accessible name. */
|
|
24
|
-
const titleCase = (s: string): string => (s ? s.charAt(0).toUpperCase() + s.slice(1) : s);
|
|
25
|
-
|
|
26
|
-
const Segmented: React.FunctionComponent<SegmentedProps> = ({ options, value, onChange }) => (
|
|
27
|
-
<div className="segmented">
|
|
28
|
-
{options.map(([k, label, icon, ariaLabel]) => {
|
|
29
|
-
// only set aria-label when there's no visible text label already providing the name —
|
|
30
|
-
// avoids a redundant/conflicting name on labelled buttons (WCAG 2.5.3 Label in Name).
|
|
31
|
-
const accessibleName = ariaLabel || (label ? undefined : titleCase(k));
|
|
32
|
-
return (
|
|
33
|
-
<button
|
|
34
|
-
key={k}
|
|
35
|
-
type="button"
|
|
36
|
-
className={value === k ? 'on' : ''}
|
|
37
|
-
aria-label={accessibleName}
|
|
38
|
-
onClick={() => onChange(k)}
|
|
39
|
-
>
|
|
40
|
-
{icon && <Icon name={icon} size={16} />}
|
|
41
|
-
{label}
|
|
42
|
-
</button>
|
|
43
|
-
);
|
|
44
|
-
})}
|
|
45
|
-
</div>
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
export default Segmented;
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
import Icon from './Icon';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* [value, label, optional kebab-case lucide icon name, optional explicit aria-label].
|
|
7
|
+
*
|
|
8
|
+
* `label` doubles as the button's visible text AND (when non-empty) its accessible name.
|
|
9
|
+
* Icon-only options (empty `label`, e.g. the SRP list/grid view toggle) render no visible
|
|
10
|
+
* text, so `Segmented` derives an accessible name from `key` (Title-cased) when neither
|
|
11
|
+
* `label` nor an explicit `ariaLabel` is supplied — every rendered `<button>` always ends up
|
|
12
|
+
* with SOME discernible name (WCAG 4.1.2 / axe "button-name"). Pass `ariaLabel` explicitly for
|
|
13
|
+
* a real (ideally translated) name instead of relying on the key-derived fallback.
|
|
14
|
+
*/
|
|
15
|
+
export type SegmentedOption = readonly [key: string, label: string, icon?: string, ariaLabel?: string];
|
|
16
|
+
|
|
17
|
+
export interface SegmentedProps {
|
|
18
|
+
options: ReadonlyArray<SegmentedOption>;
|
|
19
|
+
value: string;
|
|
20
|
+
onChange: (value: string) => void;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Title-cases a raw option key ('list' -> 'List') as a last-resort accessible name. */
|
|
24
|
+
const titleCase = (s: string): string => (s ? s.charAt(0).toUpperCase() + s.slice(1) : s);
|
|
25
|
+
|
|
26
|
+
const Segmented: React.FunctionComponent<SegmentedProps> = ({ options, value, onChange }) => (
|
|
27
|
+
<div className="segmented">
|
|
28
|
+
{options.map(([k, label, icon, ariaLabel]) => {
|
|
29
|
+
// only set aria-label when there's no visible text label already providing the name —
|
|
30
|
+
// avoids a redundant/conflicting name on labelled buttons (WCAG 2.5.3 Label in Name).
|
|
31
|
+
const accessibleName = ariaLabel || (label ? undefined : titleCase(k));
|
|
32
|
+
return (
|
|
33
|
+
<button
|
|
34
|
+
key={k}
|
|
35
|
+
type="button"
|
|
36
|
+
className={value === k ? 'on' : ''}
|
|
37
|
+
aria-label={accessibleName}
|
|
38
|
+
onClick={() => onChange(k)}
|
|
39
|
+
>
|
|
40
|
+
{icon && <Icon name={icon} size={16} />}
|
|
41
|
+
{label}
|
|
42
|
+
</button>
|
|
43
|
+
);
|
|
44
|
+
})}
|
|
45
|
+
</div>
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
export default Segmented;
|