@redneckz/wildless-cms-uni-blocks 0.14.814 → 0.14.815

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 (113) hide show
  1. package/bundle/UniBlock/UniBlock.d.ts +3 -1
  2. package/bundle/blocks.schema.json +1 -1
  3. package/bundle/bundle.umd.js +86 -19
  4. package/bundle/bundle.umd.min.js +1 -1
  5. package/bundle/components/GalleryLayout/GalleryLayout.d.ts +5 -0
  6. package/bundle/components/GalleryLayout/GalleryLayoutContent.d.ts +14 -0
  7. package/dist/BlockRenderer/renderBlock.js +1 -1
  8. package/dist/BlockRenderer/renderBlock.js.map +1 -1
  9. package/dist/UniBlock/UniBlock.d.ts +3 -1
  10. package/dist/UniBlock/UniBlock.js.map +1 -1
  11. package/dist/components/Blocks.js +2 -0
  12. package/dist/components/Blocks.js.map +1 -1
  13. package/dist/components/Blocks.mobile.js +2 -0
  14. package/dist/components/Blocks.mobile.js.map +1 -1
  15. package/dist/components/CarouselCatalogCard/CarouselCatalogCard.js +1 -1
  16. package/dist/components/CarouselCatalogCard/CarouselCatalogCard.js.map +1 -1
  17. package/dist/components/GalleryLayout/GalleryLayout.d.ts +5 -0
  18. package/dist/components/GalleryLayout/GalleryLayout.js +71 -0
  19. package/dist/components/GalleryLayout/GalleryLayout.js.map +1 -0
  20. package/dist/components/GalleryLayout/GalleryLayoutContent.d.ts +14 -0
  21. package/dist/components/GalleryLayout/GalleryLayoutContent.js +2 -0
  22. package/dist/components/GalleryLayout/GalleryLayoutContent.js.map +1 -0
  23. package/dist/ui-kit/BaseProductTile/BaseProductTile.js +8 -1
  24. package/dist/ui-kit/BaseProductTile/BaseProductTile.js.map +1 -1
  25. package/dist/ui-kit/BaseTile/BaseTile.js +3 -3
  26. package/dist/ui-kit/BaseTile/BaseTile.js.map +1 -1
  27. package/lib/BlockRenderer/renderBlock.js +1 -1
  28. package/lib/BlockRenderer/renderBlock.js.map +1 -1
  29. package/lib/UniBlock/UniBlock.d.ts +3 -1
  30. package/lib/UniBlock/UniBlock.js.map +1 -1
  31. package/lib/common.css +1 -1
  32. package/lib/components/Blocks.js +2 -0
  33. package/lib/components/Blocks.js.map +1 -1
  34. package/lib/components/Blocks.mobile.js +2 -0
  35. package/lib/components/Blocks.mobile.js.map +1 -1
  36. package/lib/components/CarouselCatalogCard/CarouselCatalogCard.js +1 -1
  37. package/lib/components/CarouselCatalogCard/CarouselCatalogCard.js.map +1 -1
  38. package/lib/components/GalleryLayout/GalleryLayout.d.ts +5 -0
  39. package/lib/components/GalleryLayout/GalleryLayout.fixture.d.ts +5 -0
  40. package/lib/components/GalleryLayout/GalleryLayout.js +69 -0
  41. package/lib/components/GalleryLayout/GalleryLayout.js.map +1 -0
  42. package/lib/components/GalleryLayout/GalleryLayoutContent.d.ts +14 -0
  43. package/lib/components/GalleryLayout/GalleryLayoutContent.js +2 -0
  44. package/lib/components/GalleryLayout/GalleryLayoutContent.js.map +1 -0
  45. package/lib/ui-kit/BaseProductTile/BaseProductTile.js +9 -2
  46. package/lib/ui-kit/BaseProductTile/BaseProductTile.js.map +1 -1
  47. package/lib/ui-kit/BaseTile/BaseTile.js +3 -3
  48. package/lib/ui-kit/BaseTile/BaseTile.js.map +1 -1
  49. package/mobile/bundle/UniBlock/UniBlock.d.ts +3 -1
  50. package/mobile/bundle/bundle.umd.js +86 -19
  51. package/mobile/bundle/bundle.umd.min.js +1 -1
  52. package/mobile/bundle/components/GalleryLayout/GalleryLayout.d.ts +5 -0
  53. package/mobile/bundle/components/GalleryLayout/GalleryLayoutContent.d.ts +14 -0
  54. package/mobile/dist/BlockRenderer/renderBlock.js +1 -1
  55. package/mobile/dist/BlockRenderer/renderBlock.js.map +1 -1
  56. package/mobile/dist/UniBlock/UniBlock.d.ts +3 -1
  57. package/mobile/dist/UniBlock/UniBlock.js.map +1 -1
  58. package/mobile/dist/components/Blocks.js +2 -0
  59. package/mobile/dist/components/Blocks.js.map +1 -1
  60. package/mobile/dist/components/CarouselCatalogCard/CarouselCatalogCard.js +1 -1
  61. package/mobile/dist/components/CarouselCatalogCard/CarouselCatalogCard.js.map +1 -1
  62. package/mobile/dist/components/GalleryLayout/GalleryLayout.d.ts +5 -0
  63. package/mobile/dist/components/GalleryLayout/GalleryLayout.js +71 -0
  64. package/mobile/dist/components/GalleryLayout/GalleryLayout.js.map +1 -0
  65. package/mobile/dist/components/GalleryLayout/GalleryLayoutContent.d.ts +14 -0
  66. package/mobile/dist/components/GalleryLayout/GalleryLayoutContent.js +2 -0
  67. package/mobile/dist/components/GalleryLayout/GalleryLayoutContent.js.map +1 -0
  68. package/mobile/dist/ui-kit/BaseProductTile/BaseProductTile.js +8 -1
  69. package/mobile/dist/ui-kit/BaseProductTile/BaseProductTile.js.map +1 -1
  70. package/mobile/dist/ui-kit/BaseTile/BaseTile.js +3 -3
  71. package/mobile/dist/ui-kit/BaseTile/BaseTile.js.map +1 -1
  72. package/mobile/lib/BlockRenderer/renderBlock.js +1 -1
  73. package/mobile/lib/BlockRenderer/renderBlock.js.map +1 -1
  74. package/mobile/lib/UniBlock/UniBlock.d.ts +3 -1
  75. package/mobile/lib/UniBlock/UniBlock.js.map +1 -1
  76. package/mobile/lib/common.css +1 -1
  77. package/mobile/lib/components/Blocks.js +2 -0
  78. package/mobile/lib/components/Blocks.js.map +1 -1
  79. package/mobile/lib/components/CarouselCatalogCard/CarouselCatalogCard.js +1 -1
  80. package/mobile/lib/components/CarouselCatalogCard/CarouselCatalogCard.js.map +1 -1
  81. package/mobile/lib/components/GalleryLayout/GalleryLayout.d.ts +5 -0
  82. package/mobile/lib/components/GalleryLayout/GalleryLayout.js +69 -0
  83. package/mobile/lib/components/GalleryLayout/GalleryLayout.js.map +1 -0
  84. package/mobile/lib/components/GalleryLayout/GalleryLayoutContent.d.ts +14 -0
  85. package/mobile/lib/components/GalleryLayout/GalleryLayoutContent.js +2 -0
  86. package/mobile/lib/components/GalleryLayout/GalleryLayoutContent.js.map +1 -0
  87. package/mobile/lib/ui-kit/BaseProductTile/BaseProductTile.js +9 -2
  88. package/mobile/lib/ui-kit/BaseProductTile/BaseProductTile.js.map +1 -1
  89. package/mobile/lib/ui-kit/BaseTile/BaseTile.js +3 -3
  90. package/mobile/lib/ui-kit/BaseTile/BaseTile.js.map +1 -1
  91. package/mobile/src/BlockRenderer/renderBlock.tsx +3 -3
  92. package/mobile/src/UniBlock/UniBlock.tsx +3 -1
  93. package/mobile/src/components/Blocks.ts +2 -0
  94. package/mobile/src/components/CarouselCatalogCard/CarouselCatalogCard.tsx +1 -0
  95. package/mobile/src/components/GalleryLayout/GalleryLayout.example.json +102 -0
  96. package/mobile/src/components/GalleryLayout/GalleryLayout.tsx +140 -0
  97. package/mobile/src/components/GalleryLayout/GalleryLayout.ui.json +1 -0
  98. package/mobile/src/components/GalleryLayout/GalleryLayoutContent.ts +16 -0
  99. package/mobile/src/ui-kit/BaseProductTile/BaseProductTile.tsx +60 -23
  100. package/mobile/src/ui-kit/BaseTile/BaseTile.tsx +11 -7
  101. package/package.json +2 -2
  102. package/src/BlockRenderer/renderBlock.tsx +3 -3
  103. package/src/UniBlock/UniBlock.tsx +3 -1
  104. package/src/components/Blocks.mobile.ts +2 -0
  105. package/src/components/Blocks.ts +2 -0
  106. package/src/components/CarouselCatalogCard/CarouselCatalogCard.tsx +1 -0
  107. package/src/components/GalleryLayout/GalleryLayout.example.json +102 -0
  108. package/src/components/GalleryLayout/GalleryLayout.fixture.tsx +61 -0
  109. package/src/components/GalleryLayout/GalleryLayout.tsx +140 -0
  110. package/src/components/GalleryLayout/GalleryLayout.ui.json +1 -0
  111. package/src/components/GalleryLayout/GalleryLayoutContent.ts +16 -0
  112. package/src/ui-kit/BaseProductTile/BaseProductTile.tsx +60 -23
  113. package/src/ui-kit/BaseTile/BaseTile.tsx +11 -7
