@developer_tribe/react-builder 1.0.2 → 1.0.4
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/dist/AttributesEditor.d.ts +3 -1
- package/dist/RenderPage.d.ts +2 -1
- package/dist/android.svg +43 -0
- package/dist/apple.svg +16 -0
- package/dist/attributes-editor/Field.d.ts +4 -2
- package/dist/attributes-editor/SizeField.d.ts +9 -0
- package/dist/attributes-editor/SpecialCategorySection.d.ts +2 -1
- package/dist/build-components/BackgroundImage/BackgroundImage.d.ts +5 -0
- package/dist/build-components/BackgroundImage/BackgroundImageProps.generated.d.ts +45 -0
- package/dist/build-components/Button/ButtonProps.generated.d.ts +8 -0
- package/dist/build-components/Carousel/CarouselProps.generated.d.ts +8 -0
- package/dist/build-components/CarouselButtons/CarouselButtonsProps.generated.d.ts +8 -0
- package/dist/build-components/CarouselDots/CarouselDotsProps.generated.d.ts +8 -0
- package/dist/build-components/CarouselItem/CarouselItemProps.generated.d.ts +8 -0
- package/dist/build-components/CarouselProvider/CarouselProviderProps.generated.d.ts +8 -0
- package/dist/build-components/Image/ImageProps.generated.d.ts +8 -0
- package/dist/build-components/Onboard/OnboardProps.generated.d.ts +8 -0
- package/dist/build-components/OnboardButton/OnboardButtonProps.generated.d.ts +8 -1
- package/dist/build-components/OnboardButtons/OnboardButtonsProps.generated.d.ts +8 -0
- package/dist/build-components/OnboardDot/OnboardDotProps.generated.d.ts +9 -3
- package/dist/build-components/OnboardFooter/OnboardFooterProps.generated.d.ts +8 -0
- package/dist/build-components/OnboardImage/OnboardImageProps.generated.d.ts +9 -1
- package/dist/build-components/OnboardItem/OnboardItemProps.generated.d.ts +8 -0
- package/dist/build-components/OnboardProvider/OnboardProviderProps.generated.d.ts +8 -1
- package/dist/build-components/OnboardSubtitle/OnboardSubtitleProps.generated.d.ts +8 -0
- package/dist/build-components/OnboardTitle/OnboardTitleProps.generated.d.ts +8 -0
- package/dist/build-components/Text/TextProps.generated.d.ts +8 -0
- package/dist/build-components/View/ViewProps.generated.d.ts +8 -0
- package/dist/build-components/index.d.ts +2 -1
- package/dist/build-components/patterns.generated.d.ts +1612 -46
- package/dist/components/AttributesEditorPanel.d.ts +3 -4
- package/dist/components/Builder.d.ts +2 -1
- package/dist/components/BuilderButton.d.ts +9 -0
- package/dist/components/JsonTextEditor.d.ts +9 -0
- package/dist/index.cjs.js +5 -5
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.esm.js +5 -5
- package/dist/index.esm.js.map +1 -1
- package/dist/modals/ColorModal.d.ts +3 -1
- package/dist/pages/ProjectPage.d.ts +3 -3
- package/dist/pages/tabs/BuilderPanel.d.ts +8 -0
- package/dist/pages/tabs/SideTool.d.ts +8 -0
- package/dist/store.d.ts +9 -1
- package/dist/styles.css +1 -1
- package/dist/types/Project.d.ts +11 -0
- package/dist/utils/analyseNode.d.ts +1 -0
- package/dist/utils/extractImageStyle.d.ts +2 -1
- package/dist/utils/extractTextStyle.d.ts +8 -1
- package/dist/utils/extractViewStyle.d.ts +7 -1
- package/dist/utils/parseColor.d.ts +7 -0
- package/dist/utils/selection.d.ts +7 -0
- package/dist/utils/useMergedStyle.d.ts +2 -0
- package/package.json +2 -5
- package/src/.DS_Store +0 -0
- package/src/AttributesEditor.tsx +83 -16
- package/src/RenderPage.tsx +86 -4
- package/src/attributes-editor/Field.tsx +60 -165
- package/src/attributes-editor/SizeField.tsx +184 -0
- package/src/attributes-editor/SpecialCategorySection.tsx +12 -4
- package/src/build-components/BackgroundImage/BackgroundImage.tsx +77 -0
- package/src/build-components/BackgroundImage/BackgroundImageProps.generated.ts +61 -0
- package/src/build-components/BackgroundImage/pattern.json +45 -0
- package/src/build-components/Button/Button.tsx +29 -4
- package/src/build-components/Button/ButtonProps.generated.ts +8 -0
- package/src/build-components/Carousel/Carousel.tsx +25 -3
- package/src/build-components/Carousel/CarouselProps.generated.ts +8 -0
- package/src/build-components/CarouselButtons/CarouselButtons.tsx +19 -4
- package/src/build-components/CarouselButtons/CarouselButtonsProps.generated.ts +8 -0
- package/src/build-components/CarouselDots/CarouselDots.tsx +13 -4
- package/src/build-components/CarouselDots/CarouselDotsProps.generated.ts +8 -0
- package/src/build-components/CarouselItem/CarouselItem.tsx +20 -4
- package/src/build-components/CarouselItem/CarouselItemProps.generated.ts +8 -0
- package/src/build-components/CarouselProvider/CarouselProvider.tsx +14 -3
- package/src/build-components/CarouselProvider/CarouselProviderProps.generated.ts +8 -0
- package/src/build-components/Image/Image.tsx +27 -9
- package/src/build-components/Image/ImageProps.generated.ts +8 -0
- package/src/build-components/Image/pattern.json +1 -9
- package/src/build-components/Onboard/Onboard.tsx +2 -2
- package/src/build-components/Onboard/OnboardProps.generated.ts +8 -0
- package/src/build-components/OnboardButton/OnboardButton.tsx +11 -7
- package/src/build-components/OnboardButton/OnboardButtonProps.generated.ts +8 -1
- package/src/build-components/OnboardButtons/OnboardButtons.tsx +17 -5
- package/src/build-components/OnboardButtons/OnboardButtonsProps.generated.ts +8 -0
- package/src/build-components/OnboardDot/OnboardDot.tsx +68 -39
- package/src/build-components/OnboardDot/OnboardDotProps.generated.ts +9 -3
- package/src/build-components/OnboardDot/pattern.json +3 -19
- package/src/build-components/OnboardFooter/OnboardFooter.tsx +37 -14
- package/src/build-components/OnboardFooter/OnboardFooterProps.generated.ts +8 -0
- package/src/build-components/OnboardImage/OnboardImage.tsx +28 -6
- package/src/build-components/OnboardImage/OnboardImageProps.generated.ts +9 -1
- package/src/build-components/OnboardItem/OnboardItem.tsx +15 -14
- package/src/build-components/OnboardItem/OnboardItemProps.generated.ts +8 -0
- package/src/build-components/OnboardProvider/OnboardProvider.tsx +35 -20
- package/src/build-components/OnboardProvider/OnboardProviderProps.generated.ts +8 -1
- package/src/build-components/OnboardProvider/pattern.json +0 -8
- package/src/build-components/OnboardSubtitle/OnboardSubtitleProps.generated.ts +8 -0
- package/src/build-components/OnboardSubtitle/pattern.json +1 -1
- package/src/build-components/OnboardTitle/OnboardTitleProps.generated.ts +8 -0
- package/src/build-components/OnboardTitle/pattern.json +1 -1
- package/src/build-components/RenderNode.generated.tsx +3 -0
- package/src/build-components/Text/Text.tsx +28 -10
- package/src/build-components/Text/TextProps.generated.ts +8 -0
- package/src/build-components/View/View.tsx +25 -3
- package/src/build-components/View/ViewProps.generated.ts +8 -0
- package/src/build-components/View/pattern.json +67 -1
- package/src/build-components/index.ts +5 -0
- package/src/build-components/patterns.generated.ts +1620 -46
- package/src/components/AttributesEditorPanel.tsx +13 -6
- package/src/components/Builder.tsx +200 -56
- package/src/components/BuilderButton.tsx +127 -0
- package/src/components/DeviceNavigationBar.tsx +0 -1
- package/src/components/EditorHeader.tsx +11 -1
- package/src/components/JsonTextEditor.tsx +185 -0
- package/src/index.ts +2 -2
- package/src/mockOS/components/MockOSRouter.tsx +17 -3
- package/src/mockOS/context/MockOSContext.tsx +0 -5
- package/src/mockOS/managers/mockPermissionManager.ts +0 -4
- package/src/mockOS/managers/navigationManager.ts +1 -6
- package/src/modals/ColorModal.tsx +306 -71
- package/src/modals/LocalicationModal.tsx +4 -5
- package/src/modals/Modal.tsx +8 -1
- package/src/pages/ProjectPage.tsx +299 -55
- package/src/pages/tabs/{BuilderTab.tsx → BuilderPanel.tsx} +13 -9
- package/src/pages/tabs/SideTool.tsx +260 -0
- package/src/size-matters/index.ts +6 -0
- package/src/store.ts +18 -1
- package/src/styles/base/_global.scss +163 -7
- package/src/styles/components/_attributes-editor.scss +12 -0
- package/src/styles/components/_editor-shell.scss +25 -0
- package/src/styles/foundation/_sizes.scss +1 -1
- package/src/styles/layout/_builder.scss +66 -10
- package/src/styles/modals/_color-modal.scss +59 -1
- package/src/styles/utilities/_carousel.scss +9 -8
- package/src/types/Project.ts +14 -0
- package/src/utils/analyseNode.ts +98 -0
- package/src/utils/extractImageStyle.ts +3 -6
- package/src/utils/extractTextStyle.ts +19 -82
- package/src/utils/extractViewStyle.ts +41 -12
- package/src/utils/parseColor.ts +43 -0
- package/src/utils/selection.ts +24 -0
- package/src/utils/useMergedStyle.ts +16 -0
- package/dist/pages/tabs/BuilderTab.d.ts +0 -9
- package/dist/pages/tabs/DebugTab.d.ts +0 -7
- package/dist/pages/tabs/PreviewTab.d.ts +0 -3
- package/src/pages/tabs/DebugTab.tsx +0 -64
- package/src/pages/tabs/PreviewTab.tsx +0 -206
|
@@ -2,6 +2,7 @@ import React, {
|
|
|
2
2
|
createContext,
|
|
3
3
|
useContext,
|
|
4
4
|
useEffect,
|
|
5
|
+
useId,
|
|
5
6
|
useMemo,
|
|
6
7
|
useState,
|
|
7
8
|
} from 'react';
|
|
@@ -19,26 +20,44 @@ export const onboardContext = createContext<any>(undefined);
|
|
|
19
20
|
function OnboardProvider({ node }: OnboardProviderComponentProps) {
|
|
20
21
|
useLogRender('OnboardProvider');
|
|
21
22
|
node = useNode(node);
|
|
22
|
-
const
|
|
23
|
+
const generatedId = useId();
|
|
24
|
+
const attributeName =
|
|
23
25
|
(node as any)?.sourceType ?? node.type ?? 'OnboardProvider';
|
|
24
|
-
const
|
|
26
|
+
const { appConfig, projectColors } = useRenderStore((s) => ({
|
|
27
|
+
appConfig: s.appConfig,
|
|
28
|
+
projectColors: s.projectColors,
|
|
29
|
+
}));
|
|
25
30
|
const [emblaRef, emblaApi] = useEmblaCarousel(node.attributes as any);
|
|
26
31
|
const [selectedIndex, setSelectedIndex] = useState(0);
|
|
32
|
+
const attributeKey = node.key ?? generatedId;
|
|
27
33
|
|
|
28
34
|
const children = useMemo(() => {
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
35
|
+
const allChildren = (node.children as NodeData[]) ?? [];
|
|
36
|
+
|
|
37
|
+
// Find the main Onboard child, if any
|
|
38
|
+
const onboardChild = allChildren.find((c) => c.type === 'Onboard');
|
|
39
|
+
if (!onboardChild || onboardChild.type !== 'Onboard') {
|
|
40
|
+
// Fallback: no onboard structure, just render original children
|
|
41
|
+
return allChildren;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const onboardItems = (onboardChild.children as NodeData[]) ?? [];
|
|
45
|
+
if (!onboardItems.length) {
|
|
46
|
+
return allChildren;
|
|
34
47
|
}
|
|
35
|
-
const onboardItems = onboardChild.children as NodeData[];
|
|
36
48
|
|
|
49
|
+
// Clamp selected index to available items
|
|
50
|
+
const clampedIndex = Math.min(
|
|
51
|
+
Math.max(selectedIndex, 0),
|
|
52
|
+
onboardItems.length - 1,
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
const selectedItem = onboardItems[clampedIndex];
|
|
37
56
|
const onboardButtons = (
|
|
38
|
-
|
|
39
|
-
).filter((s) => (s as NodeData)?.type
|
|
40
|
-
|
|
41
|
-
return [...
|
|
57
|
+
(selectedItem?.children as NodeData[]) ?? []
|
|
58
|
+
).filter((s) => (s as NodeData)?.type === 'OnboardButtons');
|
|
59
|
+
|
|
60
|
+
return [...allChildren, ...onboardButtons];
|
|
42
61
|
}, [selectedIndex, node.children]);
|
|
43
62
|
|
|
44
63
|
useEffect(() => {
|
|
@@ -59,24 +78,20 @@ function OnboardProvider({ node }: OnboardProviderComponentProps) {
|
|
|
59
78
|
const viewStyle = useMemo(() => {
|
|
60
79
|
const style = extractViewStyle(
|
|
61
80
|
node as NodeData<ViewPropsGenerated['attributes']>,
|
|
81
|
+
{ appConfig, projectColors },
|
|
62
82
|
);
|
|
63
83
|
//NOTE: Embla için istisna
|
|
64
84
|
style.display = 'block';
|
|
65
85
|
return style;
|
|
66
|
-
}, [node]);
|
|
86
|
+
}, [node, appConfig, projectColors]);
|
|
67
87
|
|
|
68
88
|
return (
|
|
69
89
|
<onboardContext.Provider value={{ emblaApi, selectedIndex }}>
|
|
70
90
|
<div
|
|
91
|
+
attribute-name={attributeName}
|
|
71
92
|
attribute-key={attributeKey}
|
|
72
93
|
className="carousel-provider"
|
|
73
|
-
style={
|
|
74
|
-
...viewStyle,
|
|
75
|
-
paddingTop: node.attributes?.paddingTop,
|
|
76
|
-
paddingRight: node.attributes?.paddingRight,
|
|
77
|
-
paddingBottom: node.attributes?.paddingBottom,
|
|
78
|
-
paddingLeft: node.attributes?.paddingLeft,
|
|
79
|
-
}}
|
|
94
|
+
style={viewStyle}
|
|
80
95
|
>
|
|
81
96
|
<div className="embla">
|
|
82
97
|
<div className="embla__viewport" ref={emblaRef}>
|
|
@@ -16,6 +16,7 @@ export type JustifyContentOptionType =
|
|
|
16
16
|
| 'space-between'
|
|
17
17
|
| 'space-around'
|
|
18
18
|
| 'space-evenly';
|
|
19
|
+
export type PositionOptionType = 'relative' | 'absolute';
|
|
19
20
|
|
|
20
21
|
export interface OnboardProviderPropsGenerated {
|
|
21
22
|
child: string;
|
|
@@ -42,7 +43,13 @@ export interface OnboardProviderPropsGenerated {
|
|
|
42
43
|
borderRadius?: never;
|
|
43
44
|
width?: string;
|
|
44
45
|
height?: string;
|
|
45
|
-
|
|
46
|
+
flex?: number;
|
|
47
|
+
position?: PositionOptionType;
|
|
48
|
+
top?: string;
|
|
49
|
+
bottom?: string;
|
|
50
|
+
left?: string;
|
|
51
|
+
right?: string;
|
|
52
|
+
zIndex?: number;
|
|
46
53
|
use_safe_area_inset?: boolean;
|
|
47
54
|
};
|
|
48
55
|
}
|
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
"children": "node",
|
|
7
7
|
"extends": "View",
|
|
8
8
|
"attributes": {
|
|
9
|
-
"theme": "string",
|
|
10
9
|
"use_safe_area_inset": "boolean",
|
|
11
10
|
"borderRadius": "never"
|
|
12
11
|
}
|
|
@@ -22,13 +21,6 @@
|
|
|
22
21
|
"label": "Onboard Provider",
|
|
23
22
|
"description": "Provides shared settings for onboarding.",
|
|
24
23
|
"attributes": {
|
|
25
|
-
"theme": {
|
|
26
|
-
"label": "Theme",
|
|
27
|
-
"description": "Theme key for onboarding screens.",
|
|
28
|
-
"category": "other",
|
|
29
|
-
"specialCategory": null,
|
|
30
|
-
"sort": 1
|
|
31
|
-
},
|
|
32
24
|
"use_safe_area_inset": {
|
|
33
25
|
"label": "Use Safe Area Inset",
|
|
34
26
|
"description": "Adds safe area padding.",
|
|
@@ -29,6 +29,7 @@ export type JustifyContentOptionType =
|
|
|
29
29
|
| 'space-between'
|
|
30
30
|
| 'space-around'
|
|
31
31
|
| 'space-evenly';
|
|
32
|
+
export type PositionOptionType = 'relative' | 'absolute';
|
|
32
33
|
|
|
33
34
|
export interface OnboardSubtitlePropsGenerated {
|
|
34
35
|
child: string;
|
|
@@ -59,6 +60,13 @@ export interface OnboardSubtitlePropsGenerated {
|
|
|
59
60
|
borderRadius?: string;
|
|
60
61
|
width?: string;
|
|
61
62
|
height?: string;
|
|
63
|
+
flex?: number;
|
|
64
|
+
position?: PositionOptionType;
|
|
65
|
+
top?: string;
|
|
66
|
+
bottom?: string;
|
|
67
|
+
left?: string;
|
|
68
|
+
right?: string;
|
|
69
|
+
zIndex?: number;
|
|
62
70
|
};
|
|
63
71
|
}
|
|
64
72
|
|
|
@@ -29,6 +29,7 @@ export type JustifyContentOptionType =
|
|
|
29
29
|
| 'space-between'
|
|
30
30
|
| 'space-around'
|
|
31
31
|
| 'space-evenly';
|
|
32
|
+
export type PositionOptionType = 'relative' | 'absolute';
|
|
32
33
|
|
|
33
34
|
export interface OnboardTitlePropsGenerated {
|
|
34
35
|
child: string;
|
|
@@ -59,6 +60,13 @@ export interface OnboardTitlePropsGenerated {
|
|
|
59
60
|
borderRadius?: string;
|
|
60
61
|
width?: string;
|
|
61
62
|
height?: string;
|
|
63
|
+
flex?: number;
|
|
64
|
+
position?: PositionOptionType;
|
|
65
|
+
top?: string;
|
|
66
|
+
bottom?: string;
|
|
67
|
+
left?: string;
|
|
68
|
+
right?: string;
|
|
69
|
+
zIndex?: number;
|
|
62
70
|
};
|
|
63
71
|
}
|
|
64
72
|
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
import { other } from './other';
|
|
13
13
|
|
|
14
14
|
// Builder components
|
|
15
|
+
import BackgroundImage from './BackgroundImage/BackgroundImage';
|
|
15
16
|
import Button from './Button/Button';
|
|
16
17
|
import Carousel from './Carousel/Carousel';
|
|
17
18
|
import CarouselButtons from './CarouselButtons/CarouselButtons';
|
|
@@ -51,6 +52,8 @@ function RenderNode({ node }: { node: Node }) {
|
|
|
51
52
|
|
|
52
53
|
const simpleNode = node as NodeData;
|
|
53
54
|
switch (simpleNode?.type) {
|
|
55
|
+
case 'background-image':
|
|
56
|
+
return <BackgroundImage node={simpleNode} />;
|
|
54
57
|
case 'button':
|
|
55
58
|
return <Button node={simpleNode} />;
|
|
56
59
|
case 'carousel':
|
|
@@ -1,26 +1,44 @@
|
|
|
1
|
-
import React, { useMemo } from 'react';
|
|
1
|
+
import React, { useId, useMemo } from 'react';
|
|
2
2
|
import type { TextComponentProps } from './TextProps.generated';
|
|
3
3
|
import useNode from '../useNode';
|
|
4
4
|
import { useRenderStore } from '../../store';
|
|
5
5
|
import { extractTextStyle } from '../../utils/extractTextStyle';
|
|
6
|
-
import { extractViewStyle } from '../../utils/extractViewStyle';
|
|
7
6
|
import { useLogRender } from '../../utils/useLogRender';
|
|
7
|
+
import { isNodeSelected, SELECTED_OUTLINE_STYLE } from '../../utils/selection';
|
|
8
|
+
import { useMergedStyle } from '../../utils/useMergedStyle';
|
|
8
9
|
|
|
9
10
|
function Text({ node }: TextComponentProps) {
|
|
10
11
|
useLogRender('Text');
|
|
11
12
|
node = useNode(node);
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
}
|
|
13
|
+
const generatedId = useId();
|
|
14
|
+
const attributeName = (node as any)?.sourceType ?? node.type ?? 'text';
|
|
15
|
+
const attributeKey = node.key ?? generatedId;
|
|
16
|
+
const { appConfig, projectColors, previewMode, current } = useRenderStore(
|
|
17
|
+
(s) => ({
|
|
18
|
+
appConfig: s.appConfig,
|
|
19
|
+
projectColors: s.projectColors,
|
|
20
|
+
previewMode: s.previewMode,
|
|
21
|
+
current: s.current,
|
|
22
|
+
}),
|
|
23
|
+
);
|
|
16
24
|
const { defaultLanguage, localication } = appConfig;
|
|
17
25
|
const keyOrText: string = node.children as string;
|
|
18
|
-
const textStyle =
|
|
19
|
-
|
|
20
|
-
|
|
26
|
+
const textStyle = useMemo(
|
|
27
|
+
() => extractTextStyle(node, { appConfig, projectColors }),
|
|
28
|
+
[node, appConfig, projectColors],
|
|
29
|
+
);
|
|
30
|
+
const isSelected = isNodeSelected({ previewMode, current, node });
|
|
31
|
+
const style = useMergedStyle(
|
|
32
|
+
textStyle,
|
|
33
|
+
isSelected ? SELECTED_OUTLINE_STYLE : undefined,
|
|
34
|
+
);
|
|
21
35
|
|
|
22
36
|
return (
|
|
23
|
-
<p
|
|
37
|
+
<p
|
|
38
|
+
attribute-name={attributeName}
|
|
39
|
+
attribute-key={attributeKey}
|
|
40
|
+
style={style}
|
|
41
|
+
>
|
|
24
42
|
{localication?.[defaultLanguage ?? 'en']?.[keyOrText] ?? keyOrText}
|
|
25
43
|
</p>
|
|
26
44
|
);
|
|
@@ -16,6 +16,7 @@ export type JustifyContentOptionType =
|
|
|
16
16
|
| 'space-between'
|
|
17
17
|
| 'space-around'
|
|
18
18
|
| 'space-evenly';
|
|
19
|
+
export type PositionOptionType = 'relative' | 'absolute';
|
|
19
20
|
export type FontWeightOptionType =
|
|
20
21
|
| 'normal'
|
|
21
22
|
| 'bold'
|
|
@@ -55,6 +56,13 @@ export interface TextPropsGenerated {
|
|
|
55
56
|
borderRadius?: string;
|
|
56
57
|
width?: string;
|
|
57
58
|
height?: string;
|
|
59
|
+
flex?: number;
|
|
60
|
+
position?: PositionOptionType;
|
|
61
|
+
top?: string;
|
|
62
|
+
bottom?: string;
|
|
63
|
+
left?: string;
|
|
64
|
+
right?: string;
|
|
65
|
+
zIndex?: number;
|
|
58
66
|
color?: string;
|
|
59
67
|
fontSize?: string;
|
|
60
68
|
fontWeight?: FontWeightOptionType;
|
|
@@ -1,18 +1,40 @@
|
|
|
1
|
-
import React, { useMemo } from 'react';
|
|
1
|
+
import React, { useId, useMemo } from 'react';
|
|
2
2
|
import type { ViewComponentProps } from './ViewProps.generated';
|
|
3
3
|
import RenderNode from '../RenderNode.generated';
|
|
4
4
|
import { Node } from '../../types/Node';
|
|
5
5
|
import useNode from '../useNode';
|
|
6
|
+
import { useRenderStore } from '../../store';
|
|
6
7
|
import { extractViewStyle } from '../../utils/extractViewStyle';
|
|
7
8
|
import { useLogRender } from '../../utils/useLogRender';
|
|
9
|
+
import { isNodeSelected, SELECTED_OUTLINE_STYLE } from '../../utils/selection';
|
|
10
|
+
import { useMergedStyle } from '../../utils/useMergedStyle';
|
|
8
11
|
|
|
9
12
|
export function View({ node }: ViewComponentProps) {
|
|
10
13
|
useLogRender('View');
|
|
11
14
|
node = useNode(node);
|
|
12
|
-
const
|
|
13
|
-
const
|
|
15
|
+
const generatedId = useId();
|
|
16
|
+
const attributeName = (node as any)?.sourceType ?? node.type ?? 'view';
|
|
17
|
+
const attributeKey = node.key ?? generatedId;
|
|
18
|
+
const { previewMode, current, appConfig, projectColors } = useRenderStore(
|
|
19
|
+
(s) => ({
|
|
20
|
+
previewMode: s.previewMode,
|
|
21
|
+
current: s.current,
|
|
22
|
+
appConfig: s.appConfig,
|
|
23
|
+
projectColors: s.projectColors,
|
|
24
|
+
}),
|
|
25
|
+
);
|
|
26
|
+
const baseStyle = useMemo(
|
|
27
|
+
() => extractViewStyle(node, { appConfig, projectColors }),
|
|
28
|
+
[node, appConfig, projectColors],
|
|
29
|
+
);
|
|
30
|
+
const isSelected = isNodeSelected({ previewMode, current, node });
|
|
31
|
+
const viewStyle = useMergedStyle(
|
|
32
|
+
baseStyle,
|
|
33
|
+
isSelected ? SELECTED_OUTLINE_STYLE : undefined,
|
|
34
|
+
);
|
|
14
35
|
return (
|
|
15
36
|
<div
|
|
37
|
+
attribute-name={attributeName}
|
|
16
38
|
attribute-key={attributeKey}
|
|
17
39
|
style={viewStyle}
|
|
18
40
|
className="scroll-container"
|
|
@@ -16,6 +16,7 @@ export type JustifyContentOptionType =
|
|
|
16
16
|
| 'space-between'
|
|
17
17
|
| 'space-around'
|
|
18
18
|
| 'space-evenly';
|
|
19
|
+
export type PositionOptionType = 'relative' | 'absolute';
|
|
19
20
|
|
|
20
21
|
export interface ViewPropsGenerated {
|
|
21
22
|
child: string;
|
|
@@ -42,6 +43,13 @@ export interface ViewPropsGenerated {
|
|
|
42
43
|
borderRadius?: string;
|
|
43
44
|
width?: string;
|
|
44
45
|
height?: string;
|
|
46
|
+
flex?: number;
|
|
47
|
+
position?: PositionOptionType;
|
|
48
|
+
top?: string;
|
|
49
|
+
bottom?: string;
|
|
50
|
+
left?: string;
|
|
51
|
+
right?: string;
|
|
52
|
+
zIndex?: number;
|
|
45
53
|
};
|
|
46
54
|
}
|
|
47
55
|
|
|
@@ -33,7 +33,14 @@
|
|
|
33
33
|
"backgroundColor": "color",
|
|
34
34
|
"borderRadius": "size",
|
|
35
35
|
"width": "size",
|
|
36
|
-
"height": "size"
|
|
36
|
+
"height": "size",
|
|
37
|
+
"flex": "number",
|
|
38
|
+
"position": ["relative", "absolute"],
|
|
39
|
+
"top": "size",
|
|
40
|
+
"bottom": "size",
|
|
41
|
+
"left": "size",
|
|
42
|
+
"right": "size",
|
|
43
|
+
"zIndex": "number"
|
|
37
44
|
},
|
|
38
45
|
"defaults": {
|
|
39
46
|
"flexDirection": "column"
|
|
@@ -61,6 +68,12 @@
|
|
|
61
68
|
"description": "Fixed dimensions.",
|
|
62
69
|
"category": "container",
|
|
63
70
|
"sort": 3
|
|
71
|
+
},
|
|
72
|
+
"offset": {
|
|
73
|
+
"label": "Offset",
|
|
74
|
+
"description": "Absolute positioning offsets.",
|
|
75
|
+
"category": "container",
|
|
76
|
+
"sort": 4
|
|
64
77
|
}
|
|
65
78
|
},
|
|
66
79
|
"attributes": {
|
|
@@ -242,6 +255,59 @@
|
|
|
242
255
|
"specialCategory": "size",
|
|
243
256
|
"sort": 1,
|
|
244
257
|
"preferedScale": "vs"
|
|
258
|
+
},
|
|
259
|
+
"flex": {
|
|
260
|
+
"label": "Flex",
|
|
261
|
+
"description": "Flex grow factor (e.g. 1 fills available space).",
|
|
262
|
+
"category": "container",
|
|
263
|
+
"specialCategory": "size",
|
|
264
|
+
"sort": 2
|
|
265
|
+
},
|
|
266
|
+
"position": {
|
|
267
|
+
"label": "Position",
|
|
268
|
+
"description": "Sets layout positioning mode.",
|
|
269
|
+
"category": "container",
|
|
270
|
+
"specialCategory": null,
|
|
271
|
+
"sort": 3
|
|
272
|
+
},
|
|
273
|
+
"top": {
|
|
274
|
+
"label": "Top",
|
|
275
|
+
"description": "Offset from the top edge.",
|
|
276
|
+
"category": "container",
|
|
277
|
+
"specialCategory": "offset",
|
|
278
|
+
"sort": 22,
|
|
279
|
+
"preferedScale": "vs"
|
|
280
|
+
},
|
|
281
|
+
"bottom": {
|
|
282
|
+
"label": "Bottom",
|
|
283
|
+
"description": "Offset from the bottom edge.",
|
|
284
|
+
"category": "container",
|
|
285
|
+
"specialCategory": "offset",
|
|
286
|
+
"sort": 23,
|
|
287
|
+
"preferedScale": "vs"
|
|
288
|
+
},
|
|
289
|
+
"left": {
|
|
290
|
+
"label": "Left",
|
|
291
|
+
"description": "Offset from the left edge.",
|
|
292
|
+
"category": "container",
|
|
293
|
+
"specialCategory": "offset",
|
|
294
|
+
"sort": 24,
|
|
295
|
+
"preferedScale": "s"
|
|
296
|
+
},
|
|
297
|
+
"right": {
|
|
298
|
+
"label": "Right",
|
|
299
|
+
"description": "Offset from the right edge.",
|
|
300
|
+
"category": "container",
|
|
301
|
+
"specialCategory": "offset",
|
|
302
|
+
"sort": 25,
|
|
303
|
+
"preferedScale": "s"
|
|
304
|
+
},
|
|
305
|
+
"zIndex": {
|
|
306
|
+
"label": "Z-Index",
|
|
307
|
+
"description": "Controls stacking order.",
|
|
308
|
+
"category": "container",
|
|
309
|
+
"specialCategory": null,
|
|
310
|
+
"sort": 26
|
|
245
311
|
}
|
|
246
312
|
}
|
|
247
313
|
}
|
|
@@ -5,6 +5,7 @@ export { default as RenderNode } from './RenderNode.generated';
|
|
|
5
5
|
export { patterns } from './patterns.generated';
|
|
6
6
|
|
|
7
7
|
export const allcomponentNames = [
|
|
8
|
+
'background-image',
|
|
8
9
|
'button',
|
|
9
10
|
'carousel',
|
|
10
11
|
'carouselButtons',
|
|
@@ -26,6 +27,10 @@ export const allcomponentNames = [
|
|
|
26
27
|
'view',
|
|
27
28
|
] as const;
|
|
28
29
|
|
|
30
|
+
export type {
|
|
31
|
+
BackgroundImagePropsGenerated,
|
|
32
|
+
BackgroundImageComponentProps,
|
|
33
|
+
} from './BackgroundImage/BackgroundImageProps.generated';
|
|
29
34
|
export type {
|
|
30
35
|
ButtonPropsGenerated,
|
|
31
36
|
ButtonComponentProps,
|