easy-vps 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -99,6 +99,6 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
|
|
|
99
99
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function nY(e,t){if(e){if(typeof e==`string`)return rY(e,t);var n={}.toString.call(e).slice(8,-1);return n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`?Array.from(e):n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?rY(e,t):void 0}}function rY(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function iY(e,t){var n=e==null?null:typeof Symbol<`u`&&e[Symbol.iterator]||e[`@@iterator`];if(n!=null){var r,i,a,o,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,t===0){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,i=e}finally{try{if(!c&&n.return!=null&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw i}}return s}}function aY(e){if(Array.isArray(e))return e}var oY=(0,N.createContext)(void 0),sY=e=>{var t=e.children,n=eY((0,N.useState)(`${cb(`recharts`)}-clip`),1)[0],r=MJ();if(r==null)return null;var i=r.x,a=r.y,o=r.width,s=r.height;return N.createElement(oY.Provider,{value:n},N.createElement(`defs`,null,N.createElement(`clipPath`,{id:n},N.createElement(`rect`,{x:i,y:a,height:s,width:o}))),t)},cY=()=>(0,N.useContext)(oY),lY=class{constructor(e){var t=e.x,n=e.y;this.xAxisScale=t,this.yAxisScale=n}map(e,t){var n=t.position;return{x:this.xAxisScale.map(e.x,{position:n})??0,y:this.yAxisScale.map(e.y,{position:n})??0}}mapWithFallback(e,t){var n=t.position,r=t.fallback,i=r===`rangeMin`?this.yAxisScale.rangeMin():r===`rangeMax`?this.yAxisScale.rangeMax():0,a=r===`rangeMin`?this.xAxisScale.rangeMin():r===`rangeMax`?this.xAxisScale.rangeMax():0;return{x:this.xAxisScale.map(e.x,{position:n})??a,y:this.yAxisScale.map(e.y,{position:n})??i}}isInRange(e){var t=e.x,n=e.y,r=t==null||this.xAxisScale.isInRange(t),i=n==null||this.yAxisScale.isInRange(n);return r&&i}};function uY(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function dY(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?uY(Object(n),!0).forEach(function(t){fY(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):uY(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function fY(e,t,n){return(t=pY(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function pY(e){var t=mY(e,`string`);return typeof t==`symbol`?t:t+``}function mY(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function hY(){return hY=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},hY.apply(null,arguments)}var gY=(e,t)=>{var n;if(N.isValidElement(e))n=N.cloneElement(e,t);else if(typeof e==`function`)n=e(t);else{if(!$(t.x1)||!$(t.y1)||!$(t.x2)||!$(t.y2))return null;n=N.createElement(`line`,hY({},t,{className:`recharts-reference-line-line`}))}return n},_Y=(e,t,n,r,i,a)=>{var o=a.x,s=a.width,c=i.map(e,{position:n});if(!$(c)||t===`discard`&&!i.isInRange(c))return null;var l=[{x:o+s,y:c},{x:o,y:c}];return r===`left`?l.reverse():l},vY=(e,t,n,r,i,a)=>{var o=a.y,s=a.height,c=i.map(e,{position:n});if(!$(c)||t===`discard`&&!i.isInRange(c))return null;var l=[{x:c,y:o+s},{x:c,y:o}];return r===`top`?l.reverse():l},yY=(e,t,n,r)=>{var i=[r.mapWithFallback(e[0],{position:n,fallback:`rangeMin`}),r.mapWithFallback(e[1],{position:n,fallback:`rangeMax`})];return t===`discard`&&i.some(e=>!r.isInRange(e))?null:i},bY=(e,t,n,r,i,a,o)=>{var s=o.x,c=o.y,l=o.segment,u=o.ifOverflow,d=ob(s);return ob(c)?_Y(c,u,r,a,t,n):d?vY(s,u,r,i,e,n):l!=null&&l.length===2?yY(l,u,r,new lY({x:e,y:t})):null};function xY(e){var t=$S();return(0,N.useEffect)(()=>(t(ZJ(e)),()=>{t(QJ(e))})),null}function SY(e){var t=e.xAxisId,n=e.yAxisId,r=e.shape,i=e.className,a=e.ifOverflow,o=MD(),s=cY(),c=Z(e=>Oz(e,t)),l=Z(e=>jz(e,n)),u=Z(e=>cV(e,`xAxis`,t,o)),d=Z(e=>cV(e,`yAxis`,n,o)),f=mO();if(!s||!f||c==null||l==null||u==null||d==null)return null;var p=bY(u,d,f,e.position,c.orientation,l.orientation,e);if(!p)return null;var m=p[0],h=p[1];if(m==null||h==null)return null;var g=m.x,_=m.y,v=h.x,y=h.y,b=dY(dY({clipPath:a===`hidden`?`url(#${s})`:void 0},Ny(e)),{},{x1:g,y1:_,x2:v,y2:y}),x=KJ({x1:g,y1:_,x2:v,y2:y});return N.createElement(eW,{zIndex:e.zIndex},N.createElement(Wy,{className:qr(`recharts-reference-line`,i)},gY(r,b),N.createElement(wK,hY({},x,{lowerWidth:x.width,upperWidth:x.width}),N.createElement(RK,{label:e.label}),e.children)))}var CY={ifOverflow:`discard`,xAxisId:0,yAxisId:0,fill:`none`,label:!1,stroke:`#ccc`,fillOpacity:1,strokeWidth:1,position:`middle`,zIndex:KM.line};function wY(e){var t=Fx(e,CY);return N.createElement(N.Fragment,null,N.createElement(xY,{yAxisId:t.yAxisId,xAxisId:t.xAxisId,ifOverflow:t.ifOverflow,x:t.x,y:t.y,segment:t.segment}),N.createElement(SY,t))}wY.displayName=`ReferenceLine`;function TY(){}function EY(e){if(!e||typeof e!=`object`)return!1;let t=Object.getPrototypeOf(e);return t!==null&&t!==Object.prototype&&Object.getPrototypeOf(t)!==null?!1:Object.prototype.toString.call(e)===`[object Object]`}function DY(e,t,n){return OY(e,t,void 0,void 0,void 0,void 0,n)}function OY(e,t,n,r,i,a,o){let s=o(e,t,n,r,i,a);if(s!==void 0)return s;if(typeof e==typeof t)switch(typeof e){case`bigint`:case`string`:case`boolean`:case`symbol`:case`undefined`:return e===t;case`number`:return e===t||Object.is(e,t);case`function`:return e===t;case`object`:return kY(e,t,a,o)}return kY(e,t,a,o)}function kY(e,t,n,r){if(Object.is(e,t))return!0;let i=Gx(e),a=Gx(t);if(i===`[object Arguments]`&&(i=iS),a===`[object Arguments]`&&(a=iS),i!==a)return!1;switch(i){case qx:return e.toString()===t.toString();case Jx:return TS(e.valueOf(),t.valueOf());case Yx:case Qx:case Zx:return Object.is(e.valueOf(),t.valueOf());case Kx:return e.source===t.source&&e.flags===t.flags;case nS:return e===t}n??=new Map;let o=n.get(e),s=n.get(t);if(o!=null&&s!=null)return o===t;n.set(e,t),n.set(t,e);try{switch(i){case $x:if(e.size!==t.size)return!1;for(let[i,a]of e.entries())if(!t.has(i)||!OY(a,t.get(i),i,e,t,n,r))return!1;return!0;case eS:{if(e.size!==t.size)return!1;let i=Array.from(e.values()),a=Array.from(t.values());for(let o=0;o<i.length;o++){let s=i[o],c=a.findIndex(i=>OY(s,i,void 0,e,t,n,r));if(c===-1)return!1;a.splice(c,1)}return!0}case tS:case sS:case cS:case lS:case uS:case dS:case fS:case pS:case mS:case hS:case gS:case _S:if(yS(e)!==yS(t)||e.length!==t.length)return!1;for(let i=0;i<e.length;i++)if(!OY(e[i],t[i],i,e,t,n,r))return!1;return!0;case rS:return e.byteLength===t.byteLength&&kY(new Uint8Array(e),new Uint8Array(t),n,r);case oS:return e.byteLength!==t.byteLength||e.byteOffset!==t.byteOffset?!1:kY(new Uint8Array(e),new Uint8Array(t),n,r);case aS:return e.name===t.name&&e.message===t.message;case iS:{if(!(kY(e.constructor,t.constructor,n,r)||EY(e)&&EY(t)))return!1;let i=[...Object.keys(e),...Wx(e)],a=[...Object.keys(t),...Wx(t)];if(i.length!==a.length)return!1;for(let a=0;a<i.length;a++){let o=i[a],s=e[o];if(!Object.hasOwn(t,o))return!1;let c=t[o];if(!OY(s,c,o,e,t,n,r))return!1}return!0}default:return!1}}finally{n.delete(e),n.delete(t)}}function AY(e,t){return DY(e,t,TY)}function jY(e,t){if(t<1)return[];if(t===1)return e;for(var n=[],r=0;r<e.length;r+=t){var i=e[r];i!==void 0&&n.push(i)}return n}function MY(e,t,n){return JJ({width:e.width+t.width,height:e.height+t.height},n)}function NY(e,t,n){var r=n===`width`,i=e.x,a=e.y,o=e.width,s=e.height;return t===1?{start:r?i:a,end:r?i+o:a+s}:{start:r?i+o:a+s,end:r?i:a}}function PY(e,t,n,r,i){if(e*t<e*r||e*t>e*i)return!1;var a=n();return e*(t-e*a/2-r)>=0&&e*(t+e*a/2-i)<=0}function FY(e,t){return jY(e,t+1)}function IY(e,t,n,r,i){for(var a=(r||[]).slice(),o=t.start,s=t.end,c=0,l=1,u=o,d=function(){var t=r?.[c];if(t===void 0)return{v:jY(r,l)};var a=c,d,f=()=>(d===void 0&&(d=n(t,a)),d),p=t.coordinate,m=c===0||PY(e,p,f,u,s);m||(c=0,u=o,l+=1),m&&(u=p+e*(f()/2+i),c+=l)},f;l<=a.length;)if(f=d(),f)return f.v;return[]}function LY(e,t,n,r,i){var a=(r||[]).slice().length;if(a===0)return[];for(var o=t.start,s=t.end,c=1;c<=a;c++){for(var l=(a-1)%c,u=o,d=!0,f=function(){var t=r[m];if(t==null)return 0;var a=m,o,c=()=>(o===void 0&&(o=n(t,a)),o),f=t.coordinate,p=m===l||PY(e,f,c,u,s);if(!p)return d=!1,1;p&&(u=f+e*(c()/2+i))},p,m=l;m<a&&(p=f(),p===0||p!==1);m+=c);if(d){for(var h=[],g=l;g<a;g+=c){var _=r[g];_!=null&&h.push(_)}return h}}return[]}function RY(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function zY(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?RY(Object(n),!0).forEach(function(t){BY(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):RY(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function BY(e,t,n){return(t=VY(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function VY(e){var t=HY(e,`string`);return typeof t==`symbol`?t:t+``}function HY(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function UY(e,t,n,r,i){for(var a=(r||[]).slice(),o=a.length,s=t.start,c=t.end,l=function(t){var r=a[t];if(r==null)return 1;var l=r,u,d=()=>(u===void 0&&(u=n(r,t)),u);if(t===o-1){var f=e*(l.coordinate+e*d()/2-c);a[t]=l=zY(zY({},l),{},{tickCoord:f>0?l.coordinate-f*e:l.coordinate})}else a[t]=l=zY(zY({},l),{},{tickCoord:l.coordinate});l.tickCoord!=null&&PY(e,l.tickCoord,d,s,c)&&(c=l.tickCoord-e*(d()/2+i),a[t]=zY(zY({},l),{},{isShow:!0}))},u=o-1;u>=0;u--)if(l(u))continue;return a}function WY(e,t,n,r,i,a){var o=(r||[]).slice(),s=o.length,c=t.start,l=t.end;if(a){var u=r[s-1];if(u!=null){var d=n(u,s-1),f=e*(u.coordinate+e*d/2-l);o[s-1]=u=zY(zY({},u),{},{tickCoord:f>0?u.coordinate-f*e:u.coordinate}),u.tickCoord!=null&&PY(e,u.tickCoord,()=>d,c,l)&&(l=u.tickCoord-e*(d/2+i),o[s-1]=zY(zY({},u),{},{isShow:!0}))}}for(var p=a?s-1:s,m=function(t){var r=o[t];if(r==null)return 1;var a=r,s,u=()=>(s===void 0&&(s=n(r,t)),s);if(t===0){var d=e*(a.coordinate-e*u()/2-c);o[t]=a=zY(zY({},a),{},{tickCoord:d<0?a.coordinate-d*e:a.coordinate})}else o[t]=a=zY(zY({},a),{},{tickCoord:a.coordinate});a.tickCoord!=null&&PY(e,a.tickCoord,u,c,l)&&(c=a.tickCoord+e*(u()/2+i),o[t]=zY(zY({},a),{},{isShow:!0}))},h=0;h<p;h++)if(m(h))continue;return o}function GY(e,t,n){var r=e.tick,i=e.ticks,a=e.viewBox,o=e.minTickGap,s=e.orientation,c=e.interval,l=e.tickFormatter,u=e.unit,d=e.angle;if(!i||!i.length||!r)return[];if(X(c)||vk.isSsr)return FY(i,X(c)?c:0)??[];var f=[],p=s===`top`||s===`bottom`?`width`:`height`,m=u&&p===`width`?hG(u,{fontSize:t,letterSpacing:n}):{width:0,height:0},h=(e,r)=>{var i=typeof l==`function`?l(e.value,r):e.value;return p===`width`?MY(hG(i,{fontSize:t,letterSpacing:n}),m,d):hG(i,{fontSize:t,letterSpacing:n})[p]},g=i[0],_=i[1],v=i.length>=2&&g!=null&&_!=null?rb(_.coordinate-g.coordinate):1,y=NY(a,v,p);return c===`equidistantPreserveStart`?IY(v,y,h,i,o):c===`equidistantPreserveEnd`?LY(v,y,h,i,o):(f=c===`preserveStart`||c===`preserveStartEnd`?WY(v,y,h,i,o,c===`preserveStartEnd`):UY(v,y,h,i,o),f.filter(e=>e.isShow))}var KY=e=>{var t=e.ticks,n=e.label,r=e.labelGapWithTick,i=r===void 0?5:r,a=e.tickSize,o=a===void 0?0:a,s=e.tickMargin,c=s===void 0?0:s,l=0;if(t){Array.from(t).forEach(e=>{if(e){var t=e.getBoundingClientRect();t.width>l&&(l=t.width)}});var u=n?n.getBoundingClientRect().width:0,d=o+c,f=l+d+u+(n?i:0);return Math.round(f)}return 0},qY=e=>{var t=e.ticks,n=e.label,r=e.labelGapWithTick,i=r===void 0?5:r,a=e.tickSize,o=a===void 0?0:a,s=e.tickMargin,c=s===void 0?0:s,l=0;if(t){Array.from(t).forEach(e=>{if(e){var t=e.getBoundingClientRect();t.height>l&&(l=t.height)}});var u=n?n.getBoundingClientRect().height:0,d=o+c,f=l+d+u+(n?i:0);return Math.round(f)}return 0},JY=WT({name:`renderedTicks`,initialState:{xAxis:{},yAxis:{}},reducers:{setRenderedTicks:(e,t)=>{var n=t.payload,r=n.axisType,i=n.axisId,a=n.ticks;e[r][i]=_T(a)},removeRenderedTicks:(e,t)=>{var n=t.payload,r=n.axisType,i=n.axisId;delete e[r][i]}}}),YY=JY.actions,XY=YY.setRenderedTicks,ZY=YY.removeRenderedTicks,QY=JY.reducer,$Y=[`axisLine`,`width`,`height`,`className`,`hide`,`ticks`,`axisType`,`axisId`];function eX(e,t){return aX(e)||iX(e,t)||nX(e,t)||tX()}function tX(){throw TypeError(`Invalid attempt to destructure non-iterable instance.
|
|
100
100
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function nX(e,t){if(e){if(typeof e==`string`)return rX(e,t);var n={}.toString.call(e).slice(8,-1);return n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`?Array.from(e):n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?rX(e,t):void 0}}function rX(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function iX(e,t){var n=e==null?null:typeof Symbol<`u`&&e[Symbol.iterator]||e[`@@iterator`];if(n!=null){var r,i,a,o,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,t===0){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,i=e}finally{try{if(!c&&n.return!=null&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw i}}return s}}function aX(e){if(Array.isArray(e))return e}function oX(e,t){if(e==null)return{};var n,r,i=sX(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function sX(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function cX(){return cX=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},cX.apply(null,arguments)}function lX(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function uX(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?lX(Object(n),!0).forEach(function(t){dX(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):lX(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function dX(e,t,n){return(t=fX(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function fX(e){var t=pX(e,`string`);return typeof t==`symbol`?t:t+``}function pX(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}var mX={x:0,y:0,width:0,height:0,viewBox:{x:0,y:0,width:0,height:0},orientation:`bottom`,ticks:[],stroke:`#666`,tickLine:!0,axisLine:!0,tick:!0,mirror:!1,minTickGap:5,tickSize:6,tickMargin:2,interval:`preserveEnd`,zIndex:KM.axis};function hX(e){var t=e.x,n=e.y,r=e.width,i=e.height,a=e.orientation,o=e.mirror,s=e.axisLine,c=e.otherSvgProps;if(!s)return null;var l=uX(uX(uX({},c),jy(s)),{},{fill:`none`});if(a===`top`||a===`bottom`){var u=+(a===`top`&&!o||a===`bottom`&&o);l=uX(uX({},l),{},{x1:t,y1:n+u*i,x2:t+r,y2:n+u*i})}else{var d=+(a===`left`&&!o||a===`right`&&o);l=uX(uX({},l),{},{x1:t+d*r,y1:n,x2:t+d*r,y2:n+i})}return N.createElement(`line`,cX({},l,{className:qr(`recharts-cartesian-axis-line`,Qy(s,`className`))}))}function gX(e,t,n,r,i,a,o,s,c){var l,u,d,f,p,m,h=s?-1:1,g=e.tickSize||o,_=X(e.tickCoord)?e.tickCoord:e.coordinate;switch(a){case`top`:l=u=e.coordinate,f=n+ +!s*i,d=f-h*g,m=d-h*c,p=_;break;case`left`:d=f=e.coordinate,u=t+ +!s*r,l=u-h*g,p=l-h*c,m=_;break;case`right`:d=f=e.coordinate,u=t+ +s*r,l=u+h*g,p=l+h*c,m=_;break;default:l=u=e.coordinate,f=n+ +s*i,d=f+h*g,m=d+h*c,p=_}return{line:{x1:l,y1:d,x2:u,y2:f},tick:{x:p,y:m}}}function _X(e,t){switch(e){case`left`:return t?`start`:`end`;case`right`:return t?`end`:`start`;default:return`middle`}}function vX(e,t){switch(e){case`left`:case`right`:return`middle`;case`top`:return t?`start`:`end`;default:return t?`end`:`start`}}function yX(e){var t=e.option,n=e.tickProps,r=e.value,i,a=qr(n.className,`recharts-cartesian-axis-tick-value`);if(N.isValidElement(t))i=N.cloneElement(t,uX(uX({},n),{},{className:a}));else if(typeof t==`function`)i=t(uX(uX({},n),{},{className:a}));else{var o=`recharts-cartesian-axis-tick-value`;typeof t!=`boolean`&&(o=qr(o,rq(t))),i=N.createElement(fK,cX({},n,{className:o}),r)}return i}function bX(e){var t=e.ticks,n=e.axisType,r=e.axisId,i=$S(),a=(0,N.useRef)(null);return(0,N.useEffect)(()=>{if(r!=null&&n!=null){var e=t.map(e=>({value:e.value,coordinate:e.coordinate,offset:e.offset,index:e.index})),o=a.current;o!=null&&o.axisId===r&&o.axisType===n&&AY(o.ticks,e)||(a.current={ticks:e,axisId:r,axisType:n},i(XY({ticks:e,axisId:r,axisType:n})))}},[i,t,r,n]),(0,N.useEffect)(()=>r==null||n==null?gb:()=>{i(ZY({axisId:r,axisType:n}))},[i,r,n]),null}var xX=(0,N.forwardRef)((e,t)=>{var n=e.ticks,r=n===void 0?[]:n,i=e.tick,a=e.tickLine,o=e.stroke,s=e.tickFormatter,c=e.unit,l=e.padding,u=e.tickTextProps,d=e.orientation,f=e.mirror,p=e.x,m=e.y,h=e.width,g=e.height,_=e.tickSize,v=e.tickMargin,y=e.fontSize,b=e.letterSpacing,x=e.getTicksConfig,S=e.events,C=e.axisType,w=e.axisId,T=GY(uX(uX({},x),{},{ticks:r}),y,b),E=jy(x),D=My(i),O=tK(E.textAnchor)?E.textAnchor:_X(d,f),k=vX(d,f),A={};typeof a==`object`&&(A=a);var j=uX(uX({},E),{},{fill:`none`},A),M=T.map(e=>uX({entry:e},gX(e,p,m,h,g,d,_,f,v))),ee=M.map(e=>{var t=e.entry,n=e.line;return N.createElement(Wy,{className:`recharts-cartesian-axis-tick`,key:`tick-${t.value}-${t.coordinate}-${t.tickCoord}`},a&&N.createElement(`line`,cX({},j,n,{className:qr(`recharts-cartesian-axis-tick-line`,Qy(a,`className`))})))}),P=M.map((e,t)=>{var n=e.entry,r=e.tick,a=uX(uX({},uX(uX(uX(uX({verticalAnchor:k},E),{},{textAnchor:O,stroke:`none`,fill:o},r),{},{index:t,payload:n,visibleTicksCount:T.length,tickFormatter:s,padding:l},u),{},{angle:u?.angle??E.angle??0})),D);return N.createElement(Wy,cX({className:`recharts-cartesian-axis-tick-label`,key:`tick-label-${n.value}-${n.coordinate}-${n.tickCoord}`},kx(S,n,t)),i&&N.createElement(yX,{option:i,tickProps:a,value:`${typeof s==`function`?s(n.value,t):n.value}${c||``}`}))});return N.createElement(`g`,{className:`recharts-cartesian-axis-ticks recharts-${C}-ticks`},N.createElement(bX,{ticks:T,axisId:w,axisType:C}),P.length>0&&N.createElement(eW,{zIndex:KM.label},N.createElement(`g`,{className:`recharts-cartesian-axis-tick-labels recharts-${C}-tick-labels`,ref:t},P)),ee.length>0&&N.createElement(`g`,{className:`recharts-cartesian-axis-tick-lines recharts-${C}-tick-lines`},ee))}),SX=(0,N.forwardRef)((e,t)=>{var n=e.axisLine,r=e.width,i=e.height,a=e.className,o=e.hide,s=e.ticks,c=e.axisType,l=e.axisId,u=oX(e,$Y),d=eX((0,N.useState)(``),2),f=d[0],p=d[1],m=eX((0,N.useState)(``),2),h=m[0],g=m[1],_=(0,N.useRef)(null);(0,N.useImperativeHandle)(t,()=>({getCalculatedWidth:()=>KY({ticks:_.current,label:e.labelRef?.current,labelGapWithTick:5,tickSize:e.tickSize,tickMargin:e.tickMargin}),getCalculatedHeight:()=>qY({ticks:_.current,label:e.labelRef?.current,labelGapWithTick:5,tickSize:e.tickSize,tickMargin:e.tickMargin})}));var v=(0,N.useCallback)(e=>{if(e){var t=e.getElementsByClassName(`recharts-cartesian-axis-tick-value`);_.current=t;var n=t[0];if(n){var r=window.getComputedStyle(n),i=r.fontSize,a=r.letterSpacing;(i!==f||a!==h)&&(p(i),g(a))}}},[f,h]);return o||r!=null&&r<=0||i!=null&&i<=0?null:N.createElement(eW,{zIndex:e.zIndex},N.createElement(Wy,{className:qr(`recharts-cartesian-axis`,a)},N.createElement(hX,{x:e.x,y:e.y,width:r,height:i,orientation:e.orientation,mirror:e.mirror,axisLine:n,otherSvgProps:jy(e)}),N.createElement(xX,{ref:v,axisType:c,events:u,fontSize:f,getTicksConfig:e,height:e.height,letterSpacing:h,mirror:e.mirror,orientation:e.orientation,padding:e.padding,stroke:e.stroke,tick:e.tick,tickFormatter:e.tickFormatter,tickLine:e.tickLine,tickMargin:e.tickMargin,tickSize:e.tickSize,tickTextProps:e.tickTextProps,ticks:s,unit:e.unit,width:e.width,x:e.x,y:e.y,axisId:l}),N.createElement(wK,{x:e.x,y:e.y,width:e.width,height:e.height,lowerWidth:e.width,upperWidth:e.width},N.createElement(RK,{label:e.label,labelRef:e.labelRef}),e.children)))}),CX=N.forwardRef((e,t)=>{var n=Fx(e,mX);return N.createElement(SX,cX({},n,{ref:t}))});CX.displayName=`CartesianAxis`;var wX=(0,N.createContext)({grid:{stroke:`#ccc`,fill:`none`}});wX.Provider;var TX=()=>(0,N.useContext)(wX),EX=[`x1`,`y1`,`x2`,`y2`,`key`],DX=[`offset`],OX=[`xAxisId`,`yAxisId`],kX=[`xAxisId`,`yAxisId`];function AX(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function jX(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?AX(Object(n),!0).forEach(function(t){MX(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):AX(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function MX(e,t,n){return(t=NX(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function NX(e){var t=PX(e,`string`);return typeof t==`symbol`?t:t+``}function PX(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function FX(){return FX=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},FX.apply(null,arguments)}function IX(e,t){if(e==null)return{};var n,r,i=LX(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function LX(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}var RX=e=>{var t=e.fill;if(!t||t===`none`)return null;var n=e.fillOpacity,r=e.x,i=e.y,a=e.width,o=e.height,s=e.ry;return N.createElement(`rect`,{x:r,y:i,ry:s,width:a,height:o,stroke:`none`,fill:t,fillOpacity:n,className:`recharts-cartesian-grid-bg`})};function zX(e){var t=e.option,n=e.lineItemProps,r;if(N.isValidElement(t))r=N.cloneElement(t,n);else if(typeof t==`function`)r=t(n);else{var i=n.x1,a=n.y1,o=n.x2,s=n.y2,c=n.key,l=jy(IX(n,EX))??{};l.offset;var u=IX(l,DX),d=Array.isArray(u.strokeDasharray)?u.strokeDasharray.join(`,`):u.strokeDasharray;r=N.createElement(`line`,FX({},u,{strokeDasharray:d,x1:i,y1:a,x2:o,y2:s,fill:`none`,key:c}))}return r}function BX(e){var t=e.x,n=e.width,r=e.horizontal,i=r===void 0||r,a=e.horizontalPoints;if(!i||!a||!a.length)return null;e.xAxisId,e.yAxisId;var o=IX(e,OX),s=a.map((e,r)=>{var a=jX(jX({},o),{},{x1:t,y1:e,x2:t+n,y2:e,key:`line-${r}`,index:r});return N.createElement(zX,{key:`line-${r}`,option:i,lineItemProps:a})});return N.createElement(`g`,{className:`recharts-cartesian-grid-horizontal`},s)}function VX(e){var t=e.y,n=e.height,r=e.vertical,i=r===void 0||r,a=e.verticalPoints;if(!i||!a||!a.length)return null;e.xAxisId,e.yAxisId;var o=IX(e,kX),s=a.map((e,r)=>{var a=jX(jX({},o),{},{x1:e,y1:t,x2:e,y2:t+n,key:`line-${r}`,index:r});return N.createElement(zX,{option:i,lineItemProps:a,key:`line-${r}`})});return N.createElement(`g`,{className:`recharts-cartesian-grid-vertical`},s)}function HX(e){var t=e.horizontalFill,n=e.fillOpacity,r=e.x,i=e.y,a=e.width,o=e.height,s=e.horizontalPoints,c=e.horizontal;if(!(c===void 0||c)||!t||!t.length||s==null)return null;var l=s.map(e=>Math.round(e+i-i)).sort((e,t)=>e-t);i!==l[0]&&l.unshift(0);var u=l.map((e,s)=>{var c=l[s+1],u=c==null?i+o-e:c-e;if(u<=0)return null;var d=s%t.length;return N.createElement(`rect`,{key:`react-${s}`,y:e,x:r,height:u,width:a,stroke:`none`,fill:t[d],fillOpacity:n,className:`recharts-cartesian-grid-bg`})});return N.createElement(`g`,{className:`recharts-cartesian-gridstripes-horizontal`},u)}function UX(e){var t=e.vertical,n=t===void 0||t,r=e.verticalFill,i=e.fillOpacity,a=e.x,o=e.y,s=e.width,c=e.height,l=e.verticalPoints;if(!n||!r||!r.length)return null;var u=l.map(e=>Math.round(e+a-a)).sort((e,t)=>e-t);a!==u[0]&&u.unshift(0);var d=u.map((e,t)=>{var n=u[t+1],l=n==null?a+s-e:n-e;if(l<=0)return null;var d=t%r.length;return N.createElement(`rect`,{key:`react-${t}`,x:e,y:o,width:l,height:c,stroke:`none`,fill:r[d],fillOpacity:i,className:`recharts-cartesian-grid-bg`})});return N.createElement(`g`,{className:`recharts-cartesian-gridstripes-vertical`},d)}var WX=(e,t)=>{var n=e.xAxis,r=e.width,i=e.height,a=e.offset;return YE(GY(jX(jX(jX({},mX),n),{},{ticks:XE(n,!0),viewBox:{x:0,y:0,width:r,height:i}})),a.left,a.left+a.width,t)},GX=(e,t)=>{var n=e.yAxis,r=e.width,i=e.height,a=e.offset;return YE(GY(jX(jX(jX({},mX),n),{},{ticks:XE(n,!0),viewBox:{x:0,y:0,width:r,height:i}})),a.top,a.top+a.height,t)},KX={horizontal:!0,vertical:!0,horizontalPoints:[],verticalPoints:[],verticalFill:[],horizontalFill:[],xAxisId:0,yAxisId:0,syncWithTicks:!1,zIndex:KM.grid};function qX(e){var t=_O(),n=vO(),r=gO(),i=jX(jX({},Fx(e,KX)),{},{x:X(e.x)?e.x:r.left,y:X(e.y)?e.y:r.top,width:X(e.width)?e.width:r.width,height:X(e.height)?e.height:r.height}),a=i.xAxisId,o=i.yAxisId,s=i.x,c=i.y,l=i.width,u=i.height,d=i.syncWithTicks,f=i.horizontalValues,p=i.verticalValues,m=MD(),h=Z(e=>EV(e,`xAxis`,a,m)),g=Z(e=>EV(e,`yAxis`,o,m)),_=TX(),v={stroke:i.stroke??_.grid.stroke,strokeWidth:i.strokeWidth??_.grid.strokeWidth,strokeOpacity:i.strokeOpacity??_.grid.strokeOpacity,strokeDasharray:i.strokeDasharray??_.grid.strokeDasharray};if(!BE(l)||!BE(u)||!X(s)||!X(c))return null;var y=i.verticalCoordinatesGenerator||WX,b=i.horizontalCoordinatesGenerator||GX,x=i.horizontalPoints,S=i.verticalPoints;if((!x||!x.length)&&typeof b==`function`){var C=f&&f.length,w=b({yAxis:g?jX(jX({},g),{},{ticks:C?f:g.ticks}):void 0,width:t??l,height:n??u,offset:r},C?!0:d);RD(Array.isArray(w),`horizontalCoordinatesGenerator should return Array but instead it returned [${typeof w}]`),Array.isArray(w)&&(x=w)}if((!S||!S.length)&&typeof y==`function`){var T=p&&p.length,E=y({xAxis:h?jX(jX({},h),{},{ticks:T?p:h.ticks}):void 0,width:t??l,height:n??u,offset:r},T?!0:d);RD(Array.isArray(E),`verticalCoordinatesGenerator should return Array but instead it returned [${typeof E}]`),Array.isArray(E)&&(S=E)}return N.createElement(eW,{zIndex:i.zIndex},N.createElement(`g`,{className:`recharts-cartesian-grid`},N.createElement(RX,{fill:i.fill??_.grid.fill,fillOpacity:i.fillOpacity??_.grid.fillOpacity,x:i.x,y:i.y,width:i.width,height:i.height,ry:i.ry}),N.createElement(HX,FX({},i,{horizontalPoints:x})),N.createElement(UX,FX({},i,{verticalPoints:S})),N.createElement(BX,FX({},i,v,{offset:r,horizontalPoints:x,xAxis:h,yAxis:g})),N.createElement(VX,FX({},i,v,{offset:r,verticalPoints:S,xAxis:h,yAxis:g}))))}qX.displayName=`CartesianGrid`;var JX=[`animationElapsedTime`,`isAnimating`,`isEntrance`,`visibleLength`,`strokeDasharray`,`connectNulls`];function YX(){return YX=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},YX.apply(null,arguments)}function XX(e,t){if(e==null)return{};var n,r,i=ZX(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function ZX(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function QX(e){try{return e&&e.getTotalLength&&e.getTotalLength()||0}catch{return 0}}function $X(e,t){return`${t}px ${e}px`}function eZ(e){return e.length%2==0?e:[...e,...e]}function tZ(e,t){for(var n=[],r=0;r<t;++r)n.push(...e);return n}function nZ(e,t,n){var r=eZ(n),i=r.reduce((e,t)=>e+t,0);if(!i)return $X(t,e);for(var a=Math.floor(e/i),o=e%i,s=[],c=0,l=0;c<r.length;l+=(u=r[c])??0,++c){var u,d=r[c];if(d!=null&&l+d>o){s=[...r.slice(0,c),o-l];break}}var f=s.length%2==0?[0,t]:[t];return[...tZ(r,a),...s,...f].map(e=>`${e}px`).join(`, `)}function rZ(e,t,n){return e?nZ(n,t,`${e}`.split(/[,\s]+/gim).map(e=>parseFloat(e))):$X(t,n)}function iZ(e){e.animationElapsedTime,e.isAnimating,e.isEntrance;var t=e.visibleLength,n=e.strokeDasharray,r=e.connectNulls,i=XX(e,JX),a=r??!1,o;if(t!=null){var s=i.pathRef;o=rZ(n,QX(s?.current??null),t)}else n!=null&&(o=String(n));return N.createElement(tA,YX({},i,{connectNulls:a,strokeDasharray:o}))}function aZ(e){var t=(0,N.useRef)(0),n=(0,N.useRef)(0),r=(0,N.useRef)(!1),i=(0,N.useRef)(e);return i.current!==e&&(t.current=n.current,i.current=e),(0,N.useCallback)((e,i)=>{if(r.current)return null;var a=Math.min(tb(t.current+e*i),i);return e>0&&i>0&&(n.current=Math.max(n.current,a),a>=i)?(r.current=!0,null):a},[])}var oZ=WT({name:`errorBars`,initialState:{},reducers:{addErrorBar:(e,t)=>{var n=t.payload,r=n.itemId,i=n.errorBar;e[r]||(e[r]=[]),e[r].push(i)},replaceErrorBar:(e,t)=>{var n=t.payload,r=n.itemId,i=n.prev,a=n.next;e[r]&&(e[r]=e[r].map(e=>e.dataKey===i.dataKey&&e.direction===i.direction?a:e))},removeErrorBar:(e,t)=>{var n=t.payload,r=n.itemId,i=n.errorBar;e[r]&&(e[r]=e[r].filter(e=>e.dataKey!==i.dataKey||e.direction!==i.direction))}}}),sZ=oZ.actions;sZ.addErrorBar,sZ.replaceErrorBar,sZ.removeErrorBar;var cZ=oZ.reducer,lZ=[`children`];function uZ(e,t){if(e==null)return{};var n,r,i=dZ(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function dZ(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}var fZ=(0,N.createContext)({data:[],xAxisId:`xAxis-0`,yAxisId:`yAxis-0`,dataPointFormatter:()=>({x:0,y:0,value:0}),errorBarOffset:0});function pZ(e){var t=e.children,n=uZ(e,lZ);return N.createElement(fZ.Provider,{value:n},t)}function mZ(e,t){var n=Z(t=>Oz(t,e)),r=Z(e=>jz(e,t)),i=n?.allowDataOverflow??Ez.allowDataOverflow,a=r?.allowDataOverflow??kz.allowDataOverflow;return{needClip:i||a,needClipX:i,needClipY:a}}function hZ(e){var t=e.xAxisId,n=e.yAxisId,r=e.clipPathId,i=MJ(),a=mZ(t,n),o=a.needClipX,s=a.needClipY,c=a.needClip,l=Z(e=>tV(e,t,!1)),u=Z(e=>nV(e,n,!1));if(!c||!i)return null;var d=i.x,f=i.y,p=i.width,m=i.height,h=o&&l?Math.min(l[0],l[1]):d-p/2,g=s&&u?Math.min(u[0],u[1]):f-m/2,_=o&&l?Math.abs(l[1]-l[0]):p*2,v=s&&u?Math.abs(u[1]-u[0]):m*2;return N.createElement(`clipPath`,{id:`clipPath-${r}`},N.createElement(`rect`,{x:h,y:g,width:_,height:v}))}var gZ=(e,t,n,r)=>kV(e,`xAxis`,t,r),_Z=(e,t,n,r)=>OV(e,`xAxis`,t,r),vZ=(e,t,n,r)=>kV(e,`yAxis`,n,r),yZ=(e,t,n,r)=>OV(e,`yAxis`,n,r),bZ=Q([yO,gZ,vZ,_Z,yZ],(e,t,n,r,i)=>JE(e,`xAxis`)?oD(t,r,!1):oD(n,i,!1)),xZ=(e,t,n,r,i)=>i;function SZ(e){return e.type===`line`}var CZ=Q([yO,gZ,vZ,_Z,yZ,Q([zz,xZ],(e,t)=>e.filter(SZ).find(e=>e.id===t)),bZ,cM],(e,t,n,r,i,a,o,s)=>{var c=s.chartData,l=s.dataStartIndex,u=s.dataEndIndex;if(!(a==null||t==null||n==null||r==null||i==null||r.length===0||i.length===0||o==null||e!==`horizontal`&&e!==`vertical`)){var d=a.dataKey,f=a.data,p=f!=null&&f.length>0?f:c?.slice(l,u+1);if(p!=null)return YZ({layout:e,xAxis:t,yAxis:n,xAxisTicks:r,yAxisTicks:i,dataKey:d,bandSize:o,displayedData:p})}});function wZ(e){var t=My(e),n=3,r=2;if(t!=null){var i=t.r,a=t.strokeWidth,o=Number(i),s=Number(a);return(Number.isNaN(o)||o<0)&&(o=n),(Number.isNaN(s)||s<0)&&(s=r),{r:o,strokeWidth:s}}return{r:n,strokeWidth:r}}var TZ=[`id`],EZ=[`type`,`layout`,`connectNulls`,`needClip`,`shape`,`strokeDasharray`],DZ=[`activeDot`,`animateNewValues`,`animationBegin`,`animationDuration`,`animationEasing`,`connectNulls`,`dot`,`hide`,`isAnimationActive`,`label`,`legendType`,`xAxisId`,`yAxisId`,`id`];function OZ(){return OZ=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},OZ.apply(null,arguments)}function kZ(e,t){if(e==null)return{};var n,r,i=AZ(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function AZ(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function jZ(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function MZ(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?jZ(Object(n),!0).forEach(function(t){NZ(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):jZ(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function NZ(e,t,n){return(t=PZ(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function PZ(e){var t=FZ(e,`string`);return typeof t==`symbol`?t:t+``}function FZ(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function IZ(e){try{return e&&e.getTotalLength&&e.getTotalLength()||0}catch{return 0}}function LZ(e){var t=0,n=0;for(var r of e)r.status===`matched`&&r.prev.x!=null&&r.next.x!=null&&(t+=r.next.x-r.prev.x,n++);return n>0?t/n:0}var RZ={activeDot:!0,animateNewValues:!0,animationBegin:0,animationDuration:1500,animationEasing:`ease`,animationInterpolateFn:(e,t)=>{if(e==null)return[];if(t===1)return e.flatMap(e=>e.status===`removed`?[]:[e.next]);var n=LZ(e),r=[];for(var i of e)if(i.status===`matched`)r.push(MZ(MZ({},i.next),{},{x:db(i.prev.x,i.next.x,t),y:db(i.prev.y,i.next.y,t)}));else if(i.status===`added`){if(i.next.x!=null){var a=i.next.x-n;r.push(MZ(MZ({},i.next),{},{x:db(a,i.next.x,t),y:i.next.y}))}else r.push(i.next)}else if(i.status===`removed`&&i.prev.x!=null){var o=i.prev.x+n;r.push(MZ(MZ({},i.prev),{},{x:db(i.prev.x,o,t),y:i.prev.y}))}return r},animationMatchBy:wq,connectNulls:!1,dot:!0,fill:`#fff`,hide:!1,isAnimationActive:`auto`,label:!1,legendType:`line`,shape:iZ,stroke:`#3182bd`,strokeWidth:1,xAxisId:0,yAxisId:0,zIndex:KM.line,type:`linear`},zZ=e=>{var t=e.dataKey,n=e.name,r=e.stroke,i=e.legendType;return[{inactive:e.hide,dataKey:t,type:i,color:r,value:cD(n,t),payload:e}]},BZ=N.memo(e=>{var t=e.dataKey,n=e.data,r=e.stroke,i=e.strokeWidth,a=e.fill,o=e.name,s=e.hide,c=e.unit,l=e.formatter,u=e.tooltipType,d=e.id,f={dataDefinedOnItem:n,getPosition:gb,settings:{stroke:r,strokeWidth:i,fill:a,dataKey:t,nameKey:void 0,name:cD(o,t),hide:s,type:u,color:r,unit:c,formatter:l,graphicalItemId:d}};return N.createElement(gq,{tooltipEntrySettings:f})});function VZ(e){var t=e.clipPathId,n=e.points,r=e.props,i=r.dot,a=r.dataKey,o=r.needClip;r.id;var s=jy(kZ(r,TZ));return N.createElement(mJ,{points:n,dot:i,className:`recharts-line-dots`,dotClassName:`recharts-line-dot`,dataKey:a,baseProps:s,needClip:o,clipPathId:t})}function HZ(e){var t=e.showLabels,n=e.children,r=e.points,i=(0,N.useMemo)(()=>r?.map(e=>{var t={x:e.x??0,y:e.y??0,width:0,lowerWidth:0,upperWidth:0,height:0};return MZ(MZ({},t),{},{value:e.value,payload:e.payload,viewBox:t,parentViewBox:void 0,fill:void 0})}),[r]);return N.createElement(KK,{value:t?i:void 0},n)}function UZ(e){var t=e.clipPathId,n=e.pathRef,r=e.points,i=e.props,a=e.animationElapsedTime,o=e.isAnimating,s=e.isEntrance,c=e.visibleLength,l=i.type,u=i.layout,d=i.connectNulls,f=i.needClip,p=i.shape,m=i.strokeDasharray,h=MZ(MZ({},Ny(kZ(i,EZ))),{},{fill:`none`,className:`recharts-line-curve`,clipPath:f?`url(#clipPath-${t})`:void 0,points:r,type:l,layout:u,connectNulls:d,strokeDasharray:m??i.strokeDasharray,pathRef:n,animationElapsedTime:a,isAnimating:o,isEntrance:i.animateNewValues?s:!1,visibleLength:c});return N.createElement(N.Fragment,null,r?.length>1&&N.createElement(hq,{option:p,DefaultShape:RZ.shape,shapeProps:h}),N.createElement(VZ,{points:r,clipPathId:t,props:i}))}function WZ(e){var t=e.clipPathId,n=e.props,r=e.pathRef,i=e.previousPointsRef,a=n.points,o=n.isAnimationActive,s=n.animationBegin,c=n.animationDuration,l=n.animationEasing,u=n.animationMatchBy,d=n.animationInterpolateFn,f=n.layout,p=IZ(r.current),m=Rq(n.onAnimationStart,n.onAnimationEnd),h=m.isAnimating,g=m.handleAnimationStart,_=m.handleAnimationEnd,v=!h,y=aZ(a),b=(0,N.useCallback)(e=>e>0&&p>0,[p]);return N.createElement(HZ,{points:a,showLabels:v},n.children,N.createElement(zq,{animationInput:a,animationIdPrefix:`recharts-line-`,items:a,previousItemsRef:i,isAnimationActive:o,animationBegin:s,animationDuration:c,animationEasing:l,onAnimationStart:g,onAnimationEnd:_,animationInterpolateFn:d,animationMatchBy:u,shouldUpdatePreviousRef:b,layout:f},(e,i,a)=>{var o=h||i<1,s=o?y(i,p):null;return N.createElement(UZ,{props:n,points:e,clipPathId:t,pathRef:r,animationElapsedTime:i,isAnimating:o,isEntrance:a,visibleLength:s})}),N.createElement(ZK,{label:n.label}))}function GZ(e){var t=e.clipPathId,n=e.props,r=(0,N.useRef)(null),i=(0,N.useRef)(null);return N.createElement(WZ,{props:n,clipPathId:t,previousPointsRef:r,pathRef:i})}var KZ=(e,t)=>({x:e.x??void 0,y:e.y??void 0,value:e.value,errorVal:KE(e.payload,t)}),qZ=class extends N.Component{render(){var e=this.props,t=e.hide,n=e.dot,r=e.points,i=e.className,a=e.xAxisId,o=e.yAxisId,s=e.top,c=e.left,l=e.width,u=e.height,d=e.id,f=e.needClip,p=e.zIndex;if(t)return null;var m=qr(`recharts-line`,i),h=d,g=wZ(n),_=g.r,v=g.strokeWidth,y=iq(n),b=_*2+v,x=f?`url(#clipPath-${y?``:`dots-`}${h})`:void 0;return N.createElement(eW,{zIndex:p},N.createElement(Wy,{className:m},f&&N.createElement(`defs`,null,N.createElement(hZ,{clipPathId:h,xAxisId:a,yAxisId:o}),!y&&N.createElement(`clipPath`,{id:`clipPath-dots-${h}`},N.createElement(`rect`,{x:c-b/2,y:s-b/2,width:l+b,height:u+b}))),N.createElement(pZ,{xAxisId:a,yAxisId:o,data:r,dataPointFormatter:KZ,errorBarOffset:0},N.createElement(GZ,{props:this.props,clipPathId:h}))),N.createElement(BJ,{activeDot:this.props.activeDot,points:r,mainColor:this.props.stroke,itemDataKey:this.props.dataKey,clipPath:x}))}};function JZ(e){var t=Fx(e,RZ),n=t.activeDot,r=t.animateNewValues,i=t.animationBegin,a=t.animationDuration,o=t.animationEasing,s=t.connectNulls,c=t.dot,l=t.hide,u=t.isAnimationActive,d=t.label,f=t.legendType,p=t.xAxisId,m=t.yAxisId,h=t.id,g=kZ(t,DZ),_=mZ(p,m).needClip,v=MJ(),y=bO(),b=MD(),x=Z(e=>CZ(e,p,m,b,h));if(y!==`horizontal`&&y!==`vertical`||x==null||v==null)return null;var S=v.height,C=v.width,w=v.x,T=v.y;return N.createElement(qZ,OZ({},g,{id:h,connectNulls:s,dot:c,activeDot:n,animateNewValues:r,animationBegin:i,animationDuration:a,animationEasing:o,isAnimationActive:u,hide:l,label:d,legendType:f,xAxisId:p,yAxisId:m,points:x,layout:y,height:S,width:C,left:w,top:T,needClip:_}))}function YZ(e){var t=e.layout,n=e.xAxis,r=e.yAxis,i=e.xAxisTicks,a=e.yAxisTicks,o=e.dataKey,s=e.bandSize;return e.displayedData.map((e,c)=>{var l=KE(e,o);if(t===`horizontal`)return{x:eD({axis:n,ticks:i,bandSize:s,entry:e,index:c}),y:(pb(l)?null:r.scale.map(l))??null,value:l,payload:e};var u=pb(l)?null:n.scale.map(l),d=eD({axis:r,ticks:a,bandSize:s,entry:e,index:c});return u==null||d==null?null:{x:u,y:d,value:l,payload:e}}).filter(Boolean)}function XZ(e){var t=Fx(e,RZ),n=MD();return N.createElement(Yq,{id:t.id,type:`line`},e=>N.createElement(N.Fragment,null,N.createElement(_q,{legendPayload:zZ(t)}),N.createElement(BZ,{dataKey:t.dataKey,data:t.data,stroke:t.stroke,strokeWidth:t.strokeWidth,fill:t.fill,name:t.name,hide:t.hide,unit:t.unit,formatter:t.formatter,tooltipType:t.tooltipType,id:e}),N.createElement(nJ,{type:`line`,id:e,data:t.data,xAxisId:t.xAxisId,yAxisId:t.yAxisId,zAxisId:0,dataKey:t.dataKey,hide:t.hide,isPanorama:n}),N.createElement(JZ,OZ({},t,{id:e}))))}var ZZ=N.memo(XZ,YO);ZZ.displayName=`Line`;function QZ(e,t){return e.graphicalItems.cartesianItems.find(e=>e.id===t)?.xAxisId??0}function $Z(e,t){return e.graphicalItems.cartesianItems.find(e=>e.id===t)?.yAxisId??0}var eQ=(e,t,n)=>kV(e,`xAxis`,QZ(e,t),n),tQ=(e,t,n)=>OV(e,`xAxis`,QZ(e,t),n),nQ=(e,t,n)=>kV(e,`yAxis`,$Z(e,t),n),rQ=(e,t,n)=>OV(e,`yAxis`,$Z(e,t),n),iQ=Q([yO,eQ,nQ,tQ,rQ],(e,t,n,r,i)=>JE(e,`xAxis`)?oD(t,r,!1):oD(n,i,!1)),aQ=Q([zz,(e,t)=>t],(e,t)=>e.filter(e=>e.type===`area`).find(e=>e.id===t)),oQ=e=>JE(yO(e),`xAxis`)?`yAxis`:`xAxis`,sQ=(e,t)=>oQ(e)===`yAxis`?$Z(e,t):QZ(e,t),cQ=(e,t,n)=>dB(e,oQ(e),sQ(e,t),n),lQ=Q([yO,eQ,nQ,tQ,rQ,Q([aQ,cQ],(e,t)=>{if(e!=null&&t!=null){var n=e.stackId,r=hN(e);if(n!=null&&r!=null){var i=(t[n]?.stackedData)?.find(e=>e.key===r);if(i!=null)return i.map(e=>[e[0],e[1]])}}}),lM,iQ,aQ,GM,Q([aQ,cQ],(e,t)=>{if(e!=null&&e.stackId!=null&&t!=null){var n=t[e.stackId];if(n!=null)return n.graphicalItems.map(e=>e.dataKey).filter(hb)}})],(e,t,n,r,i,a,o,s,c,l,u)=>{var d=o.chartData,f=o.dataStartIndex,p=o.dataEndIndex;if(!(c==null||e!==`horizontal`&&e!==`vertical`||t==null||n==null||r==null||i==null||r.length===0||i.length===0||s==null)){var m=c.data,h=m&&m.length>0?m:d?.slice(f,p+1);if(h!=null)return HQ({layout:e,xAxis:t,yAxis:n,xAxisTicks:r,yAxisTicks:i,dataStartIndex:f,areaSettings:c,stackedData:a,displayedData:h,chartBaseValue:l,bandSize:s,stackDataKeys:u})}}),uQ=[`animationElapsedTime`,`isAnimating`,`isEntrance`,`layout`,`isRange`,`stroke`,`connectNulls`],dQ=[`id`,`baseLine`];function fQ(){return fQ=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},fQ.apply(null,arguments)}function pQ(e,t){if(e==null)return{};var n,r,i=mQ(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function mQ(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function hQ(e){var t=e.alpha,n=e.baseLine,r=e.points,i=e.strokeWidth,a=r[0]?.x,o=r[r.length-1]?.x;if(!$(a)||!$(o))return null;var s=t*Math.abs(a-o),c=Math.max(...r.map(e=>e.y||0));return X(n)?c=Math.max(n,c):n&&Array.isArray(n)&&n.length&&(c=Math.max(...n.map(e=>e.y||0),c)),X(c)?N.createElement(`rect`,{x:a<o?a:a-s,y:0,width:s,height:Math.floor(c+(i?parseInt(`${i}`,10):1))}):null}function gQ(e){var t=e.alpha,n=e.baseLine,r=e.points,i=e.strokeWidth,a=r[0]?.y,o=r[r.length-1]?.y;if(!$(a)||!$(o))return null;var s=t*Math.abs(a-o),c=Math.max(...r.map(e=>e.x||0));return X(n)?c=Math.max(n,c):n&&Array.isArray(n)&&n.length&&(c=Math.max(...n.map(e=>e.x||0),c)),X(c)?N.createElement(`rect`,{x:0,y:a<o?a:a-s,width:c+(i?parseInt(`${i}`,10):1),height:Math.floor(s)}):null}function _Q(e){var t=e.alpha,n=e.layout,r=e.points,i=e.baseLine,a=e.strokeWidth;return n===`vertical`?N.createElement(gQ,{alpha:t,points:r,baseLine:i,strokeWidth:a}):N.createElement(hQ,{alpha:t,points:r,baseLine:i,strokeWidth:a})}function vQ(e){var t=e.animationElapsedTime,n=t===void 0?1:t,r=e.isAnimating,i=r!==void 0&&r,a=e.isEntrance,o=a!==void 0&&a,s=e.layout,c=e.isRange,l=e.stroke,u=e.connectNulls,d=pQ(e,uQ),f=s===`vertical`?`vertical`:`horizontal`,p=u??!1,m=Kq(),h=d.id,g=d.baseLine,_=jy(pQ(d,dQ)),v=N.createElement(tA,fQ({},d,{id:h,baseLine:g,connectNulls:p,stroke:`none`,className:`recharts-area-area`,layout:f})),y=l!==`none`&&N.createElement(tA,fQ({},_,{className:`recharts-area-curve`,layout:f,type:d.type,connectNulls:p,fill:`none`,stroke:l,points:d.points})),b=l!==`none`&&c&&Array.isArray(g)&&N.createElement(tA,fQ({},_,{className:`recharts-area-curve`,layout:f,type:d.type,connectNulls:p,fill:`none`,stroke:l,points:g}));return o&&(i||n<1)?N.createElement(Wy,null,N.createElement(`defs`,null,N.createElement(`clipPath`,{id:m},N.createElement(_Q,{alpha:n,points:d.points??[],baseLine:g,layout:f,strokeWidth:d.strokeWidth}))),N.createElement(Wy,{clipPath:`url(#${m})`},v,y,b)):N.createElement(N.Fragment,null,v,y,b)}var yQ=[`id`],bQ=[`activeDot`,`animationBegin`,`animationDuration`,`animationEasing`,`connectNulls`,`dot`,`fill`,`fillOpacity`,`hide`,`isAnimationActive`,`legendType`,`stroke`,`xAxisId`,`yAxisId`];function xQ(){return xQ=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},xQ.apply(null,arguments)}function SQ(e,t){if(e==null)return{};var n,r,i=CQ(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function CQ(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function wQ(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function TQ(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?wQ(Object(n),!0).forEach(function(t){EQ(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):wQ(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function EQ(e,t,n){return(t=DQ(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function DQ(e){var t=OQ(e,`string`);return typeof t==`symbol`?t:t+``}function OQ(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}var kQ={activeDot:!0,animationBegin:0,animationDuration:1500,animationEasing:`ease`,animationMatchBy:wq,animationInterpolateFn:(e,t)=>e==null?[]:t===1?e.flatMap(e=>e.status===`removed`?[]:[e.next]):e.flatMap(e=>e.status===`matched`?[TQ(TQ({},e.next),{},{x:db(e.prev.x,e.next.x,t),y:db(e.prev.y,e.next.y,t)})]:e.status===`added`?[e.next]:[]),connectNulls:!1,dot:!1,fill:`#3182bd`,fillOpacity:.6,hide:!1,isAnimationActive:`auto`,legendType:`line`,stroke:`#3182bd`,strokeWidth:1,type:`linear`,label:!1,shape:vQ,xAxisId:0,yAxisId:0,zIndex:KM.area};function AQ(e,t){return e&&e!==`none`?e:t}var jQ=e=>{var t=e.dataKey,n=e.name,r=e.stroke,i=e.fill,a=e.legendType;return[{inactive:e.hide,dataKey:t,type:a,color:AQ(r,i),value:cD(n,t),payload:e}]},MQ=N.memo(e=>{var t=e.dataKey,n=e.data,r=e.stroke,i=e.strokeWidth,a=e.fill,o=e.name,s=e.hide,c=e.unit,l=e.formatter,u=e.tooltipType,d=e.id,f={dataDefinedOnItem:n,getPosition:gb,settings:{stroke:r,strokeWidth:i,fill:a,dataKey:t,nameKey:void 0,name:cD(o,t),hide:s,type:u,color:AQ(r,a),unit:c,formatter:l,graphicalItemId:d}};return N.createElement(gq,{tooltipEntrySettings:f})});function NQ(e){var t=e.clipPathId,n=e.points,r=e.props,i=r.needClip,a=r.dot,o=r.dataKey,s=jy(r);return N.createElement(mJ,{points:n,dot:a,className:`recharts-area-dots`,dotClassName:`recharts-area-dot`,dataKey:o,baseProps:s,needClip:i,clipPathId:t})}function PQ(e){var t=e.showLabels,n=e.children,r=e.points.map(e=>{var t={x:e.x??0,y:e.y??0,width:0,lowerWidth:0,upperWidth:0,height:0};return TQ(TQ({},t),{},{value:e.value,payload:e.payload,parentViewBox:void 0,viewBox:t,fill:void 0})});return N.createElement(KK,{value:t?r:void 0},n)}function FQ(e){var t=e.points,n=e.baseLine,r=e.needClip,i=e.clipPathId,a=e.props,o=e.animationElapsedTime,s=e.isAnimating,c=e.isEntrance,l=a.layout,u=a.type,d=a.stroke,f=a.connectNulls,p=a.isRange,m=a.shape,h=a.id,g=SQ(a,yQ),_=TQ(TQ({},Ny(g)),{},{id:h,points:t,connectNulls:f,type:u,baseLine:n,layout:l,stroke:d,isRange:p,animationElapsedTime:o,isAnimating:s,isEntrance:c});return N.createElement(N.Fragment,null,t?.length>1&&N.createElement(Wy,{clipPath:r?`url(#clipPath-${i})`:void 0},N.createElement(hq,{option:m,DefaultShape:kQ.shape,shapeProps:_})),N.createElement(NQ,{points:t,props:g,clipPathId:i}))}function IQ(e,t,n){return X(e)?db(X(t)?t:void 0,e,n):pb(e)||ib(e)?db(X(t)?t:void 0,0,n):e}function LQ(e){var t=e.needClip,n=e.clipPathId,r=e.props,i=e.previousPointsRef,a=e.previousBaselineRef,o=r.points,s=r.baseLine,c=r.isAnimationActive,l=r.animationBegin,u=r.animationDuration,d=r.animationEasing,f=r.animationMatchBy,p=r.animationInterpolateFn,m=(0,N.useMemo)(()=>({points:o,baseLine:s}),[o,s]),h=jq(m,a),g=xO(),_=Rq(r.onAnimationStart,r.onAnimationEnd),v=_.isAnimating,y=_.handleAnimationStart,b=_.handleAnimationEnd,x=h.startValue;if(g==null)return null;var S=Array.isArray(s)&&Array.isArray(x)?Aq(x,s,f):Array.isArray(s)?Aq(null,s,f):null;return N.createElement(zq,{animationInput:m,animationIdPrefix:`recharts-area-`,items:o,previousItemsRef:i,isAnimationActive:c,animationBegin:l,animationDuration:u,animationEasing:d,onAnimationStart:y,onAnimationEnd:b,animationInterpolateFn:p,animationMatchBy:f,layout:g},(e,i,a)=>{var c=i===1?s:Array.isArray(s)?p(S,i,g):a?s:IQ(s,x,i);return h.syncStepValue(c,i),N.createElement(PQ,{showLabels:!v,points:o},r.children,N.createElement(FQ,{points:e,baseLine:c,needClip:t,clipPathId:n,props:r,animationElapsedTime:i,isAnimating:v||i<1,isEntrance:a}),N.createElement(ZK,{label:r.label}))})}function RQ(e){var t=e.needClip,n=e.clipPathId,r=e.props,i=(0,N.useRef)(null),a=(0,N.useRef)();return N.createElement(LQ,{needClip:t,clipPathId:n,props:r,previousPointsRef:i,previousBaselineRef:a})}var zQ=class extends N.PureComponent{render(){var e=this.props,t=e.hide,n=e.dot,r=e.points,i=e.className,a=e.top,o=e.left,s=e.needClip,c=e.xAxisId,l=e.yAxisId,u=e.width,d=e.height,f=e.id,p=e.baseLine,m=e.zIndex;if(t)return null;var h=qr(`recharts-area`,i),g=f,_=wZ(n),v=_.r,y=_.strokeWidth,b=iq(n),x=v*2+y,S=s?`url(#clipPath-${b?``:`dots-`}${g})`:void 0;return N.createElement(eW,{zIndex:m},N.createElement(Wy,{className:h},s&&N.createElement(`defs`,null,N.createElement(hZ,{clipPathId:g,xAxisId:c,yAxisId:l}),!b&&N.createElement(`clipPath`,{id:`clipPath-dots-${g}`},N.createElement(`rect`,{x:o-x/2,y:a-x/2,width:u+x,height:d+x}))),N.createElement(RQ,{needClip:s,clipPathId:g,props:this.props})),N.createElement(BJ,{points:r,mainColor:AQ(this.props.stroke,this.props.fill),itemDataKey:this.props.dataKey,activeDot:this.props.activeDot,clipPath:S}),this.props.isRange&&Array.isArray(p)&&N.createElement(BJ,{points:p,mainColor:AQ(this.props.stroke,this.props.fill),itemDataKey:this.props.dataKey,activeDot:this.props.activeDot,clipPath:S}))}};function BQ(e){var t=e.activeDot,n=e.animationBegin,r=e.animationDuration,i=e.animationEasing,a=e.connectNulls,o=e.dot,s=e.fill,c=e.fillOpacity,l=e.hide,u=e.isAnimationActive,d=e.legendType,f=e.stroke,p=e.xAxisId,m=e.yAxisId,h=SQ(e,bQ),g=bO(),_=bU(),v=mZ(p,m).needClip,y=MD(),b=Z(t=>lQ(t,e.id,y))??{},x=b.points,S=b.isRange,C=b.baseLine,w=MJ();if(g!==`horizontal`&&g!==`vertical`||w==null||_!==`AreaChart`&&_!==`ComposedChart`)return null;var T=w.height,E=w.width,D=w.x,O=w.y;return!x||!x.length?null:N.createElement(zQ,xQ({},h,{activeDot:t,animationBegin:n,animationDuration:r,animationEasing:i,baseLine:C,connectNulls:a,dot:o,fill:s,fillOpacity:c,height:T,hide:l,layout:g,isAnimationActive:u,isRange:S,legendType:d,needClip:v,points:x,stroke:f,width:E,left:D,top:O,xAxisId:p,yAxisId:m}))}var VQ=(e,t,n,r,i)=>{var a=n??t;if(X(a))return a;var o=e===`horizontal`?i:r,s=o.scale.domain();if(o.type===`number`){var c=Math.max(s[0],s[1]),l=Math.min(s[0],s[1]);return a===`dataMin`?l:a===`dataMax`||c<0?c:Math.max(Math.min(s[0],s[1]),0)}return a===`dataMin`?s[0]:a===`dataMax`?s[1]:s[0]};function HQ(e){var t=e.areaSettings,n=t.connectNulls,r=t.baseValue,i=t.dataKey,a=e.stackedData,o=e.layout,s=e.chartBaseValue,c=e.xAxis,l=e.yAxis,u=e.displayedData,d=e.dataStartIndex,f=e.xAxisTicks,p=e.yAxisTicks,m=e.bandSize,h=e.stackDataKeys,g=a&&a.length,_=VQ(o,s,r,c,l),v=o===`horizontal`,y=!1,b=u.map((e,t)=>{var r;if(g)r=a[d+t];else{var o=KE(e,i);Array.isArray(o)?(r=o,y=!0):r=[_,o]}var s=r?.[1]??null,u=KE(e,i),b=g&&u==null&&h!=null&&h.length>0&&h.every(t=>KE(e,t)==null),x=s==null||g&&!n&&u==null||b;return v?{x:eD({axis:c,ticks:f,bandSize:m,entry:e,index:t}),y:x?null:l.scale.map(s)??null,value:r,payload:e}:{x:x?null:c.scale.map(s)??null,y:eD({axis:l,ticks:p,bandSize:m,entry:e,index:t}),value:r,payload:e}});return{points:b,baseLine:(g||y?b.map(e=>{var t=Array.isArray(e.value)?e.value[0]:null;return v?{x:e.x,y:t!=null&&e.y!=null?l.scale.map(t)??null:null,payload:e.payload}:{x:t==null?null:c.scale.map(t)??null,y:e.y,payload:e.payload}}):v?l.scale.map(_):c.scale.map(_))??0,isRange:y}}function UQ(e){var t=Fx(e,kQ),n=MD();return N.createElement(Yq,{id:t.id,type:`area`},e=>N.createElement(N.Fragment,null,N.createElement(_q,{legendPayload:jQ(t)}),N.createElement(MQ,{dataKey:t.dataKey,data:t.data,stroke:t.stroke,strokeWidth:t.strokeWidth,fill:t.fill,name:t.name,hide:t.hide,unit:t.unit,formatter:t.formatter,tooltipType:t.tooltipType,id:e}),N.createElement(nJ,{type:`area`,id:e,data:t.data,dataKey:t.dataKey,xAxisId:t.xAxisId,yAxisId:t.yAxisId,zAxisId:0,stackId:$E(t.stackId),hide:t.hide,barSize:void 0,baseValue:t.baseValue,isPanorama:n,connectNulls:t.connectNulls}),N.createElement(BQ,xQ({},t,{id:e}))))}var WQ=N.memo(UQ,YO);WQ.displayName=`Area`;var GQ=[`domain`,`range`],KQ=[`domain`,`range`];function qQ(e,t){if(e==null)return{};var n,r,i=JQ(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function JQ(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function YQ(e,t){return e===t?!0:Array.isArray(e)&&e.length===2&&Array.isArray(t)&&t.length===2?e[0]===t[0]&&e[1]===t[1]:!1}function XQ(e,t){if(e===t)return!0;var n=e.domain,r=e.range,i=qQ(e,GQ),a=t.domain,o=t.range,s=qQ(t,KQ);return!YQ(n,a)||!YQ(r,o)?!1:YO(i,s)}var ZQ=[`type`],QQ=[`dangerouslySetInnerHTML`,`ticks`,`scale`],$Q=[`id`,`scale`];function e$(){return e$=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},e$.apply(null,arguments)}function t$(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function n$(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?t$(Object(n),!0).forEach(function(t){r$(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):t$(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function r$(e,t,n){return(t=i$(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i$(e){var t=a$(e,`string`);return typeof t==`symbol`?t:t+``}function a$(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function o$(e,t){if(e==null)return{};var n,r,i=s$(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function s$(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function c$(e){var t=$S(),n=(0,N.useRef)(null),r=xO(),i=e.type,a=o$(e,ZQ),o=XM(r,`xAxis`,i),s=(0,N.useMemo)(()=>{if(o!=null)return n$(n$({},a),{},{type:o})},[a,o]);return(0,N.useLayoutEffect)(()=>{s!=null&&(n.current===null?t(SJ(s)):n.current!==s&&t(CJ({prev:n.current,next:s})),n.current=s)},[s,t]),(0,N.useLayoutEffect)(()=>()=>{n.current&&=(t(wJ(n.current)),null)},[t]),null}var l$=e=>{var t=e.xAxisId,n=e.className,r=e.height,i=e.label,a=(0,N.useRef)(null),o=(0,N.useRef)(null),s=Z(AD),c=MD(),l=$S(),u=`xAxis`,d=Z(e=>DV(e,u,t,c)),f=Z(e=>gV(e,t)),p=Z(e=>xV(e,t)),m=Z(e=>Dz(e,t));if((0,N.useLayoutEffect)(()=>{if(!(r!==`auto`||!f||kK(i)||(0,N.isValidElement)(i)||m==null)){var e=a.current;if(e){var n=e.getCalculatedHeight();Math.round(f.height)!==Math.round(n)&&l(kJ({id:t,height:n}))}}},[d,f,l,i,t,r,m]),f==null||p==null||m==null)return null;e.dangerouslySetInnerHTML,e.ticks,e.scale;var h=o$(e,QQ);m.id,m.scale;var g=o$(m,$Q);return N.createElement(CX,e$({},h,g,{ref:a,labelRef:o,x:p.x,y:p.y,width:f.width,height:f.height,className:qr(`recharts-${u} ${u}`,n),viewBox:s,ticks:d,axisType:u,axisId:t}))},u$={allowDataOverflow:Ez.allowDataOverflow,allowDecimals:Ez.allowDecimals,allowDuplicatedCategory:Ez.allowDuplicatedCategory,angle:Ez.angle,axisLine:mX.axisLine,height:Ez.height,hide:!1,includeHidden:Ez.includeHidden,interval:Ez.interval,label:!1,minTickGap:Ez.minTickGap,mirror:Ez.mirror,orientation:Ez.orientation,padding:Ez.padding,reversed:Ez.reversed,scale:Ez.scale,tick:Ez.tick,tickCount:Ez.tickCount,tickLine:mX.tickLine,tickSize:mX.tickSize,type:Ez.type,niceTicks:Ez.niceTicks,xAxisId:0},d$=N.memo(e=>{var t=Fx(e,u$);return N.createElement(N.Fragment,null,N.createElement(c$,{allowDataOverflow:t.allowDataOverflow,allowDecimals:t.allowDecimals,allowDuplicatedCategory:t.allowDuplicatedCategory,angle:t.angle,dataKey:t.dataKey,domain:t.domain,height:t.height,hide:t.hide,id:t.xAxisId,includeHidden:t.includeHidden,interval:t.interval,minTickGap:t.minTickGap,mirror:t.mirror,name:t.name,orientation:t.orientation,padding:t.padding,reversed:t.reversed,scale:t.scale,tick:t.tick,tickCount:t.tickCount,tickFormatter:t.tickFormatter,ticks:t.ticks,type:t.type,unit:t.unit,niceTicks:t.niceTicks}),N.createElement(l$,t))},XQ);d$.displayName=`XAxis`;var f$=[`type`],p$=[`dangerouslySetInnerHTML`,`ticks`,`scale`],m$=[`id`,`scale`];function h$(){return h$=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},h$.apply(null,arguments)}function g$(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function _$(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?g$(Object(n),!0).forEach(function(t){v$(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):g$(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function v$(e,t,n){return(t=y$(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function y$(e){var t=b$(e,`string`);return typeof t==`symbol`?t:t+``}function b$(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function x$(e,t){if(e==null)return{};var n,r,i=S$(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function S$(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function C$(e){var t=$S(),n=(0,N.useRef)(null),r=xO(),i=e.type,a=x$(e,f$),o=XM(r,`yAxis`,i),s=(0,N.useMemo)(()=>{if(o!=null)return _$(_$({},a),{},{type:o})},[o,a]);return(0,N.useLayoutEffect)(()=>{s!=null&&(n.current===null?t(TJ(s)):n.current!==s&&t(EJ({prev:n.current,next:s})),n.current=s)},[s,t]),(0,N.useLayoutEffect)(()=>()=>{n.current&&=(t(DJ(n.current)),null)},[t]),null}function w$(e){var t=e.yAxisId,n=e.className,r=e.width,i=e.label,a=(0,N.useRef)(null),o=(0,N.useRef)(null),s=Z(AD),c=MD(),l=$S(),u=`yAxis`,d=Z(e=>CV(e,t)),f=Z(e=>SV(e,t)),p=Z(e=>DV(e,u,t,c)),m=Z(e=>Az(e,t));if((0,N.useLayoutEffect)(()=>{if(!(r!==`auto`||!d||kK(i)||(0,N.isValidElement)(i)||m==null)){var e=a.current;if(e){var n=e.getCalculatedWidth();Math.round(d.width)!==Math.round(n)&&l(OJ({id:t,width:n}))}}},[p,d,l,i,t,r,m]),d==null||f==null||m==null)return null;e.dangerouslySetInnerHTML,e.ticks,e.scale;var h=x$(e,p$);m.id,m.scale;var g=x$(m,m$);return N.createElement(CX,h$({},h,g,{ref:a,labelRef:o,x:f.x,y:f.y,tickTextProps:r===`auto`?{width:void 0}:{width:r},width:d.width,height:d.height,className:qr(`recharts-${u} ${u}`,n),viewBox:s,ticks:p,axisType:u,axisId:t}))}var T$={allowDataOverflow:kz.allowDataOverflow,allowDecimals:kz.allowDecimals,allowDuplicatedCategory:kz.allowDuplicatedCategory,angle:kz.angle,axisLine:mX.axisLine,hide:!1,includeHidden:kz.includeHidden,interval:kz.interval,label:!1,minTickGap:kz.minTickGap,mirror:kz.mirror,orientation:kz.orientation,padding:kz.padding,reversed:kz.reversed,scale:kz.scale,tick:kz.tick,tickCount:kz.tickCount,tickLine:mX.tickLine,tickSize:mX.tickSize,type:kz.type,niceTicks:kz.niceTicks,width:kz.width,yAxisId:0},E$=N.memo(e=>{var t=Fx(e,T$);return N.createElement(N.Fragment,null,N.createElement(C$,{interval:t.interval,id:t.yAxisId,scale:t.scale,type:t.type,domain:t.domain,allowDataOverflow:t.allowDataOverflow,dataKey:t.dataKey,allowDuplicatedCategory:t.allowDuplicatedCategory,allowDecimals:t.allowDecimals,tickCount:t.tickCount,padding:t.padding,includeHidden:t.includeHidden,reversed:t.reversed,ticks:t.ticks,width:t.width,orientation:t.orientation,mirror:t.mirror,hide:t.hide,unit:t.unit,name:t.name,angle:t.angle,minTickGap:t.minTickGap,tick:t.tick,tickFormatter:t.tickFormatter,niceTicks:t.niceTicks}),N.createElement(w$,t))},XQ);E$.displayName=`YAxis`;var D$=Q([(e,t)=>t,yO,fN,xN,UH,GH,wU,OD],IU);function O$(e){return`getBBox`in e.currentTarget&&typeof e.currentTarget.getBBox==`function`}function k$(e){var t=e.currentTarget.getBoundingClientRect(),n,r;if(O$(e)){var i=e.currentTarget.getBBox();n=i.width>0?t.width/i.width:1,r=i.height>0?t.height/i.height:1}else{var a=e.currentTarget;n=a.offsetWidth>0?t.width/a.offsetWidth:1,r=a.offsetHeight>0?t.height/a.offsetHeight:1}var o=(e,i)=>({relativeX:Math.round((e-t.left)/n),relativeY:Math.round((i-t.top)/r)});return`touches`in e?Array.from(e.touches).map(e=>o(e.clientX,e.clientY)):o(e.clientX,e.clientY)}var A$=ST(`mouseClick`),j$=AE();j$.startListening({actionCreator:A$,effect:(e,t)=>{var n=e.payload,r=D$(t.getState(),k$(n));r?.activeIndex!=null&&t.dispatch(JV({activeIndex:r.activeIndex,activeDataKey:void 0,activeCoordinate:r.activeCoordinate}))}});var M$=ST(`mouseMove`),N$=AE(),P$=null,F$=null,I$=null;N$.startListening({actionCreator:M$,effect:(e,t)=>{var n=e.payload,r=t.getState().eventSettings,i=r.throttleDelay,a=r.throttledEvents,o=a===`all`||a?.includes(`mousemove`);P$!==null&&(cancelAnimationFrame(P$),P$=null),F$!==null&&(typeof i!=`number`||!o)&&(clearTimeout(F$),F$=null),I$=k$(n);var s=()=>{var e=t.getState(),n=PV(e,e.tooltip.settings.shared);if(!I$){P$=null,F$=null;return}if(n===`axis`){var r=D$(e,I$);r?.activeIndex==null?t.dispatch(KV()):t.dispatch(qV({activeIndex:r.activeIndex,activeDataKey:void 0,activeCoordinate:r.activeCoordinate}))}P$=null,F$=null};if(!o){s();return}i===`raf`?P$=requestAnimationFrame(s):typeof i==`number`&&F$===null&&(F$=setTimeout(s,i))}});function L$(e,t){return t instanceof HTMLElement?`HTMLElement <${t.tagName} class="${t.className}">`:t===window?`global.window`:e===`children`&&typeof t==`object`&&t?`<<CHILDREN>>`:t}var R$={accessibilityLayer:!0,barCategoryGap:`10%`,barGap:4,barSize:void 0,className:void 0,maxBarSize:void 0,stackOffset:`none`,syncId:void 0,syncMethod:`index`,baseValue:void 0,reverseStackOrder:!1},z$=WT({name:`rootProps`,initialState:R$,reducers:{updateOptions:(e,t)=>{e.accessibilityLayer=t.payload.accessibilityLayer,e.barCategoryGap=t.payload.barCategoryGap,e.barGap=t.payload.barGap??R$.barGap,e.barSize=t.payload.barSize,e.maxBarSize=t.payload.maxBarSize,e.stackOffset=t.payload.stackOffset,e.syncId=t.payload.syncId,e.syncMethod=t.payload.syncMethod,e.className=t.payload.className,e.baseValue=t.payload.baseValue,e.reverseStackOrder=t.payload.reverseStackOrder}}}),B$=z$.reducer,V$=z$.actions.updateOptions,H$=WT({name:`polarOptions`,initialState:null,reducers:{updatePolarOptions:(e,t)=>e===null?t.payload:(e.startAngle=t.payload.startAngle,e.endAngle=t.payload.endAngle,e.cx=t.payload.cx,e.cy=t.payload.cy,e.innerRadius=t.payload.innerRadius,e.outerRadius=t.payload.outerRadius,e)}});H$.actions.updatePolarOptions;var U$=H$.reducer,W$=ST(`keyDown`),G$=ST(`focus`),K$=ST(`blur`),q$=AE(),J$=null,Y$=null,X$=null;q$.startListening({actionCreator:W$,effect:(e,t)=>{X$=e.payload,J$!==null&&(cancelAnimationFrame(J$),J$=null);var n=t.getState().eventSettings,r=n.throttleDelay,i=n.throttledEvents,a=i===`all`||i.includes(`keydown`);Y$!==null&&(typeof r!=`number`||!a)&&(clearTimeout(Y$),Y$=null);var o=()=>{try{var e=t.getState();if(e.rootProps.accessibilityLayer===!1)return;var n=e.tooltip.keyboardInteraction,r=X$;if(r!==`ArrowRight`&&r!==`ArrowLeft`&&r!==`Enter`)return;var i=lH(n,jH(e),cB(e),BH(e)),a=i==null?-1:Number(i),o=!Number.isFinite(a)||a<0,s=GH(e),c=jH(e),l=PV(e,e.tooltip.settings.shared);if(r===`Enter`){if(o)return;var u=kU(e,l,`hover`,String(n.index));t.dispatch(XV({active:!n.active,activeIndex:n.index,activeCoordinate:u}));return}var d=AV(e)===`left-to-right`?1:-1,f=r===`ArrowRight`?1:-1,p;if(o){var m=cB(e),h=BH(e),g=f*d,_=e=>({active:!1,index:String(e),dataKey:void 0,graphicalItemId:void 0,coordinate:void 0});if(p=-1,g>0){for(var v=0;v<c.length;v++)if(lH(_(v),c,m,h)!=null){p=v;break}}else for(var y=c.length-1;y>=0;y--)if(lH(_(y),c,m,h)!=null){p=y;break}if(p<0)return}else{p=a+f*d;var b=s?.length||c.length;if(b===0||p>=b||p<0)return}var x=kU(e,l,`hover`,String(p));t.dispatch(XV({active:!0,activeIndex:p.toString(),activeCoordinate:x}))}finally{J$=null,Y$=null}};if(!a){o();return}r===`raf`?J$=requestAnimationFrame(o):typeof r==`number`&&Y$===null&&(o(),X$=null,Y$=setTimeout(()=>{X$?o():(Y$=null,J$=null)},r))}}),q$.startListening({actionCreator:G$,effect:(e,t)=>{var n=t.getState();if(n.rootProps.accessibilityLayer!==!1){var r=n.tooltip.keyboardInteraction;if(!r.active&&r.index==null){var i=`0`,a=kU(n,PV(n,n.tooltip.settings.shared),`hover`,String(i));t.dispatch(XV({active:!0,activeIndex:i,activeCoordinate:a}))}}}}),q$.startListening({actionCreator:K$,effect:(e,t)=>{var n=t.getState();if(n.rootProps.accessibilityLayer!==!1){var r=n.tooltip.keyboardInteraction;r.active&&t.dispatch(XV({active:!1,activeIndex:r.index,activeCoordinate:r.coordinate}))}}});function Z$(e){e.persist();var t=e.currentTarget;return new Proxy(e,{get:(e,n)=>{if(n===`currentTarget`)return t;var r=Reflect.get(e,n);return typeof r==`function`?r.bind(e):r}})}var Q$=ST(`externalEvent`),$$=AE(),e1=new Map,t1=new Map,n1=new Map;$$.startListening({actionCreator:Q$,effect:(e,t)=>{var n=e.payload,r=n.handler,i=n.reactEvent;if(r!=null){var a=i.type,o=Z$(i);n1.set(a,{handler:r,reactEvent:o});var s=e1.get(a);s!==void 0&&(cancelAnimationFrame(s),e1.delete(a));var c=t.getState().eventSettings,l=c.throttleDelay,u=c.throttledEvents,d=u===`all`||u?.includes(a),f=t1.get(a);f!==void 0&&(typeof l!=`number`||!d)&&(clearTimeout(f),t1.delete(a));var p=()=>{var e=n1.get(a);try{if(!e)return;var n=e.handler,r=e.reactEvent,i=t.getState(),o={activeCoordinate:tU(i),activeDataKey:QH(i),activeIndex:XH(i),activeLabel:ZH(i),activeTooltipIndex:XH(i),isTooltipActive:nU(i)};n&&n(o,r)}finally{e1.delete(a),t1.delete(a),n1.delete(a)}};if(!d){p();return}if(l===`raf`){var m=requestAnimationFrame(p);e1.set(a,m)}else if(typeof l==`number`){if(!t1.has(a)){p();var h=setTimeout(p,l);t1.set(a,h)}}else p()}}});var r1=Q([Q([pH],e=>e.tooltipItemPayloads),(e,t)=>t,(e,t,n)=>n],(e,t,n)=>{if(t!=null){var r=e.find(e=>e.settings.graphicalItemId===n);if(r!=null){var i=r.getPosition;if(i!=null)return i(t)}}}),i1=ST(`touchMove`),a1=AE(),o1=null,s1=null,c1=null,l1=null;a1.startListening({actionCreator:i1,effect:(e,t)=>{var n=e.payload;if(n.touches!=null&&n.touches.length!==0){l1=Z$(n);var r=t.getState().eventSettings,i=r.throttleDelay,a=r.throttledEvents,o=a===`all`||a.includes(`touchmove`);o1!==null&&(cancelAnimationFrame(o1),o1=null),s1!==null&&(typeof i!=`number`||!o)&&(clearTimeout(s1),s1=null),c1=Array.from(n.touches).map(e=>k$({clientX:e.clientX,clientY:e.clientY,currentTarget:n.currentTarget}));var s=()=>{if(l1!=null){var e=t.getState(),n=PV(e,e.tooltip.settings.shared);if(n===`axis`){var r=c1?.[0];if(r==null){o1=null,s1=null;return}var i=D$(e,r);i?.activeIndex!=null&&t.dispatch(qV({activeIndex:i.activeIndex,activeDataKey:void 0,activeCoordinate:i.activeCoordinate}))}else if(n===`item`){var a=l1.touches[0];if(document.elementFromPoint==null||a==null)return;var o=document.elementFromPoint(a.clientX,a.clientY);if(!o||!o.getAttribute)return;var s=o.getAttribute(_D),c=o.getAttribute(`data-recharts-item-id`)??void 0,l=DH(e).find(e=>e.id===c);if(s==null||l==null||c==null)return;var u=l.dataKey,d=r1(e,s,c);t.dispatch(GV({activeDataKey:u,activeIndex:s,activeCoordinate:d,activeGraphicalItemId:c}))}o1=null,s1=null}};if(!o){s();return}i===`raf`?o1=requestAnimationFrame(s):typeof i==`number`&&s1===null&&(s(),l1=null,s1=setTimeout(()=>{l1?s():(s1=null,o1=null)},i))}}});var u1={throttleDelay:`raf`,throttledEvents:[`mousemove`,`touchmove`,`pointermove`,`scroll`,`wheel`]},d1=WT({name:`eventSettings`,initialState:u1,reducers:{setEventSettings:(e,t)=>{t.payload.throttleDelay!=null&&(e.throttleDelay=t.payload.throttleDelay),t.payload.throttledEvents!=null&&(e.throttledEvents=_T(t.payload.throttledEvents))}}}),f1=d1.actions.setEventSettings,p1=d1.reducer,m1=GC({brush:WJ,cartesianAxis:AJ,chartData:TW,errorBars:cZ,eventSettings:p1,graphicalItems:tJ,layout:RE,legend:AO,options:vW,polarAxis:nq,polarOptions:U$,referenceElements:$J,renderedTicks:QY,rootProps:B$,tooltip:ZV,zIndex:$U}),h1=function(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:`Chart`;return PT({reducer:m1,preloadedState:e,middleware:e=>e({serializableCheck:!1,immutableCheck:![`commonjs`,`es6`,`production`].includes(`es6`)}).concat([j$.middleware,N$.middleware,q$.middleware,$$.middleware,a1.middleware]),enhancers:e=>{var t=e;return typeof e==`function`&&(t=e()),t.concat(MT({type:`raf`}))},devTools:vk.devToolsEnabled&&{serialize:{replacer:L$},name:`recharts-${t}`}})};function g1(e){var t=e.preloadedState,n=e.children,r=e.reduxStoreName,i=MD(),a=(0,N.useRef)(null);if(i)return n;a.current??=h1(t,r);var o=XS;return N.createElement(KO,{context:o,store:a.current},n)}function _1(e){var t=e.layout,n=e.margin,r=$S(),i=MD();return(0,N.useEffect)(()=>{i||(r(FE(t)),r(PE(n)))},[r,i,t,n]),null}var v1=(0,N.memo)(_1,YO);function y1(e){var t=$S();return(0,N.useEffect)(()=>{t(V$(e))},[t,e]),null}var b1=(0,N.memo)(e=>{var t=$S();return(0,N.useEffect)(()=>{t(f1(e))},[t,e]),null},YO);function x1(e){var t=e.zIndex,n=e.isPanorama,r=(0,N.useRef)(null),i=$S();return(0,N.useLayoutEffect)(()=>(r.current&&i(ZU({zIndex:t,element:r.current,isPanorama:n})),()=>{i(QU({zIndex:t,isPanorama:n}))}),[i,t,n]),N.createElement(`g`,{tabIndex:-1,ref:r,className:`recharts-zIndex-layer_${t}`})}function S1(e){var t=e.children,n=e.isPanorama,r=Z(RU);if(!r||r.length===0)return t;var i=r.filter(e=>e<0),a=r.filter(e=>e>0);return N.createElement(N.Fragment,null,i.map(e=>N.createElement(x1,{key:e,zIndex:e,isPanorama:n})),t,a.map(e=>N.createElement(x1,{key:e,zIndex:e,isPanorama:n})))}var C1=[`children`];function w1(e,t){if(e==null)return{};var n,r,i=T1(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function T1(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function E1(){return E1=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},E1.apply(null,arguments)}var D1={width:`100%`,height:`100%`,display:`block`},O1=(0,N.forwardRef)((e,t)=>{var n=_O(),r=vO(),i=Bk();if(!BE(n)||!BE(r))return null;var a=e.children,o=e.otherAttributes,s=e.title,c=e.desc,l,u;return o!=null&&(l=typeof o.tabIndex==`number`?o.tabIndex:i?0:void 0,u=typeof o.role==`string`?o.role:i?`application`:void 0),N.createElement(zy,E1({},o,{title:s,desc:c,role:u,tabIndex:l,width:n,height:r,style:D1,ref:t}),a)}),k1=e=>{var t=e.children,n=Z(PD);if(!n)return null;var r=n.width,i=n.height,a=n.y,o=n.x;return N.createElement(zy,{width:r,height:i,x:o,y:a},t)},A1=(0,N.forwardRef)((e,t)=>{var n=e.children,r=w1(e,C1);return MD()?N.createElement(k1,null,N.createElement(S1,{isPanorama:!0},n)):N.createElement(O1,E1({ref:t},r),N.createElement(S1,{isPanorama:!1},n))});function j1(e,t){return I1(e)||F1(e,t)||N1(e,t)||M1()}function M1(){throw TypeError(`Invalid attempt to destructure non-iterable instance.
|
|
101
101
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function N1(e,t){if(e){if(typeof e==`string`)return P1(e,t);var n={}.toString.call(e).slice(8,-1);return n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`?Array.from(e):n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?P1(e,t):void 0}}function P1(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function F1(e,t){var n=e==null?null:typeof Symbol<`u`&&e[Symbol.iterator]||e[`@@iterator`];if(n!=null){var r,i,a,o,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,t===0){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,i=e}finally{try{if(!c&&n.return!=null&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw i}}return s}}function I1(e){if(Array.isArray(e))return e}function L1(){var e=$S(),t=j1((0,N.useState)(null),2),n=t[0],r=t[1],i=Z(pD);return(0,N.useEffect)(()=>{if(n!=null){var t=n.getBoundingClientRect().width/n.offsetWidth;$(t)&&t!==i&&e(LE(t))}},[n,e,i]),r}function R1(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function z1(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?R1(Object(n),!0).forEach(function(t){B1(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):R1(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function B1(e,t,n){return(t=V1(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function V1(e){var t=H1(e,`string`);return typeof t==`symbol`?t:t+``}function H1(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function U1(){return U1=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},U1.apply(null,arguments)}function W1(e,t){return Y1(e)||J1(e,t)||K1(e,t)||G1()}function G1(){throw TypeError(`Invalid attempt to destructure non-iterable instance.
|
|
102
|
-
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function K1(e,t){if(e){if(typeof e==`string`)return q1(e,t);var n={}.toString.call(e).slice(8,-1);return n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`?Array.from(e):n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?q1(e,t):void 0}}function q1(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function J1(e,t){var n=e==null?null:typeof Symbol<`u`&&e[Symbol.iterator]||e[`@@iterator`];if(n!=null){var r,i,a,o,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,t===0){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,i=e}finally{try{if(!c&&n.return!=null&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw i}}return s}}function Y1(e){if(Array.isArray(e))return e}var X1=()=>(IW(),null);function Z1(e){if(typeof e==`number`)return e;if(typeof e==`string`){var t=parseFloat(e);if(!Number.isNaN(t))return t}return 0}var Q1=(0,N.forwardRef)((e,t)=>{var n=(0,N.useRef)(null),r=W1((0,N.useState)({containerWidth:Z1(e.style?.width),containerHeight:Z1(e.style?.height)}),2),i=r[0],a=r[1],o=(0,N.useCallback)((e,t)=>{a(n=>{var r=Math.round(e),i=Math.round(t);return n.containerWidth===r&&n.containerHeight===i?n:{containerWidth:r,containerHeight:i}})},[]),s=(0,N.useCallback)(e=>{if(typeof t==`function`&&t(e),n.current!=null&&(n.current.disconnect(),n.current=null),e!=null&&typeof ResizeObserver<`u`){var r=e.getBoundingClientRect(),i=r.width,a=r.height;o(i,a);var s=new ResizeObserver(e=>{var t=e[0];if(t!=null){var n=t.contentRect,r=n.width,i=n.height;o(r,i)}});s.observe(e),n.current=s}},[t,o]);return(0,N.useEffect)(()=>()=>{n.current?.disconnect()},[o]),N.createElement(N.Fragment,null,N.createElement(wO,{width:i.containerWidth,height:i.containerHeight}),N.createElement(`div`,U1({ref:s},e)))}),$1=(0,N.forwardRef)((e,t)=>{var n=e.width,r=e.height,i=W1((0,N.useState)({containerWidth:Z1(n),containerHeight:Z1(r)}),2),a=i[0],o=i[1],s=(0,N.useCallback)((e,t)=>{o(n=>{var r=Math.round(e),i=Math.round(t);return n.containerWidth===r&&n.containerHeight===i?n:{containerWidth:r,containerHeight:i}})},[]),c=(0,N.useCallback)(e=>{if(typeof t==`function`&&t(e),e!=null){var n=e.getBoundingClientRect(),r=n.width,i=n.height;s(r,i)}},[t,s]);return N.createElement(N.Fragment,null,N.createElement(wO,{width:a.containerWidth,height:a.containerHeight}),N.createElement(`div`,U1({ref:c},e)))}),e0=(0,N.forwardRef)((e,t)=>{var n=e.width,r=e.height;return N.createElement(N.Fragment,null,N.createElement(wO,{width:n,height:r}),N.createElement(`div`,U1({ref:t},e)))}),t0=(0,N.forwardRef)((e,t)=>{var n=e.width,r=e.height;return typeof n==`string`||typeof r==`string`?N.createElement($1,U1({},e,{ref:t})):typeof n==`number`&&typeof r==`number`?N.createElement(e0,U1({},e,{width:n,height:r,ref:t})):N.createElement(N.Fragment,null,N.createElement(wO,{width:n,height:r}),N.createElement(`div`,U1({ref:t},e)))});function n0(e){return e?Q1:t0}var r0=(0,N.forwardRef)((e,t)=>{var n=e.children,r=e.className,i=e.height,a=e.onClick,o=e.onContextMenu,s=e.onDoubleClick,c=e.onMouseDown,l=e.onMouseEnter,u=e.onMouseLeave,d=e.onMouseMove,f=e.onMouseUp,p=e.onTouchEnd,m=e.onTouchMove,h=e.onTouchStart,g=e.style,_=e.width,v=e.responsive,y=e.dispatchTouchEvents,b=y===void 0||y,x=(0,N.useRef)(null),S=$S(),C=W1((0,N.useState)(null),2),w=C[0],T=C[1],E=W1((0,N.useState)(null),2),D=E[0],O=E[1],k=L1(),A=dO(),j=A?.width>0?A.width:_,M=A?.height>0?A.height:i,ee=(0,N.useCallback)(e=>{k(e),typeof t==`function`&&t(e),T(e),O(e),e!=null&&(x.current=e)},[k,t,T,O]),P=(0,N.useCallback)(e=>{S(A$(e)),S(Q$({handler:a,reactEvent:e}))},[S,a]),F=(0,N.useCallback)(e=>{S(M$(e)),S(Q$({handler:l,reactEvent:e}))},[S,l]),I=(0,N.useCallback)(e=>{S(KV()),S(Q$({handler:u,reactEvent:e}))},[S,u]),te=(0,N.useCallback)(e=>{S(M$(e)),S(Q$({handler:d,reactEvent:e}))},[S,d]),ne=(0,N.useCallback)(()=>{S(G$())},[S]),re=(0,N.useCallback)(()=>{S(K$())},[S]),L=(0,N.useCallback)(e=>{S(W$(e.key))},[S]),R=(0,N.useCallback)(e=>{S(Q$({handler:o,reactEvent:e}))},[S,o]),ie=(0,N.useCallback)(e=>{S(Q$({handler:s,reactEvent:e}))},[S,s]),ae=(0,N.useCallback)(e=>{S(Q$({handler:c,reactEvent:e}))},[S,c]),oe=(0,N.useCallback)(e=>{S(Q$({handler:f,reactEvent:e}))},[S,f]),se=(0,N.useCallback)(e=>{S(Q$({handler:h,reactEvent:e}))},[S,h]),ce=(0,N.useCallback)(e=>{b&&S(i1(e)),S(Q$({handler:m,reactEvent:e}))},[S,b,m]),le=(0,N.useCallback)(e=>{S(Q$({handler:p,reactEvent:e}))},[S,p]),ue=n0(v);return N.createElement(uW.Provider,{value:w},N.createElement(Eb.Provider,{value:D},N.createElement(ue,{width:j??g?.width,height:M??g?.height,className:qr(`recharts-wrapper`,r),style:z1({position:`relative`,cursor:`default`,width:j,height:M},g),onClick:P,onContextMenu:R,onDoubleClick:ie,onFocus:ne,onBlur:re,onKeyDown:L,onMouseDown:ae,onMouseEnter:F,onMouseLeave:I,onMouseMove:te,onMouseUp:oe,onTouchEnd:le,onTouchMove:ce,onTouchStart:se,ref:ee},N.createElement(X1,null),n)))}),i0=[`width`,`height`,`responsive`,`children`,`className`,`style`,`compact`,`title`,`desc`];function a0(e,t){if(e==null)return{};var n,r,i=o0(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function o0(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}var s0=(0,N.forwardRef)((e,t)=>{var n=e.width,r=e.height,i=e.responsive,a=e.children,o=e.className,s=e.style,c=e.compact,l=e.title,u=e.desc,d=jy(a0(e,i0));return c?N.createElement(N.Fragment,null,N.createElement(wO,{width:n,height:r}),N.createElement(A1,{otherAttributes:d,title:l,desc:u},a)):N.createElement(r0,{className:o,style:s,width:n,height:r,responsive:i??!1,onClick:e.onClick,onMouseLeave:e.onMouseLeave,onMouseEnter:e.onMouseEnter,onMouseMove:e.onMouseMove,onMouseDown:e.onMouseDown,onMouseUp:e.onMouseUp,onContextMenu:e.onContextMenu,onDoubleClick:e.onDoubleClick,onTouchStart:e.onTouchStart,onTouchMove:e.onTouchMove,onTouchEnd:e.onTouchEnd},N.createElement(A1,{otherAttributes:d,title:l,desc:u,ref:t},N.createElement(sY,null,a)))});function c0(){return c0=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},c0.apply(null,arguments)}function l0(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function u0(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?l0(Object(n),!0).forEach(function(t){d0(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l0(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function d0(e,t,n){return(t=f0(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function f0(e){var t=p0(e,`string`);return typeof t==`symbol`?t:t+``}function p0(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}var m0=u0({accessibilityLayer:!0,barCategoryGap:`10%`,barGap:4,layout:`horizontal`,margin:{top:5,right:5,bottom:5,left:5},responsive:!1,reverseStackOrder:!1,stackOffset:`none`,syncMethod:`index`},u1),h0=(0,N.forwardRef)(function(e,t){var n=Fx(e.categoricalChartProps,m0),r=e.chartName,i=e.defaultTooltipEventType,a=e.validateTooltipEventTypes,o=e.tooltipPayloadSearcher,s=e.categoricalChartProps,c={chartName:r,defaultTooltipEventType:i,validateTooltipEventTypes:a,tooltipPayloadSearcher:o,eventEmitter:void 0};return N.createElement(g1,{preloadedState:{options:c},reduxStoreName:s.id??r},N.createElement(VJ,{chartData:s.data}),N.createElement(v1,{layout:n.layout,margin:n.margin}),N.createElement(b1,{throttleDelay:n.throttleDelay,throttledEvents:n.throttledEvents}),N.createElement(y1,{baseValue:n.baseValue,accessibilityLayer:n.accessibilityLayer,barCategoryGap:n.barCategoryGap,maxBarSize:n.maxBarSize,stackOffset:n.stackOffset,barGap:n.barGap,barSize:n.barSize,syncId:n.syncId,syncMethod:n.syncMethod,className:n.className,reverseStackOrder:n.reverseStackOrder}),N.createElement(s0,c0({},n,{ref:t})))}),g0=[`axis`],_0=(0,N.forwardRef)((e,t)=>N.createElement(h0,{chartName:`LineChart`,defaultTooltipEventType:`axis`,validateTooltipEventTypes:g0,tooltipPayloadSearcher:gW,categoricalChartProps:e,ref:t}));function v0(e){return e>=1?`hsl(var(--destructive))`:e>=.7?`hsl(45, 93%, 47%)`:`hsl(142, 71%, 45%)`}function y0(e){return new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})}var b0=36e5;function x0({cpuCores:e,className:t}){let{data:n}=O_(`/system/metrics/history`),r=Date.now(),i=r-b0,a=(n??[]).filter(e=>e.t>=i).map(e=>({t:e.t,value:e.one})),o=[0,15,30,45,60].map(e=>i+e*60*1e3),s=v0((a.length?a[a.length-1].value:0)/Math.max(e,1)),c=Math.max(...(n??[]).map(e=>Math.max(e.one,e.five,e.fifteen)),e,1);return(0,W.jsxs)(hy,{className:t,children:[(0,W.jsxs)(gy,{className:`flex flex-row items-center justify-between space-y-0 pb-2`,children:[(0,W.jsx)(_y,{className:`text-sm font-medium text-muted-foreground`,children:`Load Average · last 1 hour`}),(0,W.jsx)(qn,{className:`size-4 text-muted-foreground`})]}),(0,W.jsxs)(vy,{children:[(0,W.jsx)(pO,{width:`100%`,height:180,children:(0,W.jsxs)(_0,{data:a,margin:{top:0,right:0,left:-20,bottom:0},children:[(0,W.jsx)(`defs`,{children:(0,W.jsxs)(`linearGradient`,{id:`loadGradient`,x1:`0`,y1:`0`,x2:`0`,y2:`1`,children:[(0,W.jsx)(`stop`,{offset:`0%`,stopColor:s,stopOpacity:.35}),(0,W.jsx)(`stop`,{offset:`100%`,stopColor:s,stopOpacity:0})]})}),(0,W.jsx)(qX,{strokeDasharray:`3 3`,vertical:!1,stroke:`hsl(var(--border))`}),(0,W.jsx)(d$,{dataKey:`t`,type:`number`,scale:`time`,domain:[i,r],ticks:o,tickFormatter:y0,tick:{fontSize:12},tickLine:!1,axisLine:!1}),(0,W.jsx)(E$,{tick:{fontSize:12},tickLine:!1,axisLine:!1,domain:[0,Math.ceil(c*1.2)],allowDecimals:!1}),(0,W.jsx)($W,{contentStyle:{backgroundColor:`hsl(var(--card))`,border:`1px solid hsl(var(--border))`,borderRadius:`8px`,fontSize:`12px`},labelFormatter:e=>y0(Number(e)),formatter:e=>[Number(e).toFixed(2),`Load (1 min)`]}),(0,W.jsx)(wY,{y:e,stroke:`hsl(var(--destructive))`,strokeDasharray:`4 4`,strokeOpacity:.6}),(0,W.jsx)(WQ,{type:`monotone`,dataKey:`value`,stroke:`none`,fill:`url(#loadGradient)`,isAnimationActive:!1}),(0,W.jsx)(ZZ,{type:`monotone`,dataKey:`value`,stroke:s,strokeWidth:2,dot:{r:3,fill:s},activeDot:{r:6}})]})}),(0,W.jsxs)(`p`,{className:`text-xs text-muted-foreground mt-2 text-center`,children:[e,` CPU core`,e===1?``:`s`,` · Load ≥ `,e,` means saturated`]})]})]})}function S0(e){return e>=90?`bg-destructive`:e>=70?`bg-amber-500`:`bg-emerald-500`}function C0({title:e,value:t,subtitle:n,icon:r,percent:i,className:a}){return(0,W.jsxs)(hy,{className:a,children:[(0,W.jsxs)(gy,{className:`flex flex-row items-center justify-between space-y-0 pb-2`,children:[(0,W.jsx)(_y,{className:`text-sm font-medium text-muted-foreground`,children:e}),(0,W.jsx)(`span`,{className:`text-muted-foreground`,children:r})]}),(0,W.jsxs)(vy,{children:[(0,W.jsx)(`div`,{className:`text-2xl font-bold`,children:t}),n?(0,W.jsx)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:n}):null,i===void 0?null:(0,W.jsxs)(`div`,{className:`mt-3`,children:[(0,W.jsx)(`div`,{className:`h-2 w-full rounded-full bg-secondary`,children:(0,W.jsx)(`div`,{className:U(`h-full rounded-full transition-all`,S0(i)),style:{width:`${Math.min(100,Math.max(0,i))}%`}})}),(0,W.jsxs)(`p`,{className:`text-xs text-muted-foreground mt-1 text-right`,children:[i.toFixed(1),`%`]})]})]})]})}function w0(){let{data:e}=O_(`/instances`),t=e?.filter(e=>e.status===`running`)??[],n=e?.filter(e=>e.status===`stopped`)??[],r=e?.length??0;return(0,W.jsxs)(hy,{children:[(0,W.jsxs)(gy,{className:`flex flex-row items-center justify-between space-y-0 pb-2`,children:[(0,W.jsx)(_y,{className:`text-sm font-medium text-muted-foreground`,children:`PM2 Processes`}),(0,W.jsx)(Wn,{className:`size-4 text-muted-foreground`})]}),(0,W.jsxs)(vy,{children:[(0,W.jsx)(`div`,{className:`text-3xl font-bold`,children:r}),(0,W.jsx)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:r===0?`No processes running`:`process${r===1?``:`es`} managed`}),r>0?(0,W.jsxs)(`div`,{className:`flex items-center gap-4 mt-4`,children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,W.jsx)(p_,{tone:`running`}),(0,W.jsxs)(`span`,{className:`text-sm`,children:[t.length,` running`]})]}),n.length>0?(0,W.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,W.jsx)(p_,{tone:`stopped`}),(0,W.jsxs)(`span`,{className:`text-sm`,children:[n.length,` stopped`]})]}):null]}):null,r>0?(0,W.jsx)(`div`,{className:`mt-4 space-y-1.5 max-h-[140px] overflow-y-auto`,children:e?.slice(0,5).map(e=>(0,W.jsxs)(`div`,{className:`flex items-center justify-between text-xs`,children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[(0,W.jsx)(p_,{tone:e.status===`running`?`running`:`stopped`}),(0,W.jsx)(`span`,{className:`truncate`,children:e.name})]}),(0,W.jsx)(`span`,{className:`text-muted-foreground shrink-0`,children:e.uptime})]},e.name))}):null]})]})}function T0({host:e,user:t}){return(0,W.jsxs)(Bg,{className:`mb-6`,children:[(0,W.jsx)(jr,{className:`size-4`}),(0,W.jsxs)(Vg,{children:[`Limited privileges on `,e]}),(0,W.jsxs)(Hg,{children:[`Installing dependencies and writing Nginx config needs root on the server. Sign in as root, or enable passwordless sudo for `,(0,W.jsx)(`span`,{className:`font-medium`,children:t}),`, to enable those actions.`]})]})}function E0(e){return e>=1024?`${(e/1024).toFixed(1)} GB`:`${Math.round(e)} MB`}function D0(e){return e>=1024?`${(e/1024).toFixed(1)} TB`:`${e.toFixed(1)} GB`}function O0({metrics:e}){let{cpu:t,memory:n,disk:r,swap:i,uptime:a}=e;return(0,W.jsxs)(`div`,{className:`grid gap-4 grid-cols-2 lg:grid-cols-5`,children:[(0,W.jsx)(C0,{title:`CPU`,value:`${t.usagePercent.toFixed(1)}%`,subtitle:`${t.cores} cores`,icon:(0,W.jsx)(rr,{className:`size-4`}),percent:t.usagePercent}),(0,W.jsx)(C0,{title:`Memory`,value:`${n.usagePercent.toFixed(1)}%`,subtitle:`${E0(n.usedMb)} / ${E0(n.totalMb)}`,icon:(0,W.jsx)(_r,{className:`size-4`}),percent:n.usagePercent}),(0,W.jsx)(C0,{title:`Swap`,value:i.totalMb>0?`${i.usagePercent.toFixed(1)}%`:`N/A`,subtitle:i.totalMb>0?`${E0(i.usedMb)} / ${E0(i.totalMb)}`:`No swap configured`,icon:(0,W.jsx)(Kn,{className:`size-4`}),percent:i.totalMb>0?i.usagePercent:void 0}),(0,W.jsx)(C0,{title:`Disk`,value:`${r.usagePercent.toFixed(1)}%`,subtitle:`${D0(r.usedGb)} / ${D0(r.totalGb)}`,icon:(0,W.jsx)(ur,{className:`size-4`}),percent:r.usagePercent}),(0,W.jsx)(C0,{title:`Uptime`,value:a,subtitle:`System uptime`,icon:(0,W.jsx)(Br,{className:`size-4`})})]})}function k0({processes:e}){return(0,W.jsxs)(hy,{children:[(0,W.jsxs)(gy,{className:`flex flex-row items-center justify-between space-y-0 pb-2`,children:[(0,W.jsx)(_y,{className:`text-sm font-medium text-muted-foreground`,children:`Top Processes`}),(0,W.jsx)(Wn,{className:`size-4 text-muted-foreground`})]}),(0,W.jsx)(vy,{children:e.length===0?(0,W.jsx)(`p`,{className:`text-sm text-muted-foreground text-center py-4`,children:`No process data available`}):(0,W.jsxs)(wv,{children:[(0,W.jsx)(Tv,{children:(0,W.jsxs)(Dv,{children:[(0,W.jsx)(Ov,{children:`Process`}),(0,W.jsx)(Ov,{className:`text-right`,children:`CPU`}),(0,W.jsx)(Ov,{className:`text-right`,children:`Memory`})]})}),(0,W.jsx)(Ev,{children:e.map(e=>(0,W.jsxs)(Dv,{children:[(0,W.jsx)(kv,{className:`font-medium`,children:(0,W.jsx)(`span`,{className:`truncate max-w-[120px] block`,children:e.name})}),(0,W.jsx)(kv,{className:`text-right`,children:(0,W.jsxs)(`span`,{className:e.cpu>50?`text-destructive font-medium`:e.cpu>20?`text-amber-500 font-medium`:``,children:[e.cpu.toFixed(1),`%`]})}),(0,W.jsx)(kv,{className:`text-right`,children:(0,W.jsxs)(`span`,{className:e.memory>50?`text-destructive font-medium`:e.memory>20?`text-amber-500 font-medium`:``,children:[e.memory.toFixed(1),`%`]})})]},`${e.name}-${e.pid}`))})]})})]})}function A0({active:e}){return e?(0,W.jsxs)(Mv,{variant:`secondary`,className:`gap-1 font-normal text-emerald-700 dark:text-emerald-400`,children:[(0,W.jsx)(Nr,{className:`size-3`}),`Certificate active`]}):(0,W.jsxs)(Mv,{variant:`outline`,className:`gap-1 border-amber-200 font-normal text-amber-600 dark:border-amber-900 dark:text-amber-500`,children:[(0,W.jsx)(jr,{className:`size-3`}),`Certificate expired`]})}var j0=/^[a-z][a-z0-9+.-]*:\/\//i,M0=/^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$/i;function N0(e){let t=e.trim();if(!t)return{valid:!1,error:`Enter a domain`};if(j0.test(t)){let e=t.replace(j0,``);return{valid:!1,error:`Remove the "${t.slice(0,t.indexOf(`://`)+3)}" prefix — enter just "${e.split(`/`)[0]}"`}}return t.includes(`/`)?{valid:!1,error:`Domain should not include a path`}:t.includes(`:`)?{valid:!1,error:`Domain should not include a port — set that below`}:/\s/.test(t)?{valid:!1,error:`Domain cannot contain spaces`}:M0.test(t)?{valid:!0}:{valid:!1,error:`Enter a valid domain, e.g. example.com`}}function P0(e){let t=e.trim();if(!t)return{valid:!1,error:`Enter a port`};if(!/^\d+$/.test(t))return{valid:!1,error:`Port must be a number`};let n=Number(t);return n<1||n>65535?{valid:!1,error:`Port must be between 1 and 65535`}:n===80||n===443?{valid:!0,warning:`Nginx itself listens on 80/443 — this should be the port your app runs on`}:n<1024?{valid:!0,warning:`Ports below 1024 usually need root to bind`}:{valid:!0}}function F0(){let{hostname:e}=window.location;return e&&e!==`localhost`?e:`your-server-ip`}function I0(){let e=F0();return(0,W.jsxs)(Bg,{variant:`warning`,children:[(0,W.jsx)(Hr,{}),(0,W.jsx)(Vg,{children:`Point your DNS here first`}),(0,W.jsxs)(Hg,{children:[(0,W.jsx)(`p`,{children:`Nginx needs the domain already resolving to this server:`}),(0,W.jsxs)(`ol`,{className:`mt-1.5 list-decimal space-y-0.5 pl-4`,children:[(0,W.jsx)(`li`,{children:`Open your domain's DNS settings with your registrar`}),(0,W.jsxs)(`li`,{children:[`Add an `,(0,W.jsx)(`span`,{className:`font-medium`,children:`A record`}),` — host `,(0,W.jsx)(`code`,{children:`@`}),` (or a subdomain), value `,(0,W.jsx)(`code`,{className:`font-medium`,children:e})]}),(0,W.jsx)(`li`,{children:`Wait for it to propagate — usually minutes, sometimes longer`})]})]})]})}function L0({value:e,onChange:t,validation:n,touched:r}){let i=r&&!n.valid;return(0,W.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,W.jsxs)(fg,{htmlFor:`domain`,className:`text-muted-foreground flex items-center gap-1 text-xs font-medium`,children:[`Domain`,(0,W.jsx)(Lg,{children:`A domain or subdomain, e.g. example.com or app.example.com`})]}),(0,W.jsx)(Ag,{id:`domain`,value:e,onChange:e=>t(e.target.value),placeholder:`example.com`,autoComplete:`off`,autoCapitalize:`off`,spellCheck:!1,"aria-invalid":i,className:U(`h-9`,i&&`border-destructive focus-visible:ring-destructive/20`)}),i?(0,W.jsx)(jg,{tone:`error`,children:n.error}):(0,W.jsx)(`p`,{className:`text-muted-foreground text-xs`,children:`Just the domain — no https:// and no trailing path.`})]})}function R0({value:e,onChange:t,validation:n,touched:r}){let i=r&&!n.valid,a=r&&n.valid&&!!n.warning;return(0,W.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,W.jsxs)(fg,{htmlFor:`port`,className:`text-muted-foreground flex items-center gap-1 text-xs font-medium`,children:[`Port`,(0,W.jsx)(Lg,{children:`The project's port, e.g. localhost:3000, 5000, 8000`})]}),(0,W.jsx)(Ag,{id:`port`,value:e,onChange:e=>t(e.target.value),placeholder:`3000`,inputMode:`numeric`,"aria-invalid":i,className:U(`h-9`,i&&`border-destructive focus-visible:ring-destructive/20`)}),i?(0,W.jsx)(jg,{tone:`error`,children:n.error}):a?(0,W.jsx)(jg,{tone:`warning`,children:n.warning}):(0,W.jsx)(`p`,{className:`text-muted-foreground text-xs`,children:`The local port you want to connect.`})]})}function z0({checked:e,onChange:t}){return(0,W.jsxs)(`div`,{className:`border-border flex items-start justify-between gap-4 rounded-lg border px-3 py-2.5`,children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(fg,{htmlFor:`ssl`,className:`text-sm font-medium`,children:`Request SSL certificate`}),(0,W.jsx)(`p`,{className:`text-muted-foreground mt-0.5 text-xs`,children:`Uses Certbot. The domain's DNS must already point at this server's IP.`})]}),(0,W.jsx)(Cv,{id:`ssl`,checked:e,onCheckedChange:t,className:`mt-0.5`})]})}function B0({onSubmit:e,onCancel:t}){let n=(0,N.useId)(),[r,i]=(0,N.useState)(``),[a,o]=(0,N.useState)(``),[s,c]=(0,N.useState)(!0),[l,u]=(0,N.useState)(!1),[d,f]=(0,N.useState)(!1),[p,m]=(0,N.useState)(!1),h=N0(r),g=P0(a),_=h.valid&&g.valid;return(0,W.jsxs)(`form`,{id:n,onSubmit:async t=>{if(t.preventDefault(),u(!0),f(!0),!(!_||p)){m(!0);try{await e({domain:r.trim(),port:a.trim(),ssl:s})}catch{}finally{m(!1)}}},className:`grid gap-4`,children:[(0,W.jsx)(L0,{value:r,onChange:e=>{i(e),u(!0)},validation:h,touched:l}),(0,W.jsx)(R0,{value:a,onChange:e=>{o(e),f(!0)},validation:g,touched:d}),(0,W.jsx)(z0,{checked:s,onChange:c}),(0,W.jsx)(I0,{}),(0,W.jsxs)(`div`,{className:`mt-1 flex justify-end gap-2`,children:[(0,W.jsx)(Y,{type:`button`,variant:`outline`,onClick:t,disabled:p,children:`Cancel`}),(0,W.jsx)(Y,{type:`submit`,disabled:p,children:p?`Adding…`:`Add domain`})]})]})}function V0({onCreate:e,disabled:t}){let[n,r]=(0,N.useState)(!1);return(0,W.jsxs)(Kg,{open:n,onOpenChange:r,children:[(0,W.jsx)(qg,{asChild:!0,children:(0,W.jsxs)(Y,{size:`sm`,disabled:t,children:[(0,W.jsx)(wr,{className:`size-4`}),`Add domain`]})}),(0,W.jsxs)(Xg,{className:`sm:max-w-100`,children:[(0,W.jsxs)(Zg,{children:[(0,W.jsx)($g,{children:`Add domain`}),(0,W.jsx)(e_,{children:`Nginx will proxy this domain to a port on this server.`})]}),(0,W.jsx)(B0,{onCancel:()=>r(!1),onSubmit:async t=>{await e(t),r(!1)}})]})]})}function H0({domain:e,onDelete:t}){return(0,W.jsxs)(mg,{children:[(0,W.jsx)(hg,{asChild:!0,children:(0,W.jsx)(Y,{variant:`ghost`,size:`icon-sm`,"aria-label":`Delete ${e}`,className:`text-muted-foreground hover:text-destructive`,children:(0,W.jsx)(Vr,{className:`size-3.5`})})}),(0,W.jsxs)(vg,{children:[(0,W.jsxs)(yg,{children:[(0,W.jsxs)(xg,{children:[`Delete `,e,`?`]}),(0,W.jsx)(Sg,{children:`This removes the Nginx config for this domain and revokes its certificate. The site will stop responding at this domain.`})]}),(0,W.jsxs)(bg,{children:[(0,W.jsx)(wg,{children:`Cancel`}),(0,W.jsx)(Cg,{variant:`destructive`,onClick:()=>t(e),children:`Delete domain`})]})]})]})}function U0({active:e=!0,className:t}){return(0,W.jsx)(`span`,{role:`img`,"aria-label":e?`Active`:`Inactive`,title:e?`Active`:`Inactive`,className:U(`inline-block size-1.5 shrink-0 rounded-full`,e?`bg-emerald-500`:`bg-red-500`,t)})}function W0({secure:e}){return e?(0,W.jsxs)(Mv,{variant:`secondary`,className:`gap-1 font-normal`,children:[(0,W.jsx)(hr,{className:`size-3`}),`SSL`]}):(0,W.jsxs)(Mv,{variant:`outline`,className:`text-muted-foreground gap-1 font-normal`,children:[(0,W.jsx)(Pr,{className:`size-3`}),`No SSL`]})}function G0({domain:e,onReissue:t,onDelete:n}){let r=e.ssl&&e.certificateActive===!1;return(0,W.jsx)(Rg,{leading:(0,W.jsx)(U0,{active:e.active}),title:e.domain,subtitle:`Proxied to localhost:${e.port}`,trailing:(0,W.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[e.ssl?(0,W.jsx)(A0,{active:e.certificateActive}):null,e.ssl?null:(0,W.jsxs)(Y,{variant:`outline`,size:`sm`,"aria-label":`Issue SSL certificate for ${e.domain}`,onClick:()=>t(e.domain),children:[(0,W.jsx)(Fr,{className:`size-3.5`}),`Issue SSL Certificate`]}),r?(0,W.jsxs)(Pg,{children:[(0,W.jsx)(Fg,{asChild:!0,children:(0,W.jsx)(Y,{variant:`outline`,size:`icon-sm`,"aria-label":`Reissue certificate for ${e.domain}`,onClick:()=>t(e.domain),children:(0,W.jsx)(Tr,{className:`size-3.5`})})}),(0,W.jsx)(Ig,{children:`Reissue certificate`})]}):null,(0,W.jsx)(W0,{secure:e.ssl}),(0,W.jsx)(H0,{domain:e.domain,onDelete:n})]})})}function K0({domains:e,onReissue:t,onDelete:n}){return e.length===0?(0,W.jsx)(Og,{icon:lr,title:`No domains yet`,description:`Point a domain at this server and easy vps will write the Nginx config and fetch a certificate.`}):(0,W.jsx)(`div`,{className:`border-border rounded-lg border px-3`,children:e.map(e=>(0,W.jsx)(G0,{domain:e,onReissue:t,onDelete:n},e.domain))})}function q0(){let e=O_(`/domains`);return{domains:e.data??[],loading:e.loading,error:e.error,reload:e.reload}}function J0(){let{domains:e,loading:t,error:n,reload:r}=q0(),{data:i,reload:a}=O_(`/system/status`),[o,s]=(0,N.useState)(null),c=i?.dependencies.some(e=>e.name===`nginx`&&e.installed);return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(n_,{title:`Domains`,description:`Nginx virtual hosts and their certificates.`,action:(0,W.jsx)(V0,{onCreate:async e=>{let t={domain:e.domain,port:Number(e.port),ssl:e.ssl},n=w_.post(`/domains`,t);K_.promise(n,{loading:`Adding ${t.domain}…`,success:e=>e.ssl===`failed`?`${t.domain} added without SSL`:`${t.domain} added`,description:e=>e.ssl===`failed`?e.sslError??`The certificate could not be issued.`:`Proxies to localhost:${t.port}${e.ssl===`issued`?` · SSL active`:``}`,error:e=>e.message||`Could not add ${t.domain}`}),await n,r()},disabled:!c})}),i&&!i.root?(0,W.jsx)(T0,{host:i.host,user:i.user}):null,i&&!c?(0,W.jsxs)(Bg,{className:`mb-6`,children:[(0,W.jsx)(kr,{className:`size-4`}),(0,W.jsx)(Vg,{children:`Nginx is not installed`}),(0,W.jsx)(Hg,{children:`Nginx is required to manage domains. Install it before adding a domain.`}),(0,W.jsx)(Ug,{children:(0,W.jsx)(Y,{size:`sm`,onClick:()=>s({name:`nginx`,action:`install`}),children:`Install Nginx`})})]}):null,(0,W.jsx)(Ty,{run:o,onOpenChange:e=>!e&&s(null),onFinished:a}),(0,W.jsx)(Gg,{loading:t,error:n,children:(0,W.jsx)(K0,{domains:e,onReissue:async e=>{let t=w_.post(`/domains/${e}/ssl`);K_.promise(t,{loading:`Reissuing certificate for ${e}…`,success:`Certificate renewed for ${e}`,error:t=>t.message||`Could not reissue certificate for ${e}`}),await t.catch(()=>{}),r()},onDelete:async e=>{let t=w_.delete(`/domains/${e}`);K_.promise(t,{loading:`Deleting ${e}…`,success:`${e} deleted`,error:t=>t.message||`Could not delete ${e}`}),await t.catch(()=>{}),r()}})})]})}function Y0(e){let t=e.trim();return t?/\s/.test(t)?{valid:!1,error:`Project name cannot contain spaces`}:/^[a-z0-9][a-z0-9._-]*$/i.test(t)?t.length>63?{valid:!1,error:`Project name must be 63 characters or fewer`}:{valid:!0}:{valid:!1,error:`Use only letters, numbers, hyphens, dots, or underscores`}:{valid:!1,error:`Enter a project name`}}function X0(e){let t=e.trim();return t?/^https:\/\/github\.com\/.+\/.+/.test(t)?{valid:!0}:{valid:!1,error:`Enter a GitHub URL, e.g. https://github.com/user/repo`}:{valid:!1,error:`Enter a repository URL`}}function Z0(e){let t=e.trim();return t?/[~^:?*[\\\s]/.test(t)?{valid:!1,error:`Branch name contains invalid characters`}:{valid:!0}:{valid:!1,error:`Enter a branch name`}}function Q0(e){return e.trim()?{valid:!0}:{valid:!1,error:`Enter an install command`}}function $0(e){return e.trim()?{valid:!0}:{valid:!1,error:`Enter a build command`}}function e2(e){return e.trim()?{valid:!0}:{valid:!1,error:`Enter a run command`}}function t2(e){return e.trim()?{valid:!0}:{valid:!1,error:`Choose a domain`}}var n2={npm:{install:`npm install`,build:`npm run build`,run:`npm start`},yarn:{install:`yarn install`,build:`yarn build`,run:`yarn start`},pnpm:{install:`pnpm install`,build:`pnpm build`,run:`pnpm start`},bun:{install:`bun install`,build:`bun run build`,run:`bun run start`}};function r2(e){return n2[e]??{install:`npm install`,build:`npm run build`,run:`npm start`}}var i2=[`npm`,`yarn`,`pnpm`,`bun`],a2=[`pm2`,`docker`];function o2({onSubmit:e,onCancel:t,submitting:n}){let r=(0,N.useId)(),{domains:i,loading:a}=q0(),[o,s]=(0,N.useState)({name:``,domain:``,repository:``,branch:`main`,installCommand:`npm install`,buildCommand:`npm run build`,runCommand:`npm start`}),[c,l]=(0,N.useState)(`npm`),[u,d]=(0,N.useState)(`pm2`),[f,p]=(0,N.useState)({}),m={name:Y0(o.name),domain:t2(o.domain),repository:X0(o.repository),branch:Z0(o.branch),installCommand:Q0(o.installCommand),buildCommand:$0(o.buildCommand),runCommand:e2(o.runCommand)},h=Object.values(m).every(e=>e.valid),g=(e,t)=>{s(n=>({...n,[e]:t})),p(t=>({...t,[e]:!0}))},_=e=>({id:`${r}-${e}`,value:o[e],error:f[e]&&!m[e].valid?m[e].error:void 0}),v=e=>({..._(e),onChange:t=>g(e,t.target.value)}),y=e=>({..._(e),onValueChange:t=>g(e,t)}),b=e=>{l(e);let t=r2(e);s(e=>({...e,installCommand:t.install,buildCommand:t.build,runCommand:t.run}))};return(0,W.jsxs)(`form`,{id:r,onSubmit:t=>{t.preventDefault(),p(Object.fromEntries(Object.keys(m).map(e=>[e,!0]))),h&&e({name:o.name.trim(),domain:o.domain,port:i.find(e=>e.domain===o.domain)?.port??0,repository:o.repository.trim(),branch:o.branch.trim(),packageManager:c,installCommand:o.installCommand.trim(),buildCommand:o.buildCommand.trim(),runCommand:o.runCommand.trim(),runtime:u})},className:`grid gap-4`,children:[(0,W.jsx)(Mg,{...v(`name`),label:`Project name`,placeholder:`my-app`,autoComplete:`off`,autoCapitalize:`off`,spellCheck:!1,hint:`A short identifier — letters, numbers, hyphens only.`}),(0,W.jsx)(u_,{...y(`domain`),label:`Domain`,options:i.map(e=>({value:e.domain,label:`${e.domain} · port ${e.port}`})),placeholder:a?`Loading domains…`:`Select a domain`,disabled:a||i.length===0,hint:i.length===0&&!a?`No domains configured yet — add one on the Domains page first.`:`The site is served here, on the port this domain already proxies to.`}),(0,W.jsx)(Mg,{...v(`repository`),label:`GitHub repository`,placeholder:`https://github.com/user/repo`,autoComplete:`off`,spellCheck:!1}),(0,W.jsx)(Mg,{...v(`branch`),label:`Branch`,placeholder:`main`,autoComplete:`off`,spellCheck:!1,hint:`The branch to deploy from.`}),(0,W.jsx)(pg,{label:`Package manager`,options:i2,value:c,onChange:b}),(0,W.jsx)(Mg,{...v(`installCommand`),label:`Install command`,placeholder:`npm install`,autoComplete:`off`,spellCheck:!1,hint:`Command to install dependencies after cloning.`}),(0,W.jsx)(Mg,{...v(`buildCommand`),label:`Build command`,placeholder:`npm run build`,autoComplete:`off`,spellCheck:!1,hint:`Command to compile or bundle the app.`}),(0,W.jsx)(Mg,{...v(`runCommand`),label:`Run command`,placeholder:`npm start`,autoComplete:`off`,spellCheck:!1,hint:`Command that starts the app in production.`}),(0,W.jsx)(pg,{label:`Runtime`,options:a2,value:u,onChange:d,hint:`PM2 keeps the process alive. Docker runs it in a container.`}),(0,W.jsxs)(`div`,{className:`mt-1 flex justify-end gap-2`,children:[(0,W.jsx)(Y,{type:`button`,variant:`outline`,onClick:t,children:`Cancel`}),(0,W.jsx)(Y,{type:`submit`,disabled:n,children:n?`Deploying…`:`Create website`})]})]})}function s2(e){return e.kind===`create`?{name:e.input.name,domain:e.input.domain,port:e.input.port,runtime:e.input.runtime}:{name:e.website.name,domain:e.website.domain,port:e.website.port,runtime:e.website.runtime}}function c2({trigger:e,onOpenChange:t,onDeployed:n}){let[r,i]=(0,N.useState)(null),[a,o]=(0,N.useState)(null);(0,N.useEffect)(()=>{if(!e){i(null),o(null);return}let t=!1;return(e.kind===`create`?w_.post(`/deployments`,e.input):w_.post(`/deployments/${e.website.name}/${e.kind===`redeploy`?`rebuild`:`redeploy`}`)).then(({id:e})=>!t&&i(e)).catch(e=>!t&&o(e.message)),()=>{t=!0}},[e]);let{lines:s,status:c}=Av(r?`/api/deployments/jobs/${r}/stream`:null),l=(0,N.useMemo)(()=>e?s2(e):null,[e]);(0,N.useEffect)(()=>{c===`done`&&l&&n(l)},[c,l,n]);let u=!!a||c===`error`,d=e?.kind===`redeploy`?`Redeploying`:e?.kind===`pull-redeploy`?`Pulling & redeploying`:`Deploying`,f=e?.kind===`create`?`Cloning ${e.input.repository} and starting it with ${e.input.runtime}…`:e?.kind===`pull-redeploy`?`Pulling the latest commit, reinstalling, and rebuilding ${l?.name}…`:`Rebuilding and restarting ${l?.name}…`;return(0,W.jsx)(t_,{open:!!e,title:l?`${d} ${l.name}`:d,description:a||(c===`running`?f:c===`done`?`Live on ${l?.domain??`port ${l?.port}`}.`:`Deploy failed — see the output below.`),lines:a?[a]:s,status:u?`error`:c,onOpenChange:t,className:`sm:max-w-2xl`})}var l2={pm2:`PM2`,docker:`Docker`};function u2({runtime:e}){return(0,W.jsx)(Mv,{variant:`outline`,className:`text-muted-foreground font-normal`,children:l2[e]})}var d2={running:`Running`,success:`Success`,failed:`Failed`},f2={deploy:`Full deploy`,rebuild:`Rebuild`},p2={running:`unknown`,success:`running`,failed:`failed`};function m2(e){let t=Date.now()-e,n=Math.round(t/6e4);if(n<1)return`just now`;if(n<60)return`${n}m ago`;let r=Math.round(n/60);return r<24?`${r}h ago`:`${Math.round(r/24)}d ago`}function h2(e){if(!e.finishedAt)return null;let t=Math.round((e.finishedAt-e.startedAt)/1e3);return t<60?`${t}s`:`${Math.round(t/60)}m`}function g2({name:e}){let{data:t,loading:n,error:r}=O_(`/deployments/${e}/history`),i=t??[];return(0,W.jsx)(Eg,{title:`Deployments`,children:(0,W.jsx)(Gg,{loading:n,error:r,rows:3,children:i.length===0?(0,W.jsx)(`p`,{className:`text-muted-foreground text-xs`,children:`No deploys recorded yet — they show up here once you deploy or redeploy this site.`}):(0,W.jsx)(`div`,{className:`rounded-md border`,children:i.map(e=>(0,W.jsxs)(`div`,{className:`border-border flex items-start gap-3 border-b px-3 py-3 last:border-b-0`,children:[(0,W.jsx)(p_,{tone:p2[e.status],className:`mt-1.5`}),(0,W.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,W.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-2 gap-y-0.5 text-sm`,children:[(0,W.jsx)(`span`,{className:`font-medium`,children:d2[e.status]}),(0,W.jsx)(`span`,{className:`text-muted-foreground`,children:`·`}),(0,W.jsx)(`span`,{className:`text-muted-foreground`,children:f2[e.kind]}),(0,W.jsx)(`span`,{className:`text-muted-foreground`,children:`·`}),(0,W.jsx)(`span`,{className:`text-muted-foreground`,children:e.branch}),e.commit?(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`span`,{className:`text-muted-foreground`,children:`·`}),(0,W.jsx)(`span`,{className:`text-muted-foreground font-mono text-xs`,children:e.commit})]}):null]}),(0,W.jsxs)(`div`,{className:`text-muted-foreground mt-0.5 text-xs`,children:[m2(e.startedAt),h2(e)?` · ${h2(e)}`:``]}),e.status===`failed`&&e.error?(0,W.jsx)(`p`,{className:`text-destructive mt-1.5 font-mono text-xs break-all`,children:e.error}):null]})]},e.id))})})})}function _2({label:e,icon:t,title:n,description:r,onConfirm:i,disabled:a}){return(0,W.jsxs)(mg,{children:[(0,W.jsx)(hg,{asChild:!0,children:(0,W.jsxs)(Y,{size:`sm`,variant:`outline`,disabled:a,children:[t,e]})}),(0,W.jsxs)(vg,{children:[(0,W.jsxs)(yg,{children:[(0,W.jsx)(xg,{children:n}),(0,W.jsx)(Sg,{children:r})]}),(0,W.jsxs)(bg,{children:[(0,W.jsx)(wg,{children:`Cancel`}),(0,W.jsx)(Cg,{onClick:i,children:e})]})]})]})}function v2({title:e,description:t,onBack:n,onRedeploy:r,onPullRedeploy:i,running:a}){return(0,W.jsx)(n_,{title:e,description:t,action:(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[r?(0,W.jsx)(_2,{label:`Redeploy`,icon:(0,W.jsx)(Dr,{className:`size-4`}),title:`Redeploy ${e}?`,description:`Rebuilds the existing code and restarts the process. It won't pull new commits — the site will be briefly unavailable while it restarts.`,onConfirm:r,disabled:a}):null,i?(0,W.jsx)(_2,{label:`Pull & Redeploy`,icon:(0,W.jsx)(cr,{className:`size-4`}),title:`Pull the latest commit and redeploy ${e}?`,description:`Fetches the latest commit on its branch, reinstalls dependencies, rebuilds, and restarts. It will be briefly unavailable while this runs.`,onConfirm:i,disabled:a}):null,(0,W.jsxs)(Y,{size:`sm`,variant:`outline`,onClick:n,children:[(0,W.jsx)(Gn,{className:`size-4`}),`Back`]})]})})}function y2({website:e}){let t=bv(),n=t.status===`authenticated`?t.session.host:null;return(0,W.jsx)(Eg,{title:`Website details`,children:(0,W.jsxs)(`div`,{className:`grid gap-4`,children:[(0,W.jsx)(Dg,{label:`Name`,value:e.name}),e.domain?(0,W.jsx)(kg,{label:`Website URL`,href:`https://${e.domain}`,children:e.domain}):(0,W.jsx)(Dg,{label:`Website URL`,value:`No domain attached`}),n?(0,W.jsx)(kg,{label:`Server`,href:`http://${n}:${e.port}`,children:`${n}:${e.port}`}):(0,W.jsx)(Dg,{label:`Server`,value:`Port ${e.port}`}),(0,W.jsx)(Dg,{label:`Repository`,value:e.repository}),(0,W.jsx)(Dg,{label:`Branch`,value:e.branch??`main`}),(0,W.jsx)(Dg,{label:`Runtime`,value:e.runtime.toUpperCase()}),(0,W.jsx)(Dg,{label:`Status`,value:e.status.charAt(0).toUpperCase()+e.status.slice(1)})]})})}function b2(e){return e.split(`
|
|
103
|
-
`).map(e=>e.trim()).filter(e=>e&&!e.startsWith(`#`)).map(e=>{let t=e.indexOf(`=`);return t===-1?{key:e,value:``}:{key:e.slice(0,t).trim(),value:e.slice(t+1).trim()}})}function
|
|
104
|
-
`):n===`running`?`Waiting for output…`:`No logs available.`}),n===`error`?(0,W.jsxs)(`p`,{className:`text-destructive mt-2 text-xs`,children:[`Log stream ended — `,e.name,` may not be running.`]}):null]})}function T2({website:e,onDelete:t}){return(0,W.jsxs)(`div`,{className:`grid gap-6`,children:[(0,W.jsx)(Eg,{title:`General`,children:(0,W.jsxs)(`div`,{className:`grid gap-4`,children:[(0,W.jsx)(Dg,{label:`Name`,value:e.name}),(0,W.jsx)(Dg,{label:`Branch`,value:e.branch??`main`}),(0,W.jsx)(Dg,{label:`Port`,value:String(e.port)})]})}),(0,W.jsx)(Tg,{description:`Permanently delete this website and stop the running process. This cannot be undone.`,actionLabel:`Delete website`,confirmTitle:`Delete ${e.name}?`,confirmDescription:`This will remove the website and stop the running process. This action cannot be undone.`,onConfirm:t})]})}function E2({creating:e,onCreate:t,onCancel:n}){return(0,W.jsx)(n_,{title:`Websites`,description:`Apps running on this server, from Git to PM2 or Docker.`,action:e?(0,W.jsxs)(Y,{size:`sm`,variant:`outline`,onClick:n,children:[(0,W.jsx)(Gn,{className:`size-4`}),`Back`]}):(0,W.jsxs)(Y,{size:`sm`,onClick:t,children:[(0,W.jsx)(wr,{className:`size-4`}),`New website`]})})}function D2(){let{data:e,loading:t,error:n,reload:r}=O_(`/deployments`);return{websites:e??[],loading:t,error:n,reload:r}}var O2=[{id:`details`,label:`Details`},{id:`deployments`,label:`Deployments`},{id:`logs`,label:`Logs`},{id:`env`,label:`Environment`},{id:`settings`,label:`Settings`}];function k2(){let{name:e}=lt(),t=at(),[n,r]=(0,N.useState)(`details`),[i,a]=(0,N.useState)(null),{websites:o,loading:s,error:c,reload:l}=D2(),u=o.find(t=>t.name===e),d=()=>t(`/websites`),f=async()=>{if(!u)return;let e=w_.delete(`/deployments/${u.name}`);K_.promise(e,{loading:`Deleting ${u.name}…`,success:`${u.name} deleted`,error:e=>e.message||`Could not delete ${u.name}`});try{await e}catch{return}l(),d()},p=(0,N.useCallback)(e=>{l(),K_.success(`${e.name} redeployed`)},[l]);return u?(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(v2,{title:u.name,description:`${u.repository} · port ${u.port}`,onBack:d,onRedeploy:()=>a({kind:`redeploy`,website:u}),onPullRedeploy:()=>a({kind:`pull-redeploy`,website:u}),running:!!i}),(0,W.jsxs)(`div`,{className:`flex gap-8`,children:[(0,W.jsx)(m_,{tabs:O2,active:n,onChange:r}),(0,W.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[n===`details`&&(0,W.jsx)(y2,{website:u}),n===`deployments`&&(0,W.jsx)(g2,{name:u.name}),n===`logs`&&(0,W.jsx)(w2,{website:u}),n===`env`&&(0,W.jsx)(x2,{name:u.name}),n===`settings`&&(0,W.jsx)(T2,{website:u,onDelete:f})]})]}),(0,W.jsx)(c2,{trigger:i,onOpenChange:e=>!e&&a(null),onDeployed:p})]}):(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(v2,{title:e??`Website`,description:s?`Loading…`:`Not found.`,onBack:d}),(0,W.jsx)(Gg,{loading:s,error:c,children:(0,W.jsx)(Og,{icon:sr,title:`Website not found`,description:`This website may have been deleted.`})})]})}function A2(){let{websites:e,loading:t,error:n,reload:r}=D2(),[i,a]=(0,N.useState)(!1),[o,s]=(0,N.useState)(null),c=e=>{a(!1),s({kind:`create`,input:e})},l=(0,N.useCallback)(e=>{r(),K_.success(`${e.name} is live`,{description:`${e.domain??`port ${e.port}`} · ${e.runtime}`})},[r]);return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(E2,{creating:i,onCreate:()=>a(!0),onCancel:()=>a(!1)}),i?(0,W.jsx)(`div`,{className:`border-border rounded-lg border p-4`,children:(0,W.jsx)(o2,{onSubmit:c,onCancel:()=>a(!1)})}):(0,W.jsx)(Gg,{loading:t,error:n,children:(0,W.jsx)(C2,{websites:e})}),(0,W.jsx)(c2,{trigger:o,onOpenChange:e=>!e&&s(null),onDeployed:l})]})}function j2({instance:e}){return(0,W.jsxs)(`div`,{className:`text-muted-foreground flex items-center gap-3 text-xs tabular-nums`,children:[(0,W.jsxs)(`span`,{children:[e.cpu,`% CPU`]}),(0,W.jsxs)(`span`,{children:[e.memoryMb,` MB`]}),(0,W.jsxs)(`span`,{children:[e.restarts,` restarts`]})]})}var M2={running:`Online`,stopped:`Stopped`,unknown:`Unknown`};function N2({status:e}){return(0,W.jsxs)(Mv,{variant:`outline`,className:`text-muted-foreground gap-1.5 font-normal`,children:[(0,W.jsx)(p_,{tone:e}),M2[e]]})}function P2({instance:e,onRestart:t,onStop:n,onDelete:r,onLogs:i}){return(0,W.jsx)(Rg,{title:`${e.name} #${e.instanceId}`,subtitle:(0,W.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,W.jsx)(N2,{status:e.status}),(0,W.jsx)(j2,{instance:e})]}),trailing:(0,W.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,W.jsx)(Y,{variant:`ghost`,size:`icon`,"aria-label":`Logs for ${e.name}`,className:`size-7`,onClick:()=>i(e.name),children:(0,W.jsx)(Or,{className:`size-3.5`})}),(0,W.jsx)(Y,{variant:`ghost`,size:`icon`,"aria-label":`Restart ${e.name}`,className:`size-7`,onClick:()=>t(e.name),children:(0,W.jsx)(Dr,{className:`size-3.5`})}),(0,W.jsx)(Y,{variant:`ghost`,size:`icon`,"aria-label":`Stop ${e.name}`,className:`size-7`,onClick:()=>n(e.name),children:(0,W.jsx)(Lr,{className:`size-3.5`})}),(0,W.jsxs)(mg,{children:[(0,W.jsx)(hg,{asChild:!0,children:(0,W.jsx)(Y,{variant:`ghost`,size:`icon`,"aria-label":`Delete ${e.name}`,className:`text-muted-foreground hover:text-destructive size-7`,children:(0,W.jsx)(Vr,{className:`size-3.5`})})}),(0,W.jsxs)(vg,{children:[(0,W.jsxs)(yg,{children:[(0,W.jsxs)(xg,{children:[`Delete `,e.name,`?`]}),(0,W.jsx)(Sg,{children:`This will remove the PM2 process permanently. It will stop running and be deregistered from PM2.`})]}),(0,W.jsxs)(bg,{children:[(0,W.jsx)(wg,{children:`Cancel`}),(0,W.jsx)(Cg,{variant:`destructive`,onClick:()=>r(e.name),children:`Delete`})]})]})]})]})})}function F2({instances:e,onRestart:t,onStop:n,onDelete:r,onLogs:i}){return e.length===0?(0,W.jsx)(Og,{icon:Wn,title:`No PM2 instances`,description:`Apps deployed with the PM2 runtime will appear here, with live CPU, memory and restart counts.`}):(0,W.jsx)(`div`,{className:`border-border rounded-lg border px-3`,children:e.map(e=>(0,W.jsx)(P2,{instance:e,onRestart:t,onStop:n,onDelete:r,onLogs:i},`${e.name}-${e.instanceId}`))})}function I2(){let{data:e,error:t,loading:n,reload:r}=O_(`/instances`),[i,a]=(0,N.useState)(null),{lines:o,status:s}=Av(i?`/api/instances/${i}/logs/stream`:null);function c(e){let t=w_.post(`/instances/${e}/restart`);K_.promise(t,{loading:`Restarting ${e}...`,success:`${e} restarted`,error:e=>e.message||`Failed to restart`}),t.then(()=>r(),()=>{})}function l(e){let t=w_.post(`/instances/${e}/stop`);K_.promise(t,{loading:`Stopping ${e}...`,success:`${e} stopped`,error:e=>e.message||`Failed to stop`}),t.then(()=>r(),()=>{})}function u(e){let t=w_.delete(`/instances/${e}`);K_.promise(t,{loading:`Deleting ${e}...`,success:`${e} deleted`,error:e=>e.message||`Failed to delete`}),t.then(()=>r(),()=>{})}return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(n_,{title:`PM2 instances`,description:`Processes managed by PM2, with live status and resource use.`}),(0,W.jsx)(Gg,{loading:n,error:t,children:(0,W.jsx)(F2,{instances:e??[],onRestart:c,onStop:l,onDelete:u,onLogs:a})}),(0,W.jsx)(t_,{open:i!==null,title:i?`${i} logs`:`Logs`,description:`Live PM2 output for this process.`,lines:o,status:s,onOpenChange:e=>{e||a(null)}})]})}function L2({following:e,onToggle:t}){return(0,W.jsxs)(Y,{variant:`outline`,size:`sm`,className:`h-7`,onClick:t,children:[e?(0,W.jsx)(Sr,{className:`size-3.5`}):(0,W.jsx)(Cr,{className:`size-3.5`}),e?`Pause`:`Follow`]})}var R2=[{id:`panel`,label:`Panel`,origin:`journalctl -u easy-vps`},{id:`nginx`,label:`Nginx`,origin:`/var/log/nginx/error.log`},{id:`pm2`,label:`PM2`,origin:`pm2 logs`},{id:`docker`,label:`Docker`,origin:`docker logs`}];function z2({value:e,onChange:t}){return(0,W.jsx)(dv,{value:e,onValueChange:e=>t(e),children:(0,W.jsx)(pv,{children:R2.map(e=>(0,W.jsx)(mv,{value:e.id,children:e.label},e.id))})})}function B2({lines:e,source:t}){return(0,W.jsx)(`div`,{className:`log-viewer border-border bg-muted/40 max-h-[90vh] overflow-auto rounded-lg border`,children:e.length===0?(0,W.jsxs)(`div`,{className:`flex flex-col items-center justify-center px-6 py-14 text-center`,children:[(0,W.jsx)(Or,{className:`text-muted-foreground/70 size-5`}),(0,W.jsxs)(`p`,{className:`mt-3 text-sm font-medium`,children:[`No `,t.label,` output yet`]}),(0,W.jsxs)(`p`,{className:`text-muted-foreground mt-1 max-w-xs text-xs`,children:[`Lines from `,t.origin,` will stream here once log streaming is connected.`]})]}):(0,W.jsx)(`pre`,{className:`w-max min-w-full px-3 py-2.5 font-mono text-xs leading-relaxed`,children:e.map((e,t)=>(0,W.jsxs)(`div`,{className:`whitespace-pre`,children:[e.timestamp?(0,W.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.timestamp,` `]}):null,e.message]},t))})})}function V2(){let[e,t]=(0,N.useState)(`panel`),[n,r]=(0,N.useState)(!1),i=R2.find(t=>t.id===e)??R2[0],{lines:a,status:o}=Av(n?`/api/logs/${e}/stream`:null),s=(0,N.useMemo)(()=>a.map(t=>({timestamp:``,source:e,message:t})),[a,e]);return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(n_,{title:`Runtime logs`,description:`Output from the panel, Nginx, PM2 and Docker.`,action:(0,W.jsx)(L2,{following:n,onToggle:()=>r(e=>!e)})}),(0,W.jsx)(`div`,{className:`mb-3`,children:(0,W.jsx)(z2,{value:e,onChange:e=>{t(e),r(!1)}})}),(0,W.jsx)(B2,{lines:s,source:i}),n&&o===`error`?(0,W.jsx)(`p`,{className:`text-destructive mt-2 text-xs`,children:`Log stream ended unexpectedly.`}):null]})}function H2(){let{data:e,error:t,loading:n,reload:r}=O_(`/system/status`),[i,a]=(0,N.useState)(``),[o,s]=(0,N.useState)(null),[c,l]=(0,N.useState)(null),u=(0,N.useMemo)(()=>{if(!e)return[];let t=i.toLowerCase();return e.dependencies.filter(e=>e.name.toLowerCase().includes(t)||by[e.name].toLowerCase().includes(t)||xy[e.name].toLowerCase().includes(t))},[e,i]),d=(0,N.useMemo)(()=>u.filter(e=>e.installed),[u]),f=(0,N.useMemo)(()=>u.filter(e=>!e.installed),[u]);return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(n_,{title:`Dependencies`,description:`Manage system packages installed on this server.`}),(0,W.jsx)(`div`,{className:`mb-6`,children:(0,W.jsx)(Ag,{placeholder:`Search dependencies...`,value:i,onChange:e=>a(e.target.value),className:`max-w-sm`})}),(0,W.jsx)(Gg,{loading:n,error:t,rows:5,children:e?(0,W.jsxs)(`div`,{className:`space-y-8`,children:[d.length>0&&(0,W.jsxs)(`section`,{children:[(0,W.jsx)(`h2`,{className:`text-muted-foreground mb-3 text-sm font-medium`,children:`Installed Dependencies`}),(0,W.jsx)(`div`,{className:`grid gap-3 sm:grid-cols-2 lg:grid-cols-3`,children:d.map(e=>(0,W.jsx)(U2,{dependency:e,busy:o?.name===e.name,onClick:()=>l(e)},e.name))})]}),f.length>0&&(0,W.jsxs)(`section`,{children:[(0,W.jsx)(`h2`,{className:`text-muted-foreground mb-3 text-sm font-medium`,children:`Suggested for You`}),(0,W.jsx)(`div`,{className:`grid gap-3 sm:grid-cols-2 lg:grid-cols-3`,children:f.map(e=>(0,W.jsx)(U2,{dependency:e,busy:o?.name===e.name,onClick:()=>l(e)},e.name))})]})]}):null}),c?(0,W.jsx)(mg,{open:!!c,onOpenChange:e=>{e||l(null)},children:(0,W.jsxs)(vg,{children:[(0,W.jsxs)(yg,{children:[(0,W.jsxs)(xg,{children:[c.installed?`Uninstall`:`Install`,` `,by[c.name],`?`]}),(0,W.jsx)(Sg,{asChild:!0,children:(0,W.jsx)(`div`,{className:`space-y-2`,children:c.installed?(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(`p`,{children:[`This purges the `,by[c.name],` package from the server and permanently deletes its configuration. It cannot be undone.`]}),c.removes.length>0&&(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`p`,{className:`text-foreground font-medium`,children:`These are deleted:`}),(0,W.jsx)(`ul`,{className:`mt-1 list-disc space-y-0.5 pl-5 font-mono text-xs`,children:c.removes.map(e=>(0,W.jsx)(`li`,{children:e},e))})]})]}):(0,W.jsxs)(`p`,{children:[`This runs the package manager on the server to install`,` `,by[c.name],`. It may take a minute.`]})})})]}),(0,W.jsxs)(bg,{children:[(0,W.jsx)(wg,{children:`Cancel`}),(0,W.jsx)(Cg,{className:c.installed?`bg-destructive text-black hover:bg-destructive/90`:``,onClick:()=>{s({name:c.name,action:c.installed?`uninstall`:`install`}),l(null)},children:c.installed?`Uninstall`:`Install`})]})]})}):null,(0,W.jsx)(Ty,{run:o,onOpenChange:e=>!e&&s(null),onFinished:r})]})}function U2({dependency:e,busy:t,onClick:n}){return(0,W.jsx)(`button`,{type:`button`,onClick:n,disabled:t,className:U(`text-left transition-colors cursor-pointer`,`rounded-xl ring-1 ring-foreground/10`,`focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 outline-none`,`disabled:pointer-events-none disabled:opacity-50`),children:(0,W.jsx)(hy,{size:`sm`,className:`border-0 ring-0`,children:(0,W.jsxs)(vy,{className:`flex items-center gap-3`,children:[(0,W.jsx)(wy,{name:e.name,className:`size-5 shrink-0`}),(0,W.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,W.jsx)(`span`,{className:`truncate text-sm font-medium`,children:by[e.name]}),e.installed&&e.version&&(0,W.jsx)(`span`,{className:`bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 rounded-full px-1.5 py-0.5 text-[10px] font-medium leading-none`,children:e.version.split(`.`).slice(0,2).join(`.`)})]}),(0,W.jsx)(`p`,{className:`text-muted-foreground mt-0.5 truncate text-xs`,children:xy[e.name]})]})]})})})}var W2=3e4;function G2(){let{data:e,error:t,loading:n,reload:r}=O_(`/system/metrics`);return(0,N.useEffect)(()=>{let e=setInterval(r,W2);return()=>clearInterval(e)},[r]),(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(n_,{title:`Dashboard`,description:`Real-time system overview and resource usage.`,action:(0,W.jsxs)(Y,{variant:`outline`,size:`sm`,onClick:r,children:[(0,W.jsx)(Tr,{className:`size-4 mr-1.5`}),`Refresh`]})}),(0,W.jsx)(Gg,{loading:n,error:t,rows:6,children:e?(0,W.jsxs)(`div`,{className:`space-y-6`,children:[(0,W.jsx)(O0,{metrics:e}),(0,W.jsxs)(`div`,{className:`grid gap-6 lg:grid-cols-3`,children:[(0,W.jsx)(x0,{cpuCores:e.cpu.cores,className:`lg:col-span-2`}),(0,W.jsx)(w0,{})]}),(0,W.jsxs)(`div`,{className:`grid gap-6 lg:grid-cols-2`,children:[(0,W.jsx)(k0,{processes:e.topProcesses}),(0,W.jsx)(yy,{})]})]}):null})]})}var K2=[{value:`tcp`,label:`TCP`},{value:`udp`,label:`UDP`}];function q2(){let{data:e,error:t,loading:n,reload:r}=O_(`/firewall/status`),[i,a]=(0,N.useState)(``),[o,s]=(0,N.useState)(`tcp`),[c,l]=(0,N.useState)(!1),[u,d]=(0,N.useState)(null),[f,p]=(0,N.useState)(!1),[m,h]=(0,N.useState)(null),g=e;function _(e){e.preventDefault();let t=Number(i);if(!Number.isInteger(t)||t<1||t>65535){K_.error(`Enter a port between 1 and 65535`);return}l(!0);let n=w_.post(`/firewall/rules`,{port:t,protocol:o});K_.promise(n,{loading:`Opening ${t}/${o}…`,success:`${t}/${o} is now open`,error:e=>e.message||`Failed to open port`}),n.then(()=>{a(``),r()}).finally(()=>l(!1))}function v(e){d(e);let t=w_.delete(`/firewall/rules/${e}`);K_.promise(t,{loading:`Removing rule…`,success:`Rule removed`,error:e=>e.message||`Failed to remove rule`}),t.then(()=>r()).finally(()=>d(null))}function y(){if(!g)return;p(!0);let e=w_.post(`/firewall/state`,{enabled:!g.active});K_.promise(e,{loading:g.active?`Disabling firewall…`:`Enabling firewall…`,success:g.active?`Firewall disabled`:`Firewall enabled`,error:e=>e.message||`Failed to change firewall state`}),e.then(()=>r()).finally(()=>p(!1))}return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(n_,{title:`Firewall`,description:`Manage ufw rules to control inbound traffic on this server.`}),g&&!g.installed?(0,W.jsxs)(Bg,{variant:`warning`,className:`mb-8`,children:[(0,W.jsx)(Ir,{}),(0,W.jsx)(Vg,{children:`ufw is not installed`}),(0,W.jsx)(Hg,{children:`Install ufw on the server to manage firewall rules from here.`})]}):null,(0,W.jsxs)(d_,{title:`Open a port`,description:`Allow inbound traffic to a TCP or UDP port.`,action:g?.installed?(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,W.jsxs)(Mv,{variant:g.active?`default`:`secondary`,children:[(0,W.jsx)(p_,{tone:g.active?`running`:`stopped`}),g.active?`Active`:`Inactive`]}),(0,W.jsx)(Y,{variant:g.active?`outline`:`default`,size:`sm`,disabled:f,onClick:y,children:g.active?`Disable`:`Enable`})]}):null,children:[(0,W.jsxs)(`form`,{onSubmit:_,className:`flex flex-wrap items-end gap-3`,children:[(0,W.jsx)(`div`,{className:`w-40`,children:(0,W.jsx)(Mg,{id:`port`,label:`Port`,type:`number`,inputMode:`numeric`,min:1,max:65535,placeholder:`e.g. 3000`,value:i,onChange:e=>a(e.target.value)})}),(0,W.jsx)(`div`,{className:`w-32`,children:(0,W.jsx)(u_,{label:`Protocol`,options:K2,value:o,onValueChange:e=>s(e)})}),(0,W.jsxs)(Y,{type:`submit`,disabled:c,children:[(0,W.jsx)(wr,{}),`Open port`]})]}),g?.installed&&!g.active?(0,W.jsx)(`p`,{className:`text-muted-foreground mt-2 text-xs`,children:`The firewall is inactive — rules are recorded but not enforced until ufw is enabled.`}):null]}),(0,W.jsx)(d_,{title:`Rules`,description:`Ports currently allowed through the firewall.`,children:(0,W.jsx)(Gg,{loading:n,error:t,children:g&&g.rules.length>0?(0,W.jsx)(`div`,{className:`rounded-lg border`,children:g.rules.map(e=>(0,W.jsx)(Rg,{leading:(0,W.jsx)(Ir,{className:`size-4`}),title:e.to,subtitle:`${e.action} · from ${e.from}`,trailing:(0,W.jsxs)(Y,{variant:`ghost`,size:`sm`,disabled:u===e.number,onClick:()=>h(e),children:[(0,W.jsx)(Vr,{}),`Remove`]})},e.number))}):(0,W.jsx)(Og,{icon:Ir,title:`No rules yet`,description:`Open a port above to add your first firewall rule.`})})}),(0,W.jsx)(mg,{open:m!==null,onOpenChange:e=>{e||h(null)},children:(0,W.jsxs)(vg,{children:[(0,W.jsxs)(yg,{children:[(0,W.jsx)(xg,{children:`Remove firewall rule?`}),(0,W.jsxs)(Sg,{children:[`This will delete the rule for`,` `,(0,W.jsx)(`span`,{className:`font-medium text-foreground`,children:m?.to}),` (`,m?.action,`). The port will no longer be allowed through the firewall.`]})]}),(0,W.jsxs)(bg,{children:[(0,W.jsx)(wg,{children:`Cancel`}),(0,W.jsx)(Cg,{variant:`destructive`,disabled:u!==null,onClick:()=>{m&&v(m.number)},children:`Remove rule`})]})]})})]})}function J2(){return(0,W.jsxs)(Ft,{children:[(0,W.jsx)(Nt,{path:`/login`,element:(0,W.jsx)(Sv,{})}),(0,W.jsx)(Nt,{element:(0,W.jsx)(xv,{}),children:(0,W.jsxs)(Nt,{element:(0,W.jsx)(k_,{}),children:[(0,W.jsx)(Nt,{path:`/`,element:(0,W.jsx)(G2,{})}),(0,W.jsx)(Nt,{path:`/domains`,element:(0,W.jsx)(J0,{})}),(0,W.jsx)(Nt,{path:`/websites`,element:(0,W.jsx)(A2,{})}),(0,W.jsx)(Nt,{path:`/websites/:name`,element:(0,W.jsx)(k2,{})}),(0,W.jsx)(Nt,{path:`/databases`,element:(0,W.jsx)(my,{})}),(0,W.jsx)(Nt,{path:`/databases/:name`,element:(0,W.jsx)(Qv,{})}),(0,W.jsx)(Nt,{path:`/firewall`,element:(0,W.jsx)(q2,{})}),(0,W.jsx)(Nt,{path:`/logs`,element:(0,W.jsx)(V2,{})}),(0,W.jsx)(Nt,{path:`/instances`,element:(0,W.jsx)(I2,{})}),(0,W.jsx)(Nt,{path:`/dependencies`,element:(0,W.jsx)(H2,{})})]})}),(0,W.jsx)(Nt,{path:`*`,element:(0,W.jsx)(jt,{to:`/`,replace:!0})})]})}var Y2=(e,t,n,r,i,a,o,s)=>{let c=document.documentElement,l=[`light`,`dark`];function u(t){(Array.isArray(e)?e:[e]).forEach(e=>{let n=e===`class`,r=n&&a?i.map(e=>a[e]||e):i;n?(c.classList.remove(...r),c.classList.add(a&&a[t]?a[t]:t)):c.setAttribute(e,t)}),d(t)}function d(e){s&&l.includes(e)&&(c.style.colorScheme=e)}function f(){return window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}if(r)u(r);else try{let e=localStorage.getItem(t)||n;u(o&&e===`system`?f():e)}catch{}},X2=N.createContext(void 0),Z2={setTheme:e=>{},themes:[]},Q2=()=>N.useContext(X2)??Z2;N.memo(({forcedTheme:e,storageKey:t,attribute:n,enableSystem:r,enableColorScheme:i,defaultTheme:a,value:o,themes:s,nonce:c,scriptProps:l})=>{let u=JSON.stringify([n,t,a,e,s,o,r,i]).slice(1,-1);return N.createElement(`script`,{...l,suppressHydrationWarning:!0,nonce:typeof window>`u`?c:``,dangerouslySetInnerHTML:{__html:`(${Y2.toString()})(${u})`}})});var $2=({...e})=>{let{theme:t=`system`}=Q2();return(0,W.jsx)(sv,{theme:t,className:`toaster group`,icons:{success:(0,W.jsx)(Qn,{className:`size-4`}),info:(0,W.jsx)(dr,{className:`size-4`}),warning:(0,W.jsx)(Hr,{className:`size-4`}),error:(0,W.jsx)(br,{className:`size-4`}),loading:(0,W.jsx)(mr,{className:`size-4 animate-spin`})},style:{"--normal-bg":`var(--popover)`,"--normal-text":`var(--popover-foreground)`,"--normal-border":`var(--border)`,"--border-radius":`var(--radius)`},toastOptions:{classNames:{toast:`cn-toast`}},...e})};function e4(){return(0,W.jsx)(v_,{children:(0,W.jsxs)(Ng,{children:[(0,W.jsx)(Cn,{children:(0,W.jsx)(J2,{})}),(0,W.jsx)($2,{position:`bottom-center`})]})})}(0,Gr.createRoot)(document.getElementById(`root`)).render((0,W.jsx)(N.StrictMode,{children:(0,W.jsx)(e4,{})}));
|
|
102
|
+
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function K1(e,t){if(e){if(typeof e==`string`)return q1(e,t);var n={}.toString.call(e).slice(8,-1);return n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`?Array.from(e):n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?q1(e,t):void 0}}function q1(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function J1(e,t){var n=e==null?null:typeof Symbol<`u`&&e[Symbol.iterator]||e[`@@iterator`];if(n!=null){var r,i,a,o,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,t===0){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,i=e}finally{try{if(!c&&n.return!=null&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw i}}return s}}function Y1(e){if(Array.isArray(e))return e}var X1=()=>(IW(),null);function Z1(e){if(typeof e==`number`)return e;if(typeof e==`string`){var t=parseFloat(e);if(!Number.isNaN(t))return t}return 0}var Q1=(0,N.forwardRef)((e,t)=>{var n=(0,N.useRef)(null),r=W1((0,N.useState)({containerWidth:Z1(e.style?.width),containerHeight:Z1(e.style?.height)}),2),i=r[0],a=r[1],o=(0,N.useCallback)((e,t)=>{a(n=>{var r=Math.round(e),i=Math.round(t);return n.containerWidth===r&&n.containerHeight===i?n:{containerWidth:r,containerHeight:i}})},[]),s=(0,N.useCallback)(e=>{if(typeof t==`function`&&t(e),n.current!=null&&(n.current.disconnect(),n.current=null),e!=null&&typeof ResizeObserver<`u`){var r=e.getBoundingClientRect(),i=r.width,a=r.height;o(i,a);var s=new ResizeObserver(e=>{var t=e[0];if(t!=null){var n=t.contentRect,r=n.width,i=n.height;o(r,i)}});s.observe(e),n.current=s}},[t,o]);return(0,N.useEffect)(()=>()=>{n.current?.disconnect()},[o]),N.createElement(N.Fragment,null,N.createElement(wO,{width:i.containerWidth,height:i.containerHeight}),N.createElement(`div`,U1({ref:s},e)))}),$1=(0,N.forwardRef)((e,t)=>{var n=e.width,r=e.height,i=W1((0,N.useState)({containerWidth:Z1(n),containerHeight:Z1(r)}),2),a=i[0],o=i[1],s=(0,N.useCallback)((e,t)=>{o(n=>{var r=Math.round(e),i=Math.round(t);return n.containerWidth===r&&n.containerHeight===i?n:{containerWidth:r,containerHeight:i}})},[]),c=(0,N.useCallback)(e=>{if(typeof t==`function`&&t(e),e!=null){var n=e.getBoundingClientRect(),r=n.width,i=n.height;s(r,i)}},[t,s]);return N.createElement(N.Fragment,null,N.createElement(wO,{width:a.containerWidth,height:a.containerHeight}),N.createElement(`div`,U1({ref:c},e)))}),e0=(0,N.forwardRef)((e,t)=>{var n=e.width,r=e.height;return N.createElement(N.Fragment,null,N.createElement(wO,{width:n,height:r}),N.createElement(`div`,U1({ref:t},e)))}),t0=(0,N.forwardRef)((e,t)=>{var n=e.width,r=e.height;return typeof n==`string`||typeof r==`string`?N.createElement($1,U1({},e,{ref:t})):typeof n==`number`&&typeof r==`number`?N.createElement(e0,U1({},e,{width:n,height:r,ref:t})):N.createElement(N.Fragment,null,N.createElement(wO,{width:n,height:r}),N.createElement(`div`,U1({ref:t},e)))});function n0(e){return e?Q1:t0}var r0=(0,N.forwardRef)((e,t)=>{var n=e.children,r=e.className,i=e.height,a=e.onClick,o=e.onContextMenu,s=e.onDoubleClick,c=e.onMouseDown,l=e.onMouseEnter,u=e.onMouseLeave,d=e.onMouseMove,f=e.onMouseUp,p=e.onTouchEnd,m=e.onTouchMove,h=e.onTouchStart,g=e.style,_=e.width,v=e.responsive,y=e.dispatchTouchEvents,b=y===void 0||y,x=(0,N.useRef)(null),S=$S(),C=W1((0,N.useState)(null),2),w=C[0],T=C[1],E=W1((0,N.useState)(null),2),D=E[0],O=E[1],k=L1(),A=dO(),j=A?.width>0?A.width:_,M=A?.height>0?A.height:i,ee=(0,N.useCallback)(e=>{k(e),typeof t==`function`&&t(e),T(e),O(e),e!=null&&(x.current=e)},[k,t,T,O]),P=(0,N.useCallback)(e=>{S(A$(e)),S(Q$({handler:a,reactEvent:e}))},[S,a]),F=(0,N.useCallback)(e=>{S(M$(e)),S(Q$({handler:l,reactEvent:e}))},[S,l]),I=(0,N.useCallback)(e=>{S(KV()),S(Q$({handler:u,reactEvent:e}))},[S,u]),te=(0,N.useCallback)(e=>{S(M$(e)),S(Q$({handler:d,reactEvent:e}))},[S,d]),ne=(0,N.useCallback)(()=>{S(G$())},[S]),re=(0,N.useCallback)(()=>{S(K$())},[S]),L=(0,N.useCallback)(e=>{S(W$(e.key))},[S]),R=(0,N.useCallback)(e=>{S(Q$({handler:o,reactEvent:e}))},[S,o]),ie=(0,N.useCallback)(e=>{S(Q$({handler:s,reactEvent:e}))},[S,s]),ae=(0,N.useCallback)(e=>{S(Q$({handler:c,reactEvent:e}))},[S,c]),oe=(0,N.useCallback)(e=>{S(Q$({handler:f,reactEvent:e}))},[S,f]),se=(0,N.useCallback)(e=>{S(Q$({handler:h,reactEvent:e}))},[S,h]),ce=(0,N.useCallback)(e=>{b&&S(i1(e)),S(Q$({handler:m,reactEvent:e}))},[S,b,m]),le=(0,N.useCallback)(e=>{S(Q$({handler:p,reactEvent:e}))},[S,p]),ue=n0(v);return N.createElement(uW.Provider,{value:w},N.createElement(Eb.Provider,{value:D},N.createElement(ue,{width:j??g?.width,height:M??g?.height,className:qr(`recharts-wrapper`,r),style:z1({position:`relative`,cursor:`default`,width:j,height:M},g),onClick:P,onContextMenu:R,onDoubleClick:ie,onFocus:ne,onBlur:re,onKeyDown:L,onMouseDown:ae,onMouseEnter:F,onMouseLeave:I,onMouseMove:te,onMouseUp:oe,onTouchEnd:le,onTouchMove:ce,onTouchStart:se,ref:ee},N.createElement(X1,null),n)))}),i0=[`width`,`height`,`responsive`,`children`,`className`,`style`,`compact`,`title`,`desc`];function a0(e,t){if(e==null)return{};var n,r,i=o0(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function o0(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}var s0=(0,N.forwardRef)((e,t)=>{var n=e.width,r=e.height,i=e.responsive,a=e.children,o=e.className,s=e.style,c=e.compact,l=e.title,u=e.desc,d=jy(a0(e,i0));return c?N.createElement(N.Fragment,null,N.createElement(wO,{width:n,height:r}),N.createElement(A1,{otherAttributes:d,title:l,desc:u},a)):N.createElement(r0,{className:o,style:s,width:n,height:r,responsive:i??!1,onClick:e.onClick,onMouseLeave:e.onMouseLeave,onMouseEnter:e.onMouseEnter,onMouseMove:e.onMouseMove,onMouseDown:e.onMouseDown,onMouseUp:e.onMouseUp,onContextMenu:e.onContextMenu,onDoubleClick:e.onDoubleClick,onTouchStart:e.onTouchStart,onTouchMove:e.onTouchMove,onTouchEnd:e.onTouchEnd},N.createElement(A1,{otherAttributes:d,title:l,desc:u,ref:t},N.createElement(sY,null,a)))});function c0(){return c0=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},c0.apply(null,arguments)}function l0(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function u0(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?l0(Object(n),!0).forEach(function(t){d0(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l0(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function d0(e,t,n){return(t=f0(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function f0(e){var t=p0(e,`string`);return typeof t==`symbol`?t:t+``}function p0(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}var m0=u0({accessibilityLayer:!0,barCategoryGap:`10%`,barGap:4,layout:`horizontal`,margin:{top:5,right:5,bottom:5,left:5},responsive:!1,reverseStackOrder:!1,stackOffset:`none`,syncMethod:`index`},u1),h0=(0,N.forwardRef)(function(e,t){var n=Fx(e.categoricalChartProps,m0),r=e.chartName,i=e.defaultTooltipEventType,a=e.validateTooltipEventTypes,o=e.tooltipPayloadSearcher,s=e.categoricalChartProps,c={chartName:r,defaultTooltipEventType:i,validateTooltipEventTypes:a,tooltipPayloadSearcher:o,eventEmitter:void 0};return N.createElement(g1,{preloadedState:{options:c},reduxStoreName:s.id??r},N.createElement(VJ,{chartData:s.data}),N.createElement(v1,{layout:n.layout,margin:n.margin}),N.createElement(b1,{throttleDelay:n.throttleDelay,throttledEvents:n.throttledEvents}),N.createElement(y1,{baseValue:n.baseValue,accessibilityLayer:n.accessibilityLayer,barCategoryGap:n.barCategoryGap,maxBarSize:n.maxBarSize,stackOffset:n.stackOffset,barGap:n.barGap,barSize:n.barSize,syncId:n.syncId,syncMethod:n.syncMethod,className:n.className,reverseStackOrder:n.reverseStackOrder}),N.createElement(s0,c0({},n,{ref:t})))}),g0=[`axis`],_0=(0,N.forwardRef)((e,t)=>N.createElement(h0,{chartName:`LineChart`,defaultTooltipEventType:`axis`,validateTooltipEventTypes:g0,tooltipPayloadSearcher:gW,categoricalChartProps:e,ref:t}));function v0(e){return e>=1?`hsl(var(--destructive))`:e>=.7?`hsl(45, 93%, 47%)`:`hsl(142, 71%, 45%)`}function y0(e){return new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})}var b0=36e5;function x0({cpuCores:e,className:t}){let{data:n}=O_(`/system/metrics/history`),r=Date.now(),i=r-b0,a=(n??[]).filter(e=>e.t>=i).map(e=>({t:e.t,value:e.one})),o=[0,15,30,45,60].map(e=>i+e*60*1e3),s=v0((a.length?a[a.length-1].value:0)/Math.max(e,1)),c=Math.max(...(n??[]).map(e=>Math.max(e.one,e.five,e.fifteen)),e,1);return(0,W.jsxs)(hy,{className:t,children:[(0,W.jsxs)(gy,{className:`flex flex-row items-center justify-between space-y-0 pb-2`,children:[(0,W.jsx)(_y,{className:`text-sm font-medium text-muted-foreground`,children:`Load Average · last 1 hour`}),(0,W.jsx)(qn,{className:`size-4 text-muted-foreground`})]}),(0,W.jsxs)(vy,{children:[(0,W.jsx)(pO,{width:`100%`,height:180,children:(0,W.jsxs)(_0,{data:a,margin:{top:0,right:0,left:-20,bottom:0},children:[(0,W.jsx)(`defs`,{children:(0,W.jsxs)(`linearGradient`,{id:`loadGradient`,x1:`0`,y1:`0`,x2:`0`,y2:`1`,children:[(0,W.jsx)(`stop`,{offset:`0%`,stopColor:s,stopOpacity:.35}),(0,W.jsx)(`stop`,{offset:`100%`,stopColor:s,stopOpacity:0})]})}),(0,W.jsx)(qX,{strokeDasharray:`3 3`,vertical:!1,stroke:`hsl(var(--border))`}),(0,W.jsx)(d$,{dataKey:`t`,type:`number`,scale:`time`,domain:[i,r],ticks:o,tickFormatter:y0,tick:{fontSize:12},tickLine:!1,axisLine:!1}),(0,W.jsx)(E$,{tick:{fontSize:12},tickLine:!1,axisLine:!1,domain:[0,Math.ceil(c*1.2)],allowDecimals:!1}),(0,W.jsx)($W,{contentStyle:{backgroundColor:`hsl(var(--card))`,border:`1px solid hsl(var(--border))`,borderRadius:`8px`,fontSize:`12px`},labelFormatter:e=>y0(Number(e)),formatter:e=>[Number(e).toFixed(2),`Load (1 min)`]}),(0,W.jsx)(wY,{y:e,stroke:`hsl(var(--destructive))`,strokeDasharray:`4 4`,strokeOpacity:.6}),(0,W.jsx)(WQ,{type:`monotone`,dataKey:`value`,stroke:`none`,fill:`url(#loadGradient)`,isAnimationActive:!1}),(0,W.jsx)(ZZ,{type:`monotone`,dataKey:`value`,stroke:s,strokeWidth:2,dot:{r:3,fill:s},activeDot:{r:6}})]})}),(0,W.jsxs)(`p`,{className:`text-xs text-muted-foreground mt-2 text-center`,children:[e,` CPU core`,e===1?``:`s`,` · Load ≥ `,e,` means saturated`]})]})]})}function S0(e){return e>=90?`bg-destructive`:e>=70?`bg-amber-500`:`bg-emerald-500`}function C0({title:e,value:t,subtitle:n,icon:r,percent:i,className:a}){return(0,W.jsxs)(hy,{className:a,children:[(0,W.jsxs)(gy,{className:`flex flex-row items-center justify-between space-y-0 pb-2`,children:[(0,W.jsx)(_y,{className:`text-sm font-medium text-muted-foreground`,children:e}),(0,W.jsx)(`span`,{className:`text-muted-foreground`,children:r})]}),(0,W.jsxs)(vy,{children:[(0,W.jsx)(`div`,{className:`text-2xl font-bold`,children:t}),n?(0,W.jsx)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:n}):null,i===void 0?null:(0,W.jsxs)(`div`,{className:`mt-3`,children:[(0,W.jsx)(`div`,{className:`h-2 w-full rounded-full bg-secondary`,children:(0,W.jsx)(`div`,{className:U(`h-full rounded-full transition-all`,S0(i)),style:{width:`${Math.min(100,Math.max(0,i))}%`}})}),(0,W.jsxs)(`p`,{className:`text-xs text-muted-foreground mt-1 text-right`,children:[i.toFixed(1),`%`]})]})]})]})}function w0(){let{data:e}=O_(`/instances`),t=e?.filter(e=>e.status===`running`)??[],n=e?.filter(e=>e.status===`stopped`)??[],r=e?.length??0;return(0,W.jsxs)(hy,{children:[(0,W.jsxs)(gy,{className:`flex flex-row items-center justify-between space-y-0 pb-2`,children:[(0,W.jsx)(_y,{className:`text-sm font-medium text-muted-foreground`,children:`PM2 Processes`}),(0,W.jsx)(Wn,{className:`size-4 text-muted-foreground`})]}),(0,W.jsxs)(vy,{children:[(0,W.jsx)(`div`,{className:`text-3xl font-bold`,children:r}),(0,W.jsx)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:r===0?`No processes running`:`process${r===1?``:`es`} managed`}),r>0?(0,W.jsxs)(`div`,{className:`flex items-center gap-4 mt-4`,children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,W.jsx)(p_,{tone:`running`}),(0,W.jsxs)(`span`,{className:`text-sm`,children:[t.length,` running`]})]}),n.length>0?(0,W.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,W.jsx)(p_,{tone:`stopped`}),(0,W.jsxs)(`span`,{className:`text-sm`,children:[n.length,` stopped`]})]}):null]}):null,r>0?(0,W.jsx)(`div`,{className:`mt-4 space-y-1.5 max-h-[140px] overflow-y-auto`,children:e?.slice(0,5).map(e=>(0,W.jsxs)(`div`,{className:`flex items-center justify-between text-xs`,children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[(0,W.jsx)(p_,{tone:e.status===`running`?`running`:`stopped`}),(0,W.jsx)(`span`,{className:`truncate`,children:e.name})]}),(0,W.jsx)(`span`,{className:`text-muted-foreground shrink-0`,children:e.uptime})]},e.name))}):null]})]})}function T0({host:e,user:t}){return(0,W.jsxs)(Bg,{className:`mb-6`,children:[(0,W.jsx)(jr,{className:`size-4`}),(0,W.jsxs)(Vg,{children:[`Limited privileges on `,e]}),(0,W.jsxs)(Hg,{children:[`Installing dependencies and writing Nginx config needs root on the server. Sign in as root, or enable passwordless sudo for `,(0,W.jsx)(`span`,{className:`font-medium`,children:t}),`, to enable those actions.`]})]})}function E0(e){return e>=1024?`${(e/1024).toFixed(1)} GB`:`${Math.round(e)} MB`}function D0(e){return e>=1024?`${(e/1024).toFixed(1)} TB`:`${e.toFixed(1)} GB`}function O0({metrics:e}){let{cpu:t,memory:n,disk:r,swap:i,uptime:a}=e;return(0,W.jsxs)(`div`,{className:`grid gap-4 grid-cols-2 lg:grid-cols-5`,children:[(0,W.jsx)(C0,{title:`CPU`,value:`${t.usagePercent.toFixed(1)}%`,subtitle:`${t.cores} cores`,icon:(0,W.jsx)(rr,{className:`size-4`}),percent:t.usagePercent}),(0,W.jsx)(C0,{title:`Memory`,value:`${n.usagePercent.toFixed(1)}%`,subtitle:`${E0(n.usedMb)} / ${E0(n.totalMb)}`,icon:(0,W.jsx)(_r,{className:`size-4`}),percent:n.usagePercent}),(0,W.jsx)(C0,{title:`Swap`,value:i.totalMb>0?`${i.usagePercent.toFixed(1)}%`:`N/A`,subtitle:i.totalMb>0?`${E0(i.usedMb)} / ${E0(i.totalMb)}`:`No swap configured`,icon:(0,W.jsx)(Kn,{className:`size-4`}),percent:i.totalMb>0?i.usagePercent:void 0}),(0,W.jsx)(C0,{title:`Disk`,value:`${r.usagePercent.toFixed(1)}%`,subtitle:`${D0(r.usedGb)} / ${D0(r.totalGb)}`,icon:(0,W.jsx)(ur,{className:`size-4`}),percent:r.usagePercent}),(0,W.jsx)(C0,{title:`Uptime`,value:a,subtitle:`System uptime`,icon:(0,W.jsx)(Br,{className:`size-4`})})]})}function k0({processes:e}){return(0,W.jsxs)(hy,{children:[(0,W.jsxs)(gy,{className:`flex flex-row items-center justify-between space-y-0 pb-2`,children:[(0,W.jsx)(_y,{className:`text-sm font-medium text-muted-foreground`,children:`Top Processes`}),(0,W.jsx)(Wn,{className:`size-4 text-muted-foreground`})]}),(0,W.jsx)(vy,{children:e.length===0?(0,W.jsx)(`p`,{className:`text-sm text-muted-foreground text-center py-4`,children:`No process data available`}):(0,W.jsxs)(wv,{children:[(0,W.jsx)(Tv,{children:(0,W.jsxs)(Dv,{children:[(0,W.jsx)(Ov,{children:`Process`}),(0,W.jsx)(Ov,{className:`text-right`,children:`CPU`}),(0,W.jsx)(Ov,{className:`text-right`,children:`Memory`})]})}),(0,W.jsx)(Ev,{children:e.map(e=>(0,W.jsxs)(Dv,{children:[(0,W.jsx)(kv,{className:`font-medium`,children:(0,W.jsx)(`span`,{className:`truncate max-w-[120px] block`,children:e.name})}),(0,W.jsx)(kv,{className:`text-right`,children:(0,W.jsxs)(`span`,{className:e.cpu>50?`text-destructive font-medium`:e.cpu>20?`text-amber-500 font-medium`:``,children:[e.cpu.toFixed(1),`%`]})}),(0,W.jsx)(kv,{className:`text-right`,children:(0,W.jsxs)(`span`,{className:e.memory>50?`text-destructive font-medium`:e.memory>20?`text-amber-500 font-medium`:``,children:[e.memory.toFixed(1),`%`]})})]},`${e.name}-${e.pid}`))})]})})]})}function A0({open:e,onOpenChange:t,onFinished:n}){let{lines:r,status:i}=Av(e?`/api/system/update/install/stream`:null);return(0,N.useEffect)(()=>{i===`done`&&n()},[i,n]),(0,W.jsx)(t_,{open:e,title:`Updating easy-vps`,description:i===`running`?`Pulling the latest version from npm…`:i===`done`?`Installed. The panel is restarting to apply the update.`:`Update failed — see output below.`,lines:r,status:i,onOpenChange:t})}function j0({active:e}){return e?(0,W.jsxs)(Mv,{variant:`secondary`,className:`gap-1 font-normal text-emerald-700 dark:text-emerald-400`,children:[(0,W.jsx)(Nr,{className:`size-3`}),`Certificate active`]}):(0,W.jsxs)(Mv,{variant:`outline`,className:`gap-1 border-amber-200 font-normal text-amber-600 dark:border-amber-900 dark:text-amber-500`,children:[(0,W.jsx)(jr,{className:`size-3`}),`Certificate expired`]})}var M0=/^[a-z][a-z0-9+.-]*:\/\//i,N0=/^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$/i;function P0(e){let t=e.trim();if(!t)return{valid:!1,error:`Enter a domain`};if(M0.test(t)){let e=t.replace(M0,``);return{valid:!1,error:`Remove the "${t.slice(0,t.indexOf(`://`)+3)}" prefix — enter just "${e.split(`/`)[0]}"`}}return t.includes(`/`)?{valid:!1,error:`Domain should not include a path`}:t.includes(`:`)?{valid:!1,error:`Domain should not include a port — set that below`}:/\s/.test(t)?{valid:!1,error:`Domain cannot contain spaces`}:N0.test(t)?{valid:!0}:{valid:!1,error:`Enter a valid domain, e.g. example.com`}}function F0(e){let t=e.trim();if(!t)return{valid:!1,error:`Enter a port`};if(!/^\d+$/.test(t))return{valid:!1,error:`Port must be a number`};let n=Number(t);return n<1||n>65535?{valid:!1,error:`Port must be between 1 and 65535`}:n===80||n===443?{valid:!0,warning:`Nginx itself listens on 80/443 — this should be the port your app runs on`}:n<1024?{valid:!0,warning:`Ports below 1024 usually need root to bind`}:{valid:!0}}function I0(){let{hostname:e}=window.location;return e&&e!==`localhost`?e:`your-server-ip`}function L0(){let e=I0();return(0,W.jsxs)(Bg,{variant:`warning`,children:[(0,W.jsx)(Hr,{}),(0,W.jsx)(Vg,{children:`Point your DNS here first`}),(0,W.jsxs)(Hg,{children:[(0,W.jsx)(`p`,{children:`Nginx needs the domain already resolving to this server:`}),(0,W.jsxs)(`ol`,{className:`mt-1.5 list-decimal space-y-0.5 pl-4`,children:[(0,W.jsx)(`li`,{children:`Open your domain's DNS settings with your registrar`}),(0,W.jsxs)(`li`,{children:[`Add an `,(0,W.jsx)(`span`,{className:`font-medium`,children:`A record`}),` — host `,(0,W.jsx)(`code`,{children:`@`}),` (or a subdomain), value `,(0,W.jsx)(`code`,{className:`font-medium`,children:e})]}),(0,W.jsx)(`li`,{children:`Wait for it to propagate — usually minutes, sometimes longer`})]})]})]})}function R0({value:e,onChange:t,validation:n,touched:r}){let i=r&&!n.valid;return(0,W.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,W.jsxs)(fg,{htmlFor:`domain`,className:`text-muted-foreground flex items-center gap-1 text-xs font-medium`,children:[`Domain`,(0,W.jsx)(Lg,{children:`A domain or subdomain, e.g. example.com or app.example.com`})]}),(0,W.jsx)(Ag,{id:`domain`,value:e,onChange:e=>t(e.target.value),placeholder:`example.com`,autoComplete:`off`,autoCapitalize:`off`,spellCheck:!1,"aria-invalid":i,className:U(`h-9`,i&&`border-destructive focus-visible:ring-destructive/20`)}),i?(0,W.jsx)(jg,{tone:`error`,children:n.error}):(0,W.jsx)(`p`,{className:`text-muted-foreground text-xs`,children:`Just the domain — no https:// and no trailing path.`})]})}function z0({value:e,onChange:t,validation:n,touched:r}){let i=r&&!n.valid,a=r&&n.valid&&!!n.warning;return(0,W.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,W.jsxs)(fg,{htmlFor:`port`,className:`text-muted-foreground flex items-center gap-1 text-xs font-medium`,children:[`Port`,(0,W.jsx)(Lg,{children:`The project's port, e.g. localhost:3000, 5000, 8000`})]}),(0,W.jsx)(Ag,{id:`port`,value:e,onChange:e=>t(e.target.value),placeholder:`3000`,inputMode:`numeric`,"aria-invalid":i,className:U(`h-9`,i&&`border-destructive focus-visible:ring-destructive/20`)}),i?(0,W.jsx)(jg,{tone:`error`,children:n.error}):a?(0,W.jsx)(jg,{tone:`warning`,children:n.warning}):(0,W.jsx)(`p`,{className:`text-muted-foreground text-xs`,children:`The local port you want to connect.`})]})}function B0({checked:e,onChange:t}){return(0,W.jsxs)(`div`,{className:`border-border flex items-start justify-between gap-4 rounded-lg border px-3 py-2.5`,children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(fg,{htmlFor:`ssl`,className:`text-sm font-medium`,children:`Request SSL certificate`}),(0,W.jsx)(`p`,{className:`text-muted-foreground mt-0.5 text-xs`,children:`Uses Certbot. The domain's DNS must already point at this server's IP.`})]}),(0,W.jsx)(Cv,{id:`ssl`,checked:e,onCheckedChange:t,className:`mt-0.5`})]})}function V0({onSubmit:e,onCancel:t}){let n=(0,N.useId)(),[r,i]=(0,N.useState)(``),[a,o]=(0,N.useState)(``),[s,c]=(0,N.useState)(!0),[l,u]=(0,N.useState)(!1),[d,f]=(0,N.useState)(!1),[p,m]=(0,N.useState)(!1),h=P0(r),g=F0(a),_=h.valid&&g.valid;return(0,W.jsxs)(`form`,{id:n,onSubmit:async t=>{if(t.preventDefault(),u(!0),f(!0),!(!_||p)){m(!0);try{await e({domain:r.trim(),port:a.trim(),ssl:s})}catch{}finally{m(!1)}}},className:`grid gap-4`,children:[(0,W.jsx)(R0,{value:r,onChange:e=>{i(e),u(!0)},validation:h,touched:l}),(0,W.jsx)(z0,{value:a,onChange:e=>{o(e),f(!0)},validation:g,touched:d}),(0,W.jsx)(B0,{checked:s,onChange:c}),(0,W.jsx)(L0,{}),(0,W.jsxs)(`div`,{className:`mt-1 flex justify-end gap-2`,children:[(0,W.jsx)(Y,{type:`button`,variant:`outline`,onClick:t,disabled:p,children:`Cancel`}),(0,W.jsx)(Y,{type:`submit`,disabled:p,children:p?`Adding…`:`Add domain`})]})]})}function H0({onCreate:e,disabled:t}){let[n,r]=(0,N.useState)(!1);return(0,W.jsxs)(Kg,{open:n,onOpenChange:r,children:[(0,W.jsx)(qg,{asChild:!0,children:(0,W.jsxs)(Y,{size:`sm`,disabled:t,children:[(0,W.jsx)(wr,{className:`size-4`}),`Add domain`]})}),(0,W.jsxs)(Xg,{className:`sm:max-w-100`,children:[(0,W.jsxs)(Zg,{children:[(0,W.jsx)($g,{children:`Add domain`}),(0,W.jsx)(e_,{children:`Nginx will proxy this domain to a port on this server.`})]}),(0,W.jsx)(V0,{onCancel:()=>r(!1),onSubmit:async t=>{await e(t),r(!1)}})]})]})}function U0({domain:e,onDelete:t}){return(0,W.jsxs)(mg,{children:[(0,W.jsx)(hg,{asChild:!0,children:(0,W.jsx)(Y,{variant:`ghost`,size:`icon-sm`,"aria-label":`Delete ${e}`,className:`text-muted-foreground hover:text-destructive`,children:(0,W.jsx)(Vr,{className:`size-3.5`})})}),(0,W.jsxs)(vg,{children:[(0,W.jsxs)(yg,{children:[(0,W.jsxs)(xg,{children:[`Delete `,e,`?`]}),(0,W.jsx)(Sg,{children:`This removes the Nginx config for this domain and revokes its certificate. The site will stop responding at this domain.`})]}),(0,W.jsxs)(bg,{children:[(0,W.jsx)(wg,{children:`Cancel`}),(0,W.jsx)(Cg,{variant:`destructive`,onClick:()=>t(e),children:`Delete domain`})]})]})]})}function W0({active:e=!0,className:t}){return(0,W.jsx)(`span`,{role:`img`,"aria-label":e?`Active`:`Inactive`,title:e?`Active`:`Inactive`,className:U(`inline-block size-1.5 shrink-0 rounded-full`,e?`bg-emerald-500`:`bg-red-500`,t)})}function G0({secure:e}){return e?(0,W.jsxs)(Mv,{variant:`secondary`,className:`gap-1 font-normal`,children:[(0,W.jsx)(hr,{className:`size-3`}),`SSL`]}):(0,W.jsxs)(Mv,{variant:`outline`,className:`text-muted-foreground gap-1 font-normal`,children:[(0,W.jsx)(Pr,{className:`size-3`}),`No SSL`]})}function K0({domain:e,onReissue:t,onDelete:n}){let r=e.ssl&&e.certificateActive===!1;return(0,W.jsx)(Rg,{leading:(0,W.jsx)(W0,{active:e.active}),title:e.domain,subtitle:`Proxied to localhost:${e.port}`,trailing:(0,W.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[e.ssl?(0,W.jsx)(j0,{active:e.certificateActive}):null,e.ssl?null:(0,W.jsxs)(Y,{variant:`outline`,size:`sm`,"aria-label":`Issue SSL certificate for ${e.domain}`,onClick:()=>t(e.domain),children:[(0,W.jsx)(Fr,{className:`size-3.5`}),`Issue SSL Certificate`]}),r?(0,W.jsxs)(Pg,{children:[(0,W.jsx)(Fg,{asChild:!0,children:(0,W.jsx)(Y,{variant:`outline`,size:`icon-sm`,"aria-label":`Reissue certificate for ${e.domain}`,onClick:()=>t(e.domain),children:(0,W.jsx)(Tr,{className:`size-3.5`})})}),(0,W.jsx)(Ig,{children:`Reissue certificate`})]}):null,(0,W.jsx)(G0,{secure:e.ssl}),(0,W.jsx)(U0,{domain:e.domain,onDelete:n})]})})}function q0({domains:e,onReissue:t,onDelete:n}){return e.length===0?(0,W.jsx)(Og,{icon:lr,title:`No domains yet`,description:`Point a domain at this server and easy vps will write the Nginx config and fetch a certificate.`}):(0,W.jsx)(`div`,{className:`border-border rounded-lg border px-3`,children:e.map(e=>(0,W.jsx)(K0,{domain:e,onReissue:t,onDelete:n},e.domain))})}function J0(){let e=O_(`/domains`);return{domains:e.data??[],loading:e.loading,error:e.error,reload:e.reload}}function Y0(){let{domains:e,loading:t,error:n,reload:r}=J0(),{data:i,reload:a}=O_(`/system/status`),[o,s]=(0,N.useState)(null),c=i?.dependencies.some(e=>e.name===`nginx`&&e.installed);return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(n_,{title:`Domains`,description:`Nginx virtual hosts and their certificates.`,action:(0,W.jsx)(H0,{onCreate:async e=>{let t={domain:e.domain,port:Number(e.port),ssl:e.ssl},n=w_.post(`/domains`,t);K_.promise(n,{loading:`Adding ${t.domain}…`,success:e=>e.ssl===`failed`?`${t.domain} added without SSL`:`${t.domain} added`,description:e=>e.ssl===`failed`?e.sslError??`The certificate could not be issued.`:`Proxies to localhost:${t.port}${e.ssl===`issued`?` · SSL active`:``}`,error:e=>e.message||`Could not add ${t.domain}`}),await n,r()},disabled:!c})}),i&&!i.root?(0,W.jsx)(T0,{host:i.host,user:i.user}):null,i&&!c?(0,W.jsxs)(Bg,{className:`mb-6`,children:[(0,W.jsx)(kr,{className:`size-4`}),(0,W.jsx)(Vg,{children:`Nginx is not installed`}),(0,W.jsx)(Hg,{children:`Nginx is required to manage domains. Install it before adding a domain.`}),(0,W.jsx)(Ug,{children:(0,W.jsx)(Y,{size:`sm`,onClick:()=>s({name:`nginx`,action:`install`}),children:`Install Nginx`})})]}):null,(0,W.jsx)(Ty,{run:o,onOpenChange:e=>!e&&s(null),onFinished:a}),(0,W.jsx)(Gg,{loading:t,error:n,children:(0,W.jsx)(q0,{domains:e,onReissue:async e=>{let t=w_.post(`/domains/${e}/ssl`);K_.promise(t,{loading:`Reissuing certificate for ${e}…`,success:`Certificate renewed for ${e}`,error:t=>t.message||`Could not reissue certificate for ${e}`}),await t.catch(()=>{}),r()},onDelete:async e=>{let t=w_.delete(`/domains/${e}`);K_.promise(t,{loading:`Deleting ${e}…`,success:`${e} deleted`,error:t=>t.message||`Could not delete ${e}`}),await t.catch(()=>{}),r()}})})]})}function X0(e){let t=e.trim();return t?/\s/.test(t)?{valid:!1,error:`Project name cannot contain spaces`}:/^[a-z0-9][a-z0-9._-]*$/i.test(t)?t.length>63?{valid:!1,error:`Project name must be 63 characters or fewer`}:{valid:!0}:{valid:!1,error:`Use only letters, numbers, hyphens, dots, or underscores`}:{valid:!1,error:`Enter a project name`}}function Z0(e){let t=e.trim();return t?/^https:\/\/github\.com\/.+\/.+/.test(t)?{valid:!0}:{valid:!1,error:`Enter a GitHub URL, e.g. https://github.com/user/repo`}:{valid:!1,error:`Enter a repository URL`}}function Q0(e){let t=e.trim();return t?/[~^:?*[\\\s]/.test(t)?{valid:!1,error:`Branch name contains invalid characters`}:{valid:!0}:{valid:!1,error:`Enter a branch name`}}function $0(e){return e.trim()?{valid:!0}:{valid:!1,error:`Enter an install command`}}function e2(e){return e.trim()?{valid:!0}:{valid:!1,error:`Enter a build command`}}function t2(e){return e.trim()?{valid:!0}:{valid:!1,error:`Enter a run command`}}function n2(e){return e.trim()?{valid:!0}:{valid:!1,error:`Choose a domain`}}var r2={npm:{install:`npm install`,build:`npm run build`,run:`npm start`},yarn:{install:`yarn install`,build:`yarn build`,run:`yarn start`},pnpm:{install:`pnpm install`,build:`pnpm build`,run:`pnpm start`},bun:{install:`bun install`,build:`bun run build`,run:`bun run start`}};function i2(e){return r2[e]??{install:`npm install`,build:`npm run build`,run:`npm start`}}var a2=[`npm`,`yarn`,`pnpm`,`bun`],o2=[`pm2`,`docker`];function s2({onSubmit:e,onCancel:t,submitting:n}){let r=(0,N.useId)(),{domains:i,loading:a}=J0(),[o,s]=(0,N.useState)({name:``,domain:``,repository:``,branch:`main`,installCommand:`npm install`,buildCommand:`npm run build`,runCommand:`npm start`}),[c,l]=(0,N.useState)(`npm`),[u,d]=(0,N.useState)(`pm2`),[f,p]=(0,N.useState)({}),m={name:X0(o.name),domain:n2(o.domain),repository:Z0(o.repository),branch:Q0(o.branch),installCommand:$0(o.installCommand),buildCommand:e2(o.buildCommand),runCommand:t2(o.runCommand)},h=Object.values(m).every(e=>e.valid),g=(e,t)=>{s(n=>({...n,[e]:t})),p(t=>({...t,[e]:!0}))},_=e=>({id:`${r}-${e}`,value:o[e],error:f[e]&&!m[e].valid?m[e].error:void 0}),v=e=>({..._(e),onChange:t=>g(e,t.target.value)}),y=e=>({..._(e),onValueChange:t=>g(e,t)}),b=e=>{l(e);let t=i2(e);s(e=>({...e,installCommand:t.install,buildCommand:t.build,runCommand:t.run}))};return(0,W.jsxs)(`form`,{id:r,onSubmit:t=>{t.preventDefault(),p(Object.fromEntries(Object.keys(m).map(e=>[e,!0]))),h&&e({name:o.name.trim(),domain:o.domain,port:i.find(e=>e.domain===o.domain)?.port??0,repository:o.repository.trim(),branch:o.branch.trim(),packageManager:c,installCommand:o.installCommand.trim(),buildCommand:o.buildCommand.trim(),runCommand:o.runCommand.trim(),runtime:u})},className:`grid gap-4`,children:[(0,W.jsx)(Mg,{...v(`name`),label:`Project name`,placeholder:`my-app`,autoComplete:`off`,autoCapitalize:`off`,spellCheck:!1,hint:`A short identifier — letters, numbers, hyphens only.`}),(0,W.jsx)(u_,{...y(`domain`),label:`Domain`,options:i.map(e=>({value:e.domain,label:`${e.domain} · port ${e.port}`})),placeholder:a?`Loading domains…`:`Select a domain`,disabled:a||i.length===0,hint:i.length===0&&!a?`No domains configured yet — add one on the Domains page first.`:`The site is served here, on the port this domain already proxies to.`}),(0,W.jsx)(Mg,{...v(`repository`),label:`GitHub repository`,placeholder:`https://github.com/user/repo`,autoComplete:`off`,spellCheck:!1}),(0,W.jsx)(Mg,{...v(`branch`),label:`Branch`,placeholder:`main`,autoComplete:`off`,spellCheck:!1,hint:`The branch to deploy from.`}),(0,W.jsx)(pg,{label:`Package manager`,options:a2,value:c,onChange:b}),(0,W.jsx)(Mg,{...v(`installCommand`),label:`Install command`,placeholder:`npm install`,autoComplete:`off`,spellCheck:!1,hint:`Command to install dependencies after cloning.`}),(0,W.jsx)(Mg,{...v(`buildCommand`),label:`Build command`,placeholder:`npm run build`,autoComplete:`off`,spellCheck:!1,hint:`Command to compile or bundle the app.`}),(0,W.jsx)(Mg,{...v(`runCommand`),label:`Run command`,placeholder:`npm start`,autoComplete:`off`,spellCheck:!1,hint:`Command that starts the app in production.`}),(0,W.jsx)(pg,{label:`Runtime`,options:o2,value:u,onChange:d,hint:`PM2 keeps the process alive. Docker runs it in a container.`}),(0,W.jsxs)(`div`,{className:`mt-1 flex justify-end gap-2`,children:[(0,W.jsx)(Y,{type:`button`,variant:`outline`,onClick:t,children:`Cancel`}),(0,W.jsx)(Y,{type:`submit`,disabled:n,children:n?`Deploying…`:`Create website`})]})]})}function c2(e){return e.kind===`create`?{name:e.input.name,domain:e.input.domain,port:e.input.port,runtime:e.input.runtime}:{name:e.website.name,domain:e.website.domain,port:e.website.port,runtime:e.website.runtime}}function l2({trigger:e,onOpenChange:t,onDeployed:n}){let[r,i]=(0,N.useState)(null),[a,o]=(0,N.useState)(null);(0,N.useEffect)(()=>{if(!e){i(null),o(null);return}let t=!1;return(e.kind===`create`?w_.post(`/deployments`,e.input):w_.post(`/deployments/${e.website.name}/${e.kind===`redeploy`?`rebuild`:`redeploy`}`)).then(({id:e})=>!t&&i(e)).catch(e=>!t&&o(e.message)),()=>{t=!0}},[e]);let{lines:s,status:c}=Av(r?`/api/deployments/jobs/${r}/stream`:null),l=(0,N.useMemo)(()=>e?c2(e):null,[e]);(0,N.useEffect)(()=>{c===`done`&&l&&n(l)},[c,l,n]);let u=!!a||c===`error`,d=e?.kind===`redeploy`?`Redeploying`:e?.kind===`pull-redeploy`?`Pulling & redeploying`:`Deploying`,f=e?.kind===`create`?`Cloning ${e.input.repository} and starting it with ${e.input.runtime}…`:e?.kind===`pull-redeploy`?`Pulling the latest commit, reinstalling, and rebuilding ${l?.name}…`:`Rebuilding and restarting ${l?.name}…`;return(0,W.jsx)(t_,{open:!!e,title:l?`${d} ${l.name}`:d,description:a||(c===`running`?f:c===`done`?`Live on ${l?.domain??`port ${l?.port}`}.`:`Deploy failed — see the output below.`),lines:a?[a]:s,status:u?`error`:c,onOpenChange:t,className:`sm:max-w-2xl`})}var u2={pm2:`PM2`,docker:`Docker`};function d2({runtime:e}){return(0,W.jsx)(Mv,{variant:`outline`,className:`text-muted-foreground font-normal`,children:u2[e]})}var f2={running:`Running`,success:`Success`,failed:`Failed`},p2={deploy:`Full deploy`,rebuild:`Rebuild`},m2={running:`unknown`,success:`running`,failed:`failed`};function h2(e){let t=Date.now()-e,n=Math.round(t/6e4);if(n<1)return`just now`;if(n<60)return`${n}m ago`;let r=Math.round(n/60);return r<24?`${r}h ago`:`${Math.round(r/24)}d ago`}function g2(e){if(!e.finishedAt)return null;let t=Math.round((e.finishedAt-e.startedAt)/1e3);return t<60?`${t}s`:`${Math.round(t/60)}m`}function _2({name:e}){let{data:t,loading:n,error:r}=O_(`/deployments/${e}/history`),i=t??[];return(0,W.jsx)(Eg,{title:`Deployments`,children:(0,W.jsx)(Gg,{loading:n,error:r,rows:3,children:i.length===0?(0,W.jsx)(`p`,{className:`text-muted-foreground text-xs`,children:`No deploys recorded yet — they show up here once you deploy or redeploy this site.`}):(0,W.jsx)(`div`,{className:`rounded-md border`,children:i.map(e=>(0,W.jsxs)(`div`,{className:`border-border flex items-start gap-3 border-b px-3 py-3 last:border-b-0`,children:[(0,W.jsx)(p_,{tone:m2[e.status],className:`mt-1.5`}),(0,W.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,W.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-2 gap-y-0.5 text-sm`,children:[(0,W.jsx)(`span`,{className:`font-medium`,children:f2[e.status]}),(0,W.jsx)(`span`,{className:`text-muted-foreground`,children:`·`}),(0,W.jsx)(`span`,{className:`text-muted-foreground`,children:p2[e.kind]}),(0,W.jsx)(`span`,{className:`text-muted-foreground`,children:`·`}),(0,W.jsx)(`span`,{className:`text-muted-foreground`,children:e.branch}),e.commit?(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`span`,{className:`text-muted-foreground`,children:`·`}),(0,W.jsx)(`span`,{className:`text-muted-foreground font-mono text-xs`,children:e.commit})]}):null]}),(0,W.jsxs)(`div`,{className:`text-muted-foreground mt-0.5 text-xs`,children:[h2(e.startedAt),g2(e)?` · ${g2(e)}`:``]}),e.status===`failed`&&e.error?(0,W.jsx)(`p`,{className:`text-destructive mt-1.5 font-mono text-xs break-all`,children:e.error}):null]})]},e.id))})})})}function v2({label:e,icon:t,title:n,description:r,onConfirm:i,disabled:a}){return(0,W.jsxs)(mg,{children:[(0,W.jsx)(hg,{asChild:!0,children:(0,W.jsxs)(Y,{size:`sm`,variant:`outline`,disabled:a,children:[t,e]})}),(0,W.jsxs)(vg,{children:[(0,W.jsxs)(yg,{children:[(0,W.jsx)(xg,{children:n}),(0,W.jsx)(Sg,{children:r})]}),(0,W.jsxs)(bg,{children:[(0,W.jsx)(wg,{children:`Cancel`}),(0,W.jsx)(Cg,{onClick:i,children:e})]})]})]})}function y2({title:e,description:t,onBack:n,onRedeploy:r,onPullRedeploy:i,running:a}){return(0,W.jsx)(n_,{title:e,description:t,action:(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[r?(0,W.jsx)(v2,{label:`Redeploy`,icon:(0,W.jsx)(Dr,{className:`size-4`}),title:`Redeploy ${e}?`,description:`Rebuilds the existing code and restarts the process. It won't pull new commits — the site will be briefly unavailable while it restarts.`,onConfirm:r,disabled:a}):null,i?(0,W.jsx)(v2,{label:`Pull & Redeploy`,icon:(0,W.jsx)(cr,{className:`size-4`}),title:`Pull the latest commit and redeploy ${e}?`,description:`Fetches the latest commit on its branch, reinstalls dependencies, rebuilds, and restarts. It will be briefly unavailable while this runs.`,onConfirm:i,disabled:a}):null,(0,W.jsxs)(Y,{size:`sm`,variant:`outline`,onClick:n,children:[(0,W.jsx)(Gn,{className:`size-4`}),`Back`]})]})})}function b2({website:e}){let t=bv(),n=t.status===`authenticated`?t.session.host:null;return(0,W.jsx)(Eg,{title:`Website details`,children:(0,W.jsxs)(`div`,{className:`grid gap-4`,children:[(0,W.jsx)(Dg,{label:`Name`,value:e.name}),e.domain?(0,W.jsx)(kg,{label:`Website URL`,href:`https://${e.domain}`,children:e.domain}):(0,W.jsx)(Dg,{label:`Website URL`,value:`No domain attached`}),n?(0,W.jsx)(kg,{label:`Server`,href:`http://${n}:${e.port}`,children:`${n}:${e.port}`}):(0,W.jsx)(Dg,{label:`Server`,value:`Port ${e.port}`}),(0,W.jsx)(Dg,{label:`Repository`,value:e.repository}),(0,W.jsx)(Dg,{label:`Branch`,value:e.branch??`main`}),(0,W.jsx)(Dg,{label:`Runtime`,value:e.runtime.toUpperCase()}),(0,W.jsx)(Dg,{label:`Status`,value:e.status.charAt(0).toUpperCase()+e.status.slice(1)})]})})}function x2(e){return e.split(`
|
|
103
|
+
`).map(e=>e.trim()).filter(e=>e&&!e.startsWith(`#`)).map(e=>{let t=e.indexOf(`=`);return t===-1?{key:e,value:``}:{key:e.slice(0,t).trim(),value:e.slice(t+1).trim()}})}function S2({name:e}){let{data:t,loading:n,error:r,reload:i}=O_(`/deployments/${e}/env`),[a,o]=(0,N.useState)(!1),[s,c]=(0,N.useState)(!1),l=(0,N.useId)(),u=t?.content??null,d=u?x2(u):[];return(0,W.jsxs)(Eg,{title:`Environment variables`,children:[(0,W.jsxs)(`div`,{className:`mb-4 flex items-center justify-between gap-3`,children:[(0,W.jsx)(`p`,{className:`text-muted-foreground text-xs`,children:u?`${d.length} variable${d.length===1?``:`s`} in .env`:`No .env file uploaded yet.`}),u?(0,W.jsxs)(`label`,{className:`text-muted-foreground flex items-center gap-2 text-xs`,children:[a?(0,W.jsx)(tr,{className:`size-3.5`}):(0,W.jsx)(zr,{className:`size-3.5`}),`Developer mode`,(0,W.jsx)(Cv,{checked:a,onCheckedChange:o,size:`sm`})]}):null]}),(0,W.jsx)(Gg,{loading:n,error:r,rows:2,children:u?(0,W.jsx)(`div`,{className:`mb-4`,children:a?(0,W.jsx)(`pre`,{className:`bg-muted max-h-72 overflow-auto rounded-md p-3 font-mono text-xs whitespace-pre-wrap`,children:u}):(0,W.jsx)(`div`,{className:`rounded-md border`,children:(0,W.jsxs)(`table`,{className:`w-full text-xs`,children:[(0,W.jsx)(`thead`,{children:(0,W.jsxs)(`tr`,{className:`border-b text-left`,children:[(0,W.jsx)(`th`,{className:`text-muted-foreground px-3 py-2 font-medium`,children:`Key`}),(0,W.jsx)(`th`,{className:`text-muted-foreground px-3 py-2 font-medium`,children:`Value`})]})}),(0,W.jsx)(`tbody`,{children:d.map(({key:e,value:t},n)=>(0,W.jsxs)(`tr`,{className:`last:border-b-0`,children:[(0,W.jsx)(`td`,{className:`px-3 py-2 font-mono`,children:e}),(0,W.jsx)(`td`,{className:`text-muted-foreground px-3 py-2 font-mono break-all`,children:t})]},`${e}-${n}`))})]})})}):null}),(0,W.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,W.jsx)(fg,{htmlFor:l,className:`text-muted-foreground text-xs font-medium`,children:u?`Replace .env file`:`Upload .env file`}),(0,W.jsx)(`input`,{id:l,type:`file`,accept:`.env,.env.*`,disabled:s,onChange:async t=>{let n=t.target.files?.[0];if(t.target.value=``,!n)return;let r=n.text().then(t=>w_.put(`/deployments/${e}/env`,{content:t}));c(!0),K_.promise(r,{loading:`Uploading ${n.name}…`,success:`Environment updated — restarting ${e}…`,error:e=>e.message||`Could not upload environment file`}),await r.catch(()=>void 0),c(!1),i()},className:`text-muted-foreground border-input hover:border-foreground/20 cursor-pointer rounded-md border border-dashed bg-transparent px-3 py-6 text-center text-xs transition-colors disabled:cursor-not-allowed disabled:opacity-50`}),(0,W.jsxs)(`p`,{className:`text-muted-foreground text-xs`,children:[`Replaces .env in the project root and restarts `,e,` with the updated values.`]})]})]})}function C2({website:e}){let t=at();return(0,W.jsx)(Rg,{leading:(0,W.jsx)(p_,{tone:e.status}),title:e.name,subtitle:`${e.domain??e.repository} · port ${e.port}`,trailing:(0,W.jsx)(d2,{runtime:e.runtime}),className:`cursor-pointer`,onClick:()=>t(`/websites/${e.name}`)})}function w2({websites:e}){return e.length===0?(0,W.jsx)(Og,{icon:Er,title:`No websites yet`,description:`Clone a repository and easy vps will run it with PM2 or Docker and keep it alive.`}):(0,W.jsx)(`div`,{className:`border-border rounded-lg border px-3`,children:e.map(e=>(0,W.jsx)(C2,{website:e},e.name))})}function T2({website:e}){let{lines:t,status:n}=Av(`/api/deployments/${e.name}/logs/stream`),r=(0,N.useRef)(null);return(0,N.useEffect)(()=>{r.current?.scrollTo({top:r.current.scrollHeight})},[t]),(0,W.jsxs)(Eg,{title:`Logs`,children:[(0,W.jsx)(`div`,{ref:r,className:`bg-muted max-h-96 overflow-y-auto rounded-md p-4 font-mono text-xs whitespace-pre-wrap`,children:t.length>0?t.join(`
|
|
104
|
+
`):n===`running`?`Waiting for output…`:`No logs available.`}),n===`error`?(0,W.jsxs)(`p`,{className:`text-destructive mt-2 text-xs`,children:[`Log stream ended — `,e.name,` may not be running.`]}):null]})}function E2({website:e,onDelete:t}){return(0,W.jsxs)(`div`,{className:`grid gap-6`,children:[(0,W.jsx)(Eg,{title:`General`,children:(0,W.jsxs)(`div`,{className:`grid gap-4`,children:[(0,W.jsx)(Dg,{label:`Name`,value:e.name}),(0,W.jsx)(Dg,{label:`Branch`,value:e.branch??`main`}),(0,W.jsx)(Dg,{label:`Port`,value:String(e.port)})]})}),(0,W.jsx)(Tg,{description:`Permanently delete this website and stop the running process. This cannot be undone.`,actionLabel:`Delete website`,confirmTitle:`Delete ${e.name}?`,confirmDescription:`This will remove the website and stop the running process. This action cannot be undone.`,onConfirm:t})]})}function D2({creating:e,onCreate:t,onCancel:n}){return(0,W.jsx)(n_,{title:`Websites`,description:`Apps running on this server, from Git to PM2 or Docker.`,action:e?(0,W.jsxs)(Y,{size:`sm`,variant:`outline`,onClick:n,children:[(0,W.jsx)(Gn,{className:`size-4`}),`Back`]}):(0,W.jsxs)(Y,{size:`sm`,onClick:t,children:[(0,W.jsx)(wr,{className:`size-4`}),`New website`]})})}function O2(){let{data:e,loading:t,error:n,reload:r}=O_(`/deployments`);return{websites:e??[],loading:t,error:n,reload:r}}var k2=[{id:`details`,label:`Details`},{id:`deployments`,label:`Deployments`},{id:`logs`,label:`Logs`},{id:`env`,label:`Environment`},{id:`settings`,label:`Settings`}];function A2(){let{name:e}=lt(),t=at(),[n,r]=(0,N.useState)(`details`),[i,a]=(0,N.useState)(null),{websites:o,loading:s,error:c,reload:l}=O2(),u=o.find(t=>t.name===e),d=()=>t(`/websites`),f=async()=>{if(!u)return;let e=w_.delete(`/deployments/${u.name}`);K_.promise(e,{loading:`Deleting ${u.name}…`,success:`${u.name} deleted`,error:e=>e.message||`Could not delete ${u.name}`});try{await e}catch{return}l(),d()},p=(0,N.useCallback)(e=>{l(),K_.success(`${e.name} redeployed`)},[l]);return u?(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(y2,{title:u.name,description:`${u.repository} · port ${u.port}`,onBack:d,onRedeploy:()=>a({kind:`redeploy`,website:u}),onPullRedeploy:()=>a({kind:`pull-redeploy`,website:u}),running:!!i}),(0,W.jsxs)(`div`,{className:`flex gap-8`,children:[(0,W.jsx)(m_,{tabs:k2,active:n,onChange:r}),(0,W.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[n===`details`&&(0,W.jsx)(b2,{website:u}),n===`deployments`&&(0,W.jsx)(_2,{name:u.name}),n===`logs`&&(0,W.jsx)(T2,{website:u}),n===`env`&&(0,W.jsx)(S2,{name:u.name}),n===`settings`&&(0,W.jsx)(E2,{website:u,onDelete:f})]})]}),(0,W.jsx)(l2,{trigger:i,onOpenChange:e=>!e&&a(null),onDeployed:p})]}):(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(y2,{title:e??`Website`,description:s?`Loading…`:`Not found.`,onBack:d}),(0,W.jsx)(Gg,{loading:s,error:c,children:(0,W.jsx)(Og,{icon:sr,title:`Website not found`,description:`This website may have been deleted.`})})]})}function j2(){let{websites:e,loading:t,error:n,reload:r}=O2(),[i,a]=(0,N.useState)(!1),[o,s]=(0,N.useState)(null),c=e=>{a(!1),s({kind:`create`,input:e})},l=(0,N.useCallback)(e=>{r(),K_.success(`${e.name} is live`,{description:`${e.domain??`port ${e.port}`} · ${e.runtime}`})},[r]);return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(D2,{creating:i,onCreate:()=>a(!0),onCancel:()=>a(!1)}),i?(0,W.jsx)(`div`,{className:`border-border rounded-lg border p-4`,children:(0,W.jsx)(s2,{onSubmit:c,onCancel:()=>a(!1)})}):(0,W.jsx)(Gg,{loading:t,error:n,children:(0,W.jsx)(w2,{websites:e})}),(0,W.jsx)(l2,{trigger:o,onOpenChange:e=>!e&&s(null),onDeployed:l})]})}function M2({instance:e}){return(0,W.jsxs)(`div`,{className:`text-muted-foreground flex items-center gap-3 text-xs tabular-nums`,children:[(0,W.jsxs)(`span`,{children:[e.cpu,`% CPU`]}),(0,W.jsxs)(`span`,{children:[e.memoryMb,` MB`]}),(0,W.jsxs)(`span`,{children:[e.restarts,` restarts`]})]})}var N2={running:`Online`,stopped:`Stopped`,unknown:`Unknown`};function P2({status:e}){return(0,W.jsxs)(Mv,{variant:`outline`,className:`text-muted-foreground gap-1.5 font-normal`,children:[(0,W.jsx)(p_,{tone:e}),N2[e]]})}function F2({instance:e,onRestart:t,onStop:n,onDelete:r,onLogs:i}){return(0,W.jsx)(Rg,{title:`${e.name} #${e.instanceId}`,subtitle:(0,W.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,W.jsx)(P2,{status:e.status}),(0,W.jsx)(M2,{instance:e})]}),trailing:(0,W.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,W.jsx)(Y,{variant:`ghost`,size:`icon`,"aria-label":`Logs for ${e.name}`,className:`size-7`,onClick:()=>i(e.name),children:(0,W.jsx)(Or,{className:`size-3.5`})}),(0,W.jsx)(Y,{variant:`ghost`,size:`icon`,"aria-label":`Restart ${e.name}`,className:`size-7`,onClick:()=>t(e.name),children:(0,W.jsx)(Dr,{className:`size-3.5`})}),(0,W.jsx)(Y,{variant:`ghost`,size:`icon`,"aria-label":`Stop ${e.name}`,className:`size-7`,onClick:()=>n(e.name),children:(0,W.jsx)(Lr,{className:`size-3.5`})}),(0,W.jsxs)(mg,{children:[(0,W.jsx)(hg,{asChild:!0,children:(0,W.jsx)(Y,{variant:`ghost`,size:`icon`,"aria-label":`Delete ${e.name}`,className:`text-muted-foreground hover:text-destructive size-7`,children:(0,W.jsx)(Vr,{className:`size-3.5`})})}),(0,W.jsxs)(vg,{children:[(0,W.jsxs)(yg,{children:[(0,W.jsxs)(xg,{children:[`Delete `,e.name,`?`]}),(0,W.jsx)(Sg,{children:`This will remove the PM2 process permanently. It will stop running and be deregistered from PM2.`})]}),(0,W.jsxs)(bg,{children:[(0,W.jsx)(wg,{children:`Cancel`}),(0,W.jsx)(Cg,{variant:`destructive`,onClick:()=>r(e.name),children:`Delete`})]})]})]})]})})}function I2({instances:e,onRestart:t,onStop:n,onDelete:r,onLogs:i}){return e.length===0?(0,W.jsx)(Og,{icon:Wn,title:`No PM2 instances`,description:`Apps deployed with the PM2 runtime will appear here, with live CPU, memory and restart counts.`}):(0,W.jsx)(`div`,{className:`border-border rounded-lg border px-3`,children:e.map(e=>(0,W.jsx)(F2,{instance:e,onRestart:t,onStop:n,onDelete:r,onLogs:i},`${e.name}-${e.instanceId}`))})}function L2(){let{data:e,error:t,loading:n,reload:r}=O_(`/instances`),[i,a]=(0,N.useState)(null),{lines:o,status:s}=Av(i?`/api/instances/${i}/logs/stream`:null);function c(e){let t=w_.post(`/instances/${e}/restart`);K_.promise(t,{loading:`Restarting ${e}...`,success:`${e} restarted`,error:e=>e.message||`Failed to restart`}),t.then(()=>r(),()=>{})}function l(e){let t=w_.post(`/instances/${e}/stop`);K_.promise(t,{loading:`Stopping ${e}...`,success:`${e} stopped`,error:e=>e.message||`Failed to stop`}),t.then(()=>r(),()=>{})}function u(e){let t=w_.delete(`/instances/${e}`);K_.promise(t,{loading:`Deleting ${e}...`,success:`${e} deleted`,error:e=>e.message||`Failed to delete`}),t.then(()=>r(),()=>{})}return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(n_,{title:`PM2 instances`,description:`Processes managed by PM2, with live status and resource use.`}),(0,W.jsx)(Gg,{loading:n,error:t,children:(0,W.jsx)(I2,{instances:e??[],onRestart:c,onStop:l,onDelete:u,onLogs:a})}),(0,W.jsx)(t_,{open:i!==null,title:i?`${i} logs`:`Logs`,description:`Live PM2 output for this process.`,lines:o,status:s,onOpenChange:e=>{e||a(null)}})]})}function R2({following:e,onToggle:t}){return(0,W.jsxs)(Y,{variant:`outline`,size:`sm`,className:`h-7`,onClick:t,children:[e?(0,W.jsx)(Sr,{className:`size-3.5`}):(0,W.jsx)(Cr,{className:`size-3.5`}),e?`Pause`:`Follow`]})}var z2=[{id:`panel`,label:`Panel`,origin:`journalctl -u easy-vps`},{id:`nginx`,label:`Nginx`,origin:`/var/log/nginx/error.log`},{id:`pm2`,label:`PM2`,origin:`pm2 logs`},{id:`docker`,label:`Docker`,origin:`docker logs`}];function B2({value:e,onChange:t}){return(0,W.jsx)(dv,{value:e,onValueChange:e=>t(e),children:(0,W.jsx)(pv,{children:z2.map(e=>(0,W.jsx)(mv,{value:e.id,children:e.label},e.id))})})}function V2({lines:e,source:t}){return(0,W.jsx)(`div`,{className:`log-viewer border-border bg-muted/40 max-h-[90vh] overflow-auto rounded-lg border`,children:e.length===0?(0,W.jsxs)(`div`,{className:`flex flex-col items-center justify-center px-6 py-14 text-center`,children:[(0,W.jsx)(Or,{className:`text-muted-foreground/70 size-5`}),(0,W.jsxs)(`p`,{className:`mt-3 text-sm font-medium`,children:[`No `,t.label,` output yet`]}),(0,W.jsxs)(`p`,{className:`text-muted-foreground mt-1 max-w-xs text-xs`,children:[`Lines from `,t.origin,` will stream here once log streaming is connected.`]})]}):(0,W.jsx)(`pre`,{className:`w-max min-w-full px-3 py-2.5 font-mono text-xs leading-relaxed`,children:e.map((e,t)=>(0,W.jsxs)(`div`,{className:`whitespace-pre`,children:[e.timestamp?(0,W.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.timestamp,` `]}):null,e.message]},t))})})}function H2(){let[e,t]=(0,N.useState)(`panel`),[n,r]=(0,N.useState)(!1),i=z2.find(t=>t.id===e)??z2[0],{lines:a,status:o}=Av(n?`/api/logs/${e}/stream`:null),s=(0,N.useMemo)(()=>a.map(t=>({timestamp:``,source:e,message:t})),[a,e]);return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(n_,{title:`Runtime logs`,description:`Output from the panel, Nginx, PM2 and Docker.`,action:(0,W.jsx)(R2,{following:n,onToggle:()=>r(e=>!e)})}),(0,W.jsx)(`div`,{className:`mb-3`,children:(0,W.jsx)(B2,{value:e,onChange:e=>{t(e),r(!1)}})}),(0,W.jsx)(V2,{lines:s,source:i}),n&&o===`error`?(0,W.jsx)(`p`,{className:`text-destructive mt-2 text-xs`,children:`Log stream ended unexpectedly.`}):null]})}function U2(){let{data:e,error:t,loading:n,reload:r}=O_(`/system/status`),[i,a]=(0,N.useState)(``),[o,s]=(0,N.useState)(null),[c,l]=(0,N.useState)(null),u=(0,N.useMemo)(()=>{if(!e)return[];let t=i.toLowerCase();return e.dependencies.filter(e=>e.name.toLowerCase().includes(t)||by[e.name].toLowerCase().includes(t)||xy[e.name].toLowerCase().includes(t))},[e,i]),d=(0,N.useMemo)(()=>u.filter(e=>e.installed),[u]),f=(0,N.useMemo)(()=>u.filter(e=>!e.installed),[u]);return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(n_,{title:`Dependencies`,description:`Manage system packages installed on this server.`}),(0,W.jsx)(`div`,{className:`mb-6`,children:(0,W.jsx)(Ag,{placeholder:`Search dependencies...`,value:i,onChange:e=>a(e.target.value),className:`max-w-sm`})}),(0,W.jsx)(Gg,{loading:n,error:t,rows:5,children:e?(0,W.jsxs)(`div`,{className:`space-y-8`,children:[d.length>0&&(0,W.jsxs)(`section`,{children:[(0,W.jsx)(`h2`,{className:`text-muted-foreground mb-3 text-sm font-medium`,children:`Installed Dependencies`}),(0,W.jsx)(`div`,{className:`grid gap-3 sm:grid-cols-2 lg:grid-cols-3`,children:d.map(e=>(0,W.jsx)(W2,{dependency:e,busy:o?.name===e.name,onClick:()=>l(e)},e.name))})]}),f.length>0&&(0,W.jsxs)(`section`,{children:[(0,W.jsx)(`h2`,{className:`text-muted-foreground mb-3 text-sm font-medium`,children:`Suggested for You`}),(0,W.jsx)(`div`,{className:`grid gap-3 sm:grid-cols-2 lg:grid-cols-3`,children:f.map(e=>(0,W.jsx)(W2,{dependency:e,busy:o?.name===e.name,onClick:()=>l(e)},e.name))})]})]}):null}),c?(0,W.jsx)(mg,{open:!!c,onOpenChange:e=>{e||l(null)},children:(0,W.jsxs)(vg,{children:[(0,W.jsxs)(yg,{children:[(0,W.jsxs)(xg,{children:[c.installed?`Uninstall`:`Install`,` `,by[c.name],`?`]}),(0,W.jsx)(Sg,{asChild:!0,children:(0,W.jsx)(`div`,{className:`space-y-2`,children:c.installed?(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(`p`,{children:[`This purges the `,by[c.name],` package from the server and permanently deletes its configuration. It cannot be undone.`]}),c.removes.length>0&&(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`p`,{className:`text-foreground font-medium`,children:`These are deleted:`}),(0,W.jsx)(`ul`,{className:`mt-1 list-disc space-y-0.5 pl-5 font-mono text-xs`,children:c.removes.map(e=>(0,W.jsx)(`li`,{children:e},e))})]})]}):(0,W.jsxs)(`p`,{children:[`This runs the package manager on the server to install`,` `,by[c.name],`. It may take a minute.`]})})})]}),(0,W.jsxs)(bg,{children:[(0,W.jsx)(wg,{children:`Cancel`}),(0,W.jsx)(Cg,{className:c.installed?`bg-destructive text-black hover:bg-destructive/90`:``,onClick:()=>{s({name:c.name,action:c.installed?`uninstall`:`install`}),l(null)},children:c.installed?`Uninstall`:`Install`})]})]})}):null,(0,W.jsx)(Ty,{run:o,onOpenChange:e=>!e&&s(null),onFinished:r})]})}function W2({dependency:e,busy:t,onClick:n}){return(0,W.jsx)(`button`,{type:`button`,onClick:n,disabled:t,className:U(`text-left transition-colors cursor-pointer`,`rounded-xl ring-1 ring-foreground/10`,`focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 outline-none`,`disabled:pointer-events-none disabled:opacity-50`),children:(0,W.jsx)(hy,{size:`sm`,className:`border-0 ring-0`,children:(0,W.jsxs)(vy,{className:`flex items-center gap-3`,children:[(0,W.jsx)(wy,{name:e.name,className:`size-5 shrink-0`}),(0,W.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,W.jsx)(`span`,{className:`truncate text-sm font-medium`,children:by[e.name]}),e.installed&&e.version&&(0,W.jsx)(`span`,{className:`bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 rounded-full px-1.5 py-0.5 text-[10px] font-medium leading-none`,children:e.version.split(`.`).slice(0,2).join(`.`)})]}),(0,W.jsx)(`p`,{className:`text-muted-foreground mt-0.5 truncate text-xs`,children:xy[e.name]})]})]})})})}var G2=3e4;function K2(){let{data:e,error:t,loading:n,reload:r}=O_(`/system/metrics`),[i,a]=(0,N.useState)(null),[o,s]=(0,N.useState)(!1),c=(0,N.useCallback)(async()=>{try{let e=await(await fetch(`/api/system/update/check`)).json();a(e)}catch{}},[]);(0,N.useEffect)(()=>{let e=setInterval(r,G2);return()=>clearInterval(e)},[r]),(0,N.useEffect)(()=>{c()},[c]);let l=(0,N.useCallback)(()=>{window.location.reload()},[]);return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(n_,{title:`Dashboard`,description:`Real-time system overview and resource usage.`,action:(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[i?.updateAvailable?(0,W.jsxs)(Y,{size:`sm`,onClick:()=>s(!0),children:[(0,W.jsx)(ar,{className:`size-4 mr-1.5`}),`Update to v`,i.latest]}):null,(0,W.jsxs)(Y,{variant:`outline`,size:`sm`,onClick:r,children:[(0,W.jsx)(Tr,{className:`size-4 mr-1.5`}),`Refresh`]})]})}),(0,W.jsx)(Gg,{loading:n,error:t,rows:6,children:e?(0,W.jsxs)(`div`,{className:`space-y-6`,children:[(0,W.jsx)(O0,{metrics:e}),(0,W.jsxs)(`div`,{className:`grid gap-6 lg:grid-cols-3`,children:[(0,W.jsx)(x0,{cpuCores:e.cpu.cores,className:`lg:col-span-2`}),(0,W.jsx)(w0,{})]}),(0,W.jsxs)(`div`,{className:`grid gap-6 lg:grid-cols-2`,children:[(0,W.jsx)(k0,{processes:e.topProcesses}),(0,W.jsx)(yy,{})]})]}):null}),(0,W.jsx)(A0,{open:o,onOpenChange:s,onFinished:l})]})}var q2=[{value:`tcp`,label:`TCP`},{value:`udp`,label:`UDP`}];function J2(){let{data:e,error:t,loading:n,reload:r}=O_(`/firewall/status`),[i,a]=(0,N.useState)(``),[o,s]=(0,N.useState)(`tcp`),[c,l]=(0,N.useState)(!1),[u,d]=(0,N.useState)(null),[f,p]=(0,N.useState)(!1),[m,h]=(0,N.useState)(null),g=e;function _(e){e.preventDefault();let t=Number(i);if(!Number.isInteger(t)||t<1||t>65535){K_.error(`Enter a port between 1 and 65535`);return}l(!0);let n=w_.post(`/firewall/rules`,{port:t,protocol:o});K_.promise(n,{loading:`Opening ${t}/${o}…`,success:`${t}/${o} is now open`,error:e=>e.message||`Failed to open port`}),n.then(()=>{a(``),r()}).finally(()=>l(!1))}function v(e){d(e);let t=w_.delete(`/firewall/rules/${e}`);K_.promise(t,{loading:`Removing rule…`,success:`Rule removed`,error:e=>e.message||`Failed to remove rule`}),t.then(()=>r()).finally(()=>d(null))}function y(){if(!g)return;p(!0);let e=w_.post(`/firewall/state`,{enabled:!g.active});K_.promise(e,{loading:g.active?`Disabling firewall…`:`Enabling firewall…`,success:g.active?`Firewall disabled`:`Firewall enabled`,error:e=>e.message||`Failed to change firewall state`}),e.then(()=>r()).finally(()=>p(!1))}return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(n_,{title:`Firewall`,description:`Manage ufw rules to control inbound traffic on this server.`}),g&&!g.installed?(0,W.jsxs)(Bg,{variant:`warning`,className:`mb-8`,children:[(0,W.jsx)(Ir,{}),(0,W.jsx)(Vg,{children:`ufw is not installed`}),(0,W.jsx)(Hg,{children:`Install ufw on the server to manage firewall rules from here.`})]}):null,(0,W.jsxs)(d_,{title:`Open a port`,description:`Allow inbound traffic to a TCP or UDP port.`,action:g?.installed?(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,W.jsxs)(Mv,{variant:g.active?`default`:`secondary`,children:[(0,W.jsx)(p_,{tone:g.active?`running`:`stopped`}),g.active?`Active`:`Inactive`]}),(0,W.jsx)(Y,{variant:g.active?`outline`:`default`,size:`sm`,disabled:f,onClick:y,children:g.active?`Disable`:`Enable`})]}):null,children:[(0,W.jsxs)(`form`,{onSubmit:_,className:`flex flex-wrap items-end gap-3`,children:[(0,W.jsx)(`div`,{className:`w-40`,children:(0,W.jsx)(Mg,{id:`port`,label:`Port`,type:`number`,inputMode:`numeric`,min:1,max:65535,placeholder:`e.g. 3000`,value:i,onChange:e=>a(e.target.value)})}),(0,W.jsx)(`div`,{className:`w-32`,children:(0,W.jsx)(u_,{label:`Protocol`,options:q2,value:o,onValueChange:e=>s(e)})}),(0,W.jsxs)(Y,{type:`submit`,disabled:c,children:[(0,W.jsx)(wr,{}),`Open port`]})]}),g?.installed&&!g.active?(0,W.jsx)(`p`,{className:`text-muted-foreground mt-2 text-xs`,children:`The firewall is inactive — rules are recorded but not enforced until ufw is enabled.`}):null]}),(0,W.jsx)(d_,{title:`Rules`,description:`Ports currently allowed through the firewall.`,children:(0,W.jsx)(Gg,{loading:n,error:t,children:g&&g.rules.length>0?(0,W.jsx)(`div`,{className:`rounded-lg border`,children:g.rules.map(e=>(0,W.jsx)(Rg,{leading:(0,W.jsx)(Ir,{className:`size-4`}),title:e.to,subtitle:`${e.action} · from ${e.from}`,trailing:(0,W.jsxs)(Y,{variant:`ghost`,size:`sm`,disabled:u===e.number,onClick:()=>h(e),children:[(0,W.jsx)(Vr,{}),`Remove`]})},e.number))}):(0,W.jsx)(Og,{icon:Ir,title:`No rules yet`,description:`Open a port above to add your first firewall rule.`})})}),(0,W.jsx)(mg,{open:m!==null,onOpenChange:e=>{e||h(null)},children:(0,W.jsxs)(vg,{children:[(0,W.jsxs)(yg,{children:[(0,W.jsx)(xg,{children:`Remove firewall rule?`}),(0,W.jsxs)(Sg,{children:[`This will delete the rule for`,` `,(0,W.jsx)(`span`,{className:`font-medium text-foreground`,children:m?.to}),` (`,m?.action,`). The port will no longer be allowed through the firewall.`]})]}),(0,W.jsxs)(bg,{children:[(0,W.jsx)(wg,{children:`Cancel`}),(0,W.jsx)(Cg,{variant:`destructive`,disabled:u!==null,onClick:()=>{m&&v(m.number)},children:`Remove rule`})]})]})})]})}function Y2(){return(0,W.jsxs)(Ft,{children:[(0,W.jsx)(Nt,{path:`/login`,element:(0,W.jsx)(Sv,{})}),(0,W.jsx)(Nt,{element:(0,W.jsx)(xv,{}),children:(0,W.jsxs)(Nt,{element:(0,W.jsx)(k_,{}),children:[(0,W.jsx)(Nt,{path:`/`,element:(0,W.jsx)(K2,{})}),(0,W.jsx)(Nt,{path:`/domains`,element:(0,W.jsx)(Y0,{})}),(0,W.jsx)(Nt,{path:`/websites`,element:(0,W.jsx)(j2,{})}),(0,W.jsx)(Nt,{path:`/websites/:name`,element:(0,W.jsx)(A2,{})}),(0,W.jsx)(Nt,{path:`/databases`,element:(0,W.jsx)(my,{})}),(0,W.jsx)(Nt,{path:`/databases/:name`,element:(0,W.jsx)(Qv,{})}),(0,W.jsx)(Nt,{path:`/firewall`,element:(0,W.jsx)(J2,{})}),(0,W.jsx)(Nt,{path:`/logs`,element:(0,W.jsx)(H2,{})}),(0,W.jsx)(Nt,{path:`/instances`,element:(0,W.jsx)(L2,{})}),(0,W.jsx)(Nt,{path:`/dependencies`,element:(0,W.jsx)(U2,{})})]})}),(0,W.jsx)(Nt,{path:`*`,element:(0,W.jsx)(jt,{to:`/`,replace:!0})})]})}var X2=(e,t,n,r,i,a,o,s)=>{let c=document.documentElement,l=[`light`,`dark`];function u(t){(Array.isArray(e)?e:[e]).forEach(e=>{let n=e===`class`,r=n&&a?i.map(e=>a[e]||e):i;n?(c.classList.remove(...r),c.classList.add(a&&a[t]?a[t]:t)):c.setAttribute(e,t)}),d(t)}function d(e){s&&l.includes(e)&&(c.style.colorScheme=e)}function f(){return window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}if(r)u(r);else try{let e=localStorage.getItem(t)||n;u(o&&e===`system`?f():e)}catch{}},Z2=N.createContext(void 0),Q2={setTheme:e=>{},themes:[]},$2=()=>N.useContext(Z2)??Q2;N.memo(({forcedTheme:e,storageKey:t,attribute:n,enableSystem:r,enableColorScheme:i,defaultTheme:a,value:o,themes:s,nonce:c,scriptProps:l})=>{let u=JSON.stringify([n,t,a,e,s,o,r,i]).slice(1,-1);return N.createElement(`script`,{...l,suppressHydrationWarning:!0,nonce:typeof window>`u`?c:``,dangerouslySetInnerHTML:{__html:`(${X2.toString()})(${u})`}})});var e4=({...e})=>{let{theme:t=`system`}=$2();return(0,W.jsx)(sv,{theme:t,className:`toaster group`,icons:{success:(0,W.jsx)(Qn,{className:`size-4`}),info:(0,W.jsx)(dr,{className:`size-4`}),warning:(0,W.jsx)(Hr,{className:`size-4`}),error:(0,W.jsx)(br,{className:`size-4`}),loading:(0,W.jsx)(mr,{className:`size-4 animate-spin`})},style:{"--normal-bg":`var(--popover)`,"--normal-text":`var(--popover-foreground)`,"--normal-border":`var(--border)`,"--border-radius":`var(--radius)`},toastOptions:{classNames:{toast:`cn-toast`}},...e})};function t4(){return(0,W.jsx)(v_,{children:(0,W.jsxs)(Ng,{children:[(0,W.jsx)(Cn,{children:(0,W.jsx)(Y2,{})}),(0,W.jsx)(e4,{position:`bottom-center`})]})})}(0,Gr.createRoot)(document.getElementById(`root`)).render((0,W.jsx)(N.StrictMode,{children:(0,W.jsx)(t4,{})}));
|
package/client/index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<title>easy-vps</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-D8fZ27vP.js"></script>
|
|
9
9
|
<link rel="stylesheet" crossorigin href="/assets/index-Dq-W19hL.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
package/dist/index.js
CHANGED
|
@@ -54,6 +54,7 @@ const logs_1 = __importDefault(require("./routes/logs"));
|
|
|
54
54
|
const system_1 = __importDefault(require("./routes/system"));
|
|
55
55
|
const auth = __importStar(require("./services/auth"));
|
|
56
56
|
const backup_scheduler_1 = require("./services/backup-scheduler");
|
|
57
|
+
const update_1 = require("./services/update");
|
|
57
58
|
exports.DEFAULT_PORT = 41556;
|
|
58
59
|
exports.DEFAULT_HOST = '0.0.0.0';
|
|
59
60
|
/** Directory holding the built UI (client-ui build output). */
|
|
@@ -115,6 +116,8 @@ function startServer(options = {}) {
|
|
|
115
116
|
const port = options.port ?? exports.DEFAULT_PORT;
|
|
116
117
|
const host = options.host ?? exports.DEFAULT_HOST;
|
|
117
118
|
const app = createApp();
|
|
119
|
+
// Record bind settings so a self-update can restart on the same port/host.
|
|
120
|
+
(0, update_1.configureUpdate)({ port, host });
|
|
118
121
|
// Start the backup scheduler
|
|
119
122
|
(0, backup_scheduler_1.startBackupScheduler)();
|
|
120
123
|
return new Promise((resolve, reject) => {
|
package/dist/routes/system.js
CHANGED
|
@@ -37,6 +37,7 @@ const express_1 = require("express");
|
|
|
37
37
|
const system = __importStar(require("../services/system"));
|
|
38
38
|
const metrics_history_1 = require("../services/metrics-history");
|
|
39
39
|
const async_route_1 = require("./async-route");
|
|
40
|
+
const update = __importStar(require("../services/update"));
|
|
40
41
|
const router = (0, express_1.Router)();
|
|
41
42
|
router.get('/status', (0, async_route_1.asyncRoute)(async (req, res) => {
|
|
42
43
|
const [privileged, dependencies] = await Promise.all([
|
|
@@ -58,6 +59,31 @@ router.get('/metrics', (0, async_route_1.asyncRoute)(async (req, res) => {
|
|
|
58
59
|
router.get('/metrics/history', (0, async_route_1.asyncRoute)(async (req, res) => {
|
|
59
60
|
res.json((0, metrics_history_1.getLoadHistory)(req.remote.host));
|
|
60
61
|
}));
|
|
62
|
+
router.get('/update/check', (0, async_route_1.asyncRoute)(async (_req, res) => {
|
|
63
|
+
res.json(await update.checkForUpdate());
|
|
64
|
+
}));
|
|
65
|
+
router.get('/update/install/stream', (req, res) => {
|
|
66
|
+
res.writeHead(200, {
|
|
67
|
+
'Content-Type': 'text/event-stream',
|
|
68
|
+
'Cache-Control': 'no-cache',
|
|
69
|
+
Connection: 'keep-alive',
|
|
70
|
+
});
|
|
71
|
+
const send = (event, data) => {
|
|
72
|
+
res.write(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`);
|
|
73
|
+
};
|
|
74
|
+
const cancel = update.runUpdate({
|
|
75
|
+
onOutput: (line) => send('log', line),
|
|
76
|
+
onDone: () => {
|
|
77
|
+
send('done', 'ok');
|
|
78
|
+
res.end();
|
|
79
|
+
},
|
|
80
|
+
onError: (message) => {
|
|
81
|
+
send('failed', message);
|
|
82
|
+
res.end();
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
req.on('close', cancel);
|
|
86
|
+
});
|
|
61
87
|
router.get('/:action(install|uninstall)/:name/stream', (req, res) => {
|
|
62
88
|
res.writeHead(200, {
|
|
63
89
|
'Content-Type': 'text/event-stream',
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export declare const DEFAULT_PORT = 41556;
|
|
2
|
+
export declare const DEFAULT_HOST = "0.0.0.0";
|
|
3
|
+
export interface UpdateInfo {
|
|
4
|
+
/** Version this panel is running. */
|
|
5
|
+
current: string;
|
|
6
|
+
/** Latest version published to the registry. */
|
|
7
|
+
latest: string;
|
|
8
|
+
/** True when `latest` is newer than `current`. */
|
|
9
|
+
updateAvailable: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface UpdateHandlers {
|
|
12
|
+
onOutput: (line: string) => void;
|
|
13
|
+
onDone: (data: string) => void;
|
|
14
|
+
onError: (message: string) => void;
|
|
15
|
+
}
|
|
16
|
+
/** Recorded by startServer so a restart after install uses the right bind. */
|
|
17
|
+
export declare function configureUpdate(options: {
|
|
18
|
+
port: number;
|
|
19
|
+
host: string;
|
|
20
|
+
}): void;
|
|
21
|
+
/** Fetch the latest published version; falls back to the current one offline. */
|
|
22
|
+
export declare function checkForUpdate(): Promise<UpdateInfo>;
|
|
23
|
+
/**
|
|
24
|
+
* Installs the latest published version from npm, streaming output line by line.
|
|
25
|
+
* Returns a function that cancels the run in progress. On success the panel is
|
|
26
|
+
* restarted so the freshly installed server code and UI take effect.
|
|
27
|
+
*/
|
|
28
|
+
export declare function runUpdate(handlers: UpdateHandlers): () => void;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DEFAULT_HOST = exports.DEFAULT_PORT = void 0;
|
|
7
|
+
exports.configureUpdate = configureUpdate;
|
|
8
|
+
exports.checkForUpdate = checkForUpdate;
|
|
9
|
+
exports.runUpdate = runUpdate;
|
|
10
|
+
// Self-update: check npm for a newer release and pull it onto the server.
|
|
11
|
+
//
|
|
12
|
+
// easy-vps installs globally (`npm i -g easy-vps`) and runs as a background
|
|
13
|
+
// service, so "updating the project" means pulling the latest published package
|
|
14
|
+
// from the registry. The web UI ships prebuilt inside the package's `client/`
|
|
15
|
+
// folder, so reinstalling the package also updates the UI the panel serves.
|
|
16
|
+
const node_child_process_1 = require("node:child_process");
|
|
17
|
+
const node_fs_1 = require("node:fs");
|
|
18
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
19
|
+
exports.DEFAULT_PORT = 41556;
|
|
20
|
+
exports.DEFAULT_HOST = '0.0.0.0';
|
|
21
|
+
let serverOptions = { port: exports.DEFAULT_PORT, host: exports.DEFAULT_HOST };
|
|
22
|
+
/** Recorded by startServer so a restart after install uses the right bind. */
|
|
23
|
+
function configureUpdate(options) {
|
|
24
|
+
serverOptions = { ...options };
|
|
25
|
+
}
|
|
26
|
+
function packageRoot() {
|
|
27
|
+
// Compiled to dist/services/update.js, so two levels up reaches the package root.
|
|
28
|
+
return node_path_1.default.resolve(__dirname, '..', '..');
|
|
29
|
+
}
|
|
30
|
+
function readPackage() {
|
|
31
|
+
const pkg = JSON.parse((0, node_fs_1.readFileSync)(node_path_1.default.join(packageRoot(), 'package.json'), 'utf8'));
|
|
32
|
+
return { name: pkg.name, version: pkg.version };
|
|
33
|
+
}
|
|
34
|
+
/** Compare two semver-ish strings: >0 when a is newer than b. */
|
|
35
|
+
function compareVersions(a, b) {
|
|
36
|
+
const clean = (v) => v.split('-')[0].split('.').map((n) => parseInt(n, 10) || 0);
|
|
37
|
+
const pa = clean(a);
|
|
38
|
+
const pb = clean(b);
|
|
39
|
+
for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
|
|
40
|
+
const x = pa[i] || 0;
|
|
41
|
+
const y = pb[i] || 0;
|
|
42
|
+
if (x !== y)
|
|
43
|
+
return x > y ? 1 : -1;
|
|
44
|
+
}
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
/** Fetch the latest published version; falls back to the current one offline. */
|
|
48
|
+
async function checkForUpdate() {
|
|
49
|
+
const { name, version } = readPackage();
|
|
50
|
+
const current = version;
|
|
51
|
+
let latest = version;
|
|
52
|
+
try {
|
|
53
|
+
const response = await fetch(`https://registry.npmjs.org/${name}/latest`, {
|
|
54
|
+
signal: AbortSignal.timeout(8000),
|
|
55
|
+
});
|
|
56
|
+
if (response.ok) {
|
|
57
|
+
const data = (await response.json());
|
|
58
|
+
if (data.version)
|
|
59
|
+
latest = data.version;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Registry unreachable — report the running version as the latest.
|
|
64
|
+
}
|
|
65
|
+
return { current, latest, updateAvailable: compareVersions(latest, current) > 0 };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Installs the latest published version from npm, streaming output line by line.
|
|
69
|
+
* Returns a function that cancels the run in progress. On success the panel is
|
|
70
|
+
* restarted so the freshly installed server code and UI take effect.
|
|
71
|
+
*/
|
|
72
|
+
function runUpdate(handlers) {
|
|
73
|
+
const { name } = readPackage();
|
|
74
|
+
let cancelled = false;
|
|
75
|
+
// `--ignore-scripts` skips the package's postinstall, which would otherwise
|
|
76
|
+
// try to start the panel itself and race with the running one. We restart
|
|
77
|
+
// deliberately once the install finishes.
|
|
78
|
+
const proc = (0, node_child_process_1.spawn)('npm', ['install', '-g', `${name}@latest`, '--ignore-scripts', '--no-audit', '--no-fund'], { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
79
|
+
const onData = (chunk) => {
|
|
80
|
+
for (const line of chunk.toString().split('\n')) {
|
|
81
|
+
if (line.trim())
|
|
82
|
+
handlers.onOutput(line);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
proc.stdout?.on('data', onData);
|
|
86
|
+
proc.stderr?.on('data', onData);
|
|
87
|
+
proc.on('error', (error) => {
|
|
88
|
+
if (!cancelled)
|
|
89
|
+
handlers.onError(error.message);
|
|
90
|
+
});
|
|
91
|
+
proc.on('close', (code) => {
|
|
92
|
+
if (cancelled)
|
|
93
|
+
return;
|
|
94
|
+
if (code !== 0) {
|
|
95
|
+
handlers.onError(`npm exited with code ${code}`);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
handlers.onOutput('Update installed. Restarting the panel to apply changes…');
|
|
99
|
+
handlers.onDone('ok');
|
|
100
|
+
// Flush the SSE before the process is replaced by the restart.
|
|
101
|
+
setTimeout(() => restartPanel(), 600);
|
|
102
|
+
});
|
|
103
|
+
return () => {
|
|
104
|
+
cancelled = true;
|
|
105
|
+
try {
|
|
106
|
+
proc.kill('SIGTERM');
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// already gone
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/** Spawn a fully detached restart so the old process can be replaced safely. */
|
|
114
|
+
function restartPanel() {
|
|
115
|
+
const cli = node_path_1.default.resolve(packageRoot(), 'bin', 'cli.js');
|
|
116
|
+
const child = (0, node_child_process_1.spawn)(process.execPath, [cli, 'restart'], {
|
|
117
|
+
detached: true,
|
|
118
|
+
stdio: 'ignore',
|
|
119
|
+
env: {
|
|
120
|
+
...process.env,
|
|
121
|
+
EASY_VPS_PORT: String(serverOptions.port),
|
|
122
|
+
EASY_VPS_HOST: serverOptions.host,
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
child.unref();
|
|
126
|
+
}
|