@redneckz/wildless-cms-uni-blocks 0.8.31 → 0.9.1

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 (214) hide show
  1. package/bundle/blocks.schema.json +1 -1
  2. package/bundle/bundle.umd.js +93 -24
  3. package/bundle/bundle.umd.min.js +1 -1
  4. package/bundle/components/Filtration/Filtration.d.ts +6 -0
  5. package/bundle/components/Filtration/FiltrationContent.d.ts +78 -0
  6. package/bundle/components/Filtration/FiltrationInner.d.ts +7 -0
  7. package/bundle/components/Filtration/checkShouldRenderBlock.d.ts +1 -0
  8. package/bundle/components/Filtration/renderFormItem.d.ts +4 -0
  9. package/bundle/components/ProductBlock/ProductBlockContent.d.ts +2 -0
  10. package/bundle/hooks/useForm.d.ts +12 -0
  11. package/bundle/model/JSXBlock.d.ts +2 -0
  12. package/bundle/ui-kit/ControlProps.d.ts +4 -0
  13. package/bundle/ui-kit/Foldable/DefaultFoldButton.d.ts +1 -0
  14. package/bundle/ui-kit/SlideCheckbox/SlideCheckbox.d.ts +3 -2
  15. package/bundle/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.d.ts +15 -0
  16. package/dist/components/ApplicationForm/renderSlideCheckboxes.js +1 -1
  17. package/dist/components/ApplicationForm/renderSlideCheckboxes.js.map +1 -1
  18. package/dist/components/Blocks.js +2 -0
  19. package/dist/components/Blocks.js.map +1 -1
  20. package/dist/components/Filtration/Filtration.d.ts +6 -0
  21. package/dist/components/Filtration/Filtration.js +17 -0
  22. package/dist/components/Filtration/Filtration.js.map +1 -0
  23. package/dist/components/Filtration/FiltrationContent.d.ts +78 -0
  24. package/dist/components/Filtration/FiltrationContent.js +2 -0
  25. package/dist/components/Filtration/FiltrationContent.js.map +1 -0
  26. package/dist/components/Filtration/FiltrationInner.d.ts +7 -0
  27. package/dist/components/Filtration/FiltrationInner.js +23 -0
  28. package/dist/components/Filtration/FiltrationInner.js.map +1 -0
  29. package/dist/components/Filtration/checkShouldRenderBlock.d.ts +1 -0
  30. package/dist/components/Filtration/checkShouldRenderBlock.js +11 -0
  31. package/dist/components/Filtration/checkShouldRenderBlock.js.map +1 -0
  32. package/dist/components/Filtration/renderFormItem.d.ts +4 -0
  33. package/dist/components/Filtration/renderFormItem.js +21 -0
  34. package/dist/components/Filtration/renderFormItem.js.map +1 -0
  35. package/dist/components/ProductBlock/ProductBlockContent.d.ts +2 -0
  36. package/dist/components/ProductBlock/ProductBlockInner.js +2 -2
  37. package/dist/components/ProductBlock/ProductBlockInner.js.map +1 -1
  38. package/dist/hooks/useForm.d.ts +12 -0
  39. package/dist/hooks/useForm.js +21 -0
  40. package/dist/hooks/useForm.js.map +1 -0
  41. package/dist/model/JSXBlock.d.ts +2 -0
  42. package/dist/ui-kit/ControlProps.d.ts +4 -0
  43. package/dist/ui-kit/ControlProps.js +2 -0
  44. package/dist/ui-kit/ControlProps.js.map +1 -0
  45. package/dist/ui-kit/Foldable/DefaultFoldButton.d.ts +1 -0
  46. package/dist/ui-kit/Foldable/DefaultFoldButton.js +5 -9
  47. package/dist/ui-kit/Foldable/DefaultFoldButton.js.map +1 -1
  48. package/dist/ui-kit/SlideCheckbox/SlideCheckbox.d.ts +3 -2
  49. package/dist/ui-kit/SlideCheckbox/SlideCheckbox.js +2 -2
  50. package/dist/ui-kit/SlideCheckbox/SlideCheckbox.js.map +1 -1
  51. package/dist/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.d.ts +15 -0
  52. package/dist/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.js +19 -0
  53. package/dist/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.js.map +1 -0
  54. package/lib/common.css +1 -1
  55. package/lib/components/ApplicationForm/renderSlideCheckboxes.js +1 -1
  56. package/lib/components/ApplicationForm/renderSlideCheckboxes.js.map +1 -1
  57. package/lib/components/Blocks.js +2 -0
  58. package/lib/components/Blocks.js.map +1 -1
  59. package/lib/components/Filtration/Filtration.d.ts +6 -0
  60. package/lib/components/Filtration/Filtration.fixture.d.ts +5 -0
  61. package/lib/components/Filtration/Filtration.js +15 -0
  62. package/lib/components/Filtration/Filtration.js.map +1 -0
  63. package/lib/components/Filtration/FiltrationContent.d.ts +78 -0
  64. package/lib/components/Filtration/FiltrationContent.js +2 -0
  65. package/lib/components/Filtration/FiltrationContent.js.map +1 -0
  66. package/lib/components/Filtration/FiltrationInner.d.ts +7 -0
  67. package/lib/components/Filtration/FiltrationInner.js +21 -0
  68. package/lib/components/Filtration/FiltrationInner.js.map +1 -0
  69. package/lib/components/Filtration/checkShouldRenderBlock.d.ts +1 -0
  70. package/lib/components/Filtration/checkShouldRenderBlock.js +8 -0
  71. package/lib/components/Filtration/checkShouldRenderBlock.js.map +1 -0
  72. package/lib/components/Filtration/renderFormItem.d.ts +4 -0
  73. package/lib/components/Filtration/renderFormItem.js +18 -0
  74. package/lib/components/Filtration/renderFormItem.js.map +1 -0
  75. package/lib/components/ProductBlock/ProductBlock.fixture.d.ts +1 -0
  76. package/lib/components/ProductBlock/ProductBlockContent.d.ts +2 -0
  77. package/lib/components/ProductBlock/ProductBlockInner.js +2 -2
  78. package/lib/components/ProductBlock/ProductBlockInner.js.map +1 -1
  79. package/lib/hooks/useForm.d.ts +12 -0
  80. package/lib/hooks/useForm.js +18 -0
  81. package/lib/hooks/useForm.js.map +1 -0
  82. package/lib/model/JSXBlock.d.ts +2 -0
  83. package/lib/ui-kit/ControlProps.d.ts +4 -0
  84. package/lib/ui-kit/ControlProps.js +2 -0
  85. package/lib/ui-kit/ControlProps.js.map +1 -0
  86. package/lib/ui-kit/Foldable/DefaultFoldButton.d.ts +1 -0
  87. package/lib/ui-kit/Foldable/DefaultFoldButton.js +5 -9
  88. package/lib/ui-kit/Foldable/DefaultFoldButton.js.map +1 -1
  89. package/lib/ui-kit/SlideCheckbox/SlideCheckbox.d.ts +3 -2
  90. package/lib/ui-kit/SlideCheckbox/SlideCheckbox.js +2 -2
  91. package/lib/ui-kit/SlideCheckbox/SlideCheckbox.js.map +1 -1
  92. package/lib/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.d.ts +15 -0
  93. package/lib/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.js +17 -0
  94. package/lib/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.js.map +1 -0
  95. package/mobile/bundle/bundle.umd.js +5 -10
  96. package/mobile/bundle/bundle.umd.min.js +1 -1
  97. package/mobile/bundle/components/Filtration/Filtration.d.ts +6 -0
  98. package/mobile/bundle/components/Filtration/FiltrationContent.d.ts +78 -0
  99. package/mobile/bundle/components/Filtration/FiltrationInner.d.ts +7 -0
  100. package/mobile/bundle/components/Filtration/checkShouldRenderBlock.d.ts +1 -0
  101. package/mobile/bundle/components/Filtration/renderFormItem.d.ts +4 -0
  102. package/mobile/bundle/components/ProductBlock/ProductBlockContent.d.ts +2 -0
  103. package/mobile/bundle/hooks/useForm.d.ts +12 -0
  104. package/mobile/bundle/model/JSXBlock.d.ts +2 -0
  105. package/mobile/bundle/ui-kit/ControlProps.d.ts +4 -0
  106. package/mobile/bundle/ui-kit/Foldable/DefaultFoldButton.d.ts +1 -0
  107. package/mobile/bundle/ui-kit/SlideCheckbox/SlideCheckbox.d.ts +3 -2
  108. package/mobile/bundle/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.d.ts +15 -0
  109. package/mobile/dist/components/ApplicationForm/renderSlideCheckboxes.js +1 -1
  110. package/mobile/dist/components/ApplicationForm/renderSlideCheckboxes.js.map +1 -1
  111. package/mobile/dist/components/Filtration/Filtration.d.ts +6 -0
  112. package/mobile/dist/components/Filtration/Filtration.js +17 -0
  113. package/mobile/dist/components/Filtration/Filtration.js.map +1 -0
  114. package/mobile/dist/components/Filtration/FiltrationContent.d.ts +78 -0
  115. package/mobile/dist/components/Filtration/FiltrationContent.js +2 -0
  116. package/mobile/dist/components/Filtration/FiltrationContent.js.map +1 -0
  117. package/mobile/dist/components/Filtration/FiltrationInner.d.ts +7 -0
  118. package/mobile/dist/components/Filtration/FiltrationInner.js +23 -0
  119. package/mobile/dist/components/Filtration/FiltrationInner.js.map +1 -0
  120. package/mobile/dist/components/Filtration/checkShouldRenderBlock.d.ts +1 -0
  121. package/mobile/dist/components/Filtration/checkShouldRenderBlock.js +11 -0
  122. package/mobile/dist/components/Filtration/checkShouldRenderBlock.js.map +1 -0
  123. package/mobile/dist/components/Filtration/renderFormItem.d.ts +4 -0
  124. package/mobile/dist/components/Filtration/renderFormItem.js +21 -0
  125. package/mobile/dist/components/Filtration/renderFormItem.js.map +1 -0
  126. package/mobile/dist/components/ProductBlock/ProductBlockContent.d.ts +2 -0
  127. package/mobile/dist/hooks/useForm.d.ts +12 -0
  128. package/mobile/dist/hooks/useForm.js +21 -0
  129. package/mobile/dist/hooks/useForm.js.map +1 -0
  130. package/mobile/dist/model/JSXBlock.d.ts +2 -0
  131. package/mobile/dist/ui-kit/ControlProps.d.ts +4 -0
  132. package/mobile/dist/ui-kit/ControlProps.js +2 -0
  133. package/mobile/dist/ui-kit/ControlProps.js.map +1 -0
  134. package/mobile/dist/ui-kit/Foldable/DefaultFoldButton.d.ts +1 -0
  135. package/mobile/dist/ui-kit/Foldable/DefaultFoldButton.js +5 -9
  136. package/mobile/dist/ui-kit/Foldable/DefaultFoldButton.js.map +1 -1
  137. package/mobile/dist/ui-kit/SlideCheckbox/SlideCheckbox.d.ts +3 -2
  138. package/mobile/dist/ui-kit/SlideCheckbox/SlideCheckbox.js +2 -2
  139. package/mobile/dist/ui-kit/SlideCheckbox/SlideCheckbox.js.map +1 -1
  140. package/mobile/dist/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.d.ts +15 -0
  141. package/mobile/dist/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.js +19 -0
  142. package/mobile/dist/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.js.map +1 -0
  143. package/mobile/lib/components/ApplicationForm/renderSlideCheckboxes.js +1 -1
  144. package/mobile/lib/components/ApplicationForm/renderSlideCheckboxes.js.map +1 -1
  145. package/mobile/lib/components/Filtration/Filtration.d.ts +6 -0
  146. package/mobile/lib/components/Filtration/Filtration.js +15 -0
  147. package/mobile/lib/components/Filtration/Filtration.js.map +1 -0
  148. package/mobile/lib/components/Filtration/FiltrationContent.d.ts +78 -0
  149. package/mobile/lib/components/Filtration/FiltrationContent.js +2 -0
  150. package/mobile/lib/components/Filtration/FiltrationContent.js.map +1 -0
  151. package/mobile/lib/components/Filtration/FiltrationInner.d.ts +7 -0
  152. package/mobile/lib/components/Filtration/FiltrationInner.js +21 -0
  153. package/mobile/lib/components/Filtration/FiltrationInner.js.map +1 -0
  154. package/mobile/lib/components/Filtration/checkShouldRenderBlock.d.ts +1 -0
  155. package/mobile/lib/components/Filtration/checkShouldRenderBlock.js +8 -0
  156. package/mobile/lib/components/Filtration/checkShouldRenderBlock.js.map +1 -0
  157. package/mobile/lib/components/Filtration/renderFormItem.d.ts +4 -0
  158. package/mobile/lib/components/Filtration/renderFormItem.js +18 -0
  159. package/mobile/lib/components/Filtration/renderFormItem.js.map +1 -0
  160. package/mobile/lib/components/ProductBlock/ProductBlockContent.d.ts +2 -0
  161. package/mobile/lib/hooks/useForm.d.ts +12 -0
  162. package/mobile/lib/hooks/useForm.js +18 -0
  163. package/mobile/lib/hooks/useForm.js.map +1 -0
  164. package/mobile/lib/model/JSXBlock.d.ts +2 -0
  165. package/mobile/lib/ui-kit/ControlProps.d.ts +4 -0
  166. package/mobile/lib/ui-kit/ControlProps.js +2 -0
  167. package/mobile/lib/ui-kit/ControlProps.js.map +1 -0
  168. package/mobile/lib/ui-kit/Foldable/DefaultFoldButton.d.ts +1 -0
  169. package/mobile/lib/ui-kit/Foldable/DefaultFoldButton.js +5 -9
  170. package/mobile/lib/ui-kit/Foldable/DefaultFoldButton.js.map +1 -1
  171. package/mobile/lib/ui-kit/SlideCheckbox/SlideCheckbox.d.ts +3 -2
  172. package/mobile/lib/ui-kit/SlideCheckbox/SlideCheckbox.js +2 -2
  173. package/mobile/lib/ui-kit/SlideCheckbox/SlideCheckbox.js.map +1 -1
  174. package/mobile/lib/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.d.ts +15 -0
  175. package/mobile/lib/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.js +17 -0
  176. package/mobile/lib/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.js.map +1 -0
  177. package/mobile/src/components/ApplicationForm/renderSlideCheckboxes.tsx +4 -4
  178. package/mobile/src/components/Filtration/Filtration.example.json +37 -0
  179. package/mobile/src/components/Filtration/Filtration.tsx +41 -0
  180. package/mobile/src/components/Filtration/Filtration.ui.json +1 -0
  181. package/mobile/src/components/Filtration/FiltrationContent.ts +87 -0
  182. package/mobile/src/components/Filtration/FiltrationInner.tsx +67 -0
  183. package/mobile/src/components/Filtration/checkShouldRenderBlock.ts +18 -0
  184. package/mobile/src/components/Filtration/renderFormItem.tsx +36 -0
  185. package/mobile/src/components/ProductBlock/ProductBlock.example.json +2 -1
  186. package/mobile/src/components/ProductBlock/ProductBlockContent.ts +2 -0
  187. package/mobile/src/hooks/useForm.ts +29 -0
  188. package/mobile/src/model/JSXBlock.ts +2 -0
  189. package/mobile/src/ui-kit/ControlProps.ts +4 -0
  190. package/mobile/src/ui-kit/Foldable/DefaultFoldButton.tsx +11 -11
  191. package/mobile/src/ui-kit/SlideCheckbox/SlideCheckbox.tsx +26 -23
  192. package/mobile/src/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.tsx +44 -0
  193. package/package.json +2 -1
  194. package/src/components/ApplicationForm/renderSlideCheckboxes.tsx +4 -4
  195. package/src/components/Blocks.ts +2 -0
  196. package/src/components/Filtration/Filtration.example.json +37 -0
  197. package/src/components/Filtration/Filtration.fixture.tsx +147 -0
  198. package/src/components/Filtration/Filtration.tsx +41 -0
  199. package/src/components/Filtration/Filtration.ui.json +1 -0
  200. package/src/components/Filtration/FiltrationContent.ts +87 -0
  201. package/src/components/Filtration/FiltrationInner.tsx +67 -0
  202. package/src/components/Filtration/checkShouldRenderBlock.ts +18 -0
  203. package/src/components/Filtration/renderFormItem.tsx +36 -0
  204. package/src/components/ProductBlock/ProductBlock.example.json +2 -1
  205. package/src/components/ProductBlock/ProductBlock.fixture.tsx +17 -0
  206. package/src/components/ProductBlock/ProductBlockContent.ts +2 -0
  207. package/src/components/ProductBlock/ProductBlockInner.tsx +4 -1
  208. package/src/hooks/useForm.ts +29 -0
  209. package/src/model/JSXBlock.ts +2 -0
  210. package/src/ui-kit/ControlProps.ts +4 -0
  211. package/src/ui-kit/Foldable/DefaultFoldButton.tsx +11 -11
  212. package/src/ui-kit/SlideCheckbox/SlideCheckbox.fixture.tsx +1 -1
  213. package/src/ui-kit/SlideCheckbox/SlideCheckbox.tsx +26 -23
  214. package/src/ui-kit/SlideCheckboxGroup/SlideCheckboxGroup.tsx +44 -0
