@object-ui/layout 4.0.10 → 4.0.11

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,14 @@
1
1
  # @object-ui/layout
2
2
 
3
+ ## 4.0.11
4
+
5
+ ### Patch Changes
6
+
7
+ - @object-ui/components@4.0.11
8
+ - @object-ui/react@4.0.11
9
+ - @object-ui/types@4.0.11
10
+ - @object-ui/core@4.0.11
11
+
3
12
  ## 4.0.10
4
13
 
5
14
  ### 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", {
@@ -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,7 +512,7 @@ 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 }) {
515
+ function ke({ items: e, basePath: t }) {
511
516
  let n = F(), r = e.filter((e) => e.type !== "group" && e.type !== "separator").slice(0, 5);
512
517
  return r.length === 0 ? null : /* @__PURE__ */ j("div", {
513
518
  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",
@@ -528,12 +533,12 @@ function Oe({ items: e, basePath: t }) {
528
533
  })
529
534
  });
530
535
  }
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("");
536
+ 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 }) {
537
+ let E = Y(e.logo), D = e.areas ?? [], [O, k] = i("");
533
538
  return /* @__PURE__ */ M(d, {
534
539
  collapsible: "icon",
535
540
  children: [
536
- /* @__PURE__ */ M(_, { children: [o ?? /* @__PURE__ */ j(b, { children: /* @__PURE__ */ j(C, { children: /* @__PURE__ */ M(S, {
541
+ /* @__PURE__ */ M(_, { children: [s ?? /* @__PURE__ */ j(b, { children: /* @__PURE__ */ j(C, { children: /* @__PURE__ */ M(S, {
537
542
  size: "lg",
538
543
  tooltip: e.title ?? e.name,
539
544
  children: [/* @__PURE__ */ j("div", {
@@ -542,7 +547,7 @@ function ke({ schema: e, basePath: t, evalVis: n, checkPerm: r, onAction: a, sid
542
547
  src: e.logo,
543
548
  alt: e.title ?? "",
544
549
  className: "size-6 object-contain"
545
- }) : /* @__PURE__ */ j(T, { className: "size-4" })
550
+ }) : /* @__PURE__ */ j(E, { className: "size-4" })
546
551
  }), /* @__PURE__ */ M("div", {
547
552
  className: "grid flex-1 text-left text-sm leading-tight",
548
553
  children: [/* @__PURE__ */ j("span", {
@@ -553,92 +558,94 @@ function ke({ schema: e, basePath: t, evalVis: n, checkPerm: r, onAction: a, sid
553
558
  children: e.description
554
559
  })]
555
560
  })]
556
- }) }) }), h && /* @__PURE__ */ j(v, {
561
+ }) }) }), g && /* @__PURE__ */ j(v, {
557
562
  placeholder: "Search navigation…",
558
- value: D,
559
- onChange: (e) => O(e.target.value),
563
+ value: O,
564
+ onChange: (e) => k(e.target.value),
560
565
  "aria-label": "Search navigation"
561
566
  })] }),
562
567
  /* @__PURE__ */ M(f, { children: [
563
- E.length > 1 && l && /* @__PURE__ */ j(De, {
564
- areas: E,
565
- activeAreaId: l,
566
- onAreaChange: u,
568
+ D.length > 1 && u && /* @__PURE__ */ j(Oe, {
569
+ areas: D,
570
+ activeAreaId: u,
571
+ onAreaChange: m,
567
572
  evalVis: n,
568
573
  checkPerm: r
569
574
  }),
570
575
  /* @__PURE__ */ j($, {
571
- items: m,
576
+ items: h,
572
577
  basePath: t,
573
578
  evaluateVisibility: n,
574
579
  checkPermission: r,
575
- onAction: a,
576
- searchQuery: D,
577
- enablePinning: g,
578
- onPinToggle: y,
579
- enableReorder: x,
580
- onReorder: w
580
+ checkCapability: a,
581
+ onAction: o,
582
+ searchQuery: O,
583
+ enablePinning: y,
584
+ onPinToggle: x,
585
+ enableReorder: w,
586
+ onReorder: T
581
587
  }),
582
- c
588
+ l
583
589
  ] }),
584
- s && /* @__PURE__ */ j(p, { children: s })
590
+ c && /* @__PURE__ */ j(p, { children: c })
585
591
  ]
586
592
  });
587
593
  }
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(",");
594
+ 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 }) {
595
+ 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
596
  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 = {
597
+ D.length > 0 ? k((e) => D.some((t) => t.id === e) ? e : D[0].id) : k(null);
598
+ }, [e.name, N]);
599
+ let P = D.find((e) => e.id === O)?.navigation ?? E, F = {
594
600
  title: e.title,
595
601
  favicon: e.favicon,
596
602
  logo: e.logo
597
603
  };
598
604
  return /* @__PURE__ */ M(A, { children: [/* @__PURE__ */ j(J, {
599
- sidebar: /* @__PURE__ */ j(ke, {
605
+ sidebar: /* @__PURE__ */ j(Ae, {
600
606
  schema: e,
601
607
  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
608
+ evalVis: S,
609
+ checkPerm: C,
610
+ checkCap: w,
611
+ onAction: l,
612
+ sidebarHeader: d,
613
+ sidebarFooter: f,
614
+ sidebarExtra: p,
615
+ activeAreaId: O,
616
+ setActiveAreaId: k,
617
+ resolvedNavigation: P,
618
+ enableSearch: _,
619
+ enablePinning: v,
620
+ onPinToggle: y,
621
+ enableReorder: b,
622
+ onReorder: x
616
623
  }),
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,
624
+ navbar: u,
625
+ className: h,
626
+ defaultOpen: g,
627
+ branding: F,
628
+ children: m
629
+ }), a === "bottom_nav" && /* @__PURE__ */ j(ke, {
630
+ items: P,
624
631
  basePath: t
625
632
  })] });
626
633
  }
627
634
  //#endregion
628
635
  //#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);
636
+ var Me = (e) => e ? Array.isArray(e) ? e : [e] : [];
637
+ function Ne({ schema: e, className: t, style: n, id: r, ...i }) {
638
+ let a = Me(e.children);
632
639
  return /* @__PURE__ */ M("div", {
633
640
  id: r || e.id,
634
641
  className: O("flex flex-col h-full space-y-4", t),
635
642
  style: n,
636
- children: [/* @__PURE__ */ j(W, {
643
+ children: [/* @__PURE__ */ j(H, {
637
644
  title: e.title,
638
645
  description: e.description
639
646
  }), /* @__PURE__ */ j("div", {
640
647
  className: "flex-1 overflow-auto",
641
- children: a.map((e, t) => /* @__PURE__ */ j(fe, {
648
+ children: a.map((e, t) => /* @__PURE__ */ j(me, {
642
649
  schema: e,
643
650
  ...i
644
651
  }, e?.id || t))
@@ -647,10 +654,10 @@ function Me({ schema: e, className: t, style: n, id: r, ...i }) {
647
654
  }
648
655
  //#endregion
649
656
  //#region src/SidebarNav.tsx
650
- function Ne(e) {
657
+ function Pe(e) {
651
658
  return "items" in e && !("href" in e);
652
659
  }
653
- function Pe({ item: e, pathname: t }) {
660
+ function Fe({ item: e, pathname: t }) {
654
661
  return e.children && e.children.length > 0 ? /* @__PURE__ */ j(o, {
655
662
  asChild: !0,
656
663
  defaultOpen: !0,
@@ -704,8 +711,8 @@ function Pe({ item: e, pathname: t }) {
704
711
  })
705
712
  }) });
706
713
  }
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) => ({
714
+ function Ie({ items: e, title: n = "Application", className: r, collapsible: i = "icon", searchEnabled: a = !1, searchPlaceholder: o = "Search..." }) {
715
+ let s = F(), [c, u] = t.useState(""), p = t.useMemo(() => e.length === 0 ? [] : Pe(e[0]) ? e.map((e) => ({
709
716
  groupLabel: e.label,
710
717
  items: e.items
711
718
  })) : [{ items: e }], [e]), _ = t.useMemo(() => {
@@ -723,7 +730,7 @@ function Fe({ items: e, title: n = "Application", className: r, collapsible: i =
723
730
  className: "px-3 py-2",
724
731
  children: /* @__PURE__ */ M("div", {
725
732
  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, {
733
+ children: [/* @__PURE__ */ j(re, { className: "absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground" }), /* @__PURE__ */ j(l, {
727
734
  type: "search",
728
735
  placeholder: o,
729
736
  value: c,
@@ -740,7 +747,7 @@ function Fe({ items: e, title: n = "Application", className: r, collapsible: i =
740
747
  className: "text-[10px] font-semibold uppercase tracking-wider text-sidebar-foreground/60",
741
748
  children: e.groupLabel || n
742
749
  }),
743
- /* @__PURE__ */ j(h, { children: /* @__PURE__ */ j(b, { children: e.items.map((e) => /* @__PURE__ */ j(Pe, {
750
+ /* @__PURE__ */ j(h, { children: /* @__PURE__ */ j(b, { children: e.items.map((e) => /* @__PURE__ */ j(Fe, {
744
751
  item: e,
745
752
  pathname: s.pathname
746
753
  }, e.href)) }) })
@@ -749,8 +756,8 @@ function Fe({ items: e, title: n = "Application", className: r, collapsible: i =
749
756
  }
750
757
  //#endregion
751
758
  //#region src/index.ts
752
- function Ie() {
753
- e.register("page-header", W, {
759
+ function Le() {
760
+ e.register("page-header", H, {
754
761
  namespace: "layout",
755
762
  label: "Page Header",
756
763
  category: "Layout",
@@ -761,7 +768,7 @@ function Ie() {
761
768
  name: "description",
762
769
  type: "string"
763
770
  }]
764
- }), e.register("page:header", W, { namespace: "layout" }), e.register("page:card", he, {
771
+ }), e.register("page:header", H, { namespace: "layout" }), e.register("page:card", he, {
765
772
  namespace: "layout",
766
773
  label: "Page Card",
767
774
  category: "Layout",
@@ -793,7 +800,7 @@ function Ie() {
793
800
  name: "basePath",
794
801
  type: "string"
795
802
  }]
796
- }), e.register("app-schema-renderer", Ae, {
803
+ }), e.register("app-schema-renderer", je, {
797
804
  namespace: "layout",
798
805
  label: "App Schema Renderer",
799
806
  category: "Layout",
@@ -815,7 +822,7 @@ function Ie() {
815
822
  });
816
823
  }
817
824
  try {
818
- Ie();
825
+ Le();
819
826
  } catch {}
820
827
  //#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 };
828
+ 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`,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.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 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.11",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "main": "dist/index.umd.cjs",
@@ -22,10 +22,10 @@
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.11",
26
+ "@object-ui/core": "4.0.11",
27
+ "@object-ui/react": "4.0.11",
28
+ "@object-ui/types": "4.0.11"
29
29
  },
30
30
  "peerDependencies": {
31
31
  "react": "^18.0.0 || ^19.0.0",