@burdenoff/microfe-devportal 2026.609.1 → 2026.609.2

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.
@@ -26,8 +26,8 @@ function g(e, t) {
26
26
  })
27
27
  });
28
28
  }
29
- var _ = s(() => import("./pages/OrganizationsPage.js").then((e) => ({ default: e.OrganizationsPage }))), v = s(() => import("./pages/OrganizationDetailPage.js").then((e) => ({ default: e.OrganizationDetailPage }))), y = s(() => import("./pages/CreateOrganizationPage.js").then((e) => ({ default: e.CreateOrganizationPage }))), b = s(() => import("./pages/OrganizationMembersPage.js").then((e) => ({ default: e.OrganizationMembersPage }))), x = s(() => import("./pages/RevenueRedirectPage.js").then((e) => ({ default: e.RevenueRedirectPage }))), S = s(() => import("./pages/ApplicationsPage.js").then((e) => ({ default: e.ApplicationsPage }))), C = s(() => import("./pages/ApplicationDetailPage.js").then((e) => ({ default: e.ApplicationDetailPage }))), w = s(() => import("./pages/CreateApplicationPage.js").then((e) => ({ default: e.CreateApplicationPage }))), T = s(() => import("./pages/EditApplicationPage.js").then((e) => ({ default: e.EditApplicationPage }))), E = s(() => import("./pages/ApplicationVersionsPage.js").then((e) => ({ default: e.ApplicationVersionsPage }))), D = s(() => import("./pages/OAuthClientsPage.js").then((e) => ({ default: e.OAuthClientsPage }))), O = s(() => import("./pages/CreateOAuthClientPage.js").then((e) => ({ default: e.CreateOAuthClientPage }))), k = s(() => import("./pages/OAuthClientDetailPage.js").then((e) => ({ default: e.OAuthClientDetailPage }))), A = s(() => import("./pages/ApiKeysPage.js").then((e) => ({ default: e.ApiKeysPage }))), j = s(() => import("./pages/CreateApiKeyPage.js").then((e) => ({ default: e.CreateApiKeyPage }))), M = s(() => import("./pages/WebhooksPage.js").then((e) => ({ default: e.WebhooksPage }))), N = s(() => import("./pages/CreateWebhookPage.js").then((e) => ({ default: e.CreateWebhookPage }))), P = s(() => import("./pages/WebhookDetailPage.js").then((e) => ({ default: e.WebhookDetailPage }))), F = s(() => import("./pages/AnalyticsDashboardPage.js").then((e) => ({ default: e.AnalyticsDashboardPage }))), I = s(() => import("./pages/DocumentationPage.js").then((e) => ({ default: e.DocumentationPage }))), L = s(() => import("./pages/ResourcesPage.js").then((e) => ({ default: e.ResourcesPage }))), R = s(() => import("./pages/SettingsPage.js").then((e) => ({ default: e.SettingsPage }))), z = s(() => import("./pages/PublishPage.js").then((e) => ({ default: e.PublishPage }))), B = s(() => import("./pages/AppLogsPage.js").then((e) => ({ default: e.AppLogsPage }))), V = s(() => import("./pages/DelegationsPage.js").then((e) => ({ default: e.DelegationsPage }))), H = s(() => import("./pages/ListingPreviewPage.js").then((e) => ({ default: e.ListingPreviewPage }))), U = s(() => import("./pages/StoreSubmissionPage.js").then((e) => ({ default: e.StoreSubmissionPage }))), W = s(() => import("./pages/PublisherProfilePage.js").then((e) => ({ default: e.PublisherProfilePage })));
30
- function G() {
29
+ var _ = s(() => import("./pages/OrganizationsPage.js").then((e) => ({ default: e.OrganizationsPage }))), v = s(() => import("./pages/OrganizationDetailPage.js").then((e) => ({ default: e.OrganizationDetailPage }))), y = s(() => import("./pages/CreateOrganizationPage.js").then((e) => ({ default: e.CreateOrganizationPage }))), b = s(() => import("./pages/OrganizationMembersPage.js").then((e) => ({ default: e.OrganizationMembersPage }))), x = s(() => import("./pages/RevenueRedirectPage.js").then((e) => ({ default: e.RevenueRedirectPage }))), S = s(() => import("./pages/ApplicationsPage.js").then((e) => ({ default: e.ApplicationsPage }))), C = s(() => import("./pages/ApplicationDetailPage.js").then((e) => ({ default: e.ApplicationDetailPage }))), w = s(() => import("./pages/CreateApplicationPage.js").then((e) => ({ default: e.CreateApplicationPage }))), T = s(() => import("./pages/EditApplicationPage.js").then((e) => ({ default: e.EditApplicationPage }))), E = s(() => import("./pages/ApplicationVersionsPage.js").then((e) => ({ default: e.ApplicationVersionsPage }))), D = s(() => import("./pages/OAuthClientsPage.js").then((e) => ({ default: e.OAuthClientsPage }))), O = s(() => import("./pages/CreateOAuthClientPage.js").then((e) => ({ default: e.CreateOAuthClientPage }))), k = s(() => import("./pages/OAuthClientDetailPage.js").then((e) => ({ default: e.OAuthClientDetailPage }))), A = s(() => import("./pages/ApiKeysPage.js").then((e) => ({ default: e.ApiKeysPage }))), j = s(() => import("./pages/CreateApiKeyPage.js").then((e) => ({ default: e.CreateApiKeyPage }))), M = s(() => import("./pages/WebhooksPage.js").then((e) => ({ default: e.WebhooksPage }))), N = s(() => import("./pages/CreateWebhookPage.js").then((e) => ({ default: e.CreateWebhookPage }))), P = s(() => import("./pages/WebhookDetailPage.js").then((e) => ({ default: e.WebhookDetailPage }))), F = s(() => import("./pages/AnalyticsDashboardPage.js").then((e) => ({ default: e.AnalyticsDashboardPage }))), I = s(() => import("./pages/DocumentationPage.js").then((e) => ({ default: e.DocumentationPage }))), L = s(() => import("./pages/ResourcesPage.js").then((e) => ({ default: e.ResourcesPage }))), R = s(() => import("./pages/SettingsPage.js").then((e) => ({ default: e.SettingsPage }))), z = s(() => import("./pages/PublishPage.js").then((e) => ({ default: e.PublishPage }))), B = s(() => import("./pages/AppLogsPage.js").then((e) => ({ default: e.AppLogsPage }))), V = s(() => import("./pages/DelegationsPage.js").then((e) => ({ default: e.DelegationsPage }))), H = s(() => import("./pages/ListingPreviewPage.js").then((e) => ({ default: e.ListingPreviewPage }))), U = s(() => import("./pages/StoreSubmissionPage.js").then((e) => ({ default: e.StoreSubmissionPage }))), W = s(() => import("./pages/PublisherProfilePage.js").then((e) => ({ default: e.PublisherProfilePage }))), G = s(() => import("./pages/SetupPage.js").then((e) => ({ default: e.SetupPage })));
30
+ function K() {
31
31
  return /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p(i, {}), /* @__PURE__ */ m(d, { children: [
32
32
  /* @__PURE__ */ p(u, {
33
33
  index: !0,
@@ -161,22 +161,26 @@ function G() {
161
161
  path: "settings",
162
162
  element: g("settings", /* @__PURE__ */ p(R, {}))
163
163
  }),
164
+ /* @__PURE__ */ p(u, {
165
+ path: "setup",
166
+ element: g("setup", /* @__PURE__ */ p(G, {}))
167
+ }),
164
168
  /* @__PURE__ */ p(u, {
165
169
  path: "*",
166
170
  element: /* @__PURE__ */ p(h, {})
167
171
  })
168
172
  ] })] });
