neo.mjs 6.15.4 → 6.15.6

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.
Files changed (67) hide show
  1. package/apps/ServiceWorker.mjs +2 -2
  2. package/apps/form/view/FormContainerController.mjs +1 -1
  3. package/apps/form/view/ViewportController.mjs +2 -2
  4. package/apps/portal/view/home/MainContainer.mjs +2 -2
  5. package/apps/portal/view/learn/ContentView.mjs +1 -1
  6. package/apps/portal/view/learn/LivePreview.mjs +0 -27
  7. package/apps/realworld2/view/user/LoginFormContainer.mjs +1 -1
  8. package/docs/app/view/MainContainer.mjs +1 -11
  9. package/examples/ServiceWorker.mjs +2 -2
  10. package/examples/component/timer/MainContainerController.mjs +2 -2
  11. package/examples/component/toast/MainContainerController.mjs +2 -2
  12. package/examples/date/selectorContainer/MainContainer.mjs +215 -0
  13. package/examples/date/selectorContainer/app.mjs +6 -0
  14. package/examples/date/selectorContainer/index.html +11 -0
  15. package/examples/date/selectorContainer/neo-config.json +6 -0
  16. package/package.json +5 -5
  17. package/resources/data/deck/learnneo/pages/TestLivePreview.md +1 -2
  18. package/resources/data/deck/learnneo/pages/Welcome.md +68 -0
  19. package/resources/data/deck/learnneo/pages/WhyNeo-Multi-Threaded.md +2 -0
  20. package/resources/data/deck/learnneo/pages/WhyNeo-Multi-Window.md +3 -3
  21. package/resources/data/deck/learnneo/pages/WhyNeo-Speed.md +36 -12
  22. package/resources/data/deck/learnneo/tree.json +5 -4
  23. package/resources/scss/src/apps/portal/learn/PageContainer.scss +4 -3
  24. package/resources/scss/src/date/SelectorContainer.scss +120 -0
  25. package/resources/scss/theme-dark/date/SelectorContainer.scss +24 -0
  26. package/resources/scss/theme-light/date/SelectorContainer.scss +24 -0
  27. package/resources/scss/theme-neo-light/date/SelectorContainer.scss +24 -0
  28. package/src/DefaultConfig.mjs +2 -2
  29. package/src/Neo.mjs +5 -5
  30. package/src/component/Base.mjs +1 -1
  31. package/src/container/Base.mjs +42 -17
  32. package/src/controller/Component.mjs +5 -4
  33. package/src/core/Observable.mjs +30 -5
  34. package/src/core/Util.mjs +1 -1
  35. package/src/date/DayViewComponent.mjs +251 -0
  36. package/src/date/SelectorContainer.mjs +352 -0
  37. package/src/date/SelectorContainerModel.mjs +33 -0
  38. package/src/form/Container.mjs +10 -2
  39. package/src/form/field/Base.mjs +10 -2
  40. package/src/form/field/CheckBox.mjs +13 -5
  41. package/src/form/field/ComboBox.mjs +21 -15
  42. package/src/form/field/Date.mjs +2 -2
  43. package/src/form/field/Text.mjs +18 -17
  44. package/src/main/addon/IntersectionObserver.mjs +27 -20
  45. package/src/tab/Container.mjs +56 -55
  46. package/test/components/app.mjs +1 -0
  47. package/test/components/files/component/Base.mjs +88 -0
  48. package/test/components/siesta.js +1 -0
  49. package/docs/app/model/Tutorial.mjs +0 -41
  50. package/docs/app/store/Tutorials.mjs +0 -28
  51. package/docs/app/view/TutorialsTreeList.mjs +0 -51
  52. package/docs/tutorials/01_Concept.html +0 -45
  53. package/docs/tutorials/01_Concept.json +0 -123
  54. package/docs/tutorials/01_Concept.md +0 -55
  55. package/docs/tutorials/02_ClassSystem.html +0 -171
  56. package/docs/tutorials/02_ClassSystem.md +0 -187
  57. package/docs/tutorials/03_ComponentLifecycle.html +0 -28
  58. package/docs/tutorials/03_ComponentLifecycle.md +0 -23
  59. package/docs/tutorials/04_VdomVnode.html +0 -161
  60. package/docs/tutorials/05_RemoteMethodAccess.html +0 -82
  61. package/docs/tutorials/06_EcmaScript6Plus.html +0 -10
  62. package/docs/tutorials/07_WebWorkers.html +0 -9
  63. package/docs/tutorials/08_DomEvents.html +0 -7
  64. package/docs/tutorials/09_TodoList_version1.html +0 -503
  65. package/docs/tutorials/11_CreateApp.html +0 -94
  66. package/docs/tutorials/tutorials.json +0 -100
  67. package/resources/scss/src/apps/docs/TutorialsTreeList.scss +0 -7
