@gxpl/sdk 0.0.17 → 0.0.18

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.
@@ -49,8 +49,10 @@ function useKeyframeValue(item, type, itemParamsGetter, animatorGetter, sectionI
49
49
  (0, react_1.useEffect)(() => {
50
50
  if (!articleRectObserver || !animator)
51
51
  return;
52
- const scroll = articleRectObserver.getSectionScroll(sectionId);
53
- handleKeyframeValue(scroll);
52
+ return articleRectObserver.on('init', () => {
53
+ const scroll = articleRectObserver.getSectionScroll(sectionId);
54
+ handleKeyframeValue(scroll);
55
+ });
54
56
  }, [articleRectObserver, handleKeyframeValue, animator]);
55
57
  (0, react_1.useEffect)(() => {
56
58
  if (!articleRectObserver || !animator)
@@ -59,7 +61,7 @@ function useKeyframeValue(item, type, itemParamsGetter, animatorGetter, sectionI
59
61
  const scroll = articleRectObserver.getSectionScroll(sectionId);
60
62
  handleKeyframeValue(scroll);
61
63
  });
62
- }, [handleKeyframeValue, articleRectObserver, animator]);
64
+ }, [articleRectObserver, handleKeyframeValue, animator]);
63
65
  (0, react_1.useEffect)(() => {
64
66
  if (!articleRectObserver || !animator)
65
67
  return;
@@ -67,6 +69,6 @@ function useKeyframeValue(item, type, itemParamsGetter, animatorGetter, sectionI
67
69
  const scroll = articleRectObserver.getSectionScroll(sectionId);
68
70
  handleKeyframeValue(scroll);
69
71
  });
70
- }, [handleKeyframeValue, articleRectObserver, animator]);
72
+ }, [articleRectObserver, handleKeyframeValue, animator]);
71
73
  return keyframes.length ? adjustedValue : paramValue;
72
74
  }
@@ -11,7 +11,7 @@ const Section_1 = require("./Section/Section");
11
11
  const Item_1 = require("./items/Item");
12
12
  const useArticleRectObserver_1 = require("../utils/ArticleRectManager/useArticleRectObserver");
13
13
  const ArticleRectContext_1 = require("../provider/ArticleRectContext");
14
- const ArticleWrapper_1 = require("./ArticleWrapper");
14
+ const Scene_1 = require("./Scene");
15
15
  const InteractionsContext_1 = require("../provider/InteractionsContext");
16
16
  const WebGLContextManagerContext_1 = require("../provider/WebGLContextManagerContext");
17
17
  const effects_1 = require("@cntrl-site/effects");
@@ -31,7 +31,7 @@ const Article = ({ article, styles, keyframes }) => {
31
31
  });
32
32
  }, [articleRectObserver]);
33
33
  const webglContextManager = (0, react_1.useMemo)(() => new effects_1.WebGLContextManager(), []);
