@nordcraft/runtime 1.0.51 → 1.0.52
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/custom-element.main.esm.js +10 -10
- package/dist/custom-element.main.esm.js.map +2 -2
- package/dist/editor-preview.main.js +31 -3
- package/dist/editor-preview.main.js.map +1 -1
- package/dist/events/handleAction.js +15 -13
- package/dist/events/handleAction.js.map +1 -1
- package/dist/page.main.esm.js +3 -3
- package/dist/page.main.esm.js.map +2 -2
- package/dist/utils/createFormulaCache.js +1 -1
- package/dist/utils/createFormulaCache.js.map +1 -1
- package/dist/utils/storeScrollState.d.ts +2 -0
- package/dist/utils/storeScrollState.js +39 -0
- package/dist/utils/storeScrollState.js.map +1 -0
- package/package.json +3 -3
- package/src/editor-preview.main.ts +54 -9
- package/src/events/handleAction.ts +16 -13
- package/src/utils/createFormulaCache.ts +1 -1
- package/src/utils/storeScrollState.ts +66 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createFormulaCache.js","sourceRoot":"","sources":["../../src/utils/createFormulaCache.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAG3D,MAAM,UAAU,kBAAkB,CAAC,SAAoB;IACrD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,CAAA;IACX,CAAC;IACD,OAAO,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE;QACjD,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO;YAClC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC;YAC7C,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;QACjC,IAAI,UAAe,CAAA;QACnB,IAAI,SAAc,CAAA;QAElB,OAAO;YACL,IAAI;YACJ;gBACE,GAAG,EAAE,CAAC,IAAmB,EAAE,EAAE;oBAC3B,IACE,QAAQ;wBACR,UAAU;wBACV,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;4BACjB,OAAO,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;wBAChD,CAAC,CAAC,EACF,CAAC;wBACD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;oBACvC,CAAC;oBACD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAA;gBACvB,CAAC;gBACD,GAAG,EAAE,CAAC,IAAmB,EAAE,MAAW,EAAE,EAAE;oBACxC,IAAI,QAAQ,EAAE,CAAC;wBACb,UAAU,GAAG,IAAI,CAAA;wBACjB,SAAS,GAAG,MAAM,CAAA;oBACpB,CAAC;gBACH,CAAC;aACF;SACF,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAgB,EAAE,SAAoB;IACnE,MAAM,KAAK,GAAe,EAAE,CAAA;IAC5B,SAAS,cAAc,CAAC,EAAW;QACjC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAM;QACR,CAAC;QACD,IAAI,EAAE,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"createFormulaCache.js","sourceRoot":"","sources":["../../src/utils/createFormulaCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const storeScrollState: (key?: string, querySelector?: string, comparerFn?: (node: Element) => string | null) => (selectorFn: (id: string) => HTMLElement | null) => void;
|
|
2
|
+
export declare const getScrollStateRestorer: (key: string) => (selectorFn: (id: string) => HTMLElement | null) => void;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export const storeScrollState = (key = '', querySelector = '[data-id]', comparerFn = (node) => node.getAttribute('data-id')) => {
|
|
2
|
+
const scrollPositions = {};
|
|
3
|
+
Array.from(document.querySelectorAll(querySelector)).forEach((node) => {
|
|
4
|
+
const nodeId = comparerFn(node);
|
|
5
|
+
if (nodeId && (node.scrollTop || node.scrollLeft)) {
|
|
6
|
+
scrollPositions[nodeId] = {
|
|
7
|
+
y: node.scrollTop,
|
|
8
|
+
x: node.scrollLeft,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
// Always store window scroll position as well
|
|
13
|
+
scrollPositions['__window'] = {
|
|
14
|
+
y: window.scrollY,
|
|
15
|
+
x: window.scrollX,
|
|
16
|
+
};
|
|
17
|
+
sessionStorage.setItem(`scroll-position(${key})`, JSON.stringify(scrollPositions));
|
|
18
|
+
return getScrollStateRestorer(key);
|
|
19
|
+
};
|
|
20
|
+
export const getScrollStateRestorer = (key) => (selectorFn) => {
|
|
21
|
+
const { __window, ...rest } = JSON.parse(sessionStorage.getItem(`scroll-position(${key})`) ?? '{}');
|
|
22
|
+
if (!__window) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
Object.entries(rest).forEach(([nodeId, scrollPosition]) => {
|
|
26
|
+
const domNode = selectorFn(nodeId);
|
|
27
|
+
if (!domNode) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (scrollPosition?.y) {
|
|
31
|
+
domNode.scrollTop = scrollPosition.y;
|
|
32
|
+
}
|
|
33
|
+
if (scrollPosition?.x) {
|
|
34
|
+
domNode.scrollLeft = scrollPosition.x;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
window.scrollTo(__window.x, __window.y);
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=storeScrollState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storeScrollState.js","sourceRoot":"","sources":["../../src/utils/storeScrollState.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,MAAc,EAAE,EAChB,aAAa,GAAG,WAAW,EAC3B,aAAa,CAAC,IAAa,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,EAC5D,EAAE;IACF,MAAM,eAAe,GAAoB,EAAE,CAAA;IAC3C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAc,aAAa,CAAC,CAAC,CAAC,OAAO,CACvE,CAAC,IAAI,EAAE,EAAE;QACP,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;QAC/B,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAClD,eAAe,CAAC,MAAM,CAAC,GAAG;gBACxB,CAAC,EAAE,IAAI,CAAC,SAAS;gBACjB,CAAC,EAAE,IAAI,CAAC,UAAU;aACnB,CAAA;QACH,CAAC;IACH,CAAC,CACF,CAAA;IAED,8CAA8C;IAC9C,eAAe,CAAC,UAAU,CAAC,GAAG;QAC5B,CAAC,EAAE,MAAM,CAAC,OAAO;QACjB,CAAC,EAAE,MAAM,CAAC,OAAO;KAClB,CAAA;IAED,cAAc,CAAC,OAAO,CACpB,mBAAmB,GAAG,GAAG,EACzB,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAChC,CAAA;IAED,OAAO,sBAAsB,CAAC,GAAG,CAAC,CAAA;AACpC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,sBAAsB,GACjC,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,UAA8C,EAAE,EAAE;IAClE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CACtC,cAAc,CAAC,OAAO,CAAC,mBAAmB,GAAG,GAAG,CAAC,IAAI,IAAI,CACvC,CAAA;IACpB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAM;IACR,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,EAAE;QACxD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;QAClC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAM;QACR,CAAC;QAED,IAAI,cAAc,EAAE,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,SAAS,GAAG,cAAc,CAAC,CAAC,CAAA;QACtC,CAAC;QACD,IAAI,cAAc,EAAE,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,UAAU,GAAG,cAAc,CAAC,CAAC,CAAA;QACvC,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;AACzC,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
"type": "module",
|
|
5
5
|
"homepage": "https://github.com/nordcraftengine/nordcraft",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@nordcraft/core": "1.0.
|
|
8
|
-
"@nordcraft/std-lib": "1.0.
|
|
7
|
+
"@nordcraft/core": "1.0.52",
|
|
8
|
+
"@nordcraft/std-lib": "1.0.52",
|
|
9
9
|
"fast-deep-equal": "3.1.3",
|
|
10
10
|
"path-to-regexp": "6.3.0"
|
|
11
11
|
},
|
|
@@ -21,5 +21,5 @@
|
|
|
21
21
|
"files": ["dist", "src"],
|
|
22
22
|
"main": "dist/page.main.js",
|
|
23
23
|
"types": "dist/page.main.d.ts",
|
|
24
|
-
"version": "1.0.
|
|
24
|
+
"version": "1.0.52"
|
|
25
25
|
}
|
|
@@ -3,12 +3,13 @@
|
|
|
3
3
|
/* eslint-disable no-case-declarations */
|
|
4
4
|
/* eslint-disable no-fallthrough */
|
|
5
5
|
import { isLegacyApi } from '@nordcraft/core/dist/api/api'
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
import {
|
|
7
|
+
HeadTagTypes,
|
|
8
|
+
type AnimationKeyframe,
|
|
9
|
+
type Component,
|
|
10
|
+
type ComponentData,
|
|
11
|
+
type MetaEntry,
|
|
12
|
+
type StyleVariant,
|
|
12
13
|
} from '@nordcraft/core/dist/component/component.types'
|
|
13
14
|
import { isPageComponent } from '@nordcraft/core/dist/component/isPageComponent'
|
|
14
15
|
import type {
|
|
@@ -67,6 +68,10 @@ import { createFormulaCache } from './utils/createFormulaCache'
|
|
|
67
68
|
import { getNodeAndAncestors, isNodeOrAncestorConditional } from './utils/nodes'
|
|
68
69
|
import { omitSubnodeStyleForComponent } from './utils/omitStyle'
|
|
69
70
|
import { rectHasPoint } from './utils/rectHasPoint'
|
|
71
|
+
import {
|
|
72
|
+
getScrollStateRestorer,
|
|
73
|
+
storeScrollState,
|
|
74
|
+
} from './utils/storeScrollState'
|
|
70
75
|
|
|
71
76
|
type ToddlePreviewEvent =
|
|
72
77
|
| {
|
|
@@ -159,6 +164,10 @@ type ToddlePreviewEvent =
|
|
|
159
164
|
value: Theme
|
|
160
165
|
}
|
|
161
166
|
}
|
|
167
|
+
| {
|
|
168
|
+
type: 'preview_theme'
|
|
169
|
+
theme: string | null
|
|
170
|
+
}
|
|
162
171
|
|
|
163
172
|
/**
|
|
164
173
|
* Styles required for rendering the same exact text again somewhere else (on a overlay rect in the editor)
|
|
@@ -450,8 +459,16 @@ export const createRoot = (
|
|
|
450
459
|
if (!message.data.component) {
|
|
451
460
|
return
|
|
452
461
|
}
|
|
453
|
-
|
|
462
|
+
let scrollStateRestorer:
|
|
463
|
+
| ReturnType<typeof getScrollStateRestorer>
|
|
464
|
+
| undefined
|
|
465
|
+
|
|
466
|
+
if (message.data.component.name !== component?.name) {
|
|
467
|
+
storeScrollState(component?.name)
|
|
454
468
|
showSignal.cleanSubscribers()
|
|
469
|
+
scrollStateRestorer = getScrollStateRestorer(
|
|
470
|
+
message.data.component.name,
|
|
471
|
+
)
|
|
455
472
|
}
|
|
456
473
|
|
|
457
474
|
component = updateComponentLinks(message.data.component)
|
|
@@ -498,6 +515,12 @@ export const createRoot = (
|
|
|
498
515
|
}
|
|
499
516
|
}
|
|
500
517
|
|
|
518
|
+
requestAnimationFrame(() => {
|
|
519
|
+
scrollStateRestorer?.((nodeId) =>
|
|
520
|
+
document.querySelector(`[data-id="${nodeId}"]`),
|
|
521
|
+
)
|
|
522
|
+
})
|
|
523
|
+
|
|
501
524
|
break
|
|
502
525
|
}
|
|
503
526
|
case 'components': {
|
|
@@ -914,6 +937,9 @@ export const createRoot = (
|
|
|
914
937
|
})
|
|
915
938
|
}
|
|
916
939
|
break
|
|
940
|
+
case undefined:
|
|
941
|
+
// TODO: Handle the case where the drag state is undefined
|
|
942
|
+
break
|
|
917
943
|
}
|
|
918
944
|
break
|
|
919
945
|
case 'keydown':
|
|
@@ -1144,10 +1170,22 @@ export const createRoot = (
|
|
|
1144
1170
|
}
|
|
1145
1171
|
})
|
|
1146
1172
|
break
|
|
1173
|
+
case 'preview_theme': {
|
|
1174
|
+
const { theme } = message.data
|
|
1175
|
+
if (theme) {
|
|
1176
|
+
document.body.setAttribute('data-theme', theme)
|
|
1177
|
+
} else {
|
|
1178
|
+
document.body.removeAttribute('data-theme')
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1147
1181
|
}
|
|
1148
1182
|
},
|
|
1149
1183
|
)
|
|
1150
1184
|
|
|
1185
|
+
window.addEventListener('beforeunload', () => {
|
|
1186
|
+
storeScrollState(component?.name)
|
|
1187
|
+
})
|
|
1188
|
+
|
|
1151
1189
|
const updateStyle = () => {
|
|
1152
1190
|
if (component) {
|
|
1153
1191
|
insertStyles(document.head, component, getAllComponents())
|
|
@@ -1269,6 +1307,7 @@ export const createRoot = (
|
|
|
1269
1307
|
return
|
|
1270
1308
|
}
|
|
1271
1309
|
|
|
1310
|
+
const scrollStateRestorer = storeScrollState()
|
|
1272
1311
|
let { Attributes, Variables, Contexts } = dataSignal.get()
|
|
1273
1312
|
if (
|
|
1274
1313
|
fastDeepEqual(ctx?.component.attributes, _component.attributes) === false
|
|
@@ -1632,6 +1671,9 @@ export const createRoot = (
|
|
|
1632
1671
|
}
|
|
1633
1672
|
|
|
1634
1673
|
ctx = newCtx
|
|
1674
|
+
scrollStateRestorer((nodeId) =>
|
|
1675
|
+
document.querySelector(`[data-id="${nodeId}"]`),
|
|
1676
|
+
)
|
|
1635
1677
|
}
|
|
1636
1678
|
|
|
1637
1679
|
const createContext = (
|
|
@@ -1863,7 +1905,7 @@ const insertHeadTags = (
|
|
|
1863
1905
|
// Skip anything that is not <link> or <script> tags, as they don't have any influence on the preview
|
|
1864
1906
|
Object.entries(entries).forEach(([id, entry]) => {
|
|
1865
1907
|
switch (entry.tag) {
|
|
1866
|
-
case
|
|
1908
|
+
case HeadTagTypes.Link:
|
|
1867
1909
|
return insertOrReplaceHeadNode(
|
|
1868
1910
|
id,
|
|
1869
1911
|
document.createRange().createContextualFragment(`
|
|
@@ -1875,7 +1917,7 @@ const insertHeadTags = (
|
|
|
1875
1917
|
/>
|
|
1876
1918
|
`),
|
|
1877
1919
|
)
|
|
1878
|
-
case
|
|
1920
|
+
case HeadTagTypes.Script:
|
|
1879
1921
|
return insertOrReplaceHeadNode(
|
|
1880
1922
|
id,
|
|
1881
1923
|
document.createRange().createContextualFragment(`
|
|
@@ -1887,6 +1929,9 @@ const insertHeadTags = (
|
|
|
1887
1929
|
></script>
|
|
1888
1930
|
`),
|
|
1889
1931
|
)
|
|
1932
|
+
default:
|
|
1933
|
+
// TODO: handle style meta tags?
|
|
1934
|
+
break
|
|
1890
1935
|
}
|
|
1891
1936
|
})
|
|
1892
1937
|
}
|
|
@@ -442,18 +442,21 @@ export function handleAction(
|
|
|
442
442
|
const args = (action.arguments ?? []).reduce<
|
|
443
443
|
Record<string, unknown>
|
|
444
444
|
>(
|
|
445
|
-
(args, arg) =>
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
445
|
+
(args, arg) =>
|
|
446
|
+
arg
|
|
447
|
+
? {
|
|
448
|
+
...args,
|
|
449
|
+
[arg.name]: applyFormula(arg.formula, {
|
|
450
|
+
data,
|
|
451
|
+
component: ctx.component,
|
|
452
|
+
formulaCache: ctx.formulaCache,
|
|
453
|
+
root: ctx.root,
|
|
454
|
+
package: ctx.package,
|
|
455
|
+
toddle: ctx.toddle,
|
|
456
|
+
env: ctx.env,
|
|
457
|
+
}),
|
|
458
|
+
}
|
|
459
|
+
: args,
|
|
457
460
|
{},
|
|
458
461
|
)
|
|
459
462
|
const result = newAction.handler?.(
|
|
@@ -496,7 +499,7 @@ export function handleAction(
|
|
|
496
499
|
}
|
|
497
500
|
// First evaluate any arguments (input) to the action
|
|
498
501
|
const args = action.arguments?.map((arg) =>
|
|
499
|
-
applyFormula(arg
|
|
502
|
+
applyFormula(arg?.formula, {
|
|
500
503
|
data,
|
|
501
504
|
component: ctx.component,
|
|
502
505
|
formulaCache: ctx.formulaCache,
|
|
@@ -53,7 +53,7 @@ function getFormulaCacheConfig(formula: Formula, component: Component) {
|
|
|
53
53
|
if (!op) {
|
|
54
54
|
return
|
|
55
55
|
}
|
|
56
|
-
if (op.type
|
|
56
|
+
if (op.type === 'path' && op.path[0] !== 'Args') {
|
|
57
57
|
paths.push(op.path)
|
|
58
58
|
}
|
|
59
59
|
if (Array.isArray((op as any)?.arguments)) {
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
interface ScrollPosition {
|
|
2
|
+
x: number
|
|
3
|
+
y: number
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
type ScrollPositionKey = '__window' | string
|
|
7
|
+
|
|
8
|
+
type ScrollPositions = Partial<Record<ScrollPositionKey, ScrollPosition>>
|
|
9
|
+
|
|
10
|
+
export const storeScrollState = (
|
|
11
|
+
key: string = '',
|
|
12
|
+
querySelector = '[data-id]',
|
|
13
|
+
comparerFn = (node: Element) => node.getAttribute('data-id'),
|
|
14
|
+
) => {
|
|
15
|
+
const scrollPositions: ScrollPositions = {}
|
|
16
|
+
Array.from(document.querySelectorAll<HTMLElement>(querySelector)).forEach(
|
|
17
|
+
(node) => {
|
|
18
|
+
const nodeId = comparerFn(node)
|
|
19
|
+
if (nodeId && (node.scrollTop || node.scrollLeft)) {
|
|
20
|
+
scrollPositions[nodeId] = {
|
|
21
|
+
y: node.scrollTop,
|
|
22
|
+
x: node.scrollLeft,
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
// Always store window scroll position as well
|
|
29
|
+
scrollPositions['__window'] = {
|
|
30
|
+
y: window.scrollY,
|
|
31
|
+
x: window.scrollX,
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
sessionStorage.setItem(
|
|
35
|
+
`scroll-position(${key})`,
|
|
36
|
+
JSON.stringify(scrollPositions),
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
return getScrollStateRestorer(key)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export const getScrollStateRestorer =
|
|
43
|
+
(key: string) => (selectorFn: (id: string) => HTMLElement | null) => {
|
|
44
|
+
const { __window, ...rest } = JSON.parse(
|
|
45
|
+
sessionStorage.getItem(`scroll-position(${key})`) ?? '{}',
|
|
46
|
+
) as ScrollPositions
|
|
47
|
+
if (!__window) {
|
|
48
|
+
return
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
Object.entries(rest).forEach(([nodeId, scrollPosition]) => {
|
|
52
|
+
const domNode = selectorFn(nodeId)
|
|
53
|
+
if (!domNode) {
|
|
54
|
+
return
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (scrollPosition?.y) {
|
|
58
|
+
domNode.scrollTop = scrollPosition.y
|
|
59
|
+
}
|
|
60
|
+
if (scrollPosition?.x) {
|
|
61
|
+
domNode.scrollLeft = scrollPosition.x
|
|
62
|
+
}
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
window.scrollTo(__window.x, __window.y)
|
|
66
|
+
}
|