@@ -1,4 +1,5 @@
1
1
  {"data": [
2
+ {"name": "Welcome!", "parentId": null, "isLeaf": true, "id": "Welcome" },
2
3
  {"name": "Why Neo.mjs?", "parentId": null, "isLeaf": false, "id": "WhyNeo"},
3
4
  {"name": "Introduction ", "parentId": "WhyNeo", "isLeaf": true, "id": "WhyNeo-Intro"},
4
5
  {"name": "Multi-Threaded", "parentId": "WhyNeo", "isLeaf": true, "id": "WhyNeo-Multi-Threaded"},
@@ -6,7 +7,7 @@
6
7
  {"name": "Quick Application Development", "parentId": "WhyNeo", "isLeaf": true, "id": "WhyNeo-Quick"},
7
8
  {"name": "Multi-Window Applications", "parentId": "WhyNeo", "isLeaf": true, "id": "WhyNeo-Multi-Window"},
8
9
  {"name": "Complexity and Effort", "parentId": "WhyNeo", "isLeaf": true, "id": "WhyNeo-Effort"},
9
- {"name": "Getting Started", "parentId": null, "isLeaf": false, "id": "GettingStarted"},
10
+ {"name": "Getting Started", "parentId": null, "isLeaf": false, "id": "GettingStarted", "collapsed": true},
10
11
  {"name": "Setup", "parentId": "GettingStarted", "isLeaf": true, "id": "Setup", "hidden": false},
11
12
  {"name": "Workspaces and Applications", "parentId": "GettingStarted", "isLeaf": true, "id": "2023-10-14T19-25-08-153Z"},
12
13
  {"name": "Describing a View", "parentId": "GettingStarted", "isLeaf": true, "id": "DescribingTheUI"},
@@ -15,11 +16,11 @@
15
16
  {"name": "Extending Classes", "parentId": "GettingStarted", "isLeaf": true, "id": "Extending"},
16
17
  {"name": "Config", "parentId": "GettingStarted", "isLeaf": true, "id": "Config"},
17
18
  {"name": "Shared Bindable Data", "parentId": "GettingStarted", "isLeaf": true, "id": "ComponentModels"},
18
- {"name": "Tutorials", "parentId": null, "isLeaf": false, "expanded": false, "id": "Tutorials"},
19
+ {"name": "Tutorials", "parentId": null, "isLeaf": false, "expanded": false, "id": "Tutorials", "collapsed": true},
19
20
  {"name": "Rock Scissors Paper", "parentId": "Tutorials", "isLeaf": true, "expanded": false, "id": "RSP", "hidden": true},
20
21
  {"name": "Earthquakes", "parentId": "Tutorials", "isLeaf": true, "expanded": false, "id": "Earthquakes"},
21
22
  {"name": "Todo List", "parentId": "Tutorials", "isLeaf": true, "expanded": false, "id": "TodoList"},
22
- {"name": "Guides", "parentId": null, "isLeaf": false, "expanded": false, "id": "InDepth"},
23
+ {"name": "Guides", "parentId": null, "isLeaf": false, "expanded": false, "id": "InDepth", "collapsed": true},
23
24
  {"name": "Config", "parentId": "InDepth", "isLeaf": false, "id": "Config"},
24
25
  {"name": "Instance Lifecycle", "parentId": "InDepth", "isLeaf": false, "id": "InstanceLifecycle"},
25
26
  {"name": "User Input (Forms)", "parentId": "InDepth", "isLeaf": false, "id": "Forms"},
@@ -40,7 +41,7 @@
40
41
  {"name": "Other JavaScript Class Features", "parentId": "JavaScriptClasses", "isLeaf": true, "id": "2023-10-08T20-20-37-336Z"},
41
42
  {"name": "Super", "parentId": "JavaScriptClasses", "isLeaf": true, "id": "2023-10-08T21-58-25-809Z"},
42
43
  {"name": "New Node", "parentId": "JavaScriptClasses", "isLeaf": true, "id": "2023-10-31T13-59-37-550Z"},
43
- {"name": "Appendix", "parentId": null, "id": "appendix"},
44
+ {"name": "Appendix", "parentId": null, "id": "appendix", "collapsed": true},
44
45
  {"name": "Stylesheet", "parentId": "appendix", "isLeaf": true, "id": "stylesheet"},
45
46
  {"name": "Test", "parentId": "appendix", "isLeaf": true, "id": "TestLivePreview"}
46
47
  ]}
