@igstack/app-catalog-frontend-core 6.1.2 → 6.1.3
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/modules/appCatalog/context/AppCatalogContext.js +2 -1
- package/dist/esm/modules/appCatalog/context/AppCatalogContext.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/components/PersonBadge.js +2 -1
- package/dist/esm/modules/appCatalog/ui/components/PersonBadge.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/components/TierVariantsSection.js +2 -1
- package/dist/esm/modules/appCatalog/ui/components/TierVariantsSection.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/detail/AppDetails.js +1 -0
- package/dist/esm/modules/appCatalog/ui/detail/AppDetails.js.map +1 -1
- package/dist/esm/modules/appCatalog/ui/pages/AppCatalogPage.js +8 -4
- package/dist/esm/modules/appCatalog/ui/pages/AppCatalogPage.js.map +1 -1
- package/dist/esm/routes/__root.js +2 -5
- package/dist/esm/routes/__root.js.map +1 -1
- package/dist/esm/ui/components/error/BaseErrorPage.js +2 -4
- package/dist/esm/ui/components/error/BaseErrorPage.js.map +1 -1
- package/dist/esm/ui/components/header/Header.js +1 -0
- package/dist/esm/ui/components/header/Header.js.map +1 -1
- package/dist/esm/ui/layout/Devtools.d.ts +4 -0
- package/dist/esm/ui/layout/Devtools.js +9 -0
- package/dist/esm/ui/layout/Devtools.js.map +1 -0
- package/dist/esm/ui/layout/DevtoolsPanels.d.ts +4 -0
- package/dist/esm/ui/layout/TopLevelProviders.js +2 -10
- package/dist/esm/ui/layout/TopLevelProviders.js.map +1 -1
- package/package.json +4 -4
- package/src/modules/appCatalog/ui/pages/AppCatalogPage.tsx +18 -9
- package/src/routes/__root.tsx +0 -2
- package/src/ui/components/error/BaseErrorPage.tsx +2 -4
- package/src/ui/layout/Devtools.tsx +17 -0
- package/src/ui/layout/DevtoolsPanels.tsx +12 -0
- package/src/ui/layout/TopLevelProviders.tsx +2 -7
- package/dist/esm/node_modules/.pnpm/@tanstack_react-router-devtools@1.151.6_@tanstack_react-router@1.151.6_react-dom@19.1.2_20b78d099e847743bc64b4d051c71d30/node_modules/@tanstack/react-router-devtools/dist/esm/TanStackRouterDevtools.js +0 -72
- package/dist/esm/node_modules/.pnpm/@tanstack_react-router-devtools@1.151.6_@tanstack_react-router@1.151.6_react-dom@19.1.2_20b78d099e847743bc64b4d051c71d30/node_modules/@tanstack/react-router-devtools/dist/esm/TanStackRouterDevtools.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@tanstack_react-router-devtools@1.151.6_@tanstack_react-router@1.151.6_react-dom@19.1.2_20b78d099e847743bc64b4d051c71d30/node_modules/@tanstack/react-router-devtools/dist/esm/TanStackRouterDevtoolsPanel.js +0 -44
- package/dist/esm/node_modules/.pnpm/@tanstack_react-router-devtools@1.151.6_@tanstack_react-router@1.151.6_react-dom@19.1.2_20b78d099e847743bc64b4d051c71d30/node_modules/@tanstack/react-router-devtools/dist/esm/TanStackRouterDevtoolsPanel.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@tanstack_react-router-devtools@1.151.6_@tanstack_react-router@1.151.6_react-dom@19.1.2_20b78d099e847743bc64b4d051c71d30/node_modules/@tanstack/react-router-devtools/dist/esm/index.js +0 -12
- package/dist/esm/node_modules/.pnpm/@tanstack_react-router-devtools@1.151.6_@tanstack_react-router@1.151.6_react-dom@19.1.2_20b78d099e847743bc64b4d051c71d30/node_modules/@tanstack/react-router-devtools/dist/esm/index.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@tanstack_router-core@1.151.6/node_modules/@tanstack/router-core/dist/esm/new-process-route-tree.js +0 -95
- package/dist/esm/node_modules/.pnpm/@tanstack_router-core@1.151.6/node_modules/@tanstack/router-core/dist/esm/new-process-route-tree.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@tanstack_router-core@1.151.6/node_modules/@tanstack/router-core/dist/esm/path.js +0 -107
- package/dist/esm/node_modules/.pnpm/@tanstack_router-core@1.151.6/node_modules/@tanstack/router-core/dist/esm/path.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@tanstack_router-core@1.151.6/node_modules/@tanstack/router-core/dist/esm/root.js +0 -5
- package/dist/esm/node_modules/.pnpm/@tanstack_router-core@1.151.6/node_modules/@tanstack/router-core/dist/esm/root.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@tanstack_router-devtools-core@1.151.6_@tanstack_router-core@1.151.6_csstype@3.2.3/node_modules/@tanstack/router-devtools-core/dist/BaseTanStackRouterDevtoolsPanel-DxaCaP75.js +0 -1963
- package/dist/esm/node_modules/.pnpm/@tanstack_router-devtools-core@1.151.6_@tanstack_router-core@1.151.6_csstype@3.2.3/node_modules/@tanstack/router-devtools-core/dist/BaseTanStackRouterDevtoolsPanel-DxaCaP75.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@tanstack_router-devtools-core@1.151.6_@tanstack_router-core@1.151.6_csstype@3.2.3/node_modules/@tanstack/router-devtools-core/dist/FloatingTanStackRouterDevtools-CaypUmOS.js +0 -284
- package/dist/esm/node_modules/.pnpm/@tanstack_router-devtools-core@1.151.6_@tanstack_router-core@1.151.6_csstype@3.2.3/node_modules/@tanstack/router-devtools-core/dist/FloatingTanStackRouterDevtools-CaypUmOS.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@tanstack_router-devtools-core@1.151.6_@tanstack_router-core@1.151.6_csstype@3.2.3/node_modules/@tanstack/router-devtools-core/dist/index-5jfj03XJ.js +0 -1855
- package/dist/esm/node_modules/.pnpm/@tanstack_router-devtools-core@1.151.6_@tanstack_router-core@1.151.6_csstype@3.2.3/node_modules/@tanstack/router-devtools-core/dist/index-5jfj03XJ.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/goober@2.1.18_csstype@3.2.3/node_modules/goober/dist/goober.modern.js +0 -56
- package/dist/esm/node_modules/.pnpm/goober@2.1.18_csstype@3.2.3/node_modules/goober/dist/goober.modern.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/tiny-invariant@1.3.3/node_modules/tiny-invariant/dist/esm/tiny-invariant.js +0 -17
- package/dist/esm/node_modules/.pnpm/tiny-invariant@1.3.3/node_modules/tiny-invariant/dist/esm/tiny-invariant.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Header.js","sources":["../../../../../src/ui/components/header/Header.tsx"],"sourcesContent":["import type {\n AppVersionInfo,\n VersionInfo,\n} from '@igstack/app-catalog-backend-core'\nimport { Link } from '@tanstack/react-router'\nimport { useQuery } from '@tanstack/react-query'\nimport { LogOut, X } from 'lucide-react'\nimport React, { use } from 'react'\nimport AppCatalogLogo from '~/assets/app-catalog.svg?react'\nimport { useTRPC } from '~/api/infra/trpc'\nimport { ThemeSwitcher } from '~/components/ThemeSwitcher'\nimport { AppCatalogContext } from '~/modules/appCatalog/context/AppCatalogContext'\nimport {\n useAuth,\n useAuthActions,\n useIsAuthenticated,\n useUser,\n} from '~/modules/auth'\nimport { Button } from '~/ui/button'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '~/ui/dropdown-menu'\nimport {\n Popover,\n PopoverClose,\n PopoverContent,\n PopoverTrigger,\n} from '~/ui/popover'\nimport { Skeleton } from '~/ui/skeleton'\n\nfunction ShaSuffix({ version }: { version: VersionInfo }) {\n if (!version.sha) return null\n if (version.shaUrl) {\n return (\n <>\n {' '}\n <a\n href={version.shaUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-muted-foreground hover:text-primary\"\n onClick={(e) => e.stopPropagation()}\n >\n ({version.sha})\n </a>\n </>\n )\n }\n return <span className=\"text-muted-foreground\"> ({version.sha})</span>\n}\n\nfunction VersionItem({\n label,\n version,\n}: {\n label: string\n version: VersionInfo\n}) {\n return (\n <div className=\"flex items-center justify-between gap-4 py-1\">\n <span className=\"text-xs text-muted-foreground\">{label}</span>\n <span className=\"text-sm font-medium text-right\">\n {version.url ? (\n <a\n href={version.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:text-primary/80 transition-colors\"\n onClick={(e) => e.stopPropagation()}\n >\n {version.displayName}\n </a>\n ) : (\n version.displayName\n )}\n <ShaSuffix version={version} />\n </span>\n </div>\n )\n}\n\nexport function VersionDisplay({ versions }: { versions: AppVersionInfo }) {\n const isLocal =\n versions.backend?.displayName === 'local' && !versions.coreVersion\n\n if (isLocal) {\n return (\n <span className=\"text-xs text-muted-foreground\" title=\"Local\">\n local\n </span>\n )\n }\n\n return (\n <div className=\"flex flex-col divide-y\">\n {versions.backend && (\n <VersionItem label=\"Pipeline\" version={versions.backend} />\n )}\n {versions.coreVersion && (\n <VersionItem label=\"Core\" version={versions.coreVersion} />\n )}\n {versions.frontend && (\n <VersionItem label=\"FE\" version={versions.frontend} />\n )}\n </div>\n )\n}\n\n/**\n * Version detail moved behind an on-demand popover (same click-to-reveal\n * pattern as PersonBadge's approver chips) instead of always-visible text —\n * keeps the header compact. Content is unchanged: same Pipeline/Core/FE\n * lines, links, and SHA suffix as before, just revealed on click.\n */\nexport function VersionPopover({ versions }: { versions: AppVersionInfo }) {\n const isLocal =\n versions.backend?.displayName === 'local' && !versions.coreVersion\n\n if (isLocal) {\n return (\n <span className=\"text-xs text-muted-foreground\" title=\"Local\">\n local\n </span>\n )\n }\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-[10px] font-mono leading-none text-muted-foreground hover:bg-primary/15 hover:text-primary transition-colors\"\n aria-label=\"Show version details\"\n title=\"Version details\"\n data-testid=\"version-info-trigger\"\n >\n {versions.backend?.displayName ?? '?'}\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-72 p-0 overflow-hidden\">\n <div className=\"flex items-center justify-between px-3 py-2 border-b bg-muted/40\">\n <span className=\"text-sm font-semibold\">Version details</span>\n <PopoverClose\n className=\"rounded p-1 text-muted-foreground hover:text-foreground hover:bg-muted transition-colors\"\n aria-label=\"Close\"\n >\n <X className=\"size-3.5\" />\n </PopoverClose>\n </div>\n <div className=\"px-3 py-1\">\n <VersionDisplay versions={versions} />\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\nexport interface HeaderProps {\n middle?: React.ReactNode\n}\n\nexport function Header({ middle }: HeaderProps) {\n const { isLoading } = useAuth()\n const isAuthenticated = useIsAuthenticated()\n const user = useUser()\n const { logout, devLogin } = useAuthActions()\n const appCatalogContextMaybe = use(AppCatalogContext)\n const trpc = useTRPC()\n const { data: providersData } = useQuery(\n trpc.auth.getProviders.queryOptions(),\n )\n\n const handleLogout = async () => {\n try {\n await logout()\n } catch (error) {\n console.error('Logout failed:', error)\n }\n }\n\n return (\n <div className=\"flex items-center mb-4 pb-4 gap-4 border-b\">\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2\">\n <Link to=\"/\">\n <AppCatalogLogo className=\"h-16 w-16\" />\n </Link>\n <div className=\"flex flex-col\">\n <Link to=\"/\" className=\"font-serif text-lg font-semibold\">\n App Catalog\n </Link>\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-[10px] text-muted-foreground/60\">\n by Igor Golovin\n </span>\n {appCatalogContextMaybe?.versions && (\n <VersionPopover versions={appCatalogContextMaybe.versions} />\n )}\n </div>\n </div>\n </div>\n </div>\n {middle && <div className=\"flex-1\">{middle}</div>}\n <div className=\"flex items-center gap-3 ml-auto\">\n <ThemeSwitcher />\n {isLoading ? (\n <Skeleton className=\"w-8 h-8 rounded-full\" />\n ) : !isAuthenticated ? (\n // No Login button: the catalog is fully browsable without signing in,\n // so it mostly advertised a flow most visitors have no reason to\n // enter. Auth itself is untouched -- the modal, the login route, the\n // client and session handling all still work, so anyone who reaches\n // the flow by URL or by calling `useAuthModal().open()` can sign in,\n // and this branch flips to the user menu below once they do. `git\n // revert` of the commit that removed it restores the button as-is.\n // DEV Login stays: it is gated behind `devLoginEnabled`, so it never\n // reaches a real deployment.\n providersData?.devLoginEnabled && (\n <button\n type=\"button\"\n onClick={devLogin}\n className=\"text-xs font-medium px-2 py-1 rounded bg-amber-500/20 text-amber-600 dark:text-amber-400 hover:bg-amber-500/30 border border-amber-500/30 cursor-pointer\"\n >\n DEV Login\n </button>\n )\n ) : (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"w-8 h-8 rounded-full p-0 hover:bg-accent hover:text-accent-foreground cursor-pointer\"\n aria-label={`User menu for ${user?.name || 'User'}`}\n data-testid=\"user-avatar-button\"\n >\n {user?.image ? (\n <img\n src={user.image}\n alt={user.name || 'User'}\n className=\"w-full h-full rounded-full object-cover\"\n />\n ) : (\n <div className=\"flex items-center justify-center w-full h-full rounded-full bg-primary text-primary-foreground text-xs font-semibold\">\n {(user?.name || user?.email || '?').charAt(0).toUpperCase()}\n </div>\n )}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-56\">\n <div className=\"px-2 py-3 flex items-center gap-3\">\n {user?.image ? (\n <img\n src={user.image}\n alt={user.name || 'User'}\n className=\"w-10 h-10 rounded-full object-cover shrink-0\"\n />\n ) : (\n <div className=\"flex items-center justify-center w-10 h-10 rounded-full bg-primary text-primary-foreground text-sm font-semibold shrink-0\">\n {(user?.name || user?.email || '?').charAt(0).toUpperCase()}\n </div>\n )}\n <div className=\"flex flex-col min-w-0\">\n <p className=\"text-xs text-muted-foreground truncate\">\n @{user?.email?.split('@')[0] || 'user'}\n </p>\n <p className=\"text-sm font-medium truncate\">\n {user?.name || 'User'}\n </p>\n </div>\n </div>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={handleLogout}>\n <LogOut className=\"h-4 w-4 mr-2\" />\n <span>Sign out</span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </div>\n )\n}\n"],"names":["AppCatalogLogo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Header.js","sources":["../../../../../src/ui/components/header/Header.tsx"],"sourcesContent":["import type {\n AppVersionInfo,\n VersionInfo,\n} from '@igstack/app-catalog-backend-core'\nimport { Link } from '@tanstack/react-router'\nimport { useQuery } from '@tanstack/react-query'\nimport { LogOut, X } from 'lucide-react'\nimport React, { use } from 'react'\nimport AppCatalogLogo from '~/assets/app-catalog.svg?react'\nimport { useTRPC } from '~/api/infra/trpc'\nimport { ThemeSwitcher } from '~/components/ThemeSwitcher'\nimport { AppCatalogContext } from '~/modules/appCatalog/context/AppCatalogContext'\nimport {\n useAuth,\n useAuthActions,\n useIsAuthenticated,\n useUser,\n} from '~/modules/auth'\nimport { Button } from '~/ui/button'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '~/ui/dropdown-menu'\nimport {\n Popover,\n PopoverClose,\n PopoverContent,\n PopoverTrigger,\n} from '~/ui/popover'\nimport { Skeleton } from '~/ui/skeleton'\n\nfunction ShaSuffix({ version }: { version: VersionInfo }) {\n if (!version.sha) return null\n if (version.shaUrl) {\n return (\n <>\n {' '}\n <a\n href={version.shaUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-muted-foreground hover:text-primary\"\n onClick={(e) => e.stopPropagation()}\n >\n ({version.sha})\n </a>\n </>\n )\n }\n return <span className=\"text-muted-foreground\"> ({version.sha})</span>\n}\n\nfunction VersionItem({\n label,\n version,\n}: {\n label: string\n version: VersionInfo\n}) {\n return (\n <div className=\"flex items-center justify-between gap-4 py-1\">\n <span className=\"text-xs text-muted-foreground\">{label}</span>\n <span className=\"text-sm font-medium text-right\">\n {version.url ? (\n <a\n href={version.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:text-primary/80 transition-colors\"\n onClick={(e) => e.stopPropagation()}\n >\n {version.displayName}\n </a>\n ) : (\n version.displayName\n )}\n <ShaSuffix version={version} />\n </span>\n </div>\n )\n}\n\nexport function VersionDisplay({ versions }: { versions: AppVersionInfo }) {\n const isLocal =\n versions.backend?.displayName === 'local' && !versions.coreVersion\n\n if (isLocal) {\n return (\n <span className=\"text-xs text-muted-foreground\" title=\"Local\">\n local\n </span>\n )\n }\n\n return (\n <div className=\"flex flex-col divide-y\">\n {versions.backend && (\n <VersionItem label=\"Pipeline\" version={versions.backend} />\n )}\n {versions.coreVersion && (\n <VersionItem label=\"Core\" version={versions.coreVersion} />\n )}\n {versions.frontend && (\n <VersionItem label=\"FE\" version={versions.frontend} />\n )}\n </div>\n )\n}\n\n/**\n * Version detail moved behind an on-demand popover (same click-to-reveal\n * pattern as PersonBadge's approver chips) instead of always-visible text —\n * keeps the header compact. Content is unchanged: same Pipeline/Core/FE\n * lines, links, and SHA suffix as before, just revealed on click.\n */\nexport function VersionPopover({ versions }: { versions: AppVersionInfo }) {\n const isLocal =\n versions.backend?.displayName === 'local' && !versions.coreVersion\n\n if (isLocal) {\n return (\n <span className=\"text-xs text-muted-foreground\" title=\"Local\">\n local\n </span>\n )\n }\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-[10px] font-mono leading-none text-muted-foreground hover:bg-primary/15 hover:text-primary transition-colors\"\n aria-label=\"Show version details\"\n title=\"Version details\"\n data-testid=\"version-info-trigger\"\n >\n {versions.backend?.displayName ?? '?'}\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-72 p-0 overflow-hidden\">\n <div className=\"flex items-center justify-between px-3 py-2 border-b bg-muted/40\">\n <span className=\"text-sm font-semibold\">Version details</span>\n <PopoverClose\n className=\"rounded p-1 text-muted-foreground hover:text-foreground hover:bg-muted transition-colors\"\n aria-label=\"Close\"\n >\n <X className=\"size-3.5\" />\n </PopoverClose>\n </div>\n <div className=\"px-3 py-1\">\n <VersionDisplay versions={versions} />\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\nexport interface HeaderProps {\n middle?: React.ReactNode\n}\n\nexport function Header({ middle }: HeaderProps) {\n const { isLoading } = useAuth()\n const isAuthenticated = useIsAuthenticated()\n const user = useUser()\n const { logout, devLogin } = useAuthActions()\n const appCatalogContextMaybe = use(AppCatalogContext)\n const trpc = useTRPC()\n const { data: providersData } = useQuery(\n trpc.auth.getProviders.queryOptions(),\n )\n\n const handleLogout = async () => {\n try {\n await logout()\n } catch (error) {\n console.error('Logout failed:', error)\n }\n }\n\n return (\n <div className=\"flex items-center mb-4 pb-4 gap-4 border-b\">\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2\">\n <Link to=\"/\">\n <AppCatalogLogo className=\"h-16 w-16\" />\n </Link>\n <div className=\"flex flex-col\">\n <Link to=\"/\" className=\"font-serif text-lg font-semibold\">\n App Catalog\n </Link>\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-[10px] text-muted-foreground/60\">\n by Igor Golovin\n </span>\n {appCatalogContextMaybe?.versions && (\n <VersionPopover versions={appCatalogContextMaybe.versions} />\n )}\n </div>\n </div>\n </div>\n </div>\n {middle && <div className=\"flex-1\">{middle}</div>}\n <div className=\"flex items-center gap-3 ml-auto\">\n <ThemeSwitcher />\n {isLoading ? (\n <Skeleton className=\"w-8 h-8 rounded-full\" />\n ) : !isAuthenticated ? (\n // No Login button: the catalog is fully browsable without signing in,\n // so it mostly advertised a flow most visitors have no reason to\n // enter. Auth itself is untouched -- the modal, the login route, the\n // client and session handling all still work, so anyone who reaches\n // the flow by URL or by calling `useAuthModal().open()` can sign in,\n // and this branch flips to the user menu below once they do. `git\n // revert` of the commit that removed it restores the button as-is.\n // DEV Login stays: it is gated behind `devLoginEnabled`, so it never\n // reaches a real deployment.\n providersData?.devLoginEnabled && (\n <button\n type=\"button\"\n onClick={devLogin}\n className=\"text-xs font-medium px-2 py-1 rounded bg-amber-500/20 text-amber-600 dark:text-amber-400 hover:bg-amber-500/30 border border-amber-500/30 cursor-pointer\"\n >\n DEV Login\n </button>\n )\n ) : (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"w-8 h-8 rounded-full p-0 hover:bg-accent hover:text-accent-foreground cursor-pointer\"\n aria-label={`User menu for ${user?.name || 'User'}`}\n data-testid=\"user-avatar-button\"\n >\n {user?.image ? (\n <img\n src={user.image}\n alt={user.name || 'User'}\n className=\"w-full h-full rounded-full object-cover\"\n />\n ) : (\n <div className=\"flex items-center justify-center w-full h-full rounded-full bg-primary text-primary-foreground text-xs font-semibold\">\n {(user?.name || user?.email || '?').charAt(0).toUpperCase()}\n </div>\n )}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-56\">\n <div className=\"px-2 py-3 flex items-center gap-3\">\n {user?.image ? (\n <img\n src={user.image}\n alt={user.name || 'User'}\n className=\"w-10 h-10 rounded-full object-cover shrink-0\"\n />\n ) : (\n <div className=\"flex items-center justify-center w-10 h-10 rounded-full bg-primary text-primary-foreground text-sm font-semibold shrink-0\">\n {(user?.name || user?.email || '?').charAt(0).toUpperCase()}\n </div>\n )}\n <div className=\"flex flex-col min-w-0\">\n <p className=\"text-xs text-muted-foreground truncate\">\n @{user?.email?.split('@')[0] || 'user'}\n </p>\n <p className=\"text-sm font-medium truncate\">\n {user?.name || 'User'}\n </p>\n </div>\n </div>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={handleLogout}>\n <LogOut className=\"h-4 w-4 mr-2\" />\n <span>Sign out</span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </div>\n )\n}\n"],"names":["AppCatalogLogo"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Devtools.js","sources":["../../../../src/ui/layout/Devtools.tsx"],"sourcesContent":["import { Suspense, lazy } from 'react'\nimport type { QueryClient } from '@tanstack/react-query'\n\n// Dev-only: `import.meta.env.DEV` is false in production builds, so Rollup drops\n// the import() and neither devtools package reaches the shipped bundle (#120).\nconst DevtoolsPanels = import.meta.env.DEV\n ? lazy(() => import('./DevtoolsPanels'))\n : null\n\nexport function Devtools({ client }: { client: QueryClient }) {\n if (!DevtoolsPanels) return null\n return (\n <Suspense fallback={null}>\n <DevtoolsPanels client={client} />\n </Suspense>\n )\n}\n"],"names":[],"mappings":";;AASO,SAAS,SAAS,EAAE,UAAmC;AACvC,SAAO;AAM9B;"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useState, useMemo, Suspense } from "react";
|
|
3
|
-
import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
|
|
4
|
-
import { TanStackRouterDevtools } from "../../node_modules/.pnpm/@tanstack_react-router-devtools@1.151.6_@tanstack_react-router@1.151.6_react-dom@19.1.2_20b78d099e847743bc64b4d051c71d30/node_modules/@tanstack/react-router-devtools/dist/esm/index.js";
|
|
5
3
|
import { ThemeProvider } from "../../components/theme-provider.js";
|
|
6
4
|
import { AuthProvider } from "../../modules/auth/AuthContext.js";
|
|
7
5
|
import "@tanstack/react-query";
|
|
@@ -12,6 +10,7 @@ import { GlobalConfigProvider } from "../../modules/config/GlobalConfigContext.j
|
|
|
12
10
|
import { makePluginInterfaceForCore } from "../../modules/pluginCore/makePluginManagerContext.js";
|
|
13
11
|
import { PluginManagerContextProvider } from "../../modules/pluginCore/PluginManagerContext.js";
|
|
14
12
|
import { TooltipProvider } from "../tooltip.js";
|
|
13
|
+
import { Devtools } from "./Devtools.js";
|
|
15
14
|
import { LoadingScreen } from "./LoadingScreen.js";
|
|
16
15
|
function TopLevelProviders({ children, queryClient }) {
|
|
17
16
|
const [plugins] = useState(() => [
|
|
@@ -35,14 +34,7 @@ function TopLevelProviders({ children, queryClient }) {
|
|
|
35
34
|
children: [
|
|
36
35
|
children,
|
|
37
36
|
/* @__PURE__ */ jsx(LoginModal, {}),
|
|
38
|
-
/* @__PURE__ */ jsx(
|
|
39
|
-
/* @__PURE__ */ jsx(
|
|
40
|
-
ReactQueryDevtools,
|
|
41
|
-
{
|
|
42
|
-
initialIsOpen: false,
|
|
43
|
-
client: queryClient
|
|
44
|
-
}
|
|
45
|
-
)
|
|
37
|
+
/* @__PURE__ */ jsx(Devtools, { client: queryClient })
|
|
46
38
|
]
|
|
47
39
|
}
|
|
48
40
|
) }) }) }) }) })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TopLevelProviders.js","sources":["../../../../src/ui/layout/TopLevelProviders.tsx"],"sourcesContent":["import React, { Suspense, useMemo, useState } from 'react'\n\nimport type { TRPCRouter } from '@igstack/app-catalog-backend-core'\nimport type { QueryClient } from '@tanstack/react-query'\nimport
|
|
1
|
+
{"version":3,"file":"TopLevelProviders.js","sources":["../../../../src/ui/layout/TopLevelProviders.tsx"],"sourcesContent":["import React, { Suspense, useMemo, useState } from 'react'\n\nimport type { TRPCRouter } from '@igstack/app-catalog-backend-core'\nimport type { QueryClient } from '@tanstack/react-query'\nimport type { TRPCClient } from '@trpc/client'\nimport { ThemeProvider } from '~/components/theme-provider'\nimport { AuthProvider } from '~/modules/auth'\nimport { AuthModalProvider } from '~/modules/auth/AuthModalContext'\nimport { LoginModal } from '~/modules/auth/ui/LoginModal'\nimport { GlobalConfigProvider } from '~/modules/config/GlobalConfigContext'\nimport { makePluginInterfaceForCore } from '~/modules/pluginCore/makePluginManagerContext'\nimport { PluginManagerContextProvider } from '~/modules/pluginCore/PluginManagerContext'\nimport { TooltipProvider } from '~/ui/tooltip'\nimport { Devtools } from './Devtools'\nimport { LoadingScreen } from './LoadingScreen'\n\nexport interface MainLayoutProps {\n children: React.ReactNode\n queryClient: QueryClient\n trpcClient: TRPCClient<TRPCRouter>\n}\n\nexport function TopLevelProviders({ children, queryClient }: MainLayoutProps) {\n // const { data, failureCount, failureReason } = useQueryBootstrapConfig()\n const [plugins] = useState(() => [\n // Future plugins can be added here\n ])\n\n const pluginInterfaceForCore = useMemo(() => {\n return makePluginInterfaceForCore(plugins)\n }, [plugins])\n\n // if (!data) {\n // return <LoadingScreen label='configuration' failureCount={failureCount} failureReason={failureReason?.message} />\n // }\n\n return (\n <ThemeProvider\n attribute=\"class\"\n defaultTheme=\"system\"\n enableSystem\n disableTransitionOnChange\n >\n <TooltipProvider>\n <AuthModalProvider>\n <AuthProvider>\n <Suspense fallback={<LoadingScreen />}>\n <GlobalConfigProvider>\n <PluginManagerContextProvider\n plugins={plugins}\n pluginInterfaceForCore={pluginInterfaceForCore}\n >\n {children}\n <LoginModal />\n <Devtools client={queryClient} />\n </PluginManagerContextProvider>\n </GlobalConfigProvider>\n </Suspense>\n </AuthProvider>\n </AuthModalProvider>\n </TooltipProvider>\n </ThemeProvider>\n )\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAsBO,SAAS,kBAAkB,EAAE,UAAU,eAAgC;AAE5E,QAAM,CAAC,OAAO,IAAI,SAAS,MAAM;AAAA;AAAA,EAAA,CAEhC;AAED,QAAM,yBAAyB,QAAQ,MAAM;AAC3C,WAAO,2BAAkC;AAAA,EAC3C,GAAG,CAAC,OAAO,CAAC;AAMZ,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,cAAa;AAAA,MACb,cAAY;AAAA,MACZ,2BAAyB;AAAA,MAEzB,UAAA,oBAAC,iBAAA,EACC,UAAA,oBAAC,mBAAA,EACC,UAAA,oBAAC,cAAA,EACC,UAAA,oBAAC,UAAA,EAAS,UAAU,oBAAC,eAAA,CAAA,CAAc,GACjC,8BAAC,sBAAA,EACC,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA;AAAA,UAEC,UAAA;AAAA,YAAA;AAAA,gCACA,YAAA,EAAW;AAAA,YACZ,oBAAC,UAAA,EAAS,QAAQ,YAAA,CAAa;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,EACjC,CACF,EAAA,CACF,GACF,EAAA,CACF,EAAA,CACF;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@igstack/app-catalog-frontend-core",
|
|
3
|
-
"version": "6.1.
|
|
3
|
+
"version": "6.1.3",
|
|
4
4
|
"description": "Frontend core library for App Catalog",
|
|
5
5
|
"homepage": "https://github.com/lislon/app-catalog",
|
|
6
6
|
"repository": {
|
|
@@ -112,7 +112,7 @@
|
|
|
112
112
|
"tailwindcss": "^4.1.7",
|
|
113
113
|
"tiptap-markdown": "^0.8.0",
|
|
114
114
|
"tslib": "^2.3.0",
|
|
115
|
-
"@igstack/app-catalog-shared-core": "6.1.
|
|
115
|
+
"@igstack/app-catalog-shared-core": "6.1.3"
|
|
116
116
|
},
|
|
117
117
|
"devDependencies": {
|
|
118
118
|
"@tailwindcss/vite": "^4.0.5",
|
|
@@ -139,7 +139,7 @@
|
|
|
139
139
|
"vite-plugin-static-copy": "^3.1.4",
|
|
140
140
|
"vite-plugin-svgr": "^4.2.0",
|
|
141
141
|
"vitest": "^4.1.2",
|
|
142
|
-
"@igstack/app-catalog-backend-core": "6.1.
|
|
142
|
+
"@igstack/app-catalog-backend-core": "6.1.3"
|
|
143
143
|
},
|
|
144
144
|
"peerDependencies": {
|
|
145
145
|
"react": "19.1.2",
|
|
@@ -148,7 +148,7 @@
|
|
|
148
148
|
"vite": "^6.3.5",
|
|
149
149
|
"vite-plugin-svgr": "^4.2.0"
|
|
150
150
|
},
|
|
151
|
-
"gitHead": "
|
|
151
|
+
"gitHead": "1aaba32ee75a50b049cfcbb724f459eb137cc3cb",
|
|
152
152
|
"scripts": {
|
|
153
153
|
"build": "vite build",
|
|
154
154
|
"build:lenient": "vite build --mode lenient",
|
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
import type { Resource } from '@igstack/app-catalog-backend-core'
|
|
2
2
|
import { useNavigate, useSearch } from '@tanstack/react-router'
|
|
3
|
-
import { useCallback, useEffect, useMemo } from 'react'
|
|
3
|
+
import { Suspense, lazy, useCallback, useEffect, useMemo } from 'react'
|
|
4
4
|
import { useAppCatalogContext } from '../../context/AppCatalogContext'
|
|
5
5
|
import { useAppCatalogFilters } from '../context/AppCatalogFiltersContext'
|
|
6
6
|
import { AppCatalogGrid } from '../catalog/AppCatalogGrid'
|
|
7
|
-
|
|
7
|
+
|
|
8
|
+
// The detail card (and the markdown stack it renders) loads on first open, not
|
|
9
|
+
// with the catalog grid every visitor sees first (#120).
|
|
10
|
+
const AppDetailPanel = lazy(() =>
|
|
11
|
+
import('../catalog/AppDetailPanel').then((m) => ({
|
|
12
|
+
default: m.AppDetailPanel,
|
|
13
|
+
})),
|
|
14
|
+
)
|
|
8
15
|
|
|
9
16
|
export function AppCatalogPage({
|
|
10
17
|
selectedSlug,
|
|
@@ -162,13 +169,15 @@ export function AppCatalogPage({
|
|
|
162
169
|
/>
|
|
163
170
|
{/* #38 item B: the detail as a card over the catalog backdrop. */}
|
|
164
171
|
{selectedApp && (
|
|
165
|
-
<
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
+
<Suspense fallback={null}>
|
|
173
|
+
<AppDetailPanel
|
|
174
|
+
app={selectedApp}
|
|
175
|
+
subResource={selectedSub}
|
|
176
|
+
onClose={() => void navigate({ to: '/' })}
|
|
177
|
+
onAppClick={handleAppClick}
|
|
178
|
+
onBackToParent={handleBackToParent}
|
|
179
|
+
/>
|
|
180
|
+
</Suspense>
|
|
172
181
|
)}
|
|
173
182
|
</div>
|
|
174
183
|
)
|
package/src/routes/__root.tsx
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Outlet, createRootRouteWithContext } from '@tanstack/react-router'
|
|
2
|
-
import { TanStackRouterDevtools } from '@tanstack/react-router-devtools'
|
|
3
2
|
import type { AcRouterContext } from '~/types/types'
|
|
4
3
|
import { RootErrorPage } from '~/ui/components/error/RootErrorPage'
|
|
5
4
|
import { NotFoundError } from '~/ui/error/NotFoundError'
|
|
@@ -31,7 +30,6 @@ function RootRoute() {
|
|
|
31
30
|
return (
|
|
32
31
|
<div className="min-h-screen bg-base-200">
|
|
33
32
|
<Outlet />
|
|
34
|
-
{import.meta.env.MODE === 'dev' ? <TanStackRouterDevtools /> : null}
|
|
35
33
|
</div>
|
|
36
34
|
)
|
|
37
35
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { ReactNode } from 'react'
|
|
2
|
-
import {
|
|
3
|
-
import { TanStackRouterDevtools } from '@tanstack/react-router-devtools'
|
|
2
|
+
import { Devtools } from '~/ui/layout/Devtools'
|
|
4
3
|
import { MainLayout } from '~/ui/layout/MainLayout'
|
|
5
4
|
import { TopLevelProvidersForErrors } from '~/ui/layout/TopLevelProvidersForErrors'
|
|
6
5
|
import { useQueryClient } from '@tanstack/react-query'
|
|
@@ -20,8 +19,7 @@ export function BaseErrorPage({ children }: BaseErrorPageProps) {
|
|
|
20
19
|
<TopLevelProvidersForErrors>
|
|
21
20
|
<MainLayout>
|
|
22
21
|
{children}
|
|
23
|
-
<
|
|
24
|
-
<ReactQueryDevtools initialIsOpen={false} client={queryClient} />
|
|
22
|
+
<Devtools client={queryClient} />
|
|
25
23
|
</MainLayout>
|
|
26
24
|
</TopLevelProvidersForErrors>
|
|
27
25
|
)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Suspense, lazy } from 'react'
|
|
2
|
+
import type { QueryClient } from '@tanstack/react-query'
|
|
3
|
+
|
|
4
|
+
// Dev-only: `import.meta.env.DEV` is false in production builds, so Rollup drops
|
|
5
|
+
// the import() and neither devtools package reaches the shipped bundle (#120).
|
|
6
|
+
const DevtoolsPanels = import.meta.env.DEV
|
|
7
|
+
? lazy(() => import('./DevtoolsPanels'))
|
|
8
|
+
: null
|
|
9
|
+
|
|
10
|
+
export function Devtools({ client }: { client: QueryClient }) {
|
|
11
|
+
if (!DevtoolsPanels) return null
|
|
12
|
+
return (
|
|
13
|
+
<Suspense fallback={null}>
|
|
14
|
+
<DevtoolsPanels client={client} />
|
|
15
|
+
</Suspense>
|
|
16
|
+
)
|
|
17
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { QueryClient } from '@tanstack/react-query'
|
|
2
|
+
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
|
|
3
|
+
import { TanStackRouterDevtools } from '@tanstack/react-router-devtools'
|
|
4
|
+
|
|
5
|
+
export default function DevtoolsPanels({ client }: { client: QueryClient }) {
|
|
6
|
+
return (
|
|
7
|
+
<>
|
|
8
|
+
<TanStackRouterDevtools />
|
|
9
|
+
<ReactQueryDevtools initialIsOpen={false} client={client} />
|
|
10
|
+
</>
|
|
11
|
+
)
|
|
12
|
+
}
|
|
@@ -2,8 +2,6 @@ import React, { Suspense, useMemo, useState } from 'react'
|
|
|
2
2
|
|
|
3
3
|
import type { TRPCRouter } from '@igstack/app-catalog-backend-core'
|
|
4
4
|
import type { QueryClient } from '@tanstack/react-query'
|
|
5
|
-
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
|
|
6
|
-
import { TanStackRouterDevtools } from '@tanstack/react-router-devtools'
|
|
7
5
|
import type { TRPCClient } from '@trpc/client'
|
|
8
6
|
import { ThemeProvider } from '~/components/theme-provider'
|
|
9
7
|
import { AuthProvider } from '~/modules/auth'
|
|
@@ -13,6 +11,7 @@ import { GlobalConfigProvider } from '~/modules/config/GlobalConfigContext'
|
|
|
13
11
|
import { makePluginInterfaceForCore } from '~/modules/pluginCore/makePluginManagerContext'
|
|
14
12
|
import { PluginManagerContextProvider } from '~/modules/pluginCore/PluginManagerContext'
|
|
15
13
|
import { TooltipProvider } from '~/ui/tooltip'
|
|
14
|
+
import { Devtools } from './Devtools'
|
|
16
15
|
import { LoadingScreen } from './LoadingScreen'
|
|
17
16
|
|
|
18
17
|
export interface MainLayoutProps {
|
|
@@ -53,11 +52,7 @@ export function TopLevelProviders({ children, queryClient }: MainLayoutProps) {
|
|
|
53
52
|
>
|
|
54
53
|
{children}
|
|
55
54
|
<LoginModal />
|
|
56
|
-
<
|
|
57
|
-
<ReactQueryDevtools
|
|
58
|
-
initialIsOpen={false}
|
|
59
|
-
client={queryClient}
|
|
60
|
-
/>
|
|
55
|
+
<Devtools client={queryClient} />
|
|
61
56
|
</PluginManagerContextProvider>
|
|
62
57
|
</GlobalConfigProvider>
|
|
63
58
|
</Suspense>
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { jsx } from "react/jsx-runtime";
|
|
2
|
-
import { T as TanStackRouterDevtoolsCore } from "../../../../../../@tanstack_router-devtools-core@1.151.6_@tanstack_router-core@1.151.6_csstype@3.2.3/node_modules/@tanstack/router-devtools-core/dist/index-5jfj03XJ.js";
|
|
3
|
-
import { useRef, useState, useEffect, Fragment } from "react";
|
|
4
|
-
import { useRouter, useRouterState } from "@tanstack/react-router";
|
|
5
|
-
function TanStackRouterDevtools(props) {
|
|
6
|
-
const {
|
|
7
|
-
initialIsOpen,
|
|
8
|
-
panelProps,
|
|
9
|
-
closeButtonProps,
|
|
10
|
-
toggleButtonProps,
|
|
11
|
-
position,
|
|
12
|
-
containerElement,
|
|
13
|
-
shadowDOMTarget,
|
|
14
|
-
router: propsRouter
|
|
15
|
-
} = props;
|
|
16
|
-
const hookRouter = useRouter({ warn: false });
|
|
17
|
-
const activeRouter = propsRouter ?? hookRouter;
|
|
18
|
-
const activeRouterState = useRouterState({ router: activeRouter });
|
|
19
|
-
const devToolRef = useRef(null);
|
|
20
|
-
const [devtools] = useState(
|
|
21
|
-
() => new TanStackRouterDevtoolsCore({
|
|
22
|
-
initialIsOpen,
|
|
23
|
-
panelProps,
|
|
24
|
-
closeButtonProps,
|
|
25
|
-
toggleButtonProps,
|
|
26
|
-
position,
|
|
27
|
-
containerElement,
|
|
28
|
-
shadowDOMTarget,
|
|
29
|
-
router: activeRouter,
|
|
30
|
-
routerState: activeRouterState
|
|
31
|
-
})
|
|
32
|
-
);
|
|
33
|
-
useEffect(() => {
|
|
34
|
-
devtools.setRouter(activeRouter);
|
|
35
|
-
}, [devtools, activeRouter]);
|
|
36
|
-
useEffect(() => {
|
|
37
|
-
devtools.setRouterState(activeRouterState);
|
|
38
|
-
}, [devtools, activeRouterState]);
|
|
39
|
-
useEffect(() => {
|
|
40
|
-
devtools.setOptions({
|
|
41
|
-
initialIsOpen,
|
|
42
|
-
panelProps,
|
|
43
|
-
closeButtonProps,
|
|
44
|
-
toggleButtonProps,
|
|
45
|
-
position,
|
|
46
|
-
containerElement,
|
|
47
|
-
shadowDOMTarget
|
|
48
|
-
});
|
|
49
|
-
}, [
|
|
50
|
-
devtools,
|
|
51
|
-
initialIsOpen,
|
|
52
|
-
panelProps,
|
|
53
|
-
closeButtonProps,
|
|
54
|
-
toggleButtonProps,
|
|
55
|
-
position,
|
|
56
|
-
containerElement,
|
|
57
|
-
shadowDOMTarget
|
|
58
|
-
]);
|
|
59
|
-
useEffect(() => {
|
|
60
|
-
if (devToolRef.current) {
|
|
61
|
-
devtools.mount(devToolRef.current);
|
|
62
|
-
}
|
|
63
|
-
return () => {
|
|
64
|
-
devtools.unmount();
|
|
65
|
-
};
|
|
66
|
-
}, [devtools]);
|
|
67
|
-
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("div", { ref: devToolRef }) });
|
|
68
|
-
}
|
|
69
|
-
export {
|
|
70
|
-
TanStackRouterDevtools
|
|
71
|
-
};
|
|
72
|
-
//# sourceMappingURL=TanStackRouterDevtools.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TanStackRouterDevtools.js","sources":["../../../../../../../../../../../../node_modules/.pnpm/@tanstack+react-router-devtools@1.151.6_@tanstack+react-router@1.151.6_react-dom@19.1.2_20b78d099e847743bc64b4d051c71d30/node_modules/@tanstack/react-router-devtools/dist/esm/TanStackRouterDevtools.js"],"sourcesContent":["import { jsx } from \"react/jsx-runtime\";\nimport { TanStackRouterDevtoolsCore } from \"@tanstack/router-devtools-core\";\nimport { useRef, useState, useEffect, Fragment } from \"react\";\nimport { useRouter, useRouterState } from \"@tanstack/react-router\";\nfunction TanStackRouterDevtools(props) {\n const {\n initialIsOpen,\n panelProps,\n closeButtonProps,\n toggleButtonProps,\n position,\n containerElement,\n shadowDOMTarget,\n router: propsRouter\n } = props;\n const hookRouter = useRouter({ warn: false });\n const activeRouter = propsRouter ?? hookRouter;\n const activeRouterState = useRouterState({ router: activeRouter });\n const devToolRef = useRef(null);\n const [devtools] = useState(\n () => new TanStackRouterDevtoolsCore({\n initialIsOpen,\n panelProps,\n closeButtonProps,\n toggleButtonProps,\n position,\n containerElement,\n shadowDOMTarget,\n router: activeRouter,\n routerState: activeRouterState\n })\n );\n useEffect(() => {\n devtools.setRouter(activeRouter);\n }, [devtools, activeRouter]);\n useEffect(() => {\n devtools.setRouterState(activeRouterState);\n }, [devtools, activeRouterState]);\n useEffect(() => {\n devtools.setOptions({\n initialIsOpen,\n panelProps,\n closeButtonProps,\n toggleButtonProps,\n position,\n containerElement,\n shadowDOMTarget\n });\n }, [\n devtools,\n initialIsOpen,\n panelProps,\n closeButtonProps,\n toggleButtonProps,\n position,\n containerElement,\n shadowDOMTarget\n ]);\n useEffect(() => {\n if (devToolRef.current) {\n devtools.mount(devToolRef.current);\n }\n return () => {\n devtools.unmount();\n };\n }, [devtools]);\n return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(\"div\", { ref: devToolRef }) });\n}\nexport {\n TanStackRouterDevtools\n};\n//# sourceMappingURL=TanStackRouterDevtools.js.map\n"],"names":[],"mappings":";;;;AAIA,SAAS,uBAAuB,OAAO;AACrC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACZ,IAAM;AACJ,QAAM,aAAa,UAAU,EAAE,MAAM,MAAK,CAAE;AAC5C,QAAM,eAAe,eAAe;AACpC,QAAM,oBAAoB,eAAe,EAAE,QAAQ,aAAY,CAAE;AACjE,QAAM,aAAa,OAAO,IAAI;AAC9B,QAAM,CAAC,QAAQ,IAAI;AAAA,IACjB,MAAM,IAAI,2BAA2B;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,aAAa;AAAA,IACnB,CAAK;AAAA,EACL;AACE,YAAU,MAAM;AACd,aAAS,UAAU,YAAY;AAAA,EACjC,GAAG,CAAC,UAAU,YAAY,CAAC;AAC3B,YAAU,MAAM;AACd,aAAS,eAAe,iBAAiB;AAAA,EAC3C,GAAG,CAAC,UAAU,iBAAiB,CAAC;AAChC,YAAU,MAAM;AACd,aAAS,WAAW;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACN,CAAK;AAAA,EACH,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,CAAG;AACD,YAAU,MAAM;AACd,QAAI,WAAW,SAAS;AACtB,eAAS,MAAM,WAAW,OAAO;AAAA,IACnC;AACA,WAAO,MAAM;AACX,eAAS,QAAO;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AACb,SAAuB,oBAAI,UAAU,EAAE,UAA0B,oBAAI,OAAO,EAAE,KAAK,WAAU,CAAE,GAAG;AACpG;","x_google_ignoreList":[0]}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useRouter, useRouterState } from "@tanstack/react-router";
|
|
3
|
-
import { w as TanStackRouterDevtoolsPanelCore } from "../../../../../../@tanstack_router-devtools-core@1.151.6_@tanstack_router-core@1.151.6_csstype@3.2.3/node_modules/@tanstack/router-devtools-core/dist/index-5jfj03XJ.js";
|
|
4
|
-
import { useRef, useState, useEffect } from "react";
|
|
5
|
-
const TanStackRouterDevtoolsPanel = (props) => {
|
|
6
|
-
const { router: propsRouter, ...rest } = props;
|
|
7
|
-
const hookRouter = useRouter({ warn: false });
|
|
8
|
-
const activeRouter = propsRouter ?? hookRouter;
|
|
9
|
-
const activeRouterState = useRouterState({ router: activeRouter });
|
|
10
|
-
const devToolRef = useRef(null);
|
|
11
|
-
const [devtools] = useState(
|
|
12
|
-
() => new TanStackRouterDevtoolsPanelCore({
|
|
13
|
-
...rest,
|
|
14
|
-
router: activeRouter,
|
|
15
|
-
routerState: activeRouterState
|
|
16
|
-
})
|
|
17
|
-
);
|
|
18
|
-
useEffect(() => {
|
|
19
|
-
devtools.setRouter(activeRouter);
|
|
20
|
-
}, [devtools, activeRouter]);
|
|
21
|
-
useEffect(() => {
|
|
22
|
-
devtools.setRouterState(activeRouterState);
|
|
23
|
-
}, [devtools, activeRouterState]);
|
|
24
|
-
useEffect(() => {
|
|
25
|
-
devtools.setOptions({
|
|
26
|
-
className: props.className,
|
|
27
|
-
style: props.style,
|
|
28
|
-
shadowDOMTarget: props.shadowDOMTarget
|
|
29
|
-
});
|
|
30
|
-
}, [devtools, props.className, props.style, props.shadowDOMTarget]);
|
|
31
|
-
useEffect(() => {
|
|
32
|
-
if (devToolRef.current) {
|
|
33
|
-
devtools.mount(devToolRef.current);
|
|
34
|
-
}
|
|
35
|
-
return () => {
|
|
36
|
-
devtools.unmount();
|
|
37
|
-
};
|
|
38
|
-
}, [devtools]);
|
|
39
|
-
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("div", { ref: devToolRef }) });
|
|
40
|
-
};
|
|
41
|
-
export {
|
|
42
|
-
TanStackRouterDevtoolsPanel
|
|
43
|
-
};
|
|
44
|
-
//# sourceMappingURL=TanStackRouterDevtoolsPanel.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TanStackRouterDevtoolsPanel.js","sources":["../../../../../../../../../../../../node_modules/.pnpm/@tanstack+react-router-devtools@1.151.6_@tanstack+react-router@1.151.6_react-dom@19.1.2_20b78d099e847743bc64b4d051c71d30/node_modules/@tanstack/react-router-devtools/dist/esm/TanStackRouterDevtoolsPanel.js"],"sourcesContent":["import { jsx, Fragment } from \"react/jsx-runtime\";\nimport { useRouter, useRouterState } from \"@tanstack/react-router\";\nimport { TanStackRouterDevtoolsPanelCore } from \"@tanstack/router-devtools-core\";\nimport { useRef, useState, useEffect } from \"react\";\nconst TanStackRouterDevtoolsPanel = (props) => {\n const { router: propsRouter, ...rest } = props;\n const hookRouter = useRouter({ warn: false });\n const activeRouter = propsRouter ?? hookRouter;\n const activeRouterState = useRouterState({ router: activeRouter });\n const devToolRef = useRef(null);\n const [devtools] = useState(\n () => new TanStackRouterDevtoolsPanelCore({\n ...rest,\n router: activeRouter,\n routerState: activeRouterState\n })\n );\n useEffect(() => {\n devtools.setRouter(activeRouter);\n }, [devtools, activeRouter]);\n useEffect(() => {\n devtools.setRouterState(activeRouterState);\n }, [devtools, activeRouterState]);\n useEffect(() => {\n devtools.setOptions({\n className: props.className,\n style: props.style,\n shadowDOMTarget: props.shadowDOMTarget\n });\n }, [devtools, props.className, props.style, props.shadowDOMTarget]);\n useEffect(() => {\n if (devToolRef.current) {\n devtools.mount(devToolRef.current);\n }\n return () => {\n devtools.unmount();\n };\n }, [devtools]);\n return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(\"div\", { ref: devToolRef }) });\n};\nexport {\n TanStackRouterDevtoolsPanel\n};\n//# sourceMappingURL=TanStackRouterDevtoolsPanel.js.map\n"],"names":[],"mappings":";;;;AAIK,MAAC,8BAA8B,CAAC,UAAU;AAC7C,QAAM,EAAE,QAAQ,aAAa,GAAG,KAAI,IAAK;AACzC,QAAM,aAAa,UAAU,EAAE,MAAM,MAAK,CAAE;AAC5C,QAAM,eAAe,eAAe;AACpC,QAAM,oBAAoB,eAAe,EAAE,QAAQ,aAAY,CAAE;AACjE,QAAM,aAAa,OAAO,IAAI;AAC9B,QAAM,CAAC,QAAQ,IAAI;AAAA,IACjB,MAAM,IAAI,gCAAgC;AAAA,MACxC,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,aAAa;AAAA,IACnB,CAAK;AAAA,EACL;AACE,YAAU,MAAM;AACd,aAAS,UAAU,YAAY;AAAA,EACjC,GAAG,CAAC,UAAU,YAAY,CAAC;AAC3B,YAAU,MAAM;AACd,aAAS,eAAe,iBAAiB;AAAA,EAC3C,GAAG,CAAC,UAAU,iBAAiB,CAAC;AAChC,YAAU,MAAM;AACd,aAAS,WAAW;AAAA,MAClB,WAAW,MAAM;AAAA,MACjB,OAAO,MAAM;AAAA,MACb,iBAAiB,MAAM;AAAA,IAC7B,CAAK;AAAA,EACH,GAAG,CAAC,UAAU,MAAM,WAAW,MAAM,OAAO,MAAM,eAAe,CAAC;AAClE,YAAU,MAAM;AACd,QAAI,WAAW,SAAS;AACtB,eAAS,MAAM,WAAW,OAAO;AAAA,IACnC;AACA,WAAO,MAAM;AACX,eAAS,QAAO;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AACb,SAAuB,oBAAI,UAAU,EAAE,UAA0B,oBAAI,OAAO,EAAE,KAAK,WAAU,CAAE,GAAG;AACpG;","x_google_ignoreList":[0]}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { TanStackRouterDevtools as TanStackRouterDevtools$1 } from "./TanStackRouterDevtools.js";
|
|
2
|
-
import { TanStackRouterDevtoolsPanel } from "./TanStackRouterDevtoolsPanel.js";
|
|
3
|
-
const TanStackRouterDevtools = process.env.NODE_ENV !== "development" ? function() {
|
|
4
|
-
return null;
|
|
5
|
-
} : TanStackRouterDevtools$1;
|
|
6
|
-
process.env.NODE_ENV !== "development" ? function() {
|
|
7
|
-
return null;
|
|
8
|
-
} : TanStackRouterDevtoolsPanel;
|
|
9
|
-
export {
|
|
10
|
-
TanStackRouterDevtools
|
|
11
|
-
};
|
|
12
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../../../../../../../../node_modules/.pnpm/@tanstack+react-router-devtools@1.151.6_@tanstack+react-router@1.151.6_react-dom@19.1.2_20b78d099e847743bc64b4d051c71d30/node_modules/@tanstack/react-router-devtools/dist/esm/index.js"],"sourcesContent":["import { TanStackRouterDevtools as TanStackRouterDevtools$1 } from \"./TanStackRouterDevtools.js\";\nimport { TanStackRouterDevtoolsPanel as TanStackRouterDevtoolsPanel$1 } from \"./TanStackRouterDevtoolsPanel.js\";\nconst TanStackRouterDevtools = process.env.NODE_ENV !== \"development\" ? function() {\n return null;\n} : TanStackRouterDevtools$1;\nconst TanStackRouterDevtoolsInProd = TanStackRouterDevtools$1;\nconst TanStackRouterDevtoolsPanel = process.env.NODE_ENV !== \"development\" ? function() {\n return null;\n} : TanStackRouterDevtoolsPanel$1;\nconst TanStackRouterDevtoolsPanelInProd = TanStackRouterDevtoolsPanel$1;\nexport {\n TanStackRouterDevtools,\n TanStackRouterDevtoolsInProd,\n TanStackRouterDevtoolsPanel,\n TanStackRouterDevtoolsPanelInProd\n};\n//# sourceMappingURL=index.js.map\n"],"names":["TanStackRouterDevtoolsPanel$1"],"mappings":";;AAEK,MAAC,yBAAyB,QAAQ,IAAI,aAAa,gBAAgB,WAAW;AACjF,SAAO;AACT,IAAI;AAEgC,QAAQ,IAAI,aAAa,gBAAgB,WAAW;AACtF,SAAO;AACT,IAAIA;","x_google_ignoreList":[0]}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
const SEGMENT_TYPE_PATHNAME = 0;
|
|
2
|
-
const SEGMENT_TYPE_PARAM = 1;
|
|
3
|
-
const SEGMENT_TYPE_WILDCARD = 2;
|
|
4
|
-
const SEGMENT_TYPE_OPTIONAL_PARAM = 3;
|
|
5
|
-
const PARAM_W_CURLY_BRACES_RE = /^([^{]*)\{\$([a-zA-Z_$][a-zA-Z0-9_$]*)\}([^}]*)$/;
|
|
6
|
-
const OPTIONAL_PARAM_W_CURLY_BRACES_RE = /^([^{]*)\{-\$([a-zA-Z_$][a-zA-Z0-9_$]*)\}([^}]*)$/;
|
|
7
|
-
const WILDCARD_W_CURLY_BRACES_RE = /^([^{]*)\{\$\}([^}]*)$/;
|
|
8
|
-
function parseSegment(path, start, output = new Uint16Array(6)) {
|
|
9
|
-
const next = path.indexOf("/", start);
|
|
10
|
-
const end = next === -1 ? path.length : next;
|
|
11
|
-
const part = path.substring(start, end);
|
|
12
|
-
if (!part || !part.includes("$")) {
|
|
13
|
-
output[0] = SEGMENT_TYPE_PATHNAME;
|
|
14
|
-
output[1] = start;
|
|
15
|
-
output[2] = start;
|
|
16
|
-
output[3] = end;
|
|
17
|
-
output[4] = end;
|
|
18
|
-
output[5] = end;
|
|
19
|
-
return output;
|
|
20
|
-
}
|
|
21
|
-
if (part === "$") {
|
|
22
|
-
const total = path.length;
|
|
23
|
-
output[0] = SEGMENT_TYPE_WILDCARD;
|
|
24
|
-
output[1] = start;
|
|
25
|
-
output[2] = start;
|
|
26
|
-
output[3] = total;
|
|
27
|
-
output[4] = total;
|
|
28
|
-
output[5] = total;
|
|
29
|
-
return output;
|
|
30
|
-
}
|
|
31
|
-
if (part.charCodeAt(0) === 36) {
|
|
32
|
-
output[0] = SEGMENT_TYPE_PARAM;
|
|
33
|
-
output[1] = start;
|
|
34
|
-
output[2] = start + 1;
|
|
35
|
-
output[3] = end;
|
|
36
|
-
output[4] = end;
|
|
37
|
-
output[5] = end;
|
|
38
|
-
return output;
|
|
39
|
-
}
|
|
40
|
-
const wildcardBracesMatch = part.match(WILDCARD_W_CURLY_BRACES_RE);
|
|
41
|
-
if (wildcardBracesMatch) {
|
|
42
|
-
const prefix = wildcardBracesMatch[1];
|
|
43
|
-
const pLength = prefix.length;
|
|
44
|
-
output[0] = SEGMENT_TYPE_WILDCARD;
|
|
45
|
-
output[1] = start + pLength;
|
|
46
|
-
output[2] = start + pLength + 1;
|
|
47
|
-
output[3] = start + pLength + 2;
|
|
48
|
-
output[4] = start + pLength + 3;
|
|
49
|
-
output[5] = path.length;
|
|
50
|
-
return output;
|
|
51
|
-
}
|
|
52
|
-
const optionalParamBracesMatch = part.match(OPTIONAL_PARAM_W_CURLY_BRACES_RE);
|
|
53
|
-
if (optionalParamBracesMatch) {
|
|
54
|
-
const prefix = optionalParamBracesMatch[1];
|
|
55
|
-
const paramName = optionalParamBracesMatch[2];
|
|
56
|
-
const suffix = optionalParamBracesMatch[3];
|
|
57
|
-
const pLength = prefix.length;
|
|
58
|
-
output[0] = SEGMENT_TYPE_OPTIONAL_PARAM;
|
|
59
|
-
output[1] = start + pLength;
|
|
60
|
-
output[2] = start + pLength + 3;
|
|
61
|
-
output[3] = start + pLength + 3 + paramName.length;
|
|
62
|
-
output[4] = end - suffix.length;
|
|
63
|
-
output[5] = end;
|
|
64
|
-
return output;
|
|
65
|
-
}
|
|
66
|
-
const paramBracesMatch = part.match(PARAM_W_CURLY_BRACES_RE);
|
|
67
|
-
if (paramBracesMatch) {
|
|
68
|
-
const prefix = paramBracesMatch[1];
|
|
69
|
-
const paramName = paramBracesMatch[2];
|
|
70
|
-
const suffix = paramBracesMatch[3];
|
|
71
|
-
const pLength = prefix.length;
|
|
72
|
-
output[0] = SEGMENT_TYPE_PARAM;
|
|
73
|
-
output[1] = start + pLength;
|
|
74
|
-
output[2] = start + pLength + 2;
|
|
75
|
-
output[3] = start + pLength + 2 + paramName.length;
|
|
76
|
-
output[4] = end - suffix.length;
|
|
77
|
-
output[5] = end;
|
|
78
|
-
return output;
|
|
79
|
-
}
|
|
80
|
-
output[0] = SEGMENT_TYPE_PATHNAME;
|
|
81
|
-
output[1] = start;
|
|
82
|
-
output[2] = start;
|
|
83
|
-
output[3] = end;
|
|
84
|
-
output[4] = end;
|
|
85
|
-
output[5] = end;
|
|
86
|
-
return output;
|
|
87
|
-
}
|
|
88
|
-
export {
|
|
89
|
-
SEGMENT_TYPE_OPTIONAL_PARAM,
|
|
90
|
-
SEGMENT_TYPE_PARAM,
|
|
91
|
-
SEGMENT_TYPE_PATHNAME,
|
|
92
|
-
SEGMENT_TYPE_WILDCARD,
|
|
93
|
-
parseSegment
|
|
94
|
-
};
|
|
95
|
-
//# sourceMappingURL=new-process-route-tree.js.map
|