@redneckz/wildless-cms-uni-blocks 0.2.58 → 0.2.61
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/dist/BaseTile.d.ts +4 -2
- package/dist/BaseTile.js +11 -11
- package/dist/BaseTile.js.map +1 -1
- package/dist/Blocks.d.ts +5 -1
- package/dist/Blocks.js +4 -0
- package/dist/Blocks.js.map +1 -1
- package/dist/ContentPage.js +1 -1
- package/dist/ContentPage.js.map +1 -1
- package/dist/Icons/AppleIcon.d.ts +1 -0
- package/dist/Icons/AppleIcon.js +6 -0
- package/dist/Icons/AppleIcon.js.map +1 -0
- package/dist/Icons/PlayMarket.d.ts +1 -0
- package/dist/Icons/PlayMarket.js +6 -0
- package/dist/Icons/PlayMarket.js.map +1 -0
- package/dist/Icons/index.d.ts +2 -0
- package/dist/Icons/index.js +5 -1
- package/dist/Icons/index.js.map +1 -1
- package/dist/MobileAppTile.d.ts +2 -1
- package/dist/MobileAppTile.js +2 -2
- package/dist/MobileAppTile.js.map +1 -1
- package/dist/MobileBlocks.d.ts +1 -0
- package/dist/MobileBlocks.js +2 -0
- package/dist/MobileBlocks.js.map +1 -1
- package/dist/ProductBlock.js +1 -1
- package/dist/ProductBlock.js.map +1 -1
- package/dist/ProductBlockInner.js +2 -1
- package/dist/ProductBlockInner.js.map +1 -1
- package/dist/ProductGallery.js +1 -1
- package/dist/ProductGallery.js.map +1 -1
- package/dist/ProductTile.js +3 -3
- package/dist/ProductTile.js.map +1 -1
- package/dist/PromoTile.d.ts +8 -0
- package/dist/PromoTile.js +18 -0
- package/dist/PromoTile.js.map +1 -0
- package/dist/StepsBlock.js +2 -1
- package/dist/StepsBlock.js.map +1 -1
- package/dist/TextBlock.d.ts +14 -0
- package/dist/TextBlock.js +36 -0
- package/dist/TextBlock.js.map +1 -0
- package/dist/Tile.js +14 -1
- package/dist/Tile.js.map +1 -1
- package/dist/api/DaDataAPI.js +2 -2
- package/dist/api/DaDataAPI.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/ui-kit/Button.d.ts +1 -3
- package/dist/ui-kit/Button.js +3 -3
- package/dist/ui-kit/Button.js.map +1 -1
- package/dist/ui-kit/IconButton.d.ts +6 -0
- package/dist/ui-kit/IconButton.js +11 -0
- package/dist/ui-kit/IconButton.js.map +1 -0
- package/dist/ui-kit/Title.d.ts +11 -0
- package/dist/ui-kit/Title.js +17 -0
- package/dist/ui-kit/Title.js.map +1 -0
- package/dist/utils/getColSpan.d.ts +1 -0
- package/dist/utils/getColSpan.js +9 -0
- package/dist/utils/getColSpan.js.map +1 -0
- package/dist/utils/getGeolocation.d.ts +1 -0
- package/dist/utils/getGeolocation.js +5 -0
- package/dist/utils/getGeolocation.js.map +1 -0
- package/lib/BaseTile.d.ts +4 -2
- package/lib/BaseTile.js +11 -11
- package/lib/BaseTile.js.map +1 -1
- package/lib/Blocks.d.ts +5 -1
- package/lib/Blocks.js +4 -0
- package/lib/Blocks.js.map +1 -1
- package/lib/ContentPage.js +1 -1
- package/lib/ContentPage.js.map +1 -1
- package/lib/Icons/AppleIcon.d.ts +1 -0
- package/lib/Icons/AppleIcon.js +3 -0
- package/lib/Icons/AppleIcon.js.map +1 -0
- package/lib/Icons/PlayMarket.d.ts +1 -0
- package/lib/Icons/PlayMarket.js +3 -0
- package/lib/Icons/PlayMarket.js.map +1 -0
- package/lib/Icons/index.d.ts +2 -0
- package/lib/Icons/index.js +2 -0
- package/lib/Icons/index.js.map +1 -1
- package/lib/MobileAppTile.d.ts +2 -1
- package/lib/MobileAppTile.js +2 -2
- package/lib/MobileAppTile.js.map +1 -1
- package/lib/MobileBlocks.d.ts +1 -0
- package/lib/MobileBlocks.js +2 -0
- package/lib/MobileBlocks.js.map +1 -1
- package/lib/ProductBlock.js +1 -1
- package/lib/ProductBlock.js.map +1 -1
- package/lib/ProductBlockInner.js +2 -1
- package/lib/ProductBlockInner.js.map +1 -1
- package/lib/ProductGallery.js +1 -1
- package/lib/ProductGallery.js.map +1 -1
- package/lib/ProductTile.js +3 -3
- package/lib/ProductTile.js.map +1 -1
- package/lib/PromoTile.d.ts +8 -0
- package/lib/PromoTile.js +16 -0
- package/lib/PromoTile.js.map +1 -0
- package/lib/StepsBlock.js +2 -1
- package/lib/StepsBlock.js.map +1 -1
- package/lib/TextBlock.d.ts +14 -0
- package/lib/TextBlock.js +34 -0
- package/lib/TextBlock.js.map +1 -0
- package/lib/Tile.js +14 -1
- package/lib/Tile.js.map +1 -1
- package/lib/api/DaDataAPI.js +2 -2
- package/lib/api/DaDataAPI.js.map +1 -1
- package/lib/common.css +1 -1
- package/lib/types.d.ts +1 -0
- package/lib/ui-kit/Button.d.ts +1 -3
- package/lib/ui-kit/Button.js +3 -3
- package/lib/ui-kit/Button.js.map +1 -1
- package/lib/ui-kit/IconButton.d.ts +6 -0
- package/lib/ui-kit/IconButton.js +9 -0
- package/lib/ui-kit/IconButton.js.map +1 -0
- package/lib/ui-kit/Title.d.ts +11 -0
- package/lib/ui-kit/Title.js +15 -0
- package/lib/ui-kit/Title.js.map +1 -0
- package/lib/utils/getColSpan.d.ts +1 -0
- package/lib/utils/getColSpan.js +6 -0
- package/lib/utils/getColSpan.js.map +1 -0
- package/lib/utils/getGeolocation.d.ts +1 -0
- package/lib/utils/getGeolocation.js +2 -0
- package/lib/utils/getGeolocation.js.map +1 -0
- package/package.json +1 -1
- package/src/BaseTile.tsx +24 -17
- package/src/Blocks.ts +6 -0
- package/src/ContentPage.fixture.tsx +1 -1
- package/src/ContentPage.page.json +47 -22
- package/src/ContentPage.tsx +1 -1
- package/src/Icons/AppleIcon.tsx +15 -0
- package/src/Icons/PlayMarket.tsx +8 -0
- package/src/Icons/index.ts +2 -0
- package/src/MobileAppTile.tsx +4 -3
- package/src/MobileBlocks.ts +2 -0
- package/src/ProductBlock.tsx +3 -1
- package/src/ProductBlockInner.tsx +5 -4
- package/src/ProductGallery.tsx +7 -3
- package/src/ProductTile.tsx +3 -3
- package/src/PromoTile.tsx +47 -0
- package/src/StepsBlock.tsx +2 -1
- package/src/TextBlock.fixture.tsx +116 -0
- package/src/TextBlock.tsx +72 -0
- package/src/Tile.tsx +19 -2
- package/src/api/DaDataAPI.ts +2 -2
- package/src/common.css +15 -15
- package/src/setup-fixture.ts +6 -2
- package/src/types.ts +1 -1
- package/src/ui-kit/Button.fixture.tsx +22 -0
- package/src/ui-kit/Button.tsx +13 -6
- package/src/ui-kit/IconButton.tsx +27 -0
- package/src/ui-kit/Title.tsx +25 -0
- package/src/utils/getColSpan.ts +5 -0
- package/src/utils/{getCurrentPosition.ts → getGeolocation.ts} +1 -1
- package/dist/utils/getCurrentPosition.d.ts +0 -1
- package/dist/utils/getCurrentPosition.js +0 -5
- package/dist/utils/getCurrentPosition.js.map +0 -1
- package/lib/utils/getCurrentPosition.d.ts +0 -1
- package/lib/utils/getCurrentPosition.js +0 -2
- package/lib/utils/getCurrentPosition.js.map +0 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const AppleIcon = (props?: Record<string, any>) => (
|
|
2
|
+
<svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
+
<g clipPath="url(#a)">
|
|
4
|
+
<path
|
|
5
|
+
d="M19.406 12.761c-.023-3.028 2.793-4.511 2.93-4.572-1.603-2.073-4.075-2.357-4.968-2.377-2.083-.204-4.098 1.117-5.174 1.117-1.076 0-2.725-1.097-4.488-1.056-2.266.04-4.395 1.198-5.563 3.007-2.404 3.698-.618 9.124 1.694 12.09 1.145 1.464 2.496 3.09 4.259 3.028 1.717-.06 2.358-.975 4.441-.975 2.06 0 2.656.975 4.465.935 1.854-.02 3.022-1.463 4.12-2.947 1.329-1.666 1.855-3.332 1.878-3.413 0 0-3.549-1.2-3.594-4.837Zm-3.389-8.92c.916-1.037 1.557-2.419 1.374-3.841-1.35.061-3.022.833-3.984 1.829-.847.894-1.625 2.337-1.42 3.698 1.512.102 3.069-.67 4.03-1.686Z"
|
|
6
|
+
fill="#42AB44"
|
|
7
|
+
/>
|
|
8
|
+
</g>
|
|
9
|
+
<defs>
|
|
10
|
+
<clipPath id="a">
|
|
11
|
+
<rect width="24" height="24" rx="6" fill="#fff" />
|
|
12
|
+
</clipPath>
|
|
13
|
+
</defs>
|
|
14
|
+
</svg>
|
|
15
|
+
);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export const PlayMarket = (props?: Record<string, any>) => (
|
|
2
|
+
<svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
+
<path
|
|
4
|
+
d="M1 22.427V2.576C1 1.883 1.447 1.284 2.094 1L14.85 12.498 2.089 24a1.89 1.89 0 0 1-.795-.646A1.625 1.625 0 0 1 1 22.427Zm17.899-6.282-13.95 7.259 11.002-9.915 2.948 2.656Zm4.335-5.035c.237.162.428.37.561.61.133.239.203.502.205.77.002.267-.064.53-.193.771s-.317.452-.551.617l-2.964 1.542-3.241-2.922 3.24-2.92 2.944 1.532ZM4.959 1.598l13.938 7.253-2.945 2.654L4.958 1.598Z"
|
|
5
|
+
fill="#42AB44"
|
|
6
|
+
/>
|
|
7
|
+
</svg>
|
|
8
|
+
);
|
package/src/Icons/index.ts
CHANGED
|
@@ -15,3 +15,5 @@ export { ProfileIcon } from './ProfileIcon';
|
|
|
15
15
|
export { SignDocsIcon } from './SignDocsIcon';
|
|
16
16
|
export { TelegramIcon } from './TelegramIcon';
|
|
17
17
|
export { VKIcon } from './VKIcon';
|
|
18
|
+
export { AppleIcon } from './AppleIcon';
|
|
19
|
+
export { PlayMarket } from './PlayMarket';
|
package/src/MobileAppTile.tsx
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { JSX } from '@redneckz/uni-jsx';
|
|
2
2
|
import { Tile } from './Tile';
|
|
3
|
+
import type { BaseTileContent } from './BaseTile';
|
|
3
4
|
import type { UniBlockProps } from './types';
|
|
4
5
|
|
|
5
6
|
export interface QRCode {
|
|
@@ -7,7 +8,7 @@ export interface QRCode {
|
|
|
7
8
|
href?: string;
|
|
8
9
|
}
|
|
9
10
|
|
|
10
|
-
export interface MobileAppTileContent {
|
|
11
|
+
export interface MobileAppTileContent extends BaseTileContent {
|
|
11
12
|
title?: string;
|
|
12
13
|
qr?: QRCode;
|
|
13
14
|
}
|
|
@@ -15,9 +16,9 @@ export interface MobileAppTileContent {
|
|
|
15
16
|
export interface MobileAppTileProps extends MobileAppTileContent, UniBlockProps {}
|
|
16
17
|
|
|
17
18
|
export const MobileAppTile = JSX<MobileAppTileProps>(
|
|
18
|
-
({ className, context, title = 'Мобильное приложение', qr }) => {
|
|
19
|
+
({ className, context, title = 'Мобильное приложение', qr, buttons = [] }) => {
|
|
19
20
|
return (
|
|
20
|
-
<Tile className={className} context={context} title={title}>
|
|
21
|
+
<Tile className={className} context={context} title={title} buttons={buttons}>
|
|
21
22
|
<div className="flex items-center">
|
|
22
23
|
{qr?.src && qr?.href && (
|
|
23
24
|
<a href={qr.href} target="_blank">
|
package/src/MobileBlocks.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { ProductBlock } from './ProductBlock';
|
|
|
8
8
|
import { ProductGallery } from './ProductGallery';
|
|
9
9
|
import { ProductTile } from './ProductTile';
|
|
10
10
|
import { StepsBlock } from './StepsBlock';
|
|
11
|
+
import { TextBlock } from './TextBlock';
|
|
11
12
|
import { Tile } from './Tile';
|
|
12
13
|
|
|
13
14
|
export const MobileBlocks = {
|
|
@@ -18,6 +19,7 @@ export const MobileBlocks = {
|
|
|
18
19
|
ProductTile,
|
|
19
20
|
ProductBlock,
|
|
20
21
|
StepsBlock,
|
|
22
|
+
TextBlock,
|
|
21
23
|
BenefitsBlock,
|
|
22
24
|
ProductGallery,
|
|
23
25
|
ExchangeRateTile,
|
package/src/ProductBlock.tsx
CHANGED
|
@@ -15,7 +15,9 @@ export const ProductBlock = JSX<ProductBlockProps>((props) => {
|
|
|
15
15
|
const router = context.useRouter();
|
|
16
16
|
const { handlerDecorator } = context;
|
|
17
17
|
return (
|
|
18
|
-
<section
|
|
18
|
+
<section
|
|
19
|
+
className={`font-sans bg-white pt-10 pl-[50px] pb-[50px] pr-[7.5rem] ${className || ''}`}
|
|
20
|
+
>
|
|
19
21
|
{breadcrumbs?.length ? (
|
|
20
22
|
<div className="text-xs mb-6">
|
|
21
23
|
{joinList(<span className="text-secondary-text mx-2">/</span>)(
|
|
@@ -2,6 +2,7 @@ import { JSX } from '@redneckz/uni-jsx';
|
|
|
2
2
|
import { EmptyWalletIcon, PercentageSquareIcon, CalendarIcon } from './Icons/index';
|
|
3
3
|
import type { UniBlockProps, Benefit } from './types';
|
|
4
4
|
import { BaseTile } from './BaseTile';
|
|
5
|
+
import { Title } from './ui-kit/Title';
|
|
5
6
|
import type { BaseTileContent } from './BaseTile';
|
|
6
7
|
import { Img } from './Img';
|
|
7
8
|
|
|
@@ -16,16 +17,16 @@ export interface ProductBlockInnerProps extends ProductBlockInnerContent, UniBlo
|
|
|
16
17
|
export const ProductBlockInner = JSX<ProductBlockInnerProps>(
|
|
17
18
|
({ className, context, title, description, benefits, buttons, image, items }) => {
|
|
18
19
|
return (
|
|
19
|
-
<div className={`flex justify-between items-stretch ${className || ''}`}>
|
|
20
|
+
<div className={`flex grow justify-between items-stretch ${className || ''}`}>
|
|
20
21
|
<div className={'flex flex-col'}>
|
|
21
22
|
{title && (
|
|
22
|
-
<
|
|
23
|
+
<Title size="XL" className="font-medium m-0 mb-4 whitespace-pre-wrap max-w-[600px]">
|
|
23
24
|
{title}
|
|
24
|
-
</
|
|
25
|
+
</Title>
|
|
25
26
|
)}
|
|
26
27
|
<BaseTile context={context} description={description} items={items} buttons={buttons}>
|
|
27
28
|
{benefits?.length ? (
|
|
28
|
-
<div className="flex gap-6 mt-6 mb-
|
|
29
|
+
<div className="flex gap-6 mt-6 mb-3.5">{benefits.map(renderBenefit)}</div>
|
|
29
30
|
) : null}
|
|
30
31
|
</BaseTile>
|
|
31
32
|
</div>
|
package/src/ProductGallery.tsx
CHANGED
|
@@ -54,9 +54,13 @@ export const ProductGallery = JSX<ProductGalleryProps>(
|
|
|
54
54
|
|
|
55
55
|
function renderProductBlock(block: ProductBlockInnerContent, i: number, context) {
|
|
56
56
|
return (
|
|
57
|
-
<section key={String(i)} className="grow-0 shrink-0 basis-full" role="listitem">
|
|
58
|
-
<div className="p-
|
|
59
|
-
<ProductBlockInner
|
|
57
|
+
<section key={String(i)} className="flex grow-0 shrink-0 basis-full" role="listitem">
|
|
58
|
+
<div className="p-10 flex grow">
|
|
59
|
+
<ProductBlockInner
|
|
60
|
+
className="pl-2.5 pt-2.5 pb-1.5 pr-[6.25rem]"
|
|
61
|
+
context={context}
|
|
62
|
+
{...block}
|
|
63
|
+
/>
|
|
60
64
|
</div>
|
|
61
65
|
</section>
|
|
62
66
|
);
|
package/src/ProductTile.tsx
CHANGED
|
@@ -14,7 +14,7 @@ export const ProductTile = JSX<ProductTileProps>((props) => {
|
|
|
14
14
|
const { benefits, version } = props;
|
|
15
15
|
return (
|
|
16
16
|
<Tile {...props}>
|
|
17
|
-
<div className="flex mt-5 mb-
|
|
17
|
+
<div className="flex mt-5 mb-1">
|
|
18
18
|
{benefits?.length ? (
|
|
19
19
|
<div className="mr-8">{benefits.map(renderBenefitDescription)}</div>
|
|
20
20
|
) : null}
|
|
@@ -32,14 +32,14 @@ function renderBenefitLabel(benefit: Benefit, i: number, version = 'primary') {
|
|
|
32
32
|
secondary: 'text-white',
|
|
33
33
|
};
|
|
34
34
|
return (
|
|
35
|
-
<div key={String(i)} className={`text-sm
|
|
35
|
+
<div key={String(i)} className={`text-sm ${i ? 'mt-4' : ''} ${labelStyleMap[version]}`}>
|
|
36
36
|
{benefit.label}
|
|
37
37
|
</div>
|
|
38
38
|
);
|
|
39
39
|
}
|
|
40
40
|
function renderBenefitDescription(benefit: Benefit, i: number) {
|
|
41
41
|
return (
|
|
42
|
-
<div key={String(i)} className=
|
|
42
|
+
<div key={String(i)} className={`text-xl font-medium ${i ? 'mt-2.5' : ''}`}>
|
|
43
43
|
{benefit.description}
|
|
44
44
|
</div>
|
|
45
45
|
);
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { JSX } from '@redneckz/uni-jsx';
|
|
2
|
+
import type { BaseTileContent } from './BaseTile';
|
|
3
|
+
import { Tile } from './Tile';
|
|
4
|
+
import type { UniBlockProps } from './types';
|
|
5
|
+
|
|
6
|
+
export interface PromoTileContent extends BaseTileContent {
|
|
7
|
+
date?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface PromoTileProps extends PromoTileContent, UniBlockProps {}
|
|
11
|
+
|
|
12
|
+
export const PromoTile = JSX<PromoTileProps>(
|
|
13
|
+
({
|
|
14
|
+
className,
|
|
15
|
+
context,
|
|
16
|
+
title = 'Акции и спецпредложения',
|
|
17
|
+
date,
|
|
18
|
+
description,
|
|
19
|
+
buttons = [],
|
|
20
|
+
version,
|
|
21
|
+
}) => {
|
|
22
|
+
return (
|
|
23
|
+
<Tile
|
|
24
|
+
className={className}
|
|
25
|
+
context={context}
|
|
26
|
+
title={title}
|
|
27
|
+
buttons={buttons}
|
|
28
|
+
version={version}
|
|
29
|
+
>
|
|
30
|
+
<div>
|
|
31
|
+
{date && <div className="text-sm mb-2">{formatDate(date)}</div>}
|
|
32
|
+
<div className="text-base">{description}</div>
|
|
33
|
+
</div>
|
|
34
|
+
</Tile>
|
|
35
|
+
);
|
|
36
|
+
},
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
function formatDate(date: string) {
|
|
40
|
+
const dateObj = new Date(date);
|
|
41
|
+
const dateFormat: Intl.DateTimeFormatOptions = {
|
|
42
|
+
day: 'numeric',
|
|
43
|
+
month: 'long',
|
|
44
|
+
year: 'numeric',
|
|
45
|
+
};
|
|
46
|
+
return dateObj.toLocaleString('ru-RU', dateFormat).replace('г.', '');
|
|
47
|
+
}
|
package/src/StepsBlock.tsx
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { JSX } from '@redneckz/uni-jsx';
|
|
2
2
|
import { NewDocIcon, PassSendIcon, ActualBalanceIcon } from './Icons/index';
|
|
3
3
|
import type { UniBlockProps } from './types';
|
|
4
|
+
import { Title } from './ui-kit/Title';
|
|
4
5
|
import { joinList } from './utils/joinList';
|
|
5
6
|
|
|
6
7
|
const ICONS = { NewDocIcon, PassSendIcon, ActualBalanceIcon };
|
|
@@ -24,7 +25,7 @@ export const StepsBlock = JSX<StepsBlockProps>(({ className, title, steps }) =>
|
|
|
24
25
|
className || ''
|
|
25
26
|
}`}
|
|
26
27
|
>
|
|
27
|
-
<
|
|
28
|
+
<Title className="font-medium m-0 max-w-[47rem] text-center">{title}</Title>
|
|
28
29
|
{steps?.length ? (
|
|
29
30
|
<div>
|
|
30
31
|
<div className="flex mt-9 items-center px-[88px]">
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { context } from './setup-fixture';
|
|
2
|
+
import { TextBlock } from './TextBlock';
|
|
3
|
+
import { Picture } from './types';
|
|
4
|
+
|
|
5
|
+
const image: Picture = {
|
|
6
|
+
src: 'bank-card.png',
|
|
7
|
+
format: 'webp',
|
|
8
|
+
size: {
|
|
9
|
+
width: 48,
|
|
10
|
+
height: 48,
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default (
|
|
15
|
+
<div className="font-sans overflow-hidden">
|
|
16
|
+
<div>
|
|
17
|
+
<p>Private clients</p>
|
|
18
|
+
<div className="flex flex-col gap-6" data-theme="pc">
|
|
19
|
+
<TextBlock
|
|
20
|
+
context={context}
|
|
21
|
+
title="Все карты Россельхозбанка работают"
|
|
22
|
+
description="Если не планируете поездку за границу, продолжайте пользоваться картой Своя. Для поездок за границу можно заказать карту 'Кредитная карта Своя Union Pay' на сайте и в приложении Россельхозбанка"
|
|
23
|
+
blockVersion="primary"
|
|
24
|
+
iconVersion="small"
|
|
25
|
+
/>
|
|
26
|
+
<TextBlock
|
|
27
|
+
context={context}
|
|
28
|
+
title="Все карты Россельхозбанка работают"
|
|
29
|
+
description="Если не планируете поездку за границу, продолжайте пользоваться картой Своя. Для поездок за границу можно заказать карту 'Кредитная карта Своя Union Pay' на сайте и в приложении Россельхозбанка"
|
|
30
|
+
blockVersion="primary"
|
|
31
|
+
iconVersion="big"
|
|
32
|
+
image={image}
|
|
33
|
+
/>
|
|
34
|
+
<TextBlock
|
|
35
|
+
context={context}
|
|
36
|
+
title="Все карты Россельхозбанка работают"
|
|
37
|
+
description="Если не планируете поездку за границу, продолжайте пользоваться картой Своя. Для поездок за границу можно заказать карту 'Кредитная карта Своя Union Pay' на сайте и в приложении Россельхозбанка"
|
|
38
|
+
blockVersion="primary"
|
|
39
|
+
iconVersion="none"
|
|
40
|
+
/>
|
|
41
|
+
<TextBlock
|
|
42
|
+
context={context}
|
|
43
|
+
description="Если не планируете поездку за границу, продолжайте пользоваться картой Своя. Для поездок за границу можно заказать карту 'Кредитная карта Своя Union Pay' на сайте и в приложении Россельхозбанка"
|
|
44
|
+
blockVersion="primary"
|
|
45
|
+
iconVersion="small"
|
|
46
|
+
/>
|
|
47
|
+
<TextBlock
|
|
48
|
+
context={context}
|
|
49
|
+
title="Все карты Россельхозбанка работают"
|
|
50
|
+
description="Если не планируете поездку за границу, продолжайте пользоваться картой Своя. Для поездок за границу можно заказать карту 'Кредитная карта Своя Union Pay' на сайте и в приложении Россельхозбанка"
|
|
51
|
+
blockVersion="secondary"
|
|
52
|
+
iconVersion="small"
|
|
53
|
+
/>
|
|
54
|
+
<TextBlock
|
|
55
|
+
context={context}
|
|
56
|
+
title="Все карты Россельхозбанка работают"
|
|
57
|
+
description="Если не планируете поездку за границу, продолжайте пользоваться картой Своя. Для поездок за границу можно заказать карту 'Кредитная карта Своя Union Pay' на сайте и в приложении Россельхозбанка"
|
|
58
|
+
blockVersion="secondary-light"
|
|
59
|
+
iconVersion="small"
|
|
60
|
+
/>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
<div>
|
|
64
|
+
<p>Business clients</p>
|
|
65
|
+
<div className="flex flex-col gap-6" data-theme="bc">
|
|
66
|
+
<TextBlock
|
|
67
|
+
context={context}
|
|
68
|
+
title="Все карты Россельхозбанка работают"
|
|
69
|
+
description="Если не планируете поездку за границу, продолжайте пользоваться картой Своя. Для поездок за границу можно заказать карту 'Кредитная карта Своя Union Pay' на сайте и в приложении Россельхозбанка"
|
|
70
|
+
blockVersion="primary"
|
|
71
|
+
iconVersion="small"
|
|
72
|
+
/>
|
|
73
|
+
<TextBlock
|
|
74
|
+
context={context}
|
|
75
|
+
title="Все карты Россельхозбанка работают"
|
|
76
|
+
description="Если не планируете поездку за границу, продолжайте пользоваться картой Своя. Для поездок за границу можно заказать карту 'Кредитная карта Своя Union Pay' на сайте и в приложении Россельхозбанка"
|
|
77
|
+
blockVersion="secondary"
|
|
78
|
+
iconVersion="small"
|
|
79
|
+
/>
|
|
80
|
+
<TextBlock
|
|
81
|
+
context={context}
|
|
82
|
+
title="Все карты Россельхозбанка работают"
|
|
83
|
+
description="Если не планируете поездку за границу, продолжайте пользоваться картой Своя. Для поездок за границу можно заказать карту 'Кредитная карта Своя Union Pay' на сайте и в приложении Россельхозбанка"
|
|
84
|
+
blockVersion="secondary-light"
|
|
85
|
+
iconVersion="small"
|
|
86
|
+
/>
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
<div>
|
|
90
|
+
<p>Ecosystem own</p>
|
|
91
|
+
<div className="flex flex-col gap-6" data-theme="eo">
|
|
92
|
+
<TextBlock
|
|
93
|
+
context={context}
|
|
94
|
+
title="Все карты Россельхозбанка работают"
|
|
95
|
+
description="Если не планируете поездку за границу, продолжайте пользоваться картой Своя. Для поездок за границу можно заказать карту 'Кредитная карта Своя Union Pay' на сайте и в приложении Россельхозбанка"
|
|
96
|
+
blockVersion="primary"
|
|
97
|
+
iconVersion="small"
|
|
98
|
+
/>
|
|
99
|
+
<TextBlock
|
|
100
|
+
context={context}
|
|
101
|
+
title="Все карты Россельхозбанка работают"
|
|
102
|
+
description="Если не планируете поездку за границу, продолжайте пользоваться картой Своя. Для поездок за границу можно заказать карту 'Кредитная карта Своя Union Pay' на сайте и в приложении Россельхозбанка"
|
|
103
|
+
blockVersion="secondary"
|
|
104
|
+
iconVersion="small"
|
|
105
|
+
/>
|
|
106
|
+
<TextBlock
|
|
107
|
+
context={context}
|
|
108
|
+
title="Все карты Россельхозбанка работают"
|
|
109
|
+
description="Если не планируете поездку за границу, продолжайте пользоваться картой Своя. Для поездок за границу можно заказать карту 'Кредитная карта Своя Union Pay' на сайте и в приложении Россельхозбанка"
|
|
110
|
+
blockVersion="secondary-light"
|
|
111
|
+
iconVersion="small"
|
|
112
|
+
/>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
);
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { JSX } from '@redneckz/uni-jsx';
|
|
2
|
+
import type { UniBlockProps, Picture } from './types';
|
|
3
|
+
import { Img } from './Img';
|
|
4
|
+
|
|
5
|
+
type TextBlockVersion = 'primary' | 'secondary' | 'secondary-light';
|
|
6
|
+
type TextBlockIconVersion = 'none' | 'small' | 'big';
|
|
7
|
+
|
|
8
|
+
export interface TextBlockContent {
|
|
9
|
+
title?: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
blockVersion?: TextBlockVersion;
|
|
12
|
+
iconVersion?: TextBlockIconVersion;
|
|
13
|
+
image?: Picture;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface TextBlockProps extends TextBlockContent, UniBlockProps {}
|
|
17
|
+
|
|
18
|
+
const textBlockStyleMaps: Record<
|
|
19
|
+
TextBlockVersion,
|
|
20
|
+
{ background: string; icon: string; title: string; description: string }
|
|
21
|
+
> = {
|
|
22
|
+
primary: {
|
|
23
|
+
background: 'bg-white',
|
|
24
|
+
icon: 'bg-primary-main text-white',
|
|
25
|
+
title: 'text-base',
|
|
26
|
+
description: 'text-secondary-text',
|
|
27
|
+
},
|
|
28
|
+
secondary: {
|
|
29
|
+
background: 'bg-primary-main',
|
|
30
|
+
icon: 'bg-white text-primary-main',
|
|
31
|
+
title: 'text-white',
|
|
32
|
+
description: 'text-white',
|
|
33
|
+
},
|
|
34
|
+
'secondary-light': {
|
|
35
|
+
background: 'bg-primary-main/10',
|
|
36
|
+
icon: 'bg-primary-main text-white',
|
|
37
|
+
title: 'text-base',
|
|
38
|
+
description: 'text-secondary-text',
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export const TextBlock = JSX<TextBlockProps>(
|
|
43
|
+
({ title, description, blockVersion = 'primary', iconVersion, image, className }) => {
|
|
44
|
+
const textBlockStyleMap = textBlockStyleMaps[blockVersion];
|
|
45
|
+
return (
|
|
46
|
+
<section
|
|
47
|
+
className={`font-sans px-9 py-4 flex ${textBlockStyleMap.background} ${className || ''}`}
|
|
48
|
+
>
|
|
49
|
+
{iconVersion && iconVersion === 'small' ? renderIcon(textBlockStyleMap.icon) : null}
|
|
50
|
+
{iconVersion && iconVersion === 'big' ? renderImage(image) : null}
|
|
51
|
+
<div className="py-0.5">
|
|
52
|
+
{title && <div className={`font-medium mb-1 ${textBlockStyleMap.title}`}>{title}</div>}
|
|
53
|
+
{description && (
|
|
54
|
+
<div className={`text-sm ${textBlockStyleMap.description}`}>{description}</div>
|
|
55
|
+
)}
|
|
56
|
+
</div>
|
|
57
|
+
</section>
|
|
58
|
+
);
|
|
59
|
+
},
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
function renderIcon(className: string) {
|
|
63
|
+
return (
|
|
64
|
+
<div className={`pt-1.5 pr-4`}>
|
|
65
|
+
<div className={`rounded-full h-4 w-4 text-center text-xs ${className}`}>i</div>
|
|
66
|
+
</div>
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function renderImage(image?: Picture) {
|
|
71
|
+
return image?.src ? <Img className="pt-0.5 pr-3" image={image} /> : null;
|
|
72
|
+
}
|
package/src/Tile.tsx
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { JSX } from '@redneckz/uni-jsx';
|
|
2
|
-
import type { BlockVersion,
|
|
2
|
+
import type { BlockVersion, UniBlockProps } from './types';
|
|
3
3
|
import { BaseTile } from './BaseTile';
|
|
4
4
|
import type { BaseTileContent } from './BaseTile';
|
|
5
|
+
import { getColSpan } from './utils/getColSpan';
|
|
5
6
|
|
|
6
7
|
export interface TileProps extends BaseTileContent, UniBlockProps {}
|
|
7
8
|
|
|
@@ -12,9 +13,25 @@ const tileStyleMap: Record<BlockVersion, string> = {
|
|
|
12
13
|
|
|
13
14
|
export const Tile = JSX<TileProps>((props) => {
|
|
14
15
|
const { children, className, version = 'primary' } = props;
|
|
16
|
+
|
|
15
17
|
return (
|
|
16
|
-
<section
|
|
18
|
+
<section
|
|
19
|
+
className={`font-sans p-9 min-h-[320px] box-border ${className || ''} ${
|
|
20
|
+
tileStyleMap[version]
|
|
21
|
+
} ${getContainerPaddingRight(className)} `}
|
|
22
|
+
>
|
|
17
23
|
<BaseTile {...props}>{children}</BaseTile>
|
|
18
24
|
</section>
|
|
19
25
|
);
|
|
20
26
|
});
|
|
27
|
+
|
|
28
|
+
function getContainerPaddingRight(className: string = '') {
|
|
29
|
+
const colSpan = getColSpan(className);
|
|
30
|
+
if (colSpan <= 6) {
|
|
31
|
+
return 'pr-9';
|
|
32
|
+
} else if (colSpan <= 8) {
|
|
33
|
+
return 'pr-[4.75rem]';
|
|
34
|
+
} else {
|
|
35
|
+
return 'pr-[9.4rem]';
|
|
36
|
+
}
|
|
37
|
+
}
|
package/src/api/DaDataAPI.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getGeolocation } from '../utils/getGeolocation';
|
|
2
2
|
|
|
3
3
|
import type { DaDataResult } from '../types';
|
|
4
4
|
|
|
@@ -9,7 +9,7 @@ export function DaDataAPI(baseURL = '') {
|
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
try {
|
|
12
|
-
const coords = await
|
|
12
|
+
const coords = await getGeolocation();
|
|
13
13
|
const response = await fetch(`${baseURL}/geolocate`, {
|
|
14
14
|
method: 'POST',
|
|
15
15
|
mode: 'cors',
|
package/src/common.css
CHANGED
|
@@ -2,27 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
/* Private clients | Green */
|
|
4
4
|
[data-theme='pc'] {
|
|
5
|
-
--color-primary-main:
|
|
6
|
-
--color-primary-hover:
|
|
7
|
-
--color-primary-active:
|
|
8
|
-
--color-secondary-hover:
|
|
9
|
-
--color-secondary-active:
|
|
5
|
+
--color-primary-main: 66, 171, 68;
|
|
6
|
+
--color-primary-hover: 36, 131, 65;
|
|
7
|
+
--color-primary-active: 36, 95, 52;
|
|
8
|
+
--color-secondary-hover: 216, 242, 217;
|
|
9
|
+
--color-secondary-active: 197, 226, 198;
|
|
10
10
|
}
|
|
11
11
|
/* Business clients | Light-Green */
|
|
12
12
|
[data-theme='bc'] {
|
|
13
|
-
--color-primary-main:
|
|
14
|
-
--color-primary-hover:
|
|
15
|
-
--color-primary-active:
|
|
16
|
-
--color-secondary-hover:
|
|
17
|
-
--color-secondary-active:
|
|
13
|
+
--color-primary-main: 131, 184, 62;
|
|
14
|
+
--color-primary-hover: 92, 146, 29;
|
|
15
|
+
--color-primary-active: 60, 94, 16;
|
|
16
|
+
--color-secondary-hover: 232, 244, 217;
|
|
17
|
+
--color-secondary-active: 216, 227, 202;
|
|
18
18
|
}
|
|
19
19
|
/* Ecosystem own | Yellow */
|
|
20
20
|
[data-theme='eo'] {
|
|
21
|
-
--color-primary-main:
|
|
22
|
-
--color-primary-hover:
|
|
23
|
-
--color-primary-active:
|
|
24
|
-
--color-secondary-hover:
|
|
25
|
-
--color-secondary-active:
|
|
21
|
+
--color-primary-main: 221, 182, 61;
|
|
22
|
+
--color-primary-hover: 187, 151, 39;
|
|
23
|
+
--color-primary-active: 126, 99, 12;
|
|
24
|
+
--color-secondary-hover: 241, 236, 221;
|
|
25
|
+
--color-secondary-active: 229, 222, 199;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
@tailwind components;
|
package/src/setup-fixture.ts
CHANGED
|
@@ -32,11 +32,15 @@ export const context: ContentPageContext = {
|
|
|
32
32
|
return { data };
|
|
33
33
|
},
|
|
34
34
|
useGeolocation: (defaultLocation) => {
|
|
35
|
-
const [city, setCity] = useState(
|
|
35
|
+
const [city, setCity] = useState(
|
|
36
|
+
globalThis.localStorage.getItem('location') || defaultLocation,
|
|
37
|
+
);
|
|
36
38
|
|
|
37
39
|
const getCity = () => {
|
|
38
40
|
DaData.getFetcherAddress().then((_) => {
|
|
39
|
-
|
|
41
|
+
const location = _ || defaultLocation;
|
|
42
|
+
globalThis.localStorage.setItem('location', location);
|
|
43
|
+
setCity(location);
|
|
40
44
|
});
|
|
41
45
|
};
|
|
42
46
|
|
package/src/types.ts
CHANGED
|
@@ -15,7 +15,7 @@ import type { ContentPageContext } from './ContentPageContext';
|
|
|
15
15
|
export type ColorPalette = 'pc' | 'bc' | 'eo';
|
|
16
16
|
|
|
17
17
|
export type BlockVersion = 'primary' | 'secondary';
|
|
18
|
-
|
|
18
|
+
export type ButtonVersion = 'primary' | 'secondary';
|
|
19
19
|
export interface BlockDef {
|
|
20
20
|
type: string;
|
|
21
21
|
style?: string[];
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import '../setup-fixture';
|
|
2
2
|
|
|
3
3
|
import { Button } from './Button';
|
|
4
|
+
import { IconButton } from './IconButton';
|
|
4
5
|
|
|
5
6
|
export default {
|
|
6
7
|
all: (
|
|
@@ -60,6 +61,27 @@ export default {
|
|
|
60
61
|
/>
|
|
61
62
|
</div>
|
|
62
63
|
</div>
|
|
64
|
+
<div>
|
|
65
|
+
<p>With Icon</p>
|
|
66
|
+
<div className="flex gap-6" data-theme="pc">
|
|
67
|
+
<IconButton
|
|
68
|
+
href="https://www.rshb.ru/"
|
|
69
|
+
target="_blank"
|
|
70
|
+
aboveText="Доступно в"
|
|
71
|
+
text="Google Play"
|
|
72
|
+
version="secondary"
|
|
73
|
+
icon="PlayMarket"
|
|
74
|
+
/>
|
|
75
|
+
<IconButton
|
|
76
|
+
href="https://www.rshb.ru/"
|
|
77
|
+
target="_blank"
|
|
78
|
+
aboveText="Загрузите в"
|
|
79
|
+
text="App Store"
|
|
80
|
+
version="secondary"
|
|
81
|
+
icon="AppleIcon"
|
|
82
|
+
/>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
63
85
|
</div>
|
|
64
86
|
),
|
|
65
87
|
'primary (Private clients)': (
|
package/src/ui-kit/Button.tsx
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { JSX } from '@redneckz/uni-jsx';
|
|
2
|
-
import type { LinkContent } from '../types';
|
|
2
|
+
import type { ButtonVersion, LinkContent } from '../types';
|
|
3
3
|
|
|
4
|
-
type ButtonVersion = 'primary' | 'secondary';
|
|
5
4
|
export interface ButtonProps extends LinkContent {
|
|
6
5
|
className?: string;
|
|
7
6
|
onClick?: (ev: MouseEvent) => any;
|
|
@@ -21,7 +20,7 @@ const buttonDisabledStyleMap: Record<ButtonVersion, string> = {
|
|
|
21
20
|
secondary: 'bg-secondary-light text-secondary-text',
|
|
22
21
|
};
|
|
23
22
|
|
|
24
|
-
const styleButton = 'inline-block rounded-md px-
|
|
23
|
+
const styleButton = 'inline-block rounded-md px-8 py-2 text-center font-sans';
|
|
25
24
|
|
|
26
25
|
export const Button = JSX<ButtonProps>(
|
|
27
26
|
({
|
|
@@ -41,12 +40,16 @@ export const Button = JSX<ButtonProps>(
|
|
|
41
40
|
role="button"
|
|
42
41
|
aria-disabled="true"
|
|
43
42
|
aria-label={ariaLabel}
|
|
44
|
-
|
|
43
|
+
tabIndex="-1"
|
|
45
44
|
className={`${styleButton} select-none ${buttonDisabledStyleMap[version]} ${
|
|
46
45
|
className || ''
|
|
47
46
|
}`}
|
|
48
47
|
>
|
|
49
|
-
|
|
48
|
+
{children ? (
|
|
49
|
+
<div>{children}</div>
|
|
50
|
+
) : (
|
|
51
|
+
<div className="text-sm font-medium py-1.5">{text}</div>
|
|
52
|
+
)}
|
|
50
53
|
</div>
|
|
51
54
|
);
|
|
52
55
|
}
|
|
@@ -59,7 +62,11 @@ export const Button = JSX<ButtonProps>(
|
|
|
59
62
|
onClick={onClick}
|
|
60
63
|
aria-label={ariaLabel}
|
|
61
64
|
>
|
|
62
|
-
|
|
65
|
+
{children ? (
|
|
66
|
+
<div>{children}</div>
|
|
67
|
+
) : (
|
|
68
|
+
<div className="text-sm font-medium py-1.5">{text}</div>
|
|
69
|
+
)}
|
|
63
70
|
</a>
|
|
64
71
|
);
|
|
65
72
|
},
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { JSX } from '@redneckz/uni-jsx';
|
|
2
|
+
import { AppleIcon, PlayMarket } from '../Icons/index';
|
|
3
|
+
import type { ButtonProps } from './Button';
|
|
4
|
+
import { Button } from './Button';
|
|
5
|
+
|
|
6
|
+
const ICONS = { AppleIcon, PlayMarket };
|
|
7
|
+
|
|
8
|
+
export interface IconButtonProps extends ButtonProps {
|
|
9
|
+
icon?: string;
|
|
10
|
+
aboveText?: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const IconButton = JSX<IconButtonProps>((props) => {
|
|
14
|
+
return (
|
|
15
|
+
<Button {...props}>
|
|
16
|
+
{props.icon ? (
|
|
17
|
+
<div className="flex items-center">
|
|
18
|
+
<div className="mr-2">{ICONS[props.icon as keyof typeof ICONS]?.()}</div>
|
|
19
|
+
<div>
|
|
20
|
+
<div className="text-xxs text-left">{props.aboveText}</div>
|
|
21
|
+
<div className="text-sm font-medium text-left">{props.text}</div>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
) : null}
|
|
25
|
+
</Button>
|
|
26
|
+
);
|
|
27
|
+
});
|