@banzamel/mineralui 2.1.3 → 2.1.4

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.
Files changed (55) hide show
  1. package/README.md +1 -1
  2. package/dist/{MDropdownMenu-C2lftqSx.cjs → MDropdownMenu-BvN5grK5.cjs} +2 -2
  3. package/dist/{MDropdownMenu-C2lftqSx.cjs.map → MDropdownMenu-BvN5grK5.cjs.map} +1 -1
  4. package/dist/{MDropdownMenu-BeD_DxPr.js → MDropdownMenu-CFoKJ7V6.js} +2 -2
  5. package/dist/{MDropdownMenu-BeD_DxPr.js.map → MDropdownMenu-CFoKJ7V6.js.map} +1 -1
  6. package/dist/{MInputCVC-DvUOzpYp.js → MInputCVC-B4V0QI5h.js} +2 -2
  7. package/dist/{MInputCVC-DvUOzpYp.js.map → MInputCVC-B4V0QI5h.js.map} +1 -1
  8. package/dist/{MInputCVC-_2ALihF1.cjs → MInputCVC-BlY5OrVn.cjs} +2 -2
  9. package/dist/{MInputCVC-_2ALihF1.cjs.map → MInputCVC-BlY5OrVn.cjs.map} +1 -1
  10. package/dist/MPopover-C5aaGhma.js +150 -0
  11. package/dist/MPopover-C5aaGhma.js.map +1 -0
  12. package/dist/MPopover-CV-9MArH.cjs +2 -0
  13. package/dist/MPopover-CV-9MArH.cjs.map +1 -0
  14. package/dist/{cards-fRWZkts9.cjs → cards-CQSYgH9U.cjs} +2 -2
  15. package/dist/{cards-fRWZkts9.cjs.map → cards-CQSYgH9U.cjs.map} +1 -1
  16. package/dist/{cards-DYmK8TpL.js → cards-Cpr9B8Mu.js} +4 -4
  17. package/dist/{cards-DYmK8TpL.js.map → cards-Cpr9B8Mu.js.map} +1 -1
  18. package/dist/cards.cjs +1 -1
  19. package/dist/cards.js +1 -1
  20. package/dist/components/primitives/MPopover/popoverStack.d.ts +32 -0
  21. package/dist/{data-CuynADWM.cjs → data-BZ92hzXx.cjs} +2 -2
  22. package/dist/{data-CuynADWM.cjs.map → data-BZ92hzXx.cjs.map} +1 -1
  23. package/dist/{data-D8WFA3Et.js → data-C-6DP7iY.js} +2 -2
  24. package/dist/{data-D8WFA3Et.js.map → data-C-6DP7iY.js.map} +1 -1
  25. package/dist/data.cjs +1 -1
  26. package/dist/data.js +1 -1
  27. package/dist/{dropdowns-5cJf-6UG.js → dropdowns-DiThUF7D.js} +2 -2
  28. package/dist/{dropdowns-5cJf-6UG.js.map → dropdowns-DiThUF7D.js.map} +1 -1
  29. package/dist/{dropdowns-C-ASvu7P.cjs → dropdowns-bQ0cEKNN.cjs} +2 -2
  30. package/dist/{dropdowns-C-ASvu7P.cjs.map → dropdowns-bQ0cEKNN.cjs.map} +1 -1
  31. package/dist/dropdowns.cjs +1 -1
  32. package/dist/dropdowns.js +1 -1
  33. package/dist/index.cjs +1 -1
  34. package/dist/index.js +8 -8
  35. package/dist/inputs.cjs +1 -1
  36. package/dist/inputs.js +1 -1
  37. package/dist/{layout-i8H5tIbO.js → layout-CdSpVJuK.js} +2 -2
  38. package/dist/{layout-i8H5tIbO.js.map → layout-CdSpVJuK.js.map} +1 -1
  39. package/dist/{layout-CfolwT8L.cjs → layout-Ddo7HUPu.cjs} +2 -2
  40. package/dist/{layout-CfolwT8L.cjs.map → layout-Ddo7HUPu.cjs.map} +1 -1
  41. package/dist/layout.cjs +1 -1
  42. package/dist/layout.js +1 -1
  43. package/dist/{overlays-zPzbHW5P.cjs → overlays-BUZEaZaJ.cjs} +2 -2
  44. package/dist/{overlays-zPzbHW5P.cjs.map → overlays-BUZEaZaJ.cjs.map} +1 -1
  45. package/dist/{overlays-CAcGmqNv.js → overlays-C1vO_A2I.js} +2 -2
  46. package/dist/{overlays-CAcGmqNv.js.map → overlays-C1vO_A2I.js.map} +1 -1
  47. package/dist/overlays.cjs +1 -1
  48. package/dist/overlays.js +2 -2
  49. package/dist/primitives.cjs +1 -1
  50. package/dist/primitives.js +1 -1
  51. package/package.json +1 -1
  52. package/dist/MPopover-Cweomcj2.cjs +0 -2
  53. package/dist/MPopover-Cweomcj2.cjs.map +0 -1
  54. package/dist/MPopover-DT3vclV1.js +0 -98
  55. package/dist/MPopover-DT3vclV1.js.map +0 -1
