ember-nav-stack 7.0.0 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ export { default } from "ember-nav-stack/components/nav-stack-inner-wrapper";
@@ -0,0 +1,10 @@
1
+ import templateOnly from '@ember/component/template-only';
2
+ import { precompileTemplate } from '@ember/template-compilation';
3
+ import { setComponentTemplate } from '@ember/component';
4
+
5
+ var TEMPLATE = precompileTemplate("{{#if @class}}\n <div class={{concat \"NavStack-innerWrapper \" @class}}>\n {{yield}}\n </div>\n{{else}}\n {{yield}}\n{{/if}}");
6
+
7
+ var navStackInnerWrapper = setComponentTemplate(TEMPLATE, templateOnly());
8
+
9
+ export { navStackInnerWrapper as default };
10
+ //# sourceMappingURL=nav-stack-inner-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-stack-inner-wrapper.js","sources":["../../src/components/nav-stack-inner-wrapper.js"],"sourcesContent":["import templateOnly from '@ember/component/template-only';\n\n// Private template-only helper. Wraps its block in a\n// `<div class=\"NavStack-innerWrapper [class]\">` when `@class` is truthy, or\n// passes the block through unwrapped when it's falsy. This is the structural\n// mechanism behind `<NavStack @innerWrapperClass>`: omitting the arg leaves\n// the addon's DOM identical to pre-v7.1 (so consumer CSS using direct-child\n// selectors on `.NavStack` continues to match), while providing it inserts\n// the extra wrapper element on demand.\n//\n// Not part of the addon's public API — invoked only from `<NavStack>`'s\n// own template. Subject to change without notice.\nexport default templateOnly();\n"],"names":["setComponentTemplate","TEMPLATE","templateOnly"],"mappings":";;;;;;AAYA,2BAAAA,oBAAA,CAAAC,QAAA,EAAeC,YAAY,EAAE,CAAA;;;;"}
@@ -16,7 +16,7 @@ import { precompileTemplate } from '@ember/template-compilation';
16
16
  import { g, i, n } from 'decorator-transforms/runtime';
17
17
  import { setComponentTemplate } from '@ember/component';
18
18
 
