@pablo2410/shared-ui 0.9.3 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,10 @@
1
+ import {
2
+ platformUrl,
3
+ portalUrl
4
+ } from "./chunk-4QJMLQSH.js";
1
5
  import {
2
6
  readActiveEnterpriseCookie
3
- } from "./chunk-4ATPOBMZ.js";
7
+ } from "./chunk-ZLOUWBQN.js";
4
8
  import {
5
9
  Avatar,
6
10
  AvatarFallback,
@@ -90,8 +94,52 @@ function useSidebarResize(config) {
90
94
  // src/layout/DashboardLayout.tsx
91
95
  import { ArrowLeft, LogOut, PanelLeft, Settings } from "lucide-react";
92
96
 
97
+ // src/layout/CrossServiceNav.tsx
98
+ import {
99
+ ClipboardCheck,
100
+ Gauge,
101
+ LayoutGrid,
102
+ Target,
103
+ ExternalLink
104
+ } from "lucide-react";
105
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
106
+ var ICONS = {
107
+ Target,
108
+ LayoutGrid,
109
+ Gauge,
110
+ ClipboardCheck
111
+ };
112
+ function CrossServiceNav({
113
+ links,
114
+ label = "Services"
115
+ }) {
116
+ const { state } = useSidebar();
117
+ const isCollapsed = state === "collapsed";
118
+ if (links.length === 0) return null;
119
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
120
+ !isCollapsed && /* @__PURE__ */ jsx("div", { className: "px-4 pt-2", children: /* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-muted-foreground uppercase tracking-wider", children: label }) }),
121
+ /* @__PURE__ */ jsx(SidebarMenu, { className: "px-2 py-1", children: links.map((link) => {
122
+ const Icon = ICONS[link.icon] ?? ExternalLink;
123
+ return /* @__PURE__ */ jsx(SidebarMenuItem, { children: /* @__PURE__ */ jsxs(
124
+ SidebarMenuButton,
125
+ {
126
+ onClick: () => {
127
+ window.location.href = link.url;
128
+ },
129
+ tooltip: link.name,
130
+ className: "h-10 transition-all font-normal text-muted-foreground hover:text-foreground",
131
+ children: [
132
+ /* @__PURE__ */ jsx(Icon, { className: "h-4 w-4" }),
133
+ /* @__PURE__ */ jsx("span", { children: link.name })
134
+ ]
135
+ }
136
+ ) }, link.slug);
137
+ }) })
138
+ ] });
139
+ }
140
+
93
141
  // src/layout/HealthFooter.tsx
94
- import { jsx, jsxs } from "react/jsx-runtime";
142
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
95
143
  function formatBuildDate(iso) {
96
144
  if (!iso) return void 0;
97
145
  const d = new Date(iso);
@@ -117,39 +165,39 @@ function HealthFooter({
117
165
  buildDate ?? (typeof __BUILD_DATE__ !== "undefined" ? __BUILD_DATE__ : void 0)
118
166
  );
119
167
  const buildStamp = [version && `v${version}`, commit, builtAt].filter(Boolean).join(" \xB7 ");
120
- return /* @__PURE__ */ jsxs(
168
+ return /* @__PURE__ */ jsxs2(
121
169
  "div",
122
170
  {
123
171
  className: "fixed bottom-0 left-0 right-0 h-8 bg-zinc-900 border-t border-zinc-800 flex items-center px-4 gap-6 text-[11px] text-zinc-400 z-50 font-mono" + (className ? ` ${className}` : ""),
124
172
  style,
125
173
  "data-slot": "health-footer",
126
174
  children: [
127
- /* @__PURE__ */ jsxs("span", { children: [
175
+ /* @__PURE__ */ jsxs2("span", { children: [
128
176
  "role: ",
129
- /* @__PURE__ */ jsx("span", { className: "text-zinc-200", children: user?.role ?? "\u2013" })
177
+ /* @__PURE__ */ jsx2("span", { className: "text-zinc-200", children: user?.role ?? "\u2013" })
130
178
  ] }),
131
- /* @__PURE__ */ jsxs("span", { children: [
179
+ /* @__PURE__ */ jsxs2("span", { children: [
132
180
  "jwt.eid:",
133
181
  " ",
134
- /* @__PURE__ */ jsx("span", { className: "text-zinc-200", children: user?.enterpriseId ?? "null" })
182
+ /* @__PURE__ */ jsx2("span", { className: "text-zinc-200", children: user?.enterpriseId ?? "null" })
135
183
  ] }),
136
- /* @__PURE__ */ jsxs("span", { children: [
184
+ /* @__PURE__ */ jsxs2("span", { children: [
137
185
  "hierarchy.eid:",
138
186
  " ",
139
- /* @__PURE__ */ jsx("span", { className: "text-zinc-200", children: enterprise?.id ?? "\u2013" })
187
+ /* @__PURE__ */ jsx2("span", { className: "text-zinc-200", children: enterprise?.id ?? "\u2013" })
140
188
  ] }),
141
- /* @__PURE__ */ jsxs("span", { children: [
189
+ /* @__PURE__ */ jsxs2("span", { children: [
142
190
  "enterprise:",
143
191
  " ",
144
- /* @__PURE__ */ jsx("span", { className: "text-zinc-200", children: enterprise?.name ?? "\u2013" })
192
+ /* @__PURE__ */ jsx2("span", { className: "text-zinc-200", children: enterprise?.name ?? "\u2013" })
145
193
  ] }),
146
- /* @__PURE__ */ jsxs("span", { children: [
194
+ /* @__PURE__ */ jsxs2("span", { children: [
147
195
  "user: ",
148
- /* @__PURE__ */ jsx("span", { className: "text-zinc-200", children: user?.openId ?? "\u2013" })
196
+ /* @__PURE__ */ jsx2("span", { className: "text-zinc-200", children: user?.openId ?? "\u2013" })
149
197
  ] }),
150
- buildStamp && /* @__PURE__ */ jsxs("span", { className: "ml-auto text-zinc-500", title: "Deployed build (version \xB7 commit \xB7 build date UTC)", children: [
198
+ buildStamp && /* @__PURE__ */ jsxs2("span", { className: "ml-auto text-zinc-500", title: "Deployed build (version \xB7 commit \xB7 build date UTC)", children: [
151
199
  "build: ",
152
- /* @__PURE__ */ jsx("span", { className: "text-zinc-300", children: buildStamp })
200
+ /* @__PURE__ */ jsx2("span", { className: "text-zinc-300", children: buildStamp })
153
201
  ] })
154
202
  ]
155
203
  }
@@ -158,7 +206,7 @@ function HealthFooter({
158
206
 
159
207
  // src/layout/EnterpriseDebugLabel.tsx
160
208
  import { useEffect as useEffect2, useState as useState2 } from "react";
161
- import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
209
+ import { Fragment as Fragment2, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
162
210
  function EnterpriseDebugLabel({
163
211
  selectionEnterpriseId,
164
212
  cookieEnterpriseName,
@@ -179,7 +227,7 @@ function EnterpriseDebugLabel({
179
227
  const hasSelection = selectionEnterpriseId !== void 0 && selectionEnterpriseId !== null;
180
228
  const mismatch = hasSelection && cookieNum !== null && cookieNum !== selectionEnterpriseId;
181
229
  const noActive = cookieNum === null;
182
- return /* @__PURE__ */ jsxs2(
230
+ return /* @__PURE__ */ jsxs3(
183
231
  "div",
184
232
  {
185
233
  className: cn(
@@ -189,14 +237,14 @@ function EnterpriseDebugLabel({
189
237
  ),
190
238
  title: "TEMP DIAGNOSTIC: enterprise the loaded data is scoped to (cookie) vs. the UI hierarchy selection. Remove once subdomain data issue is fixed.",
191
239
  children: [
192
- /* @__PURE__ */ jsx2("span", { "aria-hidden": true, children: "\u{1F50D}" }),
193
- noActive ? /* @__PURE__ */ jsx2("span", { children: "no active enterprise (cookie unset)" }) : /* @__PURE__ */ jsxs2(Fragment, { children: [
194
- /* @__PURE__ */ jsxs2("span", { children: [
240
+ /* @__PURE__ */ jsx3("span", { "aria-hidden": true, children: "\u{1F50D}" }),
241
+ noActive ? /* @__PURE__ */ jsx3("span", { children: "no active enterprise (cookie unset)" }) : /* @__PURE__ */ jsxs3(Fragment2, { children: [
242
+ /* @__PURE__ */ jsxs3("span", { children: [
195
243
  "data ENT #",
196
244
  cookieNum,
197
245
  cookieEnterpriseName ? ` \xB7 ${cookieEnterpriseName}` : ""
198
246
  ] }),
199
- hasSelection && /* @__PURE__ */ jsxs2("span", { children: [
247
+ hasSelection && /* @__PURE__ */ jsxs3("span", { children: [
200
248
  mismatch ? " \u26A0 \u2260 sel #" : " \xB7 sel #",
201
249
  selectionEnterpriseId
202
250
  ] })
@@ -207,34 +255,34 @@ function EnterpriseDebugLabel({
207
255
  }
208
256
 
209
257
  // src/layout/DashboardLayout.tsx
210
- import { Fragment as Fragment2, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
211
- var DEFAULT_SERVICE_HUB_URL = "https://portal.oplytics.digital/app";
212
- var DEFAULT_USER_SETTINGS_URL = "https://portal.oplytics.digital/account";
258
+ import { Fragment as Fragment3, jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
259
+ var defaultServiceHubUrl = () => portalUrl("/app");
260
+ var defaultUserSettingsUrl = () => portalUrl("/account");
213
261
  function UserMenu({
214
262
  user,
215
263
  onLogout,
216
- userSettingsUrl = DEFAULT_USER_SETTINGS_URL,
264
+ userSettingsUrl = defaultUserSettingsUrl(),
217
265
  enterprise
218
266
  }) {
219
267
  const initials = (user.name || "U").split(" ").map((n) => n[0]).join("").toUpperCase().slice(0, 2);
220
- return /* @__PURE__ */ jsxs3(DropdownMenu, { children: [
221
- /* @__PURE__ */ jsx3(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs3("button", { className: "flex items-center gap-2 rounded-md px-2 py-1 hover:bg-[#1E2738] transition-colors outline-none focus-visible:ring-1 focus-visible:ring-[#8C34E9]", children: [
222
- /* @__PURE__ */ jsx3(Avatar, { className: "h-7 w-7 border border-[#2A2A3E]", children: /* @__PURE__ */ jsx3(AvatarFallback, { className: "text-[10px] font-medium bg-[#8C34E9]/20 text-[#C084FC]", children: initials }) }),
223
- /* @__PURE__ */ jsx3("span", { className: "hidden md:block text-xs text-[#E2E8F0] truncate max-w-[100px]", children: user.name || "User" })
268
+ return /* @__PURE__ */ jsxs4(DropdownMenu, { children: [
269
+ /* @__PURE__ */ jsx4(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs4("button", { className: "flex items-center gap-2 rounded-md px-2 py-1 hover:bg-[#1E2738] transition-colors outline-none focus-visible:ring-1 focus-visible:ring-[#8C34E9]", children: [
270
+ /* @__PURE__ */ jsx4(Avatar, { className: "h-7 w-7 border border-[#2A2A3E]", children: /* @__PURE__ */ jsx4(AvatarFallback, { className: "text-[10px] font-medium bg-[#8C34E9]/20 text-[#C084FC]", children: initials }) }),
271
+ /* @__PURE__ */ jsx4("span", { className: "hidden md:block text-xs text-[#E2E8F0] truncate max-w-[100px]", children: user.name || "User" })
224
272
  ] }) }),
225
- /* @__PURE__ */ jsxs3(DropdownMenuContent, { align: "end", className: "w-48 bg-[#0D1220] border-[#1E2738]", children: [
226
- /* @__PURE__ */ jsxs3("div", { className: "px-3 py-2 border-b border-[#1E2738]", children: [
227
- /* @__PURE__ */ jsx3("p", { className: "text-xs font-medium text-[#E2E8F0] truncate", children: user.name }),
228
- /* @__PURE__ */ jsx3("p", { className: "text-[10px] text-[#596475] truncate", children: user.role })
273
+ /* @__PURE__ */ jsxs4(DropdownMenuContent, { align: "end", className: "w-48 bg-[#0D1220] border-[#1E2738]", children: [
274
+ /* @__PURE__ */ jsxs4("div", { className: "px-3 py-2 border-b border-[#1E2738]", children: [
275
+ /* @__PURE__ */ jsx4("p", { className: "text-xs font-medium text-[#E2E8F0] truncate", children: user.name }),
276
+ /* @__PURE__ */ jsx4("p", { className: "text-[10px] text-[#596475] truncate", children: user.role })
229
277
  ] }),
230
- /* @__PURE__ */ jsx3("div", { className: "px-2 py-2 border-b border-[#1E2738]", children: /* @__PURE__ */ jsx3(
278
+ /* @__PURE__ */ jsx4("div", { className: "px-2 py-2 border-b border-[#1E2738]", children: /* @__PURE__ */ jsx4(
231
279
  EnterpriseDebugLabel,
232
280
  {
233
281
  selectionEnterpriseId: enterprise?.id ?? null,
234
282
  cookieEnterpriseName: enterprise?.name ?? null
235
283
  }
236
284
  ) }),
237
- /* @__PURE__ */ jsxs3(
285
+ /* @__PURE__ */ jsxs4(
238
286
  DropdownMenuItem,
239
287
  {
240
288
  onClick: () => {
@@ -242,19 +290,19 @@ function UserMenu({
242
290
  },
243
291
  className: "text-xs text-[#E2E8F0] hover:bg-[#1E2738] cursor-pointer focus:bg-[#1E2738]",
244
292
  children: [
245
- /* @__PURE__ */ jsx3(Settings, { className: "h-3.5 w-3.5 mr-2 text-[#8890A0]" }),
293
+ /* @__PURE__ */ jsx4(Settings, { className: "h-3.5 w-3.5 mr-2 text-[#8890A0]" }),
246
294
  "User Settings"
247
295
  ]
248
296
  }
249
297
  ),
250
- /* @__PURE__ */ jsx3(DropdownMenuSeparator, { className: "bg-[#1E2738]" }),
251
- /* @__PURE__ */ jsxs3(
298
+ /* @__PURE__ */ jsx4(DropdownMenuSeparator, { className: "bg-[#1E2738]" }),
299
+ /* @__PURE__ */ jsxs4(
252
300
  DropdownMenuItem,
253
301
  {
254
302
  onClick: () => onLogout?.(),
255
303
  className: "text-xs text-[#EF4444] hover:bg-[#EF4444]/10 cursor-pointer focus:bg-[#EF4444]/10 focus:text-[#EF4444]",
256
304
  children: [
257
- /* @__PURE__ */ jsx3(LogOut, { className: "h-3.5 w-3.5 mr-2" }),
305
+ /* @__PURE__ */ jsx4(LogOut, { className: "h-3.5 w-3.5 mr-2" }),
258
306
  "Sign Out"
259
307
  ]
260
308
  }
@@ -264,9 +312,9 @@ function UserMenu({
264
312
  }
265
313
  function EnterpriseBadge({ enterprise }) {
266
314
  if (!enterprise) return null;
267
- return /* @__PURE__ */ jsxs3("div", { className: "hidden lg:flex items-center gap-1.5 px-2 py-1 rounded-md bg-[#8C34E9]/10 border border-[#8C34E9]/20", children: [
268
- /* @__PURE__ */ jsx3("div", { className: "h-4 w-4 rounded-sm bg-[#8C34E9]/30 flex items-center justify-center", children: /* @__PURE__ */ jsx3("span", { className: "text-[8px] font-bold text-[#C084FC]", children: enterprise.name.charAt(0).toUpperCase() }) }),
269
- /* @__PURE__ */ jsx3("span", { className: "text-[10px] font-medium text-[#C084FC] truncate max-w-[80px]", children: enterprise.code || enterprise.name })
315
+ return /* @__PURE__ */ jsxs4("div", { className: "hidden lg:flex items-center gap-1.5 px-2 py-1 rounded-md bg-[#8C34E9]/10 border border-[#8C34E9]/20", children: [
316
+ /* @__PURE__ */ jsx4("div", { className: "h-4 w-4 rounded-sm bg-[#8C34E9]/30 flex items-center justify-center", children: /* @__PURE__ */ jsx4("span", { className: "text-[8px] font-bold text-[#C084FC]", children: enterprise.name.charAt(0).toUpperCase() }) }),
317
+ /* @__PURE__ */ jsx4("span", { className: "text-[10px] font-medium text-[#C084FC] truncate max-w-[80px]", children: enterprise.code || enterprise.name })
270
318
  ] });
271
319
  }
272
320
  function NavSection({
@@ -277,12 +325,12 @@ function NavSection({
277
325
  onNavigate
278
326
  }) {
279
327
  const label = section.title ?? section.label;
280
- return /* @__PURE__ */ jsxs3(Fragment2, { children: [
281
- label && /* @__PURE__ */ jsx3("div", { className: cn("px-4 py-2", marginTop && "mt-2"), children: !isCollapsed && /* @__PURE__ */ jsx3("span", { className: "text-xs font-medium text-muted-foreground uppercase tracking-wider", children: label }) }),
282
- /* @__PURE__ */ jsx3(SidebarMenu, { className: "px-2 py-1", children: section.items.map((item) => {
328
+ return /* @__PURE__ */ jsxs4(Fragment3, { children: [
329
+ label && /* @__PURE__ */ jsx4("div", { className: cn("px-4 py-2", marginTop && "mt-2"), children: !isCollapsed && /* @__PURE__ */ jsx4("span", { className: "text-xs font-medium text-muted-foreground uppercase tracking-wider", children: label }) }),
330
+ /* @__PURE__ */ jsx4(SidebarMenu, { className: "px-2 py-1", children: section.items.map((item) => {
283
331
  const active = resolveActive(item.path);
284
332
  const Icon = item.icon;
285
- return /* @__PURE__ */ jsx3(SidebarMenuItem, { children: /* @__PURE__ */ jsxs3(
333
+ return /* @__PURE__ */ jsx4(SidebarMenuItem, { children: /* @__PURE__ */ jsxs4(
286
334
  SidebarMenuButton,
287
335
  {
288
336
  isActive: active,
@@ -290,8 +338,8 @@ function NavSection({
290
338
  tooltip: item.label,
291
339
  className: "h-10 transition-all font-normal",
292
340
  children: [
293
- Icon && /* @__PURE__ */ jsx3(Icon, { className: cn("h-4 w-4", active && "text-primary") }),
294
- /* @__PURE__ */ jsx3("span", { children: item.label })
341
+ Icon && /* @__PURE__ */ jsx4(Icon, { className: cn("h-4 w-4", active && "text-primary") }),
342
+ /* @__PURE__ */ jsx4("span", { children: item.label })
295
343
  ]
296
344
  }
297
345
  ) }, item.path);
@@ -307,7 +355,8 @@ function DashboardShell({
307
355
  activePath,
308
356
  onNavigate,
309
357
  isActive,
310
- serviceHubUrl = DEFAULT_SERVICE_HUB_URL,
358
+ serviceHubUrl = defaultServiceHubUrl(),
359
+ crossServiceLinks,
311
360
  settingsPath,
312
361
  user,
313
362
  onLogout,
@@ -326,25 +375,25 @@ function DashboardShell({
326
375
  const isCollapsed = state === "collapsed";
327
376
  const navigate = onNavigate;
328
377
  const resolveActive = (path) => isActive ? isActive(path, activePath) : isMenuItemActive(path, activePath);
329
- return /* @__PURE__ */ jsxs3(Fragment2, { children: [
330
- /* @__PURE__ */ jsxs3(Sidebar, { collapsible: "icon", className: "border-r-0", children: [
331
- /* @__PURE__ */ jsx3(SidebarHeader, { className: "h-16 justify-center", children: /* @__PURE__ */ jsxs3("div", { className: "flex items-center gap-3 px-2 transition-all w-full", children: [
332
- /* @__PURE__ */ jsx3(
378
+ return /* @__PURE__ */ jsxs4(Fragment3, { children: [
379
+ /* @__PURE__ */ jsxs4(Sidebar, { collapsible: "icon", className: "border-r-0", children: [
380
+ /* @__PURE__ */ jsx4(SidebarHeader, { className: "h-16 justify-center", children: /* @__PURE__ */ jsxs4("div", { className: "flex items-center gap-3 px-2 transition-all w-full", children: [
381
+ /* @__PURE__ */ jsx4(
333
382
  "button",
334
383
  {
335
384
  onClick: toggleSidebar,
336
385
  className: "h-8 w-8 flex items-center justify-center hover:bg-accent rounded-lg transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-ring shrink-0",
337
386
  "aria-label": "Toggle navigation",
338
- children: /* @__PURE__ */ jsx3(PanelLeft, { className: "h-4 w-4 text-muted-foreground" })
387
+ children: /* @__PURE__ */ jsx4(PanelLeft, { className: "h-4 w-4 text-muted-foreground" })
339
388
  }
340
389
  ),
341
- !isCollapsed ? /* @__PURE__ */ jsxs3("div", { className: "flex items-center gap-2 min-w-0", children: [
342
- serviceIcon && /* @__PURE__ */ jsx3("span", { className: "text-[#8C34E9] shrink-0", children: serviceIcon }),
343
- /* @__PURE__ */ jsx3("span", { className: "font-semibold tracking-tight truncate", children: serviceName })
390
+ !isCollapsed ? /* @__PURE__ */ jsxs4("div", { className: "flex items-center gap-2 min-w-0", children: [
391
+ serviceIcon && /* @__PURE__ */ jsx4("span", { className: "text-[#8C34E9] shrink-0", children: serviceIcon }),
392
+ /* @__PURE__ */ jsx4("span", { className: "font-semibold tracking-tight truncate", children: serviceName })
344
393
  ] }) : null
345
394
  ] }) }),
346
- /* @__PURE__ */ jsxs3(SidebarContent, { className: "gap-0", children: [
347
- serviceHubUrl && /* @__PURE__ */ jsx3(SidebarMenu, { className: "px-2 pt-2 pb-1", children: /* @__PURE__ */ jsx3(SidebarMenuItem, { children: /* @__PURE__ */ jsxs3(
395
+ /* @__PURE__ */ jsxs4(SidebarContent, { className: "gap-0", children: [
396
+ serviceHubUrl && /* @__PURE__ */ jsx4(SidebarMenu, { className: "px-2 pt-2 pb-1", children: /* @__PURE__ */ jsx4(SidebarMenuItem, { children: /* @__PURE__ */ jsxs4(
348
397
  SidebarMenuButton,
349
398
  {
350
399
  onClick: () => {
@@ -353,12 +402,13 @@ function DashboardShell({
353
402
  tooltip: "Back to Service Hub",
354
403
  className: "h-10 transition-all font-normal text-muted-foreground hover:text-foreground",
355
404
  children: [
356
- /* @__PURE__ */ jsx3(ArrowLeft, { className: "h-4 w-4" }),
357
- /* @__PURE__ */ jsx3("span", { children: "Service Hub" })
405
+ /* @__PURE__ */ jsx4(ArrowLeft, { className: "h-4 w-4" }),
406
+ /* @__PURE__ */ jsx4("span", { children: "Service Hub" })
358
407
  ]
359
408
  }
360
409
  ) }) }),
361
- menuSections.map((section, i) => /* @__PURE__ */ jsx3(
410
+ /* @__PURE__ */ jsx4(CrossServiceNav, { links: crossServiceLinks ?? [] }),
411
+ menuSections.map((section, i) => /* @__PURE__ */ jsx4(
362
412
  NavSection,
363
413
  {
364
414
  section,
@@ -368,7 +418,7 @@ function DashboardShell({
368
418
  },
369
419
  section.title ?? section.label ?? `section-${i}`
370
420
  )),
371
- isAdmin && adminSections?.map((section, i) => /* @__PURE__ */ jsx3(
421
+ isAdmin && adminSections?.map((section, i) => /* @__PURE__ */ jsx4(
372
422
  NavSection,
373
423
  {
374
424
  section,
@@ -380,21 +430,21 @@ function DashboardShell({
380
430
  section.title ?? section.label ?? `admin-${i}`
381
431
  ))
382
432
  ] }),
383
- settingsPath && /* @__PURE__ */ jsx3(SidebarFooter, { className: "p-2", children: /* @__PURE__ */ jsx3(SidebarMenu, { children: /* @__PURE__ */ jsx3(SidebarMenuItem, { children: /* @__PURE__ */ jsxs3(
433
+ settingsPath && /* @__PURE__ */ jsx4(SidebarFooter, { className: "p-2", children: /* @__PURE__ */ jsx4(SidebarMenu, { children: /* @__PURE__ */ jsx4(SidebarMenuItem, { children: /* @__PURE__ */ jsxs4(
384
434
  SidebarMenuButton,
385
435
  {
386
436
  onClick: () => navigate(settingsPath),
387
437
  tooltip: "Settings",
388
438
  className: "h-10 transition-all font-normal text-muted-foreground hover:text-foreground",
389
439
  children: [
390
- /* @__PURE__ */ jsx3(Settings, { className: "h-4 w-4" }),
391
- /* @__PURE__ */ jsx3("span", { children: "Settings" })
440
+ /* @__PURE__ */ jsx4(Settings, { className: "h-4 w-4" }),
441
+ /* @__PURE__ */ jsx4("span", { children: "Settings" })
392
442
  ]
393
443
  }
394
444
  ) }) }) })
395
445
  ] }),
396
- /* @__PURE__ */ jsxs3(SidebarInset, { children: [
397
- /* @__PURE__ */ jsxs3(
446
+ /* @__PURE__ */ jsxs4(SidebarInset, { children: [
447
+ /* @__PURE__ */ jsxs4(
398
448
  "header",
399
449
  {
400
450
  className: cn(
@@ -404,16 +454,16 @@ function DashboardShell({
404
454
  "sticky top-0 z-40"
405
455
  ),
406
456
  children: [
407
- /* @__PURE__ */ jsxs3("div", { className: "flex items-center gap-2 min-w-0 flex-1", children: [
408
- /* @__PURE__ */ jsx3(SidebarTrigger, { className: "h-9 w-9 rounded-lg bg-background shrink-0 md:hidden" }),
409
- serviceIcon && /* @__PURE__ */ jsx3("span", { className: "text-[#8C34E9] shrink-0 hidden sm:block", children: serviceIcon }),
410
- hierarchyNavigator && /* @__PURE__ */ jsx3("div", { className: "min-w-0 overflow-x-auto scrollbar-none", children: hierarchyNavigator })
457
+ /* @__PURE__ */ jsxs4("div", { className: "flex items-center gap-2 min-w-0 flex-1", children: [
458
+ /* @__PURE__ */ jsx4(SidebarTrigger, { className: "h-9 w-9 rounded-lg bg-background shrink-0 md:hidden" }),
459
+ serviceIcon && /* @__PURE__ */ jsx4("span", { className: "text-[#8C34E9] shrink-0 hidden sm:block", children: serviceIcon }),
460
+ hierarchyNavigator && /* @__PURE__ */ jsx4("div", { className: "min-w-0 overflow-x-auto scrollbar-none", children: hierarchyNavigator })
411
461
  ] }),
412
- /* @__PURE__ */ jsxs3("div", { className: "flex items-center gap-2 shrink-0", children: [
462
+ /* @__PURE__ */ jsxs4("div", { className: "flex items-center gap-2 shrink-0", children: [
413
463
  reportingToolbar,
414
- /* @__PURE__ */ jsx3(EnterpriseBadge, { enterprise }),
415
- /* @__PURE__ */ jsx3("div", { className: "w-px h-6 bg-[#1E2738] hidden md:block" }),
416
- user && /* @__PURE__ */ jsx3(
464
+ /* @__PURE__ */ jsx4(EnterpriseBadge, { enterprise }),
465
+ /* @__PURE__ */ jsx4("div", { className: "w-px h-6 bg-[#1E2738] hidden md:block" }),
466
+ user && /* @__PURE__ */ jsx4(
417
467
  UserMenu,
418
468
  {
419
469
  user,
@@ -426,10 +476,10 @@ function DashboardShell({
426
476
  ]
427
477
  }
428
478
  ),
429
- /* @__PURE__ */ jsx3("main", { className: "flex-1 p-4 md:p-6 pb-14", children })
479
+ /* @__PURE__ */ jsx4("main", { className: "flex-1 p-4 md:p-6 pb-14", children })
430
480
  ] }),
431
481
  footer,
432
- showHealthFooter && user?.role === "platform_admin" && /* @__PURE__ */ jsx3(
482
+ showHealthFooter && user?.role === "platform_admin" && /* @__PURE__ */ jsx4(
433
483
  HealthFooter,
434
484
  {
435
485
  user,
@@ -443,13 +493,13 @@ function DashboardShell({
443
493
  }
444
494
  function DashboardLayout(props) {
445
495
  const isMobile = useIsMobile();
446
- return /* @__PURE__ */ jsx3(SidebarProvider, { defaultOpen: props.defaultOpen ?? !isMobile, children: /* @__PURE__ */ jsx3(DashboardShell, { ...props }) });
496
+ return /* @__PURE__ */ jsx4(SidebarProvider, { defaultOpen: props.defaultOpen ?? !isMobile, children: /* @__PURE__ */ jsx4(DashboardShell, { ...props }) });
447
497
  }
448
498
 
449
499
  // src/layout/DashboardLayoutSkeleton.tsx
450
- import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
500
+ import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
451
501
  function Skeleton({ className }) {
452
- return /* @__PURE__ */ jsx4(
502
+ return /* @__PURE__ */ jsx5(
453
503
  "div",
454
504
  {
455
505
  className: cn(
@@ -460,47 +510,47 @@ function Skeleton({ className }) {
460
510
  );
461
511
  }
462
512
  function DashboardLayoutSkeleton({ className }) {
463
- return /* @__PURE__ */ jsxs4("div", { className: cn("flex min-h-screen bg-[#0A0E1A]", className), children: [
464
- /* @__PURE__ */ jsxs4("div", { className: "w-[260px] border-r border-[#1E2738] bg-[#0D1220] p-4 space-y-6", children: [
465
- /* @__PURE__ */ jsxs4("div", { className: "flex items-center gap-3 px-2", children: [
466
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-8 w-8 rounded-md" }),
467
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-4 w-24" })
513
+ return /* @__PURE__ */ jsxs5("div", { className: cn("flex min-h-screen bg-[#0A0E1A]", className), children: [
514
+ /* @__PURE__ */ jsxs5("div", { className: "w-[260px] border-r border-[#1E2738] bg-[#0D1220] p-4 space-y-6", children: [
515
+ /* @__PURE__ */ jsxs5("div", { className: "flex items-center gap-3 px-2", children: [
516
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-8 w-8 rounded-md" }),
517
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-4 w-24" })
468
518
  ] }),
469
- /* @__PURE__ */ jsxs4("div", { className: "space-y-2 px-2", children: [
470
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-9 w-full rounded-lg" }),
471
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-9 w-full rounded-lg" }),
472
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-9 w-full rounded-lg" }),
473
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-9 w-full rounded-lg" })
519
+ /* @__PURE__ */ jsxs5("div", { className: "space-y-2 px-2", children: [
520
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-9 w-full rounded-lg" }),
521
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-9 w-full rounded-lg" }),
522
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-9 w-full rounded-lg" }),
523
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-9 w-full rounded-lg" })
474
524
  ] }),
475
- /* @__PURE__ */ jsxs4("div", { className: "px-2", children: [
476
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-3 w-16 mb-3" }),
477
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-9 w-full rounded-lg" }),
478
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-9 w-full rounded-lg mt-2" })
525
+ /* @__PURE__ */ jsxs5("div", { className: "px-2", children: [
526
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-3 w-16 mb-3" }),
527
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-9 w-full rounded-lg" }),
528
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-9 w-full rounded-lg mt-2" })
479
529
  ] }),
480
- /* @__PURE__ */ jsx4("div", { className: "absolute bottom-4 left-4 right-4", children: /* @__PURE__ */ jsxs4("div", { className: "flex items-center gap-3 px-1", children: [
481
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-8 w-8 rounded-full" }),
482
- /* @__PURE__ */ jsxs4("div", { className: "flex-1 space-y-2", children: [
483
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-3 w-20" }),
484
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-2 w-32" })
530
+ /* @__PURE__ */ jsx5("div", { className: "absolute bottom-4 left-4 right-4", children: /* @__PURE__ */ jsxs5("div", { className: "flex items-center gap-3 px-1", children: [
531
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-8 w-8 rounded-full" }),
532
+ /* @__PURE__ */ jsxs5("div", { className: "flex-1 space-y-2", children: [
533
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-3 w-20" }),
534
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-2 w-32" })
485
535
  ] })
486
536
  ] }) })
487
537
  ] }),
488
- /* @__PURE__ */ jsxs4("div", { className: "flex-1 p-6 space-y-4", children: [
489
- /* @__PURE__ */ jsxs4("div", { className: "flex items-center justify-between", children: [
490
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-8 w-48 rounded-lg" }),
491
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-9 w-24 rounded-lg" })
538
+ /* @__PURE__ */ jsxs5("div", { className: "flex-1 p-6 space-y-4", children: [
539
+ /* @__PURE__ */ jsxs5("div", { className: "flex items-center justify-between", children: [
540
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-8 w-48 rounded-lg" }),
541
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-9 w-24 rounded-lg" })
492
542
  ] }),
493
- /* @__PURE__ */ jsxs4("div", { className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4", children: [
494
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-24 rounded-xl" }),
495
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-24 rounded-xl" }),
496
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-24 rounded-xl" }),
497
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-24 rounded-xl" })
543
+ /* @__PURE__ */ jsxs5("div", { className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4", children: [
544
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-24 rounded-xl" }),
545
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-24 rounded-xl" }),
546
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-24 rounded-xl" }),
547
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-24 rounded-xl" })
498
548
  ] }),
499
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-64 rounded-xl" }),
500
- /* @__PURE__ */ jsxs4("div", { className: "space-y-2", children: [
501
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-10 w-full rounded-lg" }),
502
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-10 w-full rounded-lg" }),
503
- /* @__PURE__ */ jsx4(Skeleton, { className: "h-10 w-full rounded-lg" })
549
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-64 rounded-xl" }),
550
+ /* @__PURE__ */ jsxs5("div", { className: "space-y-2", children: [
551
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-10 w-full rounded-lg" }),
552
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-10 w-full rounded-lg" }),
553
+ /* @__PURE__ */ jsx5(Skeleton, { className: "h-10 w-full rounded-lg" })
504
554
  ] })
505
555
  ] })
506
556
  ] });
@@ -508,7 +558,7 @@ function DashboardLayoutSkeleton({ className }) {
508
558
 
509
559
  // src/layout/SharedPageHeader.tsx
510
560
  import { ChevronLeft } from "lucide-react";
511
- import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
561
+ import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
512
562
  function SharedPageHeader({
513
563
  title,
514
564
  subtitle,
@@ -521,7 +571,7 @@ function SharedPageHeader({
521
571
  className,
522
572
  children
523
573
  }) {
524
- return /* @__PURE__ */ jsxs5(
574
+ return /* @__PURE__ */ jsxs6(
525
575
  "div",
526
576
  {
527
577
  className: cn(
@@ -531,10 +581,10 @@ function SharedPageHeader({
531
581
  className
532
582
  ),
533
583
  children: [
534
- breadcrumbs && /* @__PURE__ */ jsx5("div", { className: cn("mb-2", compact && "mb-1"), children: breadcrumbs }),
535
- /* @__PURE__ */ jsxs5("div", { className: "flex items-center justify-between gap-4", children: [
536
- /* @__PURE__ */ jsxs5("div", { className: "flex items-center gap-3 min-w-0", children: [
537
- onBack && /* @__PURE__ */ jsx5(
584
+ breadcrumbs && /* @__PURE__ */ jsx6("div", { className: cn("mb-2", compact && "mb-1"), children: breadcrumbs }),
585
+ /* @__PURE__ */ jsxs6("div", { className: "flex items-center justify-between gap-4", children: [
586
+ /* @__PURE__ */ jsxs6("div", { className: "flex items-center gap-3 min-w-0", children: [
587
+ onBack && /* @__PURE__ */ jsx6(
538
588
  "button",
539
589
  {
540
590
  onClick: onBack,
@@ -545,12 +595,12 @@ function SharedPageHeader({
545
595
  "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[#8C34E9]"
546
596
  ),
547
597
  "aria-label": "Go back",
548
- children: /* @__PURE__ */ jsx5(ChevronLeft, { className: compact ? "h-4 w-4" : "h-5 w-5" })
598
+ children: /* @__PURE__ */ jsx6(ChevronLeft, { className: compact ? "h-4 w-4" : "h-5 w-5" })
549
599
  }
550
600
  ),
551
- icon && /* @__PURE__ */ jsx5("div", { className: "shrink-0 text-[#8C34E9]", children: icon }),
552
- /* @__PURE__ */ jsxs5("div", { className: "min-w-0", children: [
553
- /* @__PURE__ */ jsx5(
601
+ icon && /* @__PURE__ */ jsx6("div", { className: "shrink-0 text-[#8C34E9]", children: icon }),
602
+ /* @__PURE__ */ jsxs6("div", { className: "min-w-0", children: [
603
+ /* @__PURE__ */ jsx6(
554
604
  "h1",
555
605
  {
556
606
  className: cn(
@@ -561,7 +611,7 @@ function SharedPageHeader({
561
611
  children: title
562
612
  }
563
613
  ),
564
- subtitle && /* @__PURE__ */ jsx5(
614
+ subtitle && /* @__PURE__ */ jsx6(
565
615
  "p",
566
616
  {
567
617
  className: cn(
@@ -574,23 +624,23 @@ function SharedPageHeader({
574
624
  )
575
625
  ] })
576
626
  ] }),
577
- actions && /* @__PURE__ */ jsx5("div", { className: "shrink-0 flex items-center gap-2", children: actions })
627
+ actions && /* @__PURE__ */ jsx6("div", { className: "shrink-0 flex items-center gap-2", children: actions })
578
628
  ] }),
579
- children && /* @__PURE__ */ jsx5("div", { className: cn("mt-3", compact && "mt-2"), children })
629
+ children && /* @__PURE__ */ jsx6("div", { className: cn("mt-3", compact && "mt-2"), children })
580
630
  ]
581
631
  }
582
632
  );
583
633
  }
584
634
 
585
635
  // src/layout/SharedFooter.tsx
586
- import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
636
+ import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
587
637
  var FOOTER_SERVICES = [
588
- { name: "SQDCP", slug: "sqdcp", localRoute: "/services/sqdcp", externalUrl: "https://sqdcp.oplytics.digital" },
589
- { name: "OEE Manager", slug: "oee-manager", localRoute: "/services/oee-manager", externalUrl: "https://oee.oplytics.digital" },
590
- { name: "Policy Deployment", slug: "policy-deployment", localRoute: "/services/policy-deployment", externalUrl: "https://policy.oplytics.digital" },
591
- { name: "Action Manager", slug: "action-manager", localRoute: "/services/action-manager", externalUrl: "https://actions.oplytics.digital" },
638
+ { name: "SQDCP", slug: "sqdcp", localRoute: "/services/sqdcp", externalUrl: platformUrl("sqdcp") },
639
+ { name: "OEE Manager", slug: "oee-manager", localRoute: "/services/oee-manager", externalUrl: platformUrl("oeemanager") },
640
+ { name: "Policy Deployment", slug: "policy-deployment", localRoute: "/services/policy-deployment", externalUrl: platformUrl("policy") },
641
+ { name: "Action Manager", slug: "action-manager", localRoute: "/services/action-manager", externalUrl: platformUrl("actionmanager") },
592
642
  { name: "Safety Manager", slug: "safety-manager", localRoute: "/services/safety-manager" },
593
- { name: "Connect", slug: "connect", localRoute: "/services/connect", externalUrl: "https://connect.oplytics.digital" }
643
+ { name: "Connect", slug: "connect", localRoute: "/services/connect", externalUrl: platformUrl("connect") }
594
644
  ];
595
645
  function SharedFooter({
596
646
  services = FOOTER_SERVICES,
@@ -605,7 +655,7 @@ function SharedFooter({
605
655
  year
606
656
  }) {
607
657
  const currentYear = year ?? (/* @__PURE__ */ new Date()).getFullYear();
608
- return /* @__PURE__ */ jsx6(
658
+ return /* @__PURE__ */ jsx7(
609
659
  "footer",
610
660
  {
611
661
  className: cn(
@@ -614,25 +664,25 @@ function SharedFooter({
614
664
  "font-[Space_Grotesk,sans-serif]",
615
665
  className
616
666
  ),
617
- children: /* @__PURE__ */ jsxs6("div", { className: "max-w-7xl mx-auto px-6 py-10", children: [
618
- /* @__PURE__ */ jsxs6("div", { className: "grid grid-cols-1 md:grid-cols-4 gap-8 mb-8", children: [
619
- /* @__PURE__ */ jsxs6("div", { className: "md:col-span-1", children: [
620
- /* @__PURE__ */ jsxs6("div", { className: "flex items-center gap-2 mb-3", children: [
621
- /* @__PURE__ */ jsx6(
667
+ children: /* @__PURE__ */ jsxs7("div", { className: "max-w-7xl mx-auto px-6 py-10", children: [
668
+ /* @__PURE__ */ jsxs7("div", { className: "grid grid-cols-1 md:grid-cols-4 gap-8 mb-8", children: [
669
+ /* @__PURE__ */ jsxs7("div", { className: "md:col-span-1", children: [
670
+ /* @__PURE__ */ jsxs7("div", { className: "flex items-center gap-2 mb-3", children: [
671
+ /* @__PURE__ */ jsx7(
622
672
  "div",
623
673
  {
624
674
  className: "w-7 h-7 rounded-full flex items-center justify-center",
625
675
  style: { background: "#8C34E9" },
626
- children: /* @__PURE__ */ jsx6("span", { className: "text-white font-bold text-xs", children: "O" })
676
+ children: /* @__PURE__ */ jsx7("span", { className: "text-white font-bold text-xs", children: "O" })
627
677
  }
628
678
  ),
629
- /* @__PURE__ */ jsx6("span", { className: "text-[#E2E8F0] font-semibold text-sm font-[Montserrat,sans-serif]", children: "Oplytics.digital" })
679
+ /* @__PURE__ */ jsx7("span", { className: "text-[#E2E8F0] font-semibold text-sm font-[Montserrat,sans-serif]", children: "Oplytics.digital" })
630
680
  ] }),
631
- /* @__PURE__ */ jsx6("p", { className: "text-xs text-[#596475] leading-relaxed", children: "Operational intelligence platform for manufacturing excellence." })
681
+ /* @__PURE__ */ jsx7("p", { className: "text-xs text-[#596475] leading-relaxed", children: "Operational intelligence platform for manufacturing excellence." })
632
682
  ] }),
633
- /* @__PURE__ */ jsxs6("div", { children: [
634
- /* @__PURE__ */ jsx6("h4", { className: "text-[#E2E8F0] font-medium text-xs uppercase tracking-wider mb-3 font-[Montserrat,sans-serif]", children: "Services" }),
635
- /* @__PURE__ */ jsx6("ul", { className: "space-y-2", children: services.map((service) => /* @__PURE__ */ jsx6("li", { children: /* @__PURE__ */ jsx6(
683
+ /* @__PURE__ */ jsxs7("div", { children: [
684
+ /* @__PURE__ */ jsx7("h4", { className: "text-[#E2E8F0] font-medium text-xs uppercase tracking-wider mb-3 font-[Montserrat,sans-serif]", children: "Services" }),
685
+ /* @__PURE__ */ jsx7("ul", { className: "space-y-2", children: services.map((service) => /* @__PURE__ */ jsx7("li", { children: /* @__PURE__ */ jsx7(
636
686
  "a",
637
687
  {
638
688
  href: useExternalUrls && service.externalUrl ? service.externalUrl : service.localRoute,
@@ -642,10 +692,10 @@ function SharedFooter({
642
692
  }
643
693
  ) }, service.slug)) })
644
694
  ] }),
645
- /* @__PURE__ */ jsxs6("div", { children: [
646
- /* @__PURE__ */ jsx6("h4", { className: "text-[#E2E8F0] font-medium text-xs uppercase tracking-wider mb-3 font-[Montserrat,sans-serif]", children: "Company" }),
647
- /* @__PURE__ */ jsxs6("ul", { className: "space-y-2", children: [
648
- showPricing && /* @__PURE__ */ jsx6("li", { children: /* @__PURE__ */ jsx6(
695
+ /* @__PURE__ */ jsxs7("div", { children: [
696
+ /* @__PURE__ */ jsx7("h4", { className: "text-[#E2E8F0] font-medium text-xs uppercase tracking-wider mb-3 font-[Montserrat,sans-serif]", children: "Company" }),
697
+ /* @__PURE__ */ jsxs7("ul", { className: "space-y-2", children: [
698
+ showPricing && /* @__PURE__ */ jsx7("li", { children: /* @__PURE__ */ jsx7(
649
699
  "a",
650
700
  {
651
701
  href: "/pricing",
@@ -654,7 +704,7 @@ function SharedFooter({
654
704
  children: "Pricing"
655
705
  }
656
706
  ) }),
657
- /* @__PURE__ */ jsx6("li", { children: /* @__PURE__ */ jsx6(
707
+ /* @__PURE__ */ jsx7("li", { children: /* @__PURE__ */ jsx7(
658
708
  "a",
659
709
  {
660
710
  href: "/about",
@@ -662,7 +712,7 @@ function SharedFooter({
662
712
  children: "About"
663
713
  }
664
714
  ) }),
665
- /* @__PURE__ */ jsx6("li", { children: /* @__PURE__ */ jsx6(
715
+ /* @__PURE__ */ jsx7("li", { children: /* @__PURE__ */ jsx7(
666
716
  "a",
667
717
  {
668
718
  href: "/contact",
@@ -672,10 +722,10 @@ function SharedFooter({
672
722
  ) })
673
723
  ] })
674
724
  ] }),
675
- /* @__PURE__ */ jsxs6("div", { children: [
676
- /* @__PURE__ */ jsx6("h4", { className: "text-[#E2E8F0] font-medium text-xs uppercase tracking-wider mb-3 font-[Montserrat,sans-serif]", children: "Legal" }),
677
- /* @__PURE__ */ jsxs6("ul", { className: "space-y-2", children: [
678
- /* @__PURE__ */ jsx6("li", { children: /* @__PURE__ */ jsx6(
725
+ /* @__PURE__ */ jsxs7("div", { children: [
726
+ /* @__PURE__ */ jsx7("h4", { className: "text-[#E2E8F0] font-medium text-xs uppercase tracking-wider mb-3 font-[Montserrat,sans-serif]", children: "Legal" }),
727
+ /* @__PURE__ */ jsxs7("ul", { className: "space-y-2", children: [
728
+ /* @__PURE__ */ jsx7("li", { children: /* @__PURE__ */ jsx7(
679
729
  "a",
680
730
  {
681
731
  href: "/privacy",
@@ -683,7 +733,7 @@ function SharedFooter({
683
733
  children: "Privacy Policy"
684
734
  }
685
735
  ) }),
686
- /* @__PURE__ */ jsx6("li", { children: /* @__PURE__ */ jsx6(
736
+ /* @__PURE__ */ jsx7("li", { children: /* @__PURE__ */ jsx7(
687
737
  "a",
688
738
  {
689
739
  href: "/terms",
@@ -692,7 +742,7 @@ function SharedFooter({
692
742
  }
693
743
  ) })
694
744
  ] }),
695
- showSignIn && /* @__PURE__ */ jsx6("div", { className: "mt-4", children: /* @__PURE__ */ jsx6(
745
+ showSignIn && /* @__PURE__ */ jsx7("div", { className: "mt-4", children: /* @__PURE__ */ jsx7(
696
746
  "a",
697
747
  {
698
748
  href: "/login",
@@ -704,14 +754,14 @@ function SharedFooter({
704
754
  ] })
705
755
  ] }),
706
756
  children,
707
- /* @__PURE__ */ jsxs6("div", { className: "pt-6 border-t border-[#1E2738] flex flex-col sm:flex-row items-center justify-between gap-3", children: [
708
- /* @__PURE__ */ jsxs6("p", { className: "text-xs text-[#596475]", children: [
757
+ /* @__PURE__ */ jsxs7("div", { className: "pt-6 border-t border-[#1E2738] flex flex-col sm:flex-row items-center justify-between gap-3", children: [
758
+ /* @__PURE__ */ jsxs7("p", { className: "text-xs text-[#596475]", children: [
709
759
  "\xA9 ",
710
760
  currentYear,
711
761
  " Oplytics.digital. All rights reserved."
712
762
  ] }),
713
- /* @__PURE__ */ jsx6("p", { className: "text-xs text-[#3E4A5C]", children: "Built for manufacturing excellence" }),
714
- typeof __APP_VERSION__ !== "undefined" && /* @__PURE__ */ jsxs6("p", { className: "text-xs text-[#3E4A5C]", children: [
763
+ /* @__PURE__ */ jsx7("p", { className: "text-xs text-[#3E4A5C]", children: "Built for manufacturing excellence" }),
764
+ typeof __APP_VERSION__ !== "undefined" && /* @__PURE__ */ jsxs7("p", { className: "text-xs text-[#3E4A5C]", children: [
715
765
  "Platform v",
716
766
  __APP_VERSION__
717
767
  ] })
@@ -722,7 +772,7 @@ function SharedFooter({
722
772
  }
723
773
 
724
774
  // src/layout/ServiceFooter.tsx
725
- import { Fragment as Fragment3, jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
775
+ import { Fragment as Fragment4, jsx as jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
726
776
  function formatBuildDate2(iso) {
727
777
  if (!iso) return void 0;
728
778
  const d = new Date(iso);
@@ -758,7 +808,7 @@ function ServiceFooter({
758
808
  buildDate ?? (typeof __BUILD_DATE__ !== "undefined" ? __BUILD_DATE__ : void 0)
759
809
  );
760
810
  const buildStamp = [version && `v.${version}`, commit, builtAt].filter(Boolean).join(" \xB7 ");
761
- return /* @__PURE__ */ jsxs7(
811
+ return /* @__PURE__ */ jsxs8(
762
812
  "footer",
763
813
  {
764
814
  className: cn(
@@ -769,57 +819,57 @@ function ServiceFooter({
769
819
  className
770
820
  ),
771
821
  children: [
772
- /* @__PURE__ */ jsxs7("div", { className: "flex items-center gap-2 min-w-0", children: [
773
- /* @__PURE__ */ jsx7(
822
+ /* @__PURE__ */ jsxs8("div", { className: "flex items-center gap-2 min-w-0", children: [
823
+ /* @__PURE__ */ jsx8(
774
824
  "div",
775
825
  {
776
826
  className: "w-5 h-5 rounded-full flex items-center justify-center shrink-0",
777
827
  style: { background: "#8C34E9" },
778
- children: /* @__PURE__ */ jsx7("span", { className: "text-white font-bold", style: { fontSize: 9 }, children: "O" })
828
+ children: /* @__PURE__ */ jsx8("span", { className: "text-white font-bold", style: { fontSize: 9 }, children: "O" })
779
829
  }
780
830
  ),
781
- /* @__PURE__ */ jsx7("span", { className: "text-[10px] text-[#596475] whitespace-nowrap hidden sm:inline", children: "Operational Excellence. One Digital Platform." })
831
+ /* @__PURE__ */ jsx8("span", { className: "text-[10px] text-[#596475] whitespace-nowrap hidden sm:inline", children: "Operational Excellence. One Digital Platform." })
782
832
  ] }),
783
- showHealthMonitor && /* @__PURE__ */ jsxs7("div", { className: "flex items-center gap-1.5 text-[10px] text-[#3E4A5C] min-w-0 overflow-hidden", children: [
784
- enterpriseName && /* @__PURE__ */ jsxs7(Fragment3, { children: [
785
- /* @__PURE__ */ jsxs7("span", { className: "whitespace-nowrap", children: [
786
- /* @__PURE__ */ jsx7("span", { className: "text-[#596475]", children: enterpriseName }),
787
- enterpriseId != null && /* @__PURE__ */ jsxs7("span", { className: "text-[#3E4A5C]", children: [
833
+ showHealthMonitor && /* @__PURE__ */ jsxs8("div", { className: "flex items-center gap-1.5 text-[10px] text-[#3E4A5C] min-w-0 overflow-hidden", children: [
834
+ enterpriseName && /* @__PURE__ */ jsxs8(Fragment4, { children: [
835
+ /* @__PURE__ */ jsxs8("span", { className: "whitespace-nowrap", children: [
836
+ /* @__PURE__ */ jsx8("span", { className: "text-[#596475]", children: enterpriseName }),
837
+ enterpriseId != null && /* @__PURE__ */ jsxs8("span", { className: "text-[#3E4A5C]", children: [
788
838
  " (",
789
839
  enterpriseId,
790
840
  ")"
791
841
  ] })
792
842
  ] }),
793
- /* @__PURE__ */ jsx7(Separator, {})
843
+ /* @__PURE__ */ jsx8(Separator, {})
794
844
  ] }),
795
- userEmail && /* @__PURE__ */ jsxs7(Fragment3, { children: [
796
- /* @__PURE__ */ jsx7("span", { className: "whitespace-nowrap text-[#596475]", children: userEmail }),
797
- userRole && /* @__PURE__ */ jsxs7("span", { className: "text-[#3E4A5C]", children: [
845
+ userEmail && /* @__PURE__ */ jsxs8(Fragment4, { children: [
846
+ /* @__PURE__ */ jsx8("span", { className: "whitespace-nowrap text-[#596475]", children: userEmail }),
847
+ userRole && /* @__PURE__ */ jsxs8("span", { className: "text-[#3E4A5C]", children: [
798
848
  " (",
799
849
  userRole,
800
850
  ")"
801
851
  ] }),
802
- /* @__PURE__ */ jsx7(Separator, {})
852
+ /* @__PURE__ */ jsx8(Separator, {})
803
853
  ] }),
804
- env && /* @__PURE__ */ jsxs7(Fragment3, { children: [
805
- /* @__PURE__ */ jsxs7("span", { className: "whitespace-nowrap", children: [
854
+ env && /* @__PURE__ */ jsxs8(Fragment4, { children: [
855
+ /* @__PURE__ */ jsxs8("span", { className: "whitespace-nowrap", children: [
806
856
  "ENV:",
807
857
  " ",
808
- /* @__PURE__ */ jsx7("span", { style: { color: env.color }, className: "font-semibold", children: env.label })
858
+ /* @__PURE__ */ jsx8("span", { style: { color: env.color }, className: "font-semibold", children: env.label })
809
859
  ] }),
810
- /* @__PURE__ */ jsx7(Separator, {})
860
+ /* @__PURE__ */ jsx8(Separator, {})
811
861
  ] }),
812
- buildStamp && /* @__PURE__ */ jsx7("span", { className: "whitespace-nowrap text-[#3E4A5C] font-mono", title: "Deployed build", children: buildStamp })
862
+ buildStamp && /* @__PURE__ */ jsx8("span", { className: "whitespace-nowrap text-[#3E4A5C] font-mono", title: "Deployed build", children: buildStamp })
813
863
  ] }),
814
- /* @__PURE__ */ jsxs7("div", { className: "flex items-center gap-2 text-[10px] text-[#3E4A5C] whitespace-nowrap shrink-0", children: [
815
- /* @__PURE__ */ jsxs7("span", { children: [
864
+ /* @__PURE__ */ jsxs8("div", { className: "flex items-center gap-2 text-[10px] text-[#3E4A5C] whitespace-nowrap shrink-0", children: [
865
+ /* @__PURE__ */ jsxs8("span", { children: [
816
866
  "\xA9 ",
817
867
  currentYear,
818
868
  " Oplytics.digital"
819
869
  ] }),
820
- !showHealthMonitor && buildStamp && /* @__PURE__ */ jsxs7(Fragment3, { children: [
821
- /* @__PURE__ */ jsx7(Separator, {}),
822
- /* @__PURE__ */ jsx7("span", { className: "font-mono", title: "Deployed build", children: buildStamp })
870
+ !showHealthMonitor && buildStamp && /* @__PURE__ */ jsxs8(Fragment4, { children: [
871
+ /* @__PURE__ */ jsx8(Separator, {}),
872
+ /* @__PURE__ */ jsx8("span", { className: "font-mono", title: "Deployed build", children: buildStamp })
823
873
  ] })
824
874
  ] })
825
875
  ]
@@ -827,7 +877,7 @@ function ServiceFooter({
827
877
  );
828
878
  }
829
879
  function Separator() {
830
- return /* @__PURE__ */ jsx7("span", { className: "text-[#1E2738] select-none", "aria-hidden": true, children: "|" });
880
+ return /* @__PURE__ */ jsx8("span", { className: "text-[#1E2738] select-none", "aria-hidden": true, children: "|" });
831
881
  }
832
882
 
833
883
  // src/layout/createServiceLayout.tsx
@@ -887,7 +937,7 @@ var oeeManagerConfig = {
887
937
  ],
888
938
  backLink: {
889
939
  label: "Back to Portal",
890
- path: "https://portal.oplytics.digital"
940
+ path: portalUrl()
891
941
  },
892
942
  showPageHeader: true,
893
943
  showReportingToolbar: true,
@@ -995,6 +1045,7 @@ export {
995
1045
  getInitials,
996
1046
  isMenuItemActive,
997
1047
  useSidebarResize,
1048
+ CrossServiceNav,
998
1049
  HealthFooter,
999
1050
  EnterpriseDebugLabel,
1000
1051
  DashboardLayout,
@@ -1011,4 +1062,4 @@ export {
1011
1062
  policyDeploymentConfig,
1012
1063
  SERVICE_CONFIGS
1013
1064
  };
1014
- //# sourceMappingURL=chunk-QAQ4SQBH.js.map
1065
+ //# sourceMappingURL=chunk-HWXEAHLJ.js.map