ember-nav-stack 6.1.2 → 7.1.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/README.md +165 -21
  2. package/addon-main.cjs +4 -0
  3. package/dist/_app_/components/nav-stack-inner-wrapper.js +1 -0
  4. package/dist/_app_/components/nav-stack.js +1 -0
  5. package/dist/_app_/components/to-nav-stack.js +1 -0
  6. package/dist/_app_/helpers/nav-layer-indices.js +1 -0
  7. package/dist/_app_/modifiers/back-swipe.js +1 -0
  8. package/dist/_app_/services/gesture.js +1 -0
  9. package/dist/_app_/services/nav-stacks.js +1 -0
  10. package/dist/_app_/templates/stackable.js +1 -0
  11. package/dist/back-swipe-gesture.js +261 -0
  12. package/dist/back-swipe-gesture.js.map +1 -0
  13. package/dist/components/nav-stack-inner-wrapper.js +10 -0
  14. package/dist/components/nav-stack-inner-wrapper.js.map +1 -0
  15. package/dist/components/nav-stack.js +700 -0
  16. package/dist/components/nav-stack.js.map +1 -0
  17. package/dist/components/to-nav-stack.js +22 -0
  18. package/dist/components/to-nav-stack.js.map +1 -0
  19. package/dist/helpers/nav-layer-indices.js +21 -0
  20. package/dist/helpers/nav-layer-indices.js.map +1 -0
  21. package/dist/index.js +7 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/modifiers/back-swipe.js +40 -0
  24. package/dist/modifiers/back-swipe.js.map +1 -0
  25. package/dist/routes/stackable-route.js +99 -0
  26. package/dist/routes/stackable-route.js.map +1 -0
  27. package/{addon → dist}/services/gesture.js +7 -9
  28. package/dist/services/gesture.js.map +1 -0
  29. package/dist/services/nav-stacks.js +137 -0
  30. package/dist/services/nav-stacks.js.map +1 -0
  31. package/dist/styles/nav-stack.css +399 -0
  32. package/dist/templates/stackable.js +8 -0
  33. package/dist/templates/stackable.js.map +1 -0
  34. package/{addon-test-support → dist/test-support}/in-viewport.js +7 -10
  35. package/dist/test-support/in-viewport.js.map +1 -0
  36. package/dist/test-support/index.js +2 -0
  37. package/dist/test-support/index.js.map +1 -0
  38. package/{addon → dist}/utils/animation.js +17 -40
  39. package/dist/utils/animation.js.map +1 -0
  40. package/{addon → dist}/utils/back-swipe-recognizer.js +29 -49
  41. package/dist/utils/back-swipe-recognizer.js.map +1 -0
  42. package/dist/utils/clone-store.js +88 -0
  43. package/dist/utils/clone-store.js.map +1 -0
  44. package/dist/utils/component.js +121 -0
  45. package/dist/utils/component.js.map +1 -0
  46. package/dist/utils/header-style.js +46 -0
  47. package/dist/utils/header-style.js.map +1 -0
  48. package/dist/utils/transition-decision.js +71 -0
  49. package/dist/utils/transition-decision.js.map +1 -0
  50. package/dist/utils/waiter-state.js +130 -0
  51. package/dist/utils/waiter-state.js.map +1 -0
  52. package/package.json +79 -91
  53. package/.vscode/settings.json +0 -2
  54. package/CHANGELOG.md +0 -208
  55. package/MODULE_REPORT.md +0 -27
  56. package/RELEASE.md +0 -54
  57. package/addon/components/nav-stack/component.js +0 -690
  58. package/addon/components/nav-stack/template.hbs +0 -37
  59. package/addon/components/to-nav-stack.js +0 -32
  60. package/addon/helpers/nav-layer-indices.js +0 -29
  61. package/addon/routes/stackable-route.js +0 -61
  62. package/addon/services/nav-stacks.js +0 -157
  63. package/addon/utils/component.js +0 -40
  64. package/app/components/nav-stack/component.js +0 -1
  65. package/app/components/nav-stack/template.js +0 -1
  66. package/app/components/to-nav-stack.js +0 -1
  67. package/app/helpers/nav-layer-indices.js +0 -1
  68. package/app/services/gesture.js +0 -1
  69. package/app/services/nav-stacks.js +0 -1
  70. package/app/styles/nav-stack.scss +0 -117
  71. package/app/templates/stackable.hbs +0 -8
  72. package/app/utils/animation.js +0 -1
  73. package/config/deploy.js +0 -29
  74. package/config/environment.js +0 -5
  75. package/config/release.js +0 -21
  76. package/docs/ember-nav-stack-waiters-plan.md +0 -125
  77. package/index.js +0 -15
  78. package/tsconfig.json +0 -6
  79. package/vendor/wobble-shim.js +0 -3
