@sdvf23rvfa43f/sidebar-header 1.4.3 → 1.5.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.
@@ -83,14 +83,13 @@ function S3Page() {
83
83
  }
84
84
  );
85
85
  }
86
- function FunctionsPage() {
86
+ function LaunchPage() {
87
87
  return /* @__PURE__ */ jsx(
88
88
  PlaceholderPage,
89
89
  {
90
- title: "Functions",
90
+ title: "Launch",
91
91
  subtitle: "Deploy and manage serverless functions.",
92
- icon: Zap,
93
- badge: "BETA"
92
+ icon: Zap
94
93
  }
95
94
  );
96
95
  }
@@ -178,6 +177,6 @@ function NotFoundPage() {
178
177
  ] });
179
178
  }
180
179
 
181
- export { ApplicationPage, BecomeResellerPage, BillingPage, DashboardPage, DnsServicePage, DomainPage, FunctionsPage, NotFoundPage, OpenTicketPage, OrderServicePage, PlaceholderPage, PlatformPage, S3Page, ServersPage, SupportPage, VpnPage };
182
- //# sourceMappingURL=chunk-JNP6BURZ.js.map
183
- //# sourceMappingURL=chunk-JNP6BURZ.js.map
180
+ export { ApplicationPage, BecomeResellerPage, BillingPage, DashboardPage, DnsServicePage, DomainPage, LaunchPage, NotFoundPage, OpenTicketPage, OrderServicePage, PlaceholderPage, PlatformPage, S3Page, ServersPage, SupportPage, VpnPage };
181
+ //# sourceMappingURL=chunk-LDD7WAQJ.js.map
182
+ //# sourceMappingURL=chunk-LDD7WAQJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pages/PlaceholderPage.tsx","../src/pages/DashboardPage.tsx","../src/pages/ServersPage.tsx","../src/pages/VpnPage.tsx","../src/pages/ApplicationPage.tsx","../src/pages/PlatformPage.tsx","../src/pages/S3Page.tsx","../src/pages/LaunchPage.tsx","../src/pages/DomainPage.tsx","../src/pages/DnsServicePage.tsx","../src/pages/BillingPage.tsx","../src/pages/SupportPage.tsx","../src/pages/OpenTicketPage.tsx","../src/pages/BecomeResellerPage.tsx","../src/pages/OrderServicePage.tsx","../src/pages/NotFoundPage.tsx"],"names":["jsx","jsxs"],"mappings":"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","file":"chunk-LDD7WAQJ.js","sourcesContent":["/* ═══════════════════════════════════════════════════════════════\n PlaceholderPage — Generic stub page for routes not yet implemented\n ═══════════════════════════════════════════════════════════════ */\n\nimport type { ComponentType, ReactNode } from 'react';\n\nexport interface PlaceholderPageProps {\n title: string;\n subtitle?: string;\n icon?: ComponentType<{ className?: string }>;\n badge?: string;\n children?: ReactNode;\n}\n\nexport function PlaceholderPage({\n title,\n subtitle,\n icon: Icon,\n badge,\n children,\n}: PlaceholderPageProps) {\n return (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-4 px-6 py-20\">\n {Icon && (\n <div className=\"flex h-16 w-16 items-center justify-center rounded-2xl bg-white/[0.04] ring-1 ring-white/[0.06]\">\n <Icon className=\"h-8 w-8 text-sg-text-muted\" />\n </div>\n )}\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-sg-text-primary text-2xl font-semibold\">{title}</h1>\n {badge && (\n <span className=\"rounded-md bg-white/[0.06] px-2 py-0.5 text-xs text-sg-text-muted ring-1 ring-white/[0.08]\">\n {badge}\n </span>\n )}\n </div>\n {subtitle && (\n <p className=\"max-w-md text-center text-sg-text-muted\">{subtitle}</p>\n )}\n {children}\n </div>\n );\n}\n","import { LayoutDashboard } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function DashboardPage() {\n return (\n <PlaceholderPage\n title=\"Dashboard\"\n subtitle=\"Overview of your Caasify infrastructure and services.\"\n icon={LayoutDashboard}\n />\n );\n}\n","import { Server } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function ServersPage() {\n return (\n <PlaceholderPage\n title=\"Servers\"\n subtitle=\"Manage your Cloud VPS instances.\"\n icon={Server}\n />\n );\n}\n","import { Shield } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function VpnPage() {\n return (\n <PlaceholderPage\n title=\"VPNs\"\n subtitle=\"Manage your VPN connections and tunnels.\"\n icon={Shield}\n />\n );\n}\n","import { AppWindow } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function ApplicationPage() {\n return (\n <PlaceholderPage\n title=\"Application\"\n subtitle=\"Deploy and manage your applications.\"\n icon={AppWindow}\n badge=\"SOON\"\n />\n );\n}\n","import { Layers } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function PlatformPage() {\n return (\n <PlaceholderPage\n title=\"Platform\"\n subtitle=\"Manage your platform infrastructure and services.\"\n icon={Layers}\n badge=\"SOON\"\n />\n );\n}\n","import { HardDrive } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function S3Page() {\n return (\n <PlaceholderPage\n title=\"S3\"\n subtitle=\"Object storage buckets and file management.\"\n icon={HardDrive}\n badge=\"SOON\"\n />\n );\n}\n","import { Zap } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function LaunchPage() {\n return (\n <PlaceholderPage\n title=\"Launch\"\n subtitle=\"Deploy and manage serverless functions.\"\n icon={Zap}\n />\n );\n}","import { Globe } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function DomainPage() {\n return (\n <PlaceholderPage\n title=\"Domain\"\n subtitle=\"Register and manage your domain names.\"\n icon={Globe}\n badge=\"BETA\"\n />\n );\n}\n","import { Network } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function DnsServicePage() {\n return (\n <PlaceholderPage\n title=\"DNS Service\"\n subtitle=\"Configure DNS zones and records.\"\n icon={Network}\n badge=\"BETA\"\n />\n );\n}\n","import { Receipt } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function BillingPage() {\n return (\n <PlaceholderPage\n title=\"View Invoices\"\n subtitle=\"Review your billing history and manage payment methods.\"\n icon={Receipt}\n />\n );\n}\n","import { LifeBuoy } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function SupportPage() {\n return (\n <PlaceholderPage\n title=\"Support\"\n subtitle=\"Browse help articles and view your support tickets.\"\n icon={LifeBuoy}\n />\n );\n}\n","import { TicketPlus } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function OpenTicketPage() {\n return (\n <PlaceholderPage\n title=\"Open Ticket\"\n subtitle=\"Create a new support ticket and get help from our team.\"\n icon={TicketPlus}\n />\n );\n}\n","import { Users } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function BecomeResellerPage() {\n return (\n <PlaceholderPage\n title=\"Become Reseller\"\n subtitle=\"Join the Caasify reseller program and grow your business.\"\n icon={Users}\n />\n );\n}\n","import { Rocket } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function OrderServicePage() {\n return (\n <PlaceholderPage\n title=\"Deploy\"\n subtitle=\"Choose a service and deploy in seconds.\"\n icon={Rocket}\n />\n );\n}\n","import { useLocation } from 'react-router';\n\nexport function NotFoundPage() {\n const location = useLocation();\n return (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-4 px-6 py-20\">\n <div className=\"flex h-16 w-16 items-center justify-center rounded-2xl bg-white/[0.04] ring-1 ring-white/[0.06]\">\n <span className=\"text-2xl\">404</span>\n </div>\n <h1 className=\"text-sg-text-primary text-2xl font-semibold\">Page Not Found</h1>\n <p className=\"max-w-md text-center text-sg-text-muted\">\n No route matches <code className=\"rounded bg-white/[0.06] px-1.5 py-0.5 text-sm\">{location.pathname}</code>\n </p>\n </div>\n );\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { ShoppingCart, LayoutDashboard, Server, Shield, HardDrive, Zap, Globe, Network, AppWindow, Layers, Receipt, LifeBuoy, TicketPlus, Users } from 'lucide-react';
1
+ import { ShoppingCart, LayoutDashboard, Server, Shield, Zap, Receipt, LifeBuoy, TicketPlus, Users } from 'lucide-react';
2
2
 
3
3
  // src/navigation.ts
4
4
  var caasifyLogo = {
@@ -13,12 +13,12 @@ var caasifyNavigation = [
13
13
  { id: "dashboard", label: "Dashboard", icon: LayoutDashboard },
14
14
  { id: "cloud-vps", label: "Cloud VPS", icon: Server },
15
15
  { id: "vpn", label: "VPNs", icon: Shield },
16
- { id: "s3", label: "S3", icon: HardDrive, badge: "BETA" },
17
- { id: "serverless", label: "Functions", icon: Zap, badge: "BETA" },
18
- { id: "domain", label: "Domain", icon: Globe, badge: "BETA" },
19
- { id: "route53", label: "DNS Service", icon: Network, badge: "BETA" },
20
- { id: "app", label: "Application", icon: AppWindow, badge: "SOON" },
21
- { id: "platform", label: "Platform", icon: Layers, badge: "SOON" }
16
+ { id: "serverless", label: "Launch", icon: Zap, badge: "NEW" }
17
+ // { id: 's3', label: 'S3', icon: HardDrive, badge: 'BETA' },
18
+ // { id: 'domain', label: 'Domain', icon: Globe, badge: 'BETA' },
19
+ // { id: 'route53', label: 'DNS Service', icon: Network, badge: 'BETA' },
20
+ // { id: 'app', label: 'Application', icon: AppWindow, badge: 'SOON' },
21
+ // { id: 'platform', label: 'Platform', icon: Layers, badge: 'SOON' },
22
22
  ]
23
23
  },
