@igstack/app-catalog-frontend-core 6.6.0 → 6.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/App.d.ts +29 -3
- package/dist/esm/App.js +4 -2
- package/dist/esm/App.js.map +1 -1
- package/dist/esm/__tests__/modules/appCatalog/ui/components/SubResourcesSection.adminColumn.test.d.ts +0 -0
- package/dist/esm/__tests__/modules/appCatalog/ui/components/SubResourcesSection.rowMemo.test.d.ts +0 -0
- package/dist/esm/__tests__/modules/dismiss/DismissStack.test.d.ts +0 -0
- package/dist/esm/__tests__/modules/extensions/slots.test.d.ts +0 -0
- package/dist/esm/__tests__/publicEntryResolves.test.d.ts +1 -0
- package/dist/esm/appPropsFactory.d.ts +19 -1
- package/dist/esm/appPropsFactory.js +4 -3
- package/dist/esm/appPropsFactory.js.map +1 -1
- package/dist/esm/index.d.ts +15 -2
- package/dist/esm/index.js +5 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal.d.ts +7 -1
- package/dist/esm/internal.js +0 -2
- package/dist/esm/internal.js.map +1 -1
- package/dist/esm/modules/appCatalog/context/AppCatalogContext.d.ts +17 -0
- package/dist/esm/modules/appCatalog/context/AppCatalogContext.js +7 -16
- package/dist/esm/modules/appCatalog/context/AppCatalogContext.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/catalog/AppCatalogGrid.js +20 -11
- package/dist/esm/modules/appCatalog/ui/catalog/AppCatalogGrid.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/catalog/AppDetailPanel.js +39 -17
- package/dist/esm/modules/appCatalog/ui/catalog/AppDetailPanel.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/components/PersonBadge.js +0 -14
- package/dist/esm/modules/appCatalog/ui/components/PersonBadge.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/components/ScreenshotGallery.js +5 -18
- package/dist/esm/modules/appCatalog/ui/components/ScreenshotGallery.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/components/SubResourceDetailPanel.d.ts +12 -1
- package/dist/esm/modules/appCatalog/ui/components/SubResourceDetailPanel.js +3 -1
- package/dist/esm/modules/appCatalog/ui/components/SubResourceDetailPanel.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/components/SubResourcesSection.d.ts +17 -1
- package/dist/esm/modules/appCatalog/ui/components/SubResourcesSection.js +212 -79
- package/dist/esm/modules/appCatalog/ui/components/SubResourcesSection.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/components/TierVariantsSection.js +0 -14
- package/dist/esm/modules/appCatalog/ui/components/TierVariantsSection.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/detail/AppDetails.d.ts +1 -2
- package/dist/esm/modules/appCatalog/ui/detail/AppDetails.js +31 -23
- package/dist/esm/modules/appCatalog/ui/detail/AppDetails.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/detail/DetailTabs.js +5 -0
- package/dist/esm/modules/appCatalog/ui/detail/DetailTabs.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/pages/AppCatalogPage.js +5 -3
- package/dist/esm/modules/appCatalog/ui/pages/AppCatalogPage.js.map +1 -1
- package/dist/esm/modules/auth/AuthContext.d.ts +12 -0
- package/dist/esm/modules/auth/AuthContext.js +5 -0
- package/dist/esm/modules/auth/AuthContext.js.map +1 -1
- package/dist/esm/modules/auth/index.d.ts +1 -1
- package/dist/esm/modules/dismiss/DismissStack.d.ts +102 -0
- package/dist/esm/modules/dismiss/DismissStack.js +82 -0
- package/dist/esm/modules/dismiss/DismissStack.js.map +1 -0
- package/dist/esm/modules/extensions/ExtensionsContext.d.ts +17 -0
- package/dist/esm/modules/extensions/ExtensionsContext.js +15 -0
- package/dist/esm/modules/extensions/ExtensionsContext.js.map +1 -0
- package/dist/esm/modules/extensions/factories.d.ts +18 -0
- package/dist/esm/modules/extensions/factories.js +12 -0
- package/dist/esm/modules/extensions/factories.js.map +1 -0
- package/dist/esm/modules/extensions/features/resourceDetail.d.ts +92 -0
- package/dist/esm/modules/extensions/features/resourceDetail.js +14 -0
- package/dist/esm/modules/extensions/features/resourceDetail.js.map +1 -0
- package/dist/esm/modules/extensions/index.d.ts +79 -0
- package/dist/esm/modules/extensions/index.js +26 -0
- package/dist/esm/modules/extensions/index.js.map +1 -0
- package/dist/esm/modules/extensions/makeSlot.d.ts +46 -0
- package/dist/esm/modules/extensions/makeSlot.js +62 -0
- package/dist/esm/modules/extensions/makeSlot.js.map +1 -0
- package/dist/esm/modules/extensions/types.d.ts +46 -0
- package/dist/esm/modules/gallery/Gallery.js +6 -14
- package/dist/esm/modules/gallery/Gallery.js.map +1 -1
- package/dist/esm/routeTree.gen.d.ts +34 -34
- package/dist/esm/routeTree.gen.js +14 -14
- package/dist/esm/routeTree.gen.js.map +1 -1
- package/dist/esm/router.d.ts +23 -0
- package/dist/esm/router.js +5 -0
- package/dist/esm/router.js.map +1 -0
- package/dist/esm/routes/_layout/app.$slug.d.ts +1 -1
- package/dist/esm/routes/_layout/app.$slug_.sub.$subSlug.d.ts +1 -1
- package/dist/esm/routes/_layout/catalog.apps.index.d.ts +2 -2
- package/dist/esm/routes/_layout/index.d.ts +1 -1
- package/dist/esm/routes/_layout/login.d.ts +1 -1
- package/dist/esm/routes/_layout/mcp.d.ts +1 -1
- package/dist/esm/routes/_layout/service-desks.d.ts +1 -1
- package/dist/esm/routes/_layout.d.ts +1 -1
- package/dist/esm/routes/_layout.js +13 -2
- package/dist/esm/routes/_layout.js.map +1 -1
- package/dist/esm/routes/auth.callback.d.ts +1 -1
- package/dist/esm/ui/components/error/DefaultErrorComponent.js +9 -2
- package/dist/esm/ui/components/error/DefaultErrorComponent.js.map +1 -1
- package/dist/esm/ui/components/header/Header.js +0 -1
- package/dist/esm/ui/components/header/Header.js.map +1 -1
- package/dist/esm/ui/dialog.d.ts +1 -1
- package/dist/esm/ui/dialog.js +9 -0
- package/dist/esm/ui/dialog.js.map +1 -1
- package/dist/esm/ui/table.d.ts +25 -1
- package/dist/esm/ui/table.js +20 -3
- package/dist/esm/ui/table.js.map +1 -1
- package/dist/esm/util/createAcRouter.d.ts +1 -1
- package/package.json +19 -11
- package/src/App.tsx +34 -3
- package/src/__tests__/modules/appCatalog/ui/catalog/AppDetailPanel.appSwitch.test.tsx +4 -1
- package/src/__tests__/modules/appCatalog/ui/catalog/AppDetailPanel.focus.test.tsx +1 -1
- package/src/__tests__/modules/appCatalog/ui/components/SubResourcesSection.adminColumn.test.tsx +115 -0
- package/src/__tests__/modules/appCatalog/ui/components/SubResourcesSection.rowMemo.test.tsx +120 -0
- package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.background.test.tsx +3 -5
- package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.doorAndTabs.test.tsx +9 -9
- package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.escape.test.tsx +31 -5
- package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.sectionOrder.test.tsx +3 -3
- package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.subResourceTab.test.tsx +48 -6
- package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.tags.test.tsx +1 -7
- package/src/__tests__/modules/dismiss/DismissStack.test.tsx +330 -0
- package/src/__tests__/modules/extensions/slots.test.tsx +252 -0
- package/src/__tests__/publicEntryResolves.test.ts +63 -0
- package/src/appPropsFactory.ts +23 -3
- package/src/index.tsx +32 -2
- package/src/internal.ts +7 -1
- package/src/modules/appCatalog/context/AppCatalogContext.tsx +21 -0
- package/src/modules/appCatalog/ui/catalog/AppCatalogGrid.tsx +52 -12
- package/src/modules/appCatalog/ui/catalog/AppDetailPanel.tsx +59 -18
- package/src/modules/appCatalog/ui/components/ScreenshotGallery.tsx +12 -20
- package/src/modules/appCatalog/ui/components/SubResourceDetailPanel.tsx +19 -0
- package/src/modules/appCatalog/ui/components/SubResourcesSection.tsx +396 -111
- package/src/modules/appCatalog/ui/detail/AppDetails.tsx +46 -26
- package/src/modules/appCatalog/ui/detail/DetailTabs.tsx +20 -0
- package/src/modules/appCatalog/ui/pages/AppCatalogPage.tsx +17 -3
- package/src/modules/auth/AuthContext.tsx +15 -0
- package/src/modules/auth/index.ts +1 -0
- package/src/modules/dismiss/DismissStack.tsx +224 -0
- package/src/modules/extensions/ExtensionsContext.tsx +36 -0
- package/src/modules/extensions/factories.ts +19 -0
- package/src/modules/extensions/features/resourceDetail.ts +74 -0
- package/src/modules/extensions/index.ts +121 -0
- package/src/modules/extensions/makeSlot.tsx +123 -0
- package/src/modules/extensions/types.ts +51 -0
- package/src/modules/gallery/Gallery.tsx +13 -17
- package/src/routeTree.gen.ts +31 -31
- package/src/router.ts +23 -0
- package/src/routes/_layout.tsx +51 -1
- package/src/ui/components/error/DefaultErrorComponent.tsx +22 -4
- package/src/ui/dialog.tsx +26 -0
- package/src/ui/table.tsx +46 -3
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* The signed-in visitor as a plugin sees them.
|
|
4
|
+
*
|
|
5
|
+
* Structural on purpose. Core's own `User` (see `modules/auth/AuthContext.tsx`)
|
|
6
|
+
* is not exported, and a plugin has no business depending on core's auth
|
|
7
|
+
* internals: it needs an identity and an admin flag, nothing more. Widening this
|
|
8
|
+
* is a deliberate API decision, not a convenience.
|
|
9
|
+
*/
|
|
10
|
+
export interface PluginUser {
|
|
11
|
+
email?: string | null;
|
|
12
|
+
isAdmin: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* A renderer whose props are deliberately unknowable.
|
|
16
|
+
*
|
|
17
|
+
* This exists only to break a type cycle: the context has to hold plugins, a
|
|
18
|
+
* plugin's slot map is keyed by the composed `SlotSpec`, and `SlotSpec` is
|
|
19
|
+
* composed from the feature files that call `slotFactory` — which would need the
|
|
20
|
+
* context back. `never` in parameter position accepts every function regardless
|
|
21
|
+
* of what it takes (parameters are contravariant under `strictFunctionTypes`), so
|
|
22
|
+
* the registration stays assignable while the PUBLIC types in `index.ts` remain
|
|
23
|
+
* exact. `makeSlot` re-narrows before calling.
|
|
24
|
+
*/
|
|
25
|
+
export type OpaqueRenderer = (props: never) => ReactNode;
|
|
26
|
+
/**
|
|
27
|
+
* What the context stores. Consumers never build this by hand — they build an
|
|
28
|
+
* `AcPlugin` (see `index.ts`), which is assignable to it.
|
|
29
|
+
*/
|
|
30
|
+
export interface PluginRegistration {
|
|
31
|
+
name: string;
|
|
32
|
+
slots?: Record<string, OpaqueRenderer | undefined>;
|
|
33
|
+
wrappers?: Record<string, OpaqueRenderer | undefined>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Compile error naming any slot id two features both claim.
|
|
37
|
+
*
|
|
38
|
+
* `SlotSpec` is an intersection of the per-feature specs, and an intersection
|
|
39
|
+
* accepts anything: two features declaring one id would silently intersect their
|
|
40
|
+
* payloads into `A & B` — a slot nothing can satisfy. `extends` would error, but
|
|
41
|
+
* only with a generic "incompatibly declared" message. This puts the offending
|
|
42
|
+
* id in the error text.
|
|
43
|
+
*/
|
|
44
|
+
export type AssertDisjoint<TLeft, TRight> = Extract<keyof TLeft, keyof TRight> extends never ? true : {
|
|
45
|
+
DUPLICATE_SLOT_ID: Extract<keyof TLeft, keyof TRight>;
|
|
46
|
+
};
|
|
@@ -4,6 +4,7 @@ import useEmblaCarousel from "embla-carousel-react";
|
|
|
4
4
|
import { ImageOff, X, ChevronLeft, ChevronRight } from "lucide-react";
|
|
5
5
|
import { clamp } from "radashi";
|
|
6
6
|
import { useHotkeys } from "react-hotkeys-hook";
|
|
7
|
+
import { useDismissable } from "../dismiss/DismissStack.js";
|
|
7
8
|
import { Button } from "../../ui/button.js";
|
|
8
9
|
import { Spinner } from "../../ui/spinner.js";
|
|
9
10
|
import { cn } from "../../lib/utils.js";
|
|
@@ -92,20 +93,10 @@ function Gallery({
|
|
|
92
93
|
},
|
|
93
94
|
[scrollNext, images.length]
|
|
94
95
|
);
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
e.stopPropagation();
|
|
100
|
-
e.preventDefault();
|
|
101
|
-
setFullscreen(false);
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
document.addEventListener("keydown", handleEscape, true);
|
|
105
|
-
return () => {
|
|
106
|
-
document.removeEventListener("keydown", handleEscape, true);
|
|
107
|
-
};
|
|
108
|
-
}, [isFullscreen, setFullscreen]);
|
|
96
|
+
const fullscreenRef = useRef(null);
|
|
97
|
+
useDismissable(fullscreenRef, () => setFullscreen(false), {
|
|
98
|
+
enabled: isFullscreen
|
|
99
|
+
});
|
|
109
100
|
useEffect(() => {
|
|
110
101
|
if (!emblaApi || images.length <= 1) return;
|
|
111
102
|
const emblaNode = emblaApi.rootNode();
|
|
@@ -146,6 +137,7 @@ function Gallery({
|
|
|
146
137
|
return /* @__PURE__ */ jsxs(
|
|
147
138
|
"div",
|
|
148
139
|
{
|
|
140
|
+
ref: fullscreenRef,
|
|
149
141
|
className: "fixed inset-0 z-50 bg-background",
|
|
150
142
|
role: "dialog",
|
|
151
143
|
"aria-label": "Fullscreen view",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Gallery.js","sources":["../../../../src/modules/gallery/Gallery.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react'\nimport useEmblaCarousel from 'embla-carousel-react'\nimport { ChevronLeft, ChevronRight, ImageOff, X } from 'lucide-react'\nimport { clamp } from 'radashi'\nimport { useHotkeys } from 'react-hotkeys-hook'\n\nimport { Button } from '~/ui/button'\nimport { Spinner } from '~/ui/spinner'\nimport { cn } from '~/lib/utils'\n\nexport interface GalleryImage {\n url: string\n alt: string\n}\n\nexport interface GalleryProps {\n images: GalleryImage[]\n initialIndex?: number\n onIndexChange?: (index: number) => void\n onFullscreenChange?: (isFullscreen: boolean) => void\n className?: string\n title?: string\n}\n\nexport function Gallery({\n images,\n initialIndex = 0,\n onIndexChange,\n onFullscreenChange,\n className,\n title,\n}: GalleryProps) {\n const [emblaRef, emblaApi] = useEmblaCarousel({\n loop: false,\n align: 'center',\n })\n // Use lazy initialization for clamp() call\n const [currentIndex, setCurrentIndex] = useState(() =>\n clamp(initialIndex, 0, images.length - 1),\n )\n const [isFullscreen, setIsFullscreen] = useState(false)\n const [imageStates, setImageStates] = useState<\n Record<number, 'loading' | 'loaded' | 'error'>\n >(() => Object.fromEntries(images.map((_, i) => [i, 'loading'])))\n\n // Reset image states when images array changes\n useEffect(() => {\n setImageStates(Object.fromEntries(images.map((_, i) => [i, 'loading'])))\n }, [images])\n\n // Stabilize onFullscreenChange callback with ref\n const onFullscreenChangeRef = useRef(onFullscreenChange)\n useEffect(() => {\n onFullscreenChangeRef.current = onFullscreenChange\n }, [onFullscreenChange])\n\n const setFullscreen = useCallback((value: boolean) => {\n setIsFullscreen(value)\n onFullscreenChangeRef.current?.(value)\n }, [])\n\n // Stabilize onIndexChange callback with ref\n const onIndexChangeRef = useRef(onIndexChange)\n useEffect(() => {\n onIndexChangeRef.current = onIndexChange\n }, [onIndexChange])\n\n const scrollPrev = useCallback(() => {\n if (emblaApi) emblaApi.scrollPrev()\n }, [emblaApi])\n\n const scrollNext = useCallback(() => {\n if (emblaApi) emblaApi.scrollNext()\n }, [emblaApi])\n\n // Sync current index with embla using event handler\n const onSelect = useCallback(() => {\n if (!emblaApi) return\n const index = emblaApi.selectedScrollSnap()\n setCurrentIndex(index)\n onIndexChangeRef.current?.(index)\n }, [emblaApi])\n\n // Subscribe to embla select events and initialize\n useEffect(() => {\n if (!emblaApi) return\n\n // Initialize current index\n onSelect()\n\n // Subscribe to future changes\n emblaApi.on('select', onSelect)\n return () => {\n emblaApi.off('select', onSelect)\n }\n }, [emblaApi, onSelect])\n\n // Scroll to initial index on mount only\n useEffect(() => {\n if (emblaApi && typeof initialIndex === 'number') {\n emblaApi.scrollTo(initialIndex)\n }\n }, [emblaApi, initialIndex])\n\n // Keyboard navigation\n useHotkeys(\n 'left',\n (e) => {\n e.preventDefault()\n scrollPrev()\n },\n {\n enabled: images.length > 1,\n enableOnFormTags: false,\n preventDefault: true,\n },\n [scrollPrev, images.length],\n )\n useHotkeys(\n 'right',\n (e) => {\n e.preventDefault()\n scrollNext()\n },\n {\n enabled: images.length > 1,\n enableOnFormTags: false,\n preventDefault: true,\n },\n [scrollNext, images.length],\n )\n // Intercept Escape in fullscreen — must stopPropagation before Radix Dialog sees it\n useEffect(() => {\n if (!isFullscreen) return\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.stopPropagation()\n e.preventDefault()\n setFullscreen(false)\n }\n }\n\n document.addEventListener('keydown', handleEscape, true)\n return () => {\n document.removeEventListener('keydown', handleEscape, true)\n }\n }, [isFullscreen, setFullscreen])\n\n // Mouse wheel navigation with debouncing\n useEffect(() => {\n if (!emblaApi || images.length <= 1) return\n\n const emblaNode = emblaApi.rootNode()\n\n let isScrolling = false\n let scrollTimeout: NodeJS.Timeout\n\n const handleWheel = (event: WheelEvent) => {\n // Prevent page scroll when wheeling over gallery\n event.preventDefault()\n\n // Skip if already scrolling (debounce)\n if (isScrolling) return\n\n // Determine scroll direction\n const deltaY = event.deltaY\n const deltaX = event.deltaX\n\n // Use vertical scroll primarily, fall back to horizontal\n const delta = Math.abs(deltaY) > Math.abs(deltaX) ? deltaY : deltaX\n\n if (delta > 0) {\n // Scroll down/right -> next slide\n scrollNext()\n } else if (delta < 0) {\n // Scroll up/left -> previous slide\n scrollPrev()\n }\n\n // Set cooldown period\n isScrolling = true\n clearTimeout(scrollTimeout)\n scrollTimeout = setTimeout(() => {\n isScrolling = false\n }, 300) // 300ms cooldown\n }\n\n emblaNode.addEventListener('wheel', handleWheel, { passive: false })\n\n return () => {\n emblaNode.removeEventListener('wheel', handleWheel)\n clearTimeout(scrollTimeout)\n }\n }, [emblaApi, scrollNext, scrollPrev, images.length])\n\n const currentImage = images[currentIndex]\n\n const handleImageLoad = (index: number) => {\n setImageStates((prev) => ({ ...prev, [index]: 'loaded' }))\n }\n\n const handleImageError = (index: number) => {\n setImageStates((prev) => ({ ...prev, [index]: 'error' }))\n }\n\n // Fullscreen mode\n if (isFullscreen && currentImage) {\n const imageState = imageStates[currentIndex]\n return (\n <div\n className=\"fixed inset-0 z-50 bg-background\"\n role=\"dialog\"\n aria-label=\"Fullscreen view\"\n >\n {imageState === 'error' ? (\n <div className=\"flex h-screen w-screen items-center justify-center\">\n <div className=\"flex flex-col items-center gap-2 text-muted-foreground\">\n <ImageOff className=\"size-12\" />\n <p className=\"text-sm\">Failed to load image</p>\n </div>\n </div>\n ) : (\n <div className=\"h-full w-full overflow-auto p-2 flex items-center justify-center\">\n {imageState !== 'loaded' && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Spinner className=\"size-8\" />\n </div>\n )}\n <img\n src={currentImage.url}\n alt={currentImage.alt}\n className=\"max-w-full max-h-full h-auto cursor-zoom-out\"\n onClick={() => setFullscreen(false)}\n onLoad={() => handleImageLoad(currentIndex)}\n onError={() => handleImageError(currentIndex)}\n style={{ opacity: imageState === 'loaded' ? 1 : 0 }}\n role=\"button\"\n aria-label=\"Zoom out\"\n />\n </div>\n )}\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => setFullscreen(false)}\n className=\"absolute top-4 right-4 z-10\"\n aria-label=\"Exit fullscreen\"\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n )\n }\n\n return (\n <div className={cn('flex h-full flex-col min-h-0', className)}>\n {/* Title Header */}\n {title && (\n <div className=\"px-6 py-4\">\n <h2 className=\"text-lg font-semibold\">{title}</h2>\n </div>\n )}\n\n {/* Carousel Viewport with Peek Effect */}\n <div className=\"relative flex-1 min-h-0 overflow-hidden px-4\">\n <div ref={emblaRef} className=\"h-full overflow-hidden\">\n <div className=\"flex h-full gap-4\">\n {images.map((image, index) => {\n const imageState = imageStates[index]\n // Use 100% width for single image, 85% for multiple (peek effect)\n const slideWidth = images.length === 1 ? '100%' : '85%'\n return (\n <div\n key={image.url}\n className={cn(\n 'relative flex min-w-0 items-center justify-center transition-opacity duration-300 h-full',\n index !== currentIndex && 'opacity-40',\n )}\n style={{ flexBasis: slideWidth, flexShrink: 0, flexGrow: 0 }}\n >\n {imageState === 'error' ? (\n <div className=\"flex flex-col items-center gap-2 text-muted-foreground\">\n <ImageOff className=\"size-12\" />\n <p className=\"text-xs\">Failed to load</p>\n </div>\n ) : (\n <>\n {imageState !== 'loaded' && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Spinner className=\"size-8\" />\n </div>\n )}\n <img\n src={image.url}\n alt={image.alt}\n className=\"max-w-full max-h-full w-auto h-auto object-contain cursor-pointer border border-border/30 rounded\"\n onClick={() => {\n if (index !== currentIndex) {\n emblaApi?.scrollTo(index)\n } else {\n setFullscreen(true)\n }\n }}\n onLoad={() => handleImageLoad(index)}\n onError={() => handleImageError(index)}\n style={{ opacity: imageState === 'loaded' ? 1 : 0 }}\n role=\"button\"\n aria-label={`Navigate to ${image.alt}`}\n />\n </>\n )}\n </div>\n )\n })}\n </div>\n </div>\n </div>\n\n {/* Bottom Controls */}\n <div className=\"flex items-center justify-center gap-4 py-4\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={scrollPrev}\n disabled={images.length <= 1}\n aria-label=\"Previous screenshot\"\n className=\"h-12 w-12\"\n >\n <ChevronLeft className=\"h-12 w-12\" />\n </Button>\n\n <div className=\"text-sm text-muted-foreground\" aria-live=\"polite\">\n {currentIndex + 1} / {images.length}\n </div>\n\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={scrollNext}\n disabled={images.length <= 1}\n aria-label=\"Next screenshot\"\n className=\"h-12 w-12\"\n >\n <ChevronRight className=\"h-12 w-12\" />\n </Button>\n </div>\n </div>\n )\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Gallery.js","sources":["../../../../src/modules/gallery/Gallery.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react'\nimport useEmblaCarousel from 'embla-carousel-react'\nimport { ChevronLeft, ChevronRight, ImageOff, X } from 'lucide-react'\nimport { clamp } from 'radashi'\nimport { useHotkeys } from 'react-hotkeys-hook'\nimport { useDismissable } from '~/modules/dismiss/DismissStack'\n\nimport { Button } from '~/ui/button'\nimport { Spinner } from '~/ui/spinner'\nimport { cn } from '~/lib/utils'\n\nexport interface GalleryImage {\n url: string\n alt: string\n}\n\nexport interface GalleryProps {\n images: GalleryImage[]\n initialIndex?: number\n onIndexChange?: (index: number) => void\n onFullscreenChange?: (isFullscreen: boolean) => void\n className?: string\n title?: string\n}\n\nexport function Gallery({\n images,\n initialIndex = 0,\n onIndexChange,\n onFullscreenChange,\n className,\n title,\n}: GalleryProps) {\n const [emblaRef, emblaApi] = useEmblaCarousel({\n loop: false,\n align: 'center',\n })\n // Use lazy initialization for clamp() call\n const [currentIndex, setCurrentIndex] = useState(() =>\n clamp(initialIndex, 0, images.length - 1),\n )\n const [isFullscreen, setIsFullscreen] = useState(false)\n const [imageStates, setImageStates] = useState<\n Record<number, 'loading' | 'loaded' | 'error'>\n >(() => Object.fromEntries(images.map((_, i) => [i, 'loading'])))\n\n // Reset image states when images array changes\n useEffect(() => {\n setImageStates(Object.fromEntries(images.map((_, i) => [i, 'loading'])))\n }, [images])\n\n // Stabilize onFullscreenChange callback with ref\n const onFullscreenChangeRef = useRef(onFullscreenChange)\n useEffect(() => {\n onFullscreenChangeRef.current = onFullscreenChange\n }, [onFullscreenChange])\n\n const setFullscreen = useCallback((value: boolean) => {\n setIsFullscreen(value)\n onFullscreenChangeRef.current?.(value)\n }, [])\n\n // Stabilize onIndexChange callback with ref\n const onIndexChangeRef = useRef(onIndexChange)\n useEffect(() => {\n onIndexChangeRef.current = onIndexChange\n }, [onIndexChange])\n\n const scrollPrev = useCallback(() => {\n if (emblaApi) emblaApi.scrollPrev()\n }, [emblaApi])\n\n const scrollNext = useCallback(() => {\n if (emblaApi) emblaApi.scrollNext()\n }, [emblaApi])\n\n // Sync current index with embla using event handler\n const onSelect = useCallback(() => {\n if (!emblaApi) return\n const index = emblaApi.selectedScrollSnap()\n setCurrentIndex(index)\n onIndexChangeRef.current?.(index)\n }, [emblaApi])\n\n // Subscribe to embla select events and initialize\n useEffect(() => {\n if (!emblaApi) return\n\n // Initialize current index\n onSelect()\n\n // Subscribe to future changes\n emblaApi.on('select', onSelect)\n return () => {\n emblaApi.off('select', onSelect)\n }\n }, [emblaApi, onSelect])\n\n // Scroll to initial index on mount only\n useEffect(() => {\n if (emblaApi && typeof initialIndex === 'number') {\n emblaApi.scrollTo(initialIndex)\n }\n }, [emblaApi, initialIndex])\n\n // Keyboard navigation\n useHotkeys(\n 'left',\n (e) => {\n e.preventDefault()\n scrollPrev()\n },\n {\n enabled: images.length > 1,\n enableOnFormTags: false,\n preventDefault: true,\n },\n [scrollPrev, images.length],\n )\n useHotkeys(\n 'right',\n (e) => {\n e.preventDefault()\n scrollNext()\n },\n {\n enabled: images.length > 1,\n enableOnFormTags: false,\n preventDefault: true,\n },\n [scrollNext, images.length],\n )\n // Escape leaves fullscreen rather than closing the gallery.\n //\n // This used to be a capture-phase document listener whose whole purpose was\n // to beat Radix to the event, with the dialog above separately cancelling\n // Radix's close by reading this component's fullscreen state through a ref.\n // The stack makes that unnecessary: the fullscreen view is rendered after\n // the dialog that contains it, so it is simply the top layer while it is on.\n const fullscreenRef = useRef<HTMLDivElement>(null)\n useDismissable(fullscreenRef, () => setFullscreen(false), {\n enabled: isFullscreen,\n })\n\n // Mouse wheel navigation with debouncing\n useEffect(() => {\n if (!emblaApi || images.length <= 1) return\n\n const emblaNode = emblaApi.rootNode()\n\n let isScrolling = false\n let scrollTimeout: NodeJS.Timeout\n\n const handleWheel = (event: WheelEvent) => {\n // Prevent page scroll when wheeling over gallery\n event.preventDefault()\n\n // Skip if already scrolling (debounce)\n if (isScrolling) return\n\n // Determine scroll direction\n const deltaY = event.deltaY\n const deltaX = event.deltaX\n\n // Use vertical scroll primarily, fall back to horizontal\n const delta = Math.abs(deltaY) > Math.abs(deltaX) ? deltaY : deltaX\n\n if (delta > 0) {\n // Scroll down/right -> next slide\n scrollNext()\n } else if (delta < 0) {\n // Scroll up/left -> previous slide\n scrollPrev()\n }\n\n // Set cooldown period\n isScrolling = true\n clearTimeout(scrollTimeout)\n scrollTimeout = setTimeout(() => {\n isScrolling = false\n }, 300) // 300ms cooldown\n }\n\n emblaNode.addEventListener('wheel', handleWheel, { passive: false })\n\n return () => {\n emblaNode.removeEventListener('wheel', handleWheel)\n clearTimeout(scrollTimeout)\n }\n }, [emblaApi, scrollNext, scrollPrev, images.length])\n\n const currentImage = images[currentIndex]\n\n const handleImageLoad = (index: number) => {\n setImageStates((prev) => ({ ...prev, [index]: 'loaded' }))\n }\n\n const handleImageError = (index: number) => {\n setImageStates((prev) => ({ ...prev, [index]: 'error' }))\n }\n\n // Fullscreen mode\n if (isFullscreen && currentImage) {\n const imageState = imageStates[currentIndex]\n return (\n <div\n ref={fullscreenRef}\n className=\"fixed inset-0 z-50 bg-background\"\n role=\"dialog\"\n aria-label=\"Fullscreen view\"\n >\n {imageState === 'error' ? (\n <div className=\"flex h-screen w-screen items-center justify-center\">\n <div className=\"flex flex-col items-center gap-2 text-muted-foreground\">\n <ImageOff className=\"size-12\" />\n <p className=\"text-sm\">Failed to load image</p>\n </div>\n </div>\n ) : (\n <div className=\"h-full w-full overflow-auto p-2 flex items-center justify-center\">\n {imageState !== 'loaded' && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Spinner className=\"size-8\" />\n </div>\n )}\n <img\n src={currentImage.url}\n alt={currentImage.alt}\n className=\"max-w-full max-h-full h-auto cursor-zoom-out\"\n onClick={() => setFullscreen(false)}\n onLoad={() => handleImageLoad(currentIndex)}\n onError={() => handleImageError(currentIndex)}\n style={{ opacity: imageState === 'loaded' ? 1 : 0 }}\n role=\"button\"\n aria-label=\"Zoom out\"\n />\n </div>\n )}\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => setFullscreen(false)}\n className=\"absolute top-4 right-4 z-10\"\n aria-label=\"Exit fullscreen\"\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n )\n }\n\n return (\n <div className={cn('flex h-full flex-col min-h-0', className)}>\n {/* Title Header */}\n {title && (\n <div className=\"px-6 py-4\">\n <h2 className=\"text-lg font-semibold\">{title}</h2>\n </div>\n )}\n\n {/* Carousel Viewport with Peek Effect */}\n <div className=\"relative flex-1 min-h-0 overflow-hidden px-4\">\n <div ref={emblaRef} className=\"h-full overflow-hidden\">\n <div className=\"flex h-full gap-4\">\n {images.map((image, index) => {\n const imageState = imageStates[index]\n // Use 100% width for single image, 85% for multiple (peek effect)\n const slideWidth = images.length === 1 ? '100%' : '85%'\n return (\n <div\n key={image.url}\n className={cn(\n 'relative flex min-w-0 items-center justify-center transition-opacity duration-300 h-full',\n index !== currentIndex && 'opacity-40',\n )}\n style={{ flexBasis: slideWidth, flexShrink: 0, flexGrow: 0 }}\n >\n {imageState === 'error' ? (\n <div className=\"flex flex-col items-center gap-2 text-muted-foreground\">\n <ImageOff className=\"size-12\" />\n <p className=\"text-xs\">Failed to load</p>\n </div>\n ) : (\n <>\n {imageState !== 'loaded' && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Spinner className=\"size-8\" />\n </div>\n )}\n <img\n src={image.url}\n alt={image.alt}\n className=\"max-w-full max-h-full w-auto h-auto object-contain cursor-pointer border border-border/30 rounded\"\n onClick={() => {\n if (index !== currentIndex) {\n emblaApi?.scrollTo(index)\n } else {\n setFullscreen(true)\n }\n }}\n onLoad={() => handleImageLoad(index)}\n onError={() => handleImageError(index)}\n style={{ opacity: imageState === 'loaded' ? 1 : 0 }}\n role=\"button\"\n aria-label={`Navigate to ${image.alt}`}\n />\n </>\n )}\n </div>\n )\n })}\n </div>\n </div>\n </div>\n\n {/* Bottom Controls */}\n <div className=\"flex items-center justify-center gap-4 py-4\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={scrollPrev}\n disabled={images.length <= 1}\n aria-label=\"Previous screenshot\"\n className=\"h-12 w-12\"\n >\n <ChevronLeft className=\"h-12 w-12\" />\n </Button>\n\n <div className=\"text-sm text-muted-foreground\" aria-live=\"polite\">\n {currentIndex + 1} / {images.length}\n </div>\n\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={scrollNext}\n disabled={images.length <= 1}\n aria-label=\"Next screenshot\"\n className=\"h-12 w-12\"\n >\n <ChevronRight className=\"h-12 w-12\" />\n </Button>\n </div>\n </div>\n )\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,40 +1,40 @@
|
|
|
1
1
|
import { Route as rootRouteImport } from './routes/__root.js';
|
|
2
2
|
import { Route as LayoutRouteImport } from './routes/_layout.js';
|
|
3
3
|
import { Route as LayoutIndexRouteImport } from './routes/_layout/index.js';
|
|
4
|
-
import { Route as AuthCallbackRouteImport } from './routes/auth.callback';
|
|
5
|
-
import { Route as LayoutServiceDesksRouteImport } from './routes/_layout/service-desks.js';
|
|
6
|
-
import { Route as LayoutMcpRouteImport } from './routes/_layout/mcp.js';
|
|
7
4
|
import { Route as LayoutLoginRouteImport } from './routes/_layout/login.js';
|
|
5
|
+
import { Route as LayoutMcpRouteImport } from './routes/_layout/mcp.js';
|
|
6
|
+
import { Route as LayoutServiceDesksRouteImport } from './routes/_layout/service-desks.js';
|
|
7
|
+
import { Route as AuthCallbackRouteImport } from './routes/auth.callback';
|
|
8
8
|
import { Route as LayoutAppSlugRouteImport } from './routes/_layout/app.$slug';
|
|
9
9
|
import { Route as LayoutCatalogAppsIndexRouteImport } from './routes/_layout/catalog.apps.index';
|
|
10
10
|
import { Route as LayoutAppSlugSubSubSlugRouteImport } from './routes/_layout/app.$slug_.sub.$subSlug';
|
|
11
|
-
declare const LayoutRoute: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('
|
|
12
|
-
declare const LayoutIndexRoute: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('
|
|
11
|
+
declare const LayoutRoute: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('.').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
12
|
+
declare const LayoutIndexRoute: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('.').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/", "/", "/_layout/", "/_layout/", import('zod').ZodObject<{
|
|
13
13
|
filterTag: import('zod').ZodOptional<import('zod').ZodString>;
|
|
14
14
|
q: import('zod').ZodOptional<import('zod').ZodString>;
|
|
15
15
|
}, import('zod/v4/core').$strip>, import('@tanstack/router-core').ResolveParams<"/">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
16
|
-
declare const
|
|
16
|
+
declare const LayoutLoginRoute: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('.').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/login", "/login", "/_layout/login", "/_layout/login", undefined, import('@tanstack/router-core').ResolveParams<"/login">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
17
|
+
declare const LayoutMcpRoute: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('.').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/mcp", "/mcp", "/_layout/mcp", "/_layout/mcp", undefined, import('@tanstack/router-core').ResolveParams<"/mcp">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
18
|
+
declare const LayoutServiceDesksRoute: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('.').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/service-desks", "/service-desks", "/_layout/service-desks", "/_layout/service-desks", import('zod').ZodObject<{
|
|
19
|
+
q: import('zod').ZodOptional<import('zod').ZodString>;
|
|
20
|
+
}, import('zod/v4/core').$strip>, import('@tanstack/router-core').ResolveParams<"/service-desks">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
21
|
+
declare const AuthCallbackRoute: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('.').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/auth/callback", "/auth/callback", "/auth/callback", "/auth/callback", (search: Record<string, unknown>) => {
|
|
17
22
|
error: string | undefined;
|
|
18
23
|
code: string | undefined;
|
|
19
24
|
}, import('@tanstack/router-core').ResolveParams<"/auth/callback">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
20
|
-
declare const
|
|
21
|
-
q: import('zod').ZodOptional<import('zod').ZodString>;
|
|
22
|
-
}, import('zod/v4/core').$strip>, import('@tanstack/router-core').ResolveParams<"/service-desks">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
23
|
-
declare const LayoutMcpRoute: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('./types/types.js').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/mcp", "/mcp", "/_layout/mcp", "/_layout/mcp", undefined, import('@tanstack/router-core').ResolveParams<"/mcp">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
24
|
-
declare const LayoutLoginRoute: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('./types/types.js').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/login", "/login", "/_layout/login", "/_layout/login", undefined, import('@tanstack/router-core').ResolveParams<"/login">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
25
|
-
declare const LayoutAppSlugRoute: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('./types/types.js').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/app/$slug", "/app/$slug", "/_layout/app/$slug", "/_layout/app/$slug", import('zod').ZodObject<{
|
|
25
|
+
declare const LayoutAppSlugRoute: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('.').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/app/$slug", "/app/$slug", "/_layout/app/$slug", "/_layout/app/$slug", import('zod').ZodObject<{
|
|
26
26
|
filterTag: import('zod').ZodOptional<import('zod').ZodString>;
|
|
27
27
|
deprecated: import('zod').ZodOptional<import('zod').ZodString>;
|
|
28
28
|
q: import('zod').ZodOptional<import('zod').ZodString>;
|
|
29
29
|
sub: import('zod').ZodOptional<import('zod').ZodString>;
|
|
30
30
|
qj: import('zod').ZodOptional<import('zod').ZodString>;
|
|
31
31
|
}, import('zod/v4/core').$strip>, import('@tanstack/router-core').ResolveParams<"/app/$slug">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
32
|
-
declare const LayoutCatalogAppsIndexRoute: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('
|
|
32
|
+
declare const LayoutCatalogAppsIndexRoute: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('.').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/catalog/apps", "/catalog/apps/", "/_layout/catalog/apps/", "/_layout/catalog/apps/", import('zod').ZodObject<{
|
|
33
33
|
app: import('zod').ZodOptional<import('zod').ZodString>;
|
|
34
34
|
q: import('zod').ZodOptional<import('zod').ZodString>;
|
|
35
35
|
sub: import('zod').ZodOptional<import('zod').ZodString>;
|
|
36
|
-
}, import('zod/v4/core').$strip>, import('@tanstack/router-core').ResolveParams<"/catalog/apps">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, (ctx: import('@tanstack/router-core').LoaderFnContext<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('
|
|
37
|
-
declare const LayoutAppSlugSubSubSlugRoute: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('
|
|
36
|
+
}, import('zod/v4/core').$strip>, import('@tanstack/router-core').ResolveParams<"/catalog/apps">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, (ctx: import('@tanstack/router-core').LoaderFnContext<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('.').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/_layout/catalog/apps/", import('@tanstack/router-core').ResolveParams<"/catalog/apps">, {}, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, unknown, undefined>) => Promise<void>, unknown, unknown, unknown, unknown, undefined>;
|
|
37
|
+
declare const LayoutAppSlugSubSubSlugRoute: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('.').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/app/$slug/sub/$subSlug", "/app/$slug/sub/$subSlug", "/_layout/app/$slug_/sub/$subSlug", "/_layout/app/$slug_/sub/$subSlug", import('zod').ZodObject<{
|
|
38
38
|
filterTag: import('zod').ZodOptional<import('zod').ZodString>;
|
|
39
39
|
deprecated: import('zod').ZodOptional<import('zod').ZodString>;
|
|
40
40
|
q: import('zod').ZodOptional<import('zod').ZodString>;
|
|
@@ -101,18 +101,11 @@ declare module '@tanstack/react-router' {
|
|
|
101
101
|
preLoaderRoute: typeof LayoutIndexRouteImport;
|
|
102
102
|
parentRoute: typeof LayoutRoute;
|
|
103
103
|
};
|
|
104
|
-
'/
|
|
105
|
-
id: '/
|
|
106
|
-
path: '/
|
|
107
|
-
fullPath: '/
|
|
108
|
-
preLoaderRoute: typeof
|
|
109
|
-
parentRoute: typeof rootRouteImport;
|
|
110
|
-
};
|
|
111
|
-
'/_layout/service-desks': {
|
|
112
|
-
id: '/_layout/service-desks';
|
|
113
|
-
path: '/service-desks';
|
|
114
|
-
fullPath: '/service-desks';
|
|
115
|
-
preLoaderRoute: typeof LayoutServiceDesksRouteImport;
|
|
104
|
+
'/_layout/login': {
|
|
105
|
+
id: '/_layout/login';
|
|
106
|
+
path: '/login';
|
|
107
|
+
fullPath: '/login';
|
|
108
|
+
preLoaderRoute: typeof LayoutLoginRouteImport;
|
|
116
109
|
parentRoute: typeof LayoutRoute;
|
|
117
110
|
};
|
|
118
111
|
'/_layout/mcp': {
|
|
@@ -122,13 +115,20 @@ declare module '@tanstack/react-router' {
|
|
|
122
115
|
preLoaderRoute: typeof LayoutMcpRouteImport;
|
|
123
116
|
parentRoute: typeof LayoutRoute;
|
|
124
117
|
};
|
|
125
|
-
'/_layout/
|
|
126
|
-
id: '/_layout/
|
|
127
|
-
path: '/
|
|
128
|
-
fullPath: '/
|
|
129
|
-
preLoaderRoute: typeof
|
|
118
|
+
'/_layout/service-desks': {
|
|
119
|
+
id: '/_layout/service-desks';
|
|
120
|
+
path: '/service-desks';
|
|
121
|
+
fullPath: '/service-desks';
|
|
122
|
+
preLoaderRoute: typeof LayoutServiceDesksRouteImport;
|
|
130
123
|
parentRoute: typeof LayoutRoute;
|
|
131
124
|
};
|
|
125
|
+
'/auth/callback': {
|
|
126
|
+
id: '/auth/callback';
|
|
127
|
+
path: '/auth/callback';
|
|
128
|
+
fullPath: '/auth/callback';
|
|
129
|
+
preLoaderRoute: typeof AuthCallbackRouteImport;
|
|
130
|
+
parentRoute: typeof rootRouteImport;
|
|
131
|
+
};
|
|
132
132
|
'/_layout/app/$slug': {
|
|
133
133
|
id: '/_layout/app/$slug';
|
|
134
134
|
path: '/app/$slug';
|
|
@@ -162,6 +162,6 @@ interface LayoutRouteChildren {
|
|
|
162
162
|
LayoutAppSlugSubSubSlugRoute: typeof LayoutAppSlugSubSubSlugRoute;
|
|
163
163
|
}
|
|
164
164
|
declare const LayoutRouteChildren: LayoutRouteChildren;
|
|
165
|
-
declare const LayoutRouteWithChildren: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('
|
|
166
|
-
export declare const routeTree: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, any, "/", "/", string, "__root__", undefined, {}, import('
|
|
165
|
+
declare const LayoutRouteWithChildren: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('.').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, LayoutRouteChildren, unknown, unknown, unknown, undefined>;
|
|
166
|
+
export declare const routeTree: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, any, "/", "/", string, "__root__", undefined, {}, import('.').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, RootRouteChildren, FileRouteTypes, unknown, unknown, undefined>;
|
|
167
167
|
export {};
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { Route } from "./routes/__root.js";
|
|
2
2
|
import { Route as Route$2 } from "./routes/_layout.js";
|
|
3
3
|
import { Route as Route$6 } from "./routes/_layout/index.js";
|
|
4
|
-
import { Route as Route$1 } from "./routes/auth.callback.js";
|
|
5
|
-
import { Route as Route$7 } from "./routes/_layout/service-desks.js";
|
|
6
|
-
import { Route as Route$8 } from "./routes/_layout/mcp.js";
|
|
7
4
|
import { Route as Route$9 } from "./routes/_layout/login.js";
|
|
5
|
+
import { Route as Route$8 } from "./routes/_layout/mcp.js";
|
|
6
|
+
import { Route as Route$7 } from "./routes/_layout/service-desks.js";
|
|
7
|
+
import { Route as Route$1 } from "./routes/auth.callback.js";
|
|
8
8
|
import { Route as Route$5 } from "./routes/_layout/app._slug.js";
|
|
9
9
|
import { Route as Route$4 } from "./routes/_layout/catalog.apps.index.js";
|
|
10
10
|
import { Route as Route$3 } from "./routes/_layout/app._slug_.sub._subSlug.js";
|
|
@@ -17,14 +17,9 @@ const LayoutIndexRoute = Route$6.update({
|
|
|
17
17
|
path: "/",
|
|
18
18
|
getParentRoute: () => LayoutRoute
|
|
19
19
|
});
|
|
20
|
-
const
|
|
21
|
-
id: "/
|
|
22
|
-
path: "/
|
|
23
|
-
getParentRoute: () => Route
|
|
24
|
-
});
|
|
25
|
-
const LayoutServiceDesksRoute = Route$7.update({
|
|
26
|
-
id: "/service-desks",
|
|
27
|
-
path: "/service-desks",
|
|
20
|
+
const LayoutLoginRoute = Route$9.update({
|
|
21
|
+
id: "/login",
|
|
22
|
+
path: "/login",
|
|
28
23
|
getParentRoute: () => LayoutRoute
|
|
29
24
|
});
|
|
30
25
|
const LayoutMcpRoute = Route$8.update({
|
|
@@ -32,11 +27,16 @@ const LayoutMcpRoute = Route$8.update({
|
|
|
32
27
|
path: "/mcp",
|
|
33
28
|
getParentRoute: () => LayoutRoute
|
|
34
29
|
});
|
|
35
|
-
const
|
|
36
|
-
id: "/
|
|
37
|
-
path: "/
|
|
30
|
+
const LayoutServiceDesksRoute = Route$7.update({
|
|
31
|
+
id: "/service-desks",
|
|
32
|
+
path: "/service-desks",
|
|
38
33
|
getParentRoute: () => LayoutRoute
|
|
39
34
|
});
|
|
35
|
+
const AuthCallbackRoute = Route$1.update({
|
|
36
|
+
id: "/auth/callback",
|
|
37
|
+
path: "/auth/callback",
|
|
38
|
+
getParentRoute: () => Route
|
|
39
|
+
});
|
|
40
40
|
const LayoutAppSlugRoute = Route$5.update({
|
|
41
41
|
id: "/app/$slug",
|
|
42
42
|
path: "/app/$slug",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routeTree.gen.js","sources":["../../src/routeTree.gen.ts"],"sourcesContent":["/* eslint-disable */\n\n// @ts-nocheck\n\n// noinspection JSUnusedGlobalSymbols\n\n// This file was automatically generated by TanStack Router.\n// You should NOT make any changes in this file as it will be overwritten.\n// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.\n\nimport { Route as rootRouteImport } from './routes/__root'\nimport { Route as LayoutRouteImport } from './routes/_layout'\nimport { Route as LayoutIndexRouteImport } from './routes/_layout/index'\nimport { Route as
|
|
1
|
+
{"version":3,"file":"routeTree.gen.js","sources":["../../src/routeTree.gen.ts"],"sourcesContent":["/* eslint-disable */\n\n// @ts-nocheck\n\n// noinspection JSUnusedGlobalSymbols\n\n// This file was automatically generated by TanStack Router.\n// You should NOT make any changes in this file as it will be overwritten.\n// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.\n\nimport { Route as rootRouteImport } from './routes/__root'\nimport { Route as LayoutRouteImport } from './routes/_layout'\nimport { Route as LayoutIndexRouteImport } from './routes/_layout/index'\nimport { Route as LayoutLoginRouteImport } from './routes/_layout/login'\nimport { Route as LayoutMcpRouteImport } from './routes/_layout/mcp'\nimport { Route as LayoutServiceDesksRouteImport } from './routes/_layout/service-desks'\nimport { Route as AuthCallbackRouteImport } from './routes/auth.callback'\nimport { Route as LayoutAppSlugRouteImport } from './routes/_layout/app.$slug'\nimport { Route as LayoutCatalogAppsIndexRouteImport } from './routes/_layout/catalog.apps.index'\nimport { Route as LayoutAppSlugSubSubSlugRouteImport } from './routes/_layout/app.$slug_.sub.$subSlug'\n\nconst LayoutRoute = LayoutRouteImport.update({\n id: '/_layout',\n getParentRoute: () => rootRouteImport,\n} as any)\nconst LayoutIndexRoute = LayoutIndexRouteImport.update({\n id: '/',\n path: '/',\n getParentRoute: () => LayoutRoute,\n} as any)\nconst LayoutLoginRoute = LayoutLoginRouteImport.update({\n id: '/login',\n path: '/login',\n getParentRoute: () => LayoutRoute,\n} as any)\nconst LayoutMcpRoute = LayoutMcpRouteImport.update({\n id: '/mcp',\n path: '/mcp',\n getParentRoute: () => LayoutRoute,\n} as any)\nconst LayoutServiceDesksRoute = LayoutServiceDesksRouteImport.update({\n id: '/service-desks',\n path: '/service-desks',\n getParentRoute: () => LayoutRoute,\n} as any)\nconst AuthCallbackRoute = AuthCallbackRouteImport.update({\n id: '/auth/callback',\n path: '/auth/callback',\n getParentRoute: () => rootRouteImport,\n} as any)\nconst LayoutAppSlugRoute = LayoutAppSlugRouteImport.update({\n id: '/app/$slug',\n path: '/app/$slug',\n getParentRoute: () => LayoutRoute,\n} as any)\nconst LayoutCatalogAppsIndexRoute = LayoutCatalogAppsIndexRouteImport.update({\n id: '/catalog/apps/',\n path: '/catalog/apps/',\n getParentRoute: () => LayoutRoute,\n} as any)\nconst LayoutAppSlugSubSubSlugRoute = LayoutAppSlugSubSubSlugRouteImport.update({\n id: '/app/$slug_/sub/$subSlug',\n path: '/app/$slug/sub/$subSlug',\n getParentRoute: () => LayoutRoute,\n} as any)\n\nexport interface FileRoutesByFullPath {\n '/': typeof LayoutIndexRoute\n '/login': typeof LayoutLoginRoute\n '/mcp': typeof LayoutMcpRoute\n '/service-desks': typeof LayoutServiceDesksRoute\n '/auth/callback': typeof AuthCallbackRoute\n '/app/$slug': typeof LayoutAppSlugRoute\n '/catalog/apps/': typeof LayoutCatalogAppsIndexRoute\n '/app/$slug/sub/$subSlug': typeof LayoutAppSlugSubSubSlugRoute\n}\nexport interface FileRoutesByTo {\n '/login': typeof LayoutLoginRoute\n '/mcp': typeof LayoutMcpRoute\n '/service-desks': typeof LayoutServiceDesksRoute\n '/auth/callback': typeof AuthCallbackRoute\n '/': typeof LayoutIndexRoute\n '/app/$slug': typeof LayoutAppSlugRoute\n '/catalog/apps': typeof LayoutCatalogAppsIndexRoute\n '/app/$slug/sub/$subSlug': typeof LayoutAppSlugSubSubSlugRoute\n}\nexport interface FileRoutesById {\n __root__: typeof rootRouteImport\n '/_layout': typeof LayoutRouteWithChildren\n '/_layout/login': typeof LayoutLoginRoute\n '/_layout/mcp': typeof LayoutMcpRoute\n '/_layout/service-desks': typeof LayoutServiceDesksRoute\n '/auth/callback': typeof AuthCallbackRoute\n '/_layout/': typeof LayoutIndexRoute\n '/_layout/app/$slug': typeof LayoutAppSlugRoute\n '/_layout/catalog/apps/': typeof LayoutCatalogAppsIndexRoute\n '/_layout/app/$slug_/sub/$subSlug': typeof LayoutAppSlugSubSubSlugRoute\n}\nexport interface FileRouteTypes {\n fileRoutesByFullPath: FileRoutesByFullPath\n fullPaths:\n | '/'\n | '/login'\n | '/mcp'\n | '/service-desks'\n | '/auth/callback'\n | '/app/$slug'\n | '/catalog/apps/'\n | '/app/$slug/sub/$subSlug'\n fileRoutesByTo: FileRoutesByTo\n to:\n | '/login'\n | '/mcp'\n | '/service-desks'\n | '/auth/callback'\n | '/'\n | '/app/$slug'\n | '/catalog/apps'\n | '/app/$slug/sub/$subSlug'\n id:\n | '__root__'\n | '/_layout'\n | '/_layout/login'\n | '/_layout/mcp'\n | '/_layout/service-desks'\n | '/auth/callback'\n | '/_layout/'\n | '/_layout/app/$slug'\n | '/_layout/catalog/apps/'\n | '/_layout/app/$slug_/sub/$subSlug'\n fileRoutesById: FileRoutesById\n}\nexport interface RootRouteChildren {\n LayoutRoute: typeof LayoutRouteWithChildren\n AuthCallbackRoute: typeof AuthCallbackRoute\n}\n\ndeclare module '@tanstack/react-router' {\n interface FileRoutesByPath {\n '/_layout': {\n id: '/_layout'\n path: ''\n fullPath: '/'\n preLoaderRoute: typeof LayoutRouteImport\n parentRoute: typeof rootRouteImport\n }\n '/_layout/': {\n id: '/_layout/'\n path: '/'\n fullPath: '/'\n preLoaderRoute: typeof LayoutIndexRouteImport\n parentRoute: typeof LayoutRoute\n }\n '/_layout/login': {\n id: '/_layout/login'\n path: '/login'\n fullPath: '/login'\n preLoaderRoute: typeof LayoutLoginRouteImport\n parentRoute: typeof LayoutRoute\n }\n '/_layout/mcp': {\n id: '/_layout/mcp'\n path: '/mcp'\n fullPath: '/mcp'\n preLoaderRoute: typeof LayoutMcpRouteImport\n parentRoute: typeof LayoutRoute\n }\n '/_layout/service-desks': {\n id: '/_layout/service-desks'\n path: '/service-desks'\n fullPath: '/service-desks'\n preLoaderRoute: typeof LayoutServiceDesksRouteImport\n parentRoute: typeof LayoutRoute\n }\n '/auth/callback': {\n id: '/auth/callback'\n path: '/auth/callback'\n fullPath: '/auth/callback'\n preLoaderRoute: typeof AuthCallbackRouteImport\n parentRoute: typeof rootRouteImport\n }\n '/_layout/app/$slug': {\n id: '/_layout/app/$slug'\n path: '/app/$slug'\n fullPath: '/app/$slug'\n preLoaderRoute: typeof LayoutAppSlugRouteImport\n parentRoute: typeof LayoutRoute\n }\n '/_layout/catalog/apps/': {\n id: '/_layout/catalog/apps/'\n path: '/catalog/apps'\n fullPath: '/catalog/apps/'\n preLoaderRoute: typeof LayoutCatalogAppsIndexRouteImport\n parentRoute: typeof LayoutRoute\n }\n '/_layout/app/$slug_/sub/$subSlug': {\n id: '/_layout/app/$slug_/sub/$subSlug'\n path: '/app/$slug/sub/$subSlug'\n fullPath: '/app/$slug/sub/$subSlug'\n preLoaderRoute: typeof LayoutAppSlugSubSubSlugRouteImport\n parentRoute: typeof LayoutRoute\n }\n }\n}\n\ninterface LayoutRouteChildren {\n LayoutLoginRoute: typeof LayoutLoginRoute\n LayoutMcpRoute: typeof LayoutMcpRoute\n LayoutServiceDesksRoute: typeof LayoutServiceDesksRoute\n LayoutIndexRoute: typeof LayoutIndexRoute\n LayoutAppSlugRoute: typeof LayoutAppSlugRoute\n LayoutCatalogAppsIndexRoute: typeof LayoutCatalogAppsIndexRoute\n LayoutAppSlugSubSubSlugRoute: typeof LayoutAppSlugSubSubSlugRoute\n}\n\nconst LayoutRouteChildren: LayoutRouteChildren = {\n LayoutLoginRoute: LayoutLoginRoute,\n LayoutMcpRoute: LayoutMcpRoute,\n LayoutServiceDesksRoute: LayoutServiceDesksRoute,\n LayoutIndexRoute: LayoutIndexRoute,\n LayoutAppSlugRoute: LayoutAppSlugRoute,\n LayoutCatalogAppsIndexRoute: LayoutCatalogAppsIndexRoute,\n LayoutAppSlugSubSubSlugRoute: LayoutAppSlugSubSubSlugRoute,\n}\n\nconst LayoutRouteWithChildren =\n LayoutRoute._addFileChildren(LayoutRouteChildren)\n\nconst rootRouteChildren: RootRouteChildren = {\n LayoutRoute: LayoutRouteWithChildren,\n AuthCallbackRoute: AuthCallbackRoute,\n}\nexport const routeTree = rootRouteImport\n ._addFileChildren(rootRouteChildren)\n ._addFileTypes<FileRouteTypes>()\n"],"names":["LayoutRouteImport","rootRouteImport","LayoutIndexRouteImport","LayoutLoginRouteImport","LayoutMcpRouteImport","LayoutServiceDesksRouteImport","AuthCallbackRouteImport","LayoutAppSlugRouteImport","LayoutCatalogAppsIndexRouteImport","LayoutAppSlugSubSubSlugRouteImport"],"mappings":";;;;;;;;;;AAqBA,MAAM,cAAcA,QAAkB,OAAO;AAAA,EAC3C,IAAI;AAAA,EACJ,gBAAgB,MAAMC;AACxB,CAAQ;AACR,MAAM,mBAAmBC,QAAuB,OAAO;AAAA,EACrD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAM;AACxB,CAAQ;AACR,MAAM,mBAAmBC,QAAuB,OAAO;AAAA,EACrD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAM;AACxB,CAAQ;AACR,MAAM,iBAAiBC,QAAqB,OAAO;AAAA,EACjD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAM;AACxB,CAAQ;AACR,MAAM,0BAA0BC,QAA8B,OAAO;AAAA,EACnE,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAM;AACxB,CAAQ;AACR,MAAM,oBAAoBC,QAAwB,OAAO;AAAA,EACvD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAML;AACxB,CAAQ;AACR,MAAM,qBAAqBM,QAAyB,OAAO;AAAA,EACzD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAM;AACxB,CAAQ;AACR,MAAM,8BAA8BC,QAAkC,OAAO;AAAA,EAC3E,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAM;AACxB,CAAQ;AACR,MAAM,+BAA+BC,QAAmC,OAAO;AAAA,EAC7E,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,MAAM;AACxB,CAAQ;AAuJR,MAAM,sBAA2C;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,0BACJ,YAAY,iBAAiB,mBAAmB;AAElD,MAAM,oBAAuC;AAAA,EAC3C,aAAa;AAAA,EACb;AACF;AACO,MAAM,YAAYR,MACtB,iBAAiB,iBAAiB,EAClC,cAAA;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The core's own router, on a subpath of its own — a deliberate quarantine.
|
|
3
|
+
*
|
|
4
|
+
* `createAcRouter` carries `declare module '@tanstack/react-router'` for both
|
|
5
|
+
* `Register` and (via `routeTree.gen.ts`) `FileRoutesByPath`. TypeScript
|
|
6
|
+
* collects module augmentations when it builds the PROGRAM, and `import type`
|
|
7
|
+
* still resolves the specifier — so there is no way to reference anything from
|
|
8
|
+
* that file without admitting its augmentations. Even `await import()` does it;
|
|
9
|
+
* type elision is emit-only.
|
|
10
|
+
*
|
|
11
|
+
* Two declarations of `Register.router` in one program is a hard `TS2717`, and
|
|
12
|
+
* two of `FileRoutesByPath` collapses `createFileRoute` to `path?: never`. So a
|
|
13
|
+
* deployment that composes its own route tree — core routes plus its own, and
|
|
14
|
+
* therefore its own augmentation — must never end up with this file in its
|
|
15
|
+
* program. Keeping it off the main entry's import graph is what makes that
|
|
16
|
+
* possible, and this subpath is the only published door to it.
|
|
17
|
+
*
|
|
18
|
+
* Import it if you use the core's route tree unchanged: that is the example app
|
|
19
|
+
* and the core's own test suites, each a single-`Register` program. Do NOT
|
|
20
|
+
* import it from a deployment that declares its own.
|
|
21
|
+
*/
|
|
22
|
+
export { createAcRouter } from './util/createAcRouter.js';
|
|
23
|
+
export type { AcRouterInitParams } from './types/types.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
export declare const Route: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('
|
|
2
|
+
export declare const Route: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('../..').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/app/$slug", "/app/$slug", "/_layout/app/$slug", "/_layout/app/$slug", z.ZodObject<{
|
|
3
3
|
filterTag: z.ZodOptional<z.ZodString>;
|
|
4
4
|
deprecated: z.ZodOptional<z.ZodString>;
|
|
5
5
|
q: z.ZodOptional<z.ZodString>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
export declare const Route: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('
|
|
2
|
+
export declare const Route: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('../..').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/app/$slug/sub/$subSlug", "/app/$slug/sub/$subSlug", "/_layout/app/$slug_/sub/$subSlug", "/_layout/app/$slug_/sub/$subSlug", z.ZodObject<{
|
|
3
3
|
filterTag: z.ZodOptional<z.ZodString>;
|
|
4
4
|
deprecated: z.ZodOptional<z.ZodString>;
|
|
5
5
|
q: z.ZodOptional<z.ZodString>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
export declare const Route: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('
|
|
2
|
+
export declare const Route: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('../..').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/catalog/apps", "/catalog/apps/", "/_layout/catalog/apps/", "/_layout/catalog/apps/", z.ZodObject<{
|
|
3
3
|
app: z.ZodOptional<z.ZodString>;
|
|
4
4
|
q: z.ZodOptional<z.ZodString>;
|
|
5
5
|
sub: z.ZodOptional<z.ZodString>;
|
|
6
|
-
}, z.core.$strip>, import('@tanstack/router-core').ResolveParams<"/catalog/apps">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, (ctx: import('@tanstack/router-core').LoaderFnContext<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('
|
|
6
|
+
}, z.core.$strip>, import('@tanstack/router-core').ResolveParams<"/catalog/apps">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, (ctx: import('@tanstack/router-core').LoaderFnContext<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('../..').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/_layout/catalog/apps/", import('@tanstack/router-core').ResolveParams<"/catalog/apps">, {}, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, unknown, undefined>) => Promise<void>, unknown, unknown, unknown, unknown, undefined>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
export declare const Route: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('
|
|
2
|
+
export declare const Route: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('../..').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/", "/", "/_layout/", "/_layout/", z.ZodObject<{
|
|
3
3
|
filterTag: z.ZodOptional<z.ZodString>;
|
|
4
4
|
q: z.ZodOptional<z.ZodString>;
|
|
5
5
|
}, z.core.$strip>, import('@tanstack/router-core').ResolveParams<"/">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const Route: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('
|
|
1
|
+
export declare const Route: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('../..').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/login", "/login", "/_layout/login", "/_layout/login", undefined, import('@tanstack/router-core').ResolveParams<"/login">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const Route: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('
|
|
1
|
+
export declare const Route: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('../..').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/mcp", "/mcp", "/_layout/mcp", "/_layout/mcp", undefined, import('@tanstack/router-core').ResolveParams<"/mcp">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
export declare const Route: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('
|
|
2
|
+
export declare const Route: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('../..').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/service-desks", "/service-desks", "/_layout/service-desks", "/_layout/service-desks", z.ZodObject<{
|
|
3
3
|
q: z.ZodOptional<z.ZodString>;
|
|
4
4
|
}, z.core.$strip>, import('@tanstack/router-core').ResolveParams<"/service-desks">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const Route: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('
|
|
1
|
+
export declare const Route: import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, import('@tanstack/react-router').RootRoute<import('@tanstack/react-router').Register, undefined, import('..').AcRouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "", "/", "/_layout", "/_layout", undefined, import('@tanstack/router-core').ResolveParams<"">, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|