diff --git a/package.json b/package.json index 5696623..f3680d2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "toonflow-app", - "version": "1.0.5", + "version": "1.0.6-dev", "description": "Toonflow 是一款 AI 短剧漫剧工具,能够利用 AI 技术将小说自动转化为剧本,并结合 AI 生成的图片和视频,实现高效的短剧创作。", "author": "HBAI-Ltd ", "homepage": "https://github.com/HBAI-Ltd/Toonflow-app#readme", @@ -19,7 +19,7 @@ }, "scripts": { "dev": "nodemon --inspect --exec tsx src/app.ts", - "dev:win": "chcp 65001 && electronmon -r tsx scripts/main.ts", + "dev:gui": "chcp 65001 && electronmon -r tsx scripts/main.ts", "lint": "tsc --noEmit", "build": "tsx scripts/build.ts", "pack": "electron-builder --dir", diff --git a/scripts/web/index.html b/scripts/web/index.html index 13cf668..451b485 100644 --- a/scripts/web/index.html +++ b/scripts/web/index.html @@ -5,56 +5,56 @@ Toonflow - - + */function eSe(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),n.push.apply(n,o)}return n}function V3(e){for(var t=1;t=0)&&(n[r]=e[r]);return n}function EXi(e,t){if(e==null)return{};var n=SXi(e,t),o,r;if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0)&&Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}function AXi(e){return MXi(e)||TXi(e)||_Xi(e)||jXi()}function MXi(e){if(Array.isArray(e))return _se(e)}function TXi(e){if(typeof Symbol<"u"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}function _Xi(e,t){if(e){if(typeof e=="string")return _se(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if(n==="Object"&&e.constructor&&(n=e.constructor.name),n==="Map"||n==="Set")return Array.from(e);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _se(e,t)}}function _se(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n"&&(t=t.substring(1)),e)try{if(e.matches)return e.matches(t);if(e.msMatchesSelector)return e.msMatchesSelector(t);if(e.webkitMatchesSelector)return e.webkitMatchesSelector(t)}catch{return!1}return!1}}function pXi(e){return e.host&&e!==document&&e.host.nodeType?e.host:e.parentNode}function P4(e,t,n,o){if(e){n=n||document;do{if(t!=null&&(t[0]===">"?e.parentNode===n&&zV(e,t):zV(e,t))||o&&e===n)return e;if(e===n)break}while(e=pXi(e))}return null}var nSe=/\s+/g;function Jc(e,t,n){if(e&&t)if(e.classList)e.classList[n?"add":"remove"](t);else{var o=(" "+e.className+" ").replace(nSe," ").replace(" "+t+" "," ");e.className=(o+(n?" "+t:"")).replace(nSe," ")}}function Kr(e,t,n){var o=e&&e.style;if(o){if(n===void 0)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(e,""):e.currentStyle&&(n=e.currentStyle),t===void 0?n:n[t];!(t in o)&&t.indexOf("webkit")===-1&&(t="-webkit-"+t),o[t]=n+(typeof n=="string"?"":"px")}}function Rb(e,t){var n="";if(typeof e=="string")n=e;else do{var o=Kr(e,"transform");o&&o!=="none"&&(n=o+" "+n)}while(!t&&(e=e.parentNode));var r=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return r&&new r(n)}function RGe(e,t,n){if(e){var o=e.getElementsByTagName(t),r=0,l=o.length;if(n)for(;r=l,!a)return o;if(o===j3())break;o=M9(o,!1)}return!1}function lE(e,t,n,o){for(var r=0,l=0,a=e.children;l2&&arguments[2]!==void 0?arguments[2]:{},r=o.evt,l=EXi(o,zXi);Ap.pluginEvent.bind(Nl)(t,n,V3({dragEl:mr,parentEl:au,ghostEl:ga,rootEl:pc,nextEl:Z7,lastDownEl:Kz,cloneEl:su,cloneHidden:m9,dragStarted:X_,putSortable:rh,activeSortable:Nl.active,originalEvent:r,oldIndex:Mx,oldDraggableIndex:Pj,newIndex:bf,newDraggableIndex:c9,hideGhostForTarget:BGe,unhideGhostForTarget:VGe,cloneNowHidden:function(){m9=!0},cloneNowShown:function(){m9=!1},dispatchSortableEvent:function(s){S1({sortable:n,name:s,originalEvent:r})}},l))};function S1(e){Z_(V3({putSortable:rh,cloneEl:su,targetEl:mr,rootEl:pc,oldIndex:Mx,oldDraggableIndex:Pj,newIndex:bf,newDraggableIndex:c9},e))}var mr,au,ga,pc,Z7,Kz,su,m9,Mx,bf,Pj,c9,OW,rh,kx=!1,BV=!1,VV=[],z7,N4,are,sre,lSe,aSe,X_,QL,Wj,Hj=!1,DW=!1,Jz,Rh,cre=[],jse=!1,FV=[],PZ=typeof document<"u",pW=pGe,sSe=Ep||vv?"cssFloat":"float",BXi=PZ&&!DXi&&!pGe&&"draggable"in document.createElement("div"),WGe=function(){if(PZ){if(vv)return!1;var e=document.createElement("x");return e.style.cssText="pointer-events:auto",e.style.pointerEvents==="auto"}}(),HGe=function(t,n){var o=Kr(t),r=parseInt(o.width)-parseInt(o.paddingLeft)-parseInt(o.paddingRight)-parseInt(o.borderLeftWidth)-parseInt(o.borderRightWidth),l=lE(t,0,n),a=lE(t,1,n),s=l&&Kr(l),c=a&&Kr(a),u=s&&parseInt(s.marginLeft)+parseInt(s.marginRight)+Nc(l).width,d=c&&parseInt(c.marginLeft)+parseInt(c.marginRight)+Nc(a).width;if(o.display==="flex")return o.flexDirection==="column"||o.flexDirection==="column-reverse"?"vertical":"horizontal";if(o.display==="grid")return o.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(l&&s.float&&s.float!=="none"){var h=s.float==="left"?"left":"right";return a&&(c.clear==="both"||c.clear===h)?"vertical":"horizontal"}return l&&(s.display==="block"||s.display==="flex"||s.display==="table"||s.display==="grid"||u>=r&&o[sSe]==="none"||a&&o[sSe]==="none"&&u+d>r)?"vertical":"horizontal"},VXi=function(t,n,o){var r=o?t.left:t.top,l=o?t.right:t.bottom,a=o?t.width:t.height,s=o?n.left:n.top,c=o?n.right:n.bottom,u=o?n.width:n.height;return r===s||l===c||r+a/2===s+u/2},FXi=function(t,n){var o;return VV.some(function(r){var l=r[Uh].options.emptyInsertThreshold;if(!(!l||xfe(r))){var a=Nc(r),s=t>=a.left-l&&t<=a.right+l,c=n>=a.top-l&&n<=a.bottom+l;if(s&&c)return o=r}}),o},zGe=function(t){function n(l,a){return function(s,c,u,d){var h=s.options.group.name&&c.options.group.name&&s.options.group.name===c.options.group.name;if(l==null&&(a||h))return!0;if(l==null||l===!1)return!1;if(a&&l==="clone")return l;if(typeof l=="function")return n(l(s,c,u,d),a)(s,c,u,d);var k=(a?s:c).options.group.name;return l===!0||typeof l=="string"&&l===k||l.join&&l.indexOf(k)>-1}}var o={},r=t.group;(!r||qz(r)!="object")&&(r={name:r}),o.name=r.name,o.checkPull=n(r.pull,!0),o.checkPut=n(r.put),o.revertClone=r.revertClone,t.group=o},BGe=function(){!WGe&&ga&&Kr(ga,"display","none")},VGe=function(){!WGe&&ga&&Kr(ga,"display","")};PZ&&document.addEventListener("click",function(e){if(BV)return e.preventDefault(),e.stopPropagation&&e.stopPropagation(),e.stopImmediatePropagation&&e.stopImmediatePropagation(),BV=!1,!1},!0);var B7=function(t){if(mr){t=t.touches?t.touches[0]:t;var n=FXi(t.clientX,t.clientY);if(n){var o={};for(var r in t)t.hasOwnProperty(r)&&(o[r]=t[r]);o.target=o.rootEl=n,o.preventDefault=void 0,o.stopPropagation=void 0,n[Uh]._onDragOver(o)}}},UXi=function(t){mr&&mr.parentNode[Uh]._isOutsideThisEl(t.target)};function Nl(e,t){if(!(e&&e.nodeType&&e.nodeType===1))throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(e));this.el=e,this.options=t=e4({},t),e[Uh]=this;var n={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(e.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return HGe(e,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(a,s){a.setData("Text",s.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:Nl.supportPointer!==!1&&"PointerEvent"in window&&!Rj,emptyInsertThreshold:5};Ap.initializePlugins(this,e,n);for(var o in n)!(o in t)&&(t[o]=n[o]);zGe(t);for(var r in this)r.charAt(0)==="_"&&typeof this[r]=="function"&&(this[r]=this[r].bind(this));this.nativeDraggable=t.forceFallback?!1:BXi,this.nativeDraggable&&(this.options.touchStartThreshold=1),t.supportPointer?Va(e,"pointerdown",this._onTapStart):(Va(e,"mousedown",this._onTapStart),Va(e,"touchstart",this._onTapStart)),this.nativeDraggable&&(Va(e,"dragover",this),Va(e,"dragenter",this)),VV.push(this.el),t.store&&t.store.get&&this.sort(t.store.get(this)||[]),e4(this,PXi())}Nl.prototype={constructor:Nl,_isOutsideThisEl:function(t){!this.el.contains(t)&&t!==this.el&&(QL=null)},_getDirection:function(t,n){return typeof this.options.direction=="function"?this.options.direction.call(this,t,n,mr):this.options.direction},_onTapStart:function(t){if(t.cancelable){var n=this,o=this.el,r=this.options,l=r.preventOnFilter,a=t.type,s=t.touches&&t.touches[0]||t.pointerType&&t.pointerType==="touch"&&t,c=(s||t).target,u=t.target.shadowRoot&&(t.path&&t.path[0]||t.composedPath&&t.composedPath()[0])||c,d=r.filter;if(QXi(o),!mr&&!(/mousedown|pointerdown/.test(a)&&t.button!==0||r.disabled)&&!u.isContentEditable&&!(!this.nativeDraggable&&Rj&&c&&c.tagName.toUpperCase()==="SELECT")&&(c=P4(c,r.draggable,o,!1),!(c&&c.animated)&&Kz!==c)){if(Mx=uu(c),Pj=uu(c,r.draggable),typeof d=="function"){if(d.call(this,t,c,this)){S1({sortable:n,rootEl:u,name:"filter",targetEl:c,toEl:o,fromEl:o}),h2("filter",n,{evt:t}),l&&t.cancelable&&t.preventDefault();return}}else if(d&&(d=d.split(",").some(function(h){if(h=P4(u,h.trim(),o,!1),h)return S1({sortable:n,rootEl:h,name:"filter",targetEl:c,fromEl:o,toEl:o}),h2("filter",n,{evt:t}),!0}),d)){l&&t.cancelable&&t.preventDefault();return}r.handle&&!P4(u,r.handle,o,!1)||this._prepareDragStart(t,s,c)}}},_prepareDragStart:function(t,n,o){var r=this,l=r.el,a=r.options,s=l.ownerDocument,c;if(o&&!mr&&o.parentNode===l){var u=Nc(o);if(pc=l,mr=o,au=mr.parentNode,Z7=mr.nextSibling,Kz=o,OW=a.group,Nl.dragged=mr,z7={target:mr,clientX:(n||t).clientX,clientY:(n||t).clientY},lSe=z7.clientX-u.left,aSe=z7.clientY-u.top,this._lastX=(n||t).clientX,this._lastY=(n||t).clientY,mr.style["will-change"]="all",c=function(){if(h2("delayEnded",r,{evt:t}),Nl.eventCanceled){r._onDrop();return}r._disableDelayedDragEvents(),!tSe&&r.nativeDraggable&&(mr.draggable=!0),r._triggerDragStart(t,n),S1({sortable:r,name:"choose",originalEvent:t}),Jc(mr,a.chosenClass,!0)},a.ignore.split(",").forEach(function(d){RGe(mr,d.trim(),ure)}),Va(s,"dragover",B7),Va(s,"mousemove",B7),Va(s,"touchmove",B7),Va(s,"mouseup",r._onDrop),Va(s,"touchend",r._onDrop),Va(s,"touchcancel",r._onDrop),tSe&&this.nativeDraggable&&(this.options.touchStartThreshold=4,mr.draggable=!0),h2("delayStart",this,{evt:t}),a.delay&&(!a.delayOnTouchOnly||n)&&(!this.nativeDraggable||!(Ep||vv))){if(Nl.eventCanceled){this._onDrop();return}Va(s,"mouseup",r._disableDelayedDrag),Va(s,"touchend",r._disableDelayedDrag),Va(s,"touchcancel",r._disableDelayedDrag),Va(s,"mousemove",r._delayedDragTouchMoveHandler),Va(s,"touchmove",r._delayedDragTouchMoveHandler),a.supportPointer&&Va(s,"pointermove",r._delayedDragTouchMoveHandler),r._dragStartTimer=setTimeout(c,a.delay)}else c()}},_delayedDragTouchMoveHandler:function(t){var n=t.touches?t.touches[0]:t;Math.max(Math.abs(n.clientX-this._lastX),Math.abs(n.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){mr&&ure(mr),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;Da(t,"mouseup",this._disableDelayedDrag),Da(t,"touchend",this._disableDelayedDrag),Da(t,"touchcancel",this._disableDelayedDrag),Da(t,"mousemove",this._delayedDragTouchMoveHandler),Da(t,"touchmove",this._delayedDragTouchMoveHandler),Da(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,n){n=n||t.pointerType=="touch"&&t,!this.nativeDraggable||n?this.options.supportPointer?Va(document,"pointermove",this._onTouchMove):n?Va(document,"touchmove",this._onTouchMove):Va(document,"mousemove",this._onTouchMove):(Va(mr,"dragend",this),Va(pc,"dragstart",this._onDragStart));try{document.selection?Qz(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch{}},_dragStarted:function(t,n){if(kx=!1,pc&&mr){h2("dragStarted",this,{evt:n}),this.nativeDraggable&&Va(document,"dragover",UXi);var o=this.options;!t&&Jc(mr,o.dragClass,!1),Jc(mr,o.ghostClass,!0),Nl.active=this,t&&this._appendGhost(),S1({sortable:this,name:"start",originalEvent:n})}else this._nulling()},_emulateDragOver:function(){if(N4){this._lastX=N4.clientX,this._lastY=N4.clientY,BGe();for(var t=document.elementFromPoint(N4.clientX,N4.clientY),n=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(N4.clientX,N4.clientY),t!==n);)n=t;if(mr.parentNode[Uh]._isOutsideThisEl(t),n)do{if(n[Uh]){var o=void 0;if(o=n[Uh]._onDragOver({clientX:N4.clientX,clientY:N4.clientY,target:t,rootEl:n}),o&&!this.options.dragoverBubble)break}t=n}while(n=n.parentNode);VGe()}},_onTouchMove:function(t){if(z7){var n=this.options,o=n.fallbackTolerance,r=n.fallbackOffset,l=t.touches?t.touches[0]:t,a=ga&&Rb(ga,!0),s=ga&&a&&a.a,c=ga&&a&&a.d,u=pW&&Rh&&oSe(Rh),d=(l.clientX-z7.clientX+r.x)/(s||1)+(u?u[0]-cre[0]:0)/(s||1),h=(l.clientY-z7.clientY+r.y)/(c||1)+(u?u[1]-cre[1]:0)/(c||1);if(!Nl.active&&!kx){if(o&&Math.max(Math.abs(l.clientX-this._lastX),Math.abs(l.clientY-this._lastY))=0&&(S1({rootEl:au,name:"add",toEl:au,fromEl:pc,originalEvent:t}),S1({sortable:this,name:"remove",toEl:au,originalEvent:t}),S1({rootEl:au,name:"sort",toEl:au,fromEl:pc,originalEvent:t}),S1({sortable:this,name:"sort",toEl:au,originalEvent:t})),rh&&rh.save()):bf!==Mx&&bf>=0&&(S1({sortable:this,name:"update",toEl:au,originalEvent:t}),S1({sortable:this,name:"sort",toEl:au,originalEvent:t})),Nl.active&&((bf==null||bf===-1)&&(bf=Mx,c9=Pj),S1({sortable:this,name:"end",toEl:au,originalEvent:t}),this.save()))),this._nulling()},_nulling:function(){h2("nulling",this),pc=mr=au=ga=Z7=su=Kz=m9=z7=N4=X_=bf=c9=Mx=Pj=QL=Wj=rh=OW=Nl.dragged=Nl.ghost=Nl.clone=Nl.active=null,FV.forEach(function(t){t.checked=!0}),FV.length=are=sre=0},handleEvent:function(t){switch(t.type){case"drop":case"dragend":this._onDrop(t);break;case"dragenter":case"dragover":mr&&(this._onDragOver(t),GXi(t));break;case"selectstart":t.preventDefault();break}},toArray:function(){for(var t=[],n,o=this.el.children,r=0,l=o.length,a=this.options;ro.right+r||e.clientX<=o.right&&e.clientY>o.bottom&&e.clientX>=o.left:e.clientX>o.right&&e.clientY>o.top||e.clientX<=o.right&&e.clientY>o.bottom+r}function qXi(e,t,n,o,r,l,a,s){var c=o?e.clientY:e.clientX,u=o?n.height:n.width,d=o?n.top:n.left,h=o?n.bottom:n.right,k=!1;if(!a){if(s&&Jzd+u*l/2:ch-Jz)return-Wj}else if(c>d+u*(1-r)/2&&ch-u*l/2)?c>d+u/2?1:-1:0}function KXi(e){return uu(mr)1&&(ra.forEach(function(s){l.addAnimationState({target:s,rect:f2?Nc(s):a}),rre(s),s.fromRect=a,o.removeAnimationState(s)}),f2=!1,iqi(!this.options.removeCloneOnHide,r))},dragOverCompleted:function(n){var o=n.sortable,r=n.isOwner,l=n.insertion,a=n.activeSortable,s=n.parentEl,c=n.putSortable,u=this.options;if(l){if(r&&a._hideClone(),A_=!1,u.animation&&ra.length>1&&(f2||!r&&!a.options.sort&&!c)){var d=Nc(lc,!1,!0,!0);ra.forEach(function(k){k!==lc&&(rSe(k,d),s.appendChild(k))}),f2=!0}if(!r)if(f2||IW(),ra.length>1){var h=RW;a._showClone(o),a.options.animation&&!RW&&h&&vf.forEach(function(k){a.addAnimationState({target:k,rect:M_}),k.fromRect=M_,k.thisAnimationDuration=null})}else a._showClone(o)}},dragOverAnimationCapture:function(n){var o=n.dragRect,r=n.isOwner,l=n.activeSortable;if(ra.forEach(function(s){s.thisAnimationDuration=null}),l.options.animation&&!r&&l.multiDrag.isMultiDrag){M_=e4({},o);var a=Rb(lc,!0);M_.top-=a.f,M_.left-=a.e}},dragOverAnimationComplete:function(){f2&&(f2=!1,IW())},drop:function(n){var o=n.originalEvent,r=n.rootEl,l=n.parentEl,a=n.sortable,s=n.dispatchSortableEvent,c=n.oldIndex,u=n.putSortable,d=u||this.sortable;if(o){var h=this.options,k=l.children;if(!$L)if(h.multiDragKey&&!this.multiDragKeyDown&&this._deselectMultiDrag(),Jc(lc,h.selectedClass,!~ra.indexOf(lc)),~ra.indexOf(lc))ra.splice(ra.indexOf(lc),1),E_=null,Z_({sortable:a,rootEl:r,name:"deselect",targetEl:lc});else{if(ra.push(lc),Z_({sortable:a,rootEl:r,name:"select",targetEl:lc}),o.shiftKey&&E_&&a.el.contains(E_)){var m=uu(E_),b=uu(lc);if(~m&&~b&&m!==b){var g,v;for(b>m?(v=m,g=b):(v=b,g=m+1);v1){var w=Nc(lc),L=uu(lc,":not(."+this.options.selectedClass+")");if(!A_&&h.animation&&(lc.thisAnimationDuration=null),d.captureAnimationState(),!A_&&(h.animation&&(lc.fromRect=w,ra.forEach(function(S){if(S.thisAnimationDuration=null,S!==lc){var E=f2?Nc(S):w;S.fromRect=E,d.addAnimationState({target:S,rect:E})}})),IW(),ra.forEach(function(S){k[L]?l.insertBefore(S,k[L]):l.appendChild(S),L++}),c===uu(lc))){var x=!1;ra.forEach(function(S){if(S.sortableIndex!==uu(S)){x=!0;return}}),x&&s("update")}ra.forEach(function(S){rre(S)}),d.animateAll()}R4=d}(r===l||u&&u.lastPutMode!=="clone")&&vf.forEach(function(S){S.parentNode&&S.parentNode.removeChild(S)})}},nullingGlobal:function(){this.isMultiDrag=$L=!1,vf.length=0},destroyGlobal:function(){this._deselectMultiDrag(),Da(document,"pointerup",this._deselectMultiDrag),Da(document,"mouseup",this._deselectMultiDrag),Da(document,"touchend",this._deselectMultiDrag),Da(document,"keydown",this._checkKeyDown),Da(document,"keyup",this._checkKeyUp)},_deselectMultiDrag:function(n){if(!(typeof $L<"u"&&$L)&&R4===this.sortable&&!(n&&P4(n.target,this.options.draggable,this.sortable.el,!1))&&!(n&&n.button!==0))for(;ra.length;){var o=ra[0];Jc(o,this.options.selectedClass,!1),ra.shift(),Z_({sortable:this.sortable,rootEl:this.sortable.el,name:"deselect",targetEl:o})}},_checkKeyDown:function(n){n.key===this.options.multiDragKey&&(this.multiDragKeyDown=!0)},_checkKeyUp:function(n){n.key===this.options.multiDragKey&&(this.multiDragKeyDown=!1)}},e4(e,{pluginName:"multiDrag",utils:{select:function(n){var o=n.parentNode[Uh];!o||!o.options.multiDrag||~ra.indexOf(n)||(R4&&R4!==o&&(R4.multiDrag._deselectMultiDrag(),R4=o),Jc(n,o.options.selectedClass,!0),ra.push(n))},deselect:function(n){var o=n.parentNode[Uh],r=ra.indexOf(n);!o||!o.options.multiDrag||!~r||(Jc(n,o.options.selectedClass,!1),ra.splice(r,1))}},eventProperties:function(){var n=this,o=[],r=[];return ra.forEach(function(l){o.push({multiDragElement:l,index:l.sortableIndex});var a;f2&&l!==lc?a=-1:f2?a=uu(l,":not(."+n.options.selectedClass+")"):a=uu(l),r.push({multiDragElement:l,index:a})}),{items:AXi(ra),clones:[].concat(vf),oldIndicies:o,newIndicies:r}},optionListeners:{multiDragKey:function(n){return n=n.toLowerCase(),n==="ctrl"?n="Control":n.length>1&&(n=n.charAt(0).toUpperCase()+n.substr(1)),n}}})}function iqi(e,t){ra.forEach(function(n,o){var r=t.children[n.sortableIndex+(e?Number(o):0)];r?t.insertBefore(n,r):t.appendChild(n)})}function uSe(e,t){vf.forEach(function(n,o){var r=t.children[n.sortableIndex+(e?Number(o):0)];r?t.insertBefore(n,r):t.appendChild(n)})}function IW(){ra.forEach(function(e){e!==lc&&e.parentNode&&e.parentNode.removeChild(e)})}Nl.mount(new $Xi);Nl.mount(Afe,Efe);const oqi=Object.freeze(Object.defineProperty({__proto__:null,MultiDrag:nqi,Sortable:Nl,Swap:eqi,default:Nl},Symbol.toStringTag,{value:"Module"})),rqi=OF(oqi);(function(e,t){(function(o,r){e.exports=r(LXi,rqi)})(typeof self<"u"?self:Il,function(n,o){return function(r){var l={};function a(s){if(l[s])return l[s].exports;var c=l[s]={i:s,l:!1,exports:{}};return r[s].call(c.exports,c,c.exports,a),c.l=!0,c.exports}return a.m=r,a.c=l,a.d=function(s,c,u){a.o(s,c)||Object.defineProperty(s,c,{enumerable:!0,get:u})},a.r=function(s){typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(s,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(s,"__esModule",{value:!0})},a.t=function(s,c){if(c&1&&(s=a(s)),c&8||c&4&&typeof s=="object"&&s&&s.__esModule)return s;var u=Object.create(null);if(a.r(u),Object.defineProperty(u,"default",{enumerable:!0,value:s}),c&2&&typeof s!="string")for(var d in s)a.d(u,d,(function(h){return s[h]}).bind(null,d));return u},a.n=function(s){var c=s&&s.__esModule?function(){return s.default}:function(){return s};return a.d(c,"a",c),c},a.o=function(s,c){return Object.prototype.hasOwnProperty.call(s,c)},a.p="",a(a.s="fb15")}({"00ee":function(r,l,a){var s=a("b622"),c=s("toStringTag"),u={};u[c]="z",r.exports=String(u)==="[object z]"},"0366":function(r,l,a){var s=a("1c0b");r.exports=function(c,u,d){if(s(c),u===void 0)return c;switch(d){case 0:return function(){return c.call(u)};case 1:return function(h){return c.call(u,h)};case 2:return function(h,k){return c.call(u,h,k)};case 3:return function(h,k,m){return c.call(u,h,k,m)}}return function(){return c.apply(u,arguments)}}},"057f":function(r,l,a){var s=a("fc6a"),c=a("241c").f,u={}.toString,d=typeof window=="object"&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],h=function(k){try{return c(k)}catch{return d.slice()}};r.exports.f=function(m){return d&&u.call(m)=="[object Window]"?h(m):c(s(m))}},"06cf":function(r,l,a){var s=a("83ab"),c=a("d1e7"),u=a("5c6c"),d=a("fc6a"),h=a("c04e"),k=a("5135"),m=a("0cfb"),b=Object.getOwnPropertyDescriptor;l.f=s?b:function(v,w){if(v=d(v),w=h(w,!0),m)try{return b(v,w)}catch{}if(k(v,w))return u(!c.f.call(v,w),v[w])}},"0cfb":function(r,l,a){var s=a("83ab"),c=a("d039"),u=a("cc12");r.exports=!s&&!c(function(){return Object.defineProperty(u("div"),"a",{get:function(){return 7}}).a!=7})},"13d5":function(r,l,a){var s=a("23e7"),c=a("d58f").left,u=a("a640"),d=a("ae40"),h=u("reduce"),k=d("reduce",{1:0});s({target:"Array",proto:!0,forced:!h||!k},{reduce:function(b){return c(this,b,arguments.length,arguments.length>1?arguments[1]:void 0)}})},"14c3":function(r,l,a){var s=a("c6b6"),c=a("9263");r.exports=function(u,d){var h=u.exec;if(typeof h=="function"){var k=h.call(u,d);if(typeof k!="object")throw TypeError("RegExp exec method returned something other than an Object or null");return k}if(s(u)!=="RegExp")throw TypeError("RegExp#exec called on incompatible receiver");return c.call(u,d)}},"159b":function(r,l,a){var s=a("da84"),c=a("fdbc"),u=a("17c2"),d=a("9112");for(var h in c){var k=s[h],m=k&&k.prototype;if(m&&m.forEach!==u)try{d(m,"forEach",u)}catch{m.forEach=u}}},"17c2":function(r,l,a){var s=a("b727").forEach,c=a("a640"),u=a("ae40"),d=c("forEach"),h=u("forEach");r.exports=!d||!h?function(m){return s(this,m,arguments.length>1?arguments[1]:void 0)}:[].forEach},"1be4":function(r,l,a){var s=a("d066");r.exports=s("document","documentElement")},"1c0b":function(r,l){r.exports=function(a){if(typeof a!="function")throw TypeError(String(a)+" is not a function");return a}},"1c7e":function(r,l,a){var s=a("b622"),c=s("iterator"),u=!1;try{var d=0,h={next:function(){return{done:!!d++}},return:function(){u=!0}};h[c]=function(){return this},Array.from(h,function(){throw 2})}catch{}r.exports=function(k,m){if(!m&&!u)return!1;var b=!1;try{var g={};g[c]=function(){return{next:function(){return{done:b=!0}}}},k(g)}catch{}return b}},"1d80":function(r,l){r.exports=function(a){if(a==null)throw TypeError("Can't call method on "+a);return a}},"1dde":function(r,l,a){var s=a("d039"),c=a("b622"),u=a("2d00"),d=c("species");r.exports=function(h){return u>=51||!s(function(){var k=[],m=k.constructor={};return m[d]=function(){return{foo:1}},k[h](Boolean).foo!==1})}},"23cb":function(r,l,a){var s=a("a691"),c=Math.max,u=Math.min;r.exports=function(d,h){var k=s(d);return k<0?c(k+h,0):u(k,h)}},"23e7":function(r,l,a){var s=a("da84"),c=a("06cf").f,u=a("9112"),d=a("6eeb"),h=a("ce4e"),k=a("e893"),m=a("94ca");r.exports=function(b,g){var v=b.target,w=b.global,L=b.stat,x,S,E,A,T,j;if(w?S=s:L?S=s[v]||h(v,{}):S=(s[v]||{}).prototype,S)for(E in g){if(T=g[E],b.noTargetGet?(j=c(S,E),A=j&&j.value):A=S[E],x=m(w?E:v+(L?".":"#")+E,b.forced),!x&&A!==void 0){if(typeof T==typeof A)continue;k(T,A)}(b.sham||A&&A.sham)&&u(T,"sham",!0),d(S,E,T,b)}}},"241c":function(r,l,a){var s=a("ca84"),c=a("7839"),u=c.concat("length","prototype");l.f=Object.getOwnPropertyNames||function(h){return s(h,u)}},"25f0":function(r,l,a){var s=a("6eeb"),c=a("825a"),u=a("d039"),d=a("ad6d"),h="toString",k=RegExp.prototype,m=k[h],b=u(function(){return m.call({source:"a",flags:"b"})!="/a/b"}),g=m.name!=h;(b||g)&&s(RegExp.prototype,h,function(){var w=c(this),L=String(w.source),x=w.flags,S=String(x===void 0&&w instanceof RegExp&&!("flags"in k)?d.call(w):x);return"/"+L+"/"+S},{unsafe:!0})},"2ca0":function(r,l,a){var s=a("23e7"),c=a("06cf").f,u=a("50c4"),d=a("5a34"),h=a("1d80"),k=a("ab13"),m=a("c430"),b="".startsWith,g=Math.min,v=k("startsWith"),w=!m&&!v&&!!function(){var L=c(String.prototype,"startsWith");return L&&!L.writable}();s({target:"String",proto:!0,forced:!w&&!v},{startsWith:function(x){var S=String(h(this));d(x);var E=u(g(arguments.length>1?arguments[1]:void 0,S.length)),A=String(x);return b?b.call(S,A,E):S.slice(E,E+A.length)===A}})},"2d00":function(r,l,a){var s=a("da84"),c=a("342f"),u=s.process,d=u&&u.versions,h=d&&d.v8,k,m;h?(k=h.split("."),m=k[0]+k[1]):c&&(k=c.match(/Edge\/(\d+)/),(!k||k[1]>=74)&&(k=c.match(/Chrome\/(\d+)/),k&&(m=k[1]))),r.exports=m&&+m},"342f":function(r,l,a){var s=a("d066");r.exports=s("navigator","userAgent")||""},"35a1":function(r,l,a){var s=a("f5df"),c=a("3f8c"),u=a("b622"),d=u("iterator");r.exports=function(h){if(h!=null)return h[d]||h["@@iterator"]||c[s(h)]}},"37e8":function(r,l,a){var s=a("83ab"),c=a("9bf2"),u=a("825a"),d=a("df75");r.exports=s?Object.defineProperties:function(k,m){u(k);for(var b=d(m),g=b.length,v=0,w;g>v;)c.f(k,w=b[v++],m[w]);return k}},"3bbe":function(r,l,a){var s=a("861d");r.exports=function(c){if(!s(c)&&c!==null)throw TypeError("Can't set "+String(c)+" as a prototype");return c}},"3ca3":function(r,l,a){var s=a("6547").charAt,c=a("69f3"),u=a("7dd0"),d="String Iterator",h=c.set,k=c.getterFor(d);u(String,"String",function(m){h(this,{type:d,string:String(m),index:0})},function(){var b=k(this),g=b.string,v=b.index,w;return v>=g.length?{value:void 0,done:!0}:(w=s(g,v),b.index+=w.length,{value:w,done:!1})})},"3f8c":function(r,l){r.exports={}},4160:function(r,l,a){var s=a("23e7"),c=a("17c2");s({target:"Array",proto:!0,forced:[].forEach!=c},{forEach:c})},"428f":function(r,l,a){var s=a("da84");r.exports=s},"44ad":function(r,l,a){var s=a("d039"),c=a("c6b6"),u="".split;r.exports=s(function(){return!Object("z").propertyIsEnumerable(0)})?function(d){return c(d)=="String"?u.call(d,""):Object(d)}:Object},"44d2":function(r,l,a){var s=a("b622"),c=a("7c73"),u=a("9bf2"),d=s("unscopables"),h=Array.prototype;h[d]==null&&u.f(h,d,{configurable:!0,value:c(null)}),r.exports=function(k){h[d][k]=!0}},"44e7":function(r,l,a){var s=a("861d"),c=a("c6b6"),u=a("b622"),d=u("match");r.exports=function(h){var k;return s(h)&&((k=h[d])!==void 0?!!k:c(h)=="RegExp")}},4930:function(r,l,a){var s=a("d039");r.exports=!!Object.getOwnPropertySymbols&&!s(function(){return!String(Symbol())})},"4d64":function(r,l,a){var s=a("fc6a"),c=a("50c4"),u=a("23cb"),d=function(h){return function(k,m,b){var g=s(k),v=c(g.length),w=u(b,v),L;if(h&&m!=m){for(;v>w;)if(L=g[w++],L!=L)return!0}else for(;v>w;w++)if((h||w in g)&&g[w]===m)return h||w||0;return!h&&-1}};r.exports={includes:d(!0),indexOf:d(!1)}},"4de4":function(r,l,a){var s=a("23e7"),c=a("b727").filter,u=a("1dde"),d=a("ae40"),h=u("filter"),k=d("filter");s({target:"Array",proto:!0,forced:!h||!k},{filter:function(b){return c(this,b,arguments.length>1?arguments[1]:void 0)}})},"4df4":function(r,l,a){var s=a("0366"),c=a("7b0b"),u=a("9bdd"),d=a("e95a"),h=a("50c4"),k=a("8418"),m=a("35a1");r.exports=function(g){var v=c(g),w=typeof this=="function"?this:Array,L=arguments.length,x=L>1?arguments[1]:void 0,S=x!==void 0,E=m(v),A=0,T,j,D,P,z,N;if(S&&(x=s(x,L>2?arguments[2]:void 0,2)),E!=null&&!(w==Array&&d(E)))for(P=E.call(v),z=P.next,j=new w;!(D=z.call(P)).done;A++)N=S?u(P,x,[D.value,A],!0):D.value,k(j,A,N);else for(T=h(v.length),j=new w(T);T>A;A++)N=S?x(v[A],A):v[A],k(j,A,N);return j.length=A,j}},"4fad":function(r,l,a){var s=a("23e7"),c=a("6f53").entries;s({target:"Object",stat:!0},{entries:function(d){return c(d)}})},"50c4":function(r,l,a){var s=a("a691"),c=Math.min;r.exports=function(u){return u>0?c(s(u),9007199254740991):0}},5135:function(r,l){var a={}.hasOwnProperty;r.exports=function(s,c){return a.call(s,c)}},5319:function(r,l,a){var s=a("d784"),c=a("825a"),u=a("7b0b"),d=a("50c4"),h=a("a691"),k=a("1d80"),m=a("8aa5"),b=a("14c3"),g=Math.max,v=Math.min,w=Math.floor,L=/\$([$&'`]|\d\d?|<[^>]*>)/g,x=/\$([$&'`]|\d\d?)/g,S=function(E){return E===void 0?E:String(E)};s("replace",2,function(E,A,T,j){var D=j.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,P=j.REPLACE_KEEPS_$0,z=D?"$":"$0";return[function(R,U){var p=k(this),H=R==null?void 0:R[E];return H!==void 0?H.call(R,p,U):A.call(String(p),R,U)},function(W,R){if(!D&&P||typeof R=="string"&&R.indexOf(z)===-1){var U=T(A,W,this,R);if(U.done)return U.value}var p=c(W),H=String(this),B=typeof R=="function";B||(R=String(R));var q=p.global;if(q){var J=p.unicode;p.lastIndex=0}for(var Z=[];;){var ie=b(p,H);if(ie===null||(Z.push(ie),!q))break;var te=String(ie[0]);te===""&&(p.lastIndex=m(H,d(p.lastIndex),J))}for(var le="",de=0,ke=0;ke=de&&(le+=H.slice(de,me)+ae,de=me+ue.length)}return le+H.slice(de)}];function N(W,R,U,p,H,B){var q=U+W.length,J=p.length,Z=x;return H!==void 0&&(H=u(H),Z=L),A.call(B,Z,function(ie,te){var le;switch(te.charAt(0)){case"$":return"$";case"&":return W;case"`":return R.slice(0,U);case"'":return R.slice(q);case"<":le=H[te.slice(1,-1)];break;default:var de=+te;if(de===0)return ie;if(de>J){var ke=w(de/10);return ke===0?ie:ke<=J?p[ke-1]===void 0?te.charAt(1):p[ke-1]+te.charAt(1):ie}le=p[de-1]}return le===void 0?"":le})}})},5692:function(r,l,a){var s=a("c430"),c=a("c6cd");(r.exports=function(u,d){return c[u]||(c[u]=d!==void 0?d:{})})("versions",[]).push({version:"3.6.5",mode:s?"pure":"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})},"56ef":function(r,l,a){var s=a("d066"),c=a("241c"),u=a("7418"),d=a("825a");r.exports=s("Reflect","ownKeys")||function(k){var m=c.f(d(k)),b=u.f;return b?m.concat(b(k)):m}},"5a34":function(r,l,a){var s=a("44e7");r.exports=function(c){if(s(c))throw TypeError("The method doesn't accept regular expressions");return c}},"5c6c":function(r,l){r.exports=function(a,s){return{enumerable:!(a&1),configurable:!(a&2),writable:!(a&4),value:s}}},"5db7":function(r,l,a){var s=a("23e7"),c=a("a2bf"),u=a("7b0b"),d=a("50c4"),h=a("1c0b"),k=a("65f0");s({target:"Array",proto:!0},{flatMap:function(b){var g=u(this),v=d(g.length),w;return h(b),w=k(g,0),w.length=c(w,g,g,v,0,1,b,arguments.length>1?arguments[1]:void 0),w}})},6547:function(r,l,a){var s=a("a691"),c=a("1d80"),u=function(d){return function(h,k){var m=String(c(h)),b=s(k),g=m.length,v,w;return b<0||b>=g?d?"":void 0:(v=m.charCodeAt(b),v<55296||v>56319||b+1===g||(w=m.charCodeAt(b+1))<56320||w>57343?d?m.charAt(b):v:d?m.slice(b,b+2):(v-55296<<10)+(w-56320)+65536)}};r.exports={codeAt:u(!1),charAt:u(!0)}},"65f0":function(r,l,a){var s=a("861d"),c=a("e8b5"),u=a("b622"),d=u("species");r.exports=function(h,k){var m;return c(h)&&(m=h.constructor,typeof m=="function"&&(m===Array||c(m.prototype))?m=void 0:s(m)&&(m=m[d],m===null&&(m=void 0))),new(m===void 0?Array:m)(k===0?0:k)}},"69f3":function(r,l,a){var s=a("7f9a"),c=a("da84"),u=a("861d"),d=a("9112"),h=a("5135"),k=a("f772"),m=a("d012"),b=c.WeakMap,g,v,w,L=function(D){return w(D)?v(D):g(D,{})},x=function(D){return function(P){var z;if(!u(P)||(z=v(P)).type!==D)throw TypeError("Incompatible receiver, "+D+" required");return z}};if(s){var S=new b,E=S.get,A=S.has,T=S.set;g=function(D,P){return T.call(S,D,P),P},v=function(D){return E.call(S,D)||{}},w=function(D){return A.call(S,D)}}else{var j=k("state");m[j]=!0,g=function(D,P){return d(D,j,P),P},v=function(D){return h(D,j)?D[j]:{}},w=function(D){return h(D,j)}}r.exports={set:g,get:v,has:w,enforce:L,getterFor:x}},"6eeb":function(r,l,a){var s=a("da84"),c=a("9112"),u=a("5135"),d=a("ce4e"),h=a("8925"),k=a("69f3"),m=k.get,b=k.enforce,g=String(String).split("String");(r.exports=function(v,w,L,x){var S=x?!!x.unsafe:!1,E=x?!!x.enumerable:!1,A=x?!!x.noTargetGet:!1;if(typeof L=="function"&&(typeof w=="string"&&!u(L,"name")&&c(L,"name",w),b(L).source=g.join(typeof w=="string"?w:"")),v===s){E?v[w]=L:d(w,L);return}else S?!A&&v[w]&&(E=!0):delete v[w];E?v[w]=L:c(v,w,L)})(Function.prototype,"toString",function(){return typeof this=="function"&&m(this).source||h(this)})},"6f53":function(r,l,a){var s=a("83ab"),c=a("df75"),u=a("fc6a"),d=a("d1e7").f,h=function(k){return function(m){for(var b=u(m),g=c(b),v=g.length,w=0,L=[],x;v>w;)x=g[w++],(!s||d.call(b,x))&&L.push(k?[x,b[x]]:b[x]);return L}};r.exports={entries:h(!0),values:h(!1)}},"73d9":function(r,l,a){var s=a("44d2");s("flatMap")},7418:function(r,l){l.f=Object.getOwnPropertySymbols},"746f":function(r,l,a){var s=a("428f"),c=a("5135"),u=a("e538"),d=a("9bf2").f;r.exports=function(h){var k=s.Symbol||(s.Symbol={});c(k,h)||d(k,h,{value:u.f(h)})}},7839:function(r,l){r.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},"7b0b":function(r,l,a){var s=a("1d80");r.exports=function(c){return Object(s(c))}},"7c73":function(r,l,a){var s=a("825a"),c=a("37e8"),u=a("7839"),d=a("d012"),h=a("1be4"),k=a("cc12"),m=a("f772"),b=">",g="<",v="prototype",w="script",L=m("IE_PROTO"),x=function(){},S=function(D){return g+w+b+D+g+"/"+w+b},E=function(D){D.write(S("")),D.close();var P=D.parentWindow.Object;return D=null,P},A=function(){var D=k("iframe"),P="java"+w+":",z;return D.style.display="none",h.appendChild(D),D.src=String(P),z=D.contentWindow.document,z.open(),z.write(S("document.F=Object")),z.close(),z.F},T,j=function(){try{T=document.domain&&new ActiveXObject("htmlfile")}catch{}j=T?E(T):A();for(var D=u.length;D--;)delete j[v][u[D]];return j()};d[L]=!0,r.exports=Object.create||function(P,z){var N;return P!==null?(x[v]=s(P),N=new x,x[v]=null,N[L]=P):N=j(),z===void 0?N:c(N,z)}},"7dd0":function(r,l,a){var s=a("23e7"),c=a("9ed3"),u=a("e163"),d=a("d2bb"),h=a("d44e"),k=a("9112"),m=a("6eeb"),b=a("b622"),g=a("c430"),v=a("3f8c"),w=a("ae93"),L=w.IteratorPrototype,x=w.BUGGY_SAFARI_ITERATORS,S=b("iterator"),E="keys",A="values",T="entries",j=function(){return this};r.exports=function(D,P,z,N,W,R,U){c(z,P,N);var p=function(ke){if(ke===W&&Z)return Z;if(!x&&ke in q)return q[ke];switch(ke){case E:return function(){return new z(this,ke)};case A:return function(){return new z(this,ke)};case T:return function(){return new z(this,ke)}}return function(){return new z(this)}},H=P+" Iterator",B=!1,q=D.prototype,J=q[S]||q["@@iterator"]||W&&q[W],Z=!x&&J||p(W),ie=P=="Array"&&q.entries||J,te,le,de;if(ie&&(te=u(ie.call(new D)),L!==Object.prototype&&te.next&&(!g&&u(te)!==L&&(d?d(te,L):typeof te[S]!="function"&&k(te,S,j)),h(te,H,!0,!0),g&&(v[H]=j))),W==A&&J&&J.name!==A&&(B=!0,Z=function(){return J.call(this)}),(!g||U)&&q[S]!==Z&&k(q,S,Z),v[P]=Z,W)if(le={values:p(A),keys:R?Z:p(E),entries:p(T)},U)for(de in le)(x||B||!(de in q))&&m(q,de,le[de]);else s({target:P,proto:!0,forced:x||B},le);return le}},"7f9a":function(r,l,a){var s=a("da84"),c=a("8925"),u=s.WeakMap;r.exports=typeof u=="function"&&/native code/.test(c(u))},"825a":function(r,l,a){var s=a("861d");r.exports=function(c){if(!s(c))throw TypeError(String(c)+" is not an object");return c}},"83ab":function(r,l,a){var s=a("d039");r.exports=!s(function(){return Object.defineProperty({},1,{get:function(){return 7}})[1]!=7})},8418:function(r,l,a){var s=a("c04e"),c=a("9bf2"),u=a("5c6c");r.exports=function(d,h,k){var m=s(h);m in d?c.f(d,m,u(0,k)):d[m]=k}},"861d":function(r,l){r.exports=function(a){return typeof a=="object"?a!==null:typeof a=="function"}},8875:function(r,l,a){var s,c,u;(function(d,h){c=[],s=h,u=typeof s=="function"?s.apply(l,c):s,u!==void 0&&(r.exports=u)})(typeof self<"u"?self:this,function(){function d(){var h=Object.getOwnPropertyDescriptor(document,"currentScript");if(!h&&"currentScript"in document&&document.currentScript||h&&h.get!==d&&document.currentScript)return document.currentScript;try{throw new Error}catch(T){var k=/.*at [^(]*\((.*):(.+):(.+)\)$/ig,m=/@([^@]*):(\d+):(\d+)\s*$/ig,b=k.exec(T.stack)||m.exec(T.stack),g=b&&b[1]||!1,v=b&&b[2]||!1,w=document.location.href.replace(document.location.hash,""),L,x,S,E=document.getElementsByTagName("script");g===w&&(L=document.documentElement.outerHTML,x=new RegExp("(?:[^\\n]+?\\n){0,"+(v-2)+"}[^<]* +
diff --git a/src/agents/outlineScript/index.ts b/src/agents/outlineScript/index.ts index 30348ed..2ca7d75 100644 --- a/src/agents/outlineScript/index.ts +++ b/src/agents/outlineScript/index.ts @@ -700,7 +700,6 @@ ${task} const envContext = await this.buildEnvironmentContext(); const prompts = await u.db("t_prompts").where("code", "outlineScript-main").first(); - console.log("%c Line:703 🍭 prompts", "background:#f5ce50", prompts); const promptConfig = await u.getPromptAi("outlineScriptAgent"); const mainPrompts = prompts?.customValue || prompts?.defaultValue || "不论用户说什么,请直接输出Agent配置异常"; diff --git a/src/agents/storyboard/generateImageTool.ts b/src/agents/storyboard/generateImageTool.ts index 52bcae6..0c61d31 100644 --- a/src/agents/storyboard/generateImageTool.ts +++ b/src/agents/storyboard/generateImageTool.ts @@ -36,18 +36,6 @@ interface ResourceItem { intro: string; } -// 资产过滤响应的 schema -const filteredAssetsSchema = z.object({ - relevantAssets: z - .array( - z.object({ - name: z.string().describe("资产名称"), - reason: z.string().describe("选择该资产的原因"), - }), - ) - .describe("与分镜内容相关的资产列表"), -}); - // 压缩图片直到不超过指定大小 async function compressImage(buffer: Buffer, maxSizeBytes: number = 3 * 1024 * 1024): Promise { if (buffer.length <= maxSizeBytes) { diff --git a/src/lib/fixDB.ts b/src/lib/fixDB.ts index 501a6f6..f9aa900 100644 --- a/src/lib/fixDB.ts +++ b/src/lib/fixDB.ts @@ -1,17 +1,40 @@ import { Knex } from "knex"; export default async (knex: Knex): Promise => { - const videoHasTime = await knex.schema.hasColumn("t_video", "time"); - if (!videoHasTime) { - await knex.schema.alterTable("t_video", (table) => { - table.integer("time"); - }); - } + const addColumn = async (table: string, column: string, type: string) => { + if (!(await knex.schema.hasColumn(table, column))) { + await knex.schema.alterTable(table, (t) => (t as any)[type](column)); + } + }; - const configHasIndex = await knex.schema.hasColumn("t_config", "index"); - if (configHasIndex) { - await knex.schema.alterTable("t_config", (table) => { - table.dropColumn("index"); - }); - } + const dropColumn = async (table: string, column: string) => { + if (await knex.schema.hasColumn(table, column)) { + await knex.schema.alterTable(table, (t) => t.dropColumn(column)); + } + }; + + const alterColumnType = async (table: string, column: string, type: string) => { + if (await knex.schema.hasColumn(table, column)) { + await knex.schema.alterTable(table, (t) => { + (t as any)[type](column).alter(); + }); + } + }; + + //添加字段 + await addColumn("t_video", "time", "integer"); + await addColumn("t_video", "aiConfigId", "integer"); + await addColumn("t_config", "modelType", "text"); + + //更正字段 + await alterColumnType("t_config", "modelType", "text"); + + //删除字段 + await dropColumn("t_config", "index"); + + await knex("t_prompts") + .update({ + defaultValue: `# 电影分镜提示词优化师\n\n你是专业电影分镜提示词优化师,负责将用户的分镜描述转化为高质量的AI绘图JSON提示词。\n\n## 核心原则\n\n### 保留原始信息\n- 人物描述:五官、表情、姿态、动作、视线\n- 服装细节:款式、颜色、材质\n- 场景元素:建筑、物品、光影、天气\n- 构图信息:人物位置、景深\n\n### 原始语言保留规则(强制执行)\n\n**此规则优先级最高,必须严格遵守:**\n\n| 类型 | 规则 | 正确示例 | 错误示例 |\n|------|------|----------|----------|\n| 人物名 | 保留原文,禁止翻译或拼音 | \`王林 standing\` | \`Wang Lin standing\` |\n| 场景地名 | 保留原文 | \`老旧厢房 interior\` | \`old room interior\` |\n| 道具名 | 保留原文 | \`油纸伞 in hand\` | \`oil paper umbrella\` |\n| 服装名 | 保留原文 | \`青布长衫\` | \`blue cloth robe\` |\n| 物品名 | 保留原文 | \`发黄书册\` | \`yellowed book\` |\n| 建筑名 | 保留原文 | \`厢房 window\` | \`side room window\` |\n\n**prompt_text 写法示范:**\n\`\`\`\nMedium shot, 王林 sitting at desk, 发黄书册 in foreground, 油纸伞 beside, 老旧厢房 interior, dim lighting...\n\`\`\`\n\n### 补充电影语言\n- 景别:大远景/远景/全景/中景/近景/特写\n- 机位:平视/俯拍/仰拍/侧拍/过肩镜头\n- 构图:三分法/中心构图/对角线/框架构图\n- 光影:光源方向、光质(硬光/柔光)、色温\n\n## 连贯性规则\n\n1. **位置固化**:人物左右站位全程不变\n2. **场景固化**:建筑、道具位置全程一致\n3. **光照固化**:光源方向、阴影、色温统一\n4. **时间固化**:时间段和天气全程不变\n5. **色调固化**:主色调和冷暖倾向一致\n\n## Prompt核心规则\n\n1. **极简提炼**:将复杂场景压缩为核心关键词\n2. **标签化语法**:使用"关键词 + 逗号"形式,严禁长难句\n3. **字数控制**:每个 prompt_text 严格控制在 **25-40个单词**\n4. **强制后缀**:每个prompt末尾必须加 \`8k, ultra HD, high detail, no timecode, no subtitles\`\n5. **风格标签**:从用户描述中提取3-4个风格标签追加到prompt\n6. **禁止废话**:严禁 "A scene showing...", "There is a..." 等句式\n7. **原名保留**:人物名、地名、道具名、服装名、物品名必须使用用户输入的原始语言,直接嵌入prompt中\n\n### Prompt组合公式\n\n\`\`\`\n[景别英文] + [主体原名 + 动作英文] + [道具原名] + [场景原名 + 环境英文描述] + [风格标签] + 8k, ultra HD, high detail, no timecode, no subtitles\n\`\`\`\n\n## 插黑图规则\n\n### 识别方式\n用户输入以下任意表述时,识别为插黑图:\n- \`纯黑图\`\n- \`黑屏\`\n- \`黑幕\`\n- \`全黑\`\n- \`black frame\`\n- \`淡出黑\`\n- \`fade to black\`\n\n### 固定输出格式\n插黑图的 prompt_text 固定为:\n\`\`\`\nPure black frame, 8k, ultra HD, high detail, no timecode, no subtitles\n\`\`\`\n\n### 布局计算\n- 插黑图计入总格数\n- 根据实际shot数量(含插黑图)自动计算grid_layout\n- 示例:9个内容镜头 + 3个插黑图 = 12格 = 3x4布局\n\n## 超清标识(强制追加)\n\n每个 prompt_text 末尾必须包含:\n\`\`\`\n8k, ultra HD, high detail, no timecode, no subtitles\n\`\`\`\n\n## 风格标签参考\n\n| 用户风格描述 | 提取标签示例 |\n|-------------|-------------|\n| 赛博朋克 | Cyberpunk, Neon glow, High contrast, Futuristic |\n| 水墨国风 | Chinese ink painting, Minimalist, Ethereal, Monochrome |\n| 日系动漫 | Anime style, Soft lighting, Pastel colors, 2D aesthetic |\n| 电影写实 | Cinematic, Photorealistic, Film grain, Dramatic lighting |\n| 3D渲染 | 3D render, Octane render, Volumetric lighting |\n| 仙侠古风 | Xianxia, Chinese ancient style, 2D aesthetic, Cinematic |\n\n## 分辨率配置\n\n### 全局分辨率\n- 在 \`global_settings\` 中设置全局默认分辨率\n- 可选值:\`"16:9"\` 或 \`"9:16"\`\n\n### 单镜分辨率(新增)\n- 每个shot可独立配置 \`grid_aspect_ratio\`\n- 优先级:单镜配置 > 全局配置\n- 用途:特殊镜头(如竖版手机画面、横版宽屏等)\n\n## 输出格式\n\n默认布局:**3列×3行=9格**,根据实际镜头数量自动调整行数。\n\n严格输出纯净JSON,无任何额外说明:\n\n\`\`\`json\n{\n "image_generation_model": "NanoBananaPro",\n "grid_layout": "3x行数",\n "grid_aspect_ratio": "16:9",\n "style_tags": "风格标签",\n "global_settings": {\n "scene": "场景描述(保留原名)",\n "time": "时间",\n "lighting": "光照",\n "color_tone": "色调",\n "character_position": "人物站位(保留原名)"\n },\n "shots": [\n {\n "shot_number": "第1行第1列",\n "grid_aspect_ratio": "16:9",\n "prompt_text": "精简prompt,原名嵌入..."\n }\n ]\n}\n\`\`\`\n\n## 输出示例\n\n用户输入:\n【风格】仙侠古风\n【人物】王林\n【地点】老旧厢房\n【道具】油纸伞、发黄书册、青布长衫\n[1]: 老旧厢房窗外夜色沉静,王林孤身桌旁\n[2]: 王林坐桌前,左手压书册,右手握油纸伞柄\n[3]: 王林俯身低语,眉头微蹙\n[4]: 王林双眼闭合,双手合十\n[5]: 王林手握油纸伞柄特写\n[6]: 王林眼部特写,瞳孔倒映灯光\n[7]: 王林起身推开窗户,月光流泻\n[8]: 王林目光望向窗外夜色\n[9]: 王林坐回书桌沉思\n[10]: 纯黑图\n[11]: 纯黑图\n[12]: 纯黑图\n\n优化输出:\n\`\`\`json\n{\n "image_generation_model": "NanoBananaPro",\n "grid_layout": "3x4",\n "grid_aspect_ratio": "16:9",\n "style_tags": "Xianxia, Chinese ancient style, 2D aesthetic, Cinematic",\n "global_settings": {\n "scene": "老旧厢房 interior at night, 发黄书册 and 油纸伞 as props, cold blue atmosphere",\n "time": "Midnight",\n "lighting": "Dim cold blue with warm lamp spots, soft shadows",\n "color_tone": "Cool blue primary, subtle warm accents",\n "character_position": "王林 center frame throughout"\n },\n "shots": [\n {\n "shot_number": "第1行第1列",\n "grid_aspect_ratio": "16:9",\n "prompt_text": "Wide shot, 老旧厢房 interior night, 王林 sitting alone at desk, 油纸伞 and 发黄书册 in foreground, breeze through window gauze, cold blue tones, Xianxia, 2D aesthetic, 8k, ultra HD, high detail, no timecode, no subtitles"\n },\n {\n "shot_number": "第1行第2列",\n "grid_aspect_ratio": "16:9",\n "prompt_text": "Full shot, slight low angle, 王林 seated at desk, left hand pressing 发黄书册, right hand gripping 油纸伞 handle, 青布长衫 collar catching light, lamp glow contrast, Xianxia, 2D aesthetic, 8k, ultra HD, high detail, no timecode, no subtitles"\n },\n {\n "shot_number": "第1行第3列",\n "grid_aspect_ratio": "16:9",\n "prompt_text": "Medium shot, 王林 leaning forward whispering, brows furrowed, lamp shadow falling on 发黄书册 pages, cool tone, inner resolve, Xianxia, 2D aesthetic, 8k, ultra HD, high detail, no timecode, no subtitles"\n },\n {\n "shot_number": "第2行第1列",\n "grid_aspect_ratio": "16:9",\n "prompt_text": "Close-up, 王林 eyes closed, resolute brow, hands clasped at chest, 油纸伞 silhouette blurred behind, warm lamp spots, shallow depth, Xianxia, 2D aesthetic, 8k, ultra HD, high detail, no timecode, no subtitles"\n },\n {\n "shot_number": "第2行第2列",\n "grid_aspect_ratio": "16:9",\n "prompt_text": "Extreme close-up, 王林 hand gripping 油纸伞 handle, finger details sharp, 发黄书册 edge visible, umbrella pattern texture, rim light, cold blue tone, Xianxia, 2D aesthetic, 8k, ultra HD, high detail, no timecode, no subtitles"\n },\n {\n "shot_number": "第2行第3列",\n "grid_aspect_ratio": "16:9",\n "prompt_text": "Ultra close-up, top light, 王林 eye detail, pupil reflecting lamp and book pages, tear traces on brow, sweat on face, shallow focus, emotion surge, Xianxia, 2D aesthetic, 8k, ultra HD, high detail, no timecode, no subtitles"\n },\n {\n "shot_number": "第3行第1列",\n "grid_aspect_ratio": "16:9",\n "prompt_text": "Medium shot, 王林 rising to push 老旧厢房 window open, moonlight flooding in, night breeze moving gauze, village path dimly visible, cool tones, spatial layering, Xianxia, 2D aesthetic, 8k, ultra HD, high detail, no timecode, no subtitles"\n },\n {\n "shot_number": "第3行第2列",\n "grid_aspect_ratio": "16:9",\n "prompt_text": "Close-up POV, 王林 gaze toward night outside 老旧厢房 window, quiet village, scattered lantern lights, window lattice shadows, deep blue grey, silent hope, Xianxia, 2D aesthetic, 8k, ultra HD, high detail, no timecode, no subtitles"\n },\n {\n "shot_number": "第3行第3列",\n "grid_aspect_ratio": "16:9",\n "prompt_text": "Wide shot, 王林 seated back at desk in thought, murmuring softly, lamp dimming, starry night vast outside 老旧厢房, deep focus, blue yellow mix, determined mind, Xianxia, 2D aesthetic, 8k, ultra HD, high detail, no timecode, no subtitles"\n },\n {\n "shot_number": "第4行第1列",\n "grid_aspect_ratio": "16:9",\n "prompt_text": "Pure black frame, 8k, ultra HD, high detail, no timecode, no subtitles"\n },\n {\n "shot_number": "第4行第2列",\n "grid_aspect_ratio": "16:9",\n "prompt_text": "Pure black frame, 8k, ultra HD, high detail, no timecode, no subtitles"\n },\n {\n "shot_number": "第4行第3列",\n "grid_aspect_ratio": "16:9",\n "prompt_text": "Pure black frame, 8k, ultra HD, high detail, no timecode, no subtitles"\n }\n ]\n}\n\`\`\`\n\n## 注意事项\n\n1. **原名强制保留**:每格prompt中的人物名、场景名、道具名、服装名必须使用用户输入的原始语言文字,禁止翻译、禁止拼音转写\n2. 每格必须写完整人物名称(原始语言),不可用代词(he/she/they)\n3. **插黑图固定格式**:\`Pure black frame, 8k, ultra HD, high detail, no timecode, no subtitles\`\n4. 直接输出JSON,不要任何解释或Markdown包裹\n5. 确保各格描述连贯一致\n6. shots数组数量必须与布局格数一致(含插黑图)\n7. **每个prompt_text必须以 \`8k, ultra HD, high detail, no timecode, no subtitles\` 结尾**\n8. **布局自动计算**:根据总镜头数(内容+插黑图)计算行数,列数固定为3\n9. **分辨率配置**:每个shot必须包含 \`grid_aspect_ratio\` 字段,值为 \`"16:9"\` 或 \`"9:16"\`\n\n## 原名保留自查清单\n\n输出前检查每个prompt_text:\n- [ ] 人物名是否为原始语言?(如 王林 而非 Wang Lin)\n- [ ] 场景名是否为原始语言?(如 老旧厢房 而非 old side room)\n- [ ] 道具名是否为原始语言?(如 油纸伞 而非 oil paper umbrella)\n- [ ] 服装名是否为原始语言?(如 青布长衫 而非 blue cloth robe)\n- [ ] 是否以超清标识结尾?\n- [ ] 插黑图是否使用固定格式?\n- [ ] 每个shot是否包含 \`grid_aspect_ratio\` 字段?\n\n## shot_number计算验证表\n\n**16:9布局(3列)验证:**\n| 镜头索引 | 计算公式 | shot_number |\n|---------|---------|-------------|\n| 0 | (0//3+1, 0%3+1) | 第1行第1列 |\n| 1 | (1//3+1, 1%3+1) | 第1行第2列 |\n| 2 | (2//3+1, 2%3+1) | 第1行第3列 |\n| 3 | (3//3+1, 3%3+1) | 第2行第1列 |\n| 4 | (4//3+1, 4%3+1) | 第2行第2列 |\n| 5 | (5//3+1, 5%3+1) | 第2行第3列 |\n\n**9:16布局(2列)验证:**\n| 镜头索引 | 计算公式 | shot_number |\n|---------|---------|-------------|\n| 0 | (0//2+1, 0%2+1) | 第1行第1列 |\n| 1 | (1//2+1, 1%2+1) | 第1行第2列 |\n| 2 | (2//2+1, 2%2+1) | 第2行第1列 |\n| 3 | (3//2+1, 3%2+1) | 第2行第2列 |\n| 4 | (4//2+1, 4%2+1) | 第3行第1列 |\n| 5 | (5//2+1, 5%2+1) | 第3行第2列 |`, + }) + .where("id", 8); }; diff --git a/src/lib/initDB.ts b/src/lib/initDB.ts index 8876fe0..86185b2 100644 --- a/src/lib/initDB.ts +++ b/src/lib/initDB.ts @@ -212,7 +212,7 @@ export default async (knex: Knex, forceInit: boolean = false): Promise => table.integer("id").notNullable(); table.integer("scriptId"); // 关联的脚本ID table.integer("projectId"); // 关联的项目ID - table.integer("aiConfigId");//ai配置ID + table.integer("aiConfigId"); //ai配置ID table.text("manufacturer"); // 厂商:volcengine/runninghub/openAi table.text("mode"); // 模式:startEnd/multi/single table.text("startFrame"); // 首帧图片信息 JSON @@ -522,6 +522,28 @@ export default async (knex: Knex, forceInit: boolean = false): Promise => ]); }, }, + { + name: "t_aiModelMap", + builder: (table) => { + table.integer("id").notNullable(); + table.integer("configId"); + table.text("name"); + table.text("key"); + table.primary(["id"]); + }, + initData: async (knex) => { + await knex("t_aiModelMap").insert([ + { id: 1, configId: 3, name: "分镜Agent", key: "storyboardAgent" }, + { id: 2, configId: 2, name: "大纲故事线Agent", key: "outlineScriptAgent" }, + { id: 3, configId: 4, name: "资产提示词润色", key: "assetsPrompt" }, + { id: 4, configId: 5, name: "资产图片生成", key: "assetsImage" }, + { id: 5, configId: 3, name: "剧本生成", key: "generateScript" }, + { id: 6, configId: 2, name: "视频提示词生成", key: "videoPrompt" }, + { id: 7, configId: 5, name: "分镜图片生成", key: "storyboardImage" }, + { id: 8, configId: 5, name: "图片编辑", key: "editImage" }, + ]); + }, + }, ]; for (const t of tables) { diff --git a/src/routes/assets/polishPrompt.ts b/src/routes/assets/polishPrompt.ts index 3efa125..06a28ac 100644 --- a/src/routes/assets/polishPrompt.ts +++ b/src/routes/assets/polishPrompt.ts @@ -4,9 +4,6 @@ import * as zod from "zod"; import { error, success } from "@/lib/responseFormat"; import { validateFields } from "@/middleware/middleware"; const router = express.Router(); -const jsonSchema = zod.object({ - prompt: zod.string().describe("提示词"), -}); interface OutlineItem { description: string; name: string; @@ -206,26 +203,6 @@ export default router.post( }, apiConfigData, ); - // const result = await model.invoke({ - // messages: [ - // { - // role: "system", - // content: systemPrompt, - // }, - // { - // role: "user", - // content: userPrompt, - // }, - // ], - // responseFormat: { - // type: "json_schema", - // jsonSchema: { - // name: "json", - // strict: true, - // schema: zod.toJSONSchema(jsonSchema), - // }, - // }, - // }); return result.prompt; } try { diff --git a/src/routes/storyboard/generateVideoPrompt.ts b/src/routes/storyboard/generateVideoPrompt.ts index fb97a04..37de60f 100644 --- a/src/routes/storyboard/generateVideoPrompt.ts +++ b/src/routes/storyboard/generateVideoPrompt.ts @@ -3,17 +3,10 @@ import u from "@/utils"; import { error, success } from "@/lib/responseFormat"; import { validateFields } from "@/middleware/middleware"; import { z } from "zod"; -import path from "path"; import axios from "axios"; const router = express.Router(); -const cellsResultSchema = z.object({ - time: z.number().describe("时长,镜头时长 1-15"), - content: z.string().describe("提示词内容"), - name: z.string().describe("分镜名称"), -}); - const prompt = ` 你是一名资深动画导演,擅长将静态分镜转化为简洁、专业、详尽的 Motion Prompt(视频生成动作提示)。你理解镜头语言、情绪节奏,能补充丰富但不重复静态元素,只突出变化与动态。 diff --git a/src/types/database.d.ts b/src/types/database.d.ts index 250f5ab..ae567b4 100644 --- a/src/types/database.d.ts +++ b/src/types/database.d.ts @@ -1,4 +1,4 @@ -// @db-hash 4cd44aef6bb6ffb02c4619525966496d +// @db-hash c6deb23c67bf5d27c997e299cd878da1 //该文件由脚本自动生成,请勿手动修改 export interface t_aiModelMap { @@ -123,6 +123,7 @@ export interface t_user { 'password'?: string | null; } export interface t_video { + 'aiConfigId'?: number | null; 'configId'?: number | null; 'filePath'?: string | null; 'firstFrame'?: string | null; diff --git a/src/utils/ai/video/index.ts b/src/utils/ai/video/index.ts index f8f7183..7f3a15b 100644 --- a/src/utils/ai/video/index.ts +++ b/src/utils/ai/video/index.ts @@ -22,7 +22,6 @@ const modelInstance = { } as const; export default async (input: VideoConfig, config?: AIConfig) => { - console.log("%c Line:25 🥛 config", "background:#2eafb0", config); const { model, apiKey, baseURL, manufacturer } = { ...config }; if (!config || !config?.model || !config?.apiKey) throw new Error("请检查模型配置是否正确");