@@ -0,0 +1,102 @@
1
+ {
2
+ "content": {
3
+ "gap": "L",
4
+ "version": "primary",
5
+ "padding": "p-xl"
6
+ },
7
+ "blocks": [
8
+ {
9
+ "content": {
10
+ "version": "secondary",
11
+ "title": "Продукт",
12
+ "description": "Описание",
13
+ "headlineVersion": "XL",
14
+ "backwardButton": false,
15
+ "isDotted": true,
16
+ "buttons": [
17
+ {
18
+ "text": "Кнопка",
19
+ "version": "secondary"
20
+ }
21
+ ],
22
+ "padding": "p-xl",
23
+ "benefitsVersion": "normal",
24
+ "benefits": [
25
+ {
26
+ "label": "Преимущество №1",
27
+ "icon": {
28
+ "icon": "SmallClockIcon"
29
+ }
30
+ },
31
+ {
32
+ "label": "Преимущество №2",
33
+ "icon": {
34
+ "icon": "SignDocsIcon"
35
+ }
36
+ }
37
+ ],
38
+ "imageOptions": {
39
+ "imageAlign": "end"
40
+ }
41
+ },
42
+ "style": ["col-span-12"],
43
+ "type": "ProductBlock"
44
+ },
45
+ {
46
+ "content": {
47
+ "version": "secondary",
48
+ "title": "Продукт",
49
+ "headlineVersion": "S",
50
+ "backwardButton": false,
51
+ "padding": "p-xl",
52
+ "imageOptions": {
53
+ "imageAlign": "end"
54
+ }
55
+ },
56
+ "style": ["col-span-12"],
57
+ "type": "ProductBlock"
58
+ },
59
+ {
60
+ "content": {
61
+ "version": "secondary",
62
+ "title": "Продукт",
63
+ "headlineVersion": "S",
64
+ "backwardButton": false,
65
+ "padding": "p-xl",
66
+ "imageOptions": {
67
+ "imageAlign": "end"
68
+ }
69
+ },
70
+ "style": ["col-span-12"],
71
+ "type": "ProductBlock"
72
+ },
73
+ {
74
+ "content": {
75
+ "version": "secondary",
76
+ "title": "Продукт",
77
+ "headlineVersion": "S",
78
+ "backwardButton": false,
79
+ "padding": "p-xl",
80
+ "imageOptions": {
81
+ "imageAlign": "end"
82
+ }
83
+ },
84
+ "style": ["col-span-12"],
85
+ "type": "ProductBlock"
86
+ },
87
+ {
88
+ "content": {
89
+ "version": "secondary",
90
+ "title": "Продукт",
91
+ "headlineVersion": "S",
92
+ "backwardButton": false,
93
+ "padding": "p-xl",
94
+ "imageOptions": {
95
+ "imageAlign": "end"
96
+ }
97
+ },
98
+ "style": ["col-span-12"],
99
+ "type": "ProductBlock"
100
+ }
101
+ ]
102
+ }
@@ -0,0 +1,140 @@
1
+ import { type JSONSchema7Definition } from 'json-schema';
2
+ import { renderBlock } from '../../BlockRenderer/renderBlock';
3
+ import { type ChildRenderProps } from '../../BlockRenderer/renderBlockList';
4
+ import { renderChildren } from '../../BlockRenderer/renderChildren';
5
+ import { type BlockDecorator } from '../../model/BlockDecorator';
6
+ import { type BlockDef } from '../../model/ContentPageDef';
7
+ import { type LinkProps } from '../../model/LinkProps';
8
+ import { BlockWrapper } from '../../ui-kit/BlockWrapper';
9
+ import { LinkWrapper } from '../../ui-kit/LinkWrapper/LinkWrapper';
10
+ import { UniBlock } from '../../UniBlock/UniBlock';
11
+ import { type UniBlockProps } from '../../UniBlock/UniBlockProps';
12
+ import { getBorderStyle } from '../../utils/getBorderStyle';
13
+ import { getInnerPadding } from '../../utils/getInnerPadding';
14
+ import { style } from '../../utils/style';
15
+ import { gapStyles } from '../HorizontalLayout/gapStyles';
16
+ import { type ProductBlockContent } from '../ProductBlock/ProductBlockContent';
17
+ import { type GalleryLayoutContent } from './GalleryLayoutContent';
18
+
19
+ const MIN_LENGTH_CHILD = 5;
20
+ const SHORT_TILE_INDEXES = [1, 2, 3, 4];
21
+ const LINK_SCHEMA: Record<string, JSONSchema7Definition> = {
22
+ link: {
23
+ allOf: [
24
+ { $ref: `#/definitions/LinkCommonProps` },
25
+ {
26
+ type: 'object',
27
+ properties: {
28
+ data: {
29
+ type: 'array',
30
+ items: { $ref: '#/definitions/AspectsDef' },
31
+ title: 'Дополнительные атрибуты',
32
+ },
33
+ },
34
+ },
35
+ ],
36
+ title: 'Ссылка',
37
+ required: ['href'],
38
+ },
39
+ };
40
+
41
+ export interface GalleryLayoutProps extends GalleryLayoutContent, UniBlockProps {}
42
+
43
+ export const GalleryLayout = UniBlock<GalleryLayoutProps>(
44
+ ({
45
+ className = '',
46
+ padding = 'p-0',
47
+ gap = '',
48
+ isInnerPadding = true,
49
+ version = 'transparent',
50
+ isTheme = false,
51
+ isCardBorder = false,
52
+ ...rest
53
+ }) => (
54
+ <BlockWrapper
55
+ className={style(
56
+ 'grid grid-cols-1 sm:grid-cols-1 lg:grid-cols-4 lg:auto-rows-fr',
57
+ gapStyles[gap],
58
+ className,
59
+ )}
60
+ padding={padding}
61
+ version={version}
62
+ isTheme={isTheme}
63
+ {...rest}
64
+ >
65
+ {renderChildren({
66
+ ...rest,
67
+ renderProps: getRenderProps({ isInnerPadding, isCardBorder }),
68
+ })}
69
+ </BlockWrapper>
70
+ ),
71
+ {
72
+ childrenTypes: ['ProductBlock'],
73
+ childSchema: () => LINK_SCHEMA,
74
+ allowRemoveChild: (slot) => (slot?.blocks ?? []).length > MIN_LENGTH_CHILD,
75
+ },
76
+ );
77
+
78
+ const getRenderProps =
79
+ ({
80
+ isInnerPadding,
81
+ isCardBorder,
82
+ }: {
83
+ isInnerPadding: boolean;
84
+ isCardBorder: boolean;
85
+ }): ChildRenderProps =>
86
+ (childBlock, childOptions, i) =>
87
+ renderBlock(
88
+ childBlock,
89
+ {
90
+ ...childOptions,
91
+ blockDecorator: blockDecoratorWrapper(childOptions.blockDecorator, i),
92
+ },
93
+ {
94
+ className: style('w-full', getBorderStyle(isCardBorder)),
95
+ ...getInnerPadding(isInnerPadding),
96
+ },
97
+ );
98
+
99
+ const blockDecoratorWrapper =
100
+ (blockDecorator?: BlockDecorator, idx = 0): BlockDecorator =>
101
+ (props, i) =>
102
+ blockDecorator?.(
103
+ {
104
+ ...props,
105
+ render: (renderProps) => productBlockDecorator(idx)({ ...props, ...renderProps }, i),
106
+ },
107
+ `wrap_${i}`,
108
+ ) ?? productBlockDecorator(idx)(props, i);
109
+
110
+ const productBlockDecorator =
111
+ (idx: number): BlockDecorator =>
112
+ ({ blockClassName, block, render }, i) =>
113
+ (
114
+ <LinkWrapper key={i} {...block.content?.link} className={getChildStyle(idx)}>
115
+ {render({
116
+ blockClassName: style(blockClassName, 'h-full'),
117
+ block: modifyBlock(block, idx),
118
+ })}
119
+ </LinkWrapper>
120
+ );
121
+
122
+ const getChildStyle = (index: number) =>
123
+ SHORT_TILE_INDEXES.includes(index)
124
+ ? 'lg:col-span-1 lg:row-span-1'
125
+ : 'lg:col-span-2 lg:row-span-2';
126
+
127
+ const modifyBlock = (block: BlockDef, i: number) => {
128
+ const content: ProductBlockContent & { link?: LinkProps } = { ...block.content };
129
+
130
+ if (SHORT_TILE_INDEXES.includes(i)) {
131
+ delete content.description;
132
+ delete content.benefits;
133
+ }
134
+
135
+ if (content.link?.href) {
136
+ delete content.buttons;
137
+ }
138
+
139
+ return { ...block, content };
140
+ };
@@ -0,0 +1,16 @@
1
+ import { type ImageContent } from '../../ui-kit/Img/ImgProps';
2
+ import { type UniBlockContent } from '../../UniBlock/UniBlockProps';
3
+ import { type GapVersion } from '../HorizontalLayout/HorizontalLayoutContent';
4
+
5
+ export type LayoutCommitProps = {
6
+ gap?: GapVersion;
7
+ /** @title контур на дочерних элементах */
8
+ isCardBorder?: boolean;
9
+ /** @title Отступы вложенных компонентов */
10
+ isInnerPadding?: boolean;
11
+ };
12
+
13
+ /**
14
+ * @title Компоновщик галереи
15
+ */
16
+ export type GalleryLayoutContent = UniBlockContent & LayoutCommitProps & ImageContent;
@@ -1,17 +1,20 @@
1
1
  import { JSX } from '@redneckz/uni-jsx';