169
173
  }
170
- function K() {
174
+ function q() {
171
175
  return /* @__PURE__ */ p(o, {
172
176
  fallback: /* @__PURE__ */ p(t, { message: "Loading page..." }),
173
177
  children: /* @__PURE__ */ p(d, { children: /* @__PURE__ */ p(u, {
174
178
  path: "/*",
175
- element: /* @__PURE__ */ p(G, {})
179
+ element: /* @__PURE__ */ p(K, {})
176
180
  }) })
177
181
  });
178
182
  }
179
183
  //#endregion
180
- export { K as DevportalRoutes };
184
+ export { q as DevportalRoutes };
181
185
 
182
186
  //# sourceMappingURL=DevportalRoutes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DevportalRoutes.js","names":[],"sources":["../../src/devportal/DevportalRoutes.tsx"],"sourcesContent":["import { Suspense, lazy, useEffect, type ReactNode } from \"react\";\nimport { Routes, Route, Navigate } from \"react-router-dom\";\nimport { LoadingState } from \"./components/LoadingState\";\nimport { FeatureFlaggedRoute } from \"./components/FeatureFlaggedRoute\";\nimport { TelemetryErrorBoundary } from \"./components/TelemetryErrorBoundary\";\nimport { SectionNav } from \"./components/SectionNav\";\nimport { useDevportal } from \"./providers/DevportalProvider\";\n\n/**\n * Catch-all redirect target for the unmatched `*` route. Uses the\n * DevportalProvider's `basePath` and `navigate` so the redirect works\n * regardless of the integration mode (shell or standalone). Falls back to a\n * relative Navigate when neither is wired, which is the standalone/test path.\n */\nfunction CatchAllRedirect() {\n const { basePath, navigate } = useDevportal();\n useEffect(() => {\n if (basePath && navigate) {\n const target = basePath.endsWith(\"/\") ? basePath.slice(0, -1) : basePath;\n navigate(target || \"/\");\n }\n }, [basePath, navigate]);\n if (basePath && navigate) return null;\n return <Navigate to=\"..\" replace />;\n}\n\n/**\n * Wrap a page element with the per-route feature flag gate and a\n * telemetry-emitting error boundary. The flag name follows\n * `devportal.<page-slug>` convention; when disabled the user sees a\n * graceful fallback instead of a route-level crash.\n *\n * Per `dev/platform/context/feature-flags` and spec\n * `microfrontends/47-FRONTEND-EVENT-BUS.md` (error.boundary emission).\n */\nfunction gated(slug: string, element: ReactNode): ReactNode {\n return (\n <TelemetryErrorBoundary scope={slug}>\n <FeatureFlaggedRoute flag={`devportal.${slug}`}>\n {element}\n </FeatureFlaggedRoute>\n </TelemetryErrorBoundary>\n );\n}\n\n// Eager load the main dashboard page\nimport { DashboardPage } from \"./pages/DashboardPage\";\n\n// Lazy load all other pages\nconst OrganizationsPage = lazy(() =>\n import(\"./pages/OrganizationsPage\").then((m) => ({\n default: m.OrganizationsPage,\n })),\n);\nconst OrganizationDetailPage = lazy(() =>\n import(\"./pages/OrganizationDetailPage\").then((m) => ({\n default: m.OrganizationDetailPage,\n })),\n);\nconst CreateOrganizationPage = lazy(() =>\n import(\"./pages/CreateOrganizationPage\").then((m) => ({\n default: m.CreateOrganizationPage,\n })),\n);\nconst OrganizationMembersPage = lazy(() =>\n import(\"./pages/OrganizationMembersPage\").then((m) => ({\n default: m.OrganizationMembersPage,\n })),\n);\nconst RevenueRedirectPage = lazy(() =>\n import(\"./pages/RevenueRedirectPage\").then((m) => ({\n default: m.RevenueRedirectPage,\n })),\n);\nconst ApplicationsPage = lazy(() =>\n import(\"./pages/ApplicationsPage\").then((m) => ({\n default: m.ApplicationsPage,\n })),\n);\nconst ApplicationDetailPage = lazy(() =>\n import(\"./pages/ApplicationDetailPage\").then((m) => ({\n default: m.ApplicationDetailPage,\n })),\n);\nconst CreateApplicationPage = lazy(() =>\n import(\"./pages/CreateApplicationPage\").then((m) => ({\n default: m.CreateApplicationPage,\n })),\n);\nconst EditApplicationPage = lazy(() =>\n import(\"./pages/EditApplicationPage\").then((m) => ({\n default: m.EditApplicationPage,\n })),\n);\nconst ApplicationVersionsPage = lazy(() =>\n import(\"./pages/ApplicationVersionsPage\").then((m) => ({\n default: m.ApplicationVersionsPage,\n })),\n);\nconst OAuthClientsPage = lazy(() =>\n import(\"./pages/OAuthClientsPage\").then((m) => ({\n default: m.OAuthClientsPage,\n })),\n);\nconst CreateOAuthClientPage = lazy(() =>\n import(\"./pages/CreateOAuthClientPage\").then((m) => ({\n default: m.CreateOAuthClientPage,\n })),\n);\nconst OAuthClientDetailPage = lazy(() =>\n import(\"./pages/OAuthClientDetailPage\").then((m) => ({\n default: m.OAuthClientDetailPage,\n })),\n);\nconst ApiKeysPage = lazy(() =>\n import(\"./pages/ApiKeysPage\").then((m) => ({ default: m.ApiKeysPage })),\n);\nconst CreateApiKeyPage = lazy(() =>\n import(\"./pages/CreateApiKeyPage\").then((m) => ({\n default: m.CreateApiKeyPage,\n })),\n);\nconst WebhooksPage = lazy(() =>\n import(\"./pages/WebhooksPage\").then((m) => ({ default: m.WebhooksPage })),\n);\nconst CreateWebhookPage = lazy(() =>\n import(\"./pages/CreateWebhookPage\").then((m) => ({\n default: m.CreateWebhookPage,\n })),\n);\nconst WebhookDetailPage = lazy(() =>\n import(\"./pages/WebhookDetailPage\").then((m) => ({\n default: m.WebhookDetailPage,\n })),\n);\nconst AnalyticsDashboardPage = lazy(() =>\n import(\"./pages/AnalyticsDashboardPage\").then((m) => ({\n default: m.AnalyticsDashboardPage,\n })),\n);\nconst DocumentationPage = lazy(() =>\n import(\"./pages/DocumentationPage\").then((m) => ({\n default: m.DocumentationPage,\n })),\n);\nconst ResourcesPage = lazy(() =>\n import(\"./pages/ResourcesPage\").then((m) => ({ default: m.ResourcesPage })),\n);\nconst SettingsPage = lazy(() =>\n import(\"./pages/SettingsPage\").then((m) => ({ default: m.SettingsPage })),\n);\nconst PublishPage = lazy(() =>\n import(\"./pages/PublishPage\").then((m) => ({ default: m.PublishPage })),\n);\nconst AppLogsPage = lazy(() =>\n import(\"./pages/AppLogsPage\").then((m) => ({ default: m.AppLogsPage })),\n);\nconst DelegationsPage = lazy(() =>\n import(\"./pages/DelegationsPage\").then((m) => ({\n default: m.DelegationsPage,\n })),\n);\nconst ListingPreviewPage = lazy(() =>\n import(\"./pages/ListingPreviewPage\").then((m) => ({\n default: m.ListingPreviewPage,\n })),\n);\nconst StoreSubmissionPage = lazy(() =>\n import(\"./pages/StoreSubmissionPage\").then((m) => ({\n default: m.StoreSubmissionPage,\n })),\n);\nconst PublisherProfilePage = lazy(() =>\n import(\"./pages/PublisherProfilePage\").then((m) => ({\n default: m.PublisherProfilePage,\n })),\n);\n\n/**\n * Inner routes component - renders actual page routes\n */\nfunction InnerRoutes() {\n return (\n <>\n <SectionNav />\n <Routes>\n {/* Dashboard */}\n <Route index element={gated(\"dashboard\", <DashboardPage />)} />\n\n {/* Organizations */}\n <Route\n path=\"organizations\"\n element={gated(\"organizations\", <OrganizationsPage />)}\n />\n <Route\n path=\"organizations/new\"\n element={gated(\"organizations.create\", <CreateOrganizationPage />)}\n />\n <Route\n path=\"organizations/:orgId\"\n element={gated(\"organizations.detail\", <OrganizationDetailPage />)}\n />\n <Route\n path=\"organizations/:orgId/members\"\n element={gated(\"organizations.members\", <OrganizationMembersPage />)}\n />\n <Route\n path=\"organizations/:orgId/revenue\"\n element={gated(\"organizations.revenue\", <RevenueRedirectPage />)}\n />\n\n {/* Applications */}\n <Route path=\"apps\" element={gated(\"apps\", <ApplicationsPage />)} />\n <Route\n path=\"apps/new\"\n element={gated(\"apps.create\", <CreateApplicationPage />)}\n />\n <Route\n path=\"apps/:appId\"\n element={gated(\"apps.detail\", <ApplicationDetailPage />)}\n />\n <Route\n path=\"apps/:appId/edit\"\n element={gated(\"apps.edit\", <EditApplicationPage />)}\n />\n <Route\n path=\"apps/:appId/versions\"\n element={gated(\"apps.versions\", <ApplicationVersionsPage />)}\n />\n <Route\n path=\"apps/:appId/publish\"\n element={gated(\"apps.publish\", <PublishPage />)}\n />\n <Route\n path=\"apps/:appId/store-submission\"\n element={gated(\"apps.storeSubmission\", <StoreSubmissionPage />)}\n />\n <Route\n path=\"apps/:appId/listing\"\n element={gated(\"apps.listing\", <ListingPreviewPage />)}\n />\n <Route\n path=\"apps/:appId/logs\"\n element={gated(\"apps.logs\", <AppLogsPage />)}\n />\n\n {/* OAuth Clients — user-scoped via auth-svc (no app nesting) */}\n <Route path=\"oauth\" element={gated(\"oauth\", <OAuthClientsPage />)} />\n <Route\n path=\"oauth/new\"\n element={gated(\"oauth.create\", <CreateOAuthClientPage />)}\n />\n <Route\n path=\"oauth/:clientId\"\n element={gated(\"oauth.detail\", <OAuthClientDetailPage />)}\n />\n\n {/* API Keys — user-scoped via auth-svc (no app nesting) */}\n <Route path=\"api-keys\" element={gated(\"apiKeys\", <ApiKeysPage />)} />\n <Route\n path=\"api-keys/new\"\n element={gated(\"apiKeys.create\", <CreateApiKeyPage />)}\n />\n\n {/* Webhooks (App-specific) */}\n <Route\n path=\"apps/:appId/webhooks\"\n element={gated(\"apps.webhooks\", <WebhooksPage />)}\n />\n <Route\n path=\"apps/:appId/webhooks/new\"\n element={gated(\"apps.webhooks.create\", <CreateWebhookPage />)}\n />\n <Route\n path=\"apps/:appId/webhooks/:webhookId\"\n element={gated(\"apps.webhooks.detail\", <WebhookDetailPage />)}\n />\n\n {/* App Analytics */}\n <Route\n path=\"apps/:appId/analytics\"\n element={gated(\"apps.analytics\", <AnalyticsDashboardPage />)}\n />\n\n {/* Delegations */}\n <Route\n path=\"delegations\"\n element={gated(\"delegations\", <DelegationsPage />)}\n />\n\n {/* Global Webhooks views */}\n <Route\n path=\"webhooks/new\"\n element={gated(\"webhooks.create\", <CreateWebhookPage />)}\n />\n <Route path=\"webhooks\" element={gated(\"webhooks\", <WebhooksPage />)} />\n\n {/* Analytics & Revenue */}\n <Route\n path=\"analytics\"\n element={gated(\"analytics\", <AnalyticsDashboardPage />)}\n />\n <Route\n path=\"revenue\"\n element={gated(\"revenue\", <RevenueRedirectPage />)}\n />\n\n {/* Documentation & Resources */}\n <Route path=\"docs\" element={gated(\"docs\", <DocumentationPage />)} />\n <Route\n path=\"resources\"\n element={gated(\"resources\", <ResourcesPage />)}\n />\n\n {/* Admin surfaces (e.g. /admin/reviews) live in admin-app via\n AdminDevportalRoot — intentionally not mounted in user shells. */}\n\n {/* Publisher */}\n <Route\n path=\"publisher/profile\"\n element={gated(\"publisher.profile\", <PublisherProfilePage />)}\n />\n\n {/* Settings */}\n <Route path=\"settings\" element={gated(\"settings\", <SettingsPage />)} />\n\n {/* Catch-all redirect to dashboard */}\n <Route path=\"*\" element={<CatchAllRedirect />} />\n </Routes>\n </>\n );\n}\n\n/**\n * Developer Portal Routes\n *\n * Defines all the routes for the developer portal microfrontend.\n * Uses lazy loading for all pages except the dashboard for optimal performance.\n *\n * When integrated into a shell (basePath provided), the shell already handles\n * the basePath route (e.g., /devportal/*), so this component should render\n * routes relative to that path - NOT nest them under basePath again.\n *\n * Example:\n * - Shell route: /devportal/*\n * - User navigates to: /devportal/organizations\n * - Inside DevportalRoutes, the path is: /organizations (relative to shell route)\n * - InnerRoutes matches: organizations -> OrganizationsPage\n */\nexport function DevportalRoutes() {\n // When basePath is provided, we're in shell integration mode.\n // The shell already matched the basePath route, so we render routes\n // relative to that - using wildcard to catch all sub-paths.\n // When no basePath (standalone mode), just render InnerRoutes at root.\n return (\n <Suspense fallback={<LoadingState message=\"Loading page...\" />}>\n <Routes>\n {/* Wildcard route to let InnerRoutes handle all paths */}\n <Route path=\"/*\" element={<InnerRoutes />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DevportalRoutes.js","names":[],"sources":["../../src/devportal/DevportalRoutes.tsx"],"sourcesContent":["import { Suspense, lazy, useEffect, type ReactNode } from \"react\";\nimport { Routes, Route, Navigate } from \"react-router-dom\";\nimport { LoadingState } from \"./components/LoadingState\";\nimport { FeatureFlaggedRoute } from \"./components/FeatureFlaggedRoute\";\nimport { TelemetryErrorBoundary } from \"./components/TelemetryErrorBoundary\";\nimport { SectionNav } from \"./components/SectionNav\";\nimport { useDevportal } from \"./providers/DevportalProvider\";\n\n/**\n * Catch-all redirect target for the unmatched `*` route. Uses the\n * DevportalProvider's `basePath` and `navigate` so the redirect works\n * regardless of the integration mode (shell or standalone). Falls back to a\n * relative Navigate when neither is wired, which is the standalone/test path.\n */\nfunction CatchAllRedirect() {\n const { basePath, navigate } = useDevportal();\n useEffect(() => {\n if (basePath && navigate) {\n const target = basePath.endsWith(\"/\") ? basePath.slice(0, -1) : basePath;\n navigate(target || \"/\");\n }\n }, [basePath, navigate]);\n if (basePath && navigate) return null;\n return <Navigate to=\"..\" replace />;\n}\n\n/**\n * Wrap a page element with the per-route feature flag gate and a\n * telemetry-emitting error boundary. The flag name follows\n * `devportal.<page-slug>` convention; when disabled the user sees a\n * graceful fallback instead of a route-level crash.\n *\n * Per `dev/platform/context/feature-flags` and spec\n * `microfrontends/47-FRONTEND-EVENT-BUS.md` (error.boundary emission).\n */\nfunction gated(slug: string, element: ReactNode): ReactNode {\n return (\n <TelemetryErrorBoundary scope={slug}>\n <FeatureFlaggedRoute flag={`devportal.${slug}`}>\n {element}\n </FeatureFlaggedRoute>\n </TelemetryErrorBoundary>\n );\n}\n\n// Eager load the main dashboard page\nimport { DashboardPage } from \"./pages/DashboardPage\";\n\n// Lazy load all other pages\nconst OrganizationsPage = lazy(() =>\n import(\"./pages/OrganizationsPage\").then((m) => ({\n default: m.OrganizationsPage,\n })),\n);\nconst OrganizationDetailPage = lazy(() =>\n import(\"./pages/OrganizationDetailPage\").then((m) => ({\n default: m.OrganizationDetailPage,\n })),\n);\nconst CreateOrganizationPage = lazy(() =>\n import(\"./pages/CreateOrganizationPage\").then((m) => ({\n default: m.CreateOrganizationPage,\n })),\n);\nconst OrganizationMembersPage = lazy(() =>\n import(\"./pages/OrganizationMembersPage\").then((m) => ({\n default: m.OrganizationMembersPage,\n })),\n);\nconst RevenueRedirectPage = lazy(() =>\n import(\"./pages/RevenueRedirectPage\").then((m) => ({\n default: m.RevenueRedirectPage,\n })),\n);\nconst ApplicationsPage = lazy(() =>\n import(\"./pages/ApplicationsPage\").then((m) => ({\n default: m.ApplicationsPage,\n })),\n);\nconst ApplicationDetailPage = lazy(() =>\n import(\"./pages/ApplicationDetailPage\").then((m) => ({\n default: m.ApplicationDetailPage,\n })),\n);\nconst CreateApplicationPage = lazy(() =>\n import(\"./pages/CreateApplicationPage\").then((m) => ({\n default: m.CreateApplicationPage,\n })),\n);\nconst EditApplicationPage = lazy(() =>\n import(\"./pages/EditApplicationPage\").then((m) => ({\n default: m.EditApplicationPage,\n })),\n);\nconst ApplicationVersionsPage = lazy(() =>\n import(\"./pages/ApplicationVersionsPage\").then((m) => ({\n default: m.ApplicationVersionsPage,\n })),\n);\nconst OAuthClientsPage = lazy(() =>\n import(\"./pages/OAuthClientsPage\").then((m) => ({\n default: m.OAuthClientsPage,\n })),\n);\nconst CreateOAuthClientPage = lazy(() =>\n import(\"./pages/CreateOAuthClientPage\").then((m) => ({\n default: m.CreateOAuthClientPage,\n })),\n);\nconst OAuthClientDetailPage = lazy(() =>\n import(\"./pages/OAuthClientDetailPage\").then((m) => ({\n default: m.OAuthClientDetailPage,\n })),\n);\nconst ApiKeysPage = lazy(() =>\n import(\"./pages/ApiKeysPage\").then((m) => ({ default: m.ApiKeysPage })),\n);\nconst CreateApiKeyPage = lazy(() =>\n import(\"./pages/CreateApiKeyPage\").then((m) => ({\n default: m.CreateApiKeyPage,\n })),\n);\nconst WebhooksPage = lazy(() =>\n import(\"./pages/WebhooksPage\").then((m) => ({ default: m.WebhooksPage })),\n);\nconst CreateWebhookPage = lazy(() =>\n import(\"./pages/CreateWebhookPage\").then((m) => ({\n default: m.CreateWebhookPage,\n })),\n);\nconst WebhookDetailPage = lazy(() =>\n import(\"./pages/WebhookDetailPage\").then((m) => ({\n default: m.WebhookDetailPage,\n })),\n);\nconst AnalyticsDashboardPage = lazy(() =>\n import(\"./pages/AnalyticsDashboardPage\").then((m) => ({\n default: m.AnalyticsDashboardPage,\n })),\n);\nconst DocumentationPage = lazy(() =>\n import(\"./pages/DocumentationPage\").then((m) => ({\n default: m.DocumentationPage,\n })),\n);\nconst ResourcesPage = lazy(() =>\n import(\"./pages/ResourcesPage\").then((m) => ({ default: m.ResourcesPage })),\n);\nconst SettingsPage = lazy(() =>\n import(\"./pages/SettingsPage\").then((m) => ({ default: m.SettingsPage })),\n);\nconst PublishPage = lazy(() =>\n import(\"./pages/PublishPage\").then((m) => ({ default: m.PublishPage })),\n);\nconst AppLogsPage = lazy(() =>\n import(\"./pages/AppLogsPage\").then((m) => ({ default: m.AppLogsPage })),\n);\nconst DelegationsPage = lazy(() =>\n import(\"./pages/DelegationsPage\").then((m) => ({\n default: m.DelegationsPage,\n })),\n);\nconst ListingPreviewPage = lazy(() =>\n import(\"./pages/ListingPreviewPage\").then((m) => ({\n default: m.ListingPreviewPage,\n })),\n);\nconst StoreSubmissionPage = lazy(() =>\n import(\"./pages/StoreSubmissionPage\").then((m) => ({\n default: m.StoreSubmissionPage,\n })),\n);\nconst PublisherProfilePage = lazy(() =>\n import(\"./pages/PublisherProfilePage\").then((m) => ({\n default: m.PublisherProfilePage,\n })),\n);\nconst SetupPage = lazy(() =>\n import(\"./pages/SetupPage\").then((m) => ({ default: m.SetupPage })),\n);\n\n/**\n * Inner routes component - renders actual page routes\n */\nfunction InnerRoutes() {\n return (\n <>\n <SectionNav />\n <Routes>\n {/* Dashboard */}\n <Route index element={gated(\"dashboard\", <DashboardPage />)} />\n\n {/* Organizations */}\n <Route\n path=\"organizations\"\n element={gated(\"organizations\", <OrganizationsPage />)}\n />\n <Route\n path=\"organizations/new\"\n element={gated(\"organizations.create\", <CreateOrganizationPage />)}\n />\n <Route\n path=\"organizations/:orgId\"\n element={gated(\"organizations.detail\", <OrganizationDetailPage />)}\n />\n <Route\n path=\"organizations/:orgId/members\"\n element={gated(\"organizations.members\", <OrganizationMembersPage />)}\n />\n <Route\n path=\"organizations/:orgId/revenue\"\n element={gated(\"organizations.revenue\", <RevenueRedirectPage />)}\n />\n\n {/* Applications */}\n <Route path=\"apps\" element={gated(\"apps\", <ApplicationsPage />)} />\n <Route\n path=\"apps/new\"\n element={gated(\"apps.create\", <CreateApplicationPage />)}\n />\n <Route\n path=\"apps/:appId\"\n element={gated(\"apps.detail\", <ApplicationDetailPage />)}\n />\n <Route\n path=\"apps/:appId/edit\"\n element={gated(\"apps.edit\", <EditApplicationPage />)}\n />\n <Route\n path=\"apps/:appId/versions\"\n element={gated(\"apps.versions\", <ApplicationVersionsPage />)}\n />\n <Route\n path=\"apps/:appId/publish\"\n element={gated(\"apps.publish\", <PublishPage />)}\n />\n <Route\n path=\"apps/:appId/store-submission\"\n element={gated(\"apps.storeSubmission\", <StoreSubmissionPage />)}\n />\n <Route\n path=\"apps/:appId/listing\"\n element={gated(\"apps.listing\", <ListingPreviewPage />)}\n />\n <Route\n path=\"apps/:appId/logs\"\n element={gated(\"apps.logs\", <AppLogsPage />)}\n />\n\n {/* OAuth Clients — user-scoped via auth-svc (no app nesting) */}\n <Route path=\"oauth\" element={gated(\"oauth\", <OAuthClientsPage />)} />\n <Route\n path=\"oauth/new\"\n element={gated(\"oauth.create\", <CreateOAuthClientPage />)}\n />\n <Route\n path=\"oauth/:clientId\"\n element={gated(\"oauth.detail\", <OAuthClientDetailPage />)}\n />\n\n {/* API Keys — user-scoped via auth-svc (no app nesting) */}\n <Route path=\"api-keys\" element={gated(\"apiKeys\", <ApiKeysPage />)} />\n <Route\n path=\"api-keys/new\"\n element={gated(\"apiKeys.create\", <CreateApiKeyPage />)}\n />\n\n {/* Webhooks (App-specific) */}\n <Route\n path=\"apps/:appId/webhooks\"\n element={gated(\"apps.webhooks\", <WebhooksPage />)}\n />\n <Route\n path=\"apps/:appId/webhooks/new\"\n element={gated(\"apps.webhooks.create\", <CreateWebhookPage />)}\n />\n <Route\n path=\"apps/:appId/webhooks/:webhookId\"\n element={gated(\"apps.webhooks.detail\", <WebhookDetailPage />)}\n />\n\n {/* App Analytics */}\n <Route\n path=\"apps/:appId/analytics\"\n element={gated(\"apps.analytics\", <AnalyticsDashboardPage />)}\n />\n\n {/* Delegations */}\n <Route\n path=\"delegations\"\n element={gated(\"delegations\", <DelegationsPage />)}\n />\n\n {/* Global Webhooks views */}\n <Route\n path=\"webhooks/new\"\n element={gated(\"webhooks.create\", <CreateWebhookPage />)}\n />\n <Route path=\"webhooks\" element={gated(\"webhooks\", <WebhooksPage />)} />\n\n {/* Analytics & Revenue */}\n <Route\n path=\"analytics\"\n element={gated(\"analytics\", <AnalyticsDashboardPage />)}\n />\n <Route\n path=\"revenue\"\n element={gated(\"revenue\", <RevenueRedirectPage />)}\n />\n\n {/* Documentation & Resources */}\n <Route path=\"docs\" element={gated(\"docs\", <DocumentationPage />)} />\n <Route\n path=\"resources\"\n element={gated(\"resources\", <ResourcesPage />)}\n />\n\n {/* Admin surfaces (e.g. /admin/reviews) live in admin-app via\n AdminDevportalRoot — intentionally not mounted in user shells. */}\n\n {/* Publisher */}\n <Route\n path=\"publisher/profile\"\n element={gated(\"publisher.profile\", <PublisherProfilePage />)}\n />\n\n {/* Settings */}\n <Route path=\"settings\" element={gated(\"settings\", <SettingsPage />)} />\n\n {/* First-time setup wizard */}\n <Route path=\"setup\" element={gated(\"setup\", <SetupPage />)} />\n\n {/* Catch-all redirect to dashboard */}\n <Route path=\"*\" element={<CatchAllRedirect />} />\n </Routes>\n </>\n );\n}\n\n/**\n * Developer Portal Routes\n *\n * Defines all the routes for the developer portal microfrontend.\n * Uses lazy loading for all pages except the dashboard for optimal performance.\n *\n * When integrated into a shell (basePath provided), the shell already handles\n * the basePath route (e.g., /devportal/*), so this component should render\n * routes relative to that path - NOT nest them under basePath again.\n *\n * Example:\n * - Shell route: /devportal/*\n * - User navigates to: /devportal/organizations\n * - Inside DevportalRoutes, the path is: /organizations (relative to shell route)\n * - InnerRoutes matches: organizations -> OrganizationsPage\n */\nexport function DevportalRoutes() {\n // When basePath is provided, we're in shell integration mode.\n // The shell already matched the basePath route, so we render routes\n // relative to that - using wildcard to catch all sub-paths.\n // When no basePath (standalone mode), just render InnerRoutes at root.\n return (\n <Suspense fallback={<LoadingState message=\"Loading page...\" />}>\n <Routes>\n {/* Wildcard route to let InnerRoutes handle all paths */}\n <Route path=\"/*\" element={<InnerRoutes />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
@@ -8,234 +8,252 @@ import { PermissionGuard as c } from "../components/PermissionGuard.js";
8
8
  import "../components/index.js";
9
9
  import { DEVPORTAL_PERMISSIONS as l } from "../constants/permissions.js";
10
10
  import "../hooks/index.js";
11
- import { useI18n as u } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
12
- import { Activity as d, AppWindow as f, ArrowRight as p, Building2 as m, DollarSign as h, Key as g, Loader2 as _, Plus as v, TrendingUp as y, Users as b, Webhook as x } from "lucide-react";
13
- import { jsx as S, jsxs as C } from "react/jsx-runtime";
11
+ import { useEffect as u } from "react";
12
+ import { useI18n as d } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
13
+ import { Activity as f, AppWindow as p, ArrowRight as m, Building2 as h, DollarSign as g, Key as _, Loader2 as v, Plus as y, TrendingUp as b, Users as x, Webhook as S } from "lucide-react";
14
+ import { jsx as C, jsxs as w } from "react/jsx-runtime";
14
15
  //#region src/devportal/pages/DashboardPage.tsx
15
- var w = () => {
16
- let { navigate: w, basePath: D } = e(), { t: O } = u(), k = (e, t) => {
17
- let n = O(e);
16
+ var T = () => {
17
+ let { navigate: T, basePath: O } = e(), { t: k } = d(), A = (e, t) => {
18
+ let n = k(e);
18
19
  return n === e ? t : n;
19
- }, { data: A, loading: j } = s({ fetchPolicy: "cache-and-network" }), M = A?.myDeveloperOrganizations ?? [], N = A?.applications?.edges?.map((e) => e.node) ?? [], P = {
20
- totalApps: A?.applications?.totalCount ?? 0,
21
- totalOrgs: M.length,
20
+ }, { data: j, loading: M } = s({ fetchPolicy: "cache-and-network" }), N = j?.myDeveloperOrganizations ?? [];
21
+ u(() => {
22
+ if (!(M || !j) && !(N.length > 0)) {
23
+ try {
24
+ if (localStorage.getItem("devportal_setup_dismissed")) return;
25
+ } catch {
26
+ return;
27
+ }
28
+ T?.(`${O}/setup`);
29
+ }
30
+ }, [
31
+ M,
32
+ j,
33
+ N.length,
34
+ T,
35
+ O
36
+ ]);
37
+ let P = j?.applications?.edges?.map((e) => e.node) ?? [], F = {
38
+ totalApps: j?.applications?.totalCount ?? 0,
39
+ totalOrgs: N.length,
22
40
  totalApiKeys: 0,
23
41
  totalWebhooks: 0,
24
- totalApiCalls: M.reduce((e, t) => e + parseInt(t.totalApiCalls || "0"), 0),
25
- activeInstalls: M.reduce((e, t) => e + (t.activeInstalls || 0), 0),
26
- monthlyRevenue: M.reduce((e, t) => e + (t.totalRevenue || 0), 0),
42
+ totalApiCalls: N.reduce((e, t) => e + parseInt(t.totalApiCalls || "0"), 0),
43
+ activeInstalls: N.reduce((e, t) => e + (t.activeInstalls || 0), 0),
44
+ monthlyRevenue: N.reduce((e, t) => e + (t.totalRevenue || 0), 0),
27
45
  errorRate: 0
28
- }, F = (e) => {
29
- w?.(`${D}${e}`);
30
- }, I = j;
31
- return /* @__PURE__ */ S(c, {
46
+ }, I = (e) => {
47
+ T?.(`${O}${e}`);
48
+ }, L = M;
49
+ return /* @__PURE__ */ C(c, {
32
50
  permission: l.APP_READ,
33
- children: /* @__PURE__ */ C(n, {
34
- title: k("devportal.developerPortal", "Developer Portal"),
35
- description: k("devportal.buildManageMonitor", "Build, manage, and monitor your applications"),
36
- actions: /* @__PURE__ */ C("button", {
51
+ children: /* @__PURE__ */ w(n, {
52
+ title: A("devportal.developerPortal", "Developer Portal"),
53
+ description: A("devportal.buildManageMonitor", "Build, manage, and monitor your applications"),
54
+ actions: /* @__PURE__ */ w("button", {
37
55
  "data-tour": "devportal-dashboard-create-app-button",
38
- onClick: () => F("/apps/new"),
56
+ onClick: () => I("/apps/new"),
39
57
  className: "inline-flex items-center gap-2 rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors",
40
- children: [/* @__PURE__ */ S(v, { size: 16 }), k("devportal.createApp", "Create App")]
58
+ children: [/* @__PURE__ */ C(y, { size: 16 }), A("devportal.createApp", "Create App")]
41
59
  }),
42
60
  children: [
43
- /* @__PURE__ */ S(r, {
61
+ /* @__PURE__ */ C(r, {
44
62
  "data-tour": "devportal-dashboard-stats-overview",
45
- children: /* @__PURE__ */ C(a, {
63
+ children: /* @__PURE__ */ w(a, {
46
64
  columns: 4,
47
65
  children: [
48
- /* @__PURE__ */ S(i, {
49
- title: k("devportal.totalApps", "Total Apps"),
50
- value: I ? /* @__PURE__ */ S(_, { className: "h-5 w-5 animate-spin" }) : P.totalApps,
51
- icon: /* @__PURE__ */ S(f, { size: 20 }),
66
+ /* @__PURE__ */ C(i, {
67
+ title: A("devportal.totalApps", "Total Apps"),
68
+ value: L ? /* @__PURE__ */ C(v, { className: "h-5 w-5 animate-spin" }) : F.totalApps,
69
+ icon: /* @__PURE__ */ C(p, { size: 20 }),
52
70
  trend: void 0
53
71
  }),
54
- /* @__PURE__ */ S(i, {
55
- title: k("devportal.organizations", "Organizations"),
56
- value: I ? /* @__PURE__ */ S(_, { className: "h-5 w-5 animate-spin" }) : P.totalOrgs,
57
- icon: /* @__PURE__ */ S(m, { size: 20 })
72
+ /* @__PURE__ */ C(i, {
73
+ title: A("devportal.organizations", "Organizations"),
74
+ value: L ? /* @__PURE__ */ C(v, { className: "h-5 w-5 animate-spin" }) : F.totalOrgs,
75
+ icon: /* @__PURE__ */ C(h, { size: 20 })
58
76
  }),
59
- /* @__PURE__ */ S(i, {
60
- title: k("devportal.apiKeys", "API Keys"),
61
- value: P.totalApiKeys,
62
- icon: /* @__PURE__ */ S(g, { size: 20 }),
63
- description: k("devportal.activeKeys", "Active keys")
77
+ /* @__PURE__ */ C(i, {
78
+ title: A("devportal.apiKeys", "API Keys"),
79
+ value: F.totalApiKeys,
80
+ icon: /* @__PURE__ */ C(_, { size: 20 }),
81
+ description: A("devportal.activeKeys", "Active keys")
64
82
  }),
65
- /* @__PURE__ */ S(i, {
66
- title: k("devportal.webhooks", "Webhooks"),
67
- value: P.totalWebhooks,
68
- icon: /* @__PURE__ */ S(x, { size: 20 }),
69
- description: k("devportal.configured", "Configured")
83
+ /* @__PURE__ */ C(i, {
84
+ title: A("devportal.webhooks", "Webhooks"),
85
+ value: F.totalWebhooks,
86
+ icon: /* @__PURE__ */ C(S, { size: 20 }),
87
+ description: A("devportal.configured", "Configured")
70
88
  })
71
89
  ]
72
90
  })
73
91
  }),
74
- /* @__PURE__ */ S(r, {
75
- title: k("devportal.usageOverview", "Usage Overview"),
92
+ /* @__PURE__ */ C(r, {
93
+ title: A("devportal.usageOverview", "Usage Overview"),
76
94
  "data-tour": "devportal-dashboard-usage-overview",
77
- children: /* @__PURE__ */ C(a, {
95
+ children: /* @__PURE__ */ w(a, {
78
96
  columns: 4,
79
97
  children: [
80
- /* @__PURE__ */ S(i, {
81
- title: k("devportal.apiCalls", "API Calls"),
82
- value: I ? /* @__PURE__ */ S(_, { className: "h-5 w-5 animate-spin" }) : P.totalApiCalls > 1e6 ? `${(P.totalApiCalls / 1e6).toFixed(1)}M` : P.totalApiCalls > 1e3 ? `${(P.totalApiCalls / 1e3).toFixed(1)}K` : P.totalApiCalls.toString(),
83
- icon: /* @__PURE__ */ S(d, { size: 20 }),
98
+ /* @__PURE__ */ C(i, {
99
+ title: A("devportal.apiCalls", "API Calls"),
100
+ value: L ? /* @__PURE__ */ C(v, { className: "h-5 w-5 animate-spin" }) : F.totalApiCalls > 1e6 ? `${(F.totalApiCalls / 1e6).toFixed(1)}M` : F.totalApiCalls > 1e3 ? `${(F.totalApiCalls / 1e3).toFixed(1)}K` : F.totalApiCalls.toString(),
101
+ icon: /* @__PURE__ */ C(f, { size: 20 }),
84
102
  trend: void 0
85
103
  }),
86
- /* @__PURE__ */ S(i, {
87
- title: k("devportal.activeInstalls", "Active Installs"),
88
- value: I ? /* @__PURE__ */ S(_, { className: "h-5 w-5 animate-spin" }) : P.activeInstalls > 1e3 ? `${(P.activeInstalls / 1e3).toFixed(1)}K` : P.activeInstalls.toString(),
89
- icon: /* @__PURE__ */ S(b, { size: 20 }),
104
+ /* @__PURE__ */ C(i, {
105
+ title: A("devportal.activeInstalls", "Active Installs"),
106
+ value: L ? /* @__PURE__ */ C(v, { className: "h-5 w-5 animate-spin" }) : F.activeInstalls > 1e3 ? `${(F.activeInstalls / 1e3).toFixed(1)}K` : F.activeInstalls.toString(),
107
+ icon: /* @__PURE__ */ C(x, { size: 20 }),
90
108
  trend: void 0
91
109
  }),
92
- /* @__PURE__ */ S(i, {
93
- title: k("devportal.monthlyRevenue", "Monthly Revenue"),
94
- value: I ? /* @__PURE__ */ S(_, { className: "h-5 w-5 animate-spin" }) : `$${P.monthlyRevenue.toLocaleString()}`,
95
- icon: /* @__PURE__ */ S(h, { size: 20 }),
110
+ /* @__PURE__ */ C(i, {
111
+ title: A("devportal.monthlyRevenue", "Monthly Revenue"),
112
+ value: L ? /* @__PURE__ */ C(v, { className: "h-5 w-5 animate-spin" }) : `$${F.monthlyRevenue.toLocaleString()}`,
113
+ icon: /* @__PURE__ */ C(g, { size: 20 }),
96
114
  trend: void 0
97
115
  }),
98
- /* @__PURE__ */ S(i, {
99
- title: k("devportal.errorRate", "Error Rate"),
100
- value: `${P.errorRate}%`,
101
- icon: /* @__PURE__ */ S(y, { size: 20 }),
116
+ /* @__PURE__ */ C(i, {
117
+ title: A("devportal.errorRate", "Error Rate"),
118
+ value: `${F.errorRate}%`,
119
+ icon: /* @__PURE__ */ C(b, { size: 20 }),
102
120
  trend: void 0
103
121
  })
104
122
  ]
105
123
  })
106
124
  }),
107
- /* @__PURE__ */ C("div", {
125
+ /* @__PURE__ */ w("div", {
108
126
  className: "grid gap-6 lg:grid-cols-2",
109
- children: [/* @__PURE__ */ S(r, {
127
+ children: [/* @__PURE__ */ C(r, {
110
128
  "data-tour": "devportal-dashboard-recent-apps",
111
- title: k("devportal.recentApplications", "Recent Applications"),
112
- actions: /* @__PURE__ */ C("button", {
113
- onClick: () => F("/apps"),
129
+ title: A("devportal.recentApplications", "Recent Applications"),
130
+ actions: /* @__PURE__ */ w("button", {
131
+ onClick: () => I("/apps"),
114
132
  className: "text-sm text-primary hover:underline flex items-center gap-1",
115
133
  children: [
116
- k("devportal.viewAll", "View all"),
134
+ A("devportal.viewAll", "View all"),
117
135
  " ",
118
- /* @__PURE__ */ S(p, { size: 14 })
136
+ /* @__PURE__ */ C(m, { size: 14 })
119
137
  ]
120
138
  }),
121
- children: I ? /* @__PURE__ */ S("div", {
139
+ children: L ? /* @__PURE__ */ C("div", {
122
140
  className: "flex items-center justify-center py-8",
123
- children: /* @__PURE__ */ S(_, { className: "h-6 w-6 animate-spin text-muted-foreground" })
124
- }) : N.length > 0 ? /* @__PURE__ */ S("div", {
141
+ children: /* @__PURE__ */ C(v, { className: "h-6 w-6 animate-spin text-muted-foreground" })
142
+ }) : P.length > 0 ? /* @__PURE__ */ C("div", {
125
143
  className: "space-y-2",
126
- children: N.slice(0, 3).map((e) => /* @__PURE__ */ S(o, {
144
+ children: P.slice(0, 3).map((e) => /* @__PURE__ */ C(o, {
127
145
  app: e,
128
- onClick: () => F(`/apps/${e.id}`)
146
+ onClick: () => I(`/apps/${e.id}`)
129
147
  }, e.id))
130
- }) : /* @__PURE__ */ S(t, {
131
- icon: /* @__PURE__ */ S(f, { size: 24 }),
132
- title: k("devportal.noApplicationsYet", "No applications yet"),
133
- description: k("devportal.createFirstApplicationToGetStarted", "Create your first application to get started"),
134
- action: /* @__PURE__ */ C("button", {
135
- onClick: () => F("/apps/new"),
148
+ }) : /* @__PURE__ */ C(t, {
149
+ icon: /* @__PURE__ */ C(p, { size: 24 }),
150
+ title: A("devportal.noApplicationsYet", "No applications yet"),
151
+ description: A("devportal.createFirstApplicationToGetStarted", "Create your first application to get started"),
152
+ action: /* @__PURE__ */ w("button", {
153
+ onClick: () => I("/apps/new"),
136
154
  className: "inline-flex items-center gap-2 rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90",
137
- children: [/* @__PURE__ */ S(v, { size: 16 }), k("devportal.createApp", "Create App")]
155
+ children: [/* @__PURE__ */ C(y, { size: 16 }), A("devportal.createApp", "Create App")]
138
156
  })
139
157
  })
140
- }), /* @__PURE__ */ S(r, {
141
- title: k("devportal.quickActions", "Quick Actions"),
158
+ }), /* @__PURE__ */ C(r, {
159
+ title: A("devportal.quickActions", "Quick Actions"),
142
160
  "data-tour": "devportal-dashboard-quick-actions",
143
- children: /* @__PURE__ */ C("div", {
161
+ children: /* @__PURE__ */ w("div", {
144
162
  className: "grid gap-3",
145
163
  children: [
146
- /* @__PURE__ */ S(T, {
147
- title: k("devportal.createNewApp", "Create New App"),
148
- description: k("devportal.startBuildingANewApplication", "Start building a new application"),
149
- icon: /* @__PURE__ */ S(f, { size: 20 }),
150
- onClick: () => F("/apps/new")
164
+ /* @__PURE__ */ C(E, {
165
+ title: A("devportal.createNewApp", "Create New App"),
166
+ description: A("devportal.startBuildingANewApplication", "Start building a new application"),
167
+ icon: /* @__PURE__ */ C(p, { size: 20 }),
168
+ onClick: () => I("/apps/new")
151
169
  }),
152
- /* @__PURE__ */ S(T, {
153
- title: k("devportal.createOrganization", "Create Organization"),
154
- description: k("devportal.setUpATeamToCollaborate", "Set up a team to collaborate"),
155
- icon: /* @__PURE__ */ S(m, { size: 20 }),
156
- onClick: () => F("/organizations/new")
170
+ /* @__PURE__ */ C(E, {
171
+ title: A("devportal.createOrganization", "Create Organization"),
172
+ description: A("devportal.setUpATeamToCollaborate", "Set up a team to collaborate"),
173
+ icon: /* @__PURE__ */ C(h, { size: 20 }),
174
+ onClick: () => I("/organizations/new")
157
175
  }),
158
- /* @__PURE__ */ S(T, {
159
- title: k("devportal.generateApiKey", "Generate API Key"),
160
- description: k("devportal.createCredentialsForYourApps", "Create credentials for your apps"),
161
- icon: /* @__PURE__ */ S(g, { size: 20 }),
162
- onClick: () => F("/api-keys")
176
+ /* @__PURE__ */ C(E, {
177
+ title: A("devportal.generateApiKey", "Generate API Key"),
178
+ description: A("devportal.createCredentialsForYourApps", "Create credentials for your apps"),
179
+ icon: /* @__PURE__ */ C(_, { size: 20 }),
180
+ onClick: () => I("/api-keys")
163
181
  }),
164
- /* @__PURE__ */ S(T, {
165
- title: k("devportal.configureWebhooks", "Configure Webhooks"),
166
- description: k("devportal.setUpEventNotifications", "Set up event notifications"),
167
- icon: /* @__PURE__ */ S(x, { size: 20 }),
168
- onClick: () => F("/webhooks")
182
+ /* @__PURE__ */ C(E, {
183
+ title: A("devportal.configureWebhooks", "Configure Webhooks"),
184
+ description: A("devportal.setUpEventNotifications", "Set up event notifications"),
185
+ icon: /* @__PURE__ */ C(S, { size: 20 }),
186
+ onClick: () => I("/webhooks")
169
187
  })
170
188
  ]
171
189
  })
172
190
  })]
173
191
  }),
174
- I ? /* @__PURE__ */ S(r, {
192
+ L ? /* @__PURE__ */ C(r, {
175
193
  "data-tour": "devportal-dashboard-organizations",
176
- title: k("devportal.yourOrganizations", "Your Organizations"),
177
- children: /* @__PURE__ */ S("div", {
194
+ title: A("devportal.yourOrganizations", "Your Organizations"),
195
+ children: /* @__PURE__ */ C("div", {
178
196
  className: "flex items-center justify-center py-8",
179
- children: /* @__PURE__ */ S(_, { className: "h-6 w-6 animate-spin text-muted-foreground" })
197
+ children: /* @__PURE__ */ C(v, { className: "h-6 w-6 animate-spin text-muted-foreground" })
180
198
  })
181
- }) : M.length > 0 ? /* @__PURE__ */ S(r, {
182
- title: k("devportal.yourOrganizations", "Your Organizations"),
183
- actions: /* @__PURE__ */ C("button", {
184
- onClick: () => F("/organizations"),
199
+ }) : N.length > 0 ? /* @__PURE__ */ C(r, {
200
+ title: A("devportal.yourOrganizations", "Your Organizations"),
201
+ actions: /* @__PURE__ */ w("button", {
202
+ onClick: () => I("/organizations"),
185
203
  className: "text-sm text-primary hover:underline flex items-center gap-1",
186
204
  children: [
187
- k("devportal.viewAll", "View all"),
205
+ A("devportal.viewAll", "View all"),
188
206
  " ",
189
- /* @__PURE__ */ S(p, { size: 14 })
207
+ /* @__PURE__ */ C(m, { size: 14 })
190
208
  ]
191
209
  }),
192
- children: /* @__PURE__ */ S("div", {
210
+ children: /* @__PURE__ */ C("div", {
193
211
  className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
194
- children: M.slice(0, 3).map((e) => /* @__PURE__ */ S(E, {
212
+ children: N.slice(0, 3).map((e) => /* @__PURE__ */ C(D, {
195
213
  org: e,
196
- onClick: () => F(`/organizations/${e.id}`)
214
+ onClick: () => I(`/organizations/${e.id}`)
197
215
  }, e.id))
198
216
  })
199
217
  }) : null
200
218
  ]
201
219
  })
202
220
  });
203
- }, T = ({ title: e, description: t, icon: n, onClick: r }) => /* @__PURE__ */ C("button", {
221
+ }, E = ({ title: e, description: t, icon: n, onClick: r }) => /* @__PURE__ */ w("button", {
204
222
  onClick: r,
205
223
  className: "flex items-center gap-4 rounded-lg border bg-card p-4 text-left hover:bg-accent transition-colors",
206
- children: [/* @__PURE__ */ S("div", {
224
+ children: [/* @__PURE__ */ C("div", {
207
225
  className: "rounded-lg bg-primary/10 p-2 text-primary",
208
226
  children: n
209
- }), /* @__PURE__ */ C("div", { children: [/* @__PURE__ */ S("p", {
227
+ }), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
210
228
  className: "font-medium",
211
229
  children: e
212
- }), /* @__PURE__ */ S("p", {
230
+ }), /* @__PURE__ */ C("p", {
213
231
  className: "text-sm text-muted-foreground",
214
232
  children: t
215
233
  })] })]
216
- }), E = ({ org: e, onClick: t }) => {
217
- let { t: n } = u(), r = (e, t) => {
234
+ }), D = ({ org: e, onClick: t }) => {
235
+ let { t: n } = d(), r = (e, t) => {
218
236
  let r = n(e);
219
237
  return r === e ? t : r;
220
238
  };
221
- return /* @__PURE__ */ C("button", {
239
+ return /* @__PURE__ */ w("button", {
222
240
  onClick: t,
223
241
  className: "rounded-lg border bg-card p-4 text-left hover:bg-accent transition-colors",
224
- children: [/* @__PURE__ */ C("div", {
242
+ children: [/* @__PURE__ */ w("div", {
225
243
  className: "flex items-center gap-3",
226
- children: [e.logoUrl ? /* @__PURE__ */ S("img", {
244
+ children: [e.logoUrl ? /* @__PURE__ */ C("img", {
227
245
  src: e.logoUrl,
228
246
  alt: e.name,
229
247
  className: "h-10 w-10 rounded-lg object-cover"
230
- }) : /* @__PURE__ */ S("div", {
248
+ }) : /* @__PURE__ */ C("div", {
231
249
  className: "flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10 text-primary",
232
- children: /* @__PURE__ */ S(m, { size: 20 })
233
- }), /* @__PURE__ */ C("div", {
250
+ children: /* @__PURE__ */ C(h, { size: 20 })
251
+ }), /* @__PURE__ */ w("div", {
234
252
  className: "flex-1 min-w-0",
235
- children: [/* @__PURE__ */ S("p", {
253
+ children: [/* @__PURE__ */ C("p", {
236
254
  className: "font-medium truncate",
237
255
  children: e.name
238
- }), /* @__PURE__ */ C("p", {
256
+ }), /* @__PURE__ */ w("p", {
239
257
  className: "text-sm text-muted-foreground",
240
258
  children: [
241
259
  e.publishedApps,
@@ -244,13 +262,13 @@ var w = () => {
244
262
  ]
245
263
  })]
246
264
  })]
247
- }), /* @__PURE__ */ C("div", {
265
+ }), /* @__PURE__ */ w("div", {
248
266
  className: "mt-3 flex gap-4 text-sm text-muted-foreground",
249
- children: [/* @__PURE__ */ C("span", { children: [
267
+ children: [/* @__PURE__ */ w("span", { children: [
250
268
  (e.totalInstalls || 0).toLocaleString(),
251
269
  " ",
252
270
  r("devportal.installs", "installs")
253
- ] }), /* @__PURE__ */ C("span", { children: [
271
+ ] }), /* @__PURE__ */ w("span", { children: [
254
272
  "$",
255
273
  (e.totalRevenue || 0).toLocaleString(),
256
274
  " ",
@@ -260,6 +278,6 @@ var w = () => {
260
278
  });
261
279
  };
262
280
  //#endregion
263
- export { w as DashboardPage };
281
+ export { T as DashboardPage };
264
282
 
265
283
  //# sourceMappingURL=DashboardPage.js.map