@@ -0,0 +1,67 @@
1
+ import { JSX } from '@redneckz/uni-jsx';
2
+ import { renderBlocksList } from '../../BlockRenderer/renderBlockList';
3
+ import type { IconName } from '../../icons/IconName';
4
+ import type { UniBlockProps } from '../../model/JSXBlock';
5
+ import { DefaultFoldButton } from '../../ui-kit/Foldable/DefaultFoldButton';
6
+ import { Foldable } from '../../ui-kit/Foldable/Foldable';
7
+ import { FoldableSection } from '../../ui-kit/Foldable/FoldableSection';
8
+ import { style } from '../../utils/style';
9
+ import { ErrorBlock } from '../ErrorBlock/ErrorBlock';
10
+ import { checkShouldRenderBlock } from './checkShouldRenderBlock';
11
+ import type { FiltrationInnerContent } from './FiltrationContent';
12
+
13
+ const ICONS: IconName[] = ['ArrowDownIcon', 'ArrowUpIcon'];
14
+
15
+ const resultsGridStyle = 'grid grid-cols-12 gap-1 border-box';
16
+
17
+ interface FiltrationInnerProps extends FiltrationInnerContent, UniBlockProps {
18
+ filtrationState?: Record<string, any>;
19
+ }
20
+
21
+ export const FiltrationInner = JSX<FiltrationInnerProps>(
22
+ ({ label = '', filtrationState = {}, topItemsCount = 0, block, ...rest }) => {
23
+ const blocksToRender =
24
+ block?.blocks?.filter((b) => checkShouldRenderBlock(filtrationState, b.content || {})) || [];
25
+
26
+ const [visibleBlocks, hiddenBlocks] =
27
+ topItemsCount > 0
28
+ ? [blocksToRender.slice(0, topItemsCount), blocksToRender.slice(topItemsCount)]
29
+ : [blocksToRender, []];
30
+
31
+ return (
32
+ <div>
33
+ <div className={style(blocksToRender.length ? 'hidden' : '')}>
34
+ <ErrorBlock
35
+ error={{ errorContentType: 'Image' }}
36
+ title="Нет подходящей ипотечной программы"
37
+ subtitle="Попробуйте очистить фильтры"
38
+ />
39
+ </div>
40
+ <div className={style(blocksToRender.length ? '' : 'hidden')}>
41
+ <div className={resultsGridStyle}>
42
+ {renderBlocksList(visibleBlocks, { ...rest.options, parent: block })}
43
+ </div>
44
+ <Foldable
45
+ renderFoldableSection={({ isUnfolded }) => {
46
+ return (
47
+ <FoldableSection className={resultsGridStyle} isUnfolded={isUnfolded}>
48
+ {renderBlocksList(hiddenBlocks, { ...rest.options, parent: block })}
49
+ </FoldableSection>
50
+ );
51
+ }}
52
+ renderFoldButton={({ isUnfolded, onToggle }) => (
53
+ <DefaultFoldButton
54
+ className={style('mt-11', topItemsCount < 1 ? 'hidden' : '')}
55
+ disabled={!hiddenBlocks?.length}
56
+ label={label}
57
+ icon={ICONS[Number(isUnfolded)]}
58
+ dataTheme={rest.options?.page?.colorPalette}
59
+ onClick={onToggle}
60
+ />
61
+ )}
62
+ />
63
+ </div>
64
+ </div>
65
+ );
66
+ },
67
+ );
@@ -0,0 +1,18 @@
1
+ const isSingularFieldMatch =
2
+ <P extends Partial<Record<string, any>>, T extends P>(key: string, pattern: P) =>
3
+ (target: T) =>
4
+ pattern[key] === undefined || pattern[key] === target[key];
5
+
6
+ const isMultipleFieldMatch =
7
+ <P extends Partial<Record<string, any[]>>, T extends P>(key: string, pattern: P) =>
8
+ (target: T) =>
9
+ pattern[key] === undefined || pattern[key]?.every((_) => target[key]?.includes(_));
10
+
11
+ export const checkShouldRenderBlock = (pattern: Record<string, any>, target: Record<string, any>) =>
12
+ Object.entries(pattern)
13
+ .map(([key, subPattern]) =>
14
+ Array.isArray(subPattern)
15
+ ? isMultipleFieldMatch(key, pattern)
16
+ : isSingularFieldMatch(key, pattern),
17
+ )
18
+ .every((predicate) => predicate(target));
@@ -0,0 +1,36 @@
1
+ import type { FormElementRegisterer } from '../../hooks/useForm';
2
+ import { SlideCheckboxGroup } from '../../ui-kit/SlideCheckboxGroup/SlideCheckboxGroup';
3
+ import { Text } from '../../ui-kit/Text/Text';
4
+ import type { FiltrationSchema, StringEnum } from './FiltrationContent';
5
+
6
+ export const renderFormItem =
7
+ (filtrationSchema: FiltrationSchema, register: FormElementRegisterer) => (key: string) => {
8
+ const item = filtrationSchema[key as keyof typeof filtrationSchema];
9
+ const type = item?.type;
10
+
11
+ switch (type) {
12
+ case 'string':
13
+ return renderRadioButtons(key, register)(item);
14
+ default:
15
+ return null;
16
+ }
17
+ };
18
+
19
+ const renderRadioButtons =
20
+ (key: string, register: FormElementRegisterer) => (item?: StringEnum) => {
21
+ const options =
22
+ item?.enum?.map((e, i) => ({ value: e, title: item?.enumNames?.[i] || '' })) || [];
23
+
24
+ return (
25
+ <div role="radiogroup" key={key}>
26
+ {item?.title ? (
27
+ <div className="mb-4">
28
+ <Text size="text-m" font="font-light" color="text-secondary-text">
29
+ {item.title}
30
+ </Text>
31
+ </div>
32
+ ) : null}
33
+ <SlideCheckboxGroup items={options} multiple={false} {...register(key)} />
34
+ </div>
35
+ );
36
+ };
@@ -46,6 +46,7 @@
46
46
  "icon": "SignDocsIcon"
