@redneckz/wildless-cms-uni-blocks 0.6.19 → 0.6.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/migration-scripts/0.6.19.js +21 -0
- package/bundle/bundle.umd.js +49 -22
- package/bundle/bundle.umd.min.js +1 -1
- package/bundle/components/Blocks.d.ts +2 -41
- package/bundle/components/Blocks.mobile.d.ts +2 -18
- package/bundle/components/ContentPage/ContentPage.d.ts +2 -2
- package/bundle/components/ContentPage/mapSlot.d.ts +2 -0
- package/bundle/components/ContentPage/normalizeBlock.d.ts +3 -11
- package/bundle/components/ContentPage/normalizeBlock.mobile.d.ts +3 -2
- package/bundle/components/ContentPage/renderBlock.d.ts +7 -3
- package/bundle/components/ContentPage/renderBlockList.d.ts +14 -0
- package/bundle/components/ContentPage/renderSlots.d.ts +12 -0
- package/bundle/model/BlockDecorator.d.ts +4 -3
- package/bundle/model/BlocksRegistry.d.ts +1 -1
- package/bundle/model/ContentPageDef.d.ts +1 -4
- package/bundle/model/JSXBlock.d.ts +3 -1
- package/dist/components/Blocks.d.ts +2 -41
- package/dist/components/Blocks.js.map +1 -1
- package/dist/components/Blocks.mobile.d.ts +2 -18
- package/dist/components/Blocks.mobile.js.map +1 -1
- package/dist/components/ContentPage/ContentPage.d.ts +2 -2
- package/dist/components/ContentPage/ContentPage.js +12 -11
- package/dist/components/ContentPage/ContentPage.js.map +1 -1
- package/dist/components/ContentPage/mapSlot.d.ts +2 -0
- package/dist/components/ContentPage/mapSlot.js +14 -0
- package/dist/components/ContentPage/mapSlot.js.map +1 -0
- package/dist/components/ContentPage/normalizeBlock.d.ts +3 -11
- package/dist/components/ContentPage/normalizeBlock.js +13 -3
- package/dist/components/ContentPage/normalizeBlock.js.map +1 -1
- package/dist/components/ContentPage/normalizeBlock.mobile.d.ts +3 -2
- package/dist/components/ContentPage/normalizeBlock.mobile.js +18 -3
- package/dist/components/ContentPage/normalizeBlock.mobile.js.map +1 -1
- package/dist/components/ContentPage/normalizePage.js +2 -14
- package/dist/components/ContentPage/normalizePage.js.map +1 -1
- package/dist/components/ContentPage/renderBlock.d.ts +7 -3
- package/dist/components/ContentPage/renderBlock.js +9 -9
- package/dist/components/ContentPage/renderBlock.js.map +1 -1
- package/dist/components/ContentPage/renderBlockList.d.ts +14 -0
- package/dist/components/ContentPage/renderBlockList.js +18 -0
- package/dist/components/ContentPage/renderBlockList.js.map +1 -0
- package/dist/components/ContentPage/renderSlots.d.ts +12 -0
- package/dist/components/ContentPage/renderSlots.js +17 -0
- package/dist/components/ContentPage/renderSlots.js.map +1 -0
- package/dist/model/BlockDecorator.d.ts +4 -3
- package/dist/model/BlockDecorator.js +1 -2
- package/dist/model/BlockDecorator.js.map +1 -1
- package/dist/model/BlocksRegistry.d.ts +1 -1
- package/dist/model/ContentPageDef.d.ts +1 -4
- package/dist/model/JSXBlock.d.ts +3 -1
- package/dist/model/getParentBlockDef.js +5 -2
- package/dist/model/getParentBlockDef.js.map +1 -1
- package/lib/components/Blocks.d.ts +2 -41
- package/lib/components/Blocks.js.map +1 -1
- package/lib/components/Blocks.mobile.d.ts +2 -18
- package/lib/components/Blocks.mobile.js.map +1 -1
- package/lib/components/ContentPage/ContentPage.d.ts +2 -2
- package/lib/components/ContentPage/ContentPage.js +12 -11
- package/lib/components/ContentPage/ContentPage.js.map +1 -1
- package/lib/components/ContentPage/mapSlot.d.ts +2 -0
- package/lib/components/ContentPage/mapSlot.js +11 -0
- package/lib/components/ContentPage/mapSlot.js.map +1 -0
- package/lib/components/ContentPage/normalizeBlock.d.ts +3 -11
- package/lib/components/ContentPage/normalizeBlock.js +13 -3
- package/lib/components/ContentPage/normalizeBlock.js.map +1 -1
- package/lib/components/ContentPage/normalizeBlock.mobile.d.ts +3 -2
- package/lib/components/ContentPage/normalizeBlock.mobile.js +18 -3
- package/lib/components/ContentPage/normalizeBlock.mobile.js.map +1 -1
- package/lib/components/ContentPage/normalizePage.js +2 -14
- package/lib/components/ContentPage/normalizePage.js.map +1 -1
- package/lib/components/ContentPage/renderBlock.d.ts +7 -3
- package/lib/components/ContentPage/renderBlock.js +9 -9
- package/lib/components/ContentPage/renderBlock.js.map +1 -1
- package/lib/components/ContentPage/renderBlockList.d.ts +14 -0
- package/lib/components/ContentPage/renderBlockList.js +15 -0
- package/lib/components/ContentPage/renderBlockList.js.map +1 -0
- package/lib/components/ContentPage/renderSlots.d.ts +12 -0
- package/lib/components/ContentPage/renderSlots.js +14 -0
- package/lib/components/ContentPage/renderSlots.js.map +1 -0
- package/lib/model/BlockDecorator.d.ts +4 -3
- package/lib/model/BlockDecorator.js +0 -1
- package/lib/model/BlockDecorator.js.map +1 -1
- package/lib/model/BlocksRegistry.d.ts +1 -1
- package/lib/model/ContentPageDef.d.ts +1 -4
- package/lib/model/JSXBlock.d.ts +3 -1
- package/lib/model/getParentBlockDef.js +5 -2
- package/lib/model/getParentBlockDef.js.map +1 -1
- package/mobile/bundle/bundle.umd.js +49 -22
- package/mobile/bundle/bundle.umd.min.js +1 -1
- package/mobile/bundle/components/Blocks.d.ts +2 -18
- package/mobile/bundle/components/ContentPage/ContentPage.d.ts +2 -2
- package/mobile/bundle/components/ContentPage/mapSlot.d.ts +2 -0
- package/mobile/bundle/components/ContentPage/normalizeBlock.d.ts +3 -2
- package/mobile/bundle/components/ContentPage/renderBlock.d.ts +7 -3
- package/mobile/bundle/components/ContentPage/renderBlockList.d.ts +14 -0
- package/mobile/bundle/components/ContentPage/renderSlots.d.ts +12 -0
- package/mobile/bundle/model/BlockDecorator.d.ts +4 -3
- package/mobile/bundle/model/BlocksRegistry.d.ts +1 -1
- package/mobile/bundle/model/ContentPageDef.d.ts +1 -4
- package/mobile/bundle/model/JSXBlock.d.ts +3 -1
- package/mobile/dist/components/Blocks.d.ts +2 -18
- package/mobile/dist/components/Blocks.js.map +1 -1
- package/mobile/dist/components/ContentPage/ContentPage.d.ts +2 -2
- package/mobile/dist/components/ContentPage/ContentPage.js +12 -11
- package/mobile/dist/components/ContentPage/ContentPage.js.map +1 -1
- package/mobile/dist/components/ContentPage/mapSlot.d.ts +2 -0
- package/mobile/dist/components/ContentPage/mapSlot.js +14 -0
- package/mobile/dist/components/ContentPage/mapSlot.js.map +1 -0
- package/mobile/dist/components/ContentPage/normalizeBlock.d.ts +3 -2
- package/mobile/dist/components/ContentPage/normalizeBlock.js +18 -3
- package/mobile/dist/components/ContentPage/normalizeBlock.js.map +1 -1
- package/mobile/dist/components/ContentPage/normalizePage.js +2 -14
- package/mobile/dist/components/ContentPage/normalizePage.js.map +1 -1
- package/mobile/dist/components/ContentPage/renderBlock.d.ts +7 -3
- package/mobile/dist/components/ContentPage/renderBlock.js +9 -9
- package/mobile/dist/components/ContentPage/renderBlock.js.map +1 -1
- package/mobile/dist/components/ContentPage/renderBlockList.d.ts +14 -0
- package/mobile/dist/components/ContentPage/renderBlockList.js +18 -0
- package/mobile/dist/components/ContentPage/renderBlockList.js.map +1 -0
- package/mobile/dist/components/ContentPage/renderSlots.d.ts +12 -0
- package/mobile/dist/components/ContentPage/renderSlots.js +17 -0
- package/mobile/dist/components/ContentPage/renderSlots.js.map +1 -0
- package/mobile/dist/model/BlockDecorator.d.ts +4 -3
- package/mobile/dist/model/BlockDecorator.js +1 -2
- package/mobile/dist/model/BlockDecorator.js.map +1 -1
- package/mobile/dist/model/BlocksRegistry.d.ts +1 -1
- package/mobile/dist/model/ContentPageDef.d.ts +1 -4
- package/mobile/dist/model/JSXBlock.d.ts +3 -1
- package/mobile/dist/model/getParentBlockDef.js +5 -2
- package/mobile/dist/model/getParentBlockDef.js.map +1 -1
- package/mobile/lib/components/Blocks.d.ts +2 -18
- package/mobile/lib/components/Blocks.js.map +1 -1
- package/mobile/lib/components/ContentPage/ContentPage.d.ts +2 -2
- package/mobile/lib/components/ContentPage/ContentPage.js +12 -11
- package/mobile/lib/components/ContentPage/ContentPage.js.map +1 -1
- package/mobile/lib/components/ContentPage/mapSlot.d.ts +2 -0
- package/mobile/lib/components/ContentPage/mapSlot.js +11 -0
- package/mobile/lib/components/ContentPage/mapSlot.js.map +1 -0
- package/mobile/lib/components/ContentPage/normalizeBlock.d.ts +3 -2
- package/mobile/lib/components/ContentPage/normalizeBlock.js +18 -3
- package/mobile/lib/components/ContentPage/normalizeBlock.js.map +1 -1
- package/mobile/lib/components/ContentPage/normalizePage.js +2 -14
- package/mobile/lib/components/ContentPage/normalizePage.js.map +1 -1
- package/mobile/lib/components/ContentPage/renderBlock.d.ts +7 -3
- package/mobile/lib/components/ContentPage/renderBlock.js +9 -9
- package/mobile/lib/components/ContentPage/renderBlock.js.map +1 -1
- package/mobile/lib/components/ContentPage/renderBlockList.d.ts +14 -0
- package/mobile/lib/components/ContentPage/renderBlockList.js +15 -0
- package/mobile/lib/components/ContentPage/renderBlockList.js.map +1 -0
- package/mobile/lib/components/ContentPage/renderSlots.d.ts +12 -0
- package/mobile/lib/components/ContentPage/renderSlots.js +14 -0
- package/mobile/lib/components/ContentPage/renderSlots.js.map +1 -0
- package/mobile/lib/model/BlockDecorator.d.ts +4 -3
- package/mobile/lib/model/BlockDecorator.js +0 -1
- package/mobile/lib/model/BlockDecorator.js.map +1 -1
- package/mobile/lib/model/BlocksRegistry.d.ts +1 -1
- package/mobile/lib/model/ContentPageDef.d.ts +1 -4
- package/mobile/lib/model/JSXBlock.d.ts +3 -1
- package/mobile/lib/model/getParentBlockDef.js +5 -2
- package/mobile/lib/model/getParentBlockDef.js.map +1 -1
- package/mobile/src/components/Blocks.ts +2 -1
- package/mobile/src/components/ContentPage/ContentPage.page.json +7 -10
- package/mobile/src/components/ContentPage/ContentPage.tsx +24 -28
- package/mobile/src/components/ContentPage/mapSlot.ts +17 -0
- package/mobile/src/components/ContentPage/normalizeBlock.ts +26 -4
- package/mobile/src/components/ContentPage/normalizePage.ts +3 -20
- package/mobile/src/components/ContentPage/renderBlock.tsx +16 -18
- package/mobile/src/components/ContentPage/renderBlockList.tsx +39 -0
- package/mobile/src/components/ContentPage/renderSlots.tsx +33 -0
- package/mobile/src/model/BlockDecorator.ts +4 -4
- package/mobile/src/model/BlocksRegistry.ts +1 -1
- package/mobile/src/model/ContentPageDef.ts +1 -5
- package/mobile/src/model/JSXBlock.ts +3 -1
- package/mobile/src/model/getParentBlockDef.ts +6 -2
- package/package.json +1 -1
- package/src/components/Accordion/Accordion.fixture.mobile.tsx +16 -4
- package/src/components/Blocks.mobile.ts +2 -1
- package/src/components/Blocks.ts +2 -1
- package/src/components/ContentPage/ContentPage.page.json +7 -10
- package/src/components/ContentPage/ContentPage.tsx +24 -28
- package/src/components/ContentPage/mapSlot.ts +17 -0
- package/src/components/ContentPage/normalizeBlock.mobile.ts +26 -4
- package/src/components/ContentPage/normalizeBlock.ts +17 -4
- package/src/components/ContentPage/normalizePage.ts +3 -20
- package/src/components/ContentPage/renderBlock.tsx +16 -18
- package/src/components/ContentPage/renderBlockList.tsx +39 -0
- package/src/components/ContentPage/renderSlots.tsx +33 -0
- package/src/model/BlockDecorator.ts +4 -4
- package/src/model/BlocksRegistry.ts +1 -1
- package/src/model/ContentPageDef.ts +1 -5
- package/src/model/JSXBlock.ts +3 -1
- package/src/model/getParentBlockDef.ts +6 -2
- package/bundle/components/ContentPage/filterBlocks.d.ts +0 -12
- package/bundle/components/ContentPage/filterBlocks.mobile.d.ts +0 -12
- package/dist/components/ContentPage/filterBlocks.d.ts +0 -12
- package/dist/components/ContentPage/filterBlocks.js +0 -6
- package/dist/components/ContentPage/filterBlocks.js.map +0 -1
- package/dist/components/ContentPage/filterBlocks.mobile.d.ts +0 -12
- package/dist/components/ContentPage/filterBlocks.mobile.js +0 -8
- package/dist/components/ContentPage/filterBlocks.mobile.js.map +0 -1
- package/lib/components/ContentPage/filterBlocks.d.ts +0 -12
- package/lib/components/ContentPage/filterBlocks.js +0 -3
- package/lib/components/ContentPage/filterBlocks.js.map +0 -1
- package/lib/components/ContentPage/filterBlocks.mobile.d.ts +0 -12
- package/lib/components/ContentPage/filterBlocks.mobile.js +0 -5
- package/lib/components/ContentPage/filterBlocks.mobile.js.map +0 -1
- package/mobile/bundle/components/ContentPage/filterBlocks.d.ts +0 -3
- package/mobile/dist/components/ContentPage/filterBlocks.d.ts +0 -3
- package/mobile/dist/components/ContentPage/filterBlocks.js +0 -8
- package/mobile/dist/components/ContentPage/filterBlocks.js.map +0 -1
- package/mobile/lib/components/ContentPage/filterBlocks.d.ts +0 -3
- package/mobile/lib/components/ContentPage/filterBlocks.js +0 -5
- package/mobile/lib/components/ContentPage/filterBlocks.js.map +0 -1
- package/mobile/src/components/ContentPage/filterBlocks.ts +0 -11
- package/src/components/ContentPage/filterBlocks.mobile.ts +0 -11
- package/src/components/ContentPage/filterBlocks.ts +0 -6
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { SlotName } from '../../model/BlockDecorator';
|
|
2
|
+
import { BlockAncestors, DEFAULT_SLOT_NAME } from '../../model/BlockDecorator';
|
|
3
|
+
import type { BlockDef, Slot } from '../../model/ContentPageDef';
|
|
4
|
+
import type { VNode } from '../../model/VNode';
|
|
5
|
+
import { renderBlock, RenderBlockOptions } from './renderBlock';
|
|
6
|
+
|
|
7
|
+
interface RenderBlockListProps {
|
|
8
|
+
blocks?: BlockDef[];
|
|
9
|
+
parent: Slot;
|
|
10
|
+
slotName?: SlotName;
|
|
11
|
+
options: RenderBlockOptions;
|
|
12
|
+
ancestors?: BlockAncestors; // Recursion context
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const defaultChildRenderer = (_: VNode) => _;
|
|
16
|
+
|
|
17
|
+
export function renderBlocksList({
|
|
18
|
+
blocks = [],
|
|
19
|
+
parent,
|
|
20
|
+
slotName = DEFAULT_SLOT_NAME,
|
|
21
|
+
options,
|
|
22
|
+
ancestors = [],
|
|
23
|
+
}: RenderBlockListProps): Record<string, VNode> {
|
|
24
|
+
const { blocksRegistry = {} } = options;
|
|
25
|
+
const { type } = parent as BlockDef;
|
|
26
|
+
const BlockComponent = type && blocksRegistry[type];
|
|
27
|
+
const { renderChild = defaultChildRenderer } = BlockComponent || {};
|
|
28
|
+
|
|
29
|
+
return blocks.map((_: BlockDef, j: number) =>
|
|
30
|
+
renderChild(
|
|
31
|
+
renderBlock({
|
|
32
|
+
block: _,
|
|
33
|
+
options: { ...options, key: `${options.key ? options.key : _.type}-${j}` },
|
|
34
|
+
ancestors: [...ancestors, [parent, slotName]],
|
|
35
|
+
}),
|
|
36
|
+
j,
|
|
37
|
+
),
|
|
38
|
+
);
|
|
39
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { BlockAncestors } from '../../model/BlockDecorator';
|
|
2
|
+
import type { BlockDef, Slot } from '../../model/ContentPageDef';
|
|
3
|
+
import type { VNode } from '../../model/VNode';
|
|
4
|
+
import type { RenderBlockOptions } from './renderBlock';
|
|
5
|
+
import { renderBlocksList } from './renderBlockList';
|
|
6
|
+
|
|
7
|
+
interface RenderSlotsProps {
|
|
8
|
+
slots?: Record<string, BlockDef[]>;
|
|
9
|
+
parent: Slot;
|
|
10
|
+
options: RenderBlockOptions;
|
|
11
|
+
ancestors?: BlockAncestors;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function renderSlots({
|
|
15
|
+
slots = {},
|
|
16
|
+
parent,
|
|
17
|
+
options,
|
|
18
|
+
ancestors = [],
|
|
19
|
+
}: RenderSlotsProps): Record<string, VNode> {
|
|
20
|
+
return Object.entries(slots).reduce(
|
|
21
|
+
(res, [slotName, slotBlocks]) => ({
|
|
22
|
+
...res,
|
|
23
|
+
[slotName]: renderBlocksList({
|
|
24
|
+
blocks: slotBlocks,
|
|
25
|
+
parent,
|
|
26
|
+
slotName,
|
|
27
|
+
options,
|
|
28
|
+
ancestors,
|
|
29
|
+
}),
|
|
30
|
+
}),
|
|
31
|
+
{},
|
|
32
|
+
);
|
|
33
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type { BlockDef, Slot
|
|
1
|
+
import type { BlockDef, Slot } from './ContentPageDef';
|
|
2
2
|
|
|
3
3
|
export const DEFAULT_SLOT_NAME = null;
|
|
4
4
|
|
|
5
|
-
export type
|
|
6
|
-
|
|
7
|
-
export
|
|
5
|
+
export type SlotName = string | typeof DEFAULT_SLOT_NAME;
|
|
6
|
+
export type BlockAncestorItem = [Slot, SlotName];
|
|
7
|
+
export type BlockAncestors = BlockAncestorItem[];
|
|
8
8
|
|
|
9
9
|
interface BlockDecoratorProps<VNode> {
|
|
10
10
|
blockClassName: string;
|
|
@@ -22,10 +22,7 @@ export interface BlockDef extends BaseBlockDef {
|
|
|
22
22
|
export interface Slot {
|
|
23
23
|
style?: string[];
|
|
24
24
|
blocks?: BlockDef[];
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
export interface SlotsMap {
|
|
28
|
-
header?: Slot;
|
|
25
|
+
slots?: Record<string, BlockDef[]>;
|
|
29
26
|
}
|
|
30
27
|
|
|
31
28
|
export interface ContentPageMeta {
|
|
@@ -44,7 +41,6 @@ export interface ContentPageMeta {
|
|
|
44
41
|
|
|
45
42
|
export interface ContentPageDef extends ContentPageMeta, Slot {
|
|
46
43
|
_customPageType?: string;
|
|
47
|
-
slots?: SlotsMap;
|
|
48
44
|
fallback?: Record<string, unknown>;
|
|
49
45
|
likeControl?: boolean;
|
|
50
46
|
colorPalette?: ColorPalette;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { UNIComponent } from '@redneckz/uni-jsx';
|
|
2
2
|
import type { ContentPageContext } from '../components/ContentPage/ContentPageContext';
|
|
3
|
-
import type { BlockAncestors } from './BlockDecorator';
|
|
3
|
+
import type { BlockAncestors, SlotName } from './BlockDecorator';
|
|
4
4
|
import type { ContentPageDef } from './ContentPageDef';
|
|
5
5
|
import type { VNode } from './VNode';
|
|
6
6
|
|
|
@@ -11,6 +11,7 @@ export interface UniBlockProps {
|
|
|
11
11
|
ancestors?: BlockAncestors;
|
|
12
12
|
labels?: string[];
|
|
13
13
|
anchor?: string;
|
|
14
|
+
slots?: Record<string, VNode>;
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
export type JSXBlock<BlockProps = Record<string, any>> = UNIComponent<
|
|
@@ -19,5 +20,6 @@ export type JSXBlock<BlockProps = Record<string, any>> = UNIComponent<
|
|
|
19
20
|
VNode | VNode[]
|
|
20
21
|
> & {
|
|
21
22
|
childrenTypes?: string[];
|
|
23
|
+
slots?: (props: BlockProps) => SlotName[];
|
|
22
24
|
renderChild?: (child: VNode, i: number) => VNode;
|
|
23
25
|
};
|
|
@@ -2,7 +2,11 @@ import type { BlockAncestors } from './BlockDecorator';
|
|
|
2
2
|
import type { BlockDef } from './ContentPageDef';
|
|
3
3
|
|
|
4
4
|
export function getParentBlockDef(ancestors: BlockAncestors | undefined, type?: string): BlockDef {
|
|
5
|
-
const [
|
|
5
|
+
const [block] =
|
|
6
|
+
(ancestors || [])
|
|
7
|
+
.map((item) => item)
|
|
8
|
+
.reverse()
|
|
9
|
+
.find(([_]) => _ && 'type' in _ && (!type || type === (_ as BlockDef).type)) || [];
|
|
6
10
|
|
|
7
|
-
return
|
|
11
|
+
return block || {};
|
|
8
12
|
}
|
package/package.json
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { DEFAULT_SLOT_NAME } from '../../model/BlockDecorator';
|
|
2
|
+
import type { BlockDef, ContentPageDef } from '../../model/ContentPageDef';
|
|
2
3
|
import { context } from '../../react/setup-fixture';
|
|
3
4
|
import { AccordionItem } from '../AccordionItem/AccordionItem';
|
|
4
5
|
import { Headline } from '../Headline/Headline';
|
|
@@ -10,6 +11,8 @@ import { TEXT_BLOCK } from '../TextBlock/TextBlock.fixture';
|
|
|
10
11
|
import type { AccordionProps } from './Accordion';
|
|
11
12
|
import { Accordion } from './Accordion';
|
|
12
13
|
|
|
14
|
+
const page = {} as ContentPageDef;
|
|
15
|
+
|
|
13
16
|
const TEXT_BLOCK_ACCORDION_BLOCK = <TextBlock context={context} {...TEXT_BLOCK} />;
|
|
14
17
|
|
|
15
18
|
const HEADLINE_ACCORDION_BLOCK = <Headline context={context} {...HEADLINE} />;
|
|
@@ -30,7 +33,10 @@ const ACCORDION_BLOCK_DEF: BlockDef = {
|
|
|
30
33
|
export const ACCORDION_ITEM = (
|
|
31
34
|
<AccordionItem
|
|
32
35
|
context={context}
|
|
33
|
-
ancestors={[
|
|
36
|
+
ancestors={[
|
|
37
|
+
[page, DEFAULT_SLOT_NAME],
|
|
38
|
+
[ACCORDION_BLOCK_DEF, DEFAULT_SLOT_NAME],
|
|
39
|
+
]}
|
|
34
40
|
label="Accordion label 1"
|
|
35
41
|
labelIcon={{ icon: 'CardIcon' }}
|
|
36
42
|
>
|
|
@@ -45,14 +51,20 @@ export default {
|
|
|
45
51
|
{ACCORDION_ITEM}
|
|
46
52
|
<AccordionItem
|
|
47
53
|
context={context}
|
|
48
|
-
ancestors={[
|
|
54
|
+
ancestors={[
|
|
55
|
+
[page, DEFAULT_SLOT_NAME],
|
|
56
|
+
[ACCORDION_BLOCK_DEF, DEFAULT_SLOT_NAME],
|
|
57
|
+
]}
|
|
49
58
|
label="Accordion label 2"
|
|
50
59
|
>
|
|
51
60
|
{[HEADLINE_ACCORDION_BLOCK]}
|
|
52
61
|
</AccordionItem>
|
|
53
62
|
<AccordionItem
|
|
54
63
|
context={context}
|
|
55
|
-
ancestors={[
|
|
64
|
+
ancestors={[
|
|
65
|
+
[page, DEFAULT_SLOT_NAME],
|
|
66
|
+
[ACCORDION_BLOCK_DEF, DEFAULT_SLOT_NAME],
|
|
67
|
+
]}
|
|
56
68
|
label="Accordion label 3"
|
|
57
69
|
>
|
|
58
70
|
{[LINK_DOCS_ACCORDION_BLOCK]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { BlocksRegistry } from '../model/BlocksRegistry';
|
|
1
2
|
import { Accordion } from './Accordion/Accordion';
|
|
2
3
|
import { AccordionItem } from './AccordionItem/AccordionItem';
|
|
3
4
|
import { ComparisonTable } from './ComparisonTable/ComparisonTable';
|
|
@@ -15,7 +16,7 @@ import { StepsBlock } from './StepsBlock/StepsBlock';
|
|
|
15
16
|
import { TariffsTable } from './TariffsTable/TariffsTable';
|
|
16
17
|
import { TextBlock } from './TextBlock/TextBlock';
|
|
17
18
|
|
|
18
|
-
export const Blocks = {
|
|
19
|
+
export const Blocks: BlocksRegistry = {
|
|
19
20
|
Accordion,
|
|
20
21
|
AccordionItem,
|
|
21
22
|
ComparisonTable,
|
package/src/components/Blocks.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { BlocksRegistry } from '../model/BlocksRegistry';
|
|
1
2
|
import { Accordion } from './Accordion/Accordion';
|
|
2
3
|
import { AccordionItem } from './AccordionItem/AccordionItem';
|
|
3
4
|
import { BenefitsBlock } from './BenefitsBlock/BenefitsBlock';
|
|
@@ -38,7 +39,7 @@ import { TariffsTable } from './TariffsTable/TariffsTable';
|
|
|
38
39
|
import { TextBlock } from './TextBlock/TextBlock';
|
|
39
40
|
import { Tile } from './Tile/Tile';
|
|
40
41
|
|
|
41
|
-
export const Blocks = {
|
|
42
|
+
export const Blocks: BlocksRegistry = {
|
|
42
43
|
Accordion,
|
|
43
44
|
AccordionItem,
|
|
44
45
|
BenefitsBlock,
|
|
@@ -19,17 +19,14 @@
|
|
|
19
19
|
"style": ["bg-main-divider"],
|
|
20
20
|
"likeControl": true,
|
|
21
21
|
"slots": {
|
|
22
|
-
"header":
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
{
|
|
26
|
-
"
|
|
27
|
-
"content": {
|
|
28
|
-
"defaultLocation": "Москва"
|
|
29
|
-
}
|
|
22
|
+
"header": [
|
|
23
|
+
{
|
|
24
|
+
"type": "Header",
|
|
25
|
+
"content": {
|
|
26
|
+
"defaultLocation": "Москва"
|
|
30
27
|
}
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
}
|
|
29
|
+
]
|
|
33
30
|
},
|
|
34
31
|
"blocks": [
|
|
35
32
|
{
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { JSX } from '@redneckz/uni-jsx';
|
|
2
|
-
import type {
|
|
2
|
+
import type { BlockDecorator } from '../../model/BlockDecorator';
|
|
3
3
|
import type { BlocksRegistry } from '../../model/BlocksRegistry';
|
|
4
|
-
import type {
|
|
5
|
-
import type { UniBlockProps } from '../../model/JSXBlock';
|
|
4
|
+
import type { ContentPageDef } from '../../model/ContentPageDef';
|
|
5
|
+
import type { JSXBlock, UniBlockProps } from '../../model/JSXBlock';
|
|
6
6
|
import { style2className } from '../../utils/style2className';
|
|
7
7
|
import { LikeControl } from '../LikeControl/LikeControl';
|
|
8
8
|
import type { ContentPageContext } from './ContentPageContext';
|
|
9
|
-
import {
|
|
9
|
+
import { RenderBlockOptions } from './renderBlock';
|
|
10
|
+
import { renderBlocksList } from './renderBlockList';
|
|
11
|
+
import { renderSlots } from './renderSlots';
|
|
10
12
|
|
|
11
13
|
interface ContentPageProps extends UniBlockProps {
|
|
12
14
|
blocksRegistry: BlocksRegistry;
|
|
@@ -17,26 +19,34 @@ interface ContentPageProps extends UniBlockProps {
|
|
|
17
19
|
const defaultBlockDecorator: BlockDecorator = ({ blockClassName, block, render }) =>
|
|
18
20
|
render({ blockClassName, block });
|
|
19
21
|
|
|
20
|
-
export const ContentPage = JSX<ContentPageProps>((props) => {
|
|
21
|
-
const { className = '', context, data = {} } = props;
|
|
22
|
+
export const ContentPage: JSXBlock<ContentPageProps> = JSX<ContentPageProps>((props) => {
|
|
23
|
+
const { className = '', blocksRegistry, blockDecorator, context, data = {} } = props;
|
|
22
24
|
|
|
23
25
|
const { style: pageStyle, blocks, slots, likeControl, colorPalette = 'pc' } = data;
|
|
24
26
|
|
|
25
|
-
const
|
|
27
|
+
const options: RenderBlockOptions = {
|
|
28
|
+
key: '',
|
|
29
|
+
blocksRegistry,
|
|
30
|
+
page: data,
|
|
31
|
+
blockDecorator: blockDecorator || defaultBlockDecorator,
|
|
32
|
+
context,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const pageSlots = renderSlots({ slots, parent: data, options });
|
|
26
36
|
|
|
27
37
|
return (
|
|
28
38
|
<section
|
|
29
39
|
className={`relative ${style2className(pageStyle)} ${className}`}
|
|
30
40
|
data-theme={colorPalette}
|
|
31
41
|
>
|
|
32
|
-
{
|
|
33
|
-
<div className={
|
|
34
|
-
{blocksListRenderer(slots.header.blocks, ['header'])}
|
|
35
|
-
</div>
|
|
42
|
+
{pageSlots?.header ? (
|
|
43
|
+
<div className="mb-5 shadow-[0_8px_32px_0px_#00000014]">{pageSlots.header}</div>
|
|
36
44
|
) : null}
|
|
37
45
|
|
|
38
46
|
{blocks?.length ? (
|
|
39
|
-
<div className="container grid grid-cols-12 gap-1">
|
|
47
|
+
<div className="container grid grid-cols-12 gap-1">
|
|
48
|
+
{renderBlocksList({ blocks, parent: data, options })}
|
|
49
|
+
</div>
|
|
40
50
|
) : null}
|
|
41
51
|
|
|
42
52
|
{likeControl ? renderLikeControl(context) : null}
|
|
@@ -44,22 +54,8 @@ export const ContentPage = JSX<ContentPageProps>((props) => {
|
|
|
44
54
|
);
|
|
45
55
|
});
|
|
46
56
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
blocks.map((block, i) =>
|
|
50
|
-
renderBlock(
|
|
51
|
-
block,
|
|
52
|
-
{
|
|
53
|
-
key: `${block.type || '#'}-${i}`,
|
|
54
|
-
blocksRegistry,
|
|
55
|
-
page: data || {},
|
|
56
|
-
blockDecorator: blockDecorator || defaultBlockDecorator,
|
|
57
|
-
context,
|
|
58
|
-
},
|
|
59
|
-
ancestors,
|
|
60
|
-
),
|
|
61
|
-
);
|
|
62
|
-
}
|
|
57
|
+
ContentPage.childrenTypes = [];
|
|
58
|
+
ContentPage.slots = () => ['header'];
|
|
63
59
|
|
|
64
60
|
function renderLikeControl(context: ContentPageContext) {
|
|
65
61
|
return (
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { BlockDef, Slot } from '../../model/ContentPageDef';
|
|
2
|
+
|
|
3
|
+
export const mapSlot =
|
|
4
|
+
(mapper: (blocks?: BlockDef[]) => BlockDef[]) =>
|
|
5
|
+
<S extends Slot>(slot: S): S => ({
|
|
6
|
+
...slot,
|
|
7
|
+
blocks: mapper(slot.blocks),
|
|
8
|
+
slots: slot.slots
|
|
9
|
+
? Object.entries(slot.slots).reduce(
|
|
10
|
+
(res, [slotKey, slotBlocks]) => ({
|
|
11
|
+
...res,
|
|
12
|
+
[slotKey]: mapper(slotBlocks),
|
|
13
|
+
}),
|
|
14
|
+
{},
|
|
15
|
+
)
|
|
16
|
+
: {},
|
|
17
|
+
});
|
|
@@ -1,7 +1,29 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { BlocksRegistry } from '../../model/BlocksRegistry';
|
|
2
|
+
import type { BlockDef, Slot } from '../../model/ContentPageDef';
|
|
3
|
+
import { mapSlot } from './mapSlot';
|
|
2
4
|
|
|
3
|
-
export function normalizeBlock(block
|
|
4
|
-
const { mobile, ...rest } = block;
|
|
5
|
+
export function normalizeBlock<S extends Slot>(block?: S, blocksRegistry?: BlocksRegistry): S {
|
|
6
|
+
const { mobile, ...rest } = (block || {}) as BlockDef;
|
|
5
7
|
|
|
6
|
-
|
|
8
|
+
const normalizedBlock = mobile
|
|
9
|
+
? { ...rest, ...mobile, content: { ...rest.content, ...mobile.content } }
|
|
10
|
+
: block;
|
|
11
|
+
|
|
12
|
+
return {
|
|
13
|
+
...mapSlot((blocks) => filterBlocks(blocks, blocksRegistry))(normalizedBlock || {}),
|
|
14
|
+
} as S;
|
|
7
15
|
}
|
|
16
|
+
|
|
17
|
+
const filterBlocks = (blocks?: BlockDef[], blocksRegistry?: BlocksRegistry) =>
|
|
18
|
+
blocks
|
|
19
|
+
? blocks
|
|
20
|
+
?.filter(
|
|
21
|
+
(block) =>
|
|
22
|
+
blocksRegistry &&
|
|
23
|
+
(block?.type || block?.mobile?.type || '') in blocksRegistry &&
|
|
24
|
+
!block.mobile?.hidden,
|
|
25
|
+
)
|
|
26
|
+
.map((block) => ({
|
|
27
|
+
...normalizeBlock(block, blocksRegistry),
|
|
28
|
+
}))
|
|
29
|
+
: [];
|
|
@@ -1,8 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { BlocksRegistry } from '../../model/BlocksRegistry';
|
|
2
|
+
import type { BlockDef, Slot } from '../../model/ContentPageDef';
|
|
3
|
+
import { mapSlot } from './mapSlot';
|
|
2
4
|
|
|
3
|
-
export function normalizeBlock(block
|
|
5
|
+
export function normalizeBlock<S extends Slot>(block?: S, blocksRegistry?: BlocksRegistry): S {
|
|
4
6
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
5
|
-
const { mobile, ...rest } = block;
|
|
7
|
+
const { mobile, ...rest } = (block || {}) as BlockDef;
|
|
6
8
|
|
|
7
|
-
return
|
|
9
|
+
return {
|
|
10
|
+
...mapSlot((blocks) => filterBlocks(blocks, blocksRegistry))({ ...rest }),
|
|
11
|
+
} as S;
|
|
8
12
|
}
|
|
13
|
+
|
|
14
|
+
const filterBlocks = (blocks?: BlockDef[], blocksRegistry?: BlocksRegistry) =>
|
|
15
|
+
blocks
|
|
16
|
+
? blocks
|
|
17
|
+
.filter((block) => blocksRegistry && (block?.type || '') in blocksRegistry)
|
|
18
|
+
.map((block) => ({
|
|
19
|
+
...normalizeBlock(block, blocksRegistry),
|
|
20
|
+
}))
|
|
21
|
+
: [];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { BlocksRegistry } from '../../model/BlocksRegistry';
|
|
2
|
-
import type { ContentPageDef
|
|
3
|
-
import {
|
|
2
|
+
import type { ContentPageDef } from '../../model/ContentPageDef';
|
|
3
|
+
import { normalizeBlock } from './normalizeBlock';
|
|
4
4
|
|
|
5
5
|
export const normalizePage =
|
|
6
6
|
(blocksRegistry: BlocksRegistry) =>
|
|
@@ -9,22 +9,5 @@ export const normalizePage =
|
|
|
9
9
|
return undefined;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
return {
|
|
15
|
-
...contentPage,
|
|
16
|
-
blocks: filterBlocks(blocks, blocksRegistry),
|
|
17
|
-
slots:
|
|
18
|
-
slots &&
|
|
19
|
-
Object.keys(slots).reduce(
|
|
20
|
-
(res, key) => ({
|
|
21
|
-
...res,
|
|
22
|
-
[key]: {
|
|
23
|
-
...slots[key],
|
|
24
|
-
blocks: filterBlocks((slots[key] as Slot).blocks || [], blocksRegistry),
|
|
25
|
-
},
|
|
26
|
-
}),
|
|
27
|
-
{},
|
|
28
|
-
),
|
|
29
|
-
};
|
|
12
|
+
return normalizeBlock(contentPage, blocksRegistry);
|
|
30
13
|
};
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { BlockAncestors, BlockDecorator
|
|
1
|
+
import { BlockAncestors, BlockDecorator } from '../../model/BlockDecorator';
|
|
2
2
|
import type { BlocksRegistry } from '../../model/BlocksRegistry';
|
|
3
3
|
import type { BlockDef, ContentPageDef } from '../../model/ContentPageDef';
|
|
4
|
-
import type { VNode } from '../../model/VNode';
|
|
5
4
|
import { style2className } from '../../utils/style2className';
|
|
6
5
|
import type { ContentPageContext } from './ContentPageContext';
|
|
6
|
+
import { renderBlocksList } from './renderBlockList';
|
|
7
|
+
import { renderSlots } from './renderSlots';
|
|
7
8
|
|
|
8
|
-
interface RenderBlockOptions {
|
|
9
|
+
export interface RenderBlockOptions {
|
|
9
10
|
key: string;
|
|
10
11
|
page: ContentPageDef;
|
|
11
12
|
blockDecorator: BlockDecorator;
|
|
@@ -13,15 +14,15 @@ interface RenderBlockOptions {
|
|
|
13
14
|
context: ContentPageContext;
|
|
14
15
|
}
|
|
15
16
|
|
|
16
|
-
|
|
17
|
+
export interface RenderBlockProps {
|
|
18
|
+
block?: BlockDef;
|
|
19
|
+
options: RenderBlockOptions;
|
|
20
|
+
ancestors?: BlockAncestors; // Recursion context
|
|
21
|
+
}
|
|
17
22
|
|
|
18
|
-
export function renderBlock(
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
ancestors: BlockAncestors = DEFAULT_ANCESTORS, // Recursion context
|
|
22
|
-
) {
|
|
23
|
-
const { key, page, blockDecorator, blocksRegistry, context } = options;
|
|
24
|
-
const { type, blocks: childBlocks } = block;
|
|
23
|
+
export function renderBlock({ block = {}, options, ancestors = [] }: RenderBlockProps) {
|
|
24
|
+
const { key, page, blockDecorator, blocksRegistry = {}, context } = options;
|
|
25
|
+
const { type, slots, blocks: childBlocks } = block;
|
|
25
26
|
|
|
26
27
|
if (!(type && type in blocksRegistry)) {
|
|
27
28
|
console.warn(`No block with "${type}" is registered`);
|
|
@@ -29,13 +30,9 @@ export function renderBlock(
|
|
|
29
30
|
|
|
30
31
|
const BlockComponent = type && blocksRegistry[type];
|
|
31
32
|
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
renderBlock(_, { ...options, key: `${options.key}-${j}` }, [...ancestors, block]),
|
|
36
|
-
j,
|
|
37
|
-
);
|
|
38
|
-
const children = childBlocks?.length ? childBlocks.map(renderChildBlock) : null;
|
|
33
|
+
const subBlockRenderProps = { parent: block, options, ancestors };
|
|
34
|
+
const children = renderBlocksList({ ...subBlockRenderProps, blocks: childBlocks });
|
|
35
|
+
const blockSlots = slots ? renderSlots({ ...subBlockRenderProps, slots }) : {};
|
|
39
36
|
|
|
40
37
|
return blockDecorator(
|
|
41
38
|
{
|
|
@@ -56,6 +53,7 @@ export function renderBlock(
|
|
|
56
53
|
version={version}
|
|
57
54
|
anchor={anchor}
|
|
58
55
|
labels={labels}
|
|
56
|
+
slots={blockSlots}
|
|
59
57
|
{...content}
|
|
60
58
|
>
|
|
61
59
|
{children}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { SlotName } from '../../model/BlockDecorator';
|
|
2
|
+
import { BlockAncestors, DEFAULT_SLOT_NAME } from '../../model/BlockDecorator';
|
|
3
|
+
import type { BlockDef, Slot } from '../../model/ContentPageDef';
|
|
4
|
+
import type { VNode } from '../../model/VNode';
|
|
5
|
+
import { renderBlock, RenderBlockOptions } from './renderBlock';
|
|
6
|
+
|
|
7
|
+
interface RenderBlockListProps {
|
|
8
|
+
blocks?: BlockDef[];
|
|
9
|
+
parent: Slot;
|
|
10
|
+
slotName?: SlotName;
|
|
11
|
+
options: RenderBlockOptions;
|
|
12
|
+
ancestors?: BlockAncestors; // Recursion context
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const defaultChildRenderer = (_: VNode) => _;
|
|
16
|
+
|
|
17
|
+
export function renderBlocksList({
|
|
18
|
+
blocks = [],
|
|
19
|
+
parent,
|
|
20
|
+
slotName = DEFAULT_SLOT_NAME,
|
|
21
|
+
options,
|
|
22
|
+
ancestors = [],
|
|
23
|
+
}: RenderBlockListProps): Record<string, VNode> {
|
|
24
|
+
const { blocksRegistry = {} } = options;
|
|
25
|
+
const { type } = parent as BlockDef;
|
|
26
|
+
const BlockComponent = type && blocksRegistry[type];
|
|
27
|
+
const { renderChild = defaultChildRenderer } = BlockComponent || {};
|
|
28
|
+
|
|
29
|
+
return blocks.map((_: BlockDef, j: number) =>
|
|
30
|
+
renderChild(
|
|
31
|
+
renderBlock({
|
|
32
|
+
block: _,
|
|
33
|
+
options: { ...options, key: `${options.key ? options.key : _.type}-${j}` },
|
|
34
|
+
ancestors: [...ancestors, [parent, slotName]],
|
|
35
|
+
}),
|
|
36
|
+
j,
|
|
37
|
+
),
|
|
38
|
+
);
|
|
39
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { BlockAncestors } from '../../model/BlockDecorator';
|
|
2
|
+
import type { BlockDef, Slot } from '../../model/ContentPageDef';
|
|
3
|
+
import type { VNode } from '../../model/VNode';
|
|
4
|
+
import type { RenderBlockOptions } from './renderBlock';
|
|
5
|
+
import { renderBlocksList } from './renderBlockList';
|
|
6
|
+
|
|
7
|
+
interface RenderSlotsProps {
|
|
8
|
+
slots?: Record<string, BlockDef[]>;
|
|
9
|
+
parent: Slot;
|
|
10
|
+
options: RenderBlockOptions;
|
|
11
|
+
ancestors?: BlockAncestors;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function renderSlots({
|
|
15
|
+
slots = {},
|
|
16
|
+
parent,
|
|
17
|
+
options,
|
|
18
|
+
ancestors = [],
|
|
19
|
+
}: RenderSlotsProps): Record<string, VNode> {
|
|
20
|
+
return Object.entries(slots).reduce(
|
|
21
|
+
(res, [slotName, slotBlocks]) => ({
|
|
22
|
+
...res,
|
|
23
|
+
[slotName]: renderBlocksList({
|
|
24
|
+
blocks: slotBlocks,
|
|
25
|
+
parent,
|
|
26
|
+
slotName,
|
|
27
|
+
options,
|
|
28
|
+
ancestors,
|
|
29
|
+
}),
|
|
30
|
+
}),
|
|
31
|
+
{},
|
|
32
|
+
);
|
|
33
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type { BlockDef, Slot
|
|
1
|
+
import type { BlockDef, Slot } from './ContentPageDef';
|
|
2
2
|
|
|
3
3
|
export const DEFAULT_SLOT_NAME = null;
|
|
4
4
|
|
|
5
|
-
export type
|
|
6
|
-
|
|
7
|
-
export
|
|
5
|
+
export type SlotName = string | typeof DEFAULT_SLOT_NAME;
|
|
6
|
+
export type BlockAncestorItem = [Slot, SlotName];
|
|
7
|
+
export type BlockAncestors = BlockAncestorItem[];
|
|
8
8
|
|
|
9
9
|
interface BlockDecoratorProps<VNode> {
|
|
10
10
|
blockClassName: string;
|
|
@@ -22,10 +22,7 @@ export interface BlockDef extends BaseBlockDef {
|
|
|
22
22
|
export interface Slot {
|
|
23
23
|
style?: string[];
|
|
24
24
|
blocks?: BlockDef[];
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
export interface SlotsMap {
|
|
28
|
-
header?: Slot;
|
|
25
|
+
slots?: Record<string, BlockDef[]>;
|
|
29
26
|
}
|
|
30
27
|
|
|
31
28
|
export interface ContentPageMeta {
|
|
@@ -44,7 +41,6 @@ export interface ContentPageMeta {
|
|
|
44
41
|
|
|
45
42
|
export interface ContentPageDef extends ContentPageMeta, Slot {
|
|
46
43
|
_customPageType?: string;
|
|
47
|
-
slots?: SlotsMap;
|
|
48
44
|
fallback?: Record<string, unknown>;
|
|
49
45
|
likeControl?: boolean;
|
|
50
46
|
colorPalette?: ColorPalette;
|