@gtkx/navigation 2.0.0-beta.1 → 2.0.0-beta.11

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.
Files changed (52) hide show
  1. package/README.md +8 -165
  2. package/dist/drawer/create-drawer-navigator.d.ts.map +1 -1
  3. package/dist/drawer/create-drawer-navigator.js +2 -2
  4. package/dist/drawer/create-drawer-navigator.js.map +1 -1
  5. package/dist/drawer/drawer-item-list.d.ts.map +1 -1
  6. package/dist/drawer/drawer-item-list.js +3 -2
  7. package/dist/drawer/drawer-item-list.js.map +1 -1
  8. package/dist/drawer/drawer-status.d.ts +2 -2
  9. package/dist/drawer/drawer-status.d.ts.map +1 -1
  10. package/dist/drawer/drawer-status.js +1 -9
  11. package/dist/drawer/drawer-status.js.map +1 -1
  12. package/dist/drawer/drawer-view.d.ts.map +1 -1
  13. package/dist/drawer/drawer-view.js +4 -8
  14. package/dist/drawer/drawer-view.js.map +1 -1
  15. package/dist/shared/scene-page.d.ts.map +1 -1
  16. package/dist/shared/scene-page.js +8 -1
  17. package/dist/shared/scene-page.js.map +1 -1
  18. package/dist/split-view/create-split-view-navigator.d.ts.map +1 -1
  19. package/dist/split-view/create-split-view-navigator.js +2 -2
  20. package/dist/split-view/create-split-view-navigator.js.map +1 -1
  21. package/dist/stack/create-stack-navigator.d.ts.map +1 -1
  22. package/dist/stack/create-stack-navigator.js +2 -2
  23. package/dist/stack/create-stack-navigator.js.map +1 -1
  24. package/dist/stack/stack-pages.d.ts.map +1 -1
  25. package/dist/stack/stack-pages.js +1 -9
  26. package/dist/stack/stack-pages.js.map +1 -1
  27. package/dist/stack/stack-view.d.ts.map +1 -1
  28. package/dist/stack/stack-view.js +1 -10
  29. package/dist/stack/stack-view.js.map +1 -1
  30. package/dist/tabs/create-tab-navigator.d.ts.map +1 -1
  31. package/dist/tabs/create-tab-navigator.js +2 -2
  32. package/dist/tabs/create-tab-navigator.js.map +1 -1
  33. package/dist/tabs/tab-view.d.ts.map +1 -1
  34. package/dist/tabs/tab-view.js +1 -3
  35. package/dist/tabs/tab-view.js.map +1 -1
  36. package/package.json +12 -9
  37. package/src/drawer/create-drawer-navigator.tsx +14 -16
  38. package/src/drawer/drawer-item-list.tsx +8 -5
  39. package/src/drawer/drawer-status.ts +3 -16
  40. package/src/drawer/drawer-view.tsx +4 -9
  41. package/src/shared/scene-page.tsx +21 -12
  42. package/src/split-view/create-split-view-navigator.tsx +15 -17
  43. package/src/stack/create-stack-navigator.tsx +9 -11
  44. package/src/stack/stack-pages.ts +1 -13
  45. package/src/stack/stack-view.tsx +1 -15
  46. package/src/tabs/create-tab-navigator.tsx +3 -5
  47. package/src/tabs/tab-view.tsx +1 -3
  48. package/dist/shared/use-loaded-routes.d.ts +0 -3
  49. package/dist/shared/use-loaded-routes.d.ts.map +0 -1
  50. package/dist/shared/use-loaded-routes.js +0 -11
  51. package/dist/shared/use-loaded-routes.js.map +0 -1
  52. package/src/shared/use-loaded-routes.ts +0 -14
@@ -9,14 +9,6 @@ const neededKeys = (state, closing, offset) => [
9
9
  ...Object.keys(closing),
10
10
  ];
11
11
  const hasSameMembers = (left, right) => left.length === right.length && left.every((key) => right.includes(key));