47
47
  }
48
48
  }
49
- ]
49
+ ],
50
+ "directionRight": true
50
51
  }
51
52
  }
@@ -93,6 +93,23 @@ export default {
93
93
  />
94
94
  </div>
95
95
  ),
96
+ 'primary with back button direction left': (
97
+ <div className="container grid grid-cols-12">
98
+ <ProductBlock
99
+ className="col-span-12"
100
+ backwardButton={backwardButton}
101
+ headlineVersion="L"
102
+ title="Потребительский кредит наличными"
103
+ description="Кредит наличными без залога и поручительства. Потребительский кредит на любые цели. Нужен только паспорт."
104
+ benefitsCountOfRow={2}
105
+ benefits={benefits}
106
+ benefitsVersion="normal"
107
+ buttons={buttons}
108
+ image={image}
109
+ directionRight={false}
110
+ />
111
+ </div>
112
+ ),
96
113
  'primary with color benefits': (
97
114
  <div className="container grid grid-cols-12">
98
115
  <ProductBlock
@@ -36,6 +36,8 @@ export type ProductBlockInnerContent = HeadlineProps &
36
36
  * @hidden
37
37
  */
38
38
  textBlockClassName?: string;
39
+ /** @title Картинка справа/текст слева */
40
+ directionRight?: boolean;
39
41
  };
