@object-ui/layout 4.0.10 → 4.0.12

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/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @object-ui/layout
2
2
 
3
+ ## 4.0.12
4
+
5
+ ### Patch Changes
6
+
7
+ - @object-ui/types@4.0.12
8
+ - @object-ui/core@4.0.12
9
+ - @object-ui/react@4.0.12
10
+ - @object-ui/components@4.0.12
11
+
12
+ ## 4.0.11
13
+
14
+ ### Patch Changes
15
+
16
+ - @object-ui/components@4.0.11
17
+ - @object-ui/react@4.0.11
18
+ - @object-ui/types@4.0.11
19
+ - @object-ui/core@4.0.11
20
+
3
21
  ## 4.0.10
4
22
 
5
23
  ### Patch Changes
package/dist/index.js CHANGED
@@ -3,14 +3,14 @@ import t, { useEffect as n, useMemo as r, useState as i } from "react";
3
3
  import { Badge as a, Collapsible as o, CollapsibleContent as s, CollapsibleTrigger as c, Input as l, Separator as u, Sidebar as d, SidebarContent as f, SidebarFooter as p, SidebarGroup as m, SidebarGroupContent as h, SidebarGroupLabel as g, SidebarHeader as _, SidebarInput as v, SidebarInset as y, SidebarMenu as b, SidebarMenuAction as x, SidebarMenuButton as S, SidebarMenuItem as C, SidebarMenuSub as w, SidebarMenuSubButton as T, SidebarMenuSubItem as E, SidebarProvider as D, cn as O, getLazyIcon as k } from "@object-ui/components";
4
4
  import { Fragment as A, jsx as j, jsxs as M } from "react/jsx-runtime";
5
5
  import { Link as N, NavLink as P, useLocation as F } from "react-router-dom";
6
- import { ChevronRight as I, FileText as L, GripVertical as R, Layers as z, Pin as B, PinOff as V, Search as H, Star as ee } from "lucide-react";
7
- import { DndContext as te, KeyboardSensor as ne, PointerSensor as re, closestCenter as ie, useSensor as U, useSensors as ae } from "@dnd-kit/core";
8
- import { SortableContext as oe, arrayMove as se, useSortable as ce, verticalListSortingStrategy as le } from "@dnd-kit/sortable";
9
- import { CSS as ue } from "@dnd-kit/utilities";
10
- import { menuItemToNavigationItem as de } from "@object-ui/types";
11
- import { SchemaRenderer as fe } from "@object-ui/react";
6
+ import { ChevronRight as I, FileText as ee, GripVertical as te, Layers as L, Pin as R, PinOff as ne, Search as re, Star as ie } from "lucide-react";
7
+ import { DndContext as z, KeyboardSensor as B, PointerSensor as ae, closestCenter as oe, useSensor as V, useSensors as se } from "@dnd-kit/core";
8
+ import { SortableContext as ce, arrayMove as le, useSortable as ue, verticalListSortingStrategy as de } from "@dnd-kit/sortable";
9
+ import { CSS as fe } from "@dnd-kit/utilities";
10
+ import { menuItemToNavigationItem as pe } from "@object-ui/types";
11
+ import { SchemaRenderer as me } from "@object-ui/react";
12
12
  //#region src/PageHeader.tsx
