@sdvf23rvfa43f/sidebar-header 1.4.1 → 1.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-4N3SAFE2.js → chunk-V2I5K6HG.js} +2 -2
- package/dist/chunk-V2I5K6HG.js.map +1 -0
- package/dist/{chunk-24PWKBMA.js → chunk-ZUFFVPQA.js} +18 -5
- package/dist/chunk-ZUFFVPQA.js.map +1 -0
- package/dist/index.js +2 -2
- package/dist/navigation.d.ts +6 -5
- package/dist/navigation.js +1 -1
- package/dist/routes.js +2 -2
- package/package.json +1 -2
- package/dist/chunk-24PWKBMA.js.map +0 -1
- package/dist/chunk-4N3SAFE2.js.map +0 -1
|
@@ -72,5 +72,5 @@ function resolveCurrentId(pathname) {
|
|
|
72
72
|
var CAASIFY_NAV_IDS = Object.keys(caasifyRouteMap);
|
|
73
73
|
|
|
74
74
|
export { CAASIFY_NAV_IDS, CAASIFY_WALLET_CURRENCY, caasifyHeaderCTA, caasifyLogo, caasifyNavigation, caasifyPathToId, caasifyRouteMap, resolveCurrentId };
|
|
75
|
-
//# sourceMappingURL=chunk-
|
|
76
|
-
//# sourceMappingURL=chunk-
|
|
75
|
+
//# sourceMappingURL=chunk-V2I5K6HG.js.map
|
|
76
|
+
//# sourceMappingURL=chunk-V2I5K6HG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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,4 +1,4 @@
|
|
|
1
|
-
import { resolveCurrentId, caasifyRouteMap, caasifyNavigation, caasifyHeaderCTA, CAASIFY_WALLET_CURRENCY, caasifyLogo } from './chunk-
|
|
1
|
+
import { resolveCurrentId, caasifyRouteMap, caasifyNavigation, caasifyHeaderCTA, CAASIFY_WALLET_CURRENCY, caasifyLogo } from './chunk-V2I5K6HG.js';
|
|
2
2
|
import { NotFoundPage, OrderServicePage, BecomeResellerPage, OpenTicketPage, SupportPage, BillingPage, DnsServicePage, DomainPage, FunctionsPage, S3Page, PlatformPage, ApplicationPage, VpnPage, ServersPage, DashboardPage } from './chunk-JNP6BURZ.js';
|
|
3
3
|
import { useLocation, useNavigate, createBrowserRouter, Outlet } from 'react-router';
|
|
4
4
|
import { AppShell } from '@sdvf23rvfa43f/stealth-glass';
|
|
@@ -49,7 +49,13 @@ function CaasifyShell({
|
|
|
49
49
|
}
|
|
50
50
|
const handleNavigate = (id) => {
|
|
51
51
|
const path = effectiveRouteMap[id];
|
|
52
|
-
if (path)
|
|
52
|
+
if (path) {
|
|
53
|
+
if (path.startsWith("http://") || path.startsWith("https://")) {
|
|
54
|
+
window.location.href = path;
|
|
55
|
+
} else {
|
|
56
|
+
navigate(path);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
53
59
|
};
|
|
54
60
|
const wallet = walletBalance !== void 0 ? {
|
|
55
61
|
balance: walletBalance,
|
|
@@ -59,7 +65,14 @@ function CaasifyShell({
|
|
|
59
65
|
const ctaButton = {
|
|
60
66
|
label: caasifyHeaderCTA.label,
|
|
61
67
|
icon: caasifyHeaderCTA.icon,
|
|
62
|
-
onClick: () =>
|
|
68
|
+
onClick: () => {
|
|
69
|
+
const route = caasifyHeaderCTA.route;
|
|
70
|
+
if (route.startsWith("http://") || route.startsWith("https://")) {
|
|
71
|
+
window.location.href = route;
|
|
72
|
+
} else {
|
|
73
|
+
navigate(route);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
63
76
|
};
|
|
64
77
|
return /* @__PURE__ */ jsx(
|
|
65
78
|
AppShell,
|
|
@@ -175,5 +188,5 @@ function createCaasifyRouter(options = {}) {
|
|
|
175
188
|
}
|
|
176
189
|
|
|
177
190
|
export { CaasifyShell, ROUTE_IDS, buildCaasifyRoutes, buildChildRoutes, createCaasifyRouter, defaultPageMap };
|
|
178
|
-
//# sourceMappingURL=chunk-
|
|
179
|
-
//# sourceMappingURL=chunk-
|
|
191
|
+
//# sourceMappingURL=chunk-ZUFFVPQA.js.map
|
|
192
|
+
//# sourceMappingURL=chunk-ZUFFVPQA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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}"]}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { CaasifyShell, ROUTE_IDS, buildCaasifyRoutes, buildChildRoutes, createCaasifyRouter, defaultPageMap } from './chunk-
|
|
2
|
-
export { CAASIFY_NAV_IDS, CAASIFY_WALLET_CURRENCY, caasifyHeaderCTA, caasifyLogo, caasifyNavigation, caasifyPathToId, caasifyRouteMap, resolveCurrentId } from './chunk-
|
|
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
3
|
export { PlaceholderPage } from './chunk-JNP6BURZ.js';
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
package/dist/navigation.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ShoppingCart } from 'lucide-react';
|
|
2
2
|
import { SidebarNavSection, SidebarLogo } from '@sdvf23rvfa43f/stealth-glass';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -18,12 +18,13 @@ declare const caasifyNavigation: SidebarNavSection[];
|
|
|
18
18
|
declare const caasifyRouteMap: Record<string, string>;
|
|
19
19
|
/** Reverse lookup: URL path -> nav item `id`. */
|
|
20
20
|
declare const caasifyPathToId: Record<string, string>;
|
|
21
|
-
|
|
22
|
-
declare const caasifyHeaderCTA: {
|
|
21
|
+
interface HeaderCTAConfig {
|
|
23
22
|
label: string;
|
|
24
|
-
icon:
|
|
23
|
+
icon: typeof ShoppingCart;
|
|
25
24
|
route: string;
|
|
26
|
-
}
|
|
25
|
+
}
|
|
26
|
+
/** Create Order button configuration for the sidebar. */
|
|
27
|
+
declare const caasifyHeaderCTA: HeaderCTAConfig;
|
|
27
28
|
/** Default wallet currency symbol. */
|
|
28
29
|
declare const CAASIFY_WALLET_CURRENCY = "\u20AC";
|
|
29
30
|
/**
|
package/dist/navigation.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { CAASIFY_NAV_IDS, CAASIFY_WALLET_CURRENCY, caasifyHeaderCTA, caasifyLogo, caasifyNavigation, caasifyPathToId, caasifyRouteMap, resolveCurrentId } from './chunk-
|
|
1
|
+
export { CAASIFY_NAV_IDS, CAASIFY_WALLET_CURRENCY, caasifyHeaderCTA, caasifyLogo, caasifyNavigation, caasifyPathToId, caasifyRouteMap, resolveCurrentId } from './chunk-V2I5K6HG.js';
|
|
2
2
|
//# sourceMappingURL=navigation.js.map
|
|
3
3
|
//# sourceMappingURL=navigation.js.map
|
package/dist/routes.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { ROUTE_IDS, buildCaasifyRoutes, buildChildRoutes, createCaasifyRouter, defaultPageMap } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { ROUTE_IDS, buildCaasifyRoutes, buildChildRoutes, createCaasifyRouter, defaultPageMap } from './chunk-ZUFFVPQA.js';
|
|
2
|
+
import './chunk-V2I5K6HG.js';
|
|
3
3
|
import './chunk-JNP6BURZ.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
|
+
"version": "1.4.3",
|
|
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",
|
|
@@ -57,7 +57,6 @@
|
|
|
57
57
|
"@sdvf23rvfa43f/stealth-glass": ">=1.3.0"
|
|
58
58
|
},
|
|
59
59
|
"devDependencies": {
|
|
60
|
-
"@sdvf23rvfa43f/stealth-glass": "file:../theme",
|
|
61
60
|
"tsup": "^8.0.0",
|
|
62
61
|
"typescript": "^5.0.0",
|
|
63
62
|
"react": "^18.0.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/CaasifyShell.tsx","../src/routes.tsx"],"names":["jsx"],"mappings":"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","file":"chunk-24PWKBMA.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) navigate(path);\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: () => navigate(caasifyHeaderCTA.route),\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}"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/navigation.ts"],"names":[],"mappings":"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","file":"chunk-4N3SAFE2.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 { LucideIcon } 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\n/** Create Order button configuration for the sidebar. */\nexport const caasifyHeaderCTA: { label: string; icon: LucideIcon; route: string } = {\n label: 'Create Order',\n icon: ShoppingCart,\n route: 'https://my.caasify.com/deploy',\n};\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>;"]}
|