@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.
Files changed (155) hide show
  1. package/dist/BaseTile.d.ts +4 -2
  2. package/dist/BaseTile.js +11 -11
  3. package/dist/BaseTile.js.map +1 -1
  4. package/dist/Blocks.d.ts +5 -1
  5. package/dist/Blocks.js +4 -0
  6. package/dist/Blocks.js.map +1 -1
  7. package/dist/ContentPage.js +1 -1
  8. package/dist/ContentPage.js.map +1 -1
  9. package/dist/Icons/AppleIcon.d.ts +1 -0
  10. package/dist/Icons/AppleIcon.js +6 -0
  11. package/dist/Icons/AppleIcon.js.map +1 -0
  12. package/dist/Icons/PlayMarket.d.ts +1 -0
  13. package/dist/Icons/PlayMarket.js +6 -0
  14. package/dist/Icons/PlayMarket.js.map +1 -0
  15. package/dist/Icons/index.d.ts +2 -0
  16. package/dist/Icons/index.js +5 -1
  17. package/dist/Icons/index.js.map +1 -1
  18. package/dist/MobileAppTile.d.ts +2 -1
  19. package/dist/MobileAppTile.js +2 -2
  20. package/dist/MobileAppTile.js.map +1 -1
  21. package/dist/MobileBlocks.d.ts +1 -0
  22. package/dist/MobileBlocks.js +2 -0
  23. package/dist/MobileBlocks.js.map +1 -1
  24. package/dist/ProductBlock.js +1 -1
  25. package/dist/ProductBlock.js.map +1 -1
  26. package/dist/ProductBlockInner.js +2 -1
  27. package/dist/ProductBlockInner.js.map +1 -1
  28. package/dist/ProductGallery.js +1 -1
  29. package/dist/ProductGallery.js.map +1 -1
  30. package/dist/ProductTile.js +3 -3
  31. package/dist/ProductTile.js.map +1 -1
  32. package/dist/PromoTile.d.ts +8 -0
  33. package/dist/PromoTile.js +18 -0
  34. package/dist/PromoTile.js.map +1 -0
  35. package/dist/StepsBlock.js +2 -1
  36. package/dist/StepsBlock.js.map +1 -1
  37. package/dist/TextBlock.d.ts +14 -0
  38. package/dist/TextBlock.js +36 -0
  39. package/dist/TextBlock.js.map +1 -0
  40. package/dist/Tile.js +14 -1
  41. package/dist/Tile.js.map +1 -1
  42. package/dist/api/DaDataAPI.js +2 -2
  43. package/dist/api/DaDataAPI.js.map +1 -1
  44. package/dist/types.d.ts +1 -0
  45. package/dist/ui-kit/Button.d.ts +1 -3
  46. package/dist/ui-kit/Button.js +3 -3
  47. package/dist/ui-kit/Button.js.map +1 -1
  48. package/dist/ui-kit/IconButton.d.ts +6 -0
  49. package/dist/ui-kit/IconButton.js +11 -0
  50. package/dist/ui-kit/IconButton.js.map +1 -0
  51. package/dist/ui-kit/Title.d.ts +11 -0
  52. package/dist/ui-kit/Title.js +17 -0
  53. package/dist/ui-kit/Title.js.map +1 -0
  54. package/dist/utils/getColSpan.d.ts +1 -0
  55. package/dist/utils/getColSpan.js +9 -0
  56. package/dist/utils/getColSpan.js.map +1 -0
  57. package/dist/utils/getGeolocation.d.ts +1 -0
  58. package/dist/utils/getGeolocation.js +5 -0
  59. package/dist/utils/getGeolocation.js.map +1 -0
  60. package/lib/BaseTile.d.ts +4 -2
  61. package/lib/BaseTile.js +11 -11
  62. package/lib/BaseTile.js.map +1 -1
  63. package/lib/Blocks.d.ts +5 -1
  64. package/lib/Blocks.js +4 -0
  65. package/lib/Blocks.js.map +1 -1
  66. package/lib/ContentPage.js +1 -1
  67. package/lib/ContentPage.js.map +1 -1
  68. package/lib/Icons/AppleIcon.d.ts +1 -0
  69. package/lib/Icons/AppleIcon.js +3 -0
  70. package/lib/Icons/AppleIcon.js.map +1 -0
  71. package/lib/Icons/PlayMarket.d.ts +1 -0
  72. package/lib/Icons/PlayMarket.js +3 -0
  73. package/lib/Icons/PlayMarket.js.map +1 -0
  74. package/lib/Icons/index.d.ts +2 -0
  75. package/lib/Icons/index.js +2 -0
  76. package/lib/Icons/index.js.map +1 -1
  77. package/lib/MobileAppTile.d.ts +2 -1
  78. package/lib/MobileAppTile.js +2 -2
  79. package/lib/MobileAppTile.js.map +1 -1
  80. package/lib/MobileBlocks.d.ts +1 -0
  81. package/lib/MobileBlocks.js +2 -0
  82. package/lib/MobileBlocks.js.map +1 -1
  83. package/lib/ProductBlock.js +1 -1
  84. package/lib/ProductBlock.js.map +1 -1
  85. package/lib/ProductBlockInner.js +2 -1
  86. package/lib/ProductBlockInner.js.map +1 -1
  87. package/lib/ProductGallery.js +1 -1
  88. package/lib/ProductGallery.js.map +1 -1
  89. package/lib/ProductTile.js +3 -3
  90. package/lib/ProductTile.js.map +1 -1
  91. package/lib/PromoTile.d.ts +8 -0
  92. package/lib/PromoTile.js +16 -0
  93. package/lib/PromoTile.js.map +1 -0
  94. package/lib/StepsBlock.js +2 -1
  95. package/lib/StepsBlock.js.map +1 -1
  96. package/lib/TextBlock.d.ts +14 -0
  97. package/lib/TextBlock.js +34 -0
  98. package/lib/TextBlock.js.map +1 -0
  99. package/lib/Tile.js +14 -1
  100. package/lib/Tile.js.map +1 -1
  101. package/lib/api/DaDataAPI.js +2 -2
  102. package/lib/api/DaDataAPI.js.map +1 -1
  103. package/lib/common.css +1 -1
  104. package/lib/types.d.ts +1 -0
  105. package/lib/ui-kit/Button.d.ts +1 -3
  106. package/lib/ui-kit/Button.js +3 -3
  107. package/lib/ui-kit/Button.js.map +1 -1
  108. package/lib/ui-kit/IconButton.d.ts +6 -0
  109. package/lib/ui-kit/IconButton.js +9 -0
  110. package/lib/ui-kit/IconButton.js.map +1 -0
  111. package/lib/ui-kit/Title.d.ts +11 -0
  112. package/lib/ui-kit/Title.js +15 -0
  113. package/lib/ui-kit/Title.js.map +1 -0
  114. package/lib/utils/getColSpan.d.ts +1 -0
  115. package/lib/utils/getColSpan.js +6 -0
  116. package/lib/utils/getColSpan.js.map +1 -0
  117. package/lib/utils/getGeolocation.d.ts +1 -0
  118. package/lib/utils/getGeolocation.js +2 -0
  119. package/lib/utils/getGeolocation.js.map +1 -0
  120. package/package.json +1 -1
  121. package/src/BaseTile.tsx +24 -17
  122. package/src/Blocks.ts +6 -0
  123. package/src/ContentPage.fixture.tsx +1 -1
  124. package/src/ContentPage.page.json +47 -22
  125. package/src/ContentPage.tsx +1 -1
  126. package/src/Icons/AppleIcon.tsx +15 -0
  127. package/src/Icons/PlayMarket.tsx +8 -0
  128. package/src/Icons/index.ts +2 -0
  129. package/src/MobileAppTile.tsx +4 -3
  130. package/src/MobileBlocks.ts +2 -0
  131. package/src/ProductBlock.tsx +3 -1
  132. package/src/ProductBlockInner.tsx +5 -4
  133. package/src/ProductGallery.tsx +7 -3
  134. package/src/ProductTile.tsx +3 -3
  135. package/src/PromoTile.tsx +47 -0
  136. package/src/StepsBlock.tsx +2 -1
  137. package/src/TextBlock.fixture.tsx +116 -0
  138. package/src/TextBlock.tsx +72 -0
  139. package/src/Tile.tsx +19 -2
  140. package/src/api/DaDataAPI.ts +2 -2
  141. package/src/common.css +15 -15
  142. package/src/setup-fixture.ts +6 -2
  143. package/src/types.ts +1 -1
  144. package/src/ui-kit/Button.fixture.tsx +22 -0
  145. package/src/ui-kit/Button.tsx +13 -6
  146. package/src/ui-kit/IconButton.tsx +27 -0
  147. package/src/ui-kit/Title.tsx +25 -0
  148. package/src/utils/getColSpan.ts +5 -0
  149. package/src/utils/{getCurrentPosition.ts → getGeolocation.ts} +1 -1
  150. package/dist/utils/getCurrentPosition.d.ts +0 -1
  151. package/dist/utils/getCurrentPosition.js +0 -5
  152. package/dist/utils/getCurrentPosition.js.map +0 -1
  153. package/lib/utils/getCurrentPosition.d.ts +0 -1
  154. package/lib/utils/getCurrentPosition.js +0 -2
  155. 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