19
- var TEMPLATE = precompileTemplate("<div\n id={{this.elementId}}\n class={{concat\n \"NavStack \"\n (if this.birdsEyeDebugging \"is-birdsEyeDebugging \")\n this.layerIndexCssClass\n \" \"\n (if this.hasFooter \"NavStack--withFooter \")\n }}\n {{back-swipe\n onReady=this.handleBackSwipeReady\n getCanNavigateBack=this.getCanNavigateBack\n onBack=this.handleBack\n onBackSwipeOverlay=this.handleBackSwipeOverlay\n }}\n {{did-update this.handleStackFingerprintChange this.stackItemsFingerprint}}\n ...attributes\n>\n <div class=\"NavStack-itemContainer\">\n {{#each this.renderableEntries as |entry|}}\n <div class={{concat \"NavStack-item NavStack-item-\" entry.index}}>\n {{#if entry.shouldRender}}\n {{component entry.component}}\n {{/if}}\n </div>\n {{/each}}\n </div>\n <div class=\"NavStack-header\">\n {{#if this.parentItemHeaderComponent}}\n <div class=\"NavStack-headerContainer NavStack-parentItemHeaderContainer\">\n {{component\n this.parentItemHeaderComponent\n class=\"NavStack-headerComponent\"\n back=@back\n }}\n </div>\n {{/if}}\n <div class=\"NavStack-headerContainer NavStack-currentHeaderContainer\">\n {{component\n this.headerComponent\n class=\"NavStack-headerComponent\"\n back=@back\n }}\n </div>\n </div>\n {{#if this.hasFooter}}\n <div class=\"NavStack-footer\">\n {{component @footer}}\n </div>\n {{/if}}\n</div>");
19
+ var TEMPLATE = precompileTemplate("<div\n id={{this.elementId}}\n class={{concat\n \"NavStack \"\n (if this.birdsEyeDebugging \"is-birdsEyeDebugging \")\n this.layerIndexCssClass\n \" \"\n (if this.hasFooter \"NavStack--withFooter \")\n (if @rootClass (concat \" \" @rootClass))\n }}\n {{back-swipe\n onReady=this.handleBackSwipeReady\n getCanNavigateBack=this.getCanNavigateBack\n onBack=this.handleBack\n onBackSwipeOverlay=this.handleBackSwipeOverlay\n }}\n {{did-update this.handleStackFingerprintChange this.stackItemsFingerprint}}\n ...attributes\n>\n <NavStackInnerWrapper @class={{@innerWrapperClass}}>\n {{#if this.headerIsTop}}\n <div\n class={{concat\n \"NavStack-header\"\n (if @headerContainerClass (concat \" \" @headerContainerClass))\n }}\n >\n {{#if this.parentItemHeaderComponent}}\n <div\n class=\"NavStack-headerContainer NavStack-parentItemHeaderContainer\"\n inert={{true}}\n >\n {{#if (has-block \"header\")}}\n {{yield\n (component\n this.parentItemHeaderComponent\n class=\"NavStack-headerComponent\"\n back=@back\n )\n to=\"header\"\n }}\n {{else}}\n {{component\n this.parentItemHeaderComponent\n class=\"NavStack-headerComponent\"\n back=@back\n }}\n {{/if}}\n </div>\n {{/if}}\n <div class=\"NavStack-headerContainer NavStack-currentHeaderContainer\">\n {{#if (has-block \"header\")}}\n {{yield\n (component\n this.headerComponent class=\"NavStack-headerComponent\" back=@back\n )\n to=\"header\"\n }}\n {{else}}\n {{component\n this.headerComponent\n class=\"NavStack-headerComponent\"\n back=@back\n }}\n {{/if}}\n </div>\n </div>\n {{/if}}\n <div\n class={{concat\n \"NavStack-itemContainer\"\n (if @itemContainerClass (concat \" \" @itemContainerClass))\n }}\n >\n {{#each this.renderableEntries as |entry|}}\n <div\n class={{concat \"NavStack-item NavStack-item-\" entry.index}}\n inert={{entry.isInert}}\n >\n {{#if entry.shouldRender}}\n {{component entry.component}}\n {{/if}}\n </div>\n {{/each}}\n </div>\n {{#unless this.headerIsTop}}\n <div\n class={{concat\n \"NavStack-header\"\n (if @headerContainerClass (concat \" \" @headerContainerClass))\n }}\n >\n {{#if this.parentItemHeaderComponent}}\n <div\n class=\"NavStack-headerContainer NavStack-parentItemHeaderContainer\"\n inert={{true}}\n >\n {{#if (has-block \"header\")}}\n {{yield\n (component\n this.parentItemHeaderComponent\n class=\"NavStack-headerComponent\"\n back=@back\n )\n to=\"header\"\n }}\n {{else}}\n {{component\n this.parentItemHeaderComponent\n class=\"NavStack-headerComponent\"\n back=@back\n }}\n {{/if}}\n </div>\n {{/if}}\n <div class=\"NavStack-headerContainer NavStack-currentHeaderContainer\">\n {{#if (has-block \"header\")}}\n {{yield\n (component\n this.headerComponent class=\"NavStack-headerComponent\" back=@back\n )\n to=\"header\"\n }}\n {{else}}\n {{component\n this.headerComponent\n class=\"NavStack-headerComponent\"\n back=@back\n }}\n {{/if}}\n </div>\n </div>\n {{/unless}}\n {{yield to=\"bannerAd\"}}\n {{#if this.hasFooter}}\n <div\n class={{concat\n \"NavStack-footer\"\n (if @footerClass (concat \" \" @footerClass))\n }}\n >\n {{component @footer}}\n </div>\n {{/if}}\n </NavStackInnerWrapper>\n</div>");
20
20
 
