ember-nav-stack 4.3.3 → 5.0.1

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.
@@ -0,0 +1,21 @@
1
+ # unconventional js
2
+ /blueprints/*/files/
3
+ /vendor/
4
+
5
+ # compiled output
6
+ /dist/
7
+ /tmp/
8
+
9
+ # dependencies
10
+ /bower_components/
11
+ /node_modules/
12
+
13
+ # misc
14
+ /coverage/
15
+ !.*
16
+ .eslintcache
17
+
18
+ # ember-try
19
+ /.node_modules.ember-try/
20
+ /bower.json.ember-try
21
+ /package.json.ember-try
package/.prettierrc.js ADDED
@@ -0,0 +1,5 @@
1
+ 'use strict';
2
+
3
+ module.exports = {
4
+ singleQuote: true,
5
+ };
package/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## v5.0.1 (2023-11-30)
2
+
3
+ ## v5.0.0 (2023-09-19)
4
+
5
+ #### :rocket: Enhancement
6
+ * [#70](https://github.com/yapplabs/ember-nav-stack/pull/70) Update to ember 3.24 ([@lukemelia](https://github.com/lukemelia))
7
+
8
+ #### Committers: 1
9
+ - Luke Melia ([@lukemelia](https://github.com/lukemelia))
10
+
1
11
  ## v4.3.3 (2021-02-08)
2
12
 
3
13
  ## v4.3.2 (2021-02-05)
package/README.md CHANGED
@@ -4,7 +4,33 @@ This addon is used by Yapp to blend mobile-style stack navigation with Ember rou
4
4
 
5
5
  This addon's current status is "opensource, but unpolished". It lacks tests, docs, and other niceties of a well-maintained Ember addon.
6
6
 
7
- See the [Contributing](CONTRIBUTING.md) guide for details on contributing.
7
+ Compatibility
8
+ ------------------------------------------------------------------------------
9
+
10
+ * Ember.js v3.16 or above
11
+ * Ember CLI v2.13 or above
12
+ * Node.js v10 or above
13
+
14
+
15
+ Installation
16
+ ------------------------------------------------------------------------------
17
+
18
+ ```
19
+ ember install ember-nav-stack
20
+ ```
21
+
22
+
23
+ Usage
24
+ ------------------------------------------------------------------------------
25
+
26
+ [Longer description of how to use the addon in apps.]
27
+
28
+
29
+ Contributing
30
+ ------------------------------------------------------------------------------
31
+
32
+ See the [Contributing](CONTRIBUTING.md) guide for details.
33
+
8
34
 
9
35
  License
10
36
  ------------------------------------------------------------------------------
@@ -14,7 +14,7 @@ import { setTransform } from 'ember-nav-stack/utils/animation';
14
14
  import { inject as service } from '@ember/service';
15
15
  import { bool, mapBy, reads } from 'macro-decorators';
16
16
  import { guidFor } from '@ember/object/internals';
17
- import { extractComponentKey } from 'ember-nav-stack/utils/component'
17
+ import { extractComponentKey } from 'ember-nav-stack/utils/component';
18
18
 
19
19
  function currentTransitionPercentage(fromValue, toValue, currentValue) {
20
20
  if (fromValue === undefined || fromValue === toValue) {
@@ -27,7 +27,12 @@ function currentTransitionPercentage(fromValue, toValue, currentValue) {
27
27
  return percentage;
28
28
  }
29
29
 
30
- function styleHeaderElements(transitionRatio, isForward, currentHeaderElement, otherHeaderElement) {
30
+ function styleHeaderElements(
31
+ transitionRatio,
32
+ isForward,
33
+ currentHeaderElement,
34
+ otherHeaderElement,
35
+ ) {
31
36
  let startingOffset = 60;
32
37
  if (!isForward) {
33
38
  transitionRatio = 1 - transitionRatio;
@@ -36,7 +41,10 @@ function styleHeaderElements(transitionRatio, isForward, currentHeaderElement, o
36
41
  let xOffset = transitionRatio * -1 * startingOffset;
37
42
  if (currentHeaderElement) {
38
43
  currentHeaderElement.style.opacity = transitionRatio;
39
- setTransform(currentHeaderElement, `translateX(${startingOffset + xOffset}px)`);
44
+ setTransform(
45
+ currentHeaderElement,
46
+ `translateX(${startingOffset + xOffset}px)`,
47
+ );
40
48
  }
41
49
  if (otherHeaderElement) {
42
50
  otherHeaderElement.style.opacity = 1 - transitionRatio;
@@ -59,6 +67,8 @@ export default class NavStack extends Component {
59
67
  return this.args.birdsEyeDebugging || false;
60
68
  }
61
69
 
70
+ element;
71
+
62
72
  get elementId() {
63
73
  return guidFor(this);
64
74
  }
@@ -98,7 +108,7 @@ export default class NavStack extends Component {
98
108
  return this.stackItems[this.stackItems.length - 2].headerComponent;
99
109
  }
100
110
 
101
- get stackItems(){
111
+ get stackItems() {
102
112
  return get(this.navStacksService, `stacks.layer${this.args.layer}`) || [];
103
113
  }
104
114
 
@@ -111,7 +121,10 @@ export default class NavStack extends Component {
111
121
  get suppressAnimation() {
112
122
  if (this._suppressAnimation === undefined) {
113
123
  const config = getOwner(this).resolveRegistration('config:environment');
114
- this._suppressAnimation = config['ember-nav-stack'] && config['ember-nav-stack'].suppressAnimation;
124
+ // eslint-disable-next-line ember/no-side-effects
125
+ this._suppressAnimation =
126
+ config['ember-nav-stack'] &&
127
+ config['ember-nav-stack'].suppressAnimation;
115
128
  }
116
129
  return this._suppressAnimation;
117
130
  }
@@ -119,20 +132,23 @@ export default class NavStack extends Component {
119
132
  clones = {
120
133
  stackItems: [],
121
134
  headers: [],
122
- elements: []
123
- }
135
+ elements: [],
136
+ };
124
137
 
125
138
  @action
126
139
  setupHammer(el) {
127
140
  this.element = el;
128
141
  this.hammer = new Hammer.Manager(this.element, {
129
142
  inputClass: Hammer.TouchMouseInput,
130
- recognizers: [
131
- [BackSwipeRecognizer]
132
- ]
143
+ recognizers: [[BackSwipeRecognizer]],
133
144
  });
134
145
  let isInitialRender = this.navStacksService.isInitialRender;
135
- scheduleOnce('afterRender', this, this.handleStackDepthChange, isInitialRender);
146
+ scheduleOnce(
147
+ 'afterRender',
148
+ this,
149
+ this.handleStackDepthChange,
150
+ isInitialRender,
151
+ );
136
152
  this._setupPanHandlerContext();
137
153
 
138
154
  let { hammer, gesture } = this;
@@ -141,10 +157,12 @@ export default class NavStack extends Component {
141
157
  }
142
158
 
143
159
  @action
144
- tearDownHammer(){
160
+ tearDownHammer() {
145
161
  let { hammer, gesture } = this;
146
162
  gesture.unregister(this, hammer.get('pan'));
147
163
  hammer.off('pan');
164
+ hammer.destroy();
165
+ this.hammer = null;
148
166
  }
149
167
 
150
168
  @action
@@ -156,30 +174,28 @@ export default class NavStack extends Component {
156
174
  let stackItems = this.stackItems || [];
157
175
  let stackDepth = stackItems.length;
158
176
  let rootComponentRef = stackItems[0] && stackItems[0].component;
159
- let rootComponentKey = this.args.extractComponentKey ? this.args.extractComponentKey(rootComponentRef) : extractComponentKey(rootComponentRef);
177
+ let rootComponentKey = this.args.extractComponentKey
178
+ ? this.args.extractComponentKey(rootComponentRef)
179
+ : extractComponentKey(rootComponentRef);
160
180
 
161
181
  let layer = this.args.layer;
162
182
  if (isInitialRender) {
163
183
  this.schedule(this.cut);
164
- }
165
-
166
- else if (layer > 0 && stackDepth > 0 && this._stackDepth === 0 || this._stackDepth === undefined) {
184
+ } else if (
185
+ (layer > 0 && stackDepth > 0 && this._stackDepth === 0) ||
186
+ this._stackDepth === undefined
187
+ ) {
167
188
  this.schedule(this.slideUp);
168
- }
169
-
170
- else if (layer > 0 && stackDepth === 0 && this._stackDepth > 0) {
189
+ } else if (layer > 0 && stackDepth === 0 && this._stackDepth > 0) {
171
190
  this.cloneElement();
172
191
  this.element.style.display = 'none';
173
192
  this.schedule(this.slideDown);
174
-
175
193
  } else if (rootComponentKey !== this._rootComponentKey) {
176
194
  this.schedule(this.cut);
177
-
178
195
  } else if (stackDepth < this._stackDepth) {
179
196
  this.cloneLastStackItem();
180
197
  this.cloneHeader();
181
198
  this.schedule(this.slideBack);
182
-
183
199
  } else if (stackDepth > this._stackDepth) {
184
200
  this.cloneHeader();
185
201
  this.schedule(this.slideForward);
@@ -198,7 +214,9 @@ export default class NavStack extends Component {
198
214
  if (stackDepth === 0) {
199
215
  return 0;
200
216
  }
201
- let currentStackItemElement = this.element.querySelector('.NavStack-item:last-child');
217
+ let currentStackItemElement = this.element.querySelector(
218
+ '.NavStack-item:last-child',
219
+ );
202
220
  if (!currentStackItemElement) {
203
221
  return 0;
204
222
  }
@@ -210,7 +228,9 @@ export default class NavStack extends Component {
210
228
 
211
229
  @action
212
230
  repositionX() {
213
- let itemContainerElement = this.element.querySelector('.NavStack-itemContainer');
231
+ let itemContainerElement = this.element.querySelector(
232
+ '.NavStack-itemContainer',
233
+ );
214
234
  let newX = this.computeXPosition();
215
235
  setTransform(itemContainerElement, `translateX(${newX}px)`);
216
236
  }
@@ -218,14 +238,14 @@ export default class NavStack extends Component {
218
238
  cut() {
219
239
  this.horizontalTransition({
220
240
  toValue: this.computeXPosition(),
221
- animate: false
241
+ animate: false,
222
242
  });
223
243
 
224
- if (this.args.layer > 0 & this.stackDepth > 0) {
244
+ if ((this.args.layer > 0) & (this.stackDepth > 0)) {
225
245
  this.verticalTransition({
226
246
  element: this.element,
227
247
  toValue: 0,
228
- animate: false
248
+ animate: false,
229
249
  });
230
250
  }
231
251
  }
@@ -235,7 +255,7 @@ export default class NavStack extends Component {
235
255
  toValue: this.computeXPosition(),
236
256
  finishCallback: () => {
237
257
  this.removeClonedHeader();
238
- }
258
+ },
239
259
  });
240
260
  }
241
261
 
@@ -245,7 +265,7 @@ export default class NavStack extends Component {
245
265
  finishCallback: () => {
246
266
  this.removeClonedStackItem();
247
267
  this.removeClonedHeader();
248
- }
268
+ },
249
269
  });
250
270
  }
251
271
 
@@ -254,7 +274,7 @@ export default class NavStack extends Component {
254
274
  this.verticalTransition({
255
275
  element: this.element,
256
276
  toValue: 0,
257
- fromValue: debug ? 480 : this.element.getBoundingClientRect().height
277
+ fromValue: debug ? 480 : this.element.getBoundingClientRect().height,
258
278
  });
259
279
  }
260
280
 
@@ -268,15 +288,26 @@ export default class NavStack extends Component {
268
288
  toValue: y,
269
289
  finishCallback: () => {
270
290
  this.removeClonedElement();
271
- }
291
+ },
272
292
  });
273
293
  });
274
294
  }
275
295
 
276
- horizontalTransition({ toValue, fromValue, animate=!this.suppressAnimation, finishCallback }) {
277
- let itemContainerElement = this.element.querySelector('.NavStack-itemContainer');
278
- let currentHeaderElement = this.element.querySelector('.NavStack-currentHeaderContainer');
279
- let clonedHeaderElement = this.element.querySelector('.NavStack-clonedHeaderContainer');
296
+ horizontalTransition({
297
+ toValue,
298
+ fromValue,
299
+ animate = !this.suppressAnimation,
300
+ finishCallback,
301
+ }) {
302
+ let itemContainerElement = this.element.querySelector(
303
+ '.NavStack-itemContainer',
304
+ );
305
+ let currentHeaderElement = this.element.querySelector(
306
+ '.NavStack-currentHeaderContainer',
307
+ );
308
+ let clonedHeaderElement = this.element.querySelector(
309
+ '.NavStack-clonedHeaderContainer',
310
+ );
280
311
 
281
312
  this.transitionDidBegin();
282
313
  this.notifyTransitionStart();
@@ -286,7 +317,7 @@ export default class NavStack extends Component {
286
317
  currentTransitionPercentage(fromValue, toValue, toValue),
287
318
  fromValue === undefined || fromValue > toValue,
288
319
  currentHeaderElement,
289
- clonedHeaderElement
320
+ clonedHeaderElement,
290
321
  );
291
322
  this.notifyTransitionEnd();
292
323
  this.transitionDidEnd();
@@ -301,23 +332,32 @@ export default class NavStack extends Component {
301
332
  return;
302
333
  }
303
334
  let spring = this._createSpring({ fromValue, toValue });
304
- spring.onUpdate((s) => {
305
- setTransform(itemContainerElement, `translateX(${s.currentValue}px)`);
306
- styleHeaderElements(
307
- currentTransitionPercentage(fromValue, toValue, s.currentValue),
308
- fromValue > toValue,
309
- currentHeaderElement,
310
- clonedHeaderElement
311
- );
312
- }).onStop(() => {
313
- run(finish);
314
- }).start();
335
+ spring
336
+ .onUpdate((s) => {
337
+ setTransform(itemContainerElement, `translateX(${s.currentValue}px)`);
338
+ styleHeaderElements(
339
+ currentTransitionPercentage(fromValue, toValue, s.currentValue),
340
+ fromValue > toValue,
341
+ currentHeaderElement,
342
+ clonedHeaderElement,
343
+ );
344
+ })
345
+ .onStop(() => {
346
+ run(finish);
347
+ })
348
+ .start();
315
349
  return;
316
350
  }
317
351
  run(finish);
318
352
  }
319
353
 
320
- verticalTransition({ element, toValue, fromValue, animate=!this.suppressAnimation, finishCallback }) {
354
+ verticalTransition({
355
+ element,
356
+ toValue,
357
+ fromValue,
358
+ animate = !this.suppressAnimation,
359
+ finishCallback,
360
+ }) {
321
361
  this.transitionDidBegin();
322
362
  this.notifyTransitionStart();
323
363
  let finish = () => {
@@ -335,37 +375,40 @@ export default class NavStack extends Component {
335
375
  return;
336
376
  }
337
377
  let spring = this._createSpring({ fromValue, toValue });
338
- spring.onUpdate((s) => {
339
- setTransform(element, `translateY(${s.currentValue}px)`);
340
- }).onStop(() => {
341
- run(finish);
342
- }).start();
378
+ spring
379
+ .onUpdate((s) => {
380
+ setTransform(element, `translateY(${s.currentValue}px)`);
381
+ })
382
+ .onStop(() => {
383
+ run(finish);
384
+ })
385
+ .start();
343
386
  return;
344
387
  }
345
388
  run(finish);
346
389
  }
347
390
 
348
- _createSpring({ initialVelocity=0, fromValue, toValue }) {
391
+ _createSpring({ initialVelocity = 0, fromValue, toValue }) {
349
392
  return new Spring({
350
393
  initialVelocity,
351
394
  fromValue,
352
395
  toValue,
353
396
  stiffness: 1000,
354
397
  damping: 500,
355
- mass: 3
398
+ mass: 3,
356
399
  });
357
400
  }
358
401
 
359
402
  disablePanRecognizer() {
360
- this.hammer.get('pan').set({ enable: false });
403
+ this.hammer?.get('pan').set({ enable: false });
361
404
  }
362
405
 
363
- transitionDidBegin(){
406
+ transitionDidBegin() {
364
407
  this.disablePanRecognizer();
365
408
  }
366
409
 
367
- transitionDidEnd(){
368
- if (this._currentStackItemElement) {
410
+ transitionDidEnd() {
411
+ if (this._currentStackItemElement) {
369
412
  this.disablePanRecognizer();
370
413
  }
371
414
  if (!this.element || this.stackDepth <= 1) {
@@ -383,11 +426,18 @@ export default class NavStack extends Component {
383
426
  }
384
427
 
385
428
  _setupPanHandlerContext() {
386
- this.containerElement = this.element.querySelector('.NavStack-itemContainer');
387
- this.currentHeaderElement = this.element.querySelector('.NavStack-currentHeaderContainer');
388
- this.parentHeaderElement = this.element.querySelector('.NavStack-parentItemHeaderContainer');
429
+ this.containerElement = this.element.querySelector(
430
+ '.NavStack-itemContainer',
431
+ );
432
+ this.currentHeaderElement = this.element.querySelector(
433
+ '.NavStack-currentHeaderContainer',
434
+ );
435
+ this.parentHeaderElement = this.element.querySelector(
436
+ '.NavStack-parentItemHeaderContainer',
437
+ );
389
438
  this.startingX = this.getX(this.containerElement);
390
- let currentStackItemElement = this._currentStackItemElement = this.element.querySelector('.NavStack-item:last-child');
439
+ let currentStackItemElement = (this._currentStackItemElement =
440
+ this.element.querySelector('.NavStack-item:last-child'));
391
441
  if (!currentStackItemElement) {
392
442
  return;
393
443
  }
@@ -395,7 +445,7 @@ export default class NavStack extends Component {
395
445
  this.backX = this.startingX + itemWidth;
396
446
  this.thresholdX = itemWidth / 2;
397
447
  this.canNavigateBack = this.back && this.stackDepth > 1;
398
- this.hammer.get('pan').set({ enable: true, threshold: 9 });
448
+ this.hammer?.get('pan').set({ enable: true, threshold: 9 });
399
449
  }
400
450
 
401
451
  @action
@@ -403,15 +453,26 @@ export default class NavStack extends Component {
403
453
  if (this._activeSpring) {
404
454
  return;
405
455
  }
406
- setTransform(this.containerElement, `translateX(${this.startingX + ev.deltaX}px)`);
456
+ setTransform(
457
+ this.containerElement,
458
+ `translateX(${this.startingX + ev.deltaX}px)`,
459
+ );
407
460
  styleHeaderElements(
408
- currentTransitionPercentage(this.startingX, this.backX, this.startingX + ev.deltaX),
461
+ currentTransitionPercentage(
462
+ this.startingX,
463
+ this.backX,
464
+ this.startingX + ev.deltaX,
465
+ ),
409
466
  true,
410
467
  this.currentHeaderElement,
411
- this.parentHeaderElement
468
+ this.parentHeaderElement,
412
469
  );
413
470
 
414
- let transitionRatio = currentTransitionPercentage(this.startingX, this.backX, this.startingX + ev.deltaX);
471
+ let transitionRatio = currentTransitionPercentage(
472
+ this.startingX,
473
+ this.backX,
474
+ this.startingX + ev.deltaX,
475
+ );
415
476
  if (this.currentHeaderElement) {
416
477
  this.currentHeaderElement.style.opacity = transitionRatio;
417
478
  }
@@ -424,7 +485,8 @@ export default class NavStack extends Component {
424
485
  }
425
486
 
426
487
  handlePanEnd(ev) {
427
- let shouldNavigateBack = this.adjustX(ev.center.x) >= this.thresholdX && this.canNavigateBack;
488
+ let shouldNavigateBack =
489
+ this.adjustX(ev.center.x) >= this.thresholdX && this.canNavigateBack;
428
490
  let initialVelocity = ev.velocityX;
429
491
  let fromValue = this.startingX + ev.deltaX;
430
492
  let toValue = shouldNavigateBack ? this.backX : this.startingX;
@@ -435,16 +497,20 @@ export default class NavStack extends Component {
435
497
  currentTransitionPercentage(this.startingX, this.backX, this.backX),
436
498
  false,
437
499
  this.parentHeaderElement,
438
- this.currentHeaderElement
500
+ this.currentHeaderElement,
439
501
  );
440
502
  run(this.args, this.args.back);
441
503
  } else {
442
504
  setTransform(this.containerElement, `translateX(${this.startingX}px)`);
443
505
  styleHeaderElements(
444
- currentTransitionPercentage(this.startingX, this.backX, this.startingX),
506
+ currentTransitionPercentage(
507
+ this.startingX,
508
+ this.backX,
509
+ this.startingX,
510
+ ),
445
511
  false,
446
512
  this.parentHeaderElement,
447
- this.currentHeaderElement
513
+ this.currentHeaderElement,
448
514
  );
449
515
  }
450
516
  if (this.currentHeaderElement) {
@@ -464,27 +530,39 @@ export default class NavStack extends Component {
464
530
  }
465
531
  let spring = this._createSpring({ initialVelocity, fromValue, toValue });
466
532
  this._activeSpring = spring;
467
- spring.onUpdate((s) => {
468
- setTransform(this.containerElement, `translateX(${s.currentValue}px)`);
469
- styleHeaderElements(
470
- currentTransitionPercentage(this.startingX, this.backX, s.currentValue),
471
- false,
472
- this.parentHeaderElement,
473
- this.currentHeaderElement
474
- );
475
- if (!shouldNavigateBack && s.currentValue >= this.startingX + this.thresholdX) {
476
- shouldNavigateBack = true;
477
- spring.updateConfig({
478
- toValue: this.backX
479
- });
480
- }
481
- }).onStop(() => {
482
- finalize();
483
- }).start();
533
+ spring
534
+ .onUpdate((s) => {
535
+ setTransform(this.containerElement, `translateX(${s.currentValue}px)`);
536
+ styleHeaderElements(
537
+ currentTransitionPercentage(
538
+ this.startingX,
539
+ this.backX,
540
+ s.currentValue,
541
+ ),
542
+ false,
543
+ this.parentHeaderElement,
544
+ this.currentHeaderElement,
545
+ );
546
+ if (
547
+ !shouldNavigateBack &&
548
+ s.currentValue >= this.startingX + this.thresholdX
549
+ ) {
550
+ shouldNavigateBack = true;
551
+ spring.updateConfig({
552
+ toValue: this.backX,
553
+ });
554
+ }
555
+ })
556
+ .onStop(() => {
557
+ finalize();
558
+ })
559
+ .start();
484
560
  }
485
561
 
486
562
  cloneLastStackItem() {
487
- let clone = this.element.querySelector('.NavStack-item:last-child').cloneNode(true);
563
+ let clone = this.element
564
+ .querySelector('.NavStack-item:last-child')
565
+ .cloneNode(true);
488
566
  this.clones.stackItems.push(clone);
489
567
  clone.setAttribute('id', `${this.elementId}_clonedStackItem`);
490
568
  this.attachClonedStackItem(clone);
@@ -492,7 +570,9 @@ export default class NavStack extends Component {
492
570
 
493
571
  cloneHeader() {
494
572
  this.removeClonedHeader();
495
- let liveHeader = this.element.querySelector('.NavStack-currentHeaderContainer');
573
+ let liveHeader = this.element.querySelector(
574
+ '.NavStack-currentHeaderContainer',
575
+ );
496
576
  if (!liveHeader) {
497
577
  return;
498
578
  }
@@ -527,31 +607,34 @@ export default class NavStack extends Component {
527
607
 
528
608
  removeClonedHeader() {
529
609
  var clonedHeader;
530
- while (clonedHeader = this.clones.headers.pop()) { //eslint-disable-line no-cond-assign
610
+ while ((clonedHeader = this.clones.headers.pop())) {
611
+ //eslint-disable-line no-cond-assign
531
612
  clonedHeader.parentNode.removeChild(clonedHeader);
532
613
  }
533
614
  }
534
615
 
535
616
  removeClonedStackItem() {
536
617
  var clonedStackItem;
537
- while (clonedStackItem = this.clones.stackItems.pop()) { //eslint-disable-line no-cond-assign
618
+ while ((clonedStackItem = this.clones.stackItems.pop())) {
619
+ //eslint-disable-line no-cond-assign
538
620
  clonedStackItem.parentNode.removeChild(clonedStackItem);
539
621
  }
540
622
  }
541
623
 
542
624
  removeClonedElement() {
543
625
  var clonedElement;
544
- while (clonedElement = this.clones.elements.pop()) { //eslint-disable-line no-cond-assign
626
+ while ((clonedElement = this.clones.elements.pop())) {
627
+ //eslint-disable-line no-cond-assign
545
628
  clonedElement.parentNode.removeChild(clonedElement);
546
629
  }
547
630
  }
548
631
 
549
632
  preferRecognizer(recognizer) {
550
- this.hammer.get('pan').requireFailure(recognizer);
633
+ this.hammer?.get('pan').requireFailure(recognizer);
551
634
  }
552
635
 
553
636
  stopPreferringRecognizer(recognizer) {
554
- this.hammer.get('pan').dropRequireFailure(recognizer);
637
+ this.hammer?.get('pan').dropRequireFailure(recognizer);
555
638
  }
556
639
 
557
640
  getTestContainerEl() {
@@ -21,11 +21,12 @@ export default class ToNavStack extends Component {
21
21
  guidFor(this),
22
22
  this.args.layer,
23
23
  this.args.item,
24
- this.args.header
24
+ this.args.header,
25
25
  );
26
26
  }
27
27
 
28
28
  willDestroy() {
29
+ super.willDestroy(...arguments);
29
30
  this.service.removeItem(guidFor(this));
30
31
  }
31
32
  }
@@ -1,10 +1,10 @@
1
+ /* eslint-disable ember/no-computed-properties-in-native-classes */
1
2
  /* eslint-disable ember/no-observers */
