neo.mjs 10.2.1 → 10.3.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 (79) hide show
  1. package/.github/CONCEPT.md +2 -4
  2. package/.github/GETTING_STARTED.md +72 -51
  3. package/.github/RELEASE_NOTES/v10.3.0.md +54 -0
  4. package/.github/epic-string-based-templates.md +690 -0
  5. package/ServiceWorker.mjs +2 -2
  6. package/apps/covid/view/MainContainer.mjs +1 -1
  7. package/apps/covid/view/country/Table.mjs +1 -1
  8. package/apps/portal/index.html +1 -1
  9. package/apps/portal/view/home/FooterContainer.mjs +1 -1
  10. package/apps/portal/view/learn/ContentComponent.mjs +1 -1
  11. package/apps/realworld/api/Base.mjs +2 -2
  12. package/apps/sharedcovid/view/MainContainer.mjs +1 -1
  13. package/apps/sharedcovid/view/MainContainerController.mjs +1 -1
  14. package/buildScripts/buildESModules.mjs +23 -75
  15. package/buildScripts/bundleParse5.mjs +27 -0
  16. package/buildScripts/util/astTemplateProcessor.mjs +210 -0
  17. package/buildScripts/util/templateBuildProcessor.mjs +331 -0
  18. package/buildScripts/util/vdomToString.mjs +46 -0
  19. package/buildScripts/webpack/development/webpack.config.appworker.mjs +11 -0
  20. package/buildScripts/webpack/loader/template-loader.mjs +21 -0
  21. package/buildScripts/webpack/production/webpack.config.appworker.mjs +11 -0
  22. package/examples/README.md +1 -1
  23. package/examples/component/wrapper/googleMaps/MarkerDialog.mjs +2 -2
  24. package/examples/form/field/email/MainContainer.mjs +0 -1
  25. package/examples/form/field/number/MainContainer.mjs +0 -1
  26. package/examples/form/field/picker/MainContainer.mjs +0 -1
  27. package/examples/form/field/time/MainContainer.mjs +0 -1
  28. package/examples/form/field/trigger/copyToClipboard/MainContainer.mjs +0 -1
  29. package/examples/form/field/url/MainContainer.mjs +0 -1
  30. package/examples/functional/nestedTemplateComponent/Component.mjs +100 -0
  31. package/examples/functional/nestedTemplateComponent/MainContainer.mjs +48 -0
  32. package/examples/functional/nestedTemplateComponent/app.mjs +6 -0
  33. package/examples/functional/nestedTemplateComponent/index.html +11 -0
  34. package/examples/functional/nestedTemplateComponent/neo-config.json +6 -0
  35. package/examples/functional/templateComponent/Component.mjs +61 -0
  36. package/examples/functional/templateComponent/MainContainer.mjs +48 -0
  37. package/examples/functional/templateComponent/app.mjs +6 -0
  38. package/examples/functional/templateComponent/index.html +11 -0
  39. package/examples/functional/templateComponent/neo-config.json +6 -0
  40. package/learn/gettingstarted/Setup.md +29 -12
  41. package/learn/guides/fundamentals/ApplicationBootstrap.md +2 -2
  42. package/learn/guides/fundamentals/InstanceLifecycle.md +5 -5
  43. package/learn/guides/uibuildingblocks/HtmlTemplates.md +191 -0
  44. package/learn/guides/uibuildingblocks/HtmlTemplatesUnderTheHood.md +156 -0
  45. package/learn/guides/uibuildingblocks/WorkingWithVDom.md +1 -1
  46. package/learn/tree.json +2 -0
  47. package/package.json +62 -56
  48. package/src/DefaultConfig.mjs +3 -3
  49. package/src/calendar/view/calendars/List.mjs +1 -1
  50. package/src/calendar/view/month/Component.mjs +1 -1
  51. package/src/calendar/view/week/Component.mjs +1 -1
  52. package/src/component/Abstract.mjs +1 -1
  53. package/src/component/Base.mjs +33 -27
  54. package/src/container/Base.mjs +5 -5
  55. package/src/controller/Application.mjs +5 -5
  56. package/src/dialog/Base.mjs +6 -6
  57. package/src/draggable/DragProxyComponent.mjs +4 -4
  58. package/src/form/field/ComboBox.mjs +1 -1
  59. package/src/functional/_export.mjs +2 -1
  60. package/src/functional/component/Base.mjs +142 -93
  61. package/src/functional/util/HtmlTemplateProcessor.mjs +243 -0
  62. package/src/functional/util/html.mjs +24 -67
  63. package/src/list/Base.mjs +2 -2
  64. package/src/manager/Toast.mjs +1 -1
  65. package/src/menu/List.mjs +1 -1
  66. package/src/mixin/VdomLifecycle.mjs +87 -90
  67. package/src/tab/Container.mjs +2 -2
  68. package/src/tooltip/Base.mjs +1 -1
  69. package/src/tree/Accordion.mjs +2 -2
  70. package/src/worker/App.mjs +7 -7
  71. package/test/components/files/component/Base.mjs +1 -1
  72. package/test/siesta/siesta.js +2 -0
  73. package/test/siesta/tests/classic/Button.mjs +5 -5
  74. package/test/siesta/tests/functional/Button.mjs +6 -6
  75. package/test/siesta/tests/functional/HtmlTemplateComponent.mjs +193 -33
  76. package/test/siesta/tests/functional/Parse5Processor.mjs +82 -0
  77. package/test/siesta/tests/vdom/VdomRealWorldUpdates.mjs +5 -5
  78. package/.github/epic-functional-components.md +0 -498
  79. package/.github/ticket-asymmetric-vdom-updates.md +0 -122