@@ -1,2 +1,2 @@
1
- const e=require(`./theme-BfNZicWk.cjs`),t=require(`./icons-D675Im0B.cjs`),n=require(`./cn-CU5TNITO.cjs`),r=require(`./layoutProps-B8y2XwHy.cjs`),i=require(`./MSurface-CYeVFOw_.cjs`),a=require(`./MLink-Biipj7xz.cjs`),o=require(`./MButton-R08y1HCT.cjs`),s=require(`./MButtonGroup-C-LiXWRC.cjs`),c=require(`./MSimpleGrid-BwNfaxQP.cjs`),l=require(`./MTooltip-BEfO9jTe.cjs`),u=require(`./MDropdownMenu-C2lftqSx.cjs`);require(`./core-DBpQf3uY.cjs`);let d=require(`react`),f=require(`react/jsx-runtime`);function p({size:t=`content`,padded:i=!0,hidden:a,spacing:o,padding:s,fsize:c,mt:l,mb:u,ml:d,mr:p,mx:m,my:h,pt:g,pb:_,pl:v,pr:y,px:b,py:x,fullWidth:S,className:C,style:w,children:T,...E}){let D=r.n({fsize:c});return(0,f.jsx)(`div`,{className:n.t(`container`,t,i&&`padded`,...r.t({spacing:o,padding:s,fsize:c,mt:l,mb:u,ml:d,mr:p,mx:m,my:h,pt:g,pb:_,pl:v,pr:y,px:b,py:x,fullWidth:S}),C),style:{...D,...w},...e.r(a),...E,children:T})}function m({container:t=`wide`,padded:r=!0,bordered:i=!0,sticky:a=!1,tone:o=`surface`,layout:s=`split`,hidden:c,className:l,children:u,...d}){return(0,f.jsx)(`header`,{className:n.t(`header`,o,i&&`bordered`,a&&`sticky`,l),...e.r(c),...d,children:(0,f.jsx)(p,{size:t,padded:r,className:n.t(`inner`,`layout-${s}`),children:u})})}function h({container:t=`wide`,padded:i=!0,bordered:a=!0,tone:o=`surface`,hidden:s,spacing:c,padding:l,fsize:u,mt:d,mb:m,ml:h,mr:g,mx:_,my:v,pt:y,pb:b,pl:x,pr:S,px:C,py:w,fullWidth:T,className:E,style:D,children:O,...k}){let A=r.n({fsize:u});return(0,f.jsx)(`footer`,{className:n.t(`footer`,o,a&&`bordered`,...r.t({spacing:c,padding:l,fsize:u,mt:d,mb:m,ml:h,mr:g,mx:_,my:v,pt:y,pb:b,pl:x,pr:S,px:C,py:w,fullWidth:T}),E),style:{...A,...D},...e.r(s),...k,children:(0,f.jsx)(p,{size:t,padded:i,className:`inner`,fullWidth:!0,children:O})})}function g({items:e,orientation:t=`horizontal`,wrap:r=!1,className:i,children:o,...s}){return(0,f.jsx)(`div`,{className:n.t(`navs`,t,r&&`wrap`,i),...s,children:e?e.map(e=>{let t=e.icon,r=e.iconOnly===!0&&t!=null,i=typeof e.label==`string`?e.label:void 0,o=r?i:void 0,s=e.title??(r?i:void 0);return(0,f.jsxs)(a.t,{component:e.component,href:e.href,to:e.to,target:e.target,rel:e.rel,title:s,current:e.current,disabled:e.disabled,className:n.t(`link`,r&&`icon-only`,e.className),"aria-label":o,children:[t?(0,f.jsx)(`span`,{className:`icon`,"aria-hidden":!r||void 0,children:(0,f.jsx)(t,{size:e.iconSize})}):null,r?null:e.label]},e.key??e.href??e.title?.toString()??i??``)}):o})}function _(e,t=[]){return d.Children.forEach(e,e=>{if(!(0,d.isValidElement)(e))return;if(e.type===g){t.push(e);return}let n=e.props?.children;n!==void 0&&_(n,t)}),t}function v({container:r=`content`,padded:a=!0,bordered:s=!0,sticky:c=!1,tone:l=`surface`,justify:u=`between`,wrap:m=!1,mobileMenu:h=`dropdown`,mobileMenuContent:g,mobileMenuFooter:v,collapseActions:y=!1,mobileMenuLabel:b=`Open navigation`,mobileBreakpoint:x=e.n.compact,hidden:S,className:C,children:w,...T}){let[E,D]=(0,d.useState)(!1),O=(0,d.useRef)(null),k=(0,d.useId)(),A=e.i(x),j=d.Children.toArray(w),M=_(w).map((e,t)=>(0,d.cloneElement)(e,{key:`mnavbar-mobile-navs-${t}`,orientation:`vertical`})),N=(0,f.jsx)(o.t,{type:`button`,variant:`ghost`,size:`md`,shape:`circle`,iconOnly:!0,className:`navbar-toggle`,"aria-label":b,"aria-expanded":E,"aria-controls":k,onClick:B,children:(0,f.jsx)(t.Zn,{})},`mnavbar-toggle`),P=-1;for(let e=j.length-1;e>=0;--e){let t=j[e];if((0,d.isValidElement)(t)&&t.type===i.n){P=e;break}}let F=y&&A&&P!==-1,I=null,L=j,R=P;if(F){I=j[P],L=j.filter((e,t)=>t!==P),R=-1;for(let e=L.length-1;e>=0;--e){let t=L[e];if((0,d.isValidElement)(t)&&t.type===i.n){R=e;break}}}let z=R===-1?[...L,N]:L.map((e,t)=>{if(t!==R)return e;let n=e,r=d.Children.toArray(n.props.children);return(0,d.cloneElement)(n,{key:n.key??`mnavbar-inline-${t}`,children:[...r,N]})});(0,d.useEffect)(()=>{if(!E)return;function e(e){let t=O.current;t&&(e.target instanceof Node&&t.contains(e.target)||D(!1))}function t(e){e.key===`Escape`&&D(!1)}return document.addEventListener(`pointerdown`,e),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`pointerdown`,e),document.removeEventListener(`keydown`,t)}},[E]),(0,d.useEffect)(()=>{A||D(!1)},[A]);function B(){D(e=>!e)}function V(e){let t=e.target;t&&t.closest(`a, [role="menuitem"]`)&&D(!1)}return(0,f.jsxs)(`nav`,{ref:O,className:n.t(`navbar`,l,s&&`bordered`,c&&`sticky`,A&&`mobile-view`,E&&`mobile-open`,`mobile-${h}`,C),...e.r(S),...T,children:[(0,f.jsx)(p,{size:r,padded:a,className:`container`,children:(0,f.jsx)(`div`,{className:n.t(`inner`,u,m&&`wrap`),children:z})}),h===`drawer`&&(0,f.jsx)(`div`,{className:n.t(`mobile-backdrop`,E&&`visible`),"aria-hidden":!0}),(0,f.jsxs)(`div`,{id:k,className:n.t(`mobile-menu`,h,E&&`open`),role:`menu`,"aria-hidden":!E||void 0,onClick:V,children:[M,g,I?(0,f.jsx)(`div`,{className:`mobile-menu-footer`,children:(0,d.cloneElement)(I,{key:`mnavbar-collapsed-actions`})}):null,v?(0,f.jsx)(`div`,{className:`mobile-menu-footer`,children:v}):null]})]})}function y({as:t=`section`,spacing:r=`lg`,tone:i=`default`,hidden:a,className:o,style:s,children:c,...l}){return(0,f.jsx)(t,{className:n.t(`section`,r,i,o),style:s,...e.r(a),...l,children:c})}function b({items:e,renderItem:t,children:n,columns:r=4,minItemWidth:i=`15rem`,...a}){return(0,f.jsx)(c.t,{columns:r,minItemWidth:i,...a,children:e&&t?e.map((e,n)=>t(e,n)):n})}function x({orientation:t=`horizontal`,variant:i=`solid`,hidden:a,spacing:o,padding:s,fsize:c,mt:l,mb:u,ml:d,mr:p,mx:m,my:h,pt:g,pb:_,pl:v,pr:y,px:b,py:x,fullWidth:S,className:C,style:w,...T}){let E=r.n({fsize:c});return(0,f.jsx)(`div`,{role:`separator`,"aria-orientation":t,className:n.t(`divider`,t,i,...r.t({spacing:o,padding:s,fsize:c,mt:l,mb:u,ml:d,mr:p,mx:m,my:h,pt:g,pb:_,pl:v,pr:y,px:b,py:x,fullWidth:S}),C),style:{...E,...w},...e.r(a),...T})}var S=`mineralui-sidebar`,C=(0,d.createContext)({mode:`expanded`,mobile:!1,mobileOpen:!1,canToggle:!1,toggleMode:()=>{}});function w(){return(0,d.useContext)(C)}function T({mode:r=`auto`,defaultMode:i=`expanded`,onModeChange:a,persist:o=!1,side:s=`left`,tone:c=`subtle`,bordered:l=!0,mobileBreakpoint:u=e.n.mobile,compactBreakpoint:p=e.n.compact,className:m,style:h,children:g}){let _=Math.max(p,u),v=e.i(u),y=e.i(_),b=!v&&y,[x,w]=(0,d.useState)(!1),[T,E]=(0,d.useState)(()=>{if(o)try{let e=localStorage.getItem(S);if(e===`expanded`||e===`collapsed`)return e}catch{}return i}),D=v?`expanded`:b?`collapsed`:r===`auto`?T:r===`collapsed`?`collapsed`:`expanded`,O=(0,d.useCallback)(()=>{let e=D===`expanded`?`collapsed`:`expanded`;if(E(e),a?.(e),o)try{localStorage.setItem(S,e)}catch{}},[D,a,o]),k=(0,d.useCallback)(()=>w(!1),[]);(0,d.useEffect)(()=>{if(!x)return;let e=e=>{e.key===`Escape`&&w(!1)};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[x]),(0,d.useEffect)(()=>{v||w(!1)},[v]);let A=!v&&!b&&r===`auto`,j=(0,d.useMemo)(()=>({mode:D,mobile:v,mobileOpen:x,canToggle:A,toggleMode:O}),[D,v,x,A,O]),M=n.t(`sidebar`,c,s,!v&&D===`collapsed`&&`collapsed`,b&&`compact`,l&&`bordered`,v&&`mobile`,v&&x&&`mobile-open`,m);return(0,f.jsxs)(C.Provider,{value:j,children:[v&&x&&(0,f.jsx)(`div`,{className:`sidebar-backdrop`,onClick:k}),(0,f.jsx)(`aside`,{className:M,style:h,children:g}),v&&!x&&(0,f.jsx)(`button`,{className:n.t(`sidebar-hamburger`,s),onClick:()=>w(!0),"aria-label":`Open menu`,children:(0,f.jsx)(`span`,{className:`sidebar-hamburger-icon`,"aria-hidden":`true`,children:(0,f.jsx)(t.Zn,{})})})]})}function E({bordered:e=!1,className:r,children:i}){let{mode:a,mobile:s,canToggle:c,toggleMode:l}=w(),u=!s&&a===`collapsed`;return(0,f.jsxs)(`div`,{className:n.t(`sidebar-header`,e&&`bordered`,r),children:[(0,f.jsx)(`div`,{className:`sidebar-header-content`,children:i}),c&&(0,f.jsx)(o.t,{variant:`outlined`,color:`neutral`,iconOnly:!0,size:`sm`,onClick:l,"aria-label":u?`Expand sidebar`:`Collapse sidebar`,className:`sidebar-toggle`,children:(0,f.jsx)(`span`,{className:n.t(`sidebar-chevron`,u&&`flipped`),children:(0,f.jsx)(t.qi,{})})})]})}function D({className:e,children:t}){return(0,f.jsx)(`div`,{className:n.t(`sidebar-body`,e),children:t})}function O({className:e,children:t}){return(0,f.jsx)(`nav`,{className:n.t(`sidebar-nav`,e),children:t})}function k({icon:e,label:t,description:r,href:i,to:a,onClick:o,active:s=!1,disabled:c=!1,badge:u,color:d,component:p,className:m}){let{mode:h,mobile:g}=w(),_=!g&&h===`collapsed`,v=r??t,y=typeof r==`string`?r:typeof t==`string`?t:void 0,b=p??(i||a?`a`:`button`),x=p?a?{to:a}:i?{href:i}:{}:i?{href:i}:a?{href:a}:{};return(0,f.jsxs)(b,{className:n.t(`sidebar-item`,s&&`active`,c&&`disabled`,d,m),onClick:c?void 0:o,"aria-disabled":c||void 0,title:_?y:void 0,...x,children:[e&&(0,f.jsx)(`span`,{className:`sidebar-item-icon`,children:e}),!_&&(0,f.jsx)(l.t,{content:v,placement:`top`,className:`sidebar-item-label-tooltip`,children:(0,f.jsx)(`span`,{className:`sidebar-item-label`,children:t})}),!_&&u&&(0,f.jsx)(`span`,{className:`sidebar-item-badge`,children:u})]})}function A({label:e,icon:r,active:i=!1,defaultOpen:a=!0,collapsible:o=!0,children:s,className:c}){let l=w(),{mode:p,mobile:m}=l,h=!m&&p===`collapsed`,[g,_]=(0,d.useState)(a),v=(0,d.useMemo)(()=>({...l,mode:`expanded`}),[l]),y=()=>{o&&_(e=>!e)};if(h){let t=(0,f.jsx)(`span`,{className:n.t(`sidebar-group-icon collapsed`,i&&`active`),title:e,children:r});return(0,f.jsx)(`div`,{className:n.t(`sidebar-group`,c),children:(0,f.jsx)(u.i,{trigger:t,placement:`right-start`,closeOnSelect:!0,openOn:`hover`,children:(0,f.jsx)(C.Provider,{value:v,children:s})})})}return(0,f.jsxs)(`div`,{className:n.t(`sidebar-group`,c),children:[(0,f.jsxs)(`button`,{className:n.t(`sidebar-group-header`,i&&`active`),onClick:y,"aria-expanded":g,children:[r&&(0,f.jsx)(`span`,{className:`sidebar-group-icon`,children:r}),(0,f.jsx)(`span`,{className:`sidebar-group-label`,children:e}),o&&(0,f.jsx)(`span`,{className:n.t(`sidebar-group-arrow`,g&&`open`),children:(0,f.jsx)(t.qi,{})})]}),g&&(0,f.jsx)(`div`,{className:`sidebar-group-items`,children:s})]})}function j({bordered:e=!1,className:t,children:r}){return(0,f.jsx)(`div`,{className:n.t(`sidebar-footer`,e&&`bordered`,t),children:r})}function M({className:e,spacing:t=`md`}){return(0,f.jsx)(`hr`,{className:n.t(`sidebar-divider`,t,e)})}function N({items:e,separator:t=`/`,maxItems:r,className:i,...a}){let o=(0,d.useMemo)(()=>{if(!r||r>=e.length)return e;if(r<2)return[e[e.length-1]];let t=e.slice(0,1),n=e.slice(-(r-1));return[...t,null,...n]},[e,r]);return(0,f.jsx)(`nav`,{"aria-label":`breadcrumb`,className:n.t(`breadcrumb`,i),...a,children:(0,f.jsx)(`ol`,{className:`trail`,children:o.map((e,r)=>{if(e===null)return(0,f.jsxs)(`li`,{className:`crumb dots`,children:[(0,f.jsx)(`span`,{className:`sep`,children:t}),(0,f.jsx)(`span`,{children:`…`})]},`ellipsis`);let i=r===o.length-1;return(0,f.jsxs)(`li`,{className:n.t(`crumb`,i&&`active`),children:[r>0&&(0,f.jsx)(`span`,{className:`sep`,children:t}),e.href&&!i?(0,f.jsx)(`a`,{href:e.href,className:`link`,onClick:e.onClick,children:e.label}):e.onClick&&!i?(0,f.jsx)(`button`,{type:`button`,className:`link btn`,onClick:e.onClick,children:e.label}):(0,f.jsx)(`span`,{className:`current`,"aria-current":i?`page`:void 0,children:e.label})]},r)})})})}var P=(0,d.forwardRef)(function({className:e,children:t,...r},i){let a=[],o=[];return d.Children.forEach(t,e=>{(0,d.isValidElement)(e)&&e.type===T?a.push(e):o.push(e)}),(0,f.jsxs)(`div`,{ref:i,className:n.t(`app-shell`,e),...r,children:[a,(0,f.jsx)(`div`,{className:`app-main`,children:o})]})}),F=(0,d.forwardRef)(function({className:e,children:t,...r},i){return(0,f.jsx)(`div`,{ref:i,className:n.t(`app-body`,e),...r,children:t})});function I({baseWidth:e=480,children:t}){let n=(0,d.useRef)(null),r=(0,d.useRef)(null),[i,a]=(0,d.useState)(1),[o,s]=(0,d.useState)(e);return(0,d.useEffect)(()=>{let t=n.current,i=r.current;if(!t||!i)return;let o=0,c=()=>{cancelAnimationFrame(o),o=requestAnimationFrame(()=>{let n=t.clientWidth,r=t.clientHeight;if(n===0||r===0)return;let o=Math.max(e,n),c=i.offsetHeight;if(o===0||c===0)return;let l=n/o,u=r/c,d=Math.min(l,u,1);d>0&&Number.isFinite(d)&&(s(o),a(d))})},l=new ResizeObserver(c);return l.observe(t),l.observe(i),c(),()=>{cancelAnimationFrame(o),l.disconnect()}},[e]),(0,f.jsx)(`div`,{ref:n,className:`canvas-grid-scale-wrapper`,children:(0,f.jsx)(`div`,{ref:r,className:`canvas-grid-scale-content`,style:{width:`${o}px`,transform:`scale(${i})`},children:t})})}function L(e,t,n){return Math.max(t,Math.min(n,e))}function R({columns:r=24,rows:i=24,snap:a=4,items:c,renderItem:l,minItemSize:u,maxItemSize:p,editable:m=!1,onItemMove:h,onItemResize:g,onItemRemove:_,onItemEdit:v,onItemExpand:y,guides:b=`always`,compactBreakpoint:x=e.n.compact,mobileBreakpoint:S=e.n.mobile,height:C,fitContent:w=`scroll`,fitContentBaseWidth:T=480,className:E,style:D},O){let k=(0,d.useRef)(null),[A,j]=(0,d.useState)({width:0,height:0}),[M,N]=(0,d.useState)(null),[P,F]=(0,d.useState)(null),[R,z]=(0,d.useState)({}),B=(0,d.useRef)(0);function V(e){B.current+=1,z(t=>({...t,[e]:B.current}))}function H(){let e=!0,t=n=>{e&&(e=!1,n.stopPropagation(),n.preventDefault(),window.removeEventListener(`click`,t,!0))};window.addEventListener(`click`,t,!0),window.setTimeout(()=>{e&&(e=!1,window.removeEventListener(`click`,t,!0))},60)}let U=e.i(S),W=e.i(x)&&!U,G=r*a,K=i*a,q=W?Math.max(1,Math.round(G/2)):G,J=W?Math.max(1,Math.round(K/2)):K,Y=W?Math.max(1,Math.round(r/2)):r,X=W?Math.max(1,Math.round(i/2)):i,Z=m&&!U;(0,d.useEffect)(()=>{let e=k.current;if(!e||typeof ResizeObserver>`u`)return;let t=()=>j({width:e.clientWidth,height:e.clientHeight});t();let n=new ResizeObserver(t);return n.observe(e),()=>n.disconnect()},[]);let Q=(0,d.useCallback)(e=>{k.current=e,typeof O==`function`?O(e):O&&(O.current=e)},[O]);function ee(e){let t=u?.(e);return t?{w:Math.max(a,t.w*a),h:Math.max(a,t.h*a)}:{w:a,h:a}}function te(e,t){Z&&(e.stopPropagation(),e.preventDefault(),e.currentTarget.setPointerCapture(e.pointerId),V(t.id),N({itemId:t.id,mode:`resize`,startClientX:e.clientX,startClientY:e.clientY,original:{...t.position}}),F({...t.position}))}function ne(e,t){Z&&(e.target.closest(`button, [role="button"]`)||(e.stopPropagation(),e.preventDefault(),e.currentTarget.setPointerCapture(e.pointerId),V(t.id),N({itemId:t.id,mode:`drag`,startClientX:e.clientX,startClientY:e.clientY,original:{...t.position}}),F({...t.position})))}function re(e){if(!M||A.width===0||A.height===0)return;let t=A.width/q,n=A.height/J,r=Math.round((e.clientX-M.startClientX)/t),i=Math.round((e.clientY-M.startClientY)/n),o=M.original,s=c.find(e=>e.id===M.itemId),l=s?ee(s):{w:a,h:a};if(M.mode===`drag`)F({x:L(o.x+r,0,q-o.w),y:L(o.y+i,0,J-o.h),w:o.w,h:o.h});else{let e=L(o.w+r,l.w,q-o.x),t=L(o.h+i,l.h,J-o.y);F({x:o.x,y:o.y,w:e,h:t})}}function $(e){if(M){try{e.currentTarget.releasePointerCapture(e.pointerId)}catch{}P&&(M.mode===`drag`?h?.(M.itemId,P):g?.(M.itemId,P)),N(null),F(null)}}function ie(e){M&&(H(),$(e))}let ae=b===`always`||b===`on-edit`&&Z||b===`on-drag`&&M!==null,oe=C===void 0?void 0:{height:typeof C==`number`?`${C}px`:C};if(U){let e=[...c].sort((e,t)=>e.position.y-t.position.y);return(0,f.jsx)(`div`,{ref:Q,className:n.t(`canvas-grid`,`mobile`,E),"data-guides":`off`,style:{...oe,...D},children:e.map(e=>(0,f.jsx)(`div`,{className:`canvas-grid-item`,children:l(e)},e.id))})}let se={...oe,...D,gridTemplateColumns:`repeat(${q}, 1fr)`,gridTemplateRows:`repeat(${J}, 1fr)`,"--canvas-grid-cells":String(Y),"--canvas-grid-row-cells":String(X)},ce=Y*X;return(0,f.jsxs)(`div`,{ref:Q,className:n.t(`canvas-grid`,W&&`compact`,Z&&`editable`,E),"data-guides":ae?`on`:`off`,style:se,children:[(0,f.jsx)(`div`,{className:`canvas-grid-overlay`,"aria-hidden":!0,children:Array.from({length:ce},(e,t)=>{let r=(t+1)%Y===0,i=t>=ce-Y;return(0,f.jsx)(`div`,{className:n.t(`canvas-grid-cell`,r&&`no-right`,i&&`no-bottom`)},t)})}),c.map(e=>{let r=M?.itemId===e.id,i=r&&P?P:e.position,a=W?Math.round(i.x/2):i.x,c=W?Math.round(i.y/2):i.y,u=Math.max(1,W?Math.round(i.w/2):i.w),d=Math.max(1,W?Math.round(i.h/2):i.h),p=1+(R[e.id]??0),m={gridColumn:`${a+1} / span ${u}`,gridRow:`${c+1} / span ${d}`,zIndex:r?p+100:p};return(0,f.jsxs)(`div`,{className:n.t(`canvas-grid-item`,r&&`dragging`),style:m,children:[(0,f.jsx)(`div`,{className:`canvas-grid-item-header`,onPointerDown:t=>ne(t,e),onPointerMove:re,onPointerUp:ie,onPointerCancel:$,children:(0,f.jsxs)(s.t,{variant:`ghost`,size:`xs`,children:[Z&&v&&(0,f.jsx)(o.t,{color:`primary`,iconOnly:!0,"aria-label":`Edit tile`,startIcon:(0,f.jsx)(t.Gn,{}),onPointerDown:e=>e.stopPropagation(),onClick:t=>{t.stopPropagation(),v(e.id)}}),y&&(0,f.jsx)(o.t,{color:`primary`,iconOnly:!0,"aria-label":`Expand tile`,startIcon:(0,f.jsx)(t.$n,{}),onPointerDown:e=>e.stopPropagation(),onClick:t=>{t.stopPropagation(),y(e.id)}}),Z&&_&&(0,f.jsx)(o.t,{color:`error`,iconOnly:!0,"aria-label":`Remove tile`,startIcon:(0,f.jsx)(t.er,{}),onPointerDown:e=>e.stopPropagation(),onClick:t=>{t.stopPropagation(),_(e.id)}})]})}),(0,f.jsx)(`div`,{className:`canvas-grid-item-body`,children:w===`scale`?(0,f.jsx)(I,{baseWidth:T,children:l(e)}):l(e)}),!Z&&y&&(0,f.jsx)(o.t,{className:`canvas-grid-view-expand-handle`,variant:`filled`,shape:`circle`,size:`sm`,color:`primary`,iconOnly:!0,"aria-label":`Expand tile`,startIcon:(0,f.jsx)(t.$n,{}),onClick:t=>{t.stopPropagation(),y(e.id)}}),Z&&r&&(0,f.jsx)(`div`,{className:`canvas-grid-item-glass`,"aria-hidden":!0,children:(0,f.jsx)(t.Sr,{size:28})}),Z&&(0,f.jsx)(`div`,{className:`canvas-grid-resize-handle`,"aria-hidden":!0,onPointerDown:t=>te(t,e),onPointerMove:re,onPointerUp:e=>{M&&H(),$(e)},onPointerCancel:$})]},e.id)})]})}var z=(0,d.forwardRef)(R),B=`button, a, [role="button"]`,V=(0,d.forwardRef)(function({children:e,top:t=16,bottomGap:r=16,hideScrollbar:i=!0,draggable:a=!0,className:o,style:s,...c},l){let u=(0,d.useRef)(null);(0,d.useImperativeHandle)(l,()=>u.current);let p=(0,d.useRef)(null),[m,h]=(0,d.useState)(!1);(0,d.useEffect)(()=>{if(!a)return;let e=e=>{let t=p.current,n=u.current;!t||!n||(n.scrollTop=t.startScrollTop-(e.clientY-t.startY))},t=()=>{p.current&&(p.current=null,h(!1))};return window.addEventListener(`mousemove`,e),window.addEventListener(`mouseup`,t),()=>{window.removeEventListener(`mousemove`,e),window.removeEventListener(`mouseup`,t)}},[a]);let g=e=>{if(!a)return;let t=e.target;if(t&&t.closest(B))return;let n=u.current;n&&(p.current={startY:e.clientY,startScrollTop:n.scrollTop},h(!0),e.preventDefault())},_={top:t,height:`calc(100vh - ${t+r}px)`,...s};return(0,f.jsx)(`div`,{ref:u,className:n.t(`m-sticky-panel`,a&&`draggable`,m&&`is-dragging`,i&&`hide-scrollbar`,o),style:_,onMouseDown:g,...c,children:e})});Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return h}});
2
- //# sourceMappingURL=layout-CfolwT8L.cjs.map
1
+ const e=require(`./theme-BfNZicWk.cjs`),t=require(`./icons-D675Im0B.cjs`),n=require(`./cn-CU5TNITO.cjs`),r=require(`./layoutProps-B8y2XwHy.cjs`),i=require(`./MSurface-CYeVFOw_.cjs`),a=require(`./MLink-Biipj7xz.cjs`),o=require(`./MButton-R08y1HCT.cjs`),s=require(`./MButtonGroup-C-LiXWRC.cjs`),c=require(`./MSimpleGrid-BwNfaxQP.cjs`),l=require(`./MTooltip-BEfO9jTe.cjs`),u=require(`./MDropdownMenu-BvN5grK5.cjs`);require(`./core-DBpQf3uY.cjs`);let d=require(`react`),f=require(`react/jsx-runtime`);function p({size:t=`content`,padded:i=!0,hidden:a,spacing:o,padding:s,fsize:c,mt:l,mb:u,ml:d,mr:p,mx:m,my:h,pt:g,pb:_,pl:v,pr:y,px:b,py:x,fullWidth:S,className:C,style:w,children:T,...E}){let D=r.n({fsize:c});return(0,f.jsx)(`div`,{className:n.t(`container`,t,i&&`padded`,...r.t({spacing:o,padding:s,fsize:c,mt:l,mb:u,ml:d,mr:p,mx:m,my:h,pt:g,pb:_,pl:v,pr:y,px:b,py:x,fullWidth:S}),C),style:{...D,...w},...e.r(a),...E,children:T})}function m({container:t=`wide`,padded:r=!0,bordered:i=!0,sticky:a=!1,tone:o=`surface`,layout:s=`split`,hidden:c,className:l,children:u,...d}){return(0,f.jsx)(`header`,{className:n.t(`header`,o,i&&`bordered`,a&&`sticky`,l),...e.r(c),...d,children:(0,f.jsx)(p,{size:t,padded:r,className:n.t(`inner`,`layout-${s}`),children:u})})}function h({container:t=`wide`,padded:i=!0,bordered:a=!0,tone:o=`surface`,hidden:s,spacing:c,padding:l,fsize:u,mt:d,mb:m,ml:h,mr:g,mx:_,my:v,pt:y,pb:b,pl:x,pr:S,px:C,py:w,fullWidth:T,className:E,style:D,children:O,...k}){let A=r.n({fsize:u});return(0,f.jsx)(`footer`,{className:n.t(`footer`,o,a&&`bordered`,...r.t({spacing:c,padding:l,fsize:u,mt:d,mb:m,ml:h,mr:g,mx:_,my:v,pt:y,pb:b,pl:x,pr:S,px:C,py:w,fullWidth:T}),E),style:{...A,...D},...e.r(s),...k,children:(0,f.jsx)(p,{size:t,padded:i,className:`inner`,fullWidth:!0,children:O})})}function g({items:e,orientation:t=`horizontal`,wrap:r=!1,className:i,children:o,...s}){return(0,f.jsx)(`div`,{className:n.t(`navs`,t,r&&`wrap`,i),...s,children:e?e.map(e=>{let t=e.icon,r=e.iconOnly===!0&&t!=null,i=typeof e.label==`string`?e.label:void 0,o=r?i:void 0,s=e.title??(r?i:void 0);return(0,f.jsxs)(a.t,{component:e.component,href:e.href,to:e.to,target:e.target,rel:e.rel,title:s,current:e.current,disabled:e.disabled,className:n.t(`link`,r&&`icon-only`,e.className),"aria-label":o,children:[t?(0,f.jsx)(`span`,{className:`icon`,"aria-hidden":!r||void 0,children:(0,f.jsx)(t,{size:e.iconSize})}):null,r?null:e.label]},e.key??e.href??e.title?.toString()??i??``)}):o})}function _(e,t=[]){return d.Children.forEach(e,e=>{if(!(0,d.isValidElement)(e))return;if(e.type===g){t.push(e);return}let n=e.props?.children;n!==void 0&&_(n,t)}),t}function v({container:r=`content`,padded:a=!0,bordered:s=!0,sticky:c=!1,tone:l=`surface`,justify:u=`between`,wrap:m=!1,mobileMenu:h=`dropdown`,mobileMenuContent:g,mobileMenuFooter:v,collapseActions:y=!1,mobileMenuLabel:b=`Open navigation`,mobileBreakpoint:x=e.n.compact,hidden:S,className:C,children:w,...T}){let[E,D]=(0,d.useState)(!1),O=(0,d.useRef)(null),k=(0,d.useId)(),A=e.i(x),j=d.Children.toArray(w),M=_(w).map((e,t)=>(0,d.cloneElement)(e,{key:`mnavbar-mobile-navs-${t}`,orientation:`vertical`})),N=(0,f.jsx)(o.t,{type:`button`,variant:`ghost`,size:`md`,shape:`circle`,iconOnly:!0,className:`navbar-toggle`,"aria-label":b,"aria-expanded":E,"aria-controls":k,onClick:B,children:(0,f.jsx)(t.Zn,{})},`mnavbar-toggle`),P=-1;for(let e=j.length-1;e>=0;--e){let t=j[e];if((0,d.isValidElement)(t)&&t.type===i.n){P=e;break}}let F=y&&A&&P!==-1,I=null,L=j,R=P;if(F){I=j[P],L=j.filter((e,t)=>t!==P),R=-1;for(let e=L.length-1;e>=0;--e){let t=L[e];if((0,d.isValidElement)(t)&&t.type===i.n){R=e;break}}}let z=R===-1?[...L,N]:L.map((e,t)=>{if(t!==R)return e;let n=e,r=d.Children.toArray(n.props.children);return(0,d.cloneElement)(n,{key:n.key??`mnavbar-inline-${t}`,children:[...r,N]})});(0,d.useEffect)(()=>{if(!E)return;function e(e){let t=O.current;t&&(e.target instanceof Node&&t.contains(e.target)||D(!1))}function t(e){e.key===`Escape`&&D(!1)}return document.addEventListener(`pointerdown`,e),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`pointerdown`,e),document.removeEventListener(`keydown`,t)}},[E]),(0,d.useEffect)(()=>{A||D(!1)},[A]);function B(){D(e=>!e)}function V(e){let t=e.target;t&&t.closest(`a, [role="menuitem"]`)&&D(!1)}return(0,f.jsxs)(`nav`,{ref:O,className:n.t(`navbar`,l,s&&`bordered`,c&&`sticky`,A&&`mobile-view`,E&&`mobile-open`,`mobile-${h}`,C),...e.r(S),...T,children:[(0,f.jsx)(p,{size:r,padded:a,className:`container`,children:(0,f.jsx)(`div`,{className:n.t(`inner`,u,m&&`wrap`),children:z})}),h===`drawer`&&(0,f.jsx)(`div`,{className:n.t(`mobile-backdrop`,E&&`visible`),"aria-hidden":!0}),(0,f.jsxs)(`div`,{id:k,className:n.t(`mobile-menu`,h,E&&`open`),role:`menu`,"aria-hidden":!E||void 0,onClick:V,children:[M,g,I?(0,f.jsx)(`div`,{className:`mobile-menu-footer`,children:(0,d.cloneElement)(I,{key:`mnavbar-collapsed-actions`})}):null,v?(0,f.jsx)(`div`,{className:`mobile-menu-footer`,children:v}):null]})]})}function y({as:t=`section`,spacing:r=`lg`,tone:i=`default`,hidden:a,className:o,style:s,children:c,...l}){return(0,f.jsx)(t,{className:n.t(`section`,r,i,o),style:s,...e.r(a),...l,children:c})}function b({items:e,renderItem:t,children:n,columns:r=4,minItemWidth:i=`15rem`,...a}){return(0,f.jsx)(c.t,{columns:r,minItemWidth:i,...a,children:e&&t?e.map((e,n)=>t(e,n)):n})}function x({orientation:t=`horizontal`,variant:i=`solid`,hidden:a,spacing:o,padding:s,fsize:c,mt:l,mb:u,ml:d,mr:p,mx:m,my:h,pt:g,pb:_,pl:v,pr:y,px:b,py:x,fullWidth:S,className:C,style:w,...T}){let E=r.n({fsize:c});return(0,f.jsx)(`div`,{role:`separator`,"aria-orientation":t,className:n.t(`divider`,t,i,...r.t({spacing:o,padding:s,fsize:c,mt:l,mb:u,ml:d,mr:p,mx:m,my:h,pt:g,pb:_,pl:v,pr:y,px:b,py:x,fullWidth:S}),C),style:{...E,...w},...e.r(a),...T})}var S=`mineralui-sidebar`,C=(0,d.createContext)({mode:`expanded`,mobile:!1,mobileOpen:!1,canToggle:!1,toggleMode:()=>{}});function w(){return(0,d.useContext)(C)}function T({mode:r=`auto`,defaultMode:i=`expanded`,onModeChange:a,persist:o=!1,side:s=`left`,tone:c=`subtle`,bordered:l=!0,mobileBreakpoint:u=e.n.mobile,compactBreakpoint:p=e.n.compact,className:m,style:h,children:g}){let _=Math.max(p,u),v=e.i(u),y=e.i(_),b=!v&&y,[x,w]=(0,d.useState)(!1),[T,E]=(0,d.useState)(()=>{if(o)try{let e=localStorage.getItem(S);if(e===`expanded`||e===`collapsed`)return e}catch{}return i}),D=v?`expanded`:b?`collapsed`:r===`auto`?T:r===`collapsed`?`collapsed`:`expanded`,O=(0,d.useCallback)(()=>{let e=D===`expanded`?`collapsed`:`expanded`;if(E(e),a?.(e),o)try{localStorage.setItem(S,e)}catch{}},[D,a,o]),k=(0,d.useCallback)(()=>w(!1),[]);(0,d.useEffect)(()=>{if(!x)return;let e=e=>{e.key===`Escape`&&w(!1)};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[x]),(0,d.useEffect)(()=>{v||w(!1)},[v]);let A=!v&&!b&&r===`auto`,j=(0,d.useMemo)(()=>({mode:D,mobile:v,mobileOpen:x,canToggle:A,toggleMode:O}),[D,v,x,A,O]),M=n.t(`sidebar`,c,s,!v&&D===`collapsed`&&`collapsed`,b&&`compact`,l&&`bordered`,v&&`mobile`,v&&x&&`mobile-open`,m);return(0,f.jsxs)(C.Provider,{value:j,children:[v&&x&&(0,f.jsx)(`div`,{className:`sidebar-backdrop`,onClick:k}),(0,f.jsx)(`aside`,{className:M,style:h,children:g}),v&&!x&&(0,f.jsx)(`button`,{className:n.t(`sidebar-hamburger`,s),onClick:()=>w(!0),"aria-label":`Open menu`,children:(0,f.jsx)(`span`,{className:`sidebar-hamburger-icon`,"aria-hidden":`true`,children:(0,f.jsx)(t.Zn,{})})})]})}function E({bordered:e=!1,className:r,children:i}){let{mode:a,mobile:s,canToggle:c,toggleMode:l}=w(),u=!s&&a===`collapsed`;return(0,f.jsxs)(`div`,{className:n.t(`sidebar-header`,e&&`bordered`,r),children:[(0,f.jsx)(`div`,{className:`sidebar-header-content`,children:i}),c&&(0,f.jsx)(o.t,{variant:`outlined`,color:`neutral`,iconOnly:!0,size:`sm`,onClick:l,"aria-label":u?`Expand sidebar`:`Collapse sidebar`,className:`sidebar-toggle`,children:(0,f.jsx)(`span`,{className:n.t(`sidebar-chevron`,u&&`flipped`),children:(0,f.jsx)(t.qi,{})})})]})}function D({className:e,children:t}){return(0,f.jsx)(`div`,{className:n.t(`sidebar-body`,e),children:t})}function O({className:e,children:t}){return(0,f.jsx)(`nav`,{className:n.t(`sidebar-nav`,e),children:t})}function k({icon:e,label:t,description:r,href:i,to:a,onClick:o,active:s=!1,disabled:c=!1,badge:u,color:d,component:p,className:m}){let{mode:h,mobile:g}=w(),_=!g&&h===`collapsed`,v=r??t,y=typeof r==`string`?r:typeof t==`string`?t:void 0,b=p??(i||a?`a`:`button`),x=p?a?{to:a}:i?{href:i}:{}:i?{href:i}:a?{href:a}:{};return(0,f.jsxs)(b,{className:n.t(`sidebar-item`,s&&`active`,c&&`disabled`,d,m),onClick:c?void 0:o,"aria-disabled":c||void 0,title:_?y:void 0,...x,children:[e&&(0,f.jsx)(`span`,{className:`sidebar-item-icon`,children:e}),!_&&(0,f.jsx)(l.t,{content:v,placement:`top`,className:`sidebar-item-label-tooltip`,children:(0,f.jsx)(`span`,{className:`sidebar-item-label`,children:t})}),!_&&u&&(0,f.jsx)(`span`,{className:`sidebar-item-badge`,children:u})]})}function A({label:e,icon:r,active:i=!1,defaultOpen:a=!0,collapsible:o=!0,children:s,className:c}){let l=w(),{mode:p,mobile:m}=l,h=!m&&p===`collapsed`,[g,_]=(0,d.useState)(a),v=(0,d.useMemo)(()=>({...l,mode:`expanded`}),[l]),y=()=>{o&&_(e=>!e)};if(h){let t=(0,f.jsx)(`span`,{className:n.t(`sidebar-group-icon collapsed`,i&&`active`),title:e,children:r});return(0,f.jsx)(`div`,{className:n.t(`sidebar-group`,c),children:(0,f.jsx)(u.i,{trigger:t,placement:`right-start`,closeOnSelect:!0,openOn:`hover`,children:(0,f.jsx)(C.Provider,{value:v,children:s})})})}return(0,f.jsxs)(`div`,{className:n.t(`sidebar-group`,c),children:[(0,f.jsxs)(`button`,{className:n.t(`sidebar-group-header`,i&&`active`),onClick:y,"aria-expanded":g,children:[r&&(0,f.jsx)(`span`,{className:`sidebar-group-icon`,children:r}),(0,f.jsx)(`span`,{className:`sidebar-group-label`,children:e}),o&&(0,f.jsx)(`span`,{className:n.t(`sidebar-group-arrow`,g&&`open`),children:(0,f.jsx)(t.qi,{})})]}),g&&(0,f.jsx)(`div`,{className:`sidebar-group-items`,children:s})]})}function j({bordered:e=!1,className:t,children:r}){return(0,f.jsx)(`div`,{className:n.t(`sidebar-footer`,e&&`bordered`,t),children:r})}function M({className:e,spacing:t=`md`}){return(0,f.jsx)(`hr`,{className:n.t(`sidebar-divider`,t,e)})}function N({items:e,separator:t=`/`,maxItems:r,className:i,...a}){let o=(0,d.useMemo)(()=>{if(!r||r>=e.length)return e;if(r<2)return[e[e.length-1]];let t=e.slice(0,1),n=e.slice(-(r-1));return[...t,null,...n]},[e,r]);return(0,f.jsx)(`nav`,{"aria-label":`breadcrumb`,className:n.t(`breadcrumb`,i),...a,children:(0,f.jsx)(`ol`,{className:`trail`,children:o.map((e,r)=>{if(e===null)return(0,f.jsxs)(`li`,{className:`crumb dots`,children:[(0,f.jsx)(`span`,{className:`sep`,children:t}),(0,f.jsx)(`span`,{children:`…`})]},`ellipsis`);let i=r===o.length-1;return(0,f.jsxs)(`li`,{className:n.t(`crumb`,i&&`active`),children:[r>0&&(0,f.jsx)(`span`,{className:`sep`,children:t}),e.href&&!i?(0,f.jsx)(`a`,{href:e.href,className:`link`,onClick:e.onClick,children:e.label}):e.onClick&&!i?(0,f.jsx)(`button`,{type:`button`,className:`link btn`,onClick:e.onClick,children:e.label}):(0,f.jsx)(`span`,{className:`current`,"aria-current":i?`page`:void 0,children:e.label})]},r)})})})}var P=(0,d.forwardRef)(function({className:e,children:t,...r},i){let a=[],o=[];return d.Children.forEach(t,e=>{(0,d.isValidElement)(e)&&e.type===T?a.push(e):o.push(e)}),(0,f.jsxs)(`div`,{ref:i,className:n.t(`app-shell`,e),...r,children:[a,(0,f.jsx)(`div`,{className:`app-main`,children:o})]})}),F=(0,d.forwardRef)(function({className:e,children:t,...r},i){return(0,f.jsx)(`div`,{ref:i,className:n.t(`app-body`,e),...r,children:t})});function I({baseWidth:e=480,children:t}){let n=(0,d.useRef)(null),r=(0,d.useRef)(null),[i,a]=(0,d.useState)(1),[o,s]=(0,d.useState)(e);return(0,d.useEffect)(()=>{let t=n.current,i=r.current;if(!t||!i)return;let o=0,c=()=>{cancelAnimationFrame(o),o=requestAnimationFrame(()=>{let n=t.clientWidth,r=t.clientHeight;if(n===0||r===0)return;let o=Math.max(e,n),c=i.offsetHeight;if(o===0||c===0)return;let l=n/o,u=r/c,d=Math.min(l,u,1);d>0&&Number.isFinite(d)&&(s(o),a(d))})},l=new ResizeObserver(c);return l.observe(t),l.observe(i),c(),()=>{cancelAnimationFrame(o),l.disconnect()}},[e]),(0,f.jsx)(`div`,{ref:n,className:`canvas-grid-scale-wrapper`,children:(0,f.jsx)(`div`,{ref:r,className:`canvas-grid-scale-content`,style:{width:`${o}px`,transform:`scale(${i})`},children:t})})}function L(e,t,n){return Math.max(t,Math.min(n,e))}function R({columns:r=24,rows:i=24,snap:a=4,items:c,renderItem:l,minItemSize:u,maxItemSize:p,editable:m=!1,onItemMove:h,onItemResize:g,onItemRemove:_,onItemEdit:v,onItemExpand:y,guides:b=`always`,compactBreakpoint:x=e.n.compact,mobileBreakpoint:S=e.n.mobile,height:C,fitContent:w=`scroll`,fitContentBaseWidth:T=480,className:E,style:D},O){let k=(0,d.useRef)(null),[A,j]=(0,d.useState)({width:0,height:0}),[M,N]=(0,d.useState)(null),[P,F]=(0,d.useState)(null),[R,z]=(0,d.useState)({}),B=(0,d.useRef)(0);function V(e){B.current+=1,z(t=>({...t,[e]:B.current}))}function H(){let e=!0,t=n=>{e&&(e=!1,n.stopPropagation(),n.preventDefault(),window.removeEventListener(`click`,t,!0))};window.addEventListener(`click`,t,!0),window.setTimeout(()=>{e&&(e=!1,window.removeEventListener(`click`,t,!0))},60)}let U=e.i(S),W=e.i(x)&&!U,G=r*a,K=i*a,q=W?Math.max(1,Math.round(G/2)):G,J=W?Math.max(1,Math.round(K/2)):K,Y=W?Math.max(1,Math.round(r/2)):r,X=W?Math.max(1,Math.round(i/2)):i,Z=m&&!U;(0,d.useEffect)(()=>{let e=k.current;if(!e||typeof ResizeObserver>`u`)return;let t=()=>j({width:e.clientWidth,height:e.clientHeight});t();let n=new ResizeObserver(t);return n.observe(e),()=>n.disconnect()},[]);let Q=(0,d.useCallback)(e=>{k.current=e,typeof O==`function`?O(e):O&&(O.current=e)},[O]);function ee(e){let t=u?.(e);return t?{w:Math.max(a,t.w*a),h:Math.max(a,t.h*a)}:{w:a,h:a}}function te(e,t){Z&&(e.stopPropagation(),e.preventDefault(),e.currentTarget.setPointerCapture(e.pointerId),V(t.id),N({itemId:t.id,mode:`resize`,startClientX:e.clientX,startClientY:e.clientY,original:{...t.position}}),F({...t.position}))}function ne(e,t){Z&&(e.target.closest(`button, [role="button"]`)||(e.stopPropagation(),e.preventDefault(),e.currentTarget.setPointerCapture(e.pointerId),V(t.id),N({itemId:t.id,mode:`drag`,startClientX:e.clientX,startClientY:e.clientY,original:{...t.position}}),F({...t.position})))}function re(e){if(!M||A.width===0||A.height===0)return;let t=A.width/q,n=A.height/J,r=Math.round((e.clientX-M.startClientX)/t),i=Math.round((e.clientY-M.startClientY)/n),o=M.original,s=c.find(e=>e.id===M.itemId),l=s?ee(s):{w:a,h:a};if(M.mode===`drag`)F({x:L(o.x+r,0,q-o.w),y:L(o.y+i,0,J-o.h),w:o.w,h:o.h});else{let e=L(o.w+r,l.w,q-o.x),t=L(o.h+i,l.h,J-o.y);F({x:o.x,y:o.y,w:e,h:t})}}function $(e){if(M){try{e.currentTarget.releasePointerCapture(e.pointerId)}catch{}P&&(M.mode===`drag`?h?.(M.itemId,P):g?.(M.itemId,P)),N(null),F(null)}}function ie(e){M&&(H(),$(e))}let ae=b===`always`||b===`on-edit`&&Z||b===`on-drag`&&M!==null,oe=C===void 0?void 0:{height:typeof C==`number`?`${C}px`:C};if(U){let e=[...c].sort((e,t)=>e.position.y-t.position.y);return(0,f.jsx)(`div`,{ref:Q,className:n.t(`canvas-grid`,`mobile`,E),"data-guides":`off`,style:{...oe,...D},children:e.map(e=>(0,f.jsx)(`div`,{className:`canvas-grid-item`,children:l(e)},e.id))})}let se={...oe,...D,gridTemplateColumns:`repeat(${q}, 1fr)`,gridTemplateRows:`repeat(${J}, 1fr)`,"--canvas-grid-cells":String(Y),"--canvas-grid-row-cells":String(X)},ce=Y*X;return(0,f.jsxs)(`div`,{ref:Q,className:n.t(`canvas-grid`,W&&`compact`,Z&&`editable`,E),"data-guides":ae?`on`:`off`,style:se,children:[(0,f.jsx)(`div`,{className:`canvas-grid-overlay`,"aria-hidden":!0,children:Array.from({length:ce},(e,t)=>{let r=(t+1)%Y===0,i=t>=ce-Y;return(0,f.jsx)(`div`,{className:n.t(`canvas-grid-cell`,r&&`no-right`,i&&`no-bottom`)},t)})}),c.map(e=>{let r=M?.itemId===e.id,i=r&&P?P:e.position,a=W?Math.round(i.x/2):i.x,c=W?Math.round(i.y/2):i.y,u=Math.max(1,W?Math.round(i.w/2):i.w),d=Math.max(1,W?Math.round(i.h/2):i.h),p=1+(R[e.id]??0),m={gridColumn:`${a+1} / span ${u}`,gridRow:`${c+1} / span ${d}`,zIndex:r?p+100:p};return(0,f.jsxs)(`div`,{className:n.t(`canvas-grid-item`,r&&`dragging`),style:m,children:[(0,f.jsx)(`div`,{className:`canvas-grid-item-header`,onPointerDown:t=>ne(t,e),onPointerMove:re,onPointerUp:ie,onPointerCancel:$,children:(0,f.jsxs)(s.t,{variant:`ghost`,size:`xs`,children:[Z&&v&&(0,f.jsx)(o.t,{color:`primary`,iconOnly:!0,"aria-label":`Edit tile`,startIcon:(0,f.jsx)(t.Gn,{}),onPointerDown:e=>e.stopPropagation(),onClick:t=>{t.stopPropagation(),v(e.id)}}),y&&(0,f.jsx)(o.t,{color:`primary`,iconOnly:!0,"aria-label":`Expand tile`,startIcon:(0,f.jsx)(t.$n,{}),onPointerDown:e=>e.stopPropagation(),onClick:t=>{t.stopPropagation(),y(e.id)}}),Z&&_&&(0,f.jsx)(o.t,{color:`error`,iconOnly:!0,"aria-label":`Remove tile`,startIcon:(0,f.jsx)(t.er,{}),onPointerDown:e=>e.stopPropagation(),onClick:t=>{t.stopPropagation(),_(e.id)}})]})}),(0,f.jsx)(`div`,{className:`canvas-grid-item-body`,children:w===`scale`?(0,f.jsx)(I,{baseWidth:T,children:l(e)}):l(e)}),!Z&&y&&(0,f.jsx)(o.t,{className:`canvas-grid-view-expand-handle`,variant:`filled`,shape:`circle`,size:`sm`,color:`primary`,iconOnly:!0,"aria-label":`Expand tile`,startIcon:(0,f.jsx)(t.$n,{}),onClick:t=>{t.stopPropagation(),y(e.id)}}),Z&&r&&(0,f.jsx)(`div`,{className:`canvas-grid-item-glass`,"aria-hidden":!0,children:(0,f.jsx)(t.Sr,{size:28})}),Z&&(0,f.jsx)(`div`,{className:`canvas-grid-resize-handle`,"aria-hidden":!0,onPointerDown:t=>te(t,e),onPointerMove:re,onPointerUp:e=>{M&&H(),$(e)},onPointerCancel:$})]},e.id)})]})}var z=(0,d.forwardRef)(R),B=`button, a, [role="button"]`,V=(0,d.forwardRef)(function({children:e,top:t=16,bottomGap:r=16,hideScrollbar:i=!0,draggable:a=!0,className:o,style:s,...c},l){let u=(0,d.useRef)(null);(0,d.useImperativeHandle)(l,()=>u.current);let p=(0,d.useRef)(null),[m,h]=(0,d.useState)(!1);(0,d.useEffect)(()=>{if(!a)return;let e=e=>{let t=p.current,n=u.current;!t||!n||(n.scrollTop=t.startScrollTop-(e.clientY-t.startY))},t=()=>{p.current&&(p.current=null,h(!1))};return window.addEventListener(`mousemove`,e),window.addEventListener(`mouseup`,t),()=>{window.removeEventListener(`mousemove`,e),window.removeEventListener(`mouseup`,t)}},[a]);let g=e=>{if(!a)return;let t=e.target;if(t&&t.closest(B))return;let n=u.current;n&&(p.current={startY:e.clientY,startScrollTop:n.scrollTop},h(!0),e.preventDefault())},_={top:t,height:`calc(100vh - ${t+r}px)`,...s};return(0,f.jsx)(`div`,{ref:u,className:n.t(`m-sticky-panel`,a&&`draggable`,m&&`is-dragging`,i&&`hide-scrollbar`,o),style:_,onMouseDown:g,...c,children:e})});Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return h}});
2
+ //# sourceMappingURL=layout-Ddo7HUPu.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"layout-CfolwT8L.cjs","names":[],"sources":["../src/components/layout/MContainer/MContainer.tsx","../src/components/layout/MHeader/MHeader.tsx","../src/components/layout/MFooter/MFooter.tsx","../src/components/layout/MNavs/MNavs.tsx","../src/components/layout/MNavbar/MNavbar.tsx","../src/components/layout/MSection/MSection.tsx","../src/components/layout/MStatGrid/MStatGrid.tsx","../src/components/layout/MDivider/MDivider.tsx","../src/components/layout/MSidebar/MSidebar.tsx","../src/components/layout/MBreadcrumb/MBreadcrumb.tsx","../src/components/layout/MAppShell/MAppShell.tsx","../src/components/layout/MCanvasGrid/ScaleToFit.tsx","../src/components/layout/MCanvasGrid/MCanvasGrid.tsx","../src/components/layout/MStickyPanel/MStickyPanel.tsx"],"sourcesContent":["import type {MContainerProps} from './MContainer.types'\nimport {getHiddenProps} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport './MContainer.css'\n\n// Constrain page content widths and apply shared spacing utilities.\nexport function MContainer({\n size = 'content',\n padded = true,\n hidden,\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: MContainerProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n\n return (\n <div\n className={cn(\n 'container',\n size,\n padded && 'padded',\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...getHiddenProps(hidden)}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type {MHeaderProps} from './MHeader.types'\nimport {getHiddenProps} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport {MContainer} from '../MContainer'\nimport './MHeader.css'\n\n// Render a reusable page header shell aligned to a shared container.\nexport function MHeader({\n container = 'wide',\n padded = true,\n bordered = true,\n sticky = false,\n tone = 'surface',\n layout = 'split',\n hidden,\n className,\n children,\n ...rest\n}: MHeaderProps) {\n return (\n <header\n className={cn('header', tone, bordered && 'bordered', sticky && 'sticky', className)}\n {...getHiddenProps(hidden)}\n {...rest}\n >\n <MContainer size={container} padded={padded} className={cn('inner', `layout-${layout}`)}>\n {children}\n </MContainer>\n </header>\n )\n}\n","import type {MFooterProps} from './MFooter.types'\nimport {getHiddenProps} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport {MContainer} from '../MContainer'\nimport './MFooter.css'\n\n// Render a reusable page footer shell with shared spacing utilities.\nexport function MFooter({\n container = 'wide',\n padded = true,\n bordered = true,\n tone = 'surface',\n hidden,\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: MFooterProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n\n return (\n <footer\n className={cn(\n 'footer',\n tone,\n bordered && 'bordered',\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...getHiddenProps(hidden)}\n {...rest}\n >\n <MContainer size={container} padded={padded} className=\"inner\" fullWidth>\n {children}\n </MContainer>\n </footer>\n )\n}\n","import type {MNavsProps} from './MNavs.types'\nimport {cn} from '../../../utils/cn'\nimport {MLink} from '../../typography'\nimport './MNavs.css'\n\n// Render a lightweight navigation list from data or custom children.\nexport function MNavs({items, orientation = 'horizontal', wrap = false, className, children, ...rest}: MNavsProps) {\n return (\n <div className={cn('navs', orientation, wrap && 'wrap', className)} {...rest}>\n {items\n ? items.map((item) => {\n const Icon = item.icon\n const hideLabel = item.iconOnly === true && Icon != null\n const labelAsString = typeof item.label === 'string' ? item.label : undefined\n const ariaLabel = hideLabel ? labelAsString : undefined\n const linkTitle = item.title ?? (hideLabel ? labelAsString : undefined)\n\n return (\n <MLink\n key={item.key ?? item.href ?? item.title?.toString() ?? labelAsString ?? ''}\n component={item.component}\n href={item.href}\n to={item.to}\n target={item.target}\n rel={item.rel}\n title={linkTitle}\n current={item.current}\n disabled={item.disabled}\n className={cn('link', hideLabel && 'icon-only', item.className)}\n aria-label={ariaLabel}\n >\n {Icon ? (\n <span className=\"icon\" aria-hidden={!hideLabel || undefined}>\n <Icon size={item.iconSize} />\n </span>\n ) : null}\n {!hideLabel ? item.label : null}\n </MLink>\n )\n })\n : children}\n </div>\n )\n}\n","import {Children, cloneElement, isValidElement, useEffect, useId, useRef, useState} from 'react'\nimport type {MouseEvent as ReactMouseEvent, ReactElement, ReactNode} from 'react'\nimport type {MNavbarProps} from './MNavbar.types'\nimport {getHiddenProps, MShellBreakpoints, useMaxWidth} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport {MContainer} from '../MContainer'\nimport {MInline} from '../MInline'\nimport type {MInlineProps} from '../MInline'\nimport {MNavs} from '../MNavs'\nimport {MButton} from '../../controls/MButton'\nimport {MMenuIcon} from '../../../icons'\nimport './MNavbar.css'\n\ntype NavLikeElement = ReactElement<{children?: ReactNode; orientation?: 'horizontal' | 'vertical'}>\n\n// Walks the children tree (any depth) looking for MNavs instances so the navbar\n// can pull them into the mobile menu even when wrapped in MInline / MStack.\nfunction findNavLikeChildren(children: ReactNode, found: NavLikeElement[] = []): NavLikeElement[] {\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) {\n return\n }\n if (child.type === MNavs) {\n found.push(child as NavLikeElement)\n return\n }\n const nestedChildren = (child.props as {children?: ReactNode} | null)?.children\n if (nestedChildren !== undefined) {\n findNavLikeChildren(nestedChildren, found)\n }\n })\n return found\n}\n\n// Render a horizontal app or site navigation shell with container alignment.\n// Below the md breakpoint MNavs children are collapsed behind a hamburger toggle\n// that opens either a dropdown panel or a side drawer with the navigation items.\nexport function MNavbar({\n container = 'content',\n padded = true,\n bordered = true,\n sticky = false,\n tone = 'surface',\n justify = 'between',\n wrap = false,\n mobileMenu = 'dropdown',\n mobileMenuContent,\n mobileMenuFooter,\n collapseActions = false,\n mobileMenuLabel = 'Open navigation',\n mobileBreakpoint = MShellBreakpoints.compact,\n hidden,\n className,\n children,\n ...rest\n}: MNavbarProps) {\n const [open, setOpen] = useState(false)\n const rootRef = useRef<HTMLElement | null>(null)\n const menuId = useId()\n const mobile = useMaxWidth(mobileBreakpoint)\n\n const childArray = Children.toArray(children)\n\n const mobileNavs = findNavLikeChildren(children).map((element, index) =>\n cloneElement(element, {\n key: `mnavbar-mobile-navs-${index}`,\n orientation: 'vertical',\n })\n )\n\n const toggleButton = (\n <MButton\n key=\"mnavbar-toggle\"\n type=\"button\"\n variant=\"ghost\"\n size=\"md\"\n shape=\"circle\"\n iconOnly\n className=\"navbar-toggle\"\n aria-label={mobileMenuLabel}\n aria-expanded={open}\n aria-controls={menuId}\n onClick={handleToggleClick}\n >\n <MMenuIcon />\n </MButton>\n )\n\n let lastInlineIndex = -1\n for (let index = childArray.length - 1; index >= 0; index -= 1) {\n const child = childArray[index]\n if (isValidElement(child) && child.type === MInline) {\n lastInlineIndex = index\n break\n }\n }\n\n // When collapseActions is on and we're below the breakpoint, the last inline\n // (usually theme / lang / search) is pulled out of the bar and rendered in\n // the mobile menu footer. The burger toggle then attaches to the previous\n // inline (typically primary actions) — or sits on its own when none exists.\n const shouldCollapseLastInline = collapseActions && mobile && lastInlineIndex !== -1\n let collapsedActionsInline: ReactElement<MInlineProps> | null = null\n let workingChildren = childArray\n let toggleHostIndex = lastInlineIndex\n if (shouldCollapseLastInline) {\n collapsedActionsInline = childArray[lastInlineIndex] as ReactElement<MInlineProps>\n workingChildren = childArray.filter((_, index) => index !== lastInlineIndex)\n toggleHostIndex = -1\n for (let index = workingChildren.length - 1; index >= 0; index -= 1) {\n const child = workingChildren[index]\n if (isValidElement(child) && child.type === MInline) {\n toggleHostIndex = index\n break\n }\n }\n }\n\n const renderedChildren =\n toggleHostIndex === -1\n ? [...workingChildren, toggleButton]\n : workingChildren.map((child, index) => {\n if (index !== toggleHostIndex) return child\n const inlineChild = child as ReactElement<MInlineProps>\n const inlineChildren = Children.toArray(inlineChild.props.children)\n return cloneElement(inlineChild, {\n key: inlineChild.key ?? `mnavbar-inline-${index}`,\n children: [...inlineChildren, toggleButton],\n })\n })\n\n useEffect(() => {\n if (!open) return\n\n function handlePointerDown(event: PointerEvent) {\n const root = rootRef.current\n if (!root) return\n if (event.target instanceof Node && root.contains(event.target)) return\n setOpen(false)\n }\n\n function handleKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape') setOpen(false)\n }\n\n document.addEventListener('pointerdown', handlePointerDown)\n document.addEventListener('keydown', handleKeydown)\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown)\n document.removeEventListener('keydown', handleKeydown)\n }\n }, [open])\n\n useEffect(() => {\n if (!mobile) {\n setOpen(false)\n }\n }, [mobile])\n\n function handleToggleClick() {\n setOpen((previous) => !previous)\n }\n\n function handleMenuClick(event: ReactMouseEvent<HTMLDivElement>) {\n const target = event.target as HTMLElement | null\n if (!target) return\n if (target.closest('a, [role=\"menuitem\"]')) {\n setOpen(false)\n }\n }\n\n return (\n <nav\n ref={rootRef}\n className={cn(\n 'navbar',\n tone,\n bordered && 'bordered',\n sticky && 'sticky',\n mobile && 'mobile-view',\n open && 'mobile-open',\n `mobile-${mobileMenu}`,\n className\n )}\n {...getHiddenProps(hidden)}\n {...rest}\n >\n <MContainer size={container} padded={padded} className=\"container\">\n <div className={cn('inner', justify, wrap && 'wrap')}>{renderedChildren}</div>\n </MContainer>\n\n {mobileMenu === 'drawer' && <div className={cn('mobile-backdrop', open && 'visible')} aria-hidden />}\n\n <div\n id={menuId}\n className={cn('mobile-menu', mobileMenu, open && 'open')}\n role=\"menu\"\n aria-hidden={!open || undefined}\n onClick={handleMenuClick}\n >\n {mobileNavs}\n {mobileMenuContent}\n {collapsedActionsInline ? (\n <div className=\"mobile-menu-footer\">\n {cloneElement(collapsedActionsInline, {\n key: 'mnavbar-collapsed-actions',\n })}\n </div>\n ) : null}\n {mobileMenuFooter ? <div className=\"mobile-menu-footer\">{mobileMenuFooter}</div> : null}\n </div>\n </nav>\n )\n}\n","import type React from 'react'\nimport type {MSectionProps} from './MSection.types'\nimport {getHiddenProps} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport './MSection.css'\n\n// Render a semantic page section with predefined spacing and tone.\nexport function MSection({\n as = 'section',\n spacing = 'lg',\n tone = 'default',\n hidden,\n className,\n style,\n children,\n ...rest\n}: MSectionProps) {\n const Component = as\n\n return (\n <Component\n className={cn('section', spacing, tone, className)}\n style={style}\n {...getHiddenProps(hidden)}\n {...rest}\n >\n {children}\n </Component>\n )\n}\n","import type {MStatGridProps} from './MStatGrid.types'\nimport {MSimpleGrid} from '../MSimpleGrid'\n\nexport function MStatGrid<T>({\n items,\n renderItem,\n children,\n columns = 4,\n minItemWidth = '15rem',\n ...rest\n}: MStatGridProps<T>) {\n return (\n <MSimpleGrid columns={columns} minItemWidth={minItemWidth} {...rest}>\n {items && renderItem ? items.map((item, index) => renderItem(item, index)) : children}\n </MSimpleGrid>\n )\n}\n","import type {MDividerProps} from './MDivider.types'\nimport {getHiddenProps} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport './MDivider.css'\n\n// Render a semantic divider line between related content blocks.\nexport function MDivider({\n orientation = 'horizontal',\n variant = 'solid',\n hidden,\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n ...rest\n}: MDividerProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n\n return (\n <div\n role=\"separator\"\n aria-orientation={orientation}\n className={cn(\n 'divider',\n orientation,\n variant,\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...getHiddenProps(hidden)}\n {...rest}\n />\n )\n}\n","import {createContext, useContext, useState, useEffect, useCallback, useMemo} from 'react'\nimport {cn} from '../../../utils/cn'\nimport {MButton} from '../../controls'\nimport {MChevronRightIcon, MMenuIcon} from '../../../icons'\nimport {MDropdownMenu, MTooltip} from '../../overlays'\nimport {MShellBreakpoints, useMaxWidth} from '../../../theme'\nimport type {\n MSidebarProps,\n MSidebarHeaderProps,\n MSidebarBodyProps,\n MSidebarNavProps,\n MSidebarItemProps,\n MSidebarGroupProps,\n MSidebarFooterProps,\n MSidebarDividerProps,\n MSidebarMode,\n} from './MSidebar.types'\nimport './MSidebar.css'\n\nconst STORAGE_KEY = 'mineralui-sidebar'\n\ninterface SidebarContextValue {\n mode: MSidebarMode\n mobile: boolean\n mobileOpen: boolean\n canToggle: boolean\n toggleMode: () => void\n}\n\nconst SidebarCtx = createContext<SidebarContextValue>({\n mode: 'expanded',\n mobile: false,\n mobileOpen: false,\n canToggle: false,\n toggleMode: () => {},\n})\n\n// Read shared sidebar state inside slot components.\nfunction useSidebar() {\n return useContext(SidebarCtx)\n}\n\n// Render the sidebar shell and coordinate desktop and mobile behavior.\nexport function MSidebar({\n mode: modeProp = 'auto',\n defaultMode = 'expanded',\n onModeChange,\n persist = false,\n side = 'left',\n tone = 'subtle',\n bordered = true,\n mobileBreakpoint = MShellBreakpoints.mobile,\n compactBreakpoint = MShellBreakpoints.compact,\n className,\n style,\n children,\n}: MSidebarProps) {\n const resolvedCompactBreakpoint = Math.max(compactBreakpoint, mobileBreakpoint)\n const mobile = useMaxWidth(mobileBreakpoint)\n const compactViewport = useMaxWidth(resolvedCompactBreakpoint)\n const compact = !mobile && compactViewport\n const [mobileOpen, setMobileOpen] = useState(false)\n\n const [internalMode, setInternalMode] = useState<MSidebarMode>(() => {\n if (persist) {\n try {\n const v = localStorage.getItem(STORAGE_KEY)\n if (v === 'expanded' || v === 'collapsed') return v\n } catch {\n /* noop */\n }\n }\n\n return defaultMode\n })\n\n const resolvedMode: MSidebarMode = mobile\n ? 'expanded'\n : compact\n ? 'collapsed'\n : modeProp === 'auto'\n ? internalMode\n : modeProp === 'collapsed'\n ? 'collapsed'\n : 'expanded'\n\n // MToggle only the desktop width state. Mobile uses its own overlay flow.\n const toggleMode = useCallback(() => {\n const next: MSidebarMode = resolvedMode === 'expanded' ? 'collapsed' : 'expanded'\n\n setInternalMode(next)\n onModeChange?.(next)\n\n if (persist) {\n try {\n localStorage.setItem(STORAGE_KEY, next)\n } catch {\n /* noop */\n }\n }\n }, [resolvedMode, onModeChange, persist])\n\n const closeMobile = useCallback(() => setMobileOpen(false), [])\n\n // Let Escape close the temporary mobile drawer.\n useEffect(() => {\n if (!mobileOpen) return\n\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setMobileOpen(false)\n }\n\n document.addEventListener('keydown', handler)\n return () => document.removeEventListener('keydown', handler)\n }, [mobileOpen])\n\n useEffect(() => {\n if (!mobile) {\n setMobileOpen(false)\n }\n }, [mobile])\n\n const canToggle = !mobile && !compact && modeProp === 'auto'\n\n const ctx = useMemo<SidebarContextValue>(\n () => ({mode: resolvedMode, mobile, mobileOpen, canToggle, toggleMode}),\n [resolvedMode, mobile, mobileOpen, canToggle, toggleMode]\n )\n\n const isCollapsed = !mobile && resolvedMode === 'collapsed'\n\n const sidebarCls = cn(\n 'sidebar',\n tone,\n side,\n isCollapsed && 'collapsed',\n compact && 'compact',\n bordered && 'bordered',\n mobile && 'mobile',\n mobile && mobileOpen && 'mobile-open',\n className\n )\n\n return (\n <SidebarCtx.Provider value={ctx}>\n {mobile && mobileOpen && <div className=\"sidebar-backdrop\" onClick={closeMobile} />}\n\n <aside className={sidebarCls} style={style}>\n {children}\n </aside>\n\n {mobile && !mobileOpen && (\n <button\n className={cn('sidebar-hamburger', side)}\n onClick={() => setMobileOpen(true)}\n aria-label=\"Open menu\"\n >\n <span className=\"sidebar-hamburger-icon\" aria-hidden=\"true\">\n <MMenuIcon />\n </span>\n </button>\n )}\n </SidebarCtx.Provider>\n )\n}\n\n// Render the top area with branding and an optional collapse toggle.\nexport function MSidebarHeader({bordered = false, className, children}: MSidebarHeaderProps) {\n const {mode, mobile, canToggle, toggleMode} = useSidebar()\n const isCollapsed = !mobile && mode === 'collapsed'\n\n return (\n <div className={cn('sidebar-header', bordered && 'bordered', className)}>\n <div className=\"sidebar-header-content\">{children}</div>\n {canToggle && (\n <MButton\n variant=\"outlined\"\n color=\"neutral\"\n iconOnly\n size=\"sm\"\n onClick={toggleMode}\n aria-label={isCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n className=\"sidebar-toggle\"\n >\n <span className={cn('sidebar-chevron', isCollapsed && 'flipped')}>\n <MChevronRightIcon />\n </span>\n </MButton>\n )}\n </div>\n )\n}\n\n// Wrap the scrollable middle area between header and footer.\nexport function MSidebarBody({className, children}: MSidebarBodyProps) {\n return <div className={cn('sidebar-body', className)}>{children}</div>\n}\n\n// Wrap sidebar links in a navigation landmark.\nexport function MSidebarNav({className, children}: MSidebarNavProps) {\n return <nav className={cn('sidebar-nav', className)}>{children}</nav>\n}\n\n// Render one clickable sidebar row as a link, button or custom component.\nexport function MSidebarItem({\n icon,\n label,\n description,\n href,\n to,\n onClick,\n active = false,\n disabled = false,\n badge,\n color,\n component,\n className,\n}: MSidebarItemProps) {\n const {mode, mobile} = useSidebar()\n const isCollapsed = !mobile && mode === 'collapsed'\n\n // ONE tooltip per row: prefer description, fall back to label. The HTML\n // title attribute used in collapsed mode mirrors the same priority but is\n // limited to strings (browsers can't render ReactNodes).\n const tooltipContent = description ?? label\n const titleAttr = typeof description === 'string'\n ? description\n : typeof label === 'string'\n ? label\n : undefined\n\n const Tag = component ?? (href || to ? 'a' : 'button')\n const linkProps = component ? (to ? {to} : href ? {href} : {}) : href ? {href} : to ? {href: to} : {}\n const cls = cn('sidebar-item', active && 'active', disabled && 'disabled', color, className)\n\n return (\n <Tag\n className={cls}\n onClick={disabled ? undefined : onClick}\n aria-disabled={disabled || undefined}\n title={isCollapsed ? titleAttr : undefined}\n {...linkProps}\n >\n {icon && <span className=\"sidebar-item-icon\">{icon}</span>}\n {!isCollapsed && (\n <MTooltip content={tooltipContent} placement=\"top\" className=\"sidebar-item-label-tooltip\">\n <span className=\"sidebar-item-label\">{label}</span>\n </MTooltip>\n )}\n {!isCollapsed && badge && <span className=\"sidebar-item-badge\">{badge}</span>}\n </Tag>\n )\n}\n\n// Group related sidebar items and swap to a dropdown when collapsed.\nexport function MSidebarGroup({\n label,\n icon,\n active = false,\n defaultOpen = true,\n collapsible = true,\n children,\n className,\n}: MSidebarGroupProps) {\n const sidebarCtx = useSidebar()\n const {mode, mobile} = sidebarCtx\n const isCollapsed = !mobile && mode === 'collapsed'\n const [open, setOpen] = useState(defaultOpen)\n\n const expandedCtx = useMemo<SidebarContextValue>(() => ({...sidebarCtx, mode: 'expanded'}), [sidebarCtx])\n\n // Keep expand/collapse local to this group.\n const toggle = () => {\n if (collapsible) setOpen((o) => !o)\n }\n\n if (isCollapsed) {\n const trigger = (\n <span className={cn('sidebar-group-icon collapsed', active && 'active')} title={label}>\n {icon}\n </span>\n )\n\n return (\n <div className={cn('sidebar-group', className)}>\n <MDropdownMenu trigger={trigger} placement=\"right-start\" closeOnSelect openOn=\"hover\">\n <SidebarCtx.Provider value={expandedCtx}>{children}</SidebarCtx.Provider>\n </MDropdownMenu>\n </div>\n )\n }\n\n return (\n <div className={cn('sidebar-group', className)}>\n <button className={cn('sidebar-group-header', active && 'active')} onClick={toggle} aria-expanded={open}>\n {icon && <span className=\"sidebar-group-icon\">{icon}</span>}\n <span className=\"sidebar-group-label\">{label}</span>\n {collapsible && (\n <span className={cn('sidebar-group-arrow', open && 'open')}>\n <MChevronRightIcon />\n </span>\n )}\n </button>\n {open && <div className=\"sidebar-group-items\">{children}</div>}\n </div>\n )\n}\n\n// Render the bottom slot for version info or quick actions.\nexport function MSidebarFooter({bordered = false, className, children}: MSidebarFooterProps) {\n return <div className={cn('sidebar-footer', bordered && 'bordered', className)}>{children}</div>\n}\n\n// Render a spacing-aware divider between sidebar regions.\nexport function MSidebarDivider({className, spacing = 'md'}: MSidebarDividerProps) {\n return <hr className={cn('sidebar-divider', spacing, className)} />\n}\n","import {useMemo} from 'react'\nimport {cn} from '../../../utils/cn'\nimport type {MBreadcrumbProps} from './MBreadcrumb.types'\nimport './MBreadcrumb.css'\n\n// Render a compact path and collapse the middle when needed.\nexport function MBreadcrumb({items, separator = '/', maxItems, className, ...rest}: MBreadcrumbProps) {\n // Keep the current page visible while shortening deep paths.\n const visible = useMemo(() => {\n if (!maxItems || maxItems >= items.length) return items\n if (maxItems < 2) return [items[items.length - 1]]\n const head = items.slice(0, 1)\n const tail = items.slice(-(maxItems - 1))\n return [...head, null, ...tail]\n }, [items, maxItems])\n\n return (\n <nav aria-label=\"breadcrumb\" className={cn('breadcrumb', className)} {...rest}>\n <ol className=\"trail\">\n {visible.map((item, i) => {\n if (item === null) {\n return (\n <li key=\"ellipsis\" className=\"crumb dots\">\n <span className=\"sep\">{separator}</span>\n <span>&#8230;</span>\n </li>\n )\n }\n\n const isLast = i === visible.length - 1\n\n return (\n <li key={i} className={cn('crumb', isLast && 'active')}>\n {i > 0 && <span className=\"sep\">{separator}</span>}\n {item.href && !isLast ? (\n <a href={item.href} className=\"link\" onClick={item.onClick}>\n {item.label}\n </a>\n ) : item.onClick && !isLast ? (\n <button type=\"button\" className=\"link btn\" onClick={item.onClick}>\n {item.label}\n </button>\n ) : (\n <span className=\"current\" aria-current={isLast ? 'page' : undefined}>\n {item.label}\n </span>\n )}\n </li>\n )\n })}\n </ol>\n </nav>\n )\n}\n","import {forwardRef, Children, isValidElement} from 'react'\nimport type * as React from 'react'\nimport type {MAppShellProps, MBodyProps} from './MAppShell.types'\nimport {cn} from '../../../utils/cn'\nimport {MSidebar} from '../MSidebar'\nimport './MAppShell.css'\n\nexport const MAppShell = forwardRef<HTMLDivElement, MAppShellProps>(function MAppShell(\n {className, children, ...rest},\n ref\n) {\n const sidebarElements: React.ReactNode[] = []\n const otherElements: React.ReactNode[] = []\n\n Children.forEach(children, (child) => {\n if (isValidElement(child) && child.type === MSidebar) {\n sidebarElements.push(child)\n } else {\n otherElements.push(child)\n }\n })\n\n return (\n <div ref={ref} className={cn('app-shell', className)} {...rest}>\n {sidebarElements}\n <div className=\"app-main\">{otherElements}</div>\n </div>\n )\n})\n\nexport const MBody = forwardRef<HTMLDivElement, MBodyProps>(function MBody({className, children, ...rest}, ref) {\n return (\n <div ref={ref} className={cn('app-body', className)} {...rest}>\n {children}\n </div>\n )\n})\n","import {useEffect, useRef, useState, type ReactNode} from 'react'\n\ninterface ScaleToFitProps {\n /**\n * Minimum render width (in CSS px). When the parent is narrower, content\n * is rendered at this width and scaled down. When the parent is wider,\n * content is rendered at the parent's width (no scale-up, no padding).\n */\n baseWidth?: number\n children: ReactNode\n}\n\n/**\n * Renders `children` at `max(baseWidth, parentWidth)`, then applies\n * `transform: scale(...)` so the rendered block fits the parent box without\n * scrollbars. Scale never exceeds 1 (no blurry up-scaling). When the parent\n * is wider than baseWidth, render width tracks the parent so content fills\n * the available space natively (no horizontal padding).\n */\nexport function ScaleToFit({baseWidth = 480, children}: ScaleToFitProps) {\n const wrapperRef = useRef<HTMLDivElement>(null)\n const contentRef = useRef<HTMLDivElement>(null)\n const [scale, setScale] = useState(1)\n const [renderWidth, setRenderWidth] = useState<number>(baseWidth)\n\n useEffect(() => {\n const wrap = wrapperRef.current\n const content = contentRef.current\n if (!wrap || !content) return\n\n let frame = 0\n const recompute = () => {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(() => {\n const wW = wrap.clientWidth\n const wH = wrap.clientHeight\n if (wW === 0 || wH === 0) return\n const cW = Math.max(baseWidth, wW)\n const cH = content.offsetHeight\n if (cW === 0 || cH === 0) return\n const sW = wW / cW\n const sH = wH / cH\n const next = Math.min(sW, sH, 1)\n if (next > 0 && Number.isFinite(next)) {\n setRenderWidth(cW)\n setScale(next)\n }\n })\n }\n\n const ro = new ResizeObserver(recompute)\n ro.observe(wrap)\n ro.observe(content)\n recompute()\n return () => {\n cancelAnimationFrame(frame)\n ro.disconnect()\n }\n }, [baseWidth])\n\n return (\n <div ref={wrapperRef} className=\"canvas-grid-scale-wrapper\">\n <div\n ref={contentRef}\n className=\"canvas-grid-scale-content\"\n style={{width: `${renderWidth}px`, transform: `scale(${scale})`}}\n >\n {children}\n </div>\n </div>\n )\n}\n","import {forwardRef, useCallback, useEffect, useRef, useState} from 'react'\nimport type {CSSProperties, ForwardedRef, PointerEvent as ReactPointerEvent, ReactElement, Ref} from 'react'\nimport type {MCanvasGridItem, MCanvasGridPosition, MCanvasGridProps} from './MCanvasGrid.types'\nimport {cn} from '../../../utils/cn'\nimport {MShellBreakpoints, useMaxWidth} from '../../../theme'\nimport {MEditIcon, MMoveIcon, MTrashIcon, MZoomInIcon} from '../../../icons'\nimport {MButton} from '../../controls/MButton'\nimport {MButtonGroup} from '../../controls/MButtonGroup'\nimport {ScaleToFit} from './ScaleToFit'\nimport './MCanvasGrid.css'\n\ninterface DragState {\n itemId: string\n mode: 'drag' | 'resize'\n startClientX: number\n startClientY: number\n original: MCanvasGridPosition\n}\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value))\n}\n\nfunction MCanvasGridInner<T extends MCanvasGridItem>(\n {\n columns = 24,\n rows = 24,\n snap = 4,\n items,\n renderItem,\n minItemSize,\n maxItemSize: _maxItemSize,\n editable = false,\n onItemMove,\n onItemResize,\n onItemRemove,\n onItemEdit,\n onItemExpand,\n guides = 'always',\n compactBreakpoint = MShellBreakpoints.compact,\n mobileBreakpoint = MShellBreakpoints.mobile,\n height,\n fitContent = 'scroll',\n fitContentBaseWidth = 480,\n className,\n style,\n }: MCanvasGridProps<T>,\n ref: ForwardedRef<HTMLDivElement>\n) {\n const innerRef = useRef<HTMLDivElement | null>(null)\n const [size, setSize] = useState({width: 0, height: 0})\n const [drag, setDrag] = useState<DragState | null>(null)\n const [preview, setPreview] = useState<MCanvasGridPosition | null>(null)\n const [touchOrder, setTouchOrder] = useState<Record<string, number>>({})\n const touchCounterRef = useRef(0)\n\n function bringToFront(itemId: string) {\n touchCounterRef.current += 1\n setTouchOrder((prev) => ({...prev, [itemId]: touchCounterRef.current}))\n }\n\n function suppressNextClick() {\n let armed = true\n const stopper = (ev: MouseEvent) => {\n if (!armed) return\n armed = false\n ev.stopPropagation()\n ev.preventDefault()\n window.removeEventListener('click', stopper, true)\n }\n window.addEventListener('click', stopper, true)\n window.setTimeout(() => {\n if (!armed) return\n armed = false\n window.removeEventListener('click', stopper, true)\n }, 60)\n }\n\n const isMobile = useMaxWidth(mobileBreakpoint)\n const isCompact = useMaxWidth(compactBreakpoint) && !isMobile\n\n const totalCols = columns * snap\n const totalRows = rows * snap\n const effectiveCols = isCompact ? Math.max(1, Math.round(totalCols / 2)) : totalCols\n const effectiveRows = isCompact ? Math.max(1, Math.round(totalRows / 2)) : totalRows\n const effectiveCells = isCompact ? Math.max(1, Math.round(columns / 2)) : columns\n const effectiveRowCells = isCompact ? Math.max(1, Math.round(rows / 2)) : rows\n\n const interactive = editable && !isMobile\n\n useEffect(() => {\n const node = innerRef.current\n if (!node || typeof ResizeObserver === 'undefined') return\n const update = () => setSize({width: node.clientWidth, height: node.clientHeight})\n update()\n const observer = new ResizeObserver(update)\n observer.observe(node)\n return () => observer.disconnect()\n }, [])\n\n const setRefs = useCallback(\n (node: HTMLDivElement | null) => {\n innerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as {current: HTMLDivElement | null}).current = node\n },\n [ref]\n )\n\n function getMin(item: T) {\n const m = minItemSize?.(item)\n if (!m) return {w: snap, h: snap}\n return {w: Math.max(snap, m.w * snap), h: Math.max(snap, m.h * snap)}\n }\n\n function startResize(e: ReactPointerEvent<HTMLDivElement>, item: T) {\n if (!interactive) return\n e.stopPropagation()\n e.preventDefault()\n ;(e.currentTarget as Element).setPointerCapture(e.pointerId)\n bringToFront(item.id)\n setDrag({\n itemId: item.id,\n mode: 'resize',\n startClientX: e.clientX,\n startClientY: e.clientY,\n original: {...item.position},\n })\n setPreview({...item.position})\n }\n\n function startDragFromHeader(e: ReactPointerEvent<HTMLDivElement>, item: T) {\n if (!interactive) return\n if ((e.target as Element).closest('button, [role=\"button\"]')) return\n e.stopPropagation()\n e.preventDefault()\n ;(e.currentTarget as Element).setPointerCapture(e.pointerId)\n bringToFront(item.id)\n setDrag({\n itemId: item.id,\n mode: 'drag',\n startClientX: e.clientX,\n startClientY: e.clientY,\n original: {...item.position},\n })\n setPreview({...item.position})\n }\n\n function handlePointerMove(e: ReactPointerEvent<HTMLDivElement>) {\n if (!drag || size.width === 0 || size.height === 0) return\n const cellPxX = size.width / effectiveCols\n const cellPxY = size.height / effectiveRows\n const dx = Math.round((e.clientX - drag.startClientX) / cellPxX)\n const dy = Math.round((e.clientY - drag.startClientY) / cellPxY)\n const original = drag.original\n\n const targetItem = items.find((it) => it.id === drag.itemId)\n const min = targetItem ? getMin(targetItem) : {w: snap, h: snap}\n\n if (drag.mode === 'drag') {\n const x = clamp(original.x + dx, 0, effectiveCols - original.w)\n const y = clamp(original.y + dy, 0, effectiveRows - original.h)\n setPreview({x, y, w: original.w, h: original.h})\n } else {\n const w = clamp(original.w + dx, min.w, effectiveCols - original.x)\n const h = clamp(original.h + dy, min.h, effectiveRows - original.y)\n setPreview({x: original.x, y: original.y, w, h})\n }\n }\n\n function handlePointerUp(e: ReactPointerEvent<HTMLDivElement>) {\n if (!drag) return\n try {\n ;(e.currentTarget as Element).releasePointerCapture(e.pointerId)\n } catch {\n // pointer may have already been released\n }\n if (preview) {\n if (drag.mode === 'drag') onItemMove?.(drag.itemId, preview)\n else onItemResize?.(drag.itemId, preview)\n }\n setDrag(null)\n setPreview(null)\n }\n\n function handleHeaderPointerUp(e: ReactPointerEvent<HTMLDivElement>) {\n if (drag) {\n suppressNextClick()\n handlePointerUp(e)\n }\n }\n\n const guidesOn =\n guides === 'always' ||\n (guides === 'on-edit' && interactive) ||\n (guides === 'on-drag' && drag !== null)\n\n const heightStyle: CSSProperties | undefined =\n height !== undefined ? {height: typeof height === 'number' ? `${height}px` : height} : undefined\n\n if (isMobile) {\n const ordered = [...items].sort((a, b) => a.position.y - b.position.y)\n return (\n <div\n ref={setRefs}\n className={cn('canvas-grid', 'mobile', className)}\n data-guides=\"off\"\n style={{...heightStyle, ...style}}\n >\n {ordered.map((item) => (\n <div key={item.id} className=\"canvas-grid-item\">\n {renderItem(item)}\n </div>\n ))}\n </div>\n )\n }\n\n const gridStyle: CSSProperties = {\n ...heightStyle,\n ...style,\n gridTemplateColumns: `repeat(${effectiveCols}, 1fr)`,\n gridTemplateRows: `repeat(${effectiveRows}, 1fr)`,\n ['--canvas-grid-cells' as string]: String(effectiveCells),\n ['--canvas-grid-row-cells' as string]: String(effectiveRowCells),\n }\n\n const overlayCells = effectiveCells * effectiveRowCells\n\n return (\n <div\n ref={setRefs}\n className={cn('canvas-grid', isCompact && 'compact', interactive && 'editable', className)}\n data-guides={guidesOn ? 'on' : 'off'}\n style={gridStyle}\n >\n <div className=\"canvas-grid-overlay\" aria-hidden>\n {Array.from({length: overlayCells}, (_, idx) => {\n const isLastCol = (idx + 1) % effectiveCells === 0\n const isLastRow = idx >= overlayCells - effectiveCells\n return (\n <div\n key={idx}\n className={cn('canvas-grid-cell', isLastCol && 'no-right', isLastRow && 'no-bottom')}\n />\n )\n })}\n </div>\n\n {items.map((item) => {\n const isDragging = drag?.itemId === item.id\n const live = isDragging && preview ? preview : item.position\n // half-precision math for compact viewport\n const x = isCompact ? Math.round(live.x / 2) : live.x\n const y = isCompact ? Math.round(live.y / 2) : live.y\n const w = Math.max(1, isCompact ? Math.round(live.w / 2) : live.w)\n const h = Math.max(1, isCompact ? Math.round(live.h / 2) : live.h)\n\n const baseZ = 1 + (touchOrder[item.id] ?? 0)\n const itemStyle: CSSProperties = {\n gridColumn: `${x + 1} / span ${w}`,\n gridRow: `${y + 1} / span ${h}`,\n zIndex: isDragging ? baseZ + 100 : baseZ,\n }\n\n return (\n <div\n key={item.id}\n className={cn('canvas-grid-item', isDragging && 'dragging')}\n style={itemStyle}\n >\n <div\n className=\"canvas-grid-item-header\"\n onPointerDown={(e) => startDragFromHeader(e, item)}\n onPointerMove={handlePointerMove}\n onPointerUp={handleHeaderPointerUp}\n onPointerCancel={handlePointerUp}\n >\n <MButtonGroup variant=\"ghost\" size=\"xs\">\n {interactive && onItemEdit && (\n <MButton\n color=\"primary\"\n iconOnly\n aria-label=\"Edit tile\"\n startIcon={<MEditIcon />}\n onPointerDown={(e) => e.stopPropagation()}\n onClick={(e) => {\n e.stopPropagation()\n onItemEdit(item.id)\n }}\n />\n )}\n {onItemExpand && (\n <MButton\n color=\"primary\"\n iconOnly\n aria-label=\"Expand tile\"\n startIcon={<MZoomInIcon />}\n onPointerDown={(e) => e.stopPropagation()}\n onClick={(e) => {\n e.stopPropagation()\n onItemExpand(item.id)\n }}\n />\n )}\n {interactive && onItemRemove && (\n <MButton\n color=\"error\"\n iconOnly\n aria-label=\"Remove tile\"\n startIcon={<MTrashIcon />}\n onPointerDown={(e) => e.stopPropagation()}\n onClick={(e) => {\n e.stopPropagation()\n onItemRemove(item.id)\n }}\n />\n )}\n </MButtonGroup>\n </div>\n <div className=\"canvas-grid-item-body\">\n {fitContent === 'scale' ? (\n <ScaleToFit baseWidth={fitContentBaseWidth}>{renderItem(item)}</ScaleToFit>\n ) : (\n renderItem(item)\n )}\n </div>\n {!interactive && onItemExpand && (\n <MButton\n className=\"canvas-grid-view-expand-handle\"\n variant=\"filled\"\n shape=\"circle\"\n size=\"sm\"\n color=\"primary\"\n iconOnly\n aria-label=\"Expand tile\"\n startIcon={<MZoomInIcon />}\n onClick={(e) => {\n e.stopPropagation()\n onItemExpand(item.id)\n }}\n />\n )}\n {interactive && isDragging && (\n <div className=\"canvas-grid-item-glass\" aria-hidden>\n <MMoveIcon size={28} />\n </div>\n )}\n {interactive && (\n <div\n className=\"canvas-grid-resize-handle\"\n aria-hidden\n onPointerDown={(e) => startResize(e, item)}\n onPointerMove={handlePointerMove}\n onPointerUp={(e) => {\n if (drag) suppressNextClick()\n handlePointerUp(e)\n }}\n onPointerCancel={handlePointerUp}\n />\n )}\n </div>\n )\n })}\n </div>\n )\n}\n\nexport const MCanvasGrid = forwardRef(MCanvasGridInner) as <T extends MCanvasGridItem>(\n props: MCanvasGridProps<T> & {ref?: Ref<HTMLDivElement>}\n) => ReactElement | null\n","import {forwardRef, useEffect, useImperativeHandle, useRef, useState} from 'react'\nimport type * as React from 'react'\nimport type {MStickyPanelProps} from './MStickyPanel.types'\nimport {cn} from '../../../utils/cn'\nimport './MStickyPanel.css'\n\nconst INTERACTIVE_SELECTOR = 'button, a, [role=\"button\"]'\n\n// Sticky side-rail panel: sticks to the viewport at `top`, fills viewport-relative height,\n// scrolls internally with an optional hidden scrollbar and click-and-drag scrolling.\nexport const MStickyPanel = forwardRef<HTMLDivElement, MStickyPanelProps>(function MStickyPanel(\n {\n children,\n top = 16,\n bottomGap = 16,\n hideScrollbar = true,\n draggable = true,\n className,\n style,\n ...rest\n },\n forwardedRef\n) {\n const panelRef = useRef<HTMLDivElement>(null)\n useImperativeHandle(forwardedRef, () => panelRef.current as HTMLDivElement)\n const dragState = useRef<{startY: number; startScrollTop: number} | null>(null)\n const [dragging, setDragging] = useState(false)\n\n useEffect(() => {\n if (!draggable) return\n\n const handleMouseMove = (event: MouseEvent) => {\n const drag = dragState.current\n const panel = panelRef.current\n if (!drag || !panel) return\n panel.scrollTop = drag.startScrollTop - (event.clientY - drag.startY)\n }\n\n const handleMouseUp = () => {\n if (!dragState.current) return\n dragState.current = null\n setDragging(false)\n }\n\n window.addEventListener('mousemove', handleMouseMove)\n window.addEventListener('mouseup', handleMouseUp)\n return () => {\n window.removeEventListener('mousemove', handleMouseMove)\n window.removeEventListener('mouseup', handleMouseUp)\n }\n }, [draggable])\n\n const handleMouseDown = (event: React.MouseEvent<HTMLDivElement>) => {\n if (!draggable) return\n // Skip drag start when the click originated on an interactive descendant\n // (button, link, role=button) so triggers like MDropdownMenu, MButton or\n // <Link> stay clickable inside the panel.\n const target = event.target as HTMLElement | null\n if (target && target.closest(INTERACTIVE_SELECTOR)) return\n\n const panel = panelRef.current\n if (!panel) return\n\n dragState.current = {startY: event.clientY, startScrollTop: panel.scrollTop}\n setDragging(true)\n event.preventDefault()\n }\n\n const mergedStyle: React.CSSProperties = {\n top,\n height: `calc(100vh - ${top + bottomGap}px)`,\n ...style,\n }\n\n return (\n <div\n ref={panelRef}\n className={cn(\n 'm-sticky-panel',\n draggable && 'draggable',\n dragging && 'is-dragging',\n hideScrollbar && 'hide-scrollbar',\n className\n )}\n style={mergedStyle}\n onMouseDown={handleMouseDown}\n {...rest}\n >\n {children}\n </div>\n )\n})\n"],"mappings":"ifAOA,SAAgB,EAAW,CACvB,OAAO,UACP,SAAS,GACT,SACA,UACA,UACA,QACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,YACA,YACA,QACA,WACA,GAAG,GACa,CAChB,IAAM,EAAe,EAAA,EAAuB,CAAC,QAAM,CAAC,CAEpD,OACI,EAAA,EAAA,KAAC,MAAD,CACI,UAAW,EAAA,EACP,YACA,EACA,GAAU,SACV,GAAG,EAAA,EAA2B,CAC1B,UACA,UACA,QACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,YACH,CAAC,CACF,EACH,CACD,MAAO,CAAC,GAAG,EAAc,GAAG,EAAM,CAClC,GAAI,EAAA,EAAe,EAAO,CAC1B,GAAI,EAEH,WACC,CAAA,CC1Dd,SAAgB,EAAQ,CACpB,YAAY,OACZ,SAAS,GACT,WAAW,GACX,SAAS,GACT,OAAO,UACP,SAAS,QACT,SACA,YACA,WACA,GAAG,GACU,CACb,OACI,EAAA,EAAA,KAAC,SAAD,CACI,UAAW,EAAA,EAAG,SAAU,EAAM,GAAY,WAAY,GAAU,SAAU,EAAU,CACpF,GAAI,EAAA,EAAe,EAAO,CAC1B,GAAI,YAEJ,EAAA,EAAA,KAAC,EAAD,CAAY,KAAM,EAAmB,SAAQ,UAAW,EAAA,EAAG,QAAS,UAAU,IAAS,CAClF,WACQ,CAAA,CACR,CAAA,CCpBjB,SAAgB,EAAQ,CACpB,YAAY,OACZ,SAAS,GACT,WAAW,GACX,OAAO,UACP,SACA,UACA,UACA,QACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,YACA,YACA,QACA,WACA,GAAG,GACU,CACb,IAAM,EAAe,EAAA,EAAuB,CAAC,QAAM,CAAC,CAEpD,OACI,EAAA,EAAA,KAAC,SAAD,CACI,UAAW,EAAA,EACP,SACA,EACA,GAAY,WACZ,GAAG,EAAA,EAA2B,CAC1B,UACA,UACA,QACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,YACH,CAAC,CACF,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"}
1
+ {"version":3,"file":"layout-Ddo7HUPu.cjs","names":[],"sources":["../src/components/layout/MContainer/MContainer.tsx","../src/components/layout/MHeader/MHeader.tsx","../src/components/layout/MFooter/MFooter.tsx","../src/components/layout/MNavs/MNavs.tsx","../src/components/layout/MNavbar/MNavbar.tsx","../src/components/layout/MSection/MSection.tsx","../src/components/layout/MStatGrid/MStatGrid.tsx","../src/components/layout/MDivider/MDivider.tsx","../src/components/layout/MSidebar/MSidebar.tsx","../src/components/layout/MBreadcrumb/MBreadcrumb.tsx","../src/components/layout/MAppShell/MAppShell.tsx","../src/components/layout/MCanvasGrid/ScaleToFit.tsx","../src/components/layout/MCanvasGrid/MCanvasGrid.tsx","../src/components/layout/MStickyPanel/MStickyPanel.tsx"],"sourcesContent":["import type {MContainerProps} from './MContainer.types'\nimport {getHiddenProps} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport './MContainer.css'\n\n// Constrain page content widths and apply shared spacing utilities.\nexport function MContainer({\n size = 'content',\n padded = true,\n hidden,\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: MContainerProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n\n return (\n <div\n className={cn(\n 'container',\n size,\n padded && 'padded',\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...getHiddenProps(hidden)}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type {MHeaderProps} from './MHeader.types'\nimport {getHiddenProps} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport {MContainer} from '../MContainer'\nimport './MHeader.css'\n\n// Render a reusable page header shell aligned to a shared container.\nexport function MHeader({\n container = 'wide',\n padded = true,\n bordered = true,\n sticky = false,\n tone = 'surface',\n layout = 'split',\n hidden,\n className,\n children,\n ...rest\n}: MHeaderProps) {\n return (\n <header\n className={cn('header', tone, bordered && 'bordered', sticky && 'sticky', className)}\n {...getHiddenProps(hidden)}\n {...rest}\n >\n <MContainer size={container} padded={padded} className={cn('inner', `layout-${layout}`)}>\n {children}\n </MContainer>\n </header>\n )\n}\n","import type {MFooterProps} from './MFooter.types'\nimport {getHiddenProps} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport {MContainer} from '../MContainer'\nimport './MFooter.css'\n\n// Render a reusable page footer shell with shared spacing utilities.\nexport function MFooter({\n container = 'wide',\n padded = true,\n bordered = true,\n tone = 'surface',\n hidden,\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n children,\n ...rest\n}: MFooterProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n\n return (\n <footer\n className={cn(\n 'footer',\n tone,\n bordered && 'bordered',\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...getHiddenProps(hidden)}\n {...rest}\n >\n <MContainer size={container} padded={padded} className=\"inner\" fullWidth>\n {children}\n </MContainer>\n </footer>\n )\n}\n","import type {MNavsProps} from './MNavs.types'\nimport {cn} from '../../../utils/cn'\nimport {MLink} from '../../typography'\nimport './MNavs.css'\n\n// Render a lightweight navigation list from data or custom children.\nexport function MNavs({items, orientation = 'horizontal', wrap = false, className, children, ...rest}: MNavsProps) {\n return (\n <div className={cn('navs', orientation, wrap && 'wrap', className)} {...rest}>\n {items\n ? items.map((item) => {\n const Icon = item.icon\n const hideLabel = item.iconOnly === true && Icon != null\n const labelAsString = typeof item.label === 'string' ? item.label : undefined\n const ariaLabel = hideLabel ? labelAsString : undefined\n const linkTitle = item.title ?? (hideLabel ? labelAsString : undefined)\n\n return (\n <MLink\n key={item.key ?? item.href ?? item.title?.toString() ?? labelAsString ?? ''}\n component={item.component}\n href={item.href}\n to={item.to}\n target={item.target}\n rel={item.rel}\n title={linkTitle}\n current={item.current}\n disabled={item.disabled}\n className={cn('link', hideLabel && 'icon-only', item.className)}\n aria-label={ariaLabel}\n >\n {Icon ? (\n <span className=\"icon\" aria-hidden={!hideLabel || undefined}>\n <Icon size={item.iconSize} />\n </span>\n ) : null}\n {!hideLabel ? item.label : null}\n </MLink>\n )\n })\n : children}\n </div>\n )\n}\n","import {Children, cloneElement, isValidElement, useEffect, useId, useRef, useState} from 'react'\nimport type {MouseEvent as ReactMouseEvent, ReactElement, ReactNode} from 'react'\nimport type {MNavbarProps} from './MNavbar.types'\nimport {getHiddenProps, MShellBreakpoints, useMaxWidth} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport {MContainer} from '../MContainer'\nimport {MInline} from '../MInline'\nimport type {MInlineProps} from '../MInline'\nimport {MNavs} from '../MNavs'\nimport {MButton} from '../../controls/MButton'\nimport {MMenuIcon} from '../../../icons'\nimport './MNavbar.css'\n\ntype NavLikeElement = ReactElement<{children?: ReactNode; orientation?: 'horizontal' | 'vertical'}>\n\n// Walks the children tree (any depth) looking for MNavs instances so the navbar\n// can pull them into the mobile menu even when wrapped in MInline / MStack.\nfunction findNavLikeChildren(children: ReactNode, found: NavLikeElement[] = []): NavLikeElement[] {\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) {\n return\n }\n if (child.type === MNavs) {\n found.push(child as NavLikeElement)\n return\n }\n const nestedChildren = (child.props as {children?: ReactNode} | null)?.children\n if (nestedChildren !== undefined) {\n findNavLikeChildren(nestedChildren, found)\n }\n })\n return found\n}\n\n// Render a horizontal app or site navigation shell with container alignment.\n// Below the md breakpoint MNavs children are collapsed behind a hamburger toggle\n// that opens either a dropdown panel or a side drawer with the navigation items.\nexport function MNavbar({\n container = 'content',\n padded = true,\n bordered = true,\n sticky = false,\n tone = 'surface',\n justify = 'between',\n wrap = false,\n mobileMenu = 'dropdown',\n mobileMenuContent,\n mobileMenuFooter,\n collapseActions = false,\n mobileMenuLabel = 'Open navigation',\n mobileBreakpoint = MShellBreakpoints.compact,\n hidden,\n className,\n children,\n ...rest\n}: MNavbarProps) {\n const [open, setOpen] = useState(false)\n const rootRef = useRef<HTMLElement | null>(null)\n const menuId = useId()\n const mobile = useMaxWidth(mobileBreakpoint)\n\n const childArray = Children.toArray(children)\n\n const mobileNavs = findNavLikeChildren(children).map((element, index) =>\n cloneElement(element, {\n key: `mnavbar-mobile-navs-${index}`,\n orientation: 'vertical',\n })\n )\n\n const toggleButton = (\n <MButton\n key=\"mnavbar-toggle\"\n type=\"button\"\n variant=\"ghost\"\n size=\"md\"\n shape=\"circle\"\n iconOnly\n className=\"navbar-toggle\"\n aria-label={mobileMenuLabel}\n aria-expanded={open}\n aria-controls={menuId}\n onClick={handleToggleClick}\n >\n <MMenuIcon />\n </MButton>\n )\n\n let lastInlineIndex = -1\n for (let index = childArray.length - 1; index >= 0; index -= 1) {\n const child = childArray[index]\n if (isValidElement(child) && child.type === MInline) {\n lastInlineIndex = index\n break\n }\n }\n\n // When collapseActions is on and we're below the breakpoint, the last inline\n // (usually theme / lang / search) is pulled out of the bar and rendered in\n // the mobile menu footer. The burger toggle then attaches to the previous\n // inline (typically primary actions) — or sits on its own when none exists.\n const shouldCollapseLastInline = collapseActions && mobile && lastInlineIndex !== -1\n let collapsedActionsInline: ReactElement<MInlineProps> | null = null\n let workingChildren = childArray\n let toggleHostIndex = lastInlineIndex\n if (shouldCollapseLastInline) {\n collapsedActionsInline = childArray[lastInlineIndex] as ReactElement<MInlineProps>\n workingChildren = childArray.filter((_, index) => index !== lastInlineIndex)\n toggleHostIndex = -1\n for (let index = workingChildren.length - 1; index >= 0; index -= 1) {\n const child = workingChildren[index]\n if (isValidElement(child) && child.type === MInline) {\n toggleHostIndex = index\n break\n }\n }\n }\n\n const renderedChildren =\n toggleHostIndex === -1\n ? [...workingChildren, toggleButton]\n : workingChildren.map((child, index) => {\n if (index !== toggleHostIndex) return child\n const inlineChild = child as ReactElement<MInlineProps>\n const inlineChildren = Children.toArray(inlineChild.props.children)\n return cloneElement(inlineChild, {\n key: inlineChild.key ?? `mnavbar-inline-${index}`,\n children: [...inlineChildren, toggleButton],\n })\n })\n\n useEffect(() => {\n if (!open) return\n\n function handlePointerDown(event: PointerEvent) {\n const root = rootRef.current\n if (!root) return\n if (event.target instanceof Node && root.contains(event.target)) return\n setOpen(false)\n }\n\n function handleKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape') setOpen(false)\n }\n\n document.addEventListener('pointerdown', handlePointerDown)\n document.addEventListener('keydown', handleKeydown)\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown)\n document.removeEventListener('keydown', handleKeydown)\n }\n }, [open])\n\n useEffect(() => {\n if (!mobile) {\n setOpen(false)\n }\n }, [mobile])\n\n function handleToggleClick() {\n setOpen((previous) => !previous)\n }\n\n function handleMenuClick(event: ReactMouseEvent<HTMLDivElement>) {\n const target = event.target as HTMLElement | null\n if (!target) return\n if (target.closest('a, [role=\"menuitem\"]')) {\n setOpen(false)\n }\n }\n\n return (\n <nav\n ref={rootRef}\n className={cn(\n 'navbar',\n tone,\n bordered && 'bordered',\n sticky && 'sticky',\n mobile && 'mobile-view',\n open && 'mobile-open',\n `mobile-${mobileMenu}`,\n className\n )}\n {...getHiddenProps(hidden)}\n {...rest}\n >\n <MContainer size={container} padded={padded} className=\"container\">\n <div className={cn('inner', justify, wrap && 'wrap')}>{renderedChildren}</div>\n </MContainer>\n\n {mobileMenu === 'drawer' && <div className={cn('mobile-backdrop', open && 'visible')} aria-hidden />}\n\n <div\n id={menuId}\n className={cn('mobile-menu', mobileMenu, open && 'open')}\n role=\"menu\"\n aria-hidden={!open || undefined}\n onClick={handleMenuClick}\n >\n {mobileNavs}\n {mobileMenuContent}\n {collapsedActionsInline ? (\n <div className=\"mobile-menu-footer\">\n {cloneElement(collapsedActionsInline, {\n key: 'mnavbar-collapsed-actions',\n })}\n </div>\n ) : null}\n {mobileMenuFooter ? <div className=\"mobile-menu-footer\">{mobileMenuFooter}</div> : null}\n </div>\n </nav>\n )\n}\n","import type React from 'react'\nimport type {MSectionProps} from './MSection.types'\nimport {getHiddenProps} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport './MSection.css'\n\n// Render a semantic page section with predefined spacing and tone.\nexport function MSection({\n as = 'section',\n spacing = 'lg',\n tone = 'default',\n hidden,\n className,\n style,\n children,\n ...rest\n}: MSectionProps) {\n const Component = as\n\n return (\n <Component\n className={cn('section', spacing, tone, className)}\n style={style}\n {...getHiddenProps(hidden)}\n {...rest}\n >\n {children}\n </Component>\n )\n}\n","import type {MStatGridProps} from './MStatGrid.types'\nimport {MSimpleGrid} from '../MSimpleGrid'\n\nexport function MStatGrid<T>({\n items,\n renderItem,\n children,\n columns = 4,\n minItemWidth = '15rem',\n ...rest\n}: MStatGridProps<T>) {\n return (\n <MSimpleGrid columns={columns} minItemWidth={minItemWidth} {...rest}>\n {items && renderItem ? items.map((item, index) => renderItem(item, index)) : children}\n </MSimpleGrid>\n )\n}\n","import type {MDividerProps} from './MDivider.types'\nimport {getHiddenProps} from '../../../theme'\nimport {cn} from '../../../utils/cn'\nimport {getLayoutUtilityClassNames, getLayoutUtilityStyles} from '../../../utils/layoutProps'\nimport './MDivider.css'\n\n// Render a semantic divider line between related content blocks.\nexport function MDivider({\n orientation = 'horizontal',\n variant = 'solid',\n hidden,\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n className,\n style,\n ...rest\n}: MDividerProps) {\n const utilityStyle = getLayoutUtilityStyles({fsize})\n\n return (\n <div\n role=\"separator\"\n aria-orientation={orientation}\n className={cn(\n 'divider',\n orientation,\n variant,\n ...getLayoutUtilityClassNames({\n spacing,\n padding,\n fsize,\n mt,\n mb,\n ml,\n mr,\n mx,\n my,\n pt,\n pb,\n pl,\n pr,\n px,\n py,\n fullWidth,\n }),\n className\n )}\n style={{...utilityStyle, ...style}}\n {...getHiddenProps(hidden)}\n {...rest}\n />\n )\n}\n","import {createContext, useContext, useState, useEffect, useCallback, useMemo} from 'react'\nimport {cn} from '../../../utils/cn'\nimport {MButton} from '../../controls'\nimport {MChevronRightIcon, MMenuIcon} from '../../../icons'\nimport {MDropdownMenu, MTooltip} from '../../overlays'\nimport {MShellBreakpoints, useMaxWidth} from '../../../theme'\nimport type {\n MSidebarProps,\n MSidebarHeaderProps,\n MSidebarBodyProps,\n MSidebarNavProps,\n MSidebarItemProps,\n MSidebarGroupProps,\n MSidebarFooterProps,\n MSidebarDividerProps,\n MSidebarMode,\n} from './MSidebar.types'\nimport './MSidebar.css'\n\nconst STORAGE_KEY = 'mineralui-sidebar'\n\ninterface SidebarContextValue {\n mode: MSidebarMode\n mobile: boolean\n mobileOpen: boolean\n canToggle: boolean\n toggleMode: () => void\n}\n\nconst SidebarCtx = createContext<SidebarContextValue>({\n mode: 'expanded',\n mobile: false,\n mobileOpen: false,\n canToggle: false,\n toggleMode: () => {},\n})\n\n// Read shared sidebar state inside slot components.\nfunction useSidebar() {\n return useContext(SidebarCtx)\n}\n\n// Render the sidebar shell and coordinate desktop and mobile behavior.\nexport function MSidebar({\n mode: modeProp = 'auto',\n defaultMode = 'expanded',\n onModeChange,\n persist = false,\n side = 'left',\n tone = 'subtle',\n bordered = true,\n mobileBreakpoint = MShellBreakpoints.mobile,\n compactBreakpoint = MShellBreakpoints.compact,\n className,\n style,\n children,\n}: MSidebarProps) {\n const resolvedCompactBreakpoint = Math.max(compactBreakpoint, mobileBreakpoint)\n const mobile = useMaxWidth(mobileBreakpoint)\n const compactViewport = useMaxWidth(resolvedCompactBreakpoint)\n const compact = !mobile && compactViewport\n const [mobileOpen, setMobileOpen] = useState(false)\n\n const [internalMode, setInternalMode] = useState<MSidebarMode>(() => {\n if (persist) {\n try {\n const v = localStorage.getItem(STORAGE_KEY)\n if (v === 'expanded' || v === 'collapsed') return v\n } catch {\n /* noop */\n }\n }\n\n return defaultMode\n })\n\n const resolvedMode: MSidebarMode = mobile\n ? 'expanded'\n : compact\n ? 'collapsed'\n : modeProp === 'auto'\n ? internalMode\n : modeProp === 'collapsed'\n ? 'collapsed'\n : 'expanded'\n\n // MToggle only the desktop width state. Mobile uses its own overlay flow.\n const toggleMode = useCallback(() => {\n const next: MSidebarMode = resolvedMode === 'expanded' ? 'collapsed' : 'expanded'\n\n setInternalMode(next)\n onModeChange?.(next)\n\n if (persist) {\n try {\n localStorage.setItem(STORAGE_KEY, next)\n } catch {\n /* noop */\n }\n }\n }, [resolvedMode, onModeChange, persist])\n\n const closeMobile = useCallback(() => setMobileOpen(false), [])\n\n // Let Escape close the temporary mobile drawer.\n useEffect(() => {\n if (!mobileOpen) return\n\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setMobileOpen(false)\n }\n\n document.addEventListener('keydown', handler)\n return () => document.removeEventListener('keydown', handler)\n }, [mobileOpen])\n\n useEffect(() => {\n if (!mobile) {\n setMobileOpen(false)\n }\n }, [mobile])\n\n const canToggle = !mobile && !compact && modeProp === 'auto'\n\n const ctx = useMemo<SidebarContextValue>(\n () => ({mode: resolvedMode, mobile, mobileOpen, canToggle, toggleMode}),\n [resolvedMode, mobile, mobileOpen, canToggle, toggleMode]\n )\n\n const isCollapsed = !mobile && resolvedMode === 'collapsed'\n\n const sidebarCls = cn(\n 'sidebar',\n tone,\n side,\n isCollapsed && 'collapsed',\n compact && 'compact',\n bordered && 'bordered',\n mobile && 'mobile',\n mobile && mobileOpen && 'mobile-open',\n className\n )\n\n return (\n <SidebarCtx.Provider value={ctx}>\n {mobile && mobileOpen && <div className=\"sidebar-backdrop\" onClick={closeMobile} />}\n\n <aside className={sidebarCls} style={style}>\n {children}\n </aside>\n\n {mobile && !mobileOpen && (\n <button\n className={cn('sidebar-hamburger', side)}\n onClick={() => setMobileOpen(true)}\n aria-label=\"Open menu\"\n >\n <span className=\"sidebar-hamburger-icon\" aria-hidden=\"true\">\n <MMenuIcon />\n </span>\n </button>\n )}\n </SidebarCtx.Provider>\n )\n}\n\n// Render the top area with branding and an optional collapse toggle.\nexport function MSidebarHeader({bordered = false, className, children}: MSidebarHeaderProps) {\n const {mode, mobile, canToggle, toggleMode} = useSidebar()\n const isCollapsed = !mobile && mode === 'collapsed'\n\n return (\n <div className={cn('sidebar-header', bordered && 'bordered', className)}>\n <div className=\"sidebar-header-content\">{children}</div>\n {canToggle && (\n <MButton\n variant=\"outlined\"\n color=\"neutral\"\n iconOnly\n size=\"sm\"\n onClick={toggleMode}\n aria-label={isCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n className=\"sidebar-toggle\"\n >\n <span className={cn('sidebar-chevron', isCollapsed && 'flipped')}>\n <MChevronRightIcon />\n </span>\n </MButton>\n )}\n </div>\n )\n}\n\n// Wrap the scrollable middle area between header and footer.\nexport function MSidebarBody({className, children}: MSidebarBodyProps) {\n return <div className={cn('sidebar-body', className)}>{children}</div>\n}\n\n// Wrap sidebar links in a navigation landmark.\nexport function MSidebarNav({className, children}: MSidebarNavProps) {\n return <nav className={cn('sidebar-nav', className)}>{children}</nav>\n}\n\n// Render one clickable sidebar row as a link, button or custom component.\nexport function MSidebarItem({\n icon,\n label,\n description,\n href,\n to,\n onClick,\n active = false,\n disabled = false,\n badge,\n color,\n component,\n className,\n}: MSidebarItemProps) {\n const {mode, mobile} = useSidebar()\n const isCollapsed = !mobile && mode === 'collapsed'\n\n // ONE tooltip per row: prefer description, fall back to label. The HTML\n // title attribute used in collapsed mode mirrors the same priority but is\n // limited to strings (browsers can't render ReactNodes).\n const tooltipContent = description ?? label\n const titleAttr = typeof description === 'string'\n ? description\n : typeof label === 'string'\n ? label\n : undefined\n\n const Tag = component ?? (href || to ? 'a' : 'button')\n const linkProps = component ? (to ? {to} : href ? {href} : {}) : href ? {href} : to ? {href: to} : {}\n const cls = cn('sidebar-item', active && 'active', disabled && 'disabled', color, className)\n\n return (\n <Tag\n className={cls}\n onClick={disabled ? undefined : onClick}\n aria-disabled={disabled || undefined}\n title={isCollapsed ? titleAttr : undefined}\n {...linkProps}\n >\n {icon && <span className=\"sidebar-item-icon\">{icon}</span>}\n {!isCollapsed && (\n <MTooltip content={tooltipContent} placement=\"top\" className=\"sidebar-item-label-tooltip\">\n <span className=\"sidebar-item-label\">{label}</span>\n </MTooltip>\n )}\n {!isCollapsed && badge && <span className=\"sidebar-item-badge\">{badge}</span>}\n </Tag>\n )\n}\n\n// Group related sidebar items and swap to a dropdown when collapsed.\nexport function MSidebarGroup({\n label,\n icon,\n active = false,\n defaultOpen = true,\n collapsible = true,\n children,\n className,\n}: MSidebarGroupProps) {\n const sidebarCtx = useSidebar()\n const {mode, mobile} = sidebarCtx\n const isCollapsed = !mobile && mode === 'collapsed'\n const [open, setOpen] = useState(defaultOpen)\n\n const expandedCtx = useMemo<SidebarContextValue>(() => ({...sidebarCtx, mode: 'expanded'}), [sidebarCtx])\n\n // Keep expand/collapse local to this group.\n const toggle = () => {\n if (collapsible) setOpen((o) => !o)\n }\n\n if (isCollapsed) {\n const trigger = (\n <span className={cn('sidebar-group-icon collapsed', active && 'active')} title={label}>\n {icon}\n </span>\n )\n\n return (\n <div className={cn('sidebar-group', className)}>\n <MDropdownMenu trigger={trigger} placement=\"right-start\" closeOnSelect openOn=\"hover\">\n <SidebarCtx.Provider value={expandedCtx}>{children}</SidebarCtx.Provider>\n </MDropdownMenu>\n </div>\n )\n }\n\n return (\n <div className={cn('sidebar-group', className)}>\n <button className={cn('sidebar-group-header', active && 'active')} onClick={toggle} aria-expanded={open}>\n {icon && <span className=\"sidebar-group-icon\">{icon}</span>}\n <span className=\"sidebar-group-label\">{label}</span>\n {collapsible && (\n <span className={cn('sidebar-group-arrow', open && 'open')}>\n <MChevronRightIcon />\n </span>\n )}\n </button>\n {open && <div className=\"sidebar-group-items\">{children}</div>}\n </div>\n )\n}\n\n// Render the bottom slot for version info or quick actions.\nexport function MSidebarFooter({bordered = false, className, children}: MSidebarFooterProps) {\n return <div className={cn('sidebar-footer', bordered && 'bordered', className)}>{children}</div>\n}\n\n// Render a spacing-aware divider between sidebar regions.\nexport function MSidebarDivider({className, spacing = 'md'}: MSidebarDividerProps) {\n return <hr className={cn('sidebar-divider', spacing, className)} />\n}\n","import {useMemo} from 'react'\nimport {cn} from '../../../utils/cn'\nimport type {MBreadcrumbProps} from './MBreadcrumb.types'\nimport './MBreadcrumb.css'\n\n// Render a compact path and collapse the middle when needed.\nexport function MBreadcrumb({items, separator = '/', maxItems, className, ...rest}: MBreadcrumbProps) {\n // Keep the current page visible while shortening deep paths.\n const visible = useMemo(() => {\n if (!maxItems || maxItems >= items.length) return items\n if (maxItems < 2) return [items[items.length - 1]]\n const head = items.slice(0, 1)\n const tail = items.slice(-(maxItems - 1))\n return [...head, null, ...tail]\n }, [items, maxItems])\n\n return (\n <nav aria-label=\"breadcrumb\" className={cn('breadcrumb', className)} {...rest}>\n <ol className=\"trail\">\n {visible.map((item, i) => {\n if (item === null) {\n return (\n <li key=\"ellipsis\" className=\"crumb dots\">\n <span className=\"sep\">{separator}</span>\n <span>&#8230;</span>\n </li>\n )\n }\n\n const isLast = i === visible.length - 1\n\n return (\n <li key={i} className={cn('crumb', isLast && 'active')}>\n {i > 0 && <span className=\"sep\">{separator}</span>}\n {item.href && !isLast ? (\n <a href={item.href} className=\"link\" onClick={item.onClick}>\n {item.label}\n </a>\n ) : item.onClick && !isLast ? (\n <button type=\"button\" className=\"link btn\" onClick={item.onClick}>\n {item.label}\n </button>\n ) : (\n <span className=\"current\" aria-current={isLast ? 'page' : undefined}>\n {item.label}\n </span>\n )}\n </li>\n )\n })}\n </ol>\n </nav>\n )\n}\n","import {forwardRef, Children, isValidElement} from 'react'\nimport type * as React from 'react'\nimport type {MAppShellProps, MBodyProps} from './MAppShell.types'\nimport {cn} from '../../../utils/cn'\nimport {MSidebar} from '../MSidebar'\nimport './MAppShell.css'\n\nexport const MAppShell = forwardRef<HTMLDivElement, MAppShellProps>(function MAppShell(\n {className, children, ...rest},\n ref\n) {\n const sidebarElements: React.ReactNode[] = []\n const otherElements: React.ReactNode[] = []\n\n Children.forEach(children, (child) => {\n if (isValidElement(child) && child.type === MSidebar) {\n sidebarElements.push(child)\n } else {\n otherElements.push(child)\n }\n })\n\n return (\n <div ref={ref} className={cn('app-shell', className)} {...rest}>\n {sidebarElements}\n <div className=\"app-main\">{otherElements}</div>\n </div>\n )\n})\n\nexport const MBody = forwardRef<HTMLDivElement, MBodyProps>(function MBody({className, children, ...rest}, ref) {\n return (\n <div ref={ref} className={cn('app-body', className)} {...rest}>\n {children}\n </div>\n )\n})\n","import {useEffect, useRef, useState, type ReactNode} from 'react'\n\ninterface ScaleToFitProps {\n /**\n * Minimum render width (in CSS px). When the parent is narrower, content\n * is rendered at this width and scaled down. When the parent is wider,\n * content is rendered at the parent's width (no scale-up, no padding).\n */\n baseWidth?: number\n children: ReactNode\n}\n\n/**\n * Renders `children` at `max(baseWidth, parentWidth)`, then applies\n * `transform: scale(...)` so the rendered block fits the parent box without\n * scrollbars. Scale never exceeds 1 (no blurry up-scaling). When the parent\n * is wider than baseWidth, render width tracks the parent so content fills\n * the available space natively (no horizontal padding).\n */\nexport function ScaleToFit({baseWidth = 480, children}: ScaleToFitProps) {\n const wrapperRef = useRef<HTMLDivElement>(null)\n const contentRef = useRef<HTMLDivElement>(null)\n const [scale, setScale] = useState(1)\n const [renderWidth, setRenderWidth] = useState<number>(baseWidth)\n\n useEffect(() => {\n const wrap = wrapperRef.current\n const content = contentRef.current\n if (!wrap || !content) return\n\n let frame = 0\n const recompute = () => {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(() => {\n const wW = wrap.clientWidth\n const wH = wrap.clientHeight\n if (wW === 0 || wH === 0) return\n const cW = Math.max(baseWidth, wW)\n const cH = content.offsetHeight\n if (cW === 0 || cH === 0) return\n const sW = wW / cW\n const sH = wH / cH\n const next = Math.min(sW, sH, 1)\n if (next > 0 && Number.isFinite(next)) {\n setRenderWidth(cW)\n setScale(next)\n }\n })\n }\n\n const ro = new ResizeObserver(recompute)\n ro.observe(wrap)\n ro.observe(content)\n recompute()\n return () => {\n cancelAnimationFrame(frame)\n ro.disconnect()\n }\n }, [baseWidth])\n\n return (\n <div ref={wrapperRef} className=\"canvas-grid-scale-wrapper\">\n <div\n ref={contentRef}\n className=\"canvas-grid-scale-content\"\n style={{width: `${renderWidth}px`, transform: `scale(${scale})`}}\n >\n {children}\n </div>\n </div>\n )\n}\n","import {forwardRef, useCallback, useEffect, useRef, useState} from 'react'\nimport type {CSSProperties, ForwardedRef, PointerEvent as ReactPointerEvent, ReactElement, Ref} from 'react'\nimport type {MCanvasGridItem, MCanvasGridPosition, MCanvasGridProps} from './MCanvasGrid.types'\nimport {cn} from '../../../utils/cn'\nimport {MShellBreakpoints, useMaxWidth} from '../../../theme'\nimport {MEditIcon, MMoveIcon, MTrashIcon, MZoomInIcon} from '../../../icons'\nimport {MButton} from '../../controls/MButton'\nimport {MButtonGroup} from '../../controls/MButtonGroup'\nimport {ScaleToFit} from './ScaleToFit'\nimport './MCanvasGrid.css'\n\ninterface DragState {\n itemId: string\n mode: 'drag' | 'resize'\n startClientX: number\n startClientY: number\n original: MCanvasGridPosition\n}\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value))\n}\n\nfunction MCanvasGridInner<T extends MCanvasGridItem>(\n {\n columns = 24,\n rows = 24,\n snap = 4,\n items,\n renderItem,\n minItemSize,\n maxItemSize: _maxItemSize,\n editable = false,\n onItemMove,\n onItemResize,\n onItemRemove,\n onItemEdit,\n onItemExpand,\n guides = 'always',\n compactBreakpoint = MShellBreakpoints.compact,\n mobileBreakpoint = MShellBreakpoints.mobile,\n height,\n fitContent = 'scroll',\n fitContentBaseWidth = 480,\n className,\n style,\n }: MCanvasGridProps<T>,\n ref: ForwardedRef<HTMLDivElement>\n) {\n const innerRef = useRef<HTMLDivElement | null>(null)\n const [size, setSize] = useState({width: 0, height: 0})\n const [drag, setDrag] = useState<DragState | null>(null)\n const [preview, setPreview] = useState<MCanvasGridPosition | null>(null)\n const [touchOrder, setTouchOrder] = useState<Record<string, number>>({})\n const touchCounterRef = useRef(0)\n\n function bringToFront(itemId: string) {\n touchCounterRef.current += 1\n setTouchOrder((prev) => ({...prev, [itemId]: touchCounterRef.current}))\n }\n\n function suppressNextClick() {\n let armed = true\n const stopper = (ev: MouseEvent) => {\n if (!armed) return\n armed = false\n ev.stopPropagation()\n ev.preventDefault()\n window.removeEventListener('click', stopper, true)\n }\n window.addEventListener('click', stopper, true)\n window.setTimeout(() => {\n if (!armed) return\n armed = false\n window.removeEventListener('click', stopper, true)\n }, 60)\n }\n\n const isMobile = useMaxWidth(mobileBreakpoint)\n const isCompact = useMaxWidth(compactBreakpoint) && !isMobile\n\n const totalCols = columns * snap\n const totalRows = rows * snap\n const effectiveCols = isCompact ? Math.max(1, Math.round(totalCols / 2)) : totalCols\n const effectiveRows = isCompact ? Math.max(1, Math.round(totalRows / 2)) : totalRows\n const effectiveCells = isCompact ? Math.max(1, Math.round(columns / 2)) : columns\n const effectiveRowCells = isCompact ? Math.max(1, Math.round(rows / 2)) : rows\n\n const interactive = editable && !isMobile\n\n useEffect(() => {\n const node = innerRef.current\n if (!node || typeof ResizeObserver === 'undefined') return\n const update = () => setSize({width: node.clientWidth, height: node.clientHeight})\n update()\n const observer = new ResizeObserver(update)\n observer.observe(node)\n return () => observer.disconnect()\n }, [])\n\n const setRefs = useCallback(\n (node: HTMLDivElement | null) => {\n innerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as {current: HTMLDivElement | null}).current = node\n },\n [ref]\n )\n\n function getMin(item: T) {\n const m = minItemSize?.(item)\n if (!m) return {w: snap, h: snap}\n return {w: Math.max(snap, m.w * snap), h: Math.max(snap, m.h * snap)}\n }\n\n function startResize(e: ReactPointerEvent<HTMLDivElement>, item: T) {\n if (!interactive) return\n e.stopPropagation()\n e.preventDefault()\n ;(e.currentTarget as Element).setPointerCapture(e.pointerId)\n bringToFront(item.id)\n setDrag({\n itemId: item.id,\n mode: 'resize',\n startClientX: e.clientX,\n startClientY: e.clientY,\n original: {...item.position},\n })\n setPreview({...item.position})\n }\n\n function startDragFromHeader(e: ReactPointerEvent<HTMLDivElement>, item: T) {\n if (!interactive) return\n if ((e.target as Element).closest('button, [role=\"button\"]')) return\n e.stopPropagation()\n e.preventDefault()\n ;(e.currentTarget as Element).setPointerCapture(e.pointerId)\n bringToFront(item.id)\n setDrag({\n itemId: item.id,\n mode: 'drag',\n startClientX: e.clientX,\n startClientY: e.clientY,\n original: {...item.position},\n })\n setPreview({...item.position})\n }\n\n function handlePointerMove(e: ReactPointerEvent<HTMLDivElement>) {\n if (!drag || size.width === 0 || size.height === 0) return\n const cellPxX = size.width / effectiveCols\n const cellPxY = size.height / effectiveRows\n const dx = Math.round((e.clientX - drag.startClientX) / cellPxX)\n const dy = Math.round((e.clientY - drag.startClientY) / cellPxY)\n const original = drag.original\n\n const targetItem = items.find((it) => it.id === drag.itemId)\n const min = targetItem ? getMin(targetItem) : {w: snap, h: snap}\n\n if (drag.mode === 'drag') {\n const x = clamp(original.x + dx, 0, effectiveCols - original.w)\n const y = clamp(original.y + dy, 0, effectiveRows - original.h)\n setPreview({x, y, w: original.w, h: original.h})\n } else {\n const w = clamp(original.w + dx, min.w, effectiveCols - original.x)\n const h = clamp(original.h + dy, min.h, effectiveRows - original.y)\n setPreview({x: original.x, y: original.y, w, h})\n }\n }\n\n function handlePointerUp(e: ReactPointerEvent<HTMLDivElement>) {\n if (!drag) return\n try {\n ;(e.currentTarget as Element).releasePointerCapture(e.pointerId)\n } catch {\n // pointer may have already been released\n }\n if (preview) {\n if (drag.mode === 'drag') onItemMove?.(drag.itemId, preview)\n else onItemResize?.(drag.itemId, preview)\n }\n setDrag(null)\n setPreview(null)\n }\n\n function handleHeaderPointerUp(e: ReactPointerEvent<HTMLDivElement>) {\n if (drag) {\n suppressNextClick()\n handlePointerUp(e)\n }\n }\n\n const guidesOn =\n guides === 'always' ||\n (guides === 'on-edit' && interactive) ||\n (guides === 'on-drag' && drag !== null)\n\n const heightStyle: CSSProperties | undefined =\n height !== undefined ? {height: typeof height === 'number' ? `${height}px` : height} : undefined\n\n if (isMobile) {\n const ordered = [...items].sort((a, b) => a.position.y - b.position.y)\n return (\n <div\n ref={setRefs}\n className={cn('canvas-grid', 'mobile', className)}\n data-guides=\"off\"\n style={{...heightStyle, ...style}}\n >\n {ordered.map((item) => (\n <div key={item.id} className=\"canvas-grid-item\">\n {renderItem(item)}\n </div>\n ))}\n </div>\n )\n }\n\n const gridStyle: CSSProperties = {\n ...heightStyle,\n ...style,\n gridTemplateColumns: `repeat(${effectiveCols}, 1fr)`,\n gridTemplateRows: `repeat(${effectiveRows}, 1fr)`,\n ['--canvas-grid-cells' as string]: String(effectiveCells),\n ['--canvas-grid-row-cells' as string]: String(effectiveRowCells),\n }\n\n const overlayCells = effectiveCells * effectiveRowCells\n\n return (\n <div\n ref={setRefs}\n className={cn('canvas-grid', isCompact && 'compact', interactive && 'editable', className)}\n data-guides={guidesOn ? 'on' : 'off'}\n style={gridStyle}\n >\n <div className=\"canvas-grid-overlay\" aria-hidden>\n {Array.from({length: overlayCells}, (_, idx) => {\n const isLastCol = (idx + 1) % effectiveCells === 0\n const isLastRow = idx >= overlayCells - effectiveCells\n return (\n <div\n key={idx}\n className={cn('canvas-grid-cell', isLastCol && 'no-right', isLastRow && 'no-bottom')}\n />\n )\n })}\n </div>\n\n {items.map((item) => {\n const isDragging = drag?.itemId === item.id\n const live = isDragging && preview ? preview : item.position\n // half-precision math for compact viewport\n const x = isCompact ? Math.round(live.x / 2) : live.x\n const y = isCompact ? Math.round(live.y / 2) : live.y\n const w = Math.max(1, isCompact ? Math.round(live.w / 2) : live.w)\n const h = Math.max(1, isCompact ? Math.round(live.h / 2) : live.h)\n\n const baseZ = 1 + (touchOrder[item.id] ?? 0)\n const itemStyle: CSSProperties = {\n gridColumn: `${x + 1} / span ${w}`,\n gridRow: `${y + 1} / span ${h}`,\n zIndex: isDragging ? baseZ + 100 : baseZ,\n }\n\n return (\n <div\n key={item.id}\n className={cn('canvas-grid-item', isDragging && 'dragging')}\n style={itemStyle}\n >\n <div\n className=\"canvas-grid-item-header\"\n onPointerDown={(e) => startDragFromHeader(e, item)}\n onPointerMove={handlePointerMove}\n onPointerUp={handleHeaderPointerUp}\n onPointerCancel={handlePointerUp}\n >\n <MButtonGroup variant=\"ghost\" size=\"xs\">\n {interactive && onItemEdit && (\n <MButton\n color=\"primary\"\n iconOnly\n aria-label=\"Edit tile\"\n startIcon={<MEditIcon />}\n onPointerDown={(e) => e.stopPropagation()}\n onClick={(e) => {\n e.stopPropagation()\n onItemEdit(item.id)\n }}\n />\n )}\n {onItemExpand && (\n <MButton\n color=\"primary\"\n iconOnly\n aria-label=\"Expand tile\"\n startIcon={<MZoomInIcon />}\n onPointerDown={(e) => e.stopPropagation()}\n onClick={(e) => {\n e.stopPropagation()\n onItemExpand(item.id)\n }}\n />\n )}\n {interactive && onItemRemove && (\n <MButton\n color=\"error\"\n iconOnly\n aria-label=\"Remove tile\"\n startIcon={<MTrashIcon />}\n onPointerDown={(e) => e.stopPropagation()}\n onClick={(e) => {\n e.stopPropagation()\n onItemRemove(item.id)\n }}\n />\n )}\n </MButtonGroup>\n </div>\n <div className=\"canvas-grid-item-body\">\n {fitContent === 'scale' ? (\n <ScaleToFit baseWidth={fitContentBaseWidth}>{renderItem(item)}</ScaleToFit>\n ) : (\n renderItem(item)\n )}\n </div>\n {!interactive && onItemExpand && (\n <MButton\n className=\"canvas-grid-view-expand-handle\"\n variant=\"filled\"\n shape=\"circle\"\n size=\"sm\"\n color=\"primary\"\n iconOnly\n aria-label=\"Expand tile\"\n startIcon={<MZoomInIcon />}\n onClick={(e) => {\n e.stopPropagation()\n onItemExpand(item.id)\n }}\n />\n )}\n {interactive && isDragging && (\n <div className=\"canvas-grid-item-glass\" aria-hidden>\n <MMoveIcon size={28} />\n </div>\n )}\n {interactive && (\n <div\n className=\"canvas-grid-resize-handle\"\n aria-hidden\n onPointerDown={(e) => startResize(e, item)}\n onPointerMove={handlePointerMove}\n onPointerUp={(e) => {\n if (drag) suppressNextClick()\n handlePointerUp(e)\n }}\n onPointerCancel={handlePointerUp}\n />\n )}\n </div>\n )\n })}\n </div>\n )\n}\n\nexport const MCanvasGrid = forwardRef(MCanvasGridInner) as <T extends MCanvasGridItem>(\n props: MCanvasGridProps<T> & {ref?: Ref<HTMLDivElement>}\n) => ReactElement | null\n","import {forwardRef, useEffect, useImperativeHandle, useRef, useState} from 'react'\nimport type * as React from 'react'\nimport type {MStickyPanelProps} from './MStickyPanel.types'\nimport {cn} from '../../../utils/cn'\nimport './MStickyPanel.css'\n\nconst INTERACTIVE_SELECTOR = 'button, a, [role=\"button\"]'\n\n// Sticky side-rail panel: sticks to the viewport at `top`, fills viewport-relative height,\n// scrolls internally with an optional hidden scrollbar and click-and-drag scrolling.\nexport const MStickyPanel = forwardRef<HTMLDivElement, MStickyPanelProps>(function MStickyPanel(\n {\n children,\n top = 16,\n bottomGap = 16,\n hideScrollbar = true,\n draggable = true,\n className,\n style,\n ...rest\n },\n forwardedRef\n) {\n const panelRef = useRef<HTMLDivElement>(null)\n useImperativeHandle(forwardedRef, () => panelRef.current as HTMLDivElement)\n const dragState = useRef<{startY: number; startScrollTop: number} | null>(null)\n const [dragging, setDragging] = useState(false)\n\n useEffect(() => {\n if (!draggable) return\n\n const handleMouseMove = (event: MouseEvent) => {\n const drag = dragState.current\n const panel = panelRef.current\n if (!drag || !panel) return\n panel.scrollTop = drag.startScrollTop - (event.clientY - drag.startY)\n }\n\n const handleMouseUp = () => {\n if (!dragState.current) return\n dragState.current = null\n setDragging(false)\n }\n\n window.addEventListener('mousemove', handleMouseMove)\n window.addEventListener('mouseup', handleMouseUp)\n return () => {\n window.removeEventListener('mousemove', handleMouseMove)\n window.removeEventListener('mouseup', handleMouseUp)\n }\n }, [draggable])\n\n const handleMouseDown = (event: React.MouseEvent<HTMLDivElement>) => {\n if (!draggable) return\n // Skip drag start when the click originated on an interactive descendant\n // (button, link, role=button) so triggers like MDropdownMenu, MButton or\n // <Link> stay clickable inside the panel.\n const target = event.target as HTMLElement | null\n if (target && target.closest(INTERACTIVE_SELECTOR)) return\n\n const panel = panelRef.current\n if (!panel) return\n\n dragState.current = {startY: event.clientY, startScrollTop: panel.scrollTop}\n setDragging(true)\n event.preventDefault()\n }\n\n const mergedStyle: React.CSSProperties = {\n top,\n height: `calc(100vh - ${top + bottomGap}px)`,\n ...style,\n }\n\n return (\n <div\n ref={panelRef}\n className={cn(\n 'm-sticky-panel',\n draggable && 'draggable',\n dragging && 'is-dragging',\n hideScrollbar && 'hide-scrollbar',\n className\n )}\n style={mergedStyle}\n onMouseDown={handleMouseDown}\n {...rest}\n >\n {children}\n </div>\n )\n})\n"],"mappings":"ifAOA,SAAgB,EAAW,CACvB,OAAO,UACP,SAAS,GACT,SACA,UACA,UACA,QACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,YACA,YACA,QACA,WACA,GAAG,GACa,CAChB,IAAM,EAAe,EAAA,EAAuB,CAAC,QAAM,CAAC,CAEpD,OACI,EAAA,EAAA,KAAC,MAAD,CACI,UAAW,EAAA,EACP,YACA,EACA,GAAU,SACV,GAAG,EAAA,EAA2B,CAC1B,UACA,UACA,QACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,YACH,CAAC,CACF,EACH,CACD,MAAO,CAAC,GAAG,EAAc,GAAG,EAAM,CAClC,GAAI,EAAA,EAAe,EAAO,CAC1B,GAAI,EAEH,WACC,CAAA,CC1Dd,SAAgB,EAAQ,CACpB,YAAY,OACZ,SAAS,GACT,WAAW,GACX,SAAS,GACT,OAAO,UACP,SAAS,QACT,SACA,YACA,WACA,GAAG,GACU,CACb,OACI,EAAA,EAAA,KAAC,SAAD,CACI,UAAW,EAAA,EAAG,SAAU,EAAM,GAAY,WAAY,GAAU,SAAU,EAAU,CACpF,GAAI,EAAA,EAAe,EAAO,CAC1B,GAAI,YAEJ,EAAA,EAAA,KAAC,EAAD,CAAY,KAAM,EAAmB,SAAQ,UAAW,EAAA,EAAG,QAAS,UAAU,IAAS,CAClF,WACQ,CAAA,CACR,CAAA,CCpBjB,SAAgB,EAAQ,CACpB,YAAY,OACZ,SAAS,GACT,WAAW,GACX,OAAO,UACP,SACA,UACA,UACA,QACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,YACA,YACA,QACA,WACA,GAAG,GACU,CACb,IAAM,EAAe,EAAA,EAAuB,CAAC,QAAM,CAAC,CAEpD,OACI,EAAA,EAAA,KAAC,SAAD,CACI,UAAW,EAAA,EACP,SACA,EACA,GAAY,WACZ,GAAG,EAAA,EAA2B,CAC1B,UACA,UACA,QACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,YACH,CAAC,CACF,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"}
package/dist/layout.cjs CHANGED
@@ -1,3 +1,3 @@
1
1
  const {ensureStyles}=require('./style-runtime.cjs')
