diff --git a/dist/layout.js b/dist/layout.js
index 5ae9f3f..494698e 100644
--- a/dist/layout.js
+++ b/dist/layout.js
@@ -1,12 +1,11 @@
import { jsx as e, jsxs as g, Fragment as F } from "react/jsx-runtime";
-import { Box as c, HStack as u, VStack as C, Image as j, Text as s, useDisclosure as J, Stack as K, Tooltip as T, IconButton as Z, Icon as d, Drawer as q, DrawerOverlay as $, DrawerContent as _, DrawerCloseButton as AA, DrawerHeader as eA, DrawerBody as oA, SimpleGrid as nA, Link as tA } from "@chakra-ui/react";
-import { useRef as rA, Children as gA, isValidElement as lA, forwardRef as aA } from "react";
-import { IoExit as iA, IoEllipsisHorizontal as IA } from "react-icons/io5";
-import { u as cA, l as sA } from "./chunks/permission-DL7ciWwc.js";
-const dA = "data:image/webp;base64,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MCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE4LTA4LTEzVDE0OjI1OjUzKzA0OjMwPC94bXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE4LTA4LTEzVDE0OjI1OjUzKzA0OjMwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxOC0wOC0xM1QxNDoyNTo1MyswNDozMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcE1NOkhpc3Rvcnk+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxOC0wOC0xM1QxNDoyNTo1MyswNDozMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDoxMDU3ZjgxNy03YTEzLThiNGEtODc1Ni1lYWM1MWEyZDRiYTY8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTgtMDgtMTNUMTQ6MjU6NTMrMDQ6MzA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6MDZjNmM4ODYtZDY2My1jMzQzLTkwZTUtNjQ4ZWJlYTkxYzgxPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpTZXE+CiAgICAgICAgIDwveG1wTU06SGlzdG9yeT4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjEwNTdmODE3LTdhMTMtOGI0YS04NzU2LWVhYzUxYTJkNGJhNjwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD5hZG9iZTpkb2NpZDpwaG90b3Nob3A6NWI3ZmJlNDgtMDc0ZS01NzRhLWFlNTctN2RmYjA4NmI1N2Q3PC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjA2YzZjODg2LWQ2NjMtYzM0My05MGU1LTY0OGViZWE5MWM4MTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHBob3Rvc2hvcDpJQ0NQcm9maWxlPnNSR0IgSUVDNjE5NjYtMi4xPC9waG90b3Nob3A6SUNDUHJvZmlsZT4KICAgICAgICAgPHBob3Rvc2hvcDpDb2xvck1vZGU+MzwvcGhvdG9zaG9wOkNvbG9yTW9kZT4KICAgICAgICAgPHBob3Rvc2hvcDpEb2N1bWVudEFuY2VzdG9ycz4KICAgICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgICAgIDxyZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmEwYjgxNWMzLTkzYjMtODU0MC04NmY0LTA0OTEyZTY5Y2Y4NTwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpCYWc+CiAgICAgICAgIDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K";
-function CA({ children: o, ...A }) {
+import { Box as s, HStack as u, VStack as C, Image as j, Text as I, useDisclosure as J, Stack as K, Tooltip as T, IconButton as Z, Icon as d, Drawer as q, DrawerOverlay as $, DrawerContent as _, DrawerCloseButton as ee, DrawerHeader as oe, DrawerBody as Ae, SimpleGrid as ne, Link as te } from "@chakra-ui/react";
+import { useRef as re, Children as ge, isValidElement as le, forwardRef as ae } from "react";
+import { u as ie, l as ce } from "./chunks/permission-DL7ciWwc.js";
+const se = "data:image/webp;base64,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MCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE4LTA4LTEzVDE0OjI1OjUzKzA0OjMwPC94bXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE4LTA4LTEzVDE0OjI1OjUzKzA0OjMwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxOC0wOC0xM1QxNDoyNTo1MyswNDozMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcE1NOkhpc3Rvcnk+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxOC0wOC0xM1QxNDoyNTo1MyswNDozMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDoxMDU3ZjgxNy03YTEzLThiNGEtODc1Ni1lYWM1MWEyZDRiYTY8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTgtMDgtMTNUMTQ6MjU6NTMrMDQ6MzA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6MDZjNmM4ODYtZDY2My1jMzQzLTkwZTUtNjQ4ZWJlYTkxYzgxPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpTZXE+CiAgICAgICAgIDwveG1wTU06SGlzdG9yeT4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjEwNTdmODE3LTdhMTMtOGI0YS04NzU2LWVhYzUxYTJkNGJhNjwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD5hZG9iZTpkb2NpZDpwaG90b3Nob3A6NWI3ZmJlNDgtMDc0ZS01NzRhLWFlNTctN2RmYjA4NmI1N2Q3PC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjA2YzZjODg2LWQ2NjMtYzM0My05MGU1LTY0OGViZWE5MWM4MTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHBob3Rvc2hvcDpJQ0NQcm9maWxlPnNSR0IgSUVDNjE5NjYtMi4xPC9waG90b3Nob3A6SUNDUHJvZmlsZT4KICAgICAgICAgPHBob3Rvc2hvcDpDb2xvck1vZGU+MzwvcGhvdG9zaG9wOkNvbG9yTW9kZT4KICAgICAgICAgPHBob3Rvc2hvcDpEb2N1bWVudEFuY2VzdG9ycz4KICAgICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgICAgIDxyZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmEwYjgxNWMzLTkzYjMtODU0MC04NmY0LTA0OTEyZTY5Y2Y4NTwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpCYWc+CiAgICAgICAgIDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K";
+function Ie({ children: o, ...A }) {
return /* @__PURE__ */ e(
- c,
+ s,
{
as: "header",
w: "100%",
@@ -32,7 +31,7 @@ function CA({ children: o, ...A }) {
}
);
}
-function bA({ children: o, ...A }) {
+function de({ children: o, ...A }) {
return /* @__PURE__ */ e(
u,
{
@@ -47,7 +46,7 @@ function bA({ children: o, ...A }) {
}
);
}
-function pA(o) {
+function Ce(o) {
return /* @__PURE__ */ e(
j,
{
@@ -62,7 +61,7 @@ function pA(o) {
}
);
}
-function hA({ children: o, ...A }) {
+function pe({ children: o, ...A }) {
return /* @__PURE__ */ e(
C,
{
@@ -77,9 +76,9 @@ function hA({ children: o, ...A }) {
}
);
}
-function uA({ children: o, ...A }) {
+function be({ children: o, ...A }) {
return /* @__PURE__ */ e(
- s,
+ I,
{
w: "100%",
fontWeight: "bold",
@@ -91,9 +90,9 @@ function uA({ children: o, ...A }) {
}
);
}
-function xA({ children: o, ...A }) {
+function he({ children: o, ...A }) {
return /* @__PURE__ */ e(
- s,
+ I,
{
w: "100%",
fontSize: { base: "10px", sm: "11px", lg: "16px" },
@@ -104,7 +103,7 @@ function xA({ children: o, ...A }) {
}
);
}
-function mA({ logoSrc: o = dA, ...A }) {
+function ue({ logoSrc: o = se, ...A }) {
return /* @__PURE__ */ g(
C,
{
@@ -128,7 +127,7 @@ function mA({ logoSrc: o = dA, ...A }) {
}
),
/* @__PURE__ */ e(
- s,
+ I,
{
display: { base: "none", lg: "block" },
fontSize: "xs",
@@ -142,26 +141,60 @@ function mA({ logoSrc: o = dA, ...A }) {
}
);
}
-const WA = Object.assign(CA, {
- BrandSection: bA,
- Logo: pA,
- Brand: hA,
- Title: uA,
- Description: xA,
- Bi: mA
-}), N = (o = "") => {
+const Ge = Object.assign(Ie, {
+ BrandSection: de,
+ Logo: Ce,
+ Brand: pe,
+ Title: be,
+ Description: he,
+ Bi: ue
+}), xe = (o) => /* @__PURE__ */ g(
+ "svg",
+ {
+ xmlns: "http://www.w3.org/2000/svg",
+ viewBox: "0 0 24 24",
+ fill: "none",
+ stroke: "currentColor",
+ strokeWidth: "2",
+ strokeLinecap: "round",
+ strokeLinejoin: "round",
+ ...o,
+ children: [
+ /* @__PURE__ */ e("circle", { cx: "12", cy: "12", r: "1" }),
+ /* @__PURE__ */ e("circle", { cx: "19", cy: "12", r: "1" }),
+ /* @__PURE__ */ e("circle", { cx: "5", cy: "12", r: "1" })
+ ]
+ }
+), we = (o) => /* @__PURE__ */ g(
+ "svg",
+ {
+ xmlns: "http://www.w3.org/2000/svg",
+ viewBox: "0 0 24 24",
+ fill: "none",
+ stroke: "currentColor",
+ strokeWidth: "2",
+ strokeLinecap: "round",
+ strokeLinejoin: "round",
+ ...o,
+ children: [
+ /* @__PURE__ */ e("path", { d: "m16 17 5-5-5-5" }),
+ /* @__PURE__ */ e("path", { d: "M21 12H9" }),
+ /* @__PURE__ */ e("path", { d: "M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" })
+ ]
+ }
+), N = (o = "") => {
const A = String(o).split(/[?#]/)[0] || "";
return !A || A === "/" ? A || "/" : A.replace(/\/+$/, "");
-}, P = (o, A) => {
+}, B = (o, A) => {
const t = N(o);
return [A == null ? void 0 : A.path, ...(A == null ? void 0 : A.aliases) || []].filter(Boolean).map(N).some(
(l) => t === l || t.startsWith(`${l}/`)
);
-}, SA = (o = [], A) => o.find((t) => P(A, t)), G = aA(
- ({ linkComponent: o, href: A, children: t, ...r }, l) => /* @__PURE__ */ e(tA, { ref: l, href: A, ...o ? { as: o } : {}, ...r, children: t })
+}, We = (o = [], A) => o.find((t) => B(A, t)), v = ae(
+ ({ linkComponent: o, href: A, children: t, ...r }, l) => /* @__PURE__ */ e(te, { ref: l, href: A, ...o ? { as: o } : {}, ...r, children: t })
);
-G.displayName = "SidebarLink";
-const RA = ({
+v.displayName = "SidebarLink";
+const me = ({
item: o,
isActive: A,
isDisabled: t,
@@ -195,9 +228,9 @@ const RA = ({
"aria-label": o.title,
"aria-current": A ? "page" : void 0
};
- let b;
+ let p;
if (t || A)
- b = /* @__PURE__ */ e(
+ p = /* @__PURE__ */ e(
Z,
{
...a,
@@ -207,7 +240,7 @@ const RA = ({
);
else {
const x = r ? { as: r, href: o.path } : { as: "a", href: o.path };
- b = /* @__PURE__ */ e(Z, { ...a, ...x, onClick: l });
+ p = /* @__PURE__ */ e(Z, { ...a, ...x, onClick: l });
}
return /* @__PURE__ */ e(
T,
@@ -220,10 +253,10 @@ const RA = ({
px: 4,
fontWeight: "bold",
closeDelay: 150,
- children: /* @__PURE__ */ e(c, { as: "span", children: b })
+ children: /* @__PURE__ */ e(s, { as: "span", children: p })
}
);
-}, fA = ({
+}, Re = ({
item: o,
isActive: A,
isDisabled: t,
@@ -247,7 +280,7 @@ const RA = ({
children: [
/* @__PURE__ */ e(d, { as: o.icon, boxSize: 5 }),
/* @__PURE__ */ e(
- s,
+ I,
{
as: "span",
w: "full",
@@ -263,7 +296,7 @@ const RA = ({
}
);
return t || A ? /* @__PURE__ */ e(
- c,
+ s,
{
flex: "1",
minW: 0,
@@ -274,7 +307,7 @@ const RA = ({
children: a
}
) : /* @__PURE__ */ e(
- G,
+ v,
{
linkComponent: r,
href: o.path,
@@ -288,25 +321,25 @@ const RA = ({
children: a
}
);
-}, B = () => null, wA = ({
+}, P = () => null, fe = ({
items: o = [],
currentPath: A,
linkComponent: t,
onNavigate: r,
children: l,
primaryMobileCount: a = 4,
- moreTitle: b = "بیشتر",
+ moreTitle: p = "بیشتر",
moreDrawerTitle: x = "سایر بخشهای سامانه",
desktopProps: Q,
- mobileProps: O
+ mobileProps: L
}) => {
- var k, Y;
- const { isOpen: L, onOpen: V, onClose: m } = J(), v = rA(), { cannot: U } = cA(), I = gA.toArray(l).find(
- (n) => lA(n) && n.type === B
- ), R = !!I, f = ((k = I == null ? void 0 : I.props) == null ? void 0 : k.title) || "خروج", W = ((Y = I == null ? void 0 : I.props) == null ? void 0 : Y.icon) || iA, H = A ?? (typeof window < "u" ? `${window.location.pathname}${window.location.search}` : ""), X = o.slice(0, a), w = o.slice(a), y = (n) => (Array.isArray(n == null ? void 0 : n.perm) ? n.perm : [n == null ? void 0 : n.perm]).filter(Boolean).some((i) => U(i)), p = (n) => P(H, n), D = w.some(p), S = w.length > 0 || R, z = (n) => {
- r == null || r(n), m();
- }, M = () => {
- m(), sA();
+ var z, Y;
+ const { isOpen: O, onOpen: V, onClose: w } = J(), G = re(), { cannot: U } = ie(), c = ge.toArray(l).find(
+ (n) => le(n) && n.type === P
+ ), m = !!c, R = ((z = c == null ? void 0 : c.props) == null ? void 0 : z.title) || "خروج", W = ((Y = c == null ? void 0 : c.props) == null ? void 0 : Y.icon) || we, H = A ?? (typeof window < "u" ? `${window.location.pathname}${window.location.search}` : ""), X = o.slice(0, a), f = o.slice(a), y = (n) => (Array.isArray(n == null ? void 0 : n.perm) ? n.perm : [n == null ? void 0 : n.perm]).filter(Boolean).some((i) => U(i)), b = (n) => B(H, n), D = f.some(b), S = f.length > 0 || m, M = (n) => {
+ r == null || r(n), w();
+ }, k = () => {
+ w(), ce();
};
return /* @__PURE__ */ g(F, { children: [
/* @__PURE__ */ e(
@@ -329,20 +362,20 @@ const RA = ({
...Q,
children: /* @__PURE__ */ g(C, { spacing: 2, children: [
o.map((n) => /* @__PURE__ */ e(
- RA,
+ me,
{
item: n,
isDisabled: y(n),
- isActive: p(n),
+ isActive: b(n),
linkComponent: t,
onNavigate: () => r == null ? void 0 : r(n)
},
n.path
)),
- R && /* @__PURE__ */ e(
+ m && /* @__PURE__ */ e(
T,
{
- label: f,
+ label: R,
placement: "left-start",
hasArrow: !0,
rounded: "md",
@@ -357,8 +390,8 @@ const RA = ({
icon: /* @__PURE__ */ e(d, { as: W }),
fontSize: "xl",
size: { base: "sm", lg: "lg" },
- "aria-label": f,
- onClick: M
+ "aria-label": R,
+ onClick: k
}
)
}
@@ -367,7 +400,7 @@ const RA = ({
}
),
/* @__PURE__ */ e(
- c,
+ s,
{
as: "nav",
"aria-label": "ناوبری اصلی موبایل",
@@ -381,24 +414,24 @@ const RA = ({
borderColor: "gray.200",
boxShadow: "0 -6px 18px rgba(0, 0, 0, 0.08)",
pb: "env(safe-area-inset-bottom)",
- ...O,
+ ...L,
children: /* @__PURE__ */ g(u, { h: "56px", px: 1.5, spacing: 1, align: "stretch", children: [
X.map((n) => /* @__PURE__ */ e(
- fA,
+ Re,
{
item: n,
isDisabled: y(n),
- isActive: p(n),
+ isActive: b(n),
linkComponent: t,
- onNavigate: () => z(n)
+ onNavigate: () => M(n)
},
n.path
)),
S && /* @__PURE__ */ e(
- c,
+ s,
{
as: "button",
- ref: v,
+ ref: G,
type: "button",
flex: "1",
minW: 0,
@@ -424,14 +457,14 @@ const RA = ({
color: D ? "blue.600" : "gray.600",
bg: D ? "blue.50" : "transparent",
children: [
- /* @__PURE__ */ e(d, { as: IA, boxSize: 5 }),
+ /* @__PURE__ */ e(d, { as: xe, boxSize: 5 }),
/* @__PURE__ */ e(
- s,
+ I,
{
fontSize: "10px",
fontWeight: D ? "bold" : "medium",
lineHeight: "short",
- children: b
+ children: p
}
)
]
@@ -445,10 +478,10 @@ const RA = ({
S && /* @__PURE__ */ g(
q,
{
- isOpen: L,
+ isOpen: O,
placement: "bottom",
- onClose: m,
- finalFocusRef: v,
+ onClose: w,
+ finalFocusRef: G,
children: [
/* @__PURE__ */ e($, {}),
/* @__PURE__ */ g(
@@ -458,11 +491,11 @@ const RA = ({
maxH: "min(78dvh, 620px)",
pb: "env(safe-area-inset-bottom)",
children: [
- /* @__PURE__ */ e(AA, { insetInlineEnd: 3, insetInlineStart: "auto" }),
- /* @__PURE__ */ e(eA, { borderBottomWidth: "1px", fontSize: "md", children: x }),
- /* @__PURE__ */ g(oA, { py: 4, overflowY: "auto", children: [
- /* @__PURE__ */ e(nA, { columns: 4, spacing: 2, children: w.map((n) => {
- const h = y(n), i = p(n), E = /* @__PURE__ */ g(
+ /* @__PURE__ */ e(ee, { insetInlineEnd: 3, insetInlineStart: "auto" }),
+ /* @__PURE__ */ e(oe, { borderBottomWidth: "1px", fontSize: "md", children: x }),
+ /* @__PURE__ */ g(Ae, { py: 4, overflowY: "auto", children: [
+ /* @__PURE__ */ e(ne, { columns: 4, spacing: 2, children: f.map((n) => {
+ const h = y(n), i = b(n), E = /* @__PURE__ */ g(
C,
{
h: "70px",
@@ -479,7 +512,7 @@ const RA = ({
children: [
/* @__PURE__ */ e(d, { as: n.icon, boxSize: 5, flexShrink: 0 }),
/* @__PURE__ */ e(
- s,
+ I,
{
w: "full",
fontSize: "10px",
@@ -494,7 +527,7 @@ const RA = ({
}
);
return h || i ? /* @__PURE__ */ e(
- c,
+ s,
{
"aria-disabled": h ? "true" : void 0,
"aria-current": i ? "page" : void 0,
@@ -502,19 +535,19 @@ const RA = ({
},
n.path
) : /* @__PURE__ */ e(
- G,
+ v,
{
linkComponent: t,
href: n.path,
_hover: { textDecoration: "none" },
- onClick: () => z(n),
+ onClick: () => M(n),
"aria-current": i ? "page" : void 0,
children: E
},
n.path
);
}) }),
- R && /* @__PURE__ */ e(c, { mt: 4, pt: 4, borderTopWidth: "1px", borderColor: "gray.200", children: /* @__PURE__ */ g(
+ m && /* @__PURE__ */ e(s, { mt: 4, pt: 4, borderTopWidth: "1px", borderColor: "gray.200", children: /* @__PURE__ */ g(
u,
{
as: "button",
@@ -527,10 +560,10 @@ const RA = ({
color: "red.600",
bg: "red.50",
cursor: "pointer",
- onClick: M,
+ onClick: k,
children: [
/* @__PURE__ */ e(d, { as: W, boxSize: 5 }),
- /* @__PURE__ */ e(s, { fontWeight: "bold", children: f })
+ /* @__PURE__ */ e(I, { fontWeight: "bold", children: R })
]
}
) })
@@ -542,12 +575,12 @@ const RA = ({
}
)
] });
-}, zA = Object.assign(wA, {
- Exit: B
+}, Se = Object.assign(fe, {
+ Exit: P
});
export {
- WA as Header,
- zA as Sidebar,
- SA as getActiveSidebarItem,
- P as isSidebarPathActive
+ Ge as Header,
+ Se as Sidebar,
+ We as getActiveSidebarItem,
+ B as isSidebarPathActive
};
diff --git a/src/layout/Sidebar.jsx b/src/layout/Sidebar.jsx
index ab0e8d9..06f0973 100644
--- a/src/layout/Sidebar.jsx
+++ b/src/layout/Sidebar.jsx
@@ -20,10 +20,43 @@ import {
useDisclosure,
} from "@chakra-ui/react";
import { Children, forwardRef, isValidElement, useRef } from "react";
-import { IoEllipsisHorizontal, IoExit } from "react-icons/io5";
import { logoutKeycloak } from "../core/keycloak.jsx";
import { usePermission } from "../core/permission.jsx";
+const EllipsisIcon = (props) => (
+
+);
+
+const LogOutIcon = (props) => (
+
+);
+
const normalizeSidebarPath = (value = "") => {
const path = String(value).split(/[?#]/)[0] || "";
@@ -227,7 +260,7 @@ const SidebarRoot = ({
);
const hasExit = Boolean(exitElement);
const logoutTitle = exitElement?.props?.title || "خروج";
- const logoutIcon = exitElement?.props?.icon || IoExit;
+ const logoutIcon = exitElement?.props?.icon || LogOutIcon;
const resolvedCurrentPath =
currentPath ??
@@ -368,7 +401,7 @@ const SidebarRoot = ({
color={isSecondaryItemActive ? "blue.600" : "gray.600"}
bg={isSecondaryItemActive ? "blue.50" : "transparent"}
>
-
+