neo.mjs 4.2.6 → 4.2.7

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.
@@ -94,22 +94,20 @@ class MainContainer extends ConfigurationViewport {
94
94
 
95
95
  createExampleComponent() {
96
96
  return Neo.create({
97
- iconCls: 'fa fa-home',
98
- module : Button,
99
- text : 'Hello World',
97
+ height : 50,
98
+ iconCls : 'fa fa-home',
99
+ module : Button,
100
+ text : 'Hello World',
101
+ useRippleEffect: true,
102
+ width : 150,
103
+
104
+ handler: (data) => {
105
+ console.log('button click =>', data.component.id);
106
+ }
100
107
 
101
108
  /*tooltips: [{
102
109
  text: 'Hello World Tooltip'
103
- }],*/
104
-
105
- domListeners: {
106
- click: {
107
- fn: (data) => {
108
- let button = Neo.getComponent(data.target.id);
109
- console.log('button click =>', button.id);
110
- }
111
- }
112
- }
110
+ }]*/
113
111
  });
114
112
  }
115
113
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo.mjs",
3
- "version": "4.2.6",
3
+ "version": "4.2.7",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -55,7 +55,7 @@
55
55
  "neo-jsdoc": "^1.0.1",
56
56
  "neo-jsdoc-x": "^1.0.4",
57
57
  "postcss": "^8.4.16",
58
- "sass": "^1.54.9",
58
+ "sass": "^1.55.0",
59
59
  "webpack": "^5.74.0",
60
60
  "webpack-cli": "^4.10.0",
61
61
  "webpack-dev-server": "4.11.1",
