tee3apps-cms-sdk-react 0.0.19 → 0.0.22
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/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/Page.tsx +2 -2
- package/src/PageComponents/BoxComponent.tsx +142 -92
- package/src/PageComponents/Visual-Components/CarouselComponent.tsx +497 -364
- package/src/PageComponents/Visual-Components/GroupBrandComponent.tsx +396 -390
- package/src/PageComponents/Visual-Components/GroupCategoryComponent.tsx +21 -13
- package/src/PageComponents/Visual-Components/GroupImageList.tsx +642 -668
- package/src/PageComponents/Visual-Components/GroupProductComponent.tsx +46 -20
- package/src/PageComponents/Visual-Components/GroupVideoList.tsx +693 -589
- package/src/PageComponents/Visual-Components/ImageComponent.tsx +72 -17
- package/src/PageComponents/Visual-Components/LottieComponent.tsx +14 -8
- package/src/PageComponents/Visual-Components/NavigationComponent.tsx +74 -27
- package/src/PageComponents/Visual-Components/RichTextComponent.tsx +1 -1
- package/src/PageComponents/Visual-Components/TabComponent.tsx +1625 -875
- package/src/PageComponents/Visual-Components/TextComponent.tsx +24 -10
- package/src/PageComponents/Visual-Components/VideoComponent.tsx +33 -11
- package/src/PageComponents/Visual-Components/tab.css +645 -611
- package/src/index.css +126 -80
- package/src/Components/BoxRenderer.tsx +0 -108
- package/src/Components/ComponentRenderer.tsx +0 -29
- package/src/Components/ImageComponent.tsx +0 -68
- package/src/Components/RowComponent.tsx +0 -66
- package/src/Components/TextComponent.tsx +0 -47
|
@@ -77,33 +77,36 @@ const ImageComponent: React.FC<ImageComponentMainProps> = ({
|
|
|
77
77
|
case 'PRODUCT': {
|
|
78
78
|
const pdType = element.product?.pd_type;
|
|
79
79
|
const code =
|
|
80
|
-
element.product?.pd_id?.code
|
|
81
|
-
element.product?.code
|
|
80
|
+
element.product?.pd_id?.code ??
|
|
81
|
+
element.product?.code ??
|
|
82
82
|
element.product?.product_data?.code;
|
|
83
83
|
|
|
84
|
-
|
|
84
|
+
// Check for empty string as well as null/undefined
|
|
85
|
+
if (!code || code === '') return null;
|
|
85
86
|
|
|
86
87
|
return pdType === 'VARIANT'
|
|
87
|
-
?
|
|
88
|
-
:
|
|
88
|
+
? `/${code}`
|
|
89
|
+
: `/model/${code}`;
|
|
89
90
|
}
|
|
90
91
|
|
|
91
92
|
case 'TAG': {
|
|
92
|
-
const tagCode =
|
|
93
|
-
|
|
93
|
+
const tagCode = element.tag?.code;
|
|
94
|
+
// Check for empty string as well as null/undefined
|
|
95
|
+
if (!tagCode || tagCode === '') return null;
|
|
94
96
|
// return `/${tagCode}/s?type=tag`;
|
|
95
97
|
return `/tag/${tagCode}`;
|
|
96
98
|
}
|
|
97
99
|
|
|
98
100
|
case 'PAGE': {
|
|
99
|
-
const pageId = element.page?._id
|
|
101
|
+
const pageId = element.page?._id ?? element.page?.code;
|
|
100
102
|
const pgType = element.page?.pg_type;
|
|
101
|
-
|
|
103
|
+
// Check for empty string as well as null/undefined
|
|
104
|
+
if (!pageId || pageId === '' || !pgType || pgType === '') return null;
|
|
102
105
|
return `/page/${pageId}?type=${pgType}`;
|
|
103
106
|
}
|
|
104
107
|
|
|
105
108
|
default:
|
|
106
|
-
return element.slug
|
|
109
|
+
return element.slug ?? null;
|
|
107
110
|
}
|
|
108
111
|
};
|
|
109
112
|
|
|
@@ -122,9 +125,34 @@ const ImageComponent: React.FC<ImageComponentMainProps> = ({
|
|
|
122
125
|
};
|
|
123
126
|
|
|
124
127
|
const currentMode = getCurrentMode();
|
|
128
|
+
const containerHeight = boxHeight === 'auto' ? 'auto' : boxHeight;
|
|
125
129
|
const link = bannerLink(props);
|
|
126
|
-
|
|
127
|
-
|
|
130
|
+
|
|
131
|
+
// Use nullish coalescing to safely access image properties
|
|
132
|
+
const imageUrl = `${Linodeurl}${props.images?.url ?? props.images?.all?.url ?? ''}`;
|
|
133
|
+
const altText = props.images?.alt ?? props.images?.all?.alt ?? '';
|
|
134
|
+
|
|
135
|
+
// Don't render if no image URL is available
|
|
136
|
+
if (!props.images || (!props.images?.url && !props.images?.all?.url)) {
|
|
137
|
+
return (
|
|
138
|
+
<div
|
|
139
|
+
className="image-box"
|
|
140
|
+
style={{
|
|
141
|
+
borderRadius: `${currentMode?.borderRadius ?? 0}px`,
|
|
142
|
+
height: containerHeight,
|
|
143
|
+
overflow: 'hidden',
|
|
144
|
+
display: 'flex',
|
|
145
|
+
alignItems: 'center',
|
|
146
|
+
justifyContent: 'center',
|
|
147
|
+
backgroundColor: '#f0f0f0',
|
|
148
|
+
color: '#999',
|
|
149
|
+
fontSize: '14px'
|
|
150
|
+
}}
|
|
151
|
+
>
|
|
152
|
+
No image available
|
|
153
|
+
</div>
|
|
154
|
+
);
|
|
155
|
+
}
|
|
128
156
|
|
|
129
157
|
const imageElement = (
|
|
130
158
|
<img
|
|
@@ -132,7 +160,13 @@ const ImageComponent: React.FC<ImageComponentMainProps> = ({
|
|
|
132
160
|
alt={altText}
|
|
133
161
|
className="fitted-image"
|
|
134
162
|
style={{
|
|
135
|
-
cursor: link ? 'pointer' : 'default'
|
|
163
|
+
cursor: link ? 'pointer' : 'default',
|
|
164
|
+
objectFit: 'fill',
|
|
165
|
+
width: '100%',
|
|
166
|
+
height: '100%',
|
|
167
|
+
display: 'block',
|
|
168
|
+
minWidth: 0,
|
|
169
|
+
minHeight: 0
|
|
136
170
|
}}
|
|
137
171
|
/>
|
|
138
172
|
);
|
|
@@ -141,21 +175,42 @@ const ImageComponent: React.FC<ImageComponentMainProps> = ({
|
|
|
141
175
|
<div
|
|
142
176
|
className="image-box"
|
|
143
177
|
style={{
|
|
144
|
-
borderRadius: `${currentMode
|
|
178
|
+
borderRadius: `${currentMode?.borderRadius ?? 0}px`,
|
|
179
|
+
height: containerHeight === 'auto' ? '100%' : containerHeight,
|
|
145
180
|
width: '100%',
|
|
146
181
|
overflow: 'hidden',
|
|
182
|
+
position: 'relative'
|
|
147
183
|
}}
|
|
148
184
|
>
|
|
149
185
|
{link ? (
|
|
150
186
|
<a
|
|
151
187
|
href={link}
|
|
152
|
-
target={props?.linktype
|
|
153
|
-
style={{
|
|
188
|
+
target={props?.linktype === 'EXTERNAL' ? props?.link?.target ?? '_blank' : '_self'}
|
|
189
|
+
style={{
|
|
190
|
+
display: 'block',
|
|
191
|
+
width: '100%',
|
|
192
|
+
height: '100%',
|
|
193
|
+
position: 'absolute',
|
|
194
|
+
top: 0,
|
|
195
|
+
left: 0,
|
|
196
|
+
right: 0,
|
|
197
|
+
bottom: 0
|
|
198
|
+
}}
|
|
154
199
|
>
|
|
155
200
|
{imageElement}
|
|
156
201
|
</a>
|
|
157
202
|
) : (
|
|
158
|
-
|
|
203
|
+
<div style={{
|
|
204
|
+
width: '100%',
|
|
205
|
+
height: '100%',
|
|
206
|
+
position: 'absolute',
|
|
207
|
+
top: 0,
|
|
208
|
+
left: 0,
|
|
209
|
+
right: 0,
|
|
210
|
+
bottom: 0
|
|
211
|
+
}}>
|
|
212
|
+
{imageElement}
|
|
213
|
+
</div>
|
|
159
214
|
)}
|
|
160
215
|
</div>
|
|
161
216
|
);
|
|
@@ -73,8 +73,8 @@ const LottieComponent: React.FC<LottieComponentMainProps> = ({ props, deviceMode
|
|
|
73
73
|
if (!code) return null;
|
|
74
74
|
|
|
75
75
|
return pdType === 'VARIANT'
|
|
76
|
-
? `/${code}
|
|
77
|
-
:
|
|
76
|
+
? `/${code}`
|
|
77
|
+
: `/model/${code}`;
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
case 'TAG': {
|
|
@@ -155,8 +155,8 @@ const LottieComponent: React.FC<LottieComponentMainProps> = ({ props, deviceMode
|
|
|
155
155
|
>
|
|
156
156
|
<div
|
|
157
157
|
style={{
|
|
158
|
-
width:
|
|
159
|
-
height:
|
|
158
|
+
width: currentMode.width,
|
|
159
|
+
height: currentMode.height,
|
|
160
160
|
display: 'inline-block',
|
|
161
161
|
backgroundColor: 'white',
|
|
162
162
|
cursor: isClickable ? 'pointer' : 'default',
|
|
@@ -168,7 +168,10 @@ const LottieComponent: React.FC<LottieComponentMainProps> = ({ props, deviceMode
|
|
|
168
168
|
animationData={animationData}
|
|
169
169
|
loop={currentMode.loop}
|
|
170
170
|
autoplay={currentMode.autoplay}
|
|
171
|
-
style={{
|
|
171
|
+
style={{
|
|
172
|
+
width: currentMode.width,
|
|
173
|
+
height: currentMode.height
|
|
174
|
+
}}
|
|
172
175
|
/>
|
|
173
176
|
)}
|
|
174
177
|
{!animationData && !error && (
|
|
@@ -182,8 +185,8 @@ const LottieComponent: React.FC<LottieComponentMainProps> = ({ props, deviceMode
|
|
|
182
185
|
):(
|
|
183
186
|
<div
|
|
184
187
|
style={{
|
|
185
|
-
width:
|
|
186
|
-
height:
|
|
188
|
+
width: currentMode.width,
|
|
189
|
+
height: currentMode.height,
|
|
187
190
|
display: 'inline-block',
|
|
188
191
|
backgroundColor: 'white',
|
|
189
192
|
cursor: isClickable ? 'pointer' : 'default',
|
|
@@ -195,7 +198,10 @@ const LottieComponent: React.FC<LottieComponentMainProps> = ({ props, deviceMode
|
|
|
195
198
|
animationData={animationData}
|
|
196
199
|
loop={currentMode.loop}
|
|
197
200
|
autoplay={currentMode.autoplay}
|
|
198
|
-
style={{
|
|
201
|
+
style={{
|
|
202
|
+
width: currentMode.width,
|
|
203
|
+
height: currentMode.height
|
|
204
|
+
}}
|
|
199
205
|
/>
|
|
200
206
|
)}
|
|
201
207
|
{!animationData && !error && (
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
|
|
3
3
|
interface NavTitle {
|
|
4
|
-
all
|
|
4
|
+
all?: string
|
|
5
5
|
}
|
|
6
6
|
|
|
7
7
|
interface NavItem {
|
|
8
8
|
nl_id?: string
|
|
9
9
|
id?: string
|
|
10
|
-
title:
|
|
10
|
+
title: NavTitle | string
|
|
11
11
|
url?: string
|
|
12
12
|
target?: string
|
|
13
13
|
framename?: string
|
|
@@ -46,17 +46,66 @@ interface NavigationComponentMainProps {
|
|
|
46
46
|
|
|
47
47
|
const NavigationComponent: React.FC<NavigationComponentMainProps> = ({ props, boxHeight }) => {
|
|
48
48
|
const root = props.navData?.[0]
|
|
49
|
-
const topItems: NavItem[] = root?.children || []
|
|
50
49
|
|
|
51
50
|
const [openId, setOpenId] = React.useState<string | null>(null)
|
|
52
51
|
|
|
53
|
-
const buildHref = (item: NavItem) => item.url || '#'
|
|
54
|
-
|
|
55
52
|
const Item = ({ item, depth = 0, isRoot = false }: { item: NavItem; depth?: number; isRoot?: boolean }) => {
|
|
56
53
|
const hasChildren = Array.isArray(item.children) && item.children.length > 0
|
|
57
54
|
const isTop = depth === 0 && !isRoot
|
|
58
55
|
const layer = isRoot ? props.styles.primary : (isTop ? props.styles.primary : props.styles.secondary)
|
|
59
56
|
|
|
57
|
+
// Get title text - handle both string and object formats
|
|
58
|
+
const getTitle = () => {
|
|
59
|
+
if (typeof item.title === 'string') {
|
|
60
|
+
return item.title
|
|
61
|
+
}
|
|
62
|
+
return item.title?.all || ''
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Handle navigation/redirecting
|
|
66
|
+
const handleNavigation = (e: React.MouseEvent) => {
|
|
67
|
+
if (!item.url) return
|
|
68
|
+
|
|
69
|
+
e.preventDefault()
|
|
70
|
+
e.stopPropagation()
|
|
71
|
+
|
|
72
|
+
const target = item.target || '_self'
|
|
73
|
+
const framename = item.framename || ''
|
|
74
|
+
|
|
75
|
+
if (target === '_framename') {
|
|
76
|
+
if (framename) {
|
|
77
|
+
// Navigate to a specific frame by name
|
|
78
|
+
// Try to find iframe element by name attribute first
|
|
79
|
+
const frameElement = document.querySelector(`iframe[name="${framename}"]`) as HTMLIFrameElement
|
|
80
|
+
if (frameElement) {
|
|
81
|
+
frameElement.src = item.url
|
|
82
|
+
} else {
|
|
83
|
+
// Try window.frames (for frameset-based frames)
|
|
84
|
+
const frames = window.frames as any
|
|
85
|
+
const frame = frames[framename]
|
|
86
|
+
if (frame) {
|
|
87
|
+
frame.location.href = item.url
|
|
88
|
+
} else {
|
|
89
|
+
// Fallback to opening in new window with framename
|
|
90
|
+
window.open(item.url, framename)
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
} else {
|
|
94
|
+
// If framename is empty, fallback to _self
|
|
95
|
+
window.location.href = item.url
|
|
96
|
+
}
|
|
97
|
+
} else if (target === '_blank') {
|
|
98
|
+
// Open in new tab/window
|
|
99
|
+
window.open(item.url, '_blank', 'noopener,noreferrer')
|
|
100
|
+
} else if (target === '_self' || !target) {
|
|
101
|
+
// Navigate in same window
|
|
102
|
+
window.location.href = item.url
|
|
103
|
+
} else {
|
|
104
|
+
// Custom target (could be a frame name or window name)
|
|
105
|
+
window.open(item.url, target)
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
60
109
|
const baseStyles: React.CSSProperties = {
|
|
61
110
|
display: 'flex',
|
|
62
111
|
alignItems: 'center',
|
|
@@ -70,8 +119,13 @@ const NavigationComponent: React.FC<NavigationComponentMainProps> = ({ props, bo
|
|
|
70
119
|
fontSize: isRoot ? 16 : (isTop ? 14 : 13),
|
|
71
120
|
borderBottom: layer.isSeparator && !isTop && !isRoot ? `1px solid ${layer.color.separator}` : 'none',
|
|
72
121
|
borderRadius: isRoot ? 8 : (isTop ? 6 : 4),
|
|
73
|
-
cursor: 'pointer',
|
|
74
|
-
fontWeight: isRoot ? 'bold' : 'normal'
|
|
122
|
+
cursor: item.url ? 'pointer' : (hasChildren ? 'pointer' : 'default'),
|
|
123
|
+
fontWeight: isRoot ? 'bold' : 'normal',
|
|
124
|
+
...(isRoot && {
|
|
125
|
+
border: `1px solid ${layer.color.separator || '#e0e0e0'}`,
|
|
126
|
+
boxShadow: '0 2px 4px rgba(0,0,0,0.1)',
|
|
127
|
+
transition: 'all 0.2s ease-in-out'
|
|
128
|
+
})
|
|
75
129
|
}
|
|
76
130
|
|
|
77
131
|
const [hover, setHover] = React.useState(false)
|
|
@@ -84,34 +138,35 @@ const NavigationComponent: React.FC<NavigationComponentMainProps> = ({ props, bo
|
|
|
84
138
|
>
|
|
85
139
|
{isRoot ? (
|
|
86
140
|
<div
|
|
141
|
+
onClick={item.url ? handleNavigation : undefined}
|
|
87
142
|
style={{
|
|
88
143
|
...baseStyles,
|
|
89
144
|
background: hover ? layer.colorHover.background : layer.color.background,
|
|
90
145
|
color: hover ? layer.colorHover.text : layer.color.text,
|
|
91
|
-
cursor: 'default'
|
|
146
|
+
cursor: item.url || hasChildren ? 'pointer' : 'default',
|
|
147
|
+
boxShadow: hover ? '0 4px 8px rgba(0,0,0,0.15)' : '0 2px 4px rgba(0,0,0,0.1)'
|
|
92
148
|
}}
|
|
93
149
|
>
|
|
94
|
-
<span>{
|
|
150
|
+
<span>{getTitle()}</span>
|
|
95
151
|
{hasChildren && (
|
|
96
152
|
<span style={{ color: layer.color.arrow || layer.color.text }}>{'▾'}</span>
|
|
97
153
|
)}
|
|
98
154
|
</div>
|
|
99
155
|
) : (
|
|
100
|
-
<
|
|
101
|
-
|
|
102
|
-
target={item.target || '_self'}
|
|
103
|
-
rel={item.target === '_blank' ? 'noopener noreferrer' : undefined}
|
|
156
|
+
<div
|
|
157
|
+
onClick={item.url ? handleNavigation : undefined}
|
|
104
158
|
style={{
|
|
105
159
|
...baseStyles,
|
|
106
160
|
background: hover ? layer.colorHover.background : layer.color.background,
|
|
107
|
-
color: hover ? layer.colorHover.text : layer.color.text
|
|
161
|
+
color: hover ? layer.colorHover.text : layer.color.text,
|
|
162
|
+
cursor: item.url || hasChildren ? 'pointer' : 'default'
|
|
108
163
|
}}
|
|
109
164
|
>
|
|
110
|
-
<span>{
|
|
165
|
+
<span>{getTitle()}</span>
|
|
111
166
|
{hasChildren && (
|
|
112
167
|
<span style={{ color: layer.color.arrow || layer.color.text }}>{isTop ? '▾' : '›'}</span>
|
|
113
168
|
)}
|
|
114
|
-
</
|
|
169
|
+
</div>
|
|
115
170
|
)}
|
|
116
171
|
|
|
117
172
|
|
|
@@ -152,16 +207,11 @@ const NavigationComponent: React.FC<NavigationComponentMainProps> = ({ props, bo
|
|
|
152
207
|
return (
|
|
153
208
|
<nav
|
|
154
209
|
style={{
|
|
155
|
-
|
|
156
|
-
display: 'flex',
|
|
210
|
+
display: 'inline-flex',
|
|
157
211
|
alignItems: 'start',
|
|
158
|
-
|
|
159
|
-
paddingLeft:'10px',
|
|
212
|
+
padding: '5px 10px',
|
|
160
213
|
margin: '0px',
|
|
161
|
-
|
|
162
|
-
borderRadius: 8,
|
|
163
|
-
overflow: 'visible',
|
|
164
|
-
height: boxHeight
|
|
214
|
+
overflow: 'visible'
|
|
165
215
|
}}
|
|
166
216
|
>
|
|
167
217
|
{/* Render root node first */}
|
|
@@ -173,6 +223,3 @@ const NavigationComponent: React.FC<NavigationComponentMainProps> = ({ props, bo
|
|
|
173
223
|
}
|
|
174
224
|
|
|
175
225
|
export default NavigationComponent
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
@@ -7,7 +7,7 @@ export interface RichTextComponentProps {
|
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
const RichTextComponent: React.FC<{ props: RichTextComponentProps }> = ({ props }) => {
|
|
10
|
-
const htmlContent = props?.content?.all ||
|
|
10
|
+
const htmlContent = props?.content?.all || props?.content;
|
|
11
11
|
|
|
12
12
|
return (
|
|
13
13
|
<div
|