@@ -2,9 +2,10 @@
2
2
  overflow: auto;
3
3
 
4
4
  .content-bottom-toolbar {
5
- gap : 8px;
6
- padding: 0 3rem;
7
- margin-top: 100px;
5
+ gap : 8px;
6
+ padding : 0 3rem;
7
+ margin-bottom: 3rem;
8
+ margin-top : 3rem;
8
9
 
9
10
  .neo-button {
10
11
  flex : 1 !important;
@@ -0,0 +1,120 @@
1
+ .neo-dateselector.neo-container {
2
+ background-color: var(--dateselector-background-color);
3
+ color : var(--dateselector-color);
4
+ font-size : 16px; // todo: em-based once table headers are em based
5
+ font-weight : 400;
6
+ user-select : none;
7
+
8
+ &.neo-hide-inner-borders {
9
+ .neo-day-view {
10
+ .neo-row {
11
+ border: none !important;
12
+
13
+ .neo-cell {
14
+ border: none !important;
15
+ }
16
+ }
17
+ }
18
+ }
19
+
20
+ .neo-header-toolbar {
21
+ background-color: var(--dateselector-header-background-color);
22
+ border : 1px solid var(--dateselector-border-color);
23
+ border-bottom : var(--dateselector-header-border-bottom);
24
+ min-height : 30px;
25
+ }
26
+
27
+ .neo-day-view {
28
+ border : 1px solid var(--dateselector-border-color);
29
+ border-top : var(--dateselector-content-border-top);
30
+ display : flex;
31
+ flex : 1;
32
+ flex-direction: column;
33
+ font-size : 12px;
34
+
35
+ .neo-row {
36
+ border-bottom: 1px solid var(--dateselector-border-color);
37
+ display : flex;
38
+ flex : 1;
39
+
40
+ &.neo-header-row {
41
+ border-bottom: var(--dateselector-header-cell-border-bottom) !important;
42
+ flex : none;
43
+ height : 30px;
44
+
45
+ .neo-cell {
46
+ background-color: var(--dateselector-header-cell-background-color);
47
+ color : var(--dateselector-header-cell-color);
48
+ cursor : default;
49
+ pointer-events : none;
50
+ }
51
+ }
52
+
53
+ &:last-child {
54
+ border-bottom: 0;
55
+ }
56
+
57
+ .neo-cell {
58
+ align-items : center;
59
+ background-color: var(--dateselector-cell-background-color);
60
+ border-right : 1px solid var(--dateselector-border-color);
61
+ color : var(--dateselector-cell-color);
62
+ cursor : pointer;
63
+ display : flex;
64
+ flex : 1;
65
+ padding : 2px;
66
+ justify-content : center;
67
+
68
+ &:focus {
69
+ outline: 0;
70
+ }
71
+
72
+ &:last-child {
73
+ border-right: 0;
74
+ }
75
+
76
+ &.neo-disabled {
77
+ background-color: var(--dateselector-cell-background-color-disabled);
78
+ color : var(--dateselector-cell-color-disabled);
79
+ opacity : var(--dateselector-cell-opacity-disabled);
80
+ }
81
+
82
+ &.neo-disabled {
83
+ cursor : default;
84
+ pointer-events: none;
85
+ }
86
+
87
+ &.neo-selected {
88
+ .neo-cell-content {
89
+ background-color: var(--dateselector-cell-today-border-color);
90
+ border : 1px solid var(--dateselector-header-cell-background-color);
91
+ border-radius : 50%;
92
+ color : var(--dateselector-cell-color-selected);
93
+
94
+ &:before {
95
+ content : '';
96
+ display : inline-block;
97
+ padding-top: 100%;
98
+ }
99
+ }
100
+ }
101
+
102
+ .neo-cell-content {
103
+ align-items : center;
104
+ display : flex;
105
+ flex-basis : 0.1px;
106
+ flex-grow : 0.2;
107
+ justify-content: center;
108
+ min-height : 22px;
109
+ min-width : 22px;
110
+ pointer-events : none;
111
+
112
+ &.neo-today {
113
+ border : 1px solid var(--dateselector-cell-today-border-color);
114
+ border-radius: 50%;
115
+ }
116
+ }
117
+ }
118
+ }
119
+ }
120
+ }
@@ -0,0 +1,24 @@
1
+ :root .neo-theme-dark { // .neo-dateselector
2
+ --dateselector-background-color : #323232;
3
+ --dateselector-border-color : #3c3f41;
4
+ --dateselector-cell-background-color : #323232;
5
+ --dateselector-cell-background-color-disabled: #323232;
6
+ --dateselector-cell-color : #bbb;
7
+ --dateselector-cell-color-disabled : #555;
8
+ --dateselector-cell-color-selected : #fff;
9
+ --dateselector-cell-opacity-disabled : 1;
10
+ --dateselector-cell-today-border-color : #5d83a7;
11
+ --dateselector-color : #bbb;
12
+ --dateselector-content-border-top : none;
13
+ --dateselector-header-background-color : #323232;
14
+ --dateselector-header-border-bottom : none;
15
+ --dateselector-header-cell-background-color : #33343d;
16
+ --dateselector-header-cell-border-bottom : none;
17
+ --dateselector-header-cell-color : #bbb;
18
+ --dateselector-header-month-text-color : #ccc;
19
+ --dateselector-header-year-text-color : #bbb;
20
+ --dateselector-nav-button-background-color : #323232;
21
+ --dateselector-nav-button-color : #bbb;
22
+ --dateselector-nav-button-color-hover : #ddd;
23
+ --dateselector-nav-button-inner-border : none;
24
+ }
@@ -0,0 +1,24 @@
1
+ :root .neo-theme-light { // .neo-dateselector
2
+ --dateselector-background-color : #323232;
3
+ --dateselector-border-color : #ddd;
4
+ --dateselector-cell-background-color : #fff;
5
+ --dateselector-cell-background-color-disabled: #fff;
6
+ --dateselector-cell-color : #000;
7
+ --dateselector-cell-color-disabled : #999;
8
+ --dateselector-cell-color-selected : #fff;
9
+ --dateselector-cell-opacity-disabled : 1;
10
+ --dateselector-cell-today-border-color : #5d83a7;
11
+ --dateselector-color : #000;
12
+ --dateselector-content-border-top : none;
13
+ --dateselector-header-background-color : #fff;
14
+ --dateselector-header-border-bottom : none;
15
+ --dateselector-header-cell-background-color : #5d83a7;
16
+ --dateselector-header-cell-border-bottom : none;
17
+ --dateselector-header-cell-color : #fff;
18
+ --dateselector-header-month-text-color : #000;
19
+ --dateselector-header-year-text-color : #1c60a0;
20
+ --dateselector-nav-button-background-color : #fff;
21
+ --dateselector-nav-button-color : #bbb;
22
+ --dateselector-nav-button-color-hover : #1c60a0;
23
+ --dateselector-nav-button-inner-border : none;
24
+ }
@@ -0,0 +1,24 @@
1
+ :root .neo-theme-neo-light { // .neo-dateselector
2
+ --dateselector-background-color : #323232;
3
+ --dateselector-border-color : #ddd;
4
+ --dateselector-cell-background-color : #fff;
5
+ --dateselector-cell-background-color-disabled: #fff;
6
+ --dateselector-cell-color : #000;
7
+ --dateselector-cell-color-disabled : #999;
8
+ --dateselector-cell-color-selected : #fff;
9
+ --dateselector-cell-opacity-disabled : 1;
10
+ --dateselector-cell-today-border-color : #5d83a7;
11
+ --dateselector-color : #000;
12
+ --dateselector-content-border-top : none;
13
+ --dateselector-header-background-color : #fff;
14
+ --dateselector-header-border-bottom : none;
15
+ --dateselector-header-cell-background-color : #5d83a7;
16
+ --dateselector-header-cell-border-bottom : none;
17
+ --dateselector-header-cell-color : #fff;
18
+ --dateselector-header-month-text-color : #000;
19
+ --dateselector-header-year-text-color : #1c60a0;
20
+ --dateselector-nav-button-background-color : #fff;
21
+ --dateselector-nav-button-color : #bbb;
22
+ --dateselector-nav-button-color-hover : #1c60a0;
23
+ --dateselector-nav-button-inner-border : none;
24
+ }
@@ -260,12 +260,12 @@ const DefaultConfig = {
260
260
  useVdomWorker: true,
261
261
  /**
262
262
  * buildScripts/injectPackageVersion.mjs will update this value
263
- * @default '6.15.4'
263
+ * @default '6.15.6'
264
264
  * @memberOf! module:Neo
265
265
  * @name config.version
266
266
  * @type String
267
267
  */
268
- version: '6.15.4'
268
+ version: '6.15.6'
269
269
  };
270
270
 
271
271
  Object.assign(DefaultConfig, {
package/src/Neo.mjs CHANGED
@@ -635,23 +635,23 @@ function autoGenerateGetSet(proto, key) {
635
635
 
636
636
  if (Array.isArray(value)) {
637
637
  if (key !== 'items') {
638
- value = [...value];
638
+ value = [...value]
639
639
  }
640
640
  } else if (value instanceof Date) {
641
- value = new Date(value.valueOf());
641
+ value = new Date(value.valueOf())
642
642
  }
643
643
 
644
644
  if (hasNewKey) {
645
645
  me[key] = value; // we do want to trigger the setter => beforeSet, afterSet
646
646
  value = me['_' + key]; // return the value parsed by the setter
647
- delete me[configSymbol][key];
647
+ delete me[configSymbol][key]
648
648
  }
649
649
 
650
650
  if (typeof me[beforeGet] === 'function') {
651
- value = me[beforeGet](value);
651
+ value = me[beforeGet](value)
652
652
  }
653
653
 
654
- return value;
654
+ return value
655
655
  },
656
656
 
657
657
  set(value) {
@@ -536,7 +536,7 @@ class Base extends CoreBase {
536
536
  let binding = this.bind?.[key];
537
537
 
538
538
  if (binding?.twoWay) {
539
- this.getModel()?.setData(binding.key, value)
539
+ this.getModel()?.setData(key, value)
540
540
  }
541
541
  }
542
542
  }
@@ -123,7 +123,7 @@ class Base extends Component {
123
123
 
124
124
  if (value && me.items) {
125
125
  me.items.forEach(item => {
126
- if (Neo.isObject(item)) {
126
+ if (!Neo.isString(item)) {
127
127
  item.appName = value
128
128
  }
129
129
  })
@@ -221,7 +221,7 @@ class Base extends Component {
221
221
  let me = this;
222
222
 
223
223
  value && me.items?.forEach(item => {
224
- if (Neo.isObject(item)) {
224
+ if (!Neo.isString(item)) {
225
225
  item.windowId = value
226
226
  }
227
227
  })
@@ -392,18 +392,15 @@ class Base extends Component {
392
392
  * @returns {Neo.layout.Base}
393
393
  */
394
394
  createLayout(value) {
395
- let me = this;
396
-
397
395
  if (value) {
396
+ let me = this,
397
+ {appName, id, windowId} = me;
398
+
398
399
  if (value instanceof LayoutBase && value.isLayout) {
399
- value.appName = me.appName;
400
- value.containerId = me.id;
401
- value.windowId = me.windowId;
400
+ Object.assign(value, {appName, containerId: id, windowId})
402
401
  } else {
403
402
  value = me.parseLayoutClass(value);
404
- value.appName = me.appName;
405
- value.containerId = me.id;
406
- value.windowId = me.windowId;
403
+ Object.assign(value, {appName, containerId: id, windowId});
407
404
  value = Neo.ntype(value)
408
405
  }
409
406
  }
@@ -424,6 +421,38 @@ class Base extends Component {
424
421
  super.destroy(updateParentVdom, silent)
425
422
  }
426
423
 
424
+ /**
425
+ * An alternative for `getReference()` which is useful before a component tree got created.
426
+ * `getReference()` relies on child items being registered inside `manager.Component`,
427
+ * while this method simply walks down the items array.
428
+ *
429
+ * However, classes / modules inside the items tree can not get parsed further.
430
+ * @param {String} reference
431
+ * @param {Object[]} items=this.items
432
+ * @returns {Object|Neo.component.Base|null}
433
+ */
434
+ getItem(reference, items=this.items) {
435
+ let i = 0,
436
+ len = items.length,
437
+ item,
438
+ childItem;
439
+
440
+ for (; i < len; i++) {
441
+ item = items[i];
442
+ if (item.reference === reference) {
443
+ return item
444
+ } else if (item.items) {
445
+ childItem = this.getItem(reference, item.items);
446
+
447
+ if (childItem) {
448
+ return childItem
449
+ }
450
+ }
451
+ }
452
+
453
+ return null
454
+ }
455
+
427
456
  /**
428
457
  * Specify a different vdom items root if needed (useful in case this container uses a wrapper node).
429
458
  * @returns {Object} The new vdom items root
@@ -567,16 +596,12 @@ class Base extends Component {
567
596
  */
568
597
  parseLayoutClass(config) {
569
598
  if (Neo.isObject(config)) {
570
- if (config.ntype.indexOf('layout-') < 0) {
571
- config.ntype = 'layout-' + config.ntype
572
- }
573
- } else if (config.indexOf('layout-') < 0) {
574
- config = {
575
- ntype: 'layout-' + config
599
+ if (!config.ntype.startsWith('layout-')) {
600
+ config.ntype = `layout-${config.ntype}`
576
601
  }
577
602
  } else {
578
603
  config = {
579
- ntype: config
604
+ ntype: config.startsWith('layout-') ? config : `layout-${config}`
580
605
  }
581
606
  }
582
607
 
@@ -71,7 +71,8 @@ class Component extends Base {
71
71
 
72
72
  /**
73
73
  * @param {String} handlerName
74
- * @returns {Neo.controller.Component|null}
74
+ * @param {Neo.component.Base} component
75
+ * @returns {Neo.controller.Component|Boolean|null}
75
76
  */
76
77
  getHandlerScope(handlerName, component) {
77
78
  let me = this,
@@ -83,15 +84,15 @@ class Component extends Base {
83
84
  const handlerCb = component.resolveCallback(handlerName, component);
84
85
 
85
86
  // Handler fn is resolved in the Component or its own parent chain.
86
- // Return a status indicating that we do not need an erly binding
87
+ // Return a status indicating that we do not need an early binding
87
88
  if (handlerCb.fn) {
88
- return true;
89
+ return true
89
90
  }
90
91
  }
91
92
 
92
93
  return Neo.isFunction(me[handlerName]) ?
93
94
  me : parent ?
94
- parent.getHandlerScope(handlerName) : null;
95
+ parent.getHandlerScope(handlerName) : null
95
96
  }
96
97
 
97
98
  /**
@@ -241,12 +241,35 @@ class Observable extends Base {
241
241
  }
242
242
 
243
243
  /**
244
+ * There are different syntax's how you can use this method.
245
+ * Using the eventId:
246
+ * ```
247
+ * this.removeListener('change', 'neo-event-7');
248
+ * ```
249
+ * Passing the handler method:
250
+ * ```
251
+ * this.removeListener('change', this.onChange, this);
252
+ * ```
253
+ * Passing an object:
254
+ * ```
255
+ * me.field.un({
256
+ * change : me.onFieldChange,
257
+ * changeClearToOriginalValue: me.onFieldChange,
258
+ * scope : me
259
+ * });
260
+ * ```
244
261
  * @param {Object|String} name
245
- * @param {String} [eventId]
262
+ * @param {Function|String} [eventId]
263
+ * @param {Neo.core.Base} [scope]
246
264
  */
247
- removeListener(name, eventId) {
265
+ removeListener(name, eventId, scope) {
248
266
  let me = this,
249
- i, len, listener, listeners, match, scope;
267
+ i, len, listener, listeners, match;
268
+
269
+ if (Neo.isFunction(eventId)) {
270
+ me.removeListener({[name]: eventId, scope});
271
+ return
272
+ }
250
273
 
251
274
  if (Neo.isObject(name)) {
252
275
  if (name.scope) {
@@ -316,9 +339,11 @@ class Observable extends Base {
316
339
  fn = fn.slice(3);
317
340
  while (!scope[fn] && (scope = scope.parent));
318
341
  }
319
- fn = scope[fn];
342
+
343
+ fn = scope[fn]
320
344
  }
321
- return { scope, fn };
345
+
346
+ return {fn, scope}
322
347
  }
323
348
 
324
349
  /**
package/src/core/Util.mjs CHANGED
@@ -175,7 +175,7 @@ class Util extends Base {
175
175
  * @returns {Boolean}
176
176
  */
177
177
  static isObject(value) {
178
- return value !== null && typeof value === 'object' && !Array.isArray(value)
178
+ return value?.constructor?.name === 'Object' || false
179
179
  }
180
180
 
181
181
  /**