@redneckz/wildless-cms-uni-blocks 0.2.46 → 0.2.47

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 (224) hide show
  1. package/dist/BenefitsBlock.d.ts +2 -2
  2. package/dist/Blocks.d.ts +2 -0
  3. package/dist/Blocks.js +11 -7
  4. package/dist/Blocks.js.map +1 -1
  5. package/dist/ContentPage.d.ts +2 -2
  6. package/dist/ContentPage.js +3 -3
  7. package/dist/ContentPage.js.map +1 -1
  8. package/dist/ContentPageContext.d.ts +6 -3
  9. package/dist/ExchangeRateTile.d.ts +7 -0
  10. package/dist/ExchangeRateTile.js +32 -0
  11. package/dist/ExchangeRateTile.js.map +1 -0
  12. package/dist/Footer/Contacts.d.ts +2 -2
  13. package/dist/Footer/Footer.d.ts +2 -2
  14. package/dist/Footer/FooterLink.d.ts +2 -2
  15. package/dist/Footer/Sitemap.d.ts +2 -2
  16. package/dist/Footer/Sitemap.js +2 -1
  17. package/dist/Footer/Sitemap.js.map +1 -1
  18. package/dist/Footer/SocialMedia.d.ts +2 -2
  19. package/dist/Footer/SocialMedia.js +5 -5
  20. package/dist/Footer/SocialMedia.js.map +1 -1
  21. package/dist/Header/Header.d.ts +2 -2
  22. package/dist/Header/Header.js +3 -2
  23. package/dist/Header/Header.js.map +1 -1
  24. package/dist/Icons/DollarIcon.d.ts +1 -0
  25. package/dist/Icons/DollarIcon.js +6 -0
  26. package/dist/Icons/DollarIcon.js.map +1 -0
  27. package/dist/Icons/EuroIcon.d.ts +1 -0
  28. package/dist/Icons/EuroIcon.js +6 -0
  29. package/dist/Icons/EuroIcon.js.map +1 -0
  30. package/dist/Icons/index.d.ts +17 -16
  31. package/dist/Icons/index.js +26 -22
  32. package/dist/Icons/index.js.map +1 -1
  33. package/dist/Img.js +1 -1
  34. package/dist/Img.js.map +1 -1
  35. package/dist/LikeControl.d.ts +2 -2
  36. package/dist/LikeControl.js.map +1 -1
  37. package/dist/MobileAppTile.d.ts +8 -0
  38. package/dist/MobileAppTile.js +9 -0
  39. package/dist/MobileAppTile.js.map +1 -0
  40. package/dist/Placeholder.d.ts +3 -1
  41. package/dist/Placeholder.js +9 -2
  42. package/dist/Placeholder.js.map +1 -1
  43. package/dist/ProductBlock.d.ts +2 -2
  44. package/dist/ProductBlockInner.d.ts +2 -2
  45. package/dist/ProductGallery.d.ts +2 -2
  46. package/dist/ProductGallery.js +2 -2
  47. package/dist/ProductGallery.js.map +1 -1
  48. package/dist/ProjectSettings.d.ts +18 -0
  49. package/dist/ProjectSettings.js +30 -0
  50. package/dist/ProjectSettings.js.map +1 -0
  51. package/dist/StepsBlock.d.ts +2 -2
  52. package/dist/Tile.d.ts +2 -2
  53. package/dist/Tile.js +15 -7
  54. package/dist/Tile.js.map +1 -1
  55. package/dist/index.d.ts +5 -3
  56. package/dist/index.js +7 -5
  57. package/dist/index.js.map +1 -1
  58. package/dist/types.d.ts +1 -1
  59. package/dist/ui-kit/SearchBar.d.ts +2 -2
  60. package/dist/ui-kit/SearchBar.js.map +1 -1
  61. package/dist/useSitemap.d.ts +3 -0
  62. package/dist/useSitemap.js +16 -0
  63. package/dist/useSitemap.js.map +1 -0
  64. package/lib/BenefitsBlock.d.ts +2 -2
  65. package/lib/Blocks.d.ts +2 -0
  66. package/lib/Blocks.js +8 -4
  67. package/lib/Blocks.js.map +1 -1
  68. package/lib/ContentPage.d.ts +2 -2
  69. package/lib/ContentPage.js +3 -3
  70. package/lib/ContentPage.js.map +1 -1
  71. package/lib/ContentPageContext.d.ts +6 -3
  72. package/lib/ExchangeRateTile.d.ts +7 -0
  73. package/lib/ExchangeRateTile.js +30 -0
  74. package/lib/ExchangeRateTile.js.map +1 -0
  75. package/lib/Footer/Contacts.d.ts +2 -2
  76. package/lib/Footer/Footer.d.ts +2 -2
  77. package/lib/Footer/FooterLink.d.ts +2 -2
  78. package/lib/Footer/Sitemap.d.ts +2 -2
  79. package/lib/Footer/Sitemap.js +2 -1
  80. package/lib/Footer/Sitemap.js.map +1 -1
  81. package/lib/Footer/SocialMedia.d.ts +2 -2
  82. package/lib/Footer/SocialMedia.js +5 -5
  83. package/lib/Footer/SocialMedia.js.map +1 -1
  84. package/lib/Header/Header.d.ts +2 -2
  85. package/lib/Header/Header.js +3 -2
  86. package/lib/Header/Header.js.map +1 -1
  87. package/lib/Icons/DollarIcon.d.ts +1 -0
  88. package/lib/Icons/DollarIcon.js +3 -0
  89. package/lib/Icons/DollarIcon.js.map +1 -0
  90. package/lib/Icons/EuroIcon.d.ts +1 -0
  91. package/lib/Icons/EuroIcon.js +3 -0
  92. package/lib/Icons/EuroIcon.js.map +1 -0
  93. package/lib/Icons/index.d.ts +17 -16
  94. package/lib/Icons/index.js +17 -16
  95. package/lib/Icons/index.js.map +1 -1
  96. package/lib/Img.js +1 -1
  97. package/lib/Img.js.map +1 -1
  98. package/lib/LikeControl.d.ts +2 -2
  99. package/lib/LikeControl.js.map +1 -1
  100. package/lib/MobileAppTile.d.ts +8 -0
  101. package/lib/MobileAppTile.js +7 -0
  102. package/lib/MobileAppTile.js.map +1 -0
  103. package/lib/Placeholder.d.ts +3 -1
  104. package/lib/Placeholder.js +9 -2
  105. package/lib/Placeholder.js.map +1 -1
  106. package/lib/ProductBlock.d.ts +2 -2
  107. package/lib/ProductBlockInner.d.ts +2 -2
  108. package/lib/ProductGallery.d.ts +2 -2
  109. package/lib/ProductGallery.js +2 -2
  110. package/lib/ProductGallery.js.map +1 -1
  111. package/lib/ProjectSettings.d.ts +18 -0
  112. package/lib/ProjectSettings.js +28 -0
  113. package/lib/ProjectSettings.js.map +1 -0
  114. package/lib/StepsBlock.d.ts +2 -2
  115. package/lib/Tile.d.ts +2 -2
  116. package/lib/Tile.js +15 -7
  117. package/lib/Tile.js.map +1 -1
  118. package/lib/common.css +1 -1
  119. package/lib/index.d.ts +5 -3
  120. package/lib/index.js +3 -2
  121. package/lib/index.js.map +1 -1
  122. package/lib/types.d.ts +1 -1
  123. package/lib/ui-kit/SearchBar.d.ts +2 -2
  124. package/lib/ui-kit/SearchBar.js.map +1 -1
  125. package/lib/useSitemap.d.ts +3 -0
  126. package/lib/useSitemap.js +13 -0
  127. package/lib/useSitemap.js.map +1 -0
  128. package/package.json +3 -2
  129. package/src/BenefitsBlock.fixture.tsx +34 -0
  130. package/src/BenefitsBlock.tsx +45 -0
  131. package/src/Blocks.ts +23 -0
  132. package/src/ContentPage.fixture.tsx +38 -0
  133. package/src/ContentPage.page.json +540 -0
  134. package/src/ContentPage.tsx +83 -0
  135. package/src/ContentPageContext.tsx +34 -0
  136. package/src/ContentPageHead.tsx +26 -0
  137. package/src/ExchangeRateTile.fixture.tsx +11 -0
  138. package/src/ExchangeRateTile.tsx +80 -0
  139. package/src/Footer/Contacts.tsx +71 -0
  140. package/src/Footer/Footer.fixture.tsx +265 -0
  141. package/src/Footer/Footer.tsx +46 -0
  142. package/src/Footer/FooterLink.ts +6 -0
  143. package/src/Footer/HorizontalNavigation.tsx +46 -0
  144. package/src/Footer/Sitemap.tsx +55 -0
  145. package/src/Footer/SocialMedia.tsx +46 -0
  146. package/src/Footer/TextInformation.tsx +50 -0
  147. package/src/Footer/index.ts +2 -0
  148. package/src/Header/Header.fixture.tsx +21 -0
  149. package/src/Header/Header.tsx +55 -0
  150. package/src/Header/HeaderContent.ts +6 -0
  151. package/src/Header/HeaderSecondaryMenu.tsx +42 -0
  152. package/src/Header/HeaderSecondaryMenuButton.tsx +21 -0
  153. package/src/Header/index.ts +3 -0
  154. package/src/Header/isSubItemActive.ts +9 -0
  155. package/src/Header/isTopItemActive.ts +13 -0
  156. package/src/Icons/ActualBalanceIcon.tsx +202 -0
  157. package/src/Icons/CalendarIcon.tsx +19 -0
  158. package/src/Icons/ClockIcon.tsx +212 -0
  159. package/src/Icons/ComfortableCompIcon.tsx +379 -0
  160. package/src/Icons/DollarIcon.tsx +12 -0
  161. package/src/Icons/EmptyWalletIcon.tsx +25 -0
  162. package/src/Icons/EuroIcon.tsx +12 -0
  163. package/src/Icons/GridIcon.tsx +9 -0
  164. package/src/Icons/LoupeIcon.tsx +11 -0
  165. package/src/Icons/NewDocIcon.tsx +262 -0
  166. package/src/Icons/OkIcon.tsx +8 -0
  167. package/src/Icons/PassSendIcon.tsx +250 -0
  168. package/src/Icons/PercentageSquareIcon.tsx +18 -0
  169. package/src/Icons/ProfileIcon.tsx +18 -0
  170. package/src/Icons/SignDocsIcon.tsx +295 -0
  171. package/src/Icons/TelegramIcon.tsx +8 -0
  172. package/src/Icons/VKIcon.tsx +10 -0
  173. package/src/Icons/index.ts +17 -0
  174. package/src/Img.tsx +22 -0
  175. package/src/LikeControl.fixture.tsx +5 -0
  176. package/src/LikeControl.tsx +23 -0
  177. package/src/MobileAppTile.fixture.tsx +15 -0
  178. package/src/MobileAppTile.tsx +34 -0
  179. package/src/Placeholder.fixture.tsx +5 -0
  180. package/src/Placeholder.tsx +33 -0
  181. package/src/ProductBlock.fixture.tsx +95 -0
  182. package/src/ProductBlock.tsx +15 -0
  183. package/src/ProductBlockInner.tsx +110 -0
  184. package/src/ProductGallery.fixture.tsx +138 -0
  185. package/src/ProductGallery.tsx +90 -0
  186. package/src/ProjectSettings.ts +38 -0
  187. package/src/StepsBlock.fixture.tsx +23 -0
  188. package/src/StepsBlock.tsx +51 -0
  189. package/src/Tile.fixture.tsx +124 -0
  190. package/src/Tile.tsx +89 -0
  191. package/src/api/LikeAPI.ts +141 -0
  192. package/src/common.css +39 -0
  193. package/src/content-page-repository/ContentPageRepository.ts +38 -0
  194. package/src/content-page-repository/TransformationOptions.ts +4 -0
  195. package/src/content-page-repository/index.ts +1 -0
  196. package/src/content-page-repository/mapJSON.spec.ts +28 -0
  197. package/src/content-page-repository/mapJSON.ts +23 -0
  198. package/src/content-page-repository/transformContentPage.ts +26 -0
  199. package/src/content-page-repository/transformMarkdown.ts +10 -0
  200. package/src/content-page-repository/transformPicture.ts +61 -0
  201. package/src/cosmos.decorator.tsx +19 -0
  202. package/src/index.ts +19 -0
  203. package/src/mergeTopItems.spec.ts +20 -0
  204. package/src/mergeTopItems.ts +13 -0
  205. package/src/setup-fixture.ts +49 -0
  206. package/src/types.ts +109 -0
  207. package/src/ui-kit/BlockItem.fixture.tsx +5 -0
  208. package/src/ui-kit/BlockItem.tsx +36 -0
  209. package/src/ui-kit/Breadcrumb.tsx +26 -0
  210. package/src/ui-kit/Button.fixture.tsx +113 -0
  211. package/src/ui-kit/Button.tsx +66 -0
  212. package/src/ui-kit/HeaderItem.fixture.tsx +8 -0
  213. package/src/ui-kit/HeaderItem.tsx +25 -0
  214. package/src/ui-kit/LikeButton.fixture.tsx +6 -0
  215. package/src/ui-kit/LikeButton.tsx +41 -0
  216. package/src/ui-kit/Logo.fixture.tsx +5 -0
  217. package/src/ui-kit/Logo.tsx +35 -0
  218. package/src/ui-kit/SVG.tsx +32 -0
  219. package/src/ui-kit/SearchBar.tsx +33 -0
  220. package/src/ui-kit/TopItem.fixture.tsx +8 -0
  221. package/src/ui-kit/TopItem.tsx +37 -0
  222. package/src/useLink.ts +28 -0
  223. package/src/useSitemap.ts +17 -0
  224. package/src/utils/url.ts +22 -0
