neo.mjs 6.18.2 → 6.19.0

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 (108) hide show
  1. package/README.md +28 -214
  2. package/apps/ServiceWorker.mjs +2 -2
  3. package/apps/colors/view/ViewportController.mjs +7 -3
  4. package/apps/portal/data/blog.json +13 -0
  5. package/apps/portal/view/HeaderToolbar.mjs +2 -2
  6. package/apps/portal/view/Viewport.mjs +4 -2
  7. package/apps/portal/view/ViewportController.mjs +89 -8
  8. package/apps/portal/view/blog/Container.mjs +8 -8
  9. package/apps/portal/view/blog/List.mjs +6 -6
  10. package/apps/portal/view/home/MainContainer.mjs +9 -10
  11. package/apps/portal/view/home/parts/BaseContainer.mjs +8 -1
  12. package/apps/portal/view/home/parts/Colors.mjs +4 -4
  13. package/apps/portal/view/home/parts/Helix.mjs +2 -2
  14. package/apps/portal/view/home/parts/How.mjs +3 -3
  15. package/apps/portal/view/home/parts/MainNeo.mjs +6 -7
  16. package/apps/portal/view/home/parts/References.mjs +88 -0
  17. package/apps/portal/view/learn/ContentView.mjs +3 -1
  18. package/apps/portal/view/learn/MainContainer.mjs +3 -2
  19. package/apps/portal/view/learn/MainContainerController.mjs +11 -0
  20. package/apps/portal/view/learn/PageContainer.mjs +5 -3
  21. package/apps/portal/view/services/Component.mjs +73 -0
  22. package/apps/website/data/blog.json +13 -0
  23. package/examples/ServiceWorker.mjs +2 -2
  24. package/examples/component/carousel/MainContainer.mjs +42 -33
  25. package/examples/layout/cube/MainContainer.mjs +217 -0
  26. package/examples/layout/cube/app.mjs +6 -0
  27. package/examples/layout/cube/index.html +11 -0
  28. package/examples/layout/cube/neo-config.json +6 -0
  29. package/package.json +7 -7
  30. package/resources/data/deck/learnneo/pages/2023-10-14T19-25-08-153Z.md +2 -2
  31. package/resources/data/deck/learnneo/pages/ComponentModels.md +6 -6
  32. package/resources/data/deck/learnneo/pages/ComponentsAndContainers.md +10 -10
  33. package/resources/data/deck/learnneo/pages/Config.md +6 -6
  34. package/resources/data/deck/learnneo/pages/CustomComponents.md +4 -4
  35. package/resources/data/deck/learnneo/pages/DescribingTheUI.md +4 -4
  36. package/resources/data/deck/learnneo/pages/Earthquakes-01-goals.md +32 -0
  37. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-01-generate-a-workspace.md +47 -0
  38. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-02-generate-the-starter-app.md +150 -0
  39. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-03-debugging.md +136 -0
  40. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-04-fetch-data.md +146 -0
  41. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-05-refactor-the-table.md +146 -0
  42. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-06-use-a-view-model.md +301 -0
  43. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-07-use-the-google-maps-addon.md +175 -0
  44. package/resources/data/deck/learnneo/pages/Earthquakes-Lab-08-events.md +38 -0
  45. package/resources/data/deck/learnneo/pages/Earthquakes.md +10 -10
  46. package/resources/data/deck/learnneo/pages/Events.md +7 -7
  47. package/resources/data/deck/learnneo/pages/Extending.md +7 -7
  48. package/resources/data/deck/learnneo/pages/Glossary.md +0 -0
  49. package/resources/data/deck/learnneo/pages/GuideEvents.md +97 -19
  50. package/resources/data/deck/learnneo/pages/GuideViewModels.md +21 -21
  51. package/resources/data/deck/learnneo/pages/References.md +8 -8
  52. package/resources/data/deck/learnneo/pages/TestLivePreview.md +5 -4
  53. package/resources/data/deck/learnneo/pages/TodoList.md +9 -9
  54. package/resources/data/deck/learnneo/pages/Welcome.md +3 -3
  55. package/resources/data/deck/learnneo/pages/WhyNeo-Multi-Window.md +2 -2
  56. package/resources/data/deck/learnneo/pages/WhyNeo-Speed.md +2 -2
  57. package/resources/data/deck/learnneo/tree.json +2 -1
  58. package/resources/images/apps/portal/neo-references.png +0 -0
  59. package/resources/scss/src/apps/portal/HeaderToolbar.scss +0 -46
  60. package/resources/scss/src/apps/portal/Viewport.scss +16 -1
  61. package/resources/scss/src/apps/portal/blog/Container.scss +7 -7
  62. package/resources/scss/src/apps/portal/blog/List.scss +20 -16
  63. package/resources/scss/src/apps/portal/home/parts/BaseContainer.scss +33 -4
  64. package/resources/scss/src/apps/portal/home/parts/MainNeo.scss +4 -5
  65. package/resources/scss/src/apps/portal/home/parts/References.scss +46 -0
  66. package/resources/scss/src/apps/portal/learn/ContentTreeList.scss +20 -0
  67. package/resources/scss/src/apps/portal/learn/ContentView.scss +4 -0
  68. package/resources/scss/src/apps/portal/learn/MainContainer.scss +1 -1
  69. package/resources/scss/src/apps/portal/learn/PageContainer.scss +22 -16
  70. package/resources/scss/src/apps/portal/services/Component.scss +20 -0
  71. package/resources/scss/src/{apps/portal/learn → code}/LivePreview.scss +1 -1
  72. package/resources/scss/src/component/Carousel.scss +21 -0
  73. package/resources/scss/src/component/Helix.scss +1 -2
  74. package/resources/scss/src/examples/layout/cube/MainContainer.scss +7 -0
  75. package/resources/scss/src/layout/Cube.scss +80 -0
  76. package/resources/scss/src/tab/Container.scss +10 -10
  77. package/resources/scss/theme-neo-light/apps/portal/blog/Container.scss +3 -0
  78. package/resources/scss/theme-neo-light/form/field/Search.scss +1 -1
  79. package/resources/scss/theme-neo-light/tooltip/Base.scss +1 -1
  80. package/src/DefaultConfig.mjs +2 -2
  81. package/src/Main.mjs +15 -1
  82. package/src/Neo.mjs +14 -3
  83. package/{apps/portal/view/learn → src/code}/LivePreview.mjs +43 -27
  84. package/src/component/Base.mjs +18 -1
  85. package/src/container/Base.mjs +3 -1
  86. package/src/dialog/Base.mjs +1 -2
  87. package/src/layout/Base.mjs +43 -6
  88. package/src/layout/Card.mjs +21 -59
  89. package/src/layout/Cube.mjs +428 -0
  90. package/src/layout/Fit.mjs +9 -38
  91. package/src/layout/Flexbox.mjs +16 -17
  92. package/src/layout/Form.mjs +13 -70
  93. package/src/layout/Grid.mjs +6 -18
  94. package/src/main/addon/ResizeObserver.mjs +18 -2
  95. package/src/main/mixin/DeltaUpdates.mjs +16 -3
  96. package/src/util/Array.mjs +36 -0
  97. package/src/vdom/Helper.mjs +328 -445
  98. package/src/vdom/VNode.mjs +12 -1
  99. package/test/siesta/siesta.js +16 -1
  100. package/test/siesta/tests/VdomCalendar.mjs +2111 -37
  101. package/test/siesta/tests/VdomHelper.mjs +283 -47
  102. package/test/siesta/tests/vdom/Advanced.mjs +367 -0
  103. package/test/siesta/tests/vdom/layout/Cube.mjs +189 -0
  104. package/test/siesta/tests/vdom/table/Container.mjs +133 -0
  105. package/apps/portal/view/home/parts/HelloWorld.mjs +0 -83
  106. package/apps/portal/view/home/preview/PageCodeContainer.mjs +0 -55
  107. package/resources/scss/src/apps/portal/home/preview/PageCodeContainer.scss +0 -115
  108. package/resources/scss/theme-neo-light/apps/portal/learn/ContentTreeList.scss +0 -23