34
- return ((0, jsx_runtime_1.jsx)(ArticleRectContext_1.ArticleRectContext.Provider, { value: articleRectObserver, children: (0, jsx_runtime_1.jsxs)(InteractionsContext_1.InteractionsProvider, { article: article, children: [(0, jsx_runtime_1.jsx)(KeyframesContext_1.KeyframesContext.Provider, { value: keyframesRepo, children: (0, jsx_runtime_1.jsx)(ArticleWrapper_1.ArticleWrapper, { id: article.id, styles: styles, children: (0, jsx_runtime_1.jsx)("div", { className: "article", ref: articleRef, children: (0, jsx_runtime_1.jsx)(WebGLContextManagerContext_1.WebglContextManagerContext.Provider, { value: webglContextManager, children: article.sections.map((section, i) => {
34
+ return ((0, jsx_runtime_1.jsx)(ArticleRectContext_1.ArticleRectContext.Provider, { value: articleRectObserver, children: (0, jsx_runtime_1.jsxs)(InteractionsContext_1.InteractionsProvider, { article: article, children: [(0, jsx_runtime_1.jsx)(KeyframesContext_1.KeyframesContext.Provider, { value: keyframesRepo, children: (0, jsx_runtime_1.jsx)(Scene_1.Scene, { id: article.id, styles: styles, children: (0, jsx_runtime_1.jsx)("div", { className: "article", ref: articleRef, children: (0, jsx_runtime_1.jsx)(WebGLContextManagerContext_1.WebglContextManagerContext.Provider, { value: webglContextManager, children: article.sections.map((section, i) => {
35
35
  const data = {};
36
36
  return ((0, jsx_runtime_1.jsx)(Section_1.Section, { section: section, data: data, children: article.sections[i].items.map(item => ((0, jsx_runtime_1.jsx)(Item_1.Item, { item: item, sectionId: section.id, articleHeight: articleHeight }, item.id))) }, section.id));
37
37
  }) }) }) }) }), (0, jsx_runtime_1.jsx)(style_1.default, { id: id, children: `
@@ -9,5 +9,5 @@ interface Props {
9
9
  startY: number;
10
10
  } | undefined;
11
11
  }
12
- export declare const ArticleWrapper: FC<PropsWithChildren<Props>>;
12
+ export declare const Scene: FC<PropsWithChildren<Props>>;
13
13
  export {};
@@ -1,20 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ArticleWrapper = void 0;
3
+ exports.Scene = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const useLayoutDeviation_1 = require("../common/useLayoutDeviation");
7
7
  const TransitionMachineContext_1 = require("../provider/TransitionMachineContext");
8
- const ArticleWrapper = ({ children, id, styles: sceneStyles }) => {
8
+ const Scene = ({ children, id, styles: sceneStyles }) => {
9
9
  var _a;
10
10
  const { layoutDeviation } = (0, useLayoutDeviation_1.useLayoutDeviation)();
11
11
  const layoutDeviationStyle = { '--layout-deviation': layoutDeviation };
12
12
  const sceneRef = (0, react_1.useRef)(null);
13
13
  const actorRef = TransitionMachineContext_1.TransitionMachineContext.useActorRef();
14
- const { isControlledTransitioning, isSettling, isInstantTransitioning } = TransitionMachineContext_1.TransitionMachineContext.useSelector((state) => ({
14
+ const { isControlledTransitioning, isSettling, isInstantTransitioning, stateValue } = TransitionMachineContext_1.TransitionMachineContext.useSelector((state) => ({
15
15
  isControlledTransitioning: state.matches('transitioning'),
16
16
  isSettling: state.matches('settling'),
17
17
  isInstantTransitioning: state.matches('instant_transitioning'),
18
+ stateValue: state.value
18
19
  }));
19
20
  const type = TransitionMachineContext_1.TransitionMachineContext.useSelector((state) => {
20
21
  const { transition } = state.context;
@@ -136,9 +137,9 @@ const ArticleWrapper = ({ children, id, styles: sceneStyles }) => {
136
137
  }, [isTransitioning, actorRef, id]);
137
138
  const isFixed = isControlledTransitioning || isSettling || isInstantTransitioning;
138
139
  const transitionStyle = type === 'slide' ? 'transform' : 'opacity';
139
- return ((0, jsx_runtime_1.jsx)("div", { ref: sceneRef, className: "article-wrapper", style: Object.assign(Object.assign({}, layoutDeviationStyle), { width: '100vw', height: '100%', position: isFixed ? 'fixed' : 'absolute', transform: `translate3d(${sceneStyles === null || sceneStyles === void 0 ? void 0 : sceneStyles.x}px, ${sceneStyles === null || sceneStyles === void 0 ? void 0 : sceneStyles.y}px, 0)`, transition: isSettling || isInstantTransitioning ? `${transitionStyle} 0.25s ease-out` : 'none', overflowY: isFixed ? 'hidden' : 'auto', opacity: (_a = sceneStyles === null || sceneStyles === void 0 ? void 0 : sceneStyles.opacity) !== null && _a !== void 0 ? _a : 1 }), children: children }));
140
+ return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsx)("div", { ref: sceneRef, className: "article-wrapper", style: Object.assign(Object.assign({}, layoutDeviationStyle), { width: '100vw', height: '100%', position: isFixed ? 'fixed' : 'absolute', transform: `translate3d(${sceneStyles === null || sceneStyles === void 0 ? void 0 : sceneStyles.x}px, ${sceneStyles === null || sceneStyles === void 0 ? void 0 : sceneStyles.y}px, 0)`, transition: isSettling || isInstantTransitioning ? `${transitionStyle} 0.25s ease-out` : 'none', overflowY: isFixed ? 'hidden' : 'scroll', opacity: (_a = sceneStyles === null || sceneStyles === void 0 ? void 0 : sceneStyles.opacity) !== null && _a !== void 0 ? _a : 1 }), children: children }) }));
140
141
  };
141
- exports.ArticleWrapper = ArticleWrapper;
142
+ exports.Scene = Scene;
142
143
  function isTransitionDisabled(transitionReady) {
143
144
  return !transitionReady.north && !transitionReady.east && !transitionReady.south && !transitionReady.west;
144
145
  }
@@ -153,7 +154,7 @@ function canTransition(direction, el) {
153
154
  case 'north':
154
155
  return el.scrollTop === 0;
155
156
  case 'south': {
156
- const isAllowed = el.scrollTop + el.clientHeight >= el.scrollHeight;
157
+ const isAllowed = el.scrollTop + el.clientHeight + 1 >= el.scrollHeight;
157
158
  return isAllowed;
158
159
  }
159
160
  case 'west':
@@ -35,24 +35,24 @@ const Section = ({ section, data, children }) => {
35
35
  transform: media.position === 'fixed' ? 'translateY(-100vh)' : 'unset',
36
36
  height: media.position === 'fixed' ? `calc(${getSectionHeight(height)} + 200vh)` : getSectionHeight(height)
37
37
  }, children: [media.type === 'video' && ((0, jsx_runtime_1.jsx)(SectionVideo_1.SectionVideo, { container: sectionRef.current, sectionId: section.id, media: media })), media.type === 'image' && ((0, jsx_runtime_1.jsx)(SectionImage_1.SectionImage, { media: media, sectionId: section.id }))] }, `section-background-wrapper-${section.id}`) })), children] }), (0, jsx_runtime_1.jsx)(style_1.default, { id: id, children: `
38
- .section-${section.id} {
39
- height: ${getSectionHeight(height)};
40
- position: relative;
41
- display: ${hidden ? 'none' : 'block'};
42
- background-color: ${color_1.CntrlColor.parse(color !== null && color !== void 0 ? color : DEFAULT_COLOR).fmt('rgba')};
43
- }
44
- .section-background-overlay-${section.id} {
45
- height: ${getSectionHeight(height)};
46
- width: 100%;
47
- position: relative;
48
- overflow: clip;
49
- }
50
- .section-background-wrapper-${section.id} {
51
- transform: ${(media === null || media === void 0 ? void 0 : media.position) === 'fixed' ? 'translateY(-100vh)' : 'unset'};
52
- position: relative;
53
- height: ${(media === null || media === void 0 ? void 0 : media.position) === 'fixed' ? `calc(${getSectionHeight(height)} + 200vh)` : getSectionHeight(height)};
54
- width: 100%;
55
- }
38
+ .section-${section.id} {
39
+ height: ${getSectionHeight(height)};
40
+ position: relative;
41
+ display: ${hidden ? 'none' : 'block'};
42
+ background-color: ${color_1.CntrlColor.parse(color !== null && color !== void 0 ? color : DEFAULT_COLOR).fmt('rgba')};
43
+ }
44
+ .section-background-overlay-${section.id} {
45
+ height: ${getSectionHeight(height)};
46
+ width: 100%;
47
+ position: relative;
48
+ overflow: clip;
49
+ }
50
+ .section-background-wrapper-${section.id} {
51
+ transform: ${(media === null || media === void 0 ? void 0 : media.position) === 'fixed' ? 'translateY(-100vh)' : 'unset'};
52
+ position: relative;
53
+ height: ${(media === null || media === void 0 ? void 0 : media.position) === 'fixed' ? `calc(${getSectionHeight(height)} + 200vh)` : getSectionHeight(height)};
54
+ width: 100%;
55
+ }
56
56
  ` })] }));
57
57
  };
58
58
  exports.Section = Section;
@@ -1,5 +1,6 @@
1
1
  import { EventEmitter } from '../EventEmitter';
2
2
  interface EventMap {
3
+ 'init': undefined;
3
4
  'scroll': undefined;
4
5
  'resize': DOMRect;
5
6
  }
@@ -11,6 +12,8 @@ export declare class ArticleRectObserver extends EventEmitter<EventMap> {
11
12
  private animationFrame;
12
13
  private parent;
13
14
  private sectionsScrollMap;
15
+ private previousParentWidth;
16
+ private isInitialized;
14
17
  constructor();
15
18
  get scroll(): number;
16
19
  getSectionScroll(sectionId: string): number;
@@ -9,12 +9,14 @@ const resize_observer_polyfill_1 = __importDefault(require("resize-observer-poly
9
9
  class ArticleRectObserver extends EventEmitter_1.EventEmitter {
10
10
  constructor() {
11
11
  super();
12
- this.articleWidth = 0;
12
+ this.articleWidth = 1;
13
13
  this.registry = new Map();
14
14
  this.scrollPos = window.scrollY;
15
15
  this.animationFrame = NaN;
16
16
  this.parent = undefined;
17
17
  this.sectionsScrollMap = new Map();
18
+ this.previousParentWidth = null;
19
+ this.isInitialized = false;
18
20
  this.handleScroll = (scroll) => {
19
21
  this.setScroll(scroll / this.articleWidth);
20
22
  };
@@ -41,8 +43,17 @@ class ArticleRectObserver extends EventEmitter_1.EventEmitter {
41
43
  }
42
44
  init(parent) {
43
45
  this.parent = parent;
46
+ const scrollableParent = parent.parentElement;
47
+ const parentBoundary = parent.getBoundingClientRect();
48
+ if (!scrollableParent) {
49
+ throw new Error('Scrollable parent not found');
50
+ }
51
+ const articleWidth = parentBoundary.width;
52
+ this.articleWidth = articleWidth;
53
+ this.previousParentWidth = articleWidth;
54
+ this.setScroll(scrollableParent.scrollTop / articleWidth);
44
55
  const onScroll = () => {
45
- this.handleScroll(window.scrollY);
56
+ this.handleScroll(scrollableParent.scrollTop);
46
57
  if (!isNaN(this.animationFrame))
47
58
  return;
48
59
  this.animationFrame = window.requestAnimationFrame(() => {
@@ -50,10 +61,21 @@ class ArticleRectObserver extends EventEmitter_1.EventEmitter {
50
61
  this.emit('scroll', undefined);
51
62
  });
52
63
  };
53
- window.addEventListener('scroll', onScroll);
64
+ scrollableParent.addEventListener('scroll', onScroll);
65
+ for (const sectionId of this.registry.keys()) {
66
+ const el = this.registry.get(sectionId);
67
+ if (!el)
68
+ continue;
69
+ const rect = el.getBoundingClientRect();
70
+ this.sectionsScrollMap.set(sectionId, rect.top - parentBoundary.top);
71
+ }
72
+ this.isInitialized = true;
73
+ this.emit('init', undefined);
54
74
  return () => {
55
75
  this.parent = undefined;
56
- window.removeEventListener('scroll', onScroll);
76
+ this.isInitialized = false;
77
+ this.previousParentWidth = null;
78
+ scrollableParent.removeEventListener('scroll', onScroll);
57
79
  if (!isNaN(this.animationFrame)) {
58
80
  window.cancelAnimationFrame(this.animationFrame);
59
81
  this.animationFrame = NaN;
@@ -72,7 +94,14 @@ class ArticleRectObserver extends EventEmitter_1.EventEmitter {
72
94
  if (!this.parent)
73
95
  return;
74
96
  const parentBoundary = this.parent.getBoundingClientRect();
75
- this.articleWidth = parentBoundary.width;
97
+ const newWidth = parentBoundary.width;
98
+ if (!this.isInitialized || this.previousParentWidth === newWidth) {
99
+ this.articleWidth = newWidth;
100
+ this.previousParentWidth = newWidth;
101
+ return;
102
+ }
103
+ this.articleWidth = newWidth;
104
+ this.previousParentWidth = newWidth;
76
105
  this.setScroll(window.scrollY / this.articleWidth);
77
106
  this.emit('resize', parentBoundary);
78
107
  for (const sectionId of this.registry.keys()) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gxpl/sdk",
3
- "version": "0.0.17",
3
+ "version": "0.0.18",
4
4
  "description": "Generic SDK for use in public websites.",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",