2
3
  import Helper from '@ember/component/helper';
3
4
  import { computed } from '@ember/object';
4
5
  import { observes } from '@ember-decorators/object';
5
6
  import { inject as service } from '@ember/service';
6
7
  export default class NavLayerIndices extends Helper {
7
-
8
8
  @service
9
9
  navStacks;
10
10
 
@@ -18,7 +18,7 @@ export default class NavLayerIndices extends Helper {
18
18
  }
19
19
 
20
20
  @computed('navStacks.stacks')
21
- get layerCount(){
21
+ get layerCount() {
22
22
  return Object.keys(this.navStacks.stacks).length;
23
23
  }
24
24
 
@@ -3,13 +3,14 @@ import Mixin from '@ember/object/mixin';
3
3
  import { computed } from '@ember/object';
4
4
 
5
5
  export function getParentRoute(router, route) {
6
+ // eslint-disable-next-line ember/no-private-routing-service
6
7
  let routerMicroLib = router._routerMicrolib;
7
8
  let { routeInfos, handlerInfos } = routerMicroLib.state;
8
9
  routeInfos = routeInfos || handlerInfos; // routeInfos is in newer Ember versions
9
10
  if (!routeInfos) {
10
11
  return;
11
12
  }
12
- let routes = routeInfos.map(hi => hi._handler || hi._route);
13
+ let routes = routeInfos.map((hi) => hi._handler || hi._route);
13
14
  let routeIndex = routes.indexOf(route);
14
15
  if (routeIndex > 0) {
15
16
  return routes[routes.indexOf(route) - 1];
@@ -19,16 +20,18 @@ export function getParentRoute(router, route) {
19
20
  export default Mixin.create({
20
21
  templateName: 'stackable',
21
22
  getRouteComponent(/* model */) {
22
- return `routable-components/${(this.routableTemplateName || this.routeName).replace(/\./g,'/')}`;
23
+ return `routable-components/${(
24
+ this.routableTemplateName || this.routeName
25
+ ).replace(/\./g, '/')}`;
23
26
  },
24
27
  getHeaderComponent(model) {
25
28
  return `${this.getRouteComponent(model)}/header`;
26
29
  },
27
- layerIndex: computed(function() {
30
+ layerIndex: computed('_router', 'newLayer', function () {
28
31
  let parentRoute = getParentRoute(this._router, this);
29
32
  let parentRouteLayerIndex = parentRoute.get('layerIndex');
30
33
  let currentLayerIndex = parentRouteLayerIndex || 0;
31
- if (this.get('newLayer') === true) {
34
+ if (this.newLayer === true) {
32
35
  return currentLayerIndex + 1;
33
36
  }
34
37
  return currentLayerIndex;
@@ -39,7 +42,7 @@ export default Mixin.create({
39
42
  layerIndex: this.layerIndex,
40
43
  routeComponent: this.getRouteComponent(model),
41
44
  headerComponent: this.getHeaderComponent(model),
42
- routeName: this.routeName
45
+ routeName: this.routeName,
43
46
  });
44
47
  },
45
48
  getParentRouteName() {
@@ -48,6 +51,6 @@ export default Mixin.create({
48
51
  actions: {
49
52
  back() {
50
53
  this.transitionTo(this.getParentRouteName());
51
- }
52
- }
54
+ },
55
+ },
53
56
  });
@@ -20,7 +20,9 @@ export default class extends Service {
20
20
 
21
21
  unregister(component, recognizer) {
22
22
  let registry = this.#registry;
23
- let registerable = registry.find(r => r.component === component && r.recognizer === recognizer);
23
+ let registerable = registry.find(
24
+ (r) => r.component === component && r.recognizer === recognizer,
25
+ );
24
26
  if (registerable) {
25
27
  registry.splice(registry.indexOf(registerable), 1);
26
28
  }
@@ -3,23 +3,21 @@ import Service from '@ember/service';
3
3
  import { run, next } from '@ember/runloop';
4
4
  import EmberObject from '@ember/object';
5
5
  import { Promise as EmberPromise } from 'rsvp';
6
- import { registerWaiter } from '@ember/test';
7
- import { DEBUG } from '@glimmer/env';
6
+ import { buildWaiter } from '@ember/test-waiters';
7
+ import { set } from '@ember/object';
8
+ let waiter = buildWaiter('ember-nav-stack:transition-waiter');
8
9
 
9
10
  export default class NavStacks extends Service {
11
+ waiterToken;
12
+
10
13
  constructor() {
11
14
  super(...arguments);
12
- this.set('stacks', EmberObject.create());
15
+ set(this, 'stacks', EmberObject.create());
13
16
  this._listeners = A([]);
14
17
  this._itemsById = {};
15
18
  this._counter = 1;
16
19
  this._runningTransitions = 0;
17
20
  this.isInitialRender = true;
18
- if (DEBUG) {
19
- registerWaiter(this, function() {
20
- return this._runningTransitions === 0;
21
- });
22
- }
23
21
  }
24
22
 
25
23
  pushItem(sourceId, layer, component, headerComponent) {
@@ -27,7 +25,7 @@ export default class NavStacks extends Service {
27
25
  layer,
28
26
  component,
29
27
  headerComponent,
30
- order: this._counter++
28
+ order: this._counter++,
31
29
  };
32
30
  this._schedule();
33
31
  }
@@ -47,10 +45,17 @@ export default class NavStacks extends Service {
47
45
 
48
46
  notifyTransitionStart() {
49
47
  this._runningTransitions++;
48
+ if (this._runningTransitions === 1) {
49
+ this.waiterToken = waiter.beginAsync();
50
+ }
50
51
  }
51
52
 
52
53
  notifyTransitionEnd() {
53
54
  this._runningTransitions--;
55
+ if (this._runningTransitions === 0) {
56
+ waiter.endAsync(this.waiterToken);
57
+ this.waiterToken = undefined;
58
+ }
54
59
  next(() => {
55
60
  this._maybeResolveIdle();
56
61
  });
@@ -64,12 +69,12 @@ export default class NavStacks extends Service {
64
69
  if (this._waitingPromise) {
65
70
  return this._waitingPromise;
66
71
  }
67
- return this._waitingPromise = new EmberPromise((resolve) => {
72
+ return (this._waitingPromise = new EmberPromise((resolve) => {
68
73
  this._resolveWaiting = resolve;
69
74
  next(() => {
70
75
  this._maybeResolveIdle();
71
76
  });
72
- });
77
+ }));
73
78
  }
74
79
 
75
80
  didUpdate() {} // hook
@@ -102,7 +107,7 @@ export default class NavStacks extends Service {
102
107
  for (var layerName in newStacks) {
103
108
  newStacks[layerName] = newStacks[layerName].sortBy('order');
104
109
  }
105
- this.set('stacks', EmberObject.create(newStacks));
110
+ set(this, 'stacks', EmberObject.create(newStacks));
106
111
  if (this.isInitialRender === true) {
107
112
  run.next(this, this._clearIsInitialRender);
108
113
  }
@@ -114,6 +119,6 @@ export default class NavStacks extends Service {
114
119
  if (this.isDestroyed || this.isDestroying) {
115
120
  return;
116
121
  }
117
- this.set('isInitialRender', false);
122
+ set(this, 'isInitialRender', false);
118
123
  }
119
124
  }
@@ -20,7 +20,7 @@ const TICK = 17;
20
20
  */
21
21
  function rAF(cb) {
22
22
  if (Ember.testing || !window.requestAnimationFrame) {
23
- return run.later(cb, TICK);
23
+ return run.later(cb, TICK);
24
24
  } else {
25
25
  return window.requestAnimationFrame(cb);
26
26
  }
@@ -52,7 +52,7 @@ export function computeTimeout(element) {
52
52
  transitionDelay,
53
53
  animationDuration,
54
54
  animationDelay,
55
- animationIterationCount
55
+ animationIterationCount,
56
56
  } = window.getComputedStyle(element);
57
57
 
58
58
  // `getComputedStyle` returns durations and delays in the Xs format.
@@ -60,21 +60,26 @@ export function computeTimeout(element) {
60
60
  // numeral (0-9), a decimal point, or an exponent, it returns the value up to that point
61
61
  // and ignores that character and all succeeding characters.
62
62
 
63
- let maxDelay = Math.max(parseFloat(animationDelay), parseFloat(transitionDelay));
64
- let maxDuration = Math.max(parseFloat(animationDuration) *
65
- parseFloat(animationIterationCount), parseFloat(transitionDuration));
63
+ let maxDelay = Math.max(
64
+ parseFloat(animationDelay),
65
+ parseFloat(transitionDelay),
66
+ );
67
+ let maxDuration = Math.max(
68
+ parseFloat(animationDuration) * parseFloat(animationIterationCount),
69
+ parseFloat(transitionDuration),
70
+ );
66
71
 
67
72
  return (maxDelay + maxDuration) * 1000;
68
73
  }
69
74
 
70
75
  let setTransformImpl = function setTransformFunc(element, value) {
71
76
  element.style.transform = value;
72
- }
77
+ };
73
78
  // Android <= 4.x does not support element.style.transform
74
79
  if (document.body.style.transform === undefined) {
75
80
  setTransformImpl = function setTransformFunc(element, value) {
76
81
  element.style.webkitTransform = value;
77
- }
82
+ };
78
83
  }
79
84
 
80
85
  export let setTransform = setTransformImpl;
@@ -12,8 +12,12 @@ export default class BackSwipeRecognizer extends Hammer.Pan {
12
12
  this.options = Object.assign({}, this.defaults, options || {});
13
13
  this.captureClick = (ev) => {
14
14
  ev.stopPropagation(); // Stop the click from being propagated.
15
- this.manager.element.removeEventListener('click', this.captureClick, true);
16
- }
15
+ this.manager.element.removeEventListener(
16
+ 'click',
17
+ this.captureClick,
18
+ true,
19
+ );
20
+ };
17
21
  }
18
22
 
19
23
  defaults = {
@@ -22,14 +26,16 @@ export default class BackSwipeRecognizer extends Hammer.Pan {
22
26
  threshold: 10,
23
27
  pointers: 1,
24
28
  direction: DIRECTION_RIGHT,
25
- validLeftAreaPercent: 33
29
+ validLeftAreaPercent: 33,
26
30
  };
27
31
 
28
32
  recognize(inputData) {
29
33
  if (inputData.isFirst) {
30
- this.isInitialTouchInValidArea = this.checkInitialTouchInValidArea(inputData);
34
+ this.isInitialTouchInValidArea =
35
+ this.checkInitialTouchInValidArea(inputData);
31
36
  }
32
- let isOverElementThatPreventsScrollingInteraction = this.shouldPreventScrollingInteraction(inputData);
37
+ let isOverElementThatPreventsScrollingInteraction =
38
+ this.shouldPreventScrollingInteraction(inputData);
33
39
  if (isOverElementThatPreventsScrollingInteraction) {
34
40
  this.manager.stop();
35
41
  return;
@@ -45,17 +51,25 @@ export default class BackSwipeRecognizer extends Hammer.Pan {
45
51
 
46
52
  shouldPreventScrollingInteraction(inputData) {
47
53
  let { target } = inputData;
48
- return inputData.isFirst
49
- && (target && target.tagName.match(FIELD_REGEXP)
50
- || target && target.hasAttribute('data-prevent-scrolling')
51
- );
54
+ return (
55
+ inputData.isFirst &&
56
+ ((target && target.tagName.match(FIELD_REGEXP)) ||
57
+ (target && target.hasAttribute('data-prevent-scrolling')))
58
+ );
52
59
  }
53
60
 
54
61
  captureGhostClickIfNeeded(inputData) {
55
- if (inputData.srcEvent.type === 'mouseup' && (this.state & (Hammer.STATE_BEGAN))) {
62
+ if (
63
+ inputData.srcEvent.type === 'mouseup' &&
64
+ this.state & Hammer.STATE_BEGAN
65
+ ) {
56
66
  this.manager.element.addEventListener('click', this.captureClick, true);
57
67
  setTimeout(() => {
58
- this.manager.element.removeEventListener('click', this.captureClick, true);
68
+ this.manager.element.removeEventListener(
69
+ 'click',
70
+ this.captureClick,
71
+ true,
72
+ );
59
73
  }, 0);
60
74
  }
61
75
  }
@@ -73,11 +87,16 @@ export default class BackSwipeRecognizer extends Hammer.Pan {
73
87
  let testingEl = document.querySelector('#ember-testing');
74
88
  if (testingEl) {
75
89
  let minValidX = testingEl.getBoundingClientRect().left;
76
- let maxValidX = minValidX + (testingEl.clientWidth * (this.options.validLeftAreaPercent/100));
77
- return inputData.center.x >= minValidX && inputData.center.x <= maxValidX;
90
+ let maxValidX =
91
+ minValidX +
92
+ testingEl.clientWidth * (this.options.validLeftAreaPercent / 100);
93
+ return (
94
+ inputData.center.x >= minValidX && inputData.center.x <= maxValidX
95
+ );
78
96
  }
79
97
  }
80
- let maxValidX = window.innerWidth * (this.options.validLeftAreaPercent/100);
98
+ let maxValidX =
99
+ window.innerWidth * (this.options.validLeftAreaPercent / 100);
81
100
  return inputData.center.x <= maxValidX;
82
101
  }
83
102
  }
@@ -1,23 +1,40 @@
1
- import { get } from '@ember/object';
2
-
3
1
  export function extractComponentKey(componentRef) {
4
2
  if (!componentRef) {
5
3
  return 'none';
6
4
  }
7
- let result = componentRef.name || componentRef.inner.name;
8
- if (componentRef.args.named.model) {
9
- let model = componentRef.args.named.model.value();
10
- if (model) {
11
- result += `:${get(model, 'id')}`;
12
- }
13
- } else if (componentRef.args.named.has && componentRef.args.named.has('model')) {
14
- let model = componentRef.args.named.get('model').value();
5
+ let result = getComponentRefName(componentRef);
6
+ let modelId = getComponentRefModelId(componentRef);
7
+ if (modelId) {
8
+ result += `:${modelId}`;
9
+ }
10
+ return result;
11
+ }
12
+
13
+ function getComponentRefName(componentRef) {
14
+ let componentRefInner =
15
+ componentRef.inner?.name ||
16
+ componentRef[
17
+ Object.getOwnPropertySymbols(componentRef).find(
18
+ (s) => s.description === 'INNER',
19
+ )
20
+ ];
21
+ let result = componentRef.name || componentRefInner?.name;
22
+ return result;
23
+ }
24
+
25
+ function getComponentRefModelId(componentRef) {
26
+ let componentRefArgs =
27
+ componentRef.args ||
28
+ componentRef[
29
+ Object.getOwnPropertySymbols(componentRef).find(
30
+ (s) => s.description === 'ARGS',
31
+ )
32
+ ];
33
+ if (componentRefArgs.named.has && componentRefArgs.named.has('model')) {
34
+ let model = componentRefArgs.named.get('model').value();
15
35
  if (model) {
16
- let modelId = get(model, 'id');
17
- if (modelId) {
18
- result += `:${modelId}`;
19
- }
36
+ return model.id;
20
37
  }
21
38
  }
22
- return result;
39
+ return;
23
40
  }
@@ -16,14 +16,17 @@ export function getElementInViewportRatio(selectorOrElement) {
16
16
  let elementRect = element.getBoundingClientRect();
17
17
  let viewportRect = viewportEl.getBoundingClientRect();
18
18
  let topOutOfViewport = Math.max(0, viewportRect.top - elementRect.top);
19
- let bottomOutOfViewport = Math.max(0, elementRect.bottom - viewportRect.bottom);
19
+ let bottomOutOfViewport = Math.max(
20
+ 0,
21
+ elementRect.bottom - viewportRect.bottom,
22
+ );
20
23
  let leftOutOfViewport = Math.max(0, viewportRect.left - elementRect.left);
21
24
  let rightOutOfViewport = Math.max(0, elementRect.right - viewportRect.right);
22
- let totalArea = (elementRect.width * elementRect.height);
25
+ let totalArea = elementRect.width * elementRect.height;
23
26
  let outOfViewportXAmount = leftOutOfViewport + rightOutOfViewport;
24
27
  let outOfViewportYAmount = topOutOfViewport + bottomOutOfViewport;
25
28
  let areaOutside =
26
- (outOfViewportXAmount * elementRect.height) +
27
- (outOfViewportYAmount * (elementRect.width - outOfViewportXAmount));
29
+ outOfViewportXAmount * elementRect.height +
30
+ outOfViewportYAmount * (elementRect.width - outOfViewportXAmount);
28
31
  return (totalArea - areaOutside) / totalArea;
29
32
  }
package/config/deploy.js CHANGED
@@ -1,9 +1,9 @@
1
1
  /* eslint-env node */
2
2
  'use strict';
3
3
 
4
- module.exports = function(deployTarget) {
4
+ module.exports = function (deployTarget) {
5
5
  let ENV = {
6
- build: {}
6
+ build: {},
7
7
  // include other plugin configuration that applies to all deploy targets here
8
8
  };
9
9
 
@@ -1,5 +1,5 @@
1
1
  'use strict';
2
2
 
3
- module.exports = function(/* environment, appConfig */) {
4
- return { };
3
+ module.exports = function (/* environment, appConfig */) {
4
+ return {};
5
5
  };
package/index.js CHANGED
@@ -3,13 +3,13 @@
3
3
  module.exports = {
4
4
  name: require('./package').name,
5
5
  options: {
6
- autoImport:{
7
- exclude: ['wobble']
8
- }
6
+ autoImport: {
7
+ exclude: ['wobble'],
8
+ },
9
9
  },
10
10
  included(app) {
11
11
  this._super.included.apply(this, arguments);
12
12
  app.import('vendor/wobble-shim.js');
13
13
  app.import('node_modules/wobble/dist/wobble.browser.js');
14
- }
14
+ },
15
15
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-nav-stack",
3
- "version": "4.3.3",
3
+ "version": "5.0.1",
4
4
  "description": "The default blueprint for ember-cli addons.",
5
5
  "keywords": [
6
6
  "ember-addon"
@@ -17,62 +17,78 @@
17
17
  },
18
18
  "scripts": {
19
19
  "build": "ember build --environment=production",
20
- "lint:js": "eslint .",
20
+ "lint": "npm-run-all --aggregate-output --continue-on-error --parallel 'lint:!(fix)'",
21
+ "lint:fix": "npm-run-all --aggregate-output --continue-on-error --parallel lint:*:fix",
22
+ "lint:hbs:fix": "ember-template-lint . --fix",
23
+ "lint:js": "eslint . --cache",
21
24
  "release": "release-it",
25
+ "lint:js:fix": "eslint . --fix",
22
26
  "start": "ember serve",
23
- "test": "ember test",
24
- "test:all": "ember try:each"
27
+ "test": "npm-run-all lint test:*",
28
+ "test:ember": "ember test",
29
+ "test:ember-compatibility": "ember try:each"
25
30
  },
26
31
  "dependencies": {
27
- "@ember/render-modifiers": "^1.0.2",
28
- "ember-auto-import": "^1.5.3",
29
- "ember-cli-babel": "^7.17.2",
30
- "ember-cli-htmlbars": "^4.2.2",
32
+ "@babel/core": "^7.0.0",
33
+ "@ember/render-modifiers": "^2.1.0",
34
+ "ember-auto-import": "^2.6.3",
35
+ "ember-cli-babel": "^7.26.11",
36
+ "ember-cli-htmlbars": "^6.3.0",
31
37
  "ember-decorators": "6.1.1",
32
- "ember-math-helpers": "^2.13.0",
33
- "ember-truth-helpers": "^3.0.0",
38
+ "ember-math-helpers": "^3.0.0",
39
+ "ember-truth-helpers": "^3.1.1",
34
40
  "hammerjs": "^2.0.8",
35
41
  "macro-decorators": "^0.1.2",
42
+ "webpack": "5",
36
43
  "wobble": "^1.5.1"
37
44
  },
38
45
  "devDependencies": {
39
- "@babel/core": "^7.9.0",
40
- "@ember/optional-features": "^1.3.0",
41
- "@glimmer/component": "^1.0.0",
42
- "@glimmer/tracking": "^1.0.0",
43
- "babel-eslint": "^10.0.3",
46
+ "@ember/optional-features": "^2.0.0",
47
+ "@ember/test-helpers": "^2.4.0",
48
+ "@ember/test-waiters": "^3.0.2",
49
+ "@glimmer/component": "^1.1.2",
50
+ "@glimmer/tracking": "^1.1.2",
51
+ "babel-eslint": "^10.1.0",
44
52
  "broccoli-asset-rev": "^3.0.0",
45
- "ember-cli": "~3.16.0",
46
- "ember-cli-dependency-checker": "^3.2.0",
47
- "ember-cli-deploy": "^1.0.2",
48
- "ember-cli-deploy-build": "^1.1.1",
49
- "ember-cli-deploy-git": "^1.3.3",
50
- "ember-cli-eslint": "^5.1.0",
51
- "ember-cli-inject-live-reload": "^2.0.2",
52
- "ember-cli-sass": "^7.1.7",
53
+ "ember-cli": "~3.24.0",
54
+ "ember-cli-dependency-checker": "^3.3.2",
55
+ "ember-cli-deploy": "^2.0.0",
56
+ "ember-cli-deploy-build": "^3.0.0",
57
+ "ember-cli-deploy-git": "^1.3.4",
58
+ "ember-cli-deprecation-workflow": "^2.1.0",
59
+ "ember-cli-inject-live-reload": "^2.1.0",
60
+ "ember-cli-sass": "^11.0.1",
53
61
  "ember-cli-sri": "^2.1.1",
54
- "ember-cli-uglify": "^3.0.0",
62
+ "ember-cli-terser": "^4.0.2",
55
63
  "ember-disable-prototype-extensions": "^1.1.3",
56
64
  "ember-export-application-global": "^2.0.1",
57
- "ember-load-initializers": "^2.1.1",
58
- "ember-maybe-import-regenerator": "^0.1.6",
59
- "ember-qunit": "^4.6.0",
60
- "ember-resolver": "^7.0.0",
65
+ "ember-load-initializers": "^2.1.2",
66
+ "ember-maybe-import-regenerator": "^1.0.0",
67
+ "ember-page-title": "^8.0.0",
68
+ "ember-qunit": "^5.1.5",
69
+ "ember-resolver": "^11.0.1",
61
70
  "ember-route-action-helper": "^2.0.8",
62
- "ember-simulant-test-helpers": "^0.3.1",
63
- "ember-source": "~3.16.0",
64
- "ember-source-channel-url": "^2.0.1",
65
- "ember-try": "^1.4.0",
66
- "eslint": "^6.8.0",
67
- "eslint-plugin-ember": "^7.7.2",
68
- "eslint-plugin-node": "^11.0.0",
71
+ "ember-simulant-test-helpers": "^0.3.2",
72
+ "ember-source": "~3.24.0",
73
+ "ember-source-channel-url": "^3.0.0",
74
+ "ember-template-lint": "^5.11.2",
75
+ "ember-try": "^3.0.0",
76
+ "eslint": "^7.26.0",
77
+ "eslint-config-prettier": "^9.0.0",
78
+ "eslint-plugin-ember": "^10.4.2",
79
+ "eslint-plugin-node": "^11.1.0",
80
+ "eslint-plugin-prettier": "^5.0.0",
69
81
  "loader.js": "^4.7.0",
70
- "qunit-dom": "^1.0.0",
71
- "release-it": "^13.6.0",
72
- "release-it-lerna-changelog": "^2.3.0"
82
+ "npm-run-all": "^4.1.5",
83
+ "prettier": "^3.0.2",
84
+ "qunit": "^2.19.4",
85
+ "qunit-dom": "^2.0.0",
86
+ "release-it": "^13.7.2",
87
+ "release-it-lerna-changelog": "^2.4.0",
88
+ "sass": "^1.66.1"
73
89
  },
74
90
  "engines": {
75
- "node": "10.* || >= 12"
91
+ "node": ">= 14"
76
92
  },
77
93
  "publishConfig": {
78
94
  "registry": "https://registry.npmjs.org"
@@ -100,7 +116,7 @@
100
116
  }
101
117
  },
102
118
  "volta": {
103
- "node": "12.20.1",
119
+ "node": "16.20.2",
104
120
  "yarn": "1.22.10"
105
121
  }
106
122
  }