2
2
  import { Headline } from '../../components/Headline/Headline';
3
+ import { type Align } from '../../model/Align';
3
4
  import { type HeadlineVersion } from '../../model/HeadlineType';
5
+ import { type IconVersion } from '../../model/IconVersion';
4
6
  import { type VNode } from '../../model/VNode';
5
7
  import { type UniBlockProps } from '../../UniBlock/UniBlockProps';
6
8
  import { BaseTile } from '../BaseTile/BaseTile';
9
+ import { type BenefitItemContent } from '../BenefitItem/BenefitItemContent';
7
10
  import { BenefitsList } from '../BenefitsList/BenefitsList';
8
11
  import { Img } from '../Img/Img';
9
12
  import { renderButtonsSection } from '../LinkButton/renderButtonsSection';
10
13
  import { PriceList } from '../PriceList/PriceList';
11
14
  import { RichText } from '../RichText/RichText';
12
- import { type RichTextItemSize } from '../RichText/RichTextProps';
15
+ import { type RichTextItemSize, type RichVersion } from '../RichText/RichTextProps';
13
16
  import { Tags } from '../Tags/Tags';
14
- import { type BaseProductTileContent } from './BaseProductTileContent';
17
+ import { type BaseProductTileContent, type PriceItem } from './BaseProductTileContent';
15
18
 
