ember-nav-stack 7.1.4 → 7.1.5

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.
@@ -221,7 +221,17 @@ class BackSwipeGesture {
221
221
  // If the spring's momentum carries it past the back-threshold after
222
222
  // the user released below the threshold, retarget to backX so the
223
223
  // animation completes the back-swipe rather than snapping back.
224
- if (!shouldNavigateBack && s.currentValue >= this.startingX + this.thresholdX) {
224
+ // Gated on `canNavigateBack` so a vigorous swipe at a root page
225
+ // (where back navigation is disallowed) can't promote itself into a
226
+ // successful back-swipe via momentum: the swipe-release branch
227
+ // correctly set `shouldNavigateBack = false`, but without this gate
228
+ // the first onUpdate tick — currentValue still near `fromValue`,
229
+ // which is past threshold — would flip it back to true. The
230
+ // resulting `finalize` would translate the item container off to
231
+ // the right and fire `onBack()`. At root, `onBack` is typically a
232
+ // no-op (no stack change), so the container never recovers and the
233
+ // viewport reads as empty/white. See Y-1342.
234
+ if (this.canNavigateBack && !shouldNavigateBack && s.currentValue >= this.startingX + this.thresholdX) {
225
235
  shouldNavigateBack = true;
226
236
  spring.updateConfig({
227
237
  toValue: this.backX
@@ -1 +1 @@
1
- {"version":3,"file":"back-swipe-gesture.js","sources":["../src/back-swipe-gesture.js"],"sourcesContent":["import Hammer from 'hammerjs';\nimport { run } from '@ember/runloop';\nimport { Spring } from 'wobble';\nimport { macroCondition, isTesting } from '@embroider/macros';\nimport BackSwipeRecognizer from './utils/back-swipe-recognizer.js';\nimport { setTransform } from './utils/animation.js';\nimport {\n HEADER_PARALLAX_OFFSET,\n currentTransitionPercentage,\n styleHeaderElements,\n} from './utils/header-style.js';\n\n// Spring configuration for the swipe-driven horizontal animation. Tuned to\n// match the programmatic spring used by `NavStack#horizontalTransition`.\nconst SWIPE_SPRING_CONFIG = {\n stiffness: 1000,\n damping: 500,\n mass: 3,\n};\n\n// Encapsulates the back-swipe gesture state and behavior. NavStack\n// instantiates one of these in its `did-insert` callback and tears it down\n// on `will-destroy`. The gesture owns:\n//\n// - The Hammer.js manager + BackSwipeRecognizer\n// - The pan handler context (element refs, startingX, backX, thresholdX)\n// - The swipe-driven Spring (cancellation, onUpdate, onStop)\n// - The target-header overlay snapshot used to bridge the re-render gap\n// after a completed back-swipe (see PR #79 for the bug fix)\n// - Registration with the gesture service for cross-component recognizer\n// ordering (preferRecognizer / stopPreferringRecognizer)\n//\n// NavStack communicates with the gesture via three callbacks supplied at\n// construction time:\n//\n// getCanNavigateBack() → boolean\n// Returns whether back navigation is currently allowed (typically\n// `stackDepth > 1` and `args.back` defined). Re-evaluated on every\n// `setupContext()` call so the gesture stays in sync with stack changes.\n//\n// onBack()\n// Invoked when a back-swipe completes successfully. Wraps the\n// consumer's `@back` callback.\n//\n// onBackSwipeOverlay(clone)\n// Invoked with the cloned target-header element immediately before\n// `onBack`. NavStack stores the clone so its `handleStackDepthChange`\n// can schedule cleanup once the stack pop actually lands (see the\n// gesture-back overlay machinery in PR #79).\n//\n// NavStack drives the gesture's pan-recognizer state during programmatic\n// transitions via `disablePan()` (called from `transitionDidBegin`) and\n// `setupContext()` (called from `transitionDidEnd` to re-grab DOM refs and\n// re-enable the recognizer once the animation completes).\nexport default class BackSwipeGesture {\n constructor({\n element,\n navStacksService,\n gestureService,\n getCanNavigateBack,\n onBack,\n onBackSwipeOverlay,\n }) {\n this.element = element;\n this.navStacksService = navStacksService;\n this.gestureService = gestureService;\n this.getCanNavigateBack = getCanNavigateBack;\n this.onBack = onBack;\n this.onBackSwipeOverlay = onBackSwipeOverlay;\n\n this.hammer = new Hammer.Manager(element, {\n inputClass: Hammer.TouchMouseInput,\n recognizers: [[BackSwipeRecognizer]],\n });\n this.setupContext();\n this.hammer.on('pan', this._handlePanEvent);\n this.gestureService.register(this, this.hammer.get('pan'));\n }\n\n teardown() {\n if (this.hammer) {\n this.gestureService.unregister(this, this.hammer.get('pan'));\n this.hammer.off('pan');\n this.hammer.destroy();\n this.hammer = null;\n }\n // If a swipe completed and produced an overlay but the consumer hasn't\n // claimed it via `onBackSwipeOverlay` yet (or we're being destroyed in\n // mid-stride), drop it so it doesn't leak into the DOM.\n if (this._unclaimedOverlay?.parentNode) {\n this._unclaimedOverlay.parentNode.removeChild(this._unclaimedOverlay);\n }\n this._unclaimedOverlay = null;\n }\n\n // Called by NavStack when a programmatic transition starts. Disables the\n // pan recognizer so a new swipe can't start while the animation is\n // running. A swipe-driven spring that's already in flight is left to\n // complete on its own — the programmatic transition's spring tracks its\n // active spring separately (NavStack#_horizontalSpring) and cancels any\n // prior horizontal spring before starting.\n disablePan() {\n this.hammer?.get('pan').set({ enable: false });\n }\n\n // Called by NavStack after a programmatic transition completes (and also\n // by the constructor for initial wiring). Re-grabs DOM refs (item width\n // may have changed), recomputes startingX/backX/thresholdX, and\n // re-enables the recognizer.\n setupContext() {\n this.containerElement = this.element.querySelector(\n '.NavStack-itemContainer',\n );\n this.currentHeaderElement = this.element.querySelector(\n '.NavStack-currentHeaderContainer',\n );\n this.parentHeaderElement = this.element.querySelector(\n '.NavStack-parentItemHeaderContainer',\n );\n this.startingX = this._getX(this.containerElement);\n let currentStackItemElement = this.element.querySelector(\n '.NavStack-item:last-child',\n );\n if (!currentStackItemElement) {\n this.canNavigateBack = false;\n return;\n }\n let itemWidth = currentStackItemElement.getBoundingClientRect().width;\n this.backX = this.startingX + itemWidth;\n this.thresholdX = itemWidth / 2;\n this.canNavigateBack = this.getCanNavigateBack();\n this.hammer?.get('pan').set({ enable: true, threshold: 9 });\n }\n\n // Called by the gesture service when another gesture-aware component\n // registers — we must require its pan recognizer to fail before ours can\n // succeed (or vice versa). Matches the public surface the service\n // expects on registered objects.\n preferRecognizer(recognizer) {\n this.hammer?.get('pan').requireFailure(recognizer);\n }\n\n stopPreferringRecognizer(recognizer) {\n this.hammer?.get('pan').dropRequireFailure(recognizer);\n }\n\n _handlePanEvent = (ev) => {\n if (this._activeSpring) {\n return;\n }\n // Clamp the gesture's effective displacement at 0 so it can never travel\n // left of its starting position. Without this, sliding the finger past\n // origin produces a negative `deltaX`, and `currentTransitionPercentage`\n // — which takes Math.abs of the delta — interprets it as forward\n // progress: parent header fades in and current header fades out as if a\n // forward transition were under way, the opposite of the back-swipe the\n // user actually started. Clamping makes the gesture latch at origin\n // until the finger crosses back rightward.\n let effectiveDeltaX = Math.max(0, ev.deltaX);\n setTransform(\n this.containerElement,\n `translateX(${this.startingX + effectiveDeltaX}px)`,\n );\n let ratio = currentTransitionPercentage(\n this.startingX,\n this.backX,\n this.startingX + effectiveDeltaX,\n );\n styleHeaderElements(\n ratio,\n true,\n this.currentHeaderElement,\n this.parentHeaderElement,\n );\n if (this.currentHeaderElement) {\n this.currentHeaderElement.style.opacity = ratio;\n }\n if (this.parentHeaderElement) {\n this.parentHeaderElement.style.opacity = 1 - ratio;\n }\n if (ev.isFinal) {\n this._handlePanEnd(ev);\n }\n };\n\n _handlePanEnd(ev) {\n let effectiveDeltaX = Math.max(0, ev.deltaX);\n let shouldNavigateBack =\n this._adjustX(ev.center.x) >= this.thresholdX && this.canNavigateBack;\n let initialVelocity = ev.velocityX;\n let fromValue = this.startingX + effectiveDeltaX;\n let toValue = shouldNavigateBack ? this.backX : this.startingX;\n this.navStacksService.notifyTransitionStart();\n\n let finalize = () => {\n if (shouldNavigateBack) {\n // The cross-fade ended with parentHeaderElement (target page header)\n // visible. onBack() will eventually re-render the live header\n // containers, swapping content: currentHeaderContainer becomes the\n // target page's header. Snapshot the visible target header into an\n // overlay clone so it stays on screen across that re-render.\n // Cleanup is owned by the parent NavStack and runs once the stack\n // pop actually lands (see PR #79 for the full lifecycle).\n let overlay = this._cloneTargetHeaderOverlay();\n if (this.currentHeaderElement) {\n this.currentHeaderElement.style.opacity = 0;\n setTransform(\n this.currentHeaderElement,\n `translateX(${HEADER_PARALLAX_OFFSET}px)`,\n );\n }\n if (this.parentHeaderElement) {\n this.parentHeaderElement.style.opacity = 0;\n setTransform(\n this.parentHeaderElement,\n `translateX(${-HEADER_PARALLAX_OFFSET}px)`,\n );\n }\n this.navStacksService.notifyTransitionEnd();\n this._activeSpring = null;\n this._unclaimedOverlay = overlay;\n this.onBackSwipeOverlay?.(overlay);\n this._unclaimedOverlay = null;\n run(this.onBack);\n } else {\n setTransform(this.containerElement, `translateX(${this.startingX}px)`);\n if (this.currentHeaderElement) {\n this.currentHeaderElement.style.opacity = 1;\n setTransform(this.currentHeaderElement, 'translateX(0px)');\n }\n if (this.parentHeaderElement) {\n this.parentHeaderElement.style.opacity = 0;\n setTransform(\n this.parentHeaderElement,\n `translateX(${-HEADER_PARALLAX_OFFSET}px)`,\n );\n }\n this.navStacksService.notifyTransitionEnd();\n this._activeSpring = null;\n }\n };\n\n if (fromValue === toValue && initialVelocity === 0) {\n finalize();\n return;\n }\n let spring = new Spring({\n initialVelocity,\n fromValue,\n toValue,\n ...SWIPE_SPRING_CONFIG,\n });\n this._activeSpring = spring;\n spring\n .onUpdate((s) => {\n setTransform(this.containerElement, `translateX(${s.currentValue}px)`);\n styleHeaderElements(\n currentTransitionPercentage(\n this.startingX,\n this.backX,\n s.currentValue,\n ),\n false,\n this.parentHeaderElement,\n this.currentHeaderElement,\n );\n // If the spring's momentum carries it past the back-threshold after\n // the user released below the threshold, retarget to backX so the\n // animation completes the back-swipe rather than snapping back.\n if (\n !shouldNavigateBack &&\n s.currentValue >= this.startingX + this.thresholdX\n ) {\n shouldNavigateBack = true;\n spring.updateConfig({ toValue: this.backX });\n }\n })\n .onStop(() => finalize())\n .start();\n }\n\n _cloneTargetHeaderOverlay() {\n let liveParent = this.element.querySelector(\n '.NavStack-parentItemHeaderContainer',\n );\n if (!liveParent) {\n return null;\n }\n let clone = liveParent.cloneNode(true);\n clone.classList.remove('NavStack-parentItemHeaderContainer');\n clone.classList.add('NavStack-gestureBackTargetHeader');\n clone.style.opacity = '1';\n setTransform(clone, 'translateX(0px)');\n // Append last so it paints on top of currentHeaderContainer.\n this.element.querySelector('.NavStack-header').appendChild(clone);\n return clone;\n }\n\n _getX(element) {\n return this._adjustX(element.getBoundingClientRect().left);\n }\n\n _adjustX(x) {\n if (macroCondition(isTesting())) {\n let testingEl = document.querySelector('#ember-testing');\n if (testingEl) {\n return x - testingEl.getBoundingClientRect().left;\n }\n }\n return x;\n }\n}\n"],"names":["SWIPE_SPRING_CONFIG","stiffness","damping","mass","BackSwipeGesture","constructor","element","navStacksService","gestureService","getCanNavigateBack","onBack","onBackSwipeOverlay","hammer","Hammer","Manager","inputClass","TouchMouseInput","recognizers","BackSwipeRecognizer","setupContext","on","_handlePanEvent","register","get","teardown","unregister","off","destroy","_unclaimedOverlay","parentNode","removeChild","disablePan","set","enable","containerElement","querySelector","currentHeaderElement","parentHeaderElement","startingX","_getX","currentStackItemElement","canNavigateBack","itemWidth","getBoundingClientRect","width","backX","thresholdX","threshold","preferRecognizer","recognizer","requireFailure","stopPreferringRecognizer","dropRequireFailure","ev","_activeSpring","effectiveDeltaX","Math","max","deltaX","setTransform","ratio","currentTransitionPercentage","styleHeaderElements","style","opacity","isFinal","_handlePanEnd","shouldNavigateBack","_adjustX","center","x","initialVelocity","velocityX","fromValue","toValue","notifyTransitionStart","finalize","overlay","_cloneTargetHeaderOverlay","HEADER_PARALLAX_OFFSET","notifyTransitionEnd","run","spring","Spring","onUpdate","s","currentValue","updateConfig","onStop","start","liveParent","clone","cloneNode","classList","remove","add","appendChild","left","macroCondition","isTesting","testingEl","document"],"mappings":"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"}
1
+ {"version":3,"file":"back-swipe-gesture.js","sources":["../src/back-swipe-gesture.js"],"sourcesContent":["import Hammer from 'hammerjs';\nimport { run } from '@ember/runloop';\nimport { Spring } from 'wobble';\nimport { macroCondition, isTesting } from '@embroider/macros';\nimport BackSwipeRecognizer from './utils/back-swipe-recognizer.js';\nimport { setTransform } from './utils/animation.js';\nimport {\n HEADER_PARALLAX_OFFSET,\n currentTransitionPercentage,\n styleHeaderElements,\n} from './utils/header-style.js';\n\n// Spring configuration for the swipe-driven horizontal animation. Tuned to\n// match the programmatic spring used by `NavStack#horizontalTransition`.\nconst SWIPE_SPRING_CONFIG = {\n stiffness: 1000,\n damping: 500,\n mass: 3,\n};\n\n// Encapsulates the back-swipe gesture state and behavior. NavStack\n// instantiates one of these in its `did-insert` callback and tears it down\n// on `will-destroy`. The gesture owns:\n//\n// - The Hammer.js manager + BackSwipeRecognizer\n// - The pan handler context (element refs, startingX, backX, thresholdX)\n// - The swipe-driven Spring (cancellation, onUpdate, onStop)\n// - The target-header overlay snapshot used to bridge the re-render gap\n// after a completed back-swipe (see PR #79 for the bug fix)\n// - Registration with the gesture service for cross-component recognizer\n// ordering (preferRecognizer / stopPreferringRecognizer)\n//\n// NavStack communicates with the gesture via three callbacks supplied at\n// construction time:\n//\n// getCanNavigateBack() → boolean\n// Returns whether back navigation is currently allowed (typically\n// `stackDepth > 1` and `args.back` defined). Re-evaluated on every\n// `setupContext()` call so the gesture stays in sync with stack changes.\n//\n// onBack()\n// Invoked when a back-swipe completes successfully. Wraps the\n// consumer's `@back` callback.\n//\n// onBackSwipeOverlay(clone)\n// Invoked with the cloned target-header element immediately before\n// `onBack`. NavStack stores the clone so its `handleStackDepthChange`\n// can schedule cleanup once the stack pop actually lands (see the\n// gesture-back overlay machinery in PR #79).\n//\n// NavStack drives the gesture's pan-recognizer state during programmatic\n// transitions via `disablePan()` (called from `transitionDidBegin`) and\n// `setupContext()` (called from `transitionDidEnd` to re-grab DOM refs and\n// re-enable the recognizer once the animation completes).\nexport default class BackSwipeGesture {\n constructor({\n element,\n navStacksService,\n gestureService,\n getCanNavigateBack,\n onBack,\n onBackSwipeOverlay,\n }) {\n this.element = element;\n this.navStacksService = navStacksService;\n this.gestureService = gestureService;\n this.getCanNavigateBack = getCanNavigateBack;\n this.onBack = onBack;\n this.onBackSwipeOverlay = onBackSwipeOverlay;\n\n this.hammer = new Hammer.Manager(element, {\n inputClass: Hammer.TouchMouseInput,\n recognizers: [[BackSwipeRecognizer]],\n });\n this.setupContext();\n this.hammer.on('pan', this._handlePanEvent);\n this.gestureService.register(this, this.hammer.get('pan'));\n }\n\n teardown() {\n if (this.hammer) {\n this.gestureService.unregister(this, this.hammer.get('pan'));\n this.hammer.off('pan');\n this.hammer.destroy();\n this.hammer = null;\n }\n // If a swipe completed and produced an overlay but the consumer hasn't\n // claimed it via `onBackSwipeOverlay` yet (or we're being destroyed in\n // mid-stride), drop it so it doesn't leak into the DOM.\n if (this._unclaimedOverlay?.parentNode) {\n this._unclaimedOverlay.parentNode.removeChild(this._unclaimedOverlay);\n }\n this._unclaimedOverlay = null;\n }\n\n // Called by NavStack when a programmatic transition starts. Disables the\n // pan recognizer so a new swipe can't start while the animation is\n // running. A swipe-driven spring that's already in flight is left to\n // complete on its own — the programmatic transition's spring tracks its\n // active spring separately (NavStack#_horizontalSpring) and cancels any\n // prior horizontal spring before starting.\n disablePan() {\n this.hammer?.get('pan').set({ enable: false });\n }\n\n // Called by NavStack after a programmatic transition completes (and also\n // by the constructor for initial wiring). Re-grabs DOM refs (item width\n // may have changed), recomputes startingX/backX/thresholdX, and\n // re-enables the recognizer.\n setupContext() {\n this.containerElement = this.element.querySelector(\n '.NavStack-itemContainer',\n );\n this.currentHeaderElement = this.element.querySelector(\n '.NavStack-currentHeaderContainer',\n );\n this.parentHeaderElement = this.element.querySelector(\n '.NavStack-parentItemHeaderContainer',\n );\n this.startingX = this._getX(this.containerElement);\n let currentStackItemElement = this.element.querySelector(\n '.NavStack-item:last-child',\n );\n if (!currentStackItemElement) {\n this.canNavigateBack = false;\n return;\n }\n let itemWidth = currentStackItemElement.getBoundingClientRect().width;\n this.backX = this.startingX + itemWidth;\n this.thresholdX = itemWidth / 2;\n this.canNavigateBack = this.getCanNavigateBack();\n this.hammer?.get('pan').set({ enable: true, threshold: 9 });\n }\n\n // Called by the gesture service when another gesture-aware component\n // registers — we must require its pan recognizer to fail before ours can\n // succeed (or vice versa). Matches the public surface the service\n // expects on registered objects.\n preferRecognizer(recognizer) {\n this.hammer?.get('pan').requireFailure(recognizer);\n }\n\n stopPreferringRecognizer(recognizer) {\n this.hammer?.get('pan').dropRequireFailure(recognizer);\n }\n\n _handlePanEvent = (ev) => {\n if (this._activeSpring) {\n return;\n }\n // Clamp the gesture's effective displacement at 0 so it can never travel\n // left of its starting position. Without this, sliding the finger past\n // origin produces a negative `deltaX`, and `currentTransitionPercentage`\n // — which takes Math.abs of the delta — interprets it as forward\n // progress: parent header fades in and current header fades out as if a\n // forward transition were under way, the opposite of the back-swipe the\n // user actually started. Clamping makes the gesture latch at origin\n // until the finger crosses back rightward.\n let effectiveDeltaX = Math.max(0, ev.deltaX);\n setTransform(\n this.containerElement,\n `translateX(${this.startingX + effectiveDeltaX}px)`,\n );\n let ratio = currentTransitionPercentage(\n this.startingX,\n this.backX,\n this.startingX + effectiveDeltaX,\n );\n styleHeaderElements(\n ratio,\n true,\n this.currentHeaderElement,\n this.parentHeaderElement,\n );\n if (this.currentHeaderElement) {\n this.currentHeaderElement.style.opacity = ratio;\n }\n if (this.parentHeaderElement) {\n this.parentHeaderElement.style.opacity = 1 - ratio;\n }\n if (ev.isFinal) {\n this._handlePanEnd(ev);\n }\n };\n\n _handlePanEnd(ev) {\n let effectiveDeltaX = Math.max(0, ev.deltaX);\n let shouldNavigateBack =\n this._adjustX(ev.center.x) >= this.thresholdX && this.canNavigateBack;\n let initialVelocity = ev.velocityX;\n let fromValue = this.startingX + effectiveDeltaX;\n let toValue = shouldNavigateBack ? this.backX : this.startingX;\n this.navStacksService.notifyTransitionStart();\n\n let finalize = () => {\n if (shouldNavigateBack) {\n // The cross-fade ended with parentHeaderElement (target page header)\n // visible. onBack() will eventually re-render the live header\n // containers, swapping content: currentHeaderContainer becomes the\n // target page's header. Snapshot the visible target header into an\n // overlay clone so it stays on screen across that re-render.\n // Cleanup is owned by the parent NavStack and runs once the stack\n // pop actually lands (see PR #79 for the full lifecycle).\n let overlay = this._cloneTargetHeaderOverlay();\n if (this.currentHeaderElement) {\n this.currentHeaderElement.style.opacity = 0;\n setTransform(\n this.currentHeaderElement,\n `translateX(${HEADER_PARALLAX_OFFSET}px)`,\n );\n }\n if (this.parentHeaderElement) {\n this.parentHeaderElement.style.opacity = 0;\n setTransform(\n this.parentHeaderElement,\n `translateX(${-HEADER_PARALLAX_OFFSET}px)`,\n );\n }\n this.navStacksService.notifyTransitionEnd();\n this._activeSpring = null;\n this._unclaimedOverlay = overlay;\n this.onBackSwipeOverlay?.(overlay);\n this._unclaimedOverlay = null;\n run(this.onBack);\n } else {\n setTransform(this.containerElement, `translateX(${this.startingX}px)`);\n if (this.currentHeaderElement) {\n this.currentHeaderElement.style.opacity = 1;\n setTransform(this.currentHeaderElement, 'translateX(0px)');\n }\n if (this.parentHeaderElement) {\n this.parentHeaderElement.style.opacity = 0;\n setTransform(\n this.parentHeaderElement,\n `translateX(${-HEADER_PARALLAX_OFFSET}px)`,\n );\n }\n this.navStacksService.notifyTransitionEnd();\n this._activeSpring = null;\n }\n };\n\n if (fromValue === toValue && initialVelocity === 0) {\n finalize();\n return;\n }\n let spring = new Spring({\n initialVelocity,\n fromValue,\n toValue,\n ...SWIPE_SPRING_CONFIG,\n });\n this._activeSpring = spring;\n spring\n .onUpdate((s) => {\n setTransform(this.containerElement, `translateX(${s.currentValue}px)`);\n styleHeaderElements(\n currentTransitionPercentage(\n this.startingX,\n this.backX,\n s.currentValue,\n ),\n false,\n this.parentHeaderElement,\n this.currentHeaderElement,\n );\n // If the spring's momentum carries it past the back-threshold after\n // the user released below the threshold, retarget to backX so the\n // animation completes the back-swipe rather than snapping back.\n // Gated on `canNavigateBack` so a vigorous swipe at a root page\n // (where back navigation is disallowed) can't promote itself into a\n // successful back-swipe via momentum: the swipe-release branch\n // correctly set `shouldNavigateBack = false`, but without this gate\n // the first onUpdate tick — currentValue still near `fromValue`,\n // which is past threshold — would flip it back to true. The\n // resulting `finalize` would translate the item container off to\n // the right and fire `onBack()`. At root, `onBack` is typically a\n // no-op (no stack change), so the container never recovers and the\n // viewport reads as empty/white. See Y-1342.\n if (\n this.canNavigateBack &&\n !shouldNavigateBack &&\n s.currentValue >= this.startingX + this.thresholdX\n ) {\n shouldNavigateBack = true;\n spring.updateConfig({ toValue: this.backX });\n }\n })\n .onStop(() => finalize())\n .start();\n }\n\n _cloneTargetHeaderOverlay() {\n let liveParent = this.element.querySelector(\n '.NavStack-parentItemHeaderContainer',\n );\n if (!liveParent) {\n return null;\n }\n let clone = liveParent.cloneNode(true);\n clone.classList.remove('NavStack-parentItemHeaderContainer');\n clone.classList.add('NavStack-gestureBackTargetHeader');\n clone.style.opacity = '1';\n setTransform(clone, 'translateX(0px)');\n // Append last so it paints on top of currentHeaderContainer.\n this.element.querySelector('.NavStack-header').appendChild(clone);\n return clone;\n }\n\n _getX(element) {\n return this._adjustX(element.getBoundingClientRect().left);\n }\n\n _adjustX(x) {\n if (macroCondition(isTesting())) {\n let testingEl = document.querySelector('#ember-testing');\n if (testingEl) {\n return x - testingEl.getBoundingClientRect().left;\n }\n }\n return x;\n }\n}\n"],"names":["SWIPE_SPRING_CONFIG","stiffness","damping","mass","BackSwipeGesture","constructor","element","navStacksService","gestureService","getCanNavigateBack","onBack","onBackSwipeOverlay","hammer","Hammer","Manager","inputClass","TouchMouseInput","recognizers","BackSwipeRecognizer","setupContext","on","_handlePanEvent","register","get","teardown","unregister","off","destroy","_unclaimedOverlay","parentNode","removeChild","disablePan","set","enable","containerElement","querySelector","currentHeaderElement","parentHeaderElement","startingX","_getX","currentStackItemElement","canNavigateBack","itemWidth","getBoundingClientRect","width","backX","thresholdX","threshold","preferRecognizer","recognizer","requireFailure","stopPreferringRecognizer","dropRequireFailure","ev","_activeSpring","effectiveDeltaX","Math","max","deltaX","setTransform","ratio","currentTransitionPercentage","styleHeaderElements","style","opacity","isFinal","_handlePanEnd","shouldNavigateBack","_adjustX","center","x","initialVelocity","velocityX","fromValue","toValue","notifyTransitionStart","finalize","overlay","_cloneTargetHeaderOverlay","HEADER_PARALLAX_OFFSET","notifyTransitionEnd","run","spring","Spring","onUpdate","s","currentValue","updateConfig","onStop","start","liveParent","clone","cloneNode","classList","remove","add","appendChild","left","macroCondition","isTesting","testingEl","document"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-nav-stack",
3
- "version": "7.1.4",
3
+ "version": "7.1.5",
4
4
  "description": "An Ember addon providing iOS-style navigation stacks with swipe-back gesture support.",
5
5
  "keywords": [
6
6
  "ember-addon"