+ );
@@ -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';
@@ -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">
@@ -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,
@@ -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 className={`font-sans bg-white pl-12 pr-[7.5rem] py-10 ${className || ''}`}>
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
- <h1 className="font-medium text-title-lg m-0 whitespace-pre-wrap max-w-[600px]">
23
+ <Title size="XL" className="font-medium m-0 mb-4 whitespace-pre-wrap max-w-[600px]">
23
24
  {title}
24
- </h1>
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-12">{benefits.map(renderBenefit)}</div>
29
+ <div className="flex gap-6 mt-6 mb-3.5">{benefits.map(renderBenefit)}</div>
29
30
  ) : null}
30
31
  </BaseTile>
31
32
  </div>
@@ -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-11 pr-[7.5rem] ">
59
- <ProductBlockInner context={context} {...block} />
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
  );
@@ -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-10">
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 mb-4 ${labelStyleMap[version]}`}>
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="text-xl font-medium mb-2.5">
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
+ }
@@ -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
- <h2 className="font-medium text-title m-0 max-w-[47rem] text-center">{title}</h2>
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, Picture, UniBlockProps } from './types';
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 className={`font-sans p-9 ${className || ''} ${tileStyleMap[version]}`}>
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
+ }
@@ -1,4 +1,4 @@
1
- import { getCurrentPosition } from '../utils/getCurrentPosition';
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 getCurrentPosition();
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: #42ab44;
6
- --color-primary-hover: #248341;
7
- --color-primary-active: #245f34;
8
- --color-secondary-hover: #c5e2c6;
9
- --color-secondary-active: #d8f2d9;
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: #83b83e;
14
- --color-primary-hover: #5c921d;
15
- --color-primary-active: #3c5e10;
16
- --color-secondary-hover: #e8f4d9;
17
- --color-secondary-active: #d8e3ca;
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: #ddb63d;
22
- --color-primary-hover: #bb9727;
23
- --color-primary-active: #7e630c;
24
- --color-secondary-hover: #f1ecdd;
25
- --color-secondary-active: #e5dec7;
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;
@@ -32,11 +32,15 @@ export const context: ContentPageContext = {
32
32
  return { data };
33
33
  },
34
34
  useGeolocation: (defaultLocation) => {
35
- const [city, setCity] = useState(defaultLocation);
35
+ const [city, setCity] = useState(
36
+ globalThis.localStorage.getItem('location') || defaultLocation,
37
+ );
36
38
 
37
39
  const getCity = () => {
38
40
  DaData.getFetcherAddress().then((_) => {
39
- setCity(_ || defaultLocation);
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)': (
@@ -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-9 py-3.5 text-center font-sans';
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
- tabindex="-1"
43
+ tabIndex="-1"
45
44
  className={`${styleButton} select-none ${buttonDisabledStyleMap[version]} ${
46
45
  className || ''
47
46
  }`}
48
47
  >
49
- <span className="text-sm font-medium">{text || children}</span>
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
- <span className="text-sm font-medium">{text || children}</span>
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
+ });