16
19
  const RICHTEXT_SIZE: Record<HeadlineVersion, RichTextItemSize> = {
17
20
  XXL: 'list-l',
@@ -47,7 +50,7 @@ export const BaseProductTile = JSX<BaseProductTileProps>(
47
50
  buttons,
48
51
  image,
49
52
  imageOptions: {
50
- imageAlign = 'center',
53
+ imageAlign = 'center' as Align,
51
54
  directionRight = true,
52
55
  isImageAlwaysOnRight,
53
56
  isImageSecondary = false,
@@ -84,31 +87,65 @@ export const BaseProductTile = JSX<BaseProductTileProps>(
84
87
  backwardButton={backwardButton}
85
88
  {...rest}
86
89
  >
87
- <div className="flex flex-col sm:gap-xl gap-4xl">
88
- {filteredBenefits?.length ? (
89
- <BenefitsList
90
- benefitsVersion={benefitsVersion}
91
- isTabularBenefits={isTabularBenefits}
92
- benefits={filteredBenefits}
93
- />
94
- ) : null}
95
- {__html ? (
96
- <RichText
97
- richVersion={richVersion}
98
- __html={__html}
99
- isDotted={isDotted}
100
- itemSize={RICHTEXT_SIZE[headlineVersion]}
101
- />
102
- ) : null}
103
- {children}
104
- {priceList?.length ? <PriceList priceList={priceList} /> : null}
105
- {renderTags(tags)}
106
- </div>
90
+ {renderChildList(
91
+ renderBenefits(filteredBenefits, { benefitsVersion, isTabularBenefits }),
92
+ renderRichText(__html, { richVersion, isDotted, headlineVersion }),
93
+ children,
94
+ renderPriceList(priceList),
95
+ renderTags(tags),
96
+ )}
107
97
  </BaseTile>
108
98
  );
109
99
  },
110
100
  );
111
101
 
102
+ const renderBenefits = (
103
+ benefits?: BenefitItemContent[],
104
+ {
105
+ benefitsVersion,
106
+ isTabularBenefits,
107
+ }: { benefitsVersion?: IconVersion; isTabularBenefits?: boolean } = {},
108
+ ) =>
109
+ benefits?.length ? (
110
+ <BenefitsList
111
+ benefitsVersion={benefitsVersion}
112
+ isTabularBenefits={isTabularBenefits}
113
+ benefits={benefits}
114
+ />
115
+ ) : null;
116
+
117
+ const renderRichText = (
118
+ __html?: string,
119
+ {
120
+ richVersion,
121
+ isDotted,
122
+ headlineVersion,
123
+ }: { richVersion?: RichVersion; isDotted?: boolean; headlineVersion?: HeadlineVersion } = {},
124
+ ) =>
125
+ __html ? (
126
+ <RichText
127
+ __html={__html}
128
+ richVersion={richVersion}
129
+ isDotted={isDotted}
130
+ itemSize={RICHTEXT_SIZE[headlineVersion ?? 'L']}
131
+ />
132
+ ) : null;
133
+
134
+ const renderPriceList = (priceList?: PriceItem[]) =>
135
+ priceList?.length ? <PriceList priceList={priceList} /> : null;
136
+
137
+ const renderChildList = (...elements: VNode[]) => {
138
+ const cleanElements = elements.filter(Boolean);
139
+
140
+ return cleanElements.length ? (
141
+ <div className="flex flex-col sm:gap-xl gap-4xl">
142
+ {cleanElements.map((_, i) => (
143
+ <div key={String(i)}>{_}</div>
144
+ ))}
145
+ </div>
146
+ ) : null;
147
+ };
148
+
112
149
  export const leftOrRightImage = (img: VNode, directionRight: boolean) =>
113
150
  directionRight ? { rightImage: img } : { leftImage: img };
114
151
 
@@ -55,7 +55,7 @@ export const BaseTile = JSX<BaseTileProps>(
55
55
  )}