@@ -149,7 +149,9 @@ class Base extends Component {
149
149
  me.items.forEach((item, index) => {
150
150
  oldValue?.removeChildAttributes(item, index);
151
151
  value.applyChildAttributes(item, index)
152
- })
152
+ });
153
+
154
+ oldValue?.destroy()
153
155
  }
154
156
  }
155
157
 
@@ -363,12 +363,11 @@ class Base extends Panel {
363
363
  await me.render(true);
364
364
 
365
365
  let [dialogRect, bodyRect] = await me.getDomRect([me.id, 'document.body']);
366
- console.log(dialogRect, bodyRect);
367
366
 
368
367
  // Move to cover the animation target
369
368
  await Neo.applyDeltas(appName, {
370
369
  id,
371
- style : {
370
+ style: {
372
371
  height: `${rect.height}px`,
373
372
  left : `${rect.left }px`,
374
373
  top : `${rect.top }px`,
@@ -1,4 +1,5 @@
1
1
  import CoreBase from '../core/Base.mjs';
2
+ import NeoArray from '../util/Array.mjs';
2
3
 
3
4
  /**
4
5
  * The base class for all other layouts.
@@ -29,6 +30,12 @@ class Base extends CoreBase {
29
30
  * @protected
30
31
  */
31
32
  containerId: null,
33
+ /**
34
+ * A layout specific CSS selector which gets added to Container the layout is bound to.
35
+ * @member {String|null} containerCls_=null
36
+ * @protected
37
+ */
38
+ containerCls_: null,
32
39
  /**
33
40
  * Identifier for all classes that extend layout.Base
34
41
  * @member {Boolean} isLayout=true
@@ -45,7 +52,10 @@ class Base extends CoreBase {
45
52
  * @returns {Neo.container.Base|null}
46
53
  */
47
54
  get container() {
48
- return Neo.getComponent(this.containerId)
55
+ let {containerId} = this;
56
+
57
+ // the instance might not be registered yet
58
+ return Neo.getComponent(containerId) || Neo.get(containerId)
49
59
  }
50
60
 
51
61
  /**
@@ -67,10 +77,23 @@ class Base extends CoreBase {
67
77
  applyChildAttributes(item, index) {}
68
78
 
69
79
  /**
70
- * Placeholder method
71
80
  * @protected
72
81
  */
73
- applyRenderAttributes() {}
82
+ applyRenderAttributes() {
83
+ let me = this,
84
+ {container, containerCls} = me,
85
+ {wrapperCls} = container;
86
+
87
+ if (containerCls) {
88
+ if (!container) {
89
+ Neo.logError(me.className + ': applyRenderAttributes -> container not yet created', me.containerId)
90
+ }
91
+
92
+ NeoArray.add(wrapperCls, containerCls);
93
+
94
+ container.wrapperCls = wrapperCls
95
+ }
96
+ }
74
97
 
75
98
  /**
76
99
  *
@@ -108,15 +131,29 @@ class Base extends CoreBase {
108
131
  /**
109
132
  * Placeholder method
110
133
  * @param {Neo.component.Base} item
134
+ * @param {Number} index
111
135
  * @protected
112
136
  */
113
- removeChildAttributes(item) {}
137
+ removeChildAttributes(item, index) {}
114
138
 
115
139
  /**
116
- * Placeholder method
117
140
  * @protected
118
141
  */
119
- removeRenderAttributes() {}
142
+ removeRenderAttributes() {
143
+ let me = this,
144
+ {container, containerCls} = me,
145
+ {wrapperCls} = container;
146
+
147
+ if (containerCls) {
148
+ if (!container) {
149
+ Neo.logError(me.className + ': removeRenderAttributes -> container not yet created', me.containerId)
150
+ }
151
+
152
+ NeoArray.remove(wrapperCls, containerCls);
153
+
154
+ container.wrapperCls = wrapperCls
155
+ }
156
+ }
120
157
  }
121
158
 
122
159
  Neo.setupClass(Base);
@@ -49,6 +49,11 @@ class Card extends Base {
49
49
  * @member {Number} activeIndex_=0
50
50
  */
51
51
  activeIndex_: 0,
52
+ /**
53
+ * @member {String|null} containerCls='neo-layout-card'
54
+ * @protected
55
+ */
56
+ containerCls: 'neo-layout-card',
52
57
  /*
53
58
  * Remove the DOM of inactive cards.
54
59
  * This will keep the instances & vdom trees
@@ -72,8 +77,7 @@ class Card extends Base {
72
77
  */
73
78
  async afterSetActiveIndex(value, oldValue) {
74
79
  let me = this,
75
- {containerId, removeInactiveCards} = me,
76
- container = Neo.getComponent(containerId) || Neo.get(containerId), // the instance might not be registered yet
80
+ {container, removeInactiveCards} = me,
77
81
  sCfg = me.constructor,
78
82
  needsTransition = me.slideDirection && oldValue !== undefined,
79
83
  needsUpdate = false,
@@ -144,7 +148,7 @@ class Card extends Base {
144
148
  let me = this,
145
149
  isActiveIndex = me.activeIndex === index,
146
150
  sCfg = me.constructor,
147
- childCls = item.wrapperCls,
151
+ childCls = item.wrapperCls || [],
148
152
  {vdom} = item;
149
153
 
150
154
  NeoArray.add(childCls, sCfg.itemCls);
@@ -153,29 +157,12 @@ class Card extends Base {
153
157
  if (!keepInDom && me.removeInactiveCards) {
154
158
  vdom.removeDom = !isActiveIndex;
155
159
  item.wrapperCls = childCls;
156
- item.update()
160
+ item.update?.() // can get called for an item config
157
161
  } else {
158
162
  item.wrapperCls = childCls
159
163
  }
160
164
  }
161
165
 
162
- /**
163
- * Applies CSS classes to the container this layout is bound to
164
- */
165
- applyRenderAttributes() {
166
- let me = this,
167
- container = Neo.getComponent(me.containerId),
168
- wrapperCls = container?.wrapperCls || [];
169
-
170
- if (!container) {
171
- Neo.logError('layout.Card: applyRenderAttributes -> container not yet created', me.containerId)
172
- }
173
-
174
- NeoArray.add(wrapperCls, 'neo-layout-card');
175
-
176
- container.wrapperCls = wrapperCls
177
- }
178
-
179
166
  /**
180
167
  * Triggered before the slideDirection config gets changed
181
168
  * @param {String} value
@@ -194,14 +181,11 @@ class Card extends Base {
194
181
  * @returns {Neo.component.Base}
195
182
  */
196
183
  async loadModule(item, index) {
197
- let me = this,
198
- {containerId} = me,
199
- container = Neo.getComponent(containerId) || Neo.get(containerId), // the instance might not be registered yet
200
- items = container.items,
201
- sCfg = me.constructor,
202
- {vdom} = container,
203
- {module} = item,
204
- proto, wrapperCls;
184
+ let me = this,
185
+ {container} = me,
186
+ items = container.items,
187
+ {module} = item,
188
+ proto;
205
189
 
206
190
  if (!Neo.isNumber(index)) {
207
191
  index = items.indexOf(item)
@@ -209,49 +193,27 @@ class Card extends Base {
209
193
 
210
194
  item.isLoading = true; // prevent the item from getting queued multiple times inside form.Container
211
195
 
212
- module = await module();
213
- module = module.default;
214
- proto = module.prototype;
215
- wrapperCls = item.wrapperCls || proto.constructor.config.wrapperCls || [];
196
+ module = await module();
197
+ module = module.default;
198
+ proto = module.prototype;
199
+
200
+ item.className = proto.className;
201
+ item.module = module;
216
202
 
217
- item.className = proto.className;
218
- item.wrapperCls = [...wrapperCls, sCfg.itemCls];
219
- item.module = module;
203
+ me.applyChildAttributes(item, index);
220
204
 
221
205
  delete item.isLoading;
222
206
  delete item.vdom;
223
207
 
224
208
  items[index] = item = Neo.create(item);
225
209
 
226
- if (me.removeInactiveCards) {
227
- item.vdom.removeDom = true
228
- }
210
+ container.getVdomItemsRoot().cn[index] = item.vdom;
229
211
 
230
212
  container.fire('cardLoaded', {item});
231
213
 
232
- vdom.cn[index] = item.vdom;
233
-
234
214
  return item
235
215
  }
236
216
 
237
- /**
238
- * Removes all CSS rules from the container this layout is bound to.
239
- * Gets called when switching to a different layout.
240
- */
241
- removeRenderAttributes() {
242
- let me = this,
243
- container = Neo.getComponent(me.containerId),
244
- wrapperCls = container?.wrapperCls || [];
245
-
246
- if (!container) {
247
- Neo.logError('layout.Card: removeRenderAttributes -> container not yet created', me.containerId)
248
- }
249
-
250
- NeoArray.remove(wrapperCls, 'neo-layout-card');
251
-
252
- container.wrapperCls = wrapperCls
253
- }
254
-
255
217
  /**
256
218
  * @param {Number} index
257
219
  * @param {Number} oldIndex
@@ -0,0 +1,428 @@
1
+ import Card from './Card.mjs';
2
+ import NeoArray from '../util/Array.mjs';
3
+
4
+ const configSymbol = Symbol.for('configSymbol');
5
+
6
+ /**
7
+ * See: examples/layout.Cube for a demo.
8
+ * Strongly inspired by https://www.mobzystems.com/code/3d-css-and-custom-properties/
9
+ * @class Neo.layout.Cube
10
+ * @extends Neo.layout.Card
11
+ */
12
+ class Cube extends Card {
13
+ /**
14
+ * @member {Object} faces
15
+ * @static
16
+ */
17
+ static faces = {
18
+ front : [ 0, 0, 0],
19
+ back : [ 0, 180, 0],
20
+ left : [ 0, 90, 0],
21
+ right : [ 0, 270, 0],
22
+ top : [270, 0, 0],
23
+ bottom: [ 90, 0, 0]
24
+ }
25
+
26
+ static config = {
27
+ /**
28
+ * @member {String} className='Neo.layout.Cube'
29
+ * @protected
30
+ */
31
+ className: 'Neo.layout.Cube',
32
+ /**
33
+ * @member {String} ntype='layout-cube'
34
+ * @protected
35
+ */
36
+ ntype: 'layout-cube',
37
+ /**
38
+ * @member {String|null} activeFace_=null
39
+ */
40
+ activeFace_: null,
41
+ /**
42
+ * @member {Number|null} activeIndex=null
43
+ */
44
+ activeIndex: null,
45
+ /**
46
+ * @member {String|null} containerCls='neo-layout-fit'
47
+ * @protected
48
+ */
49
+ containerCls: 'neo-layout-cube',
50
+ /**
51
+ * Updates the cube size to fit the owner container dimensions
52
+ * @member {Boolean} fitContainer_=false
53
+ */
54
+ fitContainer_: false,
55
+ /**
56
+ * Important for dynamically switching from a cube to a card layout
57
+ * @member {Boolean} hideInactiveCardsOnDestroy=false
58
+ */
59
+ hideInactiveCardsOnDestroy: false,
60
+ /**
61
+ * @member {Number} perspective_=600
62
+ */
63
+ perspective_: 600,
64
+ /**
65
+ * @member {Number} rotateX_=0
66
+ */
67
+ rotateX_: 0,
68
+ /**
69
+ * @member {Number} rotateY_=0
70
+ */
71
+ rotateY_: 0,
72
+ /**
73
+ * @member {Number} rotateZ_=0
74
+ */
75
+ rotateZ_: 0,
76
+ /**
77
+ * @member {Number} sideX_=300
78
+ */
79
+ sideX_: 300,
80
+ /**
81
+ * @member {Number} sideY_=300
82
+ */
83
+ sideY_: 300,
84
+ /**
85
+ * @member {Number} sideZ_=300
86
+ */
87
+ sideZ_: 300
88
+ }
89
+
90
+ /**
91
+ * @member {Function|null} #cachedVdomItemsRoot=null
92
+ * @private
93
+ */
94
+ #cachedVdomItemsRoot = null
95
+
96
+ /**
97
+ * @param {Object} config
98
+ */
99
+ construct(config) {
100
+ super.construct(config);
101
+
102
+ let me = this,
103
+ {container} = me;
104
+
105
+ me.nestVdom();
106
+
107
+ container.mounted && container.update();
108
+
109
+ me.timeout(100).then(() => {
110
+ container.addCls('neo-animate')
111
+ })
112
+ }
113
+
114
+ /**
115
+ * Triggered after the activeFace config got changed
116
+ * @param {String|null} value
117
+ * @param {String|null} oldValue
118
+ * @protected
119
+ */
120
+ afterSetActiveFace(value, oldValue) {
121
+ if (value) {
122
+ this.activeIndex = Object.keys(Cube.faces).indexOf(value)
123
+ }
124
+ }
125
+
126
+ /**
127
+ * Triggered after the activeIndex config got changed
128
+ * @param {Number|null} value
129
+ * @param {Number|null} oldValue
130
+ * @protected
131
+ */
132
+ async afterSetActiveIndex(value, oldValue) {
133
+ if (Neo.isNumber(value)) {
134
+ let me = this,
135
+ {container} = me,
136
+ item = container.items[value];
137
+
138
+ // Since activeFace & activeIndex are optional, we need to clear out default values
139
+ if (!Neo.isNumber(oldValue)) {
140
+ delete me[configSymbol].rotateX;
141
+ delete me[configSymbol].rotateY;
142
+ delete me[configSymbol].rotateZ;
143
+ }
144
+
145
+ if (Neo.typeOf(item.module) === 'Function') {
146
+ await me.loadModule(item, value);
147
+ container.update();
148
+
149
+ await me.timeout(100) // wait for the view to get painted first
150
+ }
151
+
152
+ this.rotateTo(...Object.values(Cube.faces)[value])
153
+ }
154
+ }
155
+
156
+ /**
157
+ * Triggered after the fitContainer config got changed
158
+ * @param {Boolean} value
159
+ * @param {Boolean} oldValue
160
+ * @protected
161
+ */
162
+ afterSetFitContainer(value, oldValue) {
163
+ if (value) {
164
+ let me = this,
165
+ {container} = me;
166
+
167
+ if (container.mounted) {
168
+ me.updateContainerSize()
169
+ } else {
170
+ container.on('mounted', () => {
171
+ me.updateContainerSize()
172
+ })
173
+ }
174
+ }
175
+ }
176
+
177
+ /**
178
+ * Triggered after the perspective config got changed
179
+ * @param {Number} value
180
+ * @param {Number} oldValue
181
+ * @protected
182
+ */
183
+ afterSetPerspective(value, oldValue) {
184
+ this.updateContainerCssVar('--perspective', value + 'px')
185
+ }
186
+
187
+ /**
188
+ * Triggered after the rotateX config got changed
189
+ * @param {Number} value
190
+ * @param {Number} oldValue
191
+ * @protected
192
+ */
193
+ afterSetRotateX(value, oldValue) {
194
+ this.rotateTo(value)
195
+ }
196
+
197
+ /**
198
+ * Triggered after the rotateY config got changed
199
+ * @param {Number} value
200
+ * @param {Number} oldValue
201
+ * @protected
202
+ */
203
+ afterSetRotateY(value, oldValue) {
204
+ this.rotateTo(null, value)
205
+ }
206
+
207
+ /**
208
+ * Triggered after the rotateZ config got changed
209
+ * @param {Number} value
210
+ * @param {Number} oldValue
211
+ * @protected
212
+ */
213
+ afterSetRotateZ(value, oldValue) {
214
+ this.rotateTo(null, null, value)
215
+ }
216
+
217
+ /**
218
+ * Triggered after the sideX config got changed
219
+ * @param {Number} value
220
+ * @param {Number} oldValue
221
+ * @protected
222
+ */
223
+ afterSetSideX(value, oldValue) {
224
+ this.updateContainerCssVar('--side-x', value + 'px')
225
+ }
226
+
227
+ /**
228
+ * Triggered after the sideX config got changed
229
+ * @param {Number} value
230
+ * @param {Number} oldValue
231
+ * @protected
232
+ */
233
+ afterSetSideY(value, oldValue) {
234
+ this.updateContainerCssVar('--side-y', value + 'px')
235
+ }
236
+
237
+ /**
238
+ * Triggered after the sideX config got changed
239
+ * @param {Number} value
240
+ * @param {Number} oldValue
241
+ * @protected
242
+ */
243
+ afterSetSideZ(value, oldValue) {
244
+ this.updateContainerCssVar('--side-z', value + 'px')
245
+ }
246
+
247
+ /**
248
+ * Initially sets the CSS classes of the container items this layout is bound to.
249
+ * @param {Neo.component.Base} item
250
+ * @param {Number} index
251
+ */
252
+ applyChildAttributes(item, index) {
253
+ let {wrapperCls} = item;
254
+
255
+ wrapperCls = NeoArray.union(wrapperCls, 'neo-face', Object.keys(Cube.faces)[index]);
256
+
257
+ switch(index) {
258
+ case 0:
259
+ case 1:
260
+ wrapperCls = NeoArray.union(wrapperCls, 'neo-face-z');
261
+ break;
262
+ case 2:
263
+ case 3:
264
+ wrapperCls = NeoArray.union(wrapperCls, 'neo-face-x');
265
+ break;
266
+ case 4:
267
+ case 5:
268
+ wrapperCls = NeoArray.union(wrapperCls, 'neo-face-y');
269
+ break;
270
+ }
271
+
272
+ item.wrapperCls = wrapperCls
273
+ }
274
+
275
+ /**
276
+ *
277
+ */
278
+ destroy(...args) {
279
+ let me = this,
280
+ {container} = me,
281
+ {style, vdom} = container;
282
+
283
+ Object.assign(style, {
284
+ '--perspective': null,
285
+ '--rot-x' : null,
286
+ '--rot-y' : null,
287
+ '--rot-z' : null,
288
+ '--side-x' : null,
289
+ '--side-y' : null,
290
+ '--side-z' : null
291
+ });
292
+
293
+ container.style = style;
294
+
295
+ vdom.cn = container.getVdomItemsRoot().cn;
296
+
297
+ if (me.hideInactiveCardsOnDestroy) {
298
+ vdom.cn.forEach((item, index) => {
299
+ if (index !== me.activeIndex) {
300
+ item.removeDom = true
301
+ }
302
+ })
303
+ }
304
+
305
+ // override
306
+ container.getVdomItemsRoot = me.#cachedVdomItemsRoot;
307
+
308
+ container.update();
309
+
310
+ super.destroy(...args)
311
+ }
312
+
313
+ nestVdom() {
314
+ let me = this,
315
+ {container} = me,
316
+ {vdom} = container,
317
+ {cn} = vdom;
318
+
319
+ vdom.cn = [
320
+ {cls: ['neo-plane'], cn: [
321
+ {cls: ['neo-box'], cn}
322
+ ]}
323
+ ];
324
+
325
+ // Cache the original method for run-time container layout changes
326
+ me.#cachedVdomItemsRoot = container.getVdomItemsRoot;
327
+
328
+ // Override
329
+ container.getVdomItemsRoot = function() {
330
+ return this.vdom.cn[0].cn[0]
331
+ }
332
+
333
+ me.timeout(50).then(() => {
334
+ // Important when switching from a card layout to this one
335
+ container.vdom.cn[0].cn[0].cn.forEach(node => {
336
+ delete node.removeDom
337
+ });
338
+
339
+ container.update()
340
+ })
341
+ }
342
+
343
+ /**
344
+ * Removes all CSS rules from a container item this layout is bound to.
345
+ * Gets called when switching to a different layout.
346
+ * @param {Neo.component.Base} item
347
+ * @param {Number} index
348
+ * @protected
349
+ */
350
+ removeChildAttributes(item, index) {
351
+ let {wrapperCls} = item;
352
+
353
+ NeoArray.remove(wrapperCls, ['neo-face', Object.keys(Cube.faces)[index]]);
354
+
355
+ switch(index) {
356
+ case 0:
357
+ case 1:
358
+ NeoArray.remove(wrapperCls, 'neo-face-z');
359
+ break;
360
+ case 2:
361
+ case 3:
362
+ NeoArray.remove(wrapperCls, 'neo-face-x');
363
+ break;
364
+ case 4:
365
+ case 5:
366
+ NeoArray.remove(wrapperCls, 'neo-face-y');
367
+ break;
368
+ }
369
+
370
+ item.wrapperCls = wrapperCls
371
+ }
372
+
373
+ /**
374
+ * @protected
375
+ */
376
+ removeRenderAttributes() {
377
+ super.removeRenderAttributes();
378
+ this.container.removeCls('neo-animate')
379
+ }
380
+
381
+ /**
382
+ * @param {Number|null} [x]
383
+ * @param {Number|null} [y]
384
+ * @param {Number|null} [z]
385
+ */
386
+ rotateTo(x, y, z) {
387
+ let me = this,
388
+ {container} = me,
389
+ {style} = container;
390
+
391
+ if (Neo.isNumber(x)) {me._rotateX = x; style['--rot-x'] = x + 'deg'}
392
+ if (Neo.isNumber(y)) {me._rotateY = y; style['--rot-y'] = y + 'deg'}
393
+ if (Neo.isNumber(z)) {me._rotateZ = z; style['--rot-z'] = z + 'deg'}
394
+
395
+ container.style = style
396
+ }
397
+
398
+ /**
399
+ * @param {String} name
400
+ * @param {String} value
401
+ */
402
+ updateContainerCssVar(name, value) {
403
+ let {container} = this,
404
+ {style} = container;
405
+
406
+ style[name] = value;
407
+
408
+ container.style = style
409
+ }
410
+
411
+ /**
412
+ *
413
+ */
414
+ async updateContainerSize() {
415
+ let {container} = this,
416
+ {height, width} = await container.getDomRect(container.id);
417
+
418
+ this.set({
419
+ sideX: width,
420
+ sideY: height,
421
+ sideZ: Math.min(height, width)
422
+ })
423
+ }
424
+ }
425
+
426
+ Neo.setupClass(Cube);
427
+
428
+ export default Cube;