2
2
  ensureStyles()
3
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./layout-CfolwT8L.cjs`),t=require(`./MSurface-CYeVFOw_.cjs`),n=require(`./MGrid-B_0kFUws.cjs`),r=require(`./MStack-BP_BUeCc.cjs`),i=require(`./MSimpleGrid-BwNfaxQP.cjs`),a=require(`./MPagination-C6QQdEj_.cjs`);exports.MAppShell=e.r,exports.MBody=e.i,exports.MBreadcrumb=e.a,exports.MCanvasGrid=e.n,exports.MContainer=e.x,exports.MDivider=e.m,exports.MFooter=e.y,exports.MGrid=n.t,exports.MGridItem=n.n,exports.MHeader=e.b,exports.MInline=t.n,exports.MNavbar=e._,exports.MNavs=e.v,exports.MPagination=a.t,exports.MSection=e.g,exports.MSidebar=e.o,exports.MSidebarBody=e.s,exports.MSidebarDivider=e.c,exports.MSidebarFooter=e.l,exports.MSidebarGroup=e.u,exports.MSidebarHeader=e.d,exports.MSidebarItem=e.f,exports.MSidebarNav=e.p,exports.MSimpleGrid=i.t,exports.MStack=r.t,exports.MStatGrid=e.h,exports.MStickyPanel=e.t,exports.MSurface=t.t,exports.MTabs=n.r;
3
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./layout-Ddo7HUPu.cjs`),t=require(`./MSurface-CYeVFOw_.cjs`),n=require(`./MGrid-B_0kFUws.cjs`),r=require(`./MStack-BP_BUeCc.cjs`),i=require(`./MSimpleGrid-BwNfaxQP.cjs`),a=require(`./MPagination-C6QQdEj_.cjs`);exports.MAppShell=e.r,exports.MBody=e.i,exports.MBreadcrumb=e.a,exports.MCanvasGrid=e.n,exports.MContainer=e.x,exports.MDivider=e.m,exports.MFooter=e.y,exports.MGrid=n.t,exports.MGridItem=n.n,exports.MHeader=e.b,exports.MInline=t.n,exports.MNavbar=e._,exports.MNavs=e.v,exports.MPagination=a.t,exports.MSection=e.g,exports.MSidebar=e.o,exports.MSidebarBody=e.s,exports.MSidebarDivider=e.c,exports.MSidebarFooter=e.l,exports.MSidebarGroup=e.u,exports.MSidebarHeader=e.d,exports.MSidebarItem=e.f,exports.MSidebarNav=e.p,exports.MSimpleGrid=i.t,exports.MStack=r.t,exports.MStatGrid=e.h,exports.MStickyPanel=e.t,exports.MSurface=t.t,exports.MTabs=n.r;
package/dist/layout.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {ensureStyles} from './style-runtime.js'
2
2
  ensureStyles()
