pds-dev-kit-web-test 2.4.18 → 2.4.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/dist/src/desktop/components/UserDesktopTabBar/UserDesktopTabBar.d.ts +1 -1
- package/dist/src/desktop/components/UserDesktopTabBar/UserDesktopTabBar.js +24 -4
- package/dist/src/sub/DynamicLayout/pagesPreviewMock.js +117 -0
- package/dist/src/sub/DynamicLayout/sections/CustomSection/CustomSection.js +7 -5
- package/dist/src/sub/DynamicLayout/sections/CustomSection/components/ComponentBlock/ComponentBlockMatcher.js +38 -2
- package/dist/src/sub/DynamicLayout/sections/CustomSection/components/ComponentBlock/componentBlocks/ScrollAnimation.d.ts +3 -0
- package/dist/src/sub/DynamicLayout/sections/CustomSection/components/ComponentBlock/componentBlocks/ScrollAnimation.js +219 -0
- package/package.json +1 -1
- package/release-note.md +2 -2
@@ -52,7 +52,12 @@ function UserDesktopTabBar(_a) {
|
|
52
52
|
item.onClick(e);
|
53
53
|
}
|
54
54
|
};
|
55
|
-
return ((0, jsx_runtime_1.jsx)(S_TabBar, __assign({ "x-pds-name": "UserDesktopTabBar", "x-pds-element-type": "component", "x-pds-device-type": "desktop" }, { children: itemArray.map(function (item, index) {
|
55
|
+
return ((0, jsx_runtime_1.jsx)(S_TabBar, __assign({ "x-pds-name": "UserDesktopTabBar", "x-pds-element-type": "component", "x-pds-device-type": "desktop" }, { children: itemArray.map(function (item, index) {
|
56
|
+
if (styleTheme === 'content') {
|
57
|
+
return ((0, jsx_runtime_1.jsx)(S_TabWrapper, __assign({ isActive: item.isActive, styleTheme: "content", text: item.title, onClick: function (e) { return handleClickTabItem_1(item, e); } }, { children: (0, jsx_runtime_1.jsx)(TextLabel_1.TextLabel, { text: item.title, textAlign: "center", styleTheme: "headingBold", colorTheme: item.isActive ? 'sysTextPrimary' : 'sysTextSecondary', singleLineMode: "use" }) }), index));
|
58
|
+
}
|
59
|
+
return ((0, jsx_runtime_1.jsx)(S_TabWrapper, __assign({ isActive: item.isActive, styleTheme: styleTheme, text: item.title, onClick: function (e) { return handleClickTabItem_1(item, e); } }, { children: (0, jsx_runtime_1.jsx)(TextLabel_1.TextLabel, { text: item.title, textAlign: "center", styleTheme: item.isActive ? 'body2Bold' : 'body2Regular', colorTheme: item.isActive ? 'usrTextBrandPrimary' : 'sysTextSecondary', singleLineMode: "use" }) }), index));
|
60
|
+
}) })));
|
56
61
|
}
|
57
62
|
if (textArray) {
|
58
63
|
var handleClick_1 = function (value) {
|
@@ -75,7 +80,9 @@ var S_TabWrapper = styled_components_1.default.div(templateObject_2 || (template
|
|
75
80
|
var styleTheme = _a.styleTheme;
|
76
81
|
switch (styleTheme) {
|
77
82
|
case 'main':
|
78
|
-
return mainStyle;
|
83
|
+
return mainStyle;
|
84
|
+
case 'content':
|
85
|
+
return contentStyle;
|
79
86
|
default:
|
80
87
|
return mainStyle;
|
81
88
|
}
|
@@ -99,7 +106,20 @@ var mainStyle = (0, styled_components_1.css)(templateObject_3 || (templateObject
|
|
99
106
|
var isActive = _a.isActive;
|
100
107
|
return !isActive && "display: none;";
|
101
108
|
});
|
102
|
-
var
|
109
|
+
var contentStyle = (0, styled_components_1.css)(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n align-items: center;\n background-color: ", ";\n cursor: pointer;\n display: flex;\n margin-right: ", ";\n position: relative;\n\n &:last-child {\n margin-right: 0;\n }\n\n &::after {\n background-color: ", ";\n bottom: -1px;\n content: '';\n height: 2px;\n position: absolute;\n width: 100%;\n ", ";\n }\n"], ["\n align-items: center;\n background-color: ", ";\n cursor: pointer;\n display: flex;\n margin-right: ", ";\n position: relative;\n\n &:last-child {\n margin-right: 0;\n }\n\n &::after {\n background-color: ", ";\n bottom: -1px;\n content: '';\n height: 2px;\n position: absolute;\n width: 100%;\n ", ";\n }\n"])), function (_a) {
|
110
|
+
var isActive = _a.isActive, theme = _a.theme;
|
111
|
+
return isActive && theme.ui_cpnt_tabbar_base_area;
|
112
|
+
}, function (_a) {
|
113
|
+
var theme = _a.theme;
|
114
|
+
return theme.spacing.spacingF;
|
115
|
+
}, function (_a) {
|
116
|
+
var theme = _a.theme;
|
117
|
+
return theme.ui_19;
|
118
|
+
}, function (_a) {
|
119
|
+
var isActive = _a.isActive;
|
120
|
+
return !isActive && "display: none;";
|
121
|
+
});
|
122
|
+
var S_TabBar = styled_components_1.default.div(templateObject_5 || (templateObject_5 = __makeTemplateObject(["\n background-color: ", ";\n border-bottom: 1px solid ", ";\n box-sizing: border-box;\n display: flex;\n flex-direction: row;\n height: 48px;\n justify-content: center;\n"], ["\n background-color: ", ";\n border-bottom: 1px solid ", ";\n box-sizing: border-box;\n display: flex;\n flex-direction: row;\n height: 48px;\n justify-content: center;\n"])), function (_a) {
|
103
123
|
var theme = _a.theme;
|
104
124
|
return theme.ui_cpnt_tabbar_base_area;
|
105
125
|
}, function (_a) {
|
@@ -107,4 +127,4 @@ var S_TabBar = styled_components_1.default.div(templateObject_4 || (templateObje
|
|
107
127
|
return theme.ui_cpnt_divider;
|
108
128
|
});
|
109
129
|
exports.default = UserDesktopTabBar;
|
110
|
-
var templateObject_1, templateObject_2, templateObject_3, templateObject_4;
|
130
|
+
var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5;
|
@@ -137,6 +137,123 @@ exports.sampleCustomsection1 = {
|
|
137
137
|
queryableTapSrc: 'N/A',
|
138
138
|
updatedAt: '2023-08-06T13:30:49'
|
139
139
|
},
|
140
|
+
{
|
141
|
+
availablePlugins: [],
|
142
|
+
componentBlockCode: 'CB_TEXT',
|
143
|
+
componentBlockType: 'GENERAL',
|
144
|
+
dynamicLayoutSectionId: 18661,
|
145
|
+
id: 3599,
|
146
|
+
insertedAt: '2023-08-06T13:30:47',
|
147
|
+
jsonProperties: {
|
148
|
+
currentVersion: '2023-08-03',
|
149
|
+
data: {
|
150
|
+
CB_CONTENT_PROP_CLINK: {
|
151
|
+
CB_CONTENT_PROP_CLINK_SPEC_INTERNALSRC: 'https://publ.co',
|
152
|
+
CB_CONTENT_PROP_CLINK_SPEC_NEWTAB: true,
|
153
|
+
CB_CONTENT_PROP_CLINK_SPEC_SRC: 'https://publ.co',
|
154
|
+
CB_CONTENT_PROP_CLINK_SPEC_TYPE: 'DISABLED'
|
155
|
+
},
|
156
|
+
CB_CONTENT_PROP_HOVER: {
|
157
|
+
CB_CONTENT_PROP_HOVER_SPEC_MUSE: true
|
158
|
+
},
|
159
|
+
CB_CONTENT_PROP_TEXT: {
|
160
|
+
CB_CONTENT_PROP_TEXT_SPEC_TEXT: '{"scrollId": "airpods", "totalImages": 64, "baseURL": "https://www.apple.com/105/media/us/airpods-pro/2022/d2deeb8e-83eb-48ea-9721-f567cf0fffa8/anim/hero/medium", "type": "png", "startShowingImages": 0,"endShowingImages": 1000}'
|
161
|
+
},
|
162
|
+
CB_CONTENT_PROP_VISIBILITY: {
|
163
|
+
CB_CONTENT_PROP_VISIBILITY_SPEC_DESKTOP: true,
|
164
|
+
CB_CONTENT_PROP_VISIBILITY_SPEC_MOBILEWEB: true
|
165
|
+
},
|
166
|
+
CB_EFFECT_PROP_ENTANIM: {
|
167
|
+
CB_EFFECT_PROP_ENTANIM_SPEC_TYPE: 'SLIDEINLEFT',
|
168
|
+
'CB_EFFECT_PROP_ENTANIM_SPEC_TYPE:MOBILE': 'HEARTBEAT',
|
169
|
+
CB_EFFECT_PROP_ENTANIM_SPEC_DURATION: 1,
|
170
|
+
'CB_EFFECT_PROP_ENTANIM_SPEC_DURATION:MOBILE': null,
|
171
|
+
CB_EFFECT_PROP_ENTANIM_SPEC_REPEAT: 1,
|
172
|
+
'CB_EFFECT_PROP_ENTANIM_SPEC_REPEAT:MOBILE': null,
|
173
|
+
CB_EFFECT_PROP_ENTANIM_SPEC_TFUNC: 'EASEINOUT',
|
174
|
+
'CB_EFFECT_PROP_ENTANIM_SPEC_TFUNC:MOBILE': null
|
175
|
+
},
|
176
|
+
CB_EFFECT_PROP_HOVERANIM: {
|
177
|
+
CB_EFFECT_PROP_HOVERANIM_SPEC_DURATION: 0.7,
|
178
|
+
'CB_EFFECT_PROP_HOVERANIM_SPEC_DURATION:MOBILE': null,
|
179
|
+
CB_EFFECT_PROP_HOVERANIM_SPEC_REPEAT: 1,
|
180
|
+
'CB_EFFECT_PROP_HOVERANIM_SPEC_REPEAT:MOBILE': null,
|
181
|
+
CB_EFFECT_PROP_HOVERANIM_SPEC_TFUNC: 'EASEINOUT',
|
182
|
+
'CB_EFFECT_PROP_HOVERANIM_SPEC_TFUNC:MOBILE': null,
|
183
|
+
CB_EFFECT_PROP_HOVERANIM_SPEC_TYPE: 'NONE',
|
184
|
+
'CB_EFFECT_PROP_HOVERANIM_SPEC_TYPE:MOBILE': null
|
185
|
+
},
|
186
|
+
CB_LAYOUT_PROP_PADDING: {
|
187
|
+
CB_LAYOUT_PROP_PADDING_SPEC_FIX: true,
|
188
|
+
'CB_LAYOUT_PROP_PADDING_SPEC_FIX:MOBILE': null,
|
189
|
+
CB_LAYOUT_PROP_PADDING_SPEC_PADDING: {
|
190
|
+
bottom: 0,
|
191
|
+
left: 0,
|
192
|
+
right: 0,
|
193
|
+
top: 0
|
194
|
+
},
|
195
|
+
'CB_LAYOUT_PROP_PADDING_SPEC_PADDING:MOBILE': null
|
196
|
+
},
|
197
|
+
CB_PLACEMENT_PROP_PLACEMENT: {
|
198
|
+
CB_PLACEMENT_PROP_PLACEMENT_SPEC_COLS: 5,
|
199
|
+
'CB_PLACEMENT_PROP_PLACEMENT_SPEC_COLS:MOBILE': 8,
|
200
|
+
CB_PLACEMENT_PROP_PLACEMENT_SPEC_ROWS: 3,
|
201
|
+
'CB_PLACEMENT_PROP_PLACEMENT_SPEC_ROWS:MOBILE': 4,
|
202
|
+
CB_PLACEMENT_PROP_PLACEMENT_SPEC_STARTX: 1,
|
203
|
+
'CB_PLACEMENT_PROP_PLACEMENT_SPEC_STARTX:MOBILE': 1,
|
204
|
+
CB_PLACEMENT_PROP_PLACEMENT_SPEC_STARTY: 0,
|
205
|
+
'CB_PLACEMENT_PROP_PLACEMENT_SPEC_STARTY:MOBILE': 1,
|
206
|
+
CB_PLACEMENT_PROP_PLACEMENT_SPEC_ZINDEX: 9999,
|
207
|
+
'CB_PLACEMENT_PROP_PLACEMENT_SPEC_ZINDEX:MOBILE': 9999
|
208
|
+
},
|
209
|
+
CB_STYLE_PROP_OPACITY: {
|
210
|
+
CB_STYLE_PROP_OPACITY_SPEC_OPACITY: 100,
|
211
|
+
'CB_STYLE_PROP_OPACITY_SPEC_OPACITY:HOVER': null,
|
212
|
+
'CB_STYLE_PROP_OPACITY_SPEC_OPACITY:MOBILE': null,
|
213
|
+
'CB_STYLE_PROP_OPACITY_SPEC_OPACITY:MOBILE:HOVER': null
|
214
|
+
},
|
215
|
+
CB_STYLE_PROP_TEXT: {
|
216
|
+
CB_STYLE_PROP_TEXT_SPEC_COLOR: '#333333FF',
|
217
|
+
'CB_STYLE_PROP_TEXT_SPEC_COLOR:HOVER': null,
|
218
|
+
'CB_STYLE_PROP_TEXT_SPEC_COLOR:MOBILE': null,
|
219
|
+
'CB_STYLE_PROP_TEXT_SPEC_COLOR:MOBILE:HOVER': null,
|
220
|
+
CB_STYLE_PROP_TEXT_SPEC_HORIZONTAL: 'CENTER',
|
221
|
+
'CB_STYLE_PROP_TEXT_SPEC_HORIZONTAL:HOVER': null,
|
222
|
+
'CB_STYLE_PROP_TEXT_SPEC_HORIZONTAL:MOBILE': null,
|
223
|
+
'CB_STYLE_PROP_TEXT_SPEC_HORIZONTAL:MOBILE:HOVER': null,
|
224
|
+
CB_STYLE_PROP_TEXT_SPEC_LETTERSPACING: 0,
|
225
|
+
'CB_STYLE_PROP_TEXT_SPEC_LETTERSPACING:HOVER': null,
|
226
|
+
'CB_STYLE_PROP_TEXT_SPEC_LETTERSPACING:MOBILE': null,
|
227
|
+
'CB_STYLE_PROP_TEXT_SPEC_LETTERSPACING:MOBILE:HOVER': null,
|
228
|
+
CB_STYLE_PROP_TEXT_SPEC_LINEHEIGHT: 130,
|
229
|
+
'CB_STYLE_PROP_TEXT_SPEC_LINEHEIGHT:HOVER': null,
|
230
|
+
'CB_STYLE_PROP_TEXT_SPEC_LINEHEIGHT:MOBILE': null,
|
231
|
+
'CB_STYLE_PROP_TEXT_SPEC_LINEHEIGHT:MOBILE:HOVER': null,
|
232
|
+
CB_STYLE_PROP_TEXT_SPEC_SIZE: 36,
|
233
|
+
'CB_STYLE_PROP_TEXT_SPEC_SIZE:HOVER': null,
|
234
|
+
'CB_STYLE_PROP_TEXT_SPEC_SIZE:MOBILE': null,
|
235
|
+
'CB_STYLE_PROP_TEXT_SPEC_SIZE:MOBILE:HOVER': null,
|
236
|
+
CB_STYLE_PROP_TEXT_SPEC_TYPEFACE: 'GOOGLE:Source Serif 4',
|
237
|
+
'CB_STYLE_PROP_TEXT_SPEC_TYPEFACE:HOVER': 'GOOGLE:Lobster',
|
238
|
+
'CB_STYLE_PROP_TEXT_SPEC_TYPEFACE:MOBILE': null,
|
239
|
+
'CB_STYLE_PROP_TEXT_SPEC_TYPEFACE:MOBILE:HOVER': null,
|
240
|
+
CB_STYLE_PROP_TEXT_SPEC_VERTICAL: 'MIDDLE',
|
241
|
+
'CB_STYLE_PROP_TEXT_SPEC_VERTICAL:HOVER': null,
|
242
|
+
'CB_STYLE_PROP_TEXT_SPEC_VERTICAL:MOBILE': null,
|
243
|
+
'CB_STYLE_PROP_TEXT_SPEC_VERTICAL:MOBILE:HOVER': null,
|
244
|
+
CB_STYLE_PROP_TEXT_SPEC_WEIGHT: 700,
|
245
|
+
'CB_STYLE_PROP_TEXT_SPEC_WEIGHT:HOVER': null,
|
246
|
+
'CB_STYLE_PROP_TEXT_SPEC_WEIGHT:MOBILE': null,
|
247
|
+
'CB_STYLE_PROP_TEXT_SPEC_WEIGHT:MOBILE:HOVER': null
|
248
|
+
}
|
249
|
+
},
|
250
|
+
minVersion: '2023-08-03',
|
251
|
+
version: '2023-08-03'
|
252
|
+
},
|
253
|
+
queryableDefinitionPreset: 'N/A',
|
254
|
+
queryableTapSrc: 'N/A',
|
255
|
+
updatedAt: '2023-08-06T13:30:49'
|
256
|
+
},
|
140
257
|
{
|
141
258
|
availablePlugins: [],
|
142
259
|
componentBlockCode: 'CB_BTN',
|
@@ -404,17 +404,19 @@ var CustomSection = (0, react_1.forwardRef)(function CustomSection(props, ref) {
|
|
404
404
|
}
|
405
405
|
makeCollisionOfBulk();
|
406
406
|
};
|
407
|
-
var
|
407
|
+
var showSectionHiddenCover = (function () {
|
408
408
|
if (mode === 'EDIT') {
|
409
|
-
var
|
409
|
+
var visibilityKey = device === 'DESKTOP'
|
410
410
|
? 'CB_CONTENT_PROP_VISIBILITY_SPEC_DESKTOP'
|
411
411
|
: 'CB_CONTENT_PROP_VISIBILITY_SPEC_MOBILEWEB';
|
412
|
-
var
|
413
|
-
|
412
|
+
var isSectionVisible = jsonProperties === null || jsonProperties === void 0 ? void 0 : jsonProperties.data.CB_CONTENT_PROP_VISIBILITY[visibilityKey];
|
413
|
+
// 가시성 상태를 반전하여 숨겨진 커버를 표시할지 결정
|
414
|
+
var shouldShowHiddenCover = !isSectionVisible;
|
415
|
+
return shouldShowHiddenCover;
|
414
416
|
}
|
415
417
|
return false;
|
416
418
|
})();
|
417
|
-
return ((0, jsx_runtime_1.jsx)(ErrorBoundary_1.ErrorBoundary, { children: (0, jsx_runtime_1.jsxs)(S_gleStyles, { children: [
|
419
|
+
return ((0, jsx_runtime_1.jsx)(ErrorBoundary_1.ErrorBoundary, { children: (0, jsx_runtime_1.jsxs)(S_gleStyles, { children: [showSectionHiddenCover && (0, jsx_runtime_1.jsx)(S_HiddenCover_1.S_HiddenCover, {}), (0, jsx_runtime_1.jsx)(S_SectionWrapper, __assign({ ref: gleRef, "x-dlayout-section-type": "NO_NAME", onClick: onClickSection }, { children: (0, jsx_runtime_1.jsx)(components_1.CustomSection, __assign({}, props, { isMobile: isMobile, overrideStyles: {
|
418
420
|
minHeight: customSectionStyles.minHeight,
|
419
421
|
paddingTop: padding.top,
|
420
422
|
paddingBottom: padding.bottom,
|
@@ -15,6 +15,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
15
15
|
};
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
17
17
|
var jsx_runtime_1 = require("react/jsx-runtime");
|
18
|
+
/* eslint-disable react/destructuring-assignment */
|
18
19
|
require("react");
|
19
20
|
var newUtils_1 = require("../../newUtils");
|
20
21
|
var types_1 = require("../../types");
|
@@ -23,6 +24,7 @@ var Divider_1 = __importDefault(require("./componentBlocks/Divider/Divider"));
|
|
23
24
|
var Embed_1 = __importDefault(require("./componentBlocks/Embed/Embed"));
|
24
25
|
var Image_1 = __importDefault(require("./componentBlocks/Image/Image"));
|
25
26
|
var RichText_1 = require("./componentBlocks/RichText");
|
27
|
+
var ScrollAnimation_1 = __importDefault(require("./componentBlocks/ScrollAnimation"));
|
26
28
|
var Text_1 = __importDefault(require("./componentBlocks/Text/Text"));
|
27
29
|
var Twitter_1 = __importDefault(require("./componentBlocks/Twitter/Twitter"));
|
28
30
|
var Youtube_1 = require("./componentBlocks/Youtube");
|
@@ -33,8 +35,8 @@ function ComponentBlockMatcher(_a) {
|
|
33
35
|
switch (componentBlockCode) {
|
34
36
|
case types_1.CB_ALL_CODES.CB_BTN:
|
35
37
|
return (0, jsx_runtime_1.jsx)(Button_1.default, __assign({}, propsWithValue, { index: index }));
|
36
|
-
case
|
37
|
-
|
38
|
+
// case CB_ALL_CODES.CB_TEXT:
|
39
|
+
// return <Text {...(propsWithValue as CB_TEXT_PROPERTIES_TYPE)} index={index} />;
|
38
40
|
case types_1.CB_ALL_CODES.CB_RICHTEXT:
|
39
41
|
return (0, jsx_runtime_1.jsx)(RichText_1.RichText, __assign({}, propsWithValue, { index: index }));
|
40
42
|
case types_1.CB_ALL_CODES.CB_DIVIDER:
|
@@ -47,8 +49,42 @@ function ComponentBlockMatcher(_a) {
|
|
47
49
|
return (0, jsx_runtime_1.jsx)(Youtube_1.Youtube, __assign({}, propsWithValue, { index: index }));
|
48
50
|
case types_1.CB_ALL_CODES.CB_EMBED:
|
49
51
|
return (0, jsx_runtime_1.jsx)(Embed_1.default, __assign({}, propsWithValue, { index: index }));
|
52
|
+
case types_1.CB_ALL_CODES.CB_TEXT:
|
53
|
+
return (0, jsx_runtime_1.jsx)(TextPropToAnim, __assign({}, propsWithValue, { index: index }));
|
50
54
|
default:
|
51
55
|
return (0, jsx_runtime_1.jsx)("div", { children: "Error: not supported CB" });
|
52
56
|
}
|
53
57
|
}
|
54
58
|
exports.default = ComponentBlockMatcher;
|
59
|
+
var isValidJSON = function (str) {
|
60
|
+
try {
|
61
|
+
JSON.parse(str);
|
62
|
+
return true;
|
63
|
+
}
|
64
|
+
catch (e) {
|
65
|
+
return false;
|
66
|
+
}
|
67
|
+
};
|
68
|
+
function TextPropToAnim(props) {
|
69
|
+
var isAnim = isValidJSON(props.CB_CONTENT_PROP_TEXT.CB_CONTENT_PROP_TEXT_SPEC_TEXT);
|
70
|
+
if (!isAnim) {
|
71
|
+
return (0, jsx_runtime_1.jsx)(Text_1.default, __assign({}, props));
|
72
|
+
}
|
73
|
+
var json = JSON.parse(props.CB_CONTENT_PROP_TEXT.CB_CONTENT_PROP_TEXT_SPEC_TEXT);
|
74
|
+
var hasAllProp = validateAnimationProps(json);
|
75
|
+
if (!hasAllProp) {
|
76
|
+
return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "MUST HAVE ALL PROPS: scrollId, totalImages, baseURL, type, startShowingImages, endShowingImages," }));
|
77
|
+
}
|
78
|
+
return (0, jsx_runtime_1.jsx)(ScrollAnimation_1.default, __assign({}, json));
|
79
|
+
}
|
80
|
+
var validateAnimationProps = function (json) {
|
81
|
+
var requiredProps = [
|
82
|
+
'scrollId',
|
83
|
+
'totalImages',
|
84
|
+
'baseURL',
|
85
|
+
'type',
|
86
|
+
'startShowingImages',
|
87
|
+
'endShowingImages'
|
88
|
+
];
|
89
|
+
return requiredProps.every(function (prop) { return prop in json; });
|
90
|
+
};
|
@@ -0,0 +1,219 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
3
|
+
__assign = Object.assign || function(t) {
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
5
|
+
s = arguments[i];
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
7
|
+
t[p] = s[p];
|
8
|
+
}
|
9
|
+
return t;
|
10
|
+
};
|
11
|
+
return __assign.apply(this, arguments);
|
12
|
+
};
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
20
|
+
});
|
21
|
+
};
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
24
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
26
|
+
function step(op) {
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
29
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
31
|
+
switch (op[0]) {
|
32
|
+
case 0: case 1: t = op; break;
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
36
|
+
default:
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
41
|
+
if (t[2]) _.ops.pop();
|
42
|
+
_.trys.pop(); continue;
|
43
|
+
}
|
44
|
+
op = body.call(thisArg, _);
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
47
|
+
}
|
48
|
+
};
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
50
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
51
|
+
/* eslint-disable no-await-in-loop */
|
52
|
+
/* eslint-disable no-plusplus */
|
53
|
+
var react_1 = require("react");
|
54
|
+
var AirpodsAnimation = function (_a) {
|
55
|
+
var scrollId = _a.scrollId, totalImages = _a.totalImages, baseURL = _a.baseURL, type = _a.type, startShowingImages = _a.startShowingImages, endShowingImages = _a.endShowingImages;
|
56
|
+
var canvasRef = (0, react_1.useRef)(null);
|
57
|
+
var _b = (0, react_1.useState)([]), images = _b[0], setImages = _b[1];
|
58
|
+
var _c = (0, react_1.useState)(0), loadedImages = _c[0], setLoadedImages = _c[1];
|
59
|
+
var _d = (0, react_1.useState)(0), currentFrameIndex = _d[0], setCurrentFrameIndex = _d[1];
|
60
|
+
var mainBody = (0, react_1.useState)(function () {
|
61
|
+
var box = document.querySelector('.sc-bdfBQB');
|
62
|
+
return box;
|
63
|
+
})[0];
|
64
|
+
(0, react_1.useEffect)(function () {
|
65
|
+
var loadImage = function (i) {
|
66
|
+
return new Promise(function (resolve) {
|
67
|
+
var img = new Image();
|
68
|
+
img.src = "".concat(baseURL, "/").concat(String(i).padStart(4, '0'), ".").concat(type);
|
69
|
+
img.onload = function () { return resolve(img); };
|
70
|
+
});
|
71
|
+
};
|
72
|
+
var loadImages = function () { return __awaiter(void 0, void 0, void 0, function () {
|
73
|
+
var imgs, i, img;
|
74
|
+
return __generator(this, function (_a) {
|
75
|
+
switch (_a.label) {
|
76
|
+
case 0:
|
77
|
+
imgs = [];
|
78
|
+
i = 0;
|
79
|
+
_a.label = 1;
|
80
|
+
case 1:
|
81
|
+
if (!(i < totalImages)) return [3 /*break*/, 4];
|
82
|
+
return [4 /*yield*/, loadImage(i)];
|
83
|
+
case 2:
|
84
|
+
img = _a.sent();
|
85
|
+
imgs.push(img);
|
86
|
+
_a.label = 3;
|
87
|
+
case 3:
|
88
|
+
i++;
|
89
|
+
return [3 /*break*/, 1];
|
90
|
+
case 4:
|
91
|
+
setImages(imgs);
|
92
|
+
return [2 /*return*/];
|
93
|
+
}
|
94
|
+
});
|
95
|
+
}); };
|
96
|
+
loadImages();
|
97
|
+
}, [totalImages, baseURL, type]);
|
98
|
+
(0, react_1.useEffect)(function () {
|
99
|
+
var handleScroll = function () {
|
100
|
+
var scrollTop = mainBody.scrollTop;
|
101
|
+
console.log(scrollId, scrollTop);
|
102
|
+
if (scrollTop < startShowingImages || scrollTop > endShowingImages) {
|
103
|
+
console.log(scrollId, 'frame 0');
|
104
|
+
setCurrentFrameIndex(0); // Reset or handle as needed when out of range
|
105
|
+
return;
|
106
|
+
}
|
107
|
+
var maxScrollTop = endShowingImages - startShowingImages;
|
108
|
+
var scrollFraction = (scrollTop - startShowingImages) / maxScrollTop;
|
109
|
+
console.log({ maxScrollTop: maxScrollTop, scrollTop: scrollTop, startShowingImages: startShowingImages });
|
110
|
+
var frameIndex = Math.min(totalImages - 1, Math.max(0, Math.floor(scrollFraction * totalImages)));
|
111
|
+
setCurrentFrameIndex(frameIndex);
|
112
|
+
console.log(scrollId, "frameis ".concat(frameIndex));
|
113
|
+
handleHeadingAnimationBasedOnScroll();
|
114
|
+
};
|
115
|
+
var handleHeadingAnimationBasedOnScroll = function () {
|
116
|
+
var heading = document.querySelector('h1');
|
117
|
+
var scrollTop = mainBody.scrollTop;
|
118
|
+
var viewportHeight = window.innerHeight;
|
119
|
+
// Calculate opacity based on scroll position
|
120
|
+
var opacity = Math.max(0, 1 - scrollTop / (2 * viewportHeight));
|
121
|
+
// Apply the calculated opacity
|
122
|
+
if (heading) {
|
123
|
+
heading.style.opacity = opacity.toString();
|
124
|
+
}
|
125
|
+
};
|
126
|
+
mainBody.addEventListener('scroll', handleScroll);
|
127
|
+
return function () {
|
128
|
+
mainBody.removeEventListener('scroll', handleScroll);
|
129
|
+
};
|
130
|
+
}, [totalImages, images, startShowingImages, endShowingImages]);
|
131
|
+
(0, react_1.useEffect)(function () {
|
132
|
+
if (images.length === totalImages) {
|
133
|
+
render();
|
134
|
+
}
|
135
|
+
}, [currentFrameIndex, images]);
|
136
|
+
var render = function () {
|
137
|
+
var canvas = canvasRef.current;
|
138
|
+
if (!canvas) {
|
139
|
+
return;
|
140
|
+
}
|
141
|
+
var ctx = canvas.getContext('2d');
|
142
|
+
if (!ctx) {
|
143
|
+
return;
|
144
|
+
}
|
145
|
+
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
146
|
+
var img = images[currentFrameIndex];
|
147
|
+
// const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
|
148
|
+
var scrollTop = mainBody.scrollTop;
|
149
|
+
if (!img || scrollTop < startShowingImages || scrollTop > endShowingImages) {
|
150
|
+
ctx.clearRect(0, 0, canvas.width, canvas.height); // Clear the canvas
|
151
|
+
return;
|
152
|
+
}
|
153
|
+
var canvasRatio = canvas.width / canvas.height;
|
154
|
+
var imgRatio = img.width / img.height;
|
155
|
+
var drawWidth;
|
156
|
+
var drawHeight;
|
157
|
+
var offsetX = 0;
|
158
|
+
var offsetY = 0;
|
159
|
+
if (canvasRatio > imgRatio) {
|
160
|
+
drawWidth = canvas.width;
|
161
|
+
drawHeight = drawWidth / imgRatio;
|
162
|
+
offsetY = (canvas.height - drawHeight) / 2;
|
163
|
+
}
|
164
|
+
else {
|
165
|
+
drawHeight = canvas.height;
|
166
|
+
drawWidth = drawHeight * imgRatio;
|
167
|
+
offsetX = (canvas.width - drawWidth) / 2;
|
168
|
+
}
|
169
|
+
ctx.save();
|
170
|
+
if (totalImages - currentFrameIndex < 10) {
|
171
|
+
ctx.globalAlpha = (totalImages - currentFrameIndex) / 10;
|
172
|
+
}
|
173
|
+
ctx.drawImage(img, offsetX, offsetY, drawWidth, drawHeight);
|
174
|
+
ctx.restore();
|
175
|
+
};
|
176
|
+
return ((0, jsx_runtime_1.jsxs)("div", __assign({ id: "main", style: {
|
177
|
+
width: '100vw',
|
178
|
+
position: 'fixed'
|
179
|
+
/* height: 500vh; */
|
180
|
+
} }, { children: [(0, jsx_runtime_1.jsx)("h1", __assign({ style: {
|
181
|
+
position: 'fixed',
|
182
|
+
top: '50%',
|
183
|
+
width: '100vw',
|
184
|
+
left: '50%',
|
185
|
+
textAlign: 'center',
|
186
|
+
transform: 'translate(-50%, -50%)',
|
187
|
+
fontSize: 'clamp(2rem, 10vw, 13.5rem)'
|
188
|
+
} }, { children: "Airpods Pro" })), (0, jsx_runtime_1.jsx)("canvas", { style: {
|
189
|
+
position: 'fixed',
|
190
|
+
left: '50%',
|
191
|
+
top: '50%',
|
192
|
+
maxHeight: '100vh',
|
193
|
+
maxWidth: '100vw',
|
194
|
+
transform: 'translate(-50%, -50%)'
|
195
|
+
}, ref: canvasRef, width: window.innerWidth, height: window.innerHeight })] })));
|
196
|
+
};
|
197
|
+
// #main {
|
198
|
+
// width: 100vw;
|
199
|
+
// position: fixed;
|
200
|
+
// /* height: 500vh; */
|
201
|
+
// }
|
202
|
+
// canvas {
|
203
|
+
// position: fixed;
|
204
|
+
// left: 50%;
|
205
|
+
// top: 50%;
|
206
|
+
// max-height: 100vh;
|
207
|
+
// max-width: 100vw;
|
208
|
+
// transform: translate(-50%, -50%);
|
209
|
+
// }
|
210
|
+
// h1 {
|
211
|
+
// position: fixed;
|
212
|
+
// top: 50%;
|
213
|
+
// width: 100vw;
|
214
|
+
// left: 50%;
|
215
|
+
// text-align: center;
|
216
|
+
// transform: translate(-50%, -50%);
|
217
|
+
// font-size: clamp(2rem, 10vw, 13.5rem);
|
218
|
+
// }
|
219
|
+
exports.default = AirpodsAnimation;
|
package/package.json
CHANGED
package/release-note.md
CHANGED