21
21
  class NavStack extends Component {
22
22
  get birdsEyeDebugging() {
@@ -45,6 +45,8 @@ class NavStack extends Component {
45
45
  }
46
46
  willDestroy() {
47
47
  super.willDestroy(...arguments);
48
+ this._resizeObserver?.disconnect();
49
+ this._resizeObserver = null;
48
50
  this.navStacksService.unregister(this);
49
51
  // Defensive: sweep every tracked clone in case some transition was
50
52
  // abandoned before its normal cleanup ran (e.g. a back-swipe in flight
@@ -102,20 +104,35 @@ class NavStack extends Component {
102
104
  // only mounts the actual curried component when `shouldRender` is true —
103
105
  // i.e. only the last two items in the stack are alive at any time. Items
104
106
  // further back are positioned off-screen by the cut animation and their
105
- // contents aren't worth keeping mounted.
107
+ // contents aren't worth keeping mounted. `isInert` is true on every item
108
+ // except the topmost (active) one so non-active items can't be reached by
109
+ // keyboard or assistive tech — they're still in the DOM (briefly visible
110
+ // during a horizontal slide) but should not be in the focus order.
106
111
  get renderableEntries() {
107
112
  let components = this.components;
108
113
  let renderThreshold = components.length - 2;
114
+ let topIndex = components.length - 1;
109
115
  return components.map((component, index) => ({
110
116
  index,
111
117
  component,
112
- shouldRender: index >= renderThreshold
118
+ shouldRender: index >= renderThreshold,
119
+ isInert: index !== topIndex
113
120
  }));
114
121
  }
115
122
  static {
116
123
  g(this.prototype, "hasFooter", [bool('args.footer')]);
117
124
  }
118
125
  #hasFooter = (i(this, "hasFooter"), void 0);
126
+ // `@headerPosition` controls whether the header markup is rendered above
127
+ // or below the item container in the DOM. Defaults to `'bottom'` to
128
+ // preserve the historical layout (header DOM-after-items). `'top'` is for
129
+ // consumers whose chrome needs the header to come first in the focus order
130
+ // / scroll flow. The addon's animation logic is selector-based, so neither
131
+ // position affects transitions.
132
+ get headerIsTop() {
133
+ return this.args.headerPosition === 'top';
134
+ }
135
+
119
136
  // Resolved once in the constructor from
120
137
  // `config.environment['ember-nav-stack'].suppressAnimation`.
121
138
  #suppressAnimation = false;
@@ -145,12 +162,60 @@ class NavStack extends Component {
145
162
  handleBackSwipeReady(gesture, element) {
146
163
  this._backSwipeGesture = gesture;
147
164
  this.element = element;
165
+ this._observeResize(element);
148
166
  let isInitialRender = this.navStacksService.isInitialRender;
149
167
  scheduleOnce('afterRender', this, this._handleStackDepthChange, isInitialRender);
150
168
  }
169
+
170
+ // Recompute the item-container's translateX when the NavStack's outer
171
+ // width changes — e.g. window resize, orientation change, parent grid
172
+ // reflow, browser dev-tools opening. Without this, `_computeXPosition`'s
173
+ // `(stackDepth - 1) * itemWidth * -1` snapshot is stale and the visible
174
+ // item shifts off-center on the next viewport change. We deliberately
175
+ // skip the very first ResizeObserver callback (the synthetic "initial
176
+ // size" report fired right after `observe`) because we haven't run any
177
+ // transition yet — there's no translateX to reposition and forcing one
178
+ // would cancel any in-flight slide.
151
179
  static {
152
180
  n(this.prototype, "handleBackSwipeReady", [action]);
153
181
  }
182
+ _observeResize(element) {
183
+ if (typeof ResizeObserver === 'undefined') {
184
+ return;
185
+ }
186
+ let first = true;
187
+ this._resizeObserver = new ResizeObserver(() => {
188
+ if (first) {
189
+ first = false;
190
+ return;
191
+ }
192
+ this._handleViewportResize();
193
+ });
194
+ this._resizeObserver.observe(element);
195
+ }
196
+ _handleViewportResize() {
197
+ if (this.isDestroying || this.isDestroyed || !this.element) {
198
+ return;
199
+ }
200
+ // A horizontal slide is in flight: the spring's `onStop` will commit
201
+ // a translateX based on the pre-resize geometry, clobbering anything
202
+ // we set here. Defer until the spring rests — `_horizontalTransition`
203
+ // checks `_resizePending` in its finish path and re-runs us with the
204
+ // fresh dimensions.
205
+ if (this._horizontalSpring) {
206
+ this._resizePending = true;
207
+ return;
208
+ }
209
+ let itemContainerElement = this.element.querySelector('.NavStack-itemContainer');
210
+ if (!itemContainerElement) {
211
+ return;
212
+ }
213
+ setTransform(itemContainerElement, `translateX(${this._computeXPosition()}px)`);
214
+ // The back-swipe gesture caches `startingX`, `backX`, and `thresholdX`
215
+ // off the (now-stale) element measurements. Re-seed those so the next
216
+ // pan uses the post-resize geometry.
217
+ this._backSwipeGesture?.setupContext();
218
+ }
154
219
  getCanNavigateBack() {
155
220
  return !!this.args.back && this.stackDepth > 1;
156
221
  }
@@ -496,6 +561,14 @@ class NavStack extends Component {
496
561
  this._horizontalSpring = null;
497
562
  }
498
563
  run(finish);
564
+ // If a viewport resize landed during this slide, we deferred it
565
+ // (the spring's geometry was based on pre-resize measurements).
566
+ // Now that the spring has rested, re-run the reposition against
567
+ // the current width.
568
+ if (this._resizePending && !this.isDestroying && !this.isDestroyed) {
569
+ this._resizePending = false;
570
+ next(this, this._handleViewportResize);
571
+ }
499
572
  }).start();
500
573
  return;
501
574
  }
@@ -1 +1 @@
1
- {"version":3,"file":"nav-stack.js","sources":["../../src/components/nav-stack.js"],"sourcesContent":["import Component from '@glimmer/component';\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.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.\n get renderableEntries() {\n let components = this.components;\n let renderThreshold = components.length - 2;\n return components.map((component, index) => ({\n index,\n component,\n shouldRender: index >= renderThreshold,\n }));\n }\n\n @bool('args.footer') hasFooter;\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 let isInitialRender = this.navStacksService.isInitialRender;\n scheduleOnce(\n 'afterRender',\n this,\n this._handleStackDepthChange,\n isInitialRender,\n );\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 let pendingGestureBackOverlay = this._pendingGestureBackOverlay;\n this._pendingGestureBackOverlay = null;\n\n let intent = 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 // Gesture-back overlay cleanup is orthogonal to which transition runs —\n // it just needs the stack pop to have landed (newDepth < previousDepth).\n // The overlay snapshot was made by `finalize` after the back-swipe\n // completed; we restore the live header containers once the re-render\n // following `args.back` has swapped their content. `next()` defers the\n // cleanup past the current flush so the swap is visible by the time we\n // restore opacity.\n if (pendingGestureBackOverlay) {\n if (stackDepth < this._stackDepth) {\n next(this, this._finishGestureBack, pendingGestureBackOverlay);\n } else {\n this._clones.remove('gestureBackOverlays', pendingGestureBackOverlay);\n }\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 })\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","unregister","_clones","clearAll","_pendingGestureBackOverlay","layerDidEmpty","_runDetachedSlideDown","layerIndexCssClass","headerComponent","stackItems","length","parentItemHeaderComponent","stacks","reads","mapBy","renderableEntries","components","renderThreshold","map","component","index","shouldRender","bool","CloneStore","handleBackSwipeReady","gesture","_backSwipeGesture","isInitialRender","scheduleOnce","_handleStackDepthChange","n","action","getCanNavigateBack","back","stackDepth","handleBack","run","handleBackSwipeOverlay","clone","track","stackItemsDidChange","stackItemsFingerprint","items","extract","extractComponentKey","item","join","handleStackFingerprintChange","_clearRootJustChanged","_rootJustChanged","isDestroying","isDestroyed","rootComponentRef","rootComponentKey","pendingGestureBackOverlay","intent","decideTransition","previousDepth","_stackDepth","newDepth","previousRootKey","_rootComponentKey","newRootKey","rootJustChanged","startsRootChange","next","_applyTransition","_finishGestureBack","remove","topComponentRef","currentTopKey","undefined","extractComponentName","previousTopKey","_activeItemKey","onActiveItemChange","currentDepth","kind","_schedule","_cut","_slideUp","_cloneLastStackItem","_cloneHeader","_slideBack","_slideForward","method","_computeXPosition","currentStackItemElement","querySelector","itemWidth","getBoundingClientRect","width","layerX","repositionX","itemContainerElement","newX","setTransform","_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","_horizontalSpring","prior","stop","_transitionDidBegin","_notifyTransitionStart","isNoOp","finish","styleHeaderElements","currentTransitionPercentage","_notifyTransitionEnd","_transitionDidEnd","_getX","spring","_createSpring","top","disablePan","setupContext","parentClone","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 { 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 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 let pendingGestureBackOverlay = this._pendingGestureBackOverlay;\n this._pendingGestureBackOverlay = null;\n\n let intent = 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 // Gesture-back overlay cleanup is orthogonal to which transition runs —\n // it just needs the stack pop to have landed (newDepth < previousDepth).\n // The overlay snapshot was made by `finalize` after the back-swipe\n // completed; we restore the live header containers once the re-render\n // following `args.back` has swapped their content. `next()` defers the\n // cleanup past the current flush so the swap is visible by the time we\n // restore opacity.\n if (pendingGestureBackOverlay) {\n if (stackDepth < this._stackDepth) {\n next(this, this._finishGestureBack, pendingGestureBackOverlay);\n } else {\n this._clones.remove('gestureBackOverlays', pendingGestureBackOverlay);\n }\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","bool","headerIsTop","headerPosition","CloneStore","handleBackSwipeReady","gesture","_backSwipeGesture","_observeResize","isInitialRender","scheduleOnce","_handleStackDepthChange","n","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","intent","decideTransition","previousDepth","_stackDepth","newDepth","previousRootKey","_rootComponentKey","newRootKey","rootJustChanged","startsRootChange","next","_applyTransition","_finishGestureBack","remove","topComponentRef","currentTopKey","undefined","extractComponentName","previousTopKey","_activeItemKey","onActiveItemChange","currentDepth","kind","_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","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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"}
@@ -63,10 +63,21 @@ function getComponentRefName(componentRef) {
63
63
  // Resolve a Glimmer reference to its current value without importing from
64
64
  // `@glimmer/reference` (which would couple this addon to a specific
65
65
  // Glimmer release line and cause dedupe headaches under strict resolvers).
66
- // In classic Glimmer the reference exposes a `value()` method; in modern
67
- // Glimmer the reference's `lastValue` is updated whenever the reference
68
- // is consumed during render, so reading it here returns the most-recently
69
- // rendered value which is what we want, since `extractComponentKey` is
66
+ // Three paths:
67
+ // 1. `ref.value()` classic Glimmer (pre-2020-ish).
68
+ // 2. `ref.compute()` modern Glimmer. Calls the underlying compute
69
+ // function, which both recomputes the live value AND consumes the
70
+ // ref's tag so we participate in autotracking. This is critical for
71
+ // the `stackItemsFingerprint` getter: without it, we'd be reading
72
+ // `lastValue` (a snapshot from the last render that consumed this
73
+ // ref) and miss in-place arg changes — e.g. a parent route swapping
74
+ // its `model` while keeping the same curried component instance
75
+ // alive. The fingerprint would then stay stale and the NavStack
76
+ // would miss the root-key change entirely (next stack mutation
77
+ // would lump the root change with the depth change and degenerate
78
+ // to a cut, suppressing the expected slide).
79
+ // 3. `ref.lastValue` — last-resort fallback.
80
+ // `extractComponentKey` is
70
81
  // invoked from `<NavStack>`'s reactive `stackItemsFingerprint` getter
71
82
  // whose own re-evaluation is what propagated the change in the first place.
72
83
  function valueForRef(ref) {
@@ -76,6 +87,9 @@ function valueForRef(ref) {
76
87
  if (typeof ref.value === 'function') {
77
88
  return ref.value();
78
89
  }
90
+ if (typeof ref.compute === 'function') {
91
+ return ref.compute();
92
+ }
79
93
  return ref.lastValue;
80
94
  }
81
95
  function getComponentRefModelId(componentRef) {
@@ -1 +1 @@
1
- {"version":3,"file":"component.js","sources":["../../src/utils/component.js"],"sourcesContent":["import { macroCondition, isDevelopingApp } from '@embroider/macros';\n\nexport function extractComponentKey(componentRef) {\n if (!componentRef) {\n return 'none';\n }\n let result = getComponentRefName(componentRef);\n // Dev-only safeguard: if every access path failed to produce a name, the\n // Glimmer reference's shape has likely changed (it has before — see the\n // INNER-slot-as-string vs. -as-object update further down) and we'd\n // otherwise return `undefined` silently. That makes\n // `rootComponentKey !== this._rootComponentKey` always compare\n // `'undefined' === 'undefined'`, so root-change cuts (e.g. tab switches)\n // would never fire and the addon would silently fall through to a slide\n // animation. Failing loud here surfaces the breakage at the source.\n //\n // Gated on `@embroider/macros`'s `isDevelopingApp()` so the entire check\n // (including the message string) is stripped from production builds by\n // the consumer's babel pipeline — both Embroider and classic ember-cli\n // run the macros transform on v2 addon code, unlike\n // `babel-plugin-debug-macros` (which only applies to app + v1 addon\n // code in classic builds and would leave the string in the bundle).\n if (macroCondition(isDevelopingApp())) {\n if (result === undefined) {\n throw new Error(\n '[ember-nav-stack] extractComponentKey could not derive a name from the component reference. The Glimmer reference shape has likely changed; see src/utils/component.js.',\n );\n }\n }\n let modelId = getComponentRefModelId(componentRef);\n if (modelId) {\n result += `:${modelId}`;\n }\n return result;\n}\n\n// Component-name-only key for a curried component reference. Skips the\n// `model.id` appendage that `extractComponentKey` adds because, unlike the\n// component name (which is set at curry time), the model ref's `lastValue`\n// resolves lazily — the active-item-change path needs a key that's stable\n// the moment the curry exists, otherwise a single push fires twice as the\n// model id transitions from undefined to its concrete value across two\n// render ticks.\nexport function extractComponentName(componentRef) {\n if (!componentRef) {\n return 'none';\n }\n return getComponentRefName(componentRef);\n}\n\nfunction getComponentRefName(componentRef) {\n if (componentRef.name) {\n return componentRef.name;\n }\n let innerSym = Object.getOwnPropertySymbols(componentRef).find(\n (s) => s.description === 'INNER',\n );\n let inner = componentRef.inner || (innerSym && componentRef[innerSym]);\n // In modern Glimmer, a curried component's INNER slot holds the resolved\n // component name as a string. Older builds wrapped it in an object with\n // a `.name` property.\n if (typeof inner === 'string') {\n return inner;\n }\n return inner?.name;\n}\n\n// Resolve a Glimmer reference to its current value without importing from\n// `@glimmer/reference` (which would couple this addon to a specific\n// Glimmer release line and cause dedupe headaches under strict resolvers).\n// In classic Glimmer the reference exposes a `value()` method; in modern\n// Glimmer the reference's `lastValue` is updated whenever the reference\n// is consumed during render, so reading it here returns the most-recently\n// rendered value which is what we want, since `extractComponentKey` is\n// invoked from `<NavStack>`'s reactive `stackItemsFingerprint` getter\n// whose own re-evaluation is what propagated the change in the first place.\nfunction valueForRef(ref) {\n if (!ref) {\n return ref;\n }\n if (typeof ref.value === 'function') {\n return ref.value();\n }\n return ref.lastValue;\n}\n\nfunction getComponentRefModelId(componentRef) {\n let argsSym = Object.getOwnPropertySymbols(componentRef).find(\n (s) => s.description === 'ARGS',\n );\n let args = componentRef.args || (argsSym && componentRef[argsSym]);\n if (!args || !args.named) {\n return;\n }\n let named = args.named;\n let modelRef;\n if (typeof named.has === 'function' && named.has('model')) {\n // Older Glimmer exposed named args as a Map-like with has/get.\n modelRef = named.get('model');\n } else if (named.model) {\n // Modern Glimmer: args.named is a POJO of references keyed by arg name.\n modelRef = named.model;\n }\n if (!modelRef) {\n return;\n }\n let model = valueForRef(modelRef);\n if (model) {\n return model.id;\n }\n return;\n}\n"],"names":["extractComponentKey","componentRef","result","getComponentRefName","macroCondition","isDevelopingApp","undefined","Error","modelId","getComponentRefModelId","extractComponentName","name","innerSym","Object","getOwnPropertySymbols","find","s","description","inner","valueForRef","ref","value","lastValue","argsSym","args","named","modelRef","has","get","model","id"],"mappings":"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"}
1
+ {"version":3,"file":"component.js","sources":["../../src/utils/component.js"],"sourcesContent":["import { macroCondition, isDevelopingApp } from '@embroider/macros';\n\nexport function extractComponentKey(componentRef) {\n if (!componentRef) {\n return 'none';\n }\n let result = getComponentRefName(componentRef);\n // Dev-only safeguard: if every access path failed to produce a name, the\n // Glimmer reference's shape has likely changed (it has before — see the\n // INNER-slot-as-string vs. -as-object update further down) and we'd\n // otherwise return `undefined` silently. That makes\n // `rootComponentKey !== this._rootComponentKey` always compare\n // `'undefined' === 'undefined'`, so root-change cuts (e.g. tab switches)\n // would never fire and the addon would silently fall through to a slide\n // animation. Failing loud here surfaces the breakage at the source.\n //\n // Gated on `@embroider/macros`'s `isDevelopingApp()` so the entire check\n // (including the message string) is stripped from production builds by\n // the consumer's babel pipeline — both Embroider and classic ember-cli\n // run the macros transform on v2 addon code, unlike\n // `babel-plugin-debug-macros` (which only applies to app + v1 addon\n // code in classic builds and would leave the string in the bundle).\n if (macroCondition(isDevelopingApp())) {\n if (result === undefined) {\n throw new Error(\n '[ember-nav-stack] extractComponentKey could not derive a name from the component reference. The Glimmer reference shape has likely changed; see src/utils/component.js.',\n );\n }\n }\n let modelId = getComponentRefModelId(componentRef);\n if (modelId) {\n result += `:${modelId}`;\n }\n return result;\n}\n\n// Component-name-only key for a curried component reference. Skips the\n// `model.id` appendage that `extractComponentKey` adds because, unlike the\n// component name (which is set at curry time), the model ref's `lastValue`\n// resolves lazily — the active-item-change path needs a key that's stable\n// the moment the curry exists, otherwise a single push fires twice as the\n// model id transitions from undefined to its concrete value across two\n// render ticks.\nexport function extractComponentName(componentRef) {\n if (!componentRef) {\n return 'none';\n }\n return getComponentRefName(componentRef);\n}\n\nfunction getComponentRefName(componentRef) {\n if (componentRef.name) {\n return componentRef.name;\n }\n let innerSym = Object.getOwnPropertySymbols(componentRef).find(\n (s) => s.description === 'INNER',\n );\n let inner = componentRef.inner || (innerSym && componentRef[innerSym]);\n // In modern Glimmer, a curried component's INNER slot holds the resolved\n // component name as a string. Older builds wrapped it in an object with\n // a `.name` property.\n if (typeof inner === 'string') {\n return inner;\n }\n return inner?.name;\n}\n\n// Resolve a Glimmer reference to its current value without importing from\n// `@glimmer/reference` (which would couple this addon to a specific\n// Glimmer release line and cause dedupe headaches under strict resolvers).\n// Three paths:\n// 1. `ref.value()` classic Glimmer (pre-2020-ish).\n// 2. `ref.compute()` modern Glimmer. Calls the underlying compute\n// function, which both recomputes the live value AND consumes the\n// ref's tag so we participate in autotracking. This is critical for\n// the `stackItemsFingerprint` getter: without it, we'd be reading\n// `lastValue` (a snapshot from the last render that consumed this\n// ref) and miss in-place arg changes e.g. a parent route swapping\n// its `model` while keeping the same curried component instance\n// alive. The fingerprint would then stay stale and the NavStack\n// would miss the root-key change entirely (next stack mutation\n// would lump the root change with the depth change and degenerate\n// to a cut, suppressing the expected slide).\n// 3. `ref.lastValue` — last-resort fallback.\n// `extractComponentKey` is\n// invoked from `<NavStack>`'s reactive `stackItemsFingerprint` getter\n// whose own re-evaluation is what propagated the change in the first place.\nfunction valueForRef(ref) {\n if (!ref) {\n return ref;\n }\n if (typeof ref.value === 'function') {\n return ref.value();\n }\n if (typeof ref.compute === 'function') {\n return ref.compute();\n }\n return ref.lastValue;\n}\n\nfunction getComponentRefModelId(componentRef) {\n let argsSym = Object.getOwnPropertySymbols(componentRef).find(\n (s) => s.description === 'ARGS',\n );\n let args = componentRef.args || (argsSym && componentRef[argsSym]);\n if (!args || !args.named) {\n return;\n }\n let named = args.named;\n let modelRef;\n if (typeof named.has === 'function' && named.has('model')) {\n // Older Glimmer exposed named args as a Map-like with has/get.\n modelRef = named.get('model');\n } else if (named.model) {\n // Modern Glimmer: args.named is a POJO of references keyed by arg name.\n modelRef = named.model;\n }\n if (!modelRef) {\n return;\n }\n let model = valueForRef(modelRef);\n if (model) {\n return model.id;\n }\n return;\n}\n"],"names":["extractComponentKey","componentRef","result","getComponentRefName","macroCondition","isDevelopingApp","undefined","Error","modelId","getComponentRefModelId","extractComponentName","name","innerSym","Object","getOwnPropertySymbols","find","s","description","inner","valueForRef","ref","value","compute","lastValue","argsSym","args","named","modelRef","has","get","model","id"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-nav-stack",
3
- "version": "7.0.0",
3
+ "version": "7.1.0",
4
4
  "description": "An Ember addon providing iOS-style navigation stacks with swipe-back gesture support.",
5
5
  "keywords": [
6
6
  "ember-addon"
@@ -100,6 +100,7 @@
100
100
  "type": "addon",
101
101
  "main": "addon-main.cjs",
102
102
  "app-js": {
103
+ "./components/nav-stack-inner-wrapper.js": "./dist/_app_/components/nav-stack-inner-wrapper.js",
103
104
  "./components/nav-stack.js": "./dist/_app_/components/nav-stack.js",
104
105
  "./components/to-nav-stack.js": "./dist/_app_/components/to-nav-stack.js",
105
106
  "./helpers/nav-layer-indices.js": "./dist/_app_/helpers/nav-layer-indices.js",