12
- const hasRefreshedFocus = (tracking, descriptors) => {
13
- const { focusedKey } = tracking;
14
- if (focusedKey === undefined) {
15
- return false;
16
- }
17
- const next = descriptors[focusedKey];
18
- return next !== undefined && tracking.descriptors[focusedKey]?.route !== next.route;
19
- };
20
12
  const appendOrder = (previous, needed) => [
21
13
  ...previous.filter((key) => needed.includes(key)),
22
14
  ...needed.filter((key) => !previous.includes(key)),
@@ -58,7 +50,7 @@ const useStackPages = (state, descriptors, describe, offset) => {
58
50
  const [tracking, setTracking] = useState(() => initialTracking(state, descriptors, offset));
59
51
  if (!hasSameMembers(tracking.order, neededKeys(state, tracking.closing, offset)) ||
60
52
  tracking.focusedKey !== getFocusedKey(state, offset) ||
61
- hasRefreshedFocus(tracking, descriptors)) {
53
+ tracking.descriptors !== descriptors) {
62
54
  setTracking(advance(tracking, state, descriptors, offset));
63
55
  }
64
56
  const release = useCallback((key) => {
@@ -1 +1 @@
1
- {"version":3,"file":"stack-pages.js","sourceRoot":"","sources":["../../src/stack/stack-pages.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ParamListBase, RouteProp, StackNavigationState } from \"@react-navigation/core\";\nimport { useCallback, useState } from \"react\";\nimport type { StackDescriptor, StackDescriptorMap } from \"./types.js\";\n\ntype StackState = StackNavigationState<ParamListBase>;\ntype Describe = (route: RouteProp<ParamListBase>, isPlaceholder: boolean) => StackDescriptor;\n\ntype PageTracking = {\n order: readonly string[];\n focusedKey: string | undefined;\n descriptors: StackDescriptorMap;\n closing: StackDescriptorMap;\n};\n\ntype StackPages = {\n pages: readonly StackDescriptor[];\n release: (key: string) => void;\n};\n\nconst getFocusedKey = (state: StackState, offset: number): string | undefined =>\n state.index < offset ? undefined : state.routes[state.index]?.key;\n\nconst mountedKeys = (state: StackState, offset: number): string[] => [\n ...state.routes.slice(offset).map((route) => route.key),\n ...state.preloadedRoutes.map((route) => route.key),\n];\n\nconst neededKeys = (state: StackState, closing: StackDescriptorMap, offset: number): string[] => [\n ...mountedKeys(state, offset),\n ...Object.keys(closing),\n];\n\nconst hasSameMembers = (left: readonly string[], right: readonly string[]): boolean =>\n left.length === right.length && left.every((key) => right.includes(key));\n\nconst hasRefreshedFocus = (tracking: PageTracking, descriptors: StackDescriptorMap): boolean => {\n const { focusedKey } = tracking;\n\n if (focusedKey === undefined) {\n return false;\n }\n\n const next = descriptors[focusedKey];\n\n return next !== undefined && tracking.descriptors[focusedKey]?.route !== next.route;\n};\n\nconst appendOrder = (previous: readonly string[], needed: readonly string[]): string[] => [\n ...previous.filter((key) => needed.includes(key)),\n ...needed.filter((key) => !previous.includes(key)),\n];\n\nconst withoutKeys = (map: StackDescriptorMap, keys: readonly string[]): StackDescriptorMap =>\n Object.fromEntries(Object.entries(map).filter(([key]) => !keys.includes(key)));\n\nconst nextClosing = (tracking: PageTracking, state: StackState, offset: number): StackDescriptorMap => {\n const mounted = mountedKeys(state, offset);\n const kept = withoutKeys(tracking.closing, mounted);\n const { focusedKey } = tracking;\n\n if (focusedKey === undefined || mounted.includes(focusedKey)) {\n return kept;\n }\n\n const descriptor = tracking.descriptors[focusedKey];\n\n return descriptor === undefined ? kept : { ...kept, [focusedKey]: descriptor };\n};\n\nconst advance = (\n tracking: PageTracking,\n state: StackState,\n descriptors: StackDescriptorMap,\n offset: number,\n): PageTracking => {\n const closing = nextClosing(tracking, state, offset);\n\n return {\n order: appendOrder(tracking.order, neededKeys(state, closing, offset)),\n focusedKey: getFocusedKey(state, offset),\n descriptors,\n closing,\n };\n};\n\nconst initialTracking = (state: StackState, descriptors: StackDescriptorMap, offset: number): PageTracking => ({\n order: neededKeys(state, {}, offset),\n focusedKey: getFocusedKey(state, offset),\n descriptors,\n closing: {},\n});\n\nconst resolvePage = (\n key: string,\n sources: { state: StackState; descriptors: StackDescriptorMap; closing: StackDescriptorMap },\n describe: Describe,\n): StackDescriptor | undefined => {\n const preloaded = sources.state.preloadedRoutes.find((route) => route.key === key);\n\n if (preloaded !== undefined) {\n return describe(preloaded, true);\n }\n\n return sources.descriptors[key] ?? sources.closing[key];\n};\n\nconst useStackPages = (\n state: StackState,\n descriptors: StackDescriptorMap,\n describe: Describe,\n offset: number,\n): StackPages => {\n const [tracking, setTracking] = useState<PageTracking>(() => initialTracking(state, descriptors, offset));\n\n if (!hasSameMembers(tracking.order, neededKeys(state, tracking.closing, offset)) ||\n tracking.focusedKey !== getFocusedKey(state, offset) ||\n hasRefreshedFocus(tracking, descriptors)) {\n setTracking(advance(tracking, state, descriptors, offset));\n }\n\n const release = useCallback((key: string) => {\n setTracking((current) => (current.closing[key] === undefined\n ? current\n : {\n ...current,\n order: current.order.filter((entry) => entry !== key),\n closing: withoutKeys(current.closing, [key]),\n }));\n }, []);\n\n const sources = { state, descriptors, closing: tracking.closing };\n\n const pages = tracking.order\n .map((key) => resolvePage(key, sources, describe))\n .filter((page) => page !== undefined);\n\n return { pages, release };\n};\n\nexport { type Describe, useStackPages };\n"]}
1
+ {"version":3,"file":"stack-pages.js","sourceRoot":"","sources":["../../src/stack/stack-pages.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ParamListBase, RouteProp, StackNavigationState } from \"@react-navigation/core\";\nimport { useCallback, useState } from \"react\";\nimport type { StackDescriptor, StackDescriptorMap } from \"./types.js\";\n\ntype StackState = StackNavigationState<ParamListBase>;\ntype Describe = (route: RouteProp<ParamListBase>, isPlaceholder: boolean) => StackDescriptor;\n\ntype PageTracking = {\n order: readonly string[];\n focusedKey: string | undefined;\n descriptors: StackDescriptorMap;\n closing: StackDescriptorMap;\n};\n\ntype StackPages = {\n pages: readonly StackDescriptor[];\n release: (key: string) => void;\n};\n\nconst getFocusedKey = (state: StackState, offset: number): string | undefined =>\n state.index < offset ? undefined : state.routes[state.index]?.key;\n\nconst mountedKeys = (state: StackState, offset: number): string[] => [\n ...state.routes.slice(offset).map((route) => route.key),\n ...state.preloadedRoutes.map((route) => route.key),\n];\n\nconst neededKeys = (state: StackState, closing: StackDescriptorMap, offset: number): string[] => [\n ...mountedKeys(state, offset),\n ...Object.keys(closing),\n];\n\nconst hasSameMembers = (left: readonly string[], right: readonly string[]): boolean =>\n left.length === right.length && left.every((key) => right.includes(key));\n\nconst appendOrder = (previous: readonly string[], needed: readonly string[]): string[] => [\n ...previous.filter((key) => needed.includes(key)),\n ...needed.filter((key) => !previous.includes(key)),\n];\n\nconst withoutKeys = (map: StackDescriptorMap, keys: readonly string[]): StackDescriptorMap =>\n Object.fromEntries(Object.entries(map).filter(([key]) => !keys.includes(key)));\n\nconst nextClosing = (tracking: PageTracking, state: StackState, offset: number): StackDescriptorMap => {\n const mounted = mountedKeys(state, offset);\n const kept = withoutKeys(tracking.closing, mounted);\n const { focusedKey } = tracking;\n\n if (focusedKey === undefined || mounted.includes(focusedKey)) {\n return kept;\n }\n\n const descriptor = tracking.descriptors[focusedKey];\n\n return descriptor === undefined ? kept : { ...kept, [focusedKey]: descriptor };\n};\n\nconst advance = (\n tracking: PageTracking,\n state: StackState,\n descriptors: StackDescriptorMap,\n offset: number,\n): PageTracking => {\n const closing = nextClosing(tracking, state, offset);\n\n return {\n order: appendOrder(tracking.order, neededKeys(state, closing, offset)),\n focusedKey: getFocusedKey(state, offset),\n descriptors,\n closing,\n };\n};\n\nconst initialTracking = (state: StackState, descriptors: StackDescriptorMap, offset: number): PageTracking => ({\n order: neededKeys(state, {}, offset),\n focusedKey: getFocusedKey(state, offset),\n descriptors,\n closing: {},\n});\n\nconst resolvePage = (\n key: string,\n sources: { state: StackState; descriptors: StackDescriptorMap; closing: StackDescriptorMap },\n describe: Describe,\n): StackDescriptor | undefined => {\n const preloaded = sources.state.preloadedRoutes.find((route) => route.key === key);\n\n if (preloaded !== undefined) {\n return describe(preloaded, true);\n }\n\n return sources.descriptors[key] ?? sources.closing[key];\n};\n\nconst useStackPages = (\n state: StackState,\n descriptors: StackDescriptorMap,\n describe: Describe,\n offset: number,\n): StackPages => {\n const [tracking, setTracking] = useState<PageTracking>(() => initialTracking(state, descriptors, offset));\n\n if (!hasSameMembers(tracking.order, neededKeys(state, tracking.closing, offset)) ||\n tracking.focusedKey !== getFocusedKey(state, offset) ||\n tracking.descriptors !== descriptors) {\n setTracking(advance(tracking, state, descriptors, offset));\n }\n\n const release = useCallback((key: string) => {\n setTracking((current) => (current.closing[key] === undefined\n ? current\n : {\n ...current,\n order: current.order.filter((entry) => entry !== key),\n closing: withoutKeys(current.closing, [key]),\n }));\n }, []);\n\n const sources = { state, descriptors, closing: tracking.closing };\n\n const pages = tracking.order\n .map((key) => resolvePage(key, sources, describe))\n .filter((page) => page !== undefined);\n\n return { pages, release };\n};\n\nexport { type Describe, useStackPages };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"stack-view.d.ts","sourceRoot":"","sources":["../../src/stack/stack-view.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,OAAO,CAAC;AAGlD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAER,kBAAkB,EAClB,qBAAqB,EAErB,sBAAsB,EAEzB,MAAM,YAAY,CAAC;AAQpB,KAAK,cAAc,GAAG,qBAAqB,GAAG;IAC1C,KAAK,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAC3C,UAAU,EAAE,sBAAsB,CAAC;IACnC,WAAW,EAAE,kBAAkB,CAAC;IAChC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAsJF,QAAA,MAAM,SAAS,GAAI,OAAO,cAAc,KAAG,SAqB1C,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"stack-view.d.ts","sourceRoot":"","sources":["../../src/stack/stack-view.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,OAAO,CAAC;AAGlD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAER,kBAAkB,EAClB,qBAAqB,EAErB,sBAAsB,EACzB,MAAM,YAAY,CAAC;AAOpB,KAAK,cAAc,GAAG,qBAAqB,GAAG;IAC1C,KAAK,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAC3C,UAAU,EAAE,sBAAsB,CAAC;IACnC,WAAW,EAAE,kBAAkB,CAAC;IAChC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AA0IF,QAAA,MAAM,SAAS,GAAI,OAAO,cAAc,KAAG,SAqB1C,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -16,15 +16,6 @@ const useLatest = (value) => {
16
16
  }, [value]);
17
17
  return ref;
18
18
  };
19
- const useTrackedOptions = (descriptors) => {
20
- const optionsRef = useRef({});
21
- useEffect(() => {
22
- for (const [key, descriptor] of Object.entries(descriptors)) {
23
- optionsRef.current[key] = descriptor.options;
24
- }
25
- }, [descriptors]);
26
- return optionsRef;
27
- };
28
19
  const useStackSync = (viewRef, state, options, offset) => {
29
20
  const isInitialRef = useRef(true);
30
21
  useEffect(() => {
@@ -91,8 +82,8 @@ const StackPage = ({ descriptor, previous, navigation, onHidden }) => {
91
82
  const StackView = (props) => {
92
83
  const { state, navigation, descriptors, describe, popOnEscape, offset = 0 } = props;
93
84
  const viewRef = useRef(null);
94
- const options = useTrackedOptions(descriptors);
95
85
  const { pages, release } = useStackPages(state, descriptors, describe, offset);
86
+ const options = useLatest(Object.fromEntries(pages.map((page) => [page.route.key, page.options])));
96
87
  const onPopped = usePoppedHandler(viewRef, navigation, options, offset);
97
88
  useStackSync(viewRef, state, options, offset);
98
89
  return (_jsx(AdwNavigationView, { ref: viewRef, popOnEscape: popOnEscape ?? true, onPopped: onPopped, children: pages.map((descriptor) => (_jsx(StackPage, { descriptor: descriptor, previous: previousDescriptor(state, descriptors, descriptor.route.key, offset), navigation: navigation, onHidden: release }, descriptor.route.key))) }));
@@ -1 +1 @@
1
- {"version":3,"file":"stack-view.js","sourceRoot":"","sources":["../../src/stack/stack-view.tsx"],"names":[],"mappings":"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","sourcesContent":["import type * as Adw from \"@gtkx/gi/adw\";\nimport type { ParamListBase, StackNavigationState } from \"@react-navigation/core\";\nimport type { ReactNode, RefObject } from \"react\";\nimport { AdwNavigationPage, AdwNavigationView, AdwToolbarView } from \"@gtkx/jsx/adw\";\nimport { useCallback, useEffect, useRef } from \"react\";\nimport type { Describe } from \"./stack-pages.js\";\nimport type { OptionsByKey } from \"./sync-navigation-stack.js\";\nimport type {\n StackDescriptor,\n StackDescriptorMap,\n StackNavigationConfig,\n StackNavigationEventMap,\n StackNavigationHelpers,\n StackNavigationOptions,\n} from \"./types.js\";\nimport { HeaderBar } from \"../shared/header-bar.js\";\nimport { useStackPages } from \"./stack-pages.js\";\nimport { reconcilePoppedStack, syncNavigationStack } from \"./sync-navigation-stack.js\";\n\ntype ViewRef = RefObject<Adw.NavigationView | null>;\ntype MutableOptions = Record<string, StackNavigationOptions>;\n\ntype StackViewProps = StackNavigationConfig & {\n state: StackNavigationState<ParamListBase>;\n navigation: StackNavigationHelpers;\n descriptors: StackDescriptorMap;\n describe: Describe;\n offset?: number;\n};\n\ntype StackPageProps = {\n descriptor: StackDescriptor;\n previous?: StackDescriptor;\n navigation: StackNavigationHelpers;\n onHidden: (key: string) => void;\n};\n\ntype TransitionEvent = keyof StackNavigationEventMap;\n\nconst previousDescriptor = (\n state: StackNavigationState<ParamListBase>,\n descriptors: StackDescriptorMap,\n key: string,\n offset: number,\n): StackDescriptor | undefined => {\n const index = state.routes.findIndex((route) => route.key === key);\n const previousKey = index > offset ? state.routes[index - 1]?.key : undefined;\n\n return previousKey === undefined ? undefined : descriptors[previousKey];\n};\n\nconst useLatest = <T,>(value: T): RefObject<T> => {\n const ref = useRef(value);\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref;\n};\n\nconst useTrackedOptions = (descriptors: StackDescriptorMap): RefObject<MutableOptions> => {\n const optionsRef = useRef<MutableOptions>({});\n\n useEffect(() => {\n for (const [key, descriptor] of Object.entries(descriptors)) {\n optionsRef.current[key] = descriptor.options;\n }\n }, [descriptors]);\n\n return optionsRef;\n};\n\nconst useStackSync = (\n viewRef: ViewRef,\n state: StackNavigationState<ParamListBase>,\n options: RefObject<OptionsByKey>,\n offset: number,\n): void => {\n const isInitialRef = useRef(true);\n\n useEffect(() => {\n const view = viewRef.current;\n\n if (view === null) {\n return;\n }\n\n const desired = state.routes.slice(offset).map((route) => route.key);\n syncNavigationStack(view, desired, options.current, isInitialRef.current);\n isInitialRef.current = false;\n }, [viewRef, state, options, offset]);\n};\n\nconst usePoppedHandler = (\n viewRef: ViewRef,\n navigation: StackNavigationHelpers,\n options: RefObject<OptionsByKey>,\n offset: number,\n): (() => void) => {\n const navigationRef = useLatest(navigation);\n const isScheduledRef = useRef(false);\n\n return useCallback(() => {\n if (isScheduledRef.current) {\n return;\n }\n\n isScheduledRef.current = true;\n\n queueMicrotask(() => {\n isScheduledRef.current = false;\n const view = viewRef.current;\n\n if (view !== null) {\n reconcilePoppedStack(view, navigationRef.current, options.current, offset);\n }\n });\n }, [viewRef, navigationRef, options, offset]);\n};\n\nconst StackPageContent = ({ descriptor, previous }: Omit<StackPageProps, \"navigation\" | \"onHidden\">): ReactNode => {\n const { route, options, navigation } = descriptor;\n\n if (options.headerShown === false) {\n return descriptor.render();\n }\n\n const back = previous === undefined ? undefined : { title: previous.options.title ?? previous.route.name };\n\n const topBar = options.header === undefined\n ? <HeaderBar options={options} showBackButton={options.headerBackVisible ?? true} />\n : <>{options.header({ route, navigation, options, back })}</>;\n\n return <AdwToolbarView topBar={topBar}>{descriptor.render()}</AdwToolbarView>;\n};\n\nconst StackPage = ({ descriptor, previous, navigation, onHidden }: StackPageProps): ReactNode => {\n const { route, options } = descriptor;\n const pageRef = useRef<Adw.NavigationPage | null>(null);\n\n const emit = (type: TransitionEvent, isClosing: boolean): void => {\n navigation.emit({ type, data: { closing: isClosing }, target: route.key });\n };\n\n useEffect(() => {\n const page = pageRef.current;\n\n if (page !== null && !page.getMapped()) {\n onHidden(route.key);\n }\n });\n\n return (\n <AdwNavigationPage\n ref={pageRef}\n tag={route.key}\n title={options.title ?? route.name}\n canPop={options.canPop ?? true}\n onShowing={() => {\n emit(\"transitionStart\", false);\n }}\n onHiding={() => {\n emit(\"transitionStart\", true);\n }}\n onShown={() => {\n emit(\"transitionEnd\", false);\n }}\n onHidden={() => {\n emit(\"transitionEnd\", true);\n onHidden(route.key);\n }}\n >\n <StackPageContent descriptor={descriptor} previous={previous} />\n </AdwNavigationPage>\n );\n};\n\nconst StackView = (props: StackViewProps): ReactNode => {\n const { state, navigation, descriptors, describe, popOnEscape, offset = 0 } = props;\n const viewRef = useRef<Adw.NavigationView | null>(null);\n const options = useTrackedOptions(descriptors);\n const { pages, release } = useStackPages(state, descriptors, describe, offset);\n const onPopped = usePoppedHandler(viewRef, navigation, options, offset);\n useStackSync(viewRef, state, options, offset);\n\n return (\n <AdwNavigationView ref={viewRef} popOnEscape={popOnEscape ?? true} onPopped={onPopped}>\n {pages.map((descriptor) => (\n <StackPage\n key={descriptor.route.key}\n descriptor={descriptor}\n previous={previousDescriptor(state, descriptors, descriptor.route.key, offset)}\n navigation={navigation}\n onHidden={release}\n />\n ))}\n </AdwNavigationView>\n );\n};\n\nexport { StackView };\n"]}
1
+ {"version":3,"file":"stack-view.js","sourceRoot":"","sources":["../../src/stack/stack-view.tsx"],"names":[],"mappings":"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","sourcesContent":["import type * as Adw from \"@gtkx/gi/adw\";\nimport type { ParamListBase, StackNavigationState } from \"@react-navigation/core\";\nimport type { ReactNode, RefObject } from \"react\";\nimport { AdwNavigationPage, AdwNavigationView, AdwToolbarView } from \"@gtkx/jsx/adw\";\nimport { useCallback, useEffect, useRef } from \"react\";\nimport type { Describe } from \"./stack-pages.js\";\nimport type { OptionsByKey } from \"./sync-navigation-stack.js\";\nimport type {\n StackDescriptor,\n StackDescriptorMap,\n StackNavigationConfig,\n StackNavigationEventMap,\n StackNavigationHelpers,\n} from \"./types.js\";\nimport { HeaderBar } from \"../shared/header-bar.js\";\nimport { useStackPages } from \"./stack-pages.js\";\nimport { reconcilePoppedStack, syncNavigationStack } from \"./sync-navigation-stack.js\";\n\ntype ViewRef = RefObject<Adw.NavigationView | null>;\n\ntype StackViewProps = StackNavigationConfig & {\n state: StackNavigationState<ParamListBase>;\n navigation: StackNavigationHelpers;\n descriptors: StackDescriptorMap;\n describe: Describe;\n offset?: number;\n};\n\ntype StackPageProps = {\n descriptor: StackDescriptor;\n previous?: StackDescriptor;\n navigation: StackNavigationHelpers;\n onHidden: (key: string) => void;\n};\n\ntype TransitionEvent = keyof StackNavigationEventMap;\n\nconst previousDescriptor = (\n state: StackNavigationState<ParamListBase>,\n descriptors: StackDescriptorMap,\n key: string,\n offset: number,\n): StackDescriptor | undefined => {\n const index = state.routes.findIndex((route) => route.key === key);\n const previousKey = index > offset ? state.routes[index - 1]?.key : undefined;\n\n return previousKey === undefined ? undefined : descriptors[previousKey];\n};\n\nconst useLatest = <T,>(value: T): RefObject<T> => {\n const ref = useRef(value);\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref;\n};\n\nconst useStackSync = (\n viewRef: ViewRef,\n state: StackNavigationState<ParamListBase>,\n options: RefObject<OptionsByKey>,\n offset: number,\n): void => {\n const isInitialRef = useRef(true);\n\n useEffect(() => {\n const view = viewRef.current;\n\n if (view === null) {\n return;\n }\n\n const desired = state.routes.slice(offset).map((route) => route.key);\n syncNavigationStack(view, desired, options.current, isInitialRef.current);\n isInitialRef.current = false;\n }, [viewRef, state, options, offset]);\n};\n\nconst usePoppedHandler = (\n viewRef: ViewRef,\n navigation: StackNavigationHelpers,\n options: RefObject<OptionsByKey>,\n offset: number,\n): (() => void) => {\n const navigationRef = useLatest(navigation);\n const isScheduledRef = useRef(false);\n\n return useCallback(() => {\n if (isScheduledRef.current) {\n return;\n }\n\n isScheduledRef.current = true;\n\n queueMicrotask(() => {\n isScheduledRef.current = false;\n const view = viewRef.current;\n\n if (view !== null) {\n reconcilePoppedStack(view, navigationRef.current, options.current, offset);\n }\n });\n }, [viewRef, navigationRef, options, offset]);\n};\n\nconst StackPageContent = ({ descriptor, previous }: Omit<StackPageProps, \"navigation\" | \"onHidden\">): ReactNode => {\n const { route, options, navigation } = descriptor;\n\n if (options.headerShown === false) {\n return descriptor.render();\n }\n\n const back = previous === undefined ? undefined : { title: previous.options.title ?? previous.route.name };\n\n const topBar = options.header === undefined\n ? <HeaderBar options={options} showBackButton={options.headerBackVisible ?? true} />\n : <>{options.header({ route, navigation, options, back })}</>;\n\n return <AdwToolbarView topBar={topBar}>{descriptor.render()}</AdwToolbarView>;\n};\n\nconst StackPage = ({ descriptor, previous, navigation, onHidden }: StackPageProps): ReactNode => {\n const { route, options } = descriptor;\n const pageRef = useRef<Adw.NavigationPage | null>(null);\n\n const emit = (type: TransitionEvent, isClosing: boolean): void => {\n navigation.emit({ type, data: { closing: isClosing }, target: route.key });\n };\n\n useEffect(() => {\n const page = pageRef.current;\n\n if (page !== null && !page.getMapped()) {\n onHidden(route.key);\n }\n });\n\n return (\n <AdwNavigationPage\n ref={pageRef}\n tag={route.key}\n title={options.title ?? route.name}\n canPop={options.canPop ?? true}\n onShowing={() => {\n emit(\"transitionStart\", false);\n }}\n onHiding={() => {\n emit(\"transitionStart\", true);\n }}\n onShown={() => {\n emit(\"transitionEnd\", false);\n }}\n onHidden={() => {\n emit(\"transitionEnd\", true);\n onHidden(route.key);\n }}\n >\n <StackPageContent descriptor={descriptor} previous={previous} />\n </AdwNavigationPage>\n );\n};\n\nconst StackView = (props: StackViewProps): ReactNode => {\n const { state, navigation, descriptors, describe, popOnEscape, offset = 0 } = props;\n const viewRef = useRef<Adw.NavigationView | null>(null);\n const { pages, release } = useStackPages(state, descriptors, describe, offset);\n const options = useLatest<OptionsByKey>(Object.fromEntries(pages.map((page) => [page.route.key, page.options])));\n const onPopped = usePoppedHandler(viewRef, navigation, options, offset);\n useStackSync(viewRef, state, options, offset);\n\n return (\n <AdwNavigationView ref={viewRef} popOnEscape={popOnEscape ?? true} onPopped={onPopped}>\n {pages.map((descriptor) => (\n <StackPage\n key={descriptor.route.key}\n descriptor={descriptor}\n previous={previousDescriptor(state, descriptors, descriptor.route.key, offset)}\n navigation={navigation}\n onHidden={release}\n />\n ))}\n </AdwNavigationView>\n );\n};\n\nexport { StackView };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"create-tab-navigator.d.ts","sourceRoot":"","sources":["../../src/tabs/create-tab-navigator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,mBAAmB,EAEnB,kBAAkB,EAElB,cAAc,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGpH,8EAA8E;AAC9E,KAAK,UAAU,CACX,SAAS,SAAS,aAAa,GAAG,aAAa,EAC/C,WAAW,SAAS,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,IAC3D;IACA,oCAAoC;IACpC,SAAS,EAAE,SAAS,CAAC;IACrB,6BAA6B;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,oCAAoC;IACpC,KAAK,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACrC,0BAA0B;IAC1B,aAAa,EAAE,oBAAoB,CAAC;IACpC,kCAAkC;IAClC,QAAQ,EAAE,qBAAqB,CAAC;IAChC,mCAAmC;IACnC,cAAc,EAAE;SACX,SAAS,IAAI,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC;KACvF,CAAC;IACF,+BAA+B;IAC/B,SAAS,EAAE,OAAO,YAAY,CAAC;CAClC,CAAC;AAEF,mFAAmF;AACnF,QAAA,MAAM,eAAe,EAAE,mBAAmB,CAAC,UAAU,CAAqC,CAAC;AAE3F,8GAA8G;AAC9G,iBAAS,YAAY,CAAC,EAAE,cAAc,EAAE,GAAG,OAAO,EAAE,EAAE,iBAAiB,GAAG,SAAS,CAclF;AAED,qFAAqF;AACrF,iBAAS,kBAAkB,CACvB,KAAK,CAAC,SAAS,SAAS,aAAa,EACrC,KAAK,CAAC,WAAW,SAAS,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,EACjE,KAAK,CAAC,OAAO,SAAS,oBAAoB,GAAG,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC,EAC/E,KAAK,CAAC,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,EACpE,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAElD;AAED,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"create-tab-navigator.d.ts","sourceRoot":"","sources":["../../src/tabs/create-tab-navigator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,mBAAmB,EAEnB,kBAAkB,EAElB,cAAc,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGpH,8EAA8E;AAC9E,KAAK,UAAU,CACX,SAAS,SAAS,aAAa,GAAG,aAAa,EAC/C,WAAW,SAAS,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,IAC3D;IACA,oCAAoC;IACpC,SAAS,EAAE,SAAS,CAAC;IACrB,6BAA6B;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,oCAAoC;IACpC,KAAK,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACrC,0BAA0B;IAC1B,aAAa,EAAE,oBAAoB,CAAC;IACpC,kCAAkC;IAClC,QAAQ,EAAE,qBAAqB,CAAC;IAChC,mCAAmC;IACnC,cAAc,EAAE;SACX,SAAS,IAAI,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC;KACvF,CAAC;IACF,+BAA+B;IAC/B,SAAS,EAAE,OAAO,YAAY,CAAC;CAClC,CAAC;AAEF,mFAAmF;AACnF,QAAA,MAAM,eAAe,EAAE,mBAAmB,CAAC,UAAU,CAAqC,CAAC;AAE3F,8GAA8G;AAC9G,iBAAS,YAAY,CAAC,EAAE,cAAc,EAAE,GAAG,OAAO,EAAE,EAAE,iBAAiB,GAAG,SAAS,CAYlF;AAED,qFAAqF;AACrF,iBAAS,kBAAkB,CACvB,KAAK,CAAC,SAAS,SAAS,aAAa,EACrC,KAAK,CAAC,WAAW,SAAS,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,EACjE,KAAK,CAAC,OAAO,SAAS,oBAAoB,GAAG,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC,EAC/E,KAAK,CAAC,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,EACpE,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAElD;AAED,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,CAAC"}
@@ -5,8 +5,8 @@ import { TabView } from "./tab-view.js";
5
5
  const createTabScreen = createScreenFactory();
6
6
  /** Renders the screens of a {@link createTabNavigator} as pages of an `AdwViewStack` with a view switcher. */
7
7
  function TabNavigator({ tabBarPosition, ...options }) {
8
- const { state, descriptors, navigation, NavigationContent } = useNavigationBuilder(TabRouter, options);
9
- return (_jsx(NavigationContent, { children: _jsx(TabView, { tabBarPosition: tabBarPosition, state: state, navigation: navigation, descriptors: descriptors }) }));
8
+ const { state, descriptors, navigation, render } = useNavigationBuilder(TabRouter, options);
9
+ return render(_jsx(TabView, { tabBarPosition: tabBarPosition, state: state, navigation: navigation, descriptors: descriptors }));
10
10
  }
11
11
  /** Creates a tab navigator rendered with `AdwViewStack` and an `AdwViewSwitcher`. */
12
12
  function createTabNavigator(config) {
@@ -1 +1 @@
1
- {"version":3,"file":"create-tab-navigator.js","sourceRoot":"","sources":["../../src/tabs/create-tab-navigator.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEtH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAyBxC,mFAAmF;AACnF,MAAM,eAAe,GAAoC,mBAAmB,EAAc,CAAC;AAE3F,8GAA8G;AAC9G,SAAS,YAAY,CAAC,EAAE,cAAc,EAAE,GAAG,OAAO,EAAqB;IACnE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAAE,GAAG,oBAAoB,CAMhF,SAAS,EAAE,OAAO,CAAC,CAAC;IAEtB,OAAO,CACH,KAAC,iBAAiB,cACd,KAAC,OAAO,IAAC,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,GAAI,GAC3F,CACvB,CAAC;AACN,CAAC;AAED,qFAAqF;AACrF,SAAS,kBAAkB,CAKzB,MAAe;IACb,OAAO,sBAAsB,CAAC,YAAY,CAAC,CAAC,MAAM,CAAoC,CAAC;AAC3F,CAAC;AAED,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAmB,CAAC","sourcesContent":["import type {\n NavigatorTypeBagBase,\n ParamListBase,\n StaticConfig,\n StaticScreenFactory,\n TabActionHelpers,\n TabNavigationState,\n TabRouterOptions,\n TypedNavigator,\n} from \"@react-navigation/core\";\nimport type { ReactNode } from \"react\";\nimport { createNavigatorFactory, createScreenFactory, TabRouter, useNavigationBuilder } from \"@react-navigation/core\";\nimport type { TabNavigationEventMap, TabNavigationOptions, TabNavigationProp, TabNavigatorProps } from \"./types.js\";\nimport { TabView } from \"./tab-view.js\";\n\n/** Type bag describing the tab navigator to React Navigation's typed APIs. */\ntype TabTypeBag<\n ParamList extends ParamListBase = ParamListBase,\n NavigatorID extends string | undefined = string | undefined,\n> = {\n /** Route names and their params. */\n ParamList: ParamList;\n /** Optional navigator id. */\n NavigatorID: NavigatorID;\n /** Shape of the navigator state. */\n State: TabNavigationState<ParamList>;\n /** Per-screen options. */\n ScreenOptions: TabNavigationOptions;\n /** Events the navigator emits. */\n EventMap: TabNavigationEventMap;\n /** Navigation object per route. */\n NavigationList: {\n [RouteName in keyof ParamList]: TabNavigationProp<ParamList, RouteName, NavigatorID>;\n };\n /** The navigator component. */\n Navigator: typeof TabNavigator;\n};\n\n/** Declares a typed screen of a tab navigator for the static configuration API. */\nconst createTabScreen: StaticScreenFactory<TabTypeBag> = createScreenFactory<TabTypeBag>();\n\n/** Renders the screens of a {@link createTabNavigator} as pages of an `AdwViewStack` with a view switcher. */\nfunction TabNavigator({ tabBarPosition, ...options }: TabNavigatorProps): ReactNode {\n const { state, descriptors, navigation, NavigationContent } = useNavigationBuilder<\n TabNavigationState<ParamListBase>,\n TabRouterOptions,\n TabActionHelpers<ParamListBase>,\n TabNavigationOptions,\n TabNavigationEventMap\n >(TabRouter, options);\n\n return (\n <NavigationContent>\n <TabView tabBarPosition={tabBarPosition} state={state} navigation={navigation} descriptors={descriptors} />\n </NavigationContent>\n );\n}\n\n/** Creates a tab navigator rendered with `AdwViewStack` and an `AdwViewSwitcher`. */\nfunction createTabNavigator<\n const ParamList extends ParamListBase,\n const NavigatorID extends string | undefined = string | undefined,\n const TypeBag extends NavigatorTypeBagBase = TabTypeBag<ParamList, NavigatorID>,\n const Config extends StaticConfig<TypeBag> | undefined = undefined,\n>(config?: Config): TypedNavigator<TypeBag, Config> {\n return createNavigatorFactory(TabNavigator)(config) as TypedNavigator<TypeBag, Config>;\n}\n\nexport { createTabNavigator, createTabScreen, TabNavigator, type TabTypeBag };\n"]}
1
+ {"version":3,"file":"create-tab-navigator.js","sourceRoot":"","sources":["../../src/tabs/create-tab-navigator.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEtH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAyBxC,mFAAmF;AACnF,MAAM,eAAe,GAAoC,mBAAmB,EAAc,CAAC;AAE3F,8GAA8G;AAC9G,SAAS,YAAY,CAAC,EAAE,cAAc,EAAE,GAAG,OAAO,EAAqB;IACnE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,oBAAoB,CAMrE,SAAS,EAAE,OAAO,CAAC,CAAC;IAEtB,OAAO,MAAM,CACT,KAAC,OAAO,IAAC,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,GAAI,CAC9G,CAAC;AACN,CAAC;AAED,qFAAqF;AACrF,SAAS,kBAAkB,CAKzB,MAAe;IACb,OAAO,sBAAsB,CAAC,YAAY,CAAC,CAAC,MAAM,CAAoC,CAAC;AAC3F,CAAC;AAED,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAmB,CAAC","sourcesContent":["import type {\n NavigatorTypeBagBase,\n ParamListBase,\n StaticConfig,\n StaticScreenFactory,\n TabActionHelpers,\n TabNavigationState,\n TabRouterOptions,\n TypedNavigator,\n} from \"@react-navigation/core\";\nimport type { ReactNode } from \"react\";\nimport { createNavigatorFactory, createScreenFactory, TabRouter, useNavigationBuilder } from \"@react-navigation/core\";\nimport type { TabNavigationEventMap, TabNavigationOptions, TabNavigationProp, TabNavigatorProps } from \"./types.js\";\nimport { TabView } from \"./tab-view.js\";\n\n/** Type bag describing the tab navigator to React Navigation's typed APIs. */\ntype TabTypeBag<\n ParamList extends ParamListBase = ParamListBase,\n NavigatorID extends string | undefined = string | undefined,\n> = {\n /** Route names and their params. */\n ParamList: ParamList;\n /** Optional navigator id. */\n NavigatorID: NavigatorID;\n /** Shape of the navigator state. */\n State: TabNavigationState<ParamList>;\n /** Per-screen options. */\n ScreenOptions: TabNavigationOptions;\n /** Events the navigator emits. */\n EventMap: TabNavigationEventMap;\n /** Navigation object per route. */\n NavigationList: {\n [RouteName in keyof ParamList]: TabNavigationProp<ParamList, RouteName, NavigatorID>;\n };\n /** The navigator component. */\n Navigator: typeof TabNavigator;\n};\n\n/** Declares a typed screen of a tab navigator for the static configuration API. */\nconst createTabScreen: StaticScreenFactory<TabTypeBag> = createScreenFactory<TabTypeBag>();\n\n/** Renders the screens of a {@link createTabNavigator} as pages of an `AdwViewStack` with a view switcher. */\nfunction TabNavigator({ tabBarPosition, ...options }: TabNavigatorProps): ReactNode {\n const { state, descriptors, navigation, render } = useNavigationBuilder<\n TabNavigationState<ParamListBase>,\n TabRouterOptions,\n TabActionHelpers<ParamListBase>,\n TabNavigationOptions,\n TabNavigationEventMap\n >(TabRouter, options);\n\n return render(\n <TabView tabBarPosition={tabBarPosition} state={state} navigation={navigation} descriptors={descriptors} />,\n );\n}\n\n/** Creates a tab navigator rendered with `AdwViewStack` and an `AdwViewSwitcher`. */\nfunction createTabNavigator<\n const ParamList extends ParamListBase,\n const NavigatorID extends string | undefined = string | undefined,\n const TypeBag extends NavigatorTypeBagBase = TabTypeBag<ParamList, NavigatorID>,\n const Config extends StaticConfig<TypeBag> | undefined = undefined,\n>(config?: Config): TypedNavigator<TypeBag, Config> {\n return createNavigatorFactory(TabNavigator)(config) as TypedNavigator<TypeBag, Config>;\n}\n\nexport { createTabNavigator, createTabScreen, TabNavigator, type TabTypeBag };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tab-view.d.ts","sourceRoot":"","sources":["../../src/tabs/tab-view.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,KAAK,EAAgB,SAAS,EAAE,MAAM,OAAO,CAAC;AAKrD,OAAO,KAAK,EAAiB,gBAAgB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAO7G,KAAK,YAAY,GAAG,mBAAmB,GAAG;IACtC,KAAK,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC;IACzC,UAAU,EAAE,oBAAoB,CAAC;IACjC,WAAW,EAAE,gBAAgB,CAAC;CACjC,CAAC;AAqEF,QAAA,MAAM,OAAO,GAAI,oDAA4D,YAAY,KAAG,SAqC3F,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"tab-view.d.ts","sourceRoot":"","sources":["../../src/tabs/tab-view.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,KAAK,EAAgB,SAAS,EAAE,MAAM,OAAO,CAAC;AAKrD,OAAO,KAAK,EAAiB,gBAAgB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAM7G,KAAK,YAAY,GAAG,mBAAmB,GAAG;IACtC,KAAK,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC;IACzC,UAAU,EAAE,oBAAoB,CAAC;IACjC,WAAW,EAAE,gBAAgB,CAAC;CACjC,CAAC;AAqEF,QAAA,MAAM,OAAO,GAAI,oDAA4D,YAAY,KAAG,SAoC3F,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -6,7 +6,6 @@ import { useCallback, useState } from "react";
6
6
  import { HeaderBar } from "../shared/header-bar.js";
7
7
  import { getFocusedRoute, requireDescriptor } from "../shared/routes.js";
8
8
  import { ScenePage } from "../shared/scene-page.js";
9
- import { useLoadedRoutes } from "../shared/use-loaded-routes.js";
10
9
  import { usePopToTopOnBlur } from "../shared/use-pop-to-top-on-blur.js";
11
10
  const useTabSelection = (navigation) => useCallback((name) => {
12
11
  const current = navigation.getState();
@@ -39,14 +38,13 @@ const TabView = ({ state, navigation, descriptors, tabBarPosition = "top" }) =>
39
38
  const [stack, setStack] = useState(null);
40
39
  const focused = getFocusedRoute(state);
41
40
  const descriptor = requireDescriptor(descriptors, focused.key);
42
- const loaded = useLoadedRoutes(focused.key, state.preloadedRouteKeys);
43
41
  const onVisibleChildChanged = useTabSelection(navigation);
44
42
  const viewSwitcher = stack === null
45
43
  ? undefined
46
44
  : _jsx(AdwViewSwitcher, { stack: stack, policy: Adw.ViewSwitcherPolicy.WIDE });
47
45
  const hasSwitcherBar = tabBarPosition === "bottom" && stack !== null;
48
46
  usePopToTopOnBlur(state, descriptors, navigation);
49
- return (_jsx(AdwToolbarView, { topBar: (_jsx(TabHeader, { descriptor: descriptor, viewSwitcher: tabBarPosition === "top" ? viewSwitcher : undefined })), bottomBar: hasSwitcherBar ? _jsx(AdwViewSwitcherBar, { stack: stack, reveal: true }) : undefined, children: _jsx(AdwViewStack, { ref: setStack, visibleChildName: focused.key, enableTransitions: descriptor.options.animation === "fade", onNotifyVisibleChildName: onVisibleChildChanged, children: state.routes.map((route) => (_jsx(TabPage, { descriptor: requireDescriptor(descriptors, route.key), isLoaded: loaded.has(route.key) }, route.key))) }) }));
47
+ return (_jsx(AdwToolbarView, { topBar: (_jsx(TabHeader, { descriptor: descriptor, viewSwitcher: tabBarPosition === "top" ? viewSwitcher : undefined })), bottomBar: hasSwitcherBar ? _jsx(AdwViewSwitcherBar, { stack: stack, reveal: true }) : undefined, children: _jsx(AdwViewStack, { ref: setStack, visibleChildName: focused.key, enableTransitions: descriptor.options.animation === "fade", onNotifyVisibleChildName: onVisibleChildChanged, children: state.routes.map((route) => (_jsx(TabPage, { descriptor: requireDescriptor(descriptors, route.key), isLoaded: route.key === focused.key || state.preloadedRouteKeys.includes(route.key) }, route.key))) }) }));
50
48
  };
51
49
  export { TabView };
52
50
  //# sourceMappingURL=tab-view.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tab-view.js","sourceRoot":"","sources":["../../src/tabs/tab-view.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { ParamListBase, TabNavigationState } from \"@react-navigation/core\";\nimport type { ReactElement, ReactNode } from \"react\";\nimport * as Adw from \"@gtkx/gi/adw\";\nimport { AdwToolbarView, AdwViewStack, AdwViewSwitcher, AdwViewSwitcherBar, AdwWindowTitle } from \"@gtkx/jsx/adw\";\nimport { CommonActions } from \"@react-navigation/core\";\nimport { useCallback, useState } from \"react\";\nimport type { TabDescriptor, TabDescriptorMap, TabNavigationConfig, TabNavigationHelpers } from \"./types.js\";\nimport { HeaderBar } from \"../shared/header-bar.js\";\nimport { getFocusedRoute, requireDescriptor } from \"../shared/routes.js\";\nimport { ScenePage } from \"../shared/scene-page.js\";\nimport { useLoadedRoutes } from \"../shared/use-loaded-routes.js\";\nimport { usePopToTopOnBlur } from \"../shared/use-pop-to-top-on-blur.js\";\n\ntype TabViewProps = TabNavigationConfig & {\n state: TabNavigationState<ParamListBase>;\n navigation: TabNavigationHelpers;\n descriptors: TabDescriptorMap;\n};\n\ntype TabHeaderProps = {\n descriptor: TabDescriptor;\n viewSwitcher: ReactElement | undefined;\n};\n\ntype TabPageProps = {\n descriptor: TabDescriptor;\n isLoaded: boolean;\n};\n\nconst useTabSelection = (navigation: TabNavigationHelpers): ((name: string | null) => void) =>\n useCallback((name: string | null) => {\n const current = navigation.getState();\n const focusedKey = getFocusedRoute(current).key;\n const route = current.routes.find((candidate) => candidate.key === name);\n\n if (route === undefined || route.key === focusedKey) {\n return;\n }\n\n const event = navigation.emit({ type: \"tabPress\", target: route.key, canPreventDefault: true });\n\n if (!event.defaultPrevented) {\n navigation.dispatch({ ...CommonActions.navigate(route.name, route.params), target: current.key });\n }\n }, [navigation]);\n\nconst defaultTabHeader = ({ descriptor, viewSwitcher }: TabHeaderProps): ReactElement => (\n <HeaderBar\n options={descriptor.options}\n titleWidget={viewSwitcher ?? <AdwWindowTitle title={descriptor.options.title ?? descriptor.route.name} />}\n />\n);\n\nconst TabHeader = (props: TabHeaderProps): ReactNode => {\n const { descriptor, viewSwitcher } = props;\n const { route, options, navigation } = descriptor;\n\n if (options.headerShown === false) {\n return <>{viewSwitcher}</>;\n }\n\n return (\n <>\n {options.header === undefined\n ? defaultTabHeader(props)\n : options.header({ route, navigation, options, viewSwitcher })}\n </>\n );\n};\n\nconst TabPage = ({ descriptor, isLoaded }: TabPageProps): ReactNode => {\n const { route, options } = descriptor;\n\n return (\n <ScenePage\n name={route.key}\n title={options.tabBarLabel ?? options.title ?? route.name}\n iconName={options.tabBarIcon}\n badgeNumber={options.tabBarBadge}\n needsAttention={options.needsAttention}\n isLoaded={isLoaded || options.lazy === false}\n render={() => descriptor.render()}\n />\n );\n};\n\nconst TabView = ({ state, navigation, descriptors, tabBarPosition = \"top\" }: TabViewProps): ReactNode => {\n const [stack, setStack] = useState<Adw.ViewStack | null>(null);\n const focused = getFocusedRoute(state);\n const descriptor = requireDescriptor(descriptors, focused.key);\n const loaded = useLoadedRoutes(focused.key, state.preloadedRouteKeys);\n const onVisibleChildChanged = useTabSelection(navigation);\n\n const viewSwitcher = stack === null\n ? undefined\n : <AdwViewSwitcher stack={stack} policy={Adw.ViewSwitcherPolicy.WIDE} />;\n\n const hasSwitcherBar = tabBarPosition === \"bottom\" && stack !== null;\n usePopToTopOnBlur(state, descriptors, navigation);\n\n return (\n <AdwToolbarView\n topBar={(\n <TabHeader descriptor={descriptor} viewSwitcher={tabBarPosition === \"top\" ? viewSwitcher : undefined} />\n )}\n bottomBar={hasSwitcherBar ? <AdwViewSwitcherBar stack={stack} reveal /> : undefined}\n >\n <AdwViewStack\n ref={setStack}\n visibleChildName={focused.key}\n enableTransitions={descriptor.options.animation === \"fade\"}\n onNotifyVisibleChildName={onVisibleChildChanged}\n >\n {state.routes.map((route) => (\n <TabPage\n key={route.key}\n descriptor={requireDescriptor(descriptors, route.key)}\n isLoaded={loaded.has(route.key)}\n />\n ))}\n </AdwViewStack>\n </AdwToolbarView>\n );\n};\n\nexport { TabView };\n"]}
1
+ {"version":3,"file":"tab-view.js","sourceRoot":"","sources":["../../src/tabs/tab-view.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { ParamListBase, TabNavigationState } from \"@react-navigation/core\";\nimport type { ReactElement, ReactNode } from \"react\";\nimport * as Adw from \"@gtkx/gi/adw\";\nimport { AdwToolbarView, AdwViewStack, AdwViewSwitcher, AdwViewSwitcherBar, AdwWindowTitle } from \"@gtkx/jsx/adw\";\nimport { CommonActions } from \"@react-navigation/core\";\nimport { useCallback, useState } from \"react\";\nimport type { TabDescriptor, TabDescriptorMap, TabNavigationConfig, TabNavigationHelpers } from \"./types.js\";\nimport { HeaderBar } from \"../shared/header-bar.js\";\nimport { getFocusedRoute, requireDescriptor } from \"../shared/routes.js\";\nimport { ScenePage } from \"../shared/scene-page.js\";\nimport { usePopToTopOnBlur } from \"../shared/use-pop-to-top-on-blur.js\";\n\ntype TabViewProps = TabNavigationConfig & {\n state: TabNavigationState<ParamListBase>;\n navigation: TabNavigationHelpers;\n descriptors: TabDescriptorMap;\n};\n\ntype TabHeaderProps = {\n descriptor: TabDescriptor;\n viewSwitcher: ReactElement | undefined;\n};\n\ntype TabPageProps = {\n descriptor: TabDescriptor;\n isLoaded: boolean;\n};\n\nconst useTabSelection = (navigation: TabNavigationHelpers): ((name: string | null) => void) =>\n useCallback((name: string | null) => {\n const current = navigation.getState();\n const focusedKey = getFocusedRoute(current).key;\n const route = current.routes.find((candidate) => candidate.key === name);\n\n if (route === undefined || route.key === focusedKey) {\n return;\n }\n\n const event = navigation.emit({ type: \"tabPress\", target: route.key, canPreventDefault: true });\n\n if (!event.defaultPrevented) {\n navigation.dispatch({ ...CommonActions.navigate(route.name, route.params), target: current.key });\n }\n }, [navigation]);\n\nconst defaultTabHeader = ({ descriptor, viewSwitcher }: TabHeaderProps): ReactElement => (\n <HeaderBar\n options={descriptor.options}\n titleWidget={viewSwitcher ?? <AdwWindowTitle title={descriptor.options.title ?? descriptor.route.name} />}\n />\n);\n\nconst TabHeader = (props: TabHeaderProps): ReactNode => {\n const { descriptor, viewSwitcher } = props;\n const { route, options, navigation } = descriptor;\n\n if (options.headerShown === false) {\n return <>{viewSwitcher}</>;\n }\n\n return (\n <>\n {options.header === undefined\n ? defaultTabHeader(props)\n : options.header({ route, navigation, options, viewSwitcher })}\n </>\n );\n};\n\nconst TabPage = ({ descriptor, isLoaded }: TabPageProps): ReactNode => {\n const { route, options } = descriptor;\n\n return (\n <ScenePage\n name={route.key}\n title={options.tabBarLabel ?? options.title ?? route.name}\n iconName={options.tabBarIcon}\n badgeNumber={options.tabBarBadge}\n needsAttention={options.needsAttention}\n isLoaded={isLoaded || options.lazy === false}\n render={() => descriptor.render()}\n />\n );\n};\n\nconst TabView = ({ state, navigation, descriptors, tabBarPosition = \"top\" }: TabViewProps): ReactNode => {\n const [stack, setStack] = useState<Adw.ViewStack | null>(null);\n const focused = getFocusedRoute(state);\n const descriptor = requireDescriptor(descriptors, focused.key);\n const onVisibleChildChanged = useTabSelection(navigation);\n\n const viewSwitcher = stack === null\n ? undefined\n : <AdwViewSwitcher stack={stack} policy={Adw.ViewSwitcherPolicy.WIDE} />;\n\n const hasSwitcherBar = tabBarPosition === \"bottom\" && stack !== null;\n usePopToTopOnBlur(state, descriptors, navigation);\n\n return (\n <AdwToolbarView\n topBar={(\n <TabHeader descriptor={descriptor} viewSwitcher={tabBarPosition === \"top\" ? viewSwitcher : undefined} />\n )}\n bottomBar={hasSwitcherBar ? <AdwViewSwitcherBar stack={stack} reveal /> : undefined}\n >\n <AdwViewStack\n ref={setStack}\n visibleChildName={focused.key}\n enableTransitions={descriptor.options.animation === \"fade\"}\n onNotifyVisibleChildName={onVisibleChildChanged}\n >\n {state.routes.map((route) => (\n <TabPage\n key={route.key}\n descriptor={requireDescriptor(descriptors, route.key)}\n isLoaded={route.key === focused.key || state.preloadedRouteKeys.includes(route.key)}\n />\n ))}\n </AdwViewStack>\n </AdwToolbarView>\n );\n};\n\nexport { TabView };\n"]}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@gtkx/navigation",
3
- "version": "2.0.0-beta.1",
4
- "description": "React Navigation for GTKX: stack, tab, drawer and master/detail navigators rendered with libadwaita's navigation view, view stack and split views",
3
+ "version": "2.0.0-beta.11",
4
+ "description": "React Navigation navigators for GTKX.",
5
5
  "keywords": [
6
6
  "gtkx",
7
7
  "gtk",
8
8
  "gtk4",
9
9
  "adwaita",
10
+ "gnome",
10
11
  "react",
11
12
  "react-navigation",
12
13
  "navigation",
@@ -53,18 +54,20 @@
53
54
  "node": ">=26.7.0"
54
55
  },
55
56
  "dependencies": {
56
- "@gtkx/react": "2.0.0-beta.1",
57
- "@react-navigation/core": "^7.21.13",
57
+ "@gtkx/react": "2.0.0-beta.11",
58
+ "@react-navigation/core": "^7.22.1",
58
59
  "@react-navigation/routers": "^7.6.4"
59
60
  },
60
61
  "peerDependencies": {
61
- "react": "^19.2"
62
+ "@types/react": "^19.3",
63
+ "react": "^19.3"
62
64
  },
63
65
  "devDependencies": {
64
- "@gtkx/config": "2.0.0-beta.1",
65
- "@gtkx/testing": "2.0.0-beta.1",
66
- "@gtkx/vitest": "2.0.0-beta.1",
67
- "vitest": "^4.1.11"
66
+ "@gtkx/config": "2.0.0-beta.11",
67
+ "@gtkx/testing": "2.0.0-beta.11",
68
+ "@gtkx/vitest": "2.0.0-beta.11",
69
+ "@types/react": "^19.3.0",
70
+ "vitest": "^5.0.1"
68
71
  },
69
72
  "scripts": {
70
73
  "release": "tsx ../../scripts/release-package.ts"
@@ -82,7 +82,7 @@ function DrawerNavigator({
82
82
  }: DrawerNavigatorProps): ReactNode {
83
83
  const createRouter = useDrawerRouter(collapsed === true);
84
84
 
85
- const { state, descriptors, navigation, NavigationContent } = useNavigationBuilder<
85
+ const { state, descriptors, navigation, render } = useNavigationBuilder<
86
86
  DrawerNavigationState<ParamListBase>,
87
87
  DrawerRouterOptions,
88
88
  DrawerActionHelpers<ParamListBase>,
@@ -90,21 +90,19 @@ function DrawerNavigator({
90
90
  DrawerNavigationEventMap
91
91
  >(createRouter, { ...options, defaultStatus: defaultStatus ?? (collapsed === true ? "closed" : "open") });
92
92
 
93
- return (
94
- <NavigationContent>
95
- <DrawerView
96
- state={state}
97
- navigation={navigation}
98
- descriptors={descriptors}
99
- drawerContent={drawerContent}
100
- collapsed={collapsed}
101
- sidebarPosition={sidebarPosition}
102
- pinSidebar={pinSidebar}
103
- minSidebarWidth={minSidebarWidth}
104
- maxSidebarWidth={maxSidebarWidth}
105
- sidebarWidthFraction={sidebarWidthFraction}
106
- />
107
- </NavigationContent>
93
+ return render(
94
+ <DrawerView
95
+ state={state}
96
+ navigation={navigation}
97
+ descriptors={descriptors}
98
+ drawerContent={drawerContent}
99
+ collapsed={collapsed}
100
+ sidebarPosition={sidebarPosition}
101
+ pinSidebar={pinSidebar}
102
+ minSidebarWidth={minSidebarWidth}
103
+ maxSidebarWidth={maxSidebarWidth}
104
+ sidebarWidthFraction={sidebarWidthFraction}
105
+ />,
108
106
  );
109
107
  }
110
108
 
@@ -1,7 +1,7 @@
1
1
  import type { NavigationState } from "@react-navigation/core";
2
2
  import type { ReactNode } from "react";
3
3
  import * as Gtk from "@gtkx/gi/gtk";
4
- import { GtkBox, GtkImage, GtkLabel, GtkListBox } from "@gtkx/jsx/gtk";
4
+ import { GtkBox, GtkImage, GtkLabel, GtkListBox, GtkListBoxRow } from "@gtkx/jsx/gtk";
5
5
  import { CommonActions, DrawerActions } from "@react-navigation/core";
6
6
  import { useCallback, useContext } from "react";
7
7
  import type { DrawerContentProps, DrawerDescriptor, DrawerNavigationHelpers } from "./types.js";
@@ -43,12 +43,15 @@ const useDrawerItemPress = (navigation: DrawerNavigationHelpers, isCollapsed: bo
43
43
 
44
44
  const DrawerItem = ({ descriptor }: { descriptor: DrawerDescriptor }): ReactNode => {
45
45
  const { route, options } = descriptor;
46
+ const label = options.drawerLabel ?? options.title ?? route.name;
46
47
 
47
48
  return (
48
- <GtkBox spacing={12}>
49
- {options.drawerIcon === undefined ? null : <GtkImage iconName={options.drawerIcon} />}
50
- <GtkLabel label={options.drawerLabel ?? options.title ?? route.name} xalign={0} />
51
- </GtkBox>
49
+ <GtkListBoxRow accessibleLabel={label}>
50
+ <GtkBox spacing={12}>
51
+ {options.drawerIcon === undefined ? null : <GtkImage iconName={options.drawerIcon} />}
52
+ <GtkLabel label={label} xalign={0} />
53
+ </GtkBox>
54
+ </GtkListBoxRow>
52
55
  );
53
56
  };
54
57
 
@@ -1,19 +1,6 @@
1
- import type { DrawerStatus, NavigationState } from "@react-navigation/core";
1
+ import type { DrawerNavigationState, DrawerStatus, ParamListBase } from "@react-navigation/core";
2
2
 
3
- type DrawerHistoryEntry = { type: "drawer"; status: DrawerStatus };
4
-
5
- const isDrawerEntry = (entry: unknown): entry is DrawerHistoryEntry =>
6
- typeof entry === "object" && entry !== null && "type" in entry && entry.type === "drawer";
7
-
8
- const getDrawerStatus = (state: NavigationState): DrawerStatus => {
9
- const history: readonly unknown[] = state.history ?? [];
10
- const entry = history.findLast(isDrawerEntry);
11
-
12
- if (entry !== undefined) {
13
- return entry.status;
14
- }
15
-
16
- return "default" in state && state.default === "open" ? "open" : "closed";
17
- };
3
+ const getDrawerStatus = (state: DrawerNavigationState<ParamListBase>): DrawerStatus =>
4
+ state.history.findLast((entry) => entry.type === "drawer")?.status ?? state.default;
18
5
 
19
6
  export { getDrawerStatus };
@@ -21,7 +21,6 @@ import type {
21
21
  import { HeaderBar } from "../shared/header-bar.js";
22
22
  import { getFocusedRoute, requireDescriptor } from "../shared/routes.js";
23
23
  import { ScenePage } from "../shared/scene-page.js";
24
- import { useLoadedRoutes } from "../shared/use-loaded-routes.js";
25
24
  import { usePopToTopOnBlur } from "../shared/use-pop-to-top-on-blur.js";
26
25
  import { DrawerCollapsedContext } from "./drawer-collapsed-context.js";
27
26
  import { DrawerItemList } from "./drawer-item-list.js";
@@ -47,15 +46,12 @@ const PACK_TYPES = { start: Gtk.PackType.START, end: Gtk.PackType.END } as const
47
46
 
48
47
  const useSidebarSync = (navigation: DrawerNavigationHelpers): ((isShown: boolean | null) => void) =>
49
48
  useCallback((isShown: boolean | null) => {
50
- const current = navigation.getState();
51
- const isOpen = getDrawerStatus(current) === "open";
52
-
53
- if (isShown === null || isShown === isOpen) {
49
+ if (isShown === null) {
54
50
  return;
55
51
  }
56
52
 
57
53
  const action = isShown ? DrawerActions.openDrawer() : DrawerActions.closeDrawer();
58
- navigation.dispatch({ ...action, target: current.key });
54
+ navigation.dispatch({ ...action, target: navigation.getState().key });
59
55
  }, [navigation]);
60
56
 
61
57
  const useCloseOnNavigate = (
@@ -70,7 +66,7 @@ const useCloseOnNavigate = (
70
66
  const hasChanged = previousKeyRef.current !== focusedKey;
71
67
  previousKeyRef.current = focusedKey;
72
68
 
73
- if (hasChanged && isCollapsed && getDrawerStatus(navigation.getState()) === "open") {
69
+ if (hasChanged && isCollapsed) {
74
70
  navigation.dispatch({ ...DrawerActions.closeDrawer(), target: navigation.getState().key });
75
71
  }
76
72
  }, [focusedKey, isCollapsed, navigation]);
@@ -132,7 +128,6 @@ const DrawerView = ({ state, navigation, descriptors, drawerContent, ...config }
132
128
  const { collapsed = false, sidebarPosition = "start", pinSidebar, minSidebarWidth, maxSidebarWidth } = config;
133
129
  const focused = getFocusedRoute(state);
134
130
  const descriptor = requireDescriptor(descriptors, focused.key);
135
- const loaded = useLoadedRoutes(focused.key, state.preloadedRouteKeys);
136
131
  const onShowSidebarChanged = useSidebarSync(navigation);
137
132
  const contentProps = { state, navigation, descriptors };
138
133
  const sidebar = drawerContent === undefined ? <DrawerContent {...contentProps} /> : drawerContent(contentProps);
@@ -158,7 +153,7 @@ const DrawerView = ({ state, navigation, descriptors, drawerContent, ...config }
158
153
  <DrawerPage
159
154
  key={route.key}
160
155
  descriptor={requireDescriptor(descriptors, route.key)}
161
- isLoaded={loaded.has(route.key)}
156
+ isLoaded={route.key === focused.key || state.preloadedRouteKeys.includes(route.key)}
162
157
  />
163
158
  ))}
164
159
  </AdwViewStack>
@@ -1,5 +1,6 @@
1
1
  import type { ReactElement, ReactNode } from "react";
2
2
  import { AdwBin, AdwViewStackPage } from "@gtkx/jsx/adw";
3
+ import { useState } from "react";
3
4
 
4
5
  type ScenePageProps = {
5
6
  name: string;
@@ -11,17 +12,25 @@ type ScenePageProps = {
11
12
  render: () => ReactElement;
12
13
  };
13
14
 
14
- const ScenePage = ({ name, title, isLoaded, render, ...page }: ScenePageProps): ReactNode => (
15
- <AdwViewStackPage
16
- name={name}
17
- title={title}
18
- iconName={page.iconName}
19
- badgeNumber={page.badgeNumber}
20
- needsAttention={page.needsAttention}
21
- useUnderline={false}
22
- >
23
- <AdwBin>{isLoaded ? render() : null}</AdwBin>
24
- </AdwViewStackPage>
25
- );
15
+ const ScenePage = ({ name, title, isLoaded, render, ...page }: ScenePageProps): ReactNode => {
16
+ const [hasLoaded, setHasLoaded] = useState(isLoaded);
17
+
18
+ if (isLoaded && !hasLoaded) {
19
+ setHasLoaded(true);
20
+ }
21
+
22
+ return (
23
+ <AdwViewStackPage
24
+ name={name}
25
+ title={title}
26
+ iconName={page.iconName}
27
+ badgeNumber={page.badgeNumber}
28
+ needsAttention={page.needsAttention}
29
+ useUnderline={false}
30
+ >
31
+ <AdwBin>{hasLoaded ? render() : null}</AdwBin>
32
+ </AdwViewStackPage>
33
+ );
34
+ };
26
35
 
27
36
  export { ScenePage };
@@ -56,7 +56,7 @@ function SplitViewNavigator({
56
56
  popOnEscape,
57
57
  ...options
58
58
  }: SplitViewNavigatorProps): ReactNode {
59
- const { state, describe, descriptors, navigation, NavigationContent } = useNavigationBuilder<
59
+ const { state, describe, descriptors, navigation, render } = useNavigationBuilder<
60
60
  StackNavigationState<ParamListBase>,
61
61
  StackRouterOptions,
62
62
  StackActionHelpers<ParamListBase>,
@@ -64,22 +64,20 @@ function SplitViewNavigator({
64
64
  SplitViewNavigationEventMap
65
65
  >(splitViewRouter, options);
66
66
 
67
- return (
68
- <NavigationContent>
69
- <SplitView
70
- state={state}
71
- navigation={navigation}
72
- descriptors={descriptors}
73
- describe={describe}
74
- collapsed={collapsed}
75
- contentPlaceholder={contentPlaceholder}
76
- sidebarPosition={sidebarPosition}
77
- minSidebarWidth={minSidebarWidth}
78
- maxSidebarWidth={maxSidebarWidth}
79
- sidebarWidthFraction={sidebarWidthFraction}
80
- popOnEscape={popOnEscape}
81
- />
82
- </NavigationContent>
67
+ return render(
68
+ <SplitView
69
+ state={state}
70
+ navigation={navigation}
71
+ descriptors={descriptors}
72
+ describe={describe}
73
+ collapsed={collapsed}
74
+ contentPlaceholder={contentPlaceholder}
75
+ sidebarPosition={sidebarPosition}
76
+ minSidebarWidth={minSidebarWidth}
77
+ maxSidebarWidth={maxSidebarWidth}
78
+ sidebarWidthFraction={sidebarWidthFraction}
79
+ popOnEscape={popOnEscape}
80
+ />,
83
81
  );
84
82
  }
85
83
 
@@ -46,7 +46,7 @@ const createStackScreen: StaticScreenFactory<StackTypeBag> = createScreenFactory
46
46
 
47
47
  /** Renders the screens of a {@link createStackNavigator} as pages of an `AdwNavigationView`. */
48
48
  function StackNavigator({ popOnEscape, ...options }: StackNavigatorProps): ReactNode {
49
- const { state, describe, descriptors, navigation, NavigationContent } = useNavigationBuilder<
49
+ const { state, describe, descriptors, navigation, render } = useNavigationBuilder<
50
50
  StackNavigationState<ParamListBase>,
51
51
  StackRouterOptions,
52
52
  StackActionHelpers<ParamListBase>,
@@ -54,16 +54,14 @@ function StackNavigator({ popOnEscape, ...options }: StackNavigatorProps): React
54
54
  StackNavigationEventMap
55
55
  >(StackRouter, options);
56
56
 
57
- return (
58
- <NavigationContent>
59
- <StackView
60
- popOnEscape={popOnEscape}
61
- state={state}
62
- navigation={navigation}
63
- descriptors={descriptors}
64
- describe={describe}
65
- />
66
- </NavigationContent>
57
+ return render(
58
+ <StackView
59
+ popOnEscape={popOnEscape}
60
+ state={state}
61
+ navigation={navigation}
62
+ descriptors={descriptors}
63
+ describe={describe}
64
+ />,
67
65
  );
68
66
  }
69
67