ember-nav-stack 7.1.3 → 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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"}
@@ -685,6 +685,18 @@ class NavStack extends Component {
685
685
  setTransform(parentHeaderElement, `translateX(${-HEADER_PARALLAX_OFFSET}px)`);
686
686
  }
687
687
  this._clones.remove('gestureBackOverlays', parentClone);
688
+
689
+ // Refresh the gesture's cached startingX / backX / thresholdX and DOM
690
+ // refs after a gesture-driven pop. The overlay-consumed path forces
691
+ // `intent = { kind: 'none' }` so the programmatic transition is
692
+ // skipped — which also skips `_transitionDidEnd`, the usual place
693
+ // `setupContext` runs. Without this refresh the BackSwipeGesture
694
+ // still holds geometry seeded for the pre-pop stack depth, so a
695
+ // second consecutive back-swipe (e.g. on a multi-track page:
696
+ // Schedule Item → Track → Tracks List) jerks the item container an
697
+ // extra item-width left on the first pan-move tick and leaves the
698
+ // next-target stack item off-screen. See Y-1316.
699
+ this._backSwipeGesture?.setupContext();
688
700
  }
689
701
  _cloneLastStackItem() {
690
702
  let clone = this.element.querySelector('.NavStack-item:last-child').cloneNode(true);
@@ -1 +1 @@
1
- {"version":3,"file":"nav-stack.js","sources":["../../src/components/nav-stack.js"],"sourcesContent":["import Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { next, run, scheduleOnce } from '@ember/runloop';\nimport { setTransform } from '../utils/animation.js';\nimport { Spring } from 'wobble';\nimport { macroCondition, isTesting } from '@embroider/macros';\nimport { getOwner } from '@ember/application';\nimport { service } from '@ember/service';\nimport { bool, mapBy, reads } from 'macro-decorators';\nimport { guidFor } from '@ember/object/internals';\nimport {\n extractComponentKey,\n extractComponentName,\n} from '../utils/component.js';\nimport { decideTransition } from '../utils/transition-decision.js';\nimport {\n HEADER_PARALLAX_OFFSET,\n currentTransitionPercentage,\n styleHeaderElements,\n} from '../utils/header-style.js';\nimport CloneStore from '../utils/clone-store.js';\n\nexport default class NavStack extends Component {\n get birdsEyeDebugging() {\n return this.args.birdsEyeDebugging || false;\n }\n\n element;\n\n get elementId() {\n return guidFor(this);\n }\n\n get layer() {\n return this.args.layer;\n }\n\n @service('nav-stacks') navStacksService;\n @service gesture;\n\n constructor() {\n super(...arguments);\n this.navStacksService.register(this);\n let config = getOwner(this).resolveRegistration('config:environment');\n this.#suppressAnimation = !!config?.['ember-nav-stack']?.suppressAnimation;\n }\n\n willDestroy() {\n super.willDestroy(...arguments);\n this._resizeObserver?.disconnect();\n this._resizeObserver = null;\n this.navStacksService.unregister(this);\n // Defensive: sweep every tracked clone in case some transition was\n // abandoned before its normal cleanup ran (e.g. a back-swipe in flight\n // when the consumer tore down the route). The `parentNode?` guard in\n // CloneStore handles clones whose parents are already detached. The\n // detached slide-down clone is not tracked here, so it survives this\n // sweep and keeps animating after we're gone.\n this._clones.clearAll();\n this._pendingGestureBackOverlay = null;\n }\n\n // Called by the service's `_process` immediately before it publishes\n // `this.stacks = newStacks` for the case where our layer's stack just\n // went from non-empty to empty. This is the only moment when our DOM is\n // still attached and we have advance notice that we're about to be torn\n // down by the host's `{{#each (nav-layer-indices)}}`. willDestroy is too\n // late (Glimmer has already detached `this.element` by then, leaving us\n // with no parent to attach the clone to). `_runDetachedSlideDown`\n // self-guards against double-fire from `_applyTransition('slideDown')`,\n // which is the parallel path for setups that don't use nav-layer-indices.\n layerDidEmpty() {\n if (this.args.layer === 0) {\n return;\n }\n this._runDetachedSlideDown();\n }\n\n get layerIndexCssClass() {\n return `NavStack--layer${this.args.layer}`;\n }\n\n get headerComponent() {\n if (this.stackItems.length === 0) {\n return null;\n }\n return this.stackItems[this.stackItems.length - 1].headerComponent;\n }\n\n get parentItemHeaderComponent() {\n if (this.stackItems.length < 2) {\n return null;\n }\n return this.stackItems[this.stackItems.length - 2].headerComponent;\n }\n\n get stackItems() {\n return this.navStacksService.stacks[`layer${this.args.layer}`] || [];\n }\n\n @reads('stackItems.length') stackDepth;\n\n @mapBy('stackItems', 'component') components;\n\n // One entry per stack item. The template renders an empty `.NavStack-item-N`\n // div for each (so the layout's left-offset CSS classes are correct), but\n // only mounts the actual curried component when `shouldRender` is true —\n // i.e. only the last two items in the stack are alive at any time. Items\n // further back are positioned off-screen by the cut animation and their\n // contents aren't worth keeping mounted. `isInert` is true on every item\n // except the topmost (active) one so non-active items can't be reached by\n // keyboard or assistive tech — they're still in the DOM (briefly visible\n // during a horizontal slide) but should not be in the focus order.\n //\n // `@cached` saves the array across multiple reads inside one render\n // frame (the template iterates it once; nothing else reads it today, but\n // it keeps the cost flat if/when something else does). It does NOT fix\n // the Y-1308 each-keying issue on its own — when `this.components`\n // changes, the cache invalidates and a fresh array of fresh POJOs is\n // produced. The template's `key=\"component\"` on `{{#each}}` is what\n // pins each entry to its stable curried-component reference.\n @cached\n get renderableEntries() {\n let components = this.components;\n let renderThreshold = components.length - 2;\n let topIndex = components.length - 1;\n return components.map((component, index) => ({\n index,\n component,\n shouldRender: index >= renderThreshold,\n isInert: index !== topIndex,\n }));\n }\n\n @bool('args.footer') hasFooter;\n\n // `@headerPosition` controls whether the header markup is rendered above\n // or below the item container in the DOM. Defaults to `'bottom'` to\n // preserve the historical layout (header DOM-after-items). `'top'` is for\n // consumers whose chrome needs the header to come first in the focus order\n // / scroll flow. The addon's animation logic is selector-based, so neither\n // position affects transitions.\n get headerIsTop() {\n return this.args.headerPosition === 'top';\n }\n\n // Resolved once in the constructor from\n // `config.environment['ember-nav-stack'].suppressAnimation`.\n #suppressAnimation = false;\n\n // Tracks groups of cloned DOM nodes for unified cleanup. Groups used:\n // - 'stackItems' cloned by _slideBack (the leaving last item)\n // - 'headers' cloned for slide animations (leaving header)\n // - 'gestureBackOverlays' target-header snapshot during a back-swipe;\n // cleanup is queued via `_pendingGestureBackOverlay` and performed by\n // `_finishGestureBack` — scheduled from `_handleStackDepthChange` once\n // the stack pop actually lands, NOT on a fixed delay from finalize.\n // Tying cleanup to the observed pop matters because the default `back`\n // action calls `router.transitionTo`, which resolves asynchronously\n // through route hooks; cleaning up before the pop lands would restore\n // `.NavStack-currentHeaderContainer` to full opacity while it still\n // holds the leaving page's header, flashing it. willDestroy sweeps\n // any clones left from abandoned transitions via _clones.clearAll().\n _clones = new CloneStore();\n\n // The {{back-swipe}} modifier (template-level) calls this once its\n // BackSwipeGesture is instantiated against the rendered element. We\n // hold the gesture reference so _transitionDidBegin / _transitionDidEnd\n // can pause / re-arm the pan recognizer during programmatic\n // transitions, and the element reference because\n // _horizontalTransition / _verticalTransition / _cut / _slide* all read\n // from `this.element`.\n @action\n handleBackSwipeReady(gesture, element) {\n this._backSwipeGesture = gesture;\n this.element = element;\n this._observeResize(element);\n let isInitialRender = this.navStacksService.isInitialRender;\n scheduleOnce(\n 'afterRender',\n this,\n this._handleStackDepthChange,\n isInitialRender,\n );\n }\n\n // Recompute the item-container's translateX when the NavStack's outer\n // width changes — e.g. window resize, orientation change, parent grid\n // reflow, browser dev-tools opening. Without this, `_computeXPosition`'s\n // `(stackDepth - 1) * itemWidth * -1` snapshot is stale and the visible\n // item shifts off-center on the next viewport change. We deliberately\n // skip the very first ResizeObserver callback (the synthetic \"initial\n // size\" report fired right after `observe`) because we haven't run any\n // transition yet — there's no translateX to reposition and forcing one\n // would cancel any in-flight slide.\n _observeResize(element) {\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n let first = true;\n this._resizeObserver = new ResizeObserver(() => {\n if (first) {\n first = false;\n return;\n }\n this._handleViewportResize();\n });\n this._resizeObserver.observe(element);\n }\n\n _handleViewportResize() {\n if (this.isDestroying || this.isDestroyed || !this.element) {\n return;\n }\n // A horizontal slide is in flight: the spring's `onStop` will commit\n // a translateX based on the pre-resize geometry, clobbering anything\n // we set here. Defer until the spring rests — `_horizontalTransition`\n // checks `_resizePending` in its finish path and re-runs us with the\n // fresh dimensions.\n if (this._horizontalSpring) {\n this._resizePending = true;\n return;\n }\n let itemContainerElement = this.element.querySelector(\n '.NavStack-itemContainer',\n );\n if (!itemContainerElement) {\n return;\n }\n setTransform(\n itemContainerElement,\n `translateX(${this._computeXPosition()}px)`,\n );\n // The back-swipe gesture caches `startingX`, `backX`, and `thresholdX`\n // off the (now-stale) element measurements. Re-seed those so the next\n // pan uses the post-resize geometry.\n this._backSwipeGesture?.setupContext();\n }\n\n @action\n getCanNavigateBack() {\n return !!this.args.back && this.stackDepth > 1;\n }\n\n @action\n handleBack() {\n run(this.args, this.args.back);\n }\n\n @action\n handleBackSwipeOverlay(clone) {\n if (!clone) return;\n this._clones.track('gestureBackOverlays', clone);\n this._pendingGestureBackOverlay = clone;\n }\n\n @action\n stackItemsDidChange() {\n this._handleStackDepthChange(false);\n }\n\n // A fingerprint over stackItems that reflects BOTH structural changes\n // (push/pop) and per-item arg changes (e.g. a curried component whose\n // bound model.id has changed). Reading each item's component via\n // `extractComponentKey` consumes the underlying Glimmer reference tags,\n // so this getter invalidates when any of those references change. The\n // `{{did-update}}` modifier in the template observes this fingerprint\n // and re-runs the transition logic when it changes — which is how we\n // pick up arg-only changes (e.g. a parent route re-currying with a new\n // model on a dynamic-segment transition) that don't produce a\n // pushItem/removeItem on the service.\n get stackItemsFingerprint() {\n let items = this.stackItems;\n let extract = this.args.extractComponentKey || extractComponentKey;\n return items\n .map((item) => {\n if (!item || !item.component) return '_';\n return extract(item.component);\n })\n .join('|');\n }\n\n @action\n handleStackFingerprintChange() {\n this._handleStackDepthChange(false);\n }\n\n _clearRootJustChanged() {\n this._rootJustChanged = false;\n }\n\n _handleStackDepthChange(isInitialRender) {\n if (this.isDestroying || this.isDestroyed) {\n return;\n }\n\n let stackItems = this.stackItems || [];\n let stackDepth = stackItems.length;\n let extract = this.args.extractComponentKey || extractComponentKey;\n let rootComponentRef = stackItems[0]?.component;\n let rootComponentKey = extract(rootComponentRef);\n\n // Only consume `_pendingGestureBackOverlay` when the pop has actually\n // landed (newDepth < previousDepth). The overlay is a signal that the\n // back-swipe gesture already drove the items + header parallax to\n // their final positions, so the next depth-decrease flush should run\n // *no* transition — the visual change is already on screen. If we\n // cleared the overlay on a no-op same-depth flush (e.g. a fingerprint\n // did-update that fires before the service's `_process` runs, which\n // happens with consumer shapes that re-curry args.named refs during a\n // route transition), the subsequent depth-decrease flush would have\n // no overlay to consume, would route through `decideTransition`'s\n // normal `slideBack` branch, and would clone the now-opacity-0 header\n // + run a spurious header fade. Net effect: the target header\n // disappears after a successful back-swipe. Leaving the overlay\n // pending across no-op flushes preserves the signal until the pop.\n let pendingGestureBackOverlay = null;\n if (\n this._pendingGestureBackOverlay &&\n stackDepth < (this._stackDepth ?? 0)\n ) {\n pendingGestureBackOverlay = this._pendingGestureBackOverlay;\n this._pendingGestureBackOverlay = null;\n }\n\n // When consuming the overlay, force the intent to `none` — the\n // gesture already animated the visual transition; running `slideBack`\n // on top would clone the now-finalized header and re-fade everything.\n let intent = pendingGestureBackOverlay\n ? { kind: 'none' }\n : decideTransition({\n isInitialRender,\n previousDepth: this._stackDepth,\n newDepth: stackDepth,\n previousRootKey: this._rootComponentKey,\n newRootKey: rootComponentKey,\n layer: this.args.layer,\n rootJustChanged: this._rootJustChanged,\n });\n\n if (intent.startsRootChange) {\n this._rootJustChanged = true;\n next(this, this._clearRootJustChanged);\n }\n\n this._applyTransition(intent);\n\n // `_finishGestureBack` restores the live header containers' opacity\n // and removes the snapshot clone. `next()` defers it past the current\n // flush so the args.back re-render has committed by the time we\n // restore opacity (otherwise we'd restore the leaving page's header\n // to full opacity for one frame — the original Y-1264 flash bug).\n if (pendingGestureBackOverlay) {\n next(this, this._finishGestureBack, pendingGestureBackOverlay);\n }\n\n // Fire the active-item-change callback when the top stack item's\n // component identity changes (push, pop, or root swap). Compared via\n // component name only — `extractComponentName` skips the `:model.id`\n // suffix that `extractComponentKey` adds, because the model ref's\n // `lastValue` populates lazily and would otherwise produce two fires\n // per push (`track` → `track:1` across consecutive render ticks).\n // Consumers needing finer per-model granularity should watch their\n // own model state via `did-update` or similar. Initial render fires\n // once when the stack starts non-empty.\n let topComponentRef = stackItems[stackDepth - 1]?.component;\n let currentTopKey =\n stackDepth === 0 ? undefined : extractComponentName(topComponentRef);\n let previousTopKey = this._activeItemKey;\n if (currentTopKey !== previousTopKey) {\n this.args.onActiveItemChange?.({\n isInitialRender,\n previousDepth: this._stackDepth ?? 0,\n currentDepth: stackDepth,\n previousTopKey,\n currentTopKey,\n });\n this._activeItemKey = currentTopKey;\n }\n\n this._stackDepth = stackDepth;\n this._rootComponentKey = rootComponentKey;\n }\n\n _applyTransition(intent) {\n switch (intent.kind) {\n case 'cut':\n this._schedule(this._cut);\n break;\n case 'slideUp':\n this._schedule(this._slideUp);\n break;\n case 'slideDown':\n this._runDetachedSlideDown();\n break;\n case 'slideBack':\n this._cloneLastStackItem();\n this._cloneHeader();\n this._schedule(this._slideBack);\n break;\n case 'slideForward':\n this._cloneHeader();\n this._schedule(this._slideForward);\n break;\n case 'none':\n break;\n }\n }\n\n _schedule(method) {\n scheduleOnce('afterRender', this, method);\n }\n\n _computeXPosition() {\n let stackDepth = this.stackDepth;\n if (stackDepth === 0) {\n return 0;\n }\n let currentStackItemElement = this.element.querySelector(\n '.NavStack-item:last-child',\n );\n if (!currentStackItemElement) {\n return 0;\n }\n let itemWidth = currentStackItemElement.getBoundingClientRect().width;\n\n let layerX = (stackDepth - 1) * itemWidth * -1;\n return layerX;\n }\n\n @action\n repositionX() {\n let itemContainerElement = this.element.querySelector(\n '.NavStack-itemContainer',\n );\n let newX = this._computeXPosition();\n setTransform(itemContainerElement, `translateX(${newX}px)`);\n }\n\n _cut() {\n if (this.isDestroying || this.isDestroyed) {\n return;\n }\n\n this._horizontalTransition({\n toValue: this._computeXPosition(),\n animate: false,\n });\n\n if (this.args.layer > 0 && this.stackDepth > 0) {\n this._verticalTransition({\n element: this.element,\n toValue: 0,\n animate: false,\n });\n }\n }\n\n _slideForward() {\n if (this.isDestroying || this.isDestroyed) {\n return;\n }\n this._horizontalTransition({\n toValue: this._computeXPosition(),\n finishCallback: () => {\n this._clones.clear('headers');\n },\n });\n }\n\n _slideBack() {\n if (this.isDestroying || this.isDestroyed) {\n return;\n }\n this._horizontalTransition({\n toValue: this._computeXPosition(),\n finishCallback: () => {\n this._clones.clear('stackItems');\n this._clones.clear('headers');\n },\n });\n }\n\n _slideUp() {\n if (this.isDestroying || this.isDestroyed) {\n return;\n }\n\n let debug = this.birdsEyeDebugging;\n this._verticalTransition({\n element: this.element,\n toValue: 0,\n fromValue: debug ? 480 : this.element.getBoundingClientRect().height,\n });\n }\n\n // Runs the slide-down dismissal entirely outside our own lifecycle.\n // Called from two sites:\n // 1. `layerDidEmpty()` — invoked by the service's `_process` immediately\n // BEFORE it publishes `this.stacks = newStacks`, when our layer just\n // transitioned non-empty → empty. This is the common case under\n // `nav-layer-indices`, where publishing the new stacks causes the\n // host's `{{#each}}` to tear us down. willDestroy would be too\n // late (Glimmer detaches `this.element` before willDestroy fires,\n // leaving us with no parent to attach the clone to), which is why\n // we hook in pre-publish while our DOM is still mounted.\n // 2. `_applyTransition('slideDown')`, for setups that keep the NavStack\n // alive while its items go to zero (manual layer management without\n // `nav-layer-indices`). In that case `layerDidEmpty` still fires —\n // both paths can land on the same NavStack in degenerate flows, so\n // we self-guard against a double fire.\n // Clone+parent uses our DOM neighbor (which survives our teardown), the\n // live element is hidden, and the spring runs with closure-captured\n // refs — completion and DOM cleanup happen regardless of NavStack\n // lifecycle. We bypass CloneStore so willDestroy's clearAll sweep can't\n // tear our animation out, and we talk to the service directly for waiter\n // tracking (the `_notifyTransition*` indirections would no-op once we're\n // destroyed).\n _runDetachedSlideDown() {\n if (this._slideDownFired) {\n return;\n }\n this._slideDownFired = true;\n let element = this.element;\n let parent = element?.parentNode;\n if (!element || !parent) {\n return;\n }\n let clone = element.cloneNode(true);\n clone.setAttribute('id', `${this.elementId}_clone`);\n parent.appendChild(clone);\n element.style.display = 'none';\n // Force layout so the upcoming transform animates from rest, not from\n // wherever the browser would interpolate from with no committed style.\n void clone.offsetHeight;\n\n let toValue = this.birdsEyeDebugging\n ? 480\n : clone.getBoundingClientRect().height;\n let service = this.navStacksService;\n let removeClone = () => {\n clone.parentNode?.removeChild(clone);\n };\n\n if (this.#suppressAnimation || toValue === 0) {\n // No-op short-circuit: when there's nothing to animate (animations\n // suppressed, or the element rendered with no height — which happens\n // when the host's container is torn down before us, e.g. on app\n // teardown during a test), snap to the final state and bail. Don't\n // open a transition waiter for a spring that has no work — wobble's\n // onStop doesn't reliably fire for a degenerate 0→0 spring, which\n // would leave the waiter perpetually open and hang `settled()`.\n setTransform(clone, `translateY(${toValue}px)`);\n removeClone();\n return;\n }\n\n service.notifyTransitionStart();\n new Spring({\n initialVelocity: 0,\n fromValue: 0,\n toValue,\n stiffness: 1000,\n damping: 500,\n mass: 3,\n })\n .onUpdate((s) => {\n setTransform(clone, `translateY(${s.currentValue}px)`);\n })\n .onStop(() => {\n removeClone();\n service.notifyTransitionEnd();\n })\n .start();\n }\n\n _horizontalTransition({\n toValue,\n fromValue,\n animate = !this.#suppressAnimation,\n finishCallback,\n }) {\n let itemContainerElement = this.element.querySelector(\n '.NavStack-itemContainer',\n );\n let currentHeaderElement = this.element.querySelector(\n '.NavStack-currentHeaderContainer',\n );\n let clonedHeaderElement = this.element.querySelector(\n '.NavStack-clonedHeaderContainer',\n );\n\n // If a prior horizontal transition is still animating (e.g. an intermediate\n // slideBack scheduled during a staged route change like a tab switch),\n // stop it so this transition can take over from the current position.\n // The prior spring's onStop runs its finish (cleaning up its clones and\n // decrementing the transition counter) before we begin the new one.\n if (this._horizontalSpring) {\n let prior = this._horizontalSpring;\n this._horizontalSpring = null;\n prior.stop();\n }\n\n this._transitionDidBegin();\n this._notifyTransitionStart();\n let isNoOp = false;\n let finish = () => {\n setTransform(itemContainerElement, `translateX(${toValue}px)`);\n // The no-op case occurs during slideBack after a completed back-swipe:\n // the header styles were already set as part of the swipe, so we don't\n // want to change them further here.\n if (!isNoOp) {\n styleHeaderElements(\n currentTransitionPercentage(fromValue, toValue, toValue),\n fromValue === undefined || fromValue > toValue,\n currentHeaderElement,\n clonedHeaderElement,\n );\n }\n this._notifyTransitionEnd();\n this._transitionDidEnd();\n if (finishCallback) {\n finishCallback();\n }\n };\n if (animate) {\n fromValue = fromValue || this._getX(itemContainerElement);\n if (fromValue === toValue) {\n isNoOp = true;\n run(finish);\n return;\n }\n let spring = this._createSpring({ fromValue, toValue });\n this._horizontalSpring = spring;\n spring\n .onUpdate((s) => {\n setTransform(itemContainerElement, `translateX(${s.currentValue}px)`);\n styleHeaderElements(\n currentTransitionPercentage(fromValue, toValue, s.currentValue),\n fromValue > toValue,\n currentHeaderElement,\n clonedHeaderElement,\n );\n })\n .onStop(() => {\n if (this._horizontalSpring === spring) {\n this._horizontalSpring = null;\n }\n run(finish);\n // If a viewport resize landed during this slide, we deferred it\n // (the spring's geometry was based on pre-resize measurements).\n // Now that the spring has rested, re-run the reposition against\n // the current width.\n if (this._resizePending && !this.isDestroying && !this.isDestroyed) {\n this._resizePending = false;\n next(this, this._handleViewportResize);\n }\n })\n .start();\n return;\n }\n run(finish);\n }\n\n _verticalTransition({\n element,\n toValue,\n fromValue,\n animate = !this.#suppressAnimation,\n finishCallback,\n }) {\n this._transitionDidBegin();\n this._notifyTransitionStart();\n let finish = () => {\n setTransform(element, `translateY(${toValue}px)`);\n this._notifyTransitionEnd();\n this._transitionDidEnd();\n if (finishCallback) {\n finishCallback();\n }\n };\n if (animate) {\n fromValue = fromValue || element.getBoundingClientRect().top;\n if (fromValue === toValue) {\n run(finish);\n return;\n }\n let spring = this._createSpring({ fromValue, toValue });\n spring\n .onUpdate((s) => {\n setTransform(element, `translateY(${s.currentValue}px)`);\n })\n .onStop(() => {\n run(finish);\n })\n .start();\n return;\n }\n run(finish);\n }\n\n _createSpring({ initialVelocity = 0, fromValue, toValue }) {\n return new Spring({\n initialVelocity,\n fromValue,\n toValue,\n stiffness: 1000,\n damping: 500,\n mass: 3,\n });\n }\n\n _transitionDidBegin() {\n this._backSwipeGesture?.disablePan();\n }\n\n _transitionDidEnd() {\n if (!this.element || this.stackDepth <= 1) {\n return;\n }\n this._backSwipeGesture?.setupContext();\n }\n\n _notifyTransitionStart() {\n this.navStacksService.notifyTransitionStart();\n }\n\n _notifyTransitionEnd() {\n this.navStacksService.notifyTransitionEnd();\n }\n\n _finishGestureBack(parentClone) {\n if (this.isDestroying || this.isDestroyed) {\n this._clones.remove('gestureBackOverlays', parentClone);\n return;\n }\n let currentHeaderElement = this.element?.querySelector(\n '.NavStack-currentHeaderContainer',\n );\n let parentHeaderElement = this.element?.querySelector(\n '.NavStack-parentItemHeaderContainer',\n );\n if (currentHeaderElement) {\n currentHeaderElement.style.opacity = 1;\n setTransform(currentHeaderElement, 'translateX(0px)');\n }\n if (parentHeaderElement) {\n parentHeaderElement.style.opacity = 0;\n setTransform(\n parentHeaderElement,\n `translateX(${-HEADER_PARALLAX_OFFSET}px)`,\n );\n }\n this._clones.remove('gestureBackOverlays', parentClone);\n }\n\n _cloneLastStackItem() {\n let clone = this.element\n .querySelector('.NavStack-item:last-child')\n .cloneNode(true);\n clone.setAttribute('id', `${this.elementId}_clonedStackItem`);\n this._clones.track('stackItems', clone);\n this.element.querySelector('.NavStack-itemContainer').appendChild(clone);\n }\n\n _cloneHeader() {\n this._clones.clear('headers');\n let liveHeader = this.element.querySelector(\n '.NavStack-currentHeaderContainer',\n );\n if (!liveHeader) {\n return;\n }\n let clone = liveHeader.cloneNode(true);\n clone.classList.remove('NavStack-currentHeaderContainer');\n clone.classList.add('NavStack-clonedHeaderContainer');\n this._clones.track('headers', clone);\n let headerWrapper = this.element.querySelector('.NavStack-header');\n headerWrapper.insertBefore(clone, headerWrapper.firstChild);\n }\n\n _getTestContainerEl() {\n if (this._testContainerEl === undefined) {\n this._testContainerEl = document.querySelector('#ember-testing') || false;\n }\n return this._testContainerEl;\n }\n\n _getX(element) {\n return this._adjustX(element.getBoundingClientRect().left);\n }\n\n _adjustX(x) {\n if (macroCondition(isTesting())) {\n let testContainerEl = this._getTestContainerEl();\n if (testContainerEl) {\n return x - testContainerEl.getBoundingClientRect().left;\n }\n }\n return x;\n }\n}\n"],"names":["NavStack","Component","birdsEyeDebugging","args","element","elementId","guidFor","layer","g","prototype","service","i","constructor","arguments","navStacksService","register","config","getOwner","resolveRegistration","suppressAnimation","willDestroy","_resizeObserver","disconnect","unregister","_clones","clearAll","_pendingGestureBackOverlay","layerDidEmpty","_runDetachedSlideDown","layerIndexCssClass","headerComponent","stackItems","length","parentItemHeaderComponent","stacks","reads","mapBy","renderableEntries","components","renderThreshold","topIndex","map","component","index","shouldRender","isInert","n","cached","bool","headerIsTop","headerPosition","CloneStore","handleBackSwipeReady","gesture","_backSwipeGesture","_observeResize","isInitialRender","scheduleOnce","_handleStackDepthChange","action","ResizeObserver","first","_handleViewportResize","observe","isDestroying","isDestroyed","_horizontalSpring","_resizePending","itemContainerElement","querySelector","setTransform","_computeXPosition","setupContext","getCanNavigateBack","back","stackDepth","handleBack","run","handleBackSwipeOverlay","clone","track","stackItemsDidChange","stackItemsFingerprint","items","extract","extractComponentKey","item","join","handleStackFingerprintChange","_clearRootJustChanged","_rootJustChanged","rootComponentRef","rootComponentKey","pendingGestureBackOverlay","_stackDepth","intent","kind","decideTransition","previousDepth","newDepth","previousRootKey","_rootComponentKey","newRootKey","rootJustChanged","startsRootChange","next","_applyTransition","_finishGestureBack","topComponentRef","currentTopKey","undefined","extractComponentName","previousTopKey","_activeItemKey","onActiveItemChange","currentDepth","_schedule","_cut","_slideUp","_cloneLastStackItem","_cloneHeader","_slideBack","_slideForward","method","currentStackItemElement","itemWidth","getBoundingClientRect","width","layerX","repositionX","newX","_horizontalTransition","toValue","animate","_verticalTransition","finishCallback","clear","debug","fromValue","height","_slideDownFired","parent","parentNode","cloneNode","setAttribute","appendChild","style","display","offsetHeight","removeClone","removeChild","notifyTransitionStart","Spring","initialVelocity","stiffness","damping","mass","onUpdate","s","currentValue","onStop","notifyTransitionEnd","start","currentHeaderElement","clonedHeaderElement","prior","stop","_transitionDidBegin","_notifyTransitionStart","isNoOp","finish","styleHeaderElements","currentTransitionPercentage","_notifyTransitionEnd","_transitionDidEnd","_getX","spring","_createSpring","top","disablePan","parentClone","remove","parentHeaderElement","opacity","HEADER_PARALLAX_OFFSET","liveHeader","classList","add","headerWrapper","insertBefore","firstChild","_getTestContainerEl","_testContainerEl","document","_adjustX","left","x","macroCondition","isTesting","testContainerEl","setComponentTemplate","TEMPLATE"],"mappings":"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"}
1
+ {"version":3,"file":"nav-stack.js","sources":["../../src/components/nav-stack.js"],"sourcesContent":["import Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { next, run, scheduleOnce } from '@ember/runloop';\nimport { setTransform } from '../utils/animation.js';\nimport { Spring } from 'wobble';\nimport { macroCondition, isTesting } from '@embroider/macros';\nimport { getOwner } from '@ember/application';\nimport { service } from '@ember/service';\nimport { bool, mapBy, reads } from 'macro-decorators';\nimport { guidFor } from '@ember/object/internals';\nimport {\n extractComponentKey,\n extractComponentName,\n} from '../utils/component.js';\nimport { decideTransition } from '../utils/transition-decision.js';\nimport {\n HEADER_PARALLAX_OFFSET,\n currentTransitionPercentage,\n styleHeaderElements,\n} from '../utils/header-style.js';\nimport CloneStore from '../utils/clone-store.js';\n\nexport default class NavStack extends Component {\n get birdsEyeDebugging() {\n return this.args.birdsEyeDebugging || false;\n }\n\n element;\n\n get elementId() {\n return guidFor(this);\n }\n\n get layer() {\n return this.args.layer;\n }\n\n @service('nav-stacks') navStacksService;\n @service gesture;\n\n constructor() {\n super(...arguments);\n this.navStacksService.register(this);\n let config = getOwner(this).resolveRegistration('config:environment');\n this.#suppressAnimation = !!config?.['ember-nav-stack']?.suppressAnimation;\n }\n\n willDestroy() {\n super.willDestroy(...arguments);\n this._resizeObserver?.disconnect();\n this._resizeObserver = null;\n this.navStacksService.unregister(this);\n // Defensive: sweep every tracked clone in case some transition was\n // abandoned before its normal cleanup ran (e.g. a back-swipe in flight\n // when the consumer tore down the route). The `parentNode?` guard in\n // CloneStore handles clones whose parents are already detached. The\n // detached slide-down clone is not tracked here, so it survives this\n // sweep and keeps animating after we're gone.\n this._clones.clearAll();\n this._pendingGestureBackOverlay = null;\n }\n\n // Called by the service's `_process` immediately before it publishes\n // `this.stacks = newStacks` for the case where our layer's stack just\n // went from non-empty to empty. This is the only moment when our DOM is\n // still attached and we have advance notice that we're about to be torn\n // down by the host's `{{#each (nav-layer-indices)}}`. willDestroy is too\n // late (Glimmer has already detached `this.element` by then, leaving us\n // with no parent to attach the clone to). `_runDetachedSlideDown`\n // self-guards against double-fire from `_applyTransition('slideDown')`,\n // which is the parallel path for setups that don't use nav-layer-indices.\n layerDidEmpty() {\n if (this.args.layer === 0) {\n return;\n }\n this._runDetachedSlideDown();\n }\n\n get layerIndexCssClass() {\n return `NavStack--layer${this.args.layer}`;\n }\n\n get headerComponent() {\n if (this.stackItems.length === 0) {\n return null;\n }\n return this.stackItems[this.stackItems.length - 1].headerComponent;\n }\n\n get parentItemHeaderComponent() {\n if (this.stackItems.length < 2) {\n return null;\n }\n return this.stackItems[this.stackItems.length - 2].headerComponent;\n }\n\n get stackItems() {\n return this.navStacksService.stacks[`layer${this.args.layer}`] || [];\n }\n\n @reads('stackItems.length') stackDepth;\n\n @mapBy('stackItems', 'component') components;\n\n // One entry per stack item. The template renders an empty `.NavStack-item-N`\n // div for each (so the layout's left-offset CSS classes are correct), but\n // only mounts the actual curried component when `shouldRender` is true —\n // i.e. only the last two items in the stack are alive at any time. Items\n // further back are positioned off-screen by the cut animation and their\n // contents aren't worth keeping mounted. `isInert` is true on every item\n // except the topmost (active) one so non-active items can't be reached by\n // keyboard or assistive tech — they're still in the DOM (briefly visible\n // during a horizontal slide) but should not be in the focus order.\n //\n // `@cached` saves the array across multiple reads inside one render\n // frame (the template iterates it once; nothing else reads it today, but\n // it keeps the cost flat if/when something else does). It does NOT fix\n // the Y-1308 each-keying issue on its own — when `this.components`\n // changes, the cache invalidates and a fresh array of fresh POJOs is\n // produced. The template's `key=\"component\"` on `{{#each}}` is what\n // pins each entry to its stable curried-component reference.\n @cached\n get renderableEntries() {\n let components = this.components;\n let renderThreshold = components.length - 2;\n let topIndex = components.length - 1;\n return components.map((component, index) => ({\n index,\n component,\n shouldRender: index >= renderThreshold,\n isInert: index !== topIndex,\n }));\n }\n\n @bool('args.footer') hasFooter;\n\n // `@headerPosition` controls whether the header markup is rendered above\n // or below the item container in the DOM. Defaults to `'bottom'` to\n // preserve the historical layout (header DOM-after-items). `'top'` is for\n // consumers whose chrome needs the header to come first in the focus order\n // / scroll flow. The addon's animation logic is selector-based, so neither\n // position affects transitions.\n get headerIsTop() {\n return this.args.headerPosition === 'top';\n }\n\n // Resolved once in the constructor from\n // `config.environment['ember-nav-stack'].suppressAnimation`.\n #suppressAnimation = false;\n\n // Tracks groups of cloned DOM nodes for unified cleanup. Groups used:\n // - 'stackItems' cloned by _slideBack (the leaving last item)\n // - 'headers' cloned for slide animations (leaving header)\n // - 'gestureBackOverlays' target-header snapshot during a back-swipe;\n // cleanup is queued via `_pendingGestureBackOverlay` and performed by\n // `_finishGestureBack` — scheduled from `_handleStackDepthChange` once\n // the stack pop actually lands, NOT on a fixed delay from finalize.\n // Tying cleanup to the observed pop matters because the default `back`\n // action calls `router.transitionTo`, which resolves asynchronously\n // through route hooks; cleaning up before the pop lands would restore\n // `.NavStack-currentHeaderContainer` to full opacity while it still\n // holds the leaving page's header, flashing it. willDestroy sweeps\n // any clones left from abandoned transitions via _clones.clearAll().\n _clones = new CloneStore();\n\n // The {{back-swipe}} modifier (template-level) calls this once its\n // BackSwipeGesture is instantiated against the rendered element. We\n // hold the gesture reference so _transitionDidBegin / _transitionDidEnd\n // can pause / re-arm the pan recognizer during programmatic\n // transitions, and the element reference because\n // _horizontalTransition / _verticalTransition / _cut / _slide* all read\n // from `this.element`.\n @action\n handleBackSwipeReady(gesture, element) {\n this._backSwipeGesture = gesture;\n this.element = element;\n this._observeResize(element);\n let isInitialRender = this.navStacksService.isInitialRender;\n scheduleOnce(\n 'afterRender',\n this,\n this._handleStackDepthChange,\n isInitialRender,\n );\n }\n\n // Recompute the item-container's translateX when the NavStack's outer\n // width changes — e.g. window resize, orientation change, parent grid\n // reflow, browser dev-tools opening. Without this, `_computeXPosition`'s\n // `(stackDepth - 1) * itemWidth * -1` snapshot is stale and the visible\n // item shifts off-center on the next viewport change. We deliberately\n // skip the very first ResizeObserver callback (the synthetic \"initial\n // size\" report fired right after `observe`) because we haven't run any\n // transition yet — there's no translateX to reposition and forcing one\n // would cancel any in-flight slide.\n _observeResize(element) {\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n let first = true;\n this._resizeObserver = new ResizeObserver(() => {\n if (first) {\n first = false;\n return;\n }\n this._handleViewportResize();\n });\n this._resizeObserver.observe(element);\n }\n\n _handleViewportResize() {\n if (this.isDestroying || this.isDestroyed || !this.element) {\n return;\n }\n // A horizontal slide is in flight: the spring's `onStop` will commit\n // a translateX based on the pre-resize geometry, clobbering anything\n // we set here. Defer until the spring rests — `_horizontalTransition`\n // checks `_resizePending` in its finish path and re-runs us with the\n // fresh dimensions.\n if (this._horizontalSpring) {\n this._resizePending = true;\n return;\n }\n let itemContainerElement = this.element.querySelector(\n '.NavStack-itemContainer',\n );\n if (!itemContainerElement) {\n return;\n }\n setTransform(\n itemContainerElement,\n `translateX(${this._computeXPosition()}px)`,\n );\n // The back-swipe gesture caches `startingX`, `backX`, and `thresholdX`\n // off the (now-stale) element measurements. Re-seed those so the next\n // pan uses the post-resize geometry.\n this._backSwipeGesture?.setupContext();\n }\n\n @action\n getCanNavigateBack() {\n return !!this.args.back && this.stackDepth > 1;\n }\n\n @action\n handleBack() {\n run(this.args, this.args.back);\n }\n\n @action\n handleBackSwipeOverlay(clone) {\n if (!clone) return;\n this._clones.track('gestureBackOverlays', clone);\n this._pendingGestureBackOverlay = clone;\n }\n\n @action\n stackItemsDidChange() {\n this._handleStackDepthChange(false);\n }\n\n // A fingerprint over stackItems that reflects BOTH structural changes\n // (push/pop) and per-item arg changes (e.g. a curried component whose\n // bound model.id has changed). Reading each item's component via\n // `extractComponentKey` consumes the underlying Glimmer reference tags,\n // so this getter invalidates when any of those references change. The\n // `{{did-update}}` modifier in the template observes this fingerprint\n // and re-runs the transition logic when it changes — which is how we\n // pick up arg-only changes (e.g. a parent route re-currying with a new\n // model on a dynamic-segment transition) that don't produce a\n // pushItem/removeItem on the service.\n get stackItemsFingerprint() {\n let items = this.stackItems;\n let extract = this.args.extractComponentKey || extractComponentKey;\n return items\n .map((item) => {\n if (!item || !item.component) return '_';\n return extract(item.component);\n })\n .join('|');\n }\n\n @action\n handleStackFingerprintChange() {\n this._handleStackDepthChange(false);\n }\n\n _clearRootJustChanged() {\n this._rootJustChanged = false;\n }\n\n _handleStackDepthChange(isInitialRender) {\n if (this.isDestroying || this.isDestroyed) {\n return;\n }\n\n let stackItems = this.stackItems || [];\n let stackDepth = stackItems.length;\n let extract = this.args.extractComponentKey || extractComponentKey;\n let rootComponentRef = stackItems[0]?.component;\n let rootComponentKey = extract(rootComponentRef);\n\n // Only consume `_pendingGestureBackOverlay` when the pop has actually\n // landed (newDepth < previousDepth). The overlay is a signal that the\n // back-swipe gesture already drove the items + header parallax to\n // their final positions, so the next depth-decrease flush should run\n // *no* transition — the visual change is already on screen. If we\n // cleared the overlay on a no-op same-depth flush (e.g. a fingerprint\n // did-update that fires before the service's `_process` runs, which\n // happens with consumer shapes that re-curry args.named refs during a\n // route transition), the subsequent depth-decrease flush would have\n // no overlay to consume, would route through `decideTransition`'s\n // normal `slideBack` branch, and would clone the now-opacity-0 header\n // + run a spurious header fade. Net effect: the target header\n // disappears after a successful back-swipe. Leaving the overlay\n // pending across no-op flushes preserves the signal until the pop.\n let pendingGestureBackOverlay = null;\n if (\n this._pendingGestureBackOverlay &&\n stackDepth < (this._stackDepth ?? 0)\n ) {\n pendingGestureBackOverlay = this._pendingGestureBackOverlay;\n this._pendingGestureBackOverlay = null;\n }\n\n // When consuming the overlay, force the intent to `none` — the\n // gesture already animated the visual transition; running `slideBack`\n // on top would clone the now-finalized header and re-fade everything.\n let intent = pendingGestureBackOverlay\n ? { kind: 'none' }\n : decideTransition({\n isInitialRender,\n previousDepth: this._stackDepth,\n newDepth: stackDepth,\n previousRootKey: this._rootComponentKey,\n newRootKey: rootComponentKey,\n layer: this.args.layer,\n rootJustChanged: this._rootJustChanged,\n });\n\n if (intent.startsRootChange) {\n this._rootJustChanged = true;\n next(this, this._clearRootJustChanged);\n }\n\n this._applyTransition(intent);\n\n // `_finishGestureBack` restores the live header containers' opacity\n // and removes the snapshot clone. `next()` defers it past the current\n // flush so the args.back re-render has committed by the time we\n // restore opacity (otherwise we'd restore the leaving page's header\n // to full opacity for one frame — the original Y-1264 flash bug).\n if (pendingGestureBackOverlay) {\n next(this, this._finishGestureBack, pendingGestureBackOverlay);\n }\n\n // Fire the active-item-change callback when the top stack item's\n // component identity changes (push, pop, or root swap). Compared via\n // component name only — `extractComponentName` skips the `:model.id`\n // suffix that `extractComponentKey` adds, because the model ref's\n // `lastValue` populates lazily and would otherwise produce two fires\n // per push (`track` → `track:1` across consecutive render ticks).\n // Consumers needing finer per-model granularity should watch their\n // own model state via `did-update` or similar. Initial render fires\n // once when the stack starts non-empty.\n let topComponentRef = stackItems[stackDepth - 1]?.component;\n let currentTopKey =\n stackDepth === 0 ? undefined : extractComponentName(topComponentRef);\n let previousTopKey = this._activeItemKey;\n if (currentTopKey !== previousTopKey) {\n this.args.onActiveItemChange?.({\n isInitialRender,\n previousDepth: this._stackDepth ?? 0,\n currentDepth: stackDepth,\n previousTopKey,\n currentTopKey,\n });\n this._activeItemKey = currentTopKey;\n }\n\n this._stackDepth = stackDepth;\n this._rootComponentKey = rootComponentKey;\n }\n\n _applyTransition(intent) {\n switch (intent.kind) {\n case 'cut':\n this._schedule(this._cut);\n break;\n case 'slideUp':\n this._schedule(this._slideUp);\n break;\n case 'slideDown':\n this._runDetachedSlideDown();\n break;\n case 'slideBack':\n this._cloneLastStackItem();\n this._cloneHeader();\n this._schedule(this._slideBack);\n break;\n case 'slideForward':\n this._cloneHeader();\n this._schedule(this._slideForward);\n break;\n case 'none':\n break;\n }\n }\n\n _schedule(method) {\n scheduleOnce('afterRender', this, method);\n }\n\n _computeXPosition() {\n let stackDepth = this.stackDepth;\n if (stackDepth === 0) {\n return 0;\n }\n let currentStackItemElement = this.element.querySelector(\n '.NavStack-item:last-child',\n );\n if (!currentStackItemElement) {\n return 0;\n }\n let itemWidth = currentStackItemElement.getBoundingClientRect().width;\n\n let layerX = (stackDepth - 1) * itemWidth * -1;\n return layerX;\n }\n\n @action\n repositionX() {\n let itemContainerElement = this.element.querySelector(\n '.NavStack-itemContainer',\n );\n let newX = this._computeXPosition();\n setTransform(itemContainerElement, `translateX(${newX}px)`);\n }\n\n _cut() {\n if (this.isDestroying || this.isDestroyed) {\n return;\n }\n\n this._horizontalTransition({\n toValue: this._computeXPosition(),\n animate: false,\n });\n\n if (this.args.layer > 0 && this.stackDepth > 0) {\n this._verticalTransition({\n element: this.element,\n toValue: 0,\n animate: false,\n });\n }\n }\n\n _slideForward() {\n if (this.isDestroying || this.isDestroyed) {\n return;\n }\n this._horizontalTransition({\n toValue: this._computeXPosition(),\n finishCallback: () => {\n this._clones.clear('headers');\n },\n });\n }\n\n _slideBack() {\n if (this.isDestroying || this.isDestroyed) {\n return;\n }\n this._horizontalTransition({\n toValue: this._computeXPosition(),\n finishCallback: () => {\n this._clones.clear('stackItems');\n this._clones.clear('headers');\n },\n });\n }\n\n _slideUp() {\n if (this.isDestroying || this.isDestroyed) {\n return;\n }\n\n let debug = this.birdsEyeDebugging;\n this._verticalTransition({\n element: this.element,\n toValue: 0,\n fromValue: debug ? 480 : this.element.getBoundingClientRect().height,\n });\n }\n\n // Runs the slide-down dismissal entirely outside our own lifecycle.\n // Called from two sites:\n // 1. `layerDidEmpty()` — invoked by the service's `_process` immediately\n // BEFORE it publishes `this.stacks = newStacks`, when our layer just\n // transitioned non-empty → empty. This is the common case under\n // `nav-layer-indices`, where publishing the new stacks causes the\n // host's `{{#each}}` to tear us down. willDestroy would be too\n // late (Glimmer detaches `this.element` before willDestroy fires,\n // leaving us with no parent to attach the clone to), which is why\n // we hook in pre-publish while our DOM is still mounted.\n // 2. `_applyTransition('slideDown')`, for setups that keep the NavStack\n // alive while its items go to zero (manual layer management without\n // `nav-layer-indices`). In that case `layerDidEmpty` still fires —\n // both paths can land on the same NavStack in degenerate flows, so\n // we self-guard against a double fire.\n // Clone+parent uses our DOM neighbor (which survives our teardown), the\n // live element is hidden, and the spring runs with closure-captured\n // refs — completion and DOM cleanup happen regardless of NavStack\n // lifecycle. We bypass CloneStore so willDestroy's clearAll sweep can't\n // tear our animation out, and we talk to the service directly for waiter\n // tracking (the `_notifyTransition*` indirections would no-op once we're\n // destroyed).\n _runDetachedSlideDown() {\n if (this._slideDownFired) {\n return;\n }\n this._slideDownFired = true;\n let element = this.element;\n let parent = element?.parentNode;\n if (!element || !parent) {\n return;\n }\n let clone = element.cloneNode(true);\n clone.setAttribute('id', `${this.elementId}_clone`);\n parent.appendChild(clone);\n element.style.display = 'none';\n // Force layout so the upcoming transform animates from rest, not from\n // wherever the browser would interpolate from with no committed style.\n void clone.offsetHeight;\n\n let toValue = this.birdsEyeDebugging\n ? 480\n : clone.getBoundingClientRect().height;\n let service = this.navStacksService;\n let removeClone = () => {\n clone.parentNode?.removeChild(clone);\n };\n\n if (this.#suppressAnimation || toValue === 0) {\n // No-op short-circuit: when there's nothing to animate (animations\n // suppressed, or the element rendered with no height — which happens\n // when the host's container is torn down before us, e.g. on app\n // teardown during a test), snap to the final state and bail. Don't\n // open a transition waiter for a spring that has no work — wobble's\n // onStop doesn't reliably fire for a degenerate 0→0 spring, which\n // would leave the waiter perpetually open and hang `settled()`.\n setTransform(clone, `translateY(${toValue}px)`);\n removeClone();\n return;\n }\n\n service.notifyTransitionStart();\n new Spring({\n initialVelocity: 0,\n fromValue: 0,\n toValue,\n stiffness: 1000,\n damping: 500,\n mass: 3,\n })\n .onUpdate((s) => {\n setTransform(clone, `translateY(${s.currentValue}px)`);\n })\n .onStop(() => {\n removeClone();\n service.notifyTransitionEnd();\n })\n .start();\n }\n\n _horizontalTransition({\n toValue,\n fromValue,\n animate = !this.#suppressAnimation,\n finishCallback,\n }) {\n let itemContainerElement = this.element.querySelector(\n '.NavStack-itemContainer',\n );\n let currentHeaderElement = this.element.querySelector(\n '.NavStack-currentHeaderContainer',\n );\n let clonedHeaderElement = this.element.querySelector(\n '.NavStack-clonedHeaderContainer',\n );\n\n // If a prior horizontal transition is still animating (e.g. an intermediate\n // slideBack scheduled during a staged route change like a tab switch),\n // stop it so this transition can take over from the current position.\n // The prior spring's onStop runs its finish (cleaning up its clones and\n // decrementing the transition counter) before we begin the new one.\n if (this._horizontalSpring) {\n let prior = this._horizontalSpring;\n this._horizontalSpring = null;\n prior.stop();\n }\n\n this._transitionDidBegin();\n this._notifyTransitionStart();\n let isNoOp = false;\n let finish = () => {\n setTransform(itemContainerElement, `translateX(${toValue}px)`);\n // The no-op case occurs during slideBack after a completed back-swipe:\n // the header styles were already set as part of the swipe, so we don't\n // want to change them further here.\n if (!isNoOp) {\n styleHeaderElements(\n currentTransitionPercentage(fromValue, toValue, toValue),\n fromValue === undefined || fromValue > toValue,\n currentHeaderElement,\n clonedHeaderElement,\n );\n }\n this._notifyTransitionEnd();\n this._transitionDidEnd();\n if (finishCallback) {\n finishCallback();\n }\n };\n if (animate) {\n fromValue = fromValue || this._getX(itemContainerElement);\n if (fromValue === toValue) {\n isNoOp = true;\n run(finish);\n return;\n }\n let spring = this._createSpring({ fromValue, toValue });\n this._horizontalSpring = spring;\n spring\n .onUpdate((s) => {\n setTransform(itemContainerElement, `translateX(${s.currentValue}px)`);\n styleHeaderElements(\n currentTransitionPercentage(fromValue, toValue, s.currentValue),\n fromValue > toValue,\n currentHeaderElement,\n clonedHeaderElement,\n );\n })\n .onStop(() => {\n if (this._horizontalSpring === spring) {\n this._horizontalSpring = null;\n }\n run(finish);\n // If a viewport resize landed during this slide, we deferred it\n // (the spring's geometry was based on pre-resize measurements).\n // Now that the spring has rested, re-run the reposition against\n // the current width.\n if (this._resizePending && !this.isDestroying && !this.isDestroyed) {\n this._resizePending = false;\n next(this, this._handleViewportResize);\n }\n })\n .start();\n return;\n }\n run(finish);\n }\n\n _verticalTransition({\n element,\n toValue,\n fromValue,\n animate = !this.#suppressAnimation,\n finishCallback,\n }) {\n this._transitionDidBegin();\n this._notifyTransitionStart();\n let finish = () => {\n setTransform(element, `translateY(${toValue}px)`);\n this._notifyTransitionEnd();\n this._transitionDidEnd();\n if (finishCallback) {\n finishCallback();\n }\n };\n if (animate) {\n fromValue = fromValue || element.getBoundingClientRect().top;\n if (fromValue === toValue) {\n run(finish);\n return;\n }\n let spring = this._createSpring({ fromValue, toValue });\n spring\n .onUpdate((s) => {\n setTransform(element, `translateY(${s.currentValue}px)`);\n })\n .onStop(() => {\n run(finish);\n })\n .start();\n return;\n }\n run(finish);\n }\n\n _createSpring({ initialVelocity = 0, fromValue, toValue }) {\n return new Spring({\n initialVelocity,\n fromValue,\n toValue,\n stiffness: 1000,\n damping: 500,\n mass: 3,\n });\n }\n\n _transitionDidBegin() {\n this._backSwipeGesture?.disablePan();\n }\n\n _transitionDidEnd() {\n if (!this.element || this.stackDepth <= 1) {\n return;\n }\n this._backSwipeGesture?.setupContext();\n }\n\n _notifyTransitionStart() {\n this.navStacksService.notifyTransitionStart();\n }\n\n _notifyTransitionEnd() {\n this.navStacksService.notifyTransitionEnd();\n }\n\n _finishGestureBack(parentClone) {\n if (this.isDestroying || this.isDestroyed) {\n this._clones.remove('gestureBackOverlays', parentClone);\n return;\n }\n let currentHeaderElement = this.element?.querySelector(\n '.NavStack-currentHeaderContainer',\n );\n let parentHeaderElement = this.element?.querySelector(\n '.NavStack-parentItemHeaderContainer',\n );\n if (currentHeaderElement) {\n currentHeaderElement.style.opacity = 1;\n setTransform(currentHeaderElement, 'translateX(0px)');\n }\n if (parentHeaderElement) {\n parentHeaderElement.style.opacity = 0;\n setTransform(\n parentHeaderElement,\n `translateX(${-HEADER_PARALLAX_OFFSET}px)`,\n );\n }\n this._clones.remove('gestureBackOverlays', parentClone);\n\n // Refresh the gesture's cached startingX / backX / thresholdX and DOM\n // refs after a gesture-driven pop. The overlay-consumed path forces\n // `intent = { kind: 'none' }` so the programmatic transition is\n // skipped — which also skips `_transitionDidEnd`, the usual place\n // `setupContext` runs. Without this refresh the BackSwipeGesture\n // still holds geometry seeded for the pre-pop stack depth, so a\n // second consecutive back-swipe (e.g. on a multi-track page:\n // Schedule Item → Track → Tracks List) jerks the item container an\n // extra item-width left on the first pan-move tick and leaves the\n // next-target stack item off-screen. See Y-1316.\n this._backSwipeGesture?.setupContext();\n }\n\n _cloneLastStackItem() {\n let clone = this.element\n .querySelector('.NavStack-item:last-child')\n .cloneNode(true);\n clone.setAttribute('id', `${this.elementId}_clonedStackItem`);\n this._clones.track('stackItems', clone);\n this.element.querySelector('.NavStack-itemContainer').appendChild(clone);\n }\n\n _cloneHeader() {\n this._clones.clear('headers');\n let liveHeader = this.element.querySelector(\n '.NavStack-currentHeaderContainer',\n );\n if (!liveHeader) {\n return;\n }\n let clone = liveHeader.cloneNode(true);\n clone.classList.remove('NavStack-currentHeaderContainer');\n clone.classList.add('NavStack-clonedHeaderContainer');\n this._clones.track('headers', clone);\n let headerWrapper = this.element.querySelector('.NavStack-header');\n headerWrapper.insertBefore(clone, headerWrapper.firstChild);\n }\n\n _getTestContainerEl() {\n if (this._testContainerEl === undefined) {\n this._testContainerEl = document.querySelector('#ember-testing') || false;\n }\n return this._testContainerEl;\n }\n\n _getX(element) {\n return this._adjustX(element.getBoundingClientRect().left);\n }\n\n _adjustX(x) {\n if (macroCondition(isTesting())) {\n let testContainerEl = this._getTestContainerEl();\n if (testContainerEl) {\n return x - testContainerEl.getBoundingClientRect().left;\n }\n }\n return x;\n }\n}\n"],"names":["NavStack","Component","birdsEyeDebugging","args","element","elementId","guidFor","layer","g","prototype","service","i","constructor","arguments","navStacksService","register","config","getOwner","resolveRegistration","suppressAnimation","willDestroy","_resizeObserver","disconnect","unregister","_clones","clearAll","_pendingGestureBackOverlay","layerDidEmpty","_runDetachedSlideDown","layerIndexCssClass","headerComponent","stackItems","length","parentItemHeaderComponent","stacks","reads","mapBy","renderableEntries","components","renderThreshold","topIndex","map","component","index","shouldRender","isInert","n","cached","bool","headerIsTop","headerPosition","CloneStore","handleBackSwipeReady","gesture","_backSwipeGesture","_observeResize","isInitialRender","scheduleOnce","_handleStackDepthChange","action","ResizeObserver","first","_handleViewportResize","observe","isDestroying","isDestroyed","_horizontalSpring","_resizePending","itemContainerElement","querySelector","setTransform","_computeXPosition","setupContext","getCanNavigateBack","back","stackDepth","handleBack","run","handleBackSwipeOverlay","clone","track","stackItemsDidChange","stackItemsFingerprint","items","extract","extractComponentKey","item","join","handleStackFingerprintChange","_clearRootJustChanged","_rootJustChanged","rootComponentRef","rootComponentKey","pendingGestureBackOverlay","_stackDepth","intent","kind","decideTransition","previousDepth","newDepth","previousRootKey","_rootComponentKey","newRootKey","rootJustChanged","startsRootChange","next","_applyTransition","_finishGestureBack","topComponentRef","currentTopKey","undefined","extractComponentName","previousTopKey","_activeItemKey","onActiveItemChange","currentDepth","_schedule","_cut","_slideUp","_cloneLastStackItem","_cloneHeader","_slideBack","_slideForward","method","currentStackItemElement","itemWidth","getBoundingClientRect","width","layerX","repositionX","newX","_horizontalTransition","toValue","animate","_verticalTransition","finishCallback","clear","debug","fromValue","height","_slideDownFired","parent","parentNode","cloneNode","setAttribute","appendChild","style","display","offsetHeight","removeClone","removeChild","notifyTransitionStart","Spring","initialVelocity","stiffness","damping","mass","onUpdate","s","currentValue","onStop","notifyTransitionEnd","start","currentHeaderElement","clonedHeaderElement","prior","stop","_transitionDidBegin","_notifyTransitionStart","isNoOp","finish","styleHeaderElements","currentTransitionPercentage","_notifyTransitionEnd","_transitionDidEnd","_getX","spring","_createSpring","top","disablePan","parentClone","remove","parentHeaderElement","opacity","HEADER_PARALLAX_OFFSET","liveHeader","classList","add","headerWrapper","insertBefore","firstChild","_getTestContainerEl","_testContainerEl","document","_adjustX","left","x","macroCondition","isTesting","testContainerEl","setComponentTemplate","TEMPLATE"],"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.3",
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"