diff --git a/packages/plasma-temple/src/components/Product/Product.tsx b/packages/plasma-temple/src/components/Product/Product.tsx index ec4d691dd..78dedf3c6 100644 --- a/packages/plasma-temple/src/components/Product/Product.tsx +++ b/packages/plasma-temple/src/components/Product/Product.tsx @@ -1,14 +1,11 @@ import React from 'react'; -import { detectDevice, DeviceKind } from '@sberdevices/plasma-ui/utils'; + +import { DeviceComponent } from '../DeviceComponent/DeviceComponent'; import { ProductCommon, ProductProps } from './Product@common'; import { ProductMobile } from './Product@mobile'; -const mapDeviceToProduct: Record> = { - sberBox: ProductCommon, - sberPortal: ProductCommon, - mobile: ProductMobile, -}; - /** Компонент страницы товара (без заголовка) */ -export const Product = mapDeviceToProduct[detectDevice()]; +export const Product: React.FC = (props) => ( + +); diff --git a/packages/plasma-temple/src/components/Product/Product@common.tsx b/packages/plasma-temple/src/components/Product/Product@common.tsx index 290307661..386745067 100644 --- a/packages/plasma-temple/src/components/Product/Product@common.tsx +++ b/packages/plasma-temple/src/components/Product/Product@common.tsx @@ -8,8 +8,8 @@ import { ProductImage } from './ProductImage/ProductImage'; import { ProductActionButton, ProductActionButtonProps } from './ProductActionButton/ProductActionButton'; import { ProductVariationSwitcher } from './ProductVariationSwitcher/ProductVariationSwitcher'; import { ProductDetails } from './ProductDetails/ProductDetails'; -import { ExpandableProductDetails } from './ProductDetails/ExpandableProductDetails/ExpandableProductDetails'; -import { ProductInfo } from './ProductInfo/ProductInfo'; +import { ExpandableProductDetailsCommon } from './ProductDetails/ExpandableProductDetails/ExpandableProductDetails@common'; +import { ProductInfoCommon } from './ProductInfo/ProductInfo@common'; import { ProductEntity, ProductVariation as ProductVariationType } from './types'; import { useScrollByBreakpoints } from './hooks/useScrollByBreakpoints'; import { ProductRecommendations } from './ProductRecommendations/ProductRecommendations'; @@ -165,7 +165,7 @@ export const ProductCommon = ({ {variations.length > 0 && (
{variations.map((variation) => ( - + ))} @@ -178,7 +178,7 @@ export const ProductCommon = ({ )} {details && ( - - {variations?.map((variation) => ( - + ))} @@ -59,12 +59,12 @@ export const ProductMobile = ({ )} {details && ( - + )} {description && ( - + )} {recommendations && recommendations.items.length > 0 && ( diff --git a/packages/plasma-temple/src/components/Product/ProductDetails/ExpandableProductDetails/ExpandableProductDetails.tsx b/packages/plasma-temple/src/components/Product/ProductDetails/ExpandableProductDetails/ExpandableProductDetails.tsx index 175c0af0c..95429909d 100644 --- a/packages/plasma-temple/src/components/Product/ProductDetails/ExpandableProductDetails/ExpandableProductDetails.tsx +++ b/packages/plasma-temple/src/components/Product/ProductDetails/ExpandableProductDetails/ExpandableProductDetails.tsx @@ -1,18 +1,19 @@ import React from 'react'; -import { detectDevice, DeviceKind } from '@sberdevices/plasma-ui/utils'; + +import { DeviceComponent } from '../../../DeviceComponent/DeviceComponent'; import { ExpandableProductDetailsCommon, ExpandableProductDetailsProps } from './ExpandableProductDetails@common'; import { ExpandableProductDetailsMobile } from './ExpandableProductDetails@mobile'; -const mapDeviceToExpandableProductDetails: Record> = { - sberBox: ExpandableProductDetailsCommon, - sberPortal: ExpandableProductDetailsCommon, - mobile: ExpandableProductDetailsMobile, -}; - /** * Компонент для отображения деталей (характеристик) товара * с возможность по умолчанию скрывать часть характеристик - * Актуален для устройств с пультом и SberPortal */ -export const ExpandableProductDetails = mapDeviceToExpandableProductDetails[detectDevice()]; +export const ExpandableProductDetails: React.FC = (props) => ( + +); diff --git a/packages/plasma-temple/src/components/Product/ProductDetails/ProductDetails.tsx b/packages/plasma-temple/src/components/Product/ProductDetails/ProductDetails.tsx index 0413b6e8a..5e1905b40 100644 --- a/packages/plasma-temple/src/components/Product/ProductDetails/ProductDetails.tsx +++ b/packages/plasma-temple/src/components/Product/ProductDetails/ProductDetails.tsx @@ -1,6 +1,7 @@ import React from 'react'; -import styled from 'styled-components'; -import { detectDevice, DeviceKind, Headline3, Button2, ParagraphText2 } from '@sberdevices/plasma-ui'; +import styled, { css } from 'styled-components'; +import { mediaQuery } from '@sberdevices/plasma-ui'; +import { button2, headline3, paragraph2 } from '@sberdevices/plasma-tokens'; import { DetailsItemProps, ProductDetailsItem } from './ProductDetailsItem/ProductDetailsItem'; @@ -22,13 +23,23 @@ const StyledProductDetailsItemContainer = styled.div` } `; -const mapDeviceToTitle: Record = { - sberBox: ParagraphText2, - sberPortal: Button2, - mobile: Headline3, -}; +export const StyledTitle = styled.div` + ${paragraph2} + + ${mediaQuery( + 'M', + 2, + )(css` + ${button2} + `)} + + ${mediaQuery( + 'S', + 1, + )(css` + ${headline3} + `)} -export const StyledTitle = styled(mapDeviceToTitle[detectDevice()])` margin-bottom: 0.75rem; `; diff --git a/packages/plasma-temple/src/components/Product/ProductDetails/ProductDetailsItem/ProductDetailsItem.tsx b/packages/plasma-temple/src/components/Product/ProductDetails/ProductDetailsItem/ProductDetailsItem.tsx index 12b237b0c..78eadad33 100644 --- a/packages/plasma-temple/src/components/Product/ProductDetails/ProductDetailsItem/ProductDetailsItem.tsx +++ b/packages/plasma-temple/src/components/Product/ProductDetails/ProductDetailsItem/ProductDetailsItem.tsx @@ -1,15 +1,7 @@ import React from 'react'; import styled, { css } from 'styled-components'; -import { - detectDevice, - DeviceKind, - Footnote1, - Footnote2, - mediaQuery, - ParagraphText1, - ParagraphText2, -} from '@sberdevices/plasma-ui'; -import { secondary } from '@sberdevices/plasma-tokens'; +import { mediaQuery } from '@sberdevices/plasma-ui'; +import { footnote1, footnote2, paragraph1, paragraph2, secondary } from '@sberdevices/plasma-tokens'; import { useWindowInnerWidth } from '../../../../hooks/useWindowInnerWidth'; @@ -24,14 +16,16 @@ const StyledDetailsItemContainer = styled.div` align-items: flex-end; `; -const mapDeviceToName: Record = { - sberBox: ParagraphText1, - sberPortal: Footnote1, - mobile: Footnote1, -}; - -const StyledName = styled(mapDeviceToName[detectDevice()])<{ upperCase?: boolean }>` +const StyledName = styled.div<{ upperCase?: boolean }>` color: ${secondary}; + ${footnote1} + + ${mediaQuery( + 'XL', + 2, + )(css` + ${paragraph1} + `)} ${({ upperCase }) => upperCase && @@ -57,13 +51,16 @@ const StyledSpace = styled.div` `)} `; -const mapDeviceToValue: Record = { - sberBox: ParagraphText2, - sberPortal: Footnote2, - mobile: Footnote2, -}; +const StyledValue = styled.div` + ${footnote2} -const StyledValue = mapDeviceToValue[detectDevice()]; + ${mediaQuery( + 'XL', + 2, + )(css` + ${paragraph2} + `)} +`; interface LineParams { maxSymbolsInLine: number; diff --git a/packages/plasma-temple/src/components/Product/ProductInfo/ProductInfo.tsx b/packages/plasma-temple/src/components/Product/ProductInfo/ProductInfo.tsx index aa98bc0b2..c90ea3107 100644 --- a/packages/plasma-temple/src/components/Product/ProductInfo/ProductInfo.tsx +++ b/packages/plasma-temple/src/components/Product/ProductInfo/ProductInfo.tsx @@ -1,17 +1,18 @@ import React from 'react'; -import { detectDevice, DeviceKind } from '@sberdevices/plasma-ui/utils'; + +import { DeviceComponent } from '../../DeviceComponent/DeviceComponent'; import { ProductInfoCommon, ProductInfoProps } from './ProductInfo@common'; import { ProductInfoMobile } from './ProductInfo@mobile'; -const mapDeviceToProductInfo: Record> = { - sberBox: ProductInfoCommon, - sberPortal: ProductInfoCommon, - mobile: ProductInfoMobile, -}; - /** * Компонент для отображения информации (описания) о товаре - * Актуален для устройств с пультом и SberPortal */ -export const ProductInfo = mapDeviceToProductInfo[detectDevice()]; +export const ProductInfo: React.FC = (props) => ( + +); diff --git a/packages/plasma-temple/src/components/Product/ProductInfo/ProductInfo@common.tsx b/packages/plasma-temple/src/components/Product/ProductInfo/ProductInfo@common.tsx index 77000ca91..39bc059ae 100644 --- a/packages/plasma-temple/src/components/Product/ProductInfo/ProductInfo@common.tsx +++ b/packages/plasma-temple/src/components/Product/ProductInfo/ProductInfo@common.tsx @@ -1,15 +1,7 @@ import React from 'react'; import styled, { css } from 'styled-components'; -import { - detectDevice, - DeviceKind, - Footnote1, - Footnote2, - Headline3, - ParagraphText1, - ParagraphText2, -} from '@sberdevices/plasma-ui'; -import { secondary } from '@sberdevices/plasma-tokens'; +import { mediaQuery } from '@sberdevices/plasma-ui'; +import { footnote1, footnote2, headline3, paragraph1, paragraph2, secondary } from '@sberdevices/plasma-tokens'; import { useCollapse } from '../../Collapse/hooks/useCollapse'; import { ProductToggleButton, ProductToggleButtonProps } from '../ProductToggleButton/ProductToggleButton'; @@ -27,26 +19,39 @@ export interface ProductInfoProps { renderToggleButton?: (props: Pick) => React.ReactNode; } -const mapDeviceToTitle: Record = { - sberBox: ParagraphText2, - sberPortal: Footnote2, - mobile: Headline3, -}; +const StyledTitle = styled.div` + ${paragraph2} + + ${mediaQuery( + 'M', + 2, + )(css` + ${footnote2} + `)} + + ${mediaQuery( + 'S', + 1, + )(css` + ${headline3} + `)} -const StyledTitle = styled(mapDeviceToTitle[detectDevice()])` margin-bottom: 0.5rem; `; -const mapDeviceToInfo: Record = { - sberBox: ParagraphText1, - sberPortal: Footnote1, - mobile: Footnote1, -}; - -const StyledInfo = styled(mapDeviceToInfo[detectDevice()])<{ +const StyledInfo = styled.div<{ expanded: boolean; }>` hyphens: none; + ${footnote1} + + ${mediaQuery( + 'XL', + 2, + )(css` + ${paragraph1} + `)} + ${({ expanded }) => expanded && css` diff --git a/packages/plasma-temple/src/components/Product/ProductPrice/ProductPrice.tsx b/packages/plasma-temple/src/components/Product/ProductPrice/ProductPrice.tsx index 9b70d3a91..e65fd9d57 100644 --- a/packages/plasma-temple/src/components/Product/ProductPrice/ProductPrice.tsx +++ b/packages/plasma-temple/src/components/Product/ProductPrice/ProductPrice.tsx @@ -1,17 +1,55 @@ import React from 'react'; -import { detectDevice } from '@sberdevices/plasma-ui/utils'; +import styled, { css } from 'styled-components'; +import { Col, mediaQuery, Price, Row } from '@sberdevices/plasma-ui'; +import { accent, headline2, headline3, primary } from '@sberdevices/plasma-tokens'; -import { DeviceFamily } from '../../../types'; - -import { ProductPriceSberBox } from './ProductPrice@sberbox'; -import { ProductPriceSberPortal } from './ProductPrice@sberportal'; import { ProductPriceProps } from './types'; -const mapDeviceToProductPrice: Record> = { - sberBox: ProductPriceSberBox, - sberPortal: ProductPriceSberPortal, - mobile: ProductPriceSberPortal, -}; +const StyledPrice = styled(Price)<{ old?: boolean }>` + ${headline2} + + ${mediaQuery( + 'M', + 2, + )(css` + ${headline3} + `)} + + ${mediaQuery( + 'S', + 1, + )(css` + ${headline3} + `)} + + color: ${accent}; + ${({ old }) => + old && + css` + color: ${primary}; + opacity: 0.28; + text-decoration: line-through; + `} +`; /** Компонент для отображения цены на странице товара */ -export const ProductPrice = mapDeviceToProductPrice[detectDevice()]; +export const ProductPrice: React.FC = ({ price, oldPrice, className, ...rest }) => { + if (!price) { + return null; + } + + return ( + + + {price} + + {oldPrice && ( + + + {oldPrice} + + + )} + + ); +}; diff --git a/packages/plasma-temple/src/components/Product/ProductPrice/ProductPrice@common.tsx b/packages/plasma-temple/src/components/Product/ProductPrice/ProductPrice@common.tsx deleted file mode 100644 index 2a81cc563..000000000 --- a/packages/plasma-temple/src/components/Product/ProductPrice/ProductPrice@common.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import React from 'react'; -import styled, { css } from 'styled-components'; -import { Col, Price, Row } from '@sberdevices/plasma-ui'; -import { accent, primary } from '@sberdevices/plasma-tokens'; - -import { ProductPriceProps } from './types'; - -const StyledPrice = styled(Price)<{ old?: boolean }>` - color: ${accent}; - ${({ old }) => - old && - css` - color: ${primary}; - opacity: 0.28; - text-decoration: line-through; - `} -`; - -export const ProductPriceCommon: React.FC = ({ price, oldPrice, className, ...rest }) => { - if (!price) { - return null; - } - - return ( - - - {price} - - {oldPrice && ( - - - {oldPrice} - - - )} - - ); -}; diff --git a/packages/plasma-temple/src/components/Product/ProductPrice/ProductPrice@sberbox.tsx b/packages/plasma-temple/src/components/Product/ProductPrice/ProductPrice@sberbox.tsx deleted file mode 100644 index 806f85758..000000000 --- a/packages/plasma-temple/src/components/Product/ProductPrice/ProductPrice@sberbox.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; -import { Headline2 } from '@sberdevices/plasma-ui'; - -import { ProductPriceCommon } from './ProductPrice@common'; -import { ProductPriceProps } from './types'; - -export const ProductPriceSberBox: React.FC = (props) => ( - - - -); diff --git a/packages/plasma-temple/src/components/Product/ProductPrice/ProductPrice@sberportal.tsx b/packages/plasma-temple/src/components/Product/ProductPrice/ProductPrice@sberportal.tsx deleted file mode 100644 index 37a393937..000000000 --- a/packages/plasma-temple/src/components/Product/ProductPrice/ProductPrice@sberportal.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; -import { Headline3 } from '@sberdevices/plasma-ui'; - -import { ProductPriceCommon } from './ProductPrice@common'; -import { ProductPriceProps } from './types'; - -export const ProductPriceSberPortal: React.FC = (props) => ( - - - -); diff --git a/packages/plasma-temple/src/components/Product/ProductRecommendations/ProductRecommendations.tsx b/packages/plasma-temple/src/components/Product/ProductRecommendations/ProductRecommendations.tsx index d178fc33a..a2f1e4a7e 100644 --- a/packages/plasma-temple/src/components/Product/ProductRecommendations/ProductRecommendations.tsx +++ b/packages/plasma-temple/src/components/Product/ProductRecommendations/ProductRecommendations.tsx @@ -56,9 +56,8 @@ function ProductRecommendationsComponent({ {recommendations.map((recommendation, index) => ( - + = { - sberBox: Headline1, - sberPortal: Headline2, - mobile: Headline2, -}; +export const Title = styled.div` + ${applyHyphens} + ${headline2} -export const Title = mapDeviceToTitle[detectDevice()] as typeof Headline1; + ${mediaQuery( + 'XL', + 2, + )(css` + ${headline1} + `)} +`; + +export const StyledSubtitle = styled.div` + ${applyHyphens} + ${body1} -const mapDeviceToSubtitle: Record = { - sberBox: Body1, - sberPortal: Body1, - mobile: Footnote1, -}; + ${mediaQuery( + 'S', + 1, + )(css` + ${footnote1} + `)} -export const StyledSubtitle = styled(mapDeviceToSubtitle[detectDevice()])` color: ${secondary}; margin-top: 0.5rem; `; diff --git a/packages/plasma-temple/src/components/Product/ProductVariationSwitcher/ProductVariationSwitcher.tsx b/packages/plasma-temple/src/components/Product/ProductVariationSwitcher/ProductVariationSwitcher.tsx index bcbc78780..f0091842c 100644 --- a/packages/plasma-temple/src/components/Product/ProductVariationSwitcher/ProductVariationSwitcher.tsx +++ b/packages/plasma-temple/src/components/Product/ProductVariationSwitcher/ProductVariationSwitcher.tsx @@ -1,6 +1,7 @@ import React from 'react'; -import styled from 'styled-components'; -import { Carousel, CarouselItem, detectDevice, DeviceKind, Footnote2, ParagraphText2 } from '@sberdevices/plasma-ui'; +import styled, { css } from 'styled-components'; +import { Carousel, CarouselItem, mediaQuery } from '@sberdevices/plasma-ui'; +import { footnote2, paragraph2 } from '@sberdevices/plasma-tokens'; import { ProductVariationItem } from './ProductVariationItem/ProductVariationItem'; @@ -21,13 +22,15 @@ const StyledContainer = styled.div` width: 100%; `; -const mapDeviceToTitle: Record = { - sberBox: ParagraphText2, - sberPortal: Footnote2, - mobile: Footnote2, -}; +const StyledTitle = styled.div` + ${footnote2} -const StyledTitle = styled(mapDeviceToTitle[detectDevice()])` + ${mediaQuery( + 'XL', + 2, + )(css` + ${paragraph2} + `)} margin-bottom: 0.45rem; `; @@ -55,9 +58,8 @@ export const ProductVariationSwitcher = React.memo {variations.map((variation, index) => ( - +