package/package.json CHANGED
@@ -1,36 +1,38 @@
1
1
  {
2
- "name" : "neo.mjs",
3
- "version" : "10.2.1",
4
- "description" : "Neo.mjs: The multi-threaded UI framework for building ultra-fast, desktop-like web applications with uncompromised responsiveness, inherent security, and a transpilation-free dev mode.",
5
- "type" : "module",
6
- "repository" : {
2
+ "name": "neo.mjs",
3
+ "version": "10.3.0",
4
+ "description": "Neo.mjs: The multi-threaded UI framework for building ultra-fast, desktop-like web applications with uncompromised responsiveness, inherent security, and a transpilation-free dev mode.",
5
+ "type": "module",
6
+ "repository": {
7
7
  "type": "git",
8
- "url" : "https://github.com/neomjs/neo.git"
8
+ "url": "https://github.com/neomjs/neo.git"
9
9
  },
10
- "bin" : {
10
+ "bin": {
11
11
  "neo-cc": "./buildScripts/createClass.mjs"
12
12
  },
13
- "scripts" : {
14
- "add-config" : "node ./buildScripts/addConfig.mjs",
15
- "add-reactive-tags" : "node ./buildScripts/addReactiveTags.mjs",
16
- "build-all" : "node ./buildScripts/buildAll.mjs -f -n",
17
- "build-all-questions" : "node ./buildScripts/buildAll.mjs -f",
18
- "build-es-modules" : "node ./buildScripts/buildESModules.mjs",
19
- "build-themes" : "node ./buildScripts/buildThemes.mjs -f",
20
- "build-threads" : "node ./buildScripts/webpack/buildThreads.mjs -f",
21
- "check-reactive-tags" : "node ./buildScripts/checkReactiveTags.mjs",
22
- "convert-design-tokens" : "node ./buildScripts/convertDesignTokens.mjs",
23
- "create-app" : "node ./buildScripts/createApp.mjs",
24
- "create-app-minimal" : "node ./buildScripts/createAppMinimal.mjs",
25
- "create-class" : "node ./buildScripts/createClass.mjs",
26
- "create-component" : "node ./buildScripts/createComponent.mjs",
27
- "generate-docs-json" : "node ./buildScripts/docs/jsdocx.mjs",
13
+ "scripts": {
14
+ "add-config": "node ./buildScripts/addConfig.mjs",
15
+ "add-reactive-tags": "node ./buildScripts/addReactiveTags.mjs",
16
+ "build-all": "node ./buildScripts/buildAll.mjs -f -n",
17
+ "build-all-questions": "node ./buildScripts/buildAll.mjs -f",
18
+ "build-dist-esm": "node ./buildScripts/buildESModules.mjs",
19
+ "build-themes": "node ./buildScripts/buildThemes.mjs -f",
20
+ "build-threads": "node ./buildScripts/webpack/buildThreads.mjs -f",
21
+ "bundle-parse5": "node ./buildScripts/bundleParse5.mjs",
22
+ "check-reactive-tags": "node ./buildScripts/checkReactiveTags.mjs",
23
+ "convert-design-tokens": "node ./buildScripts/convertDesignTokens.mjs",
24
+ "create-app": "node ./buildScripts/createApp.mjs",
25
+ "create-app-minimal": "node ./buildScripts/createAppMinimal.mjs",
26
+ "create-class": "node ./buildScripts/createClass.mjs",
27
+ "create-component": "node ./buildScripts/createComponent.mjs",
28
+ "generate-docs-json": "node ./buildScripts/docs/jsdocx.mjs",
28
29
  "inject-package-version": "node ./buildScripts/injectPackageVersion.mjs",
29
- "server-start" : "webpack serve -c ./buildScripts/webpack/webpack.server.config.mjs --open",
30
- "test" : "echo \"Error: no test specified\" && exit 1",
31
- "watch-themes" : "node ./buildScripts/watchThemes.mjs"
30
+ "server-start": "webpack serve -c ./buildScripts/webpack/webpack.server.config.mjs --open",
31
+ "test": "echo \"Error: no test specified\" && exit 1",
32
+ "build-single-file": "node ./buildScripts/buildSingleFile.mjs",
33
+ "watch-themes": "node ./buildScripts/watchThemes.mjs"
32
34
  },
33
- "keywords" : [
35
+ "keywords": [
34
36
  "javascript",
35
37
  "frontend",
36
38
  "framework",
@@ -71,41 +73,45 @@
71
73
  "progressive-web-app",
72
74
  "predictive-caching"
73
75
  ],
74
- "author" : "Tobias Uhlig",
75
- "license" : "MIT",
76
- "bugs" : {
76
+ "author": "Tobias Uhlig",
77
+ "license": "MIT",
78
+ "bugs": {
77
79
  "url": "https://github.com/neomjs/neo/issues"
78
80
  },
79
- "homepage" : "https://neomjs.com/",
81
+ "homepage": "https://neomjs.com/",
80
82
  "devDependencies": {
81
83
  "@fortawesome/fontawesome-free": "^7.0.0",
82
- "autoprefixer" : "^10.4.21",
83
- "chalk" : "^5.4.1",
84
- "clean-webpack-plugin" : "^4.0.0",
85
- "commander" : "^14.0.0",
86
- "cssnano" : "^7.1.0",
87
- "envinfo" : "^7.14.0",
88
- "fs-extra" : "^11.3.0",
89
- "highlightjs-line-numbers.js" : "^2.9.0",
90
- "html-minifier-terser" : "^7.2.0",
91
- "inquirer" : "^12.9.0",
92
- "marked" : "^16.1.1",
93
- "monaco-editor" : "0.50.0",
94
- "neo-jsdoc" : "1.0.1",
95
- "neo-jsdoc-x" : "1.0.5",
96
- "postcss" : "^8.5.6",
97
- "sass" : "^1.89.2",
98
- "siesta-lite" : "5.5.2",
99
- "terser" : "^5.43.1",
100
- "url" : "^0.11.4",
101
- "webpack" : "^5.101.0",
102
- "webpack-cli" : "^6.0.1",
103
- "webpack-dev-server" : "^5.2.2",
104
- "webpack-hook-plugin" : "^1.0.7",
105
- "webpack-node-externals" : "^3.0.0"
84
+ "acorn": "^8.15.0",
85
+ "astring": "^1.9.0",
86
+ "autoprefixer": "^10.4.21",
87
+ "chalk": "^5.4.1",
88
+ "clean-webpack-plugin": "^4.0.0",
89
+ "commander": "^14.0.0",
90
+ "cssnano": "^7.1.0",
91
+ "envinfo": "^7.14.0",
92
+ "esbuild": "^0.25.8",
93
+ "fs-extra": "^11.3.0",
94
+ "highlightjs-line-numbers.js": "^2.9.0",
95
+ "html-minifier-terser": "^7.2.0",
96
+ "inquirer": "^12.9.0",
97
+ "marked": "^16.1.1",
98
+ "monaco-editor": "0.50.0",
99
+ "neo-jsdoc": "1.0.1",
100
+ "neo-jsdoc-x": "1.0.5",
101
+ "parse5": "^8.0.0",
102
+ "postcss": "^8.5.6",
103
+ "sass": "^1.89.2",
104
+ "siesta-lite": "5.5.2",
105
+ "terser": "^5.43.1",
106
+ "url": "^0.11.4",
107
+ "webpack": "^5.101.0",
108
+ "webpack-cli": "^6.0.1",
109
+ "webpack-dev-server": "^5.2.2",
110
+ "webpack-hook-plugin": "^1.0.7",
111
+ "webpack-node-externals": "^3.0.0"
106
112
  },
107
- "funding" : {
113
+ "funding": {
108
114
  "type": "GitHub Sponsors",
109
- "url" : "https://github.com/sponsors/tobiu"
115
+ "url": "https://github.com/sponsors/tobiu"
110
116
  }
111
117
  }
@@ -194,7 +194,7 @@ const DefaultConfig = {
194
194
  unitTestMode: false,
195
195
  /**
196
196
  * When unitTestMode is true, this flag can be enabled to allow VDOM-related
197
- * operations like render() and update() to proceed. This is useful for integration-style
197
+ * operations like initVnode() and update() to proceed. This is useful for integration-style
198
198
  * tests that need to verify component lifecycle and DOM output.
199
199
  * @default false
200
200
  * @memberOf! module:Neo
@@ -299,12 +299,12 @@ const DefaultConfig = {
299
299
  useVdomWorker: true,
300
300
  /**
301
301
  * buildScripts/injectPackageVersion.mjs will update this value
302
- * @default '10.2.1'
302
+ * @default '10.3.0'
303
303
  * @memberOf! module:Neo
304
304
  * @name config.version
305
305
  * @type String
306
306
  */
307
- version: '10.2.1'
307
+ version: '10.3.0'
308
308
  };
309
309
 
310
310
  Object.assign(DefaultConfig, {
@@ -126,7 +126,7 @@ class List extends ComponentList {
126
126
  });
127
127
 
128
128
  if (!mounted) {
129
- editCalendarContainer.render(true)
129
+ editCalendarContainer.initVnode(true)
130
130
  } else {
131
131
  editCalendarContainer.afterSetMounted(true, false)
132
132
  }
@@ -601,7 +601,7 @@ class Component extends BaseComponent {
601
601
  style
602
602
  });
603
603
 
604
- editEventContainer.render(true)
604
+ editEventContainer.initVnode(true)
605
605
  }
606
606
  }
607
607
 
@@ -704,7 +704,7 @@ class Component extends BaseComponent {
704
704
 
705
705
  Object.assign(style, {left: `${eventNode.rect.width + 15}px`, top: eventVdom.style.top});
706
706
  editEventContainer.setSilent({parentId: path[1].id, record, style});
707
- editEventContainer.render(true)
707
+ editEventContainer.initVnode(true)
708
708
  }
709
709
  }
710
710
 
@@ -71,7 +71,7 @@ class Abstract extends Base {
71
71
  */
72
72
  modelData: null,
73
73
  /**
74
- * True after the component render() method was called. Also fires the rendered event.
74
+ * True after the component initVnode() method was called. Also fires the rendered event.
75
75
  * @member {Boolean} mounted_=false
76
76
  * @protected
77
77
  * @reactive
@@ -88,7 +88,7 @@ class Component extends Abstract {
88
88
  */
89
89
  dropZoneConfig: null,
90
90
  /**
91
- * True to render this component into the viewport outside of the document flow
91
+ * True to mount this component into the viewport outside of the document flow
92
92
  * @member {Boolean} floating
93
93
  */
94
94
  floating: false,
@@ -253,6 +253,12 @@ class Component extends Abstract {
253
253
  * @reactive
254
254
  */
255
255
  ui_: null,
256
+ /**
257
+ * True after the component initVnode() method was called. Also fires the vnodeInitialized event.
258
+ * @member {Boolean} vnodeInitialized=false
259
+ * @protected
260
+ */
261
+ vnodeInitialized: false,
256
262
  /**
257
263
  * Shortcut for style.width, defaults to px
258
264
  * @member {Number|String|null} width_=null
@@ -288,24 +294,6 @@ class Component extends Abstract {
288
294
  return this.mounted && !this.hidden && (!this.parent || this.parent.isVisible);
289
295
  }
290
296
 
291
- /**
292
- * True after the component render() method was called. Also fires the rendered event.
293
- * @member {Boolean} rendered=false
294
- * @protected
295
- */
296
- get rendered() {
297
- return this._rendered || false
298
- }
299
- set rendered(value) {
300
- let me = this;
301
-
302
- me._rendered = value;
303
-
304
- if (value === true) {
305
- me.fire('rendered', me.id)
306
- }
307
- }
308
-
309
297
  /**
310
298
  * The setter will handle vdom updates automatically
311
299
  * @member {Object} vdom=this._vdom
@@ -317,6 +305,24 @@ class Component extends Abstract {
317
305
  this.afterSetVdom(value, value)
318
306
  }
319
307
 
308
+ /**
309
+ * True after the component vnodeInitialized() method was called. Also fires the vnodeInitialized event.
310
+ * @member {Boolean} vnodeInitialized=false
311
+ * @protected
312
+ */
313
+ get vnodeInitialized() {
314
+ return this._vnodeInitialized || false
315
+ }
316
+ set vnodeInitialized(value) {
317
+ let me = this;
318
+
319
+ me._vnodeInitialized = value;
320
+
321
+ if (value === true) {
322
+ me.fire('vnodeInitialized', me.id)
323
+ }
324
+ }
325
+
320
326
  /**
321
327
  * Add a new cls to the vdomRoot
322
328
  * @param {String} value
@@ -1365,7 +1371,7 @@ class Component extends Abstract {
1365
1371
  *
1366
1372
  */
1367
1373
  init() {
1368
- this.autoRender && this.render()
1374
+ this.autoInitVnode && this.initVnode()
1369
1375
  }
1370
1376
 
1371
1377
  /**
@@ -1426,21 +1432,21 @@ class Component extends Abstract {
1426
1432
  }
1427
1433
 
1428
1434
  /**
1429
- * Can get called after the component got rendered. See the autoMount config as well.
1435
+ * Can get called after the component got vnodeInitialized. See the autoMount config as well.
1430
1436
  */
1431
1437
  async mount() {
1432
1438
  let me = this,
1433
1439
  child, childIds;
1434
1440
 
1435
1441
  if (!me.vnode) {
1436
- throw new Error('Component vnode must be generated before mounting, use Component.render()');
1442
+ throw new Error('Component vnode must be generated before mounting, use Component.initVnode()');
1437
1443
  }
1438
1444
 
1439
1445
  // In case the component was already mounted, got unmounted and received vdom changes afterwards,
1440
- // a new render() call is mandatory since delta updates could not get applied.
1446
+ // a new initVnode() call is mandatory since delta updates could not get applied.
1441
1447
  // We need to clear the hasUnmountedVdomChanges state for all child components
1442
1448
  if (me.hasUnmountedVdomChanges) {
1443
- // todo: the hasUnmountedVdomChanges flag changes should happen on render
1449
+ // todo: the hasUnmountedVdomChanges flag changes should happen on initVnode
1444
1450
  me.hasUnmountedVdomChanges = false;
1445
1451
 
1446
1452
  childIds = ComponentManager.getChildIds(me.vnode);
@@ -1454,7 +1460,7 @@ class Component extends Abstract {
1454
1460
  });
1455
1461
  // end todo
1456
1462
 
1457
- me.render(true)
1463
+ me.initVnode(true)
1458
1464
  } else {
1459
1465
  await currentWorker.promiseMessage('main', {
1460
1466
  action : 'mountDom',
@@ -1591,7 +1597,7 @@ class Component extends Abstract {
1591
1597
  me.parent.updateDepth = 2;
1592
1598
  me.parent.update()
1593
1599
  } else {
1594
- !me.mounted && me.render(true)
1600
+ !me.mounted && me.initVnode(true)
1595
1601
  }
1596
1602
  } else {
1597
1603
  let style = me.style;
@@ -1659,7 +1665,7 @@ class Component extends Abstract {
1659
1665
  * In case you are sure a DOMRect exists, use getDomRect()
1660
1666
  * Otherwise you can wait for it using this method.
1661
1667
  * @example:
1662
- * await this.render(true);
1668
+ * await this.initVnode(true);
1663
1669
  * await this.waitForDomRect();
1664
1670
  * @param {Object} opts
1665
1671
  * @param {String} opts.appName=this.appName
@@ -102,7 +102,7 @@ class Container extends Component {
102
102
  value : []
103
103
  },
104
104
  /**
105
- * It is crucial to define a layout before the container does get rendered.
105
+ * It is crucial to define a layout before the container does get vdomInitialized.
106
106
  * Meaning: onConstructed() is the latest life-cycle point.
107
107
  * You can use layout: 'base', in case you do not need a layout at all.
108
108
  * @member {Object|String|null} layout_={ntype: 'vbox', align: 'stretch'}
@@ -161,7 +161,7 @@ class Container extends Component {
161
161
  afterSetLayout(value, oldValue) {
162
162
  let me = this;
163
163
 
164
- if (me.rendered) {
164
+ if (me.vnodeInitialized) {
165
165
  oldValue?.removeRenderAttributes();
166
166
  value?.applyRenderAttributes();
167
167
 
@@ -213,12 +213,12 @@ class Container extends Component {
213
213
  }
214
214
 
215
215
  /**
216
- * Triggered after the rendering config got changed
216
+ * Triggered after the vnodeInitializing config got changed
217
217
  * @param {Boolean} value
218
218
  * @param {Boolean} oldValue
219
219
  * @protected
220
220
  */
221
- afterSetRendering(value, oldValue) {
221
+ afterSetIsVnodeInitializing(value, oldValue) {
222
222
  if (oldValue !== undefined) {
223
223
  let {items} = this,
224
224
  i = 0,
@@ -226,7 +226,7 @@ class Container extends Component {
226
226
 
227
227
  for (; i < len; i++) {
228
228
  if (!items[i].vdom.removeDom) {
229
- items[i].rendering = value
229
+ items[i].isVnodeInitializing = value
230
230
  }
231
231
  }
232
232
  }
@@ -47,15 +47,15 @@ class Application extends Base {
47
47
  */
48
48
  parentId: 'document.body',
49
49
  /**
50
- * @member {Boolean} rendered=false
50
+ * @member {Boolean} vnodeInitialising=false
51
51
  * @protected
52
52
  */
53
- rendered: false,
53
+ vnodeInitialising: false,
54
54
  /**
55
- * @member {Boolean} rendering=false
55
+ * @member {Boolean} vnodeInitialized=false
56
56
  * @protected
57
57
  */
58
- rendering: false,
58
+ vnodeInitialized: false,
59
59
  /**
60
60
  * @member {Number|null} windowId=null
61
61
  */
@@ -101,7 +101,7 @@ class Application extends Base {
101
101
  // short delay to ensure changes from onHashChange() got applied
102
102
  await me.timeout(Neo.config.hash ? 200 : 10);
103
103
 
104
- await value.render(true)
104
+ await value.initVnode(true)
105
105
  }
106
106
  }
107
107
 
@@ -39,13 +39,13 @@ class Dialog extends Panel {
39
39
  */
40
40
  animateTargetId_: null,
41
41
  /**
42
- * @member {Boolean} autoMount=true
42
+ * @member {Boolean} autoInitVnode=true
43
43
  */
44
- autoMount: true,
44
+ autoInitVnode: true,
45
45
  /**
46
- * @member {Boolean} autoRender=true
46
+ * @member {Boolean} autoMount=true
47
47
  */
48
- autoRender: true,
48
+ autoMount: true,
49
49
  /**
50
50
  * @member {Boolean} autoShow=true
51
51
  */
@@ -173,7 +173,7 @@ class Dialog extends Panel {
173
173
  */
174
174
  afterSetAnimateTargetId(value, oldValue) {
175
175
  this.autoMount = !value;
176
- this.autoRender = !value
176
+ this.autoInitVnode = !value
177
177
  }
178
178
 
179
179
  /**
@@ -784,7 +784,7 @@ class Dialog extends Panel {
784
784
  me.animateShow()
785
785
  } else {
786
786
  if (!me.mounted) {
787
- me.render(true)
787
+ me.initVnode(true)
788
788
  }
789
789
 
790
790
  me.fire('show')
@@ -17,13 +17,13 @@ class DragProxyComponent extends Base {
17
17
  */
18
18
  ntype: 'dragproxy',
19
19
  /**
20
- * @member {Boolean} autoMount=true
20
+ * @member {Boolean} autoInitVnode=true
21
21
  */
22
- autoMount: true,
22
+ autoInitVnode: true,
23
23
  /**
24
- * @member {Boolean} autoRender=true
24
+ * @member {Boolean} autoMount=true
25
25
  */
26
- autoRender: true,
26
+ autoMount: true,
27
27
  /**
28
28
  * @member {String[]} baseCls=['neo-dragproxy']
29
29
  */
@@ -209,7 +209,7 @@ class ComboBox extends Picker {
209
209
  * @protected
210
210
  */
211
211
  afterSetTypeAhead(value, oldValue) {
212
- this.rendered && this.updateTypeAhead()
212
+ this.vnodeInitialized && this.updateTypeAhead()
213
213
  }
214
214
 
215
215
  /**
@@ -1,6 +1,7 @@
1
1
  import Component from './component/Base.mjs';
2
2
  import defineComponent from './defineComponent.mjs';
3
+ import {html} from './util/html.mjs';
3
4
  import useConfig from './useConfig.mjs';
4
5
  import useEvent from './useEvent.mjs';
5
6
 
6
- export {Component, defineComponent, useConfig, useEvent};
7
+ export {Component, defineComponent, html, useConfig, useEvent};