@ng-native/router 0.14.0 → 0.15.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.
@@ -48,8 +48,9 @@ export declare class NativeStackOutlet implements RouterOutletContract, OnInit {
48
48
  /** What the holder's own `preventNativeDismiss` was, while this stack's top screen refuses. */
49
49
  private held;
50
50
  private readonly statusBar;
51
- /** The status bar props each screen carries for the app's claim, not set by the screen itself. */
52
- private readonly carried;
51
+ private readonly navigationBar;
52
+ /** Both bars' claims, as the screens carry them. */
53
+ private readonly systemBars;
53
54
  private readonly entries;
54
55
  /**
55
56
  * The screens a replace or a reset supersedes, kept until the navigation that supersedes them
@@ -192,15 +193,16 @@ export declare class NativeStackOutlet implements RouterOutletContract, OnInit {
192
193
  private fillScreen;
193
194
  private createScreen;
194
195
  /**
195
- * Puts the app's status bar claim on a screen that has no style or visibility of its own, from
196
- * its presentation or its page's host bindings. On Android, react-native-screens sets the bar
197
- * from the screen in front each time one appears, and falls back to light text and shown for a
198
- * screen without these props, which would undo the claim on every push and pop.
196
+ * Puts the app's status bar and navigation bar claims on a screen that has no value of its own
197
+ * for them, from its presentation or its page's host bindings. On Android, react-native-screens
198
+ * sets both bars from the screen in front each time one appears, and falls back to light text
199
+ * and shown for a screen without these props, which would undo the claim on every push and pop.
199
200
  *
200
- * First called once the page has rendered, so a prop its host bindings set is already there and
201
- * counts as the screen's own, even one equal to the claim.
201
+ * A prop is the screen's own when its presentation or a host binding wrote it, as the screen's
202
+ * `writes` records, so one equal to the claim stays when the claim changes or drops. First called
203
+ * once the page has rendered, so its host bindings have written already.
202
204
  */
203
- private carryStatusBar;
205
+ private carrySystemBars;
204
206
  /**
205
207
  * Follow a pop the user already made. `historyGo`, not `back()`, because iOS coalesces a long
206
208
  * swipe into a single event with a count.
@@ -19,7 +19,7 @@
19
19
  import { ApplicationRef, Component, DestroyRef, ElementRef, ErrorHandler, HostAttributeToken, InjectionToken, Injector, Renderer2, afterEveryRender, computed, createComponent, effect, inject, signal, untracked, } from '@angular/core';
20
20
  import { ActivatedRoute, ChildrenOutletContexts, NavigationCancel, NavigationEnd, NavigationError, PRIMARY_OUTLET, Router, createUrlTreeFromSnapshot, } from '@angular/router';
21
21
  import { Location, PlatformLocation } from '@angular/common';
22
- import { SCREEN_IN_FRONT, StatusBar } from '@ng-native/device';
22
+ import { NavigationBar, SCREEN_IN_FRONT, StatusBar } from '@ng-native/device';
23
23
  import { bindRouteInputs } from "./bind-route-inputs.js";
24
24
  import { NativeBack, isShowing } from "./native-back.js";
25
25
  import { navigationIntent } from "./native-navigation.js";
@@ -53,8 +53,12 @@ const UNLIMITED_SWIPE = { start: -1, end: -1, top: -1, bottom: -1 };
53
53
  const HOLDING_SCREEN = new InjectionToken('ng-native.router.holding-screen');
54
54
  /** Whether a screen refuses a native dismissal, as its page bound it. */
55
55
  const refuses = (screen) => screen?.props?.['preventNativeDismiss'] === true;
56
- /** The screen props a status bar claim rides on, by what the claim names. */
57
- const STATUS_BAR_PROPS = { style: 'statusBarStyle', hidden: 'statusBarHidden' };
56
+ /** The screen props a status or navigation bar claim rides on, by what the claim names. */
57
+ const SYSTEM_BAR_PROPS = {
58
+ style: 'statusBarStyle',
59
+ hidden: 'statusBarHidden',
60
+ navigationBarHidden: 'navigationBarHidden',
61
+ };
58
62
  export class NativeStackOutlet {
59
63
  /**
60
64
  * Named outlets work exactly as on the web: `<native-stack-outlet name="list" />` is filled by
@@ -84,8 +88,13 @@ export class NativeStackOutlet {
84
88
  /** What the holder's own `preventNativeDismiss` was, while this stack's top screen refuses. */
85
89
  held = null;
86
90
  statusBar = inject(StatusBar);
87
- /** The status bar props each screen carries for the app's claim, not set by the screen itself. */
88
- carried = new WeakMap();
91
+ navigationBar = inject(NavigationBar);
92
+ /** Both bars' claims, as the screens carry them. */
93
+ systemBars = computed(() => ({
94
+ ...this.statusBar.forScreens(),
95
+ navigationBarHidden: this.navigationBar.forScreens().hidden,
96
+ }), /* @ts-ignore */
97
+ ...(ngDevMode ? [{ debugName: "systemBars" }] : /* istanbul ignore next */ []));
89
98
  entries = [];
90
99
  /**
91
100
  * The screens a replace or a reset supersedes, kept until the navigation that supersedes them
@@ -132,16 +141,16 @@ export class NativeStackOutlet {
132
141
  });
133
142
  const carryAll = (claim) => {
134
143
  for (const entry of this.entries)
135
- this.carryStatusBar(entry.screen, claim);
144
+ this.carrySystemBars(entry.screen, claim);
136
145
  if (this.presentedPage)
137
- this.carryStatusBar(this.presentedPage.screen, claim);
146
+ this.carrySystemBars(this.presentedPage.screen, claim);
138
147
  };
139
148
  effect(() => {
140
- const claim = this.statusBar.forScreens();
149
+ const claim = this.systemBars();
141
150
  untracked(() => carryAll(claim));
142
151
  });
143
152
  // A page's host binding that lets go of its own value, back to undefined, changes no claim.
144
- afterEveryRender(() => carryAll(untracked(this.statusBar.forScreens)));
153
+ afterEveryRender(() => carryAll(untracked(this.systemBars)));
145
154
  const unhold = this.holder ? this.holdRefusals(this.holder) : undefined;
146
155
  const unpresent = this.takePresentedPages(back);
147
156
  const unleave = inject(IN_TAB, { optional: true })?.onLeave(() => this.dismissPresented());
@@ -157,7 +166,11 @@ export class NativeStackOutlet {
157
166
  entry.ref.destroy();
158
167
  }
159
168
  this.entries.length = 0;
160
- this.parentContexts.onChildOutletDestroyed(this.name);
169
+ // Only while it is this outlet's: a page kept by the reuse strategy takes its outlets'
170
+ // registrations with it, and gets them back as it is attached, before what was over it goes.
171
+ if (this.parentContexts.getContext(this.name)?.outlet === this) {
172
+ this.parentContexts.onChildOutletDestroyed(this.name);
173
+ }
161
174
  });
162
175
  }
163
176
  /** The page presented over everything, while there is one. See `presented-route.ts`. */
@@ -202,7 +215,9 @@ export class NativeStackOutlet {
202
215
  return () => {
203
216
  back.presents = false;
204
217
  this.dropPresentedPage();
205
- this.parentContexts.onChildOutletDestroyed(PRESENTED);
218
+ if (this.parentContexts.getContext(PRESENTED)?.outlet === outlet) {
219
+ this.parentContexts.onChildOutletDestroyed(PRESENTED);
220
+ }
206
221
  };
207
222
  }
208
223
  presentPage(route, environmentInjector, back) {
@@ -216,7 +231,7 @@ export class NativeStackOutlet {
216
231
  const inFront = signal(true, /* @ts-ignore */
217
232
  ...(ngDevMode ? [{ debugName: "inFront" }] : /* istanbul ignore next */ []));
218
233
  const { ref, unbind } = this.createPage(component, route, environmentInjector, screen, inFront, PRESENTED);
219
- this.carryStatusBar(screen, untracked(this.statusBar.forScreens));
234
+ this.carrySystemBars(screen, untracked(this.systemBars));
220
235
  // Once the page is there to cover it: one that throws on its first render never is, and
221
236
  // nothing would put the screen under it back in front.
222
237
  this.top?.inFront.set(false);
@@ -327,7 +342,7 @@ export class NativeStackOutlet {
327
342
  const inFront = signal(true, /* @ts-ignore */
328
343
  ...(ngDevMode ? [{ debugName: "inFront" }] : /* istanbul ignore next */ []));
329
344
  const { ref, unbind } = this.createPage(component, route, environmentInjector, screen, inFront);
330
- this.carryStatusBar(screen, untracked(this.statusBar.forScreens));
345
+ this.carrySystemBars(screen, untracked(this.systemBars));
331
346
  // The page's own host style, including any `position` or inset it declared, has now landed
332
347
  // on the screen: put the stack's fill back over it. Per-key, through `setStyle`, so whatever
333
348
  // else the page's style set - a background colour, say - still merges and stays.
@@ -612,6 +627,9 @@ export class NativeStackOutlet {
612
627
  }
613
628
  createScreen(presentation, dismissed = (count) => this.onNativeDismiss(count)) {
614
629
  const screen = ownHost(this.renderer.createElement('screen'));
630
+ // From before the presentation is set, so a value it or the page's host bindings write counts
631
+ // as the screen's own, even one equal to a carried value. See `carrySystemBars`.
632
+ screen.writes = new Set();
615
633
  this.fillScreen(screen);
616
634
  // Set once and never lowered: see the note at the top of this file.
617
635
  this.renderer.setProperty(screen, 'activityState', ActivityState.Active);
@@ -637,27 +655,27 @@ export class NativeStackOutlet {
637
655
  return screen;
638
656
  }
639
657
  /**
640
- * Puts the app's status bar claim on a screen that has no style or visibility of its own, from
641
- * its presentation or its page's host bindings. On Android, react-native-screens sets the bar
642
- * from the screen in front each time one appears, and falls back to light text and shown for a
643
- * screen without these props, which would undo the claim on every push and pop.
658
+ * Puts the app's status bar and navigation bar claims on a screen that has no value of its own
659
+ * for them, from its presentation or its page's host bindings. On Android, react-native-screens
660
+ * sets both bars from the screen in front each time one appears, and falls back to light text
661
+ * and shown for a screen without these props, which would undo the claim on every push and pop.
644
662
  *
645
- * First called once the page has rendered, so a prop its host bindings set is already there and
646
- * counts as the screen's own, even one equal to the claim.
663
+ * A prop is the screen's own when its presentation or a host binding wrote it, as the screen's
664
+ * `writes` records, so one equal to the claim stays when the claim changes or drops. First called
665
+ * once the page has rendered, so its host bindings have written already.
647
666
  */
648
- carryStatusBar(screen, claim) {
649
- const props = screen.props ?? {};
650
- const before = this.carried.get(screen) ?? {};
651
- const now = {};
652
- for (const [key, prop] of Object.entries(STATUS_BAR_PROPS)) {
653
- if (props[prop] !== undefined && props[prop] !== before[prop])
667
+ carrySystemBars(screen, claim) {
668
+ const node = screen;
669
+ const props = node.props ?? {};
670
+ for (const [key, prop] of Object.entries(SYSTEM_BAR_PROPS)) {
671
+ if (node.writes?.has(prop))
654
672
  continue;
655
673
  const value = claim[key];
656
- now[prop] = value;
657
674
  if (props[prop] !== value)
658
675
  this.renderer.setProperty(screen, prop, value);
676
+ // A value carried here is no binding's.
677
+ node.writes?.delete(prop);
659
678
  }
660
- this.carried.set(screen, now);
661
679
  }
662
680
  /**
663
681
  * Follow a pop the user already made. `historyGo`, not `back()`, because iOS coalesces a long
@@ -1 +1 @@
1
- {"version":3,"file":"native-stack-outlet.js","sourceRoot":"","sources":["../src/native-stack-outlet.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * A `RouterOutlet` that renders a native stack instead of swapping one view for another.\n *\n * The outlet's host element *is* the `RNSScreenStack`, and each activated route's component is\n * created directly on its own `screen` child rather than on a wrapper view inside it (ADR 0004).\n * The screens below the top stay mounted, which is what keeps a pushed-away screen's native\n * state alive: its scroll offset, its text cursor, its keyboard focus.\n *\n * Push and pop are inferred from the calls the router already makes. With a reuse strategy that\n * detaches, navigating forward is `detach()` then `activateWith()`, and navigating back is\n * `detach()` then `attach(ref)` with a ref we handed out earlier. Finding that ref in our own\n * stack is what identifies a pop, so nothing here needs to consult the URL.\n *\n * Note `activityState` is set once, to active, and never lowered. `Screen.tsx` throws on any\n * decrease while `isNativeStack`, because a native stack decides what is visible from the order\n * of its children rather than from a per-screen flag. Toggling that flag is for `ScreenContainer`\n * (tabs), where every screen is mounted at once.\n */\nimport {\n ApplicationRef,\n Component,\n DestroyRef,\n ElementRef,\n ErrorHandler,\n HostAttributeToken,\n InjectionToken,\n Injector,\n Renderer2,\n afterEveryRender,\n computed,\n createComponent,\n effect,\n inject,\n signal,\n untracked,\n type ComponentRef,\n type EnvironmentInjector,\n type OnInit,\n type Type,\n type WritableSignal,\n} from '@angular/core';\nimport {\n ActivatedRoute,\n ChildrenOutletContexts,\n NavigationCancel,\n NavigationEnd,\n NavigationError,\n PRIMARY_OUTLET,\n Router,\n createUrlTreeFromSnapshot,\n type Data,\n type RouterOutletContract,\n} from '@angular/router';\nimport { Location, PlatformLocation } from '@angular/common';\nimport { SCREEN_IN_FRONT, StatusBar } from '@ng-native/device';\nimport { bindRouteInputs } from './bind-route-inputs.ts';\nimport { NativeBack, isShowing } from './native-back.ts';\nimport { navigationIntent, type NativeIntent } from './native-navigation.ts';\nimport { NativePlatformLocation } from './native-platform-location.ts';\nimport { PRESENTED, withoutPresented } from './presented-route.ts';\nimport { markScreenRoute } from './tab-routes.ts';\nimport { IN_TAB } from './in-tab.ts';\nimport { ownHost } from './own-host.ts';\nimport { SCREEN_HEADER } from './screen-header.ts';\nimport { HostEngine, type EngineNode } from '@ng-native/fabric';\nimport type { ScreenPresentation } from './screen-presentation.ts';\nimport { ActivityState } from './screens.ts';\n\ninterface StackEntry {\n route: ActivatedRoute;\n ref: ComponentRef<unknown>;\n /** The `screen` element this entry's component lives inside. */\n screen: unknown;\n /** True while the router is holding this ref for a later `attach`. */\n detached: boolean;\n /** Stops feeding route params into the component's inputs. */\n unbind: () => void;\n /** How the screen was put on screen, for a push from it to follow. */\n presentation?: ScreenPresentation;\n /** The navigation that put this screen on the stack, until that navigation ends. */\n activatedIn?: number;\n /** The navigation that covered this screen, until that navigation ends. */\n detachedIn?: number;\n /** Whether this screen is the one in front, for what it holds: see `SCREEN_IN_FRONT`. */\n inFront: WritableSignal<boolean>;\n}\n\n/**\n * The last navigation, per router, whose presentation an outlet has already given a screen.\n *\n * Presenting a route that is a stack of its own activates two outlets in one navigation: the one\n * the route is presented in, and the one inside it that shows the route's first child. Only the\n * first is presented; the second is the first screen of a stack inside a presented screen, and a\n * push inside that stack must see it as a pushed screen, not one to present over.\n */\nconst presented = new WeakMap<object, number>();\n\n/** What every screen needs to fill the stack, the same five keys RNSScreen itself expects. */\nconst FILL = { position: 'absolute', left: 0, right: 0, top: 0, bottom: 0 } as const;\n\n/** A swipe-back area with no limit on any edge. */\nconst UNLIMITED_SWIPE = { start: -1, end: -1, top: -1, bottom: -1 } as const;\n\n/**\n * The screen a page lives in, for a stack inside that page. A presented screen with a header is\n * such a stack, and the page that knows whether to refuse a dismissal is a screen inside it, where\n * the screen a swipe down dismisses is this one.\n */\nconst HOLDING_SCREEN = new InjectionToken<HoldingScreen>('ng-native.router.holding-screen');\n\ninterface HoldingScreen {\n readonly screen: unknown;\n /**\n * Told when a stack inside the screen changes what the screen refuses, so the stack the screen\n * is in can pass that on in turn, in the same render: its own look came before this one.\n */\n refusalChanged(): void;\n}\n\n/** Whether a screen refuses a native dismissal, as its page bound it. */\nconst refuses = (screen: unknown): boolean =>\n (screen as Partial<EngineNode> | undefined)?.props?.['preventNativeDismiss'] === true;\n\n/** The screen props a status bar claim rides on, by what the claim names. */\nconst STATUS_BAR_PROPS = { style: 'statusBarStyle', hidden: 'statusBarHidden' } as const;\n\n/** The native engine's `dispatchEvent`, as Fabric calls it. */\ntype NativeDispatch = (node: unknown, topLevelType: string, nativeEvent: unknown) => void;\n\n@Component({\n selector: 'native-stack-outlet',\n template: '',\n host: { '[style]': 'fill' },\n})\nexport class NativeStackOutlet implements RouterOutletContract, OnInit {\n /**\n * Named outlets work exactly as on the web: `<native-stack-outlet name=\"list\" />` is filled by\n * routes with `outlet: 'list'`. The default is the primary one. Read once, as the router's own\n * outlet reads it, since an outlet cannot change which contexts it is registered under.\n */\n readonly name = inject(new HostAttributeToken('name'), { optional: true }) ?? PRIMARY_OUTLET;\n\n readonly supportsBindingToComponentInputs = true;\n\n private readonly parentContexts = inject(ChildrenOutletContexts);\n private readonly renderer = inject(Renderer2);\n private readonly applicationRef = inject(ApplicationRef);\n private readonly injector = inject(Injector);\n private readonly host = inject(ElementRef);\n private readonly location = inject(Location);\n private readonly history = inject(PlatformLocation);\n /**\n * Only for the intent a navigation carries. Optional so the outlet can be exercised through\n * `RouterOutletContract` directly, which is how its own tests drive it.\n */\n private readonly router = inject(Router, { optional: true });\n /** For a refused back to reach the screen as native's own report would. */\n private readonly engine = inject(HostEngine, { optional: true });\n\n private readonly errors = inject(ErrorHandler);\n private readonly back = inject(NativeBack);\n /** The screen this stack sits in, when it is a stack inside a page of another. */\n private readonly holder = inject(HOLDING_SCREEN, { optional: true });\n /** What the holder's own `preventNativeDismiss` was, while this stack's top screen refuses. */\n private held: { own: unknown } | null = null;\n private readonly statusBar = inject(StatusBar);\n /** The status bar props each screen carries for the app's claim, not set by the screen itself. */\n private readonly carried = new WeakMap<object, Record<string, unknown>>();\n\n private readonly entries: StackEntry[] = [];\n /**\n * The screens a replace or a reset supersedes, kept until the navigation that supersedes them\n * succeeds: one that fails leaves the stack as it was.\n */\n private superseded: { entries: StackEntry[]; navigation: number } | null = null;\n\n protected readonly fill = { flex: 1 };\n\n constructor() {\n ownHost(this.host.nativeElement);\n // Ours, not a prop of the native stack.\n delete (this.host.nativeElement as { props: Record<string, unknown> }).props['name'];\n this.parentContexts.onChildOutletCreated(this.name, this);\n\n // Android's back button, and `NativeNavigation.back()`. Declining at the bottom of the stack\n // is deliberate: the outlet this one sits in gets its turn, and when none takes it the\n // platform backgrounds the app, which is what a user expects, rather than the app swallowing\n // the press and appearing stuck.\n //\n // Not yet verified on a device: whether react-native-screens' own Android back handling\n // (`nativeBackButtonDismissalEnabled`) also pops the screen, which would make one press pop\n // twice. If a back press ever skips a screen on Android, look here first.\n const back = this.back;\n const unsubscribeBack = back.handle((from) =>\n from === 'button' && this.refusesButton() ? true : this.goBack(),\n );\n const unsubscribeStack = back.addStack({\n showing: () => this.isShowing(),\n popToRoot: () => (this.entries.length > 1 ? this.popToEntry(0) : null),\n popTo: (url) => {\n const index = this.entries.findIndex((entry) => this.urlOf(entry) === url);\n return index !== -1 && index < this.entries.length - 1 ? this.popToEntry(index) : null;\n },\n dropUnderTop: () => {\n if (this.entries.length < 2) return false;\n for (const entry of this.entries.slice(0, -1)) this.remove(entry);\n return true;\n },\n });\n // Optional for the same reason as the router: the outlet's own tests stand one in without it.\n const navigations = this.router?.events?.subscribe((event) => {\n if (event instanceof NavigationEnd) this.settle(event.id);\n else if (event instanceof NavigationError) this.rollBack(event.id);\n });\n\n const carryAll = (claim: ReturnType<StatusBar['forScreens']>) => {\n for (const entry of this.entries) this.carryStatusBar(entry.screen, claim);\n if (this.presentedPage) this.carryStatusBar(this.presentedPage.screen, claim);\n };\n effect(() => {\n const claim = this.statusBar.forScreens();\n untracked(() => carryAll(claim));\n });\n // A page's host binding that lets go of its own value, back to undefined, changes no claim.\n afterEveryRender(() => carryAll(untracked(this.statusBar.forScreens)));\n\n const unhold = this.holder ? this.holdRefusals(this.holder) : undefined;\n const unpresent = this.takePresentedPages(back);\n const unleave = inject(IN_TAB, { optional: true })?.onLeave(() => this.dismissPresented());\n\n inject(DestroyRef).onDestroy(() => {\n unleave?.();\n unhold?.();\n unpresent?.();\n unsubscribeBack();\n unsubscribeStack();\n navigations?.unsubscribe();\n for (const entry of this.entries) {\n entry.unbind();\n entry.ref.destroy();\n }\n this.entries.length = 0;\n this.parentContexts.onChildOutletDestroyed(this.name);\n });\n }\n\n /** The page presented over everything, while there is one. See `presented-route.ts`. */\n private presentedPage: (StackEntry & { stopBack(): void }) | null = null;\n\n /**\n * The app's own stack, the one in the root component, is also the root's presented outlet: a\n * page of a tab that is not in front is shown here, as a screen over the bar and everything in\n * it. One page at a time, which the router sees to, and never kept: it is dismissed.\n */\n private takePresentedPages(back: NativeBack): (() => void) | undefined {\n const router = this.router;\n const root = inject(ActivatedRoute, { optional: true });\n if (!router?.routerState || this.name !== PRIMARY_OUTLET || root !== router.routerState.root) {\n return undefined;\n }\n const page = () => this.presentedPage;\n const outlet: RouterOutletContract = {\n supportsBindingToComponentInputs: true,\n get isActivated() {\n return page() !== null;\n },\n get component() {\n return (page()?.ref.instance as Object | undefined) ?? null;\n },\n get activatedRoute() {\n return page()?.route ?? null;\n },\n get activatedRouteData() {\n return page()?.route.snapshot.data ?? {};\n },\n activateWith: (route, environmentInjector) =>\n this.presentPage(route, environmentInjector, back),\n deactivate: () => this.dropPresentedPage(),\n detach: () => {\n throw new Error('[angular-native] a presented page is dismissed, not detached');\n },\n attach: () => {\n throw new Error('[angular-native] a presented page is not kept to attach again');\n },\n };\n this.parentContexts.onChildOutletCreated(PRESENTED, outlet);\n back.presents = true;\n return () => {\n back.presents = false;\n this.dropPresentedPage();\n this.parentContexts.onChildOutletDestroyed(PRESENTED);\n };\n }\n\n private presentPage(\n route: ActivatedRoute,\n environmentInjector: EnvironmentInjector,\n back: NativeBack,\n ): void {\n const component = (route.component ?? route.snapshot.component) as Type<unknown> | null;\n if (!component) throw new Error('[angular-native] route has no component to present');\n const presentation = this.claimPresentation(this.currentIntent()) ?? {\n stackPresentation: 'modal',\n };\n const screen = this.createScreen(presentation, () => this.dismissPresentedPage());\n const inFront = signal(true);\n const { ref, unbind } = this.createPage(\n component,\n route,\n environmentInjector,\n screen,\n inFront,\n PRESENTED,\n );\n this.carryStatusBar(screen, untracked(this.statusBar.forScreens));\n // Once the page is there to cover it: one that throws on its first render never is, and\n // nothing would put the screen under it back in front.\n this.top?.inFront.set(false);\n this.fillScreen(screen);\n // Subscribed now, so it is the newest answer and the first asked: a back dismisses the page\n // before it pops anything in the tab under it.\n const stopBack = back.handle((from) =>\n from === 'button' && this.refuseBack(screen) ? true : this.dismissPresentedPage(),\n );\n this.presentedPage = {\n route,\n ref,\n screen,\n detached: false,\n unbind,\n presentation,\n inFront,\n stopBack,\n };\n }\n\n /** The router left the presented page: take it off the stack. */\n private dropPresentedPage(): void {\n const page = this.presentedPage;\n if (!page) return;\n this.presentedPage = null;\n page.stopBack();\n this.drop(page);\n if (this.top && !this.top.detached) this.top.inFront.set(true);\n }\n\n /**\n * Take the router off the presented page, for a back or for a sheet the user swiped away: one\n * entry back where that is the url without the page, and otherwise a navigation to that url in\n * place of this entry, since something under the page was navigated while it was up.\n */\n private dismissPresentedPage(): boolean {\n if (!this.presentedPage || !this.router) return false;\n const without = withoutPresented(this.router, this.router.url);\n if (this.historyUrl(-1) === without) this.location.historyGo(-1);\n else void this.router.navigateByUrl(without, { replaceUrl: true });\n return true;\n }\n\n /** The screens currently in the stack, oldest first. Exposed for tests. */\n get depth(): number {\n return this.entries.length;\n }\n\n ngOnInit(): void {\n this.activateCurrentRoute();\n }\n\n /**\n * The route the router is already on, for an outlet created after the navigation that reached\n * it: one held behind a condition until a session or a database is ready. The router activates\n * an outlet as a navigation ends, and that one ended with no outlet to activate, so the outlet\n * takes the route from its context as it arrives, as Angular's own `RouterOutlet` does.\n */\n private activateCurrentRoute(): void {\n if (this.isActivated) return;\n const context = this.parentContexts.getContext(this.name);\n if (!context?.route) return;\n if (context.attachRef) this.attach(context.attachRef, context.route);\n else this.activateWith(context.route, context.injector);\n }\n\n // --- RouterOutletContract ----------------------------------------------\n\n get isActivated(): boolean {\n return this.top !== undefined && !this.top.detached;\n }\n\n get component(): Object | null {\n return this.top && !this.top.detached ? (this.top.ref.instance as Object) : null;\n }\n\n get activatedRoute(): ActivatedRoute | null {\n return this.top && !this.top.detached ? this.top.route : null;\n }\n\n get activatedRouteData(): Data {\n return this.activatedRoute?.snapshot.data ?? {};\n }\n\n /** The input binder reads this to bind route params to component inputs. */\n get activatedComponentRef(): ComponentRef<unknown> | null {\n return this.top?.ref ?? null;\n }\n\n activateWith(route: ActivatedRoute, environmentInjector: EnvironmentInjector): void {\n const component = (route.component ?? route.snapshot.component) as Type<unknown> | null;\n if (!component) {\n throw new Error('[angular-native] route has no component to activate');\n }\n // Whatever a stack shows is a screen, children or not, and must survive being covered.\n if (route.snapshot.routeConfig) markScreenRoute(route.snapshot.routeConfig);\n\n // What kind of navigation this is, over and above which route it lands on: a replace\n // supersedes the screen below rather than stacking on it, and a reset empties the stack.\n // Everything else leaves the screens below mounted, so their native state survives the trip.\n const intent = this.currentIntent();\n const navigation = this.navigationId();\n const presentation = this.presentationFor(intent);\n //\n // The screen is the page's host element, so its props are set before the component exists\n // and the component's own host bindings land on top of them. Style bindings merge key by\n // key, so a page styling itself keeps the absolute fill the stack lays out with - except for\n // `position` and the four insets, which a page naming them writes over outright rather than\n // merging into. Those five are re-asserted below, after the page's own change detection has\n // run, so the outlet's positioning always wins whatever a page's host style says.\n const screen = this.createScreen(presentation);\n const inFront = signal(true);\n const { ref, unbind } = this.createPage(component, route, environmentInjector, screen, inFront);\n this.carryStatusBar(screen, untracked(this.statusBar.forScreens));\n // The page's own host style, including any `position` or inset it declared, has now landed\n // on the screen: put the stack's fill back over it. Per-key, through `setStyle`, so whatever\n // else the page's style set - a background colour, say - still merges and stays.\n this.fillScreen(screen);\n\n this.back.stacked(navigation);\n const pending = this.navigationId() === navigation ? navigation : undefined;\n if (intent?.stack === 'reset') this.supersede(this.entries.slice(), pending);\n else if (intent?.stack === 'replace' && this.top) this.supersede([this.top], pending);\n this.entries.push({\n route,\n ref,\n screen,\n detached: false,\n unbind,\n presentation,\n activatedIn: navigation,\n inFront,\n });\n }\n\n /**\n * The page's component, created on its screen and rendered once.\n *\n * A page that throws on that first render fails the navigation, and nothing of it may stay: a\n * half-made screen left on the stack is one the router does not know about, with a component\n * still running on it. So its component is destroyed, its screen taken off the stack, the\n * screen it was pushed from given back its change detection, and the error handed to the\n * app's `ErrorHandler` before the router fails the navigation with it.\n */\n private createPage(\n component: Type<unknown>,\n route: ActivatedRoute,\n environmentInjector: EnvironmentInjector,\n screen: unknown,\n inFront: WritableSignal<boolean>,\n outlet = this.name,\n ): { ref: ComponentRef<unknown>; unbind: () => void } {\n let ref: ComponentRef<unknown> | undefined;\n let unbind: (() => void) | undefined;\n try {\n ref = createComponent(component, {\n environmentInjector,\n elementInjector: this.outletInjector(route, inFront, screen, outlet),\n hostElement: screen as Element,\n });\n this.applicationRef.attachView(ref.hostView);\n // Route params onto inputs before the first change detection, not after: a required input\n // read in the template throws NG0950 if it is still unset when the page first renders.\n unbind = this.bindInputs(ref, route);\n // Before anything can commit. Creating the page's nodes dirties the tree, which schedules a\n // commit of its own - and that commit would capture the page with its elements created and\n // its bindings not yet applied. On iOS the props catch up a frame later and nobody sees it;\n // on Android the flattening decision is made from the props a view is created with, so a\n // content wrapper that arrives without its `collapsable: false` is flattened for good and\n // its children end up parented to a scroll view that allows exactly one.\n ref.changeDetectorRef.detectChanges();\n return { ref, unbind };\n } catch (error) {\n unbind?.();\n ref?.destroy();\n this.removeScreen(screen);\n this.uncover();\n this.errors.handleError(error);\n throw error;\n }\n }\n\n /**\n * Take the screen in front off the stack, when there is one: nothing once the router has\n * detached it, as Angular's own outlet does nothing then. A route with no component of its own,\n * a `loadChildren` wrapper or a group, has the router detach the page under it and then\n * deactivate this same outlet, and that page is a screen pushed from, still to come back to.\n */\n deactivate(): void {\n if (!this.isActivated) return;\n this.drop(this.entries.pop()!);\n }\n\n /**\n * Hand the live `ComponentRef` back to the router without destroying it. The screen stays\n * mounted, so the component keeps running and its native views keep their state.\n */\n detach(): ComponentRef<unknown> {\n const entry = this.top;\n if (!entry) throw new Error('[angular-native] outlet is not activated, nothing to detach');\n entry.detached = true;\n entry.detachedIn = this.navigationId();\n entry.inFront.set(false);\n // `ChangeDetectorRef.detach`, not `ApplicationRef.detachView`. The latter calls\n // `renderDetachView` and pulls the view's nodes out of the tree, which is exactly what we\n // are trying to avoid: the screen would vanish from the stack the moment we pushed past it.\n // This stops change detection for an off-screen screen while leaving it mounted.\n entry.ref.hostView.detach();\n return entry.ref;\n }\n\n /**\n * Re-attach a previously detached ref. If we still hold it, everything stacked above it is a\n * screen the user has navigated back past, so those are destroyed: that is the pop.\n */\n attach(ref: ComponentRef<unknown>, route: ActivatedRoute): void {\n const index = this.entries.findIndex((entry) => entry.ref === ref);\n\n if (index === -1) {\n // Not ours: the router is restoring a ref detached by a different outlet instance. Its\n // host element is already a screen, complete with the `dismissed` listener that outlet\n // registered, so it is re-parented rather than rebuilt.\n const screen = ref.location.nativeElement;\n this.renderer.appendChild(this.host.nativeElement, screen);\n this.entries.push({\n route,\n ref,\n screen,\n detached: false,\n unbind: this.bindInputs(ref, route),\n // What it was given is its first outlet's; this one has no say over that screen's.\n inFront: signal(true),\n });\n this.applicationRef.attachView(ref.hostView);\n } else {\n for (const above of this.entries.splice(index + 1)) this.drop(above);\n if (this.currentIntent()?.stack === 'reset') {\n this.supersede(this.entries.slice(0, index), this.navigationId());\n }\n const entry = this.entries[index]!;\n entry.detached = false;\n entry.inFront.set(true);\n entry.route = route;\n // The route object is new even when the url is not, so the inputs follow the new one.\n entry.unbind();\n entry.unbind = this.bindInputs(ref, route);\n }\n\n this.back.stacked(this.navigationId());\n // Resume change detection for the screen the user is coming back to.\n ref.hostView.reattach();\n }\n\n // --- native stack -------------------------------------------------------\n\n /**\n * Route params onto the page's inputs, but only in an app that asked for it with\n * `withComponentInputBinding()`, which is the only time Angular's own outlet binds them. Read\n * per screen rather than once, for a test that stands the router in.\n */\n private bindInputs(ref: ComponentRef<unknown>, route: ActivatedRoute): () => void {\n return this.router?.componentInputBindingEnabled ? bindRouteInputs(ref, route) : () => {};\n }\n\n private get top(): StackEntry | undefined {\n return this.entries[this.entries.length - 1];\n }\n\n /**\n * What the navigation asked for, if it asked for anything. Read here rather than remembered,\n * because the router is mid-navigation for exactly as long as an activation takes.\n */\n private currentIntent(): NativeIntent | null {\n return this.router ? navigationIntent(this.router, this.router.getCurrentNavigation()) : null;\n }\n\n /**\n * How the screen a navigation activates is put on screen.\n *\n * A push on top of a presented screen is presented the same way. `RNSScreenStack` pushes a push\n * screen that follows a modal onto the navigation controller under the modal, so the router\n * would be on the new route while the modal stayed in front, and the modal's own way out would\n * first pop a screen nobody could see. A presentation the navigation names itself wins, and a\n * reset starts a stack with nothing to follow. A presented screen that is a stack of its own is\n * where a push to one of its children goes instead, inside it.\n */\n private presentationFor(intent: NativeIntent | null): ScreenPresentation | undefined {\n const own = this.claimPresentation(intent);\n const covering = this.top?.presentation?.stackPresentation;\n if (intent?.stack === 'reset' || !covering || covering === 'push' || own?.stackPresentation) {\n return own;\n }\n return { ...own, stackPresentation: covering };\n }\n\n /** The navigation's own presentation, unless an outlet further out already presented it. */\n private claimPresentation(intent: NativeIntent | null): ScreenPresentation | undefined {\n if (!intent?.presentation) return undefined;\n const id = this.router?.getCurrentNavigation()?.id;\n if (id === undefined) return intent.presentation;\n if (presented.get(this.router!) === id) return undefined;\n presented.set(this.router!, id);\n return intent.presentation;\n }\n\n /** Take a screen out for good: its bindings, its component, and its native view. */\n private drop(entry: StackEntry): void {\n entry.unbind();\n entry.ref.destroy();\n this.removeScreen(entry.screen);\n }\n\n /**\n * Take off the lowest screen presented rather than pushed, and every screen over it, for a tab\n * that has gone behind another: see `IN_TAB`. Answers the url of the screen left on top, or null\n * when nothing was presented.\n */\n private dismissPresented(): string | null {\n const index = this.entries.findIndex(\n (entry, at) => at > 0 && (entry.presentation?.stackPresentation ?? 'push') !== 'push',\n );\n if (index === -1) return null;\n for (const entry of this.entries.splice(index)) this.drop(entry);\n return this.router ? this.urlOf(this.entries[index - 1]!) : null;\n }\n\n /** Take one entry out of the stack, wherever it is, and drop it. */\n private remove(entry: StackEntry): void {\n const index = this.entries.indexOf(entry);\n if (index === -1) return;\n this.entries.splice(index, 1);\n this.drop(entry);\n }\n\n // --- a navigation's outcome ----------------------------------------------\n\n /** The id of the navigation in progress, when there is a router to say. */\n private navigationId(): number | undefined {\n return this.router?.getCurrentNavigation()?.id;\n }\n\n /**\n * Take out the screens a replace or a reset supersedes once its navigation has succeeded, or\n * at once when there is no navigation to wait for. A replaced screen has already been detached\n * by the router, and with `replaceUrl` its history entry is gone too, so nothing will attach it\n * again; the reuse strategy notices the ref is destroyed and drops its handle.\n *\n * A page that navigates as it is created, a sign-in check in `ngOnInit`, cancels the navigation\n * creating it before this is reached, so that one never ends: the page stays, and what it\n * superseded goes at once.\n */\n private supersede(entries: StackEntry[], navigation: number | undefined): void {\n if (navigation === undefined) {\n for (const entry of entries) this.remove(entry);\n return;\n }\n this.superseded = { entries, navigation };\n }\n\n /** A navigation succeeded: what it superseded goes, and what it did is no longer undoable. */\n private settle(navigation: number): void {\n if (this.superseded?.navigation === navigation) {\n for (const entry of this.superseded.entries) this.remove(entry);\n this.superseded = null;\n }\n for (const entry of this.entries) {\n if (entry.activatedIn === navigation) entry.activatedIn = undefined;\n if (entry.detachedIn === navigation) entry.detachedIn = undefined;\n }\n }\n\n /**\n * A navigation failed, so the router is back where it started: undo what it did here too.\n *\n * The screen that threw has already gone (`createPage`), but a screen this outlet activated for\n * the same navigation has not when the one that threw is further in, the first screen of a\n * stack inside it. That one goes, with everything in it, and the screen it covered carries on.\n */\n private rollBack(navigation: number): void {\n if (this.superseded?.navigation === navigation) this.superseded = null;\n for (const entry of this.entries.filter((candidate) => candidate.activatedIn === navigation)) {\n this.remove(entry);\n }\n this.uncover(navigation);\n }\n\n /**\n * Give the top screen back its change detection when the router covered it for a navigation\n * that is not going to happen: the one given, or the one in progress.\n */\n private uncover(navigation = this.navigationId()): void {\n const top = this.top;\n if (!top?.detached || top.detachedIn !== navigation) return;\n top.detached = false;\n top.detachedIn = undefined;\n top.inFront.set(true);\n top.ref.hostView.reattach();\n }\n\n /**\n * `position: absolute` and the four insets, through `setStyle` rather than one `setProperty`\n * so each key merges into whatever style is already on the screen instead of replacing it -\n * the same merge a page's own host style gets, just asserted last so the stack's layout wins.\n */\n private fillScreen(screen: unknown): void {\n for (const [key, value] of Object.entries(FILL)) {\n this.renderer.setStyle(screen as Element, key, value);\n }\n }\n\n private createScreen(\n presentation?: ScreenPresentation,\n dismissed = (count: number) => this.onNativeDismiss(count),\n ): unknown {\n const screen = ownHost(this.renderer.createElement('screen'));\n this.fillScreen(screen);\n // Set once and never lowered: see the note at the top of this file.\n this.renderer.setProperty(screen, 'activityState', ActivityState.Active);\n // A swipe-back or an Android back button pops the screen natively and only then tells JS.\n // Without this the native stack and the router disagree from that moment on: the screen is\n // gone but the URL still points at it, so the next navigation starts from the wrong place.\n this.renderer.listen(\n screen,\n 'dismissed',\n (event: { nativeEvent?: { dismissCount?: number } }) =>\n dismissed(event?.nativeEvent?.dismissCount ?? 1),\n );\n // Every key is a prop `RNSScreen` already declares, spelled the way the codegen spec spells\n // it, so this forwards rather than translates. Set before the screen joins the stack: the\n // native side reads the presentation as it mounts.\n for (const [prop, value] of Object.entries(presentation ?? {})) {\n if (value !== undefined) this.renderer.setProperty(screen, prop, value);\n }\n // Except this one, which is a struct with no default: an edge left out is 0 natively, and\n // `RNSScreenStack` refuses a swipe-back that starts beyond 0 points. -1 is no limit, which is\n // what `Screen.tsx` sends for every edge not given.\n this.renderer.setProperty(screen, 'gestureResponseDistance', {\n ...UNLIMITED_SWIPE,\n ...presentation?.gestureResponseDistance,\n });\n\n this.renderer.appendChild(this.host.nativeElement, screen);\n return screen;\n }\n\n /**\n * Puts the app's status bar claim on a screen that has no style or visibility of its own, from\n * its presentation or its page's host bindings. On Android, react-native-screens sets the bar\n * from the screen in front each time one appears, and falls back to light text and shown for a\n * screen without these props, which would undo the claim on every push and pop.\n *\n * First called once the page has rendered, so a prop its host bindings set is already there and\n * counts as the screen's own, even one equal to the claim.\n */\n private carryStatusBar(\n screen: unknown,\n claim: { readonly style?: string; readonly hidden?: boolean },\n ): void {\n const props = (screen as Partial<EngineNode>).props ?? {};\n const before = this.carried.get(screen as object) ?? {};\n const now: Record<string, unknown> = {};\n for (const [key, prop] of Object.entries(STATUS_BAR_PROPS)) {\n if (props[prop] !== undefined && props[prop] !== before[prop]) continue;\n const value = claim[key as keyof typeof claim];\n now[prop] = value;\n if (props[prop] !== value) this.renderer.setProperty(screen, prop, value);\n }\n this.carried.set(screen as object, now);\n }\n\n /**\n * Follow a pop the user already made. `historyGo`, not `back()`, because iOS coalesces a long\n * swipe into a single event with a count.\n *\n * Only ever fires for a native dismissal: verified on device that a pop this outlet drives\n * itself emits `willAppear`/`appear` for the screen below but no `dismissed`, so there is no\n * double-pop to guard against.\n *\n * The gesture itself is unverified by tooling: idb cannot synthesise a `UIScreenEdgePan` that\n * UIKit accepts, so this path was reasoned from the events rather than driven end to end.\n */\n private onNativeDismiss(count: number): void {\n this.popBy(Math.max(1, count));\n }\n\n /**\n * A back, from the button or `NativeNavigation`: pop the top screen, as long as there is one\n * below it and this stack is the one the user is looking at. A stack in a tab behind, or under\n * a screen pushed over the tab bar, is still subscribed, and the newest one would otherwise\n * answer for the stack in front.\n */\n /**\n * Android's Back button is the platform's own dismissal there, and react-native-screens leaves\n * it to JS: its Android screen ignores `preventNativeDismiss`. So a top screen that sets it\n * refuses the press here, as iOS refuses a swipe, and hears `nativeDismissCancelled` the same\n * way, through the engine, as if native had sent it.\n */\n private refusesButton(): boolean {\n if (this.entries.length < 2 || !this.isShowing()) return false;\n return this.refuseBack(this.top!.screen);\n }\n\n /** Refuses Android's Back for a screen that sets `preventNativeDismiss`, and tells its page. */\n private refuseBack(screen: unknown): boolean {\n if (!refuses(screen)) return false;\n // The native engine's own entry point for an event, the one Fabric calls. Not on\n // `HostEngine`, because only a native host has a screen to refuse with.\n const native = this.engine as { dispatchEvent?: NativeDispatch } | null;\n native?.dispatchEvent?.(screen as EngineNode, 'topNativeDismissCancelled', { dismissCount: 1 });\n return true;\n }\n\n /**\n * Passes the top screen's refusal to the screen this stack sits in, and that screen's report of\n * an attempt back to the top screen: the swipe that dismisses a presented stack is on the\n * screen holding it, which the page inside cannot bind.\n *\n * Read after every render, since the refusal is a host binding of whatever page is on top.\n */\n private holdRefusals(holder: HoldingScreen): () => void {\n const render = afterEveryRender(() => this.holdRefusal(holder));\n const unlisten = this.renderer.listen(\n holder.screen,\n 'nativeDismissCancelled',\n (event: { nativeEvent?: unknown }) => {\n // The stack can have lost its last screen with the refusal not yet released.\n const top = this.top;\n if (!this.held || !top) return;\n const native = this.engine as { dispatchEvent?: NativeDispatch } | null;\n const report = event?.nativeEvent ?? { dismissCount: 1 };\n native?.dispatchEvent?.(top.screen, 'topNativeDismissCancelled', report);\n },\n );\n return () => {\n render.destroy();\n unlisten();\n this.release(holder);\n };\n }\n\n private holdRefusal(holder: HoldingScreen): void {\n // A stack in a tab behind is inside the same screen, and has no say in it.\n if (!refuses(this.top?.screen) || !this.isShowing()) return this.release(holder);\n if (refuses(holder.screen)) return;\n // ponytail: the holder's own binding is read when the top screen starts refusing. One that\n // turns true while it does is put back as it was then; bind the refusal in one of the two.\n this.held = { own: (holder.screen as EngineNode).props?.['preventNativeDismiss'] };\n this.renderer.setProperty(holder.screen, 'preventNativeDismiss', true);\n holder.refusalChanged();\n }\n\n /** The holder's own answer again, once the top screen no longer refuses. */\n private release(holder: HoldingScreen): void {\n if (!this.held) return;\n this.renderer.setProperty(holder.screen, 'preventNativeDismiss', this.held.own ?? false);\n this.held = null;\n holder.refusalChanged();\n }\n\n private goBack(): boolean {\n if (this.entries.length < 2 || !this.isShowing()) return false;\n this.popBy(1);\n return true;\n }\n\n /** Whether the top screen is part of what the router shows now. Assumed without a router. */\n private isShowing(): boolean {\n if (!this.router) return true;\n return this.isActivated && isShowing(this.router, this.top!.route);\n }\n\n /**\n * Take the router to the screen `steps` below the top, whether native already popped it or it\n * is about to be popped because the router arrives there.\n */\n private popBy(steps: number): void {\n const below = this.entries[this.entries.length - 1 - steps];\n const url = below && this.router ? this.urlOf(below) : null;\n // Usually the entry that far back is the screen the pop revealed, and going back through\n // history keeps it tidy. Not always: a stack inside a tab shares history with the other tabs,\n // so after a trip to one and back the entry behind the top screen is that other tab, and\n // going back would switch tab rather than pop. Then the router is sent to the revealed\n // screen instead, replacing the entry of the one that is gone.\n const behind = this.historyUrl(-steps);\n if (!url || behind === undefined || behind === url) {\n this.location.historyGo(-steps);\n return;\n }\n void this.router!.navigateByUrl(url, { replaceUrl: true });\n }\n\n /**\n * Take the router down to the screen at `index`, popping every screen above it together.\n * Through history when the entries behind are these screens, so going back from there keeps\n * working one screen at a time; otherwise by a navigation to it that replaces the entry, as\n * `popBy` does when a tab's history interleaves.\n */\n private popToEntry(index: number): Promise<boolean> {\n const url = this.urlOf(this.entries[index]!);\n const steps = this.entries.length - 1 - index;\n // The url the router is on already, where the same one is on the stack twice: a navigation\n // to it is skipped, and would pop nothing. The screen on top is showing it, so that one\n // stays and the ones under it go, down to the one asked for.\n if (url === this.router!.url) {\n for (const entry of this.entries.slice(index, -1)) this.remove(entry);\n if (this.historyUrl(-steps) === url) this.location.historyGo(-steps);\n return Promise.resolve(true);\n }\n if (this.historyUrl(-steps) === url) {\n const arrived = this.nextNavigation();\n this.location.historyGo(-steps);\n return arrived;\n }\n return this.router!.navigateByUrl(url, { replaceUrl: true });\n }\n\n /** Whether the navigation that happens next succeeds. */\n private nextNavigation(): Promise<boolean> {\n return new Promise((resolve) => {\n const events = this.router!.events.subscribe((event) => {\n if (event instanceof NavigationEnd) resolve(true);\n else if (event instanceof NavigationError || event instanceof NavigationCancel) {\n resolve(false);\n } else return;\n events.unsubscribe();\n });\n });\n }\n\n /** The url a screen was showing when it was covered, rebuilt from its own route snapshot. */\n private urlOf(entry: StackEntry): string {\n const snapshot = entry.route.snapshot;\n const tree = createUrlTreeFromSnapshot(snapshot, [], snapshot.queryParams, snapshot.fragment);\n return this.router!.serializeUrl(tree);\n }\n\n /**\n * The url of the history entry `offset` away, normalised the way the router writes it: null past\n * the start of history, and undefined when the history is not ours to read, so the pop has to go\n * through it blind.\n */\n private historyUrl(offset: number): string | null | undefined {\n if (!(this.history instanceof NativePlatformLocation)) return undefined;\n const url = this.history.ɵurlAt(offset);\n return url === null ? null : this.router!.serializeUrl(this.router!.parseUrl(url));\n }\n\n private removeScreen(screen: unknown): void {\n this.renderer.removeChild(this.host.nativeElement, screen);\n }\n\n /**\n * What a page is created with: its route, its screen, the outlet contexts its own outlets\n * register in, and whether its screen is in front - which is this screen's own say and, for a stack inside a\n * screen of another, that screen's too.\n */\n private outletInjector(\n route: ActivatedRoute,\n inFront: WritableSignal<boolean>,\n screen: unknown,\n outlet = this.name,\n ): Injector {\n const outer = this.injector.get(SCREEN_IN_FRONT);\n return Injector.create({\n parent: this.injector,\n providers: [\n { provide: SCREEN_IN_FRONT, useValue: computed(() => outer() && inFront()) },\n {\n provide: HOLDING_SCREEN,\n useValue: {\n screen,\n refusalChanged: () => this.holder && this.holdRefusal(this.holder),\n } satisfies HoldingScreen,\n },\n { provide: ActivatedRoute, useValue: route },\n { provide: SCREEN_HEADER, useValue: signal(false) },\n {\n provide: ChildrenOutletContexts,\n useValue: this.parentContexts.getOrCreateContext(outlet).children,\n },\n ],\n });\n }\n}\n"]}
1
+ {"version":3,"file":"native-stack-outlet.js","sourceRoot":"","sources":["../src/native-stack-outlet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EACL,cAAc,EACd,SAAS,EACT,UAAU,EACV,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,QAAQ,EACR,SAAS,EACT,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,MAAM,EACN,MAAM,EACN,MAAM,EACN,SAAS,GAMV,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,cAAc,EACd,MAAM,EACN,yBAAyB,GAG1B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAqB,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAmB,MAAM,mBAAmB,CAAC;AAEhE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;;AAqB7C;;;;;;;GAOG;AACH,MAAM,SAAS,GAAG,IAAI,OAAO,EAAkB,CAAC;AAEhD,8FAA8F;AAC9F,MAAM,IAAI,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAW,CAAC;AAErF,mDAAmD;AACnD,MAAM,eAAe,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAW,CAAC;AAE7E;;;;GAIG;AACH,MAAM,cAAc,GAAG,IAAI,cAAc,CAAgB,iCAAiC,CAAC,CAAC;AAW5F,yEAAyE;AACzE,MAAM,OAAO,GAAG,CAAC,MAAe,EAAW,EAAE,CAC1C,MAA0C,EAAE,KAAK,EAAE,CAAC,sBAAsB,CAAC,KAAK,IAAI,CAAC;AAExF,2FAA2F;AAC3F,MAAM,gBAAgB,GAAG;IACvB,KAAK,EAAE,gBAAgB;IACvB,MAAM,EAAE,iBAAiB;IACzB,mBAAmB,EAAE,qBAAqB;CAClC,CAAC;AAaX,MAAM,OAAO,iBAAiB;IAC5B;;;;OAIG;IACM,IAAI,GAAG,MAAM,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,cAAc,CAAC;IAEpF,gCAAgC,GAAG,IAAI,CAAC;IAEhC,cAAc,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAChD,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7B,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;IACxC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5B,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1B,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5B,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACpD;;;OAGG;IACc,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,2EAA2E;IAC1D,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAEhD,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IAC9B,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAC3C,kFAAkF;IACjE,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,+FAA+F;IACvF,IAAI,GAA4B,IAAI,CAAC;IAC5B,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAC9B,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IACvD,oDAAoD;IACnC,UAAU,GAAG,QAAQ,CAAiB,GAAG,EAAE,CAAC,CAAC;QAC5D,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;QAC9B,mBAAmB,EAAE,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,MAAM;KAC5D,CAAC;mFAAC,CAAC;IAEa,OAAO,GAAiB,EAAE,CAAC;IAC5C;;;OAGG;IACK,UAAU,GAAyD,IAAI,CAAC;IAE7D,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAEtC;QACE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjC,wCAAwC;QACxC,OAAQ,IAAI,CAAC,IAAI,CAAC,aAAoD,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrF,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAE1D,6FAA6F;QAC7F,uFAAuF;QACvF,6FAA6F;QAC7F,iCAAiC;QACjC,EAAE;QACF,wFAAwF;QACxF,4FAA4F;QAC5F,0EAA0E;QAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAC3C,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CACjE,CAAC;QACF,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC;YACrC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE;YAC/B,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACtE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;gBACb,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;gBAC3E,OAAO,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACzF,CAAC;YACD,YAAY,EAAE,GAAG,EAAE;gBACjB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,KAAK,CAAC;gBAC1C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAClE,OAAO,IAAI,CAAC;YACd,CAAC;SACF,CAAC,CAAC;QACH,8FAA8F;QAC9F,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YAC3D,IAAI,KAAK,YAAY,aAAa;gBAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;iBACrD,IAAI,KAAK,YAAY,eAAe;gBAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,CAAC,KAAqB,EAAE,EAAE;YACzC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC5E,IAAI,IAAI,CAAC,aAAa;gBAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACjF,CAAC,CAAC;QACF,MAAM,CAAC,GAAG,EAAE;YACV,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAChC,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QACH,4FAA4F;QAC5F,gBAAgB,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAE7D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxE,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAE3F,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;YAChC,OAAO,EAAE,EAAE,CAAC;YACZ,MAAM,EAAE,EAAE,CAAC;YACX,SAAS,EAAE,EAAE,CAAC;YACd,eAAe,EAAE,CAAC;YAClB,gBAAgB,EAAE,CAAC;YACnB,WAAW,EAAE,WAAW,EAAE,CAAC;YAC3B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjC,KAAK,CAAC,MAAM,EAAE,CAAC;gBACf,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACtB,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACxB,uFAAuF;YACvF,6FAA6F;YAC7F,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,EAAE,CAAC;gBAC/D,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,wFAAwF;IAChF,aAAa,GAA+C,IAAI,CAAC;IAEzE;;;;OAIG;IACK,kBAAkB,CAAC,IAAgB;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,EAAE,WAAW,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YAC7F,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC;QACtC,MAAM,MAAM,GAAyB;YACnC,gCAAgC,EAAE,IAAI;YACtC,IAAI,WAAW;gBACb,OAAO,IAAI,EAAE,KAAK,IAAI,CAAC;YACzB,CAAC;YACD,IAAI,SAAS;gBACX,OAAQ,IAAI,EAAE,EAAE,GAAG,CAAC,QAA+B,IAAI,IAAI,CAAC;YAC9D,CAAC;YACD,IAAI,cAAc;gBAChB,OAAO,IAAI,EAAE,EAAE,KAAK,IAAI,IAAI,CAAC;YAC/B,CAAC;YACD,IAAI,kBAAkB;gBACpB,OAAO,IAAI,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;YAC3C,CAAC;YACD,YAAY,EAAE,CAAC,KAAK,EAAE,mBAAmB,EAAE,EAAE,CAC3C,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,mBAAmB,EAAE,IAAI,CAAC;YACpD,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAC1C,MAAM,EAAE,GAAG,EAAE;gBACX,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;YAClF,CAAC;YACD,MAAM,EAAE,GAAG,EAAE;gBACX,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;YACnF,CAAC;SACF,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC5D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;gBACjE,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;YACxD,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAEO,WAAW,CACjB,KAAqB,EACrB,mBAAwC,EACxC,IAAgB;QAEhB,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAyB,CAAC;QACxF,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACtF,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI;YACnE,iBAAiB,EAAE,OAAO;SAC3B,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC;QAClF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI;oFAAC,CAAC;QAC7B,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CACrC,SAAS,EACT,KAAK,EACL,mBAAmB,EACnB,MAAM,EACN,OAAO,EACP,SAAS,CACV,CAAC;QACF,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACzD,wFAAwF;QACxF,uDAAuD;QACvD,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACxB,4FAA4F;QAC5F,+CAA+C;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CACpC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAClF,CAAC;QACF,IAAI,CAAC,aAAa,GAAG;YACnB,KAAK;YACL,GAAG;YACH,MAAM;YACN,QAAQ,EAAE,KAAK;YACf,MAAM;YACN,YAAY;YACZ,OAAO;YACP,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,iEAAiE;IACzD,iBAAiB;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC;QAChC,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ;YAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;IAED;;;;OAIG;IACK,oBAAoB;QAC1B,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QACtD,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/D,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO;YAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;;YAC5D,KAAK,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2EAA2E;IAC3E,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED;;;;;OAKG;IACK,oBAAoB;QAC1B,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,OAAO,EAAE,KAAK;YAAE,OAAO;QAC5B,IAAI,OAAO,CAAC,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;;YAChE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED,0EAA0E;IAE1E,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;IACtD,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAmB,CAAC,CAAC,CAAC,IAAI,CAAC;IACnF,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,CAAC;IAED,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;IAClD,CAAC;IAED,4EAA4E;IAC5E,IAAI,qBAAqB;QACvB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC;IAC/B,CAAC;IAED,YAAY,CAAC,KAAqB,EAAE,mBAAwC;QAC1E,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAyB,CAAC;QACxF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QACD,uFAAuF;QACvF,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW;YAAE,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAE5E,qFAAqF;QACrF,yFAAyF;QACzF,6FAA6F;QAC7F,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAClD,EAAE;QACF,0FAA0F;QAC1F,yFAAyF;QACzF,6FAA6F;QAC7F,4FAA4F;QAC5F,4FAA4F;QAC5F,kFAAkF;QAClF,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI;oFAAC,CAAC;QAC7B,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAChG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACzD,2FAA2F;QAC3F,6FAA6F;QAC7F,iFAAiF;QACjF,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAExB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5E,IAAI,MAAM,EAAE,KAAK,KAAK,OAAO;YAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;aACxE,IAAI,MAAM,EAAE,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG;YAAE,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QACtF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,KAAK;YACL,GAAG;YACH,MAAM;YACN,QAAQ,EAAE,KAAK;YACf,MAAM;YACN,YAAY;YACZ,WAAW,EAAE,UAAU;YACvB,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACK,UAAU,CAChB,SAAwB,EACxB,KAAqB,EACrB,mBAAwC,EACxC,MAAe,EACf,OAAgC,EAChC,MAAM,GAAG,IAAI,CAAC,IAAI;QAElB,IAAI,GAAsC,CAAC;QAC3C,IAAI,MAAgC,CAAC;QACrC,IAAI,CAAC;YACH,GAAG,GAAG,eAAe,CAAC,SAAS,EAAE;gBAC/B,mBAAmB;gBACnB,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC;gBACpE,WAAW,EAAE,MAAiB;aAC/B,CAAC,CAAC;YACH,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC7C,0FAA0F;YAC1F,uFAAuF;YACvF,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACrC,4FAA4F;YAC5F,2FAA2F;YAC3F,4FAA4F;YAC5F,yFAAyF;YACzF,0FAA0F;YAC1F,yEAAyE;YACzE,GAAG,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC;YACtC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,EAAE,EAAE,CAAC;YACX,GAAG,EAAE,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC/B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,UAAU;QACR,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAG,CAAC,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,MAAM;QACJ,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC3F,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QACtB,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzB,gFAAgF;QAChF,0FAA0F;QAC1F,4FAA4F;QAC5F,iFAAiF;QACjF,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,GAAG,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,GAA0B,EAAE,KAAqB;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QAEnE,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,uFAAuF;YACvF,uFAAuF;YACvF,wDAAwD;YACxD,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC1C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YAC3D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;gBAChB,KAAK;gBACL,GAAG;gBACH,MAAM;gBACN,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC;gBACnC,mFAAmF;gBACnF,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC;aACtB,CAAC,CAAC;YACH,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrE,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,KAAK,OAAO,EAAE,CAAC;gBAC5C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;YACpE,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAE,CAAC;YACnC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;YACvB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACxB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;YACpB,sFAAsF;YACtF,KAAK,CAAC,MAAM,EAAE,CAAC;YACf,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QACvC,qEAAqE;QACrE,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAED,2EAA2E;IAE3E;;;;OAIG;IACK,UAAU,CAAC,GAA0B,EAAE,KAAqB;QAClE,OAAO,IAAI,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;IAC5F,CAAC;IAED,IAAY,GAAG;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACK,aAAa;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChG,CAAC;IAED;;;;;;;;;OASG;IACK,eAAe,CAAC,MAA2B;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,iBAAiB,CAAC;QAC3D,IAAI,MAAM,EAAE,KAAK,KAAK,OAAO,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,MAAM,IAAI,GAAG,EAAE,iBAAiB,EAAE,CAAC;YAC5F,OAAO,GAAG,CAAC;QACb,CAAC;QACD,OAAO,EAAE,GAAG,GAAG,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC;IACjD,CAAC;IAED,4FAA4F;IACpF,iBAAiB,CAAC,MAA2B;QACnD,IAAI,CAAC,MAAM,EAAE,YAAY;YAAE,OAAO,SAAS,CAAC;QAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,oBAAoB,EAAE,EAAE,EAAE,CAAC;QACnD,IAAI,EAAE,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC,YAAY,CAAC;QACjD,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAO,CAAC,KAAK,EAAE;YAAE,OAAO,SAAS,CAAC;QACzD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAO,EAAE,EAAE,CAAC,CAAC;QAChC,OAAO,MAAM,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,oFAAoF;IAC5E,IAAI,CAAC,KAAiB;QAC5B,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACK,gBAAgB;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAClC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,iBAAiB,IAAI,MAAM,CAAC,KAAK,MAAM,CACtF,CAAC;QACF,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnE,CAAC;IAED,oEAAoE;IAC5D,MAAM,CAAC,KAAiB;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAED,4EAA4E;IAE5E,2EAA2E;IACnE,YAAY;QAClB,OAAO,IAAI,CAAC,MAAM,EAAE,oBAAoB,EAAE,EAAE,EAAE,CAAC;IACjD,CAAC;IAED;;;;;;;;;OASG;IACK,SAAS,CAAC,OAAqB,EAAE,UAA8B;QACrE,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,KAAK,MAAM,KAAK,IAAI,OAAO;gBAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IAC5C,CAAC;IAED,8FAA8F;IACtF,MAAM,CAAC,UAAkB;QAC/B,IAAI,IAAI,CAAC,UAAU,EAAE,UAAU,KAAK,UAAU,EAAE,CAAC;YAC/C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO;gBAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,WAAW,KAAK,UAAU;gBAAE,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC;YACpE,IAAI,KAAK,CAAC,UAAU,KAAK,UAAU;gBAAE,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;QACpE,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACK,QAAQ,CAAC,UAAkB;QACjC,IAAI,IAAI,CAAC,UAAU,EAAE,UAAU,KAAK,UAAU;YAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW,KAAK,UAAU,CAAC,EAAE,CAAC;YAC7F,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACrB,IAAI,CAAC,GAAG,EAAE,QAAQ,IAAI,GAAG,CAAC,UAAU,KAAK,UAAU;YAAE,OAAO;QAC5D,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC;QACrB,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC;QAC3B,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtB,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACK,UAAU,CAAC,MAAe;QAChC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAiB,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAEO,YAAY,CAClB,YAAiC,EACjC,YAAY,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;QAE1D,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9D,8FAA8F;QAC9F,iFAAiF;QAChF,MAA8B,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACnD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACxB,oEAAoE;QACpE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QACzE,0FAA0F;QAC1F,2FAA2F;QAC3F,2FAA2F;QAC3F,IAAI,CAAC,QAAQ,CAAC,MAAM,CAClB,MAAM,EACN,WAAW,EACX,CAAC,KAAkD,EAAE,EAAE,CACrD,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,IAAI,CAAC,CAAC,CACnD,CAAC;QACF,4FAA4F;QAC5F,0FAA0F;QAC1F,mDAAmD;QACnD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;YAC/D,IAAI,KAAK,KAAK,SAAS;gBAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC1E,CAAC;QACD,0FAA0F;QAC1F,8FAA8F;QAC9F,oDAAoD;QACpD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,yBAAyB,EAAE;YAC3D,GAAG,eAAe;YAClB,GAAG,YAAY,EAAE,uBAAuB;SACzC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAC3D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;;;;;OASG;IACK,eAAe,CAAC,MAAe,EAAE,KAAqB;QAC5D,MAAM,IAAI,GAAG,MAA6B,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC3D,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YACrC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAyB,CAAC,CAAC;YAC/C,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK;gBAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC1E,wCAAwC;YACxC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACK,eAAe,CAAC,KAAa;QACnC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACjC,CAAC;IAED;;;;;OAKG;IACH;;;;;OAKG;IACK,aAAa;QACnB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO,KAAK,CAAC;QAC/D,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,gGAAgG;IACxF,UAAU,CAAC,MAAe;QAChC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QACnC,iFAAiF;QACjF,wEAAwE;QACxE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAmD,CAAC;QACxE,MAAM,EAAE,aAAa,EAAE,CAAC,MAAoB,EAAE,2BAA2B,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QAChG,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;OAMG;IACK,YAAY,CAAC,MAAqB;QACxC,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CACnC,MAAM,CAAC,MAAM,EACb,wBAAwB,EACxB,CAAC,KAAgC,EAAE,EAAE;YACnC,6EAA6E;YAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG;gBAAE,OAAO;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAmD,CAAC;YACxE,MAAM,MAAM,GAAG,KAAK,EAAE,WAAW,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;YACzD,MAAM,EAAE,aAAa,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,2BAA2B,EAAE,MAAM,CAAC,CAAC;QAC3E,CAAC,CACF,CAAC;QACF,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,QAAQ,EAAE,CAAC;YACX,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC,CAAC;IACJ,CAAC;IAEO,WAAW,CAAC,MAAqB;QACvC,2EAA2E;QAC3E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjF,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YAAE,OAAO;QACnC,2FAA2F;QAC3F,2FAA2F;QAC3F,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,EAAG,MAAM,CAAC,MAAqB,CAAC,KAAK,EAAE,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACnF,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,EAAE,IAAI,CAAC,CAAC;QACvE,MAAM,CAAC,cAAc,EAAE,CAAC;IAC1B,CAAC;IAED,4EAA4E;IACpE,OAAO,CAAC,MAAqB;QACnC,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO;QACvB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC;QACzF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,MAAM,CAAC,cAAc,EAAE,CAAC;IAC1B,CAAC;IAEO,MAAM;QACZ,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO,KAAK,CAAC;QAC/D,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6FAA6F;IACrF,SAAS;QACf,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAC9B,OAAO,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAI,CAAC,KAAK,CAAC,CAAC;IACrE,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,KAAa;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5D,yFAAyF;QACzF,8FAA8F;QAC9F,yFAAyF;QACzF,uFAAuF;QACvF,+DAA+D;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QACD,KAAK,IAAI,CAAC,MAAO,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;OAKG;IACK,UAAU,CAAC,KAAa;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAE,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC;QAC9C,2FAA2F;QAC3F,wFAAwF;QACxF,6DAA6D;QAC7D,IAAI,GAAG,KAAK,IAAI,CAAC,MAAO,CAAC,GAAG,EAAE,CAAC;YAC7B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtE,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG;gBAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC;YACrE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC;YAChC,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC,MAAO,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,yDAAyD;IACjD,cAAc;QACpB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;gBACrD,IAAI,KAAK,YAAY,aAAa;oBAAE,OAAO,CAAC,IAAI,CAAC,CAAC;qBAC7C,IAAI,KAAK,YAAY,eAAe,IAAI,KAAK,YAAY,gBAAgB,EAAE,CAAC;oBAC/E,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC;;oBAAM,OAAO;gBACd,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,6FAA6F;IACrF,KAAK,CAAC,KAAiB;QAC7B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;QACtC,MAAM,IAAI,GAAG,yBAAyB,CAAC,QAAQ,EAAE,EAAE,EAAE,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9F,OAAO,IAAI,CAAC,MAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED;;;;OAIG;IACK,UAAU,CAAC,MAAc;QAC/B,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,YAAY,sBAAsB,CAAC;YAAE,OAAO,SAAS,CAAC;QACxE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAO,CAAC,YAAY,CAAC,IAAI,CAAC,MAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IACrF,CAAC;IAEO,YAAY,CAAC,MAAe;QAClC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED;;;;OAIG;IACK,cAAc,CACpB,KAAqB,EACrB,OAAgC,EAChC,MAAe,EACf,MAAM,GAAG,IAAI,CAAC,IAAI;QAElB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACjD,OAAO,QAAQ,CAAC,MAAM,CAAC;YACrB,MAAM,EAAE,IAAI,CAAC,QAAQ;YACrB,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE;gBAC5E;oBACE,OAAO,EAAE,cAAc;oBACvB,QAAQ,EAAE;wBACR,MAAM;wBACN,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;qBAC3C;iBAC1B;gBACD,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE;gBAC5C,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;gBACnD;oBACE,OAAO,EAAE,sBAAsB;oBAC/B,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,QAAQ;iBAClE;aACF;SACF,CAAC,CAAC;IACL,CAAC;uGA12BU,iBAAiB;2FAAjB,iBAAiB,0HAHlB,EAAE;;2FAGD,iBAAiB;kBAL7B,SAAS;mBAAC;oBACT,QAAQ,EAAE,qBAAqB;oBAC/B,QAAQ,EAAE,EAAE;oBACZ,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;iBAC5B","sourcesContent":["/**\n * A `RouterOutlet` that renders a native stack instead of swapping one view for another.\n *\n * The outlet's host element *is* the `RNSScreenStack`, and each activated route's component is\n * created directly on its own `screen` child rather than on a wrapper view inside it (ADR 0004).\n * The screens below the top stay mounted, which is what keeps a pushed-away screen's native\n * state alive: its scroll offset, its text cursor, its keyboard focus.\n *\n * Push and pop are inferred from the calls the router already makes. With a reuse strategy that\n * detaches, navigating forward is `detach()` then `activateWith()`, and navigating back is\n * `detach()` then `attach(ref)` with a ref we handed out earlier. Finding that ref in our own\n * stack is what identifies a pop, so nothing here needs to consult the URL.\n *\n * Note `activityState` is set once, to active, and never lowered. `Screen.tsx` throws on any\n * decrease while `isNativeStack`, because a native stack decides what is visible from the order\n * of its children rather than from a per-screen flag. Toggling that flag is for `ScreenContainer`\n * (tabs), where every screen is mounted at once.\n */\nimport {\n ApplicationRef,\n Component,\n DestroyRef,\n ElementRef,\n ErrorHandler,\n HostAttributeToken,\n InjectionToken,\n Injector,\n Renderer2,\n afterEveryRender,\n computed,\n createComponent,\n effect,\n inject,\n signal,\n untracked,\n type ComponentRef,\n type EnvironmentInjector,\n type OnInit,\n type Type,\n type WritableSignal,\n} from '@angular/core';\nimport {\n ActivatedRoute,\n ChildrenOutletContexts,\n NavigationCancel,\n NavigationEnd,\n NavigationError,\n PRIMARY_OUTLET,\n Router,\n createUrlTreeFromSnapshot,\n type Data,\n type RouterOutletContract,\n} from '@angular/router';\nimport { Location, PlatformLocation } from '@angular/common';\nimport { NavigationBar, SCREEN_IN_FRONT, StatusBar } from '@ng-native/device';\nimport { bindRouteInputs } from './bind-route-inputs.ts';\nimport { NativeBack, isShowing } from './native-back.ts';\nimport { navigationIntent, type NativeIntent } from './native-navigation.ts';\nimport { NativePlatformLocation } from './native-platform-location.ts';\nimport { PRESENTED, withoutPresented } from './presented-route.ts';\nimport { markScreenRoute } from './tab-routes.ts';\nimport { IN_TAB } from './in-tab.ts';\nimport { ownHost } from './own-host.ts';\nimport { SCREEN_HEADER } from './screen-header.ts';\nimport { HostEngine, type EngineNode } from '@ng-native/fabric';\nimport type { ScreenPresentation } from './screen-presentation.ts';\nimport { ActivityState } from './screens.ts';\n\ninterface StackEntry {\n route: ActivatedRoute;\n ref: ComponentRef<unknown>;\n /** The `screen` element this entry's component lives inside. */\n screen: unknown;\n /** True while the router is holding this ref for a later `attach`. */\n detached: boolean;\n /** Stops feeding route params into the component's inputs. */\n unbind: () => void;\n /** How the screen was put on screen, for a push from it to follow. */\n presentation?: ScreenPresentation;\n /** The navigation that put this screen on the stack, until that navigation ends. */\n activatedIn?: number;\n /** The navigation that covered this screen, until that navigation ends. */\n detachedIn?: number;\n /** Whether this screen is the one in front, for what it holds: see `SCREEN_IN_FRONT`. */\n inFront: WritableSignal<boolean>;\n}\n\n/**\n * The last navigation, per router, whose presentation an outlet has already given a screen.\n *\n * Presenting a route that is a stack of its own activates two outlets in one navigation: the one\n * the route is presented in, and the one inside it that shows the route's first child. Only the\n * first is presented; the second is the first screen of a stack inside a presented screen, and a\n * push inside that stack must see it as a pushed screen, not one to present over.\n */\nconst presented = new WeakMap<object, number>();\n\n/** What every screen needs to fill the stack, the same five keys RNSScreen itself expects. */\nconst FILL = { position: 'absolute', left: 0, right: 0, top: 0, bottom: 0 } as const;\n\n/** A swipe-back area with no limit on any edge. */\nconst UNLIMITED_SWIPE = { start: -1, end: -1, top: -1, bottom: -1 } as const;\n\n/**\n * The screen a page lives in, for a stack inside that page. A presented screen with a header is\n * such a stack, and the page that knows whether to refuse a dismissal is a screen inside it, where\n * the screen a swipe down dismisses is this one.\n */\nconst HOLDING_SCREEN = new InjectionToken<HoldingScreen>('ng-native.router.holding-screen');\n\ninterface HoldingScreen {\n readonly screen: unknown;\n /**\n * Told when a stack inside the screen changes what the screen refuses, so the stack the screen\n * is in can pass that on in turn, in the same render: its own look came before this one.\n */\n refusalChanged(): void;\n}\n\n/** Whether a screen refuses a native dismissal, as its page bound it. */\nconst refuses = (screen: unknown): boolean =>\n (screen as Partial<EngineNode> | undefined)?.props?.['preventNativeDismiss'] === true;\n\n/** The screen props a status or navigation bar claim rides on, by what the claim names. */\nconst SYSTEM_BAR_PROPS = {\n style: 'statusBarStyle',\n hidden: 'statusBarHidden',\n navigationBarHidden: 'navigationBarHidden',\n} as const;\n\n/** The system bar claims a screen carries, keyed as `SYSTEM_BAR_PROPS` names them. */\ntype SystemBarClaim = { readonly [key in keyof typeof SYSTEM_BAR_PROPS]?: string | boolean };\n\n/** The native engine's `dispatchEvent`, as Fabric calls it. */\ntype NativeDispatch = (node: unknown, topLevelType: string, nativeEvent: unknown) => void;\n\n@Component({\n selector: 'native-stack-outlet',\n template: '',\n host: { '[style]': 'fill' },\n})\nexport class NativeStackOutlet implements RouterOutletContract, OnInit {\n /**\n * Named outlets work exactly as on the web: `<native-stack-outlet name=\"list\" />` is filled by\n * routes with `outlet: 'list'`. The default is the primary one. Read once, as the router's own\n * outlet reads it, since an outlet cannot change which contexts it is registered under.\n */\n readonly name = inject(new HostAttributeToken('name'), { optional: true }) ?? PRIMARY_OUTLET;\n\n readonly supportsBindingToComponentInputs = true;\n\n private readonly parentContexts = inject(ChildrenOutletContexts);\n private readonly renderer = inject(Renderer2);\n private readonly applicationRef = inject(ApplicationRef);\n private readonly injector = inject(Injector);\n private readonly host = inject(ElementRef);\n private readonly location = inject(Location);\n private readonly history = inject(PlatformLocation);\n /**\n * Only for the intent a navigation carries. Optional so the outlet can be exercised through\n * `RouterOutletContract` directly, which is how its own tests drive it.\n */\n private readonly router = inject(Router, { optional: true });\n /** For a refused back to reach the screen as native's own report would. */\n private readonly engine = inject(HostEngine, { optional: true });\n\n private readonly errors = inject(ErrorHandler);\n private readonly back = inject(NativeBack);\n /** The screen this stack sits in, when it is a stack inside a page of another. */\n private readonly holder = inject(HOLDING_SCREEN, { optional: true });\n /** What the holder's own `preventNativeDismiss` was, while this stack's top screen refuses. */\n private held: { own: unknown } | null = null;\n private readonly statusBar = inject(StatusBar);\n private readonly navigationBar = inject(NavigationBar);\n /** Both bars' claims, as the screens carry them. */\n private readonly systemBars = computed<SystemBarClaim>(() => ({\n ...this.statusBar.forScreens(),\n navigationBarHidden: this.navigationBar.forScreens().hidden,\n }));\n\n private readonly entries: StackEntry[] = [];\n /**\n * The screens a replace or a reset supersedes, kept until the navigation that supersedes them\n * succeeds: one that fails leaves the stack as it was.\n */\n private superseded: { entries: StackEntry[]; navigation: number } | null = null;\n\n protected readonly fill = { flex: 1 };\n\n constructor() {\n ownHost(this.host.nativeElement);\n // Ours, not a prop of the native stack.\n delete (this.host.nativeElement as { props: Record<string, unknown> }).props['name'];\n this.parentContexts.onChildOutletCreated(this.name, this);\n\n // Android's back button, and `NativeNavigation.back()`. Declining at the bottom of the stack\n // is deliberate: the outlet this one sits in gets its turn, and when none takes it the\n // platform backgrounds the app, which is what a user expects, rather than the app swallowing\n // the press and appearing stuck.\n //\n // Not yet verified on a device: whether react-native-screens' own Android back handling\n // (`nativeBackButtonDismissalEnabled`) also pops the screen, which would make one press pop\n // twice. If a back press ever skips a screen on Android, look here first.\n const back = this.back;\n const unsubscribeBack = back.handle((from) =>\n from === 'button' && this.refusesButton() ? true : this.goBack(),\n );\n const unsubscribeStack = back.addStack({\n showing: () => this.isShowing(),\n popToRoot: () => (this.entries.length > 1 ? this.popToEntry(0) : null),\n popTo: (url) => {\n const index = this.entries.findIndex((entry) => this.urlOf(entry) === url);\n return index !== -1 && index < this.entries.length - 1 ? this.popToEntry(index) : null;\n },\n dropUnderTop: () => {\n if (this.entries.length < 2) return false;\n for (const entry of this.entries.slice(0, -1)) this.remove(entry);\n return true;\n },\n });\n // Optional for the same reason as the router: the outlet's own tests stand one in without it.\n const navigations = this.router?.events?.subscribe((event) => {\n if (event instanceof NavigationEnd) this.settle(event.id);\n else if (event instanceof NavigationError) this.rollBack(event.id);\n });\n\n const carryAll = (claim: SystemBarClaim) => {\n for (const entry of this.entries) this.carrySystemBars(entry.screen, claim);\n if (this.presentedPage) this.carrySystemBars(this.presentedPage.screen, claim);\n };\n effect(() => {\n const claim = this.systemBars();\n untracked(() => carryAll(claim));\n });\n // A page's host binding that lets go of its own value, back to undefined, changes no claim.\n afterEveryRender(() => carryAll(untracked(this.systemBars)));\n\n const unhold = this.holder ? this.holdRefusals(this.holder) : undefined;\n const unpresent = this.takePresentedPages(back);\n const unleave = inject(IN_TAB, { optional: true })?.onLeave(() => this.dismissPresented());\n\n inject(DestroyRef).onDestroy(() => {\n unleave?.();\n unhold?.();\n unpresent?.();\n unsubscribeBack();\n unsubscribeStack();\n navigations?.unsubscribe();\n for (const entry of this.entries) {\n entry.unbind();\n entry.ref.destroy();\n }\n this.entries.length = 0;\n // Only while it is this outlet's: a page kept by the reuse strategy takes its outlets'\n // registrations with it, and gets them back as it is attached, before what was over it goes.\n if (this.parentContexts.getContext(this.name)?.outlet === this) {\n this.parentContexts.onChildOutletDestroyed(this.name);\n }\n });\n }\n\n /** The page presented over everything, while there is one. See `presented-route.ts`. */\n private presentedPage: (StackEntry & { stopBack(): void }) | null = null;\n\n /**\n * The app's own stack, the one in the root component, is also the root's presented outlet: a\n * page of a tab that is not in front is shown here, as a screen over the bar and everything in\n * it. One page at a time, which the router sees to, and never kept: it is dismissed.\n */\n private takePresentedPages(back: NativeBack): (() => void) | undefined {\n const router = this.router;\n const root = inject(ActivatedRoute, { optional: true });\n if (!router?.routerState || this.name !== PRIMARY_OUTLET || root !== router.routerState.root) {\n return undefined;\n }\n const page = () => this.presentedPage;\n const outlet: RouterOutletContract = {\n supportsBindingToComponentInputs: true,\n get isActivated() {\n return page() !== null;\n },\n get component() {\n return (page()?.ref.instance as Object | undefined) ?? null;\n },\n get activatedRoute() {\n return page()?.route ?? null;\n },\n get activatedRouteData() {\n return page()?.route.snapshot.data ?? {};\n },\n activateWith: (route, environmentInjector) =>\n this.presentPage(route, environmentInjector, back),\n deactivate: () => this.dropPresentedPage(),\n detach: () => {\n throw new Error('[angular-native] a presented page is dismissed, not detached');\n },\n attach: () => {\n throw new Error('[angular-native] a presented page is not kept to attach again');\n },\n };\n this.parentContexts.onChildOutletCreated(PRESENTED, outlet);\n back.presents = true;\n return () => {\n back.presents = false;\n this.dropPresentedPage();\n if (this.parentContexts.getContext(PRESENTED)?.outlet === outlet) {\n this.parentContexts.onChildOutletDestroyed(PRESENTED);\n }\n };\n }\n\n private presentPage(\n route: ActivatedRoute,\n environmentInjector: EnvironmentInjector,\n back: NativeBack,\n ): void {\n const component = (route.component ?? route.snapshot.component) as Type<unknown> | null;\n if (!component) throw new Error('[angular-native] route has no component to present');\n const presentation = this.claimPresentation(this.currentIntent()) ?? {\n stackPresentation: 'modal',\n };\n const screen = this.createScreen(presentation, () => this.dismissPresentedPage());\n const inFront = signal(true);\n const { ref, unbind } = this.createPage(\n component,\n route,\n environmentInjector,\n screen,\n inFront,\n PRESENTED,\n );\n this.carrySystemBars(screen, untracked(this.systemBars));\n // Once the page is there to cover it: one that throws on its first render never is, and\n // nothing would put the screen under it back in front.\n this.top?.inFront.set(false);\n this.fillScreen(screen);\n // Subscribed now, so it is the newest answer and the first asked: a back dismisses the page\n // before it pops anything in the tab under it.\n const stopBack = back.handle((from) =>\n from === 'button' && this.refuseBack(screen) ? true : this.dismissPresentedPage(),\n );\n this.presentedPage = {\n route,\n ref,\n screen,\n detached: false,\n unbind,\n presentation,\n inFront,\n stopBack,\n };\n }\n\n /** The router left the presented page: take it off the stack. */\n private dropPresentedPage(): void {\n const page = this.presentedPage;\n if (!page) return;\n this.presentedPage = null;\n page.stopBack();\n this.drop(page);\n if (this.top && !this.top.detached) this.top.inFront.set(true);\n }\n\n /**\n * Take the router off the presented page, for a back or for a sheet the user swiped away: one\n * entry back where that is the url without the page, and otherwise a navigation to that url in\n * place of this entry, since something under the page was navigated while it was up.\n */\n private dismissPresentedPage(): boolean {\n if (!this.presentedPage || !this.router) return false;\n const without = withoutPresented(this.router, this.router.url);\n if (this.historyUrl(-1) === without) this.location.historyGo(-1);\n else void this.router.navigateByUrl(without, { replaceUrl: true });\n return true;\n }\n\n /** The screens currently in the stack, oldest first. Exposed for tests. */\n get depth(): number {\n return this.entries.length;\n }\n\n ngOnInit(): void {\n this.activateCurrentRoute();\n }\n\n /**\n * The route the router is already on, for an outlet created after the navigation that reached\n * it: one held behind a condition until a session or a database is ready. The router activates\n * an outlet as a navigation ends, and that one ended with no outlet to activate, so the outlet\n * takes the route from its context as it arrives, as Angular's own `RouterOutlet` does.\n */\n private activateCurrentRoute(): void {\n if (this.isActivated) return;\n const context = this.parentContexts.getContext(this.name);\n if (!context?.route) return;\n if (context.attachRef) this.attach(context.attachRef, context.route);\n else this.activateWith(context.route, context.injector);\n }\n\n // --- RouterOutletContract ----------------------------------------------\n\n get isActivated(): boolean {\n return this.top !== undefined && !this.top.detached;\n }\n\n get component(): Object | null {\n return this.top && !this.top.detached ? (this.top.ref.instance as Object) : null;\n }\n\n get activatedRoute(): ActivatedRoute | null {\n return this.top && !this.top.detached ? this.top.route : null;\n }\n\n get activatedRouteData(): Data {\n return this.activatedRoute?.snapshot.data ?? {};\n }\n\n /** The input binder reads this to bind route params to component inputs. */\n get activatedComponentRef(): ComponentRef<unknown> | null {\n return this.top?.ref ?? null;\n }\n\n activateWith(route: ActivatedRoute, environmentInjector: EnvironmentInjector): void {\n const component = (route.component ?? route.snapshot.component) as Type<unknown> | null;\n if (!component) {\n throw new Error('[angular-native] route has no component to activate');\n }\n // Whatever a stack shows is a screen, children or not, and must survive being covered.\n if (route.snapshot.routeConfig) markScreenRoute(route.snapshot.routeConfig);\n\n // What kind of navigation this is, over and above which route it lands on: a replace\n // supersedes the screen below rather than stacking on it, and a reset empties the stack.\n // Everything else leaves the screens below mounted, so their native state survives the trip.\n const intent = this.currentIntent();\n const navigation = this.navigationId();\n const presentation = this.presentationFor(intent);\n //\n // The screen is the page's host element, so its props are set before the component exists\n // and the component's own host bindings land on top of them. Style bindings merge key by\n // key, so a page styling itself keeps the absolute fill the stack lays out with - except for\n // `position` and the four insets, which a page naming them writes over outright rather than\n // merging into. Those five are re-asserted below, after the page's own change detection has\n // run, so the outlet's positioning always wins whatever a page's host style says.\n const screen = this.createScreen(presentation);\n const inFront = signal(true);\n const { ref, unbind } = this.createPage(component, route, environmentInjector, screen, inFront);\n this.carrySystemBars(screen, untracked(this.systemBars));\n // The page's own host style, including any `position` or inset it declared, has now landed\n // on the screen: put the stack's fill back over it. Per-key, through `setStyle`, so whatever\n // else the page's style set - a background colour, say - still merges and stays.\n this.fillScreen(screen);\n\n this.back.stacked(navigation);\n const pending = this.navigationId() === navigation ? navigation : undefined;\n if (intent?.stack === 'reset') this.supersede(this.entries.slice(), pending);\n else if (intent?.stack === 'replace' && this.top) this.supersede([this.top], pending);\n this.entries.push({\n route,\n ref,\n screen,\n detached: false,\n unbind,\n presentation,\n activatedIn: navigation,\n inFront,\n });\n }\n\n /**\n * The page's component, created on its screen and rendered once.\n *\n * A page that throws on that first render fails the navigation, and nothing of it may stay: a\n * half-made screen left on the stack is one the router does not know about, with a component\n * still running on it. So its component is destroyed, its screen taken off the stack, the\n * screen it was pushed from given back its change detection, and the error handed to the\n * app's `ErrorHandler` before the router fails the navigation with it.\n */\n private createPage(\n component: Type<unknown>,\n route: ActivatedRoute,\n environmentInjector: EnvironmentInjector,\n screen: unknown,\n inFront: WritableSignal<boolean>,\n outlet = this.name,\n ): { ref: ComponentRef<unknown>; unbind: () => void } {\n let ref: ComponentRef<unknown> | undefined;\n let unbind: (() => void) | undefined;\n try {\n ref = createComponent(component, {\n environmentInjector,\n elementInjector: this.outletInjector(route, inFront, screen, outlet),\n hostElement: screen as Element,\n });\n this.applicationRef.attachView(ref.hostView);\n // Route params onto inputs before the first change detection, not after: a required input\n // read in the template throws NG0950 if it is still unset when the page first renders.\n unbind = this.bindInputs(ref, route);\n // Before anything can commit. Creating the page's nodes dirties the tree, which schedules a\n // commit of its own - and that commit would capture the page with its elements created and\n // its bindings not yet applied. On iOS the props catch up a frame later and nobody sees it;\n // on Android the flattening decision is made from the props a view is created with, so a\n // content wrapper that arrives without its `collapsable: false` is flattened for good and\n // its children end up parented to a scroll view that allows exactly one.\n ref.changeDetectorRef.detectChanges();\n return { ref, unbind };\n } catch (error) {\n unbind?.();\n ref?.destroy();\n this.removeScreen(screen);\n this.uncover();\n this.errors.handleError(error);\n throw error;\n }\n }\n\n /**\n * Take the screen in front off the stack, when there is one: nothing once the router has\n * detached it, as Angular's own outlet does nothing then. A route with no component of its own,\n * a `loadChildren` wrapper or a group, has the router detach the page under it and then\n * deactivate this same outlet, and that page is a screen pushed from, still to come back to.\n */\n deactivate(): void {\n if (!this.isActivated) return;\n this.drop(this.entries.pop()!);\n }\n\n /**\n * Hand the live `ComponentRef` back to the router without destroying it. The screen stays\n * mounted, so the component keeps running and its native views keep their state.\n */\n detach(): ComponentRef<unknown> {\n const entry = this.top;\n if (!entry) throw new Error('[angular-native] outlet is not activated, nothing to detach');\n entry.detached = true;\n entry.detachedIn = this.navigationId();\n entry.inFront.set(false);\n // `ChangeDetectorRef.detach`, not `ApplicationRef.detachView`. The latter calls\n // `renderDetachView` and pulls the view's nodes out of the tree, which is exactly what we\n // are trying to avoid: the screen would vanish from the stack the moment we pushed past it.\n // This stops change detection for an off-screen screen while leaving it mounted.\n entry.ref.hostView.detach();\n return entry.ref;\n }\n\n /**\n * Re-attach a previously detached ref. If we still hold it, everything stacked above it is a\n * screen the user has navigated back past, so those are destroyed: that is the pop.\n */\n attach(ref: ComponentRef<unknown>, route: ActivatedRoute): void {\n const index = this.entries.findIndex((entry) => entry.ref === ref);\n\n if (index === -1) {\n // Not ours: the router is restoring a ref detached by a different outlet instance. Its\n // host element is already a screen, complete with the `dismissed` listener that outlet\n // registered, so it is re-parented rather than rebuilt.\n const screen = ref.location.nativeElement;\n this.renderer.appendChild(this.host.nativeElement, screen);\n this.entries.push({\n route,\n ref,\n screen,\n detached: false,\n unbind: this.bindInputs(ref, route),\n // What it was given is its first outlet's; this one has no say over that screen's.\n inFront: signal(true),\n });\n this.applicationRef.attachView(ref.hostView);\n } else {\n for (const above of this.entries.splice(index + 1)) this.drop(above);\n if (this.currentIntent()?.stack === 'reset') {\n this.supersede(this.entries.slice(0, index), this.navigationId());\n }\n const entry = this.entries[index]!;\n entry.detached = false;\n entry.inFront.set(true);\n entry.route = route;\n // The route object is new even when the url is not, so the inputs follow the new one.\n entry.unbind();\n entry.unbind = this.bindInputs(ref, route);\n }\n\n this.back.stacked(this.navigationId());\n // Resume change detection for the screen the user is coming back to.\n ref.hostView.reattach();\n }\n\n // --- native stack -------------------------------------------------------\n\n /**\n * Route params onto the page's inputs, but only in an app that asked for it with\n * `withComponentInputBinding()`, which is the only time Angular's own outlet binds them. Read\n * per screen rather than once, for a test that stands the router in.\n */\n private bindInputs(ref: ComponentRef<unknown>, route: ActivatedRoute): () => void {\n return this.router?.componentInputBindingEnabled ? bindRouteInputs(ref, route) : () => {};\n }\n\n private get top(): StackEntry | undefined {\n return this.entries[this.entries.length - 1];\n }\n\n /**\n * What the navigation asked for, if it asked for anything. Read here rather than remembered,\n * because the router is mid-navigation for exactly as long as an activation takes.\n */\n private currentIntent(): NativeIntent | null {\n return this.router ? navigationIntent(this.router, this.router.getCurrentNavigation()) : null;\n }\n\n /**\n * How the screen a navigation activates is put on screen.\n *\n * A push on top of a presented screen is presented the same way. `RNSScreenStack` pushes a push\n * screen that follows a modal onto the navigation controller under the modal, so the router\n * would be on the new route while the modal stayed in front, and the modal's own way out would\n * first pop a screen nobody could see. A presentation the navigation names itself wins, and a\n * reset starts a stack with nothing to follow. A presented screen that is a stack of its own is\n * where a push to one of its children goes instead, inside it.\n */\n private presentationFor(intent: NativeIntent | null): ScreenPresentation | undefined {\n const own = this.claimPresentation(intent);\n const covering = this.top?.presentation?.stackPresentation;\n if (intent?.stack === 'reset' || !covering || covering === 'push' || own?.stackPresentation) {\n return own;\n }\n return { ...own, stackPresentation: covering };\n }\n\n /** The navigation's own presentation, unless an outlet further out already presented it. */\n private claimPresentation(intent: NativeIntent | null): ScreenPresentation | undefined {\n if (!intent?.presentation) return undefined;\n const id = this.router?.getCurrentNavigation()?.id;\n if (id === undefined) return intent.presentation;\n if (presented.get(this.router!) === id) return undefined;\n presented.set(this.router!, id);\n return intent.presentation;\n }\n\n /** Take a screen out for good: its bindings, its component, and its native view. */\n private drop(entry: StackEntry): void {\n entry.unbind();\n entry.ref.destroy();\n this.removeScreen(entry.screen);\n }\n\n /**\n * Take off the lowest screen presented rather than pushed, and every screen over it, for a tab\n * that has gone behind another: see `IN_TAB`. Answers the url of the screen left on top, or null\n * when nothing was presented.\n */\n private dismissPresented(): string | null {\n const index = this.entries.findIndex(\n (entry, at) => at > 0 && (entry.presentation?.stackPresentation ?? 'push') !== 'push',\n );\n if (index === -1) return null;\n for (const entry of this.entries.splice(index)) this.drop(entry);\n return this.router ? this.urlOf(this.entries[index - 1]!) : null;\n }\n\n /** Take one entry out of the stack, wherever it is, and drop it. */\n private remove(entry: StackEntry): void {\n const index = this.entries.indexOf(entry);\n if (index === -1) return;\n this.entries.splice(index, 1);\n this.drop(entry);\n }\n\n // --- a navigation's outcome ----------------------------------------------\n\n /** The id of the navigation in progress, when there is a router to say. */\n private navigationId(): number | undefined {\n return this.router?.getCurrentNavigation()?.id;\n }\n\n /**\n * Take out the screens a replace or a reset supersedes once its navigation has succeeded, or\n * at once when there is no navigation to wait for. A replaced screen has already been detached\n * by the router, and with `replaceUrl` its history entry is gone too, so nothing will attach it\n * again; the reuse strategy notices the ref is destroyed and drops its handle.\n *\n * A page that navigates as it is created, a sign-in check in `ngOnInit`, cancels the navigation\n * creating it before this is reached, so that one never ends: the page stays, and what it\n * superseded goes at once.\n */\n private supersede(entries: StackEntry[], navigation: number | undefined): void {\n if (navigation === undefined) {\n for (const entry of entries) this.remove(entry);\n return;\n }\n this.superseded = { entries, navigation };\n }\n\n /** A navigation succeeded: what it superseded goes, and what it did is no longer undoable. */\n private settle(navigation: number): void {\n if (this.superseded?.navigation === navigation) {\n for (const entry of this.superseded.entries) this.remove(entry);\n this.superseded = null;\n }\n for (const entry of this.entries) {\n if (entry.activatedIn === navigation) entry.activatedIn = undefined;\n if (entry.detachedIn === navigation) entry.detachedIn = undefined;\n }\n }\n\n /**\n * A navigation failed, so the router is back where it started: undo what it did here too.\n *\n * The screen that threw has already gone (`createPage`), but a screen this outlet activated for\n * the same navigation has not when the one that threw is further in, the first screen of a\n * stack inside it. That one goes, with everything in it, and the screen it covered carries on.\n */\n private rollBack(navigation: number): void {\n if (this.superseded?.navigation === navigation) this.superseded = null;\n for (const entry of this.entries.filter((candidate) => candidate.activatedIn === navigation)) {\n this.remove(entry);\n }\n this.uncover(navigation);\n }\n\n /**\n * Give the top screen back its change detection when the router covered it for a navigation\n * that is not going to happen: the one given, or the one in progress.\n */\n private uncover(navigation = this.navigationId()): void {\n const top = this.top;\n if (!top?.detached || top.detachedIn !== navigation) return;\n top.detached = false;\n top.detachedIn = undefined;\n top.inFront.set(true);\n top.ref.hostView.reattach();\n }\n\n /**\n * `position: absolute` and the four insets, through `setStyle` rather than one `setProperty`\n * so each key merges into whatever style is already on the screen instead of replacing it -\n * the same merge a page's own host style gets, just asserted last so the stack's layout wins.\n */\n private fillScreen(screen: unknown): void {\n for (const [key, value] of Object.entries(FILL)) {\n this.renderer.setStyle(screen as Element, key, value);\n }\n }\n\n private createScreen(\n presentation?: ScreenPresentation,\n dismissed = (count: number) => this.onNativeDismiss(count),\n ): unknown {\n const screen = ownHost(this.renderer.createElement('screen'));\n // From before the presentation is set, so a value it or the page's host bindings write counts\n // as the screen's own, even one equal to a carried value. See `carrySystemBars`.\n (screen as Partial<EngineNode>).writes = new Set();\n this.fillScreen(screen);\n // Set once and never lowered: see the note at the top of this file.\n this.renderer.setProperty(screen, 'activityState', ActivityState.Active);\n // A swipe-back or an Android back button pops the screen natively and only then tells JS.\n // Without this the native stack and the router disagree from that moment on: the screen is\n // gone but the URL still points at it, so the next navigation starts from the wrong place.\n this.renderer.listen(\n screen,\n 'dismissed',\n (event: { nativeEvent?: { dismissCount?: number } }) =>\n dismissed(event?.nativeEvent?.dismissCount ?? 1),\n );\n // Every key is a prop `RNSScreen` already declares, spelled the way the codegen spec spells\n // it, so this forwards rather than translates. Set before the screen joins the stack: the\n // native side reads the presentation as it mounts.\n for (const [prop, value] of Object.entries(presentation ?? {})) {\n if (value !== undefined) this.renderer.setProperty(screen, prop, value);\n }\n // Except this one, which is a struct with no default: an edge left out is 0 natively, and\n // `RNSScreenStack` refuses a swipe-back that starts beyond 0 points. -1 is no limit, which is\n // what `Screen.tsx` sends for every edge not given.\n this.renderer.setProperty(screen, 'gestureResponseDistance', {\n ...UNLIMITED_SWIPE,\n ...presentation?.gestureResponseDistance,\n });\n\n this.renderer.appendChild(this.host.nativeElement, screen);\n return screen;\n }\n\n /**\n * Puts the app's status bar and navigation bar claims on a screen that has no value of its own\n * for them, from its presentation or its page's host bindings. On Android, react-native-screens\n * sets both bars from the screen in front each time one appears, and falls back to light text\n * and shown for a screen without these props, which would undo the claim on every push and pop.\n *\n * A prop is the screen's own when its presentation or a host binding wrote it, as the screen's\n * `writes` records, so one equal to the claim stays when the claim changes or drops. First called\n * once the page has rendered, so its host bindings have written already.\n */\n private carrySystemBars(screen: unknown, claim: SystemBarClaim): void {\n const node = screen as Partial<EngineNode>;\n const props = node.props ?? {};\n for (const [key, prop] of Object.entries(SYSTEM_BAR_PROPS)) {\n if (node.writes?.has(prop)) continue;\n const value = claim[key as keyof typeof claim];\n if (props[prop] !== value) this.renderer.setProperty(screen, prop, value);\n // A value carried here is no binding's.\n node.writes?.delete(prop);\n }\n }\n\n /**\n * Follow a pop the user already made. `historyGo`, not `back()`, because iOS coalesces a long\n * swipe into a single event with a count.\n *\n * Only ever fires for a native dismissal: verified on device that a pop this outlet drives\n * itself emits `willAppear`/`appear` for the screen below but no `dismissed`, so there is no\n * double-pop to guard against.\n *\n * The gesture itself is unverified by tooling: idb cannot synthesise a `UIScreenEdgePan` that\n * UIKit accepts, so this path was reasoned from the events rather than driven end to end.\n */\n private onNativeDismiss(count: number): void {\n this.popBy(Math.max(1, count));\n }\n\n /**\n * A back, from the button or `NativeNavigation`: pop the top screen, as long as there is one\n * below it and this stack is the one the user is looking at. A stack in a tab behind, or under\n * a screen pushed over the tab bar, is still subscribed, and the newest one would otherwise\n * answer for the stack in front.\n */\n /**\n * Android's Back button is the platform's own dismissal there, and react-native-screens leaves\n * it to JS: its Android screen ignores `preventNativeDismiss`. So a top screen that sets it\n * refuses the press here, as iOS refuses a swipe, and hears `nativeDismissCancelled` the same\n * way, through the engine, as if native had sent it.\n */\n private refusesButton(): boolean {\n if (this.entries.length < 2 || !this.isShowing()) return false;\n return this.refuseBack(this.top!.screen);\n }\n\n /** Refuses Android's Back for a screen that sets `preventNativeDismiss`, and tells its page. */\n private refuseBack(screen: unknown): boolean {\n if (!refuses(screen)) return false;\n // The native engine's own entry point for an event, the one Fabric calls. Not on\n // `HostEngine`, because only a native host has a screen to refuse with.\n const native = this.engine as { dispatchEvent?: NativeDispatch } | null;\n native?.dispatchEvent?.(screen as EngineNode, 'topNativeDismissCancelled', { dismissCount: 1 });\n return true;\n }\n\n /**\n * Passes the top screen's refusal to the screen this stack sits in, and that screen's report of\n * an attempt back to the top screen: the swipe that dismisses a presented stack is on the\n * screen holding it, which the page inside cannot bind.\n *\n * Read after every render, since the refusal is a host binding of whatever page is on top.\n */\n private holdRefusals(holder: HoldingScreen): () => void {\n const render = afterEveryRender(() => this.holdRefusal(holder));\n const unlisten = this.renderer.listen(\n holder.screen,\n 'nativeDismissCancelled',\n (event: { nativeEvent?: unknown }) => {\n // The stack can have lost its last screen with the refusal not yet released.\n const top = this.top;\n if (!this.held || !top) return;\n const native = this.engine as { dispatchEvent?: NativeDispatch } | null;\n const report = event?.nativeEvent ?? { dismissCount: 1 };\n native?.dispatchEvent?.(top.screen, 'topNativeDismissCancelled', report);\n },\n );\n return () => {\n render.destroy();\n unlisten();\n this.release(holder);\n };\n }\n\n private holdRefusal(holder: HoldingScreen): void {\n // A stack in a tab behind is inside the same screen, and has no say in it.\n if (!refuses(this.top?.screen) || !this.isShowing()) return this.release(holder);\n if (refuses(holder.screen)) return;\n // ponytail: the holder's own binding is read when the top screen starts refusing. One that\n // turns true while it does is put back as it was then; bind the refusal in one of the two.\n this.held = { own: (holder.screen as EngineNode).props?.['preventNativeDismiss'] };\n this.renderer.setProperty(holder.screen, 'preventNativeDismiss', true);\n holder.refusalChanged();\n }\n\n /** The holder's own answer again, once the top screen no longer refuses. */\n private release(holder: HoldingScreen): void {\n if (!this.held) return;\n this.renderer.setProperty(holder.screen, 'preventNativeDismiss', this.held.own ?? false);\n this.held = null;\n holder.refusalChanged();\n }\n\n private goBack(): boolean {\n if (this.entries.length < 2 || !this.isShowing()) return false;\n this.popBy(1);\n return true;\n }\n\n /** Whether the top screen is part of what the router shows now. Assumed without a router. */\n private isShowing(): boolean {\n if (!this.router) return true;\n return this.isActivated && isShowing(this.router, this.top!.route);\n }\n\n /**\n * Take the router to the screen `steps` below the top, whether native already popped it or it\n * is about to be popped because the router arrives there.\n */\n private popBy(steps: number): void {\n const below = this.entries[this.entries.length - 1 - steps];\n const url = below && this.router ? this.urlOf(below) : null;\n // Usually the entry that far back is the screen the pop revealed, and going back through\n // history keeps it tidy. Not always: a stack inside a tab shares history with the other tabs,\n // so after a trip to one and back the entry behind the top screen is that other tab, and\n // going back would switch tab rather than pop. Then the router is sent to the revealed\n // screen instead, replacing the entry of the one that is gone.\n const behind = this.historyUrl(-steps);\n if (!url || behind === undefined || behind === url) {\n this.location.historyGo(-steps);\n return;\n }\n void this.router!.navigateByUrl(url, { replaceUrl: true });\n }\n\n /**\n * Take the router down to the screen at `index`, popping every screen above it together.\n * Through history when the entries behind are these screens, so going back from there keeps\n * working one screen at a time; otherwise by a navigation to it that replaces the entry, as\n * `popBy` does when a tab's history interleaves.\n */\n private popToEntry(index: number): Promise<boolean> {\n const url = this.urlOf(this.entries[index]!);\n const steps = this.entries.length - 1 - index;\n // The url the router is on already, where the same one is on the stack twice: a navigation\n // to it is skipped, and would pop nothing. The screen on top is showing it, so that one\n // stays and the ones under it go, down to the one asked for.\n if (url === this.router!.url) {\n for (const entry of this.entries.slice(index, -1)) this.remove(entry);\n if (this.historyUrl(-steps) === url) this.location.historyGo(-steps);\n return Promise.resolve(true);\n }\n if (this.historyUrl(-steps) === url) {\n const arrived = this.nextNavigation();\n this.location.historyGo(-steps);\n return arrived;\n }\n return this.router!.navigateByUrl(url, { replaceUrl: true });\n }\n\n /** Whether the navigation that happens next succeeds. */\n private nextNavigation(): Promise<boolean> {\n return new Promise((resolve) => {\n const events = this.router!.events.subscribe((event) => {\n if (event instanceof NavigationEnd) resolve(true);\n else if (event instanceof NavigationError || event instanceof NavigationCancel) {\n resolve(false);\n } else return;\n events.unsubscribe();\n });\n });\n }\n\n /** The url a screen was showing when it was covered, rebuilt from its own route snapshot. */\n private urlOf(entry: StackEntry): string {\n const snapshot = entry.route.snapshot;\n const tree = createUrlTreeFromSnapshot(snapshot, [], snapshot.queryParams, snapshot.fragment);\n return this.router!.serializeUrl(tree);\n }\n\n /**\n * The url of the history entry `offset` away, normalised the way the router writes it: null past\n * the start of history, and undefined when the history is not ours to read, so the pop has to go\n * through it blind.\n */\n private historyUrl(offset: number): string | null | undefined {\n if (!(this.history instanceof NativePlatformLocation)) return undefined;\n const url = this.history.ɵurlAt(offset);\n return url === null ? null : this.router!.serializeUrl(this.router!.parseUrl(url));\n }\n\n private removeScreen(screen: unknown): void {\n this.renderer.removeChild(this.host.nativeElement, screen);\n }\n\n /**\n * What a page is created with: its route, its screen, the outlet contexts its own outlets\n * register in, and whether its screen is in front - which is this screen's own say and, for a stack inside a\n * screen of another, that screen's too.\n */\n private outletInjector(\n route: ActivatedRoute,\n inFront: WritableSignal<boolean>,\n screen: unknown,\n outlet = this.name,\n ): Injector {\n const outer = this.injector.get(SCREEN_IN_FRONT);\n return Injector.create({\n parent: this.injector,\n providers: [\n { provide: SCREEN_IN_FRONT, useValue: computed(() => outer() && inFront()) },\n {\n provide: HOLDING_SCREEN,\n useValue: {\n screen,\n refusalChanged: () => this.holder && this.holdRefusal(this.holder),\n } satisfies HoldingScreen,\n },\n { provide: ActivatedRoute, useValue: route },\n { provide: SCREEN_HEADER, useValue: signal(false) },\n {\n provide: ChildrenOutletContexts,\n useValue: this.parentContexts.getOrCreateContext(outlet).children,\n },\n ],\n });\n }\n}\n"]}
@@ -144,7 +144,10 @@ export class NativeTabsOutlet {
144
144
  entry.ref?.destroy();
145
145
  }
146
146
  this.entries.length = 0;
147
- this.parentContexts.onChildOutletDestroyed(this.name);
147
+ // Only while it is this outlet's, as for a stack: see `NativeStackOutlet`.
148
+ if (this.parentContexts.getContext(this.name)?.outlet === this) {
149
+ this.parentContexts.onChildOutletDestroyed(this.name);
150
+ }
148
151
  });
149
152
  }
150
153
  /** A bar nobody has navigated into yet still has to show a selected item. */
@@ -1 +1 @@
1
- {"version":3,"file":"native-tabs-outlet.js","sourceRoot":"","sources":["../src/native-tabs-outlet.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * A `RouterOutlet` that renders a native tab bar: a `UITabBarController` on iOS, a bottom\n * navigation bar on Android.\n *\n * The outlet's host element *is* the tabs host, and each `<native-tab>` in its content is one\n * item and the screen behind it. An activated route's component is created on a child view of\n * the matching tab screen. The screen belongs to the tab declaration and must survive the route\n * component being destroyed; Angular removes a component's host node when it destroys the ref.\n *\n * ```html\n * <native-tabs-outlet>\n * <native-tab path=\"library\" title=\"Library\" sfSymbol=\"books.vertical.fill\" />\n * <native-tab path=\"inbox\" title=\"Inbox\" sfSymbol=\"tray\" [badge]=\"unread()\" />\n * </native-tabs-outlet>\n * ```\n *\n * **Native holds the selection, not us.** The tabs host owns its navigation state and reports\n * every change - a tap, or one we asked for - through `tabSelected`, carrying a `provenance`\n * number that increments per change. We send `navStateRequest` with the provenance of the last\n * state we acknowledged, which is how native tells a stale request from a current one when a tap\n * and a navigation cross in flight. The alternative, holding the selection in JS, means a tap is\n * only reflected after a round trip, and the bar lags the finger. See ADR 0006.\n *\n * **Each tab keeps its own screen mounted**, so switching away and back finds a tab exactly as it\n * was: its scroll offset, its text, and its own stack if it has one. That is the reuse strategy\n * detaching the tab's whole subtree rather than only its leaf.\n */\nimport {\n ApplicationRef,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n ElementRef,\n ErrorHandler,\n Injector,\n Renderer2,\n computed,\n contentChildren,\n createComponent,\n effect,\n inject,\n input,\n signal,\n untracked,\n ViewContainerRef,\n type AfterContentInit,\n type ComponentRef,\n type EnvironmentInjector,\n type Type,\n type WritableSignal,\n} from '@angular/core';\nimport { SCREEN_IN_FRONT } from '@ng-native/device';\nimport {\n ActivatedRoute,\n ChildrenOutletContexts,\n NavigationEnd,\n PRIMARY_OUTLET,\n Router,\n type Data,\n type Route,\n type RouterOutletContract,\n} from '@angular/router';\nimport { bindRouteInputs } from './bind-route-inputs.ts';\nimport { NATIVE_TAB_DEFAULTS } from './native-bar-defaults.ts';\nimport { NativeBack, isShowing } from './native-back.ts';\nimport { optionalBoolean } from './transforms.ts';\nimport { NativeTab, screenKeyOf } from './native-tab.ts';\nimport { ownHost } from './own-host.ts';\nimport { markTabRoute } from './tab-routes.ts';\nimport { IN_TAB, type InTab } from './in-tab.ts';\nimport { taken, withoutPresented } from './presented-route.ts';\nimport { SVG_ICON_HOST } from './svg-icons.ts';\n\n/** A url without its query or fragment. */\nconst pathOnly = (url: string): string => url.split(/[?#]/, 1)[0]!;\n\n/**\n * Whether one of `routes` matches `segments`, whole or up to lazy children not loaded yet, which a\n * route that took a static segment of its own is taken to lead to. A parameter alone is not: it\n * takes any segment, pages outside the bar included, and its children may match none of the rest.\n */\nfunction reaches(routes: readonly Route[], segments: readonly string[]): boolean {\n return routes.some((route) => {\n const count = taken(route, segments);\n if (count === null) return false;\n const rest = segments.slice(count);\n if (rest.length === 0) return true;\n if (route.children) return reaches(route.children, rest);\n const named = route.path!.split('/').some((part) => part && !part.startsWith(':'));\n return named && route.loadChildren !== undefined;\n });\n}\n\ninterface TabEntry {\n /** The element in the bar now: an `@if` can take it away and bring another back. */\n tab: NativeTab;\n /** The key native identifies this tab by: its path, unique among the bar's items. */\n readonly key: string;\n /** The url this tab was last on, so returning to it returns where the user left. */\n url: string;\n ref: ComponentRef<unknown> | null;\n route: ActivatedRoute | null;\n detached: boolean;\n /** Stops feeding route params into the component's inputs. */\n unbind: () => void;\n /** Whether this tab is the one showing, for what its screens hold: see `SCREEN_IN_FRONT`. */\n readonly inFront: WritableSignal<boolean>;\n /** What the tab's stacks dismiss when another tab comes in front: see `IN_TAB`. */\n readonly leaving: Set<() => string | null>;\n}\n\n/** What `tabSelected` carries. Only these fields matter here; the rest is diagnostics. */\ninterface TabSelection {\n readonly selectedScreenKey: string;\n readonly provenance: number;\n /** `'user'` for a tap. Native reports the changes it was asked for too, under other names. */\n readonly actionOrigin?: string;\n /** Set when the user tapped the tab already in front, which is not a tap back. */\n readonly isRepeated?: boolean;\n}\n\n@Component({\n selector: 'native-tabs-outlet',\n template: '<ng-content />',\n providers: [{ provide: SVG_ICON_HOST, useFactory: () => inject(ViewContainerRef) }],\n host: {\n '[style]': 'fill',\n '[tabBarHidden]': 'barHidden()',\n '[tabBarTintColor]': 'tintColor() ?? defaults().tintColor',\n '[nativeContainerBackgroundColor]': 'backgroundColor() ?? defaults().backgroundColor',\n '[colorScheme]': 'colorScheme() ?? defaults().colorScheme',\n '[tabBarMinimizeBehavior]': 'minimizeBehavior()',\n '[tabBarControllerMode]': 'controllerMode()',\n '[tabBarRespectsIMEInsets]': 'respectsKeyboard()',\n },\n})\nexport class NativeTabsOutlet implements RouterOutletContract, AfterContentInit {\n name = PRIMARY_OUTLET;\n\n readonly supportsBindingToComponentInputs = true;\n\n private readonly parentContexts = inject(ChildrenOutletContexts);\n private readonly renderer = inject(Renderer2);\n private readonly applicationRef = inject(ApplicationRef);\n private readonly changeDetector = inject(ChangeDetectorRef);\n private readonly injector = inject(Injector);\n private readonly host = inject(ElementRef);\n private readonly route = inject(ActivatedRoute);\n /** Optional so the outlet can be driven through `RouterOutletContract` directly, as tests do. */\n private readonly router = inject(Router, { optional: true });\n private readonly errors = inject(ErrorHandler);\n /** What activation has reported already, so the failed navigation it causes is not reported again. */\n private readonly reported = new WeakSet<object>();\n /** The app's `withTabDefaults`, for whatever the outlet does not bind itself. */\n protected readonly defaults = inject(NATIVE_TAB_DEFAULTS);\n\n private readonly declared = contentChildren(NativeTab);\n private readonly entries: TabEntry[] = [];\n private selected: TabEntry | null = null;\n /** The provenance of the last state native told us about. Starts before native's first. */\n private provenance = 0;\n\n protected readonly fill = { flex: 1 };\n\n // --- the bar itself -----------------------------------------------------\n\n /** Hide the bar without unmounting the tabs, for a screen that wants the whole window. */\n readonly barHidden = input(undefined, { transform: optionalBoolean });\n /** The colour of the selected item. iOS. */\n readonly tintColor = input<string | number>();\n /** Behind the tabs, where a screen does not paint. */\n readonly backgroundColor = input<string | number>();\n /** Force the bar's light or dark appearance, whatever the app's is. */\n readonly colorScheme = input<'inherit' | 'light' | 'dark'>();\n /** iOS 26: let the bar shrink out of the way as content scrolls. */\n readonly minimizeBehavior = input<'automatic' | 'never' | 'onScrollDown' | 'onScrollUp'>();\n /** iOS: `tabSidebar` is the iPad layout, with the tabs down the side. */\n readonly controllerMode = input<'automatic' | 'tabBar' | 'tabSidebar'>();\n /** Android: keep the bar above the keyboard rather than behind it. */\n readonly respectsKeyboard = input(undefined, { transform: optionalBoolean });\n\n constructor() {\n ownHost(this.host.nativeElement);\n // In the constructor rather than a lifecycle hook: the router activates a child route as soon\n // as this component exists, which is before any hook has run.\n this.parentContexts.onChildOutletCreated(this.name, this);\n\n this.renderer.listen(\n this.host.nativeElement,\n 'tabSelected',\n (event: { nativeEvent?: TabSelection }) => this.onNativeSelect(event?.nativeEvent),\n );\n\n // An `@if` that takes a tab away and brings it back makes a new element: its page follows it\n // at once, since the tab may be the one showing, with no tap or navigation to read them on.\n effect(() => {\n this.declared();\n if (this.entries.length > 0) untracked(() => this.readTabs());\n });\n\n // A push inside a tab's own stack reuses the tab's route, so this outlet is never activated\n // for it; the router's navigation is the only sign. Without this, coming back to the tab\n // returns it to its root and pops the screens the user left it on.\n const following = this.router?.events?.subscribe((event) => {\n // Without a page presented over the bar, which is no part of where the tab is.\n if (event instanceof NavigationEnd) {\n this.follow(withoutPresented(this.router!, event.urlAfterRedirects));\n }\n });\n\n // Android's back button, and `NativeNavigation.back()`, once the stack in front, if the tab\n // has one, is at its root. Subscribed before any tab's own stack, so it is asked after them.\n const back = inject(NativeBack);\n const unsubscribeBack = back.handle(() => this.goBack());\n const unsubscribeBar = back.addTabBar({\n unopenedTabOf: (url) => this.unopenedTabOf(url),\n behind: (url) => this.behind(url),\n coveredAt: (url) => this.coveredAt(url),\n });\n\n inject(DestroyRef).onDestroy(() => {\n unsubscribeBack();\n unsubscribeBar();\n following?.unsubscribe();\n for (const entry of this.entries) {\n entry.unbind();\n entry.ref?.destroy();\n }\n this.entries.length = 0;\n this.parentContexts.onChildOutletDestroyed(this.name);\n });\n }\n\n /** A bar nobody has navigated into yet still has to show a selected item. */\n ngAfterContentInit(): void {\n this.readTabs();\n this.activateCurrentRoute();\n }\n\n /**\n * The route the router is already on, for an outlet created after the navigation that reached\n * it, as `NativeStackOutlet` takes its own: a tab bar held behind a condition until a session\n * is ready. Once the tabs are read, since activating one needs to know which they are.\n */\n private activateCurrentRoute(): void {\n if (this.isActivated) return;\n const context = this.parentContexts.getContext(this.name);\n if (!context?.route) return;\n if (context.attachRef) this.attach(context.attachRef, context.route);\n else this.activateWith(context.route, context.injector);\n }\n\n /** The tabs in the bar, in the order they were first in it. Exposed for tests. */\n get tabKeys(): string[] {\n return this.readTabs().map((entry) => entry.key);\n }\n\n /** Which tab native is showing. Exposed for tests. */\n get selectedKey(): string | null {\n return this.selected?.key ?? null;\n }\n\n // --- RouterOutletContract ----------------------------------------------\n\n get isActivated(): boolean {\n return this.selected?.ref != null && !this.selected.detached;\n }\n\n get component(): Object | null {\n return this.isActivated ? (this.selected!.ref!.instance as Object) : null;\n }\n\n get activatedRoute(): ActivatedRoute | null {\n return this.isActivated ? this.selected!.route : null;\n }\n\n get activatedRouteData(): Data {\n return this.activatedRoute?.snapshot.data ?? {};\n }\n\n /** The input binder reads this to bind route params to component inputs. */\n get activatedComponentRef(): ComponentRef<unknown> | null {\n return this.selected?.ref ?? null;\n }\n\n activateWith(route: ActivatedRoute, environmentInjector: EnvironmentInjector): void {\n const component = (route.component ?? route.snapshot.component) as Type<unknown> | null;\n if (!component) {\n throw new Error('[angular-native] route has no component to activate');\n }\n const entry = this.entryFor(route);\n\n // The tab screen is owned by <native-tab>, not by this route component. If the route uses\n // deactivate() rather than detach(), Angular removes the component host on destroy. Giving\n // the component its own child host keeps that removal from taking the tab bar item with it.\n const content = ownHost(this.renderer.createElement('view'));\n this.renderer.setStyle(content, 'flex', 1);\n this.renderer.appendChild(entry.tab.screen, content);\n\n let ref: ComponentRef<unknown> | undefined;\n try {\n ref = createComponent(component, {\n environmentInjector,\n elementInjector: this.outletInjector(route, entry),\n hostElement: content as Element,\n });\n this.applicationRef.attachView(ref.hostView);\n // Route params onto inputs before the first change detection, as the stack outlet does: a\n // required input still unset when the page first renders throws NG0950.\n entry.unbind = this.bindInputs(ref, route);\n // Before anything can commit. Creating the page's nodes dirties the tree, which schedules a\n // commit of its own - and that commit would capture the page with its elements created and\n // its bindings not yet applied. On iOS the props catch up a frame later and nobody sees it;\n // on Android the flattening decision is made from the props a view is created with, so a\n // content wrapper that arrives without its `collapsable: false` is flattened for good and\n // its children end up parented to a scroll view that allows exactly one.\n ref.changeDetectorRef.detectChanges();\n } catch (error) {\n this.abandon(entry, ref, content);\n this.errors.handleError(error);\n if (error !== null && typeof error === 'object') this.reported.add(error);\n throw error;\n }\n\n entry.ref = ref;\n entry.route = route;\n entry.detached = false;\n this.select(entry);\n }\n\n /**\n * Destroy the tab page in front: nothing once the router has detached it, as Angular's own\n * outlet does nothing then. A tab under a route with no component of its own, a `loadChildren`\n * wrapper or a group, has the router detach the page and then deactivate this same outlet, and\n * that page is the tab, kept for when it is selected again.\n */\n deactivate(): void {\n if (!this.isActivated) return;\n const entry = this.selected!;\n entry.unbind();\n entry.unbind = () => {};\n entry.ref!.destroy();\n entry.ref = null;\n entry.route = null;\n }\n\n /**\n * Hand the live `ComponentRef` back to the router. The tab's screen stays where it is with the\n * component still inside it, so the tab keeps running while another one is in front.\n */\n detach(): ComponentRef<unknown> {\n const entry = this.selected;\n if (!entry?.ref) throw new Error('[angular-native] outlet is not activated, nothing to detach');\n entry.detached = true;\n entry.inFront.set(false);\n // As in the stack outlet: stop change detection without unmounting the views.\n entry.ref.hostView.detach();\n return entry.ref;\n }\n\n attach(ref: ComponentRef<unknown>, route: ActivatedRoute): void {\n const entry = this.entryFor(route);\n\n // A ref from a previous instance of this outlet still lives on its old tab screen, which is\n // gone; re-parent it onto this one's rather than rebuild the tab.\n if (entry.ref !== ref) {\n this.renderer.appendChild(entry.tab.screen, ref.location.nativeElement);\n this.applicationRef.attachView(ref.hostView);\n entry.ref = ref;\n }\n\n entry.route = route;\n entry.detached = false;\n // The route object is new even when the url is not, so the inputs follow the new one.\n entry.unbind();\n entry.unbind = this.bindInputs(ref, route);\n ref.hostView.reattach();\n this.select(entry);\n }\n\n // --- native tabs --------------------------------------------------------\n\n /**\n * Undo a tab page that threw on its first render, which fails the navigation: its component\n * and its content view go, and the tab that was showing carries on, change detection and all.\n */\n private abandon(entry: TabEntry, ref: ComponentRef<unknown> | undefined, content: unknown): void {\n entry.unbind();\n entry.unbind = () => {};\n ref?.destroy();\n this.renderer.removeChild(entry.tab.screen, content);\n const showing = this.selected;\n if (showing?.detached && showing.ref) {\n showing.detached = false;\n showing.ref.hostView.reattach();\n }\n }\n\n /** Route params onto inputs only under `withComponentInputBinding()`, as in the stack outlet. */\n private bindInputs(ref: ComponentRef<unknown>, route: ActivatedRoute): () => void {\n return this.router?.componentInputBindingEnabled ? bindRouteInputs(ref, route) : () => {};\n }\n\n /**\n * Take the bar from the `<native-tab>` elements in the content, adding any that appeared since\n * the last read, as one an `@if` shows once a feature flag turns on, and following one that was\n * taken away and brought back.\n *\n * On demand rather than in a lifecycle hook, because the router activates a child route during\n * this component's creation, before any hook has run - but after the content nodes themselves\n * exist, which is all this needs.\n */\n private readTabs(): TabEntry[] {\n const first = this.entries.length === 0;\n const children = this.route.routeConfig?.children ?? [];\n for (const tab of this.declared()) {\n const key = tab.path();\n const known = this.entries.find((entry) => entry.key === key);\n if (known) {\n this.move(known, tab);\n continue;\n }\n this.entries.push({\n tab,\n key,\n url: '',\n ref: null,\n route: null,\n detached: false,\n unbind: () => {},\n inFront: signal(false),\n leaving: new Set(),\n });\n // The reuse strategy detaches a tab whole, and has only the route to go on.\n // A path can have multiple route configs selected by canMatch (for example an iPad split\n // layout and an iPhone stack). Mark every variant: the reuse strategy sees the config\n // Angular actually matched, which may not be the first one in the route array.\n for (const config of children) {\n if (config.path === key) markTabRoute(config);\n }\n }\n\n if (this.entries.length === 0) {\n throw new Error(\n '[angular-native] <native-tabs-outlet> has no tabs. Put a <native-tab path=\"...\"> ' +\n 'inside it for each child route the bar should reach.',\n );\n }\n // Before the first navigation nothing is selected, which is not a state a tab bar has.\n if (first) this.request(this.entries[0]!);\n return this.entries;\n }\n\n /**\n * Give an entry the `<native-tab>` now declared for its path, when that is not the one it was\n * read with: an `@if` that took the tab away and brought it back made a new element, with a new\n * screen. The page goes over to that screen as it is, so the tab comes back where it was left.\n */\n private move(entry: TabEntry, tab: NativeTab): void {\n if (entry.tab === tab) return;\n entry.tab = tab;\n if (entry.ref) this.renderer.appendChild(tab.screen, entry.ref.location.nativeElement);\n }\n\n /**\n * The tab `route` is the page of, by its path from this outlet's route down to it. A route with\n * no component above the page is part of that path: a `loadChildren` wrapper takes the tab's\n * path and leaves `''` to the page under it, and a group is a `''` of its own.\n */\n private entryFor(route: ActivatedRoute): TabEntry {\n const config = route.routeConfig ?? route.snapshot.routeConfig;\n const paths = [config?.path];\n for (let above = route.parent; above && !above.component; above = above.parent) {\n paths.unshift(above.routeConfig?.path);\n }\n const path = paths.filter(Boolean).join('/');\n const entry = this.readTabs().find((candidate) => candidate.key === path);\n if (!entry) {\n throw new Error(\n `[angular-native] no <native-tab> has path=\"${path}\". Every child route the bar can ` +\n `reach needs one, and its path is what native identifies the tab by.`,\n );\n }\n // Under a wrapper the page's config is not one of the children `readTabs` marked, and it is\n // the one the reuse strategy is asked to detach whole.\n if (config) markTabRoute(config);\n return entry;\n }\n\n /** Remember where this tab is, and tell native to show it. */\n private select(entry: TabEntry): void {\n const left = this.selected;\n if (left && left !== entry) this.leave(left);\n this.selected = entry;\n for (const other of this.entries) other.inFront.set(other === entry);\n entry.url = this.router?.url ?? entry.url;\n this.request(entry);\n }\n\n /**\n * Another tab came in front of `entry`: its stacks dismiss what they presented, and it is\n * remembered at the page beneath, where the outermost stack that dismissed something is left.\n */\n private leave(entry: TabEntry): void {\n let url: string | null = null;\n for (const dismiss of entry.leaving) {\n const beneath = dismiss();\n url ??= beneath;\n }\n if (url !== null) entry.url = url;\n }\n\n /**\n * A back with nothing left to pop inside the tab: go to the first tab, where it was left, which\n * is what a bottom navigation bar does on Android. From the first tab, decline, so the platform\n * leaves the app. The order tabs were visited in is not retraced, so a back never lands on a\n * tab the user did not expect. Not while the bar is covered by a screen pushed over it: that\n * screen's stack answers instead.\n */\n private goBack(): boolean {\n const first = this.entries[0];\n const selected = this.selected;\n if (!first || !selected || selected === first || !this.router) return false;\n if (!this.isActivated || !isShowing(this.router, selected.route)) return false;\n void this.router.navigateByUrl(this.urlOf(first));\n return true;\n }\n\n /** Keep the tab in front on the url it has reached, as long as the url is still inside it. */\n private follow(url: string): void {\n const entry = this.selected;\n if (entry && this.tabOf(url) === entry) entry.url = url;\n }\n\n /**\n * The url of the tab `url` is a page inside, when nothing has opened that tab: the tab's own\n * first screen, which a push into the tab from outside it shows first.\n */\n private unopenedTabOf(url: string): string | null {\n const entry = this.tabOf(url);\n if (!entry || entry.ref) return null;\n const root = this.pathOf(entry);\n return pathOnly(url) === root ? null : root;\n }\n\n /** Where the tab `url` is in was left, while a screen over the bar covers it. */\n private coveredAt(url: string): string | null {\n if (this.injector.get(SCREEN_IN_FRONT)()) return null;\n const entry = this.tabOf(url);\n return entry ? this.urlOf(entry) : null;\n }\n\n /** Whether `url` is a tab other than the one in front, or a page inside one. */\n private behind(url: string): boolean {\n const entry = this.tabOf(url);\n return entry !== null && entry !== this.selected;\n }\n\n /**\n * The tab `url` is in: the one with the longest url that starts it. A tab at `''` has the bar's\n * own url, which at the root starts every url, pages outside the bar included, so it takes only\n * a url its routes lead to, as far as they are loaded. A wildcard or a custom matcher is not\n * followed, as `taken` follows neither: a page only one of them shows is in no tab.\n */\n private tabOf(url: string): TabEntry | null {\n const path = pathOnly(url);\n let found: TabEntry | null = null;\n for (const entry of this.entries) {\n const root = this.pathOf(entry);\n const inside = path === root || path.startsWith(root.endsWith('/') ? root : `${root}/`);\n if (!inside || (found && this.pathOf(found).length >= root.length)) continue;\n if (!entry.key && !this.leadsInto(entry, path.slice(root.length))) continue;\n found = entry;\n }\n return found;\n }\n\n /** Whether the routes of the tab at `''` lead to `rest`, the path under the bar's own url. */\n private leadsInto(entry: TabEntry, rest: string): boolean {\n const segments = rest.split('/').filter(Boolean);\n const own = entry.route?.snapshot.routeConfig;\n const routes = own\n ? [own]\n : (this.route.routeConfig?.children ?? []).filter((config) => config.path === '');\n return segments.length === 0 || reaches(routes, segments);\n }\n\n private request(entry: TabEntry): void {\n this.renderer.setProperty(this.host.nativeElement, 'navStateRequest', {\n selectedScreenKey: screenKeyOf(entry.key),\n baseProvenance: this.provenance,\n });\n }\n\n /**\n * Native switched tab. Acknowledge the new state, then navigate: the router is authoritative\n * about what is on screen (ADR 0003), so the tap becomes a navigation to where that tab was,\n * and the activation that follows is what fills the tab in.\n */\n private onNativeSelect(selection: TabSelection | undefined): void {\n if (!selection) return;\n this.provenance = selection.provenance;\n\n const entry = this.readTabs().find(\n (tab) => screenKeyOf(tab.key) === selection.selectedScreenKey,\n );\n if (!entry || (entry === this.selected && !this.tappedBack(selection))) return;\n\n // Returning to a tab returns to the url it was last on, which is the whole point of keeping\n // it mounted. A tab never visited starts at its own path.\n // A navigation that fails is reported, unless activation reported it already: a page that\n // does not load, caught here, would otherwise leave nothing but a tab that will not open.\n void this.router?.navigateByUrl(this.urlOf(entry)).then(\n (arrived) => this.revertUnless(arrived),\n (error: unknown) => {\n if (error === null || typeof error !== 'object' || !this.reported.has(error)) {\n this.errors.handleError(error);\n }\n this.revertUnless(false);\n },\n );\n }\n\n /**\n * Whether the user tapped the tab in front while a navigation is running: back from the tab that\n * navigation is still loading, so the tab in front is where it is to end. A selection native\n * reports because the outlet asked for it is not a tap, and cancels nothing. Nor does a tap on\n * the tab already in front (native reports it as repeated): no other tab was tapped first, so a\n * navigation running then is one from code, or a push inside the tab, and is left to finish.\n */\n private tappedBack(selection: TabSelection): boolean {\n return (\n selection.actionOrigin === 'user' &&\n !selection.isRepeated &&\n !!this.router?.getCurrentNavigation()\n );\n }\n\n /**\n * Native switched tab before the router agreed to. When a guard refuses, or the navigation\n * fails, the router stays where it was and so must the bar, or it shows a tab nobody is on.\n * Not while another navigation is under way: that one superseded this, and its own activation\n * selects the tab it lands on.\n */\n private revertUnless(arrived: boolean): void {\n if (arrived || !this.selected || this.router?.getCurrentNavigation()) return;\n this.request(this.selected);\n // A failed navigation ends in a promise callback, which schedules no change detection, and a\n // prop reaches native only with the commit at the end of a pass. Without one the bar stayed\n // on the tab that failed until something else happened to render.\n this.changeDetector.markForCheck();\n }\n\n private urlOf(entry: TabEntry): string {\n return entry.url && this.tabOf(entry.url) === entry ? entry.url : this.pathOf(entry);\n }\n\n /** A tab's own url, from the outlet's route down. */\n private pathOf(entry: TabEntry): string {\n const parent = this.route.snapshot.pathFromRoot\n .flatMap((snapshot) => snapshot.url.map((segment) => segment.path))\n .join('/');\n return `/${[parent, entry.key].filter(Boolean).join('/')}`;\n }\n\n /**\n * As the stack outlet's: the route, the outlet contexts, and whether the tab is showing. And the\n * tab itself, for its stacks to hear when another comes in front.\n */\n private outletInjector(route: ActivatedRoute, entry: TabEntry): Injector {\n const outer = this.injector.get(SCREEN_IN_FRONT);\n const tab: InTab = {\n onLeave: (leave) => (entry.leaving.add(leave), () => entry.leaving.delete(leave)),\n };\n return Injector.create({\n parent: this.injector,\n providers: [\n { provide: SCREEN_IN_FRONT, useValue: computed(() => outer() && entry.inFront()) },\n { provide: IN_TAB, useValue: tab },\n { provide: ActivatedRoute, useValue: route },\n {\n provide: ChildrenOutletContexts,\n useValue: this.parentContexts.getOrCreateContext(this.name).children,\n },\n ],\n });\n }\n}\n"]}
1
+ {"version":3,"file":"native-tabs-outlet.js","sourceRoot":"","sources":["../src/native-tabs-outlet.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * A `RouterOutlet` that renders a native tab bar: a `UITabBarController` on iOS, a bottom\n * navigation bar on Android.\n *\n * The outlet's host element *is* the tabs host, and each `<native-tab>` in its content is one\n * item and the screen behind it. An activated route's component is created on a child view of\n * the matching tab screen. The screen belongs to the tab declaration and must survive the route\n * component being destroyed; Angular removes a component's host node when it destroys the ref.\n *\n * ```html\n * <native-tabs-outlet>\n * <native-tab path=\"library\" title=\"Library\" sfSymbol=\"books.vertical.fill\" />\n * <native-tab path=\"inbox\" title=\"Inbox\" sfSymbol=\"tray\" [badge]=\"unread()\" />\n * </native-tabs-outlet>\n * ```\n *\n * **Native holds the selection, not us.** The tabs host owns its navigation state and reports\n * every change - a tap, or one we asked for - through `tabSelected`, carrying a `provenance`\n * number that increments per change. We send `navStateRequest` with the provenance of the last\n * state we acknowledged, which is how native tells a stale request from a current one when a tap\n * and a navigation cross in flight. The alternative, holding the selection in JS, means a tap is\n * only reflected after a round trip, and the bar lags the finger. See ADR 0006.\n *\n * **Each tab keeps its own screen mounted**, so switching away and back finds a tab exactly as it\n * was: its scroll offset, its text, and its own stack if it has one. That is the reuse strategy\n * detaching the tab's whole subtree rather than only its leaf.\n */\nimport {\n ApplicationRef,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n ElementRef,\n ErrorHandler,\n Injector,\n Renderer2,\n computed,\n contentChildren,\n createComponent,\n effect,\n inject,\n input,\n signal,\n untracked,\n ViewContainerRef,\n type AfterContentInit,\n type ComponentRef,\n type EnvironmentInjector,\n type Type,\n type WritableSignal,\n} from '@angular/core';\nimport { SCREEN_IN_FRONT } from '@ng-native/device';\nimport {\n ActivatedRoute,\n ChildrenOutletContexts,\n NavigationEnd,\n PRIMARY_OUTLET,\n Router,\n type Data,\n type Route,\n type RouterOutletContract,\n} from '@angular/router';\nimport { bindRouteInputs } from './bind-route-inputs.ts';\nimport { NATIVE_TAB_DEFAULTS } from './native-bar-defaults.ts';\nimport { NativeBack, isShowing } from './native-back.ts';\nimport { optionalBoolean } from './transforms.ts';\nimport { NativeTab, screenKeyOf } from './native-tab.ts';\nimport { ownHost } from './own-host.ts';\nimport { markTabRoute } from './tab-routes.ts';\nimport { IN_TAB, type InTab } from './in-tab.ts';\nimport { taken, withoutPresented } from './presented-route.ts';\nimport { SVG_ICON_HOST } from './svg-icons.ts';\n\n/** A url without its query or fragment. */\nconst pathOnly = (url: string): string => url.split(/[?#]/, 1)[0]!;\n\n/**\n * Whether one of `routes` matches `segments`, whole or up to lazy children not loaded yet, which a\n * route that took a static segment of its own is taken to lead to. A parameter alone is not: it\n * takes any segment, pages outside the bar included, and its children may match none of the rest.\n */\nfunction reaches(routes: readonly Route[], segments: readonly string[]): boolean {\n return routes.some((route) => {\n const count = taken(route, segments);\n if (count === null) return false;\n const rest = segments.slice(count);\n if (rest.length === 0) return true;\n if (route.children) return reaches(route.children, rest);\n const named = route.path!.split('/').some((part) => part && !part.startsWith(':'));\n return named && route.loadChildren !== undefined;\n });\n}\n\ninterface TabEntry {\n /** The element in the bar now: an `@if` can take it away and bring another back. */\n tab: NativeTab;\n /** The key native identifies this tab by: its path, unique among the bar's items. */\n readonly key: string;\n /** The url this tab was last on, so returning to it returns where the user left. */\n url: string;\n ref: ComponentRef<unknown> | null;\n route: ActivatedRoute | null;\n detached: boolean;\n /** Stops feeding route params into the component's inputs. */\n unbind: () => void;\n /** Whether this tab is the one showing, for what its screens hold: see `SCREEN_IN_FRONT`. */\n readonly inFront: WritableSignal<boolean>;\n /** What the tab's stacks dismiss when another tab comes in front: see `IN_TAB`. */\n readonly leaving: Set<() => string | null>;\n}\n\n/** What `tabSelected` carries. Only these fields matter here; the rest is diagnostics. */\ninterface TabSelection {\n readonly selectedScreenKey: string;\n readonly provenance: number;\n /** `'user'` for a tap. Native reports the changes it was asked for too, under other names. */\n readonly actionOrigin?: string;\n /** Set when the user tapped the tab already in front, which is not a tap back. */\n readonly isRepeated?: boolean;\n}\n\n@Component({\n selector: 'native-tabs-outlet',\n template: '<ng-content />',\n providers: [{ provide: SVG_ICON_HOST, useFactory: () => inject(ViewContainerRef) }],\n host: {\n '[style]': 'fill',\n '[tabBarHidden]': 'barHidden()',\n '[tabBarTintColor]': 'tintColor() ?? defaults().tintColor',\n '[nativeContainerBackgroundColor]': 'backgroundColor() ?? defaults().backgroundColor',\n '[colorScheme]': 'colorScheme() ?? defaults().colorScheme',\n '[tabBarMinimizeBehavior]': 'minimizeBehavior()',\n '[tabBarControllerMode]': 'controllerMode()',\n '[tabBarRespectsIMEInsets]': 'respectsKeyboard()',\n },\n})\nexport class NativeTabsOutlet implements RouterOutletContract, AfterContentInit {\n name = PRIMARY_OUTLET;\n\n readonly supportsBindingToComponentInputs = true;\n\n private readonly parentContexts = inject(ChildrenOutletContexts);\n private readonly renderer = inject(Renderer2);\n private readonly applicationRef = inject(ApplicationRef);\n private readonly changeDetector = inject(ChangeDetectorRef);\n private readonly injector = inject(Injector);\n private readonly host = inject(ElementRef);\n private readonly route = inject(ActivatedRoute);\n /** Optional so the outlet can be driven through `RouterOutletContract` directly, as tests do. */\n private readonly router = inject(Router, { optional: true });\n private readonly errors = inject(ErrorHandler);\n /** What activation has reported already, so the failed navigation it causes is not reported again. */\n private readonly reported = new WeakSet<object>();\n /** The app's `withTabDefaults`, for whatever the outlet does not bind itself. */\n protected readonly defaults = inject(NATIVE_TAB_DEFAULTS);\n\n private readonly declared = contentChildren(NativeTab);\n private readonly entries: TabEntry[] = [];\n private selected: TabEntry | null = null;\n /** The provenance of the last state native told us about. Starts before native's first. */\n private provenance = 0;\n\n protected readonly fill = { flex: 1 };\n\n // --- the bar itself -----------------------------------------------------\n\n /** Hide the bar without unmounting the tabs, for a screen that wants the whole window. */\n readonly barHidden = input(undefined, { transform: optionalBoolean });\n /** The colour of the selected item. iOS. */\n readonly tintColor = input<string | number>();\n /** Behind the tabs, where a screen does not paint. */\n readonly backgroundColor = input<string | number>();\n /** Force the bar's light or dark appearance, whatever the app's is. */\n readonly colorScheme = input<'inherit' | 'light' | 'dark'>();\n /** iOS 26: let the bar shrink out of the way as content scrolls. */\n readonly minimizeBehavior = input<'automatic' | 'never' | 'onScrollDown' | 'onScrollUp'>();\n /** iOS: `tabSidebar` is the iPad layout, with the tabs down the side. */\n readonly controllerMode = input<'automatic' | 'tabBar' | 'tabSidebar'>();\n /** Android: keep the bar above the keyboard rather than behind it. */\n readonly respectsKeyboard = input(undefined, { transform: optionalBoolean });\n\n constructor() {\n ownHost(this.host.nativeElement);\n // In the constructor rather than a lifecycle hook: the router activates a child route as soon\n // as this component exists, which is before any hook has run.\n this.parentContexts.onChildOutletCreated(this.name, this);\n\n this.renderer.listen(\n this.host.nativeElement,\n 'tabSelected',\n (event: { nativeEvent?: TabSelection }) => this.onNativeSelect(event?.nativeEvent),\n );\n\n // An `@if` that takes a tab away and brings it back makes a new element: its page follows it\n // at once, since the tab may be the one showing, with no tap or navigation to read them on.\n effect(() => {\n this.declared();\n if (this.entries.length > 0) untracked(() => this.readTabs());\n });\n\n // A push inside a tab's own stack reuses the tab's route, so this outlet is never activated\n // for it; the router's navigation is the only sign. Without this, coming back to the tab\n // returns it to its root and pops the screens the user left it on.\n const following = this.router?.events?.subscribe((event) => {\n // Without a page presented over the bar, which is no part of where the tab is.\n if (event instanceof NavigationEnd) {\n this.follow(withoutPresented(this.router!, event.urlAfterRedirects));\n }\n });\n\n // Android's back button, and `NativeNavigation.back()`, once the stack in front, if the tab\n // has one, is at its root. Subscribed before any tab's own stack, so it is asked after them.\n const back = inject(NativeBack);\n const unsubscribeBack = back.handle(() => this.goBack());\n const unsubscribeBar = back.addTabBar({\n unopenedTabOf: (url) => this.unopenedTabOf(url),\n behind: (url) => this.behind(url),\n coveredAt: (url) => this.coveredAt(url),\n });\n\n inject(DestroyRef).onDestroy(() => {\n unsubscribeBack();\n unsubscribeBar();\n following?.unsubscribe();\n for (const entry of this.entries) {\n entry.unbind();\n entry.ref?.destroy();\n }\n this.entries.length = 0;\n // Only while it is this outlet's, as for a stack: see `NativeStackOutlet`.\n if (this.parentContexts.getContext(this.name)?.outlet === this) {\n this.parentContexts.onChildOutletDestroyed(this.name);\n }\n });\n }\n\n /** A bar nobody has navigated into yet still has to show a selected item. */\n ngAfterContentInit(): void {\n this.readTabs();\n this.activateCurrentRoute();\n }\n\n /**\n * The route the router is already on, for an outlet created after the navigation that reached\n * it, as `NativeStackOutlet` takes its own: a tab bar held behind a condition until a session\n * is ready. Once the tabs are read, since activating one needs to know which they are.\n */\n private activateCurrentRoute(): void {\n if (this.isActivated) return;\n const context = this.parentContexts.getContext(this.name);\n if (!context?.route) return;\n if (context.attachRef) this.attach(context.attachRef, context.route);\n else this.activateWith(context.route, context.injector);\n }\n\n /** The tabs in the bar, in the order they were first in it. Exposed for tests. */\n get tabKeys(): string[] {\n return this.readTabs().map((entry) => entry.key);\n }\n\n /** Which tab native is showing. Exposed for tests. */\n get selectedKey(): string | null {\n return this.selected?.key ?? null;\n }\n\n // --- RouterOutletContract ----------------------------------------------\n\n get isActivated(): boolean {\n return this.selected?.ref != null && !this.selected.detached;\n }\n\n get component(): Object | null {\n return this.isActivated ? (this.selected!.ref!.instance as Object) : null;\n }\n\n get activatedRoute(): ActivatedRoute | null {\n return this.isActivated ? this.selected!.route : null;\n }\n\n get activatedRouteData(): Data {\n return this.activatedRoute?.snapshot.data ?? {};\n }\n\n /** The input binder reads this to bind route params to component inputs. */\n get activatedComponentRef(): ComponentRef<unknown> | null {\n return this.selected?.ref ?? null;\n }\n\n activateWith(route: ActivatedRoute, environmentInjector: EnvironmentInjector): void {\n const component = (route.component ?? route.snapshot.component) as Type<unknown> | null;\n if (!component) {\n throw new Error('[angular-native] route has no component to activate');\n }\n const entry = this.entryFor(route);\n\n // The tab screen is owned by <native-tab>, not by this route component. If the route uses\n // deactivate() rather than detach(), Angular removes the component host on destroy. Giving\n // the component its own child host keeps that removal from taking the tab bar item with it.\n const content = ownHost(this.renderer.createElement('view'));\n this.renderer.setStyle(content, 'flex', 1);\n this.renderer.appendChild(entry.tab.screen, content);\n\n let ref: ComponentRef<unknown> | undefined;\n try {\n ref = createComponent(component, {\n environmentInjector,\n elementInjector: this.outletInjector(route, entry),\n hostElement: content as Element,\n });\n this.applicationRef.attachView(ref.hostView);\n // Route params onto inputs before the first change detection, as the stack outlet does: a\n // required input still unset when the page first renders throws NG0950.\n entry.unbind = this.bindInputs(ref, route);\n // Before anything can commit. Creating the page's nodes dirties the tree, which schedules a\n // commit of its own - and that commit would capture the page with its elements created and\n // its bindings not yet applied. On iOS the props catch up a frame later and nobody sees it;\n // on Android the flattening decision is made from the props a view is created with, so a\n // content wrapper that arrives without its `collapsable: false` is flattened for good and\n // its children end up parented to a scroll view that allows exactly one.\n ref.changeDetectorRef.detectChanges();\n } catch (error) {\n this.abandon(entry, ref, content);\n this.errors.handleError(error);\n if (error !== null && typeof error === 'object') this.reported.add(error);\n throw error;\n }\n\n entry.ref = ref;\n entry.route = route;\n entry.detached = false;\n this.select(entry);\n }\n\n /**\n * Destroy the tab page in front: nothing once the router has detached it, as Angular's own\n * outlet does nothing then. A tab under a route with no component of its own, a `loadChildren`\n * wrapper or a group, has the router detach the page and then deactivate this same outlet, and\n * that page is the tab, kept for when it is selected again.\n */\n deactivate(): void {\n if (!this.isActivated) return;\n const entry = this.selected!;\n entry.unbind();\n entry.unbind = () => {};\n entry.ref!.destroy();\n entry.ref = null;\n entry.route = null;\n }\n\n /**\n * Hand the live `ComponentRef` back to the router. The tab's screen stays where it is with the\n * component still inside it, so the tab keeps running while another one is in front.\n */\n detach(): ComponentRef<unknown> {\n const entry = this.selected;\n if (!entry?.ref) throw new Error('[angular-native] outlet is not activated, nothing to detach');\n entry.detached = true;\n entry.inFront.set(false);\n // As in the stack outlet: stop change detection without unmounting the views.\n entry.ref.hostView.detach();\n return entry.ref;\n }\n\n attach(ref: ComponentRef<unknown>, route: ActivatedRoute): void {\n const entry = this.entryFor(route);\n\n // A ref from a previous instance of this outlet still lives on its old tab screen, which is\n // gone; re-parent it onto this one's rather than rebuild the tab.\n if (entry.ref !== ref) {\n this.renderer.appendChild(entry.tab.screen, ref.location.nativeElement);\n this.applicationRef.attachView(ref.hostView);\n entry.ref = ref;\n }\n\n entry.route = route;\n entry.detached = false;\n // The route object is new even when the url is not, so the inputs follow the new one.\n entry.unbind();\n entry.unbind = this.bindInputs(ref, route);\n ref.hostView.reattach();\n this.select(entry);\n }\n\n // --- native tabs --------------------------------------------------------\n\n /**\n * Undo a tab page that threw on its first render, which fails the navigation: its component\n * and its content view go, and the tab that was showing carries on, change detection and all.\n */\n private abandon(entry: TabEntry, ref: ComponentRef<unknown> | undefined, content: unknown): void {\n entry.unbind();\n entry.unbind = () => {};\n ref?.destroy();\n this.renderer.removeChild(entry.tab.screen, content);\n const showing = this.selected;\n if (showing?.detached && showing.ref) {\n showing.detached = false;\n showing.ref.hostView.reattach();\n }\n }\n\n /** Route params onto inputs only under `withComponentInputBinding()`, as in the stack outlet. */\n private bindInputs(ref: ComponentRef<unknown>, route: ActivatedRoute): () => void {\n return this.router?.componentInputBindingEnabled ? bindRouteInputs(ref, route) : () => {};\n }\n\n /**\n * Take the bar from the `<native-tab>` elements in the content, adding any that appeared since\n * the last read, as one an `@if` shows once a feature flag turns on, and following one that was\n * taken away and brought back.\n *\n * On demand rather than in a lifecycle hook, because the router activates a child route during\n * this component's creation, before any hook has run - but after the content nodes themselves\n * exist, which is all this needs.\n */\n private readTabs(): TabEntry[] {\n const first = this.entries.length === 0;\n const children = this.route.routeConfig?.children ?? [];\n for (const tab of this.declared()) {\n const key = tab.path();\n const known = this.entries.find((entry) => entry.key === key);\n if (known) {\n this.move(known, tab);\n continue;\n }\n this.entries.push({\n tab,\n key,\n url: '',\n ref: null,\n route: null,\n detached: false,\n unbind: () => {},\n inFront: signal(false),\n leaving: new Set(),\n });\n // The reuse strategy detaches a tab whole, and has only the route to go on.\n // A path can have multiple route configs selected by canMatch (for example an iPad split\n // layout and an iPhone stack). Mark every variant: the reuse strategy sees the config\n // Angular actually matched, which may not be the first one in the route array.\n for (const config of children) {\n if (config.path === key) markTabRoute(config);\n }\n }\n\n if (this.entries.length === 0) {\n throw new Error(\n '[angular-native] <native-tabs-outlet> has no tabs. Put a <native-tab path=\"...\"> ' +\n 'inside it for each child route the bar should reach.',\n );\n }\n // Before the first navigation nothing is selected, which is not a state a tab bar has.\n if (first) this.request(this.entries[0]!);\n return this.entries;\n }\n\n /**\n * Give an entry the `<native-tab>` now declared for its path, when that is not the one it was\n * read with: an `@if` that took the tab away and brought it back made a new element, with a new\n * screen. The page goes over to that screen as it is, so the tab comes back where it was left.\n */\n private move(entry: TabEntry, tab: NativeTab): void {\n if (entry.tab === tab) return;\n entry.tab = tab;\n if (entry.ref) this.renderer.appendChild(tab.screen, entry.ref.location.nativeElement);\n }\n\n /**\n * The tab `route` is the page of, by its path from this outlet's route down to it. A route with\n * no component above the page is part of that path: a `loadChildren` wrapper takes the tab's\n * path and leaves `''` to the page under it, and a group is a `''` of its own.\n */\n private entryFor(route: ActivatedRoute): TabEntry {\n const config = route.routeConfig ?? route.snapshot.routeConfig;\n const paths = [config?.path];\n for (let above = route.parent; above && !above.component; above = above.parent) {\n paths.unshift(above.routeConfig?.path);\n }\n const path = paths.filter(Boolean).join('/');\n const entry = this.readTabs().find((candidate) => candidate.key === path);\n if (!entry) {\n throw new Error(\n `[angular-native] no <native-tab> has path=\"${path}\". Every child route the bar can ` +\n `reach needs one, and its path is what native identifies the tab by.`,\n );\n }\n // Under a wrapper the page's config is not one of the children `readTabs` marked, and it is\n // the one the reuse strategy is asked to detach whole.\n if (config) markTabRoute(config);\n return entry;\n }\n\n /** Remember where this tab is, and tell native to show it. */\n private select(entry: TabEntry): void {\n const left = this.selected;\n if (left && left !== entry) this.leave(left);\n this.selected = entry;\n for (const other of this.entries) other.inFront.set(other === entry);\n entry.url = this.router?.url ?? entry.url;\n this.request(entry);\n }\n\n /**\n * Another tab came in front of `entry`: its stacks dismiss what they presented, and it is\n * remembered at the page beneath, where the outermost stack that dismissed something is left.\n */\n private leave(entry: TabEntry): void {\n let url: string | null = null;\n for (const dismiss of entry.leaving) {\n const beneath = dismiss();\n url ??= beneath;\n }\n if (url !== null) entry.url = url;\n }\n\n /**\n * A back with nothing left to pop inside the tab: go to the first tab, where it was left, which\n * is what a bottom navigation bar does on Android. From the first tab, decline, so the platform\n * leaves the app. The order tabs were visited in is not retraced, so a back never lands on a\n * tab the user did not expect. Not while the bar is covered by a screen pushed over it: that\n * screen's stack answers instead.\n */\n private goBack(): boolean {\n const first = this.entries[0];\n const selected = this.selected;\n if (!first || !selected || selected === first || !this.router) return false;\n if (!this.isActivated || !isShowing(this.router, selected.route)) return false;\n void this.router.navigateByUrl(this.urlOf(first));\n return true;\n }\n\n /** Keep the tab in front on the url it has reached, as long as the url is still inside it. */\n private follow(url: string): void {\n const entry = this.selected;\n if (entry && this.tabOf(url) === entry) entry.url = url;\n }\n\n /**\n * The url of the tab `url` is a page inside, when nothing has opened that tab: the tab's own\n * first screen, which a push into the tab from outside it shows first.\n */\n private unopenedTabOf(url: string): string | null {\n const entry = this.tabOf(url);\n if (!entry || entry.ref) return null;\n const root = this.pathOf(entry);\n return pathOnly(url) === root ? null : root;\n }\n\n /** Where the tab `url` is in was left, while a screen over the bar covers it. */\n private coveredAt(url: string): string | null {\n if (this.injector.get(SCREEN_IN_FRONT)()) return null;\n const entry = this.tabOf(url);\n return entry ? this.urlOf(entry) : null;\n }\n\n /** Whether `url` is a tab other than the one in front, or a page inside one. */\n private behind(url: string): boolean {\n const entry = this.tabOf(url);\n return entry !== null && entry !== this.selected;\n }\n\n /**\n * The tab `url` is in: the one with the longest url that starts it. A tab at `''` has the bar's\n * own url, which at the root starts every url, pages outside the bar included, so it takes only\n * a url its routes lead to, as far as they are loaded. A wildcard or a custom matcher is not\n * followed, as `taken` follows neither: a page only one of them shows is in no tab.\n */\n private tabOf(url: string): TabEntry | null {\n const path = pathOnly(url);\n let found: TabEntry | null = null;\n for (const entry of this.entries) {\n const root = this.pathOf(entry);\n const inside = path === root || path.startsWith(root.endsWith('/') ? root : `${root}/`);\n if (!inside || (found && this.pathOf(found).length >= root.length)) continue;\n if (!entry.key && !this.leadsInto(entry, path.slice(root.length))) continue;\n found = entry;\n }\n return found;\n }\n\n /** Whether the routes of the tab at `''` lead to `rest`, the path under the bar's own url. */\n private leadsInto(entry: TabEntry, rest: string): boolean {\n const segments = rest.split('/').filter(Boolean);\n const own = entry.route?.snapshot.routeConfig;\n const routes = own\n ? [own]\n : (this.route.routeConfig?.children ?? []).filter((config) => config.path === '');\n return segments.length === 0 || reaches(routes, segments);\n }\n\n private request(entry: TabEntry): void {\n this.renderer.setProperty(this.host.nativeElement, 'navStateRequest', {\n selectedScreenKey: screenKeyOf(entry.key),\n baseProvenance: this.provenance,\n });\n }\n\n /**\n * Native switched tab. Acknowledge the new state, then navigate: the router is authoritative\n * about what is on screen (ADR 0003), so the tap becomes a navigation to where that tab was,\n * and the activation that follows is what fills the tab in.\n */\n private onNativeSelect(selection: TabSelection | undefined): void {\n if (!selection) return;\n this.provenance = selection.provenance;\n\n const entry = this.readTabs().find(\n (tab) => screenKeyOf(tab.key) === selection.selectedScreenKey,\n );\n if (!entry || (entry === this.selected && !this.tappedBack(selection))) return;\n\n // Returning to a tab returns to the url it was last on, which is the whole point of keeping\n // it mounted. A tab never visited starts at its own path.\n // A navigation that fails is reported, unless activation reported it already: a page that\n // does not load, caught here, would otherwise leave nothing but a tab that will not open.\n void this.router?.navigateByUrl(this.urlOf(entry)).then(\n (arrived) => this.revertUnless(arrived),\n (error: unknown) => {\n if (error === null || typeof error !== 'object' || !this.reported.has(error)) {\n this.errors.handleError(error);\n }\n this.revertUnless(false);\n },\n );\n }\n\n /**\n * Whether the user tapped the tab in front while a navigation is running: back from the tab that\n * navigation is still loading, so the tab in front is where it is to end. A selection native\n * reports because the outlet asked for it is not a tap, and cancels nothing. Nor does a tap on\n * the tab already in front (native reports it as repeated): no other tab was tapped first, so a\n * navigation running then is one from code, or a push inside the tab, and is left to finish.\n */\n private tappedBack(selection: TabSelection): boolean {\n return (\n selection.actionOrigin === 'user' &&\n !selection.isRepeated &&\n !!this.router?.getCurrentNavigation()\n );\n }\n\n /**\n * Native switched tab before the router agreed to. When a guard refuses, or the navigation\n * fails, the router stays where it was and so must the bar, or it shows a tab nobody is on.\n * Not while another navigation is under way: that one superseded this, and its own activation\n * selects the tab it lands on.\n */\n private revertUnless(arrived: boolean): void {\n if (arrived || !this.selected || this.router?.getCurrentNavigation()) return;\n this.request(this.selected);\n // A failed navigation ends in a promise callback, which schedules no change detection, and a\n // prop reaches native only with the commit at the end of a pass. Without one the bar stayed\n // on the tab that failed until something else happened to render.\n this.changeDetector.markForCheck();\n }\n\n private urlOf(entry: TabEntry): string {\n return entry.url && this.tabOf(entry.url) === entry ? entry.url : this.pathOf(entry);\n }\n\n /** A tab's own url, from the outlet's route down. */\n private pathOf(entry: TabEntry): string {\n const parent = this.route.snapshot.pathFromRoot\n .flatMap((snapshot) => snapshot.url.map((segment) => segment.path))\n .join('/');\n return `/${[parent, entry.key].filter(Boolean).join('/')}`;\n }\n\n /**\n * As the stack outlet's: the route, the outlet contexts, and whether the tab is showing. And the\n * tab itself, for its stacks to hear when another comes in front.\n */\n private outletInjector(route: ActivatedRoute, entry: TabEntry): Injector {\n const outer = this.injector.get(SCREEN_IN_FRONT);\n const tab: InTab = {\n onLeave: (leave) => (entry.leaving.add(leave), () => entry.leaving.delete(leave)),\n };\n return Injector.create({\n parent: this.injector,\n providers: [\n { provide: SCREEN_IN_FRONT, useValue: computed(() => outer() && entry.inFront()) },\n { provide: IN_TAB, useValue: tab },\n { provide: ActivatedRoute, useValue: route },\n {\n provide: ChildrenOutletContexts,\n useValue: this.parentContexts.getOrCreateContext(this.name).children,\n },\n ],\n });\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ng-native/router",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "description": "@angular/router over native navigation for Angular Native: stack and tab outlets, native headers and links.",
5
5
  "keywords": [
6
6
  "angular",
@@ -17,8 +17,8 @@
17
17
  "type": "module",
18
18
  "main": "dist/index.js",
19
19
  "dependencies": {
20
- "@ng-native/device": "0.14.0",
21
- "@ng-native/fabric": "0.14.0"
20
+ "@ng-native/device": "0.15.0",
21
+ "@ng-native/fabric": "0.15.0"
22
22
  },
23
23
  "peerDependencies": {
24
24
  "@angular/common": "^22.0.0",