neo.mjs 9.12.0 → 9.13.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.
package/README.md CHANGED
@@ -115,17 +115,17 @@ import Component from '../../src/component/Base.mjs';
115
115
 
116
116
  class MyComponent extends Component {
117
117
  static config = {
118
- className : 'MyComponent',
119
- someProperty_: 'defaultValue',
120
- domListeners : {
118
+ className : 'MyComponent',
119
+ myConfig_ : 'defaultValue',
120
+ domListeners: {
121
121
  click: 'onClick'
122
122
  }
123
123
  }
124
124
 
125
- afterSetSomeProperty(value, oldValue) {
126
- console.log('someProperty changed:', value, oldValue)
125
+ afterSetMyConfig(value, oldValue) {
126
+ console.log('myConfig changed:', value, oldValue)
127
127
  }
128
-
128
+
129
129
  onClick(data) {
130
130
  console.log('Clicked!', data)
131
131
  }
package/ServiceWorker.mjs CHANGED
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='9.12.0'
23
+ * @member {String} version='9.13.0'
24
24
  */
25
- version: '9.12.0'
25
+ version: '9.13.0'
26
26
  }
27
27
 
28
28
  /**
@@ -16,7 +16,7 @@
16
16
  "@type": "Organization",
17
17
  "name": "Neo.mjs"
18
18
  },
19
- "datePublished": "2025-06-11",
19
+ "datePublished": "2025-06-13",
20
20
  "publisher": {
21
21
  "@type": "Organization",
22
22
  "name": "Neo.mjs"
@@ -6,10 +6,10 @@
6
6
  "image" : "json-blueprints.png",
7
7
  "name" : "How JSON Blueprints & Shared Workers Power Next-Gen AI Interfaces",
8
8
  "provider" : "Medium",
9
- "publisher" : "",
9
+ "publisher" : "ITNEXT",
10
10
  "selectedInto": [],
11
11
  "type" : "Blog Post",
12
- "url" : "https://tobiasuhlig.medium.com/the-ui-revolution-how-json-blueprints-shared-workers-power-next-gen-ai-interfaces-60a2bf0fc1dc?source=friends_link&sk=1b0b306285e23bb12f31271dd87bebe5"
12
+ "url" : "https://itnext.io/the-ui-revolution-how-json-blueprints-shared-workers-power-next-gen-ai-interfaces-60a2bf0fc1dc?source=friends_link&sk=1b0b306285e23bb12f31271dd87bebe5"
13
13
  }, {
14
14
  "author" : "Tobias Uhlig",
15
15
  "authorImage" : "author_TobiasUhlig.jpeg",
@@ -107,7 +107,7 @@ class FooterContainer extends Container {
107
107
  }, {
108
108
  module: Component,
109
109
  cls : ['neo-version'],
110
- html : 'v9.12.0'
110
+ html : 'v9.13.0'
111
111
  }]
112
112
  }],
113
113
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name" : "neo.mjs",
3
- "version" : "9.12.0",
3
+ "version" : "9.13.0",
4
4
  "description" : "The webworkers driven UI framework",
5
5
  "type" : "module",
6
6
  "repository" : {
@@ -63,7 +63,7 @@
63
63
  "monaco-editor" : "0.50.0",
64
64
  "neo-jsdoc" : "1.0.1",
65
65
  "neo-jsdoc-x" : "1.0.5",
66
- "postcss" : "^8.5.4",
66
+ "postcss" : "^8.5.5",
67
67
  "sass" : "^1.89.2",
68
68
  "siesta-lite" : "5.5.2",
69
69
  "terser" : "^5.42.0",
@@ -264,12 +264,12 @@ const DefaultConfig = {
264
264
  useVdomWorker: true,
265
265
  /**
266
266
  * buildScripts/injectPackageVersion.mjs will update this value
267
- * @default '9.12.0'
267
+ * @default '9.13.0'
268
268
  * @memberOf! module:Neo
269
269
  * @name config.version
270
270
  * @type String
271
271
  */
272
- version: '9.12.0'
272
+ version: '9.13.0'
273
273
  };
274
274
 
275
275
  Object.assign(DefaultConfig, {
@@ -8,7 +8,6 @@ import NeoArray from '../util/Array.mjs';
8
8
  import Observable from '../core/Observable.mjs';
9
9
  import Rectangle from '../util/Rectangle.mjs';
10
10
  import Style from '../util/Style.mjs';
11
- import Util from '../core/Util.mjs';
12
11
  import VDomUtil from '../util/VDom.mjs';
13
12
  import VNodeUtil from '../util/VNode.mjs';
14
13
 
@@ -517,8 +516,8 @@ class Component extends Base {
517
516
  * @returns {Object} all styles of this.el
518
517
  */
519
518
  addStyle(value) {
520
- if (typeof value === 'string') {
521
- value = Util.createStyleObject(value);
519
+ if (Neo.isString(value)) {
520
+ value = Neo.createStyleObject(value)
522
521
  }
523
522
 
524
523
  // todo: add a check if something has changed
@@ -247,8 +247,8 @@ class Text extends Field {
247
247
  */
248
248
  validator: null,
249
249
  /**
250
- * getVlue can be xssProtected and values are escaped
251
- * @member {Boolean} xssProtected=false
250
+ * get value can be xssProtected and values are escaped
251
+ * @member {Boolean} xssProtected_=false
252
252
  */
253
253
  xssProtected_: false,
254
254
  /**
@@ -1074,6 +1074,10 @@ class Text extends Field {
1074
1074
  })
1075
1075
  }
1076
1076
 
1077
+ me.triggers?.forEach(trigger => {
1078
+ trigger.destroy()
1079
+ })
1080
+
1077
1081
  super.destroy(...args)
1078
1082
  }
1079
1083
 
@@ -177,7 +177,7 @@ class Base extends Component {
177
177
  */
178
178
  onMouseEnter() {
179
179
  this.isHovered = true;
180
- this.hidden = false;
180
+ this.hidden = false
181
181
  }
182
182
 
183
183
  /**
@@ -185,7 +185,7 @@ class Base extends Component {
185
185
  */
186
186
  onMouseLeave() {
187
187
  this.isHovered = false;
188
- this.hidden = true;
188
+ this.hidden = true
189
189
  }
190
190
 
191
191
  /**
@@ -35,42 +35,73 @@ class Helper extends Base {
35
35
  singleton: true
36
36
  }
37
37
 
38
+ /**
39
+ * The following top-level attributes will get converted into styles:
40
+ * height, maxHeight, maxWidth, minHeight, minWidth, width
41
+ *
42
+ * Some tags must not do the transformation, so we add them here.
43
+ * @member {Set} rawDimensionTags
44
+ */
45
+ rawDimensionTags = new Set([
46
+ 'circle',
47
+ 'clipPath',
48
+ 'ellipse',
49
+ 'filter',
50
+ 'foreignObject',
51
+ 'image',
52
+ 'marker',
53
+ 'mask',
54
+ 'pattern',
55
+ 'rect',
56
+ 'svg',
57
+ 'use'
58
+ ])
38
59
  /**
39
60
  * @member {Boolean} returnChildNodeOuterHtml=false
40
61
  */
41
62
  returnChildNodeOuterHtml = false
42
63
  /**
43
64
  * Void attributes inside html tags
44
- * @member {String[]} voidAttributes
65
+ * @member {Set} voidAttributes
45
66
  * @protected
46
67
  */
47
- voidAttributes = [
68
+ voidAttributes = new Set([
48
69
  'checked',
49
- 'required'
50
- ]
70
+ 'defer',
71
+ 'disabled',
72
+ 'ismap',
73
+ 'multiple',
74
+ 'nohref',
75
+ 'noresize',
76
+ 'noshade',
77
+ 'nowrap',
78
+ 'open',
79
+ 'readonly',
80
+ 'required',
81
+ 'reversed',
82
+ 'selected'
83
+ ])
51
84
  /**
52
85
  * Void html tags
53
- * @member {String[]} voidElements
86
+ * @member {Set} voidElements
54
87
  * @protected
55
88
  */
56
- voidElements = [
89
+ voidElements = new Set([
57
90
  'area',
58
91
  'base',
59
92
  'br',
60
93
  'col',
61
- 'command',
62
94
  'embed',
63
95
  'hr',
64
96
  'img',
65
97
  'input',
66
- 'keygen',
67
98
  'link',
68
99
  'meta',
69
100
  'param',
70
101
  'source',
71
102
  'track',
72
103
  'wbr'
73
- ]
104
+ ])
74
105
 
75
106
  /**
76
107
  * Creates a Neo.vdom.VNode tree for the given vdom template.
@@ -117,7 +148,7 @@ class Helper extends Base {
117
148
  * @protected
118
149
  */
119
150
  createCloseTag(vnode) {
120
- return this.voidElements.indexOf(vnode.nodeName) > -1 ? '' : '</' + vnode.nodeName + '>'
151
+ return this.voidElements.has(vnode.nodeName) ? '' : '</' + vnode.nodeName + '>'
121
152
  }
122
153
 
123
154
  /**
@@ -362,7 +393,7 @@ class Helper extends Base {
362
393
  }
363
394
 
364
395
  Object.entries(attributes).forEach(([key, value]) => {
365
- if (this.voidAttributes.includes(key)) {
396
+ if (this.voidAttributes.get(key)) {
366
397
  if (value === 'true') { // vnode attribute values get converted into strings
367
398
  string += ` ${key}`
368
399
  }
@@ -528,8 +559,12 @@ class Helper extends Base {
528
559
  case 'minHeight':
529
560
  case 'minWidth':
530
561
  case 'width':
531
- hasUnit = value != parseInt(value);
532
- node.style[key] = value + (hasUnit ? '' : 'px');
562
+ if (me.rawDimensionTags.get(node.nodeName)) {
563
+ node.attributes[key] = value + ''
564
+ } else {
565
+ hasUnit = value != parseInt(value);
566
+ node.style[key] = value + (hasUnit ? '' : 'px')
567
+ }
533
568
  break
534
569
  case 'componentId':
535
570
  case 'id':