56
56
  >
57
57
  {isBackBtn && renderBackwardButton({ version, handleClick, text: backwardButtonText })}
58
- {title ? <div className="relative h-full">{title}</div> : null}
58
+ {title ? <div className="relative">{title}</div> : null}
59
59
  <div
60
60
  className={style('grow relative flex flex-col @xl:flex-row gap-3xl w-full', {
61
61
  'self-start @xl:w-auto': leftImage,
@@ -69,14 +69,10 @@ export const BaseTile = JSX<BaseTileProps>(
69
69
  '@xl:grid-cols-2 auto-cols-fr': rightImage,
70
70
  grow: !leftImage,
71
71
  },
72
- 'h-full', //? fix issue https://github.com/redneckz/temp_wcms/issues/1254
73
- 'auto-rows-[max-content_1fr]', //? fix issue https://github.com/redneckz/temp_wcms/issues/1324
72
+ 'h-auto',
74
73
  )}
75
74
  >
76
- <div className="grow space-y-lg min-w-fit">
77
- {insetTitle}
78
- {children}
79
- </div>
75
+ {renderMiddleContent(insetTitle, children)}
80
76
  {renderUnitContainer(
81
77
  renderChildren({ ...rest, extraProps: { className: '@container-normal' } }),
82
78
  )}
@@ -96,6 +92,14 @@ export const BaseTile = JSX<BaseTileProps>(
96
92
  },
97
93
  );