24
24
  {
@@ -38,7 +38,7 @@ var caasifyRouteMap = {
38
38
  "app": "https://my.caasify.com/app",
39
39
  "platform": "https://my.caasify.com/platform",
40
40
  "s3": "https://my.caasify.com/s3",
41
- "serverless": "https://my.caasify.com/functions",
41
+ "serverless": "https://my.caasify.com/launch",
42
42
  "domain": "https://my.caasify.com/domain",
43
43
  "route53": "https://my.caasify.com/route53",
44
44
  "billing": "https://my.caasify.com/billing",
@@ -46,6 +46,7 @@ var caasifyRouteMap = {
46
46
  "support-open-ticket": "https://my.caasify.com/support/open-ticket",
47
47
  "become-reseller": "https://my.caasify.com/become-reseller",
48
48
  "account-settings": "https://my.caasify.com/profile",
49
+ "settings-profile": "https://my.caasify.com/settings/profile",
49
50
  "order-service": "https://my.caasify.com/deploy",
50
51
  "add-funds": "https://my.caasify.com/add-funds",
51
52
  "profile": "https://my.caasify.com/profile"
@@ -72,5 +73,5 @@ function resolveCurrentId(pathname) {
72
73
  var CAASIFY_NAV_IDS = Object.keys(caasifyRouteMap);
73
74
 
74
75
  export { CAASIFY_NAV_IDS, CAASIFY_WALLET_CURRENCY, caasifyHeaderCTA, caasifyLogo, caasifyNavigation, caasifyPathToId, caasifyRouteMap, resolveCurrentId };
75
- //# sourceMappingURL=chunk-V2I5K6HG.js.map
76
- //# sourceMappingURL=chunk-V2I5K6HG.js.map
76
+ //# sourceMappingURL=chunk-LOVVAIGO.js.map
77
+ //# sourceMappingURL=chunk-LOVVAIGO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/navigation.ts"],"names":[],"mappings":"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","file":"chunk-LOVVAIGO.js","sourcesContent":["/* ═══════════════════════════════════════════════════════════════\n @sdvf23rvfa43f/sidebar-header — Navigation Configuration\n ═══════════════════════════════════════════════════════════════\n Pure data module — no React dependency.\n Import standalone: import { ... } from '@sdvf23rvfa43f/sidebar-header/navigation'\n ═══════════════════════════════════════════════════════════════ */\n\nimport {\n LayoutDashboard, Server, Shield, Zap, Globe, Network,\n AppWindow, Layers, HardDrive,\n Receipt, LifeBuoy, TicketPlus, Users, ShoppingCart,\n} from 'lucide-react';\nimport type { SidebarNavSection, SidebarCTAButton, SidebarLogo, SidebarWallet } from '@sdvf23rvfa43f/stealth-glass';\n\n// ─── Contextual Navigation ──────────────────────────────────\n\n/**\n * Returned by a `contextualNav` resolver to inject a dynamic sidebar section.\n * The section is spliced between Overview and Account when the user drills\n * into a specific service (e.g. individual server list under Servers).\n */\nexport interface ContextualNav {\n /** Navigation section to inject (rendered between Overview and Account) */\n section: SidebarNavSection;\n /** Route map entries for contextual items (merged with canonical map) */\n routeMap: Record<string, string>;\n}\n\n// ─── Logo ────────────────────────────────────────────────────\n\nexport const caasifyLogo: SidebarLogo = {\n src: 'https://upload.caasify.com/logo/logo-70x70.png',\n alt: 'Caasify',\n title: 'Caasify',\n};\n\n// ─── Sidebar Navigation Sections ─────────────────────────────\n\nexport const caasifyNavigation: SidebarNavSection[] = [\n {\n category: 'Overview',\n items: [\n { id: 'dashboard', label: 'Dashboard', icon: LayoutDashboard },\n { id: 'cloud-vps', label: 'Cloud VPS', icon: Server },\n { id: 'vpn', label: 'VPNs', icon: Shield },\n { id: 'serverless', label: 'Launch', icon: Zap, badge: 'NEW' },\n // { id: 's3', label: 'S3', icon: HardDrive, badge: 'BETA' },\n // { id: 'domain', label: 'Domain', icon: Globe, badge: 'BETA' },\n // { id: 'route53', label: 'DNS Service', icon: Network, badge: 'BETA' },\n // { id: 'app', label: 'Application', icon: AppWindow, badge: 'SOON' },\n // { id: 'platform', label: 'Platform', icon: Layers, badge: 'SOON' },\n ],\n },\n {\n category: 'Account',\n items: [\n { id: 'billing', label: 'View Invoices', icon: Receipt },\n { id: 'support', label: 'Support', icon: LifeBuoy },\n { id: 'support-open-ticket', label: 'Open Ticket', icon: TicketPlus },\n { id: 'become-reseller', label: 'Become Reseller', icon: Users },\n ],\n },\n];\n\n// ─── Route Map ───────────────────────────────────────────────\n\n/** Maps each nav item `id` to its URL path. */\nexport const caasifyRouteMap: Record<string, string> = {\n 'dashboard': 'https://my.caasify.com',\n 'cloud-vps': 'https://my.caasify.com/cloud-vps',\n 'vpn': 'https://my.caasify.com/vpn',\n 'app': 'https://my.caasify.com/app',\n 'platform': 'https://my.caasify.com/platform',\n 's3': 'https://my.caasify.com/s3',\n 'serverless': 'https://my.caasify.com/launch',\n 'domain': 'https://my.caasify.com/domain',\n 'route53': 'https://my.caasify.com/route53',\n 'billing': 'https://my.caasify.com/billing',\n 'support': 'https://my.caasify.com/support',\n 'support-open-ticket': 'https://my.caasify.com/support/open-ticket',\n 'become-reseller': 'https://my.caasify.com/become-reseller',\n 'account-settings': 'https://my.caasify.com/profile',\n 'settings-profile': 'https://my.caasify.com/settings/profile',\n 'order-service': 'https://my.caasify.com/deploy',\n 'add-funds': 'https://my.caasify.com/add-funds',\n 'profile': 'https://my.caasify.com/profile',\n};\n\n/** Reverse lookup: URL path -> nav item `id`. */\nexport const caasifyPathToId: Record<string, string> = Object.fromEntries(\n Object.entries(caasifyRouteMap).map(([id, path]) => [path, id]),\n);\n\n// ─── Header CTA ──────────────────────────────────────────────\n\n/** Create Order button configuration for the sidebar. */\nexport const caasifyHeaderCTA = {\n label: 'Create Order',\n icon: ShoppingCart,\n route: 'https://my.caasify.com/deploy',\n} as const;\n\n// ─── Wallet defaults ─────────────────────────────────────────\n\n/** Default wallet currency symbol. */\nexport const CAASIFY_WALLET_CURRENCY = '€';\n\n// ─── Helper: resolve currentId from pathname ─────────────────\n\n/**\n * Resolves the active sidebar nav `id` from a URL pathname or full URL.\n * Uses exact match first, then longest-prefix match, fallback to 'dashboard'.\n */\nexport function resolveCurrentId(pathname: string): string {\n // Exact match (supports both full URLs and pathnames)\n if (caasifyPathToId[pathname]) return caasifyPathToId[pathname];\n\n // Try matching against just the pathname portion of full URLs\n const pathOnly = pathname.replace(/^https?:\\/\\/[^/]+/, '') || '/';\n for (const [id, url] of Object.entries(caasifyRouteMap)) {\n const urlPath = url.replace(/^https?:\\/\\/[^/]+/, '') || '/';\n if (urlPath === pathOnly) return id;\n }\n\n // Longest prefix match on pathname\n const matches = Object.entries(caasifyRouteMap)\n .map(([id, url]) => [id, url.replace(/^https?:\\/\\/[^/]+/, '') || '/'] as const)\n .filter(([, p]) => p !== '/' && pathOnly.startsWith(p))\n .sort((a, b) => b[1].length - a[1].length);\n\n return matches[0]?.[0] ?? 'dashboard';\n}\n\n// ─── All nav item IDs (useful for type narrowing) ────────────\n\nexport const CAASIFY_NAV_IDS = Object.keys(caasifyRouteMap) as ReadonlyArray<string>;"]}
@@ -1,5 +1,5 @@
1
- import { resolveCurrentId, caasifyRouteMap, caasifyNavigation, caasifyHeaderCTA, CAASIFY_WALLET_CURRENCY, caasifyLogo } from './chunk-V2I5K6HG.js';
2
- import { NotFoundPage, OrderServicePage, BecomeResellerPage, OpenTicketPage, SupportPage, BillingPage, DnsServicePage, DomainPage, FunctionsPage, S3Page, PlatformPage, ApplicationPage, VpnPage, ServersPage, DashboardPage } from './chunk-JNP6BURZ.js';
1
+ import { resolveCurrentId, caasifyRouteMap, caasifyNavigation, caasifyHeaderCTA, CAASIFY_WALLET_CURRENCY, caasifyLogo } from './chunk-LOVVAIGO.js';
2
+ import { NotFoundPage, OrderServicePage, BecomeResellerPage, OpenTicketPage, SupportPage, BillingPage, DnsServicePage, DomainPage, LaunchPage, S3Page, PlatformPage, ApplicationPage, VpnPage, ServersPage, DashboardPage } from './chunk-LDD7WAQJ.js';
3
3
  import { useLocation, useNavigate, createBrowserRouter, Outlet } from 'react-router';
4
4
  import { AppShell } from '@sdvf23rvfa43f/stealth-glass';
5
5
  import { jsx } from 'react/jsx-runtime';
@@ -16,6 +16,7 @@ function CaasifyShell({
16
16
  routeMap = caasifyRouteMap,
17
17
  headerLeftSlot,
18
18
  headerRightSlot,
19
+ onProfileClick,
19
20
  ambientColors,
20
21
  contentMaxWidth,
21
22
  isLoading,
@@ -105,7 +106,7 @@ var ROUTE_IDS = {
105
106
  APPLICATION: "app",
106
107
  PLATFORM: "platform",
107
108
  S3: "s3",
108
- FUNCTIONS: "serverless",
109
+ LAUNCH: "serverless",
109
110
  DOMAIN: "domain",
110
111
  DNS_SERVICE: "route53",
111
112
  BILLING: "billing",
@@ -122,7 +123,7 @@ var defaultPageMap = {
122
123
  [ROUTE_IDS.APPLICATION]: ApplicationPage,
123
124
  [ROUTE_IDS.PLATFORM]: PlatformPage,
124
125
  [ROUTE_IDS.S3]: S3Page,
125
- [ROUTE_IDS.FUNCTIONS]: FunctionsPage,
126
+ [ROUTE_IDS.LAUNCH]: LaunchPage,
126
127
  [ROUTE_IDS.DOMAIN]: DomainPage,
127
128
  [ROUTE_IDS.DNS_SERVICE]: DnsServicePage,
128
129
  [ROUTE_IDS.BILLING]: BillingPage,
@@ -140,7 +141,7 @@ function buildChildRoutes(pageOverrides = {}, extraRoutes = []) {
140
141
  { id: ROUTE_IDS.SERVERS, path: "cloud-vps", Component: page(ROUTE_IDS.SERVERS) },
141
142
  { id: ROUTE_IDS.VPN, path: "vpn", Component: page(ROUTE_IDS.VPN) },
142
143
  { id: ROUTE_IDS.S3, path: "s3", Component: page(ROUTE_IDS.S3) },
143
- { id: ROUTE_IDS.FUNCTIONS, path: "serverless", Component: page(ROUTE_IDS.FUNCTIONS) },
144
+ { id: ROUTE_IDS.LAUNCH, path: "launch", Component: page(ROUTE_IDS.LAUNCH) },
144
145
  { id: ROUTE_IDS.DOMAIN, path: "domain", Component: page(ROUTE_IDS.DOMAIN) },
145
146
  { id: ROUTE_IDS.DNS_SERVICE, path: "route53", Component: page(ROUTE_IDS.DNS_SERVICE) },
146
147
  { id: ROUTE_IDS.APPLICATION, path: "app", Component: page(ROUTE_IDS.APPLICATION) },
@@ -188,5 +189,5 @@ function createCaasifyRouter(options = {}) {
188
189
  }
189
190
 
190
191
  export { CaasifyShell, ROUTE_IDS, buildCaasifyRoutes, buildChildRoutes, createCaasifyRouter, defaultPageMap };
191
- //# sourceMappingURL=chunk-ZUFFVPQA.js.map
192
- //# sourceMappingURL=chunk-ZUFFVPQA.js.map
192
+ //# sourceMappingURL=chunk-QR2KJBLA.js.map
193
+ //# sourceMappingURL=chunk-QR2KJBLA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/CaasifyShell.tsx","../src/routes.tsx"],"names":["jsx"],"mappings":"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","file":"chunk-QR2KJBLA.js","sourcesContent":["/* ═══════════════════════════════════════════════════════════════\n @sdvf23rvfa43f/sidebar-header — CaasifyShell Component\n ═══════════════════════════════════════════════════════════════\n Pre-wired AppShell with Caasify navigation.\n Drop into any micro-project's root route:\n \n import { CaasifyShell } from '@sdvf23rvfa43f/sidebar-header';\n \n export default function Root() {\n return (\n <CaasifyShell\n isAuthenticated={true}\n user={{ name: 'Jane', email: 'jane@acme.io' }}\n walletBalance={124.50}\n onSignOut={() => auth.signOut()}\n >\n <Outlet />\n </CaasifyShell>\n );\n }\n ═══════════════════════════════════════════════════════════════ */\n\nimport { type ReactNode } from 'react';\nimport { useLocation, useNavigate } from 'react-router';\nimport { AppShell } from '@sdvf23rvfa43f/stealth-glass';\nimport type { SidebarUser, AppShellProps } from '@sdvf23rvfa43f/stealth-glass';\n\nimport {\n caasifyLogo,\n caasifyNavigation,\n caasifyRouteMap,\n caasifyHeaderCTA,\n resolveCurrentId,\n CAASIFY_WALLET_CURRENCY,\n} from './navigation';\nimport type { ContextualNav } from './navigation';\n\n// ─── Props ───────────────────────────────────────────────────\n\nexport interface CaasifyShellProps {\n children: ReactNode;\n\n /** Auth state */\n isAuthenticated: boolean;\n user?: SidebarUser;\n onSignOut?: () => void;\n\n /** Wallet balance (shown in sidebar). Omit to hide wallet widget. */\n walletBalance?: number;\n /** Wallet currency symbol. Default: '€' */\n walletCurrency?: string;\n /** Callback when \"Add Funds\" is clicked. Defaults to navigate('/billing'). */\n onAddFunds?: () => void;\n\n /** Override navigation sections (advanced). Default: Caasify canonical nav. */\n navigation?: AppShellProps['navigation'];\n /** Override route map (advanced). Default: caasifyRouteMap. */\n routeMap?: Record<string, string>;\n\n /** Extra AppShell props forwarded directly (headerLeftSlot, ambientColors, etc.) */\n headerLeftSlot?: AppShellProps['headerLeftSlot'];\n headerRightSlot?: AppShellProps['headerRightSlot'];\n /** Callback when user profile name/avatar is clicked. Defaults to navigating to settings/profile. */\n onProfileClick?: () => void;\n ambientColors?: AppShellProps['ambientColors'];\n contentMaxWidth?: AppShellProps['contentMaxWidth'];\n isLoading?: AppShellProps['isLoading'];\n footerSlot?: AppShellProps['footerSlot'];\n\n /**\n * Contextual sidebar section resolver (Option B).\n * Called with the resolved canonical `currentId` on every render.\n * Return a `ContextualNav` to inject a dynamic section between Overview and Account,\n * or `null` to show the default 2-section layout.\n *\n * The resolver should be pure and cheap. Memoize with `useCallback` if needed.\n */\n contextualNav?: (currentId: string) => ContextualNav | null;\n}\n\n// ─── Component ───────────────────────────────────────────────\n\nexport function CaasifyShell({\n children,\n isAuthenticated,\n user,\n onSignOut,\n walletBalance,\n walletCurrency = CAASIFY_WALLET_CURRENCY,\n onAddFunds,\n navigation = caasifyNavigation,\n routeMap = caasifyRouteMap,\n headerLeftSlot,\n headerRightSlot,\n onProfileClick,\n ambientColors,\n contentMaxWidth,\n isLoading,\n footerSlot,\n contextualNav,\n}: CaasifyShellProps) {\n const location = useLocation();\n const navigate = useNavigate();\n const currentId = resolveCurrentId(location.pathname);\n\n // ── Contextual section resolution ────────────────────────\n // Use consumer resolver if provided, otherwise no contextual nav\n const contextual = contextualNav ? contextualNav(currentId) : null;\n\n // Merge route maps: contextual entries layered on top of canonical\n const effectiveRouteMap = contextual\n ? { ...routeMap, ...contextual.routeMap }\n : routeMap;\n\n // Splice contextual section between Overview (idx 0) and Account (idx 1+)\n const effectiveNavigation = contextual\n ? navigation.length > 0\n ? [navigation[0], contextual.section, ...navigation.slice(1)]\n : [contextual.section]\n : navigation;\n\n // Resolve contextual active item via longest pathname prefix match\n // Priority: contextual item > canonical currentId\n // Scans both top-level items AND inline children\n let effectiveCurrentId = currentId;\n if (contextual) {\n let longestMatch = 0;\n const scanItem = (itemId: string) => {\n const path = effectiveRouteMap[itemId];\n if (\n path &&\n path !== '/' &&\n location.pathname.startsWith(path) &&\n path.length > longestMatch\n ) {\n longestMatch = path.length;\n effectiveCurrentId = itemId;\n }\n };\n for (const item of contextual.section.items) {\n scanItem(item.id);\n // Also scan inline children\n if (item.children) {\n for (const child of item.children) {\n scanItem(child.id);\n }\n }\n }\n }\n\n const handleNavigate = (id: string) => {\n const path = effectiveRouteMap[id];\n if (path) {\n // Check if it's an external URL (starts with http:// or https://)\n if (path.startsWith('http://') || path.startsWith('https://')) {\n window.location.href = path;\n } else {\n navigate(path);\n }\n }\n };\n\n const wallet = walletBalance !== undefined\n ? {\n balance: walletBalance,\n currency: walletCurrency,\n onAddFunds: onAddFunds ?? (() => navigate('/billing')),\n }\n : undefined;\n\n const ctaButton = {\n label: caasifyHeaderCTA.label,\n icon: caasifyHeaderCTA.icon,\n onClick: () => {\n const route = caasifyHeaderCTA.route;\n if (route.startsWith('http://') || route.startsWith('https://')) {\n window.location.href = route;\n } else {\n navigate(route);\n }\n },\n };\n\n return (\n <AppShell\n logo={caasifyLogo}\n navigation={effectiveNavigation}\n currentId={effectiveCurrentId}\n onNavigate={handleNavigate}\n isAuthenticated={isAuthenticated}\n user={user}\n onSignOut={onSignOut ?? (() => {})}\n wallet={wallet}\n ctaButton={ctaButton}\n headerLeftSlot={headerLeftSlot}\n headerRightSlot={headerRightSlot}\n ambientColors={ambientColors}\n contentMaxWidth={contentMaxWidth}\n isLoading={isLoading}\n footerSlot={footerSlot}\n >\n {children}\n </AppShell>\n );\n}","/* ═══════════════════════════════════════════════════════════════\n @sdvf23rvfa43f/sidebar-header — Route Definitions & Router Factory\n ═══════════════════════════════════════════════════════════════\n \n Two usage modes:\n \n A) Full router (zero-config):\n import { createCaasifyRouter } from '@sdvf23rvfa43f/sidebar-header/routes';\n const router = createCaasifyRouter();\n <RouterProvider router={router} />\n \n B) Route objects only (mix with your own routes):\n import { caasifyRoutes, caasifyChildRoutes } from '@sdvf23rvfa43f/sidebar-header/routes';\n const router = createBrowserRouter([\n ...caasifyRoutes,\n { path: '/my-custom', Component: MyPage },\n ]);\n \n ═══════════════════════════════════════════════════════════════ */\n\nimport type { ComponentType } from 'react';\nimport { createBrowserRouter, Outlet } from 'react-router';\nimport type { RouteObject } from 'react-router';\n\nimport { CaasifyShell } from './CaasifyShell';\nimport type { CaasifyShellProps } from './CaasifyShell';\n\n// Default placeholder pages\nimport {\n DashboardPage,\n ServersPage,\n VpnPage,\n ApplicationPage,\n PlatformPage,\n S3Page,\n LaunchPage,\n DomainPage,\n DnsServicePage,\n BillingPage,\n SupportPage,\n OpenTicketPage,\n BecomeResellerPage,\n OrderServicePage,\n NotFoundPage,\n} from './pages';\n\n// ─── Route ID constants ──────────────────────────────────────\n\nexport const ROUTE_IDS = {\n ROOT: 'root',\n DASHBOARD: 'dashboard',\n SERVERS: 'cloud-vps',\n VPN: 'vpn',\n APPLICATION: 'app',\n PLATFORM: 'platform',\n S3: 's3',\n LAUNCH: 'serverless',\n DOMAIN: 'domain',\n DNS_SERVICE: 'route53',\n BILLING: 'billing',\n SUPPORT: 'support',\n OPEN_TICKET: 'support-open-ticket',\n BECOME_RESELLER: 'become-reseller',\n ORDER_SERVICE: 'order-service',\n NOT_FOUND: 'not-found',\n} as const;\n\n// ─── Route-to-component default map ──────────────────────────\n\n/** Default page component for each route. Override via `pageOverrides`. */\nexport const defaultPageMap: Record<string, ComponentType> = {\n [ROUTE_IDS.DASHBOARD]: DashboardPage,\n [ROUTE_IDS.SERVERS]: ServersPage,\n [ROUTE_IDS.VPN]: VpnPage,\n [ROUTE_IDS.APPLICATION]: ApplicationPage,\n [ROUTE_IDS.PLATFORM]: PlatformPage,\n [ROUTE_IDS.S3]: S3Page,\n [ROUTE_IDS.LAUNCH]: LaunchPage,\n [ROUTE_IDS.DOMAIN]: DomainPage,\n [ROUTE_IDS.DNS_SERVICE]: DnsServicePage,\n [ROUTE_IDS.BILLING]: BillingPage,\n [ROUTE_IDS.SUPPORT]: SupportPage,\n [ROUTE_IDS.OPEN_TICKET]: OpenTicketPage,\n [ROUTE_IDS.BECOME_RESELLER]: BecomeResellerPage,\n [ROUTE_IDS.ORDER_SERVICE]: OrderServicePage,\n [ROUTE_IDS.NOT_FOUND]: NotFoundPage,\n};\n\n// ─── Child route definitions ─────────────────────────────────\n\n/**\n * Canonical child routes for the Caasify shell.\n * Each route uses a default placeholder page that can be overridden.\n */\nexport function buildChildRoutes(\n pageOverrides: Partial<Record<string, ComponentType>> = {},\n extraRoutes: RouteObject[] = [],\n): RouteObject[] {\n const page = (id: string): ComponentType =>\n pageOverrides[id] ?? defaultPageMap[id] ?? NotFoundPage;\n\n return [\n // ── Overview ───────────────────────────────────\n { id: ROUTE_IDS.DASHBOARD, index: true, Component: page(ROUTE_IDS.DASHBOARD) },\n { id: ROUTE_IDS.SERVERS, path: 'cloud-vps', Component: page(ROUTE_IDS.SERVERS) },\n { id: ROUTE_IDS.VPN, path: 'vpn', Component: page(ROUTE_IDS.VPN) },\n { id: ROUTE_IDS.S3, path: 's3', Component: page(ROUTE_IDS.S3) },\n { id: ROUTE_IDS.LAUNCH, path: 'launch', Component: page(ROUTE_IDS.LAUNCH) },\n { id: ROUTE_IDS.DOMAIN, path: 'domain', Component: page(ROUTE_IDS.DOMAIN) },\n { id: ROUTE_IDS.DNS_SERVICE, path: 'route53', Component: page(ROUTE_IDS.DNS_SERVICE) },\n { id: ROUTE_IDS.APPLICATION, path: 'app', Component: page(ROUTE_IDS.APPLICATION) },\n { id: ROUTE_IDS.PLATFORM, path: 'platform', Component: page(ROUTE_IDS.PLATFORM) },\n\n // ── Account ───────────────────────────────────\n { id: ROUTE_IDS.BILLING, path: 'billing', Component: page(ROUTE_IDS.BILLING) },\n { id: ROUTE_IDS.SUPPORT, path: 'support', Component: page(ROUTE_IDS.SUPPORT) },\n { id: ROUTE_IDS.OPEN_TICKET, path: 'support/open-ticket', Component: page(ROUTE_IDS.OPEN_TICKET) },\n { id: ROUTE_IDS.BECOME_RESELLER, path: 'become-reseller', Component: page(ROUTE_IDS.BECOME_RESELLER) },\n\n // ── Header CTA ────────────────────────────────\n { id: ROUTE_IDS.ORDER_SERVICE, path: 'order-service', Component: page(ROUTE_IDS.ORDER_SERVICE) },\n\n // ── Extra routes from consumer ────────────────\n ...extraRoutes,\n\n // ── Catch-all 404 ─────────────────────────────\n { id: ROUTE_IDS.NOT_FOUND, path: '*', Component: page(ROUTE_IDS.NOT_FOUND) },\n ];\n}\n\n// ─── Root layout wrapper factory ─────────────────────────────\n\nfunction createRootComponent(shellProps: Partial<CaasifyShellProps>) {\n // `children` is managed internally (Outlet), `isAuthenticated` gets a safe default.\n // Everything else (navigation, routeMap, contextualNav, wallet*, header slots, etc.)\n // flows through `...rest` into CaasifyShell unchanged.\n const { children: _ignored, isAuthenticated, ...rest } = shellProps as CaasifyShellProps;\n\n return function CaasifyRoot() {\n return (\n <CaasifyShell {...rest} isAuthenticated={isAuthenticated ?? false}>\n <Outlet />\n </CaasifyShell>\n );\n };\n}\n\n// ─── Full route tree ─────────────────────────────────────────\n\nexport interface CaasifyRouterOptions {\n /** Props forwarded to CaasifyShell (auth, user, wallet, etc.) */\n shellProps?: Partial<CaasifyShellProps>;\n\n /** Override specific page components by route ID. */\n pageOverrides?: Partial<Record<string, ComponentType>>;\n\n /** Extra child routes appended inside the shell layout. */\n extraRoutes?: RouteObject[];\n\n /** Extra top-level routes added OUTSIDE the shell (e.g. /login). */\n topLevelRoutes?: RouteObject[];\n\n /** Custom root component. If provided, shellProps is ignored. */\n RootComponent?: ComponentType;\n}\n\n/**\n * Build the full Caasify route array (not yet a router).\n * Use this if you want to combine with your own `createBrowserRouter` call.\n */\nexport function buildCaasifyRoutes(options: CaasifyRouterOptions = {}): RouteObject[] {\n const {\n shellProps = {},\n pageOverrides = {},\n extraRoutes = [],\n topLevelRoutes = [],\n RootComponent,\n } = options;\n\n const Root = RootComponent ?? createRootComponent(shellProps);\n\n return [\n {\n id: ROUTE_IDS.ROOT,\n path: '/',\n Component: Root,\n children: buildChildRoutes(pageOverrides, extraRoutes),\n },\n ...topLevelRoutes,\n ];\n}\n\n/**\n * One-liner: creates a complete `BrowserRouter` with the Caasify shell + all routes.\n *\n * ```tsx\n * import { createCaasifyRouter } from '@sdvf23rvfa43f/sidebar-header/routes';\n * const router = createCaasifyRouter({ shellProps: { isAuthenticated: true } });\n * <RouterProvider router={router} />\n * ```\n */\nexport function createCaasifyRouter(options: CaasifyRouterOptions = {}) {\n return createBrowserRouter(buildCaasifyRoutes(options));\n}"]}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { C as CaasifyRouterOptions, a as CaasifyShell, b as CaasifyShellProps, R as ROUTE_IDS, c as buildCaasifyRoutes, d as buildChildRoutes, e as createCaasifyRouter, f as defaultPageMap } from './routes-D0GrmQ4o.js';
1
+ export { C as CaasifyRouterOptions, a as CaasifyShell, b as CaasifyShellProps, R as ROUTE_IDS, c as buildCaasifyRoutes, d as buildChildRoutes, e as createCaasifyRouter, f as defaultPageMap } from './routes-MjXfnoft.js';
2
2
  export { CAASIFY_NAV_IDS, CAASIFY_WALLET_CURRENCY, ContextualNav, caasifyHeaderCTA, caasifyLogo, caasifyNavigation, caasifyPathToId, caasifyRouteMap, resolveCurrentId } from './navigation.js';
3
3
  export { P as PlaceholderPage, a as PlaceholderPageProps } from './PlaceholderPage-ftRS9Unp.js';
4
4
  import 'react-router';
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- export { CaasifyShell, ROUTE_IDS, buildCaasifyRoutes, buildChildRoutes, createCaasifyRouter, defaultPageMap } from './chunk-ZUFFVPQA.js';
2
- export { CAASIFY_NAV_IDS, CAASIFY_WALLET_CURRENCY, caasifyHeaderCTA, caasifyLogo, caasifyNavigation, caasifyPathToId, caasifyRouteMap, resolveCurrentId } from './chunk-V2I5K6HG.js';
3
- export { PlaceholderPage } from './chunk-JNP6BURZ.js';
1
+ export { CaasifyShell, ROUTE_IDS, buildCaasifyRoutes, buildChildRoutes, createCaasifyRouter, defaultPageMap } from './chunk-QR2KJBLA.js';
2
+ export { CAASIFY_NAV_IDS, CAASIFY_WALLET_CURRENCY, caasifyHeaderCTA, caasifyLogo, caasifyNavigation, caasifyPathToId, caasifyRouteMap, resolveCurrentId } from './chunk-LOVVAIGO.js';
3
+ export { PlaceholderPage } from './chunk-LDD7WAQJ.js';
4
4
  //# sourceMappingURL=index.js.map
5
5
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,5 @@
1
- import { ShoppingCart } from 'lucide-react';
1
+ import * as react from 'react';
2
+ import * as lucide_react from 'lucide-react';
2
3
  import { SidebarNavSection, SidebarLogo } from '@sdvf23rvfa43f/stealth-glass';
3
4
 
4
5
  /**
@@ -18,13 +19,12 @@ declare const caasifyNavigation: SidebarNavSection[];
18
19
  declare const caasifyRouteMap: Record<string, string>;
19
20
  /** Reverse lookup: URL path -> nav item `id`. */
20
21
  declare const caasifyPathToId: Record<string, string>;
21
- interface HeaderCTAConfig {
22
- label: string;
23
- icon: typeof ShoppingCart;
24
- route: string;
25
- }
26
22
  /** Create Order button configuration for the sidebar. */
27
- declare const caasifyHeaderCTA: HeaderCTAConfig;
23
+ declare const caasifyHeaderCTA: {
24
+ readonly label: "Create Order";
25
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
26
+ readonly route: "https://my.caasify.com/deploy";
27
+ };
28
28
  /** Default wallet currency symbol. */
29
29
  declare const CAASIFY_WALLET_CURRENCY = "\u20AC";
30
30
  /**
@@ -1,3 +1,3 @@
1
- export { CAASIFY_NAV_IDS, CAASIFY_WALLET_CURRENCY, caasifyHeaderCTA, caasifyLogo, caasifyNavigation, caasifyPathToId, caasifyRouteMap, resolveCurrentId } from './chunk-V2I5K6HG.js';
1
+ export { CAASIFY_NAV_IDS, CAASIFY_WALLET_CURRENCY, caasifyHeaderCTA, caasifyLogo, caasifyNavigation, caasifyPathToId, caasifyRouteMap, resolveCurrentId } from './chunk-LOVVAIGO.js';
2
2
  //# sourceMappingURL=navigation.js.map
3
3
  //# sourceMappingURL=navigation.js.map
@@ -14,7 +14,7 @@ declare function PlatformPage(): react_jsx_runtime.JSX.Element;
14
14
 
15
15
  declare function S3Page(): react_jsx_runtime.JSX.Element;
16
16
 
17
- declare function FunctionsPage(): react_jsx_runtime.JSX.Element;
17
+ declare function LaunchPage(): react_jsx_runtime.JSX.Element;
18
18
 
19
19
  declare function DomainPage(): react_jsx_runtime.JSX.Element;
20
20
 
@@ -32,4 +32,4 @@ declare function OrderServicePage(): react_jsx_runtime.JSX.Element;
32
32
 
33
33
  declare function NotFoundPage(): react_jsx_runtime.JSX.Element;
34
34
 
35
- export { ApplicationPage, BecomeResellerPage, BillingPage, DashboardPage, DnsServicePage, DomainPage, FunctionsPage, NotFoundPage, OpenTicketPage, OrderServicePage, PlatformPage, S3Page, ServersPage, SupportPage, VpnPage };
35
+ export { ApplicationPage, BecomeResellerPage, BillingPage, DashboardPage, DnsServicePage, DomainPage, LaunchPage, NotFoundPage, OpenTicketPage, OrderServicePage, PlatformPage, S3Page, ServersPage, SupportPage, VpnPage };
@@ -1,3 +1,3 @@
1
- export { ApplicationPage, BecomeResellerPage, BillingPage, DashboardPage, DnsServicePage, DomainPage, FunctionsPage, NotFoundPage, OpenTicketPage, OrderServicePage, PlaceholderPage, PlatformPage, S3Page, ServersPage, SupportPage, VpnPage } from '../chunk-JNP6BURZ.js';
1
+ export { ApplicationPage, BecomeResellerPage, BillingPage, DashboardPage, DnsServicePage, DomainPage, LaunchPage, NotFoundPage, OpenTicketPage, OrderServicePage, PlaceholderPage, PlatformPage, S3Page, ServersPage, SupportPage, VpnPage } from '../chunk-LDD7WAQJ.js';
2
2
  //# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
@@ -24,6 +24,8 @@ interface CaasifyShellProps {
24
24
  /** Extra AppShell props forwarded directly (headerLeftSlot, ambientColors, etc.) */
25
25
  headerLeftSlot?: AppShellProps['headerLeftSlot'];
26
26
  headerRightSlot?: AppShellProps['headerRightSlot'];
27
+ /** Callback when user profile name/avatar is clicked. Defaults to navigating to settings/profile. */
28
+ onProfileClick?: () => void;
27
29
  ambientColors?: AppShellProps['ambientColors'];
28
30
  contentMaxWidth?: AppShellProps['contentMaxWidth'];
29
31
  isLoading?: AppShellProps['isLoading'];
@@ -38,7 +40,7 @@ interface CaasifyShellProps {
38
40
  */
39
41
  contextualNav?: (currentId: string) => ContextualNav | null;
40
42
  }
41
- declare function CaasifyShell({ children, isAuthenticated, user, onSignOut, walletBalance, walletCurrency, onAddFunds, navigation, routeMap, headerLeftSlot, headerRightSlot, ambientColors, contentMaxWidth, isLoading, footerSlot, contextualNav, }: CaasifyShellProps): react_jsx_runtime.JSX.Element;
43
+ declare function CaasifyShell({ children, isAuthenticated, user, onSignOut, walletBalance, walletCurrency, onAddFunds, navigation, routeMap, headerLeftSlot, headerRightSlot, onProfileClick, ambientColors, contentMaxWidth, isLoading, footerSlot, contextualNav, }: CaasifyShellProps): react_jsx_runtime.JSX.Element;
42
44
 
43
45
  declare const ROUTE_IDS: {
44
46
  readonly ROOT: "root";
@@ -48,7 +50,7 @@ declare const ROUTE_IDS: {
48
50
  readonly APPLICATION: "app";
49
51
  readonly PLATFORM: "platform";
50
52
  readonly S3: "s3";
51
- readonly FUNCTIONS: "serverless";
53
+ readonly LAUNCH: "serverless";
52
54
  readonly DOMAIN: "domain";
53
55
  readonly DNS_SERVICE: "route53";
54
56
  readonly BILLING: "billing";
package/dist/routes.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import 'react-router';
2
2
  import 'react';
3
- export { C as CaasifyRouterOptions, R as ROUTE_IDS, c as buildCaasifyRoutes, d as buildChildRoutes, e as createCaasifyRouter, f as defaultPageMap } from './routes-D0GrmQ4o.js';
3
+ export { C as CaasifyRouterOptions, R as ROUTE_IDS, c as buildCaasifyRoutes, d as buildChildRoutes, e as createCaasifyRouter, f as defaultPageMap } from './routes-MjXfnoft.js';
4
4
  import 'react/jsx-runtime';
5
5
  import '@sdvf23rvfa43f/stealth-glass';
6
6
  import './navigation.js';
package/dist/routes.js CHANGED
@@ -1,5 +1,5 @@
1
- export { ROUTE_IDS, buildCaasifyRoutes, buildChildRoutes, createCaasifyRouter, defaultPageMap } from './chunk-ZUFFVPQA.js';
2
- import './chunk-V2I5K6HG.js';
3
- import './chunk-JNP6BURZ.js';
1
+ export { ROUTE_IDS, buildCaasifyRoutes, buildChildRoutes, createCaasifyRouter, defaultPageMap } from './chunk-QR2KJBLA.js';
2
+ import './chunk-LOVVAIGO.js';
3
+ import './chunk-LDD7WAQJ.js';
4
4
  //# sourceMappingURL=routes.js.map
5
5
  //# sourceMappingURL=routes.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sdvf23rvfa43f/sidebar-header",
3
- "version": "1.4.3",
3
+ "version": "1.5.2",
4
4
  "description": "Caasify shared sidebar + header navigation shell — pre-wired AppShell with canonical nav structure",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/pages/PlaceholderPage.tsx","../src/pages/DashboardPage.tsx","../src/pages/ServersPage.tsx","../src/pages/VpnPage.tsx","../src/pages/ApplicationPage.tsx","../src/pages/PlatformPage.tsx","../src/pages/S3Page.tsx","../src/pages/FunctionsPage.tsx","../src/pages/DomainPage.tsx","../src/pages/DnsServicePage.tsx","../src/pages/BillingPage.tsx","../src/pages/SupportPage.tsx","../src/pages/OpenTicketPage.tsx","../src/pages/BecomeResellerPage.tsx","../src/pages/OrderServicePage.tsx","../src/pages/NotFoundPage.tsx"],"names":["jsx","jsxs"],"mappings":"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","file":"chunk-JNP6BURZ.js","sourcesContent":["/* ═══════════════════════════════════════════════════════════════\n PlaceholderPage — Generic stub page for routes not yet implemented\n ═══════════════════════════════════════════════════════════════ */\n\nimport type { ComponentType, ReactNode } from 'react';\n\nexport interface PlaceholderPageProps {\n title: string;\n subtitle?: string;\n icon?: ComponentType<{ className?: string }>;\n badge?: string;\n children?: ReactNode;\n}\n\nexport function PlaceholderPage({\n title,\n subtitle,\n icon: Icon,\n badge,\n children,\n}: PlaceholderPageProps) {\n return (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-4 px-6 py-20\">\n {Icon && (\n <div className=\"flex h-16 w-16 items-center justify-center rounded-2xl bg-white/[0.04] ring-1 ring-white/[0.06]\">\n <Icon className=\"h-8 w-8 text-sg-text-muted\" />\n </div>\n )}\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-sg-text-primary text-2xl font-semibold\">{title}</h1>\n {badge && (\n <span className=\"rounded-md bg-white/[0.06] px-2 py-0.5 text-xs text-sg-text-muted ring-1 ring-white/[0.08]\">\n {badge}\n </span>\n )}\n </div>\n {subtitle && (\n <p className=\"max-w-md text-center text-sg-text-muted\">{subtitle}</p>\n )}\n {children}\n </div>\n );\n}\n","import { LayoutDashboard } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function DashboardPage() {\n return (\n <PlaceholderPage\n title=\"Dashboard\"\n subtitle=\"Overview of your Caasify infrastructure and services.\"\n icon={LayoutDashboard}\n />\n );\n}\n","import { Server } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function ServersPage() {\n return (\n <PlaceholderPage\n title=\"Servers\"\n subtitle=\"Manage your Cloud VPS instances.\"\n icon={Server}\n />\n );\n}\n","import { Shield } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function VpnPage() {\n return (\n <PlaceholderPage\n title=\"VPNs\"\n subtitle=\"Manage your VPN connections and tunnels.\"\n icon={Shield}\n />\n );\n}\n","import { AppWindow } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function ApplicationPage() {\n return (\n <PlaceholderPage\n title=\"Application\"\n subtitle=\"Deploy and manage your applications.\"\n icon={AppWindow}\n badge=\"SOON\"\n />\n );\n}\n","import { Layers } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function PlatformPage() {\n return (\n <PlaceholderPage\n title=\"Platform\"\n subtitle=\"Manage your platform infrastructure and services.\"\n icon={Layers}\n badge=\"SOON\"\n />\n );\n}\n","import { HardDrive } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function S3Page() {\n return (\n <PlaceholderPage\n title=\"S3\"\n subtitle=\"Object storage buckets and file management.\"\n icon={HardDrive}\n badge=\"SOON\"\n />\n );\n}\n","import { Zap } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function FunctionsPage() {\n return (\n <PlaceholderPage\n title=\"Functions\"\n subtitle=\"Deploy and manage serverless functions.\"\n icon={Zap}\n badge=\"BETA\"\n />\n );\n}\n","import { Globe } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function DomainPage() {\n return (\n <PlaceholderPage\n title=\"Domain\"\n subtitle=\"Register and manage your domain names.\"\n icon={Globe}\n badge=\"BETA\"\n />\n );\n}\n","import { Network } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function DnsServicePage() {\n return (\n <PlaceholderPage\n title=\"DNS Service\"\n subtitle=\"Configure DNS zones and records.\"\n icon={Network}\n badge=\"BETA\"\n />\n );\n}\n","import { Receipt } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function BillingPage() {\n return (\n <PlaceholderPage\n title=\"View Invoices\"\n subtitle=\"Review your billing history and manage payment methods.\"\n icon={Receipt}\n />\n );\n}\n","import { LifeBuoy } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function SupportPage() {\n return (\n <PlaceholderPage\n title=\"Support\"\n subtitle=\"Browse help articles and view your support tickets.\"\n icon={LifeBuoy}\n />\n );\n}\n","import { TicketPlus } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function OpenTicketPage() {\n return (\n <PlaceholderPage\n title=\"Open Ticket\"\n subtitle=\"Create a new support ticket and get help from our team.\"\n icon={TicketPlus}\n />\n );\n}\n","import { Users } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function BecomeResellerPage() {\n return (\n <PlaceholderPage\n title=\"Become Reseller\"\n subtitle=\"Join the Caasify reseller program and grow your business.\"\n icon={Users}\n />\n );\n}\n","import { Rocket } from 'lucide-react';\nimport { PlaceholderPage } from './PlaceholderPage';\n\nexport function OrderServicePage() {\n return (\n <PlaceholderPage\n title=\"Deploy\"\n subtitle=\"Choose a service and deploy in seconds.\"\n icon={Rocket}\n />\n );\n}\n","import { useLocation } from 'react-router';\n\nexport function NotFoundPage() {\n const location = useLocation();\n return (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-4 px-6 py-20\">\n <div className=\"flex h-16 w-16 items-center justify-center rounded-2xl bg-white/[0.04] ring-1 ring-white/[0.06]\">\n <span className=\"text-2xl\">404</span>\n </div>\n <h1 className=\"text-sg-text-primary text-2xl font-semibold\">Page Not Found</h1>\n <p className=\"max-w-md text-center text-sg-text-muted\">\n No route matches <code className=\"rounded bg-white/[0.06] px-1.5 py-0.5 text-sm\">{location.pathname}</code>\n </p>\n </div>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/navigation.ts"],"names":[],"mappings":"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","file":"chunk-V2I5K6HG.js","sourcesContent":["/* ═══════════════════════════════════════════════════════════════\n @sdvf23rvfa43f/sidebar-header — Navigation Configuration\n ═══════════════════════════════════════════════════════════════\n Pure data module — no React dependency.\n Import standalone: import { ... } from '@sdvf23rvfa43f/sidebar-header/navigation'\n ═══════════════════════════════════════════════════════════════ */\n\nimport {\n LayoutDashboard, Server, Shield, Zap, Globe, Network,\n AppWindow, Layers, HardDrive,\n Receipt, LifeBuoy, TicketPlus, Users, ShoppingCart,\n} from 'lucide-react';\nimport type { SidebarNavSection, SidebarCTAButton, SidebarLogo, SidebarWallet } from '@sdvf23rvfa43f/stealth-glass';\n\n// ─── Contextual Navigation ──────────────────────────────────\n\n/**\n * Returned by a `contextualNav` resolver to inject a dynamic sidebar section.\n * The section is spliced between Overview and Account when the user drills\n * into a specific service (e.g. individual server list under Servers).\n */\nexport interface ContextualNav {\n /** Navigation section to inject (rendered between Overview and Account) */\n section: SidebarNavSection;\n /** Route map entries for contextual items (merged with canonical map) */\n routeMap: Record<string, string>;\n}\n\n// ─── Logo ────────────────────────────────────────────────────\n\nexport const caasifyLogo: SidebarLogo = {\n src: 'https://upload.caasify.com/logo/logo-70x70.png',\n alt: 'Caasify',\n title: 'Caasify',\n};\n\n// ─── Sidebar Navigation Sections ─────────────────────────────\n\nexport const caasifyNavigation: SidebarNavSection[] = [\n {\n category: 'Overview',\n items: [\n { id: 'dashboard', label: 'Dashboard', icon: LayoutDashboard },\n { id: 'cloud-vps', label: 'Cloud VPS', icon: Server },\n { id: 'vpn', label: 'VPNs', icon: Shield },\n { id: 's3', label: 'S3', icon: HardDrive, badge: 'BETA' },\n { id: 'serverless', label: 'Functions', icon: Zap, badge: 'BETA' },\n { id: 'domain', label: 'Domain', icon: Globe, badge: 'BETA' },\n { id: 'route53', label: 'DNS Service', icon: Network, badge: 'BETA' },\n { id: 'app', label: 'Application', icon: AppWindow, badge: 'SOON' },\n { id: 'platform', label: 'Platform', icon: Layers, badge: 'SOON' },\n ],\n },\n {\n category: 'Account',\n items: [\n { id: 'billing', label: 'View Invoices', icon: Receipt },\n { id: 'support', label: 'Support', icon: LifeBuoy },\n { id: 'support-open-ticket', label: 'Open Ticket', icon: TicketPlus },\n { id: 'become-reseller', label: 'Become Reseller', icon: Users },\n ],\n },\n];\n\n// ─── Route Map ───────────────────────────────────────────────\n\n/** Maps each nav item `id` to its URL path. */\nexport const caasifyRouteMap: Record<string, string> = {\n 'dashboard': 'https://my.caasify.com',\n 'cloud-vps': 'https://my.caasify.com/cloud-vps',\n 'vpn': 'https://my.caasify.com/vpn',\n 'app': 'https://my.caasify.com/app',\n 'platform': 'https://my.caasify.com/platform',\n 's3': 'https://my.caasify.com/s3',\n 'serverless': 'https://my.caasify.com/functions',\n 'domain': 'https://my.caasify.com/domain',\n 'route53': 'https://my.caasify.com/route53',\n 'billing': 'https://my.caasify.com/billing',\n 'support': 'https://my.caasify.com/support',\n 'support-open-ticket': 'https://my.caasify.com/support/open-ticket',\n 'become-reseller': 'https://my.caasify.com/become-reseller',\n 'account-settings': 'https://my.caasify.com/profile',\n 'order-service': 'https://my.caasify.com/deploy',\n 'add-funds': 'https://my.caasify.com/add-funds',\n 'profile': 'https://my.caasify.com/profile',\n};\n\n/** Reverse lookup: URL path -> nav item `id`. */\nexport const caasifyPathToId: Record<string, string> = Object.fromEntries(\n Object.entries(caasifyRouteMap).map(([id, path]) => [path, id]),\n);\n\n// ─── Header CTA ──────────────────────────────────────────────\n\ninterface HeaderCTAConfig {\n label: string;\n icon: typeof ShoppingCart;\n route: string;\n}\n\n/** Create Order button configuration for the sidebar. */\nexport const caasifyHeaderCTA: HeaderCTAConfig = {\n label: 'Create Order',\n icon: ShoppingCart,\n route: 'https://my.caasify.com/deploy',\n} as const;\n\n// ─── Wallet defaults ─────────────────────────────────────────\n\n/** Default wallet currency symbol. */\nexport const CAASIFY_WALLET_CURRENCY = '€';\n\n// ─── Helper: resolve currentId from pathname ─────────────────\n\n/**\n * Resolves the active sidebar nav `id` from a URL pathname or full URL.\n * Uses exact match first, then longest-prefix match, fallback to 'dashboard'.\n */\nexport function resolveCurrentId(pathname: string): string {\n // Exact match (supports both full URLs and pathnames)\n if (caasifyPathToId[pathname]) return caasifyPathToId[pathname];\n\n // Try matching against just the pathname portion of full URLs\n const pathOnly = pathname.replace(/^https?:\\/\\/[^/]+/, '') || '/';\n for (const [id, url] of Object.entries(caasifyRouteMap)) {\n const urlPath = url.replace(/^https?:\\/\\/[^/]+/, '') || '/';\n if (urlPath === pathOnly) return id;\n }\n\n // Longest prefix match on pathname\n const matches = Object.entries(caasifyRouteMap)\n .map(([id, url]) => [id, url.replace(/^https?:\\/\\/[^/]+/, '') || '/'] as const)\n .filter(([, p]) => p !== '/' && pathOnly.startsWith(p))\n .sort((a, b) => b[1].length - a[1].length);\n\n return matches[0]?.[0] ?? 'dashboard';\n}\n\n// ─── All nav item IDs (useful for type narrowing) ────────────\n\nexport const CAASIFY_NAV_IDS = Object.keys(caasifyRouteMap) as ReadonlyArray<string>;"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/CaasifyShell.tsx","../src/routes.tsx"],"names":["jsx"],"mappings":"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","file":"chunk-ZUFFVPQA.js","sourcesContent":["/* ═══════════════════════════════════════════════════════════════\n @sdvf23rvfa43f/sidebar-header — CaasifyShell Component\n ═══════════════════════════════════════════════════════════════\n Pre-wired AppShell with Caasify navigation.\n Drop into any micro-project's root route:\n \n import { CaasifyShell } from '@sdvf23rvfa43f/sidebar-header';\n \n export default function Root() {\n return (\n <CaasifyShell\n isAuthenticated={true}\n user={{ name: 'Jane', email: 'jane@acme.io' }}\n walletBalance={124.50}\n onSignOut={() => auth.signOut()}\n >\n <Outlet />\n </CaasifyShell>\n );\n }\n ═══════════════════════════════════════════════════════════════ */\n\nimport { type ReactNode } from 'react';\nimport { useLocation, useNavigate } from 'react-router';\nimport { AppShell } from '@sdvf23rvfa43f/stealth-glass';\nimport type { SidebarUser, AppShellProps } from '@sdvf23rvfa43f/stealth-glass';\n\nimport {\n caasifyLogo,\n caasifyNavigation,\n caasifyRouteMap,\n caasifyHeaderCTA,\n resolveCurrentId,\n CAASIFY_WALLET_CURRENCY,\n} from './navigation';\nimport type { ContextualNav } from './navigation';\n\n// ─── Props ───────────────────────────────────────────────────\n\nexport interface CaasifyShellProps {\n children: ReactNode;\n\n /** Auth state */\n isAuthenticated: boolean;\n user?: SidebarUser;\n onSignOut?: () => void;\n\n /** Wallet balance (shown in sidebar). Omit to hide wallet widget. */\n walletBalance?: number;\n /** Wallet currency symbol. Default: '€' */\n walletCurrency?: string;\n /** Callback when \"Add Funds\" is clicked. Defaults to navigate('/billing'). */\n onAddFunds?: () => void;\n\n /** Override navigation sections (advanced). Default: Caasify canonical nav. */\n navigation?: AppShellProps['navigation'];\n /** Override route map (advanced). Default: caasifyRouteMap. */\n routeMap?: Record<string, string>;\n\n /** Extra AppShell props forwarded directly (headerLeftSlot, ambientColors, etc.) */\n headerLeftSlot?: AppShellProps['headerLeftSlot'];\n headerRightSlot?: AppShellProps['headerRightSlot'];\n ambientColors?: AppShellProps['ambientColors'];\n contentMaxWidth?: AppShellProps['contentMaxWidth'];\n isLoading?: AppShellProps['isLoading'];\n footerSlot?: AppShellProps['footerSlot'];\n\n /**\n * Contextual sidebar section resolver (Option B).\n * Called with the resolved canonical `currentId` on every render.\n * Return a `ContextualNav` to inject a dynamic section between Overview and Account,\n * or `null` to show the default 2-section layout.\n *\n * The resolver should be pure and cheap. Memoize with `useCallback` if needed.\n */\n contextualNav?: (currentId: string) => ContextualNav | null;\n}\n\n// ─── Component ───────────────────────────────────────────────\n\nexport function CaasifyShell({\n children,\n isAuthenticated,\n user,\n onSignOut,\n walletBalance,\n walletCurrency = CAASIFY_WALLET_CURRENCY,\n onAddFunds,\n navigation = caasifyNavigation,\n routeMap = caasifyRouteMap,\n headerLeftSlot,\n headerRightSlot,\n ambientColors,\n contentMaxWidth,\n isLoading,\n footerSlot,\n contextualNav,\n}: CaasifyShellProps) {\n const location = useLocation();\n const navigate = useNavigate();\n const currentId = resolveCurrentId(location.pathname);\n\n // ── Contextual section resolution ────────────────────────\n // Use consumer resolver if provided, otherwise no contextual nav\n const contextual = contextualNav ? contextualNav(currentId) : null;\n\n // Merge route maps: contextual entries layered on top of canonical\n const effectiveRouteMap = contextual\n ? { ...routeMap, ...contextual.routeMap }\n : routeMap;\n\n // Splice contextual section between Overview (idx 0) and Account (idx 1+)\n const effectiveNavigation = contextual\n ? navigation.length > 0\n ? [navigation[0], contextual.section, ...navigation.slice(1)]\n : [contextual.section]\n : navigation;\n\n // Resolve contextual active item via longest pathname prefix match\n // Priority: contextual item > canonical currentId\n // Scans both top-level items AND inline children\n let effectiveCurrentId = currentId;\n if (contextual) {\n let longestMatch = 0;\n const scanItem = (itemId: string) => {\n const path = effectiveRouteMap[itemId];\n if (\n path &&\n path !== '/' &&\n location.pathname.startsWith(path) &&\n path.length > longestMatch\n ) {\n longestMatch = path.length;\n effectiveCurrentId = itemId;\n }\n };\n for (const item of contextual.section.items) {\n scanItem(item.id);\n // Also scan inline children\n if (item.children) {\n for (const child of item.children) {\n scanItem(child.id);\n }\n }\n }\n }\n\n const handleNavigate = (id: string) => {\n const path = effectiveRouteMap[id];\n if (path) {\n // Check if it's an external URL (starts with http:// or https://)\n if (path.startsWith('http://') || path.startsWith('https://')) {\n window.location.href = path;\n } else {\n navigate(path);\n }\n }\n };\n\n const wallet = walletBalance !== undefined\n ? {\n balance: walletBalance,\n currency: walletCurrency,\n onAddFunds: onAddFunds ?? (() => navigate('/billing')),\n }\n : undefined;\n\n const ctaButton = {\n label: caasifyHeaderCTA.label,\n icon: caasifyHeaderCTA.icon,\n onClick: () => {\n const route = caasifyHeaderCTA.route;\n if (route.startsWith('http://') || route.startsWith('https://')) {\n window.location.href = route;\n } else {\n navigate(route);\n }\n },\n };\n\n return (\n <AppShell\n logo={caasifyLogo}\n navigation={effectiveNavigation}\n currentId={effectiveCurrentId}\n onNavigate={handleNavigate}\n isAuthenticated={isAuthenticated}\n user={user}\n onSignOut={onSignOut ?? (() => {})}\n wallet={wallet}\n ctaButton={ctaButton}\n headerLeftSlot={headerLeftSlot}\n headerRightSlot={headerRightSlot}\n ambientColors={ambientColors}\n contentMaxWidth={contentMaxWidth}\n isLoading={isLoading}\n footerSlot={footerSlot}\n >\n {children}\n </AppShell>\n );\n}","/* ═══════════════════════════════════════════════════════════════\n @sdvf23rvfa43f/sidebar-header — Route Definitions & Router Factory\n ═══════════════════════════════════════════════════════════════\n \n Two usage modes:\n \n A) Full router (zero-config):\n import { createCaasifyRouter } from '@sdvf23rvfa43f/sidebar-header/routes';\n const router = createCaasifyRouter();\n <RouterProvider router={router} />\n \n B) Route objects only (mix with your own routes):\n import { caasifyRoutes, caasifyChildRoutes } from '@sdvf23rvfa43f/sidebar-header/routes';\n const router = createBrowserRouter([\n ...caasifyRoutes,\n { path: '/my-custom', Component: MyPage },\n ]);\n \n ═══════════════════════════════════════════════════════════════ */\n\nimport type { ComponentType } from 'react';\nimport { createBrowserRouter, Outlet } from 'react-router';\nimport type { RouteObject } from 'react-router';\n\nimport { CaasifyShell } from './CaasifyShell';\nimport type { CaasifyShellProps } from './CaasifyShell';\n\n// Default placeholder pages\nimport {\n DashboardPage,\n ServersPage,\n VpnPage,\n ApplicationPage,\n PlatformPage,\n S3Page,\n FunctionsPage,\n DomainPage,\n DnsServicePage,\n BillingPage,\n SupportPage,\n OpenTicketPage,\n BecomeResellerPage,\n OrderServicePage,\n NotFoundPage,\n} from './pages';\n\n// ─── Route ID constants ──────────────────────────────────────\n\nexport const ROUTE_IDS = {\n ROOT: 'root',\n DASHBOARD: 'dashboard',\n SERVERS: 'cloud-vps',\n VPN: 'vpn',\n APPLICATION: 'app',\n PLATFORM: 'platform',\n S3: 's3',\n FUNCTIONS: 'serverless',\n DOMAIN: 'domain',\n DNS_SERVICE: 'route53',\n BILLING: 'billing',\n SUPPORT: 'support',\n OPEN_TICKET: 'support-open-ticket',\n BECOME_RESELLER: 'become-reseller',\n ORDER_SERVICE: 'order-service',\n NOT_FOUND: 'not-found',\n} as const;\n\n// ─── Route-to-component default map ──────────────────────────\n\n/** Default page component for each route. Override via `pageOverrides`. */\nexport const defaultPageMap: Record<string, ComponentType> = {\n [ROUTE_IDS.DASHBOARD]: DashboardPage,\n [ROUTE_IDS.SERVERS]: ServersPage,\n [ROUTE_IDS.VPN]: VpnPage,\n [ROUTE_IDS.APPLICATION]: ApplicationPage,\n [ROUTE_IDS.PLATFORM]: PlatformPage,\n [ROUTE_IDS.S3]: S3Page,\n [ROUTE_IDS.FUNCTIONS]: FunctionsPage,\n [ROUTE_IDS.DOMAIN]: DomainPage,\n [ROUTE_IDS.DNS_SERVICE]: DnsServicePage,\n [ROUTE_IDS.BILLING]: BillingPage,\n [ROUTE_IDS.SUPPORT]: SupportPage,\n [ROUTE_IDS.OPEN_TICKET]: OpenTicketPage,\n [ROUTE_IDS.BECOME_RESELLER]: BecomeResellerPage,\n [ROUTE_IDS.ORDER_SERVICE]: OrderServicePage,\n [ROUTE_IDS.NOT_FOUND]: NotFoundPage,\n};\n\n// ─── Child route definitions ─────────────────────────────────\n\n/**\n * Canonical child routes for the Caasify shell.\n * Each route uses a default placeholder page that can be overridden.\n */\nexport function buildChildRoutes(\n pageOverrides: Partial<Record<string, ComponentType>> = {},\n extraRoutes: RouteObject[] = [],\n): RouteObject[] {\n const page = (id: string): ComponentType =>\n pageOverrides[id] ?? defaultPageMap[id] ?? NotFoundPage;\n\n return [\n // ── Overview ───────────────────────────────────\n { id: ROUTE_IDS.DASHBOARD, index: true, Component: page(ROUTE_IDS.DASHBOARD) },\n { id: ROUTE_IDS.SERVERS, path: 'cloud-vps', Component: page(ROUTE_IDS.SERVERS) },\n { id: ROUTE_IDS.VPN, path: 'vpn', Component: page(ROUTE_IDS.VPN) },\n { id: ROUTE_IDS.S3, path: 's3', Component: page(ROUTE_IDS.S3) },\n { id: ROUTE_IDS.FUNCTIONS, path: 'serverless', Component: page(ROUTE_IDS.FUNCTIONS) },\n { id: ROUTE_IDS.DOMAIN, path: 'domain', Component: page(ROUTE_IDS.DOMAIN) },\n { id: ROUTE_IDS.DNS_SERVICE, path: 'route53', Component: page(ROUTE_IDS.DNS_SERVICE) },\n { id: ROUTE_IDS.APPLICATION, path: 'app', Component: page(ROUTE_IDS.APPLICATION) },\n { id: ROUTE_IDS.PLATFORM, path: 'platform', Component: page(ROUTE_IDS.PLATFORM) },\n\n // ── Account ───────────────────────────────────\n { id: ROUTE_IDS.BILLING, path: 'billing', Component: page(ROUTE_IDS.BILLING) },\n { id: ROUTE_IDS.SUPPORT, path: 'support', Component: page(ROUTE_IDS.SUPPORT) },\n { id: ROUTE_IDS.OPEN_TICKET, path: 'support/open-ticket', Component: page(ROUTE_IDS.OPEN_TICKET) },\n { id: ROUTE_IDS.BECOME_RESELLER, path: 'become-reseller', Component: page(ROUTE_IDS.BECOME_RESELLER) },\n\n // ── Header CTA ────────────────────────────────\n { id: ROUTE_IDS.ORDER_SERVICE, path: 'order-service', Component: page(ROUTE_IDS.ORDER_SERVICE) },\n\n // ── Extra routes from consumer ────────────────\n ...extraRoutes,\n\n // ── Catch-all 404 ─────────────────────────────\n { id: ROUTE_IDS.NOT_FOUND, path: '*', Component: page(ROUTE_IDS.NOT_FOUND) },\n ];\n}\n\n// ─── Root layout wrapper factory ─────────────────────────────\n\nfunction createRootComponent(shellProps: Partial<CaasifyShellProps>) {\n // `children` is managed internally (Outlet), `isAuthenticated` gets a safe default.\n // Everything else (navigation, routeMap, contextualNav, wallet*, header slots, etc.)\n // flows through `...rest` into CaasifyShell unchanged.\n const { children: _ignored, isAuthenticated, ...rest } = shellProps as CaasifyShellProps;\n\n return function CaasifyRoot() {\n return (\n <CaasifyShell {...rest} isAuthenticated={isAuthenticated ?? false}>\n <Outlet />\n </CaasifyShell>\n );\n };\n}\n\n// ─── Full route tree ─────────────────────────────────────────\n\nexport interface CaasifyRouterOptions {\n /** Props forwarded to CaasifyShell (auth, user, wallet, etc.) */\n shellProps?: Partial<CaasifyShellProps>;\n\n /** Override specific page components by route ID. */\n pageOverrides?: Partial<Record<string, ComponentType>>;\n\n /** Extra child routes appended inside the shell layout. */\n extraRoutes?: RouteObject[];\n\n /** Extra top-level routes added OUTSIDE the shell (e.g. /login). */\n topLevelRoutes?: RouteObject[];\n\n /** Custom root component. If provided, shellProps is ignored. */\n RootComponent?: ComponentType;\n}\n\n/**\n * Build the full Caasify route array (not yet a router).\n * Use this if you want to combine with your own `createBrowserRouter` call.\n */\nexport function buildCaasifyRoutes(options: CaasifyRouterOptions = {}): RouteObject[] {\n const {\n shellProps = {},\n pageOverrides = {},\n extraRoutes = [],\n topLevelRoutes = [],\n RootComponent,\n } = options;\n\n const Root = RootComponent ?? createRootComponent(shellProps);\n\n return [\n {\n id: ROUTE_IDS.ROOT,\n path: '/',\n Component: Root,\n children: buildChildRoutes(pageOverrides, extraRoutes),\n },\n ...topLevelRoutes,\n ];\n}\n\n/**\n * One-liner: creates a complete `BrowserRouter` with the Caasify shell + all routes.\n *\n * ```tsx\n * import { createCaasifyRouter } from '@sdvf23rvfa43f/sidebar-header/routes';\n * const router = createCaasifyRouter({ shellProps: { isAuthenticated: true } });\n * <RouterProvider router={router} />\n * ```\n */\nexport function createCaasifyRouter(options: CaasifyRouterOptions = {}) {\n return createBrowserRouter(buildCaasifyRoutes(options));\n}"]}