3
- import { _ as e, a as t, b as n, c as r, d as i, f as a, g as o, h as s, i as c, l, m as u, n as d, o as f, p, r as m, s as h, t as g, u as _, v, x as y, y as b } from "./layout-i8H5tIbO.js";
3
+ import { _ as e, a as t, b as n, c as r, d as i, f as a, g as o, h as s, i as c, l, m as u, n as d, o as f, p, r as m, s as h, t as g, u as _, v, x as y, y as b } from "./layout-CdSpVJuK.js";
4
4
  import { n as x, t as S } from "./MSurface-B-sjyczH.js";
5
5
  import { n as C, r as w, t as T } from "./MGrid-CYL3cbUI.js";
6
6
  import { t as E } from "./MStack-CSCw6to2.js";
@@ -1,2 +1,2 @@
1
- const e=require(`./icons-D675Im0B.cjs`),t=require(`./cn-CU5TNITO.cjs`),n=require(`./useKeyboardNav-HVG9JFD2.cjs`),r=require(`./MPortal-BciZHNDC.cjs`),i=require(`./MPopover-Cweomcj2.cjs`),a=require(`./MSurface-CYeVFOw_.cjs`),o=require(`./MText-j6Zbbj5Y.cjs`),s=require(`./MHeading-BLnb3dNv.cjs`),c=require(`./MKbd-n4fhKIxb.cjs`),l=require(`./MButton-R08y1HCT.cjs`),u=require(`./MSkeleton-CLSU5pL6.cjs`),d=require(`./MStack-BP_BUeCc.cjs`),f=require(`./MSimpleGrid-BwNfaxQP.cjs`),p=require(`./MCard-1OVOl4Ql.cjs`),m=require(`./MInputSearch-9wcXlY8-.cjs`),h=require(`./MTooltip-BEfO9jTe.cjs`);require(`./core-DBpQf3uY.cjs`);let g=require(`react`),_=require(`react/jsx-runtime`);var v=540;function y({open:e,onClose:n,title:i,description:a,footer:o,size:s=`md`,closeOnBackdrop:c=!0,closeOnEscape:l=!0,className:u,children:d,...f}){let[m,h]=(0,g.useState)(!1),[y,b]=(0,g.useState)(!1),x=(0,g.useRef)(null);return(0,g.useEffect)(()=>{e&&(h(!0),b(!1))},[e]),(0,g.useEffect)(()=>{if(!e&&m){b(!0);let e=setTimeout(()=>{h(!1),b(!1)},v);return()=>clearTimeout(e)}},[e,m]),(0,g.useEffect)(()=>{if(!e||!l)return;let t=e=>{e.key===`Escape`&&n()};return document.addEventListener(`keydown`,t),()=>document.removeEventListener(`keydown`,t)},[l,n,e]),(0,g.useEffect)(()=>{if(!m)return;let e=document.body.style.overflow;return document.body.style.overflow=`hidden`,()=>{document.body.style.overflow=e}},[m]),m?(0,_.jsx)(r.t,{children:(0,_.jsx)(`div`,{ref:x,className:t.t(`mineral-backdrop`,`modal-backdrop`,y&&`closing`),onMouseDown:e=>{c&&e.target===e.currentTarget&&n()},children:(0,_.jsx)(`div`,{className:`modal-shell`,children:(0,_.jsxs)(p.t,{className:t.t(`modal`,s,u),role:`dialog`,"aria-modal":`true`,"aria-labelledby":i?`mineral-modal-title`:void 0,...f,children:[(i||a)&&(0,_.jsxs)(p.i,{children:[i&&(0,_.jsx)(`div`,{id:`mineral-modal-title`,className:`modal-title`,children:i}),a&&(0,_.jsx)(`div`,{className:`modal-description`,children:a})]}),(0,_.jsx)(p.n,{children:d}),o&&(0,_.jsx)(p.r,{children:o})]})})})}):null}var b=540,x=72,S={sm:`32vh`,md:`52vh`,lg:`72vh`,full:`92vh`};function C({open:n,onClose:i,title:a,description:o,footer:s,size:c=`md`,closeOnBackdrop:u=!0,closeOnEscape:d=!0,className:f,children:m,style:h,...v}){let y=(0,g.useId)(),[C,w]=(0,g.useState)(!1),[T,E]=(0,g.useState)(!1),[D,O]=(0,g.useState)(0),k=(0,g.useRef)(null),A=(0,g.useRef)(0);(0,g.useEffect)(()=>{n&&(w(!0),E(!1),O(0),A.current=0)},[n]),(0,g.useEffect)(()=>{if(!n&&C){E(!0);let e=window.setTimeout(()=>{w(!1),E(!1)},b);return()=>window.clearTimeout(e)}},[n,C]),(0,g.useEffect)(()=>{if(!C)return;let e=document.body.style.overflow;return document.body.style.overflow=`hidden`,()=>{document.body.style.overflow=e}},[C]),(0,g.useEffect)(()=>{if(!n||!d)return;let e=e=>{e.key===`Escape`&&i()};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[d,i,n]);function j(e){u&&e.target===e.currentTarget&&i()}function M(e){e.preventDefault(),e.currentTarget.setPointerCapture(e.pointerId),k.current={pointerId:e.pointerId,startY:e.clientY},O(0),A.current=0}function N(e){let t=k.current;if(!t||t.pointerId!==e.pointerId)return;let n=Math.max(e.clientY-t.startY,0);A.current=n,O(n)}function P(e){let t=k.current;if(!(!t||t.pointerId!==e)){if(k.current=null,A.current>x){O(0),A.current=0,i();return}O(0),A.current=0}}if(!C)return null;let F=S[c],I=D>0?`translateY(${D}px)`:void 0;return(0,_.jsx)(r.t,{children:(0,_.jsx)(`div`,{className:t.t(`mineral-backdrop`,`sheet-backdrop`,T&&`closing`),onMouseDown:j,children:(0,_.jsx)(`div`,{className:`sheet-shell`,style:{transform:I},children:(0,_.jsxs)(p.t,{className:t.t(`sheet`,`size-${c}`,f),role:`dialog`,"aria-modal":`true`,"aria-labelledby":a?y:void 0,style:{...h,height:c===`full`?F:void 0,maxHeight:F},...v,children:[(0,_.jsx)(`button`,{type:`button`,className:`sheet-grabber`,onPointerDown:M,onPointerMove:N,onPointerUp:e=>P(e.pointerId),onPointerCancel:e=>P(e.pointerId),"aria-label":`Drag down to close`,children:(0,_.jsx)(`span`,{className:`sheet-handle`})}),(a||o)&&(0,_.jsxs)(p.i,{className:`sheet-header`,children:[(0,_.jsxs)(`div`,{className:`sheet-copy`,children:[a&&(0,_.jsx)(`div`,{id:y,className:`sheet-title`,children:a}),o&&(0,_.jsx)(`div`,{className:`sheet-description`,children:o})]}),(0,_.jsx)(l.t,{variant:`link`,color:`neutral`,iconOnly:!0,size:`sm`,onClick:i,"aria-label":`Close`,className:`sheet-close`,children:(0,_.jsx)(e.Xi,{})})]}),(0,_.jsx)(p.n,{className:`sheet-body`,children:m}),s&&(0,_.jsx)(p.r,{className:`sheet-footer`,children:s})]})})})})}function w(e){return typeof e==`string`||typeof e==`number`?e.toString():``}function T(e,t){let n=t.toLowerCase().replace(/\s+/g,``).split(`+`),r=n[n.length-1];if(!r)return!1;let i=n.includes(`ctrl`),a=n.includes(`meta`)||n.includes(`cmd`),o=n.includes(`shift`),s=n.includes(`alt`)||n.includes(`option`);return e.key.toLowerCase()===r&&!!i===e.ctrlKey&&!!a===e.metaKey&&!!o===e.shiftKey&&!!s===e.altKey}function E(e,t){if(!t.trim())return e;let n=t.trim().toLowerCase();return e.filter(e=>[w(e.title),w(e.description),w(e.group),w(e.actionLabel),...e.keywords??[]].some(e=>e.toLowerCase().includes(n)))}function D(e){let t=new Map;return e.forEach(e=>{let n=w(e.group)||`General`,r=t.get(n)??{label:e.group??`General`,items:[]};r.items.push(e),t.set(n,r)}),Array.from(t.values())}function O({items:r,featuredItems:i=[],open:v,defaultOpen:y=!1,onOpenChange:b,onSelect:x,title:S=`Command palette`,description:O,trigger:k,shortcut:A=`ctrl+k`,placeholder:j=`Search modules, records and actions...`,emptyLabel:M=`No matching results.`,footer:N,size:P=`lg`,closeOnSelect:F=!0}){let[I,L]=(0,g.useState)(y),[R,z]=(0,g.useState)(``),[B,V]=(0,g.useState)(null),H=v!==void 0,U=H?v:I,W=(0,g.useRef)(null);function G(e){H||L(e),b?.(e)}let K=(0,g.useMemo)(()=>E(r,R),[r,R]),q=(0,g.useMemo)(()=>D(K),[K]),J=(0,g.useMemo)(()=>q.flatMap(e=>e.items),[q]),Y=(0,g.useMemo)(()=>i.length?i:r.slice(0,6),[i,r]);function X(e){e.onSelect?.(),x?.(e),!e.onSelect&&e.href&&window.location.assign(e.href),F&&(G(!1),z(``),V(null))}let{activeIndex:Z,setActiveIndex:Q,resetIndex:$,onKeyDown:ee}=n.t({itemCount:J.length,isOpen:U,onClose:()=>G(!1),onSelect:e=>{let t=J[e];t&&X(t)}});(0,g.useEffect)(()=>{let e=e=>{T(e,A)&&(e.preventDefault(),G(!0))};return window.addEventListener(`keydown`,e),()=>{window.removeEventListener(`keydown`,e)}},[A]),(0,g.useEffect)(()=>{if(!U){$(),V(null);return}queueMicrotask(()=>W.current?.focus())},[U,$]),(0,g.useEffect)(()=>{if(Z<0||Z>=J.length){V(null);return}V(J[Z]?.id??null)},[Z,J]);function te(e){ee(e)}return(0,_.jsxs)(_.Fragment,{children:[k??(0,_.jsx)(l.t,{variant:`filled`,size:`sm`,color:`primary`,iconOnly:!0,startIcon:(0,_.jsx)(e.Zi,{}),"aria-label":typeof S==`string`?S:`Open command palette`,onClick:()=>G(!0)}),(0,_.jsx)(C,{open:U,onClose:()=>G(!1),title:S,description:O,size:P,footer:N,children:(0,_.jsxs)(`div`,{className:`command-palette-body`,children:[(0,_.jsx)(`div`,{className:`command-palette-search`,children:(0,_.jsx)(m.t,{ref:W,value:R,onChange:e=>{z(e.target.value),Q(-1)},onKeyDown:te,placeholder:j,clearable:!0,fullWidth:!0})}),(0,_.jsxs)(`div`,{className:`command-palette-grid`,children:[(0,_.jsxs)(p.t,{stretch:!1,children:[(0,_.jsxs)(p.i,{children:[(0,_.jsx)(s.t,{level:4,children:`Featured`}),(0,_.jsx)(o.t,{size:`sm`,tone:`muted`,children:`Quick launch for the most frequent dashboard actions.`})]}),(0,_.jsx)(p.n,{children:(0,_.jsx)(f.t,{columns:4,children:Y.map(t=>{let n=t.actionLabel??t.title,r=typeof n==`string`?n:w(n);return(0,_.jsx)(h.t,{content:n,children:(0,_.jsx)(l.t,{variant:`ghost`,color:`primary`,component:t.component,to:t.to,href:t.href,target:t.target,rel:t.rel,startIcon:t.icon??(0,_.jsx)(e.On,{}),iconOnly:!0,"aria-label":r||void 0,onClick:()=>X(t)})},t.id)})})})]}),(0,_.jsxs)(p.t,{stretch:!1,children:[(0,_.jsxs)(p.i,{children:[(0,_.jsx)(s.t,{level:4,children:`Results`}),(0,_.jsxs)(a.n,{align:`center`,padding:`xs`,children:[(0,_.jsxs)(o.t,{size:`sm`,tone:`muted`,children:[J.length,` ready`]}),(0,_.jsx)(c.t,{children:A.toUpperCase()})]})]}),(0,_.jsx)(p.n,{children:q.length?(0,_.jsx)(d.t,{padding:`xs`,className:`command-palette-results`,children:q.map(n=>(0,_.jsxs)(d.t,{padding:`xs`,children:[(0,_.jsx)(o.t,{size:`sm`,tone:`muted`,children:n.label}),n.items.map(n=>(0,_.jsxs)(`button`,{type:`button`,className:t.t(`command-palette-item`,B===n.id&&`active`),onMouseEnter:()=>V(n.id),onClick:()=>X(n),children:[(0,_.jsx)(`span`,{className:`command-palette-item-icon`,children:n.icon??(0,_.jsx)(e.On,{})}),(0,_.jsxs)(`span`,{className:`command-palette-item-copy`,children:[(0,_.jsx)(`span`,{className:`command-palette-item-title`,children:n.title}),n.description&&(0,_.jsx)(`span`,{className:`command-palette-item-description`,children:n.description})]}),n.badge&&(0,_.jsx)(`span`,{className:`command-palette-item-badge`,children:(0,_.jsx)(u.n,{color:`primary`,size:`sm`,children:n.badge})})]},n.id))]},w(n.label)||`general`))}):(0,_.jsx)(o.t,{tone:`muted`,children:M})})]})]})]})})]})}var k=600;function A(e){return(0,g.isValidElement)(e)&&!!e.type.__drawerHeader}function j(e){return(0,g.isValidElement)(e)&&!!e.type.__drawerBody}function M(e){return(0,g.isValidElement)(e)&&!!e.type.__drawerFooter}function N({children:e}){return(0,_.jsx)(_.Fragment,{children:e})}N.__drawerHeader=!0;function P({children:e}){return(0,_.jsx)(_.Fragment,{children:e})}P.__drawerBody=!0;function F({children:e}){return(0,_.jsx)(_.Fragment,{children:e})}F.__drawerFooter=!0;function I({open:n,onClose:i,side:a=`right`,size:o=`md`,overlay:s=!0,closeOnBackdrop:c=!0,closeOnEscape:u=!0,className:d,children:f,...p}){let[m,h]=(0,g.useState)(!1),[v,y]=(0,g.useState)(!1),b=(0,g.useRef)(null);if((0,g.useEffect)(()=>{n&&(h(!0),y(!1))},[n]),(0,g.useEffect)(()=>{if(!n&&m){y(!0);let e=setTimeout(()=>{h(!1),y(!1)},k);return()=>clearTimeout(e)}},[n,m]),(0,g.useEffect)(()=>{if(!n||!u)return;let e=e=>{e.key===`Escape`&&i()};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[n,u,i]),(0,g.useEffect)(()=>{if(!m)return;let e=document.body.style.overflow;return document.body.style.overflow=`hidden`,()=>{document.body.style.overflow=e}},[m]),!m)return null;let x=e=>{c&&e.target===e.currentTarget&&i()},S=null,C=null,w=null,T=null,E=null,D=[];g.Children.forEach(f,e=>{if(A(e)){S=e.props.children,C=e.props;return}if(j(e)){w=e.props,D.push(e.props.children);return}if(M(e)){T=e.props.children,E=e.props;return}D.push(e)});let O=C??{children:void 0},N=w??{children:void 0},P=E??{children:void 0},{children:F,className:I,bordered:L=!1,...R}=O,{children:z,className:B,...V}=N,{children:H,className:U,bordered:W=!1,...G}=P;return(0,_.jsx)(r.t,{children:(0,_.jsx)(`div`,{ref:b,className:t.t(`mineral-backdrop`,`drawer-backdrop`,!s&&`no-overlay`,v&&`closing`),onMouseDown:x,children:(0,_.jsxs)(`div`,{className:t.t(`drawer`,a,o,d),role:`dialog`,"aria-modal":`true`,...p,children:[S&&(0,_.jsxs)(`div`,{...R,className:t.t(`drawer-header`,L&&`bordered`,I),children:[(0,_.jsx)(`div`,{className:`drawer-title`,children:S}),(0,_.jsx)(l.t,{variant:`link`,color:`neutral`,iconOnly:!0,size:`sm`,onClick:i,"aria-label":`Close`,className:`close`,children:(0,_.jsx)(e.Xi,{})})]}),(0,_.jsx)(`div`,{...V,className:t.t(`drawer-body`,B),children:D}),T&&(0,_.jsx)(`div`,{...G,className:t.t(`drawer-footer`,W&&`bordered`,U),children:T})]})})})}function L({title:e,description:n,onConfirm:r,onCancel:a,confirmText:o=`Yes`,cancelText:s=`No`,color:c=`warning`,icon:u,placement:d=`top-start`,open:f,onOpenChange:p,anchorRef:m,className:h}){let v=(0,g.useCallback)(()=>{p(!1),a?.()},[p,a]),y=(0,g.useCallback)(()=>{p(!1),r()},[p,r]);return(0,_.jsxs)(i.t,{open:f,anchorRef:m,onClose:v,placement:d,className:t.t(`popconfirm`,`color-${c}`,h),children:[(0,_.jsxs)(`div`,{className:`body`,children:[u&&(0,_.jsx)(`div`,{className:`icon`,children:u}),(0,_.jsxs)(`div`,{className:`content`,children:[(0,_.jsx)(`div`,{className:`title`,children:e}),n&&(0,_.jsx)(`div`,{className:`description`,children:n})]})]}),(0,_.jsxs)(`div`,{className:`actions`,children:[(0,_.jsx)(l.t,{variant:`ghost`,size:`sm`,color:`neutral`,onClick:v,children:s}),(0,_.jsx)(l.t,{variant:`ghost`,size:`sm`,color:c,onClick:y,children:o})]})]})}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return L}});
2
- //# sourceMappingURL=overlays-zPzbHW5P.cjs.map
1
+ const e=require(`./icons-D675Im0B.cjs`),t=require(`./cn-CU5TNITO.cjs`),n=require(`./useKeyboardNav-HVG9JFD2.cjs`),r=require(`./MPortal-BciZHNDC.cjs`),i=require(`./MPopover-CV-9MArH.cjs`),a=require(`./MSurface-CYeVFOw_.cjs`),o=require(`./MText-j6Zbbj5Y.cjs`),s=require(`./MHeading-BLnb3dNv.cjs`),c=require(`./MKbd-n4fhKIxb.cjs`),l=require(`./MButton-R08y1HCT.cjs`),u=require(`./MSkeleton-CLSU5pL6.cjs`),d=require(`./MStack-BP_BUeCc.cjs`),f=require(`./MSimpleGrid-BwNfaxQP.cjs`),p=require(`./MCard-1OVOl4Ql.cjs`),m=require(`./MInputSearch-9wcXlY8-.cjs`),h=require(`./MTooltip-BEfO9jTe.cjs`);require(`./core-DBpQf3uY.cjs`);let g=require(`react`),_=require(`react/jsx-runtime`);var v=540;function y({open:e,onClose:n,title:i,description:a,footer:o,size:s=`md`,closeOnBackdrop:c=!0,closeOnEscape:l=!0,className:u,children:d,...f}){let[m,h]=(0,g.useState)(!1),[y,b]=(0,g.useState)(!1),x=(0,g.useRef)(null);return(0,g.useEffect)(()=>{e&&(h(!0),b(!1))},[e]),(0,g.useEffect)(()=>{if(!e&&m){b(!0);let e=setTimeout(()=>{h(!1),b(!1)},v);return()=>clearTimeout(e)}},[e,m]),(0,g.useEffect)(()=>{if(!e||!l)return;let t=e=>{e.key===`Escape`&&n()};return document.addEventListener(`keydown`,t),()=>document.removeEventListener(`keydown`,t)},[l,n,e]),(0,g.useEffect)(()=>{if(!m)return;let e=document.body.style.overflow;return document.body.style.overflow=`hidden`,()=>{document.body.style.overflow=e}},[m]),m?(0,_.jsx)(r.t,{children:(0,_.jsx)(`div`,{ref:x,className:t.t(`mineral-backdrop`,`modal-backdrop`,y&&`closing`),onMouseDown:e=>{c&&e.target===e.currentTarget&&n()},children:(0,_.jsx)(`div`,{className:`modal-shell`,children:(0,_.jsxs)(p.t,{className:t.t(`modal`,s,u),role:`dialog`,"aria-modal":`true`,"aria-labelledby":i?`mineral-modal-title`:void 0,...f,children:[(i||a)&&(0,_.jsxs)(p.i,{children:[i&&(0,_.jsx)(`div`,{id:`mineral-modal-title`,className:`modal-title`,children:i}),a&&(0,_.jsx)(`div`,{className:`modal-description`,children:a})]}),(0,_.jsx)(p.n,{children:d}),o&&(0,_.jsx)(p.r,{children:o})]})})})}):null}var b=540,x=72,S={sm:`32vh`,md:`52vh`,lg:`72vh`,full:`92vh`};function C({open:n,onClose:i,title:a,description:o,footer:s,size:c=`md`,closeOnBackdrop:u=!0,closeOnEscape:d=!0,className:f,children:m,style:h,...v}){let y=(0,g.useId)(),[C,w]=(0,g.useState)(!1),[T,E]=(0,g.useState)(!1),[D,O]=(0,g.useState)(0),k=(0,g.useRef)(null),A=(0,g.useRef)(0);(0,g.useEffect)(()=>{n&&(w(!0),E(!1),O(0),A.current=0)},[n]),(0,g.useEffect)(()=>{if(!n&&C){E(!0);let e=window.setTimeout(()=>{w(!1),E(!1)},b);return()=>window.clearTimeout(e)}},[n,C]),(0,g.useEffect)(()=>{if(!C)return;let e=document.body.style.overflow;return document.body.style.overflow=`hidden`,()=>{document.body.style.overflow=e}},[C]),(0,g.useEffect)(()=>{if(!n||!d)return;let e=e=>{e.key===`Escape`&&i()};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[d,i,n]);function j(e){u&&e.target===e.currentTarget&&i()}function M(e){e.preventDefault(),e.currentTarget.setPointerCapture(e.pointerId),k.current={pointerId:e.pointerId,startY:e.clientY},O(0),A.current=0}function N(e){let t=k.current;if(!t||t.pointerId!==e.pointerId)return;let n=Math.max(e.clientY-t.startY,0);A.current=n,O(n)}function P(e){let t=k.current;if(!(!t||t.pointerId!==e)){if(k.current=null,A.current>x){O(0),A.current=0,i();return}O(0),A.current=0}}if(!C)return null;let F=S[c],I=D>0?`translateY(${D}px)`:void 0;return(0,_.jsx)(r.t,{children:(0,_.jsx)(`div`,{className:t.t(`mineral-backdrop`,`sheet-backdrop`,T&&`closing`),onMouseDown:j,children:(0,_.jsx)(`div`,{className:`sheet-shell`,style:{transform:I},children:(0,_.jsxs)(p.t,{className:t.t(`sheet`,`size-${c}`,f),role:`dialog`,"aria-modal":`true`,"aria-labelledby":a?y:void 0,style:{...h,height:c===`full`?F:void 0,maxHeight:F},...v,children:[(0,_.jsx)(`button`,{type:`button`,className:`sheet-grabber`,onPointerDown:M,onPointerMove:N,onPointerUp:e=>P(e.pointerId),onPointerCancel:e=>P(e.pointerId),"aria-label":`Drag down to close`,children:(0,_.jsx)(`span`,{className:`sheet-handle`})}),(a||o)&&(0,_.jsxs)(p.i,{className:`sheet-header`,children:[(0,_.jsxs)(`div`,{className:`sheet-copy`,children:[a&&(0,_.jsx)(`div`,{id:y,className:`sheet-title`,children:a}),o&&(0,_.jsx)(`div`,{className:`sheet-description`,children:o})]}),(0,_.jsx)(l.t,{variant:`link`,color:`neutral`,iconOnly:!0,size:`sm`,onClick:i,"aria-label":`Close`,className:`sheet-close`,children:(0,_.jsx)(e.Xi,{})})]}),(0,_.jsx)(p.n,{className:`sheet-body`,children:m}),s&&(0,_.jsx)(p.r,{className:`sheet-footer`,children:s})]})})})})}function w(e){return typeof e==`string`||typeof e==`number`?e.toString():``}function T(e,t){let n=t.toLowerCase().replace(/\s+/g,``).split(`+`),r=n[n.length-1];if(!r)return!1;let i=n.includes(`ctrl`),a=n.includes(`meta`)||n.includes(`cmd`),o=n.includes(`shift`),s=n.includes(`alt`)||n.includes(`option`);return e.key.toLowerCase()===r&&!!i===e.ctrlKey&&!!a===e.metaKey&&!!o===e.shiftKey&&!!s===e.altKey}function E(e,t){if(!t.trim())return e;let n=t.trim().toLowerCase();return e.filter(e=>[w(e.title),w(e.description),w(e.group),w(e.actionLabel),...e.keywords??[]].some(e=>e.toLowerCase().includes(n)))}function D(e){let t=new Map;return e.forEach(e=>{let n=w(e.group)||`General`,r=t.get(n)??{label:e.group??`General`,items:[]};r.items.push(e),t.set(n,r)}),Array.from(t.values())}function O({items:r,featuredItems:i=[],open:v,defaultOpen:y=!1,onOpenChange:b,onSelect:x,title:S=`Command palette`,description:O,trigger:k,shortcut:A=`ctrl+k`,placeholder:j=`Search modules, records and actions...`,emptyLabel:M=`No matching results.`,footer:N,size:P=`lg`,closeOnSelect:F=!0}){let[I,L]=(0,g.useState)(y),[R,z]=(0,g.useState)(``),[B,V]=(0,g.useState)(null),H=v!==void 0,U=H?v:I,W=(0,g.useRef)(null);function G(e){H||L(e),b?.(e)}let K=(0,g.useMemo)(()=>E(r,R),[r,R]),q=(0,g.useMemo)(()=>D(K),[K]),J=(0,g.useMemo)(()=>q.flatMap(e=>e.items),[q]),Y=(0,g.useMemo)(()=>i.length?i:r.slice(0,6),[i,r]);function X(e){e.onSelect?.(),x?.(e),!e.onSelect&&e.href&&window.location.assign(e.href),F&&(G(!1),z(``),V(null))}let{activeIndex:Z,setActiveIndex:Q,resetIndex:$,onKeyDown:ee}=n.t({itemCount:J.length,isOpen:U,onClose:()=>G(!1),onSelect:e=>{let t=J[e];t&&X(t)}});(0,g.useEffect)(()=>{let e=e=>{T(e,A)&&(e.preventDefault(),G(!0))};return window.addEventListener(`keydown`,e),()=>{window.removeEventListener(`keydown`,e)}},[A]),(0,g.useEffect)(()=>{if(!U){$(),V(null);return}queueMicrotask(()=>W.current?.focus())},[U,$]),(0,g.useEffect)(()=>{if(Z<0||Z>=J.length){V(null);return}V(J[Z]?.id??null)},[Z,J]);function te(e){ee(e)}return(0,_.jsxs)(_.Fragment,{children:[k??(0,_.jsx)(l.t,{variant:`filled`,size:`sm`,color:`primary`,iconOnly:!0,startIcon:(0,_.jsx)(e.Zi,{}),"aria-label":typeof S==`string`?S:`Open command palette`,onClick:()=>G(!0)}),(0,_.jsx)(C,{open:U,onClose:()=>G(!1),title:S,description:O,size:P,footer:N,children:(0,_.jsxs)(`div`,{className:`command-palette-body`,children:[(0,_.jsx)(`div`,{className:`command-palette-search`,children:(0,_.jsx)(m.t,{ref:W,value:R,onChange:e=>{z(e.target.value),Q(-1)},onKeyDown:te,placeholder:j,clearable:!0,fullWidth:!0})}),(0,_.jsxs)(`div`,{className:`command-palette-grid`,children:[(0,_.jsxs)(p.t,{stretch:!1,children:[(0,_.jsxs)(p.i,{children:[(0,_.jsx)(s.t,{level:4,children:`Featured`}),(0,_.jsx)(o.t,{size:`sm`,tone:`muted`,children:`Quick launch for the most frequent dashboard actions.`})]}),(0,_.jsx)(p.n,{children:(0,_.jsx)(f.t,{columns:4,children:Y.map(t=>{let n=t.actionLabel??t.title,r=typeof n==`string`?n:w(n);return(0,_.jsx)(h.t,{content:n,children:(0,_.jsx)(l.t,{variant:`ghost`,color:`primary`,component:t.component,to:t.to,href:t.href,target:t.target,rel:t.rel,startIcon:t.icon??(0,_.jsx)(e.On,{}),iconOnly:!0,"aria-label":r||void 0,onClick:()=>X(t)})},t.id)})})})]}),(0,_.jsxs)(p.t,{stretch:!1,children:[(0,_.jsxs)(p.i,{children:[(0,_.jsx)(s.t,{level:4,children:`Results`}),(0,_.jsxs)(a.n,{align:`center`,padding:`xs`,children:[(0,_.jsxs)(o.t,{size:`sm`,tone:`muted`,children:[J.length,` ready`]}),(0,_.jsx)(c.t,{children:A.toUpperCase()})]})]}),(0,_.jsx)(p.n,{children:q.length?(0,_.jsx)(d.t,{padding:`xs`,className:`command-palette-results`,children:q.map(n=>(0,_.jsxs)(d.t,{padding:`xs`,children:[(0,_.jsx)(o.t,{size:`sm`,tone:`muted`,children:n.label}),n.items.map(n=>(0,_.jsxs)(`button`,{type:`button`,className:t.t(`command-palette-item`,B===n.id&&`active`),onMouseEnter:()=>V(n.id),onClick:()=>X(n),children:[(0,_.jsx)(`span`,{className:`command-palette-item-icon`,children:n.icon??(0,_.jsx)(e.On,{})}),(0,_.jsxs)(`span`,{className:`command-palette-item-copy`,children:[(0,_.jsx)(`span`,{className:`command-palette-item-title`,children:n.title}),n.description&&(0,_.jsx)(`span`,{className:`command-palette-item-description`,children:n.description})]}),n.badge&&(0,_.jsx)(`span`,{className:`command-palette-item-badge`,children:(0,_.jsx)(u.n,{color:`primary`,size:`sm`,children:n.badge})})]},n.id))]},w(n.label)||`general`))}):(0,_.jsx)(o.t,{tone:`muted`,children:M})})]})]})]})})]})}var k=600;function A(e){return(0,g.isValidElement)(e)&&!!e.type.__drawerHeader}function j(e){return(0,g.isValidElement)(e)&&!!e.type.__drawerBody}function M(e){return(0,g.isValidElement)(e)&&!!e.type.__drawerFooter}function N({children:e}){return(0,_.jsx)(_.Fragment,{children:e})}N.__drawerHeader=!0;function P({children:e}){return(0,_.jsx)(_.Fragment,{children:e})}P.__drawerBody=!0;function F({children:e}){return(0,_.jsx)(_.Fragment,{children:e})}F.__drawerFooter=!0;function I({open:n,onClose:i,side:a=`right`,size:o=`md`,overlay:s=!0,closeOnBackdrop:c=!0,closeOnEscape:u=!0,className:d,children:f,...p}){let[m,h]=(0,g.useState)(!1),[v,y]=(0,g.useState)(!1),b=(0,g.useRef)(null);if((0,g.useEffect)(()=>{n&&(h(!0),y(!1))},[n]),(0,g.useEffect)(()=>{if(!n&&m){y(!0);let e=setTimeout(()=>{h(!1),y(!1)},k);return()=>clearTimeout(e)}},[n,m]),(0,g.useEffect)(()=>{if(!n||!u)return;let e=e=>{e.key===`Escape`&&i()};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[n,u,i]),(0,g.useEffect)(()=>{if(!m)return;let e=document.body.style.overflow;return document.body.style.overflow=`hidden`,()=>{document.body.style.overflow=e}},[m]),!m)return null;let x=e=>{c&&e.target===e.currentTarget&&i()},S=null,C=null,w=null,T=null,E=null,D=[];g.Children.forEach(f,e=>{if(A(e)){S=e.props.children,C=e.props;return}if(j(e)){w=e.props,D.push(e.props.children);return}if(M(e)){T=e.props.children,E=e.props;return}D.push(e)});let O=C??{children:void 0},N=w??{children:void 0},P=E??{children:void 0},{children:F,className:I,bordered:L=!1,...R}=O,{children:z,className:B,...V}=N,{children:H,className:U,bordered:W=!1,...G}=P;return(0,_.jsx)(r.t,{children:(0,_.jsx)(`div`,{ref:b,className:t.t(`mineral-backdrop`,`drawer-backdrop`,!s&&`no-overlay`,v&&`closing`),onMouseDown:x,children:(0,_.jsxs)(`div`,{className:t.t(`drawer`,a,o,d),role:`dialog`,"aria-modal":`true`,...p,children:[S&&(0,_.jsxs)(`div`,{...R,className:t.t(`drawer-header`,L&&`bordered`,I),children:[(0,_.jsx)(`div`,{className:`drawer-title`,children:S}),(0,_.jsx)(l.t,{variant:`link`,color:`neutral`,iconOnly:!0,size:`sm`,onClick:i,"aria-label":`Close`,className:`close`,children:(0,_.jsx)(e.Xi,{})})]}),(0,_.jsx)(`div`,{...V,className:t.t(`drawer-body`,B),children:D}),T&&(0,_.jsx)(`div`,{...G,className:t.t(`drawer-footer`,W&&`bordered`,U),children:T})]})})})}function L({title:e,description:n,onConfirm:r,onCancel:a,confirmText:o=`Yes`,cancelText:s=`No`,color:c=`warning`,icon:u,placement:d=`top-start`,open:f,onOpenChange:p,anchorRef:m,className:h}){let v=(0,g.useCallback)(()=>{p(!1),a?.()},[p,a]),y=(0,g.useCallback)(()=>{p(!1),r()},[p,r]);return(0,_.jsxs)(i.t,{open:f,anchorRef:m,onClose:v,placement:d,className:t.t(`popconfirm`,`color-${c}`,h),children:[(0,_.jsxs)(`div`,{className:`body`,children:[u&&(0,_.jsx)(`div`,{className:`icon`,children:u}),(0,_.jsxs)(`div`,{className:`content`,children:[(0,_.jsx)(`div`,{className:`title`,children:e}),n&&(0,_.jsx)(`div`,{className:`description`,children:n})]})]}),(0,_.jsxs)(`div`,{className:`actions`,children:[(0,_.jsx)(l.t,{variant:`ghost`,size:`sm`,color:`neutral`,onClick:v,children:s}),(0,_.jsx)(l.t,{variant:`ghost`,size:`sm`,color:c,onClick:y,children:o})]})]})}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return L}});
2
+ //# sourceMappingURL=overlays-BUZEaZaJ.cjs.map