@sigmela/router 0.2.2 → 0.2.4
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.
- package/README.md +65 -9
- package/lib/module/Navigation.js +13 -10
- package/lib/module/NavigationStack.js +13 -1
- package/lib/module/Router.js +123 -6
- package/lib/module/ScreenStack/ScreenStack.web.js +15 -9
- package/lib/module/ScreenStack/animationHelpers.js +12 -2
- package/lib/module/ScreenStackItem/ScreenStackItem.js +4 -1
- package/lib/module/ScreenStackItem/ScreenStackItem.web.js +19 -5
- package/lib/module/SplitView/RenderSplitView.native.js +57 -64
- package/lib/module/TabBar/RenderTabBar.native.js +95 -5
- package/lib/module/TabBar/RenderTabBar.web.js +39 -0
- package/lib/module/TabBar/TabBar.js +21 -9
- package/lib/module/styles.css +95 -18
- package/lib/module/types.js +11 -1
- package/lib/typescript/src/Navigation.d.ts +8 -0
- package/lib/typescript/src/NavigationStack.d.ts +3 -2
- package/lib/typescript/src/Router.d.ts +12 -1
- package/lib/typescript/src/ScreenStack/ScreenStackContext.d.ts +2 -2
- package/lib/typescript/src/SplitView/RenderSplitView.native.d.ts +7 -0
- package/lib/typescript/src/TabBar/TabBar.d.ts +23 -0
- package/lib/typescript/src/types.d.ts +14 -1
- package/package.json +1 -1
package/lib/module/styles.css
CHANGED
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
/* Show overlay only for modal-like presentations.
|
|
49
49
|
IMPORTANT: use direct child (>) to avoid collapsing overlay from nested stacks,
|
|
50
50
|
when modal ScreenStackItem is inside push ScreenStackItem container. */
|
|
51
|
-
.screen-stack-item:not(.modal):not(.contained-modal):not(.fullscreen-modal):not(.formsheet):not(.pagesheet):not(.sheet)
|
|
51
|
+
.screen-stack-item:not(.modal):not(.modal-right):not(.contained-modal):not(.fullscreen-modal):not(.formsheet):not(.pagesheet):not(.sheet)
|
|
52
52
|
> .stack-modal-overlay {
|
|
53
53
|
display: none;
|
|
54
54
|
}
|
|
@@ -75,6 +75,7 @@
|
|
|
75
75
|
|
|
76
76
|
/* Overlay in initial state — transparent */
|
|
77
77
|
.screen-stack-item.modal.transition-preEnter > .stack-modal-overlay,
|
|
78
|
+
.screen-stack-item.modal-right.transition-preEnter > .stack-modal-overlay,
|
|
78
79
|
.screen-stack-item.contained-modal.transition-preEnter > .stack-modal-overlay,
|
|
79
80
|
.screen-stack-item.fullscreen-modal.transition-preEnter > .stack-modal-overlay,
|
|
80
81
|
.screen-stack-item.formsheet.transition-preEnter > .stack-modal-overlay,
|
|
@@ -88,6 +89,8 @@
|
|
|
88
89
|
/* Overlay on enter — start animation */
|
|
89
90
|
.screen-stack-item.modal.transition-entering > .stack-modal-overlay,
|
|
90
91
|
.screen-stack-item.modal.phase-active.transition-preEnter > .stack-modal-overlay,
|
|
92
|
+
.screen-stack-item.modal-right.transition-entering > .stack-modal-overlay,
|
|
93
|
+
.screen-stack-item.modal-right.phase-active.transition-preEnter > .stack-modal-overlay,
|
|
91
94
|
.screen-stack-item.contained-modal.transition-entering > .stack-modal-overlay,
|
|
92
95
|
.screen-stack-item.contained-modal.phase-active.transition-preEnter > .stack-modal-overlay,
|
|
93
96
|
.screen-stack-item.fullscreen-modal.transition-entering > .stack-modal-overlay,
|
|
@@ -106,6 +109,8 @@
|
|
|
106
109
|
/* For modal-like in active / entered states — fully visible */
|
|
107
110
|
.screen-stack-item.modal.phase-active > .stack-modal-overlay,
|
|
108
111
|
.screen-stack-item.modal.transition-entered > .stack-modal-overlay,
|
|
112
|
+
.screen-stack-item.modal-right.phase-active > .stack-modal-overlay,
|
|
113
|
+
.screen-stack-item.modal-right.transition-entered > .stack-modal-overlay,
|
|
109
114
|
.screen-stack-item.contained-modal.phase-active > .stack-modal-overlay,
|
|
110
115
|
.screen-stack-item.contained-modal.transition-entered > .stack-modal-overlay,
|
|
111
116
|
.screen-stack-item.fullscreen-modal.phase-active > .stack-modal-overlay,
|
|
@@ -124,6 +129,8 @@
|
|
|
124
129
|
/* Overlay on modal-like close — disappearance animation */
|
|
125
130
|
.screen-stack-item.modal.phase-exiting > .stack-modal-overlay,
|
|
126
131
|
.screen-stack-item.modal.transition-exiting > .stack-modal-overlay,
|
|
132
|
+
.screen-stack-item.modal-right.phase-exiting > .stack-modal-overlay,
|
|
133
|
+
.screen-stack-item.modal-right.transition-exiting > .stack-modal-overlay,
|
|
127
134
|
.screen-stack-item.contained-modal.phase-exiting > .stack-modal-overlay,
|
|
128
135
|
.screen-stack-item.contained-modal.transition-exiting > .stack-modal-overlay,
|
|
129
136
|
.screen-stack-item.fullscreen-modal.phase-exiting > .stack-modal-overlay,
|
|
@@ -153,6 +160,7 @@
|
|
|
153
160
|
|
|
154
161
|
/* Modal-like content container always above overlay */
|
|
155
162
|
.screen-stack-item.modal .stack-modal-container,
|
|
163
|
+
.screen-stack-item.modal-right .stack-modal-container,
|
|
156
164
|
.screen-stack-item.contained-modal .stack-modal-container,
|
|
157
165
|
.screen-stack-item.fullscreen-modal .stack-modal-container,
|
|
158
166
|
.screen-stack-item.formsheet .stack-modal-container,
|
|
@@ -202,6 +210,7 @@
|
|
|
202
210
|
|
|
203
211
|
/* IMPORTANT: modal elements should not move like regular screens */
|
|
204
212
|
.screen-stack > .screen-stack-item.modal,
|
|
213
|
+
.screen-stack > .screen-stack-item.modal-right,
|
|
205
214
|
.screen-stack > .screen-stack-item.sheet {
|
|
206
215
|
transform: translate3d(0, 0, 0) !important;
|
|
207
216
|
}
|
|
@@ -229,7 +238,12 @@
|
|
|
229
238
|
|
|
230
239
|
/* PUSH BACKGROUND - background screen shifts left */
|
|
231
240
|
/* Important: use !important to override general rules for inactive */
|
|
232
|
-
.screen-stack-item.push.push-background
|
|
241
|
+
.screen-stack-item.push.push-background,
|
|
242
|
+
.screen-stack-item.modal.push-background,
|
|
243
|
+
.screen-stack-item.modal-right.push-background,
|
|
244
|
+
.screen-stack-item.sheet.push-background,
|
|
245
|
+
.screen-stack-item.formsheet.push-background,
|
|
246
|
+
.screen-stack-item.pagesheet.push-background {
|
|
233
247
|
transform: translateX(-25%) !important;
|
|
234
248
|
transition:
|
|
235
249
|
transform 300ms cubic-bezier(0.22, 0.61, 0.36, 1),
|
|
@@ -238,7 +252,12 @@
|
|
|
238
252
|
|
|
239
253
|
/* POP BACKGROUND - background screen on pop stays at -25% */
|
|
240
254
|
/* Background elements on pop get pop-background instead of none, to preserve -25% position */
|
|
241
|
-
.screen-stack-item.push.pop-background
|
|
255
|
+
.screen-stack-item.push.pop-background,
|
|
256
|
+
.screen-stack-item.modal.pop-background,
|
|
257
|
+
.screen-stack-item.modal-right.pop-background,
|
|
258
|
+
.screen-stack-item.sheet.pop-background,
|
|
259
|
+
.screen-stack-item.formsheet.pop-background,
|
|
260
|
+
.screen-stack-item.pagesheet.pop-background {
|
|
242
261
|
transform: translateX(-25%) !important;
|
|
243
262
|
/* Don't set transition, so element stays in place without animation */
|
|
244
263
|
filter: none;
|
|
@@ -294,7 +313,8 @@
|
|
|
294
313
|
/* ==================== MOBILE MODAL (<= 639px) — bottom sheet ==================== */
|
|
295
314
|
@media (max-width: 639px) {
|
|
296
315
|
/* Inner container for modal — bottom sheet full width with top border radius */
|
|
297
|
-
.screen-stack-item.modal .stack-modal-container
|
|
316
|
+
.screen-stack-item.modal .stack-modal-container,
|
|
317
|
+
.screen-stack-item.modal-right .stack-modal-container {
|
|
298
318
|
width: 100%;
|
|
299
319
|
margin: 0;
|
|
300
320
|
border-radius: 0;
|
|
@@ -311,19 +331,23 @@
|
|
|
311
331
|
}
|
|
312
332
|
|
|
313
333
|
/* MODAL ENTER - modal enters (bottom to top) */
|
|
314
|
-
.screen-stack-item.modal.modal-enter.transition-preEnter .stack-modal-container
|
|
334
|
+
.screen-stack-item.modal.modal-enter.transition-preEnter .stack-modal-container,
|
|
335
|
+
.screen-stack-item.modal-right.modal-right-enter.transition-preEnter .stack-modal-container {
|
|
315
336
|
transform: translateY(100%);
|
|
316
337
|
filter: none;
|
|
317
338
|
}
|
|
318
339
|
|
|
319
340
|
.screen-stack-item.modal.modal-enter.transition-entering .stack-modal-container,
|
|
320
|
-
.screen-stack-item.modal.modal-enter.transition-entered .stack-modal-container
|
|
341
|
+
.screen-stack-item.modal.modal-enter.transition-entered .stack-modal-container,
|
|
342
|
+
.screen-stack-item.modal-right.modal-right-enter.transition-entering .stack-modal-container,
|
|
343
|
+
.screen-stack-item.modal-right.modal-right-enter.transition-entered .stack-modal-container {
|
|
321
344
|
transform: translateY(0);
|
|
322
345
|
filter: none;
|
|
323
346
|
}
|
|
324
347
|
|
|
325
348
|
/* MODAL EXIT - modal closes (exits downward) */
|
|
326
|
-
.screen-stack-item.modal.modal-exit.transition-exiting .stack-modal-container
|
|
349
|
+
.screen-stack-item.modal.modal-exit.transition-exiting .stack-modal-container,
|
|
350
|
+
.screen-stack-item.modal-right.modal-right-exit.transition-exiting .stack-modal-container {
|
|
327
351
|
transform: translateY(100%);
|
|
328
352
|
filter: none;
|
|
329
353
|
transition:
|
|
@@ -370,10 +394,57 @@
|
|
|
370
394
|
}
|
|
371
395
|
}
|
|
372
396
|
|
|
373
|
-
/* ==================== DESKTOP MODAL (>= 640px) —
|
|
397
|
+
/* ==================== DESKTOP MODAL (>= 640px) — centered card ==================== */
|
|
374
398
|
@media (min-width: 640px) {
|
|
375
|
-
/* Inner container for modal —
|
|
399
|
+
/* Inner container for modal — centered card 600px width, 75% height */
|
|
376
400
|
.screen-stack-item.modal .stack-modal-container {
|
|
401
|
+
width: 600px;
|
|
402
|
+
max-width: calc(100% - 48px);
|
|
403
|
+
height: 75vh;
|
|
404
|
+
max-height: calc(100% - 48px);
|
|
405
|
+
margin: auto; /* center in parent */
|
|
406
|
+
border-radius: 38px;
|
|
407
|
+
overflow: hidden;
|
|
408
|
+
background: #fff;
|
|
409
|
+
|
|
410
|
+
transform: translateY(0);
|
|
411
|
+
transition:
|
|
412
|
+
transform 300ms cubic-bezier(0.22, 0.61, 0.36, 1),
|
|
413
|
+
filter 300ms cubic-bezier(0.22, 0.61, 0.36, 1);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/* Center the modal container using flexbox on parent */
|
|
417
|
+
.screen-stack-item.modal {
|
|
418
|
+
display: flex;
|
|
419
|
+
align-items: center;
|
|
420
|
+
justify-content: center;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/* MODAL ENTER - modal enters (bottom to center) */
|
|
424
|
+
.screen-stack-item.modal.modal-enter.transition-preEnter .stack-modal-container {
|
|
425
|
+
transform: translateY(100vh);
|
|
426
|
+
filter: none;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
.screen-stack-item.modal.modal-enter.transition-entering .stack-modal-container,
|
|
430
|
+
.screen-stack-item.modal.modal-enter.transition-entered .stack-modal-container {
|
|
431
|
+
transform: translateY(0);
|
|
432
|
+
filter: none;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/* MODAL EXIT - modal closes (exits downward) */
|
|
436
|
+
.screen-stack-item.modal.modal-exit.transition-exiting .stack-modal-container {
|
|
437
|
+
transform: translateY(100vh);
|
|
438
|
+
filter: none;
|
|
439
|
+
transition:
|
|
440
|
+
transform 300ms cubic-bezier(0.22, 0.61, 0.36, 1),
|
|
441
|
+
filter 300ms cubic-bezier(0.22, 0.61, 0.36, 1);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/* ==================== MODAL-RIGHT — slide from right (previous modal behavior) ==================== */
|
|
445
|
+
|
|
446
|
+
/* Inner container for modal-right — right sheet 393px */
|
|
447
|
+
.screen-stack-item.modal-right .stack-modal-container {
|
|
377
448
|
width: 393px;
|
|
378
449
|
max-width: calc(100% - 36px);
|
|
379
450
|
height: calc(100% - 36px);
|
|
@@ -381,7 +452,7 @@
|
|
|
381
452
|
margin-left: auto; /* align to right edge */
|
|
382
453
|
border-radius: 16px;
|
|
383
454
|
overflow: hidden;
|
|
384
|
-
background: #fff;
|
|
455
|
+
background: #fff;
|
|
385
456
|
|
|
386
457
|
transform: translateX(0);
|
|
387
458
|
transition:
|
|
@@ -389,20 +460,20 @@
|
|
|
389
460
|
filter 300ms cubic-bezier(0.22, 0.61, 0.36, 1);
|
|
390
461
|
}
|
|
391
462
|
|
|
392
|
-
/* MODAL ENTER - modal enters (right to left) */
|
|
393
|
-
.screen-stack-item.modal.modal-enter.transition-preEnter .stack-modal-container {
|
|
463
|
+
/* MODAL-RIGHT ENTER - modal enters (right to left) */
|
|
464
|
+
.screen-stack-item.modal-right.modal-right-enter.transition-preEnter .stack-modal-container {
|
|
394
465
|
transform: translateX(100%);
|
|
395
466
|
filter: none;
|
|
396
467
|
}
|
|
397
468
|
|
|
398
|
-
.screen-stack-item.modal.modal-enter.transition-entering .stack-modal-container,
|
|
399
|
-
.screen-stack-item.modal.modal-enter.transition-entered .stack-modal-container {
|
|
469
|
+
.screen-stack-item.modal-right.modal-right-enter.transition-entering .stack-modal-container,
|
|
470
|
+
.screen-stack-item.modal-right.modal-right-enter.transition-entered .stack-modal-container {
|
|
400
471
|
transform: translateX(0);
|
|
401
472
|
filter: none;
|
|
402
473
|
}
|
|
403
474
|
|
|
404
|
-
/* MODAL EXIT - modal closes (exits to right) */
|
|
405
|
-
.screen-stack-item.modal.modal-exit.transition-exiting .stack-modal-container {
|
|
475
|
+
/* MODAL-RIGHT EXIT - modal closes (exits to right) */
|
|
476
|
+
.screen-stack-item.modal-right.modal-right-exit.transition-exiting .stack-modal-container {
|
|
406
477
|
transform: translateX(100%);
|
|
407
478
|
filter: none;
|
|
408
479
|
transition:
|
|
@@ -439,6 +510,10 @@
|
|
|
439
510
|
.screen-stack:has(> .screen-stack-item.modal.phase-active)
|
|
440
511
|
> .screen-stack-item.push.phase-inactive,
|
|
441
512
|
.screen-stack:has(> .screen-stack-item.modal.phase-active)
|
|
513
|
+
> .screen-stack-item.push.phase-inactive.transition-entered,
|
|
514
|
+
.screen-stack:has(> .screen-stack-item.modal-right.phase-active)
|
|
515
|
+
> .screen-stack-item.push.phase-inactive,
|
|
516
|
+
.screen-stack:has(> .screen-stack-item.modal-right.phase-active)
|
|
442
517
|
> .screen-stack-item.push.phase-inactive.transition-entered {
|
|
443
518
|
transform: translate3d(0, 0, 0) !important;
|
|
444
519
|
filter: none;
|
|
@@ -489,7 +564,8 @@
|
|
|
489
564
|
position: relative;
|
|
490
565
|
}
|
|
491
566
|
|
|
492
|
-
.tab-stacks-container > .screen-stack
|
|
567
|
+
.tab-stacks-container > .screen-stack,
|
|
568
|
+
.tab-stacks-container > .split-view-container {
|
|
493
569
|
padding-bottom: calc(73px + env(safe-area-inset-bottom));
|
|
494
570
|
}
|
|
495
571
|
|
|
@@ -725,7 +801,8 @@
|
|
|
725
801
|
flex-direction: row;
|
|
726
802
|
}
|
|
727
803
|
|
|
728
|
-
.tab-stacks-container > .screen-stack
|
|
804
|
+
.tab-stacks-container > .screen-stack,
|
|
805
|
+
.tab-stacks-container > .split-view-container {
|
|
729
806
|
padding-bottom: 0;
|
|
730
807
|
margin-left: 260px;
|
|
731
808
|
min-width: 0;
|
package/lib/module/types.js
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Presentations that behave like modals (overlay on top of content).
|
|
5
|
+
*/
|
|
6
|
+
export const MODAL_LIKE_PRESENTATIONS = new Set(['modal', 'modalRight', 'transparentModal', 'containedModal', 'containedTransparentModal', 'fullScreenModal', 'formSheet', 'pageSheet', 'sheet']);
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Check if a presentation type is modal-like (renders as overlay).
|
|
10
|
+
*/
|
|
11
|
+
export function isModalLikePresentation(presentation) {
|
|
12
|
+
return presentation !== undefined && MODAL_LIKE_PRESENTATIONS.has(presentation);
|
|
13
|
+
}
|
|
@@ -4,6 +4,14 @@ interface NavigationProps {
|
|
|
4
4
|
router: Router;
|
|
5
5
|
appearance?: NavigationAppearance;
|
|
6
6
|
}
|
|
7
|
+
/**
|
|
8
|
+
* Navigation component renders the root and global stacks.
|
|
9
|
+
*
|
|
10
|
+
* Modal stacks (NavigationStack added via addModal) are rendered as regular ScreenStackItems
|
|
11
|
+
* with their component being the StackRenderer that subscribes to its own stack history.
|
|
12
|
+
* This creates a clean recursive structure: stacks render their items, nested stacks
|
|
13
|
+
* (via childNode) render their own items through StackRenderer.
|
|
14
|
+
*/
|
|
7
15
|
export declare const Navigation: import("react").NamedExoticComponent<NavigationProps>;
|
|
8
16
|
export {};
|
|
9
17
|
//# sourceMappingURL=Navigation.d.ts.map
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ScreenOptions } from './types';
|
|
2
|
+
import React from 'react';
|
|
2
3
|
import { type MixedComponent } from './createController';
|
|
3
4
|
import type { NavigationNode, NodeRoute, NodeChild } from './navigationNode';
|
|
4
5
|
type BuiltRoute = NodeRoute;
|
|
@@ -17,8 +18,8 @@ export declare class NavigationStack implements NavigationNode {
|
|
|
17
18
|
private log;
|
|
18
19
|
getId(): string;
|
|
19
20
|
addScreen(pathPattern: string, mixedComponent: MixedComponent | NavigationNode, options?: ScreenOptions): NavigationStack;
|
|
20
|
-
addModal(path: string, mixedComponent: MixedComponent, options?: ScreenOptions): NavigationStack;
|
|
21
|
-
addSheet(path: string, mixedComponent: MixedComponent, options?: ScreenOptions): NavigationStack;
|
|
21
|
+
addModal(path: string, mixedComponent: MixedComponent | NavigationNode, options?: ScreenOptions): NavigationStack;
|
|
22
|
+
addSheet(path: string, mixedComponent: MixedComponent | NavigationNode, options?: ScreenOptions): NavigationStack;
|
|
22
23
|
addStack(prefixOrStack: string | NavigationStack, maybeStack?: NavigationStack): NavigationStack;
|
|
23
24
|
getChildren(): ChildNode[];
|
|
24
25
|
getRoutes(): BuiltRoute[];
|
|
@@ -34,6 +34,7 @@ export declare class Router {
|
|
|
34
34
|
private suppressHistorySyncCount;
|
|
35
35
|
private navigationToken;
|
|
36
36
|
constructor(config: RouterConfig);
|
|
37
|
+
isDebugEnabled(): boolean;
|
|
37
38
|
private log;
|
|
38
39
|
navigate: (path: string) => void;
|
|
39
40
|
replace: (path: string, dedupe?: boolean) => void;
|
|
@@ -48,12 +49,22 @@ export declare class Router {
|
|
|
48
49
|
registerSheetDismisser: (key: string, dismisser: () => void) => void;
|
|
49
50
|
unregisterSheetDismisser: (key: string) => void;
|
|
50
51
|
goBack: () => void;
|
|
52
|
+
/**
|
|
53
|
+
* Closes the nearest modal or sheet, regardless of navigation depth inside it.
|
|
54
|
+
* Useful when a NavigationStack is rendered inside a modal and you want to
|
|
55
|
+
* close the entire modal from any screen within it.
|
|
56
|
+
*/
|
|
57
|
+
dismiss: () => void;
|
|
51
58
|
getState: () => RouterState;
|
|
52
59
|
subscribe(listener: Listener): () => void;
|
|
53
60
|
getStackHistory: (stackId?: string) => HistoryItem[];
|
|
61
|
+
/**
|
|
62
|
+
* Returns all history items in navigation order.
|
|
63
|
+
* Useful for rendering all screens including modal stacks.
|
|
64
|
+
*/
|
|
65
|
+
getFullHistory: () => HistoryItem[];
|
|
54
66
|
subscribeStack: (stackId: string, cb: Listener) => (() => void);
|
|
55
67
|
getRootStackId(): string | undefined;
|
|
56
|
-
getGlobalStackId(): string | undefined;
|
|
57
68
|
subscribeRoot(listener: Listener): () => void;
|
|
58
69
|
private emitRootChange;
|
|
59
70
|
getRootTransition(): RootTransition | undefined;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ScreenStackItemPhase } from '../ScreenStackItem/ScreenStackItem.types';
|
|
2
2
|
import type { TransitionStatus } from 'react-transition-state';
|
|
3
|
-
export type PresentationTypeClass = 'push' | 'modal' | 'transparent-modal' | 'contained-modal' | 'contained-transparent-modal' | 'fullscreen-modal' | 'formsheet' | 'pagesheet' | 'sheet';
|
|
4
|
-
export type AnimationType = 'push-enter' | 'push-exit' | 'push-background' | 'pop-enter' | 'pop-exit' | 'pop-background' | 'modal-enter' | 'modal-exit' | 'transparent-modal-enter' | 'transparent-modal-exit' | 'contained-modal-enter' | 'contained-modal-exit' | 'fullscreen-modal-enter' | 'fullscreen-modal-exit' | 'formsheet-enter' | 'formsheet-exit' | 'pagesheet-enter' | 'pagesheet-exit' | 'sheet-enter' | 'sheet-exit' | 'no-animate' | 'none';
|
|
3
|
+
export type PresentationTypeClass = 'push' | 'modal' | 'modal-right' | 'transparent-modal' | 'contained-modal' | 'contained-transparent-modal' | 'fullscreen-modal' | 'formsheet' | 'pagesheet' | 'sheet';
|
|
4
|
+
export type AnimationType = 'push-enter' | 'push-exit' | 'push-background' | 'pop-enter' | 'pop-exit' | 'pop-background' | 'modal-enter' | 'modal-exit' | 'modal-right-enter' | 'modal-right-exit' | 'transparent-modal-enter' | 'transparent-modal-exit' | 'contained-modal-enter' | 'contained-modal-exit' | 'fullscreen-modal-enter' | 'fullscreen-modal-exit' | 'formsheet-enter' | 'formsheet-exit' | 'pagesheet-enter' | 'pagesheet-exit' | 'sheet-enter' | 'sheet-exit' | 'no-animate' | 'none';
|
|
5
5
|
export type ScreenStackItemState = {
|
|
6
6
|
presentationType: PresentationTypeClass;
|
|
7
7
|
animationType: AnimationType;
|
|
@@ -4,5 +4,12 @@ export interface RenderSplitViewProps {
|
|
|
4
4
|
splitView: SplitView;
|
|
5
5
|
appearance?: NavigationAppearance;
|
|
6
6
|
}
|
|
7
|
+
/**
|
|
8
|
+
* On native (iPhone), SplitView renders primary and secondary screens
|
|
9
|
+
* in a SINGLE ScreenStack to get native push/pop animations.
|
|
10
|
+
*
|
|
11
|
+
* The combined history is: [...primaryHistory, ...secondaryHistory]
|
|
12
|
+
* This way, navigating from primary to secondary is a native push.
|
|
13
|
+
*/
|
|
7
14
|
export declare const RenderSplitView: import("react").NamedExoticComponent<RenderSplitViewProps>;
|
|
8
15
|
//# sourceMappingURL=RenderSplitView.native.d.ts.map
|
|
@@ -17,6 +17,11 @@ export type InternalTabItem = Omit<TabItem, 'icon' | 'selectedIcon'> & {
|
|
|
17
17
|
icon?: ExtendedIcon;
|
|
18
18
|
selectedIcon?: ExtendedIcon;
|
|
19
19
|
badgeValue?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Optional base prefix for this tab's navigation subtree, e.g. '/mail'.
|
|
22
|
+
* Used by Router registry building via TabBar.getNodeChildren().
|
|
23
|
+
*/
|
|
24
|
+
tabPrefix?: string;
|
|
20
25
|
};
|
|
21
26
|
export type TabBarProps = {
|
|
22
27
|
onTabPress: (index: number) => void;
|
|
@@ -27,8 +32,25 @@ export type TabBarDescriptor = {
|
|
|
27
32
|
renderer?: ComponentType<TabBarProps>;
|
|
28
33
|
};
|
|
29
34
|
type TabBarConfig = Omit<InternalTabItem, 'tabKey' | 'key'> & {
|
|
35
|
+
/**
|
|
36
|
+
* Legacy content type: a stack rendered in the tab.
|
|
37
|
+
*/
|
|
30
38
|
stack?: NavigationStack;
|
|
39
|
+
/**
|
|
40
|
+
* New content type: any NavigationNode (e.g. SplitView).
|
|
41
|
+
*/
|
|
42
|
+
node?: NavigationNode;
|
|
43
|
+
/**
|
|
44
|
+
* Screen component rendered in the tab (no routing).
|
|
45
|
+
*/
|
|
31
46
|
screen?: React.ComponentType<any>;
|
|
47
|
+
/**
|
|
48
|
+
* Optional base prefix for node/stack routes, e.g. '/mail'.
|
|
49
|
+
*/
|
|
50
|
+
prefix?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Custom tab bar component (UI). Kept for compatibility.
|
|
53
|
+
*/
|
|
32
54
|
component?: ComponentType<TabBarProps>;
|
|
33
55
|
};
|
|
34
56
|
type TabBarOptions = {
|
|
@@ -40,6 +62,7 @@ export declare class TabBar implements NavigationNode {
|
|
|
40
62
|
private readonly tabBarId;
|
|
41
63
|
screens: Record<string, React.ComponentType<any>>;
|
|
42
64
|
stacks: Record<string, NavigationStack>;
|
|
65
|
+
nodes: Record<string, NavigationNode>;
|
|
43
66
|
private listeners;
|
|
44
67
|
private state;
|
|
45
68
|
constructor(options?: TabBarOptions);
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import type { ColorValue, StyleProp, ViewStyle, TextStyle } from 'react-native';
|
|
2
2
|
import type { BottomTabsScreenProps, ScreenProps as RNSScreenProps, ScreenStackHeaderConfigProps, TabBarItemLabelVisibilityMode, TabBarMinimizeBehavior } from 'react-native-screens';
|
|
3
|
-
export type StackPresentationTypes = 'push' | 'modal' | 'transparentModal' | 'containedModal' | 'containedTransparentModal' | 'fullScreenModal' | 'formSheet' | 'pageSheet' | 'sheet';
|
|
3
|
+
export type StackPresentationTypes = 'push' | 'modal' | 'modalRight' | 'transparentModal' | 'containedModal' | 'containedTransparentModal' | 'fullScreenModal' | 'formSheet' | 'pageSheet' | 'sheet';
|
|
4
|
+
/**
|
|
5
|
+
* Presentations that behave like modals (overlay on top of content).
|
|
6
|
+
*/
|
|
7
|
+
export declare const MODAL_LIKE_PRESENTATIONS: ReadonlySet<StackPresentationTypes>;
|
|
8
|
+
/**
|
|
9
|
+
* Check if a presentation type is modal-like (renders as overlay).
|
|
10
|
+
*/
|
|
11
|
+
export declare function isModalLikePresentation(presentation: StackPresentationTypes | undefined): boolean;
|
|
4
12
|
export type TabItem = Omit<BottomTabsScreenProps, 'isFocused' | 'children'>;
|
|
5
13
|
export type NavigationState<Route extends TabItem> = {
|
|
6
14
|
index: number;
|
|
@@ -29,6 +37,11 @@ export type ScreenOptions = Partial<Omit<RNSScreenProps, 'stackPresentation'>> &
|
|
|
29
37
|
* Useful for secondary stacks in split-view / overlays.
|
|
30
38
|
*/
|
|
31
39
|
allowRootPop?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Maximum width for modal presentation on web (in pixels).
|
|
42
|
+
* Only applies to modal-like presentations on web platform.
|
|
43
|
+
*/
|
|
44
|
+
maxWidth?: number;
|
|
32
45
|
};
|
|
33
46
|
export type HistoryItem = {
|
|
34
47
|
key: string;
|