@@ -1,3 +1,14 @@
1
+ @keyframes ripple {
2
+ from {
3
+ opacity : 1;
4
+ transform: scale(0);
5
+ }
6
+ to {
7
+ opacity : 0;
8
+ transform: scale(4);
9
+ }
10
+ }
11
+
1
12
  .neo-disabled {
2
13
  .neo-button {
3
14
  cursor: default;
@@ -16,6 +27,7 @@
16
27
  flex-direction : row;
17
28
  justify-content : center;
18
29
  margin : v(button-margin);
30
+ overflow : hidden;
19
31
  padding : v(button-padding);
20
32
  position : relative;
21
33
  text-decoration : none; // for url buttons => links
@@ -54,6 +66,15 @@
54
66
  pointer-events: none;
55
67
  }
56
68
 
69
+ .neo-button-ripple {
70
+ background-color: red;
71
+ border-radius : 50%;
72
+ opacity : 0;
73
+ pointer-events : none;
74
+ position : absolute;
75
+ transform : scale(4);
76
+ }
77
+
57
78
  .neo-button-text {
58
79
  color : v(button-text-color);
59
80
  font-family : v(button-text-font-family);
@@ -89,13 +89,19 @@ class Base extends Component {
89
89
  * @member {String} urlTarget_='_blank'
90
90
  */
91
91
  urlTarget_: '_blank',
92
+ /**
93
+ * True adds an expanding circle on click
94
+ * @member {Boolean} useRippleEffect_=false
95
+ */
96
+ useRippleEffect_: false,
92
97
  /**
93
98
  * @member {Object} _vdom
94
99
  */
95
100
  _vdom:
96
101
  {tag: 'button', type: 'button', cn: [
97
102
  {tag: 'span', cls: ['neo-button-glyph']},
98
- {tag: 'span', cls: ['neo-button-text']}
103
+ {tag: 'span', cls: ['neo-button-text']},
104
+ {tag: 'span', cls: ['neo-button-ripple'], removeDom: true}
99
105
  ]}
100
106
  }}
101
107
 
@@ -108,7 +114,7 @@ class Base extends Component {
108
114
  afterSetHandler(value, oldValue) {
109
115
  if (value) {
110
116
  let me = this,
111
- domListeners = me.domListeners || [];
117
+ domListeners = me.domListeners;
112
118
 
113
119
  domListeners.push({
114
120
  click: value,
@@ -202,7 +208,7 @@ class Base extends Component {
202
208
  afterSetRoute(value, oldValue) {
203
209
  if (value) {
204
210
  let me = this,
205
- domListeners = me.domListeners || [];
211
+ domListeners = me.domListeners;
206
212
 
207
213
  domListeners.push({
208
214
  click: me.changeRoute,
@@ -261,6 +267,26 @@ class Base extends Component {
261
267
  me.vdom = vdom;
262
268
  }
263
269
 
270
+ /**
271
+ * Triggered after the useRippleEffect config got changed
272
+ * @param {Boolean} value
273
+ * @param {Boolean} oldValue
274
+ * @protected
275
+ */
276
+ afterSetUseRippleEffect(value, oldValue) {
277
+ if (value) {
278
+ let me = this,
279
+ domListeners = me.domListeners;
280
+
281
+ domListeners.push({
282
+ click: me.showRipple,
283
+ scope: me
284
+ });
285
+
286
+ me.domListeners = domListeners;
287
+ }
288
+ }
289
+
264
290
  /**
265
291
  * Triggered after the urlTarget config got changed
266
292
  * @param {String} value
@@ -333,6 +359,35 @@ class Base extends Component {
333
359
  Neo.Main.setRoute({value: me.route});
334
360
  }
335
361
  }
362
+
363
+ /**
364
+ * @param {Object} data
365
+ */
366
+ async showRipple(data) {
367
+ let me = this,
368
+ buttonRect = data.path[0].rect,
369
+ diameter = Math.max(buttonRect.height, buttonRect.width),
370
+ radius = diameter / 2,
371
+ vdom = me.vdom,
372
+ rippleEl = vdom.cn[2];
373
+
374
+ rippleEl.style = Object.assign(rippleEl.style || {}, {
375
+ animation: 'none',
376
+ left : `${data.clientX - buttonRect.left - radius}px`,
377
+ height : `${diameter}px`,
378
+ top : `${data.clientY - buttonRect.top - radius}px`,
379
+ width : `${diameter}px`
380
+ });
381
+
382
+ delete rippleEl.removeDom;
383
+
384
+ me.vdom = vdom;
385
+
386
+ await Neo.timeout(1);
387
+
388
+ rippleEl.style.animation = 'ripple 400ms linear';
389
+ me.vdom = vdom;
390
+ }
336
391
  }
337
392
 
338
393
  Neo.applyClassConfig(Base);
@@ -105,7 +105,7 @@ class Base extends CoreBase {
105
105
  * afterSetStayOnHover(value, oldValue) {
106
106
  * if (value) {
107
107
  * let me = this,
108
- * domListeners = me.domListeners || [];
108
+ * domListeners = me.domListeners;
109
109
  *
110
110
  * domListeners.push(
111
111
  * {mouseenter: me.onMouseEnter, scope: me},
@@ -122,7 +122,7 @@ class App extends Base {
122
122
  lAppName = appName.toLowerCase(),
123
123
  cssMap = Neo.cssMap,
124
124
  parent = proto?.__proto__,
125
- classPath, fileName, mapClassName, ns, themeFolders;
125
+ classPath, classRoot, fileName, mapClassName, ns, themeFolders;
126
126
 
127
127
  if (!cssMap) {
128
128
  me.themeFilesCache.push([appName, proto]);
@@ -130,11 +130,11 @@ class App extends Base {
130
130
  // we need to modify app related class names
131
131
  if (!className.startsWith('Neo.')) {
132
132
  className = className.split('.');
133
- lAppName = className.shift().toLowerCase();
133
+ classRoot = className.shift().toLowerCase();
134
134
 
135
135
  className[0] === 'view' && className.shift();
136
136
 
137
- mapClassName = `apps.${Neo.apps[appName].appThemeFolder || lAppName}.${className.join('.')}`;
137
+ mapClassName = `apps.${Neo.apps[appName].appThemeFolder || classRoot}.${className.join('.')}`;
138
138
  className = `apps.${lAppName}.${className.join('.')}`;
139
139
  }
140
140