98
94
 
95
+ const renderMiddleContent = (insetTitle: VNode, children: VNode) =>
96
+ insetTitle || children ? (
97
+ <div className="grow space-y-lg min-w-fit">
98
+ {insetTitle}
99
+ {children}
100
+ </div>
101
+ ) : null;
102
+
99
103
  const imageAlwaysOnRightContainerStyle = (isImage: boolean) =>
100
104
  style(isImage ? 'row-span-2' : '@xl:row-span-2');
101
105
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redneckz/wildless-cms-uni-blocks",
3
- "version": "0.14.814",
3
+ "version": "0.14.815",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "author": "ЦК",
@@ -214,7 +214,7 @@
214
214
  "path": "lib/common.css"
215
215
  },
216
216
  {
217
- "limit": "101 kB",
217
+ "limit": "102 kB",
218
218
  "path": "bundle/bundle.umd.min.js"
219
219
  }
220
220
  ],
@@ -42,11 +42,11 @@ export function renderBlock(
42
42
  return BlockComponent ? (
43
43
  <BlockComponent
44
44
  key={key}
45
- className={adjustedBlockClassName}
46
- block={block}
47
- options={options}
48
45
  {...content}
49
46
  {...extraProps}
47
+ className={style(adjustedBlockClassName, content?.className as string)}
48
+ block={block}
49
+ options={options}
50
50
  />
51
51
  ) : null;
52
52
  },
