@gtkx/navigation 2.0.0-beta.11 → 2.0.0-beta.13
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 +3 -3
- package/dist/drawer/create-drawer-navigator.d.ts +3 -1
- package/dist/drawer/create-drawer-navigator.d.ts.map +1 -1
- package/dist/drawer/create-drawer-navigator.js +10 -10
- package/dist/drawer/create-drawer-navigator.js.map +1 -1
- package/dist/drawer/drawer-item-list.d.ts.map +1 -1
- package/dist/drawer/drawer-item-list.js +3 -2
- package/dist/drawer/drawer-item-list.js.map +1 -1
- package/dist/drawer/drawer-router.d.ts.map +1 -1
- package/dist/drawer/drawer-router.js.map +1 -1
- package/dist/drawer/drawer-status.d.ts.map +1 -1
- package/dist/drawer/drawer-view.d.ts.map +1 -1
- package/dist/drawer/drawer-view.js +6 -6
- package/dist/drawer/drawer-view.js.map +1 -1
- package/dist/drawer/types.d.ts +2 -0
- package/dist/drawer/types.d.ts.map +1 -1
- package/dist/drawer/types.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/shared/header-bar.d.ts.map +1 -1
- package/dist/shared/header-bar.js +2 -2
- package/dist/shared/header-bar.js.map +1 -1
- package/dist/shared/routes.d.ts.map +1 -1
- package/dist/shared/scene-page.d.ts +3 -1
- package/dist/shared/scene-page.d.ts.map +1 -1
- package/dist/shared/scene-page.js +4 -7
- package/dist/shared/scene-page.js.map +1 -1
- package/dist/shared/use-has-loaded.d.ts +3 -0
- package/dist/shared/use-has-loaded.d.ts.map +1 -0
- package/dist/shared/use-has-loaded.js +10 -0
- package/dist/shared/use-has-loaded.js.map +1 -0
- package/dist/shared/use-pop-to-top-on-blur.d.ts.map +1 -1
- package/dist/split-view/create-split-view-navigator.d.ts +7 -2
- package/dist/split-view/create-split-view-navigator.d.ts.map +1 -1
- package/dist/split-view/create-split-view-navigator.js +2 -6
- package/dist/split-view/create-split-view-navigator.js.map +1 -1
- package/dist/split-view/split-view-collapsed.d.ts +11 -0
- package/dist/split-view/split-view-collapsed.d.ts.map +1 -0
- package/dist/split-view/split-view-collapsed.js +17 -0
- package/dist/split-view/split-view-collapsed.js.map +1 -0
- package/dist/split-view/split-view.d.ts.map +1 -1
- package/dist/split-view/split-view.js +41 -20
- package/dist/split-view/split-view.js.map +1 -1
- package/dist/split-view/types.d.ts +9 -2
- package/dist/split-view/types.d.ts.map +1 -1
- package/dist/split-view/types.js.map +1 -1
- package/dist/stack/create-stack-navigator.d.ts +3 -1
- package/dist/stack/create-stack-navigator.d.ts.map +1 -1
- package/dist/stack/create-stack-navigator.js +0 -1
- package/dist/stack/create-stack-navigator.js.map +1 -1
- package/dist/stack/stack-pages.d.ts.map +1 -1
- package/dist/stack/stack-pages.js +3 -5
- package/dist/stack/stack-pages.js.map +1 -1
- package/dist/stack/stack-view.d.ts.map +1 -1
- package/dist/stack/stack-view.js +6 -14
- package/dist/stack/stack-view.js.map +1 -1
- package/dist/stack/sync-navigation-stack.d.ts.map +1 -1
- package/dist/stack/types.d.ts.map +1 -1
- package/dist/stack/types.js.map +1 -1
- package/dist/tab-view/create-tab-view-navigator.d.ts +32 -0
- package/dist/tab-view/create-tab-view-navigator.d.ts.map +1 -0
- package/dist/tab-view/create-tab-view-navigator.js +21 -0
- package/dist/tab-view/create-tab-view-navigator.js.map +1 -0
- package/dist/tab-view/page-registry.d.ts +34 -0
- package/dist/tab-view/page-registry.d.ts.map +1 -0
- package/dist/tab-view/page-registry.js +70 -0
- package/dist/tab-view/page-registry.js.map +1 -0
- package/dist/tab-view/tab-view-host.d.ts +25 -0
- package/dist/tab-view/tab-view-host.d.ts.map +1 -0
- package/dist/tab-view/tab-view-host.js +284 -0
- package/dist/tab-view/tab-view-host.js.map +1 -0
- package/dist/tab-view/tab-view-router.d.ts +34 -0
- package/dist/tab-view/tab-view-router.d.ts.map +1 -0
- package/dist/tab-view/tab-view-router.js +359 -0
- package/dist/tab-view/tab-view-router.js.map +1 -0
- package/dist/tab-view/types.d.ts +240 -0
- package/dist/tab-view/types.d.ts.map +1 -0
- package/dist/tab-view/types.js +2 -0
- package/dist/tab-view/types.js.map +1 -0
- package/dist/tabs/create-tab-navigator.d.ts +3 -1
- package/dist/tabs/create-tab-navigator.d.ts.map +1 -1
- package/dist/tabs/create-tab-navigator.js +0 -1
- package/dist/tabs/create-tab-navigator.js.map +1 -1
- package/dist/tabs/tab-view.d.ts.map +1 -1
- package/dist/tabs/tab-view.js +5 -7
- package/dist/tabs/tab-view.js.map +1 -1
- package/dist/tabs/types.d.ts +2 -0
- package/dist/tabs/types.d.ts.map +1 -1
- package/dist/tabs/types.js.map +1 -1
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +2 -2
- package/dist/theme.js.map +1 -1
- package/package.json +9 -19
- package/src/drawer/create-drawer-navigator.tsx +23 -11
- package/src/drawer/drawer-item-list.tsx +16 -12
- package/src/drawer/drawer-router.ts +4 -2
- package/src/drawer/drawer-view.tsx +18 -18
- package/src/drawer/types.ts +6 -3
- package/src/index.ts +31 -5
- package/src/shared/header-bar.tsx +2 -2
- package/src/shared/scene-page.tsx +7 -8
- package/src/shared/use-has-loaded.ts +13 -0
- package/src/split-view/create-split-view-navigator.tsx +16 -1
- package/src/split-view/split-view-collapsed.ts +21 -0
- package/src/split-view/split-view.tsx +102 -49
- package/src/split-view/types.ts +13 -5
- package/src/stack/create-stack-navigator.tsx +11 -1
- package/src/stack/stack-pages.ts +14 -12
- package/src/stack/stack-view.tsx +10 -16
- package/src/stack/types.ts +4 -3
- package/src/tab-view/create-tab-view-navigator.tsx +122 -0
- package/src/tab-view/page-registry.ts +139 -0
- package/src/tab-view/tab-view-host.tsx +474 -0
- package/src/tab-view/tab-view-router.ts +528 -0
- package/src/tab-view/types.ts +291 -0
- package/src/tabs/create-tab-navigator.tsx +11 -1
- package/src/tabs/tab-view.tsx +28 -22
- package/src/tabs/types.ts +6 -3
- package/src/theme.ts +2 -3
|
@@ -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} 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
|
+
{"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 { useLatestRef } from \"@gtkx/react/internal\";\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 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 = useLatestRef(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 =\n options.header === undefined ? (\n <HeaderBar options={options} showBackButton={options.headerBackVisible ?? true} />\n ) : (\n <>{options.header({ route, navigation, options, back })}</>\n );\n\n return <AdwToolbarView top={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 = useLatestRef<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":"sync-navigation-stack.d.ts","sourceRoot":"","sources":["../../src/stack/sync-navigation-stack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAEpC,OAAO,KAAK,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEjF,KAAK,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,GAAG,SAAS,CAAC,CAAC,CAAC;AAiEjF,QAAA,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"sync-navigation-stack.d.ts","sourceRoot":"","sources":["../../src/stack/sync-navigation-stack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAEpC,OAAO,KAAK,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEjF,KAAK,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,GAAG,SAAS,CAAC,CAAC,CAAC;AAiEjF,QAAA,MAAM,mBAAmB,SACf,GAAG,CAAC,cAAc,WACf,SAAS,MAAM,EAAE,WACjB,YAAY,aACV,OAAO,KACnB,IAYF,CAAC;AAcF,QAAA,MAAM,oBAAoB,SAChB,GAAG,CAAC,cAAc,cACZ,sBAAsB,WACzB,YAAY,UACb,MAAM,KACf,IASF,CAAC;AAEF,OAAO,EAAE,KAAK,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/stack/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,uBAAuB,EACvB,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,SAAS,EACT,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,wEAAwE;AACxE,KAAK,mBAAmB,GAAG;IACvB,gEAAgE;IAChE,OAAO,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,iFAAiF;AACjF,KAAK,uBAAuB,GAAG;IAC3B,uCAAuC;IACvC,eAAe,EAAE;QACb,yCAAyC;QACzC,IAAI,EAAE,mBAAmB,CAAC;KAC7B,CAAC;IACF,yCAAyC;IACzC,aAAa,EAAE;QACX,yCAAyC;QACzC,IAAI,EAAE,mBAAmB,CAAC;KAC7B,CAAC;CACL,CAAC;AAEF,sEAAsE;AACtE,KAAK,eAAe,GAAG;IACnB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,iDAAiD;AACjD,KAAK,sBAAsB,GAAG,aAAa,GAAG;IAC1C,sEAAsE;IACtE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,SAAS,CAAC;IAChD,sFAAsF;IACtF,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,gHAAgH;IAChH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;CAClC,CAAC;AAEF,8EAA8E;AAC9E,KAAK,qBAAqB,GAAG;IACzB,yEAAyE;IACzE,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,2CAA2C;AAC3C,KAAK,mBAAmB,CACpB,SAAS,SAAS,aAAa,EAC/B,SAAS,SAAS,MAAM,SAAS,GAAG,MAAM,SAAS,EACnD,WAAW,SAAS,MAAM,GAAG,SAAS,GAAG,SAAS,IAClD,cAAc,CACd,SAAS,EACT,SAAS,EACT,WAAW,EACX,oBAAoB,CAAC,SAAS,CAAC,EAC/B,sBAAsB,EACtB,uBAAuB,CAC1B,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/stack/types.ts"],"names":[],"mappings":"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"}
|
package/dist/stack/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/stack/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n DefaultNavigatorOptions,\n Descriptor,\n NavigationHelpers,\n NavigationProp,\n ParamListBase,\n RouteProp,\n StackActionHelpers,\n StackNavigationState,\n StackRouterOptions,\n} from \"@react-navigation/core\";\nimport type { ReactNode } from \"react\";\nimport type { HeaderOptions } from \"../shared/types.js\";\n\n/** Data carried by the `transitionStart` and `transitionEnd` events. */\ntype StackTransitionData = {\n /** Whether the page is hiding (`true`) or showing (`false`). */\n closing: boolean;\n};\n\n/** Events the stack navigator emits on top of React Navigation's core events. */\ntype StackNavigationEventMap = {\n /** A page starts showing or hiding. */\n transitionStart: {\n /** Which direction the page moves in. */\n data: StackTransitionData;\n };\n /** A page finished showing or hiding. */\n transitionEnd: {\n /** Which direction the page moved in. */\n data: StackTransitionData;\n };\n};\n\n/** The page below the current one, as handed to a custom `header`. */\ntype StackHeaderBack = {\n /** Title of the page below. */\n title: string;\n};\n\n/** Per-screen options of the stack navigator. */\ntype StackNavigationOptions = HeaderOptions & {\n /** Renders a custom top bar instead of the default `AdwHeaderBar`. */\n header?: (props: StackHeaderProps) => ReactNode;\n /** Whether the default header bar shows Adwaita's back button; defaults to `true`. */\n headerBackVisible?: boolean;\n /** Whether the user can pop this page with the back button, Escape, Alt+Left or a swipe; defaults to `true`. */\n canPop?: boolean;\n /** Whether pushing and popping this page animates; defaults to `\"default\"`. */\n animation?: \"default\" | \"none\";\n};\n\n/** Props of the stack navigator beyond the options every navigator shares. */\ntype StackNavigationConfig = {\n /** Whether pressing Escape pops the visible page; defaults to `true`. */\n popOnEscape?: boolean;\n};\n\n/** Navigation object of a stack screen. */\ntype StackNavigationProp<\n ParamList extends ParamListBase,\n RouteName extends keyof ParamList = keyof ParamList,\n NavigatorID extends string | undefined = undefined,\n> = NavigationProp<\n ParamList,\n RouteName,\n NavigatorID,\n StackNavigationState<ParamList>,\n StackNavigationOptions,\n StackNavigationEventMap\n>
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/stack/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n DefaultNavigatorOptions,\n Descriptor,\n NavigationHelpers,\n NavigationProp,\n ParamListBase,\n RouteProp,\n StackActionHelpers,\n StackNavigationState,\n StackRouterOptions,\n} from \"@react-navigation/core\";\nimport type { ReactNode } from \"react\";\nimport type { HeaderOptions } from \"../shared/types.js\";\n\n/** Data carried by the `transitionStart` and `transitionEnd` events. */\ntype StackTransitionData = {\n /** Whether the page is hiding (`true`) or showing (`false`). */\n closing: boolean;\n};\n\n/** Events the stack navigator emits on top of React Navigation's core events. */\ntype StackNavigationEventMap = {\n /** A page starts showing or hiding. */\n transitionStart: {\n /** Which direction the page moves in. */\n data: StackTransitionData;\n };\n /** A page finished showing or hiding. */\n transitionEnd: {\n /** Which direction the page moved in. */\n data: StackTransitionData;\n };\n};\n\n/** The page below the current one, as handed to a custom `header`. */\ntype StackHeaderBack = {\n /** Title of the page below. */\n title: string;\n};\n\n/** Per-screen options of the stack navigator. */\ntype StackNavigationOptions = HeaderOptions & {\n /** Renders a custom top bar instead of the default `AdwHeaderBar`. */\n header?: (props: StackHeaderProps) => ReactNode;\n /** Whether the default header bar shows Adwaita's back button; defaults to `true`. */\n headerBackVisible?: boolean;\n /** Whether the user can pop this page with the back button, Escape, Alt+Left or a swipe; defaults to `true`. */\n canPop?: boolean;\n /** Whether pushing and popping this page animates; defaults to `\"default\"`. */\n animation?: \"default\" | \"none\";\n};\n\n/** Props of the stack navigator beyond the options every navigator shares. */\ntype StackNavigationConfig = {\n /** Whether pressing Escape pops the visible page; defaults to `true`. */\n popOnEscape?: boolean;\n};\n\n/** Navigation object of a stack screen. */\ntype StackNavigationProp<\n ParamList extends ParamListBase,\n RouteName extends keyof ParamList = keyof ParamList,\n NavigatorID extends string | undefined = undefined,\n> = NavigationProp<\n ParamList,\n RouteName,\n NavigatorID,\n StackNavigationState<ParamList>,\n StackNavigationOptions,\n StackNavigationEventMap\n> &\n StackActionHelpers<ParamList>;\n\n/** Props a stack screen component receives. */\ntype StackScreenProps<\n ParamList extends ParamListBase,\n RouteName extends keyof ParamList = keyof ParamList,\n NavigatorID extends string | undefined = undefined,\n> = {\n /** Navigation object of the screen. */\n navigation: StackNavigationProp<ParamList, RouteName, NavigatorID>;\n /** The route the screen renders. */\n route: RouteProp<ParamList, RouteName>;\n};\n\n/** Arguments of a custom stack `header` renderer. */\ntype StackHeaderProps = {\n /** The route whose header is rendered. */\n route: RouteProp<ParamListBase>;\n /** Navigation object of that route. */\n navigation: StackNavigationProp<ParamListBase>;\n /** Resolved options of that route. */\n options: StackNavigationOptions;\n /** The page below this one in the stack, if any. */\n back?: StackHeaderBack;\n};\n\n/** Navigation helpers of the stack navigator itself. */\ntype StackNavigationHelpers = NavigationHelpers<ParamListBase, StackNavigationEventMap> &\n StackActionHelpers<ParamListBase>;\n\n/** Descriptor of one stack route. */\ntype StackDescriptor = Descriptor<StackNavigationOptions, StackNavigationProp<ParamListBase>, RouteProp<ParamListBase>>;\n/** Descriptors of the stack routes, keyed by route key. */\ntype StackDescriptorMap = Record<string, StackDescriptor>;\n\n/** Props of the stack `Navigator` component. */\ntype StackNavigatorProps = DefaultNavigatorOptions<\n ParamListBase,\n string | undefined,\n StackNavigationState<ParamListBase>,\n StackNavigationOptions,\n StackNavigationEventMap,\n StackNavigationProp<ParamListBase>\n> &\n StackRouterOptions &\n StackNavigationConfig;\n\nexport type {\n StackDescriptor,\n StackDescriptorMap,\n StackHeaderBack,\n StackHeaderProps,\n StackNavigationConfig,\n StackNavigationEventMap,\n StackNavigationHelpers,\n StackNavigationOptions,\n StackNavigationProp,\n StackNavigatorProps,\n StackScreenProps,\n StackTransitionData,\n};\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { NavigatorTypeBagBase, ParamListBase, StaticConfig, StaticScreenFactory, TypedNavigator } from "@react-navigation/core";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
import type { TabViewNavigationEventMap, TabViewNavigationOptions, TabViewNavigationProp, TabViewNavigationState, TabViewNavigatorProps } from "./types.js";
|
|
4
|
+
/** Type bag describing the tab view navigator to React Navigation's typed APIs. */
|
|
5
|
+
type TabViewTypeBag<ParamList extends ParamListBase = ParamListBase, NavigatorID extends string | undefined = string | undefined> = {
|
|
6
|
+
/** Route names and their params. */
|
|
7
|
+
ParamList: ParamList;
|
|
8
|
+
/** Optional navigator id. */
|
|
9
|
+
NavigatorID: NavigatorID;
|
|
10
|
+
/** Shape of the navigator state. */
|
|
11
|
+
State: TabViewNavigationState<ParamList>;
|
|
12
|
+
/** Per-screen options. */
|
|
13
|
+
ScreenOptions: TabViewNavigationOptions;
|
|
14
|
+
/** Events the navigator emits. */
|
|
15
|
+
EventMap: TabViewNavigationEventMap;
|
|
16
|
+
/** Navigation object per route. */
|
|
17
|
+
NavigationList: {
|
|
18
|
+
[RouteName in keyof ParamList]: TabViewNavigationProp<ParamList, RouteName, NavigatorID>;
|
|
19
|
+
};
|
|
20
|
+
/** The navigator component. */
|
|
21
|
+
Navigator: typeof TabViewNavigator;
|
|
22
|
+
};
|
|
23
|
+
/** Declares a typed screen of a tab view navigator for the static configuration API. */
|
|
24
|
+
declare const createTabViewScreen: StaticScreenFactory<TabViewTypeBag>;
|
|
25
|
+
/** Renders each open route of a {@link createTabViewNavigator} as a page of an `Adw.TabView`. */
|
|
26
|
+
declare function TabViewNavigator({ view: providedView, tabBarVisible, tabBarAutohide, tabBarExpand, tabBarInverted, overview, menuModel, renderMenu, extraDropTarget, onExtraDragDrop, onCreateWindow, onSetupMenu, shortcuts, defaultIcon, ...options }: TabViewNavigatorProps): ReactNode;
|
|
27
|
+
/** Creates a navigator whose routes are the pages of an `Adw.TabView`, with a tab bar and an optional overview. */
|
|
28
|
+
declare function createTabViewNavigator<const ParamList extends ParamListBase, const NavigatorID extends string | undefined = string | undefined, const TypeBag extends NavigatorTypeBagBase = TabViewTypeBag<ParamList, NavigatorID>>(): TypedNavigator<TypeBag, undefined>;
|
|
29
|
+
/** Creates a navigator whose routes are the pages of an `Adw.TabView`, with a tab bar and an optional overview. */
|
|
30
|
+
declare function createTabViewNavigator<const ParamList extends ParamListBase, const NavigatorID extends string | undefined = string | undefined, const TypeBag extends NavigatorTypeBagBase = TabViewTypeBag<ParamList, NavigatorID>, const Config extends StaticConfig<TypeBag> = StaticConfig<TypeBag>>(config: Config): TypedNavigator<TypeBag, Config>;
|
|
31
|
+
export { createTabViewNavigator, createTabViewScreen, TabViewNavigator, type TabViewTypeBag };
|
|
32
|
+
//# sourceMappingURL=create-tab-view-navigator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-tab-view-navigator.d.ts","sourceRoot":"","sources":["../../src/tab-view/create-tab-view-navigator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,OAAO,KAAK,EAER,yBAAyB,EACzB,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EAExB,MAAM,YAAY,CAAC;AAKpB,mFAAmF;AACnF,KAAK,cAAc,CACf,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,sBAAsB,CAAC,SAAS,CAAC,CAAC;IACzC,0BAA0B;IAC1B,aAAa,EAAE,wBAAwB,CAAC;IACxC,kCAAkC;IAClC,QAAQ,EAAE,yBAAyB,CAAC;IACpC,mCAAmC;IACnC,cAAc,EAAE;SACX,SAAS,IAAI,MAAM,SAAS,GAAG,qBAAqB,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC;KAC3F,CAAC;IACF,+BAA+B;IAC/B,SAAS,EAAE,OAAO,gBAAgB,CAAC;CACtC,CAAC;AAEF,wFAAwF;AACxF,QAAA,MAAM,mBAAmB,EAAE,mBAAmB,CAAC,cAAc,CAAyC,CAAC;AAEvG,iGAAiG;AACjG,iBAAS,gBAAgB,CAAC,EACtB,IAAI,EAAE,YAAY,EAClB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,SAAS,EACT,UAAU,EACV,eAAe,EACf,eAAe,EACf,cAAc,EACd,WAAW,EACX,SAAS,EACT,WAAW,EACX,GAAG,OAAO,EACb,EAAE,qBAAqB,GAAG,SAAS,CAgCnC;AAED,mHAAmH;AACnH,iBAAS,sBAAsB,CAC3B,KAAK,CAAC,SAAS,SAAS,aAAa,EACrC,KAAK,CAAC,WAAW,SAAS,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,EACjE,KAAK,CAAC,OAAO,SAAS,oBAAoB,GAAG,cAAc,CAAC,SAAS,EAAE,WAAW,CAAC,KAClF,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AACxC,mHAAmH;AACnH,iBAAS,sBAAsB,CAC3B,KAAK,CAAC,SAAS,SAAS,aAAa,EACrC,KAAK,CAAC,WAAW,SAAS,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,EACjE,KAAK,CAAC,OAAO,SAAS,oBAAoB,GAAG,cAAc,CAAC,SAAS,EAAE,WAAW,CAAC,EACnF,KAAK,CAAC,MAAM,SAAS,YAAY,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,EACpE,MAAM,EAAE,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAQnD,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,KAAK,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import * as Adw from "@gtkx/gi/adw";
|
|
3
|
+
import { createNavigatorFactory, createScreenFactory, useNavigationBuilder } from "@react-navigation/core";
|
|
4
|
+
import { useState } from "react";
|
|
5
|
+
import { readExistingTabs } from "./page-registry.js";
|
|
6
|
+
import { TabViewHost } from "./tab-view-host.js";
|
|
7
|
+
import { createTabViewRouter } from "./tab-view-router.js";
|
|
8
|
+
/** Declares a typed screen of a tab view navigator for the static configuration API. */
|
|
9
|
+
const createTabViewScreen = createScreenFactory();
|
|
10
|
+
/** Renders each open route of a {@link createTabViewNavigator} as a page of an `Adw.TabView`. */
|
|
11
|
+
function TabViewNavigator({ view: providedView, tabBarVisible, tabBarAutohide, tabBarExpand, tabBarInverted, overview, menuModel, renderMenu, extraDropTarget, onExtraDragDrop, onCreateWindow, onSetupMenu, shortcuts, defaultIcon, ...options }) {
|
|
12
|
+
const [view] = useState(() => providedView ?? new Adw.TabView());
|
|
13
|
+
const [router] = useState(() => createTabViewRouter(() => readExistingTabs(view)));
|
|
14
|
+
const { state, descriptors, navigation, render } = useNavigationBuilder(router, options);
|
|
15
|
+
return render(_jsx(TabViewHost, { view: view, state: state, navigation: navigation, descriptors: descriptors, tabBarVisible: tabBarVisible, tabBarAutohide: tabBarAutohide, tabBarExpand: tabBarExpand, tabBarInverted: tabBarInverted, overview: overview, menuModel: menuModel, renderMenu: renderMenu, extraDropTarget: extraDropTarget, onExtraDragDrop: onExtraDragDrop, onCreateWindow: onCreateWindow, onSetupMenu: onSetupMenu, shortcuts: shortcuts, defaultIcon: defaultIcon }));
|
|
16
|
+
}
|
|
17
|
+
function createTabViewNavigator(config) {
|
|
18
|
+
return createNavigatorFactory(TabViewNavigator)(config);
|
|
19
|
+
}
|
|
20
|
+
export { createTabViewNavigator, createTabViewScreen, TabViewNavigator };
|
|
21
|
+
//# sourceMappingURL=create-tab-view-navigator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-tab-view-navigator.js","sourceRoot":"","sources":["../../src/tab-view/create-tab-view-navigator.tsx"],"names":[],"mappings":";AAQA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC3G,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAUjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAyB3D,wFAAwF;AACxF,MAAM,mBAAmB,GAAwC,mBAAmB,EAAkB,CAAC;AAEvG,iGAAiG;AACjG,SAAS,gBAAgB,CAAC,EACtB,IAAI,EAAE,YAAY,EAClB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,SAAS,EACT,UAAU,EACV,eAAe,EACf,eAAe,EACf,cAAc,EACd,WAAW,EACX,SAAS,EACT,WAAW,EACX,GAAG,OAAO,EACU;IACpB,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,YAAY,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACjE,MAAM,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnF,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,oBAAoB,CAMrE,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnB,OAAO,MAAM,CACT,KAAC,WAAW,IACR,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,cAAc,EAC9B,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,eAAe,EAChC,eAAe,EAAE,eAAe,EAChC,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,GAC1B,CACL,CAAC;AACN,CAAC;AAeD,SAAS,sBAAsB,CAG7B,MAAe;IACb,OAAO,sBAAsB,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAoC,CAAC;AAC/F,CAAC;AAED,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,gBAAgB,EAAuB,CAAC","sourcesContent":["import type {\n NavigatorTypeBagBase,\n ParamListBase,\n StaticConfig,\n StaticScreenFactory,\n TypedNavigator,\n} from \"@react-navigation/core\";\nimport type { ReactNode } from \"react\";\nimport * as Adw from \"@gtkx/gi/adw\";\nimport { createNavigatorFactory, createScreenFactory, useNavigationBuilder } from \"@react-navigation/core\";\nimport { useState } from \"react\";\nimport type {\n TabViewActionHelpers,\n TabViewNavigationEventMap,\n TabViewNavigationOptions,\n TabViewNavigationProp,\n TabViewNavigationState,\n TabViewNavigatorProps,\n TabViewRouterOptions,\n} from \"./types.js\";\nimport { readExistingTabs } from \"./page-registry.js\";\nimport { TabViewHost } from \"./tab-view-host.js\";\nimport { createTabViewRouter } from \"./tab-view-router.js\";\n\n/** Type bag describing the tab view navigator to React Navigation's typed APIs. */\ntype TabViewTypeBag<\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: TabViewNavigationState<ParamList>;\n /** Per-screen options. */\n ScreenOptions: TabViewNavigationOptions;\n /** Events the navigator emits. */\n EventMap: TabViewNavigationEventMap;\n /** Navigation object per route. */\n NavigationList: {\n [RouteName in keyof ParamList]: TabViewNavigationProp<ParamList, RouteName, NavigatorID>;\n };\n /** The navigator component. */\n Navigator: typeof TabViewNavigator;\n};\n\n/** Declares a typed screen of a tab view navigator for the static configuration API. */\nconst createTabViewScreen: StaticScreenFactory<TabViewTypeBag> = createScreenFactory<TabViewTypeBag>();\n\n/** Renders each open route of a {@link createTabViewNavigator} as a page of an `Adw.TabView`. */\nfunction TabViewNavigator({\n view: providedView,\n tabBarVisible,\n tabBarAutohide,\n tabBarExpand,\n tabBarInverted,\n overview,\n menuModel,\n renderMenu,\n extraDropTarget,\n onExtraDragDrop,\n onCreateWindow,\n onSetupMenu,\n shortcuts,\n defaultIcon,\n ...options\n}: TabViewNavigatorProps): ReactNode {\n const [view] = useState(() => providedView ?? new Adw.TabView());\n const [router] = useState(() => createTabViewRouter(() => readExistingTabs(view)));\n const { state, descriptors, navigation, render } = useNavigationBuilder<\n TabViewNavigationState<ParamListBase>,\n TabViewRouterOptions,\n TabViewActionHelpers<ParamListBase>,\n TabViewNavigationOptions,\n TabViewNavigationEventMap\n >(router, options);\n\n return render(\n <TabViewHost\n view={view}\n state={state}\n navigation={navigation}\n descriptors={descriptors}\n tabBarVisible={tabBarVisible}\n tabBarAutohide={tabBarAutohide}\n tabBarExpand={tabBarExpand}\n tabBarInverted={tabBarInverted}\n overview={overview}\n menuModel={menuModel}\n renderMenu={renderMenu}\n extraDropTarget={extraDropTarget}\n onExtraDragDrop={onExtraDragDrop}\n onCreateWindow={onCreateWindow}\n onSetupMenu={onSetupMenu}\n shortcuts={shortcuts}\n defaultIcon={defaultIcon}\n />,\n );\n}\n\n/** Creates a navigator whose routes are the pages of an `Adw.TabView`, with a tab bar and an optional overview. */\nfunction createTabViewNavigator<\n const ParamList extends ParamListBase,\n const NavigatorID extends string | undefined = string | undefined,\n const TypeBag extends NavigatorTypeBagBase = TabViewTypeBag<ParamList, NavigatorID>,\n>(): TypedNavigator<TypeBag, undefined>;\n/** Creates a navigator whose routes are the pages of an `Adw.TabView`, with a tab bar and an optional overview. */\nfunction createTabViewNavigator<\n const ParamList extends ParamListBase,\n const NavigatorID extends string | undefined = string | undefined,\n const TypeBag extends NavigatorTypeBagBase = TabViewTypeBag<ParamList, NavigatorID>,\n const Config extends StaticConfig<TypeBag> = StaticConfig<TypeBag>,\n>(config: Config): TypedNavigator<TypeBag, Config>;\nfunction createTabViewNavigator<\n const TypeBag extends NavigatorTypeBagBase,\n const Config extends StaticConfig<TypeBag> | undefined,\n>(config?: Config): TypedNavigator<TypeBag, Config> {\n return createNavigatorFactory(TabViewNavigator)(config) as TypedNavigator<TypeBag, Config>;\n}\n\nexport { createTabViewNavigator, createTabViewScreen, TabViewNavigator, type TabViewTypeBag };\n"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as Adw from "@gtkx/gi/adw";
|
|
2
|
+
import type { ParamListBase } from "@react-navigation/core";
|
|
3
|
+
import type { ExistingTab } from "./tab-view-router.js";
|
|
4
|
+
import type { TabViewNavigationOptions, TabViewNavigationState } from "./types.js";
|
|
5
|
+
type Route = TabViewNavigationState<ParamListBase>["routes"][number];
|
|
6
|
+
/** Page property values last written from a route's options. */
|
|
7
|
+
type AppliedOptions = Pick<TabViewNavigationOptions, "icon" | "indicatorActivatable" | "indicatorIcon" | "indicatorTooltip" | "keyword" | "liveThumbnail" | "loading" | "needsAttention" | "thumbnailXalign" | "thumbnailYalign" | "tooltip"> & {
|
|
8
|
+
title?: string;
|
|
9
|
+
};
|
|
10
|
+
/** A native page a tab view navigator created or adopted, with the host its content renders into. */
|
|
11
|
+
type PageRecord = {
|
|
12
|
+
route: Route;
|
|
13
|
+
page: Adw.TabPage;
|
|
14
|
+
host: Adw.Bin;
|
|
15
|
+
applied: AppliedOptions;
|
|
16
|
+
};
|
|
17
|
+
/** The pages of one navigator by route key, notifying React when the set changes. */
|
|
18
|
+
type PageStore = {
|
|
19
|
+
get: (key: string) => PageRecord | undefined;
|
|
20
|
+
set: (record: PageRecord) => void;
|
|
21
|
+
delete: (key: string) => void;
|
|
22
|
+
keys: () => string[];
|
|
23
|
+
subscribe: (listener: () => void) => () => void;
|
|
24
|
+
getVersion: () => number;
|
|
25
|
+
/** Key of the route whose page was selected by the last sync, so native selection changes are not undone. */
|
|
26
|
+
lastFocus: string | undefined;
|
|
27
|
+
};
|
|
28
|
+
declare const recordOf: (page: Adw.TabPage) => PageRecord | undefined;
|
|
29
|
+
declare const registerPage: (record: PageRecord) => void;
|
|
30
|
+
declare const ownerOf: (page: Adw.TabPage) => Adw.TabView | null;
|
|
31
|
+
declare const readExistingTabs: (view: Adw.TabView) => ExistingTab[];
|
|
32
|
+
declare const createPageStore: () => PageStore;
|
|
33
|
+
export { type AppliedOptions, createPageStore, ownerOf, type PageRecord, type PageStore, readExistingTabs, recordOf, registerPage, };
|
|
34
|
+
//# sourceMappingURL=page-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-registry.d.ts","sourceRoot":"","sources":["../../src/tab-view/page-registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEnF,KAAK,KAAK,GAAG,sBAAsB,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAErE,gEAAgE;AAChE,KAAK,cAAc,GAAG,IAAI,CACtB,wBAAwB,EACtB,MAAM,GACN,sBAAsB,GACtB,eAAe,GACf,kBAAkB,GAClB,SAAS,GACT,eAAe,GACf,SAAS,GACT,gBAAgB,GAChB,iBAAiB,GACjB,iBAAiB,GACjB,SAAS,CACd,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvB,qGAAqG;AACrG,KAAK,UAAU,GAAG;IACd,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC;IAClB,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC;IACd,OAAO,EAAE,cAAc,CAAC;CAC3B,CAAC;AAEF,qFAAqF;AACrF,KAAK,SAAS,GAAG;IACb,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,CAAC;IAC7C,GAAG,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,IAAI,EAAE,MAAM,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAChD,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,6GAA6G;IAC7G,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC,CAAC;AAIF,QAAA,MAAM,QAAQ,SAAU,GAAG,CAAC,OAAO,KAAG,UAAU,GAAG,SAA8B,CAAC;AAElF,QAAA,MAAM,YAAY,WAAY,UAAU,KAAG,IAE1C,CAAC;AAEF,QAAA,MAAM,OAAO,SAAU,GAAG,CAAC,OAAO,KAAG,GAAG,CAAC,OAAO,GAAG,IAYlD,CAAC;AAEF,QAAA,MAAM,gBAAgB,SAAU,GAAG,CAAC,OAAO,KAAG,WAAW,EAwBxD,CAAC;AAEF,QAAA,MAAM,eAAe,QAAO,SAmC3B,CAAC;AAEF,OAAO,EACH,KAAK,cAAc,EACnB,eAAe,EACf,OAAO,EACP,KAAK,UAAU,EACf,KAAK,SAAS,EACd,gBAAgB,EAChB,QAAQ,EACR,YAAY,GACf,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import * as Adw from "@gtkx/gi/adw";
|
|
2
|
+
const records = new WeakMap();
|
|
3
|
+
const recordOf = (page) => records.get(page);
|
|
4
|
+
const registerPage = (record) => {
|
|
5
|
+
records.set(record.page, record);
|
|
6
|
+
};
|
|
7
|
+
const ownerOf = (page) => {
|
|
8
|
+
let widget = page.getChild();
|
|
9
|
+
while (widget !== null) {
|
|
10
|
+
if (widget instanceof Adw.TabView) {
|
|
11
|
+
return widget;
|
|
12
|
+
}
|
|
13
|
+
widget = widget.getParent();
|
|
14
|
+
}
|
|
15
|
+
return null;
|
|
16
|
+
};
|
|
17
|
+
const readExistingTabs = (view) => {
|
|
18
|
+
const selected = view.getSelectedPage();
|
|
19
|
+
const tabs = [];
|
|
20
|
+
for (let position = 0; position < view.getNPages(); position += 1) {
|
|
21
|
+
const page = view.getNthPage(position);
|
|
22
|
+
const record = records.get(page);
|
|
23
|
+
if (record === undefined) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const parent = page.getParent();
|
|
27
|
+
const parentRecord = parent === null ? undefined : records.get(parent);
|
|
28
|
+
tabs.push({
|
|
29
|
+
route: record.route,
|
|
30
|
+
pinned: page.getPinned(),
|
|
31
|
+
parent: parentRecord?.route.key,
|
|
32
|
+
selected: page === selected,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return tabs;
|
|
36
|
+
};
|
|
37
|
+
const createPageStore = () => {
|
|
38
|
+
const byKey = new Map();
|
|
39
|
+
const listeners = new Set();
|
|
40
|
+
let version = 0;
|
|
41
|
+
const notify = () => {
|
|
42
|
+
version += 1;
|
|
43
|
+
for (const listener of listeners) {
|
|
44
|
+
listener();
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
return {
|
|
48
|
+
get: (key) => byKey.get(key),
|
|
49
|
+
set: (record) => {
|
|
50
|
+
byKey.set(record.route.key, record);
|
|
51
|
+
notify();
|
|
52
|
+
},
|
|
53
|
+
delete: (key) => {
|
|
54
|
+
if (byKey.delete(key)) {
|
|
55
|
+
notify();
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
keys: () => [...byKey.keys()],
|
|
59
|
+
subscribe: (listener) => {
|
|
60
|
+
listeners.add(listener);
|
|
61
|
+
return () => {
|
|
62
|
+
listeners.delete(listener);
|
|
63
|
+
};
|
|
64
|
+
},
|
|
65
|
+
getVersion: () => version,
|
|
66
|
+
lastFocus: undefined,
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
export { createPageStore, ownerOf, readExistingTabs, recordOf, registerPage, };
|
|
70
|
+
//# sourceMappingURL=page-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-registry.js","sourceRoot":"","sources":["../../src/tab-view/page-registry.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport * as Adw from \"@gtkx/gi/adw\";\nimport type { ParamListBase } from \"@react-navigation/core\";\nimport type { ExistingTab } from \"./tab-view-router.js\";\nimport type { TabViewNavigationOptions, TabViewNavigationState } from \"./types.js\";\n\ntype Route = TabViewNavigationState<ParamListBase>[\"routes\"][number];\n\n/** Page property values last written from a route's options. */\ntype AppliedOptions = Pick<\n TabViewNavigationOptions,\n | \"icon\"\n | \"indicatorActivatable\"\n | \"indicatorIcon\"\n | \"indicatorTooltip\"\n | \"keyword\"\n | \"liveThumbnail\"\n | \"loading\"\n | \"needsAttention\"\n | \"thumbnailXalign\"\n | \"thumbnailYalign\"\n | \"tooltip\"\n> & { title?: string };\n\n/** A native page a tab view navigator created or adopted, with the host its content renders into. */\ntype PageRecord = {\n route: Route;\n page: Adw.TabPage;\n host: Adw.Bin;\n applied: AppliedOptions;\n};\n\n/** The pages of one navigator by route key, notifying React when the set changes. */\ntype PageStore = {\n get: (key: string) => PageRecord | undefined;\n set: (record: PageRecord) => void;\n delete: (key: string) => void;\n keys: () => string[];\n subscribe: (listener: () => void) => () => void;\n getVersion: () => number;\n /** Key of the route whose page was selected by the last sync, so native selection changes are not undone. */\n lastFocus: string | undefined;\n};\n\nconst records = new WeakMap<Adw.TabPage, PageRecord>();\n\nconst recordOf = (page: Adw.TabPage): PageRecord | undefined => records.get(page);\n\nconst registerPage = (record: PageRecord): void => {\n records.set(record.page, record);\n};\n\nconst ownerOf = (page: Adw.TabPage): Adw.TabView | null => {\n let widget: Gtk.Widget | null = page.getChild();\n\n while (widget !== null) {\n if (widget instanceof Adw.TabView) {\n return widget;\n }\n\n widget = widget.getParent();\n }\n\n return null;\n};\n\nconst readExistingTabs = (view: Adw.TabView): ExistingTab[] => {\n const selected = view.getSelectedPage();\n const tabs: ExistingTab[] = [];\n\n for (let position = 0; position < view.getNPages(); position += 1) {\n const page = view.getNthPage(position);\n const record = records.get(page);\n\n if (record === undefined) {\n continue;\n }\n\n const parent = page.getParent();\n const parentRecord = parent === null ? undefined : records.get(parent);\n\n tabs.push({\n route: record.route,\n pinned: page.getPinned(),\n parent: parentRecord?.route.key,\n selected: page === selected,\n });\n }\n\n return tabs;\n};\n\nconst createPageStore = (): PageStore => {\n const byKey = new Map<string, PageRecord>();\n const listeners = new Set<() => void>();\n let version = 0;\n\n const notify = (): void => {\n version += 1;\n\n for (const listener of listeners) {\n listener();\n }\n };\n\n return {\n get: (key) => byKey.get(key),\n set: (record) => {\n byKey.set(record.route.key, record);\n notify();\n },\n delete: (key) => {\n if (byKey.delete(key)) {\n notify();\n }\n },\n keys: () => [...byKey.keys()],\n subscribe: (listener) => {\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n };\n },\n getVersion: () => version,\n lastFocus: undefined,\n };\n};\n\nexport {\n type AppliedOptions,\n createPageStore,\n ownerOf,\n type PageRecord,\n type PageStore,\n readExistingTabs,\n recordOf,\n registerPage,\n};\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ParamListBase } from "@react-navigation/core";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
import * as Adw from "@gtkx/gi/adw";
|
|
4
|
+
import type { TabViewDescriptorMap, TabViewNavigationConfig, TabViewNavigationHelpers, TabViewNavigationState } from "./types.js";
|
|
5
|
+
type State = TabViewNavigationState<ParamListBase>;
|
|
6
|
+
type TabViewHostProps = TabViewNavigationConfig & {
|
|
7
|
+
view: Adw.TabView;
|
|
8
|
+
state: State;
|
|
9
|
+
navigation: TabViewNavigationHelpers;
|
|
10
|
+
descriptors: TabViewDescriptorMap;
|
|
11
|
+
};
|
|
12
|
+
/** The native view of the surrounding tab view navigator and access to its pages. */
|
|
13
|
+
type TabViewHandle = {
|
|
14
|
+
/** The `Adw.TabView` the navigator renders into. */
|
|
15
|
+
view: Adw.TabView;
|
|
16
|
+
/** Returns the native page of a route, or `null` when it is not in this view. */
|
|
17
|
+
getPage: (key: string) => Adw.TabPage | null;
|
|
18
|
+
/** Moves a route's page into another view, appending to its pinned or unpinned group by default. */
|
|
19
|
+
transferTab: (key: string, target: Adw.TabView, position?: number) => void;
|
|
20
|
+
};
|
|
21
|
+
/** Returns the surrounding tab view navigator's native view and page access. */
|
|
22
|
+
declare const useTabView: () => TabViewHandle;
|
|
23
|
+
declare const TabViewHost: (props: TabViewHostProps) => ReactNode;
|
|
24
|
+
export { type TabViewHandle, TabViewHost, useTabView };
|
|
25
|
+
//# sourceMappingURL=tab-view-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tab-view-host.d.ts","sourceRoot":"","sources":["../../src/tab-view/tab-view-host.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,wBAAwB,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAMpC,OAAO,KAAK,EAER,oBAAoB,EAEpB,uBAAuB,EACvB,wBAAwB,EAExB,sBAAsB,EACzB,MAAM,YAAY,CAAC;AAOpB,KAAK,KAAK,GAAG,sBAAsB,CAAC,aAAa,CAAC,CAAC;AAGnD,KAAK,gBAAgB,GAAG,uBAAuB,GAAG;IAC9C,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,wBAAwB,CAAC;IACrC,WAAW,EAAE,oBAAoB,CAAC;CACrC,CAAC;AAOF,qFAAqF;AACrF,KAAK,aAAa,GAAG;IACjB,oDAAoD;IACpD,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC;IAClB,iFAAiF;IACjF,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;IAC7C,oGAAoG;IACpG,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9E,CAAC;AAIF,gFAAgF;AAChF,QAAA,MAAM,UAAU,QAAO,aAQtB,CAAC;AAmJF,QAAA,MAAM,WAAW,UAAW,gBAAgB,KAAG,SAwQ9C,CAAC;AAEF,OAAO,EAAE,KAAK,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as Adw from "@gtkx/gi/adw";
|
|
3
|
+
import * as Gio from "@gtkx/gi/gio";
|
|
4
|
+
import { AdwBin, AdwTabBar, AdwTabOverview, AdwToolbarView } from "@gtkx/jsx/adw";
|
|
5
|
+
import { createPortal, rootElement, useProperty, useSignal } from "@gtkx/react";
|
|
6
|
+
import { createContext, useContext, useLayoutEffect, useState, useSyncExternalStore } from "react";
|
|
7
|
+
import { HeaderBar } from "../shared/header-bar.js";
|
|
8
|
+
import { getFocusedRoute, requireDescriptor } from "../shared/routes.js";
|
|
9
|
+
import { createPageStore, ownerOf, recordOf, registerPage } from "./page-registry.js";
|
|
10
|
+
import { createRouteKey, focusedKey, hasRoute, TabViewActions } from "./tab-view-router.js";
|
|
11
|
+
import { useHasLoaded } from "../shared/use-has-loaded.js";
|
|
12
|
+
const TabViewContext = createContext(null);
|
|
13
|
+
/** Returns the surrounding tab view navigator's native view and page access. */
|
|
14
|
+
const useTabView = () => {
|
|
15
|
+
const handle = useContext(TabViewContext);
|
|
16
|
+
if (handle === null) {
|
|
17
|
+
throw new Error("useTabView must be called inside a tab view navigator.");
|
|
18
|
+
}
|
|
19
|
+
return handle;
|
|
20
|
+
};
|
|
21
|
+
const toIcon = (icon) => typeof icon === "string" ? Gio.ThemedIcon.new(icon) : (icon ?? null);
|
|
22
|
+
const sync = (key, set) => (page, previous, next) => {
|
|
23
|
+
if (previous[key] !== next[key]) {
|
|
24
|
+
set(page, next[key]);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
const pageSyncs = [
|
|
28
|
+
sync("title", (page, title) => page.setTitle(title ?? "")),
|
|
29
|
+
sync("icon", (page, icon) => page.setIcon(toIcon(icon))),
|
|
30
|
+
sync("tooltip", (page, tooltip) => page.setTooltip(tooltip ?? "")),
|
|
31
|
+
sync("keyword", (page, keyword) => page.setKeyword(keyword ?? "")),
|
|
32
|
+
sync("loading", (page, loading) => page.setLoading(loading ?? false)),
|
|
33
|
+
sync("needsAttention", (page, value) => page.setNeedsAttention(value ?? false)),
|
|
34
|
+
sync("indicatorIcon", (page, icon) => page.setIndicatorIcon(toIcon(icon))),
|
|
35
|
+
sync("indicatorActivatable", (page, value) => page.setIndicatorActivatable(value ?? false)),
|
|
36
|
+
sync("indicatorTooltip", (page, value) => page.setIndicatorTooltip(value ?? "")),
|
|
37
|
+
sync("liveThumbnail", (page, value) => page.setLiveThumbnail(value ?? false)),
|
|
38
|
+
sync("thumbnailXalign", (page, value) => page.setThumbnailXalign(value ?? 0)),
|
|
39
|
+
sync("thumbnailYalign", (page, value) => page.setThumbnailYalign(value ?? 0)),
|
|
40
|
+
];
|
|
41
|
+
const applyPageOptions = (record, options) => {
|
|
42
|
+
const next = { ...options, title: options.title ?? record.route.name };
|
|
43
|
+
for (const apply of pageSyncs) {
|
|
44
|
+
apply(record.page, record.applied, next);
|
|
45
|
+
}
|
|
46
|
+
record.applied = next;
|
|
47
|
+
};
|
|
48
|
+
const createPage = (view, store, route, placement) => {
|
|
49
|
+
const host = new Adw.Bin();
|
|
50
|
+
const pinnedCount = view.getNPinnedPages();
|
|
51
|
+
const page = placement.pinned
|
|
52
|
+
? view.insertPinned(host, Math.min(placement.position, pinnedCount))
|
|
53
|
+
: placement.parent !== undefined && ownerOf(placement.parent.page) === view
|
|
54
|
+
? view.addPage(host, placement.parent.page)
|
|
55
|
+
: view.insert(host, Math.min(Math.max(placement.position, pinnedCount), view.getNPages()));
|
|
56
|
+
const record = { route, page, host, applied: {} };
|
|
57
|
+
registerPage(record);
|
|
58
|
+
store.set(record);
|
|
59
|
+
return record;
|
|
60
|
+
};
|
|
61
|
+
const presentRecord = (view, store, key) => {
|
|
62
|
+
const record = key === undefined ? undefined : store.get(key);
|
|
63
|
+
return record !== undefined && ownerOf(record.page) === view ? record : undefined;
|
|
64
|
+
};
|
|
65
|
+
const adoptPages = (view, store) => {
|
|
66
|
+
for (let position = 0; position < view.getNPages(); position += 1) {
|
|
67
|
+
const record = recordOf(view.getNthPage(position));
|
|
68
|
+
if (record !== undefined && store.get(record.route.key) === undefined) {
|
|
69
|
+
store.set(record);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
const syncPages = (view, store, state, descriptors) => {
|
|
74
|
+
adoptPages(view, store);
|
|
75
|
+
for (const key of store.keys()) {
|
|
76
|
+
if (!hasRoute(state, key)) {
|
|
77
|
+
const record = store.get(key);
|
|
78
|
+
store.delete(key);
|
|
79
|
+
if (record !== undefined && ownerOf(record.page) === view) {
|
|
80
|
+
view.closePage(record.page);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
state.routes.forEach((route, position) => {
|
|
85
|
+
if (store.get(route.key) === undefined) {
|
|
86
|
+
const parentKey = state.parents[route.key];
|
|
87
|
+
createPage(view, store, route, {
|
|
88
|
+
position,
|
|
89
|
+
pinned: state.pinnedKeys.includes(route.key),
|
|
90
|
+
parent: parentKey === undefined ? undefined : store.get(parentKey),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
const present = state.routes.flatMap((route) => {
|
|
95
|
+
const record = presentRecord(view, store, route.key);
|
|
96
|
+
return record === undefined ? [] : [{ route, record }];
|
|
97
|
+
});
|
|
98
|
+
for (const { route, record } of present) {
|
|
99
|
+
const pinned = state.pinnedKeys.includes(route.key);
|
|
100
|
+
if (record.page.getPinned() !== pinned) {
|
|
101
|
+
view.setPagePinned(record.page, pinned);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
present.forEach(({ record }, position) => {
|
|
105
|
+
if (view.getPagePosition(record.page) !== position) {
|
|
106
|
+
view.reorderPage(record.page, position);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
for (const { route, record } of present) {
|
|
110
|
+
record.route = route;
|
|
111
|
+
applyPageOptions(record, descriptors[route.key]?.options ?? {});
|
|
112
|
+
}
|
|
113
|
+
const focus = focusedKey(state);
|
|
114
|
+
const focused = presentRecord(view, store, focus);
|
|
115
|
+
if (focus !== store.lastFocus) {
|
|
116
|
+
store.lastFocus = focus;
|
|
117
|
+
if (focused !== undefined && view.getSelectedPage() !== focused.page) {
|
|
118
|
+
view.setSelectedPage(focused.page);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
const TabContent = ({ descriptor, isFocused }) => {
|
|
123
|
+
const hasLoaded = useHasLoaded(isFocused || descriptor.options.lazy === false);
|
|
124
|
+
return hasLoaded ? descriptor.render() : null;
|
|
125
|
+
};
|
|
126
|
+
const TabViewHost = (props) => {
|
|
127
|
+
const { view, state, navigation, descriptors } = props;
|
|
128
|
+
const { tabBarVisible, tabBarAutohide, tabBarExpand, tabBarInverted, overview, menuModel, renderMenu } = props;
|
|
129
|
+
const { extraDropTarget, onExtraDragDrop, onCreateWindow, onSetupMenu, shortcuts, defaultIcon } = props;
|
|
130
|
+
const [store] = useState(createPageStore);
|
|
131
|
+
const [placeholder, setPlaceholder] = useState(null);
|
|
132
|
+
const [renderedMenu, setRenderedMenu] = useState(null);
|
|
133
|
+
const selectedPage = useProperty(view, "selectedPage");
|
|
134
|
+
const focused = getFocusedRoute(state);
|
|
135
|
+
const descriptor = requireDescriptor(descriptors, focused.key);
|
|
136
|
+
useSyncExternalStore(store.subscribe, store.getVersion, store.getVersion);
|
|
137
|
+
if (menuModel != null && renderMenu !== undefined) {
|
|
138
|
+
throw new Error("Pass the tab view navigator either menuModel or renderMenu, not both.");
|
|
139
|
+
}
|
|
140
|
+
const menu = renderMenu === undefined ? (menuModel ?? null) : renderedMenu;
|
|
141
|
+
const routeOf = (page) => {
|
|
142
|
+
const key = recordOf(page)?.route.key;
|
|
143
|
+
return key === undefined ? undefined : descriptors[key]?.route;
|
|
144
|
+
};
|
|
145
|
+
const [handle] = useState(() => ({
|
|
146
|
+
view,
|
|
147
|
+
getPage: (key) => presentRecord(view, store, key)?.page ?? null,
|
|
148
|
+
transferTab: (key, target, position) => {
|
|
149
|
+
const record = presentRecord(view, store, key);
|
|
150
|
+
if (record === undefined) {
|
|
151
|
+
throw new Error(`Route "${key}" has no page in this tab view.`);
|
|
152
|
+
}
|
|
153
|
+
const pinned = record.page.getPinned();
|
|
154
|
+
const minimum = pinned ? 0 : target.getNPinnedPages();
|
|
155
|
+
const maximum = pinned ? target.getNPinnedPages() : target.getNPages();
|
|
156
|
+
const index = position ?? maximum;
|
|
157
|
+
if (!Number.isInteger(index) || index < minimum || index > maximum) {
|
|
158
|
+
throw new RangeError("The position is outside the tab's pinned or unpinned group.");
|
|
159
|
+
}
|
|
160
|
+
view.transferPage(record.page, target, index);
|
|
161
|
+
},
|
|
162
|
+
}));
|
|
163
|
+
useLayoutEffect(() => {
|
|
164
|
+
if (placeholder === null) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
placeholder.setChild(view);
|
|
168
|
+
return () => {
|
|
169
|
+
if (placeholder.getChild() === view) {
|
|
170
|
+
placeholder.setChild(null);
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
}, [placeholder, view]);
|
|
174
|
+
useLayoutEffect(() => {
|
|
175
|
+
view.setMenuModel(menu);
|
|
176
|
+
}, [view, menu]);
|
|
177
|
+
useLayoutEffect(() => {
|
|
178
|
+
if (shortcuts !== undefined) {
|
|
179
|
+
view.setShortcuts(shortcuts);
|
|
180
|
+
}
|
|
181
|
+
}, [view, shortcuts]);
|
|
182
|
+
useLayoutEffect(() => {
|
|
183
|
+
const icon = toIcon(defaultIcon);
|
|
184
|
+
if (icon !== null) {
|
|
185
|
+
view.setDefaultIcon(icon);
|
|
186
|
+
}
|
|
187
|
+
}, [view, defaultIcon]);
|
|
188
|
+
useLayoutEffect(() => {
|
|
189
|
+
syncPages(view, store, state, descriptors);
|
|
190
|
+
}, [view, store, state, descriptors]);
|
|
191
|
+
useLayoutEffect(() => {
|
|
192
|
+
const selected = view.getSelectedPage();
|
|
193
|
+
const key = selected === null ? undefined : recordOf(selected)?.route.key;
|
|
194
|
+
const current = navigation.getState();
|
|
195
|
+
if (key === undefined || !hasRoute(current, key) || focusedKey(current) === key) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const event = navigation.emit({ type: "tabPress", target: key, canPreventDefault: true });
|
|
199
|
+
if (event.defaultPrevented) {
|
|
200
|
+
const previous = presentRecord(view, store, focusedKey(current));
|
|
201
|
+
if (previous !== undefined) {
|
|
202
|
+
view.setSelectedPage(previous.page);
|
|
203
|
+
}
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
navigation.dispatch(TabViewActions.selectTab(key));
|
|
207
|
+
}, [selectedPage, navigation, view, store]);
|
|
208
|
+
useSignal(view, "close-page", (page) => {
|
|
209
|
+
const key = recordOf(page)?.route.key;
|
|
210
|
+
if (key === undefined || !hasRoute(navigation.getState(), key)) {
|
|
211
|
+
view.closePageFinish(page, true);
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
navigation.dispatch(TabViewActions.closeTab(key));
|
|
215
|
+
view.closePageFinish(page, !hasRoute(navigation.getState(), key));
|
|
216
|
+
return true;
|
|
217
|
+
});
|
|
218
|
+
useSignal(view, "page-attached", (page, position) => {
|
|
219
|
+
const record = recordOf(page);
|
|
220
|
+
if (record === undefined || hasRoute(navigation.getState(), record.route.key)) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
store.set(record);
|
|
224
|
+
navigation.dispatch({
|
|
225
|
+
type: "OPEN_TAB",
|
|
226
|
+
payload: { ...record.route, position, pinned: page.getPinned(), select: false },
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
useSignal(view, "page-detached", (page) => {
|
|
230
|
+
const key = recordOf(page)?.route.key;
|
|
231
|
+
if (key !== undefined && hasRoute(navigation.getState(), key)) {
|
|
232
|
+
navigation.dispatch(TabViewActions.closeTab(key));
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
useSignal(view, "page-reordered", (page, position) => {
|
|
236
|
+
const key = recordOf(page)?.route.key;
|
|
237
|
+
if (key !== undefined && hasRoute(navigation.getState(), key)) {
|
|
238
|
+
navigation.dispatch(TabViewActions.reorderTab(key, position));
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
useSignal(view, "indicator-activated", (page) => {
|
|
242
|
+
const key = recordOf(page)?.route.key;
|
|
243
|
+
if (key !== undefined && hasRoute(navigation.getState(), key)) {
|
|
244
|
+
navigation.emit({ type: "indicatorActivated", target: key });
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
useSignal(view, "setup-menu", (page) => {
|
|
248
|
+
onSetupMenu?.(page === null ? null : (routeOf(page) ?? null));
|
|
249
|
+
});
|
|
250
|
+
useSignal(view, "create-window", () => onCreateWindow?.() ?? undefined);
|
|
251
|
+
const createTab = () => {
|
|
252
|
+
const target = overview?.onCreateTab?.();
|
|
253
|
+
if (target === undefined) {
|
|
254
|
+
return undefined;
|
|
255
|
+
}
|
|
256
|
+
const route = { key: createRouteKey(target.name), name: target.name, params: target.params };
|
|
257
|
+
const record = createPage(view, store, route, { position: view.getNPages(), pinned: false });
|
|
258
|
+
navigation.dispatch({ type: "OPEN_TAB", payload: { ...route, position: view.getPagePosition(record.page) } });
|
|
259
|
+
if (!hasRoute(navigation.getState(), route.key)) {
|
|
260
|
+
store.delete(route.key);
|
|
261
|
+
view.closePage(record.page);
|
|
262
|
+
return undefined;
|
|
263
|
+
}
|
|
264
|
+
return record.page;
|
|
265
|
+
};
|
|
266
|
+
const drop = (page, value) => {
|
|
267
|
+
const route = routeOf(page);
|
|
268
|
+
return route === undefined ? false : (onExtraDragDrop?.(route, value) ?? false);
|
|
269
|
+
};
|
|
270
|
+
const header = descriptor.options.headerShown === false ? null : descriptor.options.header === undefined ? (_jsx(HeaderBar, { options: descriptor.options })) : (_jsx(_Fragment, { children: descriptor.options.header({
|
|
271
|
+
route: descriptor.route,
|
|
272
|
+
navigation: descriptor.navigation,
|
|
273
|
+
options: descriptor.options,
|
|
274
|
+
}) }));
|
|
275
|
+
const content = (_jsx(AdwToolbarView, { top: _jsxs(_Fragment, { children: [header, _jsx(AdwTabBar, { view: view, visible: tabBarVisible ?? true, autohide: tabBarAutohide ?? true, expandTabs: tabBarExpand ?? true, inverted: tabBarInverted ?? false, extraDropTarget: extraDropTarget ?? null, onExtraDragDrop: drop })] }), children: _jsx(AdwBin, { ref: setPlaceholder }) }));
|
|
276
|
+
return (_jsxs(TabViewContext.Provider, { value: handle, children: [overview === undefined ? (content) : (_jsx(AdwTabOverview, { view: view, open: overview.open, enableNewTab: overview.enableNewTab === true && overview.onCreateTab !== undefined, enableSearch: overview.enableSearch ?? true, extraDropTarget: extraDropTarget ?? null, onCreateTab: createTab, onExtraDragDrop: drop, onNotifyOpen: (open) => overview.onOpenChange?.(open ?? false), children: content })), renderMenu === undefined ? null : createPortal(renderMenu(setRenderedMenu), rootElement), state.routes.map((route) => {
|
|
277
|
+
const record = presentRecord(view, store, route.key);
|
|
278
|
+
return record === undefined
|
|
279
|
+
? null
|
|
280
|
+
: createPortal(_jsx(TabContent, { descriptor: requireDescriptor(descriptors, route.key), isFocused: route.key === focused.key }), record.host, route.key);
|
|
281
|
+
})] }));
|
|
282
|
+
};
|
|
283
|
+
export { TabViewHost, useTabView };
|
|
284
|
+
//# sourceMappingURL=tab-view-host.js.map
|