13
- function W({ title: e, description: t, action: n, className: r, children: i, ...a }) {
13
+ function H({ title: e, description: t, action: n, className: r, children: i, ...a }) {
14
14
  return /* @__PURE__ */ j("div", {
15
15
  className: O("flex flex-col gap-4 pb-4 md:pb-8", r),
16
16
  ...a,
@@ -34,7 +34,7 @@ function W({ title: e, description: t, action: n, className: r, children: i, ...
34
34
  }
35
35
  //#endregion
36
36
  //#region src/AppShell.tsx
37
- function G(e) {
37
+ function U(e) {
38
38
  let t = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);
39
39
  if (!t) return null;
40
40
  let n = parseInt(t[1], 16) / 255, r = parseInt(t[2], 16) / 255, i = parseInt(t[3], 16) / 255, a = Math.max(n, r, i), o = Math.min(n, r, i), s = 0, c = 0, l = (a + o) / 2;
@@ -58,17 +58,17 @@ function G(e) {
58
58
  l: l * 100
59
59
  };
60
60
  }
61
- function K(e) {
62
- let t = G(e);
61
+ function W(e) {
62
+ let t = U(e);
63
63
  return t ? `${Math.round(t.h)} ${Math.round(t.s)}% ${Math.round(t.l)}%` : null;
64
64
  }
65
- function q(e) {
66
- let t = G(e);
65
+ function G(e) {
66
+ let t = U(e);
67
67
  if (!t) return null;
68
68
  let n = Math.max(t.l, 65), r = t.s > 80 ? Math.max(t.s - 10, 70) : t.s;
69
69
  return `${Math.round(t.h)} ${Math.round(r)}% ${Math.round(n)}%`;
70
70
  }
71
- function pe(e) {
71
+ function K(e) {
72
72
  let t = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);
73
73
  if (!t) return "0 0% 100%";
74
74
  let n = (e) => {
@@ -77,16 +77,16 @@ function pe(e) {
77
77
  }, r = n(parseInt(t[1], 16)), i = n(parseInt(t[2], 16)), a = n(parseInt(t[3], 16));
78
78
  return .2126 * r + .7152 * i + .0722 * a > .6 ? "222 47% 11%" : "0 0% 100%";
79
79
  }
80
- function me(e, t) {
80
+ function q(e, t) {
81
81
  n(() => {
82
82
  let n = document.documentElement, r = () => n.classList.contains("dark"), i = () => {
83
83
  if (e?.primaryColor) {
84
- let t = K(e.primaryColor), i = q(e.primaryColor), a = r() && i || t;
85
- a && (n.style.setProperty("--brand-primary", e.primaryColor), n.style.setProperty("--brand-primary-hsl", t || a), n.style.setProperty("--primary", a), n.style.setProperty("--primary-foreground", r() ? "222 47% 11%" : pe(e.primaryColor)), n.style.setProperty("--ring", a), n.style.setProperty("--sidebar-primary", a), n.style.setProperty("--sidebar-ring", a));
84
+ let t = W(e.primaryColor), i = G(e.primaryColor), a = r() && i || t;
85
+ a && (n.style.setProperty("--brand-primary", e.primaryColor), n.style.setProperty("--brand-primary-hsl", t || a), n.style.setProperty("--primary", a), n.style.setProperty("--primary-foreground", r() ? "222 47% 11%" : K(e.primaryColor)), n.style.setProperty("--ring", a), n.style.setProperty("--sidebar-primary", a), n.style.setProperty("--sidebar-ring", a));
86
86
  } else n.style.removeProperty("--brand-primary"), n.style.removeProperty("--brand-primary-hsl"), n.style.removeProperty("--primary"), n.style.removeProperty("--primary-foreground"), n.style.removeProperty("--ring"), n.style.removeProperty("--sidebar-primary"), n.style.removeProperty("--sidebar-ring");
87
87
  if (e?.accentColor) {
88
- let t = K(e.accentColor), i = q(e.accentColor), a = r() && i || t;
89
- a && (n.style.setProperty("--brand-accent", e.accentColor), n.style.setProperty("--brand-accent-hsl", t || a), n.style.setProperty("--accent", a), n.style.setProperty("--accent-foreground", r() ? "222 47% 11%" : pe(e.accentColor)));
88
+ let t = W(e.accentColor), i = G(e.accentColor), a = r() && i || t;
89
+ a && (n.style.setProperty("--brand-accent", e.accentColor), n.style.setProperty("--brand-accent-hsl", t || a), n.style.setProperty("--accent", a), n.style.setProperty("--accent-foreground", r() ? "222 47% 11%" : K(e.accentColor)));
90
90
  } else n.style.removeProperty("--brand-accent"), n.style.removeProperty("--brand-accent-hsl"), n.style.removeProperty("--accent"), n.style.removeProperty("--accent-foreground");
91
91
  };
92
92
  i();
@@ -114,7 +114,7 @@ function me(e, t) {
114
114
  ]);
115
115
  }
116
116
  function J({ sidebar: e, navbar: t, children: n, className: r, defaultOpen: i = !0, branding: a }) {
117
- return me(a, a?.title), /* @__PURE__ */ M(D, {
117
+ return q(a, a?.title), /* @__PURE__ */ M(D, {
118
118
  defaultOpen: i,
119
119
  className: "!flex-col",
120
120
  children: [/* @__PURE__ */ j("header", {
@@ -125,7 +125,7 @@ function J({ sidebar: e, navbar: t, children: n, className: r, defaultOpen: i =
125
125
  children: [e, /* @__PURE__ */ j(y, {
126
126
  className: "min-w-0",
127
127
  children: /* @__PURE__ */ j("main", {
128
- className: O("flex-1 min-w-0 overflow-auto p-3 sm:p-4 md:p-6", r),
128
+ className: O("flex-1 min-w-0 overflow-auto p-3 sm:p-4 md:p-6 pb-20 sm:pb-4 md:pb-6", r),
129
129
  children: n
130
130
  })
131
131
  })]
@@ -224,7 +224,7 @@ var ve = {
224
224
  //#endregion
225
225
  //#region src/NavigationRenderer.tsx
226
226
  function Y(e) {
227
- return e ? k(e) : L;
227
+ return e ? k(e) : ee;
228
228
  }
229
229
  function X(e, t) {
230
230
  if (typeof e == "string") return e;
@@ -241,8 +241,8 @@ function be(e, t, n, r, i) {
241
241
  let a = X(e.label, n);
242
242
  return typeof e.label == "string" ? t && e.type === "object" && e.objectName ? t(e.objectName, a) : r && e.type === "dashboard" && e.dashboardName ? r(e.dashboardName, a) : i && e.type === "group" && e.id ? i(e.id, a) : a : a;
243
243
  }
244
- var xe = (e) => !(e === !1 || e === "false"), Se = () => !0;
245
- function Ce(e, t) {
244
+ var xe = (e) => !(e === !1 || e === "false"), Se = () => !0, Ce = () => !0;
245
+ function we(e, t) {
246
246
  switch (e.type) {
247
247
  case "object": {
248
248
  let n = `${t}/${e.objectName ?? ""}`;
@@ -288,79 +288,83 @@ function Z(e, t) {
288
288
  return X(r.label).toLowerCase().includes(n) && e.push(r), e;
289
289
  }, []);
290
290
  }
291
- var we = 5;
292
- function Te({ item: e, basePath: t, evalVis: n, checkPerm: r, onAction: i, enablePinning: a, onPinToggle: o, enableReorder: s, resolveObjectLabel: c, resolveDashboardLabel: l, resolveGroupLabel: u, t: d }) {
293
- let { attributes: f, listeners: p, setNodeRef: m, transform: h, transition: g, isDragging: _ } = ce({
291
+ var Te = 5;
292
+ function Ee({ item: e, basePath: t, evalVis: n, checkPerm: r, checkCap: i, onAction: a, enablePinning: o, onPinToggle: s, enableReorder: c, resolveObjectLabel: l, resolveDashboardLabel: u, resolveGroupLabel: d, t: f }) {
293
+ let { attributes: p, listeners: m, setNodeRef: h, transform: g, transition: _, isDragging: v } = ue({
294
294
  id: e.id,
295
- disabled: !s
295
+ disabled: !c
296
296
  });
297
297
  return /* @__PURE__ */ j("div", {
298
- ref: m,
298
+ ref: h,
299
299
  style: {
300
- transform: ue.Transform.toString(h),
301
- transition: g,
302
- opacity: _ ? .5 : void 0,
303
- zIndex: _ ? 10 : void 0
300
+ transform: fe.Transform.toString(g),
301
+ transition: _,
302
+ opacity: v ? .5 : void 0,
303
+ zIndex: v ? 10 : void 0
304
304
  },
305
- ...f,
305
+ ...p,
306
306
  children: /* @__PURE__ */ j(Q, {
307
307
  item: e,
308
308
  basePath: t,
309
309
  evalVis: n,
310
310
  checkPerm: r,
311
- onAction: i,
312
- enablePinning: a,
313
- onPinToggle: o,
314
- dragListeners: s ? p : void 0,
315
- resolveObjectLabel: c,
316
- resolveDashboardLabel: l,
317
- resolveGroupLabel: u,
318
- t: d
311
+ checkCap: i,
312
+ onAction: a,
313
+ enablePinning: o,
314
+ onPinToggle: s,
315
+ dragListeners: c ? m : void 0,
316
+ resolveObjectLabel: l,
317
+ resolveDashboardLabel: u,
318
+ resolveGroupLabel: d,
319
+ t: f
319
320
  })
320
321
  });
321
322
  }
322
- function Q({ item: e, basePath: t, evalVis: n, checkPerm: r, onAction: l, enablePinning: d, onPinToggle: f, dragListeners: p, resolveObjectLabel: _, resolveDashboardLabel: v, resolveGroupLabel: y, t: w }) {
323
- let T = F(), [E, D] = i(e.defaultOpen !== !1);
323
+ function Q({ item: e, basePath: t, evalVis: n, checkPerm: r, checkCap: l, onAction: d, enablePinning: f, onPinToggle: p, dragListeners: _, resolveObjectLabel: v, resolveDashboardLabel: y, resolveGroupLabel: w, t: T }) {
324
+ let E = F(), [D, O] = i(e.defaultOpen !== !1);
324
325
  if (!n(e.visible) || e.requiredPermissions?.length && !r(e.requiredPermissions)) return null;
326
+ let k = e.requiresObject, P = e.requiresService;
327
+ if (k && !l("object", k) || P && !l("service", P)) return null;
325
328
  if (e.type === "separator") return /* @__PURE__ */ j(u, { className: "my-2" });
326
329
  if (e.type === "group") {
327
330
  let i = (e.children ?? []).slice().sort((e, t) => (e.order ?? 0) - (t.order ?? 0));
328
331
  return /* @__PURE__ */ j(o, {
329
- open: E,
330
- onOpenChange: D,
332
+ open: D,
333
+ onOpenChange: O,
331
334
  children: /* @__PURE__ */ M(m, { children: [/* @__PURE__ */ j(g, {
332
335
  asChild: !0,
333
336
  children: /* @__PURE__ */ M(c, {
334
337
  className: "flex w-full items-center justify-between",
335
- children: [be(e, _, w, v, y), /* @__PURE__ */ j(I, { className: `ml-auto h-4 w-4 transition-transform ${E ? "rotate-90" : ""}` })]
338
+ children: [be(e, v, T, y, w), /* @__PURE__ */ j(I, { className: `ml-auto h-4 w-4 transition-transform ${D ? "rotate-90" : ""}` })]
336
339
  })
337
340
  }), /* @__PURE__ */ j(s, { children: /* @__PURE__ */ j(h, { children: /* @__PURE__ */ j(b, { children: i.map((e) => /* @__PURE__ */ j(Q, {
338
341
  item: e,
339
342
  basePath: t,
340
343
  evalVis: n,
341
344
  checkPerm: r,
342
- onAction: l,
343
- enablePinning: d,
344
- onPinToggle: f,
345
- resolveObjectLabel: _,
346
- resolveDashboardLabel: v,
347
- resolveGroupLabel: y,
348
- t: w
345
+ checkCap: l,
346
+ onAction: d,
347
+ enablePinning: f,
348
+ onPinToggle: p,
349
+ resolveObjectLabel: v,
350
+ resolveDashboardLabel: y,
351
+ resolveGroupLabel: w,
352
+ t: T
349
353
  }, e.id)) }) }) })] })
350
354
  });
351
355
  }
352
356
  if (e.type === "action") {
353
- let t = Y(e.icon), n = X(e.label, w);
357
+ let t = Y(e.icon), n = X(e.label, T);
354
358
  return /* @__PURE__ */ M(C, { children: [
355
- p && /* @__PURE__ */ j("span", {
359
+ _ && /* @__PURE__ */ j("span", {
356
360
  className: "absolute left-0.5 top-1/2 -translate-y-1/2 cursor-grab text-muted-foreground",
357
- "aria-label": w ? w("console.nav.dragToReorder", { defaultValue: "Drag to reorder" }) : "Drag to reorder",
358
- ...p,
359
- children: /* @__PURE__ */ j(R, { className: "h-3.5 w-3.5" })
361
+ "aria-label": T ? T("console.nav.dragToReorder", { defaultValue: "Drag to reorder" }) : "Drag to reorder",
362
+ ..._,
363
+ children: /* @__PURE__ */ j(te, { className: "h-3.5 w-3.5" })
360
364
  }),
361
365
  /* @__PURE__ */ M(S, {
362
366
  tooltip: n,
363
- onClick: () => l?.(e),
367
+ onClick: () => d?.(e),
364
368
  children: [
365
369
  /* @__PURE__ */ j(t, { className: "h-4 w-4" }),
366
370
  /* @__PURE__ */ j("span", { children: n }),
@@ -371,19 +375,19 @@ function Q({ item: e, basePath: t, evalVis: n, checkPerm: r, onAction: l, enable
371
375
  })
372
376
  ]
373
377
  }),
374
- d && f && /* @__PURE__ */ j(x, {
378
+ f && p && /* @__PURE__ */ j(x, {
375
379
  showOnHover: !0,
376
- onClick: () => f(e.id, !e.pinned),
377
- "aria-label": w ? w(e.pinned ? "console.nav.unpinItem" : "console.nav.pinItem", {
380
+ onClick: () => p(e.id, !e.pinned),
381
+ "aria-label": T ? T(e.pinned ? "console.nav.unpinItem" : "console.nav.pinItem", {
378
382
  defaultValue: e.pinned ? `Unpin ${n}` : `Pin ${n}`,
379
383
  name: n
380
384
  }) : e.pinned ? `Unpin ${n}` : `Pin ${n}`,
381
- children: e.pinned ? /* @__PURE__ */ j(V, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ j(B, { className: "h-3.5 w-3.5" })
385
+ children: e.pinned ? /* @__PURE__ */ j(ne, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ j(R, { className: "h-3.5 w-3.5" })
382
386
  })
383
387
  ] });
384
388
  }
385
- let O = Y(e.icon), { href: k, external: P } = Ce(e, t), L = k !== "#" && T.pathname.startsWith(k), z = be(e, _, w, v, y), H = /* @__PURE__ */ M(A, { children: [
386
- /* @__PURE__ */ j(O, { className: "h-4 w-4" }),
389
+ let ee = Y(e.icon), { href: L, external: re } = we(e, t), ie = L !== "#" && E.pathname.startsWith(L), z = be(e, v, T, y, w), B = /* @__PURE__ */ M(A, { children: [
390
+ /* @__PURE__ */ j(ee, { className: "h-4 w-4" }),
387
391
  /* @__PURE__ */ j("span", { children: z }),
388
392
  e.badge != null && /* @__PURE__ */ j(a, {
389
393
  variant: e.badgeVariant ?? "default",
@@ -392,111 +396,112 @@ function Q({ item: e, basePath: t, evalVis: n, checkPerm: r, onAction: l, enable
392
396
  })
393
397
  ] });
394
398
  return /* @__PURE__ */ M(C, { children: [
395
- p && /* @__PURE__ */ j("span", {
399
+ _ && /* @__PURE__ */ j("span", {
396
400
  className: "absolute left-0.5 top-1/2 -translate-y-1/2 cursor-grab text-muted-foreground",
397
- "aria-label": w ? w("console.nav.dragToReorder", { defaultValue: "Drag to reorder" }) : "Drag to reorder",
398
- ...p,
399
- children: /* @__PURE__ */ j(R, { className: "h-3.5 w-3.5" })
401
+ "aria-label": T ? T("console.nav.dragToReorder", { defaultValue: "Drag to reorder" }) : "Drag to reorder",
402
+ ..._,
403
+ children: /* @__PURE__ */ j(te, { className: "h-3.5 w-3.5" })
400
404
  }),
401
405
  /* @__PURE__ */ j(S, {
402
406
  asChild: !0,
403
- isActive: L,
407
+ isActive: ie,
404
408
  tooltip: z,
405
- children: P ? /* @__PURE__ */ j("a", {
406
- href: k,
409
+ children: re ? /* @__PURE__ */ j("a", {
410
+ href: L,
407
411
  target: "_blank",
408
412
  rel: "noopener noreferrer",
409
- children: H
413
+ children: B
410
414
  }) : /* @__PURE__ */ j(N, {
411
- to: k,
412
- children: H
415
+ to: L,
416
+ children: B
413
417
  })
414
418
  }),
415
- d && f && /* @__PURE__ */ j(x, {
419
+ f && p && /* @__PURE__ */ j(x, {
416
420
  showOnHover: !0,
417
- onClick: () => f(e.id, !e.pinned),
418
- "aria-label": w ? w(e.pinned ? "console.nav.unpinItem" : "console.nav.pinItem", {
421
+ onClick: () => p(e.id, !e.pinned),
422
+ "aria-label": T ? T(e.pinned ? "console.nav.unpinItem" : "console.nav.pinItem", {
419
423
  defaultValue: e.pinned ? `Unpin ${z}` : `Pin ${z}`,
420
424
  name: z
421
425
  }) : e.pinned ? `Unpin ${z}` : `Pin ${z}`,
422
- children: e.pinned ? /* @__PURE__ */ j(V, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ j(B, { className: "h-3.5 w-3.5" })
426
+ children: e.pinned ? /* @__PURE__ */ j(ne, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ j(R, { className: "h-3.5 w-3.5" })
423
427
  })
424
428
  ] });
425
429
  }
426
- function $({ items: e, basePath: t = "", evaluateVisibility: n = xe, checkPermission: i = Se, onAction: a, searchQuery: o, enablePinning: s, onPinToggle: c, enableReorder: l, onReorder: u, resolveObjectLabel: d, resolveDashboardLabel: f, resolveGroupLabel: p, t: _ }) {
427
- let v = r(() => o ? Z(e, o) : e, [e, o]), y = r(() => Ee(v), [v]), x = v.slice().sort((e, t) => (e.order ?? 0) - (t.order ?? 0)), S = ae(U(re, { activationConstraint: { distance: we } }), U(ne)), C = (e) => {
430
+ function $({ items: e, basePath: t = "", evaluateVisibility: n = xe, checkPermission: i = Se, checkCapability: a = Ce, onAction: o, searchQuery: s, enablePinning: c, onPinToggle: l, enableReorder: u, onReorder: d, resolveObjectLabel: f, resolveDashboardLabel: p, resolveGroupLabel: _, t: v }) {
431
+ let y = r(() => s ? Z(e, s) : e, [e, s]), x = r(() => De(y), [y]), S = y.slice().sort((e, t) => (e.order ?? 0) - (t.order ?? 0)), C = se(V(ae, { activationConstraint: { distance: Te } }), V(B)), w = (e) => {
428
432
  let { active: t, over: n } = e;
429
- if (!n || t.id === n.id || !u) return;
430
- let r = x.findIndex((e) => e.id === t.id), i = x.findIndex((e) => e.id === n.id);
431
- r === -1 || i === -1 || u(se(x, r, i).map((e, t) => ({
433
+ if (!n || t.id === n.id || !d) return;
434
+ let r = S.findIndex((e) => e.id === t.id), i = S.findIndex((e) => e.id === n.id);
435
+ r === -1 || i === -1 || d(le(S, r, i).map((e, t) => ({
432
436
  ...e,
433
437
  order: t
434
438
  })));
435
- }, w = {
439
+ }, T = {
436
440
  basePath: t,
437
441
  evalVis: n,
438
442
  checkPerm: i,
439
- onAction: a,
440
- enablePinning: s,
441
- onPinToggle: c,
442
- resolveObjectLabel: d,
443
- resolveDashboardLabel: f,
444
- resolveGroupLabel: p,
445
- t: _
446
- }, T = x.some((e) => e.type === "group"), E = y.length > 0 && s ? /* @__PURE__ */ M(m, { children: [/* @__PURE__ */ M(g, {
443
+ checkCap: a,
444
+ onAction: o,
445
+ enablePinning: c,
446
+ onPinToggle: l,
447
+ resolveObjectLabel: f,
448
+ resolveDashboardLabel: p,
449
+ resolveGroupLabel: _,
450
+ t: v
451
+ }, E = S.some((e) => e.type === "group"), D = x.length > 0 && c ? /* @__PURE__ */ M(m, { children: [/* @__PURE__ */ M(g, {
447
452
  className: "flex items-center gap-1.5",
448
- children: [/* @__PURE__ */ j(ee, { className: "h-3.5 w-3.5" }), _ ? _("console.nav.favorites", { defaultValue: "Favorites" }) : "Favorites"]
449
- }), /* @__PURE__ */ j(h, { children: /* @__PURE__ */ j(b, { children: y.map((e) => /* @__PURE__ */ j(Q, {
453
+ children: [/* @__PURE__ */ j(ie, { className: "h-3.5 w-3.5" }), v ? v("console.nav.favorites", { defaultValue: "Favorites" }) : "Favorites"]
454
+ }), /* @__PURE__ */ j(h, { children: /* @__PURE__ */ j(b, { children: x.map((e) => /* @__PURE__ */ j(Q, {
450
455
  item: e,
451
- ...w
456
+ ...T
452
457
  }, `fav-${e.id}`)) }) })] }) : null;
453
- if (!T) {
454
- let e = x.filter((e) => e.type !== "group").map((e) => e.id);
455
- return /* @__PURE__ */ M(A, { children: [E, /* @__PURE__ */ j(m, { children: /* @__PURE__ */ j(h, { children: l ? /* @__PURE__ */ j(te, {
456
- sensors: S,
457
- collisionDetection: ie,
458
- onDragEnd: C,
459
- children: /* @__PURE__ */ j(oe, {
458
+ if (!E) {
459
+ let e = S.filter((e) => e.type !== "group").map((e) => e.id);
460
+ return /* @__PURE__ */ M(A, { children: [D, /* @__PURE__ */ j(m, { children: /* @__PURE__ */ j(h, { children: u ? /* @__PURE__ */ j(z, {
461
+ sensors: C,
462
+ collisionDetection: oe,
463
+ onDragEnd: w,
464
+ children: /* @__PURE__ */ j(ce, {
460
465
  items: e,
461
- strategy: le,
462
- children: /* @__PURE__ */ j(b, { children: x.map((e) => /* @__PURE__ */ j(Te, {
466
+ strategy: de,
467
+ children: /* @__PURE__ */ j(b, { children: S.map((e) => /* @__PURE__ */ j(Ee, {
463
468
  item: e,
464
- enableReorder: l,
465
- ...w
469
+ enableReorder: u,
470
+ ...T
466
471
  }, e.id)) })
467
472
  })
468
- }) : /* @__PURE__ */ j(b, { children: x.map((e) => /* @__PURE__ */ j(Q, {
473
+ }) : /* @__PURE__ */ j(b, { children: S.map((e) => /* @__PURE__ */ j(Q, {
469
474
  item: e,
470
- ...w
475
+ ...T
471
476
  }, e.id)) }) }) })] });
472
477
  }
473
- let D = [], O = [], k = (e) => {
474
- if (O.length === 0) return;
475
- let t = O;
476
- O = [], D.push(/* @__PURE__ */ j(m, { children: /* @__PURE__ */ j(h, { children: /* @__PURE__ */ j(b, { children: t.map((e) => /* @__PURE__ */ j(Q, {
478
+ let O = [], k = [], N = (e) => {
479
+ if (k.length === 0) return;
480
+ let t = k;
481
+ k = [], O.push(/* @__PURE__ */ j(m, { children: /* @__PURE__ */ j(h, { children: /* @__PURE__ */ j(b, { children: t.map((e) => /* @__PURE__ */ j(Q, {
477
482
  item: e,
478
- ...w
483
+ ...T
479
484
  }, e.id)) }) }) }, e));
480
485
  };
481
- return x.forEach((e, t) => {
482
- e.type === "group" ? (k(`leaf-${t}`), D.push(/* @__PURE__ */ j(Q, {
486
+ return S.forEach((e, t) => {
487
+ e.type === "group" ? (N(`leaf-${t}`), O.push(/* @__PURE__ */ j(Q, {
483
488
  item: e,
484
- ...w
485
- }, e.id))) : O.push(e);
486
- }), k("leaf-end"), /* @__PURE__ */ M(A, { children: [E, D] });
489
+ ...T
490
+ }, e.id))) : k.push(e);
491
+ }), N("leaf-end"), /* @__PURE__ */ M(A, { children: [D, O] });
487
492
  }
488
- function Ee(e) {
493
+ function De(e) {
489
494
  let t = [];
490
- for (let n of e) n.pinned && n.type !== "group" && n.type !== "separator" && t.push(n), n.children?.length && t.push(...Ee(n.children));
495
+ for (let n of e) n.pinned && n.type !== "group" && n.type !== "separator" && t.push(n), n.children?.length && t.push(...De(n.children));
491
496
  return t;
492
497
  }
493
498
  //#endregion
494
499
  //#region src/AppSchemaRenderer.tsx
495
- function De({ areas: e, activeAreaId: t, onAreaChange: n, evalVis: r, checkPerm: i }) {
500
+ function Oe({ areas: e, activeAreaId: t, onAreaChange: n, evalVis: r, checkPerm: i }) {
496
501
  let a = e.filter((e) => !(!r(e.visible) || e.requiredPermissions?.length && !i(e.requiredPermissions)));
497
502
  return a.length <= 1 ? null : /* @__PURE__ */ M(m, { children: [/* @__PURE__ */ M(g, {
498
503
  className: "flex items-center gap-1.5",
499
- children: [/* @__PURE__ */ j(z, { className: "h-3.5 w-3.5" }), "Area"]
504
+ children: [/* @__PURE__ */ j(L, { className: "h-3.5 w-3.5" }), "Area"]
500
505
  }), /* @__PURE__ */ j(h, { children: /* @__PURE__ */ j(b, { children: a.map((e) => {
501
506
  let r = Y(e.icon);
502
507
  return /* @__PURE__ */ j(C, { children: /* @__PURE__ */ M(S, {
@@ -507,13 +512,17 @@ function De({ areas: e, activeAreaId: t, onAreaChange: n, evalVis: r, checkPerm:
507
512
  }) }, e.id);
508
513
  }) }) })] });
509
514
  }
510
- function Oe({ items: e, basePath: t }) {
511
- let n = F(), r = e.filter((e) => e.type !== "group" && e.type !== "separator").slice(0, 5);
512
- return r.length === 0 ? null : /* @__PURE__ */ j("div", {
515
+ function ke({ items: e, basePath: t }) {
516
+ let n = F(), r = (e) => {
517
+ let t = [];
518
+ for (let n of e) n.type !== "separator" && (n.type === "group" ? t.push(...r(n.children || [])) : t.push(n));
519
+ return t;
520
+ }, i = r(e).slice(0, 5);
521
+ return i.length === 0 ? null : /* @__PURE__ */ j("div", {
513
522
  className: "fixed bottom-0 left-0 right-0 z-50 flex items-center justify-around border-t bg-background/95 backdrop-blur-sm px-2 py-1 sm:hidden safe-area-bottom",
514
523
  role: "navigation",
515
524
  "aria-label": "Mobile navigation",
516
- children: r.map((e) => {
525
+ children: i.map((e) => {
517
526
  let r = Y(e.icon), i = "#";
518
527
  e.type === "object" ? (i = `${t}/${e.objectName}`, e.viewName && (i += `/view/${e.viewName}`)) : e.type === "dashboard" ? i = e.dashboardName ? `${t}/dashboard/${e.dashboardName}` : "#" : e.type === "page" ? i = e.pageName ? `${t}/page/${e.pageName}` : "#" : e.type === "report" ? i = e.reportName ? `${t}/report/${e.reportName}` : "#" : e.type === "url" && (i = e.url ?? "#");
519
528
  let a = i !== "#" && n.pathname.startsWith(i);
@@ -528,12 +537,12 @@ function Oe({ items: e, basePath: t }) {
528
537
  })
529
538
  });
530
539
  }
531
- function ke({ schema: e, basePath: t, evalVis: n, checkPerm: r, onAction: a, sidebarHeader: o, sidebarFooter: s, sidebarExtra: c, activeAreaId: l, setActiveAreaId: u, resolvedNavigation: m, enableSearch: h, enablePinning: g, onPinToggle: y, enableReorder: x, onReorder: w }) {
532
- let T = Y(e.logo), E = e.areas ?? [], [D, O] = i("");
540
+ function Ae({ schema: e, basePath: t, evalVis: n, checkPerm: r, checkCap: a, onAction: o, sidebarHeader: s, sidebarFooter: c, sidebarExtra: l, activeAreaId: u, setActiveAreaId: m, resolvedNavigation: h, enableSearch: g, enablePinning: y, onPinToggle: x, enableReorder: w, onReorder: T }) {
541
+ let E = Y(e.logo), D = e.areas ?? [], [O, k] = i("");
533
542
  return /* @__PURE__ */ M(d, {
534
543
  collapsible: "icon",
535
544
  children: [
536
- /* @__PURE__ */ M(_, { children: [o ?? /* @__PURE__ */ j(b, { children: /* @__PURE__ */ j(C, { children: /* @__PURE__ */ M(S, {
545
+ /* @__PURE__ */ M(_, { children: [s ?? /* @__PURE__ */ j(b, { children: /* @__PURE__ */ j(C, { children: /* @__PURE__ */ M(S, {
537
546
  size: "lg",
538
547
  tooltip: e.title ?? e.name,
539
548
  children: [/* @__PURE__ */ j("div", {
@@ -542,7 +551,7 @@ function ke({ schema: e, basePath: t, evalVis: n, checkPerm: r, onAction: a, sid
542
551
  src: e.logo,
543
552
  alt: e.title ?? "",
544
553
  className: "size-6 object-contain"
545
- }) : /* @__PURE__ */ j(T, { className: "size-4" })
554
+ }) : /* @__PURE__ */ j(E, { className: "size-4" })
546
555
  }), /* @__PURE__ */ M("div", {
547
556
  className: "grid flex-1 text-left text-sm leading-tight",
548
557
  children: [/* @__PURE__ */ j("span", {
@@ -553,92 +562,94 @@ function ke({ schema: e, basePath: t, evalVis: n, checkPerm: r, onAction: a, sid
553
562
  children: e.description
554
563
  })]
555
564
  })]
556
- }) }) }), h && /* @__PURE__ */ j(v, {
565
+ }) }) }), g && /* @__PURE__ */ j(v, {
557
566
  placeholder: "Search navigation…",
558
- value: D,
559
- onChange: (e) => O(e.target.value),
567
+ value: O,
568
+ onChange: (e) => k(e.target.value),
560
569
  "aria-label": "Search navigation"
561
570
  })] }),
562
571
  /* @__PURE__ */ M(f, { children: [
563
- E.length > 1 && l && /* @__PURE__ */ j(De, {
564
- areas: E,
565
- activeAreaId: l,
566
- onAreaChange: u,
572
+ D.length > 1 && u && /* @__PURE__ */ j(Oe, {
573
+ areas: D,
574
+ activeAreaId: u,
575
+ onAreaChange: m,
567
576
  evalVis: n,
568
577
  checkPerm: r
569
578
  }),
570
579
  /* @__PURE__ */ j($, {
571
- items: m,
580
+ items: h,
572
581
  basePath: t,
573
582
  evaluateVisibility: n,
574
583
  checkPermission: r,
575
- onAction: a,
576
- searchQuery: D,
577
- enablePinning: g,
578
- onPinToggle: y,
579
- enableReorder: x,
580
- onReorder: w
584
+ checkCapability: a,
585
+ onAction: o,
586
+ searchQuery: O,
587
+ enablePinning: y,
588
+ onPinToggle: x,
589
+ enableReorder: w,
590
+ onReorder: T
581
591
  }),
582
- c
592
+ l
583
593
  ] }),
584
- s && /* @__PURE__ */ j(p, { children: s })
594
+ c && /* @__PURE__ */ j(p, { children: c })
585
595
  ]
586
596
  });
587
597
  }
588
- function Ae({ schema: e, basePath: t = "", mobileNavMode: a = "drawer", evaluateVisibility: o, checkPermission: s, onAction: c, navbar: l, sidebarHeader: u, sidebarFooter: d, sidebarExtra: f, children: p, className: m, defaultOpen: h = !0, enableSearch: g, enablePinning: _, onPinToggle: v, enableReorder: y, onReorder: b }) {
589
- let x = o ?? ((e) => !(e === !1 || e === "false")), S = s ?? (() => !0), C = r(() => (e.menu ?? []).map((e, t) => de(e, t)), [e.menu]), w = e.navigation ?? C, T = e.areas ?? [], [E, D] = i(() => T.length > 0 ? T[0].id : null), O = T.map((e) => e.id).join(",");
598
+ function je({ schema: e, basePath: t = "", mobileNavMode: a = "drawer", evaluateVisibility: o, checkPermission: s, checkCapability: c, onAction: l, navbar: u, sidebarHeader: d, sidebarFooter: f, sidebarExtra: p, children: m, className: h, defaultOpen: g = !0, enableSearch: _, enablePinning: v, onPinToggle: y, enableReorder: b, onReorder: x }) {
599
+ let S = o ?? ((e) => !(e === !1 || e === "false")), C = s ?? (() => !0), w = c ?? (() => !0), T = r(() => (e.menu ?? []).map((e, t) => pe(e, t)), [e.menu]), E = e.navigation ?? T, D = e.areas ?? [], [O, k] = i(() => D.length > 0 ? D[0].id : null), N = D.map((e) => e.id).join(",");
590
600
  n(() => {
591
- T.length > 0 ? D((e) => T.some((t) => t.id === e) ? e : T[0].id) : D(null);
592
- }, [e.name, O]);
593
- let k = T.find((e) => e.id === E)?.navigation ?? w, N = {
601
+ D.length > 0 ? k((e) => D.some((t) => t.id === e) ? e : D[0].id) : k(null);
602
+ }, [e.name, N]);
603
+ let P = D.find((e) => e.id === O)?.navigation ?? E, F = {
594
604
  title: e.title,
595
605
  favicon: e.favicon,
596
606
  logo: e.logo
597
607
  };
598
608
  return /* @__PURE__ */ M(A, { children: [/* @__PURE__ */ j(J, {
599
- sidebar: /* @__PURE__ */ j(ke, {
609
+ sidebar: /* @__PURE__ */ j(Ae, {
600
610
  schema: e,
601
611
  basePath: t,
602
- evalVis: x,
603
- checkPerm: S,
604
- onAction: c,
605
- sidebarHeader: u,
606
- sidebarFooter: d,
607
- sidebarExtra: f,
608
- activeAreaId: E,
609
- setActiveAreaId: D,
610
- resolvedNavigation: k,
611
- enableSearch: g,
612
- enablePinning: _,
613
- onPinToggle: v,
614
- enableReorder: y,
615
- onReorder: b
612
+ evalVis: S,
613
+ checkPerm: C,
614
+ checkCap: w,
615
+ onAction: l,
616
+ sidebarHeader: d,
617
+ sidebarFooter: f,
618
+ sidebarExtra: p,
619
+ activeAreaId: O,
620
+ setActiveAreaId: k,
621
+ resolvedNavigation: P,
622
+ enableSearch: _,
623
+ enablePinning: v,
624
+ onPinToggle: y,
625
+ enableReorder: b,
626
+ onReorder: x
616
627
  }),
617
- navbar: l,
618
- className: m,
619
- defaultOpen: h,
620
- branding: N,
621
- children: p
622
- }), a === "bottom_nav" && /* @__PURE__ */ j(Oe, {
623
- items: k,
628
+ navbar: u,
629
+ className: h,
630
+ defaultOpen: g,
631
+ branding: F,
632
+ children: m
633
+ }), a === "bottom_nav" && /* @__PURE__ */ j(ke, {
634
+ items: P,
624
635
  basePath: t
625
636
  })] });
626
637
  }
627
638
  //#endregion
628
639
  //#region src/Page.tsx
629
- var je = (e) => e ? Array.isArray(e) ? e : [e] : [];
630
- function Me({ schema: e, className: t, style: n, id: r, ...i }) {
631
- let a = je(e.children);
640
+ var Me = (e) => e ? Array.isArray(e) ? e : [e] : [];
641
+ function Ne({ schema: e, className: t, style: n, id: r, ...i }) {
642
+ let a = Me(e.children);
632
643
  return /* @__PURE__ */ M("div", {
633
644
  id: r || e.id,
634
645
  className: O("flex flex-col h-full space-y-4", t),
635
646
  style: n,
636
- children: [/* @__PURE__ */ j(W, {
647
+ children: [/* @__PURE__ */ j(H, {
637
648
  title: e.title,
638
649
  description: e.description
639
650
  }), /* @__PURE__ */ j("div", {
640
651
  className: "flex-1 overflow-auto",
641
- children: a.map((e, t) => /* @__PURE__ */ j(fe, {
652
+ children: a.map((e, t) => /* @__PURE__ */ j(me, {
642
653
  schema: e,
643
654
  ...i
644
655
  }, e?.id || t))
@@ -647,10 +658,10 @@ function Me({ schema: e, className: t, style: n, id: r, ...i }) {
647
658
  }
648
659
  //#endregion
649
660
  //#region src/SidebarNav.tsx
650
- function Ne(e) {
661
+ function Pe(e) {
651
662
  return "items" in e && !("href" in e);
652
663
  }
653
- function Pe({ item: e, pathname: t }) {
664
+ function Fe({ item: e, pathname: t }) {
654
665
  return e.children && e.children.length > 0 ? /* @__PURE__ */ j(o, {
655
666
  asChild: !0,
656
667
  defaultOpen: !0,
@@ -704,8 +715,8 @@ function Pe({ item: e, pathname: t }) {
704
715
  })
705
716
  }) });
706
717
  }
707
- function Fe({ items: e, title: n = "Application", className: r, collapsible: i = "icon", searchEnabled: a = !1, searchPlaceholder: o = "Search..." }) {
708
- let s = F(), [c, u] = t.useState(""), p = t.useMemo(() => e.length === 0 ? [] : Ne(e[0]) ? e.map((e) => ({
718
+ function Ie({ items: e, title: n = "Application", className: r, collapsible: i = "icon", searchEnabled: a = !1, searchPlaceholder: o = "Search..." }) {
719
+ let s = F(), [c, u] = t.useState(""), p = t.useMemo(() => e.length === 0 ? [] : Pe(e[0]) ? e.map((e) => ({
709
720
  groupLabel: e.label,
710
721
  items: e.items
711
722
  })) : [{ items: e }], [e]), _ = t.useMemo(() => {
@@ -723,7 +734,7 @@ function Fe({ items: e, title: n = "Application", className: r, collapsible: i =
723
734
  className: "px-3 py-2",
724
735
  children: /* @__PURE__ */ M("div", {
725
736
  className: "relative",
726
- children: [/* @__PURE__ */ j(H, { className: "absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground" }), /* @__PURE__ */ j(l, {
737
+ children: [/* @__PURE__ */ j(re, { className: "absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground" }), /* @__PURE__ */ j(l, {
727
738
  type: "search",
728
739
  placeholder: o,
729
740
  value: c,
@@ -740,7 +751,7 @@ function Fe({ items: e, title: n = "Application", className: r, collapsible: i =
740
751
  className: "text-[10px] font-semibold uppercase tracking-wider text-sidebar-foreground/60",
741
752
  children: e.groupLabel || n
742
753
  }),
743
- /* @__PURE__ */ j(h, { children: /* @__PURE__ */ j(b, { children: e.items.map((e) => /* @__PURE__ */ j(Pe, {
754
+ /* @__PURE__ */ j(h, { children: /* @__PURE__ */ j(b, { children: e.items.map((e) => /* @__PURE__ */ j(Fe, {
744
755
  item: e,
745
756
  pathname: s.pathname
746
757
  }, e.href)) }) })
@@ -749,8 +760,8 @@ function Fe({ items: e, title: n = "Application", className: r, collapsible: i =
749
760
  }
750
761
  //#endregion
751
762
  //#region src/index.ts
752
- function Ie() {
753
- e.register("page-header", W, {
763
+ function Le() {
764
+ e.register("page-header", H, {
754
765
  namespace: "layout",
755
766
  label: "Page Header",
756
767
  category: "Layout",
@@ -761,7 +772,7 @@ function Ie() {
761
772
  name: "description",
762
773
  type: "string"
763
774
  }]
764
- }), e.register("page:header", W, { namespace: "layout" }), e.register("page:card", he, {
775
+ }), e.register("page:header", H, { namespace: "layout" }), e.register("page:card", he, {
765
776
  namespace: "layout",
766
777
  label: "Page Card",
767
778
  category: "Layout",
@@ -793,7 +804,7 @@ function Ie() {
793
804
  name: "basePath",
794
805
  type: "string"
795
806
  }]
796
- }), e.register("app-schema-renderer", Ae, {
807
+ }), e.register("app-schema-renderer", je, {
797
808
  namespace: "layout",
798
809
  label: "App Schema Renderer",
799
810
  category: "Layout",
@@ -815,7 +826,7 @@ function Ie() {
815
826
  });
816
827
  }
817
828
  try {
818
- Ie();
829
+ Le();
819
830
  } catch {}
820
831
  //#endregion
821
- export { Ae as AppSchemaRenderer, J as AppShell, $ as NavigationRenderer, Me as Page, he as PageCard, W as PageHeader, ye as ResponsiveGrid, Fe as SidebarNav, Z as filterNavigationItems, Ie as registerLayout, Y as resolveIcon, X as resolveLabel, me as useAppShellBranding };
832
+ export { je as AppSchemaRenderer, J as AppShell, $ as NavigationRenderer, Ne as Page, he as PageCard, H as PageHeader, ye as ResponsiveGrid, Ie as SidebarNav, Z as filterNavigationItems, Le as registerLayout, Y as resolveIcon, X as resolveLabel, q as useAppShellBranding };
@@ -1 +1 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`@object-ui/core`),require(`react`),require(`@object-ui/components`),require(`react/jsx-runtime`),require(`react-router-dom`),require(`lucide-react`),require(`@dnd-kit/core`),require(`@dnd-kit/sortable`),require(`@dnd-kit/utilities`),require(`@object-ui/types`),require(`@object-ui/react`)):typeof define==`function`&&define.amd?define([`exports`,`@object-ui/core`,`react`,`@object-ui/components`,`react/jsx-runtime`,`react-router-dom`,`lucide-react`,`@dnd-kit/core`,`@dnd-kit/sortable`,`@dnd-kit/utilities`,`@object-ui/types`,`@object-ui/react`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ObjectUILayout={},e._object_ui_core,e.react,e._object_ui_components,e.react_jsx_runtime,e.react_router_dom,e.lucide_react,e._dnd_kit_core,e._dnd_kit_sortable,e._dnd_kit_utilities,e._object_ui_types,e._object_ui_react))})(this,function(e,t,n,r,i,a,o,s,c,l,u,d){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var f=Object.create,p=Object.defineProperty,m=Object.getOwnPropertyDescriptor,h=Object.getOwnPropertyNames,g=Object.getPrototypeOf,_=Object.prototype.hasOwnProperty,v=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=h(t),a=0,o=i.length,s;a<o;a++)s=i[a],!_.call(e,s)&&s!==n&&p(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=m(t,s))||r.enumerable});return e};n=((e,t,n)=>(n=e==null?{}:f(g(e)),v(t||!e||!e.__esModule?p(n,`default`,{value:e,enumerable:!0}):n,e)))(n,1);function y({title:e,description:t,action:n,className:a,children:o,...s}){return(0,i.jsx)(`div`,{className:(0,r.cn)(`flex flex-col gap-4 pb-4 md:pb-8`,a),...s,children:(0,i.jsxs)(`div`,{className:`flex flex-wrap items-end gap-x-4 gap-y-2`,children:[(0,i.jsxs)(`div`,{className:`flex flex-col gap-1 min-w-0`,children:[(0,i.jsx)(`h1`,{className:`text-2xl font-bold tracking-tight md:text-3xl truncate`,children:e}),t&&(0,i.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:t})]}),(n||o)&&(0,i.jsxs)(`div`,{className:`flex items-center gap-2 ml-auto sm:ml-0`,children:[n,o]})]})})}function b(e){let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!t)return null;let n=parseInt(t[1],16)/255,r=parseInt(t[2],16)/255,i=parseInt(t[3],16)/255,a=Math.max(n,r,i),o=Math.min(n,r,i),s=0,c=0,l=(a+o)/2;if(a!==o){let e=a-o;switch(c=l>.5?e/(2-a-o):e/(a+o),a){case n:s=((r-i)/e+(r<i?6:0))/6;break;case r:s=((i-n)/e+2)/6;break;case i:s=((n-r)/e+4)/6;break}}return{h:s*360,s:c*100,l:l*100}}function x(e){let t=b(e);return t?`${Math.round(t.h)} ${Math.round(t.s)}% ${Math.round(t.l)}%`:null}function S(e){let t=b(e);if(!t)return null;let n=Math.max(t.l,65),r=t.s>80?Math.max(t.s-10,70):t.s;return`${Math.round(t.h)} ${Math.round(r)}% ${Math.round(n)}%`}function C(e){let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!t)return`0 0% 100%`;let n=e=>{let t=e/255;return t<=.03928?t/12.92:((t+.055)/1.055)**2.4},r=n(parseInt(t[1],16)),i=n(parseInt(t[2],16)),a=n(parseInt(t[3],16));return .2126*r+.7152*i+.0722*a>.6?`222 47% 11%`:`0 0% 100%`}function w(e,t){(0,n.useEffect)(()=>{let n=document.documentElement,r=()=>n.classList.contains(`dark`),i=()=>{if(e?.primaryColor){let t=x(e.primaryColor),i=S(e.primaryColor),a=r()&&i||t;a&&(n.style.setProperty(`--brand-primary`,e.primaryColor),n.style.setProperty(`--brand-primary-hsl`,t||a),n.style.setProperty(`--primary`,a),n.style.setProperty(`--primary-foreground`,r()?`222 47% 11%`:C(e.primaryColor)),n.style.setProperty(`--ring`,a),n.style.setProperty(`--sidebar-primary`,a),n.style.setProperty(`--sidebar-ring`,a))}else n.style.removeProperty(`--brand-primary`),n.style.removeProperty(`--brand-primary-hsl`),n.style.removeProperty(`--primary`),n.style.removeProperty(`--primary-foreground`),n.style.removeProperty(`--ring`),n.style.removeProperty(`--sidebar-primary`),n.style.removeProperty(`--sidebar-ring`);if(e?.accentColor){let t=x(e.accentColor),i=S(e.accentColor),a=r()&&i||t;a&&(n.style.setProperty(`--brand-accent`,e.accentColor),n.style.setProperty(`--brand-accent-hsl`,t||a),n.style.setProperty(`--accent`,a),n.style.setProperty(`--accent-foreground`,r()?`222 47% 11%`:C(e.accentColor)))}else n.style.removeProperty(`--brand-accent`),n.style.removeProperty(`--brand-accent-hsl`),n.style.removeProperty(`--accent`),n.style.removeProperty(`--accent-foreground`)};i();let a=new MutationObserver(e=>{for(let t of e)if(t.type===`attributes`&&t.attributeName===`class`){i();break}});if(a.observe(n,{attributes:!0,attributeFilter:[`class`]}),e?.favicon){let t=document.querySelector(`#favicon`)||document.querySelector(`link[rel="icon"]`);t&&(t.href=e.favicon)}return t&&(document.title=t),()=>{a.disconnect(),n.style.removeProperty(`--brand-primary`),n.style.removeProperty(`--brand-primary-hsl`),n.style.removeProperty(`--brand-accent`),n.style.removeProperty(`--brand-accent-hsl`),n.style.removeProperty(`--primary`),n.style.removeProperty(`--primary-foreground`),n.style.removeProperty(`--ring`),n.style.removeProperty(`--sidebar-primary`),n.style.removeProperty(`--sidebar-ring`),n.style.removeProperty(`--accent`),n.style.removeProperty(`--accent-foreground`)}},[e?.primaryColor,e?.accentColor,e?.favicon,t])}function T({sidebar:e,navbar:t,children:n,className:a,defaultOpen:o=!0,branding:s}){return w(s,s?.title),(0,i.jsxs)(r.SidebarProvider,{defaultOpen:o,className:`!flex-col`,children:[(0,i.jsx)(`header`,{className:`sticky top-0 z-30 flex h-14 w-full shrink-0 items-center gap-2 border-b bg-background px-2 sm:px-4`,children:t}),(0,i.jsxs)(`div`,{className:`flex flex-1 min-h-0 w-full`,children:[e,(0,i.jsx)(r.SidebarInset,{className:`min-w-0`,children:(0,i.jsx)(`main`,{className:(0,r.cn)(`flex-1 min-w-0 overflow-auto p-3 sm:p-4 md:p-6`,a),children:n})})]})]})}function E({className:e,children:t,...n}){return(0,i.jsx)(`div`,{className:(0,r.cn)(`rounded-xl border bg-card text-card-foreground shadow`,e),...n,children:(0,i.jsx)(`div`,{className:`p-6`,children:t})})}var D={xs:{1:`grid-cols-1`,2:`grid-cols-2`,3:`grid-cols-3`,4:`grid-cols-4`,6:`grid-cols-6`,12:`grid-cols-12`},sm:{1:`sm:grid-cols-1`,2:`sm:grid-cols-2`,3:`sm:grid-cols-3`,4:`sm:grid-cols-4`,6:`sm:grid-cols-6`,12:`sm:grid-cols-12`},md:{1:`md:grid-cols-1`,2:`md:grid-cols-2`,3:`md:grid-cols-3`,4:`md:grid-cols-4`,6:`md:grid-cols-6`,12:`md:grid-cols-12`},lg:{1:`lg:grid-cols-1`,2:`lg:grid-cols-2`,3:`lg:grid-cols-3`,4:`lg:grid-cols-4`,6:`lg:grid-cols-6`,12:`lg:grid-cols-12`},xl:{1:`xl:grid-cols-1`,2:`xl:grid-cols-2`,3:`xl:grid-cols-3`,4:`xl:grid-cols-4`,6:`xl:grid-cols-6`,12:`xl:grid-cols-12`},"2xl":{1:`2xl:grid-cols-1`,2:`2xl:grid-cols-2`,3:`2xl:grid-cols-3`,4:`2xl:grid-cols-4`,6:`2xl:grid-cols-6`,12:`2xl:grid-cols-12`}};function O(e){if(!e)return`grid-cols-1`;let t=[];for(let[n,r]of Object.entries(e)){let e=D[n];if(e&&r){let n=Object.keys(e).map(Number).reduce((e,t)=>Math.abs(t-r)<Math.abs(e-r)?t:e);t.push(e[n])}}return t.join(` `)||`grid-cols-1`}var k={0:`gap-0`,1:`gap-1`,2:`gap-2`,3:`gap-3`,4:`gap-4`,5:`gap-5`,6:`gap-6`,8:`gap-8`},A=({columns:e,gap:t=4,className:n,children:a})=>(0,i.jsx)(`div`,{className:(0,r.cn)(`grid`,O(e),typeof t==`number`?k[t]||`gap-${t}`:``,n),children:a});function j(e){return e?(0,r.getLazyIcon)(e):o.FileText}function M(e,t){if(typeof e==`string`)return e;if(t){let n=t(e.key,{defaultValue:e.defaultValue,...e.params});if(n&&n!==e.key)return n}return e.defaultValue||e.key}function N(e,t,n,r,i){let a=M(e.label,n);return typeof e.label==`string`?t&&e.type===`object`&&e.objectName?t(e.objectName,a):r&&e.type===`dashboard`&&e.dashboardName?r(e.dashboardName,a):i&&e.type===`group`&&e.id?i(e.id,a):a:a}var P=e=>!(e===!1||e===`false`),F=()=>!0;function I(e,t){switch(e.type){case`object`:{let n=`${t}/${e.objectName??``}`;return{href:e.viewName?`${n}/view/${e.viewName}`:n,external:!1}}case`dashboard`:return{href:e.dashboardName?`${t}/dashboard/${e.dashboardName}`:`#`,external:!1};case`page`:return{href:e.pageName?`${t}/page/${e.pageName}`:`#`,external:!1};case`report`:return{href:e.reportName?`${t}/report/${e.reportName}`:`#`,external:!1};case`url`:return{href:e.url??`#`,external:e.target===`_blank`};default:return{href:`#`,external:!1}}}function L(e,t){if(!t.trim())return e;let n=t.toLowerCase().trim();return e.reduce((e,r)=>{if(r.type===`separator`)return e;if(r.type===`group`&&r.children?.length){let n=L(r.children,t);return n.length>0&&e.push({...r,children:n}),e}return M(r.label).toLowerCase().includes(n)&&e.push(r),e},[])}var R=5;function z({item:e,basePath:t,evalVis:n,checkPerm:r,onAction:a,enablePinning:o,onPinToggle:s,enableReorder:u,resolveObjectLabel:d,resolveDashboardLabel:f,resolveGroupLabel:p,t:m}){let{attributes:h,listeners:g,setNodeRef:_,transform:v,transition:y,isDragging:b}=(0,c.useSortable)({id:e.id,disabled:!u});return(0,i.jsx)(`div`,{ref:_,style:{transform:l.CSS.Transform.toString(v),transition:y,opacity:b?.5:void 0,zIndex:b?10:void 0},...h,children:(0,i.jsx)(B,{item:e,basePath:t,evalVis:n,checkPerm:r,onAction:a,enablePinning:o,onPinToggle:s,dragListeners:u?g:void 0,resolveObjectLabel:d,resolveDashboardLabel:f,resolveGroupLabel:p,t:m})})}function B({item:e,basePath:t,evalVis:s,checkPerm:c,onAction:l,enablePinning:u,onPinToggle:d,dragListeners:f,resolveObjectLabel:p,resolveDashboardLabel:m,resolveGroupLabel:h,t:g}){let _=(0,a.useLocation)(),[v,y]=(0,n.useState)(e.defaultOpen!==!1);if(!s(e.visible)||e.requiredPermissions?.length&&!c(e.requiredPermissions))return null;if(e.type===`separator`)return(0,i.jsx)(r.Separator,{className:`my-2`});if(e.type===`group`){let n=(e.children??[]).slice().sort((e,t)=>(e.order??0)-(t.order??0));return(0,i.jsx)(r.Collapsible,{open:v,onOpenChange:y,children:(0,i.jsxs)(r.SidebarGroup,{children:[(0,i.jsx)(r.SidebarGroupLabel,{asChild:!0,children:(0,i.jsxs)(r.CollapsibleTrigger,{className:`flex w-full items-center justify-between`,children:[N(e,p,g,m,h),(0,i.jsx)(o.ChevronRight,{className:`ml-auto h-4 w-4 transition-transform ${v?`rotate-90`:``}`})]})}),(0,i.jsx)(r.CollapsibleContent,{children:(0,i.jsx)(r.SidebarGroupContent,{children:(0,i.jsx)(r.SidebarMenu,{children:n.map(e=>(0,i.jsx)(B,{item:e,basePath:t,evalVis:s,checkPerm:c,onAction:l,enablePinning:u,onPinToggle:d,resolveObjectLabel:p,resolveDashboardLabel:m,resolveGroupLabel:h,t:g},e.id))})})})]})})}if(e.type===`action`){let t=j(e.icon),n=M(e.label,g);return(0,i.jsxs)(r.SidebarMenuItem,{children:[f&&(0,i.jsx)(`span`,{className:`absolute left-0.5 top-1/2 -translate-y-1/2 cursor-grab text-muted-foreground`,"aria-label":g?g(`console.nav.dragToReorder`,{defaultValue:`Drag to reorder`}):`Drag to reorder`,...f,children:(0,i.jsx)(o.GripVertical,{className:`h-3.5 w-3.5`})}),(0,i.jsxs)(r.SidebarMenuButton,{tooltip:n,onClick:()=>l?.(e),children:[(0,i.jsx)(t,{className:`h-4 w-4`}),(0,i.jsx)(`span`,{children:n}),e.badge!=null&&(0,i.jsx)(r.Badge,{variant:e.badgeVariant??`default`,className:`ml-auto text-[10px] px-1.5 py-0`,children:e.badge})]}),u&&d&&(0,i.jsx)(r.SidebarMenuAction,{showOnHover:!0,onClick:()=>d(e.id,!e.pinned),"aria-label":g?g(e.pinned?`console.nav.unpinItem`:`console.nav.pinItem`,{defaultValue:e.pinned?`Unpin ${n}`:`Pin ${n}`,name:n}):e.pinned?`Unpin ${n}`:`Pin ${n}`,children:e.pinned?(0,i.jsx)(o.PinOff,{className:`h-3.5 w-3.5`}):(0,i.jsx)(o.Pin,{className:`h-3.5 w-3.5`})})]})}let b=j(e.icon),{href:x,external:S}=I(e,t),C=x!==`#`&&_.pathname.startsWith(x),w=N(e,p,g,m,h),T=(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(b,{className:`h-4 w-4`}),(0,i.jsx)(`span`,{children:w}),e.badge!=null&&(0,i.jsx)(r.Badge,{variant:e.badgeVariant??`default`,className:`ml-auto text-[10px] px-1.5 py-0`,children:e.badge})]});return(0,i.jsxs)(r.SidebarMenuItem,{children:[f&&(0,i.jsx)(`span`,{className:`absolute left-0.5 top-1/2 -translate-y-1/2 cursor-grab text-muted-foreground`,"aria-label":g?g(`console.nav.dragToReorder`,{defaultValue:`Drag to reorder`}):`Drag to reorder`,...f,children:(0,i.jsx)(o.GripVertical,{className:`h-3.5 w-3.5`})}),(0,i.jsx)(r.SidebarMenuButton,{asChild:!0,isActive:C,tooltip:w,children:S?(0,i.jsx)(`a`,{href:x,target:`_blank`,rel:`noopener noreferrer`,children:T}):(0,i.jsx)(a.Link,{to:x,children:T})}),u&&d&&(0,i.jsx)(r.SidebarMenuAction,{showOnHover:!0,onClick:()=>d(e.id,!e.pinned),"aria-label":g?g(e.pinned?`console.nav.unpinItem`:`console.nav.pinItem`,{defaultValue:e.pinned?`Unpin ${w}`:`Pin ${w}`,name:w}):e.pinned?`Unpin ${w}`:`Pin ${w}`,children:e.pinned?(0,i.jsx)(o.PinOff,{className:`h-3.5 w-3.5`}):(0,i.jsx)(o.Pin,{className:`h-3.5 w-3.5`})})]})}function V({items:e,basePath:t=``,evaluateVisibility:a=P,checkPermission:l=F,onAction:u,searchQuery:d,enablePinning:f,onPinToggle:p,enableReorder:m,onReorder:h,resolveObjectLabel:g,resolveDashboardLabel:_,resolveGroupLabel:v,t:y}){let b=(0,n.useMemo)(()=>d?L(e,d):e,[e,d]),x=(0,n.useMemo)(()=>H(b),[b]),S=b.slice().sort((e,t)=>(e.order??0)-(t.order??0)),C=(0,s.useSensors)((0,s.useSensor)(s.PointerSensor,{activationConstraint:{distance:R}}),(0,s.useSensor)(s.KeyboardSensor)),w=e=>{let{active:t,over:n}=e;if(!n||t.id===n.id||!h)return;let r=S.findIndex(e=>e.id===t.id),i=S.findIndex(e=>e.id===n.id);r===-1||i===-1||h((0,c.arrayMove)(S,r,i).map((e,t)=>({...e,order:t})))},T={basePath:t,evalVis:a,checkPerm:l,onAction:u,enablePinning:f,onPinToggle:p,resolveObjectLabel:g,resolveDashboardLabel:_,resolveGroupLabel:v,t:y},E=S.some(e=>e.type===`group`),D=x.length>0&&f?(0,i.jsxs)(r.SidebarGroup,{children:[(0,i.jsxs)(r.SidebarGroupLabel,{className:`flex items-center gap-1.5`,children:[(0,i.jsx)(o.Star,{className:`h-3.5 w-3.5`}),y?y(`console.nav.favorites`,{defaultValue:`Favorites`}):`Favorites`]}),(0,i.jsx)(r.SidebarGroupContent,{children:(0,i.jsx)(r.SidebarMenu,{children:x.map(e=>(0,i.jsx)(B,{item:e,...T},`fav-${e.id}`))})})]}):null;if(!E){let e=S.filter(e=>e.type!==`group`).map(e=>e.id);return(0,i.jsxs)(i.Fragment,{children:[D,(0,i.jsx)(r.SidebarGroup,{children:(0,i.jsx)(r.SidebarGroupContent,{children:m?(0,i.jsx)(s.DndContext,{sensors:C,collisionDetection:s.closestCenter,onDragEnd:w,children:(0,i.jsx)(c.SortableContext,{items:e,strategy:c.verticalListSortingStrategy,children:(0,i.jsx)(r.SidebarMenu,{children:S.map(e=>(0,i.jsx)(z,{item:e,enableReorder:m,...T},e.id))})})}):(0,i.jsx)(r.SidebarMenu,{children:S.map(e=>(0,i.jsx)(B,{item:e,...T},e.id))})})})]})}let O=[],k=[],A=e=>{if(k.length===0)return;let t=k;k=[],O.push((0,i.jsx)(r.SidebarGroup,{children:(0,i.jsx)(r.SidebarGroupContent,{children:(0,i.jsx)(r.SidebarMenu,{children:t.map(e=>(0,i.jsx)(B,{item:e,...T},e.id))})})},e))};return S.forEach((e,t)=>{e.type===`group`?(A(`leaf-${t}`),O.push((0,i.jsx)(B,{item:e,...T},e.id))):k.push(e)}),A(`leaf-end`),(0,i.jsxs)(i.Fragment,{children:[D,O]})}function H(e){let t=[];for(let n of e)n.pinned&&n.type!==`group`&&n.type!==`separator`&&t.push(n),n.children?.length&&t.push(...H(n.children));return t}function U({areas:e,activeAreaId:t,onAreaChange:n,evalVis:a,checkPerm:s}){let c=e.filter(e=>!(!a(e.visible)||e.requiredPermissions?.length&&!s(e.requiredPermissions)));return c.length<=1?null:(0,i.jsxs)(r.SidebarGroup,{children:[(0,i.jsxs)(r.SidebarGroupLabel,{className:`flex items-center gap-1.5`,children:[(0,i.jsx)(o.Layers,{className:`h-3.5 w-3.5`}),`Area`]}),(0,i.jsx)(r.SidebarGroupContent,{children:(0,i.jsx)(r.SidebarMenu,{children:c.map(e=>{let a=j(e.icon);return(0,i.jsx)(r.SidebarMenuItem,{children:(0,i.jsxs)(r.SidebarMenuButton,{isActive:e.id===t,tooltip:M(e.label),onClick:()=>n(e.id),children:[(0,i.jsx)(a,{className:`h-4 w-4`}),(0,i.jsx)(`span`,{children:M(e.label)})]})},e.id)})})})]})}function W({items:e,basePath:t}){let n=(0,a.useLocation)(),r=e.filter(e=>e.type!==`group`&&e.type!==`separator`).slice(0,5);return r.length===0?null:(0,i.jsx)(`div`,{className:`fixed bottom-0 left-0 right-0 z-50 flex items-center justify-around border-t bg-background/95 backdrop-blur-sm px-2 py-1 sm:hidden safe-area-bottom`,role:`navigation`,"aria-label":`Mobile navigation`,children:r.map(e=>{let r=j(e.icon),o=`#`;e.type===`object`?(o=`${t}/${e.objectName}`,e.viewName&&(o+=`/view/${e.viewName}`)):e.type===`dashboard`?o=e.dashboardName?`${t}/dashboard/${e.dashboardName}`:`#`:e.type===`page`?o=e.pageName?`${t}/page/${e.pageName}`:`#`:e.type===`report`?o=e.reportName?`${t}/report/${e.reportName}`:`#`:e.type===`url`&&(o=e.url??`#`);let s=o!==`#`&&n.pathname.startsWith(o);return(0,i.jsxs)(a.Link,{to:o,className:`flex flex-col items-center gap-0.5 px-2 py-1.5 transition-colors min-w-[44px] min-h-[44px] justify-center ${s?`text-primary`:`text-muted-foreground hover:text-foreground`}`,children:[(0,i.jsx)(r,{className:`h-5 w-5`}),(0,i.jsx)(`span`,{className:`text-[10px] truncate max-w-[60px]`,children:M(e.label)})]},e.id)})})}function G({schema:e,basePath:t,evalVis:a,checkPerm:o,onAction:s,sidebarHeader:c,sidebarFooter:l,sidebarExtra:u,activeAreaId:d,setActiveAreaId:f,resolvedNavigation:p,enableSearch:m,enablePinning:h,onPinToggle:g,enableReorder:_,onReorder:v}){let y=j(e.logo),b=e.areas??[],[x,S]=(0,n.useState)(``);return(0,i.jsxs)(r.Sidebar,{collapsible:`icon`,children:[(0,i.jsxs)(r.SidebarHeader,{children:[c??(0,i.jsx)(r.SidebarMenu,{children:(0,i.jsx)(r.SidebarMenuItem,{children:(0,i.jsxs)(r.SidebarMenuButton,{size:`lg`,tooltip:e.title??e.name,children:[(0,i.jsx)(`div`,{className:`flex aspect-square size-8 items-center justify-center rounded-lg bg-primary text-primary-foreground`,children:e.logo&&e.logo.startsWith(`http`)?(0,i.jsx)(`img`,{src:e.logo,alt:e.title??``,className:`size-6 object-contain`}):(0,i.jsx)(y,{className:`size-4`})}),(0,i.jsxs)(`div`,{className:`grid flex-1 text-left text-sm leading-tight`,children:[(0,i.jsx)(`span`,{className:`truncate font-semibold`,children:e.title??e.name??`App`}),e.description&&(0,i.jsx)(`span`,{className:`truncate text-xs text-muted-foreground`,children:e.description})]})]})})}),m&&(0,i.jsx)(r.SidebarInput,{placeholder:`Search navigation…`,value:x,onChange:e=>S(e.target.value),"aria-label":`Search navigation`})]}),(0,i.jsxs)(r.SidebarContent,{children:[b.length>1&&d&&(0,i.jsx)(U,{areas:b,activeAreaId:d,onAreaChange:f,evalVis:a,checkPerm:o}),(0,i.jsx)(V,{items:p,basePath:t,evaluateVisibility:a,checkPermission:o,onAction:s,searchQuery:x,enablePinning:h,onPinToggle:g,enableReorder:_,onReorder:v}),u]}),l&&(0,i.jsx)(r.SidebarFooter,{children:l})]})}function K({schema:e,basePath:t=``,mobileNavMode:r=`drawer`,evaluateVisibility:a,checkPermission:o,onAction:s,navbar:c,sidebarHeader:l,sidebarFooter:d,sidebarExtra:f,children:p,className:m,defaultOpen:h=!0,enableSearch:g,enablePinning:_,onPinToggle:v,enableReorder:y,onReorder:b}){let x=a??(e=>!(e===!1||e===`false`)),S=o??(()=>!0),C=(0,n.useMemo)(()=>(e.menu??[]).map((e,t)=>(0,u.menuItemToNavigationItem)(e,t)),[e.menu]),w=e.navigation??C,E=e.areas??[],[D,O]=(0,n.useState)(()=>E.length>0?E[0].id:null),k=E.map(e=>e.id).join(`,`);(0,n.useEffect)(()=>{E.length>0?O(e=>E.some(t=>t.id===e)?e:E[0].id):O(null)},[e.name,k]);let A=E.find(e=>e.id===D)?.navigation??w,j={title:e.title,favicon:e.favicon,logo:e.logo};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(T,{sidebar:(0,i.jsx)(G,{schema:e,basePath:t,evalVis:x,checkPerm:S,onAction:s,sidebarHeader:l,sidebarFooter:d,sidebarExtra:f,activeAreaId:D,setActiveAreaId:O,resolvedNavigation:A,enableSearch:g,enablePinning:_,onPinToggle:v,enableReorder:y,onReorder:b}),navbar:c,className:m,defaultOpen:h,branding:j,children:p}),r===`bottom_nav`&&(0,i.jsx)(W,{items:A,basePath:t})]})}var q=e=>e?Array.isArray(e)?e:[e]:[];function J({schema:e,className:t,style:n,id:a,...o}){let s=q(e.children);return(0,i.jsxs)(`div`,{id:a||e.id,className:(0,r.cn)(`flex flex-col h-full space-y-4`,t),style:n,children:[(0,i.jsx)(y,{title:e.title,description:e.description}),(0,i.jsx)(`div`,{className:`flex-1 overflow-auto`,children:s.map((e,t)=>(0,i.jsx)(d.SchemaRenderer,{schema:e,...o},e?.id||t))})]})}function Y(e){return`items`in e&&!(`href`in e)}function X({item:e,pathname:t}){return e.children&&e.children.length>0?(0,i.jsx)(r.Collapsible,{asChild:!0,defaultOpen:!0,className:`group/collapsible`,children:(0,i.jsxs)(r.SidebarMenuItem,{children:[(0,i.jsx)(r.CollapsibleTrigger,{asChild:!0,children:(0,i.jsxs)(r.SidebarMenuButton,{tooltip:e.title,children:[e.icon&&(0,i.jsx)(e.icon,{}),(0,i.jsx)(`span`,{children:e.title}),e.badge!=null&&(0,i.jsx)(r.Badge,{variant:e.badgeVariant||`default`,className:`ml-auto mr-1 h-5 min-w-5 px-1 text-xs`,children:e.badge}),(0,i.jsx)(o.ChevronRight,{className:`ml-auto h-4 w-4 transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90`})]})}),(0,i.jsx)(r.CollapsibleContent,{children:(0,i.jsx)(r.SidebarMenuSub,{children:e.children.map(e=>(0,i.jsx)(r.SidebarMenuSubItem,{children:(0,i.jsx)(r.SidebarMenuSubButton,{asChild:!0,isActive:t===e.href,children:(0,i.jsxs)(a.NavLink,{to:e.href,children:[e.icon&&(0,i.jsx)(e.icon,{}),(0,i.jsx)(`span`,{children:e.title}),e.badge!=null&&(0,i.jsx)(r.Badge,{variant:e.badgeVariant||`default`,className:`ml-auto h-5 min-w-5 px-1 text-xs`,children:e.badge})]})})},e.href))})})]})}):(0,i.jsx)(r.SidebarMenuItem,{children:(0,i.jsx)(r.SidebarMenuButton,{asChild:!0,isActive:t===e.href,tooltip:e.title,children:(0,i.jsxs)(a.NavLink,{to:e.href,children:[e.icon&&(0,i.jsx)(e.icon,{}),(0,i.jsx)(`span`,{children:e.title}),e.badge!=null&&(0,i.jsx)(r.Badge,{variant:e.badgeVariant||`default`,className:`ml-auto h-5 min-w-5 px-1 text-xs`,children:e.badge})]})})})}function Z({items:e,title:t=`Application`,className:s,collapsible:c=`icon`,searchEnabled:l=!1,searchPlaceholder:u=`Search...`}){let d=(0,a.useLocation)(),[f,p]=n.default.useState(``),m=n.default.useMemo(()=>e.length===0?[]:Y(e[0])?e.map(e=>({groupLabel:e.label,items:e.items})):[{items:e}],[e]),h=n.default.useMemo(()=>{if(!f)return m;let e=f.toLowerCase();return m.map(t=>({...t,items:t.items.filter(t=>t.title.toLowerCase().includes(e)||t.children?.some(t=>t.title.toLowerCase().includes(e)))})).filter(e=>e.items.length>0)},[m,f]);return(0,i.jsx)(r.Sidebar,{className:s,collapsible:c,children:(0,i.jsxs)(r.SidebarContent,{children:[l&&(0,i.jsx)(`div`,{className:`px-3 py-2`,children:(0,i.jsxs)(`div`,{className:`relative`,children:[(0,i.jsx)(o.Search,{className:`absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground`}),(0,i.jsx)(r.Input,{type:`search`,placeholder:u,value:f,onChange:e=>p(e.target.value),className:`pl-8 h-9`})]})}),h.map((e,n)=>(0,i.jsxs)(r.SidebarGroup,{children:[n>0&&(0,i.jsx)(`div`,{className:`mx-3 mb-1 h-px bg-sidebar-border/60`,"aria-hidden":!0}),(0,i.jsx)(r.SidebarGroupLabel,{className:`text-[10px] font-semibold uppercase tracking-wider text-sidebar-foreground/60`,children:e.groupLabel||t}),(0,i.jsx)(r.SidebarGroupContent,{children:(0,i.jsx)(r.SidebarMenu,{children:e.items.map(e=>(0,i.jsx)(X,{item:e,pathname:d.pathname},e.href))})})]},e.groupLabel||n))]})})}function Q(){t.ComponentRegistry.register(`page-header`,y,{namespace:`layout`,label:`Page Header`,category:`Layout`,inputs:[{name:`title`,type:`string`},{name:`description`,type:`string`}]}),t.ComponentRegistry.register(`page:header`,y,{namespace:`layout`}),t.ComponentRegistry.register(`page:card`,E,{namespace:`layout`,label:`Page Card`,category:`Layout`,isContainer:!0}),t.ComponentRegistry.register(`app-shell`,T,{namespace:`layout`,label:`App Shell`,category:`Layout`}),t.ComponentRegistry.register(`responsive-grid`,A,{namespace:`layout`,label:`Responsive Grid`,category:`Layout`,isContainer:!0,inputs:[{name:`columns`,type:`object`},{name:`gap`,type:`number`}]}),t.ComponentRegistry.register(`navigation-renderer`,V,{namespace:`layout`,label:`Navigation Renderer`,category:`Layout`,inputs:[{name:`items`,type:`object`},{name:`basePath`,type:`string`}]}),t.ComponentRegistry.register(`app-schema-renderer`,K,{namespace:`layout`,label:`App Schema Renderer`,category:`Layout`,isContainer:!0,inputs:[{name:`schema`,type:`object`},{name:`basePath`,type:`string`},{name:`mobileNavMode`,type:`string`}]})}try{Q()}catch{}e.AppSchemaRenderer=K,e.AppShell=T,e.NavigationRenderer=V,e.Page=J,e.PageCard=E,e.PageHeader=y,e.ResponsiveGrid=A,e.SidebarNav=Z,e.filterNavigationItems=L,e.registerLayout=Q,e.resolveIcon=j,e.resolveLabel=M,e.useAppShellBranding=w});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`@object-ui/core`),require(`react`),require(`@object-ui/components`),require(`react/jsx-runtime`),require(`react-router-dom`),require(`lucide-react`),require(`@dnd-kit/core`),require(`@dnd-kit/sortable`),require(`@dnd-kit/utilities`),require(`@object-ui/types`),require(`@object-ui/react`)):typeof define==`function`&&define.amd?define([`exports`,`@object-ui/core`,`react`,`@object-ui/components`,`react/jsx-runtime`,`react-router-dom`,`lucide-react`,`@dnd-kit/core`,`@dnd-kit/sortable`,`@dnd-kit/utilities`,`@object-ui/types`,`@object-ui/react`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ObjectUILayout={},e._object_ui_core,e.react,e._object_ui_components,e.react_jsx_runtime,e.react_router_dom,e.lucide_react,e._dnd_kit_core,e._dnd_kit_sortable,e._dnd_kit_utilities,e._object_ui_types,e._object_ui_react))})(this,function(e,t,n,r,i,a,o,s,c,l,u,d){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var f=Object.create,p=Object.defineProperty,m=Object.getOwnPropertyDescriptor,h=Object.getOwnPropertyNames,g=Object.getPrototypeOf,_=Object.prototype.hasOwnProperty,v=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=h(t),a=0,o=i.length,s;a<o;a++)s=i[a],!_.call(e,s)&&s!==n&&p(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=m(t,s))||r.enumerable});return e};n=((e,t,n)=>(n=e==null?{}:f(g(e)),v(t||!e||!e.__esModule?p(n,`default`,{value:e,enumerable:!0}):n,e)))(n,1);function y({title:e,description:t,action:n,className:a,children:o,...s}){return(0,i.jsx)(`div`,{className:(0,r.cn)(`flex flex-col gap-4 pb-4 md:pb-8`,a),...s,children:(0,i.jsxs)(`div`,{className:`flex flex-wrap items-end gap-x-4 gap-y-2`,children:[(0,i.jsxs)(`div`,{className:`flex flex-col gap-1 min-w-0`,children:[(0,i.jsx)(`h1`,{className:`text-2xl font-bold tracking-tight md:text-3xl truncate`,children:e}),t&&(0,i.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:t})]}),(n||o)&&(0,i.jsxs)(`div`,{className:`flex items-center gap-2 ml-auto sm:ml-0`,children:[n,o]})]})})}function b(e){let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!t)return null;let n=parseInt(t[1],16)/255,r=parseInt(t[2],16)/255,i=parseInt(t[3],16)/255,a=Math.max(n,r,i),o=Math.min(n,r,i),s=0,c=0,l=(a+o)/2;if(a!==o){let e=a-o;switch(c=l>.5?e/(2-a-o):e/(a+o),a){case n:s=((r-i)/e+(r<i?6:0))/6;break;case r:s=((i-n)/e+2)/6;break;case i:s=((n-r)/e+4)/6;break}}return{h:s*360,s:c*100,l:l*100}}function x(e){let t=b(e);return t?`${Math.round(t.h)} ${Math.round(t.s)}% ${Math.round(t.l)}%`:null}function S(e){let t=b(e);if(!t)return null;let n=Math.max(t.l,65),r=t.s>80?Math.max(t.s-10,70):t.s;return`${Math.round(t.h)} ${Math.round(r)}% ${Math.round(n)}%`}function C(e){let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!t)return`0 0% 100%`;let n=e=>{let t=e/255;return t<=.03928?t/12.92:((t+.055)/1.055)**2.4},r=n(parseInt(t[1],16)),i=n(parseInt(t[2],16)),a=n(parseInt(t[3],16));return .2126*r+.7152*i+.0722*a>.6?`222 47% 11%`:`0 0% 100%`}function w(e,t){(0,n.useEffect)(()=>{let n=document.documentElement,r=()=>n.classList.contains(`dark`),i=()=>{if(e?.primaryColor){let t=x(e.primaryColor),i=S(e.primaryColor),a=r()&&i||t;a&&(n.style.setProperty(`--brand-primary`,e.primaryColor),n.style.setProperty(`--brand-primary-hsl`,t||a),n.style.setProperty(`--primary`,a),n.style.setProperty(`--primary-foreground`,r()?`222 47% 11%`:C(e.primaryColor)),n.style.setProperty(`--ring`,a),n.style.setProperty(`--sidebar-primary`,a),n.style.setProperty(`--sidebar-ring`,a))}else n.style.removeProperty(`--brand-primary`),n.style.removeProperty(`--brand-primary-hsl`),n.style.removeProperty(`--primary`),n.style.removeProperty(`--primary-foreground`),n.style.removeProperty(`--ring`),n.style.removeProperty(`--sidebar-primary`),n.style.removeProperty(`--sidebar-ring`);if(e?.accentColor){let t=x(e.accentColor),i=S(e.accentColor),a=r()&&i||t;a&&(n.style.setProperty(`--brand-accent`,e.accentColor),n.style.setProperty(`--brand-accent-hsl`,t||a),n.style.setProperty(`--accent`,a),n.style.setProperty(`--accent-foreground`,r()?`222 47% 11%`:C(e.accentColor)))}else n.style.removeProperty(`--brand-accent`),n.style.removeProperty(`--brand-accent-hsl`),n.style.removeProperty(`--accent`),n.style.removeProperty(`--accent-foreground`)};i();let a=new MutationObserver(e=>{for(let t of e)if(t.type===`attributes`&&t.attributeName===`class`){i();break}});if(a.observe(n,{attributes:!0,attributeFilter:[`class`]}),e?.favicon){let t=document.querySelector(`#favicon`)||document.querySelector(`link[rel="icon"]`);t&&(t.href=e.favicon)}return t&&(document.title=t),()=>{a.disconnect(),n.style.removeProperty(`--brand-primary`),n.style.removeProperty(`--brand-primary-hsl`),n.style.removeProperty(`--brand-accent`),n.style.removeProperty(`--brand-accent-hsl`),n.style.removeProperty(`--primary`),n.style.removeProperty(`--primary-foreground`),n.style.removeProperty(`--ring`),n.style.removeProperty(`--sidebar-primary`),n.style.removeProperty(`--sidebar-ring`),n.style.removeProperty(`--accent`),n.style.removeProperty(`--accent-foreground`)}},[e?.primaryColor,e?.accentColor,e?.favicon,t])}function T({sidebar:e,navbar:t,children:n,className:a,defaultOpen:o=!0,branding:s}){return w(s,s?.title),(0,i.jsxs)(r.SidebarProvider,{defaultOpen:o,className:`!flex-col`,children:[(0,i.jsx)(`header`,{className:`sticky top-0 z-30 flex h-14 w-full shrink-0 items-center gap-2 border-b bg-background px-2 sm:px-4`,children:t}),(0,i.jsxs)(`div`,{className:`flex flex-1 min-h-0 w-full`,children:[e,(0,i.jsx)(r.SidebarInset,{className:`min-w-0`,children:(0,i.jsx)(`main`,{className:(0,r.cn)(`flex-1 min-w-0 overflow-auto p-3 sm:p-4 md:p-6 pb-20 sm:pb-4 md:pb-6`,a),children:n})})]})]})}function E({className:e,children:t,...n}){return(0,i.jsx)(`div`,{className:(0,r.cn)(`rounded-xl border bg-card text-card-foreground shadow`,e),...n,children:(0,i.jsx)(`div`,{className:`p-6`,children:t})})}var D={xs:{1:`grid-cols-1`,2:`grid-cols-2`,3:`grid-cols-3`,4:`grid-cols-4`,6:`grid-cols-6`,12:`grid-cols-12`},sm:{1:`sm:grid-cols-1`,2:`sm:grid-cols-2`,3:`sm:grid-cols-3`,4:`sm:grid-cols-4`,6:`sm:grid-cols-6`,12:`sm:grid-cols-12`},md:{1:`md:grid-cols-1`,2:`md:grid-cols-2`,3:`md:grid-cols-3`,4:`md:grid-cols-4`,6:`md:grid-cols-6`,12:`md:grid-cols-12`},lg:{1:`lg:grid-cols-1`,2:`lg:grid-cols-2`,3:`lg:grid-cols-3`,4:`lg:grid-cols-4`,6:`lg:grid-cols-6`,12:`lg:grid-cols-12`},xl:{1:`xl:grid-cols-1`,2:`xl:grid-cols-2`,3:`xl:grid-cols-3`,4:`xl:grid-cols-4`,6:`xl:grid-cols-6`,12:`xl:grid-cols-12`},"2xl":{1:`2xl:grid-cols-1`,2:`2xl:grid-cols-2`,3:`2xl:grid-cols-3`,4:`2xl:grid-cols-4`,6:`2xl:grid-cols-6`,12:`2xl:grid-cols-12`}};function O(e){if(!e)return`grid-cols-1`;let t=[];for(let[n,r]of Object.entries(e)){let e=D[n];if(e&&r){let n=Object.keys(e).map(Number).reduce((e,t)=>Math.abs(t-r)<Math.abs(e-r)?t:e);t.push(e[n])}}return t.join(` `)||`grid-cols-1`}var k={0:`gap-0`,1:`gap-1`,2:`gap-2`,3:`gap-3`,4:`gap-4`,5:`gap-5`,6:`gap-6`,8:`gap-8`},A=({columns:e,gap:t=4,className:n,children:a})=>(0,i.jsx)(`div`,{className:(0,r.cn)(`grid`,O(e),typeof t==`number`?k[t]||`gap-${t}`:``,n),children:a});function j(e){return e?(0,r.getLazyIcon)(e):o.FileText}function M(e,t){if(typeof e==`string`)return e;if(t){let n=t(e.key,{defaultValue:e.defaultValue,...e.params});if(n&&n!==e.key)return n}return e.defaultValue||e.key}function N(e,t,n,r,i){let a=M(e.label,n);return typeof e.label==`string`?t&&e.type===`object`&&e.objectName?t(e.objectName,a):r&&e.type===`dashboard`&&e.dashboardName?r(e.dashboardName,a):i&&e.type===`group`&&e.id?i(e.id,a):a:a}var P=e=>!(e===!1||e===`false`),F=()=>!0,I=()=>!0;function L(e,t){switch(e.type){case`object`:{let n=`${t}/${e.objectName??``}`;return{href:e.viewName?`${n}/view/${e.viewName}`:n,external:!1}}case`dashboard`:return{href:e.dashboardName?`${t}/dashboard/${e.dashboardName}`:`#`,external:!1};case`page`:return{href:e.pageName?`${t}/page/${e.pageName}`:`#`,external:!1};case`report`:return{href:e.reportName?`${t}/report/${e.reportName}`:`#`,external:!1};case`url`:return{href:e.url??`#`,external:e.target===`_blank`};default:return{href:`#`,external:!1}}}function R(e,t){if(!t.trim())return e;let n=t.toLowerCase().trim();return e.reduce((e,r)=>{if(r.type===`separator`)return e;if(r.type===`group`&&r.children?.length){let n=R(r.children,t);return n.length>0&&e.push({...r,children:n}),e}return M(r.label).toLowerCase().includes(n)&&e.push(r),e},[])}var z=5;function B({item:e,basePath:t,evalVis:n,checkPerm:r,checkCap:a,onAction:o,enablePinning:s,onPinToggle:u,enableReorder:d,resolveObjectLabel:f,resolveDashboardLabel:p,resolveGroupLabel:m,t:h}){let{attributes:g,listeners:_,setNodeRef:v,transform:y,transition:b,isDragging:x}=(0,c.useSortable)({id:e.id,disabled:!d});return(0,i.jsx)(`div`,{ref:v,style:{transform:l.CSS.Transform.toString(y),transition:b,opacity:x?.5:void 0,zIndex:x?10:void 0},...g,children:(0,i.jsx)(V,{item:e,basePath:t,evalVis:n,checkPerm:r,checkCap:a,onAction:o,enablePinning:s,onPinToggle:u,dragListeners:d?_:void 0,resolveObjectLabel:f,resolveDashboardLabel:p,resolveGroupLabel:m,t:h})})}function V({item:e,basePath:t,evalVis:s,checkPerm:c,checkCap:l,onAction:u,enablePinning:d,onPinToggle:f,dragListeners:p,resolveObjectLabel:m,resolveDashboardLabel:h,resolveGroupLabel:g,t:_}){let v=(0,a.useLocation)(),[y,b]=(0,n.useState)(e.defaultOpen!==!1);if(!s(e.visible)||e.requiredPermissions?.length&&!c(e.requiredPermissions))return null;let x=e.requiresObject,S=e.requiresService;if(x&&!l(`object`,x)||S&&!l(`service`,S))return null;if(e.type===`separator`)return(0,i.jsx)(r.Separator,{className:`my-2`});if(e.type===`group`){let n=(e.children??[]).slice().sort((e,t)=>(e.order??0)-(t.order??0));return(0,i.jsx)(r.Collapsible,{open:y,onOpenChange:b,children:(0,i.jsxs)(r.SidebarGroup,{children:[(0,i.jsx)(r.SidebarGroupLabel,{asChild:!0,children:(0,i.jsxs)(r.CollapsibleTrigger,{className:`flex w-full items-center justify-between`,children:[N(e,m,_,h,g),(0,i.jsx)(o.ChevronRight,{className:`ml-auto h-4 w-4 transition-transform ${y?`rotate-90`:``}`})]})}),(0,i.jsx)(r.CollapsibleContent,{children:(0,i.jsx)(r.SidebarGroupContent,{children:(0,i.jsx)(r.SidebarMenu,{children:n.map(e=>(0,i.jsx)(V,{item:e,basePath:t,evalVis:s,checkPerm:c,checkCap:l,onAction:u,enablePinning:d,onPinToggle:f,resolveObjectLabel:m,resolveDashboardLabel:h,resolveGroupLabel:g,t:_},e.id))})})})]})})}if(e.type===`action`){let t=j(e.icon),n=M(e.label,_);return(0,i.jsxs)(r.SidebarMenuItem,{children:[p&&(0,i.jsx)(`span`,{className:`absolute left-0.5 top-1/2 -translate-y-1/2 cursor-grab text-muted-foreground`,"aria-label":_?_(`console.nav.dragToReorder`,{defaultValue:`Drag to reorder`}):`Drag to reorder`,...p,children:(0,i.jsx)(o.GripVertical,{className:`h-3.5 w-3.5`})}),(0,i.jsxs)(r.SidebarMenuButton,{tooltip:n,onClick:()=>u?.(e),children:[(0,i.jsx)(t,{className:`h-4 w-4`}),(0,i.jsx)(`span`,{children:n}),e.badge!=null&&(0,i.jsx)(r.Badge,{variant:e.badgeVariant??`default`,className:`ml-auto text-[10px] px-1.5 py-0`,children:e.badge})]}),d&&f&&(0,i.jsx)(r.SidebarMenuAction,{showOnHover:!0,onClick:()=>f(e.id,!e.pinned),"aria-label":_?_(e.pinned?`console.nav.unpinItem`:`console.nav.pinItem`,{defaultValue:e.pinned?`Unpin ${n}`:`Pin ${n}`,name:n}):e.pinned?`Unpin ${n}`:`Pin ${n}`,children:e.pinned?(0,i.jsx)(o.PinOff,{className:`h-3.5 w-3.5`}):(0,i.jsx)(o.Pin,{className:`h-3.5 w-3.5`})})]})}let C=j(e.icon),{href:w,external:T}=L(e,t),E=w!==`#`&&v.pathname.startsWith(w),D=N(e,m,_,h,g),O=(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(C,{className:`h-4 w-4`}),(0,i.jsx)(`span`,{children:D}),e.badge!=null&&(0,i.jsx)(r.Badge,{variant:e.badgeVariant??`default`,className:`ml-auto text-[10px] px-1.5 py-0`,children:e.badge})]});return(0,i.jsxs)(r.SidebarMenuItem,{children:[p&&(0,i.jsx)(`span`,{className:`absolute left-0.5 top-1/2 -translate-y-1/2 cursor-grab text-muted-foreground`,"aria-label":_?_(`console.nav.dragToReorder`,{defaultValue:`Drag to reorder`}):`Drag to reorder`,...p,children:(0,i.jsx)(o.GripVertical,{className:`h-3.5 w-3.5`})}),(0,i.jsx)(r.SidebarMenuButton,{asChild:!0,isActive:E,tooltip:D,children:T?(0,i.jsx)(`a`,{href:w,target:`_blank`,rel:`noopener noreferrer`,children:O}):(0,i.jsx)(a.Link,{to:w,children:O})}),d&&f&&(0,i.jsx)(r.SidebarMenuAction,{showOnHover:!0,onClick:()=>f(e.id,!e.pinned),"aria-label":_?_(e.pinned?`console.nav.unpinItem`:`console.nav.pinItem`,{defaultValue:e.pinned?`Unpin ${D}`:`Pin ${D}`,name:D}):e.pinned?`Unpin ${D}`:`Pin ${D}`,children:e.pinned?(0,i.jsx)(o.PinOff,{className:`h-3.5 w-3.5`}):(0,i.jsx)(o.Pin,{className:`h-3.5 w-3.5`})})]})}function H({items:e,basePath:t=``,evaluateVisibility:a=P,checkPermission:l=F,checkCapability:u=I,onAction:d,searchQuery:f,enablePinning:p,onPinToggle:m,enableReorder:h,onReorder:g,resolveObjectLabel:_,resolveDashboardLabel:v,resolveGroupLabel:y,t:b}){let x=(0,n.useMemo)(()=>f?R(e,f):e,[e,f]),S=(0,n.useMemo)(()=>U(x),[x]),C=x.slice().sort((e,t)=>(e.order??0)-(t.order??0)),w=(0,s.useSensors)((0,s.useSensor)(s.PointerSensor,{activationConstraint:{distance:z}}),(0,s.useSensor)(s.KeyboardSensor)),T=e=>{let{active:t,over:n}=e;if(!n||t.id===n.id||!g)return;let r=C.findIndex(e=>e.id===t.id),i=C.findIndex(e=>e.id===n.id);r===-1||i===-1||g((0,c.arrayMove)(C,r,i).map((e,t)=>({...e,order:t})))},E={basePath:t,evalVis:a,checkPerm:l,checkCap:u,onAction:d,enablePinning:p,onPinToggle:m,resolveObjectLabel:_,resolveDashboardLabel:v,resolveGroupLabel:y,t:b},D=C.some(e=>e.type===`group`),O=S.length>0&&p?(0,i.jsxs)(r.SidebarGroup,{children:[(0,i.jsxs)(r.SidebarGroupLabel,{className:`flex items-center gap-1.5`,children:[(0,i.jsx)(o.Star,{className:`h-3.5 w-3.5`}),b?b(`console.nav.favorites`,{defaultValue:`Favorites`}):`Favorites`]}),(0,i.jsx)(r.SidebarGroupContent,{children:(0,i.jsx)(r.SidebarMenu,{children:S.map(e=>(0,i.jsx)(V,{item:e,...E},`fav-${e.id}`))})})]}):null;if(!D){let e=C.filter(e=>e.type!==`group`).map(e=>e.id);return(0,i.jsxs)(i.Fragment,{children:[O,(0,i.jsx)(r.SidebarGroup,{children:(0,i.jsx)(r.SidebarGroupContent,{children:h?(0,i.jsx)(s.DndContext,{sensors:w,collisionDetection:s.closestCenter,onDragEnd:T,children:(0,i.jsx)(c.SortableContext,{items:e,strategy:c.verticalListSortingStrategy,children:(0,i.jsx)(r.SidebarMenu,{children:C.map(e=>(0,i.jsx)(B,{item:e,enableReorder:h,...E},e.id))})})}):(0,i.jsx)(r.SidebarMenu,{children:C.map(e=>(0,i.jsx)(V,{item:e,...E},e.id))})})})]})}let k=[],A=[],j=e=>{if(A.length===0)return;let t=A;A=[],k.push((0,i.jsx)(r.SidebarGroup,{children:(0,i.jsx)(r.SidebarGroupContent,{children:(0,i.jsx)(r.SidebarMenu,{children:t.map(e=>(0,i.jsx)(V,{item:e,...E},e.id))})})},e))};return C.forEach((e,t)=>{e.type===`group`?(j(`leaf-${t}`),k.push((0,i.jsx)(V,{item:e,...E},e.id))):A.push(e)}),j(`leaf-end`),(0,i.jsxs)(i.Fragment,{children:[O,k]})}function U(e){let t=[];for(let n of e)n.pinned&&n.type!==`group`&&n.type!==`separator`&&t.push(n),n.children?.length&&t.push(...U(n.children));return t}function W({areas:e,activeAreaId:t,onAreaChange:n,evalVis:a,checkPerm:s}){let c=e.filter(e=>!(!a(e.visible)||e.requiredPermissions?.length&&!s(e.requiredPermissions)));return c.length<=1?null:(0,i.jsxs)(r.SidebarGroup,{children:[(0,i.jsxs)(r.SidebarGroupLabel,{className:`flex items-center gap-1.5`,children:[(0,i.jsx)(o.Layers,{className:`h-3.5 w-3.5`}),`Area`]}),(0,i.jsx)(r.SidebarGroupContent,{children:(0,i.jsx)(r.SidebarMenu,{children:c.map(e=>{let a=j(e.icon);return(0,i.jsx)(r.SidebarMenuItem,{children:(0,i.jsxs)(r.SidebarMenuButton,{isActive:e.id===t,tooltip:M(e.label),onClick:()=>n(e.id),children:[(0,i.jsx)(a,{className:`h-4 w-4`}),(0,i.jsx)(`span`,{children:M(e.label)})]})},e.id)})})})]})}function G({items:e,basePath:t}){let n=(0,a.useLocation)(),r=e=>{let t=[];for(let n of e)n.type!==`separator`&&(n.type===`group`?t.push(...r(n.children||[])):t.push(n));return t},o=r(e).slice(0,5);return o.length===0?null:(0,i.jsx)(`div`,{className:`fixed bottom-0 left-0 right-0 z-50 flex items-center justify-around border-t bg-background/95 backdrop-blur-sm px-2 py-1 sm:hidden safe-area-bottom`,role:`navigation`,"aria-label":`Mobile navigation`,children:o.map(e=>{let r=j(e.icon),o=`#`;e.type===`object`?(o=`${t}/${e.objectName}`,e.viewName&&(o+=`/view/${e.viewName}`)):e.type===`dashboard`?o=e.dashboardName?`${t}/dashboard/${e.dashboardName}`:`#`:e.type===`page`?o=e.pageName?`${t}/page/${e.pageName}`:`#`:e.type===`report`?o=e.reportName?`${t}/report/${e.reportName}`:`#`:e.type===`url`&&(o=e.url??`#`);let s=o!==`#`&&n.pathname.startsWith(o);return(0,i.jsxs)(a.Link,{to:o,className:`flex flex-col items-center gap-0.5 px-2 py-1.5 transition-colors min-w-[44px] min-h-[44px] justify-center ${s?`text-primary`:`text-muted-foreground hover:text-foreground`}`,children:[(0,i.jsx)(r,{className:`h-5 w-5`}),(0,i.jsx)(`span`,{className:`text-[10px] truncate max-w-[60px]`,children:M(e.label)})]},e.id)})})}function K({schema:e,basePath:t,evalVis:a,checkPerm:o,checkCap:s,onAction:c,sidebarHeader:l,sidebarFooter:u,sidebarExtra:d,activeAreaId:f,setActiveAreaId:p,resolvedNavigation:m,enableSearch:h,enablePinning:g,onPinToggle:_,enableReorder:v,onReorder:y}){let b=j(e.logo),x=e.areas??[],[S,C]=(0,n.useState)(``);return(0,i.jsxs)(r.Sidebar,{collapsible:`icon`,children:[(0,i.jsxs)(r.SidebarHeader,{children:[l??(0,i.jsx)(r.SidebarMenu,{children:(0,i.jsx)(r.SidebarMenuItem,{children:(0,i.jsxs)(r.SidebarMenuButton,{size:`lg`,tooltip:e.title??e.name,children:[(0,i.jsx)(`div`,{className:`flex aspect-square size-8 items-center justify-center rounded-lg bg-primary text-primary-foreground`,children:e.logo&&e.logo.startsWith(`http`)?(0,i.jsx)(`img`,{src:e.logo,alt:e.title??``,className:`size-6 object-contain`}):(0,i.jsx)(b,{className:`size-4`})}),(0,i.jsxs)(`div`,{className:`grid flex-1 text-left text-sm leading-tight`,children:[(0,i.jsx)(`span`,{className:`truncate font-semibold`,children:e.title??e.name??`App`}),e.description&&(0,i.jsx)(`span`,{className:`truncate text-xs text-muted-foreground`,children:e.description})]})]})})}),h&&(0,i.jsx)(r.SidebarInput,{placeholder:`Search navigation…`,value:S,onChange:e=>C(e.target.value),"aria-label":`Search navigation`})]}),(0,i.jsxs)(r.SidebarContent,{children:[x.length>1&&f&&(0,i.jsx)(W,{areas:x,activeAreaId:f,onAreaChange:p,evalVis:a,checkPerm:o}),(0,i.jsx)(H,{items:m,basePath:t,evaluateVisibility:a,checkPermission:o,checkCapability:s,onAction:c,searchQuery:S,enablePinning:g,onPinToggle:_,enableReorder:v,onReorder:y}),d]}),u&&(0,i.jsx)(r.SidebarFooter,{children:u})]})}function q({schema:e,basePath:t=``,mobileNavMode:r=`drawer`,evaluateVisibility:a,checkPermission:o,checkCapability:s,onAction:c,navbar:l,sidebarHeader:d,sidebarFooter:f,sidebarExtra:p,children:m,className:h,defaultOpen:g=!0,enableSearch:_,enablePinning:v,onPinToggle:y,enableReorder:b,onReorder:x}){let S=a??(e=>!(e===!1||e===`false`)),C=o??(()=>!0),w=s??(()=>!0),E=(0,n.useMemo)(()=>(e.menu??[]).map((e,t)=>(0,u.menuItemToNavigationItem)(e,t)),[e.menu]),D=e.navigation??E,O=e.areas??[],[k,A]=(0,n.useState)(()=>O.length>0?O[0].id:null),j=O.map(e=>e.id).join(`,`);(0,n.useEffect)(()=>{O.length>0?A(e=>O.some(t=>t.id===e)?e:O[0].id):A(null)},[e.name,j]);let M=O.find(e=>e.id===k)?.navigation??D,N={title:e.title,favicon:e.favicon,logo:e.logo};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(T,{sidebar:(0,i.jsx)(K,{schema:e,basePath:t,evalVis:S,checkPerm:C,checkCap:w,onAction:c,sidebarHeader:d,sidebarFooter:f,sidebarExtra:p,activeAreaId:k,setActiveAreaId:A,resolvedNavigation:M,enableSearch:_,enablePinning:v,onPinToggle:y,enableReorder:b,onReorder:x}),navbar:l,className:h,defaultOpen:g,branding:N,children:m}),r===`bottom_nav`&&(0,i.jsx)(G,{items:M,basePath:t})]})}var J=e=>e?Array.isArray(e)?e:[e]:[];function Y({schema:e,className:t,style:n,id:a,...o}){let s=J(e.children);return(0,i.jsxs)(`div`,{id:a||e.id,className:(0,r.cn)(`flex flex-col h-full space-y-4`,t),style:n,children:[(0,i.jsx)(y,{title:e.title,description:e.description}),(0,i.jsx)(`div`,{className:`flex-1 overflow-auto`,children:s.map((e,t)=>(0,i.jsx)(d.SchemaRenderer,{schema:e,...o},e?.id||t))})]})}function X(e){return`items`in e&&!(`href`in e)}function Z({item:e,pathname:t}){return e.children&&e.children.length>0?(0,i.jsx)(r.Collapsible,{asChild:!0,defaultOpen:!0,className:`group/collapsible`,children:(0,i.jsxs)(r.SidebarMenuItem,{children:[(0,i.jsx)(r.CollapsibleTrigger,{asChild:!0,children:(0,i.jsxs)(r.SidebarMenuButton,{tooltip:e.title,children:[e.icon&&(0,i.jsx)(e.icon,{}),(0,i.jsx)(`span`,{children:e.title}),e.badge!=null&&(0,i.jsx)(r.Badge,{variant:e.badgeVariant||`default`,className:`ml-auto mr-1 h-5 min-w-5 px-1 text-xs`,children:e.badge}),(0,i.jsx)(o.ChevronRight,{className:`ml-auto h-4 w-4 transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90`})]})}),(0,i.jsx)(r.CollapsibleContent,{children:(0,i.jsx)(r.SidebarMenuSub,{children:e.children.map(e=>(0,i.jsx)(r.SidebarMenuSubItem,{children:(0,i.jsx)(r.SidebarMenuSubButton,{asChild:!0,isActive:t===e.href,children:(0,i.jsxs)(a.NavLink,{to:e.href,children:[e.icon&&(0,i.jsx)(e.icon,{}),(0,i.jsx)(`span`,{children:e.title}),e.badge!=null&&(0,i.jsx)(r.Badge,{variant:e.badgeVariant||`default`,className:`ml-auto h-5 min-w-5 px-1 text-xs`,children:e.badge})]})})},e.href))})})]})}):(0,i.jsx)(r.SidebarMenuItem,{children:(0,i.jsx)(r.SidebarMenuButton,{asChild:!0,isActive:t===e.href,tooltip:e.title,children:(0,i.jsxs)(a.NavLink,{to:e.href,children:[e.icon&&(0,i.jsx)(e.icon,{}),(0,i.jsx)(`span`,{children:e.title}),e.badge!=null&&(0,i.jsx)(r.Badge,{variant:e.badgeVariant||`default`,className:`ml-auto h-5 min-w-5 px-1 text-xs`,children:e.badge})]})})})}function Q({items:e,title:t=`Application`,className:s,collapsible:c=`icon`,searchEnabled:l=!1,searchPlaceholder:u=`Search...`}){let d=(0,a.useLocation)(),[f,p]=n.default.useState(``),m=n.default.useMemo(()=>e.length===0?[]:X(e[0])?e.map(e=>({groupLabel:e.label,items:e.items})):[{items:e}],[e]),h=n.default.useMemo(()=>{if(!f)return m;let e=f.toLowerCase();return m.map(t=>({...t,items:t.items.filter(t=>t.title.toLowerCase().includes(e)||t.children?.some(t=>t.title.toLowerCase().includes(e)))})).filter(e=>e.items.length>0)},[m,f]);return(0,i.jsx)(r.Sidebar,{className:s,collapsible:c,children:(0,i.jsxs)(r.SidebarContent,{children:[l&&(0,i.jsx)(`div`,{className:`px-3 py-2`,children:(0,i.jsxs)(`div`,{className:`relative`,children:[(0,i.jsx)(o.Search,{className:`absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground`}),(0,i.jsx)(r.Input,{type:`search`,placeholder:u,value:f,onChange:e=>p(e.target.value),className:`pl-8 h-9`})]})}),h.map((e,n)=>(0,i.jsxs)(r.SidebarGroup,{children:[n>0&&(0,i.jsx)(`div`,{className:`mx-3 mb-1 h-px bg-sidebar-border/60`,"aria-hidden":!0}),(0,i.jsx)(r.SidebarGroupLabel,{className:`text-[10px] font-semibold uppercase tracking-wider text-sidebar-foreground/60`,children:e.groupLabel||t}),(0,i.jsx)(r.SidebarGroupContent,{children:(0,i.jsx)(r.SidebarMenu,{children:e.items.map(e=>(0,i.jsx)(Z,{item:e,pathname:d.pathname},e.href))})})]},e.groupLabel||n))]})})}function $(){t.ComponentRegistry.register(`page-header`,y,{namespace:`layout`,label:`Page Header`,category:`Layout`,inputs:[{name:`title`,type:`string`},{name:`description`,type:`string`}]}),t.ComponentRegistry.register(`page:header`,y,{namespace:`layout`}),t.ComponentRegistry.register(`page:card`,E,{namespace:`layout`,label:`Page Card`,category:`Layout`,isContainer:!0}),t.ComponentRegistry.register(`app-shell`,T,{namespace:`layout`,label:`App Shell`,category:`Layout`}),t.ComponentRegistry.register(`responsive-grid`,A,{namespace:`layout`,label:`Responsive Grid`,category:`Layout`,isContainer:!0,inputs:[{name:`columns`,type:`object`},{name:`gap`,type:`number`}]}),t.ComponentRegistry.register(`navigation-renderer`,H,{namespace:`layout`,label:`Navigation Renderer`,category:`Layout`,inputs:[{name:`items`,type:`object`},{name:`basePath`,type:`string`}]}),t.ComponentRegistry.register(`app-schema-renderer`,q,{namespace:`layout`,label:`App Schema Renderer`,category:`Layout`,isContainer:!0,inputs:[{name:`schema`,type:`object`},{name:`basePath`,type:`string`},{name:`mobileNavMode`,type:`string`}]})}try{$()}catch{}e.AppSchemaRenderer=q,e.AppShell=T,e.NavigationRenderer=H,e.Page=Y,e.PageCard=E,e.PageHeader=y,e.ResponsiveGrid=A,e.SidebarNav=Q,e.filterNavigationItems=R,e.registerLayout=$,e.resolveIcon=j,e.resolveLabel=M,e.useAppShellBranding=w});
@@ -1,6 +1,6 @@
1
1
  import { default as React } from 'react';
2
2
  import { AppSchema, NavigationItem } from '../../types/src';
3
- import { VisibilityEvaluator, PermissionChecker } from './NavigationRenderer';
3
+ import { VisibilityEvaluator, PermissionChecker, CapabilityChecker } from './NavigationRenderer';
4
4
  /** Mobile navigation display mode */
5
5
  export type MobileNavMode = 'drawer' | 'bottom_nav' | 'hamburger';
6
6
  export interface AppSchemaRendererProps {
@@ -14,6 +14,8 @@ export interface AppSchemaRendererProps {
14
14
  evaluateVisibility?: VisibilityEvaluator;
15
15
  /** Optional permission checker passed to NavigationRenderer */
16
16
  checkPermission?: PermissionChecker;
17
+ /** Optional capability checker passed to NavigationRenderer (gates `requiresObject` / `requiresService`) */
18
+ checkCapability?: CapabilityChecker;
17
19
  /** Called when an action-type navigation item is clicked */
18
20
  onAction?: (item: NavigationItem) => void;
19
21
  /** Slot: top navbar content (rendered beside the sidebar trigger) */
@@ -65,4 +67,4 @@ export interface AppSchemaRendererProps {
65
67
  * </AppSchemaRenderer>
66
68
  * ```
67
69
  */
68
- export declare function AppSchemaRenderer({ schema, basePath, mobileNavMode, evaluateVisibility: evalVisProp, checkPermission: checkPermProp, onAction, navbar, sidebarHeader, sidebarFooter, sidebarExtra, children, className, defaultOpen, enableSearch, enablePinning, onPinToggle, enableReorder, onReorder, }: AppSchemaRendererProps): import("react/jsx-runtime").JSX.Element;
70
+ export declare function AppSchemaRenderer({ schema, basePath, mobileNavMode, evaluateVisibility: evalVisProp, checkPermission: checkPermProp, checkCapability: checkCapProp, onAction, navbar, sidebarHeader, sidebarFooter, sidebarExtra, children, className, defaultOpen, enableSearch, enablePinning, onPinToggle, enableReorder, onReorder, }: AppSchemaRendererProps): import("react/jsx-runtime").JSX.Element;
@@ -13,6 +13,20 @@ export type VisibilityEvaluator = (expression: string | boolean | undefined) =>
13
13
  * When not provided, all items default to permitted.
14
14
  */
15
15
  export type PermissionChecker = (permissions: string[]) => boolean;
16
+ /**
17
+ * Callback to check whether the runtime advertises the named capabilities.
18
+ *
19
+ * Used to gate navigation entries that target objects or services which
20
+ * may not exist in every runtime (e.g. `sys_app` / `sys_package` only
21
+ * live in the cloud control-plane). When `requiresObject` or
22
+ * `requiresService` is set on a navigation item and the checker returns
23
+ * `false`, the item is hidden — preventing the 404-when-clicked trap.
24
+ *
25
+ * When not provided, capability gates default to *pass* (i.e. always
26
+ * shown) so navigation works in environments that haven't wired up a
27
+ * runtime capability probe yet.
28
+ */
29
+ export type CapabilityChecker = (kind: 'object' | 'service', name: string) => boolean;
16
30
  export interface NavigationRendererProps {
17
31
  /** Navigation items to render */
18
32
  items: NavigationItem[];
@@ -25,6 +39,8 @@ export interface NavigationRendererProps {
25
39
  evaluateVisibility?: VisibilityEvaluator;
26
40
  /** Optional permission checker for `requiredPermissions` */
27
41
  checkPermission?: PermissionChecker;
42
+ /** Optional runtime-capability checker for `requiresObject` / `requiresService` */
43
+ checkCapability?: CapabilityChecker;
28
44
  /** Called when an `action`-type item is clicked */
29
45
  onAction?: (item: NavigationItem) => void;
30
46
  /** Search query to filter navigation items by label */
@@ -118,4 +134,4 @@ export declare function filterNavigationItems(items: NavigationItem[], query: st
118
134
  * />
119
135
  * ```
120
136
  */
121
- export declare function NavigationRenderer({ items, basePath, evaluateVisibility: evalVis, checkPermission: checkPerm, onAction, searchQuery, enablePinning, onPinToggle, enableReorder, onReorder, resolveObjectLabel, resolveDashboardLabel, resolveGroupLabel, t: tProp, }: NavigationRendererProps): import("react/jsx-runtime").JSX.Element;
137
+ export declare function NavigationRenderer({ items, basePath, evaluateVisibility: evalVis, checkPermission: checkPerm, checkCapability: checkCap, onAction, searchQuery, enablePinning, onPinToggle, enableReorder, onReorder, resolveObjectLabel, resolveDashboardLabel, resolveGroupLabel, t: tProp, }: NavigationRendererProps): import("react/jsx-runtime").JSX.Element;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@object-ui/layout",
3
- "version": "4.0.10",
3
+ "version": "4.0.12",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "main": "dist/index.umd.cjs",
@@ -18,14 +18,14 @@
18
18
  "@dnd-kit/sortable": "^10.0.0",
19
19
  "@dnd-kit/utilities": "^3.2.2",
20
20
  "clsx": "^2.1.1",
21
- "lucide-react": "^1.14.0",
21
+ "lucide-react": "^1.16.0",
22
22
  "react": "19.2.6",
23
23
  "react-dom": "19.2.6",
24
24
  "tailwind-merge": "^3.6.0",
25
- "@object-ui/components": "4.0.10",
26
- "@object-ui/core": "4.0.10",
27
- "@object-ui/react": "4.0.10",
28
- "@object-ui/types": "4.0.10"
25
+ "@object-ui/components": "4.0.12",
26
+ "@object-ui/core": "4.0.12",
27
+ "@object-ui/react": "4.0.12",
28
+ "@object-ui/types": "4.0.12"
29
29
  },
30
30
  "peerDependencies": {
31
31
  "react": "^18.0.0 || ^19.0.0",
@@ -33,9 +33,9 @@
33
33
  "react-router-dom": "^6.0.0 || ^7.0.0"
34
34
  },
35
35
  "devDependencies": {
36
- "@vitejs/plugin-react": "^6.0.1",
36
+ "@vitejs/plugin-react": "^6.0.2",
37
37
  "react-router-dom": "^7.15.0",
38
- "vite": "^8.0.12",
38
+ "vite": "^8.0.13",
39
39
  "vite-plugin-dts": "^5.0.0"
40
40
  },
41
41
  "description": "Layout components for Object UI — AppShell, Page, SidebarNav and responsive containers with React Router integration",