@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.
@@ -39,7 +39,7 @@ function getFormulaCacheConfig(formula, component) {
39
39
  if (!op) {
40
40
  return;
41
41
  }
42
- if (op.type == 'path' && op.path[0] !== 'Args') {
42
+ if (op.type === 'path' && op.path[0] !== 'Args') {
43
43
  paths.push(op.path);
44
44
  }
45
45
  if (Array.isArray(op?.arguments)) {
@@ -1 +1 @@
1
- {"version":3,"file":"createFormulaCache.js","sourceRoot":"","sources":["../../src/utils/createFormulaCache.ts"],"names":[],"mappings":"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"}
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.51",
8
- "@nordcraft/std-lib": "1.0.51",
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.51"
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 type {
7
- AnimationKeyframe,
8
- Component,
9
- ComponentData,
10
- MetaEntry,
11
- StyleVariant,
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
- if (message.data.component.name != component?.name) {
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 'link':
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 'script':
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
- ...args,
447
- [arg.name]: applyFormula(arg.formula, {
448
- data,
449
- component: ctx.component,
450
- formulaCache: ctx.formulaCache,
451
- root: ctx.root,
452
- package: ctx.package,
453
- toddle: ctx.toddle,
454
- env: ctx.env,
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.formula, {
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 == 'path' && op.path[0] !== 'Args') {
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
+ }