@@ -3,7 +3,7 @@ import { JSX, type UNIComponent } from '@redneckz/uni-jsx';
3
3
  import { type JSONSchema7Definition } from 'json-schema';
4
4
  import { useJSONRef } from '../hooks/useJSONRef/useJSONRef';
5
5
  import { type SlotName } from '../model/BlockDecorator';
6
- import { type BlockDef } from '../model/ContentPageDef';
6
+ import { type BlockDef, type Slot } from '../model/ContentPageDef';
7
7
  import { type VNode } from '../model/VNode';
8
8
  import { extractContent } from './extractContent';
9
9
  import { type UniBlockProps } from './UniBlockProps';
@@ -12,6 +12,8 @@ export interface UniBlockMeta<Props extends UniBlockProps = UniBlockProps> {
12
12
  displayName?: string;
13
13
  childrenTypes?: string[] | { include?: string[]; exclude?: string[] };
14
14
  childSchema?: (content: BlockDef['content']) => Record<string, JSONSchema7Definition>;
15
+ allowAddChild?: (slot?: Slot) => boolean;
16
+ allowRemoveChild?: (slot?: Slot) => boolean;
15
17
  slots?: (props: Props) => SlotName[];
16
18
  }
17
19
 
@@ -26,6 +26,7 @@ import { Depository } from './Depository/Depository';
26
26
  import { ErrorBlock } from './ErrorBlock/ErrorBlock';
27
27
  import { ExchangeRateTile } from './ExchangeRateTile/ExchangeRateTile';
28
28
  import { Footer } from './Footer/Footer';
29
+ import { GalleryLayout } from './GalleryLayout/GalleryLayout';
29
30
  import { GrantSupport } from './GrantSupport/GrantSupport';
30
31
  import { Header } from './Header/Header';
31
32
  import { Headline } from './Headline/Headline';
