From 4c55eadeb6c5c32629e3e6d567257c01e1ae697f Mon Sep 17 00:00:00 2001 From: maziggy Date: Wed, 8 Apr 2026 11:38:50 +0200 Subject: [PATCH] Add SpoolBuddy quick menu with power control and system commands (#893) Swipe down from the top of the SpoolBuddy display to open a quick-access menu for toggling printer smart plugs and managing the device (restart daemon, restart browser, reboot, shutdown). All destructive actions require confirmation. Backend: new POST /spoolbuddy/devices/{id}/system/command endpoint queuing reboot/shutdown/restart_daemon/restart_browser commands. Daemon: handles commands via subprocess (sudo reboot, systemctl restart). Frontend: SpoolBuddyQuickMenu component, swipe-down gesture detection, i18n keys for all 7 locales. --- frontend/src/components/spoolbuddy/SpoolBuddyLayout.tsx | 9 +++------ static/assets/{index-DPDJoHI3.js => index-C5rdBDsu.js} | 2 +- static/index.html | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) rename static/assets/{index-DPDJoHI3.js => index-C5rdBDsu.js} (99%) diff --git a/frontend/src/components/spoolbuddy/SpoolBuddyLayout.tsx b/frontend/src/components/spoolbuddy/SpoolBuddyLayout.tsx index 47f8a518b..a3971fe2c 100644 --- a/frontend/src/components/spoolbuddy/SpoolBuddyLayout.tsx +++ b/frontend/src/components/spoolbuddy/SpoolBuddyLayout.tsx @@ -167,12 +167,9 @@ export function SpoolBuddyLayout() { touchStartRef.current = null; swipeLockedRef.current = false; - // Vertical swipe: open/close quick menu - if (Math.abs(dy) >= SWIPE_THRESHOLD && Math.abs(dy) > Math.abs(dx)) { - if (dy > 0 && startY < 80) { - // Swipe down from top area → open quick menu - setQuickMenuOpen(true); - } + // Vertical swipe down from top edge → open quick menu + if (dy >= SWIPE_THRESHOLD && Math.abs(dy) > Math.abs(dx) && startY < 80) { + setQuickMenuOpen(true); return; } diff --git a/static/assets/index-DPDJoHI3.js b/static/assets/index-C5rdBDsu.js similarity index 99% rename from static/assets/index-DPDJoHI3.js rename to static/assets/index-C5rdBDsu.js index 2f3010ff5..5683a11ea 100644 --- a/static/assets/index-DPDJoHI3.js +++ b/static/assets/index-C5rdBDsu.js @@ -8731,7 +8731,7 @@ Difference: ${l}g (mismatch!)`;return a.jsxs("div",{className:`flex items-center In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)})()}function f(B,W){if(B){if(typeof B=="string")return y(B,W);var D={}.toString.call(B).slice(8,-1);return D==="Object"&&B.constructor&&(D=B.constructor.name),D==="Map"||D==="Set"?Array.from(B):D==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(D)?y(B,W):void 0}}function y(B,W){(W==null||W>B.length)&&(W=B.length);for(var D=0,j=Array(W);D"u"||"remove"in Element.prototype||(Element.prototype.remove=function(){this.parentNode&&this.parentNode.removeChild(this)}),typeof self<"u"&&"document"in self&&((!("classList"in document.createElement("_"))||document.createElementNS&&!("classList"in document.createElementNS("http://www.w3.org/2000/svg","g")))&&(function(B){if("Element"in B){var W="classList",D="prototype",j=B.Element[D],z=Object,K=String[D].trim||function(){return this.replace(/^\s+|\s+$/g,"")},q=Array[D].indexOf||function(ie){for(var me=0,pe=this.length;me2&&arguments[2]!==void 0&&arguments[2]?Object.assign({},this.getDefaultDiplay(),z):z||this.getDefaultDiplay())[j]||j}},{key:"getUpdatedInput",value:function(j,z,K){var q=arguments.length>3&&arguments[3]!==void 0?arguments[3]:K,ce=arguments.length>4&&arguments[4]!==void 0&&arguments[4],O=this.getOptions(),G=[K,q,ce],X=z;return(j==="{bksp}"||j==="{backspace}")&&X.length>0?X=this.removeAt.apply(this,[X].concat(G)):(j==="{delete}"||j==="{forwarddelete}")&&X.length>0?X=this.removeForwardsAt.apply(this,[X].concat(G)):j==="{space}"?X=this.addStringAt.apply(this,[X," "].concat(G)):j!=="{tab}"||typeof O.tabCharOnTab=="boolean"&&O.tabCharOnTab===!1?j!=="{enter}"&&j!=="{numpadenter}"||!O.newLineOnEnter?j.includes("numpad")&&Number.isInteger(Number(j[j.length-2]))?X=this.addStringAt.apply(this,[X,j[j.length-2]].concat(G)):j==="{numpaddivide}"?X=this.addStringAt.apply(this,[X,"/"].concat(G)):j==="{numpadmultiply}"?X=this.addStringAt.apply(this,[X,"*"].concat(G)):j==="{numpadsubtract}"?X=this.addStringAt.apply(this,[X,"-"].concat(G)):j==="{numpadadd}"?X=this.addStringAt.apply(this,[X,"+"].concat(G)):j==="{numpaddecimal}"?X=this.addStringAt.apply(this,[X,"."].concat(G)):j==="{"||j==="}"?X=this.addStringAt.apply(this,[X,j].concat(G)):j.includes("{")||j.includes("}")||(X=this.addStringAt.apply(this,[X,j].concat(G))):X=this.addStringAt.apply(this,[X,` `].concat(G)):X=this.addStringAt.apply(this,[X," "].concat(G)),O.debug&&console.log("Input will be: "+X),X}},{key:"updateCaretPos",value:function(j){var z=arguments.length>1&&arguments[1]!==void 0&&arguments[1],K=this.updateCaretPosAction(j,z);this.dispatch((function(q){q.setCaretPosition(K)}))}},{key:"updateCaretPosAction",value:function(j){var z=arguments.length>1&&arguments[1]!==void 0&&arguments[1],K=this.getOptions(),q=this.getCaretPosition();return q!=null&&(z?q>0&&(q-=j):q+=j),K.debug&&console.log("Caret at:",q),q}},{key:"addStringAt",value:function(j,z){var K,q=arguments.length>2&&arguments[2]!==void 0?arguments[2]:j.length,ce=arguments.length>3&&arguments[3]!==void 0?arguments[3]:j.length,O=arguments.length>4&&arguments[4]!==void 0&&arguments[4];return q||q===0?(K=[j.slice(0,q),z,j.slice(ce)].join(""),this.isMaxLengthReached()||O&&this.updateCaretPos(z.length)):K=j+z,K}},{key:"removeAt",value:function(j){var z,K=arguments.length>1&&arguments[1]!==void 0?arguments[1]:j.length,q=arguments.length>2&&arguments[2]!==void 0?arguments[2]:j.length,ce=arguments.length>3&&arguments[3]!==void 0&&arguments[3];if(K===0&&q===0)return j;if(K===q){var O=/([\uD800-\uDBFF][\uDC00-\uDFFF])/g;K&&K>=0?j.substring(K-2,K).match(O)?(z=j.substr(0,K-2)+j.substr(K),ce&&this.updateCaretPos(2,!0)):(z=j.substr(0,K-1)+j.substr(K),ce&&this.updateCaretPos(1,!0)):j.slice(-2).match(O)?(z=j.slice(0,-2),ce&&this.updateCaretPos(2,!0)):(z=j.slice(0,-1),ce&&this.updateCaretPos(1,!0))}else z=j.slice(0,K)+j.slice(q),ce&&this.dispatch((function(G){G.setCaretPosition(K)}));return z}},{key:"removeForwardsAt",value:function(j){var z,K=arguments.length>1&&arguments[1]!==void 0?arguments[1]:j.length,q=arguments.length>2&&arguments[2]!==void 0?arguments[2]:j.length,ce=arguments.length>3&&arguments[3]!==void 0&&arguments[3];return j!=null&&j.length&&K!==null?(K===q?z=j.substring(K,K+2).match(/([\uD800-\uDBFF][\uDC00-\uDFFF])/g)?j.substr(0,K)+j.substr(K+2):j.substr(0,K)+j.substr(K+1):(z=j.slice(0,K)+j.slice(q),ce&&this.dispatch((function(O){O.setCaretPosition(K)}))),z):j}},{key:"handleMaxLength",value:function(j,z){var K=this.getOptions(),q=K.maxLength,ce=j[K.inputName||"default"],O=z.length-1>=q;if(z.length<=ce.length)return!1;if(Number.isInteger(q))return K.debug&&console.log("maxLength (num) reached:",O),O?(this.maxLengthReached=!0,!0):(this.maxLengthReached=!1,!1);if(v(q)==="object"){var G=z.length-1>=q[K.inputName||"default"];return K.debug&&console.log("maxLength (obj) reached:",G),G?(this.maxLengthReached=!0,!0):(this.maxLengthReached=!1,!1)}}},{key:"isMaxLengthReached",value:function(){return!!this.maxLengthReached}},{key:"isTouchDevice",value:function(){return"ontouchstart"in window||navigator.maxTouchPoints}},{key:"pointerEventsSupported",value:function(){return!!window.PointerEvent}},{key:"camelCase",value:function(j){return j?j.toLowerCase().trim().split(/[.\-_\s]/g).reduce((function(z,K){return K.length?z+K[0].toUpperCase()+K.slice(1):z})):""}},{key:"chunkArray",value:function(j,z){return p(Array(Math.ceil(j.length/z))).map((function(K,q){return j.slice(z*q,z+z*q)}))}},{key:"escapeRegex",value:function(j){return j.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}},{key:"getRtlOffset",value:function(j,z){var K=j,q=z.indexOf("‫");return q=O.length?{done:!0}:{done:!1,value:O[V++]}},e:function(oe){throw oe},f:J}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var ie,me=!0,pe=!1;return{s:function(){X=X.call(O)},n:function(){var oe=X.next();return me=oe.done,oe},e:function(oe){pe=!0,ie=oe},f:function(){try{me||X.return==null||X.return()}finally{if(pe)throw ie}}}})(Object.getOwnPropertyNames(j.prototype));try{for(q.s();!(K=q.n()).done;){var ce=K.value;ce==="constructor"||ce==="bindMethods"||(z[ce]=z[ce].bind(z))}}catch(O){q.e(O)}finally{q.f()}}}],W&&g(B.prototype,W),D&&g(B,D),Object.defineProperty(B,"prototype",{writable:!1}),B;var B,W,D})();b(N,"noop",(function(){}));var P=N;function k(B){return k=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(W){return typeof W}:function(W){return W&&typeof Symbol=="function"&&W.constructor===Symbol&&W!==Symbol.prototype?"symbol":typeof W},k(B)}function M(B,W){for(var D=0;D1?(z=K)===null||z===void 0?void 0:z.toLowerCase():K}},{key:"keyCodeToKey",value:function(j){return{8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",65:"A",66:"B",67:"C",68:"D",69:"E",70:"F",71:"G",72:"H",73:"I",74:"J",75:"K",76:"L",77:"M",78:"N",79:"O",80:"P",81:"Q",82:"R",83:"S",84:"T",85:"U",86:"V",87:"W",88:"X",89:"Y",90:"Z",91:"Meta",96:"Numpad0",97:"Numpad1",98:"Numpad2",99:"Numpad3",100:"Numpad4",101:"Numpad5",102:"Numpad6",103:"Numpad7",104:"Numpad8",105:"Numpad9",106:"NumpadMultiply",107:"NumpadAdd",109:"NumpadSubtract",110:"NumpadDecimal",111:"NumpadDivide",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"}[j]||""}}],W&&M(B.prototype,W),D&&M(B,D),Object.defineProperty(B,"prototype",{writable:!1}),B;var B,W,D})();function F(B){return F=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(W){return typeof W}:function(W){return W&&typeof Symbol=="function"&&W.constructor===Symbol&&W!==Symbol.prototype?"symbol":typeof W},F(B)}function $(B,W){for(var D=0;D0&&arguments[0]!==void 0?arguments[0]:we();return X(R,xe)},V.appendChild(be)}));var J=O>0,ie=document.createElement("div");ie.classList.add("hg-candidate-box-prev"),J&&ie.classList.add("hg-candidate-box-btn-active");var me=function(){J&&K.renderPage({candidateListPages:q,targetElement:ce,pageIndex:O-1,nbPages:G,onItemSelected:X})};this.options.useTouchEvents?ie.ontouchstart=me:ie.onclick=me,this.candidateBoxElement.appendChild(ie),this.candidateBoxElement.appendChild(V);var pe=OB.length)&&(W=B.length);for(var D=0,j=Array(W);D1&&arguments[1]!==void 0?arguments[1]:j;this.caretPosition=j,this.caretPositionEnd=z}},{key:"getInputCandidates",value:function(j){var z=this,K=this.options,q=K.layoutCandidates,ce=K.layoutCandidatesCaseSensitiveMatch;if(!q||de(q)!=="object")return{};var O=Object.keys(q).filter((function(V){var J=j.substring(0,z.getCaretPositionEnd()||0)||j,ie=new RegExp("".concat(z.utilities.escapeRegex(V),"$"),ce?"g":"gi");return!!ae(J.matchAll(ie)).length}));if(O.length>1){var G=O.sort((function(V,J){return J.length-V.length}))[0];return{candidateKey:G,candidateValue:q[G]}}if(O.length){var X=O[0];return{candidateKey:X,candidateValue:q[X]}}return{}}},{key:"showCandidatesBox",value:function(j,z,K){var q=this;this.candidateBox&&this.candidateBox.show({candidateValue:z,targetElement:K,onSelect:function(ce,O){var G=q.options,X=G.layoutCandidatesCaseSensitiveMatch,V=G.disableCandidateNormalization,J=G.enableLayoutCandidatesKeyPress,ie=ce;V||(ie=ce.normalize("NFD")),typeof q.options.beforeInputUpdate=="function"&&q.options.beforeInputUpdate(q);var me=q.getInput(q.options.inputName,!0),pe=q.getCaretPositionEnd()||0,oe=me.substring(0,pe||0)||me,U=new RegExp("".concat(q.utilities.escapeRegex(j),"$"),X?"g":"gi"),R=oe.replace(U,ie),ne=me.replace(oe,R),be=R.length-oe.length,we=(pe||me.length)+be;we<0&&(we=0),q.setInput(ne,q.options.inputName,!0),q.setCaretPosition(we),J&&typeof q.options.onKeyPress=="function"&&q.options.onKeyPress(ce,O),typeof q.options.onChange=="function"&&q.options.onChange(q.getInput(q.options.inputName,!0),O),typeof q.options.onChangeAll=="function"&&q.options.onChangeAll(q.getAllInputs(),O)}})}},{key:"handleButtonClicked",value:function(j,z){var K=this.options,q=K.inputName,ce=q===void 0?this.defaultName:q,O=K.debug;if(j!=="{//}"){this.input[ce]||(this.input[ce]=""),typeof this.options.beforeInputUpdate=="function"&&this.options.beforeInputUpdate(this);var G=this.utilities.getUpdatedInput(j,this.input[ce],this.caretPosition,this.caretPositionEnd);if(this.utilities.isStandardButton(j)&&this.activeInputElement&&this.input[ce]&&this.input[ce]===G&&this.caretPosition===0&&this.caretPositionEnd===G.length)return this.setInput("",this.options.inputName,!0),this.setCaretPosition(0),this.activeInputElement.value="",this.activeInputElement.setSelectionRange(0,0),void this.handleButtonClicked(j,z);if(typeof this.options.onKeyPress=="function"&&this.options.onKeyPress(j,z),this.input[ce]!==G&&(!this.options.inputPattern||this.options.inputPattern&&this.inputPatternIsValid(G))){if(this.options.maxLength&&this.utilities.handleMaxLength(this.input,G))return;var X=this.utilities.getUpdatedInput(j,this.input[ce],this.caretPosition,this.caretPositionEnd,!0);if(this.setInput(X,this.options.inputName,!0),O&&console.log("Input changed:",this.getAllInputs()),this.options.debug&&console.log("Caret at: ",this.getCaretPosition(),this.getCaretPositionEnd(),"(".concat(this.keyboardDOMClass,")"),z?.type),this.options.syncInstanceInputs&&this.syncInstanceInputs(),typeof this.options.onChange=="function"&&this.options.onChange(this.getInput(this.options.inputName,!0),z),typeof this.options.onChangeAll=="function"&&this.options.onChangeAll(this.getAllInputs(),z),z!=null&&z.target&&this.options.enableLayoutCandidates){var V,J=this.getInputCandidates(G),ie=J.candidateKey,me=J.candidateValue;ie&&me?this.showCandidatesBox(ie,me,this.keyboardDOM):(V=this.candidateBox)===null||V===void 0||V.destroy()}}this.caretPositionEnd&&this.caretPosition!==this.caretPositionEnd&&(this.setCaretPosition(this.caretPositionEnd,this.caretPositionEnd),this.activeInputElement&&this.activeInputElement.setSelectionRange(this.caretPositionEnd,this.caretPositionEnd),this.options.debug&&console.log("Caret position aligned",this.caretPosition)),O&&console.log("Key pressed:",j)}}},{key:"getMouseHold",value:function(){return this.isMouseHold}},{key:"setMouseHold",value:function(j){this.options.syncInstanceInputs?this.dispatch((function(z){z.isMouseHold=j})):this.isMouseHold=j}},{key:"handleButtonMouseDown",value:function(j,z){var K=this;z&&(this.options.preventMouseDownDefault&&z.preventDefault(),this.options.stopMouseDownPropagation&&z.stopPropagation(),z.target.classList.add(this.activeButtonClass)),this.holdInteractionTimeout&&clearTimeout(this.holdInteractionTimeout),this.holdTimeout&&clearTimeout(this.holdTimeout),this.setMouseHold(!0),this.options.disableButtonHold||(this.holdTimeout=window.setTimeout((function(){(K.getMouseHold()&&(!j.includes("{")&&!j.includes("}")||j==="{delete}"||j==="{backspace}"||j==="{bksp}"||j==="{space}"||j==="{tab}")||j==="{arrowright}"||j==="{arrowleft}"||j==="{arrowup}"||j==="{arrowdown}")&&(K.options.debug&&console.log("Button held:",j),K.handleButtonHold(j)),clearTimeout(K.holdTimeout)}),500))}},{key:"handleButtonMouseUp",value:function(j,z){var K=this;z&&(this.options.preventMouseUpDefault&&z.preventDefault&&z.preventDefault(),this.options.stopMouseUpPropagation&&z.stopPropagation&&z.stopPropagation(),!(z.target===this.keyboardDOM||z.target&&this.keyboardDOM.contains(z.target)||this.candidateBox&&this.candidateBox.candidateBoxElement&&(z.target===this.candidateBox.candidateBoxElement||z.target&&this.candidateBox.candidateBoxElement.contains(z.target)))&&this.candidateBox&&this.candidateBox.destroy()),this.recurseButtons((function(q){q.classList.remove(K.activeButtonClass)})),this.setMouseHold(!1),this.holdInteractionTimeout&&clearTimeout(this.holdInteractionTimeout),j&&typeof this.options.onKeyReleased=="function"&&this.options.onKeyReleased(j,z)}},{key:"handleKeyboardContainerMouseDown",value:function(j){this.options.preventMouseDownDefault&&j.preventDefault()}},{key:"handleButtonHold",value:function(j){var z=this;this.holdInteractionTimeout&&clearTimeout(this.holdInteractionTimeout),this.holdInteractionTimeout=window.setTimeout((function(){z.getMouseHold()?(z.handleButtonClicked(j),z.handleButtonHold(j)):clearTimeout(z.holdInteractionTimeout)}),100)}},{key:"syncInstanceInputs",value:function(){var j=this;this.dispatch((function(z){z.replaceInput(j.input),z.setCaretPosition(j.caretPosition,j.caretPositionEnd)}))}},{key:"clearInput",value:function(){var j=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.options.inputName||this.defaultName;this.input[j]="",this.setCaretPosition(0),this.options.syncInstanceInputs&&this.syncInstanceInputs()}},{key:"getInput",value:function(){var j=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.options.inputName||this.defaultName,z=arguments.length>1&&arguments[1]!==void 0&&arguments[1];return this.options.syncInstanceInputs&&!z&&this.syncInstanceInputs(),this.options.rtl?"‫"+this.input[j].replace("‫","").replace("‬","")+"‬":this.input[j]}},{key:"getAllInputs",value:function(){var j=this,z={};return Object.keys(this.input).forEach((function(K){z[K]=j.getInput(K,!0)})),z}},{key:"setInput",value:function(j){var z=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.options.inputName||this.defaultName,K=arguments.length>2?arguments[2]:void 0;this.input[z]=j,!K&&this.options.syncInstanceInputs&&this.syncInstanceInputs()}},{key:"replaceInput",value:function(j){this.input=j}},{key:"setOptions",value:function(){var j=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},z=this.changedOptions(j);this.options=Object.assign(this.options,j),z.length&&(this.options.debug&&console.log("changedOptions",z),this.onSetOptions(z),this.render())}},{key:"changedOptions",value:function(j){var z=this;return Object.keys(j).filter((function(K){return JSON.stringify(j[K])!==JSON.stringify(z.options[K])}))}},{key:"onSetOptions",value:function(){var j=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[];j.includes("layoutName")&&this.candidateBox&&this.candidateBox.destroy(),(j.includes("layoutCandidatesPageSize")||j.includes("layoutCandidates"))&&this.candidateBox&&(this.candidateBox.destroy(),this.candidateBox=new re({utilities:this.utilities,options:this.options}))}},{key:"resetRows",value:function(){this.keyboardRowsDOM&&this.keyboardRowsDOM.remove(),this.keyboardDOM.className=this.keyboardDOMClass,this.keyboardDOM.setAttribute("data-skInstance",this.currentInstanceName),this.buttonElements={}}},{key:"dispatch",value:function(j){if(!window.SimpleKeyboardInstances)throw console.warn("SimpleKeyboardInstances is not defined. Dispatch cannot be called."),new Error("INSTANCES_VAR_ERROR");return Object.keys(window.SimpleKeyboardInstances).forEach((function(z){j(window.SimpleKeyboardInstances[z],z)}))}},{key:"addButtonTheme",value:function(j,z){var K=this;z&&j&&(j.split(" ").forEach((function(q){z.split(" ").forEach((function(ce){K.options.buttonTheme||(K.options.buttonTheme=[]);var O=!1;K.options.buttonTheme.map((function(G){if(G!=null&&G.class.split(" ").includes(ce)){O=!0;var X=G.buttons.split(" ");X.includes(q)||(O=!0,X.push(q),G.buttons=X.join(" "))}return G})),O||K.options.buttonTheme.push({class:ce,buttons:j})}))})),this.render())}},{key:"removeButtonTheme",value:function(j,z){var K=this;if(!j&&!z)return this.options.buttonTheme=[],void this.render();j&&Array.isArray(this.options.buttonTheme)&&this.options.buttonTheme.length&&(j.split(" ").forEach((function(q){var ce;(ce=K.options)===null||ce===void 0||(ce=ce.buttonTheme)===null||ce===void 0||ce.map((function(O,G){if(O&&z&&z.includes(O.class)||!z){var X,V,J=(X=O)===null||X===void 0?void 0:X.buttons.split(" ").filter((function(ie){return ie!==q}));O&&J!=null&&J.length?O.buttons=J.join(" "):((V=K.options.buttonTheme)===null||V===void 0||V.splice(G,1),O=null)}return O}))})),this.render())}},{key:"getButtonElement",value:function(j){var z,K=this.buttonElements[j];return K&&(z=K.length>1?K:K[0]),z}},{key:"inputPatternIsValid",value:function(j){var z,K=this.options.inputPattern;if((z=K instanceof RegExp?K:K[this.options.inputName||this.defaultName])&&j){var q=z.test(j);return this.options.debug&&console.log('inputPattern ("'.concat(z,'"): ').concat(q?"passed":"did not pass!")),q}return!0}},{key:"setEventListeners",value:function(){if(this.isFirstKeyboardInstance||!this.allKeyboardInstances){this.options.debug&&console.log("Caret handling started (".concat(this.keyboardDOMClass,")"));var j=this.options.physicalKeyboardHighlightPreventDefault,z=j!==void 0&&j;document.addEventListener("keyup",this.handleKeyUp,z),document.addEventListener("keydown",this.handleKeyDown,z),document.addEventListener("mouseup",this.handleMouseUp),document.addEventListener("touchend",this.handleTouchEnd),this.options.updateCaretOnSelectionChange&&document.addEventListener("selectionchange",this.handleSelectionChange),document.addEventListener("select",this.handleSelect)}}},{key:"handleKeyUp",value:function(j){this.caretEventHandler(j),this.options.physicalKeyboardHighlight&&this.physicalKeyboard.handleHighlightKeyUp(j)}},{key:"handleKeyDown",value:function(j){this.options.physicalKeyboardHighlight&&this.physicalKeyboard.handleHighlightKeyDown(j)}},{key:"handleMouseUp",value:function(j){this.caretEventHandler(j)}},{key:"handleTouchEnd",value:function(j){this.caretEventHandler(j)}},{key:"handleSelect",value:function(j){this.caretEventHandler(j)}},{key:"handleSelectionChange",value:function(j){navigator.userAgent.includes("Firefox")||this.caretEventHandler(j)}},{key:"caretEventHandler",value:function(j){var z,K=this;j.target.tagName&&(z=j.target.tagName.toLowerCase()),this.dispatch((function(q){var ce=j.target===q.keyboardDOM||j.target&&q.keyboardDOM.contains(j.target);if(K.options.syncInstanceInputs&&Array.isArray(j.path)&&(ce=j.path.some((function(X){var V;return X==null||(V=X.hasAttribute)===null||V===void 0?void 0:V.call(X,"data-skInstance")}))),(z==="textarea"||z==="input"&&["text","search","url","tel","password"].includes(j.target.type))&&!q.options.disableCaretPositioning){var O=j.target.selectionStart,G=j.target.selectionEnd;q.options.rtl&&(O=q.utilities.getRtlOffset(O,q.getInput()),G=q.utilities.getRtlOffset(G,q.getInput())),q.setCaretPosition(O,G),q.activeInputElement=j.target,q.options.debug&&console.log("Caret at: ",q.getCaretPosition(),q.getCaretPositionEnd(),j&&j.target.tagName.toLowerCase(),"(".concat(q.keyboardDOMClass,")"),j?.type)}else!q.options.disableCaretPositioning&&ce||j?.type==="selectionchange"||(q.setCaretPosition(null),q.activeInputElement=null,q.options.debug&&console.log('Caret position reset due to "'.concat(j?.type,'" event'),j))}))}},{key:"recurseButtons",value:function(j){var z=this;j&&Object.keys(this.buttonElements).forEach((function(K){return z.buttonElements[K].forEach(j)}))}},{key:"destroy",value:function(){this.options.debug&&console.log("Destroying simple-keyboard instance: ".concat(this.currentInstanceName));var j=this.options.physicalKeyboardHighlightPreventDefault,z=j!==void 0&&j;document.removeEventListener("keyup",this.handleKeyUp,z),document.removeEventListener("keydown",this.handleKeyDown,z),document.removeEventListener("mouseup",this.handleMouseUp),document.removeEventListener("touchend",this.handleTouchEnd),document.removeEventListener("select",this.handleSelect),this.options.updateCaretOnSelectionChange&&document.removeEventListener("selectionchange",this.handleSelectionChange),document.onpointerup=null,document.ontouchend=null,document.ontouchcancel=null,document.onmouseup=null,this.recurseButtons((function(K){K&&(K.onpointerdown=null,K.onpointerup=null,K.onpointercancel=null,K.ontouchstart=null,K.ontouchend=null,K.ontouchcancel=null,K.onclick=null,K.onmousedown=null,K.onmouseup=null,K.remove(),K=null)})),this.keyboardDOM.onpointerdown=null,this.keyboardDOM.ontouchstart=null,this.keyboardDOM.onmousedown=null,this.resetRows(),this.candidateBox&&(this.candidateBox.destroy(),this.candidateBox=null),this.activeInputElement=null,this.keyboardDOM.removeAttribute("data-skInstance"),this.keyboardDOM.innerHTML="",window.SimpleKeyboardInstances[this.currentInstanceName]=null,delete window.SimpleKeyboardInstances[this.currentInstanceName],this.initialized=!1}},{key:"getButtonThemeClasses",value:function(j){var z=this.options.buttonTheme,K=[];return Array.isArray(z)&&z.forEach((function(q){if(q&&q.class&&typeof q.class=="string"&&q.buttons&&typeof q.buttons=="string"){var ce=q.class.split(" ");q.buttons.split(" ").includes(j)&&(K=[].concat(ae(K),ae(ce)))}else console.warn('Incorrect "buttonTheme". Please check the documentation.',q)})),K}},{key:"setDOMButtonAttributes",value:function(j,z){var K=this.options.buttonAttributes;Array.isArray(K)&&K.forEach((function(q){q.attribute&&typeof q.attribute=="string"&&q.value&&typeof q.value=="string"?q.buttons&&typeof q.buttons=="string"?q.buttons.split(" ").includes(j)&&z(q.attribute,q.value):z(q.attribute,q.value):console.warn('Incorrect "buttonAttributes". Please check the documentation.',q)}))}},{key:"onTouchDeviceDetected",value:function(){this.processAutoTouchEvents(),this.disableContextualWindow()}},{key:"disableContextualWindow",value:function(){window.oncontextmenu=function(j){var z;if((z=j.target.classList)!==null&&z!==void 0&&z.contains("hg-button"))return j.preventDefault(),j.stopPropagation(),!1}}},{key:"processAutoTouchEvents",value:function(){this.options.autoUseTouchEvents&&(this.options.useTouchEvents=!0,this.options.debug&&console.log("autoUseTouchEvents: Touch device detected, useTouchEvents enabled."))}},{key:"onInit",value:function(){this.options.debug&&console.log("".concat(this.keyboardDOMClass," Initialized")),this.setEventListeners(),typeof this.options.onInit=="function"&&this.options.onInit(this)}},{key:"beforeFirstRender",value:function(){this.utilities.isTouchDevice()&&this.onTouchDeviceDetected(),typeof this.options.beforeFirstRender=="function"&&this.options.beforeFirstRender(this),this.isFirstKeyboardInstance&&this.utilities.pointerEventsSupported()&&!this.options.useTouchEvents&&!this.options.useMouseEvents&&this.options.debug&&console.log("Using PointerEvents as it is supported by this browser"),this.options.useTouchEvents&&this.options.debug&&console.log("useTouchEvents has been enabled. Only touch events will be used.")}},{key:"beforeRender",value:function(){typeof this.options.beforeRender=="function"&&this.options.beforeRender(this)}},{key:"onRender",value:function(){typeof this.options.onRender=="function"&&this.options.onRender(this)}},{key:"onModulesLoaded",value:function(){typeof this.options.onModulesLoaded=="function"&&this.options.onModulesLoaded(this)}},{key:"loadModules",value:function(){var j=this;Array.isArray(this.options.modules)&&(this.options.modules.forEach((function(z){var K=j.utilities.isConstructor(z)?new z(j):z(j);K.init&&K.init(j)})),this.keyboardPluginClasses="modules-loaded",this.render(),this.onModulesLoaded())}},{key:"getModuleProp",value:function(j,z){return!!this.modules[j]&&this.modules[j][z]}},{key:"getModulesList",value:function(){return Object.keys(this.modules)}},{key:"parseRowDOMContainers",value:function(j,z,K,q){var ce=this,O=Array.from(j.children),G=0;return O.length&&K.forEach((function(X,V){var J=q[V];if(!(J&&J>X))return!1;var ie=X-G,me=J-G,pe=document.createElement("div");pe.className+="hg-button-container";var oe="".concat(ce.options.layoutName,"-r").concat(z,"c").concat(V);pe.setAttribute("data-skUID",oe);var U=O.splice(ie,me-ie+1);G+=me-ie,U.forEach((function(R){return pe.appendChild(R)})),O.splice(ie,0,pe),j.innerHTML="",O.forEach((function(R){return j.appendChild(R)})),ce.options.debug&&console.log("rowDOMContainer",U,ie,me,G+1)})),j}},{key:"render",value:function(){var j=this;this.resetRows(),this.initialized||this.beforeFirstRender(),this.beforeRender();var z="hg-layout-".concat(this.options.layoutName),K=this.options.layout||{default:["` 1 2 3 4 5 6 7 8 9 0 - = {bksp}","{tab} q w e r t y u i o p [ ] \\","{lock} a s d f g h j k l ; ' {enter}","{shift} z x c v b n m , . / {shift}",".com @ {space}"],shift:["~ ! @ # $ % ^ & * ( ) _ + {bksp}","{tab} Q W E R T Y U I O P { } |",'{lock} A S D F G H J K L : " {enter}',"{shift} Z X C V B N M < > ? {shift}",".com @ {space}"]},q=this.options.useTouchEvents||!1,ce=q?"hg-touch-events":"",O=this.options.useMouseEvents||!1,G=this.options.disableRowButtonContainers;this.keyboardDOM.className=this.getKeyboardClassString(this.options.theme,z,this.keyboardPluginClasses,ce),this.keyboardDOM.setAttribute("data-skInstance",this.currentInstanceName),this.keyboardRowsDOM=document.createElement("div"),this.keyboardRowsDOM.className="hg-rows",K[this.options.layoutName||this.defaultName].forEach((function(X,V){var J=X.split(" ");j.options.excludeFromLayout&&j.options.excludeFromLayout[j.options.layoutName||j.defaultName]&&(J=J.filter((function(oe){return j.options.excludeFromLayout&&!j.options.excludeFromLayout[j.options.layoutName||j.defaultName].includes(oe)})));var ie=document.createElement("div");ie.className+="hg-row";var me=[],pe=[];J.forEach((function(oe,U){var R,ne=!G&&typeof oe=="string"&&oe.length>1&&oe.indexOf("[")===0,be=!G&&typeof oe=="string"&&oe.length>1&&oe.indexOf("]")===oe.length-1;ne&&(me.push(U),oe=oe.replace(/\[/g,"")),be&&(pe.push(U),oe=oe.replace(/\]/g,""));var we=j.utilities.getButtonClass(oe),xe=j.utilities.getButtonDisplayName(oe,j.options.display,j.options.mergeDisplay),ye=j.options.useButtonTag?"button":"div",fe=document.createElement(ye);fe.className+="hg-button ".concat(we),(R=fe.classList).add.apply(R,ae(j.getButtonThemeClasses(oe))),j.setDOMButtonAttributes(oe,(function(Me,_e){fe.setAttribute(Me,_e)})),j.activeButtonClass="hg-activeButton",!j.utilities.pointerEventsSupported()||q||O?q?(fe.ontouchstart=function(Me){j.handleButtonClicked(oe,Me),j.handleButtonMouseDown(oe,Me)},fe.ontouchend=function(Me){j.handleButtonMouseUp(oe,Me)},fe.ontouchcancel=function(Me){j.handleButtonMouseUp(oe,Me)}):(fe.onclick=function(Me){j.setMouseHold(!1),typeof j.options.onKeyReleased=="function"||j.options.useMouseEvents&&j.options.clickOnMouseDown||j.handleButtonClicked(oe,Me)},fe.onmousedown=function(Me){(typeof j.options.onKeyReleased=="function"||j.options.useMouseEvents&&j.options.clickOnMouseDown)&&!j.isMouseHold&&j.handleButtonClicked(oe,Me),j.handleButtonMouseDown(oe,Me)},fe.onmouseup=function(Me){j.handleButtonMouseUp(oe,Me)}):(fe.onpointerdown=function(Me){j.handleButtonClicked(oe,Me),j.handleButtonMouseDown(oe,Me)},fe.onpointerup=function(Me){j.handleButtonMouseUp(oe,Me)},fe.onpointercancel=function(Me){j.handleButtonMouseUp(oe,Me)}),fe.setAttribute("data-skBtn",oe);var Se="".concat(j.options.layoutName,"-r").concat(V,"b").concat(U);fe.setAttribute("data-skBtnUID",Se);var Ee=document.createElement("span");Ee.innerHTML=xe,fe.appendChild(Ee),j.buttonElements[oe]||(j.buttonElements[oe]=[]),j.buttonElements[oe].push(fe),ie.appendChild(fe)})),ie=j.parseRowDOMContainers(ie,V,me,pe),j.keyboardRowsDOM.appendChild(ie)})),this.keyboardDOM.appendChild(this.keyboardRowsDOM),this.onRender(),this.initialized||(this.initialized=!0,!this.utilities.pointerEventsSupported()||q||O?q?(document.ontouchend=function(X){return j.handleButtonMouseUp(void 0,X)},document.ontouchcancel=function(X){return j.handleButtonMouseUp(void 0,X)},this.keyboardDOM.ontouchstart=function(X){return j.handleKeyboardContainerMouseDown(X)}):q||(document.onmouseup=function(X){return j.handleButtonMouseUp(void 0,X)},this.keyboardDOM.onmousedown=function(X){return j.handleKeyboardContainerMouseDown(X)}):(document.onpointerup=function(X){return j.handleButtonMouseUp(void 0,X)},this.keyboardDOM.onpointerdown=function(X){return j.handleKeyboardContainerMouseDown(X)}),this.onInit())}}],W&&ue(B.prototype,W),D&&ue(B,D),Object.defineProperty(B,"prototype",{writable:!1}),B;var B,W,D})(),ge=se,Ne=ge;return m})()},442:function(l){l.exports=n}},i={};function s(l){var c=i[l];if(c!==void 0)return c.exports;var d=i[l]={exports:{}};return r[l].call(d.exports,d,d.exports,s),d.exports}s.n=function(l){var c=l&&l.__esModule?function(){return l.default}:function(){return l};return s.d(c,{a:c}),c},s.d=function(l,c){for(var d in c)s.o(c,d)&&!s.o(l,d)&&Object.defineProperty(l,d,{enumerable:!0,get:c[d]})},s.o=function(l,c){return Object.prototype.hasOwnProperty.call(l,c)},s.r=function(l){typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(l,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(l,"__esModule",{value:!0})};var o={};return(function(){s.r(o),s.d(o,{KeyboardReact:function(){return v},default:function(){return g}}),s(981);var l=s(442),c=s(548),d=s.n(c);function u(b){return u=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(_){return typeof _}:function(_){return _&&typeof Symbol=="function"&&_.constructor===Symbol&&_!==Symbol.prototype?"symbol":typeof _},u(b)}function m(b,_){var N=Object.keys(b);if(Object.getOwnPropertySymbols){var P=Object.getOwnPropertySymbols(b);_&&(P=P.filter((function(k){return Object.getOwnPropertyDescriptor(b,k).enumerable}))),N.push.apply(N,P)}return N}function p(b){for(var _=1;_{t?.(e)},[e,t]);const m=w.useCallback(v=>{if(s.current)return;const g=v.target;if(!g.closest('[data-vkb="false"]')){if(g instanceof HTMLInputElement){if(!grt.has(g.type))return}else if(!(g instanceof HTMLTextAreaElement))return;c.current=g,n(!0),l("default"),d.current?.setInput?.(c.current.value),setTimeout(()=>{(g.closest(".bg-zinc-800, .rounded-lg, [data-vkb-group]")??g).scrollIntoView({behavior:"smooth",block:"nearest"})},100)}},[]),p=w.useCallback(()=>{setTimeout(()=>{const v=document.activeElement;v&&(u.current?.contains(v)||v===c.current)||(n(!1),c.current=null)},150)},[]);w.useEffect(()=>(document.addEventListener("focusin",m),document.addEventListener("focusout",p),()=>{document.removeEventListener("focusin",m),document.removeEventListener("focusout",p)}),[m,p]);const f=w.useCallback(()=>{s.current=!0,i(!0),c.current?.blur(),c.current=null,setTimeout(()=>{n(!1),i(!1),s.current=!1},400)},[]),y=w.useCallback(v=>{const g=c.current;if(g){if(v==="{shift}"){l(b=>b==="default"?"shift":"default");return}if(v==="{lock}"){l(b=>b==="default"?"shift":"default");return}if(v==="{close}"){f();return}v==="{bksp}"?b3(g,g.value.slice(0,-1)):v==="{space}"?b3(g,g.value+" "):(b3(g,g.value+v),o==="shift"&&l("default")),g.focus(),d.current?.setInput?.(g.value)}},[o,f]);return e?a.jsxs(a.Fragment,{children:[a.jsx("div",{className:"fixed inset-0 z-[9998] bg-transparent",onMouseDown:v=>{v.preventDefault(),v.stopPropagation(),r||f()},onTouchStart:v=>{v.preventDefault(),v.stopPropagation(),r||f()},onClick:v=>{v.preventDefault(),v.stopPropagation()}}),!r&&a.jsx("div",{ref:u,className:"relative z-[9999] shrink-0",onMouseDown:v=>v.preventDefault(),onTouchStart:v=>{v.target.closest(".hg-button")||v.preventDefault()},children:a.jsx(frt,{keyboardRef:v=>{d.current=v},layoutName:o,onKeyPress:y,theme:"simple-keyboard vkb-theme",layout:{default:["1 2 3 4 5 6 7 8 9 0 {bksp}","q w e r t y u i o p","{lock} a s d f g h j k l","{shift} z x c v b n m . @","{space} {close}"],shift:["! @ # $ % ^ & * ( ) {bksp}","Q W E R T Y U I O P","{lock} A S D F G H J K L","{shift} Z X C V B N M , _","{space} {close}"]},display:{"{bksp}":"⌫","{close}":"✕ Close","{shift}":"⇧","{lock}":"⇪","{space}":" "}})})]}):null}function xrt(){const[t,e]=w.useState(null),[n,r]=w.useState(null),[i,s]=w.useState(!1),[o,l]=w.useState(100),[c,d]=w.useState(0),u=w.useRef(Date.now()),{i18n:m}=Rt(),p=Uo(),f=qc(),y=urt(),{data:v}=Je({queryKey:["settings"],queryFn:he.getSettings});w.useEffect(()=>{v?.language&&v.language!==m.language&&m.changeLanguage(v.language)},[v?.language,m]);const{data:g=[]}=Je({queryKey:["spoolbuddy-devices"],queryFn:()=>ka.getDevices(),refetchInterval:3e4}),b=g[0],_=y.deviceOnline||!!b?.online,N=w.useMemo(()=>({...y,deviceOnline:_}),[y,_]),P=w.useRef(!1);w.useEffect(()=>{b&&!P.current&&(l(b.display_brightness),d(b.display_blank_timeout),P.current=!0)},[b]),w.useEffect(()=>{const ge=document.documentElement,Ne=ge.classList.contains("dark");return ge.classList.add("dark"),()=>{Ne||ge.classList.remove("dark")}},[]);const{data:k}=Je({queryKey:["spoolbuddy-update-check",b?.device_id],queryFn:()=>b?ka.checkDaemonUpdate(b.device_id):Promise.resolve(null),enabled:!!b,refetchInterval:300*1e3,staleTime:0}),M=w.useRef(null);w.useEffect(()=>{if(_)if(k?.update_available&&k.latest_version){const ge=`Update available: v${k.latest_version}`;r({type:"info",message:ge}),M.current=ge}else M.current&&(r(null),M.current=null);else{const ge="SpoolBuddy device disconnected";r({type:"warning",message:ge}),M.current=ge}},[_,k?.update_available,k?.latest_version]);const T=w.useCallback(()=>{u.current=Date.now(),s(!1)},[]);w.useEffect(()=>(window.addEventListener("pointerdown",T),window.addEventListener("keydown",T),()=>{window.removeEventListener("pointerdown",T),window.removeEventListener("keydown",T)}),[T]);const A=!!(y.matchedSpool||y.unknownTagUid),C=w.useRef(!1);w.useEffect(()=>{A&&!C.current&&(T(),f.pathname!=="/spoolbuddy"&&p("/spoolbuddy")),C.current=A},[A,f.pathname,p,T]),w.useEffect(()=>{if(c<=0)return;const ge=setInterval(()=>{Date.now()-u.current>=c*1e3&&s(!0)},1e3);return()=>clearInterval(ge)},[c]);const{data:F=[]}=Je({queryKey:["printers"],queryFn:()=>he.getPrinters()}),$=ip({queries:F.map(ge=>({queryKey:["printerStatus",ge.id],queryFn:()=>he.getPrinterStatus(ge.id),refetchInterval:1e4,select:Ne=>({connected:Ne?.connected})}))}),I=w.useMemo(()=>F.filter((ge,Ne)=>$[Ne]?.data?.connected),[F,$]),Q=w.useRef(null),L=w.useRef(!1),re=50,ae=w.useRef(null),ee=w.useCallback(ge=>{Q.current={x:ge.touches[0].clientX,y:ge.touches[0].clientY},L.current=!1},[]),de=w.useCallback(ge=>{if(!Q.current)return;const Ne=ge.changedTouches[0].clientX-Q.current.x,B=ge.changedTouches[0].clientY-Q.current.y,W=Q.current.y;if(Q.current=null,L.current=!1,Math.abs(B)>=re&&Math.abs(B)>Math.abs(Ne)){B>0&&W<80&&te(!0);return}if(I.length<2||Math.abs(Ne)Math.abs(Ne))return;const D=I.findIndex(z=>z.id===t),j=Ne<0?(D+1)%I.length:(D-1+I.length)%I.length;e(I[j].id)},[I,t,e]);w.useEffect(()=>{const ge=ae.current;if(!ge)return;const Ne=B=>{if(!Q.current)return;const W=Math.abs(B.touches[0].clientX-Q.current.x),D=Math.abs(B.touches[0].clientY-Q.current.y);if(L.current){B.preventDefault();return}W>10&&W>D&&(L.current=!0,B.preventDefault())};return ge.addEventListener("touchmove",Ne,{passive:!1}),()=>ge.removeEventListener("touchmove",Ne)},[]);const[le,ue]=w.useState(!1),[Y,te]=w.useState(!1),se=o<100?{filter:`brightness(${o/100})`}:void 0;return a.jsxs(a.Fragment,{children:[a.jsxs("div",{ref:ae,"data-spoolbuddy-kiosk":!0,className:"w-screen h-screen bg-bambu-dark text-white flex flex-col overflow-hidden",style:{...se,overscrollBehaviorX:"none"},onTouchStart:ee,onTouchEnd:de,children:[a.jsx(art,{selectedPrinterId:t,onPrinterChange:e,deviceOnline:_}),a.jsx("main",{className:"flex-1 overflow-y-auto",children:a.jsx(HX,{context:{selectedPrinterId:t,setSelectedPrinterId:e,sbState:N,setAlert:r,displayBrightness:o,setDisplayBrightness:l,displayBlankTimeout:c,setDisplayBlankTimeout:d}})}),!le&&a.jsx(ort,{alert:n}),!le&&a.jsx(srt,{}),a.jsx(brt,{onVisibilityChange:ue})]}),a.jsx(lrt,{isOpen:Y,onClose:()=>te(!1),deviceId:b?.device_id??null,deviceOnline:_}),i&&a.jsx("div",{className:"fixed inset-0 bg-black z-[9999]",onPointerDown:ge=>{ge.stopPropagation(),T()}})]})}function nA({color:t,isEmpty:e,size:n=32}){return e?a.jsx("div",{className:"rounded-full border-2 border-dashed border-zinc-500 flex items-center justify-center",style:{width:n,height:n},children:a.jsx("div",{className:"w-2 h-2 rounded-full bg-zinc-600"})}):a.jsxs("svg",{width:n,height:n,viewBox:"0 0 32 32",children:[a.jsx("circle",{cx:"16",cy:"16",r:"14",fill:t,stroke:"white",strokeWidth:"1.5",strokeOpacity:"0.7"}),a.jsx("circle",{cx:"16",cy:"16",r:"11",fill:t,style:{filter:"brightness(0.85)"}})]})}const yrt="spoolbuddy-default-core-weight";function Mle(){try{const t=localStorage.getItem(yrt);if(t){const e=parseInt(t,10);if(e>=0&&e<=500)return e}}catch{}return 250}function vrt({spool:t,scaleWeight:e,onClose:n,onSyncWeight:r,onAssignToAms:i}){const{t:s}=Rt(),[o,l]=w.useState(!1),[c,d]=w.useState(!1),u=t.rgba?`#${t.rgba.slice(0,6)}`:"#808080",m=t.core_weight&&t.core_weight>0?t.core_weight:Mle(),p=e!==null?Math.round(Math.max(0,e)):null,f=p!==null?Math.round(Math.max(0,p-m)):null,y=Math.round(t.label_weight||1e3),v=f!==null?Math.min(100,Math.round(f/y*100)):null,g=v!==null?v>50?"#22c55e":v>20?"#eab308":"#ef4444":"#808080",_=Math.max(0,(t.label_weight||0)-(t.weight_used||0))+m,N=p!==null?p-_:null,P=N!==null?Math.abs(N)<=50:null,k=async()=>{if(e!==null){l(!0);try{await ka.updateSpoolWeight(t.id,Math.round(e)),d(!0),r?.(),setTimeout(()=>d(!1),3e3)}catch(M){console.error("Failed to sync weight:",M)}finally{l(!1)}}};return a.jsxs("div",{className:"flex flex-col items-center space-y-4 max-w-md",children:[a.jsxs("div",{className:"flex items-start gap-5",children:[a.jsxs("div",{className:"relative shrink-0",children:[a.jsx(nA,{color:u,isEmpty:!1,size:100}),v!==null&&a.jsxs("div",{className:"absolute -bottom-2 -right-2 px-2 py-0.5 rounded-full text-xs font-bold text-white shadow-lg",style:{backgroundColor:g},children:[v,"%"]})]}),a.jsxs("div",{className:"flex-1 min-w-0 pt-1",children:[a.jsx("h3",{className:"text-lg font-semibold text-zinc-100",children:t.color_name||"Unknown color"}),a.jsxs("p",{className:"text-sm text-zinc-400",children:[t.brand," • ",t.material,t.subtype&&` ${t.subtype}`]}),f!==null&&a.jsxs("div",{className:"mt-3",children:[a.jsxs("div",{className:"flex items-baseline gap-2",children:[a.jsxs("span",{className:"text-3xl font-bold font-mono text-zinc-100",children:[f,"g"]}),a.jsxs("span",{className:"text-sm text-zinc-500",children:["/ ",y,"g"]})]}),a.jsx("p",{className:"text-xs text-zinc-500 mt-0.5",children:s("spoolbuddy.spool.remaining","Remaining")}),a.jsx("div",{className:"mt-2 max-w-xs",children:a.jsx("div",{className:"h-2 bg-zinc-700 rounded-full overflow-hidden",children:a.jsx("div",{className:"h-full rounded-full transition-all duration-500",style:{width:`${v}%`,backgroundColor:g}})})})]})]})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-x-6 gap-y-2 text-sm bg-zinc-800 rounded-lg p-4 w-full",children:[a.jsxs("div",{className:"flex justify-between",children:[a.jsx("span",{className:"text-zinc-500",children:s("spoolbuddy.dashboard.grossWeight","Gross weight")}),a.jsx("span",{className:"font-mono text-zinc-300",children:p!==null?`${p}g`:"—"})]}),a.jsxs("div",{className:"flex justify-between",children:[a.jsx("span",{className:"text-zinc-500",children:s("spoolbuddy.spool.coreWeight","Core")}),a.jsxs("span",{className:"font-mono text-zinc-300",children:[m,"g"]})]}),a.jsxs("div",{className:"flex justify-between",children:[a.jsx("span",{className:"text-zinc-500",children:s("spoolbuddy.dashboard.spoolSize","Spool size")}),a.jsxs("span",{className:"font-mono text-zinc-300",children:[y,"g"]})]}),a.jsxs("div",{className:"flex justify-between items-center",children:[a.jsx("span",{className:"text-zinc-500",children:s("spoolbuddy.spool.scaleWeight","Scale")}),p!==null?a.jsxs("span",{className:`flex items-center gap-1 font-mono ${P?"text-green-500":"text-yellow-500"}`,children:[p,"g",P?a.jsx(Xr,{className:"w-3.5 h-3.5"}):a.jsxs(a.Fragment,{children:[a.jsx(Fn,{className:"w-3.5 h-3.5"}),a.jsx("button",{onClick:k,className:"p-1 hover:bg-green-500/20 rounded transition-colors text-green-500",title:s("spoolbuddy.dashboard.syncWeight","Sync Weight"),children:a.jsx(wr,{className:"w-4 h-4"})})]})]}):a.jsx("span",{className:"text-zinc-500",children:"—"})]}),a.jsxs("div",{className:"flex justify-between items-center",children:[a.jsx("span",{className:"text-zinc-500",children:s("spoolbuddy.dashboard.tagId","Tag")}),a.jsx("span",{className:"font-mono text-xs text-zinc-400 truncate max-w-[120px]",title:t.tag_uid||"",children:t.tag_uid?t.tag_uid.slice(-8):"—"})]})]}),a.jsxs("div",{className:"flex gap-2 justify-center",children:[i&&a.jsx("button",{onClick:i,className:"px-5 py-2.5 rounded-lg text-sm font-medium bg-green-600 text-white hover:bg-green-700 transition-colors min-h-[44px]",children:s("spoolbuddy.modal.assignToAms","Assign to AMS")}),a.jsx("button",{onClick:k,disabled:e===null||o,className:`px-5 py-2.5 rounded-lg text-sm font-medium transition-colors min-h-[44px] ${c?"bg-green-600/20 text-green-400":i?"bg-zinc-700 text-zinc-300 hover:bg-zinc-600 disabled:opacity-40 disabled:cursor-not-allowed":"bg-green-600 text-white hover:bg-green-700 disabled:opacity-40 disabled:cursor-not-allowed"}`,children:o?"...":c?s("spoolbuddy.dashboard.weightSynced","Synced!"):s("spoolbuddy.dashboard.syncWeight","Sync Weight")}),n&&a.jsx("button",{onClick:n,className:"px-5 py-2.5 rounded-lg text-sm font-medium bg-zinc-700 text-zinc-300 hover:bg-zinc-600 transition-colors min-h-[44px]",children:s("spoolbuddy.dashboard.close","Close")})]})]})}function wrt({tagUid:t,scaleWeight:e,coreWeight:n,onLinkSpool:r,onAddToInventory:i,onClose:s}){const{t:o}=Rt(),l=n??Mle(),c=e!==null?Math.round(Math.max(0,e)):null,d=c!==null?Math.round(Math.max(0,c-l)):null;return a.jsxs("div",{className:"flex flex-col items-center text-center space-y-5",children:[a.jsx("div",{className:"w-20 h-20 rounded-2xl bg-green-500/15 flex items-center justify-center",children:a.jsx("svg",{className:"w-10 h-10 text-green-500",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:a.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"2",d:"M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A2 2 0 013 12V7a4 4 0 014-4z"})})}),a.jsxs("div",{children:[a.jsx("h3",{className:"text-lg font-semibold text-zinc-100",children:o("spoolbuddy.dashboard.newTag","New Tag Detected")}),a.jsx("p",{className:"text-sm text-zinc-500 font-mono mt-1",children:t})]}),c!==null&&a.jsxs("div",{className:"text-sm text-zinc-400",children:[a.jsxs("span",{className:"font-mono font-semibold",children:[c,"g"]})," ",o("spoolbuddy.dashboard.onScale","on scale"),d!==null&&d>0&&a.jsxs("span",{className:"text-zinc-500",children:[" • ~",d,"g filament"]})]}),a.jsxs("div",{className:"flex flex-wrap gap-2 justify-center",children:[i&&a.jsx("button",{onClick:i,className:"px-5 py-2.5 rounded-lg text-sm font-medium bg-green-600 text-white hover:bg-green-700 transition-colors min-h-[44px]",children:o("spoolbuddy.modal.addToInventory","Add to Inventory")}),r&&a.jsxs("button",{onClick:r,className:"px-5 py-2.5 rounded-lg text-sm font-medium bg-zinc-700 text-zinc-300 hover:bg-zinc-600 transition-colors min-h-[44px]",children:[a.jsx("svg",{className:"w-4 h-4 inline-block mr-1.5 -mt-0.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:a.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"2",d:"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"})}),o("spoolbuddy.dashboard.linkSpool","Link to Spool")]}),s&&a.jsx("button",{onClick:s,className:"px-5 py-2.5 rounded-lg text-sm font-medium bg-zinc-700 text-zinc-300 hover:bg-zinc-600 transition-colors min-h-[44px]",children:o("spoolbuddy.dashboard.close","Close")})]})]})}function Srt(t){return t?`#${t.slice(0,6)}`:"#808080"}function jle(t){return!t.tray_type||t.tray_type===""}function _rt(t){return t<=3?`AMS ${String.fromCharCode(65+t)}`:t>=128&&t<=135?`AMS HT ${String.fromCharCode(65+t-128)}`:`AMS ${t}`}function Nrt({className:t}){return a.jsx("svg",{className:t,viewBox:"0 0 36 54",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:a.jsx("path",{d:"M17.8131 0.00538C18.4463 -0.15091 20.3648 3.14642 20.8264 3.84781C25.4187 10.816 35.3089 26.9368 35.9383 34.8694C37.4182 53.5822 11.882 61.3357 2.53721 45.3789C-1.73471 38.0791 0.016 32.2049 3.178 25.0232C6.99221 16.3662 12.6411 7.90372 17.8131 0.00538ZM18.3738 7.24807L17.5881 7.48441C14.4452 12.9431 10.917 18.2341 8.19369 23.9368C4.6808 31.29 1.18317 38.5479 7.69403 45.5657C17.3058 55.9228 34.9847 46.8808 31.4604 32.8681C29.2558 24.0969 22.4207 15.2913 18.3776 7.24807H18.3738Z",fill:"#C3C2C1"})})}function krt({className:t}){return a.jsxs("svg",{className:t,viewBox:"0 0 35 53",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[a.jsx("path",{d:"M17.3165 0.0038C17.932 -0.14959 19.7971 3.08645 20.2458 3.77481C24.7103 10.6135 34.3251 26.4346 34.937 34.2198C36.3757 52.5848 11.5505 60.1942 2.46584 44.534C-1.68714 37.3735 0.0148 31.6085 3.08879 24.5603C6.79681 16.0605 12.2884 7.75907 17.3165 0.0038ZM17.8615 7.11561L17.0977 7.34755C14.0423 12.7048 10.6124 17.8974 7.96483 23.4941C4.54975 30.7107 1.14949 37.8337 7.47908 44.721C16.8233 54.8856 34.01 46.0117 30.5838 32.2595C28.4405 23.6512 21.7957 15.0093 17.8652 7.11561H17.8615Z",fill:"#C3C2C1"}),a.jsx("path",{d:"M5.03547 30.112C9.64453 30.4936 11.632 35.7985 16.4154 35.791C19.6339 35.7873 20.2161 33.2283 22.3853 31.6197C31.6776 24.7286 33.5835 37.4894 27.9881 44.4254C18.1878 56.5653 -1.16063 44.6013 5.03917 30.1158L5.03547 30.112Z",fill:"#1F8FEB"})]})}function Crt({className:t}){return a.jsxs("svg",{className:t,viewBox:"0 0 36 54",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[a.jsx("path",{d:"M17.9625 4.48059L4.77216 26.3154L2.08228 40.2175L10.0224 50.8414H23.1594L33.3246 42.1693V30.2455L17.9625 4.48059Z",fill:"#1F8FEB"}),a.jsx("path",{d:"M17.7948 0.00538C18.4273 -0.15091 20.3438 3.14642 20.8048 3.84781C25.3921 10.816 35.2715 26.9368 35.9001 34.8694C37.3784 53.5822 11.8702 61.3357 2.53562 45.3789C-1.73163 38.0829 0.0134 32.2087 3.1757 25.027C6.98574 16.3662 12.6284 7.90372 17.7948 0.00538ZM18.3549 7.24807L17.57 7.48441C14.4306 12.9431 10.9063 18.2341 8.1859 23.9368C4.67686 31.29 1.18305 38.5479 7.68679 45.5657C17.2881 55.9228 34.9476 46.8808 31.4271 32.8681C29.2249 24.0969 22.3974 15.2913 18.3587 7.24807H18.3549Z",fill:"#C3C2C1"})]})}function Prt({className:t}){return a.jsxs("svg",{className:t,viewBox:"0 0 12 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[a.jsx("path",{d:"M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z",stroke:"#C3C2C1",strokeWidth:"1",fill:"none"}),a.jsx("circle",{cx:"6",cy:"15",r:"2.5",stroke:"#C3C2C1",strokeWidth:"1",fill:"none"})]})}function Trt({className:t}){return a.jsxs("svg",{className:t,viewBox:"0 0 12 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[a.jsx("rect",{x:"4.5",y:"8",width:"3",height:"4.5",fill:"#d4a017",rx:"0.5"}),a.jsx("circle",{cx:"6",cy:"15",r:"2",fill:"#d4a017"}),a.jsx("path",{d:"M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z",stroke:"#C3C2C1",strokeWidth:"1",fill:"none"})]})}function Art({className:t}){return a.jsxs("svg",{className:t,viewBox:"0 0 12 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[a.jsx("rect",{x:"4.5",y:"3",width:"3",height:"9.5",fill:"#c62828",rx:"0.5"}),a.jsx("circle",{cx:"6",cy:"15",r:"2",fill:"#c62828"}),a.jsx("path",{d:"M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z",stroke:"#C3C2C1",strokeWidth:"1",fill:"none"})]})}function Ele({humidity:t,goodThreshold:e=40,fairThreshold:n=60}){let r,i;return t<=e?(r="#22a352",i=Nrt):t<=n?(r="#d4a017",i=krt):(r="#c62828",i=Crt),a.jsxs("div",{className:"flex items-center gap-0.5",children:[a.jsx(i,{className:"w-3 h-3.5"}),a.jsxs("span",{className:"font-medium tabular-nums text-xs",style:{color:r},children:[t,"%"]})]})}function Dle({temp:t,goodThreshold:e=28,fairThreshold:n=35}){let r,i;return t<=e?(r="#22a352",i=Prt):t<=n?(r="#d4a017",i=Trt):(r="#c62828",i=Art),a.jsxs("div",{className:"flex items-center gap-0.5",children:[a.jsx(i,{className:"w-3 h-3.5"}),a.jsxs("span",{className:"font-medium tabular-nums text-xs",style:{color:r},children:[t,"°C"]})]})}function Kz({side:t}){return a.jsx("span",{className:"inline-flex items-center justify-center w-4 h-4 text-[9px] font-bold rounded",style:{backgroundColor:"#1a4d2e",color:"#00ae42"},children:t})}function Mrt({tray:t,slotIndex:e,isActive:n,fillOverride:r,spoolmanFill:i,onClick:s}){const o=jle(t),l=Srt(t.tray_color),c=t.remain!==null&&t.remain!==void 0&&t.remain>=0?t.remain:null,d=r===0&&c!==null&&c>0?null:r,u=i??d??c;return a.jsxs("div",{className:`relative flex flex-col items-center p-2.5 rounded-lg transition-all ${n?"ring-2 ring-bambu-green":""} ${s?"cursor-pointer hover:bg-white/5":""}`,onClick:s,children:[a.jsxs("div",{className:"relative w-16 h-16 mb-1",children:[o?a.jsx("div",{className:"w-full h-full rounded-full border-2 border-dashed border-gray-500 flex items-center justify-center",children:a.jsx("div",{className:"w-3 h-3 rounded-full bg-gray-600"})}):a.jsxs("svg",{viewBox:"0 0 56 56",className:"w-full h-full",children:[a.jsx("circle",{cx:"28",cy:"28",r:"26",fill:l}),a.jsx("circle",{cx:"28",cy:"28",r:"20",fill:l,style:{filter:"brightness(0.85)"}}),a.jsx("ellipse",{cx:"20",cy:"20",rx:"6",ry:"4",fill:"white",opacity:"0.3"}),a.jsx("circle",{cx:"28",cy:"28",r:"8",fill:"#2d2d2d"}),a.jsx("circle",{cx:"28",cy:"28",r:"5",fill:"#1a1a1a"})]}),n&&a.jsx("div",{className:"absolute -bottom-1 left-1/2 -translate-x-1/2 w-2.5 h-2.5 bg-bambu-green rounded-full"})]}),a.jsx("span",{className:"text-sm text-white/70 truncate max-w-full",children:o?"Empty":t.tray_type||"Unknown"}),!o&&u!==null&&u>=0&&a.jsx("div",{className:"w-full h-1 bg-bambu-dark-tertiary rounded-full overflow-hidden mt-1",children:a.jsx("div",{className:"h-full rounded-full transition-all",style:{width:`${u}%`,backgroundColor:hx(u)}})}),a.jsx("span",{className:"absolute top-1 right-1 text-xs text-white/30",children:e+1})]})}function Fle({unit:t,activeSlot:e,onConfigureSlot:n,isDualNozzle:r,nozzleSide:i,thresholds:s,fillOverrides:o,spoolmanFillOverrides:l}){const c=t.tray||[],d=t.is_ams_ht,u=d?1:4;return a.jsxs("div",{className:"bg-bambu-dark-secondary rounded-lg p-3",children:[a.jsxs("div",{className:"flex items-center justify-between mb-2",children:[a.jsxs("div",{className:"flex items-center gap-1.5",children:[a.jsx("span",{className:"text-white font-medium text-base",children:_rt(t.id)}),r&&i&&a.jsx(Kz,{side:i})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[t.temp!=null&&a.jsx(Dle,{temp:t.temp,goodThreshold:s?.tempGood,fairThreshold:s?.tempFair}),t.humidity!=null&&a.jsx(Ele,{humidity:t.humidity,goodThreshold:s?.humidityGood,fairThreshold:s?.humidityFair})]})]}),a.jsx("div",{className:`grid ${d?"grid-cols-1 max-w-[100px] mx-auto":"grid-cols-4"} gap-2`,children:Array.from({length:u}).map((m,p)=>{const f=c[p]||{id:p,tray_color:null,tray_type:"",tray_sub_brands:null,tray_id_name:null,tray_info_idx:null,remain:-1,k:null,cali_idx:null,tag_uid:null,tray_uuid:null,nozzle_temp_min:null,nozzle_temp_max:null};return a.jsx(Mrt,{tray:f,slotIndex:p,isActive:e===p,fillOverride:o?.[`${t.id}-${p}`]??null,spoolmanFill:l?.[`${t.id}-${p}`]??null,onClick:n?()=>n(t.id,p,jle(f)?null:f):void 0},p)})})]})}function x3(t){return t<=3?`AMS ${String.fromCharCode(65+t)}`:t>=128&&t<=135?`AMS HT ${String.fromCharCode(65+t-128)}`:`AMS ${t}`}function y3(t){return!t.tray_type||t.tray_type===""}function jrt(t){return t?`#${t.slice(0,6)}`:"#808080"}const gP=t=>(t??"").trim().toUpperCase();function Ert(t,e){const n=gP(t),r=gP(e);return!n||!r?"none":n===r?"exact":r.includes(n)||n.includes(r)?"partial":"none"}function Drt(t,e){const n=gP(t),r=gP(e);return!n||!r?!1:n===r}function Rle({isOpen:t,onClose:e,spool:n,printerId:r}){const{t:i}=Rt(),s=mn(),[o,l]=w.useState(null),[c,d]=w.useState(null),[u,m]=w.useState(!1),[p,f]=w.useState(null),[y,v]=w.useState(null);w.useEffect(()=>{t&&(l(null),d(null),m(!1),f(null),v(null))},[t]);const g=w.useCallback(Ne=>{Ne.key==="Escape"&&e()},[e]);w.useEffect(()=>(t&&document.addEventListener("keydown",g),()=>document.removeEventListener("keydown",g)),[t,g]);const{data:b}=Je({queryKey:["printerStatus",r],queryFn:()=>he.getPrinterStatus(r),enabled:t&&r!==null,refetchInterval:5e3}),{data:_}=Je({queryKey:["printer",r],queryFn:()=>he.getPrinter(r),enabled:t&&r!==null}),{data:N}=Je({queryKey:["settings"],queryFn:()=>he.getSettings(),enabled:t,staleTime:300*1e3}),{data:P}=Je({queryKey:["spool-assignments",r],queryFn:()=>he.getAssignments(r),enabled:t&&r!==null,staleTime:30*1e3}),k=w.useMemo(()=>{const Ne={};if(!P)return Ne;for(const B of P){const W=B.spool;if(W&&W.label_weight>0&&W.weight_used!=null){const D=Math.round(Math.max(0,W.label_weight-W.weight_used)/W.label_weight*100);Ne[`${B.ams_id}-${B.tray_id}`]=D}}return Ne},[P]),M=N?{humidityGood:Number(N.ams_humidity_good)||40,humidityFair:Number(N.ams_humidity_fair)||60,tempGood:Number(N.ams_temp_good)||28,tempFair:Number(N.ams_temp_fair)||35}:void 0,T=b?.connected??!1,A=w.useMemo(()=>b?.ams??[],[b?.ams]),C=w.useMemo(()=>A.filter(Ne=>!Ne.is_ams_ht),[A]),F=w.useMemo(()=>A.filter(Ne=>Ne.is_ams_ht),[A]),$=w.useMemo(()=>[...b?.vt_tray??[]].sort((Ne,B)=>(Ne.id??254)-(B.id??254)),[b?.vt_tray]),I=_?.nozzle_count===2||b?.temperatures?.nozzle_2!==void 0,Q=w.useRef({});w.useEffect(()=>{b?.ams_extruder_map&&Object.keys(b.ams_extruder_map).length>0&&(Q.current=b.ams_extruder_map)},[b?.ams_extruder_map]);const L=b?.ams_extruder_map&&Object.keys(b.ams_extruder_map).length>0?b.ams_extruder_map:Q.current,re=w.useCallback(Ne=>{if(!I)return null;const B=L[String(Ne)],W=Ne>=128?Ne-128:Ne;return(B!==void 0?B:W)===1?"L":"R"},[I,L]),ae=ct({mutationFn:async({amsId:Ne,trayId:B})=>{if(!r)throw new Error("No printer selected");await he.assignSpool({spool_id:n.id,printer_id:r,ams_id:Ne,tray_id:B})},onSuccess:()=>{d("success"),l(i("spoolbuddy.modal.assignSuccess","Assigned!")),s.invalidateQueries({queryKey:["slotPresets"]}),setTimeout(()=>e(),1500)},onError:Ne=>{d("error"),l(Ne instanceof Error?Ne.message:i("spoolbuddy.modal.assignError","Failed to assign spool."))}}),ee=ae.isPending,de=w.useCallback((Ne,B)=>{if(Ne===254||Ne===255){const D=Ne===254?254:254+B;return $.find(j=>(j.id??254)===D)||null}return A.find(D=>D.id===Ne)?.tray?.find(D=>D.id===B)||null},[A,$]),le=w.useCallback((Ne,B)=>Ne<=3?`${x3(Ne)} ${i("ams.slot","Slot")} ${B+1}`:Ne>=128&&Ne<=135?x3(Ne):Ne===254?i("printers.extL","Ext-L"):I?i("printers.extR","Ext-R"):i("printers.ext","Ext"),[i,I]),ue=w.useCallback((Ne,B)=>{d("info"),l(i("spoolbuddy.modal.assigning","Configuring slot...")),ae.mutate({amsId:Ne,trayId:B})},[ae,i]),Y=w.useCallback((Ne,B)=>{if(!ee){if(!N?.disable_filament_warnings){const W=de(Ne,B);if(W&&!y3(W)){const D=W.tray_sub_brands||W.tray_type||"",j=Ert(n.material,D),z=n.slicer_filament_name||n.slicer_filament,K=W.tray_type||"",q=Drt(z,K);if(j!=="exact"||!q){let ce="profile";j==="none"&&!q?ce="material_profile":j==="partial"&&!q?ce="partial_profile":j==="none"?ce="material":j==="partial"&&(ce="partial");const O=le(Ne,B);v({amsId:Ne,trayId:B}),f({type:ce,spoolMaterial:n.material||"",trayMaterial:D||"",spoolProfile:z||void 0,trayProfile:K||void 0,location:O}),m(!0);return}}}ue(Ne,B)}},[ee,N?.disable_filament_warnings,n,de,le,ue]),te=w.useCallback(()=>{y&&(m(!1),f(null),ue(y.amsId,y.trayId),v(null))},[y,ue]),se=w.useMemo(()=>{const Ne=[];for(const B of F){const W=B.tray?.[0]||{id:0,tray_color:null,tray_type:"",tray_sub_brands:null,tray_id_name:null,tray_info_idx:null,remain:-1,k:null,cali_idx:null,tag_uid:null,tray_uuid:null,nozzle_temp_min:null,nozzle_temp_max:null},D=k[`${B.id}-0`]??null,j=W.remain!=null&&W.remain>=0?W.remain:null,z=D===0&&j!==null&&j>0?null:D;Ne.push({key:`ht-${B.id}`,label:x3(B.id),amsId:B.id,trayId:0,tray:W,isEmpty:y3(W),nozzleSide:re(B.id),effectiveFill:z??j})}for(const B of $){const W=B.id??254,D=W-254,j=k[`255-${D}`]??null,z=B.remain!=null&&B.remain>=0?B.remain:null,K=j===0&&z!==null&&z>0?null:j;Ne.push({key:`ext-${W}`,label:I?W===254?i("printers.extL","Ext-L"):i("printers.extR","Ext-R"):i("printers.ext","Ext"),amsId:255,trayId:D,tray:B,isEmpty:y3(B),nozzleSide:I?W===254?"L":"R":null,effectiveFill:K??z})}return Ne},[F,$,I,i,re,k]);if(!t)return null;const ge=n.rgba?`#${n.rgba.slice(0,6)}`:"#808080";return a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"fixed inset-0 z-[60] bg-bambu-dark flex flex-col",children:[a.jsxs("div",{className:"flex items-center justify-between px-5 py-3 border-b border-zinc-800 shrink-0",children:[a.jsxs("div",{className:"flex items-center gap-3 min-w-0",children:[a.jsx("div",{className:"w-7 h-7 rounded-full shrink-0",style:{backgroundColor:ge}}),a.jsx("div",{className:"min-w-0",children:a.jsxs("h2",{className:"text-sm font-semibold text-zinc-100 truncate",children:[i("spoolbuddy.modal.assignToAmsTitle","Assign to AMS"),a.jsxs("span",{className:"font-normal text-zinc-500 ml-2",children:[n.color_name||"Unknown"," • ",n.brand," ",n.material,n.subtype&&` ${n.subtype}`]})]})})]}),a.jsx("button",{onClick:e,disabled:ee,className:"p-2 rounded-lg text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800 transition-colors shrink-0 disabled:opacity-50",children:a.jsx(Ht,{className:"w-5 h-5"})})]}),o&&a.jsxs("div",{className:`mx-5 mt-3 p-3 rounded-lg flex items-center gap-3 border shrink-0 ${c==="info"?"bg-blue-500/10 border-blue-500/40":c==="success"?"bg-green-500/10 border-green-500/40":"bg-red-500/10 border-red-500/40"}`,children:[c==="info"&&a.jsx(dt,{className:"w-4 h-4 text-blue-400 animate-spin shrink-0"}),c==="success"&&a.jsx(br,{className:"w-4 h-4 text-green-400 shrink-0"}),c==="error"&&a.jsx(Ka,{className:"w-4 h-4 text-red-400 shrink-0"}),a.jsx("span",{className:`text-sm ${c==="info"?"text-blue-300":c==="success"?"text-green-300":"text-red-300"}`,children:o})]}),a.jsx("div",{className:"flex-1 flex flex-col gap-3 p-4 min-h-0 overflow-y-auto",children:!T&&r?a.jsx("div",{className:"flex-1 flex items-center justify-center",children:a.jsx("div",{className:"text-center text-white/50",children:a.jsx("p",{className:"text-lg mb-2",children:i("spoolbuddy.ams.printerDisconnected","Printer disconnected")})})}):A.length===0&&$.length===0?a.jsx("div",{className:"flex-1 flex items-center justify-center",children:a.jsxs("div",{className:"text-center text-white/50",children:[a.jsx(na,{className:"w-12 h-12 mx-auto mb-3 opacity-50"}),a.jsx("p",{className:"text-lg mb-2",children:i("spoolbuddy.ams.noData","No AMS detected")}),a.jsx("p",{className:"text-sm",children:i("spoolbuddy.ams.connectAms","Connect an AMS to see filament slots")})]})}):a.jsxs(a.Fragment,{children:[C.length>0&&a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-3 flex-1 min-h-0",children:C.map(Ne=>a.jsx(Fle,{unit:Ne,activeSlot:null,onConfigureSlot:(B,W)=>Y(Ne.id,W),isDualNozzle:I,nozzleSide:re(Ne.id),thresholds:M,fillOverrides:k},Ne.id))}),se.length>0&&a.jsx("div",{className:"flex gap-2 shrink-0",children:se.map(({key:Ne,label:B,amsId:W,trayId:D,tray:j,isEmpty:z,nozzleSide:K,effectiveFill:q})=>{const ce=jrt(j.tray_color);return a.jsxs("div",{onClick:()=>Y(W,D),className:`bg-bambu-dark-secondary rounded-lg px-3 py-2 cursor-pointer hover:bg-bambu-dark-secondary/80 transition-all flex items-center gap-2 ${ee?"opacity-50 pointer-events-none":""}`,children:[a.jsx("div",{className:"relative w-10 h-10 shrink-0",children:z?a.jsx("div",{className:"w-full h-full rounded-full border-2 border-dashed border-gray-500 flex items-center justify-center",children:a.jsx("div",{className:"w-1.5 h-1.5 rounded-full bg-gray-600"})}):a.jsxs("svg",{viewBox:"0 0 56 56",className:"w-full h-full",children:[a.jsx("circle",{cx:"28",cy:"28",r:"26",fill:ce}),a.jsx("circle",{cx:"28",cy:"28",r:"20",fill:ce,style:{filter:"brightness(0.85)"}}),a.jsx("ellipse",{cx:"20",cy:"20",rx:"6",ry:"4",fill:"white",opacity:"0.3"}),a.jsx("circle",{cx:"28",cy:"28",r:"8",fill:"#2d2d2d"}),a.jsx("circle",{cx:"28",cy:"28",r:"5",fill:"#1a1a1a"})]})}),a.jsxs("div",{className:"min-w-0",children:[a.jsxs("div",{className:"flex items-center gap-1",children:[a.jsx("span",{className:"text-xs text-white/50 font-medium",children:B}),K&&a.jsx(Kz,{side:K})]}),a.jsx("div",{className:"text-sm text-white/80 truncate",children:z?"Empty":j.tray_type||"?"})]}),!z&&q!=null&&q>=0&&a.jsx("div",{className:"w-1.5 h-8 bg-bambu-dark-tertiary rounded-full overflow-hidden shrink-0 flex flex-col-reverse",children:a.jsx("div",{className:"w-full rounded-full",style:{height:`${q}%`,backgroundColor:hx(q)}})})]},Ne)})})]})}),a.jsx("div",{className:"flex justify-end gap-3 px-5 py-3 border-t border-zinc-800 shrink-0",children:a.jsx("button",{onClick:e,disabled:ee,className:"px-5 py-2.5 rounded-lg text-sm font-medium bg-zinc-800 text-zinc-300 hover:bg-zinc-700 transition-colors min-h-[44px] disabled:opacity-50",children:c==="success"?i("spoolbuddy.dashboard.close","Close"):i("spoolbuddy.modal.cancel","Cancel")})})]}),u&&p&&(()=>{let Ne="";return p.type==="material"?Ne=i("inventory.assignMismatchMessage",{spoolMaterial:p.spoolMaterial,trayMaterial:p.trayMaterial,location:p.location}):p.type==="partial"?Ne=i("inventory.assignPartialMismatchMessage",{spoolMaterial:p.spoolMaterial,trayMaterial:p.trayMaterial,location:p.location}):p.type==="material_profile"?Ne=`${i("inventory.assignMismatchMessage",{spoolMaterial:p.spoolMaterial,trayMaterial:p.trayMaterial,location:p.location})} +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)})()}function ee(B,W){(W==null||W>B.length)&&(W=B.length);for(var D=0,j=Array(W);D1&&arguments[1]!==void 0?arguments[1]:j;this.caretPosition=j,this.caretPositionEnd=z}},{key:"getInputCandidates",value:function(j){var z=this,K=this.options,q=K.layoutCandidates,ce=K.layoutCandidatesCaseSensitiveMatch;if(!q||de(q)!=="object")return{};var O=Object.keys(q).filter((function(V){var J=j.substring(0,z.getCaretPositionEnd()||0)||j,ie=new RegExp("".concat(z.utilities.escapeRegex(V),"$"),ce?"g":"gi");return!!ae(J.matchAll(ie)).length}));if(O.length>1){var G=O.sort((function(V,J){return J.length-V.length}))[0];return{candidateKey:G,candidateValue:q[G]}}if(O.length){var X=O[0];return{candidateKey:X,candidateValue:q[X]}}return{}}},{key:"showCandidatesBox",value:function(j,z,K){var q=this;this.candidateBox&&this.candidateBox.show({candidateValue:z,targetElement:K,onSelect:function(ce,O){var G=q.options,X=G.layoutCandidatesCaseSensitiveMatch,V=G.disableCandidateNormalization,J=G.enableLayoutCandidatesKeyPress,ie=ce;V||(ie=ce.normalize("NFD")),typeof q.options.beforeInputUpdate=="function"&&q.options.beforeInputUpdate(q);var me=q.getInput(q.options.inputName,!0),pe=q.getCaretPositionEnd()||0,oe=me.substring(0,pe||0)||me,U=new RegExp("".concat(q.utilities.escapeRegex(j),"$"),X?"g":"gi"),R=oe.replace(U,ie),ne=me.replace(oe,R),be=R.length-oe.length,we=(pe||me.length)+be;we<0&&(we=0),q.setInput(ne,q.options.inputName,!0),q.setCaretPosition(we),J&&typeof q.options.onKeyPress=="function"&&q.options.onKeyPress(ce,O),typeof q.options.onChange=="function"&&q.options.onChange(q.getInput(q.options.inputName,!0),O),typeof q.options.onChangeAll=="function"&&q.options.onChangeAll(q.getAllInputs(),O)}})}},{key:"handleButtonClicked",value:function(j,z){var K=this.options,q=K.inputName,ce=q===void 0?this.defaultName:q,O=K.debug;if(j!=="{//}"){this.input[ce]||(this.input[ce]=""),typeof this.options.beforeInputUpdate=="function"&&this.options.beforeInputUpdate(this);var G=this.utilities.getUpdatedInput(j,this.input[ce],this.caretPosition,this.caretPositionEnd);if(this.utilities.isStandardButton(j)&&this.activeInputElement&&this.input[ce]&&this.input[ce]===G&&this.caretPosition===0&&this.caretPositionEnd===G.length)return this.setInput("",this.options.inputName,!0),this.setCaretPosition(0),this.activeInputElement.value="",this.activeInputElement.setSelectionRange(0,0),void this.handleButtonClicked(j,z);if(typeof this.options.onKeyPress=="function"&&this.options.onKeyPress(j,z),this.input[ce]!==G&&(!this.options.inputPattern||this.options.inputPattern&&this.inputPatternIsValid(G))){if(this.options.maxLength&&this.utilities.handleMaxLength(this.input,G))return;var X=this.utilities.getUpdatedInput(j,this.input[ce],this.caretPosition,this.caretPositionEnd,!0);if(this.setInput(X,this.options.inputName,!0),O&&console.log("Input changed:",this.getAllInputs()),this.options.debug&&console.log("Caret at: ",this.getCaretPosition(),this.getCaretPositionEnd(),"(".concat(this.keyboardDOMClass,")"),z?.type),this.options.syncInstanceInputs&&this.syncInstanceInputs(),typeof this.options.onChange=="function"&&this.options.onChange(this.getInput(this.options.inputName,!0),z),typeof this.options.onChangeAll=="function"&&this.options.onChangeAll(this.getAllInputs(),z),z!=null&&z.target&&this.options.enableLayoutCandidates){var V,J=this.getInputCandidates(G),ie=J.candidateKey,me=J.candidateValue;ie&&me?this.showCandidatesBox(ie,me,this.keyboardDOM):(V=this.candidateBox)===null||V===void 0||V.destroy()}}this.caretPositionEnd&&this.caretPosition!==this.caretPositionEnd&&(this.setCaretPosition(this.caretPositionEnd,this.caretPositionEnd),this.activeInputElement&&this.activeInputElement.setSelectionRange(this.caretPositionEnd,this.caretPositionEnd),this.options.debug&&console.log("Caret position aligned",this.caretPosition)),O&&console.log("Key pressed:",j)}}},{key:"getMouseHold",value:function(){return this.isMouseHold}},{key:"setMouseHold",value:function(j){this.options.syncInstanceInputs?this.dispatch((function(z){z.isMouseHold=j})):this.isMouseHold=j}},{key:"handleButtonMouseDown",value:function(j,z){var K=this;z&&(this.options.preventMouseDownDefault&&z.preventDefault(),this.options.stopMouseDownPropagation&&z.stopPropagation(),z.target.classList.add(this.activeButtonClass)),this.holdInteractionTimeout&&clearTimeout(this.holdInteractionTimeout),this.holdTimeout&&clearTimeout(this.holdTimeout),this.setMouseHold(!0),this.options.disableButtonHold||(this.holdTimeout=window.setTimeout((function(){(K.getMouseHold()&&(!j.includes("{")&&!j.includes("}")||j==="{delete}"||j==="{backspace}"||j==="{bksp}"||j==="{space}"||j==="{tab}")||j==="{arrowright}"||j==="{arrowleft}"||j==="{arrowup}"||j==="{arrowdown}")&&(K.options.debug&&console.log("Button held:",j),K.handleButtonHold(j)),clearTimeout(K.holdTimeout)}),500))}},{key:"handleButtonMouseUp",value:function(j,z){var K=this;z&&(this.options.preventMouseUpDefault&&z.preventDefault&&z.preventDefault(),this.options.stopMouseUpPropagation&&z.stopPropagation&&z.stopPropagation(),!(z.target===this.keyboardDOM||z.target&&this.keyboardDOM.contains(z.target)||this.candidateBox&&this.candidateBox.candidateBoxElement&&(z.target===this.candidateBox.candidateBoxElement||z.target&&this.candidateBox.candidateBoxElement.contains(z.target)))&&this.candidateBox&&this.candidateBox.destroy()),this.recurseButtons((function(q){q.classList.remove(K.activeButtonClass)})),this.setMouseHold(!1),this.holdInteractionTimeout&&clearTimeout(this.holdInteractionTimeout),j&&typeof this.options.onKeyReleased=="function"&&this.options.onKeyReleased(j,z)}},{key:"handleKeyboardContainerMouseDown",value:function(j){this.options.preventMouseDownDefault&&j.preventDefault()}},{key:"handleButtonHold",value:function(j){var z=this;this.holdInteractionTimeout&&clearTimeout(this.holdInteractionTimeout),this.holdInteractionTimeout=window.setTimeout((function(){z.getMouseHold()?(z.handleButtonClicked(j),z.handleButtonHold(j)):clearTimeout(z.holdInteractionTimeout)}),100)}},{key:"syncInstanceInputs",value:function(){var j=this;this.dispatch((function(z){z.replaceInput(j.input),z.setCaretPosition(j.caretPosition,j.caretPositionEnd)}))}},{key:"clearInput",value:function(){var j=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.options.inputName||this.defaultName;this.input[j]="",this.setCaretPosition(0),this.options.syncInstanceInputs&&this.syncInstanceInputs()}},{key:"getInput",value:function(){var j=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.options.inputName||this.defaultName,z=arguments.length>1&&arguments[1]!==void 0&&arguments[1];return this.options.syncInstanceInputs&&!z&&this.syncInstanceInputs(),this.options.rtl?"‫"+this.input[j].replace("‫","").replace("‬","")+"‬":this.input[j]}},{key:"getAllInputs",value:function(){var j=this,z={};return Object.keys(this.input).forEach((function(K){z[K]=j.getInput(K,!0)})),z}},{key:"setInput",value:function(j){var z=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.options.inputName||this.defaultName,K=arguments.length>2?arguments[2]:void 0;this.input[z]=j,!K&&this.options.syncInstanceInputs&&this.syncInstanceInputs()}},{key:"replaceInput",value:function(j){this.input=j}},{key:"setOptions",value:function(){var j=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},z=this.changedOptions(j);this.options=Object.assign(this.options,j),z.length&&(this.options.debug&&console.log("changedOptions",z),this.onSetOptions(z),this.render())}},{key:"changedOptions",value:function(j){var z=this;return Object.keys(j).filter((function(K){return JSON.stringify(j[K])!==JSON.stringify(z.options[K])}))}},{key:"onSetOptions",value:function(){var j=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[];j.includes("layoutName")&&this.candidateBox&&this.candidateBox.destroy(),(j.includes("layoutCandidatesPageSize")||j.includes("layoutCandidates"))&&this.candidateBox&&(this.candidateBox.destroy(),this.candidateBox=new re({utilities:this.utilities,options:this.options}))}},{key:"resetRows",value:function(){this.keyboardRowsDOM&&this.keyboardRowsDOM.remove(),this.keyboardDOM.className=this.keyboardDOMClass,this.keyboardDOM.setAttribute("data-skInstance",this.currentInstanceName),this.buttonElements={}}},{key:"dispatch",value:function(j){if(!window.SimpleKeyboardInstances)throw console.warn("SimpleKeyboardInstances is not defined. Dispatch cannot be called."),new Error("INSTANCES_VAR_ERROR");return Object.keys(window.SimpleKeyboardInstances).forEach((function(z){j(window.SimpleKeyboardInstances[z],z)}))}},{key:"addButtonTheme",value:function(j,z){var K=this;z&&j&&(j.split(" ").forEach((function(q){z.split(" ").forEach((function(ce){K.options.buttonTheme||(K.options.buttonTheme=[]);var O=!1;K.options.buttonTheme.map((function(G){if(G!=null&&G.class.split(" ").includes(ce)){O=!0;var X=G.buttons.split(" ");X.includes(q)||(O=!0,X.push(q),G.buttons=X.join(" "))}return G})),O||K.options.buttonTheme.push({class:ce,buttons:j})}))})),this.render())}},{key:"removeButtonTheme",value:function(j,z){var K=this;if(!j&&!z)return this.options.buttonTheme=[],void this.render();j&&Array.isArray(this.options.buttonTheme)&&this.options.buttonTheme.length&&(j.split(" ").forEach((function(q){var ce;(ce=K.options)===null||ce===void 0||(ce=ce.buttonTheme)===null||ce===void 0||ce.map((function(O,G){if(O&&z&&z.includes(O.class)||!z){var X,V,J=(X=O)===null||X===void 0?void 0:X.buttons.split(" ").filter((function(ie){return ie!==q}));O&&J!=null&&J.length?O.buttons=J.join(" "):((V=K.options.buttonTheme)===null||V===void 0||V.splice(G,1),O=null)}return O}))})),this.render())}},{key:"getButtonElement",value:function(j){var z,K=this.buttonElements[j];return K&&(z=K.length>1?K:K[0]),z}},{key:"inputPatternIsValid",value:function(j){var z,K=this.options.inputPattern;if((z=K instanceof RegExp?K:K[this.options.inputName||this.defaultName])&&j){var q=z.test(j);return this.options.debug&&console.log('inputPattern ("'.concat(z,'"): ').concat(q?"passed":"did not pass!")),q}return!0}},{key:"setEventListeners",value:function(){if(this.isFirstKeyboardInstance||!this.allKeyboardInstances){this.options.debug&&console.log("Caret handling started (".concat(this.keyboardDOMClass,")"));var j=this.options.physicalKeyboardHighlightPreventDefault,z=j!==void 0&&j;document.addEventListener("keyup",this.handleKeyUp,z),document.addEventListener("keydown",this.handleKeyDown,z),document.addEventListener("mouseup",this.handleMouseUp),document.addEventListener("touchend",this.handleTouchEnd),this.options.updateCaretOnSelectionChange&&document.addEventListener("selectionchange",this.handleSelectionChange),document.addEventListener("select",this.handleSelect)}}},{key:"handleKeyUp",value:function(j){this.caretEventHandler(j),this.options.physicalKeyboardHighlight&&this.physicalKeyboard.handleHighlightKeyUp(j)}},{key:"handleKeyDown",value:function(j){this.options.physicalKeyboardHighlight&&this.physicalKeyboard.handleHighlightKeyDown(j)}},{key:"handleMouseUp",value:function(j){this.caretEventHandler(j)}},{key:"handleTouchEnd",value:function(j){this.caretEventHandler(j)}},{key:"handleSelect",value:function(j){this.caretEventHandler(j)}},{key:"handleSelectionChange",value:function(j){navigator.userAgent.includes("Firefox")||this.caretEventHandler(j)}},{key:"caretEventHandler",value:function(j){var z,K=this;j.target.tagName&&(z=j.target.tagName.toLowerCase()),this.dispatch((function(q){var ce=j.target===q.keyboardDOM||j.target&&q.keyboardDOM.contains(j.target);if(K.options.syncInstanceInputs&&Array.isArray(j.path)&&(ce=j.path.some((function(X){var V;return X==null||(V=X.hasAttribute)===null||V===void 0?void 0:V.call(X,"data-skInstance")}))),(z==="textarea"||z==="input"&&["text","search","url","tel","password"].includes(j.target.type))&&!q.options.disableCaretPositioning){var O=j.target.selectionStart,G=j.target.selectionEnd;q.options.rtl&&(O=q.utilities.getRtlOffset(O,q.getInput()),G=q.utilities.getRtlOffset(G,q.getInput())),q.setCaretPosition(O,G),q.activeInputElement=j.target,q.options.debug&&console.log("Caret at: ",q.getCaretPosition(),q.getCaretPositionEnd(),j&&j.target.tagName.toLowerCase(),"(".concat(q.keyboardDOMClass,")"),j?.type)}else!q.options.disableCaretPositioning&&ce||j?.type==="selectionchange"||(q.setCaretPosition(null),q.activeInputElement=null,q.options.debug&&console.log('Caret position reset due to "'.concat(j?.type,'" event'),j))}))}},{key:"recurseButtons",value:function(j){var z=this;j&&Object.keys(this.buttonElements).forEach((function(K){return z.buttonElements[K].forEach(j)}))}},{key:"destroy",value:function(){this.options.debug&&console.log("Destroying simple-keyboard instance: ".concat(this.currentInstanceName));var j=this.options.physicalKeyboardHighlightPreventDefault,z=j!==void 0&&j;document.removeEventListener("keyup",this.handleKeyUp,z),document.removeEventListener("keydown",this.handleKeyDown,z),document.removeEventListener("mouseup",this.handleMouseUp),document.removeEventListener("touchend",this.handleTouchEnd),document.removeEventListener("select",this.handleSelect),this.options.updateCaretOnSelectionChange&&document.removeEventListener("selectionchange",this.handleSelectionChange),document.onpointerup=null,document.ontouchend=null,document.ontouchcancel=null,document.onmouseup=null,this.recurseButtons((function(K){K&&(K.onpointerdown=null,K.onpointerup=null,K.onpointercancel=null,K.ontouchstart=null,K.ontouchend=null,K.ontouchcancel=null,K.onclick=null,K.onmousedown=null,K.onmouseup=null,K.remove(),K=null)})),this.keyboardDOM.onpointerdown=null,this.keyboardDOM.ontouchstart=null,this.keyboardDOM.onmousedown=null,this.resetRows(),this.candidateBox&&(this.candidateBox.destroy(),this.candidateBox=null),this.activeInputElement=null,this.keyboardDOM.removeAttribute("data-skInstance"),this.keyboardDOM.innerHTML="",window.SimpleKeyboardInstances[this.currentInstanceName]=null,delete window.SimpleKeyboardInstances[this.currentInstanceName],this.initialized=!1}},{key:"getButtonThemeClasses",value:function(j){var z=this.options.buttonTheme,K=[];return Array.isArray(z)&&z.forEach((function(q){if(q&&q.class&&typeof q.class=="string"&&q.buttons&&typeof q.buttons=="string"){var ce=q.class.split(" ");q.buttons.split(" ").includes(j)&&(K=[].concat(ae(K),ae(ce)))}else console.warn('Incorrect "buttonTheme". Please check the documentation.',q)})),K}},{key:"setDOMButtonAttributes",value:function(j,z){var K=this.options.buttonAttributes;Array.isArray(K)&&K.forEach((function(q){q.attribute&&typeof q.attribute=="string"&&q.value&&typeof q.value=="string"?q.buttons&&typeof q.buttons=="string"?q.buttons.split(" ").includes(j)&&z(q.attribute,q.value):z(q.attribute,q.value):console.warn('Incorrect "buttonAttributes". Please check the documentation.',q)}))}},{key:"onTouchDeviceDetected",value:function(){this.processAutoTouchEvents(),this.disableContextualWindow()}},{key:"disableContextualWindow",value:function(){window.oncontextmenu=function(j){var z;if((z=j.target.classList)!==null&&z!==void 0&&z.contains("hg-button"))return j.preventDefault(),j.stopPropagation(),!1}}},{key:"processAutoTouchEvents",value:function(){this.options.autoUseTouchEvents&&(this.options.useTouchEvents=!0,this.options.debug&&console.log("autoUseTouchEvents: Touch device detected, useTouchEvents enabled."))}},{key:"onInit",value:function(){this.options.debug&&console.log("".concat(this.keyboardDOMClass," Initialized")),this.setEventListeners(),typeof this.options.onInit=="function"&&this.options.onInit(this)}},{key:"beforeFirstRender",value:function(){this.utilities.isTouchDevice()&&this.onTouchDeviceDetected(),typeof this.options.beforeFirstRender=="function"&&this.options.beforeFirstRender(this),this.isFirstKeyboardInstance&&this.utilities.pointerEventsSupported()&&!this.options.useTouchEvents&&!this.options.useMouseEvents&&this.options.debug&&console.log("Using PointerEvents as it is supported by this browser"),this.options.useTouchEvents&&this.options.debug&&console.log("useTouchEvents has been enabled. Only touch events will be used.")}},{key:"beforeRender",value:function(){typeof this.options.beforeRender=="function"&&this.options.beforeRender(this)}},{key:"onRender",value:function(){typeof this.options.onRender=="function"&&this.options.onRender(this)}},{key:"onModulesLoaded",value:function(){typeof this.options.onModulesLoaded=="function"&&this.options.onModulesLoaded(this)}},{key:"loadModules",value:function(){var j=this;Array.isArray(this.options.modules)&&(this.options.modules.forEach((function(z){var K=j.utilities.isConstructor(z)?new z(j):z(j);K.init&&K.init(j)})),this.keyboardPluginClasses="modules-loaded",this.render(),this.onModulesLoaded())}},{key:"getModuleProp",value:function(j,z){return!!this.modules[j]&&this.modules[j][z]}},{key:"getModulesList",value:function(){return Object.keys(this.modules)}},{key:"parseRowDOMContainers",value:function(j,z,K,q){var ce=this,O=Array.from(j.children),G=0;return O.length&&K.forEach((function(X,V){var J=q[V];if(!(J&&J>X))return!1;var ie=X-G,me=J-G,pe=document.createElement("div");pe.className+="hg-button-container";var oe="".concat(ce.options.layoutName,"-r").concat(z,"c").concat(V);pe.setAttribute("data-skUID",oe);var U=O.splice(ie,me-ie+1);G+=me-ie,U.forEach((function(R){return pe.appendChild(R)})),O.splice(ie,0,pe),j.innerHTML="",O.forEach((function(R){return j.appendChild(R)})),ce.options.debug&&console.log("rowDOMContainer",U,ie,me,G+1)})),j}},{key:"render",value:function(){var j=this;this.resetRows(),this.initialized||this.beforeFirstRender(),this.beforeRender();var z="hg-layout-".concat(this.options.layoutName),K=this.options.layout||{default:["` 1 2 3 4 5 6 7 8 9 0 - = {bksp}","{tab} q w e r t y u i o p [ ] \\","{lock} a s d f g h j k l ; ' {enter}","{shift} z x c v b n m , . / {shift}",".com @ {space}"],shift:["~ ! @ # $ % ^ & * ( ) _ + {bksp}","{tab} Q W E R T Y U I O P { } |",'{lock} A S D F G H J K L : " {enter}',"{shift} Z X C V B N M < > ? {shift}",".com @ {space}"]},q=this.options.useTouchEvents||!1,ce=q?"hg-touch-events":"",O=this.options.useMouseEvents||!1,G=this.options.disableRowButtonContainers;this.keyboardDOM.className=this.getKeyboardClassString(this.options.theme,z,this.keyboardPluginClasses,ce),this.keyboardDOM.setAttribute("data-skInstance",this.currentInstanceName),this.keyboardRowsDOM=document.createElement("div"),this.keyboardRowsDOM.className="hg-rows",K[this.options.layoutName||this.defaultName].forEach((function(X,V){var J=X.split(" ");j.options.excludeFromLayout&&j.options.excludeFromLayout[j.options.layoutName||j.defaultName]&&(J=J.filter((function(oe){return j.options.excludeFromLayout&&!j.options.excludeFromLayout[j.options.layoutName||j.defaultName].includes(oe)})));var ie=document.createElement("div");ie.className+="hg-row";var me=[],pe=[];J.forEach((function(oe,U){var R,ne=!G&&typeof oe=="string"&&oe.length>1&&oe.indexOf("[")===0,be=!G&&typeof oe=="string"&&oe.length>1&&oe.indexOf("]")===oe.length-1;ne&&(me.push(U),oe=oe.replace(/\[/g,"")),be&&(pe.push(U),oe=oe.replace(/\]/g,""));var we=j.utilities.getButtonClass(oe),xe=j.utilities.getButtonDisplayName(oe,j.options.display,j.options.mergeDisplay),ye=j.options.useButtonTag?"button":"div",fe=document.createElement(ye);fe.className+="hg-button ".concat(we),(R=fe.classList).add.apply(R,ae(j.getButtonThemeClasses(oe))),j.setDOMButtonAttributes(oe,(function(Me,_e){fe.setAttribute(Me,_e)})),j.activeButtonClass="hg-activeButton",!j.utilities.pointerEventsSupported()||q||O?q?(fe.ontouchstart=function(Me){j.handleButtonClicked(oe,Me),j.handleButtonMouseDown(oe,Me)},fe.ontouchend=function(Me){j.handleButtonMouseUp(oe,Me)},fe.ontouchcancel=function(Me){j.handleButtonMouseUp(oe,Me)}):(fe.onclick=function(Me){j.setMouseHold(!1),typeof j.options.onKeyReleased=="function"||j.options.useMouseEvents&&j.options.clickOnMouseDown||j.handleButtonClicked(oe,Me)},fe.onmousedown=function(Me){(typeof j.options.onKeyReleased=="function"||j.options.useMouseEvents&&j.options.clickOnMouseDown)&&!j.isMouseHold&&j.handleButtonClicked(oe,Me),j.handleButtonMouseDown(oe,Me)},fe.onmouseup=function(Me){j.handleButtonMouseUp(oe,Me)}):(fe.onpointerdown=function(Me){j.handleButtonClicked(oe,Me),j.handleButtonMouseDown(oe,Me)},fe.onpointerup=function(Me){j.handleButtonMouseUp(oe,Me)},fe.onpointercancel=function(Me){j.handleButtonMouseUp(oe,Me)}),fe.setAttribute("data-skBtn",oe);var Se="".concat(j.options.layoutName,"-r").concat(V,"b").concat(U);fe.setAttribute("data-skBtnUID",Se);var Ee=document.createElement("span");Ee.innerHTML=xe,fe.appendChild(Ee),j.buttonElements[oe]||(j.buttonElements[oe]=[]),j.buttonElements[oe].push(fe),ie.appendChild(fe)})),ie=j.parseRowDOMContainers(ie,V,me,pe),j.keyboardRowsDOM.appendChild(ie)})),this.keyboardDOM.appendChild(this.keyboardRowsDOM),this.onRender(),this.initialized||(this.initialized=!0,!this.utilities.pointerEventsSupported()||q||O?q?(document.ontouchend=function(X){return j.handleButtonMouseUp(void 0,X)},document.ontouchcancel=function(X){return j.handleButtonMouseUp(void 0,X)},this.keyboardDOM.ontouchstart=function(X){return j.handleKeyboardContainerMouseDown(X)}):q||(document.onmouseup=function(X){return j.handleButtonMouseUp(void 0,X)},this.keyboardDOM.onmousedown=function(X){return j.handleKeyboardContainerMouseDown(X)}):(document.onpointerup=function(X){return j.handleButtonMouseUp(void 0,X)},this.keyboardDOM.onpointerdown=function(X){return j.handleKeyboardContainerMouseDown(X)}),this.onInit())}}],W&&ue(B.prototype,W),D&&ue(B,D),Object.defineProperty(B,"prototype",{writable:!1}),B;var B,W,D})(),ge=se,Ne=ge;return m})()},442:function(l){l.exports=n}},i={};function s(l){var c=i[l];if(c!==void 0)return c.exports;var d=i[l]={exports:{}};return r[l].call(d.exports,d,d.exports,s),d.exports}s.n=function(l){var c=l&&l.__esModule?function(){return l.default}:function(){return l};return s.d(c,{a:c}),c},s.d=function(l,c){for(var d in c)s.o(c,d)&&!s.o(l,d)&&Object.defineProperty(l,d,{enumerable:!0,get:c[d]})},s.o=function(l,c){return Object.prototype.hasOwnProperty.call(l,c)},s.r=function(l){typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(l,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(l,"__esModule",{value:!0})};var o={};return(function(){s.r(o),s.d(o,{KeyboardReact:function(){return v},default:function(){return g}}),s(981);var l=s(442),c=s(548),d=s.n(c);function u(b){return u=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(_){return typeof _}:function(_){return _&&typeof Symbol=="function"&&_.constructor===Symbol&&_!==Symbol.prototype?"symbol":typeof _},u(b)}function m(b,_){var N=Object.keys(b);if(Object.getOwnPropertySymbols){var P=Object.getOwnPropertySymbols(b);_&&(P=P.filter((function(k){return Object.getOwnPropertyDescriptor(b,k).enumerable}))),N.push.apply(N,P)}return N}function p(b){for(var _=1;_{t?.(e)},[e,t]);const m=w.useCallback(v=>{if(s.current)return;const g=v.target;if(!g.closest('[data-vkb="false"]')){if(g instanceof HTMLInputElement){if(!grt.has(g.type))return}else if(!(g instanceof HTMLTextAreaElement))return;c.current=g,n(!0),l("default"),d.current?.setInput?.(c.current.value),setTimeout(()=>{(g.closest(".bg-zinc-800, .rounded-lg, [data-vkb-group]")??g).scrollIntoView({behavior:"smooth",block:"nearest"})},100)}},[]),p=w.useCallback(()=>{setTimeout(()=>{const v=document.activeElement;v&&(u.current?.contains(v)||v===c.current)||(n(!1),c.current=null)},150)},[]);w.useEffect(()=>(document.addEventListener("focusin",m),document.addEventListener("focusout",p),()=>{document.removeEventListener("focusin",m),document.removeEventListener("focusout",p)}),[m,p]);const f=w.useCallback(()=>{s.current=!0,i(!0),c.current?.blur(),c.current=null,setTimeout(()=>{n(!1),i(!1),s.current=!1},400)},[]),y=w.useCallback(v=>{const g=c.current;if(g){if(v==="{shift}"){l(b=>b==="default"?"shift":"default");return}if(v==="{lock}"){l(b=>b==="default"?"shift":"default");return}if(v==="{close}"){f();return}v==="{bksp}"?b3(g,g.value.slice(0,-1)):v==="{space}"?b3(g,g.value+" "):(b3(g,g.value+v),o==="shift"&&l("default")),g.focus(),d.current?.setInput?.(g.value)}},[o,f]);return e?a.jsxs(a.Fragment,{children:[a.jsx("div",{className:"fixed inset-0 z-[9998] bg-transparent",onMouseDown:v=>{v.preventDefault(),v.stopPropagation(),r||f()},onTouchStart:v=>{v.preventDefault(),v.stopPropagation(),r||f()},onClick:v=>{v.preventDefault(),v.stopPropagation()}}),!r&&a.jsx("div",{ref:u,className:"relative z-[9999] shrink-0",onMouseDown:v=>v.preventDefault(),onTouchStart:v=>{v.target.closest(".hg-button")||v.preventDefault()},children:a.jsx(frt,{keyboardRef:v=>{d.current=v},layoutName:o,onKeyPress:y,theme:"simple-keyboard vkb-theme",layout:{default:["1 2 3 4 5 6 7 8 9 0 {bksp}","q w e r t y u i o p","{lock} a s d f g h j k l","{shift} z x c v b n m . @","{space} {close}"],shift:["! @ # $ % ^ & * ( ) {bksp}","Q W E R T Y U I O P","{lock} A S D F G H J K L","{shift} Z X C V B N M , _","{space} {close}"]},display:{"{bksp}":"⌫","{close}":"✕ Close","{shift}":"⇧","{lock}":"⇪","{space}":" "}})})]}):null}function xrt(){const[t,e]=w.useState(null),[n,r]=w.useState(null),[i,s]=w.useState(!1),[o,l]=w.useState(100),[c,d]=w.useState(0),u=w.useRef(Date.now()),{i18n:m}=Rt(),p=Uo(),f=qc(),y=urt(),{data:v}=Je({queryKey:["settings"],queryFn:he.getSettings});w.useEffect(()=>{v?.language&&v.language!==m.language&&m.changeLanguage(v.language)},[v?.language,m]);const{data:g=[]}=Je({queryKey:["spoolbuddy-devices"],queryFn:()=>ka.getDevices(),refetchInterval:3e4}),b=g[0],_=y.deviceOnline||!!b?.online,N=w.useMemo(()=>({...y,deviceOnline:_}),[y,_]),P=w.useRef(!1);w.useEffect(()=>{b&&!P.current&&(l(b.display_brightness),d(b.display_blank_timeout),P.current=!0)},[b]),w.useEffect(()=>{const ge=document.documentElement,Ne=ge.classList.contains("dark");return ge.classList.add("dark"),()=>{Ne||ge.classList.remove("dark")}},[]);const{data:k}=Je({queryKey:["spoolbuddy-update-check",b?.device_id],queryFn:()=>b?ka.checkDaemonUpdate(b.device_id):Promise.resolve(null),enabled:!!b,refetchInterval:300*1e3,staleTime:0}),M=w.useRef(null);w.useEffect(()=>{if(_)if(k?.update_available&&k.latest_version){const ge=`Update available: v${k.latest_version}`;r({type:"info",message:ge}),M.current=ge}else M.current&&(r(null),M.current=null);else{const ge="SpoolBuddy device disconnected";r({type:"warning",message:ge}),M.current=ge}},[_,k?.update_available,k?.latest_version]);const T=w.useCallback(()=>{u.current=Date.now(),s(!1)},[]);w.useEffect(()=>(window.addEventListener("pointerdown",T),window.addEventListener("keydown",T),()=>{window.removeEventListener("pointerdown",T),window.removeEventListener("keydown",T)}),[T]);const A=!!(y.matchedSpool||y.unknownTagUid),C=w.useRef(!1);w.useEffect(()=>{A&&!C.current&&(T(),f.pathname!=="/spoolbuddy"&&p("/spoolbuddy")),C.current=A},[A,f.pathname,p,T]),w.useEffect(()=>{if(c<=0)return;const ge=setInterval(()=>{Date.now()-u.current>=c*1e3&&s(!0)},1e3);return()=>clearInterval(ge)},[c]);const{data:F=[]}=Je({queryKey:["printers"],queryFn:()=>he.getPrinters()}),$=ip({queries:F.map(ge=>({queryKey:["printerStatus",ge.id],queryFn:()=>he.getPrinterStatus(ge.id),refetchInterval:1e4,select:Ne=>({connected:Ne?.connected})}))}),I=w.useMemo(()=>F.filter((ge,Ne)=>$[Ne]?.data?.connected),[F,$]),Q=w.useRef(null),L=w.useRef(!1),re=50,ae=w.useRef(null),ee=w.useCallback(ge=>{Q.current={x:ge.touches[0].clientX,y:ge.touches[0].clientY},L.current=!1},[]),de=w.useCallback(ge=>{if(!Q.current)return;const Ne=ge.changedTouches[0].clientX-Q.current.x,B=ge.changedTouches[0].clientY-Q.current.y,W=Q.current.y;if(Q.current=null,L.current=!1,B>=re&&Math.abs(B)>Math.abs(Ne)&&W<80){te(!0);return}if(I.length<2||Math.abs(Ne)Math.abs(Ne))return;const D=I.findIndex(z=>z.id===t),j=Ne<0?(D+1)%I.length:(D-1+I.length)%I.length;e(I[j].id)},[I,t,e]);w.useEffect(()=>{const ge=ae.current;if(!ge)return;const Ne=B=>{if(!Q.current)return;const W=Math.abs(B.touches[0].clientX-Q.current.x),D=Math.abs(B.touches[0].clientY-Q.current.y);if(L.current){B.preventDefault();return}W>10&&W>D&&(L.current=!0,B.preventDefault())};return ge.addEventListener("touchmove",Ne,{passive:!1}),()=>ge.removeEventListener("touchmove",Ne)},[]);const[le,ue]=w.useState(!1),[Y,te]=w.useState(!1),se=o<100?{filter:`brightness(${o/100})`}:void 0;return a.jsxs(a.Fragment,{children:[a.jsxs("div",{ref:ae,"data-spoolbuddy-kiosk":!0,className:"w-screen h-screen bg-bambu-dark text-white flex flex-col overflow-hidden",style:{...se,overscrollBehaviorX:"none"},onTouchStart:ee,onTouchEnd:de,children:[a.jsx(art,{selectedPrinterId:t,onPrinterChange:e,deviceOnline:_}),a.jsx("main",{className:"flex-1 overflow-y-auto",children:a.jsx(HX,{context:{selectedPrinterId:t,setSelectedPrinterId:e,sbState:N,setAlert:r,displayBrightness:o,setDisplayBrightness:l,displayBlankTimeout:c,setDisplayBlankTimeout:d}})}),!le&&a.jsx(ort,{alert:n}),!le&&a.jsx(srt,{}),a.jsx(brt,{onVisibilityChange:ue})]}),a.jsx(lrt,{isOpen:Y,onClose:()=>te(!1),deviceId:b?.device_id??null,deviceOnline:_}),i&&a.jsx("div",{className:"fixed inset-0 bg-black z-[9999]",onPointerDown:ge=>{ge.stopPropagation(),T()}})]})}function nA({color:t,isEmpty:e,size:n=32}){return e?a.jsx("div",{className:"rounded-full border-2 border-dashed border-zinc-500 flex items-center justify-center",style:{width:n,height:n},children:a.jsx("div",{className:"w-2 h-2 rounded-full bg-zinc-600"})}):a.jsxs("svg",{width:n,height:n,viewBox:"0 0 32 32",children:[a.jsx("circle",{cx:"16",cy:"16",r:"14",fill:t,stroke:"white",strokeWidth:"1.5",strokeOpacity:"0.7"}),a.jsx("circle",{cx:"16",cy:"16",r:"11",fill:t,style:{filter:"brightness(0.85)"}})]})}const yrt="spoolbuddy-default-core-weight";function Mle(){try{const t=localStorage.getItem(yrt);if(t){const e=parseInt(t,10);if(e>=0&&e<=500)return e}}catch{}return 250}function vrt({spool:t,scaleWeight:e,onClose:n,onSyncWeight:r,onAssignToAms:i}){const{t:s}=Rt(),[o,l]=w.useState(!1),[c,d]=w.useState(!1),u=t.rgba?`#${t.rgba.slice(0,6)}`:"#808080",m=t.core_weight&&t.core_weight>0?t.core_weight:Mle(),p=e!==null?Math.round(Math.max(0,e)):null,f=p!==null?Math.round(Math.max(0,p-m)):null,y=Math.round(t.label_weight||1e3),v=f!==null?Math.min(100,Math.round(f/y*100)):null,g=v!==null?v>50?"#22c55e":v>20?"#eab308":"#ef4444":"#808080",_=Math.max(0,(t.label_weight||0)-(t.weight_used||0))+m,N=p!==null?p-_:null,P=N!==null?Math.abs(N)<=50:null,k=async()=>{if(e!==null){l(!0);try{await ka.updateSpoolWeight(t.id,Math.round(e)),d(!0),r?.(),setTimeout(()=>d(!1),3e3)}catch(M){console.error("Failed to sync weight:",M)}finally{l(!1)}}};return a.jsxs("div",{className:"flex flex-col items-center space-y-4 max-w-md",children:[a.jsxs("div",{className:"flex items-start gap-5",children:[a.jsxs("div",{className:"relative shrink-0",children:[a.jsx(nA,{color:u,isEmpty:!1,size:100}),v!==null&&a.jsxs("div",{className:"absolute -bottom-2 -right-2 px-2 py-0.5 rounded-full text-xs font-bold text-white shadow-lg",style:{backgroundColor:g},children:[v,"%"]})]}),a.jsxs("div",{className:"flex-1 min-w-0 pt-1",children:[a.jsx("h3",{className:"text-lg font-semibold text-zinc-100",children:t.color_name||"Unknown color"}),a.jsxs("p",{className:"text-sm text-zinc-400",children:[t.brand," • ",t.material,t.subtype&&` ${t.subtype}`]}),f!==null&&a.jsxs("div",{className:"mt-3",children:[a.jsxs("div",{className:"flex items-baseline gap-2",children:[a.jsxs("span",{className:"text-3xl font-bold font-mono text-zinc-100",children:[f,"g"]}),a.jsxs("span",{className:"text-sm text-zinc-500",children:["/ ",y,"g"]})]}),a.jsx("p",{className:"text-xs text-zinc-500 mt-0.5",children:s("spoolbuddy.spool.remaining","Remaining")}),a.jsx("div",{className:"mt-2 max-w-xs",children:a.jsx("div",{className:"h-2 bg-zinc-700 rounded-full overflow-hidden",children:a.jsx("div",{className:"h-full rounded-full transition-all duration-500",style:{width:`${v}%`,backgroundColor:g}})})})]})]})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-x-6 gap-y-2 text-sm bg-zinc-800 rounded-lg p-4 w-full",children:[a.jsxs("div",{className:"flex justify-between",children:[a.jsx("span",{className:"text-zinc-500",children:s("spoolbuddy.dashboard.grossWeight","Gross weight")}),a.jsx("span",{className:"font-mono text-zinc-300",children:p!==null?`${p}g`:"—"})]}),a.jsxs("div",{className:"flex justify-between",children:[a.jsx("span",{className:"text-zinc-500",children:s("spoolbuddy.spool.coreWeight","Core")}),a.jsxs("span",{className:"font-mono text-zinc-300",children:[m,"g"]})]}),a.jsxs("div",{className:"flex justify-between",children:[a.jsx("span",{className:"text-zinc-500",children:s("spoolbuddy.dashboard.spoolSize","Spool size")}),a.jsxs("span",{className:"font-mono text-zinc-300",children:[y,"g"]})]}),a.jsxs("div",{className:"flex justify-between items-center",children:[a.jsx("span",{className:"text-zinc-500",children:s("spoolbuddy.spool.scaleWeight","Scale")}),p!==null?a.jsxs("span",{className:`flex items-center gap-1 font-mono ${P?"text-green-500":"text-yellow-500"}`,children:[p,"g",P?a.jsx(Xr,{className:"w-3.5 h-3.5"}):a.jsxs(a.Fragment,{children:[a.jsx(Fn,{className:"w-3.5 h-3.5"}),a.jsx("button",{onClick:k,className:"p-1 hover:bg-green-500/20 rounded transition-colors text-green-500",title:s("spoolbuddy.dashboard.syncWeight","Sync Weight"),children:a.jsx(wr,{className:"w-4 h-4"})})]})]}):a.jsx("span",{className:"text-zinc-500",children:"—"})]}),a.jsxs("div",{className:"flex justify-between items-center",children:[a.jsx("span",{className:"text-zinc-500",children:s("spoolbuddy.dashboard.tagId","Tag")}),a.jsx("span",{className:"font-mono text-xs text-zinc-400 truncate max-w-[120px]",title:t.tag_uid||"",children:t.tag_uid?t.tag_uid.slice(-8):"—"})]})]}),a.jsxs("div",{className:"flex gap-2 justify-center",children:[i&&a.jsx("button",{onClick:i,className:"px-5 py-2.5 rounded-lg text-sm font-medium bg-green-600 text-white hover:bg-green-700 transition-colors min-h-[44px]",children:s("spoolbuddy.modal.assignToAms","Assign to AMS")}),a.jsx("button",{onClick:k,disabled:e===null||o,className:`px-5 py-2.5 rounded-lg text-sm font-medium transition-colors min-h-[44px] ${c?"bg-green-600/20 text-green-400":i?"bg-zinc-700 text-zinc-300 hover:bg-zinc-600 disabled:opacity-40 disabled:cursor-not-allowed":"bg-green-600 text-white hover:bg-green-700 disabled:opacity-40 disabled:cursor-not-allowed"}`,children:o?"...":c?s("spoolbuddy.dashboard.weightSynced","Synced!"):s("spoolbuddy.dashboard.syncWeight","Sync Weight")}),n&&a.jsx("button",{onClick:n,className:"px-5 py-2.5 rounded-lg text-sm font-medium bg-zinc-700 text-zinc-300 hover:bg-zinc-600 transition-colors min-h-[44px]",children:s("spoolbuddy.dashboard.close","Close")})]})]})}function wrt({tagUid:t,scaleWeight:e,coreWeight:n,onLinkSpool:r,onAddToInventory:i,onClose:s}){const{t:o}=Rt(),l=n??Mle(),c=e!==null?Math.round(Math.max(0,e)):null,d=c!==null?Math.round(Math.max(0,c-l)):null;return a.jsxs("div",{className:"flex flex-col items-center text-center space-y-5",children:[a.jsx("div",{className:"w-20 h-20 rounded-2xl bg-green-500/15 flex items-center justify-center",children:a.jsx("svg",{className:"w-10 h-10 text-green-500",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:a.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"2",d:"M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A2 2 0 013 12V7a4 4 0 014-4z"})})}),a.jsxs("div",{children:[a.jsx("h3",{className:"text-lg font-semibold text-zinc-100",children:o("spoolbuddy.dashboard.newTag","New Tag Detected")}),a.jsx("p",{className:"text-sm text-zinc-500 font-mono mt-1",children:t})]}),c!==null&&a.jsxs("div",{className:"text-sm text-zinc-400",children:[a.jsxs("span",{className:"font-mono font-semibold",children:[c,"g"]})," ",o("spoolbuddy.dashboard.onScale","on scale"),d!==null&&d>0&&a.jsxs("span",{className:"text-zinc-500",children:[" • ~",d,"g filament"]})]}),a.jsxs("div",{className:"flex flex-wrap gap-2 justify-center",children:[i&&a.jsx("button",{onClick:i,className:"px-5 py-2.5 rounded-lg text-sm font-medium bg-green-600 text-white hover:bg-green-700 transition-colors min-h-[44px]",children:o("spoolbuddy.modal.addToInventory","Add to Inventory")}),r&&a.jsxs("button",{onClick:r,className:"px-5 py-2.5 rounded-lg text-sm font-medium bg-zinc-700 text-zinc-300 hover:bg-zinc-600 transition-colors min-h-[44px]",children:[a.jsx("svg",{className:"w-4 h-4 inline-block mr-1.5 -mt-0.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:a.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"2",d:"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"})}),o("spoolbuddy.dashboard.linkSpool","Link to Spool")]}),s&&a.jsx("button",{onClick:s,className:"px-5 py-2.5 rounded-lg text-sm font-medium bg-zinc-700 text-zinc-300 hover:bg-zinc-600 transition-colors min-h-[44px]",children:o("spoolbuddy.dashboard.close","Close")})]})]})}function Srt(t){return t?`#${t.slice(0,6)}`:"#808080"}function jle(t){return!t.tray_type||t.tray_type===""}function _rt(t){return t<=3?`AMS ${String.fromCharCode(65+t)}`:t>=128&&t<=135?`AMS HT ${String.fromCharCode(65+t-128)}`:`AMS ${t}`}function Nrt({className:t}){return a.jsx("svg",{className:t,viewBox:"0 0 36 54",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:a.jsx("path",{d:"M17.8131 0.00538C18.4463 -0.15091 20.3648 3.14642 20.8264 3.84781C25.4187 10.816 35.3089 26.9368 35.9383 34.8694C37.4182 53.5822 11.882 61.3357 2.53721 45.3789C-1.73471 38.0791 0.016 32.2049 3.178 25.0232C6.99221 16.3662 12.6411 7.90372 17.8131 0.00538ZM18.3738 7.24807L17.5881 7.48441C14.4452 12.9431 10.917 18.2341 8.19369 23.9368C4.6808 31.29 1.18317 38.5479 7.69403 45.5657C17.3058 55.9228 34.9847 46.8808 31.4604 32.8681C29.2558 24.0969 22.4207 15.2913 18.3776 7.24807H18.3738Z",fill:"#C3C2C1"})})}function krt({className:t}){return a.jsxs("svg",{className:t,viewBox:"0 0 35 53",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[a.jsx("path",{d:"M17.3165 0.0038C17.932 -0.14959 19.7971 3.08645 20.2458 3.77481C24.7103 10.6135 34.3251 26.4346 34.937 34.2198C36.3757 52.5848 11.5505 60.1942 2.46584 44.534C-1.68714 37.3735 0.0148 31.6085 3.08879 24.5603C6.79681 16.0605 12.2884 7.75907 17.3165 0.0038ZM17.8615 7.11561L17.0977 7.34755C14.0423 12.7048 10.6124 17.8974 7.96483 23.4941C4.54975 30.7107 1.14949 37.8337 7.47908 44.721C16.8233 54.8856 34.01 46.0117 30.5838 32.2595C28.4405 23.6512 21.7957 15.0093 17.8652 7.11561H17.8615Z",fill:"#C3C2C1"}),a.jsx("path",{d:"M5.03547 30.112C9.64453 30.4936 11.632 35.7985 16.4154 35.791C19.6339 35.7873 20.2161 33.2283 22.3853 31.6197C31.6776 24.7286 33.5835 37.4894 27.9881 44.4254C18.1878 56.5653 -1.16063 44.6013 5.03917 30.1158L5.03547 30.112Z",fill:"#1F8FEB"})]})}function Crt({className:t}){return a.jsxs("svg",{className:t,viewBox:"0 0 36 54",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[a.jsx("path",{d:"M17.9625 4.48059L4.77216 26.3154L2.08228 40.2175L10.0224 50.8414H23.1594L33.3246 42.1693V30.2455L17.9625 4.48059Z",fill:"#1F8FEB"}),a.jsx("path",{d:"M17.7948 0.00538C18.4273 -0.15091 20.3438 3.14642 20.8048 3.84781C25.3921 10.816 35.2715 26.9368 35.9001 34.8694C37.3784 53.5822 11.8702 61.3357 2.53562 45.3789C-1.73163 38.0829 0.0134 32.2087 3.1757 25.027C6.98574 16.3662 12.6284 7.90372 17.7948 0.00538ZM18.3549 7.24807L17.57 7.48441C14.4306 12.9431 10.9063 18.2341 8.1859 23.9368C4.67686 31.29 1.18305 38.5479 7.68679 45.5657C17.2881 55.9228 34.9476 46.8808 31.4271 32.8681C29.2249 24.0969 22.3974 15.2913 18.3587 7.24807H18.3549Z",fill:"#C3C2C1"})]})}function Prt({className:t}){return a.jsxs("svg",{className:t,viewBox:"0 0 12 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[a.jsx("path",{d:"M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z",stroke:"#C3C2C1",strokeWidth:"1",fill:"none"}),a.jsx("circle",{cx:"6",cy:"15",r:"2.5",stroke:"#C3C2C1",strokeWidth:"1",fill:"none"})]})}function Trt({className:t}){return a.jsxs("svg",{className:t,viewBox:"0 0 12 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[a.jsx("rect",{x:"4.5",y:"8",width:"3",height:"4.5",fill:"#d4a017",rx:"0.5"}),a.jsx("circle",{cx:"6",cy:"15",r:"2",fill:"#d4a017"}),a.jsx("path",{d:"M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z",stroke:"#C3C2C1",strokeWidth:"1",fill:"none"})]})}function Art({className:t}){return a.jsxs("svg",{className:t,viewBox:"0 0 12 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[a.jsx("rect",{x:"4.5",y:"3",width:"3",height:"9.5",fill:"#c62828",rx:"0.5"}),a.jsx("circle",{cx:"6",cy:"15",r:"2",fill:"#c62828"}),a.jsx("path",{d:"M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z",stroke:"#C3C2C1",strokeWidth:"1",fill:"none"})]})}function Ele({humidity:t,goodThreshold:e=40,fairThreshold:n=60}){let r,i;return t<=e?(r="#22a352",i=Nrt):t<=n?(r="#d4a017",i=krt):(r="#c62828",i=Crt),a.jsxs("div",{className:"flex items-center gap-0.5",children:[a.jsx(i,{className:"w-3 h-3.5"}),a.jsxs("span",{className:"font-medium tabular-nums text-xs",style:{color:r},children:[t,"%"]})]})}function Dle({temp:t,goodThreshold:e=28,fairThreshold:n=35}){let r,i;return t<=e?(r="#22a352",i=Prt):t<=n?(r="#d4a017",i=Trt):(r="#c62828",i=Art),a.jsxs("div",{className:"flex items-center gap-0.5",children:[a.jsx(i,{className:"w-3 h-3.5"}),a.jsxs("span",{className:"font-medium tabular-nums text-xs",style:{color:r},children:[t,"°C"]})]})}function Kz({side:t}){return a.jsx("span",{className:"inline-flex items-center justify-center w-4 h-4 text-[9px] font-bold rounded",style:{backgroundColor:"#1a4d2e",color:"#00ae42"},children:t})}function Mrt({tray:t,slotIndex:e,isActive:n,fillOverride:r,spoolmanFill:i,onClick:s}){const o=jle(t),l=Srt(t.tray_color),c=t.remain!==null&&t.remain!==void 0&&t.remain>=0?t.remain:null,d=r===0&&c!==null&&c>0?null:r,u=i??d??c;return a.jsxs("div",{className:`relative flex flex-col items-center p-2.5 rounded-lg transition-all ${n?"ring-2 ring-bambu-green":""} ${s?"cursor-pointer hover:bg-white/5":""}`,onClick:s,children:[a.jsxs("div",{className:"relative w-16 h-16 mb-1",children:[o?a.jsx("div",{className:"w-full h-full rounded-full border-2 border-dashed border-gray-500 flex items-center justify-center",children:a.jsx("div",{className:"w-3 h-3 rounded-full bg-gray-600"})}):a.jsxs("svg",{viewBox:"0 0 56 56",className:"w-full h-full",children:[a.jsx("circle",{cx:"28",cy:"28",r:"26",fill:l}),a.jsx("circle",{cx:"28",cy:"28",r:"20",fill:l,style:{filter:"brightness(0.85)"}}),a.jsx("ellipse",{cx:"20",cy:"20",rx:"6",ry:"4",fill:"white",opacity:"0.3"}),a.jsx("circle",{cx:"28",cy:"28",r:"8",fill:"#2d2d2d"}),a.jsx("circle",{cx:"28",cy:"28",r:"5",fill:"#1a1a1a"})]}),n&&a.jsx("div",{className:"absolute -bottom-1 left-1/2 -translate-x-1/2 w-2.5 h-2.5 bg-bambu-green rounded-full"})]}),a.jsx("span",{className:"text-sm text-white/70 truncate max-w-full",children:o?"Empty":t.tray_type||"Unknown"}),!o&&u!==null&&u>=0&&a.jsx("div",{className:"w-full h-1 bg-bambu-dark-tertiary rounded-full overflow-hidden mt-1",children:a.jsx("div",{className:"h-full rounded-full transition-all",style:{width:`${u}%`,backgroundColor:hx(u)}})}),a.jsx("span",{className:"absolute top-1 right-1 text-xs text-white/30",children:e+1})]})}function Fle({unit:t,activeSlot:e,onConfigureSlot:n,isDualNozzle:r,nozzleSide:i,thresholds:s,fillOverrides:o,spoolmanFillOverrides:l}){const c=t.tray||[],d=t.is_ams_ht,u=d?1:4;return a.jsxs("div",{className:"bg-bambu-dark-secondary rounded-lg p-3",children:[a.jsxs("div",{className:"flex items-center justify-between mb-2",children:[a.jsxs("div",{className:"flex items-center gap-1.5",children:[a.jsx("span",{className:"text-white font-medium text-base",children:_rt(t.id)}),r&&i&&a.jsx(Kz,{side:i})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[t.temp!=null&&a.jsx(Dle,{temp:t.temp,goodThreshold:s?.tempGood,fairThreshold:s?.tempFair}),t.humidity!=null&&a.jsx(Ele,{humidity:t.humidity,goodThreshold:s?.humidityGood,fairThreshold:s?.humidityFair})]})]}),a.jsx("div",{className:`grid ${d?"grid-cols-1 max-w-[100px] mx-auto":"grid-cols-4"} gap-2`,children:Array.from({length:u}).map((m,p)=>{const f=c[p]||{id:p,tray_color:null,tray_type:"",tray_sub_brands:null,tray_id_name:null,tray_info_idx:null,remain:-1,k:null,cali_idx:null,tag_uid:null,tray_uuid:null,nozzle_temp_min:null,nozzle_temp_max:null};return a.jsx(Mrt,{tray:f,slotIndex:p,isActive:e===p,fillOverride:o?.[`${t.id}-${p}`]??null,spoolmanFill:l?.[`${t.id}-${p}`]??null,onClick:n?()=>n(t.id,p,jle(f)?null:f):void 0},p)})})]})}function x3(t){return t<=3?`AMS ${String.fromCharCode(65+t)}`:t>=128&&t<=135?`AMS HT ${String.fromCharCode(65+t-128)}`:`AMS ${t}`}function y3(t){return!t.tray_type||t.tray_type===""}function jrt(t){return t?`#${t.slice(0,6)}`:"#808080"}const gP=t=>(t??"").trim().toUpperCase();function Ert(t,e){const n=gP(t),r=gP(e);return!n||!r?"none":n===r?"exact":r.includes(n)||n.includes(r)?"partial":"none"}function Drt(t,e){const n=gP(t),r=gP(e);return!n||!r?!1:n===r}function Rle({isOpen:t,onClose:e,spool:n,printerId:r}){const{t:i}=Rt(),s=mn(),[o,l]=w.useState(null),[c,d]=w.useState(null),[u,m]=w.useState(!1),[p,f]=w.useState(null),[y,v]=w.useState(null);w.useEffect(()=>{t&&(l(null),d(null),m(!1),f(null),v(null))},[t]);const g=w.useCallback(Ne=>{Ne.key==="Escape"&&e()},[e]);w.useEffect(()=>(t&&document.addEventListener("keydown",g),()=>document.removeEventListener("keydown",g)),[t,g]);const{data:b}=Je({queryKey:["printerStatus",r],queryFn:()=>he.getPrinterStatus(r),enabled:t&&r!==null,refetchInterval:5e3}),{data:_}=Je({queryKey:["printer",r],queryFn:()=>he.getPrinter(r),enabled:t&&r!==null}),{data:N}=Je({queryKey:["settings"],queryFn:()=>he.getSettings(),enabled:t,staleTime:300*1e3}),{data:P}=Je({queryKey:["spool-assignments",r],queryFn:()=>he.getAssignments(r),enabled:t&&r!==null,staleTime:30*1e3}),k=w.useMemo(()=>{const Ne={};if(!P)return Ne;for(const B of P){const W=B.spool;if(W&&W.label_weight>0&&W.weight_used!=null){const D=Math.round(Math.max(0,W.label_weight-W.weight_used)/W.label_weight*100);Ne[`${B.ams_id}-${B.tray_id}`]=D}}return Ne},[P]),M=N?{humidityGood:Number(N.ams_humidity_good)||40,humidityFair:Number(N.ams_humidity_fair)||60,tempGood:Number(N.ams_temp_good)||28,tempFair:Number(N.ams_temp_fair)||35}:void 0,T=b?.connected??!1,A=w.useMemo(()=>b?.ams??[],[b?.ams]),C=w.useMemo(()=>A.filter(Ne=>!Ne.is_ams_ht),[A]),F=w.useMemo(()=>A.filter(Ne=>Ne.is_ams_ht),[A]),$=w.useMemo(()=>[...b?.vt_tray??[]].sort((Ne,B)=>(Ne.id??254)-(B.id??254)),[b?.vt_tray]),I=_?.nozzle_count===2||b?.temperatures?.nozzle_2!==void 0,Q=w.useRef({});w.useEffect(()=>{b?.ams_extruder_map&&Object.keys(b.ams_extruder_map).length>0&&(Q.current=b.ams_extruder_map)},[b?.ams_extruder_map]);const L=b?.ams_extruder_map&&Object.keys(b.ams_extruder_map).length>0?b.ams_extruder_map:Q.current,re=w.useCallback(Ne=>{if(!I)return null;const B=L[String(Ne)],W=Ne>=128?Ne-128:Ne;return(B!==void 0?B:W)===1?"L":"R"},[I,L]),ae=ct({mutationFn:async({amsId:Ne,trayId:B})=>{if(!r)throw new Error("No printer selected");await he.assignSpool({spool_id:n.id,printer_id:r,ams_id:Ne,tray_id:B})},onSuccess:()=>{d("success"),l(i("spoolbuddy.modal.assignSuccess","Assigned!")),s.invalidateQueries({queryKey:["slotPresets"]}),setTimeout(()=>e(),1500)},onError:Ne=>{d("error"),l(Ne instanceof Error?Ne.message:i("spoolbuddy.modal.assignError","Failed to assign spool."))}}),ee=ae.isPending,de=w.useCallback((Ne,B)=>{if(Ne===254||Ne===255){const D=Ne===254?254:254+B;return $.find(j=>(j.id??254)===D)||null}return A.find(D=>D.id===Ne)?.tray?.find(D=>D.id===B)||null},[A,$]),le=w.useCallback((Ne,B)=>Ne<=3?`${x3(Ne)} ${i("ams.slot","Slot")} ${B+1}`:Ne>=128&&Ne<=135?x3(Ne):Ne===254?i("printers.extL","Ext-L"):I?i("printers.extR","Ext-R"):i("printers.ext","Ext"),[i,I]),ue=w.useCallback((Ne,B)=>{d("info"),l(i("spoolbuddy.modal.assigning","Configuring slot...")),ae.mutate({amsId:Ne,trayId:B})},[ae,i]),Y=w.useCallback((Ne,B)=>{if(!ee){if(!N?.disable_filament_warnings){const W=de(Ne,B);if(W&&!y3(W)){const D=W.tray_sub_brands||W.tray_type||"",j=Ert(n.material,D),z=n.slicer_filament_name||n.slicer_filament,K=W.tray_type||"",q=Drt(z,K);if(j!=="exact"||!q){let ce="profile";j==="none"&&!q?ce="material_profile":j==="partial"&&!q?ce="partial_profile":j==="none"?ce="material":j==="partial"&&(ce="partial");const O=le(Ne,B);v({amsId:Ne,trayId:B}),f({type:ce,spoolMaterial:n.material||"",trayMaterial:D||"",spoolProfile:z||void 0,trayProfile:K||void 0,location:O}),m(!0);return}}}ue(Ne,B)}},[ee,N?.disable_filament_warnings,n,de,le,ue]),te=w.useCallback(()=>{y&&(m(!1),f(null),ue(y.amsId,y.trayId),v(null))},[y,ue]),se=w.useMemo(()=>{const Ne=[];for(const B of F){const W=B.tray?.[0]||{id:0,tray_color:null,tray_type:"",tray_sub_brands:null,tray_id_name:null,tray_info_idx:null,remain:-1,k:null,cali_idx:null,tag_uid:null,tray_uuid:null,nozzle_temp_min:null,nozzle_temp_max:null},D=k[`${B.id}-0`]??null,j=W.remain!=null&&W.remain>=0?W.remain:null,z=D===0&&j!==null&&j>0?null:D;Ne.push({key:`ht-${B.id}`,label:x3(B.id),amsId:B.id,trayId:0,tray:W,isEmpty:y3(W),nozzleSide:re(B.id),effectiveFill:z??j})}for(const B of $){const W=B.id??254,D=W-254,j=k[`255-${D}`]??null,z=B.remain!=null&&B.remain>=0?B.remain:null,K=j===0&&z!==null&&z>0?null:j;Ne.push({key:`ext-${W}`,label:I?W===254?i("printers.extL","Ext-L"):i("printers.extR","Ext-R"):i("printers.ext","Ext"),amsId:255,trayId:D,tray:B,isEmpty:y3(B),nozzleSide:I?W===254?"L":"R":null,effectiveFill:K??z})}return Ne},[F,$,I,i,re,k]);if(!t)return null;const ge=n.rgba?`#${n.rgba.slice(0,6)}`:"#808080";return a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"fixed inset-0 z-[60] bg-bambu-dark flex flex-col",children:[a.jsxs("div",{className:"flex items-center justify-between px-5 py-3 border-b border-zinc-800 shrink-0",children:[a.jsxs("div",{className:"flex items-center gap-3 min-w-0",children:[a.jsx("div",{className:"w-7 h-7 rounded-full shrink-0",style:{backgroundColor:ge}}),a.jsx("div",{className:"min-w-0",children:a.jsxs("h2",{className:"text-sm font-semibold text-zinc-100 truncate",children:[i("spoolbuddy.modal.assignToAmsTitle","Assign to AMS"),a.jsxs("span",{className:"font-normal text-zinc-500 ml-2",children:[n.color_name||"Unknown"," • ",n.brand," ",n.material,n.subtype&&` ${n.subtype}`]})]})})]}),a.jsx("button",{onClick:e,disabled:ee,className:"p-2 rounded-lg text-zinc-500 hover:text-zinc-300 hover:bg-zinc-800 transition-colors shrink-0 disabled:opacity-50",children:a.jsx(Ht,{className:"w-5 h-5"})})]}),o&&a.jsxs("div",{className:`mx-5 mt-3 p-3 rounded-lg flex items-center gap-3 border shrink-0 ${c==="info"?"bg-blue-500/10 border-blue-500/40":c==="success"?"bg-green-500/10 border-green-500/40":"bg-red-500/10 border-red-500/40"}`,children:[c==="info"&&a.jsx(dt,{className:"w-4 h-4 text-blue-400 animate-spin shrink-0"}),c==="success"&&a.jsx(br,{className:"w-4 h-4 text-green-400 shrink-0"}),c==="error"&&a.jsx(Ka,{className:"w-4 h-4 text-red-400 shrink-0"}),a.jsx("span",{className:`text-sm ${c==="info"?"text-blue-300":c==="success"?"text-green-300":"text-red-300"}`,children:o})]}),a.jsx("div",{className:"flex-1 flex flex-col gap-3 p-4 min-h-0 overflow-y-auto",children:!T&&r?a.jsx("div",{className:"flex-1 flex items-center justify-center",children:a.jsx("div",{className:"text-center text-white/50",children:a.jsx("p",{className:"text-lg mb-2",children:i("spoolbuddy.ams.printerDisconnected","Printer disconnected")})})}):A.length===0&&$.length===0?a.jsx("div",{className:"flex-1 flex items-center justify-center",children:a.jsxs("div",{className:"text-center text-white/50",children:[a.jsx(na,{className:"w-12 h-12 mx-auto mb-3 opacity-50"}),a.jsx("p",{className:"text-lg mb-2",children:i("spoolbuddy.ams.noData","No AMS detected")}),a.jsx("p",{className:"text-sm",children:i("spoolbuddy.ams.connectAms","Connect an AMS to see filament slots")})]})}):a.jsxs(a.Fragment,{children:[C.length>0&&a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-3 flex-1 min-h-0",children:C.map(Ne=>a.jsx(Fle,{unit:Ne,activeSlot:null,onConfigureSlot:(B,W)=>Y(Ne.id,W),isDualNozzle:I,nozzleSide:re(Ne.id),thresholds:M,fillOverrides:k},Ne.id))}),se.length>0&&a.jsx("div",{className:"flex gap-2 shrink-0",children:se.map(({key:Ne,label:B,amsId:W,trayId:D,tray:j,isEmpty:z,nozzleSide:K,effectiveFill:q})=>{const ce=jrt(j.tray_color);return a.jsxs("div",{onClick:()=>Y(W,D),className:`bg-bambu-dark-secondary rounded-lg px-3 py-2 cursor-pointer hover:bg-bambu-dark-secondary/80 transition-all flex items-center gap-2 ${ee?"opacity-50 pointer-events-none":""}`,children:[a.jsx("div",{className:"relative w-10 h-10 shrink-0",children:z?a.jsx("div",{className:"w-full h-full rounded-full border-2 border-dashed border-gray-500 flex items-center justify-center",children:a.jsx("div",{className:"w-1.5 h-1.5 rounded-full bg-gray-600"})}):a.jsxs("svg",{viewBox:"0 0 56 56",className:"w-full h-full",children:[a.jsx("circle",{cx:"28",cy:"28",r:"26",fill:ce}),a.jsx("circle",{cx:"28",cy:"28",r:"20",fill:ce,style:{filter:"brightness(0.85)"}}),a.jsx("ellipse",{cx:"20",cy:"20",rx:"6",ry:"4",fill:"white",opacity:"0.3"}),a.jsx("circle",{cx:"28",cy:"28",r:"8",fill:"#2d2d2d"}),a.jsx("circle",{cx:"28",cy:"28",r:"5",fill:"#1a1a1a"})]})}),a.jsxs("div",{className:"min-w-0",children:[a.jsxs("div",{className:"flex items-center gap-1",children:[a.jsx("span",{className:"text-xs text-white/50 font-medium",children:B}),K&&a.jsx(Kz,{side:K})]}),a.jsx("div",{className:"text-sm text-white/80 truncate",children:z?"Empty":j.tray_type||"?"})]}),!z&&q!=null&&q>=0&&a.jsx("div",{className:"w-1.5 h-8 bg-bambu-dark-tertiary rounded-full overflow-hidden shrink-0 flex flex-col-reverse",children:a.jsx("div",{className:"w-full rounded-full",style:{height:`${q}%`,backgroundColor:hx(q)}})})]},Ne)})})]})}),a.jsx("div",{className:"flex justify-end gap-3 px-5 py-3 border-t border-zinc-800 shrink-0",children:a.jsx("button",{onClick:e,disabled:ee,className:"px-5 py-2.5 rounded-lg text-sm font-medium bg-zinc-800 text-zinc-300 hover:bg-zinc-700 transition-colors min-h-[44px] disabled:opacity-50",children:c==="success"?i("spoolbuddy.dashboard.close","Close"):i("spoolbuddy.modal.cancel","Cancel")})})]}),u&&p&&(()=>{let Ne="";return p.type==="material"?Ne=i("inventory.assignMismatchMessage",{spoolMaterial:p.spoolMaterial,trayMaterial:p.trayMaterial,location:p.location}):p.type==="partial"?Ne=i("inventory.assignPartialMismatchMessage",{spoolMaterial:p.spoolMaterial,trayMaterial:p.trayMaterial,location:p.location}):p.type==="material_profile"?Ne=`${i("inventory.assignMismatchMessage",{spoolMaterial:p.spoolMaterial,trayMaterial:p.trayMaterial,location:p.location})} ${i("inventory.assignProfileMismatchMessage",{spoolProfile:p.spoolProfile||i("common.unknown"),trayProfile:p.trayProfile||i("common.unknown"),location:p.location})}`:p.type==="partial_profile"?Ne=`${i("inventory.assignPartialMismatchMessage",{spoolMaterial:p.spoolMaterial,trayMaterial:p.trayMaterial,location:p.location})} diff --git a/static/index.html b/static/index.html index c2171b3b6..c0108a697 100644 --- a/static/index.html +++ b/static/index.html @@ -23,7 +23,7 @@ - +