@@ -0,0 +1,540 @@
1
+ {
2
+ "title": "Кредиты",
3
+ "slug": "credits",
4
+ "description": "Акционерное общество «Российский Сельскохозяйственный банк»* — один из крупнейших банков в России. Созданный в 2000 году в целях развития национальной кредитно-финансовой системы.",
5
+ "keywords": ["кредит", "акция"],
6
+ "robots": ["index", "follow"],
7
+ "og": {
8
+ "type": "article",
9
+ "url": "https://foo.com/bar/baz"
10
+ },
11
+ "date": "2022-04-08",
12
+ "style": ["p-20", "pt-0", "gap-5", "bg-secondary-light"],
13
+ "likeControl": true,
14
+ "blocks": [
15
+ {
16
+ "type": "Header",
17
+ "style": ["col-span-12", "-mx-20", "mb-5", "shadow-[0_8px_32px_0px_#00000014]"],
18
+ "content": {
19
+ "topItems": [
20
+ {
21
+ "href": "https://rshb.ru/",
22
+ "text": "Бизнес клиентам",
23
+ "target": "_blank"
24
+ },
25
+ {
26
+ "href": "https://rshb.ru/",
27
+ "text": "Частным клиентам",
28
+ "target": "_blank"
29
+ }
30
+ ]
31
+ }
32
+ },
33
+ {
34
+ "type": "ProductGallery",
35
+ "style": ["col-span-12"],
36
+ "content": {
37
+ "slides": [
38
+ {
39
+ "nav": {
40
+ "title": "Деньги на любые цели",
41
+ "desc": "Ставка от 12,5% годовых на срок до 5 лет"
42
+ },
43
+ "productBlock": {
44
+ "title": "Ставка от 12,5% годовых на срок до 5 лет!»",
45
+ "description": "Кредит наличными без залога и поручительства. Потребительский кредит на любые цели. Нужен только паспорт.",
46
+ "items": [
47
+ "Потребительский кредит по специальной процентной ставке",
48
+ "Получите деньги без залога и поручительства",
49
+ "Кредитный лимит до 5 млн рублей"
50
+ ],
51
+ "buttons": [
52
+ {
53
+ "href": "https://rshb.ru",
54
+ "text": "Подробнее",
55
+ "target": "_blank",
56
+ "version": "primary"
57
+ }
58
+ ],
59
+ "image": {
60
+ "src": "money-1.png",
61
+ "title": "деньги",
62
+ "format": "webp",
63
+ "size": {
64
+ "width": 220,
65
+ "height": 220
66
+ }
67
+ }
68
+ }
69
+ },
70
+ {
71
+ "nav": {
72
+ "title": "Для людей в возрасте",
73
+ "desc": "Ставка от 12,5% годовых на срок до 3 лет"
74
+ },
75
+ "productBlock": {
76
+ "title": "Ставка от 12,5% годовых на срок до 3 лет!»",
77
+ "description": "Кредит наличными без залога и поручительства. Потребительский кредит на любые цели. Нужен только паспорт.",
78
+ "items": [
79
+ "Потребительский кредит по специальной процентной ставке",
80
+ "Получите деньги без залога и поручительства",
81
+ "Кредитный лимит до 5 млн рублей"
82
+ ],
83
+ "buttons": [
84
+ {
85
+ "href": "https://rshb.ru",
86
+ "text": "Подробнее",
87
+ "target": "_blank",
88
+ "version": "primary"
89
+ }
90
+ ],
91
+ "image": {
92
+ "src": "worker.png",
93
+ "title": "Рабочий",
94
+ "format": "webp",
95
+ "size": {
96
+ "width": 220,
97
+ "height": 220
98
+ }
99
+ }
100
+ }
101
+ },
102
+ {
103
+ "nav": {
104
+ "title": "Выгодно покупать",
105
+ "desc": "Дополнительные бонусные баллы за покупки"
106
+ },
107
+ "productBlock": {
108
+ "title": "Дополнительные бонусные баллы за покупки!»",
109
+ "description": "Кредит наличными без залога и поручительства. Потребительский кредит на любые цели. Нужен только паспорт.",
110
+ "items": [
111
+ "Потребительский кредит по специальной процентной ставке",
112
+ "Получите деньги без залога и поручительства",
113
+ "Кредитный лимит до 5 млн рублей"
114
+ ],
115
+ "buttons": [
116
+ {
117
+ "href": "https://rshb.ru",
118
+ "text": "Подробнее",
119
+ "target": "_blank",
120
+ "version": "primary"
121
+ }
122
+ ],
123
+ "image": {
124
+ "src": "credit-card-1.png",
125
+ "title": "Кредитка",
126
+ "format": "webp",
127
+ "size": {
128
+ "width": 220,
129
+ "height": 220
130
+ }
131
+ }
132
+ }
133
+ },
134
+ {
135
+ "nav": {
136
+ "title": "Карты Unionpay",
137
+ "desc": "Кэшбэк до 20% у партнеров"
138
+ },
139
+ "productBlock": {
140
+ "title": "Карты Unionpay»",
141
+ "description": "Кэшбэк до 20% у партнеров",
142
+ "items": [
143
+ "Потребительский кредит по специальной процентной ставке",
144
+ "Получите деньги без залога и поручительства",
145
+ "Кредитный лимит до 5 млн рублей"
146
+ ],
147
+ "buttons": [
148
+ {
149
+ "href": "https://rshb.ru",
150
+ "text": "Подробнее",
151
+ "target": "_blank",
152
+ "version": "primary"
153
+ }
154
+ ],
155
+ "image": {
156
+ "src": "credit-card-1.png",
157
+ "title": "Кредитка",
158
+ "format": "webp",
159
+ "size": {
160
+ "width": 220,
161
+ "height": 220
162
+ }
163
+ }
164
+ }
165
+ }
166
+ ]
167
+ }
168
+ },
169
+ {
170
+ "type": "Tile",
171
+ "style": ["col-span-8"],
172
+ "content": {
173
+ "title": "Кредиты",
174
+ "items": [
175
+ "Кредитный лимит до 10 млн ₽",
176
+ "Кредиты наличными на любые цели",
177
+ "Получите деньги без залога и поручителей"
178
+ ],
179
+ "button": {
180
+ "text": "Подробнее",
181
+ "href": "/credit-cards",
182
+ "version": "secondary"
183
+ },
184
+ "image": {
185
+ "src": "money-1.png",
186
+ "title": "деньги",
187
+ "format": "webp",
188
+ "size": {
189
+ "width": 220,
190
+ "height": 220
191
+ }
192
+ }
193
+ }
194
+ },
195
+ {
196
+ "type": "Tile",
197
+ "version": "secondary",
198
+ "style": ["col-span-4"],
199
+ "content": {
200
+ "title": "Ипотека",
201
+ "description": "Широкий выбор ипотечных программ с государственной поддержкой. Специальный предложения от 12,2 %",
202
+ "button": {
203
+ "text": "Подробнее",
204
+ "href": "/credits",
205
+ "version": "secondary"
206
+ },
207
+ "promo": true
208
+ }
209
+ },
210
+ {
211
+ "type": "Tile",
212
+ "style": ["col-span-6"],
213
+ "content": {
214
+ "title": "Банковские пластиковые карты",
215
+ "items": ["Счета в разных валютах", "Бесплатное обслуживание", "Кэшбэк до 15% от покупок"],
216
+ "button": {
217
+ "text": "Подробнее",
218
+ "href": "/credits",
219
+ "version": "secondary"
220
+ },
221
+ "image": {
222
+ "src": "credit-card-1.png",
223
+ "title": "Кредитка",
224
+ "format": "webp",
225
+ "size": {
226
+ "width": 220,
227
+ "height": 220
228
+ }
229
+ }
230
+ }
231
+ },
232
+ {
233
+ "type": "Tile",
234
+ "style": ["col-span-6"],
235
+ "content": {
236
+ "title": "Премиальные продукты",
237
+ "description": "Выделенные зоны обслуживания и персональный финансовый консультант. Полный спектр премиальных продуктов, подчеркивающих ваш статус",
238
+ "button": {
239
+ "text": "Подробнее",
240
+ "href": "/credits",
241
+ "version": "secondary"
242
+ },
243
+ "image": {
244
+ "src": "column-1.png",
245
+ "alt": "Column",
246
+ "format": "webp",
247
+ "size": {
248
+ "width": 220,
249
+ "height": 220
250
+ }
251
+ }
252
+ }
253
+ },
254
+ {
255
+ "type": "Tile",
256
+ "style": ["col-span-12"],
257
+ "content": {
258
+ "title": "Экосистема «СВОЕ», созданная для людей",
259
+ "items": [
260
+ "Качественные фермерские продукты напрямую от производителей",
261
+ "Самая большая база сельских туров по России",
262
+ "Площадки для создания комфортной жизни за городом",
263
+ "Подробная база вакансий для жителей сельской местности"
264
+ ],
265
+ "button": {
266
+ "text": "Подробнее",
267
+ "href": "/credits",
268
+ "version": "secondary"
269
+ },
270
+ "image": {
271
+ "src": "globe-1.png",
272
+ "title": "Глобус",
273
+ "format": "webp",
274
+ "size": {
275
+ "width": 220,
276
+ "height": 220
277
+ }
278
+ }
279
+ }
280
+ },
281
+ {
282
+ "type": "Tile",
283
+ "style": ["col-span-4"],
284
+ "content": {
285
+ "title": "Драгоценные металлы",
286
+ "items": ["Счета в драгоценных металлах", "Слитки и монеты из драгоценных металлов"],
287
+ "button": {
288
+ "text": "Подробнее",
289
+ "href": "/credits",
290
+ "version": "secondary"
291
+ }
292
+ }
293
+ },
294
+ {
295
+ "type": "Tile",
296
+ "style": ["col-span-4"],
297
+ "content": {
298
+ "title": "Банковские ячейки",
299
+ "items": ["Полная конфиденциальность", "Разный размер ячеек", "Оформление доверенностей"],
300
+ "button": {
301
+ "text": "Подробнее",
302
+ "href": "/credits",
303
+ "version": "secondary"
304
+ }
305
+ }
306
+ },
307
+ {
308
+ "type": "Tile",
309
+ "style": ["col-span-4"],
310
+ "content": {
311
+ "title": "Вклады и сбережения",
312
+ "items": [
313
+ "Доходность по вкладам до 15% годовых",
314
+ "Минимальная сумма вклада от 3000 Р",
315
+ "Минимальный срок вклада от 1 месяца"
316
+ ],
317
+ "button": {
318
+ "text": "Подробнее",
319
+ "href": "/credits",
320
+ "version": "secondary"
321
+ }
322
+ }
323
+ },
324
+ {
325
+ "type": "Tile",
326
+ "style": ["col-span-4"],
327
+ "content": {
328
+ "title": "Акции и спецпредложения",
329
+ "version": "secondary",
330
+ "description": "Пенсионный кредит по специальной процентной ставке",
331
+ "button": {
332
+ "text": "Все акции",
333
+ "href": "/credits",
334
+ "version": "secondary"
335
+ }
336
+ }
337
+ },
338
+ {
339
+ "type": "ExchangeRateTile",
340
+ "style": ["col-span-4"]
341
+ },
342
+ {
343
+ "type": "MobileAppTile",
344
+ "style": ["col-span-4"],
345
+ "content": {
346
+ "qr": "data:image/jpeg;base64,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"
347
+ }
348
+ },
349
+ {
350
+ "type": "Unknown",
351
+ "style": ["col-span-12"],
352
+ "content": {
353
+ "title": "Неизвестный блок"
354
+ }
355
+ },
356
+ {
357
+ "type": "Footer",
358
+ "style": ["col-span-12"],
359
+ "content": {
360
+ "topItems": [
361
+ {
362
+ "href": "https://rshb.ru/",
363
+ "text": "Частным клиентам",
364
+ "target": "_blank",
365
+ "items": [
366
+ {
367
+ "href": "https://rshb.ru/",
368
+ "text": "Кредитные карты"
369
+ },
370
+ {
371
+ "href": "https://rshb.ru/",
372
+ "text": "Дебетовые карты"
373
+ },
374
+ {
375
+ "href": "https://rshb.ru/",
376
+ "text": "Кредиты"
377
+ },
378
+ {
379
+ "href": "https://rshb.ru/",
380
+ "text": "Ипотека"
381
+ },
382
+ {
383
+ "href": "https://rshb.ru/",
384
+ "text": "Вклады и сбережения"
385
+ },
386
+ {
387
+ "href": "https://rshb.ru/",
388
+ "text": "Инвестиции"
389
+ },
390
+ {
391
+ "href": "https://rshb.ru/",
392
+ "text": "Страхование"
393
+ },
394
+ {
395
+ "href": "https://rshb.ru/",
396
+ "text": "Премиальным клиентам"
397
+ },
398
+ {
399
+ "href": "https://rshb.ru/",
400
+ "text": "Биометрическая регистрация"
401
+ },
402
+ {
403
+ "href": "https://rshb.ru/",
404
+ "text": "Перевод денег"
405
+ },
406
+ {
407
+ "href": "https://rshb.ru/",
408
+ "text": "Обмен денег"
409
+ },
410
+ {
411
+ "href": "https://rshb.ru/",
412
+ "text": "Акции"
413
+ },
414
+ {
415
+ "href": "https://rshb.ru/",
416
+ "text": "Тарифы"
417
+ },
418
+ {
419
+ "href": "https://rshb.ru/",
420
+ "text": "Архивная информация"
421
+ }
422
+ ]
423
+ },
424
+ {
425
+ "href": "https://rshb.ru/",
426
+ "text": "Бизнес клиентам",
427
+ "target": "_blank",
428
+ "items": [
429
+ {
430
+ "href": "https://rshb.ru/",
431
+ "text": "РКО"
432
+ },
433
+ {
434
+ "href": "https://rshb.ru/",
435
+ "text": "Кредиты"
436
+ },
437
+ {
438
+ "href": "https://rshb.ru/",
439
+ "text": "Депозиты"
440
+ },
441
+ {
442
+ "href": "https://rshb.ru/",
443
+ "text": "Эквайринг"
444
+ },
445
+ {
446
+ "href": "https://rshb.ru/",
447
+ "text": "Банковские карты"
448
+ },
449
+ {
450
+ "href": "https://rshb.ru/",
451
+ "text": "ВЭД"
452
+ },
453
+ {
454
+ "href": "https://rshb.ru/",
455
+ "text": "Инвестиции"
456
+ },
457
+ {
458
+ "href": "https://rshb.ru/",
459
+ "text": "Обмен валюты"
460
+ },
461
+ {
462
+ "href": "https://rshb.ru/",
463
+ "text": "Страхование"
464
+ },
465
+ {
466
+ "href": "https://rshb.ru/",
467
+ "text": "Партнёрские программы"
468
+ },
469
+ {
470
+ "href": "https://rshb.ru/",
471
+ "text": "Онлайн-сервисы"
472
+ },
473
+ {
474
+ "href": "https://rshb.ru/",
475
+ "text": "Акции"
476
+ },
477
+ {
478
+ "href": "https://rshb.ru/",
479
+ "text": "Тарифы"
480
+ },
481
+ {
482
+ "href": "https://rshb.ru/",
483
+ "text": "Архивная информация"
484
+ }
485
+ ]
486
+ }
487
+ ],
488
+ "contacts": [
489
+ {
490
+ "text": "+7 (495) 787-7-787",
491
+ "description": "Для звонков из-за границы",
492
+ "type": "tel"
493
+ },
494
+ {
495
+ "text": "example@example.com",
496
+ "description": "Для писем",
497
+ "type": "email"
498
+ },
499
+ {
500
+ "text": "7787",
501
+ "description": "Абонентам МТС, Мегафон, Билайн и Tele2",
502
+ "type": "tel"
503
+ }
504
+ ],
505
+ "documents": [
506
+ {
507
+ "text": "Информация о процентных ставках по договорам банковского вклада с физическими лицами",
508
+ "href": "https://rshb.ru/",
509
+ "target": "_blank"
510
+ },
511
+ {
512
+ "text": "Раскрытие информации профессиональным участником рынка ценных бумаг",
513
+ "href": "https://rshb.ru/",
514
+ "target": "_blank"
515
+ },
516
+ {
517
+ "text": "Раскрытие информации",
518
+ "href": "https://rshb.ru/",
519
+ "target": "_blank"
520
+ },
521
+ {
522
+ "text": "Удостоверяющий центр",
523
+ "href": "https://rshb.ru/",
524
+ "target": "_blank"
525
+ },
526
+ {
527
+ "text": "Финансовая культура",
528
+ "href": "https://rshb.ru/",
529
+ "target": "_blank"
530
+ }
531
+ ],
532
+ "socialMedia": [
533
+ { "href": "https://vk.com" },
534
+ { "href": "https://ok.ru" },
535
+ { "href": "https://t.me" }
536
+ ]
537
+ }
538
+ }
539
+ ]
540
+ }
@@ -0,0 +1,83 @@
1
+ import { JSX } from '@redneckz/uni-jsx';
2
+ import { Blocks } from './Blocks'; // TODO Lazy load
3
+ import { LikeControl } from './LikeControl';
4
+ import { Placeholder } from './Placeholder';
5
+ import type { BlockDef, ContentPageDef, UniBlockProps } from './types';
6
+
7
+ interface BlockDecoratorProps<VNode> {
8
+ blockClassName: string;
9
+ block: BlockDef;
10
+ render: (props: { blockClassName: string; block: BlockDef }) => VNode;
11
+ }
12
+
13
+ export type BlockDecorator<VNode = any> = (
14
+ props: BlockDecoratorProps<VNode>,
15
+ index?: number | string,
16
+ ) => any;
17
+
18
+ export interface ContentPageProps extends UniBlockProps {
19
+ data: ContentPageDef;
20
+ blockDecorator?: BlockDecorator;
21
+ }
22
+
23
+ const defaultBlockDecorator: BlockDecorator = ({ blockClassName, block, render }) =>
24
+ render({ blockClassName, block });
25
+
26
+ export const ContentPage = JSX<ContentPageProps>(
27
+ ({
28
+ className,
29
+ data: { style: pageStyle, blocks, likeControl, colorPalette = 'pc' },
30
+ context,
31
+ blockDecorator = defaultBlockDecorator,
32
+ }) => {
33
+ return (
34
+ <section className="relative" data-theme={colorPalette}>
35
+ <div className={`grid grid-cols-12 gap-1 ${style2className(pageStyle)} ${className}`}>
36
+ {blocks?.length ? blocks.map(renderBlock) : null}
37
+ </div>
38
+ {likeControl && (
39
+ <div className="flex items-end absolute bottom-0 right-0 h-full pointer-events-none">
40
+ <LikeControl
41
+ className="rounded-tl-lg sticky bottom-0 pointer-events-auto"
42
+ context={context}
43
+ />
44
+ </div>
45
+ )}
46
+ </section>
47
+ );
48
+
49
+ function renderBlock(block: BlockDef, i: number) {
50
+ const { type } = block;
51
+ if (!(type in Blocks)) {
52
+ console.warn(`No block with "${type}" is registered`);
53
+ }
54
+
55
+ const BlockComponent = Blocks[type as keyof typeof Blocks] || Placeholder;
56
+ return blockDecorator(
57
+ {
58
+ blockClassName: style2className(block.style),
59
+ block,
60
+ render: (props) => {
61
+ const { version, content, blocks } = props.block;
62
+ return (
63
+ <BlockComponent
64
+ key={`${type}-${i}`}
65
+ className={props.blockClassName}
66
+ version={version}
67
+ context={context}
68
+ {...content}
69
+ >
70
+ {blocks?.length ? blocks.map(renderBlock) : null}
71
+ </BlockComponent>
72
+ );
73
+ },
74
+ },
75
+ `block-${i}`,
76
+ );
77
+ }
78
+ },
79
+ );
80
+
81
+ function style2className(style: string[] | undefined | null): string {
82
+ return style ? style.join(' ') : '';
83
+ }
@@ -0,0 +1,34 @@
1
+ export interface Router {
2
+ pathname: string;
3
+ query: Record<string, string | string[] | undefined>;
4
+ href?: string;
5
+ basePath?: string;
6
+ push: (url: string) => void;
7
+ }
8
+
9
+ export interface LikeService {
10
+ likeCount: number;
11
+ like: () => void;
12
+ dislike: () => void;
13
+ }
14
+
15
+ export type HandlerDecorator = <F extends Function>(handler: F, targetContent: any) => F;
16
+
17
+ export interface Search {
18
+ term: string;
19
+ setTerm: (t: string) => void;
20
+ }
21
+
22
+ export type AsyncDataHook = <Data, Error = any>(
23
+ key: string,
24
+ fetcher: () => Promise<Data>,
25
+ ) => { data?: Data; error?: Error };
26
+
27
+ export interface ContentPageContext {
28
+ useRouter: () => Router;
29
+ useState: <State>(initialState: State) => [State, (_: State) => void];
30
+ useAsyncData: AsyncDataHook;
31
+ useLikeService: () => LikeService;
32
+ useSearch: () => Search;
33
+ handlerDecorator?: HandlerDecorator;
34
+ }