@@ -74,6 +75,7 @@ export const Blocks: BlocksRegistry = {
74
75
  ErrorBlock,
75
76
  ExchangeRateTile,
76
77
  Footer,
78
+ GalleryLayout,
77
79
  GrantSupport,
78
80
  Header,
79
81
  Headline,
@@ -28,6 +28,7 @@ import { Depository } from './Depository/Depository';
28
28
  import { ErrorBlock } from './ErrorBlock/ErrorBlock';
29
29
  import { ExchangeRateTile } from './ExchangeRateTile/ExchangeRateTile';
30
30
  import { Footer } from './Footer/Footer';
31
+ import { GalleryLayout } from './GalleryLayout/GalleryLayout';
31
32
  import { GracePeriod } from './GracePeriod/GracePeriod';
32
33
  import { GrantSupport } from './GrantSupport/GrantSupport';
33
34
  import { Header } from './Header/Header';
@@ -81,6 +82,7 @@ export const Blocks: BlocksRegistry = {
81
82
  ErrorBlock,
82
83
  ExchangeRateTile,
83
84
  Footer,
85
+ GalleryLayout,
84
86
  GracePeriod,
85
87
  GrantSupport,
86
88
  Header,
@@ -45,6 +45,7 @@ export const CarouselCatalogCard = JSX<CarouselCatalogCardProps>(
45
45
  headlineVersion="XS"
46
46
  isEmbedded={true}
47
47
  align={align}
48
+ className="min-h-24"
48
49
  />
49
50
  }
50
51
  rightImage={
@@ -0,0 +1,102 @@
1
+ {
2
+ "content": {
3
+ "gap": "L",
4
+ "version": "primary",
5
+ "padding": "p-xl"
6
+ },
7
+ "blocks": [
8
+ {
9
+ "content": {
10
+ "version": "secondary",
11
+ "title": "Продукт",
12
+ "description": "Описание",
13
+ "headlineVersion": "XL",
14
+ "backwardButton": false,
15
+ "isDotted": true,
16
+ "buttons": [
17
+ {
18
+ "text": "Кнопка",
19
+ "version": "secondary"
20
+ }
21
+ ],
22
+ "padding": "p-xl",
23
+ "benefitsVersion": "normal",
24
+ "benefits": [
25
+ {
26
+ "label": "Преимущество №1",
27
+ "icon": {
28
+ "icon": "SmallClockIcon"
29
+ }
30
+ },
31
+ {
32
+ "label": "Преимущество №2",
33
+ "icon": {
34
+ "icon": "SignDocsIcon"
35
+ }
36
+ }
37
+ ],
38
+ "imageOptions": {
39
+ "imageAlign": "end"
40
+ }
41
+ },
42
+ "style": ["col-span-12"],
43
+ "type": "ProductBlock"
44
+ },
45
+ {
46
+ "content": {
47
+ "version": "secondary",
48
+ "title": "Продукт",
49
+ "headlineVersion": "S",
50
+ "backwardButton": false,
51
+ "padding": "p-xl",
52
+ "imageOptions": {
53
+ "imageAlign": "end"
54
+ }
55
+ },
56
+ "style": ["col-span-12"],
57
+ "type": "ProductBlock"
58
+ },
59
+ {
60
+ "content": {
61
+ "version": "secondary",
62
+ "title": "Продукт",
63
+ "headlineVersion": "S",
64
+ "backwardButton": false,
65
+ "padding": "p-xl",
66
+ "imageOptions": {
67
+ "imageAlign": "end"
68
+ }
69
+ },
70
+ "style": ["col-span-12"],
71
+ "type": "ProductBlock"
72
+ },
73
+ {
74
+ "content": {
75
+ "version": "secondary",
76
+ "title": "Продукт",
77
+ "headlineVersion": "S",
78
+ "backwardButton": false,
79
+ "padding": "p-xl",
80
+ "imageOptions": {
81
+ "imageAlign": "end"
82
+ }
83
+ },
84
+ "style": ["col-span-12"],
85
+ "type": "ProductBlock"
86
+ },
87
+ {
88
+ "content": {
89
+ "version": "secondary",
90
+ "title": "Продукт",
91
+ "headlineVersion": "S",
92
+ "backwardButton": false,
93
+ "padding": "p-xl",
94
+ "imageOptions": {
95
+ "imageAlign": "end"
96
+ }
97
+ },
98
+ "style": ["col-span-12"],
99
+ "type": "ProductBlock"
100
+ }
101
+ ]
102
+ }
@@ -0,0 +1,61 @@
1
+ import type { BlockRendererOptions } from '../../BlockRenderer/BlockRendererOptions';
2
+ import type { LinkProps } from '../../model/LinkProps';
3
+ import '../../setup-fixture';
4
+ import { type UniBlockProps } from '../../UniBlock/UniBlockProps';
5
+ import { Blocks } from '../Blocks';
6
+ import { PRODUCT_BLOCK_WITH_IMAGE } from '../ProductBlock/ProductBlock.fixture';
7
+ import { type ProductBlockContent } from '../ProductBlock/ProductBlockContent';
8
+ import { GalleryLayout } from './GalleryLayout';
9
+
10
+ const options: BlockRendererOptions = {
11
+ blocksRegistry: Blocks,
12
+ };
13
+
14
+ const PRODUCT_BLOCK_TYPE = 'ProductBlock';
15
+
16
+ const CONTENT: ProductBlockContent & UniBlockProps & { link?: LinkProps } = {
17
+ ...PRODUCT_BLOCK_WITH_IMAGE,
18
+ version: 'secondary',
19
+ padding: 'p-xl',
20
+ imageOptions: {
21
+ imageAlign: 'end',
22
+ },
23
+ className: 'rounded-xl', // for identity with maket
24
+ link: {
25
+ href: 'https://google.com',
26
+ },
27
+ };
28
+
29
+ const SHORT_TILE_CONTENT: ProductBlockContent & UniBlockProps = {
30
+ ...CONTENT,
31
+ image: {
32
+ ...CONTENT.image,
33
+ size: {
34
+ width: 130,
35
+ height: 130,
36
+ },
37
+ },
38
+ };
39
+
40
+ export default {
41
+ default: (
42
+ <div className="container grid grid-cols-12">
43
+ <GalleryLayout
44
+ className="col-span-12"
45
+ gap="L"
46
+ padding="p-xl"
47
+ block={{
48
+ type: 'GalleryLayout',
49
+ blocks: [
50
+ { type: PRODUCT_BLOCK_TYPE, content: CONTENT },
51
+ { type: PRODUCT_BLOCK_TYPE, content: SHORT_TILE_CONTENT },
52
+ { type: PRODUCT_BLOCK_TYPE, content: SHORT_TILE_CONTENT },
53
+ { type: PRODUCT_BLOCK_TYPE, content: SHORT_TILE_CONTENT },
54
+ { type: PRODUCT_BLOCK_TYPE, content: SHORT_TILE_CONTENT },
55
+ ],
56
+ }}
57
+ options={options}
58
+ />
59
+ </div>
60
+ ),
61
+ };