@@ -1,690 +0,0 @@
1
- /* eslint-disable ember/no-observers */
2
- import Component from '@glimmer/component';
3
- import { action, get } from '@ember/object';
4
- import { run, scheduleOnce } from '@ember/runloop';
5
- import { nextTick } from 'ember-nav-stack/utils/animation';
6
- import BackSwipeRecognizer from 'ember-nav-stack/utils/back-swipe-recognizer';
7
- import Hammer from 'hammerjs';
8
- import { Spring } from 'wobble';
9
- import { getOwner } from '@ember/application';
10
- import { DEBUG } from '@glimmer/env';
11
- import { setTransform } from 'ember-nav-stack/utils/animation';
12
- import { inject as service } from '@ember/service';
13
- import { bool, mapBy, reads } from 'macro-decorators';
14
- import { guidFor } from '@ember/object/internals';
15
- import { extractComponentKey } from 'ember-nav-stack/utils/component';
16
-
17
- function currentTransitionPercentage(fromValue, toValue, currentValue) {
18
- if (fromValue === undefined || fromValue === toValue) {
19
- return 1;
20
- }
21
- let percentage = Math.abs((currentValue - fromValue) / (toValue - fromValue));
22
- if (toValue > fromValue) {
23
- return 1 - percentage;
24
- }
25
- return percentage;
26
- }
27
-
28
- function styleHeaderElements(
29
- transitionRatio,
30
- isForward,
31
- currentHeaderElement,
32
- otherHeaderElement,
33
- ) {
34
- let startingOffset = 60;
35
- if (!isForward) {
36
- transitionRatio = 1 - transitionRatio;
37
- startingOffset = -1 * startingOffset;
38
- }
39
- let xOffset = transitionRatio * -1 * startingOffset;
40
- if (currentHeaderElement) {
41
- currentHeaderElement.style.opacity = transitionRatio;
42
- setTransform(
43
- currentHeaderElement,
44
- `translateX(${startingOffset + xOffset}px)`,
45
- );
46
- }
47
- if (otherHeaderElement) {
48
- otherHeaderElement.style.opacity = 1 - transitionRatio;
49
- setTransform(otherHeaderElement, `translateX(${xOffset}px)`);
50
- }
51
- }
52
-
53
- export default class NavStack extends Component {
54
- // @argument('number')
55
- // layer;
56
-
57
- // @argument('any') // ComponentRef
58
- // footer;
59
-
60
- // @argument(Action)
61
- // back;
62
-
63
- // @argument(optional('boolean'))
64
- get birdsEyeDebugging() {
65
- return this.args.birdsEyeDebugging || false;
66
- }
67
-
68
- element;
69
-
70
- get elementId() {
71
- return guidFor(this);
72
- }
73
-
74
- get layer() {
75
- return this.args.layer;
76
- }
77
-
78
- @service('nav-stacks') navStacksService;
79
- @service gesture;
80
-
81
- constructor() {
82
- super(...arguments);
83
- this.navStacksService.register(this);
84
- }
85
-
86
- willDestroy() {
87
- super.willDestroy(...arguments);
88
- this.navStacksService.unregister(this);
89
- }
90
-
91
- get layerIndexCssClass() {
92
- return `NavStack--layer${this.args.layer}`;
93
- }
94
-
95
- get headerComponent() {
96
- if (this.stackItems.length === 0) {
97
- return null;
98
- }
99
- return this.stackItems[this.stackItems.length - 1].headerComponent;
100
- }
101
-
102
- get parentItemHeaderComponent() {
103
- if (this.stackItems.length < 2) {
104
- return null;
105
- }
106
- return this.stackItems[this.stackItems.length - 2].headerComponent;
107
- }
108
-
109
- get stackItems() {
110
- return get(this.navStacksService, `stacks.layer${this.args.layer}`) || [];
111
- }
112
-
113
- @reads('stackItems.length') stackDepth;
114
-
115
- @mapBy('stackItems', 'component') components;
116
-
117
- @bool('args.footer') hasFooter;
118
-
119
- get suppressAnimation() {
120
- if (this._suppressAnimation === undefined) {
121
- const config = getOwner(this).resolveRegistration('config:environment');
122
- // eslint-disable-next-line ember/no-side-effects
123
- this._suppressAnimation =
124
- config['ember-nav-stack'] &&
125
- config['ember-nav-stack'].suppressAnimation;
126
- }
127
- return this._suppressAnimation;
128
- }
129
-
130
- clones = {
131
- stackItems: [],
132
- headers: [],
133
- elements: [],
134
- };
135
-
136
- @action
137
- setupHammer(el) {
138
- this.element = el;
139
- this.hammer = new Hammer.Manager(this.element, {
140
- inputClass: Hammer.TouchMouseInput,
141
- recognizers: [[BackSwipeRecognizer]],
142
- });
143
- let isInitialRender = this.navStacksService.isInitialRender;
144
- scheduleOnce(
145
- 'afterRender',
146
- this,
147
- this.handleStackDepthChange,
148
- isInitialRender,
149
- );
150
- this._setupPanHandlerContext();
151
-
152
- let { hammer, gesture } = this;
153
- hammer.on('pan', this.handlePanEvent);
154
- gesture.register(this, hammer.get('pan'));
155
- }
156
-
157
- @action
158
- tearDownHammer() {
159
- let { hammer, gesture } = this;
160
- if (hammer) {
161
- gesture.unregister(this, hammer.get('pan'));
162
- hammer.off('pan');
163
- hammer.destroy();
164
- this.hammer = null;
165
- }
166
- }
167
-
168
- @action
169
- stackItemsDidChange() {
170
- this.handleStackDepthChange(false);
171
- }
172
-
173
- handleStackDepthChange(isInitialRender) {
174
- if (this.isDestroying || this.isDestroyed) {
175
- return;
176
- }
177
-
178
- let stackItems = this.stackItems || [];
179
- let stackDepth = stackItems.length;
180
- let rootComponentRef = stackItems[0] && stackItems[0].component;
181
- let rootComponentKey = this.args.extractComponentKey
182
- ? this.args.extractComponentKey(rootComponentRef)
183
- : extractComponentKey(rootComponentRef);
184
-
185
- let layer = this.args.layer;
186
- if (isInitialRender) {
187
- this.schedule(this.cut);
188
- } else if (
189
- (layer > 0 && stackDepth > 0 && this._stackDepth === 0) ||
190
- this._stackDepth === undefined
191
- ) {
192
- this.schedule(this.slideUp);
193
- } else if (layer > 0 && stackDepth === 0 && this._stackDepth > 0) {
194
- this.cloneElement();
195
- this.element.style.display = 'none';
196
- this.schedule(this.slideDown);
197
- } else if (rootComponentKey !== this._rootComponentKey) {
198
- this.schedule(this.cut);
199
- } else if (stackDepth < this._stackDepth) {
200
- this.cloneLastStackItem();
201
- this.cloneHeader();
202
- this.schedule(this.slideBack);
203
- } else if (stackDepth > this._stackDepth) {
204
- this.cloneHeader();
205
- this.schedule(this.slideForward);
206
- }
207
-
208
- this._stackDepth = stackDepth;
209
- this._rootComponentKey = rootComponentKey;
210
- }
211
-
212
- schedule(method) {
213
- scheduleOnce('afterRender', this, method);
214
- }
215
-
216
- computeXPosition() {
217
- let stackDepth = this.stackDepth;
218
- if (stackDepth === 0) {
219
- return 0;
220
- }
221
- let currentStackItemElement = this.element.querySelector(
222
- '.NavStack-item:last-child',
223
- );
224
- if (!currentStackItemElement) {
225
- return 0;
226
- }
227
- let itemWidth = currentStackItemElement.getBoundingClientRect().width;
228
-
229
- let layerX = (stackDepth - 1) * itemWidth * -1;
230
- return layerX;
231
- }
232
-
233
- @action
234
- repositionX() {
235
- let itemContainerElement = this.element.querySelector(
236
- '.NavStack-itemContainer',
237
- );
238
- let newX = this.computeXPosition();
239
- setTransform(itemContainerElement, `translateX(${newX}px)`);
240
- }
241
-
242
- cut() {
243
- if (this.isDestroying || this.isDestroyed) {
244
- return;
245
- }
246
-
247
- this.horizontalTransition({
248
- toValue: this.computeXPosition(),
249
- animate: false,
250
- });
251
-
252
- if ((this.args.layer > 0) & (this.stackDepth > 0)) {
253
- this.verticalTransition({
254
- element: this.element,
255
- toValue: 0,
256
- animate: false,
257
- });
258
- }
259
- }
260
-
261
- slideForward() {
262
- if (this.isDestroying || this.isDestroyed) {
263
- return;
264
- }
265
- this.horizontalTransition({
266
- toValue: this.computeXPosition(),
267
- finishCallback: () => {
268
- this.removeClonedHeader();
269
- },
270
- });
271
- }
272
-
273
- slideBack() {
274
- if (this.isDestroying || this.isDestroyed) {
275
- return;
276
- }
277
- this.horizontalTransition({
278
- toValue: this.computeXPosition(),
279
- finishCallback: () => {
280
- this.removeClonedStackItem();
281
- this.removeClonedHeader();
282
- },
283
- });
284
- }
285
-
286
- slideUp() {
287
- if (this.isDestroying || this.isDestroyed) {
288
- return;
289
- }
290
-
291
- let debug = this.birdsEyeDebugging;
292
- this.verticalTransition({
293
- element: this.element,
294
- toValue: 0,
295
- fromValue: debug ? 480 : this.element.getBoundingClientRect().height,
296
- });
297
- }
298
-
299
- slideDown() {
300
- if (this.isDestroying || this.isDestroyed) {
301
- return;
302
- }
303
- let debug = this.birdsEyeDebugging;
304
- let clonedElement = this.clones.elements[this.clones.elements.length - 1];
305
- let y = debug ? 480 : clonedElement.getBoundingClientRect().height;
306
- nextTick().then(() => {
307
- this.verticalTransition({
308
- element: clonedElement,
309
- toValue: y,
310
- finishCallback: () => {
311
- this.removeClonedElement();
312
- },
313
- });
314
- });
315
- }
316
-
317
- horizontalTransition({
318
- toValue,
319
- fromValue,
320
- animate = !this.suppressAnimation,
321
- finishCallback,
322
- }) {
323
- let itemContainerElement = this.element.querySelector(
324
- '.NavStack-itemContainer',
325
- );
326
- let currentHeaderElement = this.element.querySelector(
327
- '.NavStack-currentHeaderContainer',
328
- );
329
- let clonedHeaderElement = this.element.querySelector(
330
- '.NavStack-clonedHeaderContainer',
331
- );
332
-
333
- this.transitionDidBegin();
334
- this.notifyTransitionStart();
335
- let isNoOp = false;
336
- let finish = () => {
337
- setTransform(itemContainerElement, `translateX(${toValue}px)`);
338
- // The no-op case occurs during slideBack after a completed back-swipe:
339
- // the header styles were already set as part of the swipe, so we don't
340
- // want to change them further here.
341
- if (!isNoOp) {
342
- styleHeaderElements(
343
- currentTransitionPercentage(fromValue, toValue, toValue),
344
- fromValue === undefined || fromValue > toValue,
345
- currentHeaderElement,
346
- clonedHeaderElement,
347
- );
348
- }
349
- this.notifyTransitionEnd();
350
- this.transitionDidEnd();
351
- if (finishCallback) {
352
- finishCallback();
353
- }
354
- };
355
- if (animate) {
356
- fromValue = fromValue || this.getX(itemContainerElement);
357
- if (fromValue === toValue) {
358
- isNoOp = true;
359
- run(finish);
360
- return;
361
- }
362
- let spring = this._createSpring({ fromValue, toValue });
363
- spring
364
- .onUpdate((s) => {
365
- setTransform(itemContainerElement, `translateX(${s.currentValue}px)`);
366
- styleHeaderElements(
367
- currentTransitionPercentage(fromValue, toValue, s.currentValue),
368
- fromValue > toValue,
369
- currentHeaderElement,
370
- clonedHeaderElement,
371
- );
372
- })
373
- .onStop(() => {
374
- run(finish);
375
- })
376
- .start();
377
- return;
378
- }
379
- run(finish);
380
- }
381
-
382
- verticalTransition({
383
- element,
384
- toValue,
385
- fromValue,
386
- animate = !this.suppressAnimation,
387
- finishCallback,
388
- }) {
389
- this.transitionDidBegin();
390
- this.notifyTransitionStart();
391
- let finish = () => {
392
- setTransform(element, `translateY(${toValue}px)`);
393
- this.notifyTransitionEnd();
394
- this.transitionDidEnd();
395
- if (finishCallback) {
396
- finishCallback();
397
- }
398
- };
399
- if (animate) {
400
- fromValue = fromValue || element.getBoundingClientRect().top;
401
- if (fromValue === toValue) {
402
- run(finish);
403
- return;
404
- }
405
- let spring = this._createSpring({ fromValue, toValue });
406
- spring
407
- .onUpdate((s) => {
408
- setTransform(element, `translateY(${s.currentValue}px)`);
409
- })
410
- .onStop(() => {
411
- run(finish);
412
- })
413
- .start();
414
- return;
415
- }
416
- run(finish);
417
- }
418
-
419
- _createSpring({ initialVelocity = 0, fromValue, toValue }) {
420
- return new Spring({
421
- initialVelocity,
422
- fromValue,
423
- toValue,
424
- stiffness: 1000,
425
- damping: 500,
426
- mass: 3,
427
- });
428
- }
429
-
430
- disablePanRecognizer() {
431
- this.hammer?.get('pan').set({ enable: false });
432
- }
433
-
434
- transitionDidBegin() {
435
- this.disablePanRecognizer();
436
- }
437
-
438
- transitionDidEnd() {
439
- if (this._currentStackItemElement) {
440
- this.disablePanRecognizer();
441
- }
442
- if (!this.element || this.stackDepth <= 1) {
443
- return;
444
- }
445
- this._setupPanHandlerContext();
446
- }
447
-
448
- notifyTransitionStart() {
449
- this.navStacksService.notifyTransitionStart();
450
- }
451
-
452
- notifyTransitionEnd() {
453
- this.navStacksService.notifyTransitionEnd();
454
- }
455
-
456
- _setupPanHandlerContext() {
457
- this.containerElement = this.element.querySelector(
458
- '.NavStack-itemContainer',
459
- );
460
- this.currentHeaderElement = this.element.querySelector(
461
- '.NavStack-currentHeaderContainer',
462
- );
463
- this.parentHeaderElement = this.element.querySelector(
464
- '.NavStack-parentItemHeaderContainer',
465
- );
466
- this.startingX = this.getX(this.containerElement);
467
- let currentStackItemElement = (this._currentStackItemElement =
468
- this.element.querySelector('.NavStack-item:last-child'));
469
- if (!currentStackItemElement) {
470
- return;
471
- }
472
- let itemWidth = currentStackItemElement.getBoundingClientRect().width;
473
- this.backX = this.startingX + itemWidth;
474
- this.thresholdX = itemWidth / 2;
475
- this.canNavigateBack = this.back && this.stackDepth > 1;
476
- this.hammer?.get('pan').set({ enable: true, threshold: 9 });
477
- }
478
-
479
- @action
480
- handlePanEvent(ev) {
481
- if (this._activeSpring) {
482
- return;
483
- }
484
- setTransform(
485
- this.containerElement,
486
- `translateX(${this.startingX + ev.deltaX}px)`,
487
- );
488
- styleHeaderElements(
489
- currentTransitionPercentage(
490
- this.startingX,
491
- this.backX,
492
- this.startingX + ev.deltaX,
493
- ),
494
- true,
495
- this.currentHeaderElement,
496
- this.parentHeaderElement,
497
- );
498
-
499
- let transitionRatio = currentTransitionPercentage(
500
- this.startingX,
501
- this.backX,
502
- this.startingX + ev.deltaX,
503
- );
504
- if (this.currentHeaderElement) {
505
- this.currentHeaderElement.style.opacity = transitionRatio;
506
- }
507
- if (this.parentHeaderElement) {
508
- this.parentHeaderElement.style.opacity = 1 - transitionRatio;
509
- }
510
- if (ev.isFinal) {
511
- this.handlePanEnd(ev);
512
- }
513
- }
514
-
515
- handlePanEnd(ev) {
516
- let shouldNavigateBack =
517
- this.adjustX(ev.center.x) >= this.thresholdX && this.canNavigateBack;
518
- let initialVelocity = ev.velocityX;
519
- let fromValue = this.startingX + ev.deltaX;
520
- let toValue = shouldNavigateBack ? this.backX : this.startingX;
521
- this.navStacksService.notifyTransitionStart();
522
- let finalize = () => {
523
- if (shouldNavigateBack) {
524
- styleHeaderElements(
525
- currentTransitionPercentage(this.startingX, this.backX, this.backX),
526
- false,
527
- this.parentHeaderElement,
528
- this.currentHeaderElement,
529
- );
530
- } else {
531
- setTransform(this.containerElement, `translateX(${this.startingX}px)`);
532
- styleHeaderElements(
533
- currentTransitionPercentage(
534
- this.startingX,
535
- this.backX,
536
- this.startingX,
537
- ),
538
- false,
539
- this.parentHeaderElement,
540
- this.currentHeaderElement,
541
- );
542
- }
543
- if (this.currentHeaderElement) {
544
- this.currentHeaderElement.style.opacity = 1;
545
- setTransform(this.currentHeaderElement, 'translateX(0px)');
546
- }
547
- if (this.parentHeaderElement) {
548
- this.parentHeaderElement.style.opacity = 0;
549
- setTransform(this.parentHeaderElement, 'translateX(-60px)');
550
- }
551
- this.navStacksService.notifyTransitionEnd();
552
- this._activeSpring = null;
553
- if (shouldNavigateBack) {
554
- run(this.args, this.args.back);
555
- }
556
- };
557
- if (fromValue === toValue && initialVelocity === 0) {
558
- finalize();
559
- return;
560
- }
561
- let spring = this._createSpring({ initialVelocity, fromValue, toValue });
562
- this._activeSpring = spring;
563
- spring
564
- .onUpdate((s) => {
565
- setTransform(this.containerElement, `translateX(${s.currentValue}px)`);
566
- styleHeaderElements(
567
- currentTransitionPercentage(
568
- this.startingX,
569
- this.backX,
570
- s.currentValue,
571
- ),
572
- false,
573
- this.parentHeaderElement,
574
- this.currentHeaderElement,
575
- );
576
- if (
577
- !shouldNavigateBack &&
578
- s.currentValue >= this.startingX + this.thresholdX
579
- ) {
580
- shouldNavigateBack = true;
581
- spring.updateConfig({
582
- toValue: this.backX,
583
- });
584
- }
585
- })
586
- .onStop(() => {
587
- finalize();
588
- })
589
- .start();
590
- }
591
-
592
- cloneLastStackItem() {
593
- let clone = this.element
594
- .querySelector('.NavStack-item:last-child')
595
- .cloneNode(true);
596
- this.clones.stackItems.push(clone);
597
- clone.setAttribute('id', `${this.elementId}_clonedStackItem`);
598
- this.attachClonedStackItem(clone);
599
- }
600
-
601
- cloneHeader() {
602
- this.removeClonedHeader();
603
- let liveHeader = this.element.querySelector(
604
- '.NavStack-currentHeaderContainer',
605
- );
606
- if (!liveHeader) {
607
- return;
608
- }
609
- let clonedHeader = liveHeader.cloneNode(true);
610
- this.clones.headers.push(clonedHeader);
611
- clonedHeader.classList.remove('NavStack-currentHeaderContainer');
612
- clonedHeader.classList.add('NavStack-clonedHeaderContainer');
613
- this.attachClonedHeader(clonedHeader);
614
- }
615
-
616
- cloneElement() {
617
- let clone = this.element.cloneNode(true);
618
- this.clones.elements.push(clone);
619
- clone.setAttribute('id', `${this.elementId}_clone`);
620
- this.attachClonedElement(clone);
621
- }
622
-
623
- attachClonedStackItem(clone) {
624
- this.element.querySelector('.NavStack-itemContainer').appendChild(clone);
625
- }
626
-
627
- attachClonedHeader(clone) {
628
- let headerWrapper = this.element.querySelector('.NavStack-header');
629
- headerWrapper.insertBefore(clone, headerWrapper.firstChild);
630
- }
631
-
632
- attachClonedElement(clone) {
633
- this.element.parentNode.appendChild(clone);
634
- clone.style.transform; // force layout, without this CSS transition does not run
635
- clone.style.webkitTransform; // force layout, without this CSS transition does not run
636
- }
637
-
638
- removeClonedHeader() {
639
- var clonedHeader;
640
- while ((clonedHeader = this.clones.headers.pop())) {
641
- //eslint-disable-line no-cond-assign
642
- clonedHeader.parentNode.removeChild(clonedHeader);
643
- }
644
- }
645
-
646
- removeClonedStackItem() {
647
- var clonedStackItem;
648
- while ((clonedStackItem = this.clones.stackItems.pop())) {
649
- //eslint-disable-line no-cond-assign
650
- clonedStackItem.parentNode.removeChild(clonedStackItem);
651
- }
652
- }
653
-
654
- removeClonedElement() {
655
- var clonedElement;
656
- while ((clonedElement = this.clones.elements.pop())) {
657
- //eslint-disable-line no-cond-assign
658
- clonedElement.parentNode.removeChild(clonedElement);
659
- }
660
- }
661
-
662
- preferRecognizer(recognizer) {
663
- this.hammer?.get('pan').requireFailure(recognizer);
664
- }
665
-
666
- stopPreferringRecognizer(recognizer) {
667
- this.hammer?.get('pan').dropRequireFailure(recognizer);
668
- }
669
-
670
- getTestContainerEl() {
671
- if (this._testContainerEl === undefined) {
672
- this._testContainerEl = document.querySelector('#ember-testing') || false;
673
- }
674
- return this._testContainerEl;
675
- }
676
-
677
- getX(element) {
678
- return this.adjustX(element.getBoundingClientRect().left);
679
- }
680
-
681
- adjustX(x) {
682
- if (DEBUG) {
683
- let testContainerEl = this.getTestContainerEl();
684
- if (testContainerEl) {
685
- return x - testContainerEl.getBoundingClientRect().left;
686
- }
687
- }
688
- return x;
689
- }
690
- }
@@ -1,37 +0,0 @@
1
- <div
2
- id={{this.elementId}}
3
- class={{concat
4
- 'NavStack '
5
- (if this.birdsEyeDebugging 'is-birdsEyeDebugging ')
6
- this.layerIndexCssClass ' '
7
- (if this.hasFooter 'NavStack--withFooter ')
8
- }}
9
- {{did-insert this.setupHammer}}
10
- {{will-destroy this.tearDownHammer}}
11
- ...attributes
12
- >
13
- <div class="NavStack-itemContainer">
14
- {{#each this.components as |stackItemComponent index|}}
15
- <div class={{concat 'NavStack-item NavStack-item-' index}}>
16
- {{#if (lte (sub this.stackDepth index) 2)}}
17
- {{component stackItemComponent}}
18
- {{/if}}
19
- </div>
20
- {{/each}}
21
- </div>
22
- <div class="NavStack-header">
23
- {{#if this.parentItemHeaderComponent}}
24
- <div class="NavStack-headerContainer NavStack-parentItemHeaderContainer">
25
- {{component this.parentItemHeaderComponent class="NavStack-headerComponent" back=@back}}
26
- </div>
27
- {{/if}}
28
- <div class="NavStack-headerContainer NavStack-currentHeaderContainer">
29
- {{component this.headerComponent class="NavStack-headerComponent" back=@back}}
30
- </div>
31
- </div>
32
- {{#if this.hasFooter}}
33
- <div class="NavStack-footer">
34
- {{component @footer}}
35
- </div>
36
- {{/if}}
37
- </div>