40
42
 
41
43
  /**
@@ -29,12 +29,16 @@ export const ProductBlockInner = JSX<ProductBlockInnerProps>(
29
29
  version = 'primary',
30
30
  isDotted = true,
31
31
  textBlockClassName = '',
32
+ directionRight = true,
32
33
  }) => {
33
34
  const benefitsCount = benefits?.filter((_) => _.label)?.length;
34
35
  const benefitsContainerStyles = getBenefitsContainerStyles(benefitsCountOfRow);
35
36
 
36
37
  return (
37
38
  <div className={style('flex grow justify-between items-stretch h-full', className)}>
39
+ {image?.src ? (
40
+ <Img className={`mt-[-50px] ${directionRight ? 'order-2' : ''}`} image={image} />
41
+ ) : null}
38
42
  <div className={style('flex flex-col', textBlockClassName)}>
39
43
  <Headline
40
44
  className="!p-0 max-w-[600px]"
@@ -67,7 +71,6 @@ export const ProductBlockInner = JSX<ProductBlockInnerProps>(
67
71
  {footnote ? <p className="text-m-light pt-12">{footnote}</p> : null}
68
72
  </div>
69
73
  </div>
70
- {image?.src && <Img className="mt-[-50px]" image={image} />}
71
74
  </div>
72
75
  );
73
76
  },
@@ -0,0 +1,29 @@
1
+ import { useCallback, useRef, useState } from '@redneckz/uni-jsx/lib/hooks';
2
+
3
+ export type FormElementRegisterer = ReturnType<typeof useForm>['register'];
4
+
5
+ export const useForm = <FormState extends Record<string, any>>(
6
+ initialState: Partial<FormState> = {},
7
+ ) => {
8
+ const [formState, setFormState] = useState<Partial<FormState>>(initialState);
9
+
10
+ const handlersMap = useRef<Partial<Record<keyof FormState, () => void>>>({});
11
+
12
+ const register = <FieldName extends keyof FormState>(fieldName: FieldName) => {
13
+ if (!handlersMap.current) {
14
+ return {};
15
+ }
16
+
17
+ const handler = (value?: FormState[FieldName]) => {
18
+ setFormState((prev) => ({ ...prev, [fieldName]: value }));
19
+ };
20
+
21
+ handlersMap.current[fieldName] ||= handler;
22
+
23
+ return { value: formState?.[fieldName], onChange: handlersMap.current[fieldName] };
24
+ };
25
+
26
+ const resetForm = useCallback(() => setFormState({}), []);
27
+
28
+ return { formState, register, resetForm };
29
+ };
@@ -1,4 +1,5 @@
1
1
  import type { UNIComponent } from '@redneckz/uni-jsx';
2
+ import type { JSONSchema7Definition } from 'json-schema';
2
3
  import type { BlockRendererOptions } from '../BlockRenderer/BlockRendererOptions';
3
4
  import type { SlotName } from './BlockDecorator';
4
5
  import type { BlockVersion } from './BlockVersion';
@@ -26,5 +27,6 @@ export type JSXBlock<BlockProps extends UniBlockProps = UniBlockProps> = UNIComp
26
27
  VNode | VNode[]
27
28
  > & {
28
29
  childrenTypes?: string[] | { include?: string[]; exclude?: string[] };
30
+ childSchema?: (content: BlockDef['content']) => Record<string, JSONSchema7Definition>;
29
31
  slots?: (props: BlockProps) => SlotName[];
30
32
  };
@@ -0,0 +1,4 @@
1
+ export interface ControlProps<T> {
2
+ value?: T;
3
+ onChange?: (value: T | undefined) => void;
4
+ }
@@ -1,5 +1,6 @@
1
1
  import { JSX } from '@redneckz/uni-jsx';
2
2
  import type { ColorPalette } from '../../model/ContentPageDef';
3
+ import { style } from '../../utils/style';
3
4
  import type { IconName } from '../Icon/IconProps';
4
5
  import { Img } from '../Img/Img';
5
6
  import type { FoldablePartProps } from './FoldablePartProps';
@@ -9,25 +10,24 @@ interface DefaultFoldButtonProps {
9
10
  label: string;
10
11
  icon: IconName;
11
12
  dataTheme?: ColorPalette;
13
+ disabled?: boolean;
12
14
  onClick?: () => void;
13
15
  }
14
16
 
15
17
  export const DefaultFoldButton = JSX<DefaultFoldButtonProps>(
16
- ({ className = '', label, icon, dataTheme = '', onClick }) => {
17
- const STATE_STYLE =
18
- 'hover:bg-primary-hover focus:border-primary-text active:bg-primary-active outline-none';
19
- const DIMENSIONS_STYLE = 'flex justify-center w-full px-0 py-5';
20
-
18
+ ({ className = '', label, icon, dataTheme = '', disabled = false, onClick }) => {
21
19
  return (
22
20
  <button
23
- className={[
24
- 'border border-transparent bg-primary-main font-sans text-white cursor-pointer',
25
- STATE_STYLE,
26
- DIMENSIONS_STYLE,
21
+ className={style(
22
+ 'flex justify-center w-full px-0 py-5 border border-transparent outline-none focus:border-primary-text',
23
+ disabled
24
+ ? 'bg-main-divider text-main-disabled hover:bg-main-divider'
25
+ : 'bg-primary-main text-white hover:bg-primary-hove',
27
26
  className,
28
- ].join(' ')}
29
- data-theme={dataTheme}
27
+ )}
30
28
  onClick={onClick}
29
+ disabled={disabled}
30
+ data-theme={dataTheme}
31
31
  >
32
32
  <span className="text-h4 pr-3">{label}</span>
33
33
  {icon ? (
@@ -3,7 +3,7 @@ import { SlideCheckbox } from './SlideCheckbox';
3
3
  export default {
4
4
  primary: (
5
5
  <div className="bg-white">
6
- <SlideCheckbox checked={true} text={'Checkbox'} />
6
+ <SlideCheckbox value={true} text={'Checkbox'} />
7
7
  </div>
8
8
  ),
9
9
  };
@@ -1,33 +1,36 @@
1
1
  import { JSX } from '@redneckz/uni-jsx';
2
- import { Text } from '../../ui-kit/Text/Text';
2
+ import { Text } from '../Text/Text';
3
3
 
4
4
  interface SlideCheckboxProps {
5
- checked?: boolean;
5
+ value?: boolean;
6
6
  text?: string;
7
- onClick?: () => void;
7
+ type?: 'checkbox' | 'radio';
8
+ onChange?: (value: boolean) => void;
8
9
  }
9
- export const SlideCheckbox = JSX<SlideCheckboxProps>(({ checked, text, onClick }) => (
10
- <div
11
- role="checkbox"
12
- aria-checked={checked}
13
- className="flex justify-start items-center w-full cursor-pointer mb-4"
14
- onClick={() => onClick && onClick()}
15
- >
10
+ export const SlideCheckbox = JSX<SlideCheckboxProps>(
11
+ ({ value = false, text, type = 'checkbox', onChange }) => (
16
12
  <div
17
- className={`relative duration-300 w-9 h-5 mr-3 rounded rounded-2xl ${
18
- checked ? 'bg-primary-main' : 'bg-main-divider'
19
- }`}
13
+ role={type}
14
+ aria-checked={value}
15
+ className="flex justify-start items-center w-full cursor-pointer mb-4"
16
+ onClick={() => onChange && onChange(!value)}
20
17
  >
21
18
  <div
22
- className={`absolute opacity-80 duration-500 top-0.5 w-4 h-4 bg-white rounded rounded-full ${
23
- checked ? 'left-[50%]' : 'left-[5%]'
19
+ className={`relative flex-shrink-0 duration-300 w-9 h-5 mr-3 rounded-2xl ${
20
+ value ? 'bg-primary-main' : 'bg-main-divider'
24
21
  }`}
25
- />
22
+ >
23
+ <div
24
+ className={`absolute opacity-80 duration-500 top-0.5 w-4 h-4 bg-white rounded-full ${
25
+ value ? 'left-[50%]' : 'left-[5%]'
26
+ }`}
27
+ />
28
+ </div>
29
+ <div>
30
+ <Text size="text-m" font="font-light" color="text-primary-text">
31
+ {text}
32
+ </Text>
33
+ </div>
26
34
  </div>
27
- <div>
28
- <Text size="text-m" font="font-light" color="text-primary-text">
29
- {text}
30
- </Text>
31
- </div>
32
- </div>
33
- ));
35
+ ),
36
+ );
@@ -0,0 +1,44 @@
1
+ import { JSX } from '@redneckz/uni-jsx';
2
+ import type { ControlProps } from '../ControlProps';
3
+ import { SlideCheckbox } from '../SlideCheckbox/SlideCheckbox';
4
+
5
+ type SlideCheckboxGroupItem = {
6
+ value: string;
7
+ title: string;
8
+ };
9
+
10
+ interface SlideCheckboxGroupProps extends ControlProps<string> {
11
+ multiple: false;
12
+ items: SlideCheckboxGroupItem[];
13
+ }
14
+
15
+ interface MultipleSlideCheckboxGroupProps extends ControlProps<string[]> {
16
+ multiple: true;
17
+ items: SlideCheckboxGroupItem[];
18
+ }
19
+
20
+ export const SlideCheckboxGroup = JSX<SlideCheckboxGroupProps | MultipleSlideCheckboxGroupProps>(
21
+ ({ value, onChange, items = [], multiple }) => {
22
+ const handleChange = (newValue: string) => {
23
+ if (multiple) {
24
+ const hasAlready = value?.includes(newValue);
25
+ onChange &&
26
+ onChange(
27
+ hasAlready ? value?.filter((v) => v !== newValue) : [...(value || []), newValue],
28
+ );
29
+ } else {
30
+ onChange && onChange(value === newValue ? undefined : newValue);
31
+ }
32
+ };
33
+
34
+ return items.map((item) => (
35
+ <SlideCheckbox
36
+ key={item.value}
37
+ text={item.title}
38
+ value={[value].flatMap((_) => _).includes(item.value)}
39
+ onChange={() => handleChange(item.value)}
40
+ type={multiple ? 'checkbox' : 'radio'}
41
+ />
42
+ ));
43
+ },
44
+ );