@banzamel/mineralui 2.1.2 → 2.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{MDetailList-BhKBJwpd.cjs → MDetailList-DTLU7HQZ.cjs} +2 -2
- package/dist/{MDetailList-BhKBJwpd.cjs.map → MDetailList-DTLU7HQZ.cjs.map} +1 -1
- package/dist/{MDetailList-BjvZUyNj.js → MDetailList-fDhVyhm7.js} +3 -3
- package/dist/{MDetailList-BjvZUyNj.js.map → MDetailList-fDhVyhm7.js.map} +1 -1
- package/dist/{MDropdownMenu-CZmU3uku.js → MDropdownMenu-BeD_DxPr.js} +2 -2
- package/dist/{MDropdownMenu-CZmU3uku.js.map → MDropdownMenu-BeD_DxPr.js.map} +1 -1
- package/dist/{MDropdownMenu-hXaIMkAj.cjs → MDropdownMenu-C2lftqSx.cjs} +2 -2
- package/dist/{MDropdownMenu-hXaIMkAj.cjs.map → MDropdownMenu-C2lftqSx.cjs.map} +1 -1
- package/dist/{MInput-BhTAfpYS.cjs → MInput-BpTlP8GE.cjs} +2 -2
- package/dist/{MInput-BhTAfpYS.cjs.map → MInput-BpTlP8GE.cjs.map} +1 -1
- package/dist/{MInput-CgtX0fUN.js → MInput-C8ObGzQk.js} +2 -2
- package/dist/{MInput-CgtX0fUN.js.map → MInput-C8ObGzQk.js.map} +1 -1
- package/dist/{MInputCVC-BGYhUGDE.js → MInputCVC-DvUOzpYp.js} +24 -24
- package/dist/{MInputCVC-BGYhUGDE.js.map → MInputCVC-DvUOzpYp.js.map} +1 -1
- package/dist/{MInputCVC-E2Z2hYfy.cjs → MInputCVC-_2ALihF1.cjs} +2 -2
- package/dist/{MInputCVC-E2Z2hYfy.cjs.map → MInputCVC-_2ALihF1.cjs.map} +1 -1
- package/dist/{MInputSearch-DE9Jqp0i.cjs → MInputSearch-9wcXlY8-.cjs} +2 -2
- package/dist/{MInputSearch-DE9Jqp0i.cjs.map → MInputSearch-9wcXlY8-.cjs.map} +1 -1
- package/dist/{MInputSearch-DEr5HBgw.js → MInputSearch-BM8gLlJ1.js} +3 -3
- package/dist/{MInputSearch-DEr5HBgw.js.map → MInputSearch-BM8gLlJ1.js.map} +1 -1
- package/dist/{MPagination-DTqT33Mx.cjs → MPagination-C6QQdEj_.cjs} +2 -2
- package/dist/{MPagination-DTqT33Mx.cjs.map → MPagination-C6QQdEj_.cjs.map} +1 -1
- package/dist/{MPagination-7yTbB8dZ.js → MPagination-CgmNEAZX.js} +6 -6
- package/dist/{MPagination-7yTbB8dZ.js.map → MPagination-CgmNEAZX.js.map} +1 -1
- package/dist/{MPopover-hDqrn317.cjs → MPopover-Cweomcj2.cjs} +2 -2
- package/dist/MPopover-Cweomcj2.cjs.map +1 -0
- package/dist/{MPopover-BRuwva-c.js → MPopover-DT3vclV1.js} +6 -3
- package/dist/MPopover-DT3vclV1.js.map +1 -0
- package/dist/{MTag-BtlOVMRl.cjs → MTag-BzTp1crT.cjs} +2 -2
- package/dist/{MTag-BtlOVMRl.cjs.map → MTag-BzTp1crT.cjs.map} +1 -1
- package/dist/{MTag-BF6htPr-.js → MTag-D9q6faIk.js} +2 -2
- package/dist/{MTag-BF6htPr-.js.map → MTag-D9q6faIk.js.map} +1 -1
- package/dist/{MTreeView-DQaRF0ty.js → MTreeView-B1J7uqd1.js} +63 -63
- package/dist/{MTreeView-DQaRF0ty.js.map → MTreeView-B1J7uqd1.js.map} +1 -1
- package/dist/{MTreeView-1IqmVPMv.cjs → MTreeView-DuQkm0ZV.cjs} +2 -2
- package/dist/{MTreeView-1IqmVPMv.cjs.map → MTreeView-DuQkm0ZV.cjs.map} +1 -1
- package/dist/{cards-Du2kX3Br.js → cards-DYmK8TpL.js} +73 -73
- package/dist/{cards-Du2kX3Br.js.map → cards-DYmK8TpL.js.map} +1 -1
- package/dist/{cards-BBYh24NQ.cjs → cards-fRWZkts9.cjs} +2 -2
- package/dist/{cards-BBYh24NQ.cjs.map → cards-fRWZkts9.cjs.map} +1 -1
- package/dist/cards.cjs +1 -1
- package/dist/cards.js +1 -1
- package/dist/{controls-Cbv4FmNq.js → controls-BKAhqjNM.js} +2 -2
- package/dist/{controls-Cbv4FmNq.js.map → controls-BKAhqjNM.js.map} +1 -1
- package/dist/{controls-DrdHBBtm.cjs → controls-CT_0lIPr.cjs} +2 -2
- package/dist/{controls-DrdHBBtm.cjs.map → controls-CT_0lIPr.cjs.map} +1 -1
- package/dist/controls.cjs +1 -1
- package/dist/controls.js +1 -1
- package/dist/{data-Csb03WFo.cjs → data-CuynADWM.cjs} +2 -2
- package/dist/{data-Csb03WFo.cjs.map → data-CuynADWM.cjs.map} +1 -1
- package/dist/{data-BgTkBMkP.js → data-D8WFA3Et.js} +16 -16
- package/dist/{data-BgTkBMkP.js.map → data-D8WFA3Et.js.map} +1 -1
- package/dist/data.cjs +1 -1
- package/dist/data.js +2 -2
- package/dist/{display-D9H8MP8D.js → display-BF4jASt9.js} +16 -16
- package/dist/{display-D9H8MP8D.js.map → display-BF4jASt9.js.map} +1 -1
- package/dist/{display-IMWtdmxS.cjs → display-DMix8BmD.cjs} +3 -3
- package/dist/{display-IMWtdmxS.cjs.map → display-DMix8BmD.cjs.map} +1 -1
- package/dist/display.cjs +1 -1
- package/dist/display.js +2 -2
- package/dist/{dropdowns-oj4--GbK.js → dropdowns-5cJf-6UG.js} +91 -91
- package/dist/{dropdowns-oj4--GbK.js.map → dropdowns-5cJf-6UG.js.map} +1 -1
- package/dist/{dropdowns-D_nUdflh.cjs → dropdowns-C-ASvu7P.cjs} +2 -2
- package/dist/{dropdowns-D_nUdflh.cjs.map → dropdowns-C-ASvu7P.cjs.map} +1 -1
- package/dist/dropdowns.cjs +1 -1
- package/dist/dropdowns.js +1 -1
- package/dist/{feedback-u1ssUT7e.cjs → feedback-4TjD57rX.cjs} +2 -2
- package/dist/{feedback-u1ssUT7e.cjs.map → feedback-4TjD57rX.cjs.map} +1 -1
- package/dist/{feedback-D7BTlioj.js → feedback-DW-cehnb.js} +35 -35
- package/dist/{feedback-D7BTlioj.js.map → feedback-DW-cehnb.js.map} +1 -1
- package/dist/feedback.cjs +1 -1
- package/dist/feedback.js +2 -2
- package/dist/icons/glyphs/MCoinIcon.d.ts +2 -0
- package/dist/icons/glyphs/MMoneyIcon.d.ts +2 -0
- package/dist/icons/glyphs/MReceiptIcon.d.ts +2 -0
- package/dist/icons/glyphs/MWalletIcon.d.ts +2 -0
- package/dist/icons/index.d.ts +4 -0
- package/dist/{icons-DLP-Rs6z.js → icons-CBMl-kOM.js} +221 -166
- package/dist/icons-CBMl-kOM.js.map +1 -0
- package/dist/icons-D675Im0B.cjs +2 -0
- package/dist/icons-D675Im0B.cjs.map +1 -0
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +2 -2
- package/dist/index.cjs +1 -1
- package/dist/index.js +53 -53
- package/dist/{inputs-DQrjGfwd.js → inputs-CQoi402V.js} +180 -180
- package/dist/{inputs-DQrjGfwd.js.map → inputs-CQoi402V.js.map} +1 -1
- package/dist/{inputs-DsFdc0Io.cjs → inputs-yaaTPTsY.cjs} +2 -2
- package/dist/{inputs-DsFdc0Io.cjs.map → inputs-yaaTPTsY.cjs.map} +1 -1
- package/dist/inputs.cjs +1 -1
- package/dist/inputs.js +4 -4
- package/dist/{layout-B_2yBP1M.cjs → layout-CfolwT8L.cjs} +2 -2
- package/dist/{layout-B_2yBP1M.cjs.map → layout-CfolwT8L.cjs.map} +1 -1
- package/dist/{layout-BuvV-N9H.js → layout-i8H5tIbO.js} +32 -32
- package/dist/{layout-BuvV-N9H.js.map → layout-i8H5tIbO.js.map} +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +2 -2
- package/dist/{media-Xt6MkVhb.cjs → media-DRz3JZfr.cjs} +2 -2
- package/dist/{media-Xt6MkVhb.cjs.map → media-DRz3JZfr.cjs.map} +1 -1
- package/dist/{media-5IsYrhIQ.js → media-vOQOIYFD.js} +11 -11
- package/dist/{media-5IsYrhIQ.js.map → media-vOQOIYFD.js.map} +1 -1
- package/dist/media.cjs +1 -1
- package/dist/media.js +1 -1
- package/dist/{overlays-WA3jnWTG.js → overlays-CAcGmqNv.js} +50 -50
- package/dist/{overlays-WA3jnWTG.js.map → overlays-CAcGmqNv.js.map} +1 -1
- package/dist/{overlays-BAJDNT1m.cjs → overlays-zPzbHW5P.cjs} +2 -2
- package/dist/{overlays-BAJDNT1m.cjs.map → overlays-zPzbHW5P.cjs.map} +1 -1
- package/dist/overlays.cjs +1 -1
- package/dist/overlays.js +2 -2
- package/dist/primitives.cjs +1 -1
- package/dist/primitives.js +1 -1
- package/package.json +1 -1
- package/dist/MPopover-BRuwva-c.js.map +0 -1
- package/dist/MPopover-hDqrn317.cjs.map +0 -1
- package/dist/icons-BfdQ45F2.cjs +0 -2
- package/dist/icons-BfdQ45F2.cjs.map +0 -1
- package/dist/icons-DLP-Rs6z.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Ji as e, qi as t } from "./icons-CBMl-kOM.js";
|
|
2
2
|
import { t as n } from "./cn-YER3QsV1.js";
|
|
3
3
|
import { t as r } from "./MButton-C1pnL4_j.js";
|
|
4
4
|
import { useMemo as i } from "react";
|
|
@@ -52,7 +52,7 @@ function l({ total: s, page: l, pageSize: u = 10, onChange: d, siblings: f = 1,
|
|
|
52
52
|
disabled: v <= 1,
|
|
53
53
|
onClick: () => d(v - 1),
|
|
54
54
|
className: "nav",
|
|
55
|
-
children: /* @__PURE__ */ a(
|
|
55
|
+
children: /* @__PURE__ */ a(e, {})
|
|
56
56
|
}),
|
|
57
57
|
/* @__PURE__ */ o("span", {
|
|
58
58
|
className: "info",
|
|
@@ -69,7 +69,7 @@ function l({ total: s, page: l, pageSize: u = 10, onChange: d, siblings: f = 1,
|
|
|
69
69
|
disabled: v >= _,
|
|
70
70
|
onClick: () => d(v + 1),
|
|
71
71
|
className: "nav",
|
|
72
|
-
children: /* @__PURE__ */ a(
|
|
72
|
+
children: /* @__PURE__ */ a(t, {})
|
|
73
73
|
})
|
|
74
74
|
]
|
|
75
75
|
}) : /* @__PURE__ */ o("nav", {
|
|
@@ -84,7 +84,7 @@ function l({ total: s, page: l, pageSize: u = 10, onChange: d, siblings: f = 1,
|
|
|
84
84
|
disabled: v <= 1,
|
|
85
85
|
onClick: () => d(v - 1),
|
|
86
86
|
className: "nav",
|
|
87
|
-
children: /* @__PURE__ */ a(
|
|
87
|
+
children: /* @__PURE__ */ a(e, {})
|
|
88
88
|
}),
|
|
89
89
|
y.map((e, t) => e === "dots" ? /* @__PURE__ */ a("span", {
|
|
90
90
|
className: "dots",
|
|
@@ -102,7 +102,7 @@ function l({ total: s, page: l, pageSize: u = 10, onChange: d, siblings: f = 1,
|
|
|
102
102
|
disabled: v >= _,
|
|
103
103
|
onClick: () => d(v + 1),
|
|
104
104
|
className: "nav",
|
|
105
|
-
children: /* @__PURE__ */ a(
|
|
105
|
+
children: /* @__PURE__ */ a(t, {})
|
|
106
106
|
})
|
|
107
107
|
]
|
|
108
108
|
});
|
|
@@ -110,4 +110,4 @@ function l({ total: s, page: l, pageSize: u = 10, onChange: d, siblings: f = 1,
|
|
|
110
110
|
//#endregion
|
|
111
111
|
export { l as t };
|
|
112
112
|
|
|
113
|
-
//# sourceMappingURL=MPagination-
|
|
113
|
+
//# sourceMappingURL=MPagination-CgmNEAZX.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MPagination-
|
|
1
|
+
{"version":3,"file":"MPagination-CgmNEAZX.js","names":[],"sources":["../src/components/layout/MPagination/MPagination.tsx"],"sourcesContent":["import {useMemo} from 'react'\nimport {cn} from '../../../utils/cn'\nimport {MButton} from '../../controls'\nimport {MChevronLeftIcon, MChevronRightIcon} from '../../../icons'\nimport type {MPaginationProps} from './MPagination.types'\nimport './MPagination.css'\n\nfunction range(start: number, end: number): number[] {\n const result: number[] = []\n for (let i = start; i <= end; i++) result.push(i)\n return result\n}\n\nfunction buildPages(totalPages: number, page: number, siblings: number, boundaries: number): (number | 'dots')[] {\n if (totalPages <= boundaries * 2 + siblings * 2 + 3) {\n return range(1, totalPages)\n }\n\n const leftBound = Math.max(page - siblings, boundaries + 2)\n const rightBound = Math.min(page + siblings, totalPages - boundaries - 1)\n\n const showLeftDots = leftBound > boundaries + 2\n const showRightDots = rightBound < totalPages - boundaries - 1\n\n const leftEdge = range(1, boundaries)\n const rightEdge = range(totalPages - boundaries + 1, totalPages)\n\n if (!showLeftDots && showRightDots) {\n const leftCount = siblings * 2 + boundaries + 2\n return [...range(1, leftCount), 'dots', ...rightEdge]\n }\n\n if (showLeftDots && !showRightDots) {\n const rightCount = siblings * 2 + boundaries + 2\n return [...leftEdge, 'dots', ...range(totalPages - rightCount + 1, totalPages)]\n }\n\n return [...leftEdge, 'dots', ...range(leftBound, rightBound), 'dots', ...rightEdge]\n}\n\nexport function MPagination({\n total,\n page,\n pageSize = 10,\n onChange,\n siblings = 1,\n boundaries = 1,\n variant = 'numbered',\n className,\n ...rest\n}: MPaginationProps) {\n const totalPages = Math.max(1, Math.ceil(total / pageSize))\n const currentPage = Math.min(Math.max(1, page), totalPages)\n\n const pages = useMemo(\n () => buildPages(totalPages, currentPage, siblings, boundaries),\n [totalPages, currentPage, siblings, boundaries]\n )\n\n if (variant === 'simple') {\n return (\n <nav aria-label=\"pagination\" className={cn('pagination', className)} {...rest}>\n <MButton\n variant=\"outlined\"\n size=\"sm\"\n iconOnly\n disabled={currentPage <= 1}\n onClick={() => onChange(currentPage - 1)}\n className=\"nav\"\n >\n <MChevronLeftIcon />\n </MButton>\n <span className=\"info\">\n {currentPage} / {totalPages}\n </span>\n <MButton\n variant=\"outlined\"\n size=\"sm\"\n iconOnly\n disabled={currentPage >= totalPages}\n onClick={() => onChange(currentPage + 1)}\n className=\"nav\"\n >\n <MChevronRightIcon />\n </MButton>\n </nav>\n )\n }\n\n return (\n <nav aria-label=\"pagination\" className={cn('pagination', className)} {...rest}>\n <MButton\n variant=\"outlined\"\n size=\"sm\"\n iconOnly\n disabled={currentPage <= 1}\n onClick={() => onChange(currentPage - 1)}\n className=\"nav\"\n >\n <MChevronLeftIcon />\n </MButton>\n {pages.map((p, i) =>\n p === 'dots' ? (\n <span key={`dots-${i}`} className=\"dots\">\n …\n </span>\n ) : (\n <button\n key={p}\n type=\"button\"\n className={cn('btn', p === currentPage && 'active')}\n onClick={() => onChange(p)}\n >\n {p}\n </button>\n )\n )}\n <MButton\n variant=\"outlined\"\n size=\"sm\"\n iconOnly\n disabled={currentPage >= totalPages}\n onClick={() => onChange(currentPage + 1)}\n className=\"nav\"\n >\n <MChevronRightIcon />\n </MButton>\n </nav>\n )\n}\n"],"mappings":";;;;;;AAOA,SAAS,EAAM,GAAe,GAAuB;CACjD,IAAM,IAAmB,EAAE;AAC3B,MAAK,IAAI,IAAI,GAAO,KAAK,GAAK,IAAK,GAAO,KAAK,EAAE;AACjD,QAAO;;AAGX,SAAS,EAAW,GAAoB,GAAc,GAAkB,GAAyC;AAC7G,KAAI,KAAc,IAAa,IAAI,IAAW,IAAI,EAC9C,QAAO,EAAM,GAAG,EAAW;CAG/B,IAAM,IAAY,KAAK,IAAI,IAAO,GAAU,IAAa,EAAE,EACrD,IAAa,KAAK,IAAI,IAAO,GAAU,IAAa,IAAa,EAAE,EAEnE,IAAe,IAAY,IAAa,GACxC,IAAgB,IAAa,IAAa,IAAa,GAEvD,IAAW,EAAM,GAAG,EAAW,EAC/B,IAAY,EAAM,IAAa,IAAa,GAAG,EAAW;AAEhE,KAAI,CAAC,KAAgB,EAEjB,QAAO;EAAC,GAAG,EAAM,GADC,IAAW,IAAI,IAAa,EAChB;EAAE;EAAQ,GAAG;EAAU;AAGzD,KAAI,KAAgB,CAAC,GAAe;EAChC,IAAM,IAAa,IAAW,IAAI,IAAa;AAC/C,SAAO;GAAC,GAAG;GAAU;GAAQ,GAAG,EAAM,IAAa,IAAa,GAAG,EAAW;GAAC;;AAGnF,QAAO;EAAC,GAAG;EAAU;EAAQ,GAAG,EAAM,GAAW,EAAW;EAAE;EAAQ,GAAG;EAAU;;AAGvF,SAAgB,EAAY,EACxB,UACA,SACA,cAAW,IACX,aACA,cAAW,GACX,gBAAa,GACb,aAAU,YACV,cACA,GAAG,KACc;CACjB,IAAM,IAAa,KAAK,IAAI,GAAG,KAAK,KAAK,IAAQ,EAAS,CAAC,EACrD,IAAc,KAAK,IAAI,KAAK,IAAI,GAAG,EAAK,EAAE,EAAW,EAErD,IAAQ,QACJ,EAAW,GAAY,GAAa,GAAU,EAAW,EAC/D;EAAC;EAAY;EAAa;EAAU;EAAW,CAClD;AAgCD,QA9BI,MAAY,WAER,kBAAC,OAAD;EAAK,cAAW;EAAa,WAAW,EAAG,cAAc,EAAU;EAAE,GAAI;YAAzE;GACI,kBAAC,GAAD;IACI,SAAQ;IACR,MAAK;IACL,UAAA;IACA,UAAU,KAAe;IACzB,eAAe,EAAS,IAAc,EAAE;IACxC,WAAU;cAEV,kBAAC,GAAD,EAAoB,CAAA;IACd,CAAA;GACV,kBAAC,QAAD;IAAM,WAAU;cAAhB;KACK;KAAY;KAAI;KACd;;GACP,kBAAC,GAAD;IACI,SAAQ;IACR,MAAK;IACL,UAAA;IACA,UAAU,KAAe;IACzB,eAAe,EAAS,IAAc,EAAE;IACxC,WAAU;cAEV,kBAAC,GAAD,EAAqB,CAAA;IACf,CAAA;GACR;MAKV,kBAAC,OAAD;EAAK,cAAW;EAAa,WAAW,EAAG,cAAc,EAAU;EAAE,GAAI;YAAzE;GACI,kBAAC,GAAD;IACI,SAAQ;IACR,MAAK;IACL,UAAA;IACA,UAAU,KAAe;IACzB,eAAe,EAAS,IAAc,EAAE;IACxC,WAAU;cAEV,kBAAC,GAAD,EAAoB,CAAA;IACd,CAAA;GACT,EAAM,KAAK,GAAG,MACX,MAAM,SACF,kBAAC,QAAD;IAAwB,WAAU;cAAO;IAElC,EAFI,QAAQ,IAEZ,GAEP,kBAAC,UAAD;IAEI,MAAK;IACL,WAAW,EAAG,OAAO,MAAM,KAAe,SAAS;IACnD,eAAe,EAAS,EAAE;cAEzB;IACI,EANA,EAMA,CAEhB;GACD,kBAAC,GAAD;IACI,SAAQ;IACR,MAAK;IACL,UAAA;IACA,UAAU,KAAe;IACzB,eAAe,EAAS,IAAc,EAAE;IACxC,WAAU;cAEV,kBAAC,GAAD,EAAqB,CAAA;IACf,CAAA;GACR"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`./cn-CU5TNITO.cjs`),t=require(`./MPortal-BciZHNDC.cjs`);require(`./core-DBpQf3uY.cjs`);let n=require(`react`),r=require(`react/jsx-runtime`);function i({open:i,anchorRef:a,onClose:o,placement:s=`bottom-start`,matchWidth:c=!1,offset:l=4,zIndex:u,children:d,className:f,style:p}){let m=(0,n.useRef)(null),[h,g]=(0,n.useState)(null),[_,v]=(0,n.useState)(!1),[y,b]=(0,n.useState)(null),x=(0,n.useCallback)(()=>{if(u!==void 0){b(u);return}let e=a.current;if(!e||typeof window>`u`){b(null);return}let t=e.closest(`.drawer-backdrop, .modal-backdrop, .sheet-backdrop, .sidebar.mobile-open, .popover`);if(!t){b(null);return}let n=window.getComputedStyle(t).zIndex,r=Number.parseInt(n,10);b(Number.isFinite(r)?r+1:null)},[a,u]),S=(0,n.useCallback)(()=>{if(!a.current||!m.current)return;let e=a.current.getBoundingClientRect(),t=m.current.getBoundingClientRect(),n={width:window.innerWidth,height:window.innerHeight},r=s.startsWith(`top`),i=s.startsWith(`right`),o=s.startsWith(`left`),u=i||o,d=s.endsWith(`end`),f,p;if(u){let r=n.width-e.right-l,a=e.left-l,o=i?r<t.width&&a>r:a<t.width&&r>a;v(o),p=(i?!o:o)?e.right+l+window.scrollX:e.left-t.width-l+window.scrollX,f=d?e.bottom-t.height+window.scrollY:e.top+window.scrollY}else{let i=n.height-e.bottom-l,a=e.top-l,o=r?a<t.height&&i>a:i<t.height&&a>i;v(o),f=(r?!o:o)?e.top-t.height-l+window.scrollY:e.bottom+l+window.scrollY,p=d?e.right-t.width+window.scrollX:e.left+window.scrollX}p=Math.max(8,Math.min(p,n.width-t.width-8)),f=Math.max(8+window.scrollY,f),g({top:f,left:p,width:c?e.width:void 0})},[a,s,l,c]);return(0,n.useEffect)(()=>{if(!i){g(null),b(null);return}return x(),requestAnimationFrame(S),
|
|
2
|
-
//# sourceMappingURL=MPopover-
|
|
1
|
+
const e=require(`./cn-CU5TNITO.cjs`),t=require(`./MPortal-BciZHNDC.cjs`);require(`./core-DBpQf3uY.cjs`);let n=require(`react`),r=require(`react/jsx-runtime`);function i({open:i,anchorRef:a,onClose:o,placement:s=`bottom-start`,matchWidth:c=!1,offset:l=4,zIndex:u,children:d,className:f,style:p}){let m=(0,n.useRef)(null),[h,g]=(0,n.useState)(null),[_,v]=(0,n.useState)(!1),[y,b]=(0,n.useState)(null),x=(0,n.useCallback)(()=>{if(u!==void 0){b(u);return}let e=a.current;if(!e||typeof window>`u`){b(null);return}let t=e.closest(`.drawer-backdrop, .modal-backdrop, .sheet-backdrop, .sidebar.mobile-open, .popover`);if(!t){b(null);return}let n=window.getComputedStyle(t).zIndex,r=Number.parseInt(n,10);b(Number.isFinite(r)?r+1:null)},[a,u]),S=(0,n.useCallback)(()=>{if(!a.current||!m.current)return;let e=a.current.getBoundingClientRect(),t=m.current.getBoundingClientRect(),n={width:window.innerWidth,height:window.innerHeight},r=s.startsWith(`top`),i=s.startsWith(`right`),o=s.startsWith(`left`),u=i||o,d=s.endsWith(`end`),f,p;if(u){let r=n.width-e.right-l,a=e.left-l,o=i?r<t.width&&a>r:a<t.width&&r>a;v(o),p=(i?!o:o)?e.right+l+window.scrollX:e.left-t.width-l+window.scrollX,f=d?e.bottom-t.height+window.scrollY:e.top+window.scrollY}else{let i=n.height-e.bottom-l,a=e.top-l,o=r?a<t.height&&i>a:i<t.height&&a>i;v(o),f=(r?!o:o)?e.top-t.height-l+window.scrollY:e.bottom+l+window.scrollY,p=d?e.right-t.width+window.scrollX:e.left+window.scrollX}p=Math.max(8,Math.min(p,n.width-t.width-8)),f=Math.max(8+window.scrollY,f),g({top:f,left:p,width:c?e.width:void 0})},[a,s,l,c]);return(0,n.useEffect)(()=>{if(!i){g(null),b(null);return}return x(),requestAnimationFrame(S),document.addEventListener(`scroll`,S,{capture:!0,passive:!0}),window.addEventListener(`resize`,S,{passive:!0}),()=>{document.removeEventListener(`scroll`,S,{capture:!0}),window.removeEventListener(`resize`,S)}},[i,x,S]),(0,n.useEffect)(()=>{if(!i)return;let e=e=>{e.key===`Escape`&&o()};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[i,o]),(0,n.useEffect)(()=>{if(!i)return;let e=e=>{m.current&&!m.current.contains(e.target)&&a.current&&!a.current.contains(e.target)&&o()};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[i,o,a]),i?(0,r.jsx)(t.t,{children:(0,r.jsx)(`div`,{ref:m,className:e.t(`popover`,_?`flipped`:`normal`,f),style:{position:`absolute`,top:h?.top??0,left:h?.left??0,width:h?.width,zIndex:y??void 0,visibility:h?`visible`:`hidden`,...p},role:`listbox`,children:d})}):null}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return i}});
|
|
2
|
+
//# sourceMappingURL=MPopover-Cweomcj2.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MPopover-Cweomcj2.cjs","names":[],"sources":["../src/components/primitives/MPopover/MPopover.tsx"],"sourcesContent":["import {useState, useEffect, useRef, useCallback} from 'react'\nimport {MPortal} from '../MPortal'\nimport {cn} from '../../../utils/cn'\nimport type {MPopoverProps} from './MPopover.types'\nimport './MPopover.css'\n\n// Position floating content relative to an anchor with viewport-aware flipping.\nexport function MPopover({\n open,\n anchorRef,\n onClose,\n placement = 'bottom-start',\n matchWidth = false,\n offset = 4,\n zIndex,\n children,\n className,\n style,\n}: MPopoverProps) {\n const popoverRef = useRef<HTMLDivElement>(null)\n const [position, setPosition] = useState<{top: number; left: number; width?: number} | null>(null)\n const [flipped, setFlipped] = useState(false)\n const [layerZ, setLayerZ] = useState<number | string | null>(null)\n\n // Lift popovers above drawers, modals and mobile sidebars when the anchor sits inside them.\n const updateLayer = useCallback(() => {\n if (zIndex !== undefined) {\n setLayerZ(zIndex)\n return\n }\n\n const anchor = anchorRef.current\n if (!anchor || typeof window === 'undefined') {\n setLayerZ(null)\n return\n }\n\n const layerHost = anchor.closest(\n '.drawer-backdrop, .modal-backdrop, .sheet-backdrop, .sidebar.mobile-open, .popover'\n )\n if (!layerHost) {\n setLayerZ(null)\n return\n }\n\n const computedZ = window.getComputedStyle(layerHost).zIndex\n const parsedZ = Number.parseInt(computedZ, 10)\n setLayerZ(Number.isFinite(parsedZ) ? parsedZ + 1 : null)\n }, [anchorRef, zIndex])\n\n // Recalculate popover position whenever layout or viewport constraints change.\n const updatePosition = useCallback(() => {\n if (!anchorRef.current || !popoverRef.current) return\n\n const anchor = anchorRef.current.getBoundingClientRect()\n const popover = popoverRef.current.getBoundingClientRect()\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight,\n }\n\n const isTop = placement.startsWith('top')\n const isRight = placement.startsWith('right')\n const isLeft = placement.startsWith('left')\n const isHorizontal = isRight || isLeft\n const isEnd = placement.endsWith('end')\n\n let top: number\n let left: number\n\n if (isHorizontal) {\n // Horizontal placement: position to the right or left of the anchor\n const spaceRight = viewport.width - anchor.right - offset\n const spaceLeft = anchor.left - offset\n const shouldFlip = isRight\n ? spaceRight < popover.width && spaceLeft > spaceRight\n : spaceLeft < popover.width && spaceRight > spaceLeft\n\n setFlipped(shouldFlip)\n\n const showOnRight = isRight ? !shouldFlip : shouldFlip\n\n if (showOnRight) {\n left = anchor.right + offset + window.scrollX\n } else {\n left = anchor.left - popover.width - offset + window.scrollX\n }\n\n if (isEnd) {\n top = anchor.bottom - popover.height + window.scrollY\n } else {\n top = anchor.top + window.scrollY\n }\n } else {\n // Vertical placement: position above or below the anchor\n const spaceBelow = viewport.height - anchor.bottom - offset\n const spaceAbove = anchor.top - offset\n const shouldFlip = isTop\n ? spaceAbove < popover.height && spaceBelow > spaceAbove\n : spaceBelow < popover.height && spaceAbove > spaceBelow\n\n setFlipped(shouldFlip)\n\n const showOnTop = isTop ? !shouldFlip : shouldFlip\n\n if (showOnTop) {\n top = anchor.top - popover.height - offset + window.scrollY\n } else {\n top = anchor.bottom + offset + window.scrollY\n }\n\n if (isEnd) {\n left = anchor.right - popover.width + window.scrollX\n } else {\n left = anchor.left + window.scrollX\n }\n }\n\n // Clamp to viewport\n left = Math.max(8, Math.min(left, viewport.width - popover.width - 8))\n top = Math.max(8 + window.scrollY, top)\n\n setPosition({\n top,\n left,\n width: matchWidth ? anchor.width : undefined,\n })\n }, [anchorRef, placement, offset, matchWidth])\n\n useEffect(() => {\n if (!open) {\n setPosition(null)\n setLayerZ(null)\n return\n }\n\n updateLayer()\n // Wait one frame so the rendered popover can be measured accurately.\n requestAnimationFrame(updatePosition)\n\n // `scroll` does not bubble, so a window listener only ever sees the\n // document scrolling. Anchors living inside a scrollable ancestor — an\n // app shell with a scrolling main region, MStickyPanel, an overflowing\n // card — would leave the popover stranded at its opening coordinates\n // while the anchor moved away underneath it. Scroll events do capture,\n // so a capture-phase listener on the document catches scrolling from\n // ANY container, including the document itself.\n document.addEventListener('scroll', updatePosition, {capture: true, passive: true})\n window.addEventListener('resize', updatePosition, {passive: true})\n return () => {\n document.removeEventListener('scroll', updatePosition, {capture: true})\n window.removeEventListener('resize', updatePosition)\n }\n }, [open, updateLayer, updatePosition])\n\n // Close the popover with the standard Escape key interaction.\n useEffect(() => {\n if (!open) return\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', handleKey)\n return () => document.removeEventListener('keydown', handleKey)\n }, [open, onClose])\n\n // Close when the user interacts outside both the popover and its anchor.\n useEffect(() => {\n if (!open) return\n const handleClick = (e: MouseEvent) => {\n if (\n popoverRef.current &&\n !popoverRef.current.contains(e.target as Node) &&\n anchorRef.current &&\n !anchorRef.current.contains(e.target as Node)\n ) {\n onClose()\n }\n }\n document.addEventListener('mousedown', handleClick)\n return () => document.removeEventListener('mousedown', handleClick)\n }, [open, onClose, anchorRef])\n\n if (!open) return null\n\n return (\n <MPortal>\n <div\n ref={popoverRef}\n className={cn('popover', flipped ? 'flipped' : 'normal', className)}\n style={{\n position: 'absolute',\n top: position?.top ?? 0,\n left: position?.left ?? 0,\n width: position?.width,\n zIndex: layerZ ?? undefined,\n visibility: position ? 'visible' : 'hidden',\n ...style,\n }}\n role=\"listbox\"\n >\n {children}\n </div>\n </MPortal>\n )\n}\n"],"mappings":"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"}
|
|
@@ -50,8 +50,11 @@ function s({ open: s, anchorRef: c, onClose: l, placement: u = "bottom-start", m
|
|
|
50
50
|
y(null), C(null);
|
|
51
51
|
return;
|
|
52
52
|
}
|
|
53
|
-
return w(), requestAnimationFrame(T),
|
|
54
|
-
|
|
53
|
+
return w(), requestAnimationFrame(T), document.addEventListener("scroll", T, {
|
|
54
|
+
capture: !0,
|
|
55
|
+
passive: !0
|
|
56
|
+
}), window.addEventListener("resize", T, { passive: !0 }), () => {
|
|
57
|
+
document.removeEventListener("scroll", T, { capture: !0 }), window.removeEventListener("resize", T);
|
|
55
58
|
};
|
|
56
59
|
}, [
|
|
57
60
|
s,
|
|
@@ -92,4 +95,4 @@ function s({ open: s, anchorRef: c, onClose: l, placement: u = "bottom-start", m
|
|
|
92
95
|
//#endregion
|
|
93
96
|
export { s as t };
|
|
94
97
|
|
|
95
|
-
//# sourceMappingURL=MPopover-
|
|
98
|
+
//# sourceMappingURL=MPopover-DT3vclV1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MPopover-DT3vclV1.js","names":[],"sources":["../src/components/primitives/MPopover/MPopover.tsx"],"sourcesContent":["import {useState, useEffect, useRef, useCallback} from 'react'\nimport {MPortal} from '../MPortal'\nimport {cn} from '../../../utils/cn'\nimport type {MPopoverProps} from './MPopover.types'\nimport './MPopover.css'\n\n// Position floating content relative to an anchor with viewport-aware flipping.\nexport function MPopover({\n open,\n anchorRef,\n onClose,\n placement = 'bottom-start',\n matchWidth = false,\n offset = 4,\n zIndex,\n children,\n className,\n style,\n}: MPopoverProps) {\n const popoverRef = useRef<HTMLDivElement>(null)\n const [position, setPosition] = useState<{top: number; left: number; width?: number} | null>(null)\n const [flipped, setFlipped] = useState(false)\n const [layerZ, setLayerZ] = useState<number | string | null>(null)\n\n // Lift popovers above drawers, modals and mobile sidebars when the anchor sits inside them.\n const updateLayer = useCallback(() => {\n if (zIndex !== undefined) {\n setLayerZ(zIndex)\n return\n }\n\n const anchor = anchorRef.current\n if (!anchor || typeof window === 'undefined') {\n setLayerZ(null)\n return\n }\n\n const layerHost = anchor.closest(\n '.drawer-backdrop, .modal-backdrop, .sheet-backdrop, .sidebar.mobile-open, .popover'\n )\n if (!layerHost) {\n setLayerZ(null)\n return\n }\n\n const computedZ = window.getComputedStyle(layerHost).zIndex\n const parsedZ = Number.parseInt(computedZ, 10)\n setLayerZ(Number.isFinite(parsedZ) ? parsedZ + 1 : null)\n }, [anchorRef, zIndex])\n\n // Recalculate popover position whenever layout or viewport constraints change.\n const updatePosition = useCallback(() => {\n if (!anchorRef.current || !popoverRef.current) return\n\n const anchor = anchorRef.current.getBoundingClientRect()\n const popover = popoverRef.current.getBoundingClientRect()\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight,\n }\n\n const isTop = placement.startsWith('top')\n const isRight = placement.startsWith('right')\n const isLeft = placement.startsWith('left')\n const isHorizontal = isRight || isLeft\n const isEnd = placement.endsWith('end')\n\n let top: number\n let left: number\n\n if (isHorizontal) {\n // Horizontal placement: position to the right or left of the anchor\n const spaceRight = viewport.width - anchor.right - offset\n const spaceLeft = anchor.left - offset\n const shouldFlip = isRight\n ? spaceRight < popover.width && spaceLeft > spaceRight\n : spaceLeft < popover.width && spaceRight > spaceLeft\n\n setFlipped(shouldFlip)\n\n const showOnRight = isRight ? !shouldFlip : shouldFlip\n\n if (showOnRight) {\n left = anchor.right + offset + window.scrollX\n } else {\n left = anchor.left - popover.width - offset + window.scrollX\n }\n\n if (isEnd) {\n top = anchor.bottom - popover.height + window.scrollY\n } else {\n top = anchor.top + window.scrollY\n }\n } else {\n // Vertical placement: position above or below the anchor\n const spaceBelow = viewport.height - anchor.bottom - offset\n const spaceAbove = anchor.top - offset\n const shouldFlip = isTop\n ? spaceAbove < popover.height && spaceBelow > spaceAbove\n : spaceBelow < popover.height && spaceAbove > spaceBelow\n\n setFlipped(shouldFlip)\n\n const showOnTop = isTop ? !shouldFlip : shouldFlip\n\n if (showOnTop) {\n top = anchor.top - popover.height - offset + window.scrollY\n } else {\n top = anchor.bottom + offset + window.scrollY\n }\n\n if (isEnd) {\n left = anchor.right - popover.width + window.scrollX\n } else {\n left = anchor.left + window.scrollX\n }\n }\n\n // Clamp to viewport\n left = Math.max(8, Math.min(left, viewport.width - popover.width - 8))\n top = Math.max(8 + window.scrollY, top)\n\n setPosition({\n top,\n left,\n width: matchWidth ? anchor.width : undefined,\n })\n }, [anchorRef, placement, offset, matchWidth])\n\n useEffect(() => {\n if (!open) {\n setPosition(null)\n setLayerZ(null)\n return\n }\n\n updateLayer()\n // Wait one frame so the rendered popover can be measured accurately.\n requestAnimationFrame(updatePosition)\n\n // `scroll` does not bubble, so a window listener only ever sees the\n // document scrolling. Anchors living inside a scrollable ancestor — an\n // app shell with a scrolling main region, MStickyPanel, an overflowing\n // card — would leave the popover stranded at its opening coordinates\n // while the anchor moved away underneath it. Scroll events do capture,\n // so a capture-phase listener on the document catches scrolling from\n // ANY container, including the document itself.\n document.addEventListener('scroll', updatePosition, {capture: true, passive: true})\n window.addEventListener('resize', updatePosition, {passive: true})\n return () => {\n document.removeEventListener('scroll', updatePosition, {capture: true})\n window.removeEventListener('resize', updatePosition)\n }\n }, [open, updateLayer, updatePosition])\n\n // Close the popover with the standard Escape key interaction.\n useEffect(() => {\n if (!open) return\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', handleKey)\n return () => document.removeEventListener('keydown', handleKey)\n }, [open, onClose])\n\n // Close when the user interacts outside both the popover and its anchor.\n useEffect(() => {\n if (!open) return\n const handleClick = (e: MouseEvent) => {\n if (\n popoverRef.current &&\n !popoverRef.current.contains(e.target as Node) &&\n anchorRef.current &&\n !anchorRef.current.contains(e.target as Node)\n ) {\n onClose()\n }\n }\n document.addEventListener('mousedown', handleClick)\n return () => document.removeEventListener('mousedown', handleClick)\n }, [open, onClose, anchorRef])\n\n if (!open) return null\n\n return (\n <MPortal>\n <div\n ref={popoverRef}\n className={cn('popover', flipped ? 'flipped' : 'normal', className)}\n style={{\n position: 'absolute',\n top: position?.top ?? 0,\n left: position?.left ?? 0,\n width: position?.width,\n zIndex: layerZ ?? undefined,\n visibility: position ? 'visible' : 'hidden',\n ...style,\n }}\n role=\"listbox\"\n >\n {children}\n </div>\n </MPortal>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`./theme-BfNZicWk.cjs`),t=require(`./icons-
|
|
2
|
-
//# sourceMappingURL=MTag-
|
|
1
|
+
const e=require(`./theme-BfNZicWk.cjs`),t=require(`./icons-D675Im0B.cjs`),n=require(`./cn-CU5TNITO.cjs`),r=require(`./MButton-R08y1HCT.cjs`);require(`./core-DBpQf3uY.cjs`);let i=require(`react/jsx-runtime`);function a({label:a,color:o=`primary`,variant:s=`solid`,size:c=`md`,hidden:l,rounded:u=!1,closable:d=!1,onClose:f,icon:p,className:m,...h}){return(0,i.jsxs)(`span`,{className:n.t(`m-tag`,`color-${o}`,s,c,u&&`rounded`,m),...e.r(l),...h,children:[p&&(0,i.jsx)(`span`,{className:`m-tag icon`,children:p}),(0,i.jsx)(`span`,{className:`m-tag label`,children:a}),d&&(0,i.jsx)(r.t,{variant:`link`,color:`neutral`,iconOnly:!0,size:`xs`,className:`m-tag close`,onClick:e=>{e.stopPropagation(),f?.()},"aria-label":`Remove`,children:(0,i.jsx)(t.Xi,{})})]})}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return a}});
|
|
2
|
+
//# sourceMappingURL=MTag-BzTp1crT.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MTag-
|
|
1
|
+
{"version":3,"file":"MTag-BzTp1crT.cjs","names":[],"sources":["../src/components/feedback/MTag/MTag.tsx"],"sourcesContent":["import type {MTagProps} from './MTag.types'\nimport {getHiddenProps} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport {MButton} from '../../controls'\nimport {MCloseIcon} from '../../../icons'\nimport './MTag.css'\n\nexport function MTag({\n label,\n color = 'primary',\n variant = 'solid',\n size = 'md',\n hidden,\n rounded = false,\n closable = false,\n onClose,\n icon,\n className,\n ...rest\n}: MTagProps) {\n return (\n <span\n className={cn('m-tag', `color-${color}`, variant, size, rounded && 'rounded', className)}\n {...getHiddenProps(hidden)}\n {...rest}\n >\n {icon && <span className=\"m-tag icon\">{icon}</span>}\n <span className=\"m-tag label\">{label}</span>\n {closable && (\n <MButton\n variant=\"link\"\n color=\"neutral\"\n iconOnly\n size=\"xs\"\n className=\"m-tag close\"\n onClick={(e) => {\n e.stopPropagation()\n onClose?.()\n }}\n aria-label=\"Remove\"\n >\n <MCloseIcon />\n </MButton>\n )}\n </span>\n )\n}\n"],"mappings":"+MAOA,SAAgB,EAAK,CACjB,QACA,QAAQ,UACR,UAAU,QACV,OAAO,KACP,SACA,UAAU,GACV,WAAW,GACX,UACA,OACA,YACA,GAAG,GACO,CACV,OACI,EAAA,EAAA,MAAC,OAAD,CACI,UAAW,EAAA,EAAG,QAAS,SAAS,IAAS,EAAS,EAAM,GAAW,UAAW,EAAU,CACxF,GAAI,EAAA,EAAe,EAAO,CAC1B,GAAI,WAHR,CAKK,IAAQ,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,sBAAc,EAAY,CAAA,EACnD,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,uBAAe,EAAa,CAAA,CAC3C,IACG,EAAA,EAAA,KAAC,EAAA,EAAD,CACI,QAAQ,OACR,MAAM,UACN,SAAA,GACA,KAAK,KACL,UAAU,cACV,QAAU,GAAM,CACZ,EAAE,iBAAiB,CACnB,KAAW,EAEf,aAAW,mBAEX,EAAA,EAAA,KAAC,EAAA,GAAD,EAAc,CAAA,CACR,CAAA,CAEX"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { r as e } from "./theme-DAOU1aPs.js";
|
|
2
|
-
import {
|
|
2
|
+
import { Xi as t } from "./icons-CBMl-kOM.js";
|
|
3
3
|
import { t as n } from "./cn-YER3QsV1.js";
|
|
4
4
|
import { t as r } from "./MButton-C1pnL4_j.js";
|
|
5
5
|
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
@@ -36,4 +36,4 @@ function o({ label: o, color: s = "primary", variant: c = "solid", size: l = "md
|
|
|
36
36
|
//#endregion
|
|
37
37
|
export { o as t };
|
|
38
38
|
|
|
39
|
-
//# sourceMappingURL=MTag-
|
|
39
|
+
//# sourceMappingURL=MTag-D9q6faIk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MTag-
|
|
1
|
+
{"version":3,"file":"MTag-D9q6faIk.js","names":[],"sources":["../src/components/feedback/MTag/MTag.tsx"],"sourcesContent":["import type {MTagProps} from './MTag.types'\nimport {getHiddenProps} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport {MButton} from '../../controls'\nimport {MCloseIcon} from '../../../icons'\nimport './MTag.css'\n\nexport function MTag({\n label,\n color = 'primary',\n variant = 'solid',\n size = 'md',\n hidden,\n rounded = false,\n closable = false,\n onClose,\n icon,\n className,\n ...rest\n}: MTagProps) {\n return (\n <span\n className={cn('m-tag', `color-${color}`, variant, size, rounded && 'rounded', className)}\n {...getHiddenProps(hidden)}\n {...rest}\n >\n {icon && <span className=\"m-tag icon\">{icon}</span>}\n <span className=\"m-tag label\">{label}</span>\n {closable && (\n <MButton\n variant=\"link\"\n color=\"neutral\"\n iconOnly\n size=\"xs\"\n className=\"m-tag close\"\n onClick={(e) => {\n e.stopPropagation()\n onClose?.()\n }}\n aria-label=\"Remove\"\n >\n <MCloseIcon />\n </MButton>\n )}\n </span>\n )\n}\n"],"mappings":";;;;;;AAOA,SAAgB,EAAK,EACjB,UACA,WAAQ,WACR,aAAU,SACV,UAAO,MACP,WACA,aAAU,IACV,cAAW,IACX,YACA,SACA,cACA,GAAG,KACO;AACV,QACI,kBAAC,QAAD;EACI,WAAW,EAAG,SAAS,SAAS,KAAS,GAAS,GAAM,KAAW,WAAW,EAAU;EACxF,GAAI,EAAe,EAAO;EAC1B,GAAI;YAHR;GAKK,KAAQ,kBAAC,QAAD;IAAM,WAAU;cAAc;IAAY,CAAA;GACnD,kBAAC,QAAD;IAAM,WAAU;cAAe;IAAa,CAAA;GAC3C,KACG,kBAAC,GAAD;IACI,SAAQ;IACR,OAAM;IACN,UAAA;IACA,MAAK;IACL,WAAU;IACV,UAAU,MAAM;AAEZ,KADA,EAAE,iBAAiB,EACnB,KAAW;;IAEf,cAAW;cAEX,kBAAC,GAAD,EAAc,CAAA;IACR,CAAA;GAEX"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $r as e, Br as t,
|
|
1
|
+
import { $r as e, Br as t, Fr as n, Gr as r, Hr as i, Ir as a, Jr as o, Lr as s, Qr as c, Rr as l, Ur as u, Vr as d, Wr as f, Xr as p, Yr as m, Zr as h, _i as g, ai as _, ci as v, di as y, ei as b, fi as x, ii as S, mi as C, ni as w, oi as T, pi as E, qi as D, qr as O, ri as k, si as A, ti as j } from "./icons-CBMl-kOM.js";
|
|
2
2
|
import { t as M } from "./cn-YER3QsV1.js";
|
|
3
3
|
import { t as N } from "./MPortal-Ba2Sxset.js";
|
|
4
4
|
import { t as P } from "./MCheckbox-B7SpcD4H.js";
|
|
@@ -6,34 +6,34 @@ import { useEffect as ee, useRef as F, useState as I } from "react";
|
|
|
6
6
|
import { jsx as L, jsxs as R } from "react/jsx-runtime";
|
|
7
7
|
//#region src/components/data/MTreeView/MTreeView.tsx
|
|
8
8
|
var z = {
|
|
9
|
-
pdf: /* @__PURE__ */ L(
|
|
10
|
-
ts: /* @__PURE__ */ L(
|
|
11
|
-
tsx: /* @__PURE__ */ L(
|
|
12
|
-
js: /* @__PURE__ */ L(
|
|
13
|
-
jsx: /* @__PURE__ */ L(
|
|
14
|
-
css: /* @__PURE__ */ L(
|
|
15
|
-
scss: /* @__PURE__ */ L(
|
|
16
|
-
html: /* @__PURE__ */ L(
|
|
17
|
-
json: /* @__PURE__ */ L(
|
|
18
|
-
md: /* @__PURE__ */ L(
|
|
19
|
-
txt: /* @__PURE__ */ L(
|
|
9
|
+
pdf: /* @__PURE__ */ L(E, {}),
|
|
10
|
+
ts: /* @__PURE__ */ L(w, {}),
|
|
11
|
+
tsx: /* @__PURE__ */ L(k, {}),
|
|
12
|
+
js: /* @__PURE__ */ L(f, {}),
|
|
13
|
+
jsx: /* @__PURE__ */ L(y, {}),
|
|
14
|
+
css: /* @__PURE__ */ L(s, {}),
|
|
15
|
+
scss: /* @__PURE__ */ L(s, {}),
|
|
16
|
+
html: /* @__PURE__ */ L(i, {}),
|
|
17
|
+
json: /* @__PURE__ */ L(r, {}),
|
|
18
|
+
md: /* @__PURE__ */ L(O, {}),
|
|
19
|
+
txt: /* @__PURE__ */ L(S, {}),
|
|
20
20
|
csv: /* @__PURE__ */ L(l, {}),
|
|
21
|
-
zip: /* @__PURE__ */ L(
|
|
22
|
-
rar: /* @__PURE__ */ L(
|
|
23
|
-
svg: /* @__PURE__ */ L(
|
|
24
|
-
png: /* @__PURE__ */ L(
|
|
25
|
-
jpg: /* @__PURE__ */ L(
|
|
26
|
-
jpeg: /* @__PURE__ */ L(
|
|
27
|
-
gif: /* @__PURE__ */ L(
|
|
28
|
-
webp: /* @__PURE__ */ L(
|
|
29
|
-
php: /* @__PURE__ */ L(
|
|
30
|
-
xml: /* @__PURE__ */ L(
|
|
31
|
-
xls: /* @__PURE__ */ L(
|
|
32
|
-
ppt: /* @__PURE__ */ L(
|
|
33
|
-
odt: /* @__PURE__ */ L(
|
|
34
|
-
exe: /* @__PURE__ */ L(
|
|
35
|
-
mp3: /* @__PURE__ */ L(
|
|
36
|
-
mp4: /* @__PURE__ */ L(
|
|
21
|
+
zip: /* @__PURE__ */ L(v, {}),
|
|
22
|
+
rar: /* @__PURE__ */ L(b, {}),
|
|
23
|
+
svg: /* @__PURE__ */ L(j, {}),
|
|
24
|
+
png: /* @__PURE__ */ L(c, {}),
|
|
25
|
+
jpg: /* @__PURE__ */ L(u, {}),
|
|
26
|
+
jpeg: /* @__PURE__ */ L(x, {}),
|
|
27
|
+
gif: /* @__PURE__ */ L(d, {}),
|
|
28
|
+
webp: /* @__PURE__ */ L(_, {}),
|
|
29
|
+
php: /* @__PURE__ */ L(h, {}),
|
|
30
|
+
xml: /* @__PURE__ */ L(A, {}),
|
|
31
|
+
xls: /* @__PURE__ */ L(T, {}),
|
|
32
|
+
ppt: /* @__PURE__ */ L(e, {}),
|
|
33
|
+
odt: /* @__PURE__ */ L(p, {}),
|
|
34
|
+
exe: /* @__PURE__ */ L(t, {}),
|
|
35
|
+
mp3: /* @__PURE__ */ L(o, {}),
|
|
36
|
+
mp4: /* @__PURE__ */ L(m, {})
|
|
37
37
|
};
|
|
38
38
|
function B(e) {
|
|
39
39
|
let t = e.lastIndexOf(".");
|
|
@@ -44,10 +44,10 @@ function V(e) {
|
|
|
44
44
|
}
|
|
45
45
|
function H(e) {
|
|
46
46
|
let t = B(e);
|
|
47
|
-
return t ? z[t] ?? /* @__PURE__ */ L(
|
|
47
|
+
return t ? z[t] ?? /* @__PURE__ */ L(C, {}) : /* @__PURE__ */ L(g, {});
|
|
48
48
|
}
|
|
49
|
-
function U(e, t,
|
|
50
|
-
return e.icon ? e.icon :
|
|
49
|
+
function U(e, t, r) {
|
|
50
|
+
return e.icon ? e.icon : r ? V(e) ? L(t ? n : a, {}) : H(e.label) : null;
|
|
51
51
|
}
|
|
52
52
|
function te(e) {
|
|
53
53
|
let t = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
|
|
@@ -94,30 +94,30 @@ function re(e, t) {
|
|
|
94
94
|
y: Math.max(8, Math.min(t, window.innerHeight - 16))
|
|
95
95
|
};
|
|
96
96
|
}
|
|
97
|
-
function W({ node: e, color: t, level: n, expandable: r, selectable: i, expandedIds: a, selectedId: o, draggedId: s, dropTargetId: c, onToggle: l, onSelect: u, checkable: d, checkedIds:
|
|
98
|
-
let
|
|
97
|
+
function W({ node: e, color: t, level: n, expandable: r, selectable: i, expandedIds: a, selectedId: o, draggedId: s, dropTargetId: c, onToggle: l, onSelect: u, checkable: d, checkedIds: f, indeterminateIds: p, onCheck: m, indent: h, showLines: g, fileIcons: _, draggable: v, canDropOnNode: y, onContextMenu: b, onDragStart: x, onDragOver: S, onDrop: C, onDragEnd: w }) {
|
|
98
|
+
let T = V(e), E = a.has(e.id), O = o === e.id, k = s === e.id, A = c === e.id, j = y?.(e), N = U(e, E, !!_), ee = f?.has(e.id) ?? !1, F = p?.has(e.id) ?? !1;
|
|
99
99
|
return /* @__PURE__ */ R("li", {
|
|
100
100
|
role: "treeitem",
|
|
101
|
-
"aria-expanded":
|
|
101
|
+
"aria-expanded": T ? E : void 0,
|
|
102
102
|
children: [/* @__PURE__ */ R("div", {
|
|
103
|
-
className: M("item", O && "selected", e.disabled && "disabled", i && !e.disabled && "selectable",
|
|
103
|
+
className: M("item", O && "selected", e.disabled && "disabled", i && !e.disabled && "selectable", v && !e.disabled && "draggable", k && "dragging", j && "can-drop", A && "drop-target"),
|
|
104
104
|
"data-color": t,
|
|
105
|
-
style: { paddingLeft: n *
|
|
106
|
-
draggable:
|
|
105
|
+
style: { paddingLeft: n * h },
|
|
106
|
+
draggable: v && !e.disabled,
|
|
107
107
|
onClick: () => {
|
|
108
|
-
e.disabled || (
|
|
108
|
+
e.disabled || (T && r && l(e.id), i && u?.(e.id, e));
|
|
109
109
|
},
|
|
110
|
-
onContextMenu: (t) =>
|
|
111
|
-
onDragStart: (t) =>
|
|
112
|
-
onDragOver: (t) =>
|
|
113
|
-
onDrop: (t) =>
|
|
114
|
-
onDragEnd:
|
|
110
|
+
onContextMenu: (t) => b?.(t, e),
|
|
111
|
+
onDragStart: (t) => x?.(t, e),
|
|
112
|
+
onDragOver: (t) => S?.(t, e),
|
|
113
|
+
onDrop: (t) => C?.(t, e),
|
|
114
|
+
onDragEnd: w,
|
|
115
115
|
children: [
|
|
116
116
|
/* @__PURE__ */ L("span", {
|
|
117
117
|
className: "toggle",
|
|
118
|
-
children:
|
|
119
|
-
className: M("arrow",
|
|
120
|
-
children: /* @__PURE__ */ L(
|
|
118
|
+
children: T && r ? /* @__PURE__ */ L("span", {
|
|
119
|
+
className: M("arrow", E && "expanded"),
|
|
120
|
+
children: /* @__PURE__ */ L(D, {})
|
|
121
121
|
}) : /* @__PURE__ */ L("span", { className: "spacer" })
|
|
122
122
|
}),
|
|
123
123
|
d && /* @__PURE__ */ L("span", {
|
|
@@ -129,7 +129,7 @@ function W({ node: e, color: t, level: n, expandable: r, selectable: i, expanded
|
|
|
129
129
|
disabled: e.disabled,
|
|
130
130
|
checked: ee,
|
|
131
131
|
indeterminate: F,
|
|
132
|
-
onChange: () =>
|
|
132
|
+
onChange: () => m?.(e.id)
|
|
133
133
|
})
|
|
134
134
|
}),
|
|
135
135
|
N && /* @__PURE__ */ L("span", {
|
|
@@ -141,10 +141,10 @@ function W({ node: e, color: t, level: n, expandable: r, selectable: i, expanded
|
|
|
141
141
|
children: e.label
|
|
142
142
|
})
|
|
143
143
|
]
|
|
144
|
-
}),
|
|
144
|
+
}), T && E && /* @__PURE__ */ L("ul", {
|
|
145
145
|
className: "list",
|
|
146
146
|
role: "group",
|
|
147
|
-
style:
|
|
147
|
+
style: g ? { "--line-left": `${n * h + 17}px` } : void 0,
|
|
148
148
|
children: (e.children ?? []).map((e) => /* @__PURE__ */ L(W, {
|
|
149
149
|
node: e,
|
|
150
150
|
color: t,
|
|
@@ -158,19 +158,19 @@ function W({ node: e, color: t, level: n, expandable: r, selectable: i, expanded
|
|
|
158
158
|
onToggle: l,
|
|
159
159
|
onSelect: u,
|
|
160
160
|
checkable: d,
|
|
161
|
-
checkedIds:
|
|
162
|
-
indeterminateIds:
|
|
163
|
-
onCheck:
|
|
164
|
-
indent:
|
|
165
|
-
showLines:
|
|
166
|
-
fileIcons:
|
|
167
|
-
draggable:
|
|
168
|
-
canDropOnNode:
|
|
169
|
-
onContextMenu:
|
|
170
|
-
onDragStart:
|
|
171
|
-
onDragOver:
|
|
172
|
-
onDrop:
|
|
173
|
-
onDragEnd:
|
|
161
|
+
checkedIds: f,
|
|
162
|
+
indeterminateIds: p,
|
|
163
|
+
onCheck: m,
|
|
164
|
+
indent: h,
|
|
165
|
+
showLines: g,
|
|
166
|
+
fileIcons: _,
|
|
167
|
+
draggable: v,
|
|
168
|
+
canDropOnNode: y,
|
|
169
|
+
onContextMenu: b,
|
|
170
|
+
onDragStart: x,
|
|
171
|
+
onDragOver: S,
|
|
172
|
+
onDrop: C,
|
|
173
|
+
onDragEnd: w
|
|
174
174
|
}, e.id))
|
|
175
175
|
})]
|
|
176
176
|
});
|
|
@@ -312,4 +312,4 @@ function G({ items: e, color: t = "primary", expandable: n = !0, selectable: r =
|
|
|
312
312
|
//#endregion
|
|
313
313
|
export { G as t };
|
|
314
314
|
|
|
315
|
-
//# sourceMappingURL=MTreeView-
|
|
315
|
+
//# sourceMappingURL=MTreeView-B1J7uqd1.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MTreeView-DQaRF0ty.js","names":[],"sources":["../src/components/data/MTreeView/MTreeView.tsx"],"sourcesContent":["import {useEffect, useRef, useState} from 'react'\nimport type {CSSProperties, DragEvent, MouseEvent, ReactNode} from 'react'\nimport type {\n MTreeViewProps,\n MTreeItemProps,\n MTreeNode,\n MTreeViewContextMenuItem,\n MTreeViewMoveEvent,\n} from './MTreeView.types'\nimport {cn} from '../../../utils/cn'\nimport {MCheckbox} from '../../controls'\nimport {MPortal} from '../../primitives'\nimport {\n MChevronRightIcon,\n MFileCodeIcon,\n MFileCsvIcon,\n MFileCssIcon,\n MFileExeIcon,\n MFileGifIcon,\n MFileHtmlIcon,\n MFileIcon,\n MFileImageIcon,\n MFileJpgIcon,\n MFileJsIcon,\n MFileJsonIcon,\n MFileMdIcon,\n MFileMp3Icon,\n MFileMp4Icon,\n MFileOdtIcon,\n MFilePdfIcon,\n MFilePhpIcon,\n MFilePngIcon,\n MFilePptIcon,\n MFileRarIcon,\n MFileSvgIcon,\n MFileTextIcon,\n MFileTsIcon,\n MFileTsxIcon,\n MFileTxtIcon,\n MFileWebpIcon,\n MFileXlsIcon,\n MFileXmlIcon,\n MFileZipIcon,\n MFolderIcon,\n MFolderOpenIcon,\n} from '../../../icons'\nimport './MTreeView.css'\nconst fileTypeMap: Record<string, ReactNode> = {\n pdf: <MFilePdfIcon />,\n ts: <MFileTsIcon />,\n tsx: <MFileTsxIcon />,\n js: <MFileJsIcon />,\n jsx: <MFileCodeIcon />,\n css: <MFileCssIcon />,\n scss: <MFileCssIcon />,\n html: <MFileHtmlIcon />,\n json: <MFileJsonIcon />,\n md: <MFileMdIcon />,\n txt: <MFileTxtIcon />,\n csv: <MFileCsvIcon />,\n zip: <MFileZipIcon />,\n rar: <MFileRarIcon />,\n svg: <MFileSvgIcon />,\n png: <MFilePngIcon />,\n jpg: <MFileJpgIcon />,\n jpeg: <MFileImageIcon />,\n gif: <MFileGifIcon />,\n webp: <MFileWebpIcon />,\n php: <MFilePhpIcon />,\n xml: <MFileXmlIcon />,\n xls: <MFileXlsIcon />,\n ppt: <MFilePptIcon />,\n odt: <MFileOdtIcon />,\n exe: <MFileExeIcon />,\n mp3: <MFileMp3Icon />,\n mp4: <MFileMp4Icon />,\n}\n\n// Read the file extension once so icon logic stays predictable.\nfunction getFileExtension(label: string): string | null {\n const dot = label.lastIndexOf('.')\n if (dot < 1) return null\n return label.slice(dot + 1).toLowerCase()\n}\n\n// Treat explicit folders and nodes with children as directory-like.\nfunction isFolderNode(node: MTreeNode) {\n return node.kind === 'folder' || Boolean(node.children?.length)\n}\n\n// Resolve the proper file icon by extension.\nfunction getFileIcon(label: string): ReactNode {\n const ext = getFileExtension(label)\n if (!ext) return <MFileIcon />\n\n return fileTypeMap[ext] ?? <MFileTextIcon />\n}\n\n// Prefer custom icons first, then fall back to folder or file visuals.\nfunction getDefaultIcon(node: MTreeNode, isExpanded: boolean, fileIcons: boolean) {\n if (node.icon) return node.icon\n if (!fileIcons) return null\n\n if (isFolderNode(node)) return isExpanded ? <MFolderOpenIcon /> : <MFolderIcon />\n\n return getFileIcon(node.label)\n}\n\n// Cache nodes and descendants so drag-drop validation stays fast.\nfunction buildTreeLookup(items: MTreeNode[]) {\n const nodeMap = new Map<string, MTreeNode>()\n const descendants = new Map<string, Set<string>>()\n const parentMap = new Map<string, string>()\n\n function walk(node: MTreeNode) {\n nodeMap.set(node.id, node)\n\n const childIds = new Set<string>()\n\n for (const child of node.children ?? []) {\n parentMap.set(child.id, node.id)\n childIds.add(child.id)\n\n const nestedIds = walk(child)\n nestedIds.forEach((id) => childIds.add(id))\n }\n\n descendants.set(node.id, childIds)\n return childIds\n }\n\n items.forEach(walk)\n\n return {nodeMap, descendants, parentMap}\n}\n\n// Compute indeterminate ids: a node where some but not all leaf descendants are checked.\nfunction computeIndeterminate(items: MTreeNode[], checked: Set<string>): Set<string> {\n const indeterminate = new Set<string>()\n\n function walk(node: MTreeNode): {checked: number; total: number} {\n if (!node.children?.length) {\n return checked.has(node.id) ? {checked: 1, total: 1} : {checked: 0, total: 1}\n }\n\n let c = 0\n let t = 0\n\n for (const child of node.children) {\n const r = walk(child)\n c += r.checked\n t += r.total\n }\n\n if (c > 0 && c < t) indeterminate.add(node.id)\n return {checked: c, total: t}\n }\n\n items.forEach(walk)\n return indeterminate\n}\n\n// Keep the context menu inside the viewport.\nfunction clampMenuPosition(x: number, y: number) {\n if (typeof window === 'undefined') {\n return {x, y}\n }\n\n return {\n x: Math.max(8, Math.min(x, window.innerWidth - 220)),\n y: Math.max(8, Math.min(y, window.innerHeight - 16)),\n }\n}\n\n// Render one visible row and recurse into children when expanded.\nfunction TreeItem({\n node,\n color,\n level,\n expandable,\n selectable,\n expandedIds,\n selectedId,\n draggedId,\n dropTargetId,\n onToggle,\n onSelect,\n checkable,\n checkedIds,\n indeterminateIds,\n onCheck,\n indent,\n showLines,\n fileIcons,\n draggable,\n canDropOnNode,\n onContextMenu,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n}: MTreeItemProps) {\n const hasChildren = isFolderNode(node)\n const isExpanded = expandedIds.has(node.id)\n const isSelected = selectedId === node.id\n const isDragging = draggedId === node.id\n const isDropTarget = dropTargetId === node.id\n const canDrop = canDropOnNode?.(node)\n const icon = getDefaultIcon(node, isExpanded, !!fileIcons)\n const isChecked = checkedIds?.has(node.id) ?? false\n const isIndeterminate = indeterminateIds?.has(node.id) ?? false\n\n return (\n <li role=\"treeitem\" aria-expanded={hasChildren ? isExpanded : undefined}>\n <div\n className={cn(\n 'item',\n isSelected && 'selected',\n node.disabled && 'disabled',\n selectable && !node.disabled && 'selectable',\n draggable && !node.disabled && 'draggable',\n isDragging && 'dragging',\n canDrop && 'can-drop',\n isDropTarget && 'drop-target'\n )}\n data-color={color}\n style={{paddingLeft: level * indent}}\n draggable={draggable && !node.disabled}\n onClick={() => {\n if (node.disabled) return\n if (hasChildren && expandable) onToggle(node.id)\n if (selectable) onSelect?.(node.id, node)\n }}\n onContextMenu={(event) => onContextMenu?.(event, node)}\n onDragStart={(event) => onDragStart?.(event, node)}\n onDragOver={(event) => onDragOver?.(event, node)}\n onDrop={(event) => onDrop?.(event, node)}\n onDragEnd={onDragEnd}\n >\n <span className=\"toggle\">\n {hasChildren && expandable ? (\n <span className={cn('arrow', isExpanded && 'expanded')}>\n <MChevronRightIcon />\n </span>\n ) : (\n <span className=\"spacer\" />\n )}\n </span>\n {checkable && (\n <span className=\"check\" onClick={(event) => event.stopPropagation()}>\n <MCheckbox\n size=\"sm\"\n clickEffect=\"none\"\n disabled={node.disabled}\n checked={isChecked}\n indeterminate={isIndeterminate}\n onChange={() => onCheck?.(node.id)}\n />\n </span>\n )}\n {icon && <span className=\"icon\">{icon}</span>}\n <span className=\"label\">{node.label}</span>\n </div>\n {hasChildren && isExpanded && (\n <ul\n className=\"list\"\n role=\"group\"\n style={showLines ? ({'--line-left': `${level * indent + 17}px`} as CSSProperties) : undefined}\n >\n {(node.children ?? []).map((child) => (\n <TreeItem\n key={child.id}\n node={child}\n color={color}\n level={level + 1}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={onToggle}\n onSelect={onSelect}\n checkable={checkable}\n checkedIds={checkedIds}\n indeterminateIds={indeterminateIds}\n onCheck={onCheck}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={canDropOnNode}\n onContextMenu={onContextMenu}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onDragEnd={onDragEnd}\n />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\n// Render a file tree with selection, context actions and folder moves.\nexport function MTreeView({\n items,\n color = 'primary',\n expandable = true,\n selectable = false,\n defaultExpanded = [],\n expanded: controlledExpanded,\n onExpandChange,\n selected: controlledSelected,\n onSelect,\n checkable = false,\n defaultChecked = [],\n checked: controlledChecked,\n onCheckedChange,\n indent = 20,\n showLines = true,\n fileIcons = true,\n draggable = false,\n canDrop,\n onMove,\n contextMenuItems,\n onContextMenuAction,\n className,\n ...rest\n}: MTreeViewProps) {\n const [internalExpanded, setInternalExpanded] = useState<string[]>(defaultExpanded)\n const [internalSelected, setInternalSelected] = useState<string | null>(null)\n const [internalChecked, setInternalChecked] = useState<string[]>(defaultChecked)\n const [draggedId, setDraggedId] = useState<string | null>(null)\n const [dropTargetId, setDropTargetId] = useState<string | null>(null)\n const [menu, setMenu] = useState<{\n node: MTreeNode\n items: MTreeViewContextMenuItem[]\n x: number\n y: number\n } | null>(null)\n const menuRef = useRef<HTMLDivElement>(null)\n\n const expandedArr = controlledExpanded ?? internalExpanded\n const expandedIds = new Set(expandedArr)\n const selectedId = controlledSelected !== undefined ? controlledSelected : internalSelected\n const checkedArr = controlledChecked ?? internalChecked\n const checkedIds = new Set(checkedArr)\n const indeterminateIds = checkable ? computeIndeterminate(items, checkedIds) : new Set<string>()\n const {nodeMap, descendants, parentMap} = buildTreeLookup(items)\n const draggedNode = draggedId ? (nodeMap.get(draggedId) ?? null) : null\n\n useEffect(() => {\n if (!menu) return\n\n function closeMenu(event?: Event) {\n if (event && menuRef.current && menuRef.current.contains(event.target as Node)) {\n return\n }\n\n setMenu(null)\n }\n\n function handleKey(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n setMenu(null)\n }\n }\n\n document.addEventListener('mousedown', closeMenu)\n document.addEventListener('scroll', closeMenu, true)\n window.addEventListener('resize', closeMenu)\n document.addEventListener('keydown', handleKey)\n\n return () => {\n document.removeEventListener('mousedown', closeMenu)\n document.removeEventListener('scroll', closeMenu, true)\n window.removeEventListener('resize', closeMenu)\n document.removeEventListener('keydown', handleKey)\n }\n }, [menu])\n\n function handleToggle(id: string) {\n const next = expandedIds.has(id) ? expandedArr.filter((e) => e !== id) : [...expandedArr, id]\n if (onExpandChange) onExpandChange(next)\n else setInternalExpanded(next)\n }\n\n function handleSelect(id: string, node: MTreeNode) {\n if (onSelect) onSelect(id, node)\n else setInternalSelected(id)\n }\n\n function handleCheck(id: string) {\n const node = nodeMap.get(id)\n if (!node || node.disabled) return\n\n const next = new Set(checkedIds)\n const isCurrentlyChecked = next.has(id)\n const subtree = [id, ...Array.from(descendants.get(id) ?? [])]\n\n if (isCurrentlyChecked) {\n for (const sid of subtree) next.delete(sid)\n } else {\n for (const sid of subtree) {\n const sNode = nodeMap.get(sid)\n if (sNode && !sNode.disabled) next.add(sid)\n }\n }\n\n let parentId = parentMap.get(id)\n\n while (parentId) {\n const parent = nodeMap.get(parentId)\n if (!parent) break\n\n const allChildrenChecked = (parent.children ?? []).every((child) => child.disabled || next.has(child.id))\n const hasEnabledChild = (parent.children ?? []).some((child) => !child.disabled)\n\n if (allChildrenChecked && hasEnabledChild) next.add(parentId)\n else next.delete(parentId)\n\n parentId = parentMap.get(parentId)\n }\n\n const nextArr = Array.from(next)\n\n if (controlledChecked === undefined) setInternalChecked(nextArr)\n onCheckedChange?.(nextArr)\n }\n\n function closeDrag() {\n setDraggedId(null)\n setDropTargetId(null)\n }\n\n function isValidDropTarget(targetNode: MTreeNode) {\n if (!draggedNode || !draggable || !onMove) return false\n if (targetNode.disabled || !isFolderNode(targetNode)) return false\n if (targetNode.id === draggedNode.id) return false\n if (descendants.get(draggedNode.id)?.has(targetNode.id)) return false\n\n return canDrop ? canDrop(draggedNode, targetNode) : true\n }\n\n function handleContextMenu(event: MouseEvent<HTMLDivElement>, node: MTreeNode) {\n if (!contextMenuItems || node.disabled) return\n\n const items = contextMenuItems(node).filter(Boolean)\n if (!items.length) return\n\n event.preventDefault()\n handleSelect(node.id, node)\n\n const pos = clampMenuPosition(event.clientX, event.clientY)\n setMenu({\n node,\n items,\n x: pos.x,\n y: pos.y,\n })\n }\n\n function handleDragStart(event: DragEvent<HTMLDivElement>, node: MTreeNode) {\n if (!draggable || node.disabled) return\n\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', node.id)\n setMenu(null)\n setDraggedId(node.id)\n }\n\n function handleDragOver(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n if (!isValidDropTarget(targetNode)) return\n\n event.preventDefault()\n event.dataTransfer.dropEffect = 'move'\n setDropTargetId(targetNode.id)\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n event.preventDefault()\n\n if (!draggedNode || !isValidDropTarget(targetNode)) {\n closeDrag()\n return\n }\n\n onMove?.({\n draggedId: draggedNode.id,\n draggedNode,\n targetId: targetNode.id,\n targetNode,\n } satisfies MTreeViewMoveEvent)\n\n if (expandable && !expandedIds.has(targetNode.id)) {\n handleToggle(targetNode.id)\n }\n\n closeDrag()\n }\n\n return (\n <div className={cn('tree', `color-${color}`, showLines && 'lines', className)} {...rest}>\n <ul className=\"list\" role=\"tree\">\n {items.map((item) => (\n <TreeItem\n key={item.id}\n node={item}\n color={color}\n level={0}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={handleToggle}\n onSelect={handleSelect}\n checkable={checkable}\n checkedIds={checkedIds}\n indeterminateIds={indeterminateIds}\n onCheck={handleCheck}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={isValidDropTarget}\n onContextMenu={handleContextMenu}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onDragEnd={closeDrag}\n />\n ))}\n </ul>\n {menu && (\n <MPortal>\n <div ref={menuRef} className=\"tree menu\" style={{top: menu.y, left: menu.x}} role=\"menu\">\n {menu.items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className={cn('action', item.color, item.disabled && 'disabled')}\n role=\"menuitem\"\n disabled={item.disabled}\n onClick={() => {\n if (item.disabled) return\n onContextMenuAction?.(item.id, menu.node)\n setMenu(null)\n }}\n >\n {item.icon && <span className=\"icon\">{item.icon}</span>}\n <span>{item.label}</span>\n </button>\n ))}\n </div>\n </MPortal>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MTreeView-B1J7uqd1.js","names":[],"sources":["../src/components/data/MTreeView/MTreeView.tsx"],"sourcesContent":["import {useEffect, useRef, useState} from 'react'\nimport type {CSSProperties, DragEvent, MouseEvent, ReactNode} from 'react'\nimport type {\n MTreeViewProps,\n MTreeItemProps,\n MTreeNode,\n MTreeViewContextMenuItem,\n MTreeViewMoveEvent,\n} from './MTreeView.types'\nimport {cn} from '../../../utils/cn'\nimport {MCheckbox} from '../../controls'\nimport {MPortal} from '../../primitives'\nimport {\n MChevronRightIcon,\n MFileCodeIcon,\n MFileCsvIcon,\n MFileCssIcon,\n MFileExeIcon,\n MFileGifIcon,\n MFileHtmlIcon,\n MFileIcon,\n MFileImageIcon,\n MFileJpgIcon,\n MFileJsIcon,\n MFileJsonIcon,\n MFileMdIcon,\n MFileMp3Icon,\n MFileMp4Icon,\n MFileOdtIcon,\n MFilePdfIcon,\n MFilePhpIcon,\n MFilePngIcon,\n MFilePptIcon,\n MFileRarIcon,\n MFileSvgIcon,\n MFileTextIcon,\n MFileTsIcon,\n MFileTsxIcon,\n MFileTxtIcon,\n MFileWebpIcon,\n MFileXlsIcon,\n MFileXmlIcon,\n MFileZipIcon,\n MFolderIcon,\n MFolderOpenIcon,\n} from '../../../icons'\nimport './MTreeView.css'\nconst fileTypeMap: Record<string, ReactNode> = {\n pdf: <MFilePdfIcon />,\n ts: <MFileTsIcon />,\n tsx: <MFileTsxIcon />,\n js: <MFileJsIcon />,\n jsx: <MFileCodeIcon />,\n css: <MFileCssIcon />,\n scss: <MFileCssIcon />,\n html: <MFileHtmlIcon />,\n json: <MFileJsonIcon />,\n md: <MFileMdIcon />,\n txt: <MFileTxtIcon />,\n csv: <MFileCsvIcon />,\n zip: <MFileZipIcon />,\n rar: <MFileRarIcon />,\n svg: <MFileSvgIcon />,\n png: <MFilePngIcon />,\n jpg: <MFileJpgIcon />,\n jpeg: <MFileImageIcon />,\n gif: <MFileGifIcon />,\n webp: <MFileWebpIcon />,\n php: <MFilePhpIcon />,\n xml: <MFileXmlIcon />,\n xls: <MFileXlsIcon />,\n ppt: <MFilePptIcon />,\n odt: <MFileOdtIcon />,\n exe: <MFileExeIcon />,\n mp3: <MFileMp3Icon />,\n mp4: <MFileMp4Icon />,\n}\n\n// Read the file extension once so icon logic stays predictable.\nfunction getFileExtension(label: string): string | null {\n const dot = label.lastIndexOf('.')\n if (dot < 1) return null\n return label.slice(dot + 1).toLowerCase()\n}\n\n// Treat explicit folders and nodes with children as directory-like.\nfunction isFolderNode(node: MTreeNode) {\n return node.kind === 'folder' || Boolean(node.children?.length)\n}\n\n// Resolve the proper file icon by extension.\nfunction getFileIcon(label: string): ReactNode {\n const ext = getFileExtension(label)\n if (!ext) return <MFileIcon />\n\n return fileTypeMap[ext] ?? <MFileTextIcon />\n}\n\n// Prefer custom icons first, then fall back to folder or file visuals.\nfunction getDefaultIcon(node: MTreeNode, isExpanded: boolean, fileIcons: boolean) {\n if (node.icon) return node.icon\n if (!fileIcons) return null\n\n if (isFolderNode(node)) return isExpanded ? <MFolderOpenIcon /> : <MFolderIcon />\n\n return getFileIcon(node.label)\n}\n\n// Cache nodes and descendants so drag-drop validation stays fast.\nfunction buildTreeLookup(items: MTreeNode[]) {\n const nodeMap = new Map<string, MTreeNode>()\n const descendants = new Map<string, Set<string>>()\n const parentMap = new Map<string, string>()\n\n function walk(node: MTreeNode) {\n nodeMap.set(node.id, node)\n\n const childIds = new Set<string>()\n\n for (const child of node.children ?? []) {\n parentMap.set(child.id, node.id)\n childIds.add(child.id)\n\n const nestedIds = walk(child)\n nestedIds.forEach((id) => childIds.add(id))\n }\n\n descendants.set(node.id, childIds)\n return childIds\n }\n\n items.forEach(walk)\n\n return {nodeMap, descendants, parentMap}\n}\n\n// Compute indeterminate ids: a node where some but not all leaf descendants are checked.\nfunction computeIndeterminate(items: MTreeNode[], checked: Set<string>): Set<string> {\n const indeterminate = new Set<string>()\n\n function walk(node: MTreeNode): {checked: number; total: number} {\n if (!node.children?.length) {\n return checked.has(node.id) ? {checked: 1, total: 1} : {checked: 0, total: 1}\n }\n\n let c = 0\n let t = 0\n\n for (const child of node.children) {\n const r = walk(child)\n c += r.checked\n t += r.total\n }\n\n if (c > 0 && c < t) indeterminate.add(node.id)\n return {checked: c, total: t}\n }\n\n items.forEach(walk)\n return indeterminate\n}\n\n// Keep the context menu inside the viewport.\nfunction clampMenuPosition(x: number, y: number) {\n if (typeof window === 'undefined') {\n return {x, y}\n }\n\n return {\n x: Math.max(8, Math.min(x, window.innerWidth - 220)),\n y: Math.max(8, Math.min(y, window.innerHeight - 16)),\n }\n}\n\n// Render one visible row and recurse into children when expanded.\nfunction TreeItem({\n node,\n color,\n level,\n expandable,\n selectable,\n expandedIds,\n selectedId,\n draggedId,\n dropTargetId,\n onToggle,\n onSelect,\n checkable,\n checkedIds,\n indeterminateIds,\n onCheck,\n indent,\n showLines,\n fileIcons,\n draggable,\n canDropOnNode,\n onContextMenu,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n}: MTreeItemProps) {\n const hasChildren = isFolderNode(node)\n const isExpanded = expandedIds.has(node.id)\n const isSelected = selectedId === node.id\n const isDragging = draggedId === node.id\n const isDropTarget = dropTargetId === node.id\n const canDrop = canDropOnNode?.(node)\n const icon = getDefaultIcon(node, isExpanded, !!fileIcons)\n const isChecked = checkedIds?.has(node.id) ?? false\n const isIndeterminate = indeterminateIds?.has(node.id) ?? false\n\n return (\n <li role=\"treeitem\" aria-expanded={hasChildren ? isExpanded : undefined}>\n <div\n className={cn(\n 'item',\n isSelected && 'selected',\n node.disabled && 'disabled',\n selectable && !node.disabled && 'selectable',\n draggable && !node.disabled && 'draggable',\n isDragging && 'dragging',\n canDrop && 'can-drop',\n isDropTarget && 'drop-target'\n )}\n data-color={color}\n style={{paddingLeft: level * indent}}\n draggable={draggable && !node.disabled}\n onClick={() => {\n if (node.disabled) return\n if (hasChildren && expandable) onToggle(node.id)\n if (selectable) onSelect?.(node.id, node)\n }}\n onContextMenu={(event) => onContextMenu?.(event, node)}\n onDragStart={(event) => onDragStart?.(event, node)}\n onDragOver={(event) => onDragOver?.(event, node)}\n onDrop={(event) => onDrop?.(event, node)}\n onDragEnd={onDragEnd}\n >\n <span className=\"toggle\">\n {hasChildren && expandable ? (\n <span className={cn('arrow', isExpanded && 'expanded')}>\n <MChevronRightIcon />\n </span>\n ) : (\n <span className=\"spacer\" />\n )}\n </span>\n {checkable && (\n <span className=\"check\" onClick={(event) => event.stopPropagation()}>\n <MCheckbox\n size=\"sm\"\n clickEffect=\"none\"\n disabled={node.disabled}\n checked={isChecked}\n indeterminate={isIndeterminate}\n onChange={() => onCheck?.(node.id)}\n />\n </span>\n )}\n {icon && <span className=\"icon\">{icon}</span>}\n <span className=\"label\">{node.label}</span>\n </div>\n {hasChildren && isExpanded && (\n <ul\n className=\"list\"\n role=\"group\"\n style={showLines ? ({'--line-left': `${level * indent + 17}px`} as CSSProperties) : undefined}\n >\n {(node.children ?? []).map((child) => (\n <TreeItem\n key={child.id}\n node={child}\n color={color}\n level={level + 1}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={onToggle}\n onSelect={onSelect}\n checkable={checkable}\n checkedIds={checkedIds}\n indeterminateIds={indeterminateIds}\n onCheck={onCheck}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={canDropOnNode}\n onContextMenu={onContextMenu}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onDragEnd={onDragEnd}\n />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\n// Render a file tree with selection, context actions and folder moves.\nexport function MTreeView({\n items,\n color = 'primary',\n expandable = true,\n selectable = false,\n defaultExpanded = [],\n expanded: controlledExpanded,\n onExpandChange,\n selected: controlledSelected,\n onSelect,\n checkable = false,\n defaultChecked = [],\n checked: controlledChecked,\n onCheckedChange,\n indent = 20,\n showLines = true,\n fileIcons = true,\n draggable = false,\n canDrop,\n onMove,\n contextMenuItems,\n onContextMenuAction,\n className,\n ...rest\n}: MTreeViewProps) {\n const [internalExpanded, setInternalExpanded] = useState<string[]>(defaultExpanded)\n const [internalSelected, setInternalSelected] = useState<string | null>(null)\n const [internalChecked, setInternalChecked] = useState<string[]>(defaultChecked)\n const [draggedId, setDraggedId] = useState<string | null>(null)\n const [dropTargetId, setDropTargetId] = useState<string | null>(null)\n const [menu, setMenu] = useState<{\n node: MTreeNode\n items: MTreeViewContextMenuItem[]\n x: number\n y: number\n } | null>(null)\n const menuRef = useRef<HTMLDivElement>(null)\n\n const expandedArr = controlledExpanded ?? internalExpanded\n const expandedIds = new Set(expandedArr)\n const selectedId = controlledSelected !== undefined ? controlledSelected : internalSelected\n const checkedArr = controlledChecked ?? internalChecked\n const checkedIds = new Set(checkedArr)\n const indeterminateIds = checkable ? computeIndeterminate(items, checkedIds) : new Set<string>()\n const {nodeMap, descendants, parentMap} = buildTreeLookup(items)\n const draggedNode = draggedId ? (nodeMap.get(draggedId) ?? null) : null\n\n useEffect(() => {\n if (!menu) return\n\n function closeMenu(event?: Event) {\n if (event && menuRef.current && menuRef.current.contains(event.target as Node)) {\n return\n }\n\n setMenu(null)\n }\n\n function handleKey(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n setMenu(null)\n }\n }\n\n document.addEventListener('mousedown', closeMenu)\n document.addEventListener('scroll', closeMenu, true)\n window.addEventListener('resize', closeMenu)\n document.addEventListener('keydown', handleKey)\n\n return () => {\n document.removeEventListener('mousedown', closeMenu)\n document.removeEventListener('scroll', closeMenu, true)\n window.removeEventListener('resize', closeMenu)\n document.removeEventListener('keydown', handleKey)\n }\n }, [menu])\n\n function handleToggle(id: string) {\n const next = expandedIds.has(id) ? expandedArr.filter((e) => e !== id) : [...expandedArr, id]\n if (onExpandChange) onExpandChange(next)\n else setInternalExpanded(next)\n }\n\n function handleSelect(id: string, node: MTreeNode) {\n if (onSelect) onSelect(id, node)\n else setInternalSelected(id)\n }\n\n function handleCheck(id: string) {\n const node = nodeMap.get(id)\n if (!node || node.disabled) return\n\n const next = new Set(checkedIds)\n const isCurrentlyChecked = next.has(id)\n const subtree = [id, ...Array.from(descendants.get(id) ?? [])]\n\n if (isCurrentlyChecked) {\n for (const sid of subtree) next.delete(sid)\n } else {\n for (const sid of subtree) {\n const sNode = nodeMap.get(sid)\n if (sNode && !sNode.disabled) next.add(sid)\n }\n }\n\n let parentId = parentMap.get(id)\n\n while (parentId) {\n const parent = nodeMap.get(parentId)\n if (!parent) break\n\n const allChildrenChecked = (parent.children ?? []).every((child) => child.disabled || next.has(child.id))\n const hasEnabledChild = (parent.children ?? []).some((child) => !child.disabled)\n\n if (allChildrenChecked && hasEnabledChild) next.add(parentId)\n else next.delete(parentId)\n\n parentId = parentMap.get(parentId)\n }\n\n const nextArr = Array.from(next)\n\n if (controlledChecked === undefined) setInternalChecked(nextArr)\n onCheckedChange?.(nextArr)\n }\n\n function closeDrag() {\n setDraggedId(null)\n setDropTargetId(null)\n }\n\n function isValidDropTarget(targetNode: MTreeNode) {\n if (!draggedNode || !draggable || !onMove) return false\n if (targetNode.disabled || !isFolderNode(targetNode)) return false\n if (targetNode.id === draggedNode.id) return false\n if (descendants.get(draggedNode.id)?.has(targetNode.id)) return false\n\n return canDrop ? canDrop(draggedNode, targetNode) : true\n }\n\n function handleContextMenu(event: MouseEvent<HTMLDivElement>, node: MTreeNode) {\n if (!contextMenuItems || node.disabled) return\n\n const items = contextMenuItems(node).filter(Boolean)\n if (!items.length) return\n\n event.preventDefault()\n handleSelect(node.id, node)\n\n const pos = clampMenuPosition(event.clientX, event.clientY)\n setMenu({\n node,\n items,\n x: pos.x,\n y: pos.y,\n })\n }\n\n function handleDragStart(event: DragEvent<HTMLDivElement>, node: MTreeNode) {\n if (!draggable || node.disabled) return\n\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', node.id)\n setMenu(null)\n setDraggedId(node.id)\n }\n\n function handleDragOver(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n if (!isValidDropTarget(targetNode)) return\n\n event.preventDefault()\n event.dataTransfer.dropEffect = 'move'\n setDropTargetId(targetNode.id)\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n event.preventDefault()\n\n if (!draggedNode || !isValidDropTarget(targetNode)) {\n closeDrag()\n return\n }\n\n onMove?.({\n draggedId: draggedNode.id,\n draggedNode,\n targetId: targetNode.id,\n targetNode,\n } satisfies MTreeViewMoveEvent)\n\n if (expandable && !expandedIds.has(targetNode.id)) {\n handleToggle(targetNode.id)\n }\n\n closeDrag()\n }\n\n return (\n <div className={cn('tree', `color-${color}`, showLines && 'lines', className)} {...rest}>\n <ul className=\"list\" role=\"tree\">\n {items.map((item) => (\n <TreeItem\n key={item.id}\n node={item}\n color={color}\n level={0}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={handleToggle}\n onSelect={handleSelect}\n checkable={checkable}\n checkedIds={checkedIds}\n indeterminateIds={indeterminateIds}\n onCheck={handleCheck}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={isValidDropTarget}\n onContextMenu={handleContextMenu}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onDragEnd={closeDrag}\n />\n ))}\n </ul>\n {menu && (\n <MPortal>\n <div ref={menuRef} className=\"tree menu\" style={{top: menu.y, left: menu.x}} role=\"menu\">\n {menu.items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className={cn('action', item.color, item.disabled && 'disabled')}\n role=\"menuitem\"\n disabled={item.disabled}\n onClick={() => {\n if (item.disabled) return\n onContextMenuAction?.(item.id, menu.node)\n setMenu(null)\n }}\n >\n {item.icon && <span className=\"icon\">{item.icon}</span>}\n <span>{item.label}</span>\n </button>\n ))}\n </div>\n </MPortal>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`./icons-
|
|
2
|
-
//# sourceMappingURL=MTreeView-
|
|
1
|
+
const e=require(`./icons-D675Im0B.cjs`),t=require(`./cn-CU5TNITO.cjs`),n=require(`./MPortal-BciZHNDC.cjs`),r=require(`./MCheckbox-CM5HJQWW.cjs`);require(`./core-DBpQf3uY.cjs`);let i=require(`react`),a=require(`react/jsx-runtime`);var o={pdf:(0,a.jsx)(e.pi,{}),ts:(0,a.jsx)(e.ni,{}),tsx:(0,a.jsx)(e.ri,{}),js:(0,a.jsx)(e.Wr,{}),jsx:(0,a.jsx)(e.di,{}),css:(0,a.jsx)(e.Lr,{}),scss:(0,a.jsx)(e.Lr,{}),html:(0,a.jsx)(e.Hr,{}),json:(0,a.jsx)(e.Gr,{}),md:(0,a.jsx)(e.qr,{}),txt:(0,a.jsx)(e.ii,{}),csv:(0,a.jsx)(e.Rr,{}),zip:(0,a.jsx)(e.ci,{}),rar:(0,a.jsx)(e.ei,{}),svg:(0,a.jsx)(e.ti,{}),png:(0,a.jsx)(e.Qr,{}),jpg:(0,a.jsx)(e.Ur,{}),jpeg:(0,a.jsx)(e.fi,{}),gif:(0,a.jsx)(e.Vr,{}),webp:(0,a.jsx)(e.ai,{}),php:(0,a.jsx)(e.Zr,{}),xml:(0,a.jsx)(e.si,{}),xls:(0,a.jsx)(e.oi,{}),ppt:(0,a.jsx)(e.$r,{}),odt:(0,a.jsx)(e.Xr,{}),exe:(0,a.jsx)(e.Br,{}),mp3:(0,a.jsx)(e.Jr,{}),mp4:(0,a.jsx)(e.Yr,{})};function s(e){let t=e.lastIndexOf(`.`);return t<1?null:e.slice(t+1).toLowerCase()}function c(e){return e.kind===`folder`||!!e.children?.length}function l(t){let n=s(t);return n?o[n]??(0,a.jsx)(e.mi,{}):(0,a.jsx)(e._i,{})}function ee(t,n,r){return t.icon?t.icon:r?c(t)?n?(0,a.jsx)(e.Fr,{}):(0,a.jsx)(e.Ir,{}):l(t.label):null}function u(e){let t=new Map,n=new Map,r=new Map;function i(e){t.set(e.id,e);let a=new Set;for(let t of e.children??[])r.set(t.id,e.id),a.add(t.id),i(t).forEach(e=>a.add(e));return n.set(e.id,a),a}return e.forEach(i),{nodeMap:t,descendants:n,parentMap:r}}function d(e,t){let n=new Set;function r(e){if(!e.children?.length)return t.has(e.id)?{checked:1,total:1}:{checked:0,total:1};let i=0,a=0;for(let t of e.children){let e=r(t);i+=e.checked,a+=e.total}return i>0&&i<a&&n.add(e.id),{checked:i,total:a}}return e.forEach(r),n}function f(e,t){return typeof window>`u`?{x:e,y:t}:{x:Math.max(8,Math.min(e,window.innerWidth-220)),y:Math.max(8,Math.min(t,window.innerHeight-16))}}function p({node:n,color:i,level:o,expandable:s,selectable:l,expandedIds:u,selectedId:d,draggedId:f,dropTargetId:m,onToggle:h,onSelect:g,checkable:_,checkedIds:v,indeterminateIds:y,onCheck:b,indent:x,showLines:S,fileIcons:C,draggable:w,canDropOnNode:T,onContextMenu:E,onDragStart:D,onDragOver:O,onDrop:k,onDragEnd:A}){let j=c(n),M=u.has(n.id),N=d===n.id,P=f===n.id,te=m===n.id,F=T?.(n),I=ee(n,M,!!C),L=v?.has(n.id)??!1,R=y?.has(n.id)??!1;return(0,a.jsxs)(`li`,{role:`treeitem`,"aria-expanded":j?M:void 0,children:[(0,a.jsxs)(`div`,{className:t.t(`item`,N&&`selected`,n.disabled&&`disabled`,l&&!n.disabled&&`selectable`,w&&!n.disabled&&`draggable`,P&&`dragging`,F&&`can-drop`,te&&`drop-target`),"data-color":i,style:{paddingLeft:o*x},draggable:w&&!n.disabled,onClick:()=>{n.disabled||(j&&s&&h(n.id),l&&g?.(n.id,n))},onContextMenu:e=>E?.(e,n),onDragStart:e=>D?.(e,n),onDragOver:e=>O?.(e,n),onDrop:e=>k?.(e,n),onDragEnd:A,children:[(0,a.jsx)(`span`,{className:`toggle`,children:j&&s?(0,a.jsx)(`span`,{className:t.t(`arrow`,M&&`expanded`),children:(0,a.jsx)(e.qi,{})}):(0,a.jsx)(`span`,{className:`spacer`})}),_&&(0,a.jsx)(`span`,{className:`check`,onClick:e=>e.stopPropagation(),children:(0,a.jsx)(r.t,{size:`sm`,clickEffect:`none`,disabled:n.disabled,checked:L,indeterminate:R,onChange:()=>b?.(n.id)})}),I&&(0,a.jsx)(`span`,{className:`icon`,children:I}),(0,a.jsx)(`span`,{className:`label`,children:n.label})]}),j&&M&&(0,a.jsx)(`ul`,{className:`list`,role:`group`,style:S?{"--line-left":`${o*x+17}px`}:void 0,children:(n.children??[]).map(e=>(0,a.jsx)(p,{node:e,color:i,level:o+1,expandable:s,selectable:l,expandedIds:u,selectedId:d,draggedId:f,dropTargetId:m,onToggle:h,onSelect:g,checkable:_,checkedIds:v,indeterminateIds:y,onCheck:b,indent:x,showLines:S,fileIcons:C,draggable:w,canDropOnNode:T,onContextMenu:E,onDragStart:D,onDragOver:O,onDrop:k,onDragEnd:A},e.id))})]})}function m({items:e,color:r=`primary`,expandable:o=!0,selectable:s=!1,defaultExpanded:l=[],expanded:ee,onExpandChange:m,selected:h,onSelect:g,checkable:_=!1,defaultChecked:v=[],checked:y,onCheckedChange:b,indent:x=20,showLines:S=!0,fileIcons:C=!0,draggable:w=!1,canDrop:T,onMove:E,contextMenuItems:D,onContextMenuAction:O,className:k,...A}){let[j,M]=(0,i.useState)(l),[N,P]=(0,i.useState)(null),[te,F]=(0,i.useState)(v),[I,L]=(0,i.useState)(null),[R,z]=(0,i.useState)(null),[B,V]=(0,i.useState)(null),H=(0,i.useRef)(null),U=ee??j,W=new Set(U),ne=h===void 0?N:h,G=new Set(y??te),re=_?d(e,G):new Set,{nodeMap:K,descendants:q,parentMap:J}=u(e),Y=I?K.get(I)??null:null;(0,i.useEffect)(()=>{if(!B)return;function e(e){e&&H.current&&H.current.contains(e.target)||V(null)}function t(e){e.key===`Escape`&&V(null)}return document.addEventListener(`mousedown`,e),document.addEventListener(`scroll`,e,!0),window.addEventListener(`resize`,e),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`mousedown`,e),document.removeEventListener(`scroll`,e,!0),window.removeEventListener(`resize`,e),document.removeEventListener(`keydown`,t)}},[B]);function X(e){let t=W.has(e)?U.filter(t=>t!==e):[...U,e];m?m(t):M(t)}function Z(e,t){g?g(e,t):P(e)}function ie(e){let t=K.get(e);if(!t||t.disabled)return;let n=new Set(G),r=n.has(e),i=[e,...Array.from(q.get(e)??[])];if(r)for(let e of i)n.delete(e);else for(let e of i){let t=K.get(e);t&&!t.disabled&&n.add(e)}let a=J.get(e);for(;a;){let e=K.get(a);if(!e)break;let t=(e.children??[]).every(e=>e.disabled||n.has(e.id)),r=(e.children??[]).some(e=>!e.disabled);t&&r?n.add(a):n.delete(a),a=J.get(a)}let o=Array.from(n);y===void 0&&F(o),b?.(o)}function Q(){L(null),z(null)}function $(e){return!Y||!w||!E||e.disabled||!c(e)||e.id===Y.id||q.get(Y.id)?.has(e.id)?!1:T?T(Y,e):!0}function ae(e,t){if(!D||t.disabled)return;let n=D(t).filter(Boolean);if(!n.length)return;e.preventDefault(),Z(t.id,t);let r=f(e.clientX,e.clientY);V({node:t,items:n,x:r.x,y:r.y})}function oe(e,t){!w||t.disabled||(e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,t.id),V(null),L(t.id))}function se(e,t){$(t)&&(e.preventDefault(),e.dataTransfer.dropEffect=`move`,z(t.id))}function ce(e,t){if(e.preventDefault(),!Y||!$(t)){Q();return}E?.({draggedId:Y.id,draggedNode:Y,targetId:t.id,targetNode:t}),o&&!W.has(t.id)&&X(t.id),Q()}return(0,a.jsxs)(`div`,{className:t.t(`tree`,`color-${r}`,S&&`lines`,k),...A,children:[(0,a.jsx)(`ul`,{className:`list`,role:`tree`,children:e.map(e=>(0,a.jsx)(p,{node:e,color:r,level:0,expandable:o,selectable:s,expandedIds:W,selectedId:ne,draggedId:I,dropTargetId:R,onToggle:X,onSelect:Z,checkable:_,checkedIds:G,indeterminateIds:re,onCheck:ie,indent:x,showLines:S,fileIcons:C,draggable:w,canDropOnNode:$,onContextMenu:ae,onDragStart:oe,onDragOver:se,onDrop:ce,onDragEnd:Q},e.id))}),B&&(0,a.jsx)(n.t,{children:(0,a.jsx)(`div`,{ref:H,className:`tree menu`,style:{top:B.y,left:B.x},role:`menu`,children:B.items.map(e=>(0,a.jsxs)(`button`,{type:`button`,className:t.t(`action`,e.color,e.disabled&&`disabled`),role:`menuitem`,disabled:e.disabled,onClick:()=>{e.disabled||(O?.(e.id,B.node),V(null))},children:[e.icon&&(0,a.jsx)(`span`,{className:`icon`,children:e.icon}),(0,a.jsx)(`span`,{children:e.label})]},e.id))})})]})}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return m}});
|
|
2
|
+
//# sourceMappingURL=MTreeView-DuQkm0ZV.cjs.map
|