@marsken/dsh-studio 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/client.js +42 -42
- package/dist/client.js +42 -42
- package/docs/compatibility.md +1 -1
- package/docs/publish.md +3 -1
- package/package.json +1 -1
- package/src/host/dispatcher.js +2 -0
- package/src/host/executor.js +8 -1
- package/src/host/webhooks.js +1 -1
package/client.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var
|
|
1
|
+
var Ry=Ft=>{throw TypeError(Ft)};var Ay=(Ft,aa,ca)=>aa.has(Ft)||Ry("Cannot "+ca);var Wt=(Ft,aa,ca)=>(Ay(Ft,aa,"read from private field"),ca?ca.call(Ft):aa.get(Ft)),jy=(Ft,aa,ca)=>aa.has(Ft)?Ry("Cannot add the same private member more than once"):aa instanceof WeakSet?aa.add(Ft):aa.set(Ft,ca),jp=(Ft,aa,ca,De)=>(Ay(Ft,aa,"write to private field"),De?De.call(Ft,ca):aa.set(Ft,ca),ca);(function(){"use strict";var Nt,xa;function Ft(e,t){for(var a=0;a<t.length;a++){const n=t[a];if(typeof n!="string"&&!Array.isArray(n)){for(const r in n)if(r!=="default"&&!(r in e)){const s=Object.getOwnPropertyDescriptor(n,r);s&&Object.defineProperty(e,r,s.get?s:{enumerable:!0,get:()=>n[r]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}function aa(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var ca={exports:{}},De={};/**
|
|
2
2
|
* @license React
|
|
3
3
|
* react.production.min.js
|
|
4
4
|
*
|
|
@@ -6,32 +6,32 @@ var Iy=Ft=>{throw TypeError(Ft)};var Ry=(Ft,ta,ca)=>ta.has(Ft)||Iy("Cannot "+ca)
|
|
|
6
6
|
*
|
|
7
7
|
* This source code is licensed under the MIT license found in the
|
|
8
8
|
* LICENSE file in the root directory of this source tree.
|
|
9
|
-
*/var $r=Symbol.for("react.element"),jy=Symbol.for("react.portal"),Dy=Symbol.for("react.fragment"),Oy=Symbol.for("react.strict_mode"),Ly=Symbol.for("react.profiler"),My=Symbol.for("react.provider"),zy=Symbol.for("react.context"),Fy=Symbol.for("react.forward_ref"),By=Symbol.for("react.suspense"),Uy=Symbol.for("react.memo"),qy=Symbol.for("react.lazy"),Dp=Symbol.iterator;function Vy(e){return e===null||typeof e!="object"?null:(e=Dp&&e[Dp]||e["@@iterator"],typeof e=="function"?e:null)}var Op={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Lp=Object.assign,Mp={};function Rs(e,t,a){this.props=e,this.context=t,this.refs=Mp,this.updater=a||Op}Rs.prototype.isReactComponent={},Rs.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},Rs.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function zp(){}zp.prototype=Rs.prototype;function Ml(e,t,a){this.props=e,this.context=t,this.refs=Mp,this.updater=a||Op}var zl=Ml.prototype=new zp;zl.constructor=Ml,Lp(zl,Rs.prototype),zl.isPureReactComponent=!0;var Fp=Array.isArray,Bp=Object.prototype.hasOwnProperty,Fl={current:null},Up={key:!0,ref:!0,__self:!0,__source:!0};function qp(e,t,a){var n,r={},s=null,o=null;if(t!=null)for(n in t.ref!==void 0&&(o=t.ref),t.key!==void 0&&(s=""+t.key),t)Bp.call(t,n)&&!Up.hasOwnProperty(n)&&(r[n]=t[n]);var i=arguments.length-2;if(i===1)r.children=a;else if(1<i){for(var l=Array(i),c=0;c<i;c++)l[c]=arguments[c+2];r.children=l}if(e&&e.defaultProps)for(n in i=e.defaultProps,i)r[n]===void 0&&(r[n]=i[n]);return{$$typeof:$r,type:e,key:s,ref:o,props:r,_owner:Fl.current}}function Wy(e,t){return{$$typeof:$r,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}function Bl(e){return typeof e=="object"&&e!==null&&e.$$typeof===$r}function Hy(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(a){return t[a]})}var Vp=/\/+/g;function Ul(e,t){return typeof e=="object"&&e!==null&&e.key!=null?Hy(""+e.key):t.toString(36)}function Oo(e,t,a,n,r){var s=typeof e;(s==="undefined"||s==="boolean")&&(e=null);var o=!1;if(e===null)o=!0;else switch(s){case"string":case"number":o=!0;break;case"object":switch(e.$$typeof){case $r:case jy:o=!0}}if(o)return o=e,r=r(o),e=n===""?"."+Ul(o,0):n,Fp(r)?(a="",e!=null&&(a=e.replace(Vp,"$&/")+"/"),Oo(r,t,a,"",function(c){return c})):r!=null&&(Bl(r)&&(r=Wy(r,a+(!r.key||o&&o.key===r.key?"":(""+r.key).replace(Vp,"$&/")+"/")+e)),t.push(r)),1;if(o=0,n=n===""?".":n+":",Fp(e))for(var i=0;i<e.length;i++){s=e[i];var l=n+Ul(s,i);o+=Oo(s,t,a,l,r)}else if(l=Vy(e),typeof l=="function")for(e=l.call(e),i=0;!(s=e.next()).done;)s=s.value,l=n+Ul(s,i++),o+=Oo(s,t,a,l,r);else if(s==="object")throw t=String(e),Error("Objects are not valid as a React child (found: "+(t==="[object Object]"?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return o}function Lo(e,t,a){if(e==null)return e;var n=[],r=0;return Oo(e,n,"","",function(s){return t.call(a,s,r++)}),n}function Gy(e){if(e._status===-1){var t=e._result;t=t(),t.then(function(a){(e._status===0||e._status===-1)&&(e._status=1,e._result=a)},function(a){(e._status===0||e._status===-1)&&(e._status=2,e._result=a)}),e._status===-1&&(e._status=0,e._result=t)}if(e._status===1)return e._result.default;throw e._result}var Xt={current:null},Mo={transition:null},Ky={ReactCurrentDispatcher:Xt,ReactCurrentBatchConfig:Mo,ReactCurrentOwner:Fl};function Wp(){throw Error("act(...) is not supported in production builds of React.")}De.Children={map:Lo,forEach:function(e,t,a){Lo(e,function(){t.apply(this,arguments)},a)},count:function(e){var t=0;return Lo(e,function(){t++}),t},toArray:function(e){return Lo(e,function(t){return t})||[]},only:function(e){if(!Bl(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},De.Component=Rs,De.Fragment=Dy,De.Profiler=Ly,De.PureComponent=Ml,De.StrictMode=Oy,De.Suspense=By,De.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Ky,De.act=Wp,De.cloneElement=function(e,t,a){if(e==null)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var n=Lp({},e.props),r=e.key,s=e.ref,o=e._owner;if(t!=null){if(t.ref!==void 0&&(s=t.ref,o=Fl.current),t.key!==void 0&&(r=""+t.key),e.type&&e.type.defaultProps)var i=e.type.defaultProps;for(l in t)Bp.call(t,l)&&!Up.hasOwnProperty(l)&&(n[l]=t[l]===void 0&&i!==void 0?i[l]:t[l])}var l=arguments.length-2;if(l===1)n.children=a;else if(1<l){i=Array(l);for(var c=0;c<l;c++)i[c]=arguments[c+2];n.children=i}return{$$typeof:$r,type:e.type,key:r,ref:s,props:n,_owner:o}},De.createContext=function(e){return e={$$typeof:zy,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null},e.Provider={$$typeof:My,_context:e},e.Consumer=e},De.createElement=qp,De.createFactory=function(e){var t=qp.bind(null,e);return t.type=e,t},De.createRef=function(){return{current:null}},De.forwardRef=function(e){return{$$typeof:Fy,render:e}},De.isValidElement=Bl,De.lazy=function(e){return{$$typeof:qy,_payload:{_status:-1,_result:e},_init:Gy}},De.memo=function(e,t){return{$$typeof:Uy,type:e,compare:t===void 0?null:t}},De.startTransition=function(e){var t=Mo.transition;Mo.transition={};try{e()}finally{Mo.transition=t}},De.unstable_act=Wp,De.useCallback=function(e,t){return Xt.current.useCallback(e,t)},De.useContext=function(e){return Xt.current.useContext(e)},De.useDebugValue=function(){},De.useDeferredValue=function(e){return Xt.current.useDeferredValue(e)},De.useEffect=function(e,t){return Xt.current.useEffect(e,t)},De.useId=function(){return Xt.current.useId()},De.useImperativeHandle=function(e,t,a){return Xt.current.useImperativeHandle(e,t,a)},De.useInsertionEffect=function(e,t){return Xt.current.useInsertionEffect(e,t)},De.useLayoutEffect=function(e,t){return Xt.current.useLayoutEffect(e,t)},De.useMemo=function(e,t){return Xt.current.useMemo(e,t)},De.useReducer=function(e,t,a){return Xt.current.useReducer(e,t,a)},De.useRef=function(e){return Xt.current.useRef(e)},De.useState=function(e){return Xt.current.useState(e)},De.useSyncExternalStore=function(e,t,a){return Xt.current.useSyncExternalStore(e,t,a)},De.useTransition=function(){return Xt.current.useTransition()},De.version="18.3.1",ca.exports=De;var N=ca.exports;const Rn=Ft({__proto__:null,default:ta(N)},[N]),Yy=`[data-dsh-studio] *,[data-dsh-studio-portal] *,[data-dsh-studio] :before,[data-dsh-studio-portal] :before,[data-dsh-studio] :after,[data-dsh-studio-portal] :after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }[data-dsh-studio] ::backdrop,[data-dsh-studio-portal] ::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }[data-dsh-studio] .container,[data-dsh-studio-portal] .container{width:100%}@media (min-width: 640px){[data-dsh-studio] .container,[data-dsh-studio-portal] .container{max-width:640px}}@media (min-width: 768px){[data-dsh-studio] .container,[data-dsh-studio-portal] .container{max-width:768px}}@media (min-width: 1024px){[data-dsh-studio] .container,[data-dsh-studio-portal] .container{max-width:1024px}}@media (min-width: 1280px){[data-dsh-studio] .container,[data-dsh-studio-portal] .container{max-width:1280px}}@media (min-width: 1536px){[data-dsh-studio] .container,[data-dsh-studio-portal] .container{max-width:1536px}}[data-dsh-studio] .sr-only,[data-dsh-studio-portal] .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}[data-dsh-studio] .pointer-events-none,[data-dsh-studio-portal] .pointer-events-none{pointer-events:none}[data-dsh-studio] .static,[data-dsh-studio-portal] .static{position:static}[data-dsh-studio] .fixed,[data-dsh-studio-portal] .fixed{position:fixed}[data-dsh-studio] .absolute,[data-dsh-studio-portal] .absolute{position:absolute}[data-dsh-studio] .relative,[data-dsh-studio-portal] .relative{position:relative}[data-dsh-studio] .inset-0,[data-dsh-studio-portal] .inset-0{inset:0}[data-dsh-studio] .left-1\\.5,[data-dsh-studio-portal] .left-1\\.5{left:.375rem}[data-dsh-studio] .left-1\\/2,[data-dsh-studio-portal] .left-1\\/2,[data-dsh-studio] .left-\\[50\\%\\],[data-dsh-studio-portal] .left-\\[50\\%\\]{left:50%}[data-dsh-studio] .right-0,[data-dsh-studio-portal] .right-0{right:0}[data-dsh-studio] .right-1,[data-dsh-studio-portal] .right-1{right:.25rem}[data-dsh-studio] .right-4,[data-dsh-studio-portal] .right-4{right:1rem}[data-dsh-studio] .top-0,[data-dsh-studio-portal] .top-0{top:0}[data-dsh-studio] .top-1,[data-dsh-studio-portal] .top-1{top:.25rem}[data-dsh-studio] .top-1\\/2,[data-dsh-studio-portal] .top-1\\/2{top:50%}[data-dsh-studio] .top-4,[data-dsh-studio-portal] .top-4{top:1rem}[data-dsh-studio] .top-\\[50\\%\\],[data-dsh-studio-portal] .top-\\[50\\%\\]{top:50%}[data-dsh-studio] .z-\\[120\\],[data-dsh-studio-portal] .z-\\[120\\]{z-index:120}[data-dsh-studio] .z-\\[130\\],[data-dsh-studio-portal] .z-\\[130\\]{z-index:130}[data-dsh-studio] .z-\\[90\\],[data-dsh-studio-portal] .z-\\[90\\]{z-index:90}[data-dsh-studio] .z-\\[95\\],[data-dsh-studio-portal] .z-\\[95\\]{z-index:95}[data-dsh-studio] .z-\\[96\\],[data-dsh-studio-portal] .z-\\[96\\]{z-index:96}[data-dsh-studio] .mb-3,[data-dsh-studio-portal] .mb-3{margin-bottom:.75rem}[data-dsh-studio] .ml-1,[data-dsh-studio-portal] .ml-1{margin-left:.25rem}[data-dsh-studio] .mr-1,[data-dsh-studio-portal] .mr-1{margin-right:.25rem}[data-dsh-studio] .mt-0\\.5,[data-dsh-studio-portal] .mt-0\\.5{margin-top:.125rem}[data-dsh-studio] .mt-1,[data-dsh-studio-portal] .mt-1{margin-top:.25rem}[data-dsh-studio] .mt-1\\.5,[data-dsh-studio-portal] .mt-1\\.5{margin-top:.375rem}[data-dsh-studio] .mt-3,[data-dsh-studio-portal] .mt-3{margin-top:.75rem}[data-dsh-studio] .mt-4,[data-dsh-studio-portal] .mt-4{margin-top:1rem}[data-dsh-studio] .box-border,[data-dsh-studio-portal] .box-border{box-sizing:border-box}[data-dsh-studio] .block,[data-dsh-studio-portal] .block{display:block}[data-dsh-studio] .inline,[data-dsh-studio-portal] .inline{display:inline}[data-dsh-studio] .flex,[data-dsh-studio-portal] .flex{display:flex}[data-dsh-studio] .inline-flex,[data-dsh-studio-portal] .inline-flex{display:inline-flex}[data-dsh-studio] .table,[data-dsh-studio-portal] .table{display:table}[data-dsh-studio] .grid,[data-dsh-studio-portal] .grid{display:grid}[data-dsh-studio] .contents,[data-dsh-studio-portal] .contents{display:contents}[data-dsh-studio] .hidden,[data-dsh-studio-portal] .hidden{display:none}[data-dsh-studio] .size-4,[data-dsh-studio-portal] .size-4{width:1rem;height:1rem}[data-dsh-studio] .size-9,[data-dsh-studio-portal] .size-9{width:2.25rem;height:2.25rem}[data-dsh-studio] .h-10,[data-dsh-studio-portal] .h-10{height:2.5rem}[data-dsh-studio] .h-2,[data-dsh-studio-portal] .h-2{height:.5rem}[data-dsh-studio] .h-3\\.5,[data-dsh-studio-portal] .h-3\\.5{height:.875rem}[data-dsh-studio] .h-4,[data-dsh-studio-portal] .h-4{height:1rem}[data-dsh-studio] .h-5,[data-dsh-studio-portal] .h-5{height:1.25rem}[data-dsh-studio] .h-6,[data-dsh-studio-portal] .h-6{height:1.5rem}[data-dsh-studio] .h-7,[data-dsh-studio-portal] .h-7{height:1.75rem}[data-dsh-studio] .h-8,[data-dsh-studio-portal] .h-8{height:2rem}[data-dsh-studio] .h-9,[data-dsh-studio-portal] .h-9{height:2.25rem}[data-dsh-studio] .h-\\[calc\\(100\\%-1px\\)\\],[data-dsh-studio-portal] .h-\\[calc\\(100\\%-1px\\)\\]{height:calc(100% - 1px)}[data-dsh-studio] .h-full,[data-dsh-studio-portal] .h-full{height:100%}[data-dsh-studio] .max-h-\\[280px\\],[data-dsh-studio-portal] .max-h-\\[280px\\]{max-height:280px}[data-dsh-studio] .min-h-0,[data-dsh-studio-portal] .min-h-0{min-height:0px}[data-dsh-studio] .min-h-16,[data-dsh-studio-portal] .min-h-16{min-height:4rem}[data-dsh-studio] .min-h-full,[data-dsh-studio-portal] .min-h-full{min-height:100%}[data-dsh-studio] .w-3\\.5,[data-dsh-studio-portal] .w-3\\.5{width:.875rem}[data-dsh-studio] .w-4,[data-dsh-studio-portal] .w-4{width:1rem}[data-dsh-studio] .w-7,[data-dsh-studio-portal] .w-7{width:1.75rem}[data-dsh-studio] .w-9,[data-dsh-studio-portal] .w-9{width:2.25rem}[data-dsh-studio] .w-\\[380px\\],[data-dsh-studio-portal] .w-\\[380px\\]{width:380px}[data-dsh-studio] .w-\\[min\\(440px\\,92vw\\)\\],[data-dsh-studio-portal] .w-\\[min\\(440px\\,92vw\\)\\]{width:min(440px,92vw)}[data-dsh-studio] .w-\\[min\\(760px\\,96vw\\)\\],[data-dsh-studio-portal] .w-\\[min\\(760px\\,96vw\\)\\]{width:min(760px,96vw)}[data-dsh-studio] .w-fit,[data-dsh-studio-portal] .w-fit{width:-moz-fit-content;width:fit-content}[data-dsh-studio] .w-full,[data-dsh-studio-portal] .w-full{width:100%}[data-dsh-studio] .min-w-0,[data-dsh-studio-portal] .min-w-0{min-width:0px}[data-dsh-studio] .min-w-\\[8rem\\],[data-dsh-studio-portal] .min-w-\\[8rem\\]{min-width:8rem}[data-dsh-studio] .max-w-\\[240px\\],[data-dsh-studio-portal] .max-w-\\[240px\\]{max-width:240px}[data-dsh-studio] .max-w-\\[280px\\],[data-dsh-studio-portal] .max-w-\\[280px\\]{max-width:280px}[data-dsh-studio] .max-w-\\[calc\\(100\\%-2rem\\)\\],[data-dsh-studio-portal] .max-w-\\[calc\\(100\\%-2rem\\)\\]{max-width:calc(100% - 2rem)}[data-dsh-studio] .max-w-full,[data-dsh-studio-portal] .max-w-full{max-width:100%}[data-dsh-studio] .flex-1,[data-dsh-studio-portal] .flex-1{flex:1 1 0%}[data-dsh-studio] .shrink-0,[data-dsh-studio-portal] .shrink-0{flex-shrink:0}[data-dsh-studio] .grow,[data-dsh-studio-portal] .grow{flex-grow:1}[data-dsh-studio] .-translate-x-1\\/2,[data-dsh-studio-portal] .-translate-x-1\\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-dsh-studio] .-translate-y-1\\/2,[data-dsh-studio-portal] .-translate-y-1\\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-dsh-studio] .translate-x-0\\.5,[data-dsh-studio-portal] .translate-x-0\\.5{--tw-translate-x: .125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-dsh-studio] .translate-x-\\[-50\\%\\],[data-dsh-studio-portal] .translate-x-\\[-50\\%\\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-dsh-studio] .translate-y-\\[-50\\%\\],[data-dsh-studio-portal] .translate-y-\\[-50\\%\\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-dsh-studio] .transform,[data-dsh-studio-portal] .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-dsh-studio] .cursor-default,[data-dsh-studio-portal] .cursor-default{cursor:default}[data-dsh-studio] .cursor-pointer,[data-dsh-studio-portal] .cursor-pointer{cursor:pointer}[data-dsh-studio] .select-none,[data-dsh-studio-portal] .select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}[data-dsh-studio] .resize-y,[data-dsh-studio-portal] .resize-y{resize:vertical}[data-dsh-studio] .resize,[data-dsh-studio-portal] .resize{resize:both}[data-dsh-studio] .auto-rows-min,[data-dsh-studio-portal] .auto-rows-min{grid-auto-rows:min-content}[data-dsh-studio] .grid-rows-\\[auto_auto\\],[data-dsh-studio-portal] .grid-rows-\\[auto_auto\\]{grid-template-rows:auto auto}[data-dsh-studio] .flex-row,[data-dsh-studio-portal] .flex-row{flex-direction:row}[data-dsh-studio] .flex-col,[data-dsh-studio-portal] .flex-col{flex-direction:column}[data-dsh-studio] .items-start,[data-dsh-studio-portal] .items-start{align-items:flex-start}[data-dsh-studio] .items-center,[data-dsh-studio-portal] .items-center{align-items:center}[data-dsh-studio] .items-stretch,[data-dsh-studio-portal] .items-stretch{align-items:stretch}[data-dsh-studio] .justify-end,[data-dsh-studio-portal] .justify-end{justify-content:flex-end}[data-dsh-studio] .justify-center,[data-dsh-studio-portal] .justify-center{justify-content:center}[data-dsh-studio] .justify-between,[data-dsh-studio-portal] .justify-between{justify-content:space-between}[data-dsh-studio] .gap-0\\.5,[data-dsh-studio-portal] .gap-0\\.5{gap:.125rem}[data-dsh-studio] .gap-1,[data-dsh-studio-portal] .gap-1{gap:.25rem}[data-dsh-studio] .gap-1\\.5,[data-dsh-studio-portal] .gap-1\\.5{gap:.375rem}[data-dsh-studio] .gap-2,[data-dsh-studio-portal] .gap-2{gap:.5rem}[data-dsh-studio] .gap-3,[data-dsh-studio-portal] .gap-3{gap:.75rem}[data-dsh-studio] .gap-4,[data-dsh-studio-portal] .gap-4{gap:1rem}[data-dsh-studio] .gap-6,[data-dsh-studio-portal] .gap-6{gap:1.5rem}[data-dsh-studio] .overflow-hidden,[data-dsh-studio-portal] .overflow-hidden{overflow:hidden}[data-dsh-studio] .overflow-y-auto,[data-dsh-studio-portal] .overflow-y-auto{overflow-y:auto}[data-dsh-studio] .truncate,[data-dsh-studio-portal] .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-dsh-studio] .whitespace-nowrap,[data-dsh-studio-portal] .whitespace-nowrap{white-space:nowrap}[data-dsh-studio] .whitespace-pre-wrap,[data-dsh-studio-portal] .whitespace-pre-wrap{white-space:pre-wrap}[data-dsh-studio] .break-words,[data-dsh-studio-portal] .break-words{overflow-wrap:break-word}[data-dsh-studio] .rounded-\\[4px\\],[data-dsh-studio-portal] .rounded-\\[4px\\]{border-radius:4px}[data-dsh-studio] .rounded-full,[data-dsh-studio-portal] .rounded-full{border-radius:9999px}[data-dsh-studio] .rounded-lg,[data-dsh-studio-portal] .rounded-lg{border-radius:var(--radius)}[data-dsh-studio] .rounded-md,[data-dsh-studio-portal] .rounded-md{border-radius:calc(var(--radius) - 2px)}[data-dsh-studio] .rounded-sm,[data-dsh-studio-portal] .rounded-sm{border-radius:calc(var(--radius) - 4px)}[data-dsh-studio] .rounded-xl,[data-dsh-studio-portal] .rounded-xl{border-radius:.75rem}[data-dsh-studio] .border,[data-dsh-studio-portal] .border{border-width:1px}[data-dsh-studio] .border-2,[data-dsh-studio-portal] .border-2{border-width:2px}[data-dsh-studio] .border-b,[data-dsh-studio-portal] .border-b{border-bottom-width:1px}[data-dsh-studio] .border-l,[data-dsh-studio-portal] .border-l{border-left-width:1px}[data-dsh-studio] .border-t,[data-dsh-studio-portal] .border-t{border-top-width:1px}[data-dsh-studio] .border-border,[data-dsh-studio-portal] .border-border{border-color:var(--border)}[data-dsh-studio] .border-input,[data-dsh-studio-portal] .border-input{border-color:var(--input)}[data-dsh-studio] .border-transparent,[data-dsh-studio-portal] .border-transparent{border-color:transparent}[data-dsh-studio] .bg-amber-500,[data-dsh-studio-portal] .bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}[data-dsh-studio] .bg-background,[data-dsh-studio-portal] .bg-background{background-color:var(--background)}[data-dsh-studio] .bg-black\\/45,[data-dsh-studio-portal] .bg-black\\/45{background-color:#00000073}[data-dsh-studio] .bg-black\\/50,[data-dsh-studio-portal] .bg-black\\/50{background-color:#00000080}[data-dsh-studio] .bg-black\\/55,[data-dsh-studio-portal] .bg-black\\/55{background-color:#0000008c}[data-dsh-studio] .bg-card,[data-dsh-studio-portal] .bg-card{background-color:var(--card)}[data-dsh-studio] .bg-destructive,[data-dsh-studio-portal] .bg-destructive{background-color:var(--destructive)}[data-dsh-studio] .bg-input,[data-dsh-studio-portal] .bg-input{background-color:var(--input)}[data-dsh-studio] .bg-muted,[data-dsh-studio-portal] .bg-muted{background-color:var(--muted)}[data-dsh-studio] .bg-popover,[data-dsh-studio-portal] .bg-popover{background-color:var(--popover)}[data-dsh-studio] .bg-primary,[data-dsh-studio-portal] .bg-primary{background-color:var(--primary)}[data-dsh-studio] .bg-secondary,[data-dsh-studio-portal] .bg-secondary{background-color:var(--secondary)}[data-dsh-studio] .bg-transparent,[data-dsh-studio-portal] .bg-transparent{background-color:transparent}[data-dsh-studio] .fill-primary,[data-dsh-studio-portal] .fill-primary{fill:var(--primary)}[data-dsh-studio] .p-0\\.5,[data-dsh-studio-portal] .p-0\\.5{padding:.125rem}[data-dsh-studio] .p-1,[data-dsh-studio-portal] .p-1{padding:.25rem}[data-dsh-studio] .p-4,[data-dsh-studio-portal] .p-4{padding:1rem}[data-dsh-studio] .p-6,[data-dsh-studio-portal] .p-6{padding:1.5rem}[data-dsh-studio] .p-\\[3px\\],[data-dsh-studio-portal] .p-\\[3px\\]{padding:3px}[data-dsh-studio] .px-1,[data-dsh-studio-portal] .px-1{padding-left:.25rem;padding-right:.25rem}[data-dsh-studio] .px-1\\.5,[data-dsh-studio-portal] .px-1\\.5{padding-left:.375rem;padding-right:.375rem}[data-dsh-studio] .px-2,[data-dsh-studio-portal] .px-2{padding-left:.5rem;padding-right:.5rem}[data-dsh-studio] .px-2\\.5,[data-dsh-studio-portal] .px-2\\.5{padding-left:.625rem;padding-right:.625rem}[data-dsh-studio] .px-3,[data-dsh-studio-portal] .px-3{padding-left:.75rem;padding-right:.75rem}[data-dsh-studio] .px-4,[data-dsh-studio-portal] .px-4{padding-left:1rem;padding-right:1rem}[data-dsh-studio] .px-5,[data-dsh-studio-portal] .px-5{padding-left:1.25rem;padding-right:1.25rem}[data-dsh-studio] .px-6,[data-dsh-studio-portal] .px-6{padding-left:1.5rem;padding-right:1.5rem}[data-dsh-studio] .py-0,[data-dsh-studio-portal] .py-0{padding-top:0;padding-bottom:0}[data-dsh-studio] .py-0\\.5,[data-dsh-studio-portal] .py-0\\.5{padding-top:.125rem;padding-bottom:.125rem}[data-dsh-studio] .py-1,[data-dsh-studio-portal] .py-1{padding-top:.25rem;padding-bottom:.25rem}[data-dsh-studio] .py-1\\.5,[data-dsh-studio-portal] .py-1\\.5{padding-top:.375rem;padding-bottom:.375rem}[data-dsh-studio] .py-10,[data-dsh-studio-portal] .py-10{padding-top:2.5rem;padding-bottom:2.5rem}[data-dsh-studio] .py-2,[data-dsh-studio-portal] .py-2{padding-top:.5rem;padding-bottom:.5rem}[data-dsh-studio] .py-3,[data-dsh-studio-portal] .py-3{padding-top:.75rem;padding-bottom:.75rem}[data-dsh-studio] .py-3\\.5,[data-dsh-studio-portal] .py-3\\.5{padding-top:.875rem;padding-bottom:.875rem}[data-dsh-studio] .py-4,[data-dsh-studio-portal] .py-4{padding-top:1rem;padding-bottom:1rem}[data-dsh-studio] .py-6,[data-dsh-studio-portal] .py-6{padding-top:1.5rem;padding-bottom:1.5rem}[data-dsh-studio] .pb-0,[data-dsh-studio-portal] .pb-0{padding-bottom:0}[data-dsh-studio] .pb-4,[data-dsh-studio-portal] .pb-4{padding-bottom:1rem}[data-dsh-studio] .pl-2,[data-dsh-studio-portal] .pl-2{padding-left:.5rem}[data-dsh-studio] .pr-8,[data-dsh-studio-portal] .pr-8{padding-right:2rem}[data-dsh-studio] .pr-9,[data-dsh-studio-portal] .pr-9{padding-right:2.25rem}[data-dsh-studio] .pt-5,[data-dsh-studio-portal] .pt-5{padding-top:1.25rem}[data-dsh-studio] .text-left,[data-dsh-studio-portal] .text-left{text-align:left}[data-dsh-studio] .text-\\[10\\.5px\\],[data-dsh-studio-portal] .text-\\[10\\.5px\\]{font-size:10.5px}[data-dsh-studio] .text-\\[11\\.5px\\],[data-dsh-studio-portal] .text-\\[11\\.5px\\]{font-size:11.5px}[data-dsh-studio] .text-\\[11px\\],[data-dsh-studio-portal] .text-\\[11px\\]{font-size:11px}[data-dsh-studio] .text-\\[12\\.5px\\],[data-dsh-studio-portal] .text-\\[12\\.5px\\]{font-size:12.5px}[data-dsh-studio] .text-\\[12px\\],[data-dsh-studio-portal] .text-\\[12px\\]{font-size:12px}[data-dsh-studio] .text-\\[13px\\],[data-dsh-studio-portal] .text-\\[13px\\]{font-size:13px}[data-dsh-studio] .text-\\[15px\\],[data-dsh-studio-portal] .text-\\[15px\\]{font-size:15px}[data-dsh-studio] .text-base,[data-dsh-studio-portal] .text-base{font-size:1rem;line-height:1.5rem}[data-dsh-studio] .text-sm,[data-dsh-studio-portal] .text-sm{font-size:.875rem;line-height:1.25rem}[data-dsh-studio] .text-xs,[data-dsh-studio-portal] .text-xs{font-size:.75rem;line-height:1rem}[data-dsh-studio] .font-medium,[data-dsh-studio-portal] .font-medium{font-weight:500}[data-dsh-studio] .font-semibold,[data-dsh-studio-portal] .font-semibold{font-weight:600}[data-dsh-studio] .tabular-nums,[data-dsh-studio-portal] .tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}[data-dsh-studio] .leading-\\[1\\.45\\],[data-dsh-studio-portal] .leading-\\[1\\.45\\]{line-height:1.45}[data-dsh-studio] .leading-none,[data-dsh-studio-portal] .leading-none{line-height:1}[data-dsh-studio] .leading-relaxed,[data-dsh-studio-portal] .leading-relaxed{line-height:1.625}[data-dsh-studio] .leading-snug,[data-dsh-studio-portal] .leading-snug{line-height:1.375}[data-dsh-studio] .leading-tight,[data-dsh-studio-portal] .leading-tight{line-height:1.25}[data-dsh-studio] .tracking-tight,[data-dsh-studio-portal] .tracking-tight{letter-spacing:-.025em}[data-dsh-studio] .text-card-foreground,[data-dsh-studio-portal] .text-card-foreground{color:var(--card-foreground)}[data-dsh-studio] .text-current,[data-dsh-studio-portal] .text-current{color:currentColor}[data-dsh-studio] .text-destructive,[data-dsh-studio-portal] .text-destructive{color:var(--destructive)}[data-dsh-studio] .text-destructive-foreground,[data-dsh-studio-portal] .text-destructive-foreground{color:var(--destructive-foreground)}[data-dsh-studio] .text-foreground,[data-dsh-studio-portal] .text-foreground{color:var(--foreground)}[data-dsh-studio] .text-muted-foreground,[data-dsh-studio-portal] .text-muted-foreground{color:var(--muted-foreground)}[data-dsh-studio] .text-popover-foreground,[data-dsh-studio-portal] .text-popover-foreground{color:var(--popover-foreground)}[data-dsh-studio] .text-primary,[data-dsh-studio-portal] .text-primary{color:var(--primary)}[data-dsh-studio] .text-primary-foreground,[data-dsh-studio-portal] .text-primary-foreground{color:var(--primary-foreground)}[data-dsh-studio] .text-secondary-foreground,[data-dsh-studio-portal] .text-secondary-foreground{color:var(--secondary-foreground)}[data-dsh-studio] .underline-offset-4,[data-dsh-studio-portal] .underline-offset-4{text-underline-offset:4px}[data-dsh-studio] .opacity-60,[data-dsh-studio-portal] .opacity-60{opacity:.6}[data-dsh-studio] .opacity-70,[data-dsh-studio-portal] .opacity-70{opacity:.7}[data-dsh-studio] .shadow,[data-dsh-studio-portal] .shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}[data-dsh-studio] .shadow-\\[0_0_60px_rgba\\(0\\,0\\,0\\,\\.35\\)\\],[data-dsh-studio-portal] .shadow-\\[0_0_60px_rgba\\(0\\,0\\,0\\,\\.35\\)\\]{--tw-shadow: 0 0 60px rgba(0,0,0,.35);--tw-shadow-colored: 0 0 60px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}[data-dsh-studio] .shadow-lg,[data-dsh-studio-portal] .shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}[data-dsh-studio] .shadow-md,[data-dsh-studio-portal] .shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}[data-dsh-studio] .shadow-sm,[data-dsh-studio-portal] .shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}[data-dsh-studio] .shadow-xl,[data-dsh-studio-portal] .shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}[data-dsh-studio] .outline-none,[data-dsh-studio-portal] .outline-none{outline:2px solid transparent;outline-offset:2px}[data-dsh-studio] .outline,[data-dsh-studio-portal] .outline{outline-style:solid}[data-dsh-studio] .ring-2,[data-dsh-studio-portal] .ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}[data-dsh-studio] .ring-ring,[data-dsh-studio-portal] .ring-ring{--tw-ring-color: var(--ring)}[data-dsh-studio] .ring-offset-2,[data-dsh-studio-portal] .ring-offset-2{--tw-ring-offset-width: 2px}[data-dsh-studio] .filter,[data-dsh-studio-portal] .filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}[data-dsh-studio] .backdrop-blur-\\[1px\\],[data-dsh-studio-portal] .backdrop-blur-\\[1px\\]{--tw-backdrop-blur: blur(1px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}[data-dsh-studio] .backdrop-blur-\\[2px\\],[data-dsh-studio-portal] .backdrop-blur-\\[2px\\]{--tw-backdrop-blur: blur(2px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}[data-dsh-studio] .backdrop-blur-sm,[data-dsh-studio-portal] .backdrop-blur-sm{--tw-backdrop-blur: blur(4px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}[data-dsh-studio] .transition,[data-dsh-studio-portal] .transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}[data-dsh-studio] .transition-\\[color\\,box-shadow\\],[data-dsh-studio-portal] .transition-\\[color\\,box-shadow\\]{transition-property:color,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}[data-dsh-studio] .transition-all,[data-dsh-studio-portal] .transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}[data-dsh-studio] .transition-colors,[data-dsh-studio-portal] .transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}[data-dsh-studio] .transition-opacity,[data-dsh-studio-portal] .transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}[data-dsh-studio] .transition-transform,[data-dsh-studio-portal] .transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}[data-dsh-studio] .ease-in-out,[data-dsh-studio-portal] .ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}:where([data-dsh-studio]){--background: #fafafa;--foreground: #18181b;--card: #ffffff;--card-foreground: #18181b;--popover: #ffffff;--popover-foreground: #18181b;--primary: #18181b;--primary-foreground: #fafafa;--secondary: #f4f4f5;--secondary-foreground: #18181b;--muted: #f4f4f5;--muted-foreground: #71717a;--accent: #f4f4f5;--accent-foreground: #18181b;--destructive: #dc2828;--destructive-foreground: #fafafa;--border: #e4e4e7;--input: #e4e4e7;--ring: #a1a1aa;--radius: .625rem}:where([data-dsh-studio][data-theme=dark]){--background: #0a0a0b;--foreground: #fafafa;--card: #111113;--card-foreground: #fafafa;--popover: #111113;--popover-foreground: #fafafa;--primary: #fafafa;--primary-foreground: #18181b;--secondary: #27272a;--secondary-foreground: #fafafa;--muted: #202022;--muted-foreground: #a1a1aa;--accent: #27272a;--accent-foreground: #fafafa;--destructive: #a62626;--destructive-foreground: #fafafa;--border: #2a2a2d;--input: #2a2a2d;--ring: #6d6d78}:where([data-dsh-studio-portal]){--background: #fafafa;--foreground: #18181b;--card: #ffffff;--card-foreground: #18181b;--popover: #ffffff;--popover-foreground: #18181b;--primary: #18181b;--primary-foreground: #fafafa;--secondary: #f4f4f5;--secondary-foreground: #18181b;--muted: #f4f4f5;--muted-foreground: #71717a;--accent: #f4f4f5;--accent-foreground: #18181b;--destructive: #dc2828;--destructive-foreground: #fafafa;--border: #e4e4e7;--input: #e4e4e7;--ring: #a1a1aa;--radius: .625rem}:where([data-dsh-studio-portal][data-theme=dark]){--background: #0a0a0b;--foreground: #fafafa;--card: #111113;--card-foreground: #fafafa;--popover: #111113;--popover-foreground: #fafafa;--primary: #fafafa;--primary-foreground: #18181b;--secondary: #27272a;--secondary-foreground: #fafafa;--muted: #202022;--muted-foreground: #a1a1aa;--accent: #27272a;--accent-foreground: #fafafa;--destructive: #a62626;--destructive-foreground: #fafafa;--border: #2a2a2d;--input: #2a2a2d;--ring: #6d6d78}:where([data-dsh-studio],[data-dsh-studio] *,[data-dsh-studio-portal],[data-dsh-studio-portal] *){box-sizing:border-box}:where([data-dsh-studio],[data-dsh-studio-portal]) :where(button:not([class*=rounded-]),input:not([class*=rounded-]),textarea:not([class*=rounded-]),select:not([class*=rounded-])):not(.border):not(.border-0){font:inherit;letter-spacing:inherit;color:inherit;background:transparent;border:0;border-radius:0;margin:0;padding:0;box-shadow:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}[data-dsh-studio].dsh-studio-fill{flex:1 1 auto;width:100%;min-height:100%;display:flex;flex-direction:column;background:var(--background);color:var(--foreground)}:where([data-dsh-studio]) .shadcn-scope{color:var(--foreground);font-family:inherit}[data-dsh-studio] .ds-panel,[data-dsh-studio] .ds-card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);box-shadow:0 1px 2px color-mix(in srgb,var(--foreground) 4%,transparent);overflow:hidden}[data-dsh-studio] .ds-panel-head,[data-dsh-studio] .ds-card-head{padding:10px 14px!important;border-bottom:1px solid color-mix(in srgb,var(--border) 70%,transparent);font-size:12.5px;font-weight:600;letter-spacing:.01em}[data-dsh-studio] .ds-panel-body,[data-dsh-studio] .ds-card-body{padding:12px 14px!important}[data-dsh-studio] .ds-panel-body>:first-child,[data-dsh-studio] .ds-card-body>:first-child{margin-top:0}[data-dsh-studio] .ds-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:36px;padding:0 14px;border-radius:calc(var(--radius) - 2px);border:1px solid var(--input);background:var(--card);color:var(--foreground);font-size:14px;font-weight:500;line-height:1;white-space:nowrap;cursor:pointer;box-shadow:0 1px 1px color-mix(in srgb,var(--foreground) 3%,transparent);transition:background-color .12s ease,border-color .12s ease,color .12s ease}[data-dsh-studio] .ds-btn:hover{background:var(--muted)}[data-dsh-studio] .ds-btn-primary{background:var(--primary);border-color:var(--primary);color:var(--primary-foreground)}[data-dsh-studio] .ds-btn-primary:hover{background:color-mix(in srgb,var(--primary) 90%,transparent);border-color:color-mix(in srgb,var(--primary) 90%,transparent)}[data-dsh-studio] .ds-btn-ghost{border-color:transparent;background:transparent;box-shadow:none}[data-dsh-studio] .ds-btn-ghost:hover{background:var(--muted)}[data-dsh-studio] .ds-btn[disabled]{opacity:.5;cursor:not-allowed}[data-dsh-studio] .ds-chip{display:inline-flex;align-items:center;gap:4px;height:20px;padding:0 8px;border-radius:999px;border:1px solid var(--border);background:var(--muted);color:var(--muted-foreground);font-size:11.5px;line-height:1;white-space:nowrap}[data-dsh-studio] .ds-chip[data-on="1"]{border-color:color-mix(in srgb,var(--primary) 28%,transparent);background:color-mix(in srgb,var(--primary) 10%,transparent);color:var(--foreground)}[data-dsh-studio] .ds-chip[data-blocked="1"]{border-color:color-mix(in srgb,var(--destructive) 35%,transparent);background:color-mix(in srgb,var(--destructive) 10%,transparent);color:var(--destructive)}[data-dsh-studio] .ds-table{width:100%;border-collapse:separate;border-spacing:0;font-size:12.5px}[data-dsh-studio] .ds-table th{padding:8px 10px;text-align:left;font-weight:500;font-size:11.5px;color:var(--muted-foreground);border-bottom:1px solid var(--border);background:color-mix(in srgb,var(--muted) 50%,transparent)}[data-dsh-studio] .ds-table td{padding:8px 10px;border-bottom:1px solid color-mix(in srgb,var(--border) 70%,transparent);vertical-align:top}[data-dsh-studio] .ds-table tbody tr:hover td{background:color-mix(in srgb,var(--muted) 45%,transparent)}[data-dsh-studio] .ds-dw-tabs{display:inline-flex;gap:2px;padding:3px;border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);background:var(--muted)}[data-dsh-studio] .ds-dw-tab{height:26px;padding:0 10px;border:0;border-radius:calc(var(--radius) - 4px);background:transparent;color:var(--muted-foreground);font-size:12px;cursor:pointer}[data-dsh-studio] .ds-dw-tab[data-on="1"]{background:var(--card);color:var(--foreground);font-weight:600;box-shadow:0 1px 2px color-mix(in srgb,var(--foreground) 6%,transparent)}[data-dsh-studio] .ds-hint,[data-dsh-studio] .ds-muted{color:var(--muted-foreground);font-size:11.5px}[data-dsh-studio] .ds-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:7px;border:1px solid transparent;background:transparent;color:var(--muted-foreground);cursor:pointer}[data-dsh-studio] .ds-icon-btn:hover{background:var(--muted);color:var(--foreground)}[data-dsh-studio] .ds-card{position:relative;display:flex;flex-direction:column;gap:6px;padding:10px 11px 9px;border:1px solid var(--border);border-radius:calc(var(--radius) - 1px);background:var(--card);box-shadow:0 1px 2px color-mix(in srgb,var(--foreground) 5%,transparent);cursor:pointer;transition:box-shadow .14s ease,border-color .14s ease,transform .14s ease}[data-dsh-studio] .ds-card:hover{border-color:var(--input);box-shadow:0 4px 10px -4px color-mix(in srgb,var(--foreground) 18%,transparent),0 1px 2px color-mix(in srgb,var(--foreground) 6%,transparent)}[data-dsh-studio] .ds-card[data-urgent="1"]{border-left:3px solid var(--destructive);padding-left:9px}[data-dsh-studio] .ds-card[data-blocked="1"]{border-color:color-mix(in srgb,var(--destructive) 45%,transparent);background:linear-gradient(0deg,color-mix(in srgb,var(--destructive) 4%,transparent),color-mix(in srgb,var(--destructive) 4%,transparent)),var(--card)}[data-dsh-studio] .ds-card[data-running="1"]:after{content:"";position:absolute;top:9px;right:9px;width:6px;height:6px;border-radius:999px;background:var(--primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--primary) 16%,transparent)}[data-dsh-studio] .ds-card-title{font-size:12.8px;font-weight:600;line-height:1.45;letter-spacing:.005em;color:var(--foreground);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}[data-dsh-studio] .ds-meta{display:flex;flex-wrap:wrap;align-items:center;gap:5px;font-size:11px;line-height:1;color:var(--muted-foreground)}[data-dsh-studio] .ds-meta .ds-chip{height:18px;padding:0 6px;font-size:10.5px;border-radius:6px}[data-dsh-studio] .ds-dot{width:7px;height:7px;border-radius:999px;flex:none}[data-dsh-studio] .ds-col{border:1px solid color-mix(in srgb,var(--border) 80%,transparent);border-radius:var(--radius);background:color-mix(in srgb,var(--muted) 55%,transparent);padding:8px;gap:8px}[data-dsh-studio] .ds-col-head{display:flex;align-items:center;gap:6px;padding:2px 2px 6px;font-size:12px;font-weight:600;color:var(--foreground)}[data-dsh-studio] .ds-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:999px;border:1px solid var(--border);background:var(--card);color:var(--muted-foreground);font-size:10.5px;font-weight:500}[data-dsh-studio] .ds-board-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:12px 20px 10px;border-bottom:1px solid var(--border)}[data-dsh-studio] .ds-board-bar>*{flex:0 0 auto}[data-dsh-studio] .ds-board-bar .ds-input{height:32px}[data-dsh-studio] .ds-search{flex:0 0 auto}[data-dsh-studio] .ds-col-head{color:var(--foreground);font-size:12px;font-weight:600;letter-spacing:.01em}[data-dsh-studio] .ds-col-head .ds-count{color:var(--muted-foreground);font-weight:500}[data-dsh-studio] .ds-listrow .ds-btn{height:32px;padding:0 10px;font-size:11.5px;border-radius:calc(var(--radius) - 4px)}[data-dsh-studio] .ds-listrow .ds-btn-ghost{color:var(--muted-foreground);border:1px solid transparent}[data-dsh-studio] .ds-listrow .ds-btn-ghost:hover{color:var(--foreground);background:var(--muted);border-color:var(--border)}[data-dsh-studio] .ds-listrow .ds-btn-ghost[data-danger="1"],[data-dsh-studio] .ds-dw-foot .ds-btn-ghost[data-danger="1"]{color:var(--destructive)}[data-dsh-studio] .ds-listrow .ds-btn-ghost[data-danger="1"]:hover{color:var(--destructive);background:color-mix(in srgb,var(--destructive) 10%,transparent);border-color:color-mix(in srgb,var(--destructive) 30%,transparent)}[data-dsh-studio] .ds-listrow{padding:11px 14px}[data-dsh-studio] .ds-audit-row{padding:7px 14px;font-size:11.5px}@media (max-width: 900px){[data-dsh-studio] .ds-spark-day{font-size:9px;letter-spacing:-.02em}}@media (max-width: 760px){[data-dsh-studio] .ds-spark-day:nth-child(2n){visibility:hidden}}[data-dsh-studio] .ds-burn{display:block;padding-top:4px}[data-dsh-studio] .ds-burn-svg{display:block;width:100%;height:84px}[data-dsh-studio] .ds-burn-area{fill:color-mix(in srgb,var(--ds-accent) 14%,transparent)}[data-dsh-studio] .ds-burn-line{fill:none;stroke:var(--ds-accent);stroke-width:1.6}[data-dsh-studio] .ds-burn-dot{fill:var(--ds-accent)}[data-dsh-studio] .ds-burn-axis{display:flex;justify-content:space-between;margin-top:4px;font-size:10.5px;color:var(--muted-foreground)}[data-dsh-studio] .ds-card[data-running="1"]:after{background:#259d65;box-shadow:0 0 0 3px #259d652e}[data-dsh-studio][data-theme=dark] .ds-card[data-running="1"]:after{background:#4bd293;box-shadow:0 0 0 3px #4bd29338}[data-dsh-studio] .ds-card[data-blocked="1"]:after{content:"";position:absolute;top:9px;right:9px;width:6px;height:6px;border-radius:999px;background:var(--destructive);box-shadow:0 0 0 3px color-mix(in srgb,var(--destructive) 16%,transparent)}[data-dsh-studio] .ds-card[data-running="1"][data-blocked="1"]:after{background:var(--destructive);box-shadow:0 0 0 3px color-mix(in srgb,var(--destructive) 16%,transparent)}[data-dsh-studio] .ds-composer{display:flex;flex-direction:column;gap:6px;padding:8px 10px;border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);background:var(--card);box-shadow:var(--ds-shadow);transition:border-color .15s,box-shadow .15s}[data-dsh-studio] .ds-composer:focus-within{border-color:color-mix(in srgb,currentColor 26%,transparent);box-shadow:0 0 0 3px color-mix(in srgb,currentColor 9%,transparent)}[data-dsh-studio] .ds-composer .ds-textarea{border:0!important;box-shadow:none!important;background:transparent!important;padding:2px 0;resize:vertical}[data-dsh-studio] .ds-composer-bar{display:flex;align-items:center;gap:8px;border-top:1px solid color-mix(in srgb,currentColor 10%,transparent);padding-top:6px}[data-dsh-studio] .ds-composer-bar .ds-hint{margin-right:auto}[data-dsh-studio] .ds-composer-count{font-size:11px;color:var(--muted-foreground);font-variant-numeric:tabular-nums;white-space:nowrap}[data-dsh-studio] .ds-toasts{position:fixed;right:16px;bottom:16px;z-index:120;display:flex;flex-direction:column;gap:8px;align-items:flex-end;pointer-events:none}[data-dsh-studio] .ds-toast{pointer-events:auto;display:flex;align-items:flex-start;gap:8px;max-width:340px;padding:9px 11px;border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);background:var(--card);box-shadow:0 8px 24px -12px #00000059,0 1px 2px #00000014;font-size:12px;animation:ds-toast-in .18s ease-out}[data-dsh-studio] .ds-toast[data-tone=error]{border-color:color-mix(in srgb,#dc2626 40%,var(--border))}[data-dsh-studio] .ds-toast-icon{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;margin-top:1px;border-radius:50%;background:#16a34a;color:#fff;font-size:10px;font-weight:700;flex:0 0 auto}[data-dsh-studio] .ds-toast[data-tone=error] .ds-toast-icon{background:#dc2626}[data-dsh-studio] .ds-toast[data-tone=info] .ds-toast-icon{background:var(--ds-accent)}[data-dsh-studio] .ds-toast-text{flex:1 1 auto;line-height:1.5;word-break:break-word}[data-dsh-studio] .ds-toast-close{border:0;background:transparent;color:color-mix(in srgb,currentColor 55%,transparent);cursor:pointer;font-size:14px;line-height:1;padding:0 2px}[data-dsh-studio] .ds-toast-close:hover{color:currentColor}@keyframes ds-toast-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}[data-dsh-studio] .ds-ok,[data-dsh-studio] .ds-err{display:inline-flex;align-items:center;gap:5px;padding:3px 8px;border-radius:999px;font-size:11.5px;line-height:1.35;border:1px solid transparent}[data-dsh-studio] .ds-ok{color:#15803d;background:color-mix(in srgb,#16a34a 10%,transparent);border-color:color-mix(in srgb,#16a34a 26%,transparent)}[data-dsh-studio] .ds-ok:before{content:"✓";font-weight:700}[data-dsh-studio] .ds-err{color:#b91c1c;background:color-mix(in srgb,#dc2626 10%,transparent);border-color:color-mix(in srgb,#dc2626 26%,transparent)}[data-dsh-studio] .ds-err:before{content:"!";font-weight:700}[data-dsh-studio][data-theme=dark] .ds-ok{color:#6ee7a8;background:color-mix(in srgb,#16a34a 22%,transparent);border-color:color-mix(in srgb,#4ade80 34%,transparent)}[data-dsh-studio][data-theme=dark] .ds-err{color:#fca5a5;background:color-mix(in srgb,#dc2626 24%,transparent);border-color:color-mix(in srgb,#f87171 34%,transparent)}[data-dsh-studio] .ds-action-bar{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-top:12px;padding-top:10px;border-top:1px solid color-mix(in srgb,currentColor 10%,transparent)}[data-dsh-studio] .ds-action-bar-left,[data-dsh-studio] .ds-action-bar-right{display:flex;align-items:center;gap:8px;flex-wrap:wrap}[data-dsh-studio] .ds-action-bar-right{margin-left:auto}[data-dsh-studio] .ds-btn[data-force="1"]{color:#b45309;border-color:color-mix(in srgb,#f59e0b 40%,transparent)}[data-dsh-studio] .ds-btn[data-force="1"]:hover:not([disabled]){background:color-mix(in srgb,#f59e0b 12%,transparent)}[data-dsh-studio][data-theme=dark] .ds-btn[data-force="1"]{color:#fbbf24;border-color:color-mix(in srgb,#f59e0b 45%,transparent)}[data-dsh-studio] .ds-req-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}[data-dsh-studio] .ds-req-actions .ds-select{width:auto;min-width:96px}[data-dsh-studio] .ds-btn-ghost[data-danger="1"]{color:#b91c1c;border-color:color-mix(in srgb,#dc2626 26%,transparent)}[data-dsh-studio] .ds-btn-ghost[data-danger="1"]:hover:not([disabled]){background:color-mix(in srgb,#dc2626 10%,transparent)}[data-dsh-studio][data-theme=dark] .ds-btn-ghost[data-danger="1"]{color:#fca5a5;border-color:color-mix(in srgb,#f87171 30%,transparent)}[data-dsh-studio] .ds-listrow-actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px}[data-dsh-studio] .ds-btn.ds-btn-primary{background:var(--primary);border-color:var(--primary);color:var(--primary-foreground)}[data-dsh-studio] .ds-btn.ds-btn-primary:hover:not([disabled]){background:color-mix(in srgb,var(--primary) 90%,transparent);border-color:color-mix(in srgb,var(--primary) 90%,transparent)}[data-dsh-studio] .ds-btn.ds-btn-primary[disabled]{opacity:.45;cursor:not-allowed}[data-dsh-studio] .ds-btn.ds-btn-ghost{background:transparent;border-color:transparent;box-shadow:none;color:var(--muted-foreground)}[data-dsh-studio] .ds-btn.ds-btn-ghost:hover:not([disabled]){background:var(--muted);border-color:var(--border);color:var(--foreground)}[data-dsh-studio] .ds-btn[data-danger="1"]{color:#b91c1c}[data-dsh-studio] .ds-btn.ds-btn-ghost[data-danger="1"]:hover:not([disabled]){background:color-mix(in srgb,#dc2626 10%,transparent);border-color:color-mix(in srgb,#dc2626 26%,transparent);color:#b91c1c}[data-dsh-studio][data-theme=dark] .ds-btn[data-danger="1"]{color:#fca5a5}[data-dsh-studio] .ds-btn[data-warn="1"]{color:#b45309;border-color:color-mix(in srgb,#d97706 30%,transparent)}[data-dsh-studio] .ds-btn[data-warn="1"]:hover:not([disabled]){background:color-mix(in srgb,#d97706 10%,transparent)}[data-dsh-studio][data-theme=dark] .ds-btn[data-warn="1"]{color:#fbbf24;border-color:color-mix(in srgb,#f59e0b 32%,transparent)}[data-dsh-studio] .ds-btn.ds-btn-primary{background:#18181b;border-color:#18181b;color:#fafafa}[data-dsh-studio] .ds-btn.ds-btn-primary:hover:not([disabled]){background:#27272a;border-color:#27272a}[data-dsh-studio][data-theme=dark] .ds-btn.ds-btn-primary{background:#fafafa;border-color:#fafafa;color:#09090b}[data-dsh-studio] .ds-btn.ds-btn-primary[disabled]{opacity:.45}[data-dsh-studio] .ds-btn.ds-btn-ghost{background:transparent;border-color:transparent;color:#71717a;box-shadow:none}[data-dsh-studio] .ds-btn.ds-btn-ghost:hover:not([disabled]){background:#f4f4f5;border-color:#e4e4e7;color:#18181b}[data-dsh-studio][data-theme=dark] .ds-btn.ds-btn-ghost{color:#a1a1aa}[data-dsh-studio][data-theme=dark] .ds-btn.ds-btn-ghost:hover:not([disabled]){background:#27272a;border-color:#3f3f46;color:#fafafa}[data-dsh-studio][data-theme=dark]{--ds-bg: #0e1014;--ds-surface: #181b22;--ds-surface-2: #1e222a;--ds-line: #2c323d;--ds-line-soft: color-mix(in srgb, #2c323d 60%, transparent);--ds-line-soft2: color-mix(in srgb, #2c323d 40%, transparent);color:#e6e8ee;background:#0e1014}[data-dsh-studio][data-theme=dark] .ds-drawer,[data-dsh-studio][data-theme=dark] .ds-side,[data-dsh-studio][data-theme=dark] .ds-modal,[data-dsh-studio][data-theme=dark] .ds-panel,[data-dsh-studio][data-theme=dark] .ds-card,[data-dsh-studio][data-theme=dark] .ds-dw-col,[data-dsh-studio][data-theme=dark] .ds-code-box{background:var(--ds-surface);border-color:var(--ds-line);color:#e6e8ee}[data-dsh-studio] .ds-empty{opacity:1;color:var(--muted-foreground);border:1px dashed var(--border);background:color-mix(in srgb,var(--muted) 38%,transparent);border-radius:calc(var(--radius) - 2px);padding:18px 12px;font-size:12px;line-height:1.65;text-align:center}[data-dsh-studio] .ds-empty .ds-empty-title{display:block;margin-bottom:3px;color:var(--foreground);font-weight:600;font-size:12.5px}[data-dsh-studio] .ds-market-grid,[data-dsh-studio] .ds-proj-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px}[data-dsh-studio] .ds-market-card,[data-dsh-studio] .ds-proj-card{background:var(--ds-surface);border:1px solid var(--border);border-radius:calc(var(--radius) - 1px);box-shadow:var(--ds-shadow);padding:12px 13px;transition:box-shadow .16s ease,border-color .16s ease,transform .16s ease}[data-dsh-studio] .ds-market-card:hover,[data-dsh-studio] .ds-proj-card:hover{border-color:color-mix(in srgb,var(--border) 55%,var(--foreground));box-shadow:0 6px 16px -10px #0f172a73}[data-dsh-studio] .ds-mc-head,[data-dsh-studio] .ds-proj-head{display:flex;align-items:center;gap:8px;margin-bottom:8px}[data-dsh-studio] .ds-mc-name,[data-dsh-studio] .ds-proj-name{font-size:13px;font-weight:600;letter-spacing:-.005em}[data-dsh-studio] .ds-proj-stats{display:flex;flex-wrap:wrap;gap:6px 12px;margin:8px 0 6px;font-size:11.5px;color:var(--muted-foreground)}[data-dsh-studio] .ds-proj-bar{height:6px;border-radius:999px;background:var(--muted);overflow:hidden;margin-bottom:6px}[data-dsh-studio] .ds-market-grid+.ds-hint,[data-dsh-studio] .ds-proj-grid+.ds-hint{margin-top:10px}[data-dsh-studio] .ds-body:has(>.ds-proj-grid),[data-dsh-studio] .ds-body:has(>.ds-market-grid){display:block;width:100%;min-width:0}[data-dsh-studio] .ds-proj-grid,[data-dsh-studio] .ds-market-grid{width:100%;grid-auto-flow:row}[data-dsh-studio] .ds-body:has(.ds-proj-grid)>div,[data-dsh-studio] .ds-body:has(.ds-market-grid)>div{display:block;width:100%;min-width:0}[data-dsh-studio] .ds-proj-grid{grid-template-columns:repeat(auto-fill,minmax(260px,1fr));min-width:100%}[data-dsh-studio] .ds-proj-grid{grid-template-columns:repeat(auto-fill,minmax(420px,1fr))}@media (max-width: 900px){[data-dsh-studio] .ds-proj-grid{grid-template-columns:1fr}}[data-dsh-studio] .ds-an-track{position:relative}[data-dsh-studio] .ds-an-track[data-empty="1"]{background:transparent;border-top:1px dashed var(--border);height:6px}[data-dsh-studio] .ds-an-track[data-empty="1"] .ds-an-fill{display:none}[data-dsh-studio] .ds-an-fill{min-width:2px}[data-dsh-studio] .ds-log{margin-top:8px;border-top:1px dashed var(--border);padding-top:8px;display:grid;gap:4px;max-height:168px;overflow:auto}[data-dsh-studio] .ds-log-line{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:1.5;color:var(--muted-foreground);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-dsh-studio][data-theme=dark] .ds-chip[data-on="1"],[data-dsh-studio][data-theme=dark] .ds-audit-status,[data-dsh-studio][data-theme=dark] .ds-chip-case[data-r=pass],[data-dsh-studio][data-theme=dark] .ds-chip[data-role=dev],[data-dsh-studio][data-theme=dark] .ds-chip[data-kind=design]{color:#6ee7a8}[data-dsh-studio][data-theme=dark] .ds-chip[data-role=product],[data-dsh-studio][data-theme=dark] .ds-chip[data-kind=mr]{color:#9ec1ff}[data-dsh-studio][data-theme=dark] .ds-chip[data-role=architect],[data-dsh-studio][data-theme=dark] .ds-chip[data-req="1"]{color:#c4b5fd}[data-dsh-studio][data-theme=dark] .ds-chip[data-role=qa],[data-dsh-studio][data-theme=dark] .ds-chip[data-kind=cases],[data-dsh-studio][data-theme=dark] .ds-chip[data-sla=due_soon]{color:#fbbf24}[data-dsh-studio][data-theme=dark] .ds-card-warn,[data-dsh-studio][data-theme=dark] .ds-case-fail,[data-dsh-studio][data-theme=dark] .ds-proj-stats b[data-warn="1"],[data-dsh-studio][data-theme=dark] .ds-an-kv b[data-warn="1"],[data-dsh-studio][data-theme=dark] .ds-kpi[data-warn="1"] .ds-kpi-value{color:#ff9a9d}[data-dsh-studio][data-theme=dark] .ds-card[data-blocked="1"]{background:color-mix(in srgb,#e5484d 10%,var(--ds-surface))}[data-dsh-studio][data-theme=dark] .ds-audit-row[data-ok="0"],[data-dsh-studio][data-theme=dark] .ds-art-row[data-result=fail]{background:color-mix(in srgb,#e5484d 12%,transparent)}[data-dsh-studio][data-theme=dark] .ds-meta{color:#a8afba}[data-dsh-studio][data-theme=dark] .ds-hint{color:#9aa1ad}[data-dsh-studio] .ds-board{scroll-snap-type:x proximity;scrollbar-width:thin;scrollbar-color:var(--border) transparent}[data-dsh-studio] .ds-board:focus-visible{outline:2px solid color-mix(in srgb,var(--ring) 55%,transparent);outline-offset:-2px}[data-dsh-studio] .ds-board::-webkit-scrollbar{height:10px}[data-dsh-studio] .ds-board::-webkit-scrollbar-track{background:transparent}[data-dsh-studio] .ds-board::-webkit-scrollbar-thumb{background:var(--border);border-radius:8px;border:2px solid transparent;background-clip:content-box}[data-dsh-studio][data-theme=dark] .ds-board::-webkit-scrollbar-thumb{background:#3a404b;background-clip:content-box}[data-dsh-studio] .ds-col{scroll-snap-align:start;min-width:0}[data-dsh-studio] .ds-col-body{overflow-x:hidden}[data-dsh-studio] .ds-card{min-width:0;max-width:100%}[data-dsh-studio] .ds-card-title{overflow-wrap:anywhere}[data-dsh-studio] .ds-meta{flex-wrap:wrap;row-gap:4px}[data-dsh-studio] .ds-col{background:var(--muted);border-color:var(--border)}[data-dsh-studio] .ds-col-head{background:var(--card);border-bottom:1px solid var(--border);border-radius:calc(var(--radius) + 1px) calc(var(--radius) + 1px) 0 0}[data-dsh-studio] .ds-col-owner{color:var(--muted-foreground)}[data-dsh-studio][data-theme=dark] .ds-col{background:#14171d;border-color:#262a33}[data-dsh-studio][data-theme=dark] .ds-col-head{background:#1a1e25;border-bottom-color:#262a33;color:#e6e8ee}[data-dsh-studio] .ds-row{display:flex;flex-wrap:wrap;gap:8px;align-items:center;min-width:0}[data-dsh-studio] .ds-field{display:flex;flex-direction:column;gap:5px;min-width:0}[data-dsh-studio] .ds-row>.ds-field{flex:1 1 220px}[data-dsh-studio] .ds-field>.ds-label{margin-bottom:1px}[data-dsh-studio] .ds-field>.ds-hint{margin-left:0}[data-dsh-studio] .ds-field>.ds-hint+.ds-hint{margin-top:-2px}[data-dsh-studio] .ds-md-field{display:flex;flex-direction:column;gap:4px;min-width:0}[data-dsh-studio] .ds-md-bar{display:flex;align-items:center;gap:8px;justify-content:space-between}[data-dsh-studio] .ds-md-bar .ds-hint{margin-left:0;opacity:.62}[data-dsh-studio] .ds-md-preview{border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);background:var(--card);padding:10px 12px;min-height:84px}[data-dsh-studio] .ds-art-wrap,[data-dsh-studio] .ds-doc-wrap{display:flex;flex-direction:column;gap:6px;min-width:0}[data-dsh-studio] .ds-reader{margin:0 0 8px;max-height:360px;overflow:auto;font-size:12.5px}[data-dsh-studio] .ds-reader .ds-md{margin:0}[data-dsh-studio] .ds-seg-btn[data-on="1"],[data-dsh-studio] .ds-chip[data-on="1"],[data-dsh-studio] .ds-btn[data-on="1"]{background:#18181b!important;color:#fafafa!important;border-color:#18181b!important;box-shadow:0 1px 2px #0f172a2e!important}[data-dsh-studio][data-theme=dark] .ds-seg-btn[data-on="1"],[data-dsh-studio][data-theme=dark] .ds-chip[data-on="1"],[data-dsh-studio][data-theme=dark] .ds-btn[data-on="1"]{background:#fafafa!important;color:#09090b!important;border-color:#fafafa!important}[data-dsh-studio] .ds-seg-btn[data-on="1"]:hover,[data-dsh-studio] .ds-chip[data-on="1"]:hover{background:#27272a!important;color:#fafafa!important}[data-dsh-studio][data-theme=dark] .ds-seg-btn[data-on="1"]:hover,[data-dsh-studio][data-theme=dark] .ds-chip[data-on="1"]:hover{background:#e4e4e7!important;color:#09090b!important}[data-dsh-studio] .ds-drawer .ds-sec>.ds-row,[data-dsh-studio] .ds-drawer .ds-sec .ds-row{gap:6px;margin-top:8px}[data-dsh-studio] .ds-drawer .ds-sec .ds-btn{height:28px;padding:0 10px;font-size:12px;border-radius:8px}[data-dsh-studio] .ds-drawer .ds-sec>.ds-hint,[data-dsh-studio] .ds-drawer .ds-sec .ds-hint{display:block;margin:4px 0 0;font-size:11px;line-height:1.5;color:var(--muted-foreground)}[data-dsh-studio] .ds-drawer .ds-sec{padding:12px 0;border-bottom:1px dashed var(--border)}[data-dsh-studio] .ds-drawer .ds-sec:last-of-type{border-bottom:0}[data-dsh-studio] .ds-drawer .ds-sec .ds-btn[disabled]{opacity:.45}[data-dsh-studio] .ds-drawer>*:first-child{padding-bottom:12px;border-bottom:1px solid var(--border)}[data-dsh-studio] .ds-drawer [data-state=active],[data-dsh-studio] .ds-drawer [aria-selected=true]{margin-top:0}[data-dsh-studio] .ds-drawer .ds-dw-body,[data-dsh-studio] .ds-drawer .ds-dw-cols{padding-top:6px}[data-dsh-studio] .ds-col{position:relative;min-width:300px;border-radius:calc(var(--radius) - 1px);overflow:hidden}[data-dsh-studio] .ds-col:before{content:"";position:absolute;inset:0 0 auto;height:3px;background:var(--col-accent, var(--border));z-index:3}[data-dsh-studio] .ds-col-head{position:sticky;top:0;z-index:2;padding-top:9px;backdrop-filter:blur(2px)}[data-dsh-studio] .ds-col-body{padding:10px;display:flex;flex-direction:column;gap:10px}[data-dsh-studio] .ds-col-body:empty:after{content:"还没有卡,拖一张过来";display:block;padding:14px 10px;border:1px dashed var(--border);border-radius:8px;font-size:11.5px;color:var(--muted-foreground);text-align:center}[data-dsh-studio] .ds-col[data-col]{--col-accent: var(--border)}[data-dsh-studio] .ds-col[data-col=clarify]{--col-accent: #a1a1aa}[data-dsh-studio] .ds-col[data-col=design]{--col-accent: #8b5cf6}[data-dsh-studio] .ds-col[data-col=dev_ready]{--col-accent: #3b82f6}[data-dsh-studio] .ds-col[data-col=dev]{--col-accent: #06b6d4}[data-dsh-studio] .ds-col[data-col=review]{--col-accent: #eab308}[data-dsh-studio] .ds-col[data-col=test]{--col-accent: #f97316}[data-dsh-studio] .ds-col[data-col=accept]{--col-accent: #10b981}[data-dsh-studio] .ds-col[data-col=done]{--col-accent: #52525b}[data-dsh-studio] .ds-drawer .ds-listrow-actions,[data-dsh-studio] .ds-side .ds-listrow-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}[data-dsh-studio] .ds-drawer .ds-listrow-actions>.ds-select{min-width:190px}[data-dsh-studio] .ds-drawer .ds-sec-head{margin-bottom:8px}[data-dsh-studio] .ds-drawer .ds-sec-head .ds-hint{font-size:11px}[data-dsh-studio] .ds-drawer .ds-sec+.ds-sec{margin-top:2px}[data-dsh-studio] .ds-gate-sign{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:space-between;margin-top:10px;padding-top:10px;border-top:1px dashed var(--border);font-size:11.5px;color:var(--foreground)}[data-dsh-studio] .ds-gate-sign>span{min-width:0;overflow-wrap:anywhere}[data-dsh-studio] .ds-gate .ds-row{margin-top:10px;padding-top:10px;border-top:1px dashed var(--border)}[data-dsh-studio] .ds-gate .ds-row .ds-btn{white-space:nowrap}[data-dsh-studio] .ds-meta .ds-chip[data-role]{max-width:104px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;line-height:18px}[data-dsh-studio] .ds-meta .ds-chip[data-open="1"]{border-style:dashed;color:#8b5cf6}[data-dsh-studio][data-theme=dark] .ds-meta .ds-chip[data-open="1"]{color:#c4b5fd}[data-dsh-studio] .ds-drawer .ds-chip[data-role]{max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-dsh-studio] .ds-meta{display:flex;flex-wrap:wrap;align-items:center;gap:5px;row-gap:4px}[data-dsh-studio] .ds-meta .ds-chip[data-role]{margin-left:auto;order:99;max-width:120px;height:20px;line-height:18px;padding:0 8px;border-radius:999px;border-color:transparent;background:color-mix(in srgb,currentColor 12%,transparent);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-dsh-studio] .ds-meta .ds-chip[data-role]:hover{background:color-mix(in srgb,currentColor 18%,transparent)}[data-dsh-studio] .ds-meta .ds-chip[data-role][data-open="1"]{margin-left:auto;background:transparent;border:1px dashed currentColor;opacity:.85}[data-dsh-studio][data-theme=dark] .ds-meta .ds-chip[data-role]{background:color-mix(in srgb,currentColor 18%,transparent)}[data-dsh-studio] .ds-board{gap:12px;padding:12px 16px 16px;align-items:flex-start}[data-dsh-studio] .ds-col{flex:0 0 288px;width:288px;min-width:288px;max-width:288px}[data-dsh-studio] .ds-col-body{display:flex;flex-direction:column;gap:8px;padding:8px;overflow-x:hidden}[data-dsh-studio] .ds-card{width:100%;min-width:0}[data-dsh-studio] .ds-meta{display:flex;flex-wrap:wrap;align-items:center;gap:4px 5px}[data-dsh-studio] .ds-meta .ds-chip{height:18px;line-height:16px;font-size:10.5px;padding:0 6px}[data-dsh-studio] .ds-card-foot{display:flex;flex-wrap:wrap;align-items:center;gap:2px 6px;font-size:10px;color:var(--muted-foreground);margin-top:2px}[data-dsh-studio] .ds-card-foot>span:last-child{margin-left:auto}[data-dsh-studio] .ds-card-title{font-size:12.5px;line-height:1.45}@media (max-width: 900px){[data-dsh-studio] .ds-col{flex:0 0 86vw;width:86vw;min-width:86vw;max-width:86vw}}[data-dsh-studio] .ds-col{border-radius:calc(var(--radius) - 2px);overflow:hidden}[data-dsh-studio] .ds-col-head{display:flex;flex-direction:column;gap:4px;padding:9px 10px 8px;background:var(--card);border-bottom:1px solid var(--border);position:sticky;top:0;z-index:2}[data-dsh-studio] .ds-col-title{display:flex;align-items:center;justify-content:space-between;gap:8px;min-width:0}[data-dsh-studio] .ds-col-name{font-size:12.5px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-dsh-studio] .ds-col-owner{display:flex;align-items:center;gap:6px;min-width:0;font-size:10.5px;color:var(--muted-foreground)}[data-dsh-studio] .ds-col-owner-name{display:inline-flex;align-items:center;max-width:160px;padding:1px 7px;border-radius:999px;background:color-mix(in srgb,currentColor 10%,transparent);color:var(--foreground);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-dsh-studio] .ds-col-owner[data-empty="1"] .ds-col-owner-name{background:transparent;border:1px dashed var(--border);color:var(--muted-foreground)}[data-dsh-studio][data-theme=dark] .ds-col-head{background:#1a1e25}[data-dsh-studio] .ds-col-body{padding-top:8px}[data-dsh-studio] .ds-col-head{align-items:stretch;text-align:left}[data-dsh-studio] .ds-col-title{width:100%;align-items:center}[data-dsh-studio] .ds-col-name{flex:1 1 auto;text-align:left}[data-dsh-studio] .ds-col-owner{width:100%;justify-content:flex-start}[data-dsh-studio] .ds-board .ds-col .ds-col-head{align-items:stretch!important;text-align:left!important}[data-dsh-studio] .ds-board .ds-col .ds-col-title{display:flex!important;width:100%!important;align-items:center!important;justify-content:space-between!important}[data-dsh-studio] .ds-board .ds-col .ds-col-owner{display:flex!important;width:100%!important;justify-content:flex-start!important;gap:6px!important}[data-dsh-studio] .ds-board .ds-col{display:flex!important;flex-direction:column!important;align-items:stretch!important}[data-dsh-studio] .ds-board .ds-col .ds-col-head,[data-dsh-studio] .ds-board .ds-col .ds-col-body{width:100%!important;box-sizing:border-box!important}[data-dsh-studio]{height:100%!important;min-height:0!important;max-height:100%!important;overflow:hidden!important}[data-dsh-studio]>.ds-head{flex:0 0 auto}[data-dsh-studio]>.ds-body{flex:1 1 auto!important;min-height:0!important;overflow:auto!important}[data-dsh-studio] .ds-req-page,[data-dsh-studio] .ds-board,[data-dsh-studio] .ds-pane-stack{min-height:0}html body [data-dsh-studio]{display:flex!important;flex-direction:column!important;height:100vh!important;max-height:100vh!important;min-height:0!important;overflow:hidden!important}html body [data-dsh-studio]>.ds-body{flex:1 1 auto!important;min-height:0!important;overflow-y:auto!important;overflow-x:hidden!important}html body [data-dsh-studio]>.ds-body>*{min-height:0!important}html body [data-dsh-studio] .ds-empty,html body [data-dsh-studio] .ds-hint{max-width:100%}html body [data-dsh-studio]:not([data-dsh-studio-portal]){height:100vh!important;max-height:100vh!important;display:flex!important;flex-direction:column!important;overflow:hidden!important}html body [data-dsh-studio][data-dsh-studio-portal]{position:fixed!important;inset:0!important;width:0!important;height:0!important;min-height:0!important;overflow:visible!important;margin:0!important;padding:0!important}[data-dsh-studio] input:disabled,[data-dsh-studio-portal] input:disabled{background:var(--muted)!important;opacity:1!important;cursor:not-allowed}[data-dsh-studio] .ds-field>.ds-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-dsh-studio] .ds-an-grid{align-items:stretch}[data-dsh-studio] .ds-an-grid>*{min-width:0}[data-dsh-studio] .ds-an-grid>.ds-panel{height:100%}[data-dsh-studio] .ds-an-grid>.ds-panel>.ds-panel-body{flex:1 1 auto;min-height:0}[data-dsh-studio] .ds-an-grid .ds-panel-head{flex-direction:column;align-items:flex-start;gap:3px}[data-dsh-studio] .ds-an-grid .ds-panel-head .ds-hint{margin-left:0}[data-dsh-studio] .ds-an-grid .ds-panel-title{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-dsh-studio] .ds-an-grid .ds-an-foot{margin-top:auto}[data-dsh-studio] .ds-pane-stack{display:flex;flex-direction:column;gap:12px}[data-dsh-studio] .ds-pane-stack>.ds-panel{margin:0}[data-dsh-studio] .ds-pane-stack>.ds-panel>.ds-panel-head{padding:10px 14px;border-bottom:1px solid var(--border)}[data-dsh-studio] .ds-pane-stack>.ds-panel>.ds-panel-body{padding:12px 14px}[data-dsh-studio] .ds-pane input:not([type=checkbox]):not([type=radio]):not([type=file]),[data-dsh-studio] .ds-pane textarea,[data-dsh-studio-portal] input:not([type=checkbox]):not([type=radio]):not([type=file]),[data-dsh-studio-portal] textarea{border:1px solid var(--border)!important;border-radius:6px!important;background:var(--card)!important}[data-dsh-studio] .ds-pane input:focus,[data-dsh-studio] .ds-pane textarea:focus,[data-dsh-studio-portal] input:focus,[data-dsh-studio-portal] textarea:focus{outline:none!important;border-color:var(--ring)!important;box-shadow:0 0 0 3px color-mix(in srgb,var(--ring) 28%,transparent)!important}[data-dsh-studio] .ds-pane .ds-field>.ds-label{font-size:11.5px;color:var(--muted-foreground)}[data-dsh-studio] .ds-pane .ds-sec-head{margin-bottom:6px}[data-dsh-studio] .ds-nav-item{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:32px!important;padding:6px 10px!important;border-radius:7px;font-size:12.5px;line-height:1.3;width:100%;text-align:left}[data-dsh-studio] .ds-nav-item+.ds-nav-item{margin-top:2px}[data-dsh-studio] .ds-listrow{display:flex;align-items:center;gap:12px;padding:10px 14px}[data-dsh-studio] .ds-listrow-main{display:flex;flex-direction:column;gap:3px;min-width:0;flex:1 1 auto}[data-dsh-studio] .ds-listrow-main>div{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-dsh-studio] .ds-listrow-main [data-prompt="1"]{color:var(--muted-foreground);font-size:11.5px}[data-dsh-studio] .ds-listrow-actions{flex:0 0 auto;display:flex;align-items:center;gap:6px}[data-dsh-studio] [role=switch]{display:inline-flex!important;align-items:center;padding:2px!important;box-sizing:border-box}[data-dsh-studio] [role=switch]>span{transform:none!important;margin:0!important;flex:0 0 auto!important;width:16px!important;height:16px!important;border-radius:9999px}[data-dsh-studio] [role=switch][data-state=unchecked]>span{margin-right:auto!important}[data-dsh-studio] [role=switch][data-state=checked]>span{margin-left:auto!important}[data-dsh-studio] [role=tablist]>[role=tab]:not([data-state=active]){background:transparent!important;color:color-mix(in srgb,var(--foreground) 60%,transparent)!important;box-shadow:none!important}[data-dsh-studio] [role=tablist]>[role=tab]:not([data-state=active]):hover{color:var(--foreground)!important}[data-dsh-studio] [role=tablist],[data-dsh-studio-portal] [role=tablist]{background:color-mix(in srgb,var(--foreground) 6%,var(--background));border:1px solid color-mix(in srgb,var(--foreground) 10%,var(--background));border-radius:9px;padding:3px;gap:3px}[data-dsh-studio] [role=tablist]>[role=tab][data-state=active],[data-dsh-studio-portal] [role=tablist]>[role=tab][data-state=active]{background:var(--card)!important;color:var(--foreground)!important;border:1px solid color-mix(in srgb,var(--foreground) 12%,var(--card))!important;box-shadow:0 1px 2px color-mix(in srgb,var(--foreground) 12%,transparent)!important}[data-dsh-studio][data-theme=dark] [role=tablist],[data-dsh-studio-portal][data-theme=dark] [role=tablist]{background:#16181d;border-color:#2a2e36}[data-dsh-studio][data-theme=dark] [role=tablist]>[role=tab][data-state=active],[data-dsh-studio-portal][data-theme=dark] [role=tablist]>[role=tab][data-state=active]{background:#2b3038!important;color:#fff!important;border-color:#3d434e!important}[data-dsh-studio] .ds-count[data-over="1"]{background:color-mix(in srgb,#e5484d 14%,var(--card));border-color:color-mix(in srgb,#e5484d 45%,var(--border));color:#b42318}[data-dsh-studio][data-theme=dark] .ds-count[data-over="1"]{color:#ff9a9d}[data-dsh-studio] .ds-colpick{position:relative;z-index:30;margin-top:6px}[data-dsh-studio] .ds-colpick-list{max-height:220px;overflow-y:auto;border:1px solid var(--border);border-radius:8px;background:var(--card);box-shadow:var(--ds-shadow);padding:4px}[data-dsh-studio] .ds-colpick .ds-mention-item{display:flex;gap:8px;align-items:center;width:100%;padding:6px 8px;border-radius:6px;background:transparent;border:0;text-align:left;cursor:pointer;font-size:12.5px}[data-dsh-studio] .ds-colpick .ds-mention-item:hover{background:var(--muted)}[data-dsh-studio] .ds-req-grid{grid-template-columns:300px minmax(0,1fr)!important;gap:14px!important;align-items:start;min-width:0}[data-dsh-studio] .ds-req-grid>*{min-width:0;max-width:100%}[data-dsh-studio] .ds-req-list{max-height:calc(100vh - 220px);overflow-y:auto;overflow-x:hidden;padding-right:2px}[data-dsh-studio] .ds-req-list-head{flex-wrap:wrap;row-gap:6px}[data-dsh-studio] .ds-req-list-head>.ds-btn{flex:0 0 auto;margin-left:0!important}[data-dsh-studio] .ds-req-item{overflow:hidden}[data-dsh-studio] .ds-req-item-title{white-space:normal;overflow-wrap:anywhere}[data-dsh-studio] .ds-req-item-meta{row-gap:4px}[data-dsh-studio] .ds-req-headline{flex-wrap:wrap;min-width:0}[data-dsh-studio] .ds-req-headline>*{min-width:0}[data-dsh-studio] .ds-req-actions{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end}[data-dsh-studio] .ds-body{overflow-x:hidden;min-width:0}[data-dsh-studio] .ds-pane-stack,[data-dsh-studio] .ds-panel,[data-dsh-studio] .ds-panel-body{min-width:0;max-width:100%}[data-dsh-studio] .ds-panel-head{flex-wrap:wrap;row-gap:4px}[data-dsh-studio] .ds-kv{min-width:0}[data-dsh-studio] .ds-kv dd{overflow-wrap:anywhere}@media (max-width: 1100px){[data-dsh-studio] .ds-req-grid{grid-template-columns:minmax(0,1fr)!important}}[data-dsh-studio] .ds-biz-strip{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:8px 10px;border:1px solid var(--border);border-radius:8px;background:var(--muted);margin-bottom:8px}[data-dsh-studio] .ds-biz-rows{display:flex;flex-direction:column;gap:4px;width:100%;margin-top:2px}[data-dsh-studio] .ds-biz-row{display:flex;align-items:center;gap:8px;min-width:0;padding:4px 6px;border-radius:6px;background:var(--card);border:1px solid var(--border)}[data-dsh-studio] .ds-biz-row>span{min-width:0}[data-dsh-studio] .ds-biz-row .ds-btn{height:26px;padding:0 8px;font-size:11.5px}[data-dsh-studio] .ds-intake-form{position:fixed;right:24px;top:92px;width:min(460px,92vw);z-index:70;display:grid!important;gap:8px;padding:14px;border:1px solid var(--border);border-radius:10px;background:var(--card);box-shadow:0 12px 32px -12px #00000073}[data-dsh-studio] .ds-intake-form .ds-row{display:flex;gap:8px}[data-dsh-studio] .ds-intake-form .ds-field{min-width:0;flex:1 1 0}[data-dsh-studio] .ds-intake-form textarea{min-height:64px}[data-dsh-studio] .ds-biz-strip{position:fixed;left:50%;top:88px;transform:translate(-50%);width:min(760px,94vw);z-index:65;display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:8px 10px;border:1px solid var(--border);border-radius:10px;background:var(--card);box-shadow:0 14px 36px -16px #00000080}[data-dsh-studio] .ds-biz-strip .ds-biz-rows{max-height:132px;overflow-y:auto}[data-dsh-studio] .ds-req-list>.ds-biz-strip{display:flex}[data-dsh-studio] .ds-biz-strip{display:none!important}[data-dsh-studio] .ds-biz-result{padding:6px 10px;border:1px solid var(--border);border-radius:7px;background:var(--muted);font-size:12px;margin-top:6px}[data-dsh-studio] .ds-hint{white-space:normal}@media (min-width:1100px){[data-dsh-studio] .ds-body>div:has(>.ds-req-list){display:flex;gap:12px;align-items:flex-start;min-height:0}[data-dsh-studio] .ds-req-list{flex:0 0 340px;max-width:340px;max-height:calc(100vh - 210px);overflow-y:auto}[data-dsh-studio] .ds-body>div:has(>.ds-req-list)>div:not(.ds-req-list){flex:1 1 auto;min-width:0;max-height:calc(100vh - 210px);overflow-y:auto}}[data-dsh-studio] #ds-intake-overlay{display:flex;flex-direction:column}[data-dsh-studio] #ds-intake-overlay .ds-body{overflow:visible}[data-dsh-studio] #ds-intake-overlay .ds-body>div{grid-template-columns:minmax(0,1fr)!important;padding:0 14px 20px!important}[data-dsh-studio] #ds-intake-overlay>div:first-child{padding:10px 14px;border-bottom:1px solid var(--border);background:var(--card);position:sticky;top:0;z-index:2}[data-dsh-studio] #ds-intake-overlay{width:min(640px,96vw)!important;z-index:95!important}[data-dsh-studio] #ds-intake-overlay:before{content:"";position:fixed;inset:0;background:#09090b61;z-index:-1}[data-dsh-studio] #ds-intake-overlay .ds-field{flex:1 1 100%!important;min-width:0}[data-dsh-studio] #ds-intake-overlay .ds-body>div>div{min-width:0}@media (min-width:1100px){[data-dsh-studio] .ds-body>div:has(>.ds-req-list){flex-wrap:wrap;align-items:flex-start}[data-dsh-studio] .ds-intake-launch{flex:0 0 100%;width:100%;padding:0 0 8px}}[data-dsh-studio] [data-mode=form] [data-panel=status],[data-dsh-studio] [data-mode=status] [data-panel=form],[data-dsh-studio] [data-mode=status] [data-panel=list]{display:none!important}[data-dsh-studio] .ds-card[data-dragging="1"]{opacity:.55;transform:rotate(-.5deg)}[data-dsh-studio] .ds-col[data-drag-over="1"]{outline:2px dashed var(--ds-accent);outline-offset:-3px;background:color-mix(in srgb,var(--ds-accent) 8%,var(--muted))}[data-dsh-studio] .ds-palette-veil{position:fixed;inset:0;z-index:120;background:#09090b61;display:flex;align-items:flex-start;justify-content:center;padding-top:12vh}[data-dsh-studio] .ds-palette{width:min(560px,92vw);background:var(--ds-surface, #fff);border:1px solid var(--ds-line, #e4e4e7);border-radius:12px;box-shadow:0 24px 64px #00000047;overflow:hidden}[data-dsh-studio] .ds-palette-input{width:100%;height:44px;padding:0 14px;border:0;border-bottom:1px solid var(--ds-line, #e4e4e7);background:transparent;color:inherit;font-size:14px;outline:none}[data-dsh-studio] .ds-palette-flow{display:flex;align-items:center;gap:8px;padding:8px 14px 0;font-size:12px;color:var(--ds-muted, #71717a)}[data-dsh-studio] .ds-palette-flow:before{content:"";width:6px;height:6px;border-radius:999px;background:#7c3aed}[data-dsh-studio] .ds-palette-flow[data-flow=expert]:before{background:#0ea5e9}[data-dsh-studio] .ds-palette-list{max-height:min(52vh,420px);overflow:auto;padding:6px}[data-dsh-studio] .ds-palette-item{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:8px;cursor:pointer;font-size:13px}[data-dsh-studio] .ds-palette-item[data-active="1"]{background:color-mix(in srgb,var(--ds-accent, #18181b) 10%,transparent)}[data-dsh-studio] .ds-palette-kind{flex:0 0 auto;font-size:11px;padding:1px 6px;border-radius:999px;background:var(--ds-surface-2, #f4f4f5);color:var(--ds-muted, #71717a)}[data-dsh-studio] .ds-palette-kind[data-kind=action]{background:color-mix(in srgb,#7c3aed 16%,transparent);color:#7c3aed}[data-dsh-studio] [data-theme=dark] .ds-palette-kind[data-kind=action],[data-dsh-studio-portal] [data-theme=dark] .ds-palette-kind[data-kind=action]{background:color-mix(in srgb,#a78bfa 22%,transparent);color:#c4b5fd}[data-dsh-studio] .ds-palette-label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-dsh-studio] .ds-diff{margin-top:10px;border:1px solid var(--ds-line, #e4e4e7);border-radius:10px;overflow:hidden}[data-dsh-studio] .ds-diff-head{display:flex;align-items:center;gap:10px;padding:7px 10px;background:var(--ds-surface-2, #f4f4f5);font-size:12px}[data-dsh-studio] .ds-diff-body{max-height:340px;overflow:auto;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:1.55}[data-dsh-studio] .ds-diff-line{padding:1px 10px;white-space:pre-wrap;word-break:break-word}[data-dsh-studio] .ds-diff-line[data-kind=add]{background:#e9f7ef;color:#11623b}[data-dsh-studio] .ds-diff-line[data-kind=del]{background:#fdecec;color:#a4232b}[data-dsh-studio] .ds-diff-line[data-kind=same]{color:var(--ds-muted, #71717a)}[data-dsh-studio] .ds-reg-banner{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:8px 12px;margin-bottom:10px;border:1px solid var(--ds-line, #e4e4e7);border-radius:10px;background:var(--ds-surface-2, #f4f4f5);font-size:12px}[data-dsh-studio] .ds-reg-banner[data-bad="1"]{border-color:#f3c0c2;background:#fdf2f2;color:#b42318}[data-dsh-studio] .ds-suite{display:inline-flex;align-items:center;gap:6px;padding:2px 8px;border:1px solid var(--ds-line, #e4e4e7);border-radius:999px;background:var(--ds-surface-2, #f4f4f5);font-size:12px}[data-dsh-studio] .ds-suite[data-default="1"]{border-color:#a5b4fc;background:#eef2ff;color:#3730a3}[data-dsh-studio] .ds-reg-list{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-top:8px}[data-dsh-studio] .ds-reg-item{font-size:11px;padding:1px 8px;border-radius:999px;border:1px solid var(--ds-line, #e4e4e7);background:var(--ds-surface-2, #f4f4f5);color:var(--ds-muted, #71717a);white-space:nowrap}[data-dsh-studio] .ds-reg-item[data-bad="1"]{border-color:#f3c0c2;background:#fdf2f2;color:#b42318}[data-dsh-studio] .ds-case-lib{display:flex;flex-direction:column}[data-dsh-studio] .ds-case-lib-row{display:grid;grid-template-columns:26px 88px minmax(0,1fr) 220px 56px 40px 92px 56px;gap:10px;align-items:center;padding:7px 10px;border-bottom:1px solid var(--ds-line, #e4e4e7);cursor:pointer;font-size:13px}[data-dsh-studio] .ds-case-lib-row:hover{background:color-mix(in srgb,var(--ds-accent, #18181b) 6%,transparent)}[data-dsh-studio] .ds-case-lib-row[data-result=fail]{background:color-mix(in srgb,#e5484d 8%,transparent)}[data-dsh-studio] .ds-case-lib-wrap{border-bottom:1px solid var(--ds-line, #e4e4e7)}[data-dsh-studio] .ds-case-lib-wrap .ds-case-lib-row{border-bottom:0}[data-dsh-studio] .ds-case-lib-detail{padding:8px 12px 10px 36px;background:var(--ds-surface-2, #f4f4f5);font-size:12px;line-height:1.6;color:var(--ds-muted, #71717a)}[data-dsh-studio] .ds-case-lib-preview{margin:6px 0 0;padding:8px 10px;max-height:180px;overflow:auto;background:var(--ds-surface, #fff);border:1px solid var(--ds-line, #e4e4e7);border-radius:8px;font-size:11px;white-space:pre-wrap;word-break:break-word}[data-dsh-studio] .ds-case-lib-pick{display:flex;align-items:center;justify-content:center}[data-dsh-studio] .ds-case-lib-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-dsh-studio] .ds-case-lib-meta,[data-dsh-studio] .ds-case-lib-at{color:var(--ds-muted, #71717a);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-dsh-studio] .ds-case-lib-pri{color:var(--ds-muted, #71717a);font-size:11px;text-transform:uppercase}[data-dsh-studio] .ds-palette-hint{flex:0 0 auto;max-width:40%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ds-muted, #71717a);font-size:12px}[data-dsh-studio] .ds-palette-key{flex:0 0 auto;font-size:11px;line-height:16px;padding:1px 6px;border-radius:5px;border:1px solid var(--ds-line, #e4e4e7);background:var(--ds-surface-2, #f4f4f5);color:var(--ds-muted, #71717a);white-space:nowrap}[data-dsh-studio][data-theme=dark] .ds-palette-key{border-color:#3f3f46;background:#27272a;color:#a1a1aa}[data-dsh-studio][data-theme=dark] .ds-palette-veil{background:#0009}[data-dsh-studio] .selection\\:bg-primary *::-moz-selection,[data-dsh-studio-portal] .selection\\:bg-primary *::-moz-selection{background-color:var(--primary)}[data-dsh-studio] .selection\\:bg-primary *::selection,[data-dsh-studio-portal] .selection\\:bg-primary *::selection{background-color:var(--primary)}[data-dsh-studio] .selection\\:text-primary-foreground *::-moz-selection,[data-dsh-studio-portal] .selection\\:text-primary-foreground *::-moz-selection{color:var(--primary-foreground)}[data-dsh-studio] .selection\\:text-primary-foreground *::selection,[data-dsh-studio-portal] .selection\\:text-primary-foreground *::selection{color:var(--primary-foreground)}[data-dsh-studio] .selection\\:bg-primary::-moz-selection,[data-dsh-studio-portal] .selection\\:bg-primary::-moz-selection{background-color:var(--primary)}[data-dsh-studio] .selection\\:bg-primary::selection,[data-dsh-studio-portal] .selection\\:bg-primary::selection{background-color:var(--primary)}[data-dsh-studio] .selection\\:text-primary-foreground::-moz-selection,[data-dsh-studio-portal] .selection\\:text-primary-foreground::-moz-selection{color:var(--primary-foreground)}[data-dsh-studio] .selection\\:text-primary-foreground::selection,[data-dsh-studio-portal] .selection\\:text-primary-foreground::selection{color:var(--primary-foreground)}[data-dsh-studio] .file\\:inline-flex::file-selector-button,[data-dsh-studio-portal] .file\\:inline-flex::file-selector-button{display:inline-flex}[data-dsh-studio] .file\\:h-7::file-selector-button,[data-dsh-studio-portal] .file\\:h-7::file-selector-button{height:1.75rem}[data-dsh-studio] .file\\:border-0::file-selector-button,[data-dsh-studio-portal] .file\\:border-0::file-selector-button{border-width:0px}[data-dsh-studio] .file\\:bg-transparent::file-selector-button,[data-dsh-studio-portal] .file\\:bg-transparent::file-selector-button{background-color:transparent}[data-dsh-studio] .file\\:text-sm::file-selector-button,[data-dsh-studio-portal] .file\\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}[data-dsh-studio] .file\\:font-medium::file-selector-button,[data-dsh-studio-portal] .file\\:font-medium::file-selector-button{font-weight:500}[data-dsh-studio] .file\\:text-foreground::file-selector-button,[data-dsh-studio-portal] .file\\:text-foreground::file-selector-button{color:var(--foreground)}[data-dsh-studio] .placeholder\\:text-muted-foreground::-moz-placeholder,[data-dsh-studio-portal] .placeholder\\:text-muted-foreground::-moz-placeholder{color:var(--muted-foreground)}[data-dsh-studio] .placeholder\\:text-muted-foreground::placeholder,[data-dsh-studio-portal] .placeholder\\:text-muted-foreground::placeholder{color:var(--muted-foreground)}[data-dsh-studio] .hover\\:bg-accent:hover,[data-dsh-studio-portal] .hover\\:bg-accent:hover{background-color:var(--accent)}[data-dsh-studio] .hover\\:bg-muted:hover,[data-dsh-studio-portal] .hover\\:bg-muted:hover{background-color:var(--muted)}[data-dsh-studio] .hover\\:text-accent-foreground:hover,[data-dsh-studio-portal] .hover\\:text-accent-foreground:hover{color:var(--accent-foreground)}[data-dsh-studio] .hover\\:text-foreground:hover,[data-dsh-studio-portal] .hover\\:text-foreground:hover{color:var(--foreground)}[data-dsh-studio] .hover\\:underline:hover,[data-dsh-studio-portal] .hover\\:underline:hover{text-decoration-line:underline}[data-dsh-studio] .hover\\:opacity-100:hover,[data-dsh-studio-portal] .hover\\:opacity-100:hover{opacity:1}[data-dsh-studio] .focus\\:outline-none:focus,[data-dsh-studio-portal] .focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}[data-dsh-studio] .focus\\:ring-2:focus,[data-dsh-studio-portal] .focus\\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}[data-dsh-studio] .focus\\:ring-ring:focus,[data-dsh-studio-portal] .focus\\:ring-ring:focus{--tw-ring-color: var(--ring)}[data-dsh-studio] .focus-visible\\:border-ring:focus-visible,[data-dsh-studio-portal] .focus-visible\\:border-ring:focus-visible{border-color:var(--ring)}[data-dsh-studio] .focus-visible\\:outline-none:focus-visible,[data-dsh-studio-portal] .focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}[data-dsh-studio] .focus-visible\\:outline-1:focus-visible,[data-dsh-studio-portal] .focus-visible\\:outline-1:focus-visible{outline-width:1px}[data-dsh-studio] .focus-visible\\:outline-ring:focus-visible,[data-dsh-studio-portal] .focus-visible\\:outline-ring:focus-visible{outline-color:var(--ring)}[data-dsh-studio] .focus-visible\\:ring-2:focus-visible,[data-dsh-studio-portal] .focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}[data-dsh-studio] .focus-visible\\:ring-\\[3px\\]:focus-visible,[data-dsh-studio-portal] .focus-visible\\:ring-\\[3px\\]:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}[data-dsh-studio] .focus-visible\\:ring-ring:focus-visible,[data-dsh-studio-portal] .focus-visible\\:ring-ring:focus-visible{--tw-ring-color: var(--ring)}[data-dsh-studio] .disabled\\:pointer-events-none:disabled,[data-dsh-studio-portal] .disabled\\:pointer-events-none:disabled{pointer-events:none}[data-dsh-studio] .disabled\\:cursor-not-allowed:disabled,[data-dsh-studio-portal] .disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}[data-dsh-studio] .disabled\\:opacity-50:disabled,[data-dsh-studio-portal] .disabled\\:opacity-50:disabled{opacity:.5}[data-dsh-studio] .has-\\[\\>svg\\]\\:px-2\\.5:has(>svg),[data-dsh-studio-portal] .has-\\[\\>svg\\]\\:px-2\\.5:has(>svg){padding-left:.625rem;padding-right:.625rem}[data-dsh-studio] .has-\\[\\>svg\\]\\:px-3:has(>svg),[data-dsh-studio-portal] .has-\\[\\>svg\\]\\:px-3:has(>svg){padding-left:.75rem;padding-right:.75rem}[data-dsh-studio] .has-\\[\\>svg\\]\\:px-4:has(>svg),[data-dsh-studio-portal] .has-\\[\\>svg\\]\\:px-4:has(>svg){padding-left:1rem;padding-right:1rem}[data-dsh-studio] .data-\\[disabled\\]\\:pointer-events-none[data-disabled],[data-dsh-studio-portal] .data-\\[disabled\\]\\:pointer-events-none[data-disabled]{pointer-events:none}[data-dsh-studio] .data-\\[orientation\\=horizontal\\]\\:h-8[data-orientation=horizontal],[data-dsh-studio-portal] .data-\\[orientation\\=horizontal\\]\\:h-8[data-orientation=horizontal]{height:2rem}[data-dsh-studio] .data-\\[orientation\\=vertical\\]\\:h-fit[data-orientation=vertical],[data-dsh-studio-portal] .data-\\[orientation\\=vertical\\]\\:h-fit[data-orientation=vertical]{height:-moz-fit-content;height:fit-content}[data-dsh-studio] .data-\\[state\\=checked\\]\\:translate-x-4[data-state=checked],[data-dsh-studio-portal] .data-\\[state\\=checked\\]\\:translate-x-4[data-state=checked]{--tw-translate-x: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-dsh-studio] .data-\\[state\\=checked\\]\\:translate-x-\\[18px\\][data-state=checked],[data-dsh-studio-portal] .data-\\[state\\=checked\\]\\:translate-x-\\[18px\\][data-state=checked]{--tw-translate-x: 18px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-dsh-studio] .data-\\[state\\=unchecked\\]\\:translate-x-0[data-state=unchecked],[data-dsh-studio-portal] .data-\\[state\\=unchecked\\]\\:translate-x-0[data-state=unchecked]{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-dsh-studio] .data-\\[orientation\\=vertical\\]\\:flex-col[data-orientation=vertical],[data-dsh-studio-portal] .data-\\[orientation\\=vertical\\]\\:flex-col[data-orientation=vertical]{flex-direction:column}[data-dsh-studio] .data-\\[highlighted\\]\\:bg-accent[data-highlighted],[data-dsh-studio-portal] .data-\\[highlighted\\]\\:bg-accent[data-highlighted]{background-color:var(--accent)}[data-dsh-studio] .data-\\[state\\=active\\]\\:bg-background[data-state=active],[data-dsh-studio-portal] .data-\\[state\\=active\\]\\:bg-background[data-state=active]{background-color:var(--background)}[data-dsh-studio] .data-\\[state\\=checked\\]\\:bg-primary[data-state=checked],[data-dsh-studio-portal] .data-\\[state\\=checked\\]\\:bg-primary[data-state=checked],[data-dsh-studio] .data-\\[state\\=on\\]\\:bg-primary[data-state=on],[data-dsh-studio-portal] .data-\\[state\\=on\\]\\:bg-primary[data-state=on]{background-color:var(--primary)}[data-dsh-studio] .data-\\[state\\=unchecked\\]\\:bg-input[data-state=unchecked],[data-dsh-studio-portal] .data-\\[state\\=unchecked\\]\\:bg-input[data-state=unchecked]{background-color:var(--input)}[data-dsh-studio] .data-\\[highlighted\\]\\:text-accent-foreground[data-highlighted],[data-dsh-studio-portal] .data-\\[highlighted\\]\\:text-accent-foreground[data-highlighted]{color:var(--accent-foreground)}[data-dsh-studio] .data-\\[placeholder\\]\\:text-muted-foreground[data-placeholder],[data-dsh-studio-portal] .data-\\[placeholder\\]\\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}[data-dsh-studio] .data-\\[state\\=active\\]\\:text-foreground[data-state=active],[data-dsh-studio-portal] .data-\\[state\\=active\\]\\:text-foreground[data-state=active]{color:var(--foreground)}[data-dsh-studio] .data-\\[state\\=checked\\]\\:text-primary-foreground[data-state=checked],[data-dsh-studio-portal] .data-\\[state\\=checked\\]\\:text-primary-foreground[data-state=checked],[data-dsh-studio] .data-\\[state\\=on\\]\\:text-primary-foreground[data-state=on],[data-dsh-studio-portal] .data-\\[state\\=on\\]\\:text-primary-foreground[data-state=on]{color:var(--primary-foreground)}[data-dsh-studio] .data-\\[disabled\\]\\:opacity-50[data-disabled],[data-dsh-studio-portal] .data-\\[disabled\\]\\:opacity-50[data-disabled]{opacity:.5}[data-dsh-studio] .data-\\[state\\=active\\]\\:shadow-sm[data-state=active],[data-dsh-studio-portal] .data-\\[state\\=active\\]\\:shadow-sm[data-state=active],[data-dsh-studio] .data-\\[state\\=on\\]\\:shadow-sm[data-state=on],[data-dsh-studio-portal] .data-\\[state\\=on\\]\\:shadow-sm[data-state=on]{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}@media (min-width: 640px){[data-dsh-studio] .sm\\:max-w-lg,[data-dsh-studio-portal] .sm\\:max-w-lg{max-width:32rem}}@media (min-width: 768px){[data-dsh-studio] .md\\:text-sm,[data-dsh-studio-portal] .md\\:text-sm{font-size:.875rem;line-height:1.25rem}}[data-dsh-studio] .dark\\:text-muted-foreground:where([data-theme=dark],[data-theme=dark] *),[data-dsh-studio-portal] .dark\\:text-muted-foreground:where([data-theme=dark],[data-theme=dark] *){color:var(--muted-foreground)}[data-dsh-studio] .dark\\:hover\\:text-foreground:hover:where([data-theme=dark],[data-theme=dark] *),[data-dsh-studio-portal] .dark\\:hover\\:text-foreground:hover:where([data-theme=dark],[data-theme=dark] *){color:var(--foreground)}[data-dsh-studio] .dark\\:data-\\[state\\=active\\]\\:border-input[data-state=active]:where([data-theme=dark],[data-theme=dark] *),[data-dsh-studio-portal] .dark\\:data-\\[state\\=active\\]\\:border-input[data-state=active]:where([data-theme=dark],[data-theme=dark] *){border-color:var(--input)}[data-dsh-studio] .dark\\:data-\\[state\\=active\\]\\:text-foreground[data-state=active]:where([data-theme=dark],[data-theme=dark] *),[data-dsh-studio-portal] .dark\\:data-\\[state\\=active\\]\\:text-foreground[data-state=active]:where([data-theme=dark],[data-theme=dark] *){color:var(--foreground)}[data-dsh-studio] .\\[\\&\\>svg\\]\\:pointer-events-none>svg,[data-dsh-studio-portal] .\\[\\&\\>svg\\]\\:pointer-events-none>svg{pointer-events:none}[data-dsh-studio] .\\[\\&\\>svg\\]\\:size-3>svg,[data-dsh-studio-portal] .\\[\\&\\>svg\\]\\:size-3>svg{width:.75rem;height:.75rem}[data-dsh-studio] .\\[\\&_svg\\:not\\(\\[class\\*\\=\\\\\\'size-\\\\\\'\\]\\)\\]\\:size-4 svg:not([class*="'size-'"]),[data-dsh-studio-portal] .\\[\\&_svg\\:not\\(\\[class\\*\\=\\\\\\'size-\\\\\\'\\]\\)\\]\\:size-4 svg:not([class*="'size-'"]){width:1rem;height:1rem}[data-dsh-studio] .\\[\\&_svg\\:not\\(\\[class\\*\\=text-\\]\\)\\]\\:text-muted-foreground svg:not([class*=text-]),[data-dsh-studio-portal] .\\[\\&_svg\\:not\\(\\[class\\*\\=text-\\]\\)\\]\\:text-muted-foreground svg:not([class*=text-]){color:var(--muted-foreground)}[data-dsh-studio] .\\[\\&_svg\\]\\:pointer-events-none svg,[data-dsh-studio-portal] .\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}[data-dsh-studio] .\\[\\&_svg\\]\\:shrink-0 svg,[data-dsh-studio-portal] .\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}`;function Qy(e){function t(n,r){const s=[];return String(n??"").split(/(`[^`]+`)/g).forEach((i,l)=>{if(i.length>1&&i.startsWith("`")&&i.endsWith("`")){s.push(e("code",{key:`${r}c${l}`},i.slice(1,-1)));return}const c=/\[([^\]]+)\]\(([^)\s]+)\)|\*\*([^*]+)\*\*|__([^_]+)__|\*([^*\n]+)\*|_([^_\n]+)_/g;let u=0,p;for(;(p=c.exec(i))!==null;){p.index>u&&s.push(i.slice(u,p.index));const f=`${r}i${l}-${p.index}`;p[1]!==void 0?s.push(e("a",{key:f,href:p[2],target:"_blank",rel:"noreferrer"},p[1])):p[3]!==void 0||p[4]!==void 0?s.push(e("strong",{key:f},p[3]??p[4])):s.push(e("em",{key:f},p[5]??p[6])),u=p.index+p[0].length}u<i.length&&s.push(i.slice(u))}),s}function a(n){const r=String(n??"").replace(/\r\n?/g,`
|
|
9
|
+
*/var $r=Symbol.for("react.element"),Dy=Symbol.for("react.portal"),Oy=Symbol.for("react.fragment"),Ly=Symbol.for("react.strict_mode"),My=Symbol.for("react.profiler"),zy=Symbol.for("react.provider"),Fy=Symbol.for("react.context"),By=Symbol.for("react.forward_ref"),Uy=Symbol.for("react.suspense"),qy=Symbol.for("react.memo"),Vy=Symbol.for("react.lazy"),Dp=Symbol.iterator;function Wy(e){return e===null||typeof e!="object"?null:(e=Dp&&e[Dp]||e["@@iterator"],typeof e=="function"?e:null)}var Op={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Lp=Object.assign,Mp={};function Rs(e,t,a){this.props=e,this.context=t,this.refs=Mp,this.updater=a||Op}Rs.prototype.isReactComponent={},Rs.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},Rs.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function zp(){}zp.prototype=Rs.prototype;function Ml(e,t,a){this.props=e,this.context=t,this.refs=Mp,this.updater=a||Op}var zl=Ml.prototype=new zp;zl.constructor=Ml,Lp(zl,Rs.prototype),zl.isPureReactComponent=!0;var Fp=Array.isArray,Bp=Object.prototype.hasOwnProperty,Fl={current:null},Up={key:!0,ref:!0,__self:!0,__source:!0};function qp(e,t,a){var n,r={},s=null,o=null;if(t!=null)for(n in t.ref!==void 0&&(o=t.ref),t.key!==void 0&&(s=""+t.key),t)Bp.call(t,n)&&!Up.hasOwnProperty(n)&&(r[n]=t[n]);var i=arguments.length-2;if(i===1)r.children=a;else if(1<i){for(var l=Array(i),c=0;c<i;c++)l[c]=arguments[c+2];r.children=l}if(e&&e.defaultProps)for(n in i=e.defaultProps,i)r[n]===void 0&&(r[n]=i[n]);return{$$typeof:$r,type:e,key:s,ref:o,props:r,_owner:Fl.current}}function Hy(e,t){return{$$typeof:$r,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}function Bl(e){return typeof e=="object"&&e!==null&&e.$$typeof===$r}function Gy(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(a){return t[a]})}var Vp=/\/+/g;function Ul(e,t){return typeof e=="object"&&e!==null&&e.key!=null?Gy(""+e.key):t.toString(36)}function Oo(e,t,a,n,r){var s=typeof e;(s==="undefined"||s==="boolean")&&(e=null);var o=!1;if(e===null)o=!0;else switch(s){case"string":case"number":o=!0;break;case"object":switch(e.$$typeof){case $r:case Dy:o=!0}}if(o)return o=e,r=r(o),e=n===""?"."+Ul(o,0):n,Fp(r)?(a="",e!=null&&(a=e.replace(Vp,"$&/")+"/"),Oo(r,t,a,"",function(c){return c})):r!=null&&(Bl(r)&&(r=Hy(r,a+(!r.key||o&&o.key===r.key?"":(""+r.key).replace(Vp,"$&/")+"/")+e)),t.push(r)),1;if(o=0,n=n===""?".":n+":",Fp(e))for(var i=0;i<e.length;i++){s=e[i];var l=n+Ul(s,i);o+=Oo(s,t,a,l,r)}else if(l=Wy(e),typeof l=="function")for(e=l.call(e),i=0;!(s=e.next()).done;)s=s.value,l=n+Ul(s,i++),o+=Oo(s,t,a,l,r);else if(s==="object")throw t=String(e),Error("Objects are not valid as a React child (found: "+(t==="[object Object]"?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return o}function Lo(e,t,a){if(e==null)return e;var n=[],r=0;return Oo(e,n,"","",function(s){return t.call(a,s,r++)}),n}function Ky(e){if(e._status===-1){var t=e._result;t=t(),t.then(function(a){(e._status===0||e._status===-1)&&(e._status=1,e._result=a)},function(a){(e._status===0||e._status===-1)&&(e._status=2,e._result=a)}),e._status===-1&&(e._status=0,e._result=t)}if(e._status===1)return e._result.default;throw e._result}var Xt={current:null},Mo={transition:null},Yy={ReactCurrentDispatcher:Xt,ReactCurrentBatchConfig:Mo,ReactCurrentOwner:Fl};function Wp(){throw Error("act(...) is not supported in production builds of React.")}De.Children={map:Lo,forEach:function(e,t,a){Lo(e,function(){t.apply(this,arguments)},a)},count:function(e){var t=0;return Lo(e,function(){t++}),t},toArray:function(e){return Lo(e,function(t){return t})||[]},only:function(e){if(!Bl(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},De.Component=Rs,De.Fragment=Oy,De.Profiler=My,De.PureComponent=Ml,De.StrictMode=Ly,De.Suspense=Uy,De.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Yy,De.act=Wp,De.cloneElement=function(e,t,a){if(e==null)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var n=Lp({},e.props),r=e.key,s=e.ref,o=e._owner;if(t!=null){if(t.ref!==void 0&&(s=t.ref,o=Fl.current),t.key!==void 0&&(r=""+t.key),e.type&&e.type.defaultProps)var i=e.type.defaultProps;for(l in t)Bp.call(t,l)&&!Up.hasOwnProperty(l)&&(n[l]=t[l]===void 0&&i!==void 0?i[l]:t[l])}var l=arguments.length-2;if(l===1)n.children=a;else if(1<l){i=Array(l);for(var c=0;c<l;c++)i[c]=arguments[c+2];n.children=i}return{$$typeof:$r,type:e.type,key:r,ref:s,props:n,_owner:o}},De.createContext=function(e){return e={$$typeof:Fy,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null},e.Provider={$$typeof:zy,_context:e},e.Consumer=e},De.createElement=qp,De.createFactory=function(e){var t=qp.bind(null,e);return t.type=e,t},De.createRef=function(){return{current:null}},De.forwardRef=function(e){return{$$typeof:By,render:e}},De.isValidElement=Bl,De.lazy=function(e){return{$$typeof:Vy,_payload:{_status:-1,_result:e},_init:Ky}},De.memo=function(e,t){return{$$typeof:qy,type:e,compare:t===void 0?null:t}},De.startTransition=function(e){var t=Mo.transition;Mo.transition={};try{e()}finally{Mo.transition=t}},De.unstable_act=Wp,De.useCallback=function(e,t){return Xt.current.useCallback(e,t)},De.useContext=function(e){return Xt.current.useContext(e)},De.useDebugValue=function(){},De.useDeferredValue=function(e){return Xt.current.useDeferredValue(e)},De.useEffect=function(e,t){return Xt.current.useEffect(e,t)},De.useId=function(){return Xt.current.useId()},De.useImperativeHandle=function(e,t,a){return Xt.current.useImperativeHandle(e,t,a)},De.useInsertionEffect=function(e,t){return Xt.current.useInsertionEffect(e,t)},De.useLayoutEffect=function(e,t){return Xt.current.useLayoutEffect(e,t)},De.useMemo=function(e,t){return Xt.current.useMemo(e,t)},De.useReducer=function(e,t,a){return Xt.current.useReducer(e,t,a)},De.useRef=function(e){return Xt.current.useRef(e)},De.useState=function(e){return Xt.current.useState(e)},De.useSyncExternalStore=function(e,t,a){return Xt.current.useSyncExternalStore(e,t,a)},De.useTransition=function(){return Xt.current.useTransition()},De.version="18.3.1",ca.exports=De;var N=ca.exports;const An=Ft({__proto__:null,default:aa(N)},[N]),Qy=`[data-dsh-studio] *,[data-dsh-studio-portal] *,[data-dsh-studio] :before,[data-dsh-studio-portal] :before,[data-dsh-studio] :after,[data-dsh-studio-portal] :after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }[data-dsh-studio] ::backdrop,[data-dsh-studio-portal] ::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }[data-dsh-studio] .container,[data-dsh-studio-portal] .container{width:100%}@media (min-width: 640px){[data-dsh-studio] .container,[data-dsh-studio-portal] .container{max-width:640px}}@media (min-width: 768px){[data-dsh-studio] .container,[data-dsh-studio-portal] .container{max-width:768px}}@media (min-width: 1024px){[data-dsh-studio] .container,[data-dsh-studio-portal] .container{max-width:1024px}}@media (min-width: 1280px){[data-dsh-studio] .container,[data-dsh-studio-portal] .container{max-width:1280px}}@media (min-width: 1536px){[data-dsh-studio] .container,[data-dsh-studio-portal] .container{max-width:1536px}}[data-dsh-studio] .sr-only,[data-dsh-studio-portal] .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}[data-dsh-studio] .pointer-events-none,[data-dsh-studio-portal] .pointer-events-none{pointer-events:none}[data-dsh-studio] .static,[data-dsh-studio-portal] .static{position:static}[data-dsh-studio] .fixed,[data-dsh-studio-portal] .fixed{position:fixed}[data-dsh-studio] .absolute,[data-dsh-studio-portal] .absolute{position:absolute}[data-dsh-studio] .relative,[data-dsh-studio-portal] .relative{position:relative}[data-dsh-studio] .inset-0,[data-dsh-studio-portal] .inset-0{inset:0}[data-dsh-studio] .left-1\\.5,[data-dsh-studio-portal] .left-1\\.5{left:.375rem}[data-dsh-studio] .left-1\\/2,[data-dsh-studio-portal] .left-1\\/2,[data-dsh-studio] .left-\\[50\\%\\],[data-dsh-studio-portal] .left-\\[50\\%\\]{left:50%}[data-dsh-studio] .right-0,[data-dsh-studio-portal] .right-0{right:0}[data-dsh-studio] .right-1,[data-dsh-studio-portal] .right-1{right:.25rem}[data-dsh-studio] .right-4,[data-dsh-studio-portal] .right-4{right:1rem}[data-dsh-studio] .top-0,[data-dsh-studio-portal] .top-0{top:0}[data-dsh-studio] .top-1,[data-dsh-studio-portal] .top-1{top:.25rem}[data-dsh-studio] .top-1\\/2,[data-dsh-studio-portal] .top-1\\/2{top:50%}[data-dsh-studio] .top-4,[data-dsh-studio-portal] .top-4{top:1rem}[data-dsh-studio] .top-\\[50\\%\\],[data-dsh-studio-portal] .top-\\[50\\%\\]{top:50%}[data-dsh-studio] .z-\\[120\\],[data-dsh-studio-portal] .z-\\[120\\]{z-index:120}[data-dsh-studio] .z-\\[130\\],[data-dsh-studio-portal] .z-\\[130\\]{z-index:130}[data-dsh-studio] .z-\\[90\\],[data-dsh-studio-portal] .z-\\[90\\]{z-index:90}[data-dsh-studio] .z-\\[95\\],[data-dsh-studio-portal] .z-\\[95\\]{z-index:95}[data-dsh-studio] .z-\\[96\\],[data-dsh-studio-portal] .z-\\[96\\]{z-index:96}[data-dsh-studio] .mb-3,[data-dsh-studio-portal] .mb-3{margin-bottom:.75rem}[data-dsh-studio] .ml-1,[data-dsh-studio-portal] .ml-1{margin-left:.25rem}[data-dsh-studio] .mr-1,[data-dsh-studio-portal] .mr-1{margin-right:.25rem}[data-dsh-studio] .mt-0\\.5,[data-dsh-studio-portal] .mt-0\\.5{margin-top:.125rem}[data-dsh-studio] .mt-1,[data-dsh-studio-portal] .mt-1{margin-top:.25rem}[data-dsh-studio] .mt-1\\.5,[data-dsh-studio-portal] .mt-1\\.5{margin-top:.375rem}[data-dsh-studio] .mt-3,[data-dsh-studio-portal] .mt-3{margin-top:.75rem}[data-dsh-studio] .mt-4,[data-dsh-studio-portal] .mt-4{margin-top:1rem}[data-dsh-studio] .box-border,[data-dsh-studio-portal] .box-border{box-sizing:border-box}[data-dsh-studio] .block,[data-dsh-studio-portal] .block{display:block}[data-dsh-studio] .inline,[data-dsh-studio-portal] .inline{display:inline}[data-dsh-studio] .flex,[data-dsh-studio-portal] .flex{display:flex}[data-dsh-studio] .inline-flex,[data-dsh-studio-portal] .inline-flex{display:inline-flex}[data-dsh-studio] .table,[data-dsh-studio-portal] .table{display:table}[data-dsh-studio] .grid,[data-dsh-studio-portal] .grid{display:grid}[data-dsh-studio] .contents,[data-dsh-studio-portal] .contents{display:contents}[data-dsh-studio] .hidden,[data-dsh-studio-portal] .hidden{display:none}[data-dsh-studio] .size-4,[data-dsh-studio-portal] .size-4{width:1rem;height:1rem}[data-dsh-studio] .size-9,[data-dsh-studio-portal] .size-9{width:2.25rem;height:2.25rem}[data-dsh-studio] .h-10,[data-dsh-studio-portal] .h-10{height:2.5rem}[data-dsh-studio] .h-2,[data-dsh-studio-portal] .h-2{height:.5rem}[data-dsh-studio] .h-3\\.5,[data-dsh-studio-portal] .h-3\\.5{height:.875rem}[data-dsh-studio] .h-4,[data-dsh-studio-portal] .h-4{height:1rem}[data-dsh-studio] .h-5,[data-dsh-studio-portal] .h-5{height:1.25rem}[data-dsh-studio] .h-6,[data-dsh-studio-portal] .h-6{height:1.5rem}[data-dsh-studio] .h-7,[data-dsh-studio-portal] .h-7{height:1.75rem}[data-dsh-studio] .h-8,[data-dsh-studio-portal] .h-8{height:2rem}[data-dsh-studio] .h-9,[data-dsh-studio-portal] .h-9{height:2.25rem}[data-dsh-studio] .h-\\[calc\\(100\\%-1px\\)\\],[data-dsh-studio-portal] .h-\\[calc\\(100\\%-1px\\)\\]{height:calc(100% - 1px)}[data-dsh-studio] .h-full,[data-dsh-studio-portal] .h-full{height:100%}[data-dsh-studio] .max-h-\\[280px\\],[data-dsh-studio-portal] .max-h-\\[280px\\]{max-height:280px}[data-dsh-studio] .min-h-0,[data-dsh-studio-portal] .min-h-0{min-height:0px}[data-dsh-studio] .min-h-16,[data-dsh-studio-portal] .min-h-16{min-height:4rem}[data-dsh-studio] .min-h-full,[data-dsh-studio-portal] .min-h-full{min-height:100%}[data-dsh-studio] .w-3\\.5,[data-dsh-studio-portal] .w-3\\.5{width:.875rem}[data-dsh-studio] .w-4,[data-dsh-studio-portal] .w-4{width:1rem}[data-dsh-studio] .w-7,[data-dsh-studio-portal] .w-7{width:1.75rem}[data-dsh-studio] .w-9,[data-dsh-studio-portal] .w-9{width:2.25rem}[data-dsh-studio] .w-\\[380px\\],[data-dsh-studio-portal] .w-\\[380px\\]{width:380px}[data-dsh-studio] .w-\\[min\\(440px\\,92vw\\)\\],[data-dsh-studio-portal] .w-\\[min\\(440px\\,92vw\\)\\]{width:min(440px,92vw)}[data-dsh-studio] .w-\\[min\\(760px\\,96vw\\)\\],[data-dsh-studio-portal] .w-\\[min\\(760px\\,96vw\\)\\]{width:min(760px,96vw)}[data-dsh-studio] .w-fit,[data-dsh-studio-portal] .w-fit{width:-moz-fit-content;width:fit-content}[data-dsh-studio] .w-full,[data-dsh-studio-portal] .w-full{width:100%}[data-dsh-studio] .min-w-0,[data-dsh-studio-portal] .min-w-0{min-width:0px}[data-dsh-studio] .min-w-\\[8rem\\],[data-dsh-studio-portal] .min-w-\\[8rem\\]{min-width:8rem}[data-dsh-studio] .max-w-\\[240px\\],[data-dsh-studio-portal] .max-w-\\[240px\\]{max-width:240px}[data-dsh-studio] .max-w-\\[280px\\],[data-dsh-studio-portal] .max-w-\\[280px\\]{max-width:280px}[data-dsh-studio] .max-w-\\[calc\\(100\\%-2rem\\)\\],[data-dsh-studio-portal] .max-w-\\[calc\\(100\\%-2rem\\)\\]{max-width:calc(100% - 2rem)}[data-dsh-studio] .max-w-full,[data-dsh-studio-portal] .max-w-full{max-width:100%}[data-dsh-studio] .flex-1,[data-dsh-studio-portal] .flex-1{flex:1 1 0%}[data-dsh-studio] .shrink-0,[data-dsh-studio-portal] .shrink-0{flex-shrink:0}[data-dsh-studio] .grow,[data-dsh-studio-portal] .grow{flex-grow:1}[data-dsh-studio] .-translate-x-1\\/2,[data-dsh-studio-portal] .-translate-x-1\\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-dsh-studio] .-translate-y-1\\/2,[data-dsh-studio-portal] .-translate-y-1\\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-dsh-studio] .translate-x-0\\.5,[data-dsh-studio-portal] .translate-x-0\\.5{--tw-translate-x: .125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-dsh-studio] .translate-x-\\[-50\\%\\],[data-dsh-studio-portal] .translate-x-\\[-50\\%\\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-dsh-studio] .translate-y-\\[-50\\%\\],[data-dsh-studio-portal] .translate-y-\\[-50\\%\\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-dsh-studio] .transform,[data-dsh-studio-portal] .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-dsh-studio] .cursor-default,[data-dsh-studio-portal] .cursor-default{cursor:default}[data-dsh-studio] .cursor-pointer,[data-dsh-studio-portal] .cursor-pointer{cursor:pointer}[data-dsh-studio] .select-none,[data-dsh-studio-portal] .select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}[data-dsh-studio] .resize-y,[data-dsh-studio-portal] .resize-y{resize:vertical}[data-dsh-studio] .resize,[data-dsh-studio-portal] .resize{resize:both}[data-dsh-studio] .auto-rows-min,[data-dsh-studio-portal] .auto-rows-min{grid-auto-rows:min-content}[data-dsh-studio] .grid-rows-\\[auto_auto\\],[data-dsh-studio-portal] .grid-rows-\\[auto_auto\\]{grid-template-rows:auto auto}[data-dsh-studio] .flex-row,[data-dsh-studio-portal] .flex-row{flex-direction:row}[data-dsh-studio] .flex-col,[data-dsh-studio-portal] .flex-col{flex-direction:column}[data-dsh-studio] .items-start,[data-dsh-studio-portal] .items-start{align-items:flex-start}[data-dsh-studio] .items-center,[data-dsh-studio-portal] .items-center{align-items:center}[data-dsh-studio] .items-stretch,[data-dsh-studio-portal] .items-stretch{align-items:stretch}[data-dsh-studio] .justify-end,[data-dsh-studio-portal] .justify-end{justify-content:flex-end}[data-dsh-studio] .justify-center,[data-dsh-studio-portal] .justify-center{justify-content:center}[data-dsh-studio] .justify-between,[data-dsh-studio-portal] .justify-between{justify-content:space-between}[data-dsh-studio] .gap-0\\.5,[data-dsh-studio-portal] .gap-0\\.5{gap:.125rem}[data-dsh-studio] .gap-1,[data-dsh-studio-portal] .gap-1{gap:.25rem}[data-dsh-studio] .gap-1\\.5,[data-dsh-studio-portal] .gap-1\\.5{gap:.375rem}[data-dsh-studio] .gap-2,[data-dsh-studio-portal] .gap-2{gap:.5rem}[data-dsh-studio] .gap-3,[data-dsh-studio-portal] .gap-3{gap:.75rem}[data-dsh-studio] .gap-4,[data-dsh-studio-portal] .gap-4{gap:1rem}[data-dsh-studio] .gap-6,[data-dsh-studio-portal] .gap-6{gap:1.5rem}[data-dsh-studio] .overflow-hidden,[data-dsh-studio-portal] .overflow-hidden{overflow:hidden}[data-dsh-studio] .overflow-y-auto,[data-dsh-studio-portal] .overflow-y-auto{overflow-y:auto}[data-dsh-studio] .truncate,[data-dsh-studio-portal] .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-dsh-studio] .whitespace-nowrap,[data-dsh-studio-portal] .whitespace-nowrap{white-space:nowrap}[data-dsh-studio] .whitespace-pre-wrap,[data-dsh-studio-portal] .whitespace-pre-wrap{white-space:pre-wrap}[data-dsh-studio] .break-words,[data-dsh-studio-portal] .break-words{overflow-wrap:break-word}[data-dsh-studio] .rounded-\\[4px\\],[data-dsh-studio-portal] .rounded-\\[4px\\]{border-radius:4px}[data-dsh-studio] .rounded-full,[data-dsh-studio-portal] .rounded-full{border-radius:9999px}[data-dsh-studio] .rounded-lg,[data-dsh-studio-portal] .rounded-lg{border-radius:var(--radius)}[data-dsh-studio] .rounded-md,[data-dsh-studio-portal] .rounded-md{border-radius:calc(var(--radius) - 2px)}[data-dsh-studio] .rounded-sm,[data-dsh-studio-portal] .rounded-sm{border-radius:calc(var(--radius) - 4px)}[data-dsh-studio] .rounded-xl,[data-dsh-studio-portal] .rounded-xl{border-radius:.75rem}[data-dsh-studio] .border,[data-dsh-studio-portal] .border{border-width:1px}[data-dsh-studio] .border-2,[data-dsh-studio-portal] .border-2{border-width:2px}[data-dsh-studio] .border-b,[data-dsh-studio-portal] .border-b{border-bottom-width:1px}[data-dsh-studio] .border-l,[data-dsh-studio-portal] .border-l{border-left-width:1px}[data-dsh-studio] .border-t,[data-dsh-studio-portal] .border-t{border-top-width:1px}[data-dsh-studio] .border-border,[data-dsh-studio-portal] .border-border{border-color:var(--border)}[data-dsh-studio] .border-input,[data-dsh-studio-portal] .border-input{border-color:var(--input)}[data-dsh-studio] .border-transparent,[data-dsh-studio-portal] .border-transparent{border-color:transparent}[data-dsh-studio] .bg-amber-500,[data-dsh-studio-portal] .bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}[data-dsh-studio] .bg-background,[data-dsh-studio-portal] .bg-background{background-color:var(--background)}[data-dsh-studio] .bg-black\\/45,[data-dsh-studio-portal] .bg-black\\/45{background-color:#00000073}[data-dsh-studio] .bg-black\\/50,[data-dsh-studio-portal] .bg-black\\/50{background-color:#00000080}[data-dsh-studio] .bg-black\\/55,[data-dsh-studio-portal] .bg-black\\/55{background-color:#0000008c}[data-dsh-studio] .bg-card,[data-dsh-studio-portal] .bg-card{background-color:var(--card)}[data-dsh-studio] .bg-destructive,[data-dsh-studio-portal] .bg-destructive{background-color:var(--destructive)}[data-dsh-studio] .bg-input,[data-dsh-studio-portal] .bg-input{background-color:var(--input)}[data-dsh-studio] .bg-muted,[data-dsh-studio-portal] .bg-muted{background-color:var(--muted)}[data-dsh-studio] .bg-popover,[data-dsh-studio-portal] .bg-popover{background-color:var(--popover)}[data-dsh-studio] .bg-primary,[data-dsh-studio-portal] .bg-primary{background-color:var(--primary)}[data-dsh-studio] .bg-secondary,[data-dsh-studio-portal] .bg-secondary{background-color:var(--secondary)}[data-dsh-studio] .bg-transparent,[data-dsh-studio-portal] .bg-transparent{background-color:transparent}[data-dsh-studio] .fill-primary,[data-dsh-studio-portal] .fill-primary{fill:var(--primary)}[data-dsh-studio] .p-0\\.5,[data-dsh-studio-portal] .p-0\\.5{padding:.125rem}[data-dsh-studio] .p-1,[data-dsh-studio-portal] .p-1{padding:.25rem}[data-dsh-studio] .p-4,[data-dsh-studio-portal] .p-4{padding:1rem}[data-dsh-studio] .p-6,[data-dsh-studio-portal] .p-6{padding:1.5rem}[data-dsh-studio] .p-\\[3px\\],[data-dsh-studio-portal] .p-\\[3px\\]{padding:3px}[data-dsh-studio] .px-1,[data-dsh-studio-portal] .px-1{padding-left:.25rem;padding-right:.25rem}[data-dsh-studio] .px-1\\.5,[data-dsh-studio-portal] .px-1\\.5{padding-left:.375rem;padding-right:.375rem}[data-dsh-studio] .px-2,[data-dsh-studio-portal] .px-2{padding-left:.5rem;padding-right:.5rem}[data-dsh-studio] .px-2\\.5,[data-dsh-studio-portal] .px-2\\.5{padding-left:.625rem;padding-right:.625rem}[data-dsh-studio] .px-3,[data-dsh-studio-portal] .px-3{padding-left:.75rem;padding-right:.75rem}[data-dsh-studio] .px-4,[data-dsh-studio-portal] .px-4{padding-left:1rem;padding-right:1rem}[data-dsh-studio] .px-5,[data-dsh-studio-portal] .px-5{padding-left:1.25rem;padding-right:1.25rem}[data-dsh-studio] .px-6,[data-dsh-studio-portal] .px-6{padding-left:1.5rem;padding-right:1.5rem}[data-dsh-studio] .py-0,[data-dsh-studio-portal] .py-0{padding-top:0;padding-bottom:0}[data-dsh-studio] .py-0\\.5,[data-dsh-studio-portal] .py-0\\.5{padding-top:.125rem;padding-bottom:.125rem}[data-dsh-studio] .py-1,[data-dsh-studio-portal] .py-1{padding-top:.25rem;padding-bottom:.25rem}[data-dsh-studio] .py-1\\.5,[data-dsh-studio-portal] .py-1\\.5{padding-top:.375rem;padding-bottom:.375rem}[data-dsh-studio] .py-10,[data-dsh-studio-portal] .py-10{padding-top:2.5rem;padding-bottom:2.5rem}[data-dsh-studio] .py-2,[data-dsh-studio-portal] .py-2{padding-top:.5rem;padding-bottom:.5rem}[data-dsh-studio] .py-3,[data-dsh-studio-portal] .py-3{padding-top:.75rem;padding-bottom:.75rem}[data-dsh-studio] .py-3\\.5,[data-dsh-studio-portal] .py-3\\.5{padding-top:.875rem;padding-bottom:.875rem}[data-dsh-studio] .py-4,[data-dsh-studio-portal] .py-4{padding-top:1rem;padding-bottom:1rem}[data-dsh-studio] .py-6,[data-dsh-studio-portal] .py-6{padding-top:1.5rem;padding-bottom:1.5rem}[data-dsh-studio] .pb-0,[data-dsh-studio-portal] .pb-0{padding-bottom:0}[data-dsh-studio] .pb-4,[data-dsh-studio-portal] .pb-4{padding-bottom:1rem}[data-dsh-studio] .pl-2,[data-dsh-studio-portal] .pl-2{padding-left:.5rem}[data-dsh-studio] .pr-8,[data-dsh-studio-portal] .pr-8{padding-right:2rem}[data-dsh-studio] .pr-9,[data-dsh-studio-portal] .pr-9{padding-right:2.25rem}[data-dsh-studio] .pt-5,[data-dsh-studio-portal] .pt-5{padding-top:1.25rem}[data-dsh-studio] .text-left,[data-dsh-studio-portal] .text-left{text-align:left}[data-dsh-studio] .text-\\[10\\.5px\\],[data-dsh-studio-portal] .text-\\[10\\.5px\\]{font-size:10.5px}[data-dsh-studio] .text-\\[11\\.5px\\],[data-dsh-studio-portal] .text-\\[11\\.5px\\]{font-size:11.5px}[data-dsh-studio] .text-\\[11px\\],[data-dsh-studio-portal] .text-\\[11px\\]{font-size:11px}[data-dsh-studio] .text-\\[12\\.5px\\],[data-dsh-studio-portal] .text-\\[12\\.5px\\]{font-size:12.5px}[data-dsh-studio] .text-\\[12px\\],[data-dsh-studio-portal] .text-\\[12px\\]{font-size:12px}[data-dsh-studio] .text-\\[13px\\],[data-dsh-studio-portal] .text-\\[13px\\]{font-size:13px}[data-dsh-studio] .text-\\[15px\\],[data-dsh-studio-portal] .text-\\[15px\\]{font-size:15px}[data-dsh-studio] .text-base,[data-dsh-studio-portal] .text-base{font-size:1rem;line-height:1.5rem}[data-dsh-studio] .text-sm,[data-dsh-studio-portal] .text-sm{font-size:.875rem;line-height:1.25rem}[data-dsh-studio] .text-xs,[data-dsh-studio-portal] .text-xs{font-size:.75rem;line-height:1rem}[data-dsh-studio] .font-medium,[data-dsh-studio-portal] .font-medium{font-weight:500}[data-dsh-studio] .font-semibold,[data-dsh-studio-portal] .font-semibold{font-weight:600}[data-dsh-studio] .tabular-nums,[data-dsh-studio-portal] .tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}[data-dsh-studio] .leading-\\[1\\.45\\],[data-dsh-studio-portal] .leading-\\[1\\.45\\]{line-height:1.45}[data-dsh-studio] .leading-none,[data-dsh-studio-portal] .leading-none{line-height:1}[data-dsh-studio] .leading-relaxed,[data-dsh-studio-portal] .leading-relaxed{line-height:1.625}[data-dsh-studio] .leading-snug,[data-dsh-studio-portal] .leading-snug{line-height:1.375}[data-dsh-studio] .leading-tight,[data-dsh-studio-portal] .leading-tight{line-height:1.25}[data-dsh-studio] .tracking-tight,[data-dsh-studio-portal] .tracking-tight{letter-spacing:-.025em}[data-dsh-studio] .text-card-foreground,[data-dsh-studio-portal] .text-card-foreground{color:var(--card-foreground)}[data-dsh-studio] .text-current,[data-dsh-studio-portal] .text-current{color:currentColor}[data-dsh-studio] .text-destructive,[data-dsh-studio-portal] .text-destructive{color:var(--destructive)}[data-dsh-studio] .text-destructive-foreground,[data-dsh-studio-portal] .text-destructive-foreground{color:var(--destructive-foreground)}[data-dsh-studio] .text-foreground,[data-dsh-studio-portal] .text-foreground{color:var(--foreground)}[data-dsh-studio] .text-muted-foreground,[data-dsh-studio-portal] .text-muted-foreground{color:var(--muted-foreground)}[data-dsh-studio] .text-popover-foreground,[data-dsh-studio-portal] .text-popover-foreground{color:var(--popover-foreground)}[data-dsh-studio] .text-primary,[data-dsh-studio-portal] .text-primary{color:var(--primary)}[data-dsh-studio] .text-primary-foreground,[data-dsh-studio-portal] .text-primary-foreground{color:var(--primary-foreground)}[data-dsh-studio] .text-secondary-foreground,[data-dsh-studio-portal] .text-secondary-foreground{color:var(--secondary-foreground)}[data-dsh-studio] .underline-offset-4,[data-dsh-studio-portal] .underline-offset-4{text-underline-offset:4px}[data-dsh-studio] .opacity-60,[data-dsh-studio-portal] .opacity-60{opacity:.6}[data-dsh-studio] .opacity-70,[data-dsh-studio-portal] .opacity-70{opacity:.7}[data-dsh-studio] .shadow,[data-dsh-studio-portal] .shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}[data-dsh-studio] .shadow-\\[0_0_60px_rgba\\(0\\,0\\,0\\,\\.35\\)\\],[data-dsh-studio-portal] .shadow-\\[0_0_60px_rgba\\(0\\,0\\,0\\,\\.35\\)\\]{--tw-shadow: 0 0 60px rgba(0,0,0,.35);--tw-shadow-colored: 0 0 60px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}[data-dsh-studio] .shadow-lg,[data-dsh-studio-portal] .shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}[data-dsh-studio] .shadow-md,[data-dsh-studio-portal] .shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}[data-dsh-studio] .shadow-sm,[data-dsh-studio-portal] .shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}[data-dsh-studio] .shadow-xl,[data-dsh-studio-portal] .shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}[data-dsh-studio] .outline-none,[data-dsh-studio-portal] .outline-none{outline:2px solid transparent;outline-offset:2px}[data-dsh-studio] .outline,[data-dsh-studio-portal] .outline{outline-style:solid}[data-dsh-studio] .ring-2,[data-dsh-studio-portal] .ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}[data-dsh-studio] .ring-ring,[data-dsh-studio-portal] .ring-ring{--tw-ring-color: var(--ring)}[data-dsh-studio] .ring-offset-2,[data-dsh-studio-portal] .ring-offset-2{--tw-ring-offset-width: 2px}[data-dsh-studio] .filter,[data-dsh-studio-portal] .filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}[data-dsh-studio] .backdrop-blur-\\[1px\\],[data-dsh-studio-portal] .backdrop-blur-\\[1px\\]{--tw-backdrop-blur: blur(1px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}[data-dsh-studio] .backdrop-blur-\\[2px\\],[data-dsh-studio-portal] .backdrop-blur-\\[2px\\]{--tw-backdrop-blur: blur(2px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}[data-dsh-studio] .backdrop-blur-sm,[data-dsh-studio-portal] .backdrop-blur-sm{--tw-backdrop-blur: blur(4px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}[data-dsh-studio] .transition,[data-dsh-studio-portal] .transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}[data-dsh-studio] .transition-\\[color\\,box-shadow\\],[data-dsh-studio-portal] .transition-\\[color\\,box-shadow\\]{transition-property:color,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}[data-dsh-studio] .transition-all,[data-dsh-studio-portal] .transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}[data-dsh-studio] .transition-colors,[data-dsh-studio-portal] .transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}[data-dsh-studio] .transition-opacity,[data-dsh-studio-portal] .transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}[data-dsh-studio] .transition-transform,[data-dsh-studio-portal] .transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}[data-dsh-studio] .ease-in-out,[data-dsh-studio-portal] .ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}:where([data-dsh-studio]){--background: #fafafa;--foreground: #18181b;--card: #ffffff;--card-foreground: #18181b;--popover: #ffffff;--popover-foreground: #18181b;--primary: #18181b;--primary-foreground: #fafafa;--secondary: #f4f4f5;--secondary-foreground: #18181b;--muted: #f4f4f5;--muted-foreground: #71717a;--accent: #f4f4f5;--accent-foreground: #18181b;--destructive: #dc2828;--destructive-foreground: #fafafa;--border: #e4e4e7;--input: #e4e4e7;--ring: #a1a1aa;--radius: .625rem}:where([data-dsh-studio][data-theme=dark]){--background: #0a0a0b;--foreground: #fafafa;--card: #111113;--card-foreground: #fafafa;--popover: #111113;--popover-foreground: #fafafa;--primary: #fafafa;--primary-foreground: #18181b;--secondary: #27272a;--secondary-foreground: #fafafa;--muted: #202022;--muted-foreground: #a1a1aa;--accent: #27272a;--accent-foreground: #fafafa;--destructive: #a62626;--destructive-foreground: #fafafa;--border: #2a2a2d;--input: #2a2a2d;--ring: #6d6d78}:where([data-dsh-studio-portal]){--background: #fafafa;--foreground: #18181b;--card: #ffffff;--card-foreground: #18181b;--popover: #ffffff;--popover-foreground: #18181b;--primary: #18181b;--primary-foreground: #fafafa;--secondary: #f4f4f5;--secondary-foreground: #18181b;--muted: #f4f4f5;--muted-foreground: #71717a;--accent: #f4f4f5;--accent-foreground: #18181b;--destructive: #dc2828;--destructive-foreground: #fafafa;--border: #e4e4e7;--input: #e4e4e7;--ring: #a1a1aa;--radius: .625rem}:where([data-dsh-studio-portal][data-theme=dark]){--background: #0a0a0b;--foreground: #fafafa;--card: #111113;--card-foreground: #fafafa;--popover: #111113;--popover-foreground: #fafafa;--primary: #fafafa;--primary-foreground: #18181b;--secondary: #27272a;--secondary-foreground: #fafafa;--muted: #202022;--muted-foreground: #a1a1aa;--accent: #27272a;--accent-foreground: #fafafa;--destructive: #a62626;--destructive-foreground: #fafafa;--border: #2a2a2d;--input: #2a2a2d;--ring: #6d6d78}:where([data-dsh-studio],[data-dsh-studio] *,[data-dsh-studio-portal],[data-dsh-studio-portal] *){box-sizing:border-box}:where([data-dsh-studio],[data-dsh-studio-portal]) :where(button:not([class*=rounded-]),input:not([class*=rounded-]),textarea:not([class*=rounded-]),select:not([class*=rounded-])):not(.border):not(.border-0){font:inherit;letter-spacing:inherit;color:inherit;background:transparent;border:0;border-radius:0;margin:0;padding:0;box-shadow:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}[data-dsh-studio].dsh-studio-fill{flex:1 1 auto;width:100%;min-height:100%;display:flex;flex-direction:column;background:var(--background);color:var(--foreground)}:where([data-dsh-studio]) .shadcn-scope{color:var(--foreground);font-family:inherit}[data-dsh-studio] .ds-panel,[data-dsh-studio] .ds-card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);box-shadow:0 1px 2px color-mix(in srgb,var(--foreground) 4%,transparent);overflow:hidden}[data-dsh-studio] .ds-panel-head,[data-dsh-studio] .ds-card-head{padding:10px 14px!important;border-bottom:1px solid color-mix(in srgb,var(--border) 70%,transparent);font-size:12.5px;font-weight:600;letter-spacing:.01em}[data-dsh-studio] .ds-panel-body,[data-dsh-studio] .ds-card-body{padding:12px 14px!important}[data-dsh-studio] .ds-panel-body>:first-child,[data-dsh-studio] .ds-card-body>:first-child{margin-top:0}[data-dsh-studio] .ds-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:36px;padding:0 14px;border-radius:calc(var(--radius) - 2px);border:1px solid var(--input);background:var(--card);color:var(--foreground);font-size:14px;font-weight:500;line-height:1;white-space:nowrap;cursor:pointer;box-shadow:0 1px 1px color-mix(in srgb,var(--foreground) 3%,transparent);transition:background-color .12s ease,border-color .12s ease,color .12s ease}[data-dsh-studio] .ds-btn:hover{background:var(--muted)}[data-dsh-studio] .ds-btn-primary{background:var(--primary);border-color:var(--primary);color:var(--primary-foreground)}[data-dsh-studio] .ds-btn-primary:hover{background:color-mix(in srgb,var(--primary) 90%,transparent);border-color:color-mix(in srgb,var(--primary) 90%,transparent)}[data-dsh-studio] .ds-btn-ghost{border-color:transparent;background:transparent;box-shadow:none}[data-dsh-studio] .ds-btn-ghost:hover{background:var(--muted)}[data-dsh-studio] .ds-btn[disabled]{opacity:.5;cursor:not-allowed}[data-dsh-studio] .ds-chip{display:inline-flex;align-items:center;gap:4px;height:20px;padding:0 8px;border-radius:999px;border:1px solid var(--border);background:var(--muted);color:var(--muted-foreground);font-size:11.5px;line-height:1;white-space:nowrap}[data-dsh-studio] .ds-chip[data-on="1"]{border-color:color-mix(in srgb,var(--primary) 28%,transparent);background:color-mix(in srgb,var(--primary) 10%,transparent);color:var(--foreground)}[data-dsh-studio] .ds-chip[data-blocked="1"]{border-color:color-mix(in srgb,var(--destructive) 35%,transparent);background:color-mix(in srgb,var(--destructive) 10%,transparent);color:var(--destructive)}[data-dsh-studio] .ds-table{width:100%;border-collapse:separate;border-spacing:0;font-size:12.5px}[data-dsh-studio] .ds-table th{padding:8px 10px;text-align:left;font-weight:500;font-size:11.5px;color:var(--muted-foreground);border-bottom:1px solid var(--border);background:color-mix(in srgb,var(--muted) 50%,transparent)}[data-dsh-studio] .ds-table td{padding:8px 10px;border-bottom:1px solid color-mix(in srgb,var(--border) 70%,transparent);vertical-align:top}[data-dsh-studio] .ds-table tbody tr:hover td{background:color-mix(in srgb,var(--muted) 45%,transparent)}[data-dsh-studio] .ds-dw-tabs{display:inline-flex;gap:2px;padding:3px;border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);background:var(--muted)}[data-dsh-studio] .ds-dw-tab{height:26px;padding:0 10px;border:0;border-radius:calc(var(--radius) - 4px);background:transparent;color:var(--muted-foreground);font-size:12px;cursor:pointer}[data-dsh-studio] .ds-dw-tab[data-on="1"]{background:var(--card);color:var(--foreground);font-weight:600;box-shadow:0 1px 2px color-mix(in srgb,var(--foreground) 6%,transparent)}[data-dsh-studio] .ds-hint,[data-dsh-studio] .ds-muted{color:var(--muted-foreground);font-size:11.5px}[data-dsh-studio] .ds-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:7px;border:1px solid transparent;background:transparent;color:var(--muted-foreground);cursor:pointer}[data-dsh-studio] .ds-icon-btn:hover{background:var(--muted);color:var(--foreground)}[data-dsh-studio] .ds-card{position:relative;display:flex;flex-direction:column;gap:6px;padding:10px 11px 9px;border:1px solid var(--border);border-radius:calc(var(--radius) - 1px);background:var(--card);box-shadow:0 1px 2px color-mix(in srgb,var(--foreground) 5%,transparent);cursor:pointer;transition:box-shadow .14s ease,border-color .14s ease,transform .14s ease}[data-dsh-studio] .ds-card:hover{border-color:var(--input);box-shadow:0 4px 10px -4px color-mix(in srgb,var(--foreground) 18%,transparent),0 1px 2px color-mix(in srgb,var(--foreground) 6%,transparent)}[data-dsh-studio] .ds-card[data-urgent="1"]{border-left:3px solid var(--destructive);padding-left:9px}[data-dsh-studio] .ds-card[data-blocked="1"]{border-color:color-mix(in srgb,var(--destructive) 45%,transparent);background:linear-gradient(0deg,color-mix(in srgb,var(--destructive) 4%,transparent),color-mix(in srgb,var(--destructive) 4%,transparent)),var(--card)}[data-dsh-studio] .ds-card[data-running="1"]:after{content:"";position:absolute;top:9px;right:9px;width:6px;height:6px;border-radius:999px;background:var(--primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--primary) 16%,transparent)}[data-dsh-studio] .ds-card-title{font-size:12.8px;font-weight:600;line-height:1.45;letter-spacing:.005em;color:var(--foreground);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}[data-dsh-studio] .ds-meta{display:flex;flex-wrap:wrap;align-items:center;gap:5px;font-size:11px;line-height:1;color:var(--muted-foreground)}[data-dsh-studio] .ds-meta .ds-chip{height:18px;padding:0 6px;font-size:10.5px;border-radius:6px}[data-dsh-studio] .ds-dot{width:7px;height:7px;border-radius:999px;flex:none}[data-dsh-studio] .ds-col{border:1px solid color-mix(in srgb,var(--border) 80%,transparent);border-radius:var(--radius);background:color-mix(in srgb,var(--muted) 55%,transparent);padding:8px;gap:8px}[data-dsh-studio] .ds-col-head{display:flex;align-items:center;gap:6px;padding:2px 2px 6px;font-size:12px;font-weight:600;color:var(--foreground)}[data-dsh-studio] .ds-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:999px;border:1px solid var(--border);background:var(--card);color:var(--muted-foreground);font-size:10.5px;font-weight:500}[data-dsh-studio] .ds-board-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:12px 20px 10px;border-bottom:1px solid var(--border)}[data-dsh-studio] .ds-board-bar>*{flex:0 0 auto}[data-dsh-studio] .ds-board-bar .ds-input{height:32px}[data-dsh-studio] .ds-search{flex:0 0 auto}[data-dsh-studio] .ds-col-head{color:var(--foreground);font-size:12px;font-weight:600;letter-spacing:.01em}[data-dsh-studio] .ds-col-head .ds-count{color:var(--muted-foreground);font-weight:500}[data-dsh-studio] .ds-listrow .ds-btn{height:32px;padding:0 10px;font-size:11.5px;border-radius:calc(var(--radius) - 4px)}[data-dsh-studio] .ds-listrow .ds-btn-ghost{color:var(--muted-foreground);border:1px solid transparent}[data-dsh-studio] .ds-listrow .ds-btn-ghost:hover{color:var(--foreground);background:var(--muted);border-color:var(--border)}[data-dsh-studio] .ds-listrow .ds-btn-ghost[data-danger="1"],[data-dsh-studio] .ds-dw-foot .ds-btn-ghost[data-danger="1"]{color:var(--destructive)}[data-dsh-studio] .ds-listrow .ds-btn-ghost[data-danger="1"]:hover{color:var(--destructive);background:color-mix(in srgb,var(--destructive) 10%,transparent);border-color:color-mix(in srgb,var(--destructive) 30%,transparent)}[data-dsh-studio] .ds-listrow{padding:11px 14px}[data-dsh-studio] .ds-audit-row{padding:7px 14px;font-size:11.5px}@media (max-width: 900px){[data-dsh-studio] .ds-spark-day{font-size:9px;letter-spacing:-.02em}}@media (max-width: 760px){[data-dsh-studio] .ds-spark-day:nth-child(2n){visibility:hidden}}[data-dsh-studio] .ds-burn{display:block;padding-top:4px}[data-dsh-studio] .ds-burn-svg{display:block;width:100%;height:84px}[data-dsh-studio] .ds-burn-area{fill:color-mix(in srgb,var(--ds-accent) 14%,transparent)}[data-dsh-studio] .ds-burn-line{fill:none;stroke:var(--ds-accent);stroke-width:1.6}[data-dsh-studio] .ds-burn-dot{fill:var(--ds-accent)}[data-dsh-studio] .ds-burn-axis{display:flex;justify-content:space-between;margin-top:4px;font-size:10.5px;color:var(--muted-foreground)}[data-dsh-studio] .ds-card[data-running="1"]:after{background:#259d65;box-shadow:0 0 0 3px #259d652e}[data-dsh-studio][data-theme=dark] .ds-card[data-running="1"]:after{background:#4bd293;box-shadow:0 0 0 3px #4bd29338}[data-dsh-studio] .ds-card[data-blocked="1"]:after{content:"";position:absolute;top:9px;right:9px;width:6px;height:6px;border-radius:999px;background:var(--destructive);box-shadow:0 0 0 3px color-mix(in srgb,var(--destructive) 16%,transparent)}[data-dsh-studio] .ds-card[data-running="1"][data-blocked="1"]:after{background:var(--destructive);box-shadow:0 0 0 3px color-mix(in srgb,var(--destructive) 16%,transparent)}[data-dsh-studio] .ds-composer{display:flex;flex-direction:column;gap:6px;padding:8px 10px;border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);background:var(--card);box-shadow:var(--ds-shadow);transition:border-color .15s,box-shadow .15s}[data-dsh-studio] .ds-composer:focus-within{border-color:color-mix(in srgb,currentColor 26%,transparent);box-shadow:0 0 0 3px color-mix(in srgb,currentColor 9%,transparent)}[data-dsh-studio] .ds-composer .ds-textarea{border:0!important;box-shadow:none!important;background:transparent!important;padding:2px 0;resize:vertical}[data-dsh-studio] .ds-composer-bar{display:flex;align-items:center;gap:8px;border-top:1px solid color-mix(in srgb,currentColor 10%,transparent);padding-top:6px}[data-dsh-studio] .ds-composer-bar .ds-hint{margin-right:auto}[data-dsh-studio] .ds-composer-count{font-size:11px;color:var(--muted-foreground);font-variant-numeric:tabular-nums;white-space:nowrap}[data-dsh-studio] .ds-toasts{position:fixed;right:16px;bottom:16px;z-index:120;display:flex;flex-direction:column;gap:8px;align-items:flex-end;pointer-events:none}[data-dsh-studio] .ds-toast{pointer-events:auto;display:flex;align-items:flex-start;gap:8px;max-width:340px;padding:9px 11px;border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);background:var(--card);box-shadow:0 8px 24px -12px #00000059,0 1px 2px #00000014;font-size:12px;animation:ds-toast-in .18s ease-out}[data-dsh-studio] .ds-toast[data-tone=error]{border-color:color-mix(in srgb,#dc2626 40%,var(--border))}[data-dsh-studio] .ds-toast-icon{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;margin-top:1px;border-radius:50%;background:#16a34a;color:#fff;font-size:10px;font-weight:700;flex:0 0 auto}[data-dsh-studio] .ds-toast[data-tone=error] .ds-toast-icon{background:#dc2626}[data-dsh-studio] .ds-toast[data-tone=info] .ds-toast-icon{background:var(--ds-accent)}[data-dsh-studio] .ds-toast-text{flex:1 1 auto;line-height:1.5;word-break:break-word}[data-dsh-studio] .ds-toast-close{border:0;background:transparent;color:color-mix(in srgb,currentColor 55%,transparent);cursor:pointer;font-size:14px;line-height:1;padding:0 2px}[data-dsh-studio] .ds-toast-close:hover{color:currentColor}@keyframes ds-toast-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}[data-dsh-studio] .ds-ok,[data-dsh-studio] .ds-err{display:inline-flex;align-items:center;gap:5px;padding:3px 8px;border-radius:999px;font-size:11.5px;line-height:1.35;border:1px solid transparent}[data-dsh-studio] .ds-ok{color:#15803d;background:color-mix(in srgb,#16a34a 10%,transparent);border-color:color-mix(in srgb,#16a34a 26%,transparent)}[data-dsh-studio] .ds-ok:before{content:"✓";font-weight:700}[data-dsh-studio] .ds-err{color:#b91c1c;background:color-mix(in srgb,#dc2626 10%,transparent);border-color:color-mix(in srgb,#dc2626 26%,transparent)}[data-dsh-studio] .ds-err:before{content:"!";font-weight:700}[data-dsh-studio][data-theme=dark] .ds-ok{color:#6ee7a8;background:color-mix(in srgb,#16a34a 22%,transparent);border-color:color-mix(in srgb,#4ade80 34%,transparent)}[data-dsh-studio][data-theme=dark] .ds-err{color:#fca5a5;background:color-mix(in srgb,#dc2626 24%,transparent);border-color:color-mix(in srgb,#f87171 34%,transparent)}[data-dsh-studio] .ds-action-bar{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-top:12px;padding-top:10px;border-top:1px solid color-mix(in srgb,currentColor 10%,transparent)}[data-dsh-studio] .ds-action-bar-left,[data-dsh-studio] .ds-action-bar-right{display:flex;align-items:center;gap:8px;flex-wrap:wrap}[data-dsh-studio] .ds-action-bar-right{margin-left:auto}[data-dsh-studio] .ds-btn[data-force="1"]{color:#b45309;border-color:color-mix(in srgb,#f59e0b 40%,transparent)}[data-dsh-studio] .ds-btn[data-force="1"]:hover:not([disabled]){background:color-mix(in srgb,#f59e0b 12%,transparent)}[data-dsh-studio][data-theme=dark] .ds-btn[data-force="1"]{color:#fbbf24;border-color:color-mix(in srgb,#f59e0b 45%,transparent)}[data-dsh-studio] .ds-req-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}[data-dsh-studio] .ds-req-actions .ds-select{width:auto;min-width:96px}[data-dsh-studio] .ds-btn-ghost[data-danger="1"]{color:#b91c1c;border-color:color-mix(in srgb,#dc2626 26%,transparent)}[data-dsh-studio] .ds-btn-ghost[data-danger="1"]:hover:not([disabled]){background:color-mix(in srgb,#dc2626 10%,transparent)}[data-dsh-studio][data-theme=dark] .ds-btn-ghost[data-danger="1"]{color:#fca5a5;border-color:color-mix(in srgb,#f87171 30%,transparent)}[data-dsh-studio] .ds-listrow-actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px}[data-dsh-studio] .ds-btn.ds-btn-primary{background:var(--primary);border-color:var(--primary);color:var(--primary-foreground)}[data-dsh-studio] .ds-btn.ds-btn-primary:hover:not([disabled]){background:color-mix(in srgb,var(--primary) 90%,transparent);border-color:color-mix(in srgb,var(--primary) 90%,transparent)}[data-dsh-studio] .ds-btn.ds-btn-primary[disabled]{opacity:.45;cursor:not-allowed}[data-dsh-studio] .ds-btn.ds-btn-ghost{background:transparent;border-color:transparent;box-shadow:none;color:var(--muted-foreground)}[data-dsh-studio] .ds-btn.ds-btn-ghost:hover:not([disabled]){background:var(--muted);border-color:var(--border);color:var(--foreground)}[data-dsh-studio] .ds-btn[data-danger="1"]{color:#b91c1c}[data-dsh-studio] .ds-btn.ds-btn-ghost[data-danger="1"]:hover:not([disabled]){background:color-mix(in srgb,#dc2626 10%,transparent);border-color:color-mix(in srgb,#dc2626 26%,transparent);color:#b91c1c}[data-dsh-studio][data-theme=dark] .ds-btn[data-danger="1"]{color:#fca5a5}[data-dsh-studio] .ds-btn[data-warn="1"]{color:#b45309;border-color:color-mix(in srgb,#d97706 30%,transparent)}[data-dsh-studio] .ds-btn[data-warn="1"]:hover:not([disabled]){background:color-mix(in srgb,#d97706 10%,transparent)}[data-dsh-studio][data-theme=dark] .ds-btn[data-warn="1"]{color:#fbbf24;border-color:color-mix(in srgb,#f59e0b 32%,transparent)}[data-dsh-studio] .ds-btn.ds-btn-primary{background:#18181b;border-color:#18181b;color:#fafafa}[data-dsh-studio] .ds-btn.ds-btn-primary:hover:not([disabled]){background:#27272a;border-color:#27272a}[data-dsh-studio][data-theme=dark] .ds-btn.ds-btn-primary{background:#fafafa;border-color:#fafafa;color:#09090b}[data-dsh-studio] .ds-btn.ds-btn-primary[disabled]{opacity:.45}[data-dsh-studio] .ds-btn.ds-btn-ghost{background:transparent;border-color:transparent;color:#71717a;box-shadow:none}[data-dsh-studio] .ds-btn.ds-btn-ghost:hover:not([disabled]){background:#f4f4f5;border-color:#e4e4e7;color:#18181b}[data-dsh-studio][data-theme=dark] .ds-btn.ds-btn-ghost{color:#a1a1aa}[data-dsh-studio][data-theme=dark] .ds-btn.ds-btn-ghost:hover:not([disabled]){background:#27272a;border-color:#3f3f46;color:#fafafa}[data-dsh-studio][data-theme=dark]{--ds-bg: #0e1014;--ds-surface: #181b22;--ds-surface-2: #1e222a;--ds-line: #2c323d;--ds-line-soft: color-mix(in srgb, #2c323d 60%, transparent);--ds-line-soft2: color-mix(in srgb, #2c323d 40%, transparent);color:#e6e8ee;background:#0e1014}[data-dsh-studio][data-theme=dark] .ds-drawer,[data-dsh-studio][data-theme=dark] .ds-side,[data-dsh-studio][data-theme=dark] .ds-modal,[data-dsh-studio][data-theme=dark] .ds-panel,[data-dsh-studio][data-theme=dark] .ds-card,[data-dsh-studio][data-theme=dark] .ds-dw-col,[data-dsh-studio][data-theme=dark] .ds-code-box{background:var(--ds-surface);border-color:var(--ds-line);color:#e6e8ee}[data-dsh-studio] .ds-empty{opacity:1;color:var(--muted-foreground);border:1px dashed var(--border);background:color-mix(in srgb,var(--muted) 38%,transparent);border-radius:calc(var(--radius) - 2px);padding:18px 12px;font-size:12px;line-height:1.65;text-align:center}[data-dsh-studio] .ds-empty .ds-empty-title{display:block;margin-bottom:3px;color:var(--foreground);font-weight:600;font-size:12.5px}[data-dsh-studio] .ds-market-grid,[data-dsh-studio] .ds-proj-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px}[data-dsh-studio] .ds-market-card,[data-dsh-studio] .ds-proj-card{background:var(--ds-surface);border:1px solid var(--border);border-radius:calc(var(--radius) - 1px);box-shadow:var(--ds-shadow);padding:12px 13px;transition:box-shadow .16s ease,border-color .16s ease,transform .16s ease}[data-dsh-studio] .ds-market-card:hover,[data-dsh-studio] .ds-proj-card:hover{border-color:color-mix(in srgb,var(--border) 55%,var(--foreground));box-shadow:0 6px 16px -10px #0f172a73}[data-dsh-studio] .ds-mc-head,[data-dsh-studio] .ds-proj-head{display:flex;align-items:center;gap:8px;margin-bottom:8px}[data-dsh-studio] .ds-mc-name,[data-dsh-studio] .ds-proj-name{font-size:13px;font-weight:600;letter-spacing:-.005em}[data-dsh-studio] .ds-proj-stats{display:flex;flex-wrap:wrap;gap:6px 12px;margin:8px 0 6px;font-size:11.5px;color:var(--muted-foreground)}[data-dsh-studio] .ds-proj-bar{height:6px;border-radius:999px;background:var(--muted);overflow:hidden;margin-bottom:6px}[data-dsh-studio] .ds-market-grid+.ds-hint,[data-dsh-studio] .ds-proj-grid+.ds-hint{margin-top:10px}[data-dsh-studio] .ds-body:has(>.ds-proj-grid),[data-dsh-studio] .ds-body:has(>.ds-market-grid){display:block;width:100%;min-width:0}[data-dsh-studio] .ds-proj-grid,[data-dsh-studio] .ds-market-grid{width:100%;grid-auto-flow:row}[data-dsh-studio] .ds-body:has(.ds-proj-grid)>div,[data-dsh-studio] .ds-body:has(.ds-market-grid)>div{display:block;width:100%;min-width:0}[data-dsh-studio] .ds-proj-grid{grid-template-columns:repeat(auto-fill,minmax(260px,1fr));min-width:100%}[data-dsh-studio] .ds-proj-grid{grid-template-columns:repeat(auto-fill,minmax(420px,1fr))}@media (max-width: 900px){[data-dsh-studio] .ds-proj-grid{grid-template-columns:1fr}}[data-dsh-studio] .ds-an-track{position:relative}[data-dsh-studio] .ds-an-track[data-empty="1"]{background:transparent;border-top:1px dashed var(--border);height:6px}[data-dsh-studio] .ds-an-track[data-empty="1"] .ds-an-fill{display:none}[data-dsh-studio] .ds-an-fill{min-width:2px}[data-dsh-studio] .ds-log{margin-top:8px;border-top:1px dashed var(--border);padding-top:8px;display:grid;gap:4px;max-height:168px;overflow:auto}[data-dsh-studio] .ds-log-line{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:1.5;color:var(--muted-foreground);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-dsh-studio][data-theme=dark] .ds-chip[data-on="1"],[data-dsh-studio][data-theme=dark] .ds-audit-status,[data-dsh-studio][data-theme=dark] .ds-chip-case[data-r=pass],[data-dsh-studio][data-theme=dark] .ds-chip[data-role=dev],[data-dsh-studio][data-theme=dark] .ds-chip[data-kind=design]{color:#6ee7a8}[data-dsh-studio][data-theme=dark] .ds-chip[data-role=product],[data-dsh-studio][data-theme=dark] .ds-chip[data-kind=mr]{color:#9ec1ff}[data-dsh-studio][data-theme=dark] .ds-chip[data-role=architect],[data-dsh-studio][data-theme=dark] .ds-chip[data-req="1"]{color:#c4b5fd}[data-dsh-studio][data-theme=dark] .ds-chip[data-role=qa],[data-dsh-studio][data-theme=dark] .ds-chip[data-kind=cases],[data-dsh-studio][data-theme=dark] .ds-chip[data-sla=due_soon]{color:#fbbf24}[data-dsh-studio][data-theme=dark] .ds-card-warn,[data-dsh-studio][data-theme=dark] .ds-case-fail,[data-dsh-studio][data-theme=dark] .ds-proj-stats b[data-warn="1"],[data-dsh-studio][data-theme=dark] .ds-an-kv b[data-warn="1"],[data-dsh-studio][data-theme=dark] .ds-kpi[data-warn="1"] .ds-kpi-value{color:#ff9a9d}[data-dsh-studio][data-theme=dark] .ds-card[data-blocked="1"]{background:color-mix(in srgb,#e5484d 10%,var(--ds-surface))}[data-dsh-studio][data-theme=dark] .ds-audit-row[data-ok="0"],[data-dsh-studio][data-theme=dark] .ds-art-row[data-result=fail]{background:color-mix(in srgb,#e5484d 12%,transparent)}[data-dsh-studio][data-theme=dark] .ds-meta{color:#a8afba}[data-dsh-studio][data-theme=dark] .ds-hint{color:#9aa1ad}[data-dsh-studio] .ds-board{scroll-snap-type:x proximity;scrollbar-width:thin;scrollbar-color:var(--border) transparent}[data-dsh-studio] .ds-board:focus-visible{outline:2px solid color-mix(in srgb,var(--ring) 55%,transparent);outline-offset:-2px}[data-dsh-studio] .ds-board::-webkit-scrollbar{height:10px}[data-dsh-studio] .ds-board::-webkit-scrollbar-track{background:transparent}[data-dsh-studio] .ds-board::-webkit-scrollbar-thumb{background:var(--border);border-radius:8px;border:2px solid transparent;background-clip:content-box}[data-dsh-studio][data-theme=dark] .ds-board::-webkit-scrollbar-thumb{background:#3a404b;background-clip:content-box}[data-dsh-studio] .ds-col{scroll-snap-align:start;min-width:0}[data-dsh-studio] .ds-col-body{overflow-x:hidden}[data-dsh-studio] .ds-card{min-width:0;max-width:100%}[data-dsh-studio] .ds-card-title{overflow-wrap:anywhere}[data-dsh-studio] .ds-meta{flex-wrap:wrap;row-gap:4px}[data-dsh-studio] .ds-col{background:var(--muted);border-color:var(--border)}[data-dsh-studio] .ds-col-head{background:var(--card);border-bottom:1px solid var(--border);border-radius:calc(var(--radius) + 1px) calc(var(--radius) + 1px) 0 0}[data-dsh-studio] .ds-col-owner{color:var(--muted-foreground)}[data-dsh-studio][data-theme=dark] .ds-col{background:#14171d;border-color:#262a33}[data-dsh-studio][data-theme=dark] .ds-col-head{background:#1a1e25;border-bottom-color:#262a33;color:#e6e8ee}[data-dsh-studio] .ds-row{display:flex;flex-wrap:wrap;gap:8px;align-items:center;min-width:0}[data-dsh-studio] .ds-field{display:flex;flex-direction:column;gap:5px;min-width:0}[data-dsh-studio] .ds-row>.ds-field{flex:1 1 220px}[data-dsh-studio] .ds-field>.ds-label{margin-bottom:1px}[data-dsh-studio] .ds-field>.ds-hint{margin-left:0}[data-dsh-studio] .ds-field>.ds-hint+.ds-hint{margin-top:-2px}[data-dsh-studio] .ds-md-field{display:flex;flex-direction:column;gap:4px;min-width:0}[data-dsh-studio] .ds-md-bar{display:flex;align-items:center;gap:8px;justify-content:space-between}[data-dsh-studio] .ds-md-bar .ds-hint{margin-left:0;opacity:.62}[data-dsh-studio] .ds-md-preview{border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);background:var(--card);padding:10px 12px;min-height:84px}[data-dsh-studio] .ds-art-wrap,[data-dsh-studio] .ds-doc-wrap{display:flex;flex-direction:column;gap:6px;min-width:0}[data-dsh-studio] .ds-reader{margin:0 0 8px;max-height:360px;overflow:auto;font-size:12.5px}[data-dsh-studio] .ds-reader .ds-md{margin:0}[data-dsh-studio] .ds-seg-btn[data-on="1"],[data-dsh-studio] .ds-chip[data-on="1"],[data-dsh-studio] .ds-btn[data-on="1"]{background:#18181b!important;color:#fafafa!important;border-color:#18181b!important;box-shadow:0 1px 2px #0f172a2e!important}[data-dsh-studio][data-theme=dark] .ds-seg-btn[data-on="1"],[data-dsh-studio][data-theme=dark] .ds-chip[data-on="1"],[data-dsh-studio][data-theme=dark] .ds-btn[data-on="1"]{background:#fafafa!important;color:#09090b!important;border-color:#fafafa!important}[data-dsh-studio] .ds-seg-btn[data-on="1"]:hover,[data-dsh-studio] .ds-chip[data-on="1"]:hover{background:#27272a!important;color:#fafafa!important}[data-dsh-studio][data-theme=dark] .ds-seg-btn[data-on="1"]:hover,[data-dsh-studio][data-theme=dark] .ds-chip[data-on="1"]:hover{background:#e4e4e7!important;color:#09090b!important}[data-dsh-studio] .ds-drawer .ds-sec>.ds-row,[data-dsh-studio] .ds-drawer .ds-sec .ds-row{gap:6px;margin-top:8px}[data-dsh-studio] .ds-drawer .ds-sec .ds-btn{height:28px;padding:0 10px;font-size:12px;border-radius:8px}[data-dsh-studio] .ds-drawer .ds-sec>.ds-hint,[data-dsh-studio] .ds-drawer .ds-sec .ds-hint{display:block;margin:4px 0 0;font-size:11px;line-height:1.5;color:var(--muted-foreground)}[data-dsh-studio] .ds-drawer .ds-sec{padding:12px 0;border-bottom:1px dashed var(--border)}[data-dsh-studio] .ds-drawer .ds-sec:last-of-type{border-bottom:0}[data-dsh-studio] .ds-drawer .ds-sec .ds-btn[disabled]{opacity:.45}[data-dsh-studio] .ds-drawer>*:first-child{padding-bottom:12px;border-bottom:1px solid var(--border)}[data-dsh-studio] .ds-drawer [data-state=active],[data-dsh-studio] .ds-drawer [aria-selected=true]{margin-top:0}[data-dsh-studio] .ds-drawer .ds-dw-body,[data-dsh-studio] .ds-drawer .ds-dw-cols{padding-top:6px}[data-dsh-studio] .ds-col{position:relative;min-width:300px;border-radius:calc(var(--radius) - 1px);overflow:hidden}[data-dsh-studio] .ds-col:before{content:"";position:absolute;inset:0 0 auto;height:3px;background:var(--col-accent, var(--border));z-index:3}[data-dsh-studio] .ds-col-head{position:sticky;top:0;z-index:2;padding-top:9px;backdrop-filter:blur(2px)}[data-dsh-studio] .ds-col-body{padding:10px;display:flex;flex-direction:column;gap:10px}[data-dsh-studio] .ds-col-body:empty:after{content:"还没有卡,拖一张过来";display:block;padding:14px 10px;border:1px dashed var(--border);border-radius:8px;font-size:11.5px;color:var(--muted-foreground);text-align:center}[data-dsh-studio] .ds-col[data-col]{--col-accent: var(--border)}[data-dsh-studio] .ds-col[data-col=clarify]{--col-accent: #a1a1aa}[data-dsh-studio] .ds-col[data-col=design]{--col-accent: #8b5cf6}[data-dsh-studio] .ds-col[data-col=dev_ready]{--col-accent: #3b82f6}[data-dsh-studio] .ds-col[data-col=dev]{--col-accent: #06b6d4}[data-dsh-studio] .ds-col[data-col=review]{--col-accent: #eab308}[data-dsh-studio] .ds-col[data-col=test]{--col-accent: #f97316}[data-dsh-studio] .ds-col[data-col=accept]{--col-accent: #10b981}[data-dsh-studio] .ds-col[data-col=done]{--col-accent: #52525b}[data-dsh-studio] .ds-drawer .ds-listrow-actions,[data-dsh-studio] .ds-side .ds-listrow-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}[data-dsh-studio] .ds-drawer .ds-listrow-actions>.ds-select{min-width:190px}[data-dsh-studio] .ds-drawer .ds-sec-head{margin-bottom:8px}[data-dsh-studio] .ds-drawer .ds-sec-head .ds-hint{font-size:11px}[data-dsh-studio] .ds-drawer .ds-sec+.ds-sec{margin-top:2px}[data-dsh-studio] .ds-gate-sign{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:space-between;margin-top:10px;padding-top:10px;border-top:1px dashed var(--border);font-size:11.5px;color:var(--foreground)}[data-dsh-studio] .ds-gate-sign>span{min-width:0;overflow-wrap:anywhere}[data-dsh-studio] .ds-gate .ds-row{margin-top:10px;padding-top:10px;border-top:1px dashed var(--border)}[data-dsh-studio] .ds-gate .ds-row .ds-btn{white-space:nowrap}[data-dsh-studio] .ds-meta .ds-chip[data-role]{max-width:104px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;line-height:18px}[data-dsh-studio] .ds-meta .ds-chip[data-open="1"]{border-style:dashed;color:#8b5cf6}[data-dsh-studio][data-theme=dark] .ds-meta .ds-chip[data-open="1"]{color:#c4b5fd}[data-dsh-studio] .ds-drawer .ds-chip[data-role]{max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-dsh-studio] .ds-meta{display:flex;flex-wrap:wrap;align-items:center;gap:5px;row-gap:4px}[data-dsh-studio] .ds-meta .ds-chip[data-role]{margin-left:auto;order:99;max-width:120px;height:20px;line-height:18px;padding:0 8px;border-radius:999px;border-color:transparent;background:color-mix(in srgb,currentColor 12%,transparent);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-dsh-studio] .ds-meta .ds-chip[data-role]:hover{background:color-mix(in srgb,currentColor 18%,transparent)}[data-dsh-studio] .ds-meta .ds-chip[data-role][data-open="1"]{margin-left:auto;background:transparent;border:1px dashed currentColor;opacity:.85}[data-dsh-studio][data-theme=dark] .ds-meta .ds-chip[data-role]{background:color-mix(in srgb,currentColor 18%,transparent)}[data-dsh-studio] .ds-board{gap:12px;padding:12px 16px 16px;align-items:flex-start}[data-dsh-studio] .ds-col{flex:0 0 288px;width:288px;min-width:288px;max-width:288px}[data-dsh-studio] .ds-col-body{display:flex;flex-direction:column;gap:8px;padding:8px;overflow-x:hidden}[data-dsh-studio] .ds-card{width:100%;min-width:0}[data-dsh-studio] .ds-meta{display:flex;flex-wrap:wrap;align-items:center;gap:4px 5px}[data-dsh-studio] .ds-meta .ds-chip{height:18px;line-height:16px;font-size:10.5px;padding:0 6px}[data-dsh-studio] .ds-card-foot{display:flex;flex-wrap:wrap;align-items:center;gap:2px 6px;font-size:10px;color:var(--muted-foreground);margin-top:2px}[data-dsh-studio] .ds-card-foot>span:last-child{margin-left:auto}[data-dsh-studio] .ds-card-title{font-size:12.5px;line-height:1.45}@media (max-width: 900px){[data-dsh-studio] .ds-col{flex:0 0 86vw;width:86vw;min-width:86vw;max-width:86vw}}[data-dsh-studio] .ds-col{border-radius:calc(var(--radius) - 2px);overflow:hidden}[data-dsh-studio] .ds-col-head{display:flex;flex-direction:column;gap:4px;padding:9px 10px 8px;background:var(--card);border-bottom:1px solid var(--border);position:sticky;top:0;z-index:2}[data-dsh-studio] .ds-col-title{display:flex;align-items:center;justify-content:space-between;gap:8px;min-width:0}[data-dsh-studio] .ds-col-name{font-size:12.5px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-dsh-studio] .ds-col-owner{display:flex;align-items:center;gap:6px;min-width:0;font-size:10.5px;color:var(--muted-foreground)}[data-dsh-studio] .ds-col-owner-name{display:inline-flex;align-items:center;max-width:160px;padding:1px 7px;border-radius:999px;background:color-mix(in srgb,currentColor 10%,transparent);color:var(--foreground);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-dsh-studio] .ds-col-owner[data-empty="1"] .ds-col-owner-name{background:transparent;border:1px dashed var(--border);color:var(--muted-foreground)}[data-dsh-studio][data-theme=dark] .ds-col-head{background:#1a1e25}[data-dsh-studio] .ds-col-body{padding-top:8px}[data-dsh-studio] .ds-col-head{align-items:stretch;text-align:left}[data-dsh-studio] .ds-col-title{width:100%;align-items:center}[data-dsh-studio] .ds-col-name{flex:1 1 auto;text-align:left}[data-dsh-studio] .ds-col-owner{width:100%;justify-content:flex-start}[data-dsh-studio] .ds-board .ds-col .ds-col-head{align-items:stretch!important;text-align:left!important}[data-dsh-studio] .ds-board .ds-col .ds-col-title{display:flex!important;width:100%!important;align-items:center!important;justify-content:space-between!important}[data-dsh-studio] .ds-board .ds-col .ds-col-owner{display:flex!important;width:100%!important;justify-content:flex-start!important;gap:6px!important}[data-dsh-studio] .ds-board .ds-col{display:flex!important;flex-direction:column!important;align-items:stretch!important}[data-dsh-studio] .ds-board .ds-col .ds-col-head,[data-dsh-studio] .ds-board .ds-col .ds-col-body{width:100%!important;box-sizing:border-box!important}[data-dsh-studio]{height:100%!important;min-height:0!important;max-height:100%!important;overflow:hidden!important}[data-dsh-studio]>.ds-head{flex:0 0 auto}[data-dsh-studio]>.ds-body{flex:1 1 auto!important;min-height:0!important;overflow:auto!important}[data-dsh-studio] .ds-req-page,[data-dsh-studio] .ds-board,[data-dsh-studio] .ds-pane-stack{min-height:0}html body [data-dsh-studio]{display:flex!important;flex-direction:column!important;height:100vh!important;max-height:100vh!important;min-height:0!important;overflow:hidden!important}html body [data-dsh-studio]>.ds-body{flex:1 1 auto!important;min-height:0!important;overflow-y:auto!important;overflow-x:hidden!important}html body [data-dsh-studio]>.ds-body>*{min-height:0!important}html body [data-dsh-studio] .ds-empty,html body [data-dsh-studio] .ds-hint{max-width:100%}html body [data-dsh-studio]:not([data-dsh-studio-portal]){height:100vh!important;max-height:100vh!important;display:flex!important;flex-direction:column!important;overflow:hidden!important}html body [data-dsh-studio][data-dsh-studio-portal]{position:fixed!important;inset:0!important;width:0!important;height:0!important;min-height:0!important;overflow:visible!important;margin:0!important;padding:0!important}[data-dsh-studio] input:disabled,[data-dsh-studio-portal] input:disabled{background:var(--muted)!important;opacity:1!important;cursor:not-allowed}[data-dsh-studio] .ds-field>.ds-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-dsh-studio] .ds-an-grid{align-items:stretch}[data-dsh-studio] .ds-an-grid>*{min-width:0}[data-dsh-studio] .ds-an-grid>.ds-panel{height:100%}[data-dsh-studio] .ds-an-grid>.ds-panel>.ds-panel-body{flex:1 1 auto;min-height:0}[data-dsh-studio] .ds-an-grid .ds-panel-head{flex-direction:column;align-items:flex-start;gap:3px}[data-dsh-studio] .ds-an-grid .ds-panel-head .ds-hint{margin-left:0}[data-dsh-studio] .ds-an-grid .ds-panel-title{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-dsh-studio] .ds-an-grid .ds-an-foot{margin-top:auto}[data-dsh-studio] .ds-pane-stack{display:flex;flex-direction:column;gap:12px}[data-dsh-studio] .ds-pane-stack>.ds-panel{margin:0}[data-dsh-studio] .ds-pane-stack>.ds-panel>.ds-panel-head{padding:10px 14px;border-bottom:1px solid var(--border)}[data-dsh-studio] .ds-pane-stack>.ds-panel>.ds-panel-body{padding:12px 14px}[data-dsh-studio] .ds-pane input:not([type=checkbox]):not([type=radio]):not([type=file]),[data-dsh-studio] .ds-pane textarea,[data-dsh-studio-portal] input:not([type=checkbox]):not([type=radio]):not([type=file]),[data-dsh-studio-portal] textarea{border:1px solid var(--border)!important;border-radius:6px!important;background:var(--card)!important}[data-dsh-studio] .ds-pane input:focus,[data-dsh-studio] .ds-pane textarea:focus,[data-dsh-studio-portal] input:focus,[data-dsh-studio-portal] textarea:focus{outline:none!important;border-color:var(--ring)!important;box-shadow:0 0 0 3px color-mix(in srgb,var(--ring) 28%,transparent)!important}[data-dsh-studio] .ds-pane .ds-field>.ds-label{font-size:11.5px;color:var(--muted-foreground)}[data-dsh-studio] .ds-pane .ds-sec-head{margin-bottom:6px}[data-dsh-studio] .ds-nav-item{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:32px!important;padding:6px 10px!important;border-radius:7px;font-size:12.5px;line-height:1.3;width:100%;text-align:left}[data-dsh-studio] .ds-nav-item+.ds-nav-item{margin-top:2px}[data-dsh-studio] .ds-listrow{display:flex;align-items:center;gap:12px;padding:10px 14px}[data-dsh-studio] .ds-listrow-main{display:flex;flex-direction:column;gap:3px;min-width:0;flex:1 1 auto}[data-dsh-studio] .ds-listrow-main>div{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-dsh-studio] .ds-listrow-main [data-prompt="1"]{color:var(--muted-foreground);font-size:11.5px}[data-dsh-studio] .ds-listrow-actions{flex:0 0 auto;display:flex;align-items:center;gap:6px}[data-dsh-studio] [role=switch]{display:inline-flex!important;align-items:center;padding:2px!important;box-sizing:border-box}[data-dsh-studio] [role=switch]>span{transform:none!important;margin:0!important;flex:0 0 auto!important;width:16px!important;height:16px!important;border-radius:9999px}[data-dsh-studio] [role=switch][data-state=unchecked]>span{margin-right:auto!important}[data-dsh-studio] [role=switch][data-state=checked]>span{margin-left:auto!important}[data-dsh-studio] [role=tablist]>[role=tab]:not([data-state=active]){background:transparent!important;color:color-mix(in srgb,var(--foreground) 60%,transparent)!important;box-shadow:none!important}[data-dsh-studio] [role=tablist]>[role=tab]:not([data-state=active]):hover{color:var(--foreground)!important}[data-dsh-studio] [role=tablist],[data-dsh-studio-portal] [role=tablist]{background:color-mix(in srgb,var(--foreground) 6%,var(--background));border:1px solid color-mix(in srgb,var(--foreground) 10%,var(--background));border-radius:9px;padding:3px;gap:3px}[data-dsh-studio] [role=tablist]>[role=tab][data-state=active],[data-dsh-studio-portal] [role=tablist]>[role=tab][data-state=active]{background:var(--card)!important;color:var(--foreground)!important;border:1px solid color-mix(in srgb,var(--foreground) 12%,var(--card))!important;box-shadow:0 1px 2px color-mix(in srgb,var(--foreground) 12%,transparent)!important}[data-dsh-studio][data-theme=dark] [role=tablist],[data-dsh-studio-portal][data-theme=dark] [role=tablist]{background:#16181d;border-color:#2a2e36}[data-dsh-studio][data-theme=dark] [role=tablist]>[role=tab][data-state=active],[data-dsh-studio-portal][data-theme=dark] [role=tablist]>[role=tab][data-state=active]{background:#2b3038!important;color:#fff!important;border-color:#3d434e!important}[data-dsh-studio] .ds-count[data-over="1"]{background:color-mix(in srgb,#e5484d 14%,var(--card));border-color:color-mix(in srgb,#e5484d 45%,var(--border));color:#b42318}[data-dsh-studio][data-theme=dark] .ds-count[data-over="1"]{color:#ff9a9d}[data-dsh-studio] .ds-colpick{position:relative;z-index:30;margin-top:6px}[data-dsh-studio] .ds-colpick-list{max-height:220px;overflow-y:auto;border:1px solid var(--border);border-radius:8px;background:var(--card);box-shadow:var(--ds-shadow);padding:4px}[data-dsh-studio] .ds-colpick .ds-mention-item{display:flex;gap:8px;align-items:center;width:100%;padding:6px 8px;border-radius:6px;background:transparent;border:0;text-align:left;cursor:pointer;font-size:12.5px}[data-dsh-studio] .ds-colpick .ds-mention-item:hover{background:var(--muted)}[data-dsh-studio] .ds-req-grid{grid-template-columns:300px minmax(0,1fr)!important;gap:14px!important;align-items:start;min-width:0}[data-dsh-studio] .ds-req-grid>*{min-width:0;max-width:100%}[data-dsh-studio] .ds-req-list{max-height:calc(100vh - 220px);overflow-y:auto;overflow-x:hidden;padding-right:2px}[data-dsh-studio] .ds-req-list-head{flex-wrap:wrap;row-gap:6px}[data-dsh-studio] .ds-req-list-head>.ds-btn{flex:0 0 auto;margin-left:0!important}[data-dsh-studio] .ds-req-item{overflow:hidden}[data-dsh-studio] .ds-req-item-title{white-space:normal;overflow-wrap:anywhere}[data-dsh-studio] .ds-req-item-meta{row-gap:4px}[data-dsh-studio] .ds-req-headline{flex-wrap:wrap;min-width:0}[data-dsh-studio] .ds-req-headline>*{min-width:0}[data-dsh-studio] .ds-req-actions{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end}[data-dsh-studio] .ds-body{overflow-x:hidden;min-width:0}[data-dsh-studio] .ds-pane-stack,[data-dsh-studio] .ds-panel,[data-dsh-studio] .ds-panel-body{min-width:0;max-width:100%}[data-dsh-studio] .ds-panel-head{flex-wrap:wrap;row-gap:4px}[data-dsh-studio] .ds-kv{min-width:0}[data-dsh-studio] .ds-kv dd{overflow-wrap:anywhere}@media (max-width: 1100px){[data-dsh-studio] .ds-req-grid{grid-template-columns:minmax(0,1fr)!important}}[data-dsh-studio] .ds-biz-strip{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:8px 10px;border:1px solid var(--border);border-radius:8px;background:var(--muted);margin-bottom:8px}[data-dsh-studio] .ds-biz-rows{display:flex;flex-direction:column;gap:4px;width:100%;margin-top:2px}[data-dsh-studio] .ds-biz-row{display:flex;align-items:center;gap:8px;min-width:0;padding:4px 6px;border-radius:6px;background:var(--card);border:1px solid var(--border)}[data-dsh-studio] .ds-biz-row>span{min-width:0}[data-dsh-studio] .ds-biz-row .ds-btn{height:26px;padding:0 8px;font-size:11.5px}[data-dsh-studio] .ds-intake-form{position:fixed;right:24px;top:92px;width:min(460px,92vw);z-index:70;display:grid!important;gap:8px;padding:14px;border:1px solid var(--border);border-radius:10px;background:var(--card);box-shadow:0 12px 32px -12px #00000073}[data-dsh-studio] .ds-intake-form .ds-row{display:flex;gap:8px}[data-dsh-studio] .ds-intake-form .ds-field{min-width:0;flex:1 1 0}[data-dsh-studio] .ds-intake-form textarea{min-height:64px}[data-dsh-studio] .ds-biz-strip{position:fixed;left:50%;top:88px;transform:translate(-50%);width:min(760px,94vw);z-index:65;display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:8px 10px;border:1px solid var(--border);border-radius:10px;background:var(--card);box-shadow:0 14px 36px -16px #00000080}[data-dsh-studio] .ds-biz-strip .ds-biz-rows{max-height:132px;overflow-y:auto}[data-dsh-studio] .ds-req-list>.ds-biz-strip{display:flex}[data-dsh-studio] .ds-biz-strip{display:none!important}[data-dsh-studio] .ds-biz-result{padding:6px 10px;border:1px solid var(--border);border-radius:7px;background:var(--muted);font-size:12px;margin-top:6px}[data-dsh-studio] .ds-hint{white-space:normal}@media (min-width:1100px){[data-dsh-studio] .ds-body>div:has(>.ds-req-list){display:flex;gap:12px;align-items:flex-start;min-height:0}[data-dsh-studio] .ds-req-list{flex:0 0 340px;max-width:340px;max-height:calc(100vh - 210px);overflow-y:auto}[data-dsh-studio] .ds-body>div:has(>.ds-req-list)>div:not(.ds-req-list){flex:1 1 auto;min-width:0;max-height:calc(100vh - 210px);overflow-y:auto}}[data-dsh-studio] #ds-intake-overlay{display:flex;flex-direction:column}[data-dsh-studio] #ds-intake-overlay .ds-body{overflow:visible}[data-dsh-studio] #ds-intake-overlay .ds-body>div{grid-template-columns:minmax(0,1fr)!important;padding:0 14px 20px!important}[data-dsh-studio] #ds-intake-overlay>div:first-child{padding:10px 14px;border-bottom:1px solid var(--border);background:var(--card);position:sticky;top:0;z-index:2}[data-dsh-studio] #ds-intake-overlay{width:min(640px,96vw)!important;z-index:95!important}[data-dsh-studio] #ds-intake-overlay:before{content:"";position:fixed;inset:0;background:#09090b61;z-index:-1}[data-dsh-studio] #ds-intake-overlay .ds-field{flex:1 1 100%!important;min-width:0}[data-dsh-studio] #ds-intake-overlay .ds-body>div>div{min-width:0}@media (min-width:1100px){[data-dsh-studio] .ds-body>div:has(>.ds-req-list){flex-wrap:wrap;align-items:flex-start}[data-dsh-studio] .ds-intake-launch{flex:0 0 100%;width:100%;padding:0 0 8px}}[data-dsh-studio] [data-mode=form] [data-panel=status],[data-dsh-studio] [data-mode=status] [data-panel=form],[data-dsh-studio] [data-mode=status] [data-panel=list]{display:none!important}[data-dsh-studio] .ds-card[data-dragging="1"]{opacity:.55;transform:rotate(-.5deg)}[data-dsh-studio] .ds-col[data-drag-over="1"]{outline:2px dashed var(--ds-accent);outline-offset:-3px;background:color-mix(in srgb,var(--ds-accent) 8%,var(--muted))}[data-dsh-studio] .ds-palette-veil{position:fixed;inset:0;z-index:120;background:#09090b61;display:flex;align-items:flex-start;justify-content:center;padding-top:12vh}[data-dsh-studio] .ds-palette{width:min(560px,92vw);background:var(--ds-surface, #fff);border:1px solid var(--ds-line, #e4e4e7);border-radius:12px;box-shadow:0 24px 64px #00000047;overflow:hidden}[data-dsh-studio] .ds-palette-input{width:100%;height:44px;padding:0 14px;border:0;border-bottom:1px solid var(--ds-line, #e4e4e7);background:transparent;color:inherit;font-size:14px;outline:none}[data-dsh-studio] .ds-palette-flow{display:flex;align-items:center;gap:8px;padding:8px 14px 0;font-size:12px;color:var(--ds-muted, #71717a)}[data-dsh-studio] .ds-palette-flow:before{content:"";width:6px;height:6px;border-radius:999px;background:#7c3aed}[data-dsh-studio] .ds-palette-flow[data-flow=expert]:before{background:#0ea5e9}[data-dsh-studio] .ds-palette-list{max-height:min(52vh,420px);overflow:auto;padding:6px}[data-dsh-studio] .ds-palette-item{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:8px;cursor:pointer;font-size:13px}[data-dsh-studio] .ds-palette-item[data-active="1"]{background:color-mix(in srgb,var(--ds-accent, #18181b) 10%,transparent)}[data-dsh-studio] .ds-palette-kind{flex:0 0 auto;font-size:11px;padding:1px 6px;border-radius:999px;background:var(--ds-surface-2, #f4f4f5);color:var(--ds-muted, #71717a)}[data-dsh-studio] .ds-palette-kind[data-kind=action]{background:color-mix(in srgb,#7c3aed 16%,transparent);color:#7c3aed}[data-dsh-studio] [data-theme=dark] .ds-palette-kind[data-kind=action],[data-dsh-studio-portal] [data-theme=dark] .ds-palette-kind[data-kind=action]{background:color-mix(in srgb,#a78bfa 22%,transparent);color:#c4b5fd}[data-dsh-studio] .ds-palette-label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-dsh-studio] .ds-diff{margin-top:10px;border:1px solid var(--ds-line, #e4e4e7);border-radius:10px;overflow:hidden}[data-dsh-studio] .ds-diff-head{display:flex;align-items:center;gap:10px;padding:7px 10px;background:var(--ds-surface-2, #f4f4f5);font-size:12px}[data-dsh-studio] .ds-diff-body{max-height:340px;overflow:auto;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:1.55}[data-dsh-studio] .ds-diff-line{padding:1px 10px;white-space:pre-wrap;word-break:break-word}[data-dsh-studio] .ds-diff-line[data-kind=add]{background:#e9f7ef;color:#11623b}[data-dsh-studio] .ds-diff-line[data-kind=del]{background:#fdecec;color:#a4232b}[data-dsh-studio] .ds-diff-line[data-kind=same]{color:var(--ds-muted, #71717a)}[data-dsh-studio] .ds-reg-banner{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:8px 12px;margin-bottom:10px;border:1px solid var(--ds-line, #e4e4e7);border-radius:10px;background:var(--ds-surface-2, #f4f4f5);font-size:12px}[data-dsh-studio] .ds-reg-banner[data-bad="1"]{border-color:#f3c0c2;background:#fdf2f2;color:#b42318}[data-dsh-studio] .ds-suite{display:inline-flex;align-items:center;gap:6px;padding:2px 8px;border:1px solid var(--ds-line, #e4e4e7);border-radius:999px;background:var(--ds-surface-2, #f4f4f5);font-size:12px}[data-dsh-studio] .ds-suite[data-default="1"]{border-color:#a5b4fc;background:#eef2ff;color:#3730a3}[data-dsh-studio] .ds-reg-list{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-top:8px}[data-dsh-studio] .ds-reg-item{font-size:11px;padding:1px 8px;border-radius:999px;border:1px solid var(--ds-line, #e4e4e7);background:var(--ds-surface-2, #f4f4f5);color:var(--ds-muted, #71717a);white-space:nowrap}[data-dsh-studio] .ds-reg-item[data-bad="1"]{border-color:#f3c0c2;background:#fdf2f2;color:#b42318}[data-dsh-studio] .ds-case-lib{display:flex;flex-direction:column}[data-dsh-studio] .ds-case-lib-row{display:grid;grid-template-columns:26px 88px minmax(0,1fr) 220px 56px 40px 92px 56px;gap:10px;align-items:center;padding:7px 10px;border-bottom:1px solid var(--ds-line, #e4e4e7);cursor:pointer;font-size:13px}[data-dsh-studio] .ds-case-lib-row:hover{background:color-mix(in srgb,var(--ds-accent, #18181b) 6%,transparent)}[data-dsh-studio] .ds-case-lib-row[data-result=fail]{background:color-mix(in srgb,#e5484d 8%,transparent)}[data-dsh-studio] .ds-case-lib-wrap{border-bottom:1px solid var(--ds-line, #e4e4e7)}[data-dsh-studio] .ds-case-lib-wrap .ds-case-lib-row{border-bottom:0}[data-dsh-studio] .ds-case-lib-detail{padding:8px 12px 10px 36px;background:var(--ds-surface-2, #f4f4f5);font-size:12px;line-height:1.6;color:var(--ds-muted, #71717a)}[data-dsh-studio] .ds-case-lib-preview{margin:6px 0 0;padding:8px 10px;max-height:180px;overflow:auto;background:var(--ds-surface, #fff);border:1px solid var(--ds-line, #e4e4e7);border-radius:8px;font-size:11px;white-space:pre-wrap;word-break:break-word}[data-dsh-studio] .ds-case-lib-pick{display:flex;align-items:center;justify-content:center}[data-dsh-studio] .ds-case-lib-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-dsh-studio] .ds-case-lib-meta,[data-dsh-studio] .ds-case-lib-at{color:var(--ds-muted, #71717a);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-dsh-studio] .ds-case-lib-pri{color:var(--ds-muted, #71717a);font-size:11px;text-transform:uppercase}[data-dsh-studio] .ds-palette-hint{flex:0 0 auto;max-width:40%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ds-muted, #71717a);font-size:12px}[data-dsh-studio] .ds-palette-key{flex:0 0 auto;font-size:11px;line-height:16px;padding:1px 6px;border-radius:5px;border:1px solid var(--ds-line, #e4e4e7);background:var(--ds-surface-2, #f4f4f5);color:var(--ds-muted, #71717a);white-space:nowrap}[data-dsh-studio][data-theme=dark] .ds-palette-key{border-color:#3f3f46;background:#27272a;color:#a1a1aa}[data-dsh-studio][data-theme=dark] .ds-palette-veil{background:#0009}[data-dsh-studio] .selection\\:bg-primary *::-moz-selection,[data-dsh-studio-portal] .selection\\:bg-primary *::-moz-selection{background-color:var(--primary)}[data-dsh-studio] .selection\\:bg-primary *::selection,[data-dsh-studio-portal] .selection\\:bg-primary *::selection{background-color:var(--primary)}[data-dsh-studio] .selection\\:text-primary-foreground *::-moz-selection,[data-dsh-studio-portal] .selection\\:text-primary-foreground *::-moz-selection{color:var(--primary-foreground)}[data-dsh-studio] .selection\\:text-primary-foreground *::selection,[data-dsh-studio-portal] .selection\\:text-primary-foreground *::selection{color:var(--primary-foreground)}[data-dsh-studio] .selection\\:bg-primary::-moz-selection,[data-dsh-studio-portal] .selection\\:bg-primary::-moz-selection{background-color:var(--primary)}[data-dsh-studio] .selection\\:bg-primary::selection,[data-dsh-studio-portal] .selection\\:bg-primary::selection{background-color:var(--primary)}[data-dsh-studio] .selection\\:text-primary-foreground::-moz-selection,[data-dsh-studio-portal] .selection\\:text-primary-foreground::-moz-selection{color:var(--primary-foreground)}[data-dsh-studio] .selection\\:text-primary-foreground::selection,[data-dsh-studio-portal] .selection\\:text-primary-foreground::selection{color:var(--primary-foreground)}[data-dsh-studio] .file\\:inline-flex::file-selector-button,[data-dsh-studio-portal] .file\\:inline-flex::file-selector-button{display:inline-flex}[data-dsh-studio] .file\\:h-7::file-selector-button,[data-dsh-studio-portal] .file\\:h-7::file-selector-button{height:1.75rem}[data-dsh-studio] .file\\:border-0::file-selector-button,[data-dsh-studio-portal] .file\\:border-0::file-selector-button{border-width:0px}[data-dsh-studio] .file\\:bg-transparent::file-selector-button,[data-dsh-studio-portal] .file\\:bg-transparent::file-selector-button{background-color:transparent}[data-dsh-studio] .file\\:text-sm::file-selector-button,[data-dsh-studio-portal] .file\\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}[data-dsh-studio] .file\\:font-medium::file-selector-button,[data-dsh-studio-portal] .file\\:font-medium::file-selector-button{font-weight:500}[data-dsh-studio] .file\\:text-foreground::file-selector-button,[data-dsh-studio-portal] .file\\:text-foreground::file-selector-button{color:var(--foreground)}[data-dsh-studio] .placeholder\\:text-muted-foreground::-moz-placeholder,[data-dsh-studio-portal] .placeholder\\:text-muted-foreground::-moz-placeholder{color:var(--muted-foreground)}[data-dsh-studio] .placeholder\\:text-muted-foreground::placeholder,[data-dsh-studio-portal] .placeholder\\:text-muted-foreground::placeholder{color:var(--muted-foreground)}[data-dsh-studio] .hover\\:bg-accent:hover,[data-dsh-studio-portal] .hover\\:bg-accent:hover{background-color:var(--accent)}[data-dsh-studio] .hover\\:bg-muted:hover,[data-dsh-studio-portal] .hover\\:bg-muted:hover{background-color:var(--muted)}[data-dsh-studio] .hover\\:text-accent-foreground:hover,[data-dsh-studio-portal] .hover\\:text-accent-foreground:hover{color:var(--accent-foreground)}[data-dsh-studio] .hover\\:text-foreground:hover,[data-dsh-studio-portal] .hover\\:text-foreground:hover{color:var(--foreground)}[data-dsh-studio] .hover\\:underline:hover,[data-dsh-studio-portal] .hover\\:underline:hover{text-decoration-line:underline}[data-dsh-studio] .hover\\:opacity-100:hover,[data-dsh-studio-portal] .hover\\:opacity-100:hover{opacity:1}[data-dsh-studio] .focus\\:outline-none:focus,[data-dsh-studio-portal] .focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}[data-dsh-studio] .focus\\:ring-2:focus,[data-dsh-studio-portal] .focus\\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}[data-dsh-studio] .focus\\:ring-ring:focus,[data-dsh-studio-portal] .focus\\:ring-ring:focus{--tw-ring-color: var(--ring)}[data-dsh-studio] .focus-visible\\:border-ring:focus-visible,[data-dsh-studio-portal] .focus-visible\\:border-ring:focus-visible{border-color:var(--ring)}[data-dsh-studio] .focus-visible\\:outline-none:focus-visible,[data-dsh-studio-portal] .focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}[data-dsh-studio] .focus-visible\\:outline-1:focus-visible,[data-dsh-studio-portal] .focus-visible\\:outline-1:focus-visible{outline-width:1px}[data-dsh-studio] .focus-visible\\:outline-ring:focus-visible,[data-dsh-studio-portal] .focus-visible\\:outline-ring:focus-visible{outline-color:var(--ring)}[data-dsh-studio] .focus-visible\\:ring-2:focus-visible,[data-dsh-studio-portal] .focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}[data-dsh-studio] .focus-visible\\:ring-\\[3px\\]:focus-visible,[data-dsh-studio-portal] .focus-visible\\:ring-\\[3px\\]:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}[data-dsh-studio] .focus-visible\\:ring-ring:focus-visible,[data-dsh-studio-portal] .focus-visible\\:ring-ring:focus-visible{--tw-ring-color: var(--ring)}[data-dsh-studio] .disabled\\:pointer-events-none:disabled,[data-dsh-studio-portal] .disabled\\:pointer-events-none:disabled{pointer-events:none}[data-dsh-studio] .disabled\\:cursor-not-allowed:disabled,[data-dsh-studio-portal] .disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}[data-dsh-studio] .disabled\\:opacity-50:disabled,[data-dsh-studio-portal] .disabled\\:opacity-50:disabled{opacity:.5}[data-dsh-studio] .has-\\[\\>svg\\]\\:px-2\\.5:has(>svg),[data-dsh-studio-portal] .has-\\[\\>svg\\]\\:px-2\\.5:has(>svg){padding-left:.625rem;padding-right:.625rem}[data-dsh-studio] .has-\\[\\>svg\\]\\:px-3:has(>svg),[data-dsh-studio-portal] .has-\\[\\>svg\\]\\:px-3:has(>svg){padding-left:.75rem;padding-right:.75rem}[data-dsh-studio] .has-\\[\\>svg\\]\\:px-4:has(>svg),[data-dsh-studio-portal] .has-\\[\\>svg\\]\\:px-4:has(>svg){padding-left:1rem;padding-right:1rem}[data-dsh-studio] .data-\\[disabled\\]\\:pointer-events-none[data-disabled],[data-dsh-studio-portal] .data-\\[disabled\\]\\:pointer-events-none[data-disabled]{pointer-events:none}[data-dsh-studio] .data-\\[orientation\\=horizontal\\]\\:h-8[data-orientation=horizontal],[data-dsh-studio-portal] .data-\\[orientation\\=horizontal\\]\\:h-8[data-orientation=horizontal]{height:2rem}[data-dsh-studio] .data-\\[orientation\\=vertical\\]\\:h-fit[data-orientation=vertical],[data-dsh-studio-portal] .data-\\[orientation\\=vertical\\]\\:h-fit[data-orientation=vertical]{height:-moz-fit-content;height:fit-content}[data-dsh-studio] .data-\\[state\\=checked\\]\\:translate-x-4[data-state=checked],[data-dsh-studio-portal] .data-\\[state\\=checked\\]\\:translate-x-4[data-state=checked]{--tw-translate-x: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-dsh-studio] .data-\\[state\\=checked\\]\\:translate-x-\\[18px\\][data-state=checked],[data-dsh-studio-portal] .data-\\[state\\=checked\\]\\:translate-x-\\[18px\\][data-state=checked]{--tw-translate-x: 18px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-dsh-studio] .data-\\[state\\=unchecked\\]\\:translate-x-0[data-state=unchecked],[data-dsh-studio-portal] .data-\\[state\\=unchecked\\]\\:translate-x-0[data-state=unchecked]{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[data-dsh-studio] .data-\\[orientation\\=vertical\\]\\:flex-col[data-orientation=vertical],[data-dsh-studio-portal] .data-\\[orientation\\=vertical\\]\\:flex-col[data-orientation=vertical]{flex-direction:column}[data-dsh-studio] .data-\\[highlighted\\]\\:bg-accent[data-highlighted],[data-dsh-studio-portal] .data-\\[highlighted\\]\\:bg-accent[data-highlighted]{background-color:var(--accent)}[data-dsh-studio] .data-\\[state\\=active\\]\\:bg-background[data-state=active],[data-dsh-studio-portal] .data-\\[state\\=active\\]\\:bg-background[data-state=active]{background-color:var(--background)}[data-dsh-studio] .data-\\[state\\=checked\\]\\:bg-primary[data-state=checked],[data-dsh-studio-portal] .data-\\[state\\=checked\\]\\:bg-primary[data-state=checked],[data-dsh-studio] .data-\\[state\\=on\\]\\:bg-primary[data-state=on],[data-dsh-studio-portal] .data-\\[state\\=on\\]\\:bg-primary[data-state=on]{background-color:var(--primary)}[data-dsh-studio] .data-\\[state\\=unchecked\\]\\:bg-input[data-state=unchecked],[data-dsh-studio-portal] .data-\\[state\\=unchecked\\]\\:bg-input[data-state=unchecked]{background-color:var(--input)}[data-dsh-studio] .data-\\[highlighted\\]\\:text-accent-foreground[data-highlighted],[data-dsh-studio-portal] .data-\\[highlighted\\]\\:text-accent-foreground[data-highlighted]{color:var(--accent-foreground)}[data-dsh-studio] .data-\\[placeholder\\]\\:text-muted-foreground[data-placeholder],[data-dsh-studio-portal] .data-\\[placeholder\\]\\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}[data-dsh-studio] .data-\\[state\\=active\\]\\:text-foreground[data-state=active],[data-dsh-studio-portal] .data-\\[state\\=active\\]\\:text-foreground[data-state=active]{color:var(--foreground)}[data-dsh-studio] .data-\\[state\\=checked\\]\\:text-primary-foreground[data-state=checked],[data-dsh-studio-portal] .data-\\[state\\=checked\\]\\:text-primary-foreground[data-state=checked],[data-dsh-studio] .data-\\[state\\=on\\]\\:text-primary-foreground[data-state=on],[data-dsh-studio-portal] .data-\\[state\\=on\\]\\:text-primary-foreground[data-state=on]{color:var(--primary-foreground)}[data-dsh-studio] .data-\\[disabled\\]\\:opacity-50[data-disabled],[data-dsh-studio-portal] .data-\\[disabled\\]\\:opacity-50[data-disabled]{opacity:.5}[data-dsh-studio] .data-\\[state\\=active\\]\\:shadow-sm[data-state=active],[data-dsh-studio-portal] .data-\\[state\\=active\\]\\:shadow-sm[data-state=active],[data-dsh-studio] .data-\\[state\\=on\\]\\:shadow-sm[data-state=on],[data-dsh-studio-portal] .data-\\[state\\=on\\]\\:shadow-sm[data-state=on]{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}@media (min-width: 640px){[data-dsh-studio] .sm\\:max-w-lg,[data-dsh-studio-portal] .sm\\:max-w-lg{max-width:32rem}}@media (min-width: 768px){[data-dsh-studio] .md\\:text-sm,[data-dsh-studio-portal] .md\\:text-sm{font-size:.875rem;line-height:1.25rem}}[data-dsh-studio] .dark\\:text-muted-foreground:where([data-theme=dark],[data-theme=dark] *),[data-dsh-studio-portal] .dark\\:text-muted-foreground:where([data-theme=dark],[data-theme=dark] *){color:var(--muted-foreground)}[data-dsh-studio] .dark\\:hover\\:text-foreground:hover:where([data-theme=dark],[data-theme=dark] *),[data-dsh-studio-portal] .dark\\:hover\\:text-foreground:hover:where([data-theme=dark],[data-theme=dark] *){color:var(--foreground)}[data-dsh-studio] .dark\\:data-\\[state\\=active\\]\\:border-input[data-state=active]:where([data-theme=dark],[data-theme=dark] *),[data-dsh-studio-portal] .dark\\:data-\\[state\\=active\\]\\:border-input[data-state=active]:where([data-theme=dark],[data-theme=dark] *){border-color:var(--input)}[data-dsh-studio] .dark\\:data-\\[state\\=active\\]\\:text-foreground[data-state=active]:where([data-theme=dark],[data-theme=dark] *),[data-dsh-studio-portal] .dark\\:data-\\[state\\=active\\]\\:text-foreground[data-state=active]:where([data-theme=dark],[data-theme=dark] *){color:var(--foreground)}[data-dsh-studio] .\\[\\&\\>svg\\]\\:pointer-events-none>svg,[data-dsh-studio-portal] .\\[\\&\\>svg\\]\\:pointer-events-none>svg{pointer-events:none}[data-dsh-studio] .\\[\\&\\>svg\\]\\:size-3>svg,[data-dsh-studio-portal] .\\[\\&\\>svg\\]\\:size-3>svg{width:.75rem;height:.75rem}[data-dsh-studio] .\\[\\&_svg\\:not\\(\\[class\\*\\=\\\\\\'size-\\\\\\'\\]\\)\\]\\:size-4 svg:not([class*="'size-'"]),[data-dsh-studio-portal] .\\[\\&_svg\\:not\\(\\[class\\*\\=\\\\\\'size-\\\\\\'\\]\\)\\]\\:size-4 svg:not([class*="'size-'"]){width:1rem;height:1rem}[data-dsh-studio] .\\[\\&_svg\\:not\\(\\[class\\*\\=text-\\]\\)\\]\\:text-muted-foreground svg:not([class*=text-]),[data-dsh-studio-portal] .\\[\\&_svg\\:not\\(\\[class\\*\\=text-\\]\\)\\]\\:text-muted-foreground svg:not([class*=text-]){color:var(--muted-foreground)}[data-dsh-studio] .\\[\\&_svg\\]\\:pointer-events-none svg,[data-dsh-studio-portal] .\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}[data-dsh-studio] .\\[\\&_svg\\]\\:shrink-0 svg,[data-dsh-studio-portal] .\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}`;function Xy(e){function t(n,r){const s=[];return String(n??"").split(/(`[^`]+`)/g).forEach((i,l)=>{if(i.length>1&&i.startsWith("`")&&i.endsWith("`")){s.push(e("code",{key:`${r}c${l}`},i.slice(1,-1)));return}const c=/\[([^\]]+)\]\(([^)\s]+)\)|\*\*([^*]+)\*\*|__([^_]+)__|\*([^*\n]+)\*|_([^_\n]+)_/g;let u=0,p;for(;(p=c.exec(i))!==null;){p.index>u&&s.push(i.slice(u,p.index));const f=`${r}i${l}-${p.index}`;p[1]!==void 0?s.push(e("a",{key:f,href:p[2],target:"_blank",rel:"noreferrer"},p[1])):p[3]!==void 0||p[4]!==void 0?s.push(e("strong",{key:f},p[3]??p[4])):s.push(e("em",{key:f},p[5]??p[6])),u=p.index+p[0].length}u<i.length&&s.push(i.slice(u))}),s}function a(n){const r=String(n??"").replace(/\r\n?/g,`
|
|
10
10
|
`).split(`
|
|
11
11
|
`),s=[];let o=0;const i=u=>`md${u}`,l=u=>/^\s*\|?\s*:?-{2,}:?\s*(\|\s*:?-{2,}:?\s*)*\|?\s*$/.test(u),c=u=>u.trim().replace(/^\|/,"").replace(/\|$/,"").split("|").map(p=>p.trim());for(;o<r.length;){const u=r[o],p=o;if(/^\s*$/.test(u)){o+=1;continue}if(/^\s*```([\w+#-]*)\s*$/.test(u)){const k=[];for(o+=1;o<r.length&&!/^\s*```\s*$/.test(r[o]);)k.push(r[o]),o+=1;o+=1,s.push(e("pre",{key:i(p)},e("code",null,k.join(`
|
|
12
12
|
`))));continue}const f=/^(#{1,6})\s+(.*)$/.exec(u);if(f!==null){const k=Math.min(6,f[1].length+2);s.push(e(`h${k}`,{key:i(p)},t(f[2],i(p)))),o+=1;continue}if(/^\s*(-{3,}|\*{3,}|_{3,})\s*$/.test(u)){s.push(e("hr",{key:i(p)})),o+=1;continue}if(/^\s*>/.test(u)){const k=[];for(;o<r.length&&/^\s*>/.test(r[o]);)k.push(r[o].replace(/^\s*>\s?/,"")),o+=1;s.push(e("blockquote",{key:i(p)},a(k.join(`
|
|
13
13
|
`))));continue}if(u.includes("|")&&o+1<r.length&&l(r[o+1])){const k=c(u);o+=2;const g=[];for(;o<r.length&&r[o].includes("|")&&!/^\s*$/.test(r[o]);)g.push(c(r[o])),o+=1;s.push(e("table",{key:i(p)},e("thead",null,e("tr",null,k.map((d,h)=>e("th",{key:h},t(d,`${i(p)}h${h}`))))),e("tbody",null,g.map((d,h)=>e("tr",{key:h},k.map((y,S)=>e("td",{key:S},t(d[S]??"",`${i(p)}r${h}c${S}`))))))));continue}const v=/^\s*[-*+]\s+(.*)$/;if(v.test(u)){const k=[];for(;o<r.length&&v.test(r[o]);)k.push(e("li",{key:o},t(v.exec(r[o])[1],`${i(p)}l${o}`))),o+=1;s.push(e("ul",{key:i(p)},k));continue}const x=/^\s*\d+[.)]\s+(.*)$/;if(x.test(u)){const k=[];for(;o<r.length&&x.test(r[o]);)k.push(e("li",{key:o},t(x.exec(r[o])[1],`${i(p)}n${o}`))),o+=1;s.push(e("ol",{key:i(p)},k));continue}const b=[u];for(o+=1;o<r.length;){const k=r[o];if(/^\s*$/.test(k)||/^\s*```/.test(k)||/^(#{1,6})\s+/.test(k)||/^\s*>/.test(k)||/^\s*[-*+]\s+/.test(k)||/^\s*\d+[.)]\s+/.test(k)||/^\s*(-{3,}|\*{3,}|_{3,})\s*$/.test(k))break;b.push(k),o+=1}s.push(e("p",{key:i(p)},t(b.join(`
|
|
14
|
-
`),i(p))))}return s}return a}function Ye(e){if(typeof e!="number"||e===0)return"—";const t=new Date(e),a=n=>String(n).padStart(2,"0");return`${a(t.getMonth()+1)}-${a(t.getDate())} ${a(t.getHours())}:${a(t.getMinutes())}`}function Wa(e){if(typeof e!="number"||e===0)return"—";const t=new Date(e),a=n=>String(n).padStart(2,"0");return`${a(t.getMonth()+1)}-${a(t.getDate())}`}const Aa={product:"产品",architect:"架构",dev:"研发",qa:"测试"},As={urgent:"紧急",normal:"普通",relaxed:"宽松"},zo={requirement:"需求",bug:"缺陷",design:"设计",dev:"开发",test:"测试",ops:"运维"},ql={p0:"P0 致命",p1:"P1 严重",p2:"P2 一般",p3:"P3 轻微"},Xy=["requirement","design","mr","cases","report","release","doc","screenshot","other"],Hp={requirement:"需求",design:"方案",mr:"MR",cases:"用例",report:"报告",release:"发布",doc:"文档",screenshot:"截图",other:"其它"},Zy=["draft","delivered","accepted"],Gp=["pending","pass","fail","skip"],Vl={pending:"⬜ 未跑",pass:"✅ 通过",fail:"❌ 不通过",skip:"⏭️ 跳过"},Jy=["functional","api","ui","performance","security","other"],Kp={functional:"功能",api:"接口",ui:"界面",performance:"性能",security:"安全",other:"其它"},ex=["p0","p1","p2","p3"],tx={draft:"草稿",delivered:"已交付",accepted:"已验收"},ax={pending:"待评审",approved:"评审通过",changes_requested:"要求修改"},Wl={active:"进行中",paused:"暂停",archived:"已归档"},Hl={planned:"未开始",active:"进行中",closed:"已结束"},nx={round_robin:"轮询",best_match:"按专长匹配",lead:"团长分派"},Yp=["draft","review","active","delivered","closed"],Qp={prd:"PRD",proto:"原型",acceptance:"验收标准",other:"其它"},sx=["prd","proto","acceptance","other"],rx={draft:"草稿",review:"评审中",baseline:"已生效"},ox=["draft","candidate","approved","released","rolled_back"],Tr={draft:"草稿",review:"待评审",active:"进行中",delivered:"已交付",closed:"已关闭"},Xp={draft:"草稿",candidate:"待发布",approved:"已审批",released:"已发布",rolled_back:"已回滚"};function Zp(e){if(typeof e!="number"||e===0)return"";const t=new Date(e),a=n=>String(n).padStart(2,"0");return`${t.getFullYear()}-${a(t.getMonth()+1)}-${a(t.getDate())}`}function Pr(e){if(typeof e!="string"||e.trim()==="")return 0;const t=new Date(`${e.trim()}T23:59:00`).getTime();return Number.isFinite(t)?t:0}function Jp(e,t){if(t==null)return"";if(t.kind==="role")return`🎯 ${Aa[t.id]??t.id}`;if(t.kind==="team"){const n=(e.teams??[]).find(r=>r.id===t.id);return n===void 0?"":`👥 ${n.name}`}const a=(e.experts??[]).find(n=>n.id===t.id);return a===void 0?Aa[t.id]??String(t.id??""):`${a.emoji} ${a.name}`}function js(e,t){if(t==null)return"";if(t.kind==="pool"){const a=(t.members??[]).map(n=>Jp(e,n)).filter(n=>n!=="");return a.length===0?"":a.length===1?a[0]:`${a[0]} 等 ${a.length} 位`}return Jp(e,t)}function ef(e){const t=[];for(const a of["product","architect","dev","qa"])t.push({key:"r:"+a,name:"角色 · "+(Aa[a]??a),emoji:"🎯",hint:"按角色位派单,具体人按卡片业务领域挑",group:"角色位"});for(const a of e?.experts??[])a.enabled!==!1&&t.push({key:"e:"+a.id,name:a.name,emoji:a.emoji??"🤖",hint:[a.description,a.domain?`${a.domain} · ${Aa[a.role]??a.role}`:Aa[a.role]??a.role].filter(Boolean).join(" · "),group:"专家"});for(const a of e?.teams??[])t.push({key:"t:"+a.id,name:a.name,emoji:a.emoji??"👥",hint:`团长 ${e?.experts?.find(n=>n.id===a.lead)?.name??"未设"} · ${(a.members??[]).length} 位成员`,group:"专家团"});return t}function Fo(e,t){const a=String(t??"").trim().toLowerCase();return a===""?e:e.filter(n=>`${n.name} ${n.hint}`.toLowerCase().includes(a))}function Bo(e,t){const a=t.experts??[];if(e.dispatch?.state==="running"&&e.dispatch?.expert){const s=a.find(o=>o.id===e.dispatch.expert);if(s!==void 0)return{label:`${s.emoji} ${s.name}`,note:"正在处理",expert:s}}const n=a.find(s=>s.id===e.expert);if(n!==void 0)return{label:`${n.emoji} ${n.name}`,note:"卡上指派",expert:n};const r=t.columns?.[e.status];if(r!==void 0&&Array.isArray(r.members)&&r.members.length>0){if(r.members.length===1){const o=r.members[0],i=js(t,{...o,kind:o.kind});if(i!==""){const l=o.kind==="expert"?a.find(c=>c.id===o.id):void 0;return{label:i,note:"本列候选人",expert:l}}}const s=nx[r.strategy??"round_robin"]??"轮询";return{label:`候选池 ${r.members.length} 人`,note:`本列候选:${r.members.map(o=>js(t,o)).join("、")}(${s})`,expert:void 0}}if(r!==void 0&&r.kind!=="none"){const s=js(t,r);if(s!==""){const o=r.kind==="expert"?a.find(i=>i.id===r.id):void 0;return{label:s,note:"本列负责人",expert:o}}}return{label:"未指派",note:"等人认领",expert:void 0}}function Gl(e){if(e?.caseSummary!==void 0)return e.caseSummary;const t=Array.isArray(e?.cases)?e.cases:[];return{total:t.length,pass:t.filter(a=>a.result==="pass").length,fail:t.filter(a=>a.result==="fail").length}}function Kl(e){if(e?.checkSummary!==void 0)return e.checkSummary;const t=Array.isArray(e?.checklist)?e.checklist:[];return{done:t.filter(a=>a.done).length,total:t.length}}function Yl(e){return typeof e?.commentCount=="number"?e.commentCount:Array.isArray(e?.comments)?e.comments.length:0}function _r(e){return(e.artifacts??[]).filter(t=>{const a=String(t.content??"");return a!==""?a.trim()==="":(typeof t.contentLength=="number"?t.contentLength:0)===0})}function ix({h:e,kit:t,React:a}){function n({className:c,...u}){const p=t("Input");if(p===null)return e("input",{className:c,...u});const{style:f,...v}=u,x=String(c??"").split(/\s+/).filter(b=>b!==""&&b!=="ds-input").join(" ");return e(p,{...v,style:f,className:`h-9 w-full min-w-0 text-sm${x===""?"":" "+x}`})}function r({className:c,...u}){const p=t("Textarea");if(p===null)return e("textarea",{className:c,...u});const{style:f,...v}=u,x=Number(v.rows)>0?Number(v.rows):4,b=String(c??"").split(/\s+/).filter(k=>k!==""&&k!=="ds-input"&&k!=="ds-textarea").join(" ");return e(p,{...v,style:{minHeight:`${Math.max(96,x*22+28)}px`,...f??{}},className:`flex min-h-16 w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm leading-relaxed shadow-sm outline-none transition-[color,box-shadow] placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50${b===""?"":" "+b}`})}function s({className:c,variant:u,...p}){const f=t("Badge");if(f===null)return e("span",{className:c,...p});const v=String(c??""),x=u??(v.indexOf("ds-chip-blocked")>=0||v.indexOf("ds-chip-bug")>=0||p["data-blocked"]==="1"||p["data-danger"]==="1"?"destructive":v.indexOf("ds-chip-code")>=0||p["data-svc-missing"]==="1"?"outline":"secondary");return e(f,{...p,variant:x,className:c})}function o({className:c,checked:u,onChange:p,disabled:f,...v}){const x=t("SwitchBox");return x===null?e("input",{className:c,type:"checkbox",checked:u===!0,disabled:f,onChange:p,...v}):e(x,{bare:!0,checked:u===!0,disabled:f===!0,onChange:b=>{typeof p=="function"&&p({target:{checked:b===!0}})}})}function i(c){const u=[];return a.Children.forEach(c,p=>{a.isValidElement(p)&&(p.type==="option"?u.push({value:String(p.props.value??""),label:String(a.Children.toArray(p.props.children).join(""))}):p.type==="optgroup"&&i(p.props.children).forEach(f=>u.push(f)))}),u}function l({className:c,children:u,value:p,onChange:f,disabled:v,...x}){const b=t("SelectBox");if(b===null)return e("select",{className:c,value:p,onChange:f,disabled:v,...x},u);const k=i(u),g=k.some(y=>y.value===""),d=k.map(y=>g&&y.value===""?{...y,value:"__empty__"}:y);d.length===0&&d.push({value:g?"__empty__":"",label:"—"});const h=p==null?"":String(p);return e(b,{...x,value:g&&h===""?"__empty__":h,options:d,disabled:v,onChange:y=>{typeof f=="function"&&f({target:{value:y==="__empty__"?"":y}})}})}return{TextField:n,TextAreaField:r,ChipField:s,CheckField:o,SelectField:l}}function lx({h:e,kit:t}){function a({title:n,hint:r,onClose:s,footer:o,children:i}){const l=t("SheetDrawer");return l!==null?e(l,{title:n,hint:r,onClose:s,footer:o},i):e("div",{className:"ds-side-wrap",onKeyDown:c=>{c.key==="Escape"&&s()}},e("div",{className:"ds-side-mask",onClick:s}),e("div",{className:"ds-side",role:"dialog","aria-modal":"true"},e("div",{className:"ds-side-head"},e("div",{},e("div",{className:"ds-side-title"},n),r==null?null:e("div",{className:"ds-hint"},r)),e("button",{className:"ds-btn",onClick:s},"关闭")),e("div",{className:"ds-side-body"},i),o==null?null:e("div",{className:"ds-side-foot"},o)))}return a}function dx({h:e,ChipField:t}){function a({task:n,onOpen:r,config:s,requirements:o,onPickRequirement:i,onPickProject:l}){const c=Bo(n,s??{}),u=n.dispatch?.state==="running",p=n.blocked??null,f=(s?.projects??[]).find(S=>S.id===n.project),v=(f?.iterations??[]).find(S=>S.id===n.iteration),x=(f?.services??[]).find(S=>S.id===n.service),b=(o??[]).find(S=>S.id===n.requirementId),k=Kl(n),g=Gl(n),d=(n.artifacts??[]).length,h=_r(n).length,y=n.dueAt>0&&n.dueAt<Date.now()&&n.status!=="done";return e("div",{className:"ds-card",draggable:!0,onDragStart:S=>{S.dataTransfer.setData("text/plain",n.id),S.dataTransfer.effectAllowed="move",S.currentTarget.setAttribute("data-dragging","1")},onDragEnd:S=>{S.currentTarget.removeAttribute("data-dragging")},"data-urgent":n.priority==="urgent"?"1":"0","data-running":u?"1":"0","data-blocked":p===null?"0":"1","data-nobody":h>0?"1":"0",onClick:()=>r(n.id),title:p===null?n.requirement||n.title:`阻塞:${p.reason||"未填写原因"}`},e("div",{className:"ds-card-title"},n.title),e("div",{className:"ds-meta"},e("span",{className:"ds-dot","data-p":n.priority,title:As[n.priority]}),n.code?e(t,{className:"ds-chip ds-chip-code",title:"需求下的编号"},n.code):null,b!==void 0?e(t,{className:"ds-chip","data-req":"1",title:`需求 ${b.code||b.id}|${b.title}${i===void 0?"":"(点一下只看这条需求)"}`,onClick:S=>{i!==void 0&&(S.stopPropagation(),i(b.id))}},`📄 ${b.code||b.title||"需求"}`):e(t,{className:"ds-chip","data-req-missing":"1",title:"这张卡还没挂到需求上:点开卡片,在「计划」里选一条需求,编号会自动补",onClick:S=>{S.stopPropagation(),r(n.id)}},"未挂需求"),f!==void 0?e(t,{className:"ds-chip","data-proj":"1",title:`${f.name}${l===void 0?"":"(点一下只看这个项目)"}`,onClick:S=>{l!==void 0&&(S.stopPropagation(),l(f.id))}},f.key||f.name):null,v!==void 0?e(t,{className:"ds-chip","data-iter":"1",title:`迭代 ${v.name}(${v.start||"未定"} → ${v.due||"未定"})`},`🗓 ${v.name||v.id}`):null,x!==void 0?e(t,{className:"ds-chip","data-svc":"1",title:`服务 ${x.name}${x.repoPath?`|${x.repoPath}`:""}(worktree 从这里切)`},`📦 ${x.name}`):(n.service??"")!==""?e(t,{className:"ds-chip","data-svc-missing":"1",title:`卡上记的服务 ${n.service} 已经不在项目里了(服务被改名或删除),重新选一个`},"📦 服务已失效"):null,n.design===null||n.design===void 0||n.design.status==="approved"?null:e(t,{className:"ds-chip","data-design":n.design.status},n.design.status==="changes_requested"?"设计要改":"设计待评审"),n.design?.diff===null||n.design?.diff===void 0?null:e(t,{className:"ds-chip","data-diff":n.design.diff.percent},`还原度 ${Math.max(0,100-n.design.diff.percent).toFixed(1)}%${(()=>{const S=n.design.diffHistory??[];if(S.length<2)return"";const C=S[0].percent-S[1].percent;return C===0?"(持平)":C>0?`(−${C.toFixed(1)})`:`(+${Math.abs(C).toFixed(1)})`})()}`),n.design?.spec===null||n.design?.spec===void 0?null:e(t,{className:"ds-chip","data-spec":n.design.spec.violations,title:(n.design.spec.top??[]).map(S=>`${S.value} ×${S.count}${S.sample===""?"":` — ${S.sample}`}`).join(`
|
|
15
|
-
`)||"没有野值"},n.design.spec.violations>0?`规范 ${n.design.spec.violations} 处`:"规范达标"),n.type==="bug"?e(t,{className:"ds-chip ds-chip-bug","data-sev":n.severity??"p2"},`BUG ${String(n.severity||"p2").toUpperCase()}`):null,n.sla!==null&&n.sla!==void 0&&n.status!=="done"?e(t,{className:"ds-chip","data-sla":n.sla.state,title:`SLA ${n.sla.hours} 小时,应修于 ${new Date(n.sla.dueAt).toLocaleString("zh-CN")}`},n.sla.state==="overdue"?`⏰ 逾期 ${Math.max(1,Math.round(Math.abs(n.sla.remaining)/36e5))}h`:n.sla.state==="due_soon"?"⏰ 快到时限":`⏰ 剩 ${Math.max(1,Math.round(n.sla.remaining/36e5))}h`):null,n.duplicateOf?e(t,{className:"ds-chip",title:"和另一张缺陷是同一件事"},"重复"):null,(Number(n.reopenCount)||0)>0?e(t,{className:"ds-chip",title:`${n.reopenCount} 次修完又被打开`},`重开 ${n.reopenCount}`):null,p!==null?e(t,{className:"ds-chip ds-chip-blocked"},"⛔ 阻塞"):null,e(t,{className:"ds-chip","data-role":c.expert?.role||n.role,"data-open":c.label==="未指派"?"1":"0",title:c.note===void 0||c.note===""?c.label:`${c.label} · ${c.note}`},c.label),n.domain?e(t,{className:"ds-chip"},n.domain):null,u?e(t,{className:"ds-chip ds-chip-ai"},"AI 处理中"):null),p!==null?e("div",{className:"ds-blocked-line"},p.reason||"未填写原因"):null,e("div",{className:"ds-card-foot"},e("span",{},n.id),n.dueAt>0?e("span",{"data-overdue":y?"1":"0",style:y?{color:"#e5484d",fontWeight:600}:null},`· ${Wa(n.dueAt)}${y?" 逾期":""}`):null,k.total>0?e("span",{title:"验收清单"},`· ☑ ${k.done}/${k.total}`):null,d>0?e("span",{title:"已登记交付物"},`· 📎 ${d}`):null,g.total>0?e("span",{className:g.fail>0?"ds-case-fail":"",title:`测试用例:通过 ${g.pass}/${g.total}${g.fail>0?`,不通过 ${g.fail}`:""}`},`· ${g.fail>0?"❌":"✅"} ${g.pass}/${g.total}`):null,h>0?e("span",{className:"ds-card-warn",title:`${h} 件交付物还没写正文,云盘文档里只有标题`},"● 缺正文"):null,(n.coding?.files?.length??0)>0?e("span",{title:"AI Coding 改动文件数"},`· ⌥ ${n.coding.files.length}`):null,Yl(n)>0?e("span",{},`· ${Yl(n)} 评论`):null,e("span",{style:{marginLeft:"auto"}},
|
|
16
|
-
`).map(t=>t.trim()).filter(t=>t!=="").map(t=>{const[a,n,r]=t.split("|").map(c=>c.trim()),s=a.indexOf(" "),o=s>0?a.slice(0,s).toUpperCase():"GET",i=s>0?a.slice(s+1).trim():a,l={method:o,url:i};if(n!==void 0&&/^\d{3}$/.test(n)&&(l.expectStatus=Number(n)),r!==void 0&&r!==""){const c=r.indexOf("="),u=c>0?r.slice(0,c).trim():(r.split(".").pop()??"").trim(),p=c>0?r.slice(c+1).trim():r;u!==""&&p!==""&&(l.extract={[u]:p})}return l}).filter(t=>t.url!=="").slice(0,20),
|
|
17
|
-
`).map(je=>je.trim()).filter(je=>je!=="")),await a("/task/case",{id:d.id,action:"add",cases:[ne]}),le({title:"",expected:"",steps:"",stepsText:"",type:"functional",priority:"p2",preconditions:""}),await S()}catch(j){R(j instanceof Error?j.message:String(j))}finally{E(!1)}}},Me=async(m,j)=>{E(!0),R(null),P(null);try{const ne=await a("/task/case",{id:d.id,action:"update",caseId:m.id,result:j}),je=ne?.bug??null;if(j==="fail"&&je!==null){const rt=String(je.code??"")!==""?je.code:je.id;P(`用例判失败,已自动登记缺陷 ${rt}(挂在同一条需求下,父任务指向本卡)。`)}else ne?.error&&P(`用例已更新,但自动建缺陷失败:${ne.error}`);await S()}catch(ne){R(ne instanceof Error?ne.message:String(ne))}finally{E(!1)}},ht=async m=>{H({busy:!0,note:""}),R(null);try{const j=await a("/task/case/run",{id:d.id,caseId:m,by:"我在界面里跑的"}),ne=j?.run??{},je=(j?.bugs??[]).filter(cs=>cs.created===!0).length,rt=[`跑了 ${ne.total??0} 条:通过 ${ne.passed??0},不通过 ${ne.failed??0}`];je>0&&rt.push(`自动开缺陷 ${je} 张`),H({busy:!1,note:rt.join(",")}),await S()}catch(j){H({busy:!1,note:j instanceof Error?j.message:String(j)})}},da=async()=>{be({busy:!0,note:""}),R(null);try{const m=await a("/task/cases/generate",{id:d.id}),j=m?.added>0?`已生成 ${m.added} 条用例,这张卡现在共 ${m.total} 条`:`没生成用例:${m?.reason??"没有可用的验收条件"}`;be({busy:!1,note:j}),await S()}catch(m){be({busy:!1,note:m instanceof Error?m.message:String(m)})}},st=async m=>{E(!0),R(null);try{await a("/task/case",{id:d.id,action:"remove",caseId:m.id}),await S()}catch(j){R(j instanceof Error?j.message:String(j))}finally{E(!1)}},Ie=async m=>{E(!0),R(null),P(null);try{await a("/task/case",{id:d.id,action:"update",caseId:m.id,flaky:m.flaky!==!0}),P(m.flaky===!0?"已取消不稳定标记":"已标记为不稳定用例:以后失败不会自动开缺陷"),await S()}catch(j){R(j instanceof Error?j.message:String(j))}finally{E(!1)}},Ke=async()=>{const m=Y.title.trim();if(m!==""){E(!0),R(null),P(null);try{const j=await a("/task/artifact",{id:d.id,action:"add",artifact:{kind:Y.kind,title:m,ref:Y.ref.trim(),content:Y.content,status:"delivered"}});I({kind:Y.kind,title:"",ref:"",content:""}),P("已登记,正在归档到飞书云盘…"),await S();try{const je=((await a("/task/artifact/sync",{id:d.id}))?.written??[])[0];P(je?.doc?.url?`已归档到飞书云盘:${je.doc.url}`:"归档失败,稍后可点「同步到云盘」重试。"),await S()}catch{P("登记成功,但归档失败:可点「同步到云盘」重试。")}}catch(j){R(j instanceof Error?j.message:String(j))}finally{E(!1)}}},In=async m=>{if(O!==null){E(!0),R(null),P(null);try{const j=O.content;await a("/task/artifact",{id:d.id,action:"update",artifactId:m.id,artifact:{content:j}}),K(null),He(ne=>({...ne,[m.id]:j})),await S();try{const je=((await a("/task/artifact/sync",{id:d.id,artifactId:m.id}))?.written??[])[0]?.doc;P(je?.url?`正文已更新并同步:${je.url}`:"正文已保存,归档失败可再点「更新」。"),await S()}catch{P("正文已保存,归档失败可再点「更新」。")}}catch(j){R(j instanceof Error?j.message:String(j))}finally{E(!1)}}},sn=async m=>{E(!0),R(null),P(null);try{const j=await a("/task/artifact/sync",{id:d.id,artifactId:m.id}),ne=(j?.written??[])[0]?.doc,je=(j?.errors??[])[0];P(ne?.url?`已归档:${ne.url}`:`归档失败:${je?.error??"未知原因"}`),await S()}catch(j){R(j instanceof Error?j.message:String(j))}finally{E(!1)}},IE=async()=>{E(!0),R(null),P(null);try{const m=await a("/task/artifact/sync",{id:d.id}),j=(m?.written??[]).length,ne=(m?.errors??[]).length;P(`已归档 ${j} 件${ne>0?`,${ne} 件失败:${m.errors[0]?.error??""}`:"。"}`),await S()}catch(m){R(m instanceof Error?m.message:String(m))}finally{E(!1)}},RE=async(m,j)=>{E(!0),R(null);try{await a("/task/artifact",{id:d.id,action:"update",artifactId:m.id,artifact:{status:j}}),await S()}catch(ne){R(ne instanceof Error?ne.message:String(ne))}finally{E(!1)}},AE=async m=>{E(!0),R(null);try{await a("/task/artifact",{id:d.id,action:"remove",artifactId:m.id}),await S()}catch(j){R(j instanceof Error?j.message:String(j))}finally{E(!1)}},jE=()=>Ue({agent:q?.agent??"",model:q?.model??"",branch:q?.branch??"",context:q?.context??"",total:String(q?.unitTests?.total??0),passed:String(q?.unitTests?.passed??0)}),Rp=async m=>{if(!(m==="remove"&&!await l("回收 worktree 会删掉这个目录和分支,未合并的改动会丢,确定?",{title:"回收 worktree",danger:!0,okText:"回收"}))){E(!0),R(null),ze("");try{const j=await a("/task/worktree",{id:d.id,action:m});m==="list"?ze(String(j.output??"").replace(/\s+/g," ").slice(0,400)||"(没有 worktree)"):j.ok===!0?ze(m==="create"?"已建好 worktree":"已回收"):ze(j.skipped||j.result?.error||"没成功"),m!=="list"&&await S()}catch(j){ze(j instanceof Error?j.message:String(j))}finally{E(!1)}}},DE=async()=>{if(_e===null)return;const m=Math.max(0,Number(_e.total)||0),j=Math.min(m,Math.max(0,Number(_e.passed)||0));E(!0),R(null);try{await a("/task/coding",{id:d.id,action:"update",coding:{agent:_e.agent.trim(),model:_e.model.trim(),branch:_e.branch.trim(),context:_e.context,unitTests:{total:m,passed:j}}}),Ue(null),await S()}catch(ne){R(ne instanceof Error?ne.message:String(ne))}finally{E(!1)}},Py=async m=>{E(!0),R(null);try{await a("/task/coding",{id:d.id,action:"review",status:m,note:qa.trim()}),Tn(""),await S()}catch(j){R(j instanceof Error?j.message:String(j))}finally{E(!1)}},OE=async()=>{E(!0),R(null);try{await a("/task/coding",{id:d.id,action:"merge"}),await S()}catch(m){R(m instanceof Error?m.message:String(m))}finally{E(!1)}},LE=async()=>{Vt({busy:!0,line:"",ok:null});try{const m=await a("/task/coding/verify",{id:d.id}),j=m.report??{};j.skipped!==void 0?Vt({busy:!1,line:String(j.skipped),ok:!1}):Vt({busy:!1,line:String(m.line??""),ok:j.ok===!0}),await S()}catch(m){Vt({busy:!1,line:m instanceof Error?m.message:String(m),ok:!1})}},ME=async()=>{const m=await c("设计稿链接(Figma / 蓝湖 / 图片都行)",{title:"设计评审",defaultValue:d.design?.link??""});if(m===null)return;const j=await c("状态:pending 待评审 / changes_requested 要改 / approved 通过",{title:"设计评审",defaultValue:d.design?.status??"pending"});if(j!==null){E(!0),R(null),P(null);try{const ne=await a("/task/design",{id:d.id,design:{link:m,status:j,note:d.design?.note??""}});P("设计已保存:"+String(ne?.design?.status??j)),await S()}catch(ne){R(ne instanceof Error?ne.message:String(ne))}finally{E(!1)}}},zE=async()=>{E(!0),R(null),P(null);try{const j=(await a("/coding/gitlab",{id:d.id}))?.facts??null;P(j===null?"核对完成,但没有拿到结果":`GitLab 核对:文件 ${j.files.declared}→${j.files.actual} · 提交 ${j.commits.declared}→${j.commits.actual}${j.pipeline?` · 流水线 ${j.pipeline}`:""}${(j.mismatches??[]).length>0?` · ⚠ ${j.mismatches.join(";")}`:" · ✅ 一致"}`),await S()}catch(m){R(m instanceof Error?m.message:String(m))}finally{E(!1)}},FE=(h.statuses.find(m=>m.id===d.status)??{}).label??d.status,_y=d.dispatch?.expert?js(h.config??{},{kind:"expert",id:d.dispatch.expert}):"";return e("div",{className:"ds-drawer-wrap",onClick:m=>{m.target===m.currentTarget&&y()}},e("div",{className:"ds-drawer"},e("div",{className:"ds-dw-head"},e("div",{className:"ds-grow"},e("div",{className:"ds-dw-title"},d.title),e("div",{className:"ds-dw-sub"},`${d.id} · ${FE}${_y===""?"":` · ${_y}`} · 更新 ${Ye(d.updatedAt)}`)),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"设计稿链接 + 评审状态;被配置成设计闸门的列,评审不通过进不去",onClick:()=>void ME()},"设计:"+(fx[d.design?.status]??"未登记")),e("button",{className:"ds-btn",onClick:y},"关闭"),(Number(d.agentFailures)||0)>0?o(d.retryAt>0?`下一次自动重试:${Ye(d.retryAt)}`:"失败次数已用完,重置后可以重新派单",e("button",{className:"ds-btn",disabled:C,"data-agent-failed":"1",onClick:()=>void Qt()},`AI 失败 ${Number(d.agentFailures)||0} 次 · 重新派单`)):null),n("TabsBar")!==null?e(n("TabsBar"),{items:_t.map(m=>({id:m.id,label:m.label,count:m.count})),value:nt,onChange:m=>et(m),className:"ds-dw-shadcn-tabs"}):e("div",{className:"ds-dw-tabs"},_t.map(m=>e("button",{key:m.id,className:"ds-dw-tab","data-on":nt===m.id?"1":"0",onClick:()=>et(m.id)},m.label,m.count===""||m.count===void 0||m.count===null?null:e("span",{className:"ds-dw-tab-count"},String(m.count))))),e("div",{className:"ds-dw-body",ref:V,"data-pane":nt},e("div",{className:"ds-meta"},e(f,{className:"ds-chip"},d.id),d.type==="bug"?e(f,{className:"ds-chip ds-chip-bug","data-sev":d.severity??"p2"},`BUG ${String(d.severity||"p2").toUpperCase()}`):e(f,{className:"ds-chip"},zo[d.type]??d.type),e(f,{className:"ds-chip"},`当前列:${h.statuses.find(m=>m.id===d.status)?.label??d.status}`),e(f,{className:"ds-chip","data-role":d.dispatch?.state==="running"&&d.dispatch?.expert?void 0:d.role,"data-open":Bo(d,h.config??{}).label==="未指派"?"1":"0",title:Bo(d,h.config??{}).note},`负责:${Bo(d,h.config??{}).label}`),d.type==="bug"?e(x,{className:"ds-select",style:{height:20,fontSize:11,padding:"0 4px"},value:d.severity||"p2",title:"严重级别",onChange:m=>void jt({severity:m.target.value})},["p0","p1","p2","p3"].map(m=>e("option",{key:m,value:m},ql[m]))):null,e(f,{className:"ds-chip"},As[d.priority]??d.priority),e(f,{className:"ds-chip",title:"点一下改业务领域(决定派给同领域专家)",style:{cursor:"pointer"},onClick:async()=>{const m=await c("业务领域(如 支付 / 风控 / 会员),留空表示不限",{title:"改业务领域",defaultValue:d.domain||""});m!==null&&jt({domain:m})}},d.domain?`领域:${d.domain}`:"领域:未标"),e("span",{},`创建 ${Ye(d.createdAt)}`),e("span",{},`更新 ${Ye(d.updatedAt)}`)),e("div",{className:"ds-dw-cols"},e("div",{className:"ds-dw-col"},e("div",{className:"ds-sec",style:$e("overview")},e("div",{className:"ds-sec-head"},"推进到",e("span",{className:"ds-hint"},"点一下就会移动卡片,并触发对应列的 AI")),e("div",{className:"ds-listrow-actions"},(()=>{const m=h.statuses,j=m.findIndex(Ct=>Ct.id===d.status),ne=m[j+1]??null,je=m.filter(Ct=>Ct.id!==d.status&&(ne===null||Ct.id!==ne.id)),rt=je.filter(Ct=>m.findIndex(ka=>ka.id===Ct.id)>j),cs=je.filter(Ct=>m.findIndex(ka=>ka.id===Ct.id)<j);return[ne===null?null:e("button",{key:"next",className:"ds-btn ds-btn-primary",disabled:C,title:"推进到下一列,下一列的 AI 会接手",onClick:()=>void jt({status:ne.id,role:ne.role})},`推进到「${ne.label}」`),je.length===0?null:e(x,{key:"other",className:"ds-select",value:"",disabled:C,onChange:Ct=>{const ka=Ct.target.value;if(ka==="")return;const Ap=m.find(BE=>BE.id===ka);Ap!==void 0&&jt({status:Ap.id,role:Ap.role})}},e("option",{value:""},`其他状态(${je.length})`),...rt.map(Ct=>e("option",{key:Ct.id,value:Ct.id},`→ ${Ct.label}`)),...cs.map(Ct=>e("option",{key:Ct.id,value:Ct.id},`← ${Ct.label}(退回,AI 会重跑)`)))].filter(Boolean)})())),e("div",{className:"ds-sec",style:$e("overview")},e("div",{className:"ds-sec-head"},"准出检查",e("span",{className:"ds-hint"},"进「已完成」之前必须过这一关:清单全勾、没有失败用例、不在阻塞、有人签字")),e("div",{className:"ds-sec-body"},wa===null?e("div",{className:"ds-row",style:{gap:8,alignItems:"center"}},e("button",{className:"ds-btn",onClick:()=>void re()},"检查一下"),e("span",{className:"ds-hint"},"点一下看这张卡还差什么才能收口")):e("div",{className:"ds-gate","data-ready":wa.ready?"1":"0"},e("div",{className:"ds-gate-head"},e("b",null,wa.ready?"✅ 可以进「已完成」":`⛔ 还差 ${wa.blockers.length} 项`),e("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void re()},"重新检查")),(wa.blockers??[]).map(m=>e("div",{key:m,className:"ds-gate-item","data-kind":"block"},`⛔ ${m}`)),(wa.warnings??[]).map(m=>e("div",{key:m,className:"ds-gate-item","data-kind":"warn"},`⚠ ${m}`)),(wa.blockers??[]).length===0&&(wa.warnings??[]).length===0?e("div",{className:"ds-hint"},"没有遗留项。"):null),d.signoff===null||d.signoff===void 0?e("div",{className:"ds-row",style:{gap:8,alignItems:"center",flexWrap:"wrap"}},e(u,{className:"ds-input",style:{flex:"1 1 260px"},value:X,placeholder:"验收签字:验了什么、遗留什么",onChange:m=>B(m.target.value)}),e("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void ke("sign")},"签字确认")):e("div",{className:"ds-gate-sign"},e("span",null,`✍ ${d.signoff.by} 于 ${new Date(d.signoff.at).toLocaleString()} 签字:${d.signoff.note}`),e("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void ke("clear")},"取消签字")))),e("div",{className:"ds-sec",style:$e("overview")},e("div",{className:"ds-sec-head"},"阻塞",e("span",{className:"ds-hint"},"卡住了打个标,卡留在本列停住,不会被自动往下派;怎么继续由人定")),Ve===null?e("div",{className:"ds-sec-body"},e("div",{className:"ds-hint"},"缺信息、缺权限、等外部依赖、测试过不去——都可以标阻塞,别硬编。"),e("div",{className:"ds-listrow-actions"},e("button",{className:"ds-btn ds-btn-ghost","data-warn":"1",disabled:C,onClick:()=>void Ge()},"⛔ 标记阻塞"))):e("div",{className:"ds-sec-body"},e("div",{className:"ds-blocked-box"},e("div",{style:{fontWeight:600}},`⛔ ${Ve.reason||"未填写原因"}`),e("div",{className:"ds-hint"},`${Ve.by||"人"} · ${Ye(Ve.at)} · 停在「${h.statuses.find(m=>m.id===d.status)?.label??d.status}」`)),e("div",{className:"ds-hint"},"怎么继续:"),e("div",{className:"ds-listrow-actions"},e("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void We("resume")},"继续,交本列负责人"),e("button",{className:"ds-btn",disabled:C,onClick:()=>void We("advance")},"推进到下一列"),e(x,{className:"ds-select",style:{width:190},value:W,disabled:C,onChange:m=>J(m.target.value)},e("option",{value:""},"选一个专家…"),(h.config?.experts??[]).filter(m=>m.enabled!==!1).map(m=>e("option",{key:m.id,value:m.id},`${m.emoji} ${m.name}`))),e("button",{className:"ds-btn",disabled:C||W==="",onClick:()=>void We("assign",W)},"改派给他"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>void We("clear")},"只解除,先不派")))),e("div",{className:"ds-sec",style:$e("overview")},e("div",{className:"ds-sec-head"},"AI 处理",e("span",{className:"ds-hint"},"默认用本列负责人;也可以临时换人")),e("div",{className:"ds-sec-body"},e("div",{className:"ds-hint"},d.dispatch?.state==="running"?`${js(h.config??{},{kind:"expert",id:d.dispatch.expert??d.dispatch.role})||"AI"} 处理中 · 起于 ${Ye(d.dispatch.at)}`:d.dispatch?.state==="failed"?`上次派单失败:${d.dispatch.error??"未知原因"}`:d.dispatch?.state==="stopped"?"上次派单已被停止":"这张卡还没有派给 AI"),e("div",{className:"ds-field",style:{marginTop:4}},e("div",{className:"ds-label"},"派给谁"),e(x,{className:"ds-select",value:W,disabled:C,onChange:m=>J(m.target.value)},e("option",{value:""},"用本列负责人"),(h.config?.experts??[]).filter(m=>m.enabled!==!1).map(m=>e("option",{key:m.id,value:m.id},`${m.emoji} ${m.name}`)))),e("div",{className:"ds-listrow-actions",style:{marginTop:8}},e("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void Le()},"马上处理"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C||d.dispatch?.state!=="running",onClick:()=>void _n()},"停止")))),e("div",{className:"ds-sec",style:$e("content")},e("div",{className:"ds-sec-head"},"内容"),e("div",{className:"ds-field"},e("div",{className:"ds-label"},"标题"),e(u,{className:"ds-input",value:Fe.title,onChange:m=>xt({...Fe,title:m.target.value})})),e("div",{className:"ds-field"},e("div",{className:"ds-label"},"需求 / 背景 / 验收标准"),String(Fe.requirement??"").trim()===""?null:e("div",{className:"ds-md-preview ds-reader","data-task-md":"1",style:{maxHeight:220}},s(Fe.requirement)),e(b,{className:"ds-textarea",rows:String(Fe.requirement??"").trim()===""?4:8,value:Fe.requirement,placeholder:"这张卡要解决什么、背景是什么、做到什么算完成——AI 接手前最好写清楚。",onChange:m=>xt({...Fe,requirement:m.target.value})}),String(Fe.requirement??"").trim()===""?e("div",{className:"ds-hint"},"这张卡还没有需求描述:专家只能按标题猜。补完点下面的「保存改动」。"):null),e("div",{className:"ds-field"},e("div",{className:"ds-label"},"对应功能点"),(()=>{const m=(h.requirements??[]).find(ne=>ne.id===d.requirementId);if(m===void 0)return e("div",{className:"ds-hint"},"这张卡还没挂需求,先在「计划」里挂到某个需求,才能选功能点。");const j=m.points??[];return j.length===0?e("div",{className:"ds-hint"},`需求 ${m.code||m.id} 还没拆功能点,去需求页「功能点与可追溯矩阵」加几条。`):e(x,{className:"ds-select",value:Fe.pointId??"",onChange:ne=>xt({...Fe,pointId:ne.target.value})},e("option",{value:""},"不归到具体功能点"),j.map(ne=>e("option",{key:ne.id,value:ne.id},`${ne.id} ${ne.title}`)))})()),e("div",{className:"ds-row"},e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"GitLab Issue"),e(u,{className:"ds-input",value:Fe.gitlabIssue,onChange:m=>xt({...Fe,gitlabIssue:m.target.value})})),e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"GitLab MR"),(d.gitlabMR?.iid??0)>0?e("div",{className:"ds-art-row",style:{padding:"6px 0",borderBottom:"none"}},e(f,{className:"ds-chip","data-on":d.gitlabMR.state==="opened"?"1":void 0},`MR !${d.gitlabMR.iid} · ${d.gitlabMR.state}`),e("div",{className:"ds-grow"},e("div",{className:"ds-art-title"},d.gitlabMR.title||`MR !${d.gitlabMR.iid}`),d.gitlabMR.url===""?null:e("div",{className:"ds-art-ref"},d.gitlabMR.url),(d.gitlabMR.sourceBranch??"")===""?null:e("div",{className:"ds-art-ref"},`分支 ${d.gitlabMR.sourceBranch} → ${d.gitlabMR.targetBranch||"—"}`),d.gitlabMR.pipeline===null||d.gitlabMR.pipeline===void 0?null:e("div",{className:"ds-art-ref"},e(f,{className:"ds-chip","data-sla":d.gitlabMR.pipeline.status==="failed"?"overdue":void 0},`流水线 ${d.gitlabMR.pipeline.status}`)," ",d.gitlabMR.pipeline.url===""?null:e("a",{className:"ds-link",href:d.gitlabMR.pipeline.url,target:"_blank",rel:"noreferrer"},`#${d.gitlabMR.pipeline.id}`)))):e(u,{className:"ds-input",placeholder:"还没关联 MR;提了 MR 后会自动同步",value:Fe.gitlabMR,onChange:m=>xt({...Fe,gitlabMR:m.target.value})}))),e("div",{className:"ds-row"},e("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void jt((d.gitlabMR?.iid??0)>0?{...Fe,gitlabMR:void 0}:Fe)},"保存改动"),e("button",{className:"ds-btn",disabled:C,onClick:ie},"只删卡"))),e("div",{className:"ds-sec",style:$e("plan")},e("div",{className:"ds-sec-head"},"计划",e("span",{className:"ds-hint"},"这张卡属于哪个项目/迭代、谁提的、什么时候要")),e("div",{className:"ds-sec-body"},e("div",{className:"ds-row"},e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"业务项目"),e(x,{className:"ds-select",value:F.project,onChange:m=>M({...F,project:m.target.value,iteration:"",service:""})},e("option",{value:""},"不属于任何项目"),(h.config?.projects??[]).map(m=>e("option",{key:m.id,value:m.id},`${m.key?`${m.key} · `:""}${m.name}`)))),e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"迭代"),e(x,{className:"ds-select",value:F.iteration,onChange:m=>M({...F,iteration:m.target.value})},e("option",{value:""},"不指定迭代"),((h.config?.projects??[]).find(m=>m.id===F.project)?.iterations??[]).map(m=>e("option",{key:m.id,value:m.id},m.name))))),((h.config?.projects??[]).find(m=>m.id===F.project)?.services??[]).length===0?null:e("div",{className:"ds-field"},e("div",{className:"ds-label"},"服务(决定用哪个 git 路径切 worktree)"),e(x,{className:"ds-select",value:F.service??"",onChange:m=>M({...F,service:m.target.value})},e("option",{value:""},"用项目级默认目录"),((h.config?.projects??[]).find(m=>m.id===F.project)?.services??[]).map(m=>e("option",{key:m.id,value:m.id},`${m.name}${m.repoPath?` · ${m.repoPath}`:""}`))),e("div",{className:"ds-hint"},"一个项目有多个服务(每个服务一个 git 路径)时,这里决定这张卡改哪个服务。")),e("div",{className:"ds-row"},e("div",{className:"ds-field",style:{flex:2}},e("div",{className:"ds-label"},"业务负责人"),e(u,{className:"ds-input",value:F.owner,placeholder:"提需求的人,例如 张伟",onChange:m=>M({...F,owner:m.target.value})})),e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"期望完成"),e(u,{className:"ds-input",type:"date",value:F.due,onChange:m=>M({...F,due:m.target.value})}))),e("div",{className:"ds-row"},e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"所属版本"),e(x,{className:"ds-select",value:F.releaseId,onChange:m=>M({...F,releaseId:m.target.value})},e("option",{value:""},"不挂版本"),(h.releases??[]).map(m=>e("option",{key:m.id,value:m.id},`${m.version||m.id} ${m.name}`.trim())))),e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"编号"),e("div",{className:"ds-hint"},d.code===""?"—(未挂需求)":d.code))),e("div",{className:"ds-listrow-actions"},e("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void Do()},"保存计划"),d.dueAt>0&&d.dueAt<Date.now()&&d.status!=="done"?e("span",{className:"ds-err"},"已逾期"):null))),e("div",{className:"ds-sec",style:$e("plan")},e("div",{className:"ds-sec-head"},"代码隔离(git worktree)",e("span",{className:"ds-hint"},me===null?"这张卡还没有独立工作目录":"这张卡自己的分支与目录")),e("div",{className:"ds-sec-body"},me===null?e("div",{className:"ds-field"},e("div",{className:"ds-hint"},"开启「代码隔离 = worktree」并给项目配好本机代码目录后,派单会自动切一条 task/<编号> 分支;也可以先手动建一个。"),e("div",{className:"ds-listrow-actions"},e("button",{className:"ds-btn",disabled:C,onClick:()=>void Rp("create")},"建 worktree"))):e("div",{className:"ds-field"},e("div",{className:"ds-code-line"},`${me.branch} · 基线 ${me.base}`),e("div",{className:"ds-code-line"},me.path),e("div",{className:"ds-hint"},`仓库 ${me.repo}${Ae?` · ${Ae}`:""}`),e("div",{className:"ds-listrow-actions"},e("button",{className:"ds-btn",disabled:C,onClick:()=>void Rp("list")},"看 git worktree 列表"),e("button",{className:"ds-btn",disabled:C,onClick:()=>void Rp("remove")},"回收 worktree"))),Ae&&me===null?e("div",{className:"ds-hint"},Ae):null)),e("div",{className:"ds-sec",style:$e("coding")},e("div",{className:"ds-sec-head"},"AI Coding 执行记录",e("span",{className:"ds-hint"},q===null?"改代码要留记录:谁、什么模型、改了什么":"研发 agent 登记,人也可以补录或评审")),e("div",{className:"ds-sec-body"},q===null?e("div",{className:"ds-empty"},"还没有执行记录。"):e("div",{className:"ds-code-box"},e("div",{className:"ds-code-head"},e(f,{className:"ds-chip","data-review":q.review.status},ax[q.review.status]??q.review.status),e("div",{className:"ds-grow"},e("div",{className:"ds-code-line"},[q.agent||"未登记 agent",q.model,q.branch].filter(Boolean).join(" · ")),q.context===""?null:e("div",{className:"ds-hint"},q.context)),e("span",{className:"ds-hint"},q.unitTests.total>0?`单测 ${q.unitTests.passed}/${q.unitTests.total}`:"无单测"),me===null?null:o("拿 worktree 里的 git 记录,比执行记录里自报的提交 / 文件 / 分支",e("button",{className:"ds-btn ds-btn-ghost",disabled:C||Pt.busy,onClick:()=>void LE()},Pt.busy?"核对中…":Pt.line===""?"核对代码事实":"再核对一次")),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"拉 MR 的改动与流水线,和自报的文件数/提交数比一遍",onClick:()=>void zE()},"从 GitLab 核对")),Pt.line===""?q.verified===null||q.verified===void 0?null:e("div",{className:"ds-hint","data-verify":q.verified.ok?"ok":"bad",style:{marginTop:6}},`${q.verified.ok?"✅":"⚠"} 上次核对 ${Ye(q.verified.at)}:分支 ${q.verified.branch} · 提交 ${q.verified.commitCount.actual} 个 · 改动 ${q.verified.fileCount.actual} 个文件${q.verified.missingCommits.length+q.verified.missingFiles.length===0?"":` · ${q.verified.missingCommits.length+q.verified.missingFiles.length} 项对不上`}`):e("div",{className:"ds-hint","data-verify":Pt.ok===!0?"ok":"bad",style:{marginTop:6}},`${Pt.ok===!0?"✅":"⚠"} ${Pt.line}`),(q.commits??[]).length===0?null:e("div",{className:"ds-code-list"},q.commits.slice(0,6).map(m=>e("div",{key:m.id,className:"ds-code-item"},e("code",null,m.sha.slice(0,8)),e("span",{className:"ds-grow"},m.message||"(无提交说明)"),e("span",{className:"ds-hint"},`${m.files} 文件`))),q.commits.length>6?e("div",{className:"ds-hint"},`还有 ${q.commits.length-6} 次提交`):null),(q.files??[]).length===0?null:e("div",{className:"ds-code-files"},q.files.slice(0,12).map(m=>e("span",{key:m.id,className:"ds-code-file","data-change":m.change},`${m.path}${m.additions>0?` +${m.additions}`:""}${m.deletions>0?` -${m.deletions}`:""}`)),q.files.length>12?e("span",{className:"ds-hint"},`还有 ${q.files.length-12} 个`):null),q.review.note===""?null:e("div",{className:"ds-code-note"},`评审意见:${q.review.note}`),e("div",{className:"ds-row"},e(u,{className:"ds-input",style:{flex:1},value:qa,placeholder:"评审意见(可选,写清文件/行为什么/怎么改)",onChange:m=>Tn(m.target.value)}),e("button",{className:"ds-btn",disabled:C,onClick:()=>void Py("approved")},"评审通过"),e("button",{className:"ds-btn",disabled:C,onClick:()=>void Py("changes_requested")},"要求修改"),q.mergedAt>0?e("span",{className:"ds-hint"},`已合并 · ${q.mergedBy||"—"}`):e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>void OE()},"标记已合并"))),_e===null?e("div",{className:"ds-row"},e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:jE},q===null?"手动补录执行记录":"编辑执行记录")):e("div",null,e("div",{className:"ds-row"},e("div",{className:"ds-field",style:{flex:1}},i("Coding Agent","这次改代码的 agent 名字,只作记录,不影响派单"),e(u,{className:"ds-input",value:_e.agent,placeholder:"claude-code / codex / 自研",onChange:m=>Ue({..._e,agent:m.target.value})})),e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"模型"),e(u,{className:"ds-input",value:_e.model,placeholder:"deepseek-v4.1-flash",onChange:m=>Ue({..._e,model:m.target.value})})),e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"分支"),e(u,{className:"ds-input",value:_e.branch,placeholder:"feature/xxx",onChange:m=>Ue({..._e,branch:m.target.value})}))),e("div",{className:"ds-row"},e("div",{className:"ds-field",style:{flex:"0 0 110px"}},i("单测总数","这次执行报的单测总数,可以 agent 写回,也可以手填"),e(u,{className:"ds-input",value:_e.total,onChange:m=>Ue({..._e,total:m.target.value})})),e("div",{className:"ds-field",style:{flex:"0 0 110px"}},i("通过数","通过的条数;少于总数时卡片过不了准出"),e(u,{className:"ds-input",value:_e.passed,onChange:m=>Ue({..._e,passed:m.target.value})})),e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"这次依据的上下文"),e(u,{className:"ds-input",value:_e.context,placeholder:"例如 PRD v1.2 + 架构方案 v1",onChange:m=>Ue({..._e,context:m.target.value})}))),e("div",{className:"ds-row"},e("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void DE()},"保存执行记录"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>Ue(null)},"取消")))))),e("div",{className:"ds-dw-col"},e("div",{className:"ds-sec",style:$e("test")},e("div",{className:"ds-sec-head"},"验收清单",e("span",{className:"ds-hint"},yt.total===0?"这张卡还没有清单":`${ge} / ${yt.total} 已勾`)),e("div",{className:"ds-sec-body"},yt.total===0?null:e("div",{className:"ds-check-progress"},e("div",{className:"ds-check-bar","data-full":ge===yt.total?"1":"0"},e("span",{style:{width:`${yt.total===0?0:Math.round(ge/yt.total*100)}%`}}))),ae===null&&yt.total>0?e("div",{className:"ds-hint"},"载入清单…"):de.map(m=>e("div",{key:m.id,className:"ds-check-row","data-done":m.done?"1":"0"},e(v,{checked:m.done,disabled:C,onChange:()=>void nn(m)}),e("div",{className:"ds-grow"},e("div",{className:"ds-check-text"},m.text,e("span",{className:"ds-hint"},` #${m.id}`)),m.note||m.by?e("div",{className:"ds-hint"},`${m.by?`${m.by} · `:""}${m.at?Ye(m.at):""}${m.note?` · ${m.note}`:""}`):null),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>void ds(m)},"×"))),e("div",{className:"ds-row"},e(u,{className:"ds-input",style:{flex:1},value:w,placeholder:"再加一条验收条目,回车提交",onChange:m=>$(m.target.value),onKeyDown:m=>{m.key==="Enter"&&an()}}),e("button",{className:"ds-btn",disabled:C||w.trim()==="",onClick:()=>void an()},"+ 加一条")),e("div",{className:"ds-hint"},"清单就是「做完」的定义:AI 每完成一项要勾一项并附证据;人也可以直接勾。"))),e("div",{className:"ds-sec",style:$e("deliver")},e("div",{className:"ds-sec-head"},"交付物",e("span",{className:"ds-hint"},"文档、MR、用例、报告——交付要有东西,不只是一句「做完了」;登记后会写成飞书云盘需求文件夹里的一份文档"),_r(d).length>0?e("span",{className:"ds-card-warn",title:"这些交付物还没写正文,点「正文」补上再同步"},`● ${_r(d).length} 件缺正文`):null,(d.artifacts??[]).length>0?e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"把这张卡的交付物全部写进需求文件夹(已归档的会覆盖更新)",onClick:()=>void IE()},"同步到云盘"):null),e("div",{className:"ds-sec-body","data-scroll":"1"},(d.artifacts??[]).length===0?e("div",{className:"ds-empty"},"还没有交付物。"):(d.artifacts??[]).map(m=>e("div",{key:m.id,className:"ds-art-wrap"},e("div",{className:"ds-art-row","data-missing":Ee(m)?"0":"1"},e(f,{className:"ds-chip","data-kind":m.kind},Hp[m.kind]??m.kind),e("div",{className:"ds-grow"},e("div",{className:"ds-art-title"},Ee(m)?null:e("span",{className:"ds-card-warn",style:{marginRight:6},title:"这条交付物还没写正文,云盘文档里只有标题"},"●"),m.title),e("div",{className:"ds-art-ref"},`正文 ${typeof m.contentLength=="number"?m.contentLength:String(m.content??"").length} 字${Ee(m)?"":" · 缺正文"}${m.doc?.url?"":" · 还没归档"}`),m.ref===""?null:e("div",{className:"ds-art-ref"},m.ref),m.doc?.url?e("a",{className:"ds-art-ref",href:m.doc.url,target:"_blank",rel:"noreferrer"},`📄 ${m.doc.name||"云盘文档"}`):m.doc?.error?e("div",{className:"ds-error"},m.doc.error):null),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"直接读正文(Markdown 渲染)",onClick:()=>void at(m)},Ne===m.id?"收起":"阅读"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"编辑正文",onClick:()=>void ct(m)},"正文"),m.doc?.url?e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"用最新正文覆盖云盘文档",onClick:()=>void sn(m)},"更新"):e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"写进需求文件夹",onClick:()=>void sn(m)},"归档"),e(x,{className:"ds-select",style:{width:92,height:22,fontSize:11},value:m.status,disabled:C,onChange:j=>void RE(m,j.target.value)},Zy.map(j=>e("option",{key:j,value:j},tx[j]))),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>void AE(m)},"×")),Ne===m.id?e("div",{className:"ds-md-preview ds-reader"},xe[m.id]===void 0&&Ee(m)?e("span",{className:"ds-hint"},"读取中…"):ye(m).trim()===""?e("span",{className:"ds-hint"},"这条交付物还没有正文。"):s(ye(m))):null)),O===null?null:e("div",{style:{marginTop:8}},e(b,{className:"ds-input",style:{width:"100%"},rows:8,value:O.content,placeholder:"写清楚做了什么、结论、风险。这段会原样写进云盘文档正文。",onChange:m=>K({...O,content:m.target.value})}),e("div",{className:"ds-row",style:{justifyContent:"flex-end",marginTop:6}},e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>K(null)},"取消"),e("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void In({id:O.id})},"保存正文并同步"))),e("div",{className:"ds-row"},e(x,{className:"ds-select",style:{width:104},value:Y.kind,onChange:m=>I({...Y,kind:m.target.value})},Xy.map(m=>e("option",{key:m,value:m},Hp[m]))),e(u,{className:"ds-input",style:{flex:1},value:Y.title,placeholder:"交付物名称,例如 登录模块技术方案",onChange:m=>I({...Y,title:m.target.value})}),e(u,{className:"ds-input",style:{flex:1},value:Y.ref,placeholder:"路径 / 链接 / MR 号",onChange:m=>I({...Y,ref:m.target.value})})),e(b,{className:"ds-input",style:{width:"100%",marginTop:6},rows:5,value:Y.content,placeholder:"交付物正文(Markdown)。这段会原样写成云盘文档的正文:做什么、怎么做、结论、风险。留空也能登记,但云盘里只有标题。",onChange:m=>I({...Y,content:m.target.value})}),e("div",{className:"ds-row",style:{justifyContent:"flex-end",marginTop:6}},e("button",{className:"ds-btn",disabled:C||Y.title.trim()==="",onClick:()=>void Ke()},"登记并归档")))),e("div",{className:"ds-sec",style:$e("test")},e("div",{className:"ds-sec-head"},"测试用例",e("span",{className:"ds-hint"},Je.total===0?"测试同学把用例登记在这里,逐条执行并回填结果":oe),e("button",{className:"ds-btn ds-btn-ghost",disabled:Ce.busy,onClick:()=>void da()},Ce.busy?"生成中…":"✨ 按需求生成"),e("button",{className:"ds-btn ds-btn-ghost",disabled:he.busy||ls.filter(m=>m.http!=null).length===0,onClick:()=>void ht(void 0)},he.busy?"运行中…":"▶ 跑接口用例")),e("div",{className:"ds-sec-body","data-scroll":"1"},he.note===""?null:e("div",{className:"ds-hint"},he.note),Ce.note===""?null:e("div",{className:"ds-hint"},Ce.note),Je.total===0?e("div",{className:"ds-empty"},"还没有用例。"):ae===null?e("div",{className:"ds-hint"},"载入用例…"):ls.map(m=>e("div",{key:m.id,className:"ds-art-row","data-result":m.result},e(x,{className:"ds-select",style:{width:84,height:22,fontSize:11},value:m.result,disabled:C,onChange:j=>void Me(m,j.target.value)},Gp.map(j=>e("option",{key:j,value:j},Vl[j]))),e("div",{className:"ds-grow"},e("div",{className:"ds-art-title"},m.title),e("div",{className:"ds-row",style:{gap:6,alignItems:"center",marginTop:2}},e(f,{className:"ds-chip ds-chip-soft"},Kp[m.type??"functional"]??"功能"),e(f,{className:"ds-chip ds-chip-soft","data-pri":m.priority??"p2"},String(m.priority??"p2").toUpperCase()),String(m.preconditions??"")===""?null:e("span",{className:"ds-hint"},`前置:${m.preconditions}`),(m.steps??[]).length===0?null:e("span",{className:"ds-hint"},`步骤 ${m.steps.length} 条`)),m.expected===""?null:e("div",{className:"ds-art-ref"},`期望:${m.expected}`),m.shell==null?m.http==null?null:e("div",{className:"ds-art-ref"},`接口:${m.http.method} ${m.http.url} → 期望 ${m.http.expectStatus}${m.http.expectContains?` 且含 «${m.http.expectContains}»`:""}`):e("div",{className:"ds-art-ref"},"shell:"+m.shell.command),m.lastRun==null?null:e("div",{className:"ds-art-ref"},`${m.lastRun.ok?"✅":"❌"} 最近执行:${m.lastRun.status===0?m.lastRun.error:`${m.lastRun.status} · ${m.lastRun.ms}ms`}(${new Date(m.lastRun.at).toLocaleString("zh-CN")})`),m.lastRun?.response?e("div",{className:"ds-code-note"},`响应片段:${String(m.lastRun.response).slice(0,400)}${String(m.lastRun.response).length>400?"…":""}`):null,(m.lastRun?.steps??[]).length===0?null:e("div",{className:"ds-art-ref"},`步骤:${m.lastRun.steps.map(j=>`${j.ok?"✅":"❌"} ${j.method} ${j.url}${j.status===0?"":` → ${j.status}`}`).join(";")}`),(m.http?.steps??[]).length===0?null:e(f,{className:"ds-chip ds-chip-soft"},`多步 ${m.http.steps.length}`),((h.requirements??[]).find(j=>j.id===d.requirementId)?.points??[]).length===0?m.pointId?e("div",{className:"ds-art-ref"},`功能点:${m.pointId}`):null:e("div",{className:"ds-row",style:{gap:6,alignItems:"center"}},e("span",{className:"ds-hint"},"功能点"),e(x,{className:"ds-select",style:{width:190,height:26},value:m.pointId??"",onChange:async j=>{try{await a("/task/case",{id:d.id,action:"update",caseId:m.id,pointId:j.target.value}),await S()}catch(ne){R(ne instanceof Error?ne.message:String(ne))}}},e("option",{value:""},"不归功能点"),((h.requirements??[]).find(j=>j.id===d.requirementId)?.points??[]).map(j=>e("option",{key:j.id,value:j.id},`${j.id} ${j.title}`)))),m.note===""?null:e("div",{className:"ds-art-ref"},`记录:${m.note}${m.by?` — ${m.by}`:""}`)),m.http==null?null:e("button",{className:"ds-btn ds-btn-ghost",disabled:he.busy,onClick:()=>void ht(m.id)},"▶"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"标记为不稳定用例:失败时不自动开缺陷","data-flaky":m.flaky===!0?"1":"0",onClick:()=>void Ie(m)},m.flaky===!0?"不稳":"标不稳"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>void st(m)},"×"))),e("div",{className:"ds-row"},e(u,{className:"ds-input",style:{flex:1},value:Z.title,placeholder:"用例:做什么,例如 用错误密码连续登录 5 次",onChange:m=>le({...Z,title:m.target.value})}),e(u,{className:"ds-input",style:{flex:1},value:Z.expected,placeholder:"期望结果,例如 第 5 次返回 429 并锁定 10 分钟",onChange:m=>le({...Z,expected:m.target.value})}),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"加一条 shell 用例:跑命令看退出码与输出(需要先在设置里打开 allowShell)",onClick:()=>void D()},"+ shell"),e("button",{className:"ds-btn",disabled:C||Z.title.trim()==="",onClick:()=>void ce()},"+ 加用例")),e("div",{className:"ds-row",style:{gap:8,flexWrap:"wrap",marginTop:6}},e(x,{className:"ds-select",style:{width:96},value:Z.type??"functional",onChange:m=>le({...Z,type:m.target.value})},Jy.map(m=>e("option",{key:m,value:m},Kp[m]))),e(x,{className:"ds-select",style:{width:84},value:Z.priority??"p2",onChange:m=>le({...Z,priority:m.target.value})},ex.map(m=>e("option",{key:m,value:m},m.toUpperCase()))),e(u,{className:"ds-input",style:{flex:1,minWidth:200},value:Z.preconditions??"",placeholder:"前置条件,例如 会员等级≥银卡、账户余额充足",onChange:m=>le({...Z,preconditions:m.target.value})})),e("div",{className:"ds-field"},e("label",{},"测试步骤(可选,一行一步)"),e(p,{className:"ds-input",rows:2,value:Z.stepsText??"",placeholder:`1. 打开积分抵扣页
|
|
14
|
+
`),i(p))))}return s}return a}function Qe(e){if(typeof e!="number"||e===0)return"—";const t=new Date(e),a=n=>String(n).padStart(2,"0");return`${a(t.getMonth()+1)}-${a(t.getDate())} ${a(t.getHours())}:${a(t.getMinutes())}`}function Wa(e){if(typeof e!="number"||e===0)return"—";const t=new Date(e),a=n=>String(n).padStart(2,"0");return`${a(t.getMonth()+1)}-${a(t.getDate())}`}const Aa={product:"产品",architect:"架构",dev:"研发",qa:"测试"},As={urgent:"紧急",normal:"普通",relaxed:"宽松"},zo={requirement:"需求",bug:"缺陷",design:"设计",dev:"开发",test:"测试",ops:"运维"},ql={p0:"P0 致命",p1:"P1 严重",p2:"P2 一般",p3:"P3 轻微"},Zy=["requirement","design","mr","cases","report","release","doc","screenshot","other"],Hp={requirement:"需求",design:"方案",mr:"MR",cases:"用例",report:"报告",release:"发布",doc:"文档",screenshot:"截图",other:"其它"},Jy=["draft","delivered","accepted"],Gp=["pending","pass","fail","skip"],Vl={pending:"⬜ 未跑",pass:"✅ 通过",fail:"❌ 不通过",skip:"⏭️ 跳过"},ex=["functional","api","ui","performance","security","other"],Kp={functional:"功能",api:"接口",ui:"界面",performance:"性能",security:"安全",other:"其它"},tx=["p0","p1","p2","p3"],ax={draft:"草稿",delivered:"已交付",accepted:"已验收"},nx={pending:"待评审",approved:"评审通过",changes_requested:"要求修改"},Wl={active:"进行中",paused:"暂停",archived:"已归档"},Hl={planned:"未开始",active:"进行中",closed:"已结束"},sx={round_robin:"轮询",best_match:"按专长匹配",lead:"团长分派"},Yp=["draft","review","active","delivered","closed"],Qp={prd:"PRD",proto:"原型",acceptance:"验收标准",other:"其它"},rx=["prd","proto","acceptance","other"],ox={draft:"草稿",review:"评审中",baseline:"已生效"},ix=["draft","candidate","approved","released","rolled_back"],Tr={draft:"草稿",review:"待评审",active:"进行中",delivered:"已交付",closed:"已关闭"},Xp={draft:"草稿",candidate:"待发布",approved:"已审批",released:"已发布",rolled_back:"已回滚"};function Zp(e){if(typeof e!="number"||e===0)return"";const t=new Date(e),a=n=>String(n).padStart(2,"0");return`${t.getFullYear()}-${a(t.getMonth()+1)}-${a(t.getDate())}`}function Pr(e){if(typeof e!="string"||e.trim()==="")return 0;const t=new Date(`${e.trim()}T23:59:00`).getTime();return Number.isFinite(t)?t:0}function Jp(e,t){if(t==null)return"";if(t.kind==="role")return`🎯 ${Aa[t.id]??t.id}`;if(t.kind==="team"){const n=(e.teams??[]).find(r=>r.id===t.id);return n===void 0?"":`👥 ${n.name}`}const a=(e.experts??[]).find(n=>n.id===t.id);return a===void 0?Aa[t.id]??String(t.id??""):`${a.emoji} ${a.name}`}function js(e,t){if(t==null)return"";if(t.kind==="pool"){const a=(t.members??[]).map(n=>Jp(e,n)).filter(n=>n!=="");return a.length===0?"":a.length===1?a[0]:`${a[0]} 等 ${a.length} 位`}return Jp(e,t)}function ef(e){const t=[];for(const a of["product","architect","dev","qa"])t.push({key:"r:"+a,name:"角色 · "+(Aa[a]??a),emoji:"🎯",hint:"按角色位派单,具体人按卡片业务领域挑",group:"角色位"});for(const a of e?.experts??[])a.enabled!==!1&&t.push({key:"e:"+a.id,name:a.name,emoji:a.emoji??"🤖",hint:[a.description,a.domain?`${a.domain} · ${Aa[a.role]??a.role}`:Aa[a.role]??a.role].filter(Boolean).join(" · "),group:"专家"});for(const a of e?.teams??[])t.push({key:"t:"+a.id,name:a.name,emoji:a.emoji??"👥",hint:`团长 ${e?.experts?.find(n=>n.id===a.lead)?.name??"未设"} · ${(a.members??[]).length} 位成员`,group:"专家团"});return t}function Fo(e,t){const a=String(t??"").trim().toLowerCase();return a===""?e:e.filter(n=>`${n.name} ${n.hint}`.toLowerCase().includes(a))}function Bo(e,t){const a=t.experts??[];if(e.dispatch?.state==="running"&&e.dispatch?.expert){const s=a.find(o=>o.id===e.dispatch.expert);if(s!==void 0)return{label:`${s.emoji} ${s.name}`,note:"正在处理",expert:s}}const n=a.find(s=>s.id===e.expert);if(n!==void 0)return{label:`${n.emoji} ${n.name}`,note:"卡上指派",expert:n};const r=t.columns?.[e.status];if(r!==void 0&&Array.isArray(r.members)&&r.members.length>0){if(r.members.length===1){const o=r.members[0],i=js(t,{...o,kind:o.kind});if(i!==""){const l=o.kind==="expert"?a.find(c=>c.id===o.id):void 0;return{label:i,note:"本列候选人",expert:l}}}const s=sx[r.strategy??"round_robin"]??"轮询";return{label:`候选池 ${r.members.length} 人`,note:`本列候选:${r.members.map(o=>js(t,o)).join("、")}(${s})`,expert:void 0}}if(r!==void 0&&r.kind!=="none"){const s=js(t,r);if(s!==""){const o=r.kind==="expert"?a.find(i=>i.id===r.id):void 0;return{label:s,note:"本列负责人",expert:o}}}return{label:"未指派",note:"等人认领",expert:void 0}}function Gl(e){if(e?.caseSummary!==void 0)return e.caseSummary;const t=Array.isArray(e?.cases)?e.cases:[];return{total:t.length,pass:t.filter(a=>a.result==="pass").length,fail:t.filter(a=>a.result==="fail").length}}function Kl(e){if(e?.checkSummary!==void 0)return e.checkSummary;const t=Array.isArray(e?.checklist)?e.checklist:[];return{done:t.filter(a=>a.done).length,total:t.length}}function Yl(e){return typeof e?.commentCount=="number"?e.commentCount:Array.isArray(e?.comments)?e.comments.length:0}function _r(e){return(e.artifacts??[]).filter(t=>{const a=String(t.content??"");return a!==""?a.trim()==="":(typeof t.contentLength=="number"?t.contentLength:0)===0})}function lx({h:e,kit:t,React:a}){function n({className:c,...u}){const p=t("Input");if(p===null)return e("input",{className:c,...u});const{style:f,...v}=u,x=String(c??"").split(/\s+/).filter(b=>b!==""&&b!=="ds-input").join(" ");return e(p,{...v,style:f,className:`h-9 w-full min-w-0 text-sm${x===""?"":" "+x}`})}function r({className:c,...u}){const p=t("Textarea");if(p===null)return e("textarea",{className:c,...u});const{style:f,...v}=u,x=Number(v.rows)>0?Number(v.rows):4,b=String(c??"").split(/\s+/).filter(k=>k!==""&&k!=="ds-input"&&k!=="ds-textarea").join(" ");return e(p,{...v,style:{minHeight:`${Math.max(96,x*22+28)}px`,...f??{}},className:`flex min-h-16 w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm leading-relaxed shadow-sm outline-none transition-[color,box-shadow] placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50${b===""?"":" "+b}`})}function s({className:c,variant:u,...p}){const f=t("Badge");if(f===null)return e("span",{className:c,...p});const v=String(c??""),x=u??(v.indexOf("ds-chip-blocked")>=0||v.indexOf("ds-chip-bug")>=0||p["data-blocked"]==="1"||p["data-danger"]==="1"?"destructive":v.indexOf("ds-chip-code")>=0||p["data-svc-missing"]==="1"?"outline":"secondary");return e(f,{...p,variant:x,className:c})}function o({className:c,checked:u,onChange:p,disabled:f,...v}){const x=t("SwitchBox");return x===null?e("input",{className:c,type:"checkbox",checked:u===!0,disabled:f,onChange:p,...v}):e(x,{bare:!0,checked:u===!0,disabled:f===!0,onChange:b=>{typeof p=="function"&&p({target:{checked:b===!0}})}})}function i(c){const u=[];return a.Children.forEach(c,p=>{a.isValidElement(p)&&(p.type==="option"?u.push({value:String(p.props.value??""),label:String(a.Children.toArray(p.props.children).join(""))}):p.type==="optgroup"&&i(p.props.children).forEach(f=>u.push(f)))}),u}function l({className:c,children:u,value:p,onChange:f,disabled:v,...x}){const b=t("SelectBox");if(b===null)return e("select",{className:c,value:p,onChange:f,disabled:v,...x},u);const k=i(u),g=k.some(y=>y.value===""),d=k.map(y=>g&&y.value===""?{...y,value:"__empty__"}:y);d.length===0&&d.push({value:g?"__empty__":"",label:"—"});const h=p==null?"":String(p);return e(b,{...x,value:g&&h===""?"__empty__":h,options:d,disabled:v,onChange:y=>{typeof f=="function"&&f({target:{value:y==="__empty__"?"":y}})}})}return{TextField:n,TextAreaField:r,ChipField:s,CheckField:o,SelectField:l}}function dx({h:e,kit:t}){function a({title:n,hint:r,onClose:s,footer:o,children:i}){const l=t("SheetDrawer");return l!==null?e(l,{title:n,hint:r,onClose:s,footer:o},i):e("div",{className:"ds-side-wrap",onKeyDown:c=>{c.key==="Escape"&&s()}},e("div",{className:"ds-side-mask",onClick:s}),e("div",{className:"ds-side",role:"dialog","aria-modal":"true"},e("div",{className:"ds-side-head"},e("div",{},e("div",{className:"ds-side-title"},n),r==null?null:e("div",{className:"ds-hint"},r)),e("button",{className:"ds-btn",onClick:s},"关闭")),e("div",{className:"ds-side-body"},i),o==null?null:e("div",{className:"ds-side-foot"},o)))}return a}function cx({h:e,ChipField:t}){function a({task:n,onOpen:r,config:s,requirements:o,onPickRequirement:i,onPickProject:l}){const c=Bo(n,s??{}),u=n.dispatch?.state==="running",p=n.blocked??null,f=(s?.projects??[]).find(S=>S.id===n.project),v=(f?.iterations??[]).find(S=>S.id===n.iteration),x=(f?.services??[]).find(S=>S.id===n.service),b=(o??[]).find(S=>S.id===n.requirementId),k=Kl(n),g=Gl(n),d=(n.artifacts??[]).length,h=_r(n).length,y=n.dueAt>0&&n.dueAt<Date.now()&&n.status!=="done";return e("div",{className:"ds-card",draggable:!0,onDragStart:S=>{S.dataTransfer.setData("text/plain",n.id),S.dataTransfer.effectAllowed="move",S.currentTarget.setAttribute("data-dragging","1")},onDragEnd:S=>{S.currentTarget.removeAttribute("data-dragging")},"data-urgent":n.priority==="urgent"?"1":"0","data-running":u?"1":"0","data-blocked":p===null?"0":"1","data-nobody":h>0?"1":"0",onClick:()=>r(n.id),title:p===null?n.requirement||n.title:`阻塞:${p.reason||"未填写原因"}`},e("div",{className:"ds-card-title"},n.title),e("div",{className:"ds-meta"},e("span",{className:"ds-dot","data-p":n.priority,title:As[n.priority]}),n.code?e(t,{className:"ds-chip ds-chip-code",title:"需求下的编号"},n.code):null,b!==void 0?e(t,{className:"ds-chip","data-req":"1",title:`需求 ${b.code||b.id}|${b.title}${i===void 0?"":"(点一下只看这条需求)"}`,onClick:S=>{i!==void 0&&(S.stopPropagation(),i(b.id))}},`📄 ${b.code||b.title||"需求"}`):e(t,{className:"ds-chip","data-req-missing":"1",title:"这张卡还没挂到需求上:点开卡片,在「计划」里选一条需求,编号会自动补",onClick:S=>{S.stopPropagation(),r(n.id)}},"未挂需求"),f!==void 0?e(t,{className:"ds-chip","data-proj":"1",title:`${f.name}${l===void 0?"":"(点一下只看这个项目)"}`,onClick:S=>{l!==void 0&&(S.stopPropagation(),l(f.id))}},f.key||f.name):null,v!==void 0?e(t,{className:"ds-chip","data-iter":"1",title:`迭代 ${v.name}(${v.start||"未定"} → ${v.due||"未定"})`},`🗓 ${v.name||v.id}`):null,x!==void 0?e(t,{className:"ds-chip","data-svc":"1",title:`服务 ${x.name}${x.repoPath?`|${x.repoPath}`:""}(worktree 从这里切)`},`📦 ${x.name}`):(n.service??"")!==""?e(t,{className:"ds-chip","data-svc-missing":"1",title:`卡上记的服务 ${n.service} 已经不在项目里了(服务被改名或删除),重新选一个`},"📦 服务已失效"):null,n.design===null||n.design===void 0||n.design.status==="approved"?null:e(t,{className:"ds-chip","data-design":n.design.status},n.design.status==="changes_requested"?"设计要改":"设计待评审"),n.design?.diff===null||n.design?.diff===void 0?null:e(t,{className:"ds-chip","data-diff":n.design.diff.percent},`还原度 ${Math.max(0,100-n.design.diff.percent).toFixed(1)}%${(()=>{const S=n.design.diffHistory??[];if(S.length<2)return"";const C=S[0].percent-S[1].percent;return C===0?"(持平)":C>0?`(−${C.toFixed(1)})`:`(+${Math.abs(C).toFixed(1)})`})()}`),n.design?.spec===null||n.design?.spec===void 0?null:e(t,{className:"ds-chip","data-spec":n.design.spec.violations,title:(n.design.spec.top??[]).map(S=>`${S.value} ×${S.count}${S.sample===""?"":` — ${S.sample}`}`).join(`
|
|
15
|
+
`)||"没有野值"},n.design.spec.violations>0?`规范 ${n.design.spec.violations} 处`:"规范达标"),n.type==="bug"?e(t,{className:"ds-chip ds-chip-bug","data-sev":n.severity??"p2"},`BUG ${String(n.severity||"p2").toUpperCase()}`):null,n.sla!==null&&n.sla!==void 0&&n.status!=="done"?e(t,{className:"ds-chip","data-sla":n.sla.state,title:`SLA ${n.sla.hours} 小时,应修于 ${new Date(n.sla.dueAt).toLocaleString("zh-CN")}`},n.sla.state==="overdue"?`⏰ 逾期 ${Math.max(1,Math.round(Math.abs(n.sla.remaining)/36e5))}h`:n.sla.state==="due_soon"?"⏰ 快到时限":`⏰ 剩 ${Math.max(1,Math.round(n.sla.remaining/36e5))}h`):null,n.duplicateOf?e(t,{className:"ds-chip",title:"和另一张缺陷是同一件事"},"重复"):null,(Number(n.reopenCount)||0)>0?e(t,{className:"ds-chip",title:`${n.reopenCount} 次修完又被打开`},`重开 ${n.reopenCount}`):null,p!==null?e(t,{className:"ds-chip ds-chip-blocked"},"⛔ 阻塞"):null,e(t,{className:"ds-chip","data-role":c.expert?.role||n.role,"data-open":c.label==="未指派"?"1":"0",title:c.note===void 0||c.note===""?c.label:`${c.label} · ${c.note}`},c.label),n.domain?e(t,{className:"ds-chip"},n.domain):null,u?e(t,{className:"ds-chip ds-chip-ai"},"AI 处理中"):null),p!==null?e("div",{className:"ds-blocked-line"},p.reason||"未填写原因"):null,e("div",{className:"ds-card-foot"},e("span",{},n.id),n.dueAt>0?e("span",{"data-overdue":y?"1":"0",style:y?{color:"#e5484d",fontWeight:600}:null},`· ${Wa(n.dueAt)}${y?" 逾期":""}`):null,k.total>0?e("span",{title:"验收清单"},`· ☑ ${k.done}/${k.total}`):null,d>0?e("span",{title:"已登记交付物"},`· 📎 ${d}`):null,g.total>0?e("span",{className:g.fail>0?"ds-case-fail":"",title:`测试用例:通过 ${g.pass}/${g.total}${g.fail>0?`,不通过 ${g.fail}`:""}`},`· ${g.fail>0?"❌":"✅"} ${g.pass}/${g.total}`):null,h>0?e("span",{className:"ds-card-warn",title:`${h} 件交付物还没写正文,云盘文档里只有标题`},"● 缺正文"):null,(n.coding?.files?.length??0)>0?e("span",{title:"AI Coding 改动文件数"},`· ⌥ ${n.coding.files.length}`):null,Yl(n)>0?e("span",{},`· ${Yl(n)} 评论`):null,e("span",{style:{marginLeft:"auto"}},Qe(n.updatedAt))))}return a}const Ir=40;function ux({h:e,React:t,Card:a,TextField:n,SelectField:r,CheckField:s,toast:o}){function i({state:l,onOpen:c,onMove:u,onWip:p}){const f=l.config??{},v=f.experts??[],[x,b]=t.useState(""),[k,g]=t.useState(""),[d,h]=t.useState(""),[y,S]=t.useState(""),[C,E]=t.useState(""),[_,I]=t.useState(""),[j,H]=t.useState(""),[M,P]=t.useState(!1),[G,J]=t.useState(!1),[q,B]=t.useState(!1),[L,w]=t.useState({}),T=f.projects??[],Q=T.find(F=>F.id===y),R=t.useMemo(()=>{const F=x.trim().toLowerCase(),te=new Map;for(const X of l.statuses)te.set(X.id,[]);for(const X of l.tasks)G&&(X.blocked??null)===null||q&&_r(X).length===0||d!==""&&(X.type??"requirement")!==d||y!==""&&X.project!==y||C!==""&&X.iteration!==C||_!==""&&(X.service??"")!==_||j!==""&&(X.requirementId??"")!==j||k!==""&&X.expert!==k&&X.dispatch?.expert!==k||F!==""&&!`${X.title} ${X.requirement} ${X.domain} ${X.id}`.toLowerCase().includes(F)||(te.has(X.status)||te.set(X.status,[]),te.get(X.status).push(X));const xe={urgent:0,normal:1,relaxed:2};for(const X of te.values())X.sort((oe,me)=>(xe[oe.priority]??1)-(xe[me.priority]??1)||me.updatedAt-oe.updatedAt);return te},[l,x,k,d,y,C,_,j,G,q]),D=[...R.values()].reduce((F,te)=>F+te.length,0),K=[...R.values()].reduce((F,te)=>F+te.filter(xe=>xe.type==="bug").length,0),we=l.tasks.filter(F=>F.design!==null&&F.design!==void 0&&F.design.status!=="approved").length,fe=l.tasks.filter(F=>(F.blocked??null)!==null).length,ye=l.tasks.filter(F=>_r(F).length>0).length,Ve=l.statuses.filter(F=>!M||(R.get(F.id)??[]).length>0),ae=x!==""||k!==""||d!==""||G||q||y!==""||C!==""||_!==""||j!=="";return e("div",{style:{display:"flex",flexDirection:"column",flex:1,minHeight:0}},e("div",{className:"ds-board-bar"},e("span",{className:"ds-search"},e(n,{className:"ds-input",style:{width:200,fontSize:12},value:x,placeholder:"搜标题 / 需求 / 领域 / 编号",onChange:F=>b(F.target.value)})),T.length>0?e(r,{className:"ds-select",style:{width:150,fontSize:12},value:y,onChange:F=>{S(F.target.value),E(""),I("")}},e("option",{value:""},`全部项目(${T.filter(F=>F.status!=="archived").length})`),T.map(F=>e("option",{key:F.id,value:F.id},`${F.key?`${F.key} · `:""}${F.name}`))):null,Q!==void 0&&(Q.iterations??[]).length>0?e(r,{className:"ds-select",style:{width:132,fontSize:12},value:C,onChange:F=>E(F.target.value)},e("option",{value:""},"全部迭代"),Q.iterations.map(F=>e("option",{key:F.id,value:F.id},F.name))):null,Q!==void 0&&(Q.services??[]).length>0?e(r,{className:"ds-select",style:{width:150,fontSize:12},value:_,onChange:F=>I(F.target.value)},e("option",{value:""},`全部服务(${(Q.services??[]).length})`),Q.services.map(F=>e("option",{key:F.id,value:F.id},F.name||F.id))):null,(l.requirements??[]).length>0?e(r,{className:"ds-select",style:{width:190,fontSize:12},value:j,title:"只看某条需求下的卡(需求是整条链路的锚点)",onChange:F=>H(F.target.value)},e("option",{value:""},`全部需求(${(l.requirements??[]).length})`),(l.requirements??[]).map(F=>e("option",{key:F.id,value:F.id},`${F.code||F.id} ${F.title}`))):null,e(r,{className:"ds-select",style:{width:108,fontSize:12},value:d,onChange:F=>h(F.target.value)},e("option",{value:""},"全部类型"),["requirement","bug","design","dev","test","ops"].map(F=>e("option",{key:F,value:F},zo[F]??F))),e(r,{className:"ds-select",style:{width:158,fontSize:12},value:k,onChange:F=>g(F.target.value)},e("option",{value:""},"全部专家"),v.filter(F=>F.enabled!==!1).map(F=>e("option",{key:F.id,value:F.id},`${F.emoji} ${F.name}`))),e("label",{className:"ds-row",style:{gap:5,fontSize:12,cursor:"pointer",opacity:.8}},e(s,{checked:M,onChange:F=>P(F.target.checked)}),e("span",{},"隐藏空列")),fe>0?e("label",{className:"ds-row",style:{gap:5,fontSize:12,cursor:"pointer",color:"#c0392b"},title:"只看被标记为阻塞的卡(它们停在原列,等人决定怎么继续)"},e(s,{checked:G,onChange:F=>J(F.target.checked)}),e("span",{},`只看阻塞 ${fe}`)):null,ye>0?e("label",{className:"ds-row",style:{gap:5,fontSize:12,cursor:"pointer",color:"#e5484d"},title:"只看有交付物但没写正文的卡(云盘文档里只有标题,等于没交付)"},e(s,{checked:q,onChange:F=>B(F.target.checked)}),e("span",{},`只看缺正文 ${ye}`)):null,ae?e("button",{className:"ds-btn",style:{padding:"4px 10px"},onClick:()=>{b(""),g(""),h(""),J(!1),B(!1),S(""),E(""),I(""),H("")}},"清除筛选"):null,e("span",{className:"ds-stat",style:{marginLeft:"auto"}},`${D} 张卡 · ${we>0?`${we} 个设计待评审 · `:""}${K>0?`${K} 个缺陷`:`${Ve.length} 列`}`)),e("div",{className:"ds-board",tabIndex:0,"aria-label":"看板列,左右滚动或用方向键"},Ve.map(F=>{const te=R.get(F.id)??[],xe=js(f,f.columns?.[F.id]);return e("div",{className:"ds-col",key:F.id,"data-col":F.id,"data-role":F.role,onDragOver:X=>{X.preventDefault(),X.dataTransfer!==null&&(X.dataTransfer.dropEffect="move"),X.currentTarget.setAttribute("data-drag-over","1")},onDragLeave:X=>X.currentTarget.removeAttribute("data-drag-over"),onDrop:X=>{X.preventDefault(),X.currentTarget.removeAttribute("data-drag-over");const oe=X.dataTransfer===null?"":X.dataTransfer.getData("text/plain");if(oe===""||oe===void 0)return;const me=Number(f.columns?.[F.id]?.wip)||0,W=(R.get(F.id)??[]).length;if(me>0&&W>=me){o(`「${F.label}」已到 WIP 上限 ${me},先把列里的卡往前推`,"error");return}u(oe,F.id)}},e("div",{className:"ds-col-head"},e("div",{className:"ds-col-title"},e("span",{className:"ds-col-name"},F.label),(()=>{const X=Number(f.columns?.[F.id]?.wip)||0,oe=X>0&&te.length>X;return e("span",{className:"ds-count","data-zero":te.length===0?"1":"0","data-over":oe?"1":"0",onClick:me=>{me.stopPropagation(),typeof p=="function"&&p(F.id,X)},title:X>0?`WIP 上限 ${X} 张,当前 ${te.length} 张${oe?"(已超出,先消化再加)":""}`:"这一列没有设 WIP 上限"},X>0?`${te.length}/${X}`:String(te.length))})()),e("div",{className:"ds-col-owner","data-empty":xe.length===0?"1":"0",title:"这一列的默认负责人:卡推进到本列后由它接手"},e("span",{className:"ds-col-owner-label"},"负责人"),xe.length===0?e("span",{className:"ds-col-owner-name"},"未配置"):e("span",{className:"ds-col-owner-name"},xe))),e("div",{className:"ds-col-body"},te.length===0?e("div",{className:"ds-empty"},x!==""||k!==""?"没有匹配的卡":"暂无任务"):te.slice(0,L[F.id]??Ir).map(X=>e(a,{key:X.id,task:X,onOpen:c,config:f,requirements:l.requirements??[],onPickRequirement:oe=>H(me=>me===oe?"":oe),onPickProject:oe=>{S(me=>me===oe?"":oe),E("")}})),te.length>(L[F.id]??Ir)?e("button",{className:"ds-btn ds-btn-ghost",style:{width:"100%",marginTop:6,fontSize:12},onClick:()=>w(X=>({...X,[F.id]:(X[F.id]??Ir)+Ir}))},`显示更多(还有 ${te.length-(L[F.id]??Ir)} 张)`):null))})))}return i}function px({h:e,TextField:t}){function a({roster:n,query:r,active:s,onQuery:o,onActive:i,onPick:l,onClose:c}){const u=Fo(n,r),p=v=>{u.length!==0&&i((s+v+u.length)%u.length)};return e("div",{className:"ds-mention-pop",onKeyDown:v=>{v.key==="ArrowDown"?(v.preventDefault(),p(1)):v.key==="ArrowUp"?(v.preventDefault(),p(-1)):v.key==="Enter"?(v.preventDefault(),u[s]!==void 0&&l(u[s].name)):v.key==="Escape"&&(v.preventDefault(),c())}},e(t,{className:"ds-mention-search",autoFocus:!0,value:r,placeholder:"搜专家或专家团,Enter 选中,Esc 关闭",onChange:v=>o(v.target.value)}),e("div",{className:"ds-mention-list"},u.length===0?e("div",{className:"ds-mention-empty"},"没有匹配的专家或专家团"):u.map((v,x)=>[x===0||u[x-1].group!==v.group?e("div",{key:v.group,className:"ds-mention-group"},v.group):null,e("button",{key:v.key,className:"ds-mention-item","data-active":x===s?"1":"0",onMouseEnter:()=>i(x),onClick:()=>l(v.name)},e("span",null,v.emoji),e("span",null,v.name),e("span",{className:"ds-hint"},v.hint))]).flat().filter(Boolean)))}return a}const fx=e=>String(e??"").split(`
|
|
16
|
+
`).map(t=>t.trim()).filter(t=>t!=="").map(t=>{const[a,n,r]=t.split("|").map(c=>c.trim()),s=a.indexOf(" "),o=s>0?a.slice(0,s).toUpperCase():"GET",i=s>0?a.slice(s+1).trim():a,l={method:o,url:i};if(n!==void 0&&/^\d{3}$/.test(n)&&(l.expectStatus=Number(n)),r!==void 0&&r!==""){const c=r.indexOf("="),u=c>0?r.slice(0,c).trim():(r.split(".").pop()??"").trim(),p=c>0?r.slice(c+1).trim():r;u!==""&&p!==""&&(l.extract={[u]:p})}return l}).filter(t=>t.url!=="").slice(0,20),mx={approved:"已通过",pending:"待评审",changes_requested:"要改"};function gx({h:e,React:t,api:a,kit:n,currentUser:r,renderMarkdown:s,tipOf:o,tipLabel:i,confirmDialog:l,promptDialog:c,TextField:u,TextAreaField:p,ChipField:f,CheckField:v,SelectField:x,MdField:b,MentionPicker:k}){function g({task:d,state:h,onClose:y,onChanged:S}){const[C,E]=t.useState(!1),[_,I]=t.useState(null),[j,H]=t.useState(""),[M,P]=t.useState(null),[G,J]=t.useState(""),q=t.useRef(null);t.useEffect(()=>{const m=A=>{A.key==="Escape"&&y()};return window.addEventListener("keydown",m),()=>window.removeEventListener("keydown",m)},[y]);const[B,L]=t.useState({project:d.project??"",iteration:d.iteration??"",service:d.service??"",owner:d.owner??"",due:Zp(d.dueAt),releaseId:d.releaseId??""}),[w,T]=t.useState(""),[Q,R]=t.useState({kind:"doc",title:"",ref:"",content:""}),[D,K]=t.useState(null),[we,fe]=t.useState(null),[ye,Ve]=t.useState({}),[ae,F]=t.useState(null),[te,xe]=t.useState(null);t.useEffect(()=>{Ve({}),fe(null),K(null)},[d.id]);const[X,oe]=t.useState({title:"",expected:"",steps:"",stepsText:"",type:"functional",priority:"p2",preconditions:""}),[me,W]=t.useState({busy:!1,note:""}),[$e,ke]=t.useState({busy:!1,note:""}),[Ie,Ue]=t.useState(null),[qa,Tn]=t.useState(""),V=d.coding??null,he=d.worktree??null,[je,ze]=t.useState(""),[Pt,Vt]=t.useState({busy:!1,line:"",ok:null}),et=Gl(d),bt=Kl(d),ds=te!==null&&Array.isArray(te.cases)?te.cases:Array.isArray(d.cases)?d.cases:[],[wa,Is]=t.useState(null),[Z,U]=t.useState(""),ee=et.pass,be=et.fail,ne=Math.max(0,et.total-ee-be),le=et.total===0?"":`${et.total} 条 · ✅ 通过 ${ee} · ❌ 不通过 ${be}${ne>0?` · ⬜ 没跑 ${ne}`:""}`,ce=te!==null&&Array.isArray(te.checklist)?te.checklist:Array.isArray(d.checklist)?d.checklist:[],ve=bt.done,Se=d.artifacts??[],Ne=m=>ye[m.id]!==void 0?ye[m.id]:String(m.content??""),Te=m=>typeof m.contentLength=="number"?m.contentLength>0:String(m.content??"").trim()!=="",at=async m=>{const A=ye[m.id];if(A!==void 0)return A;const se=await a("/task/artifact",{id:d.id,action:"get",artifactId:m.id}),Ee=String(se?.artifact?.content??"");return Ve(Ge=>({...Ge,[m.id]:Ee})),Ee},nt=async m=>{if(we===m.id){fe(null);return}if(fe(m.id),ye[m.id]===void 0)try{await at(m)}catch(A){I(A instanceof Error?A.message:String(A)),fe(null)}},ct=async m=>{if(D!==null&&D.id===m.id){K(null);return}try{K({id:m.id,content:await at(m)})}catch(A){I(A instanceof Error?A.message:String(A))}},qe=Yl(d);ae??(Array.isArray(d.comments)&&d.comments),t.useEffect(()=>{if(qe===0){F([]);return}let m=!0;return a("/task/comments",{id:d.id}).then(A=>{m&&F(Array.isArray(A?.comments)?A.comments:[])}).catch(()=>{m&&F([])}),()=>{m=!1}},[d.id,qe]),t.useEffect(()=>{if(et.total===0&&bt.total===0){xe({cases:[],checklist:[]});return}let m=!0;return a("/task/parts",{id:d.id}).then(A=>{m&&xe({cases:Array.isArray(A?.cases)?A.cases:[],checklist:Array.isArray(A?.checklist)?A.checklist:[]})}).catch(()=>{m&&xe({cases:[],checklist:[]})}),()=>{m=!1}},[d.id,et.total,et.pass,et.fail,bt.total,bt.done]);const[st,tt]=t.useState("overview");t.useEffect(()=>{tt("overview")},[d.id]),t.useEffect(()=>{const m=q.current;m!==null&&(m.scrollTop=0)},[st,d.id]);const Pe=m=>st===m?void 0:{display:"none"},_t=[{id:"overview",label:"概览",hint:"标题、状态、负责人、阻塞原因与关键时间"},{id:"content",label:"内容",hint:"需求正文与验收标准,支持 Markdown"},{id:"plan",label:"计划",hint:"项目、迭代、服务、挂哪条需求、优先级"},{id:"deliver",label:"交付物",count:Se.length>0?Se.length:"",hint:"文档 / MR / 用例 / 报告;空的交付物会被准出拦下"},{id:"test",label:"测试",count:et.total>0?`${ee}/${et.total}`:bt.total>0?`☑${ve}/${bt.total}`:"",hint:"验收清单、用例执行记录;失败的用例会自动开缺陷"},{id:"coding",label:"执行记录",count:V===null?"":V.review?.status==="approved"?"✓ 已评审":"",hint:"AI 的分支、提交、改动文件;可以「核对代码事实」"},{id:"discuss",label:"讨论",count:qe>0?qe:"",hint:"评论;在评论里 @ 专家或专家团即派单"}],[Fe,yt]=t.useState({title:d.title,requirement:d.requirement,gitlabIssue:d.gitlabIssue,gitlabMR:d.gitlabMR?.url??"",pointId:d.pointId??""}),jt=async m=>{E(!0),I(null);try{await a("/task/update",{id:d.id,patch:m}),await S()}catch(A){I(A instanceof Error?A.message:String(A))}finally{E(!1)}},Qt=async()=>{E(!0),I(null),P(null);try{await a("/task/agent/retry",{id:d.id,by:r()}),P("已清掉失败计数,下一轮派单会重新接手"),await S()}catch(m){I(m instanceof Error?m.message:String(m))}finally{E(!1)}},ie=async()=>{E(!0),I(null);try{const m=await a("/task/gate",{id:d.id});Is(m.gate)}catch(m){I(m instanceof Error?m.message:String(m))}finally{E(!1)}},Ce=async m=>{E(!0),I(null);try{const A=await a("/task/signoff",{id:d.id,action:m,note:Z,by:r()});U(""),Is(A.gate??null),await S()}catch(A){I(A instanceof Error?A.message:String(A))}finally{E(!1)}},ge=async()=>{if(j.trim().length!==0){E(!0),I(null);try{const A=((await a("/task/comment",{id:d.id,body:j,author:"人",kind:"human"})).mentions??[]).map(se=>se.label??se.id);H(""),A.length>0&&I(null),P(A.length>0?`已通知 ${A.join("、")}`:null),await S()}catch(m){I(m instanceof Error?m.message:String(m))}finally{E(!1)}}},Va=m=>H(A=>A.replace(/\s*$/,A.length===0?"":" ")+`@${m} `),[St,da]=t.useState(null),[Pn,Ra]=t.useState(0),Dt=t.useMemo(()=>ef(h.config),[h.config]),Ot=St===null?[]:Fo(Dt,St.query),Y=(m,A)=>{const se=m.slice(0,A),Ee=/@([^\s@]{0,24})$/.exec(se);if(Ee===null){da(Ge=>Ge!==null&&Ge.inline?null:Ge);return}da({query:Ee[1],from:A-Ee[0].length,inline:!0}),Ra(0)},z=m=>{const A=St;if(A!==null&&A.inline&&A.from!==null){const se=A.from;H(Ee=>Ee.slice(0,se)+`@${m} `)}else Va(m);da(null)},de=async()=>{if(await l(`删除任务「${d.title}」?`,{title:"删除任务",danger:!0,okText:"删除"})){E(!0);try{await a("/task/delete",{id:d.id}),y(),await S()}catch(m){I(m instanceof Error?m.message:String(m))}finally{E(!1)}}},Le=async()=>{E(!0),I(null);try{await a("/agents/run",{id:d.id,expert:G}),await S()}catch(m){I(m instanceof Error?m.message:String(m))}finally{E(!1)}},We=d.blocked??null,Ke=async()=>{const m=await c("卡在哪了?(写清楚,之后要据此决定怎么继续)",{title:"标记阻塞",defaultValue:We?.reason??"",placeholder:"比如:等支付网关联调账号"});if(m!==null){if(m.trim()===""){I("阻塞原因至少写一句话");return}E(!0),I(null),P(null);try{await a("/task/block",{id:d.id,reason:m.trim()}),await S()}catch(A){I(A instanceof Error?A.message:String(A))}finally{E(!1)}}},He=async(m,A)=>{if(!(m==="advance"&&!await l("解除阻塞并把卡推到下一列?下一列的 AI 会立刻接手。",{title:"解除阻塞",okText:"解除并推进"}))){E(!0),I(null),P(null);try{await a("/task/unblock",{id:d.id,action:m,expert:A}),P(m==="advance"?"已解除阻塞,推进到下一列":m==="assign"?"已解除阻塞,已交给指定专家":m==="clear"?"已解除阻塞(暂不派单)":"已解除阻塞,已交回本列负责人"),await S()}catch(se){I(se instanceof Error?se.message:String(se))}finally{E(!1)}}},_n=async()=>{E(!0),I(null);try{await a("/agents/stop",{id:d.id}),await S()}catch(m){I(m instanceof Error?m.message:String(m))}finally{E(!1)}},Do=async()=>{await jt({project:B.project,iteration:B.project===""?"":B.iteration,service:B.project===""?"":B.service??"",owner:B.owner,dueAt:Pr(B.due),releaseId:B.releaseId??""})},an=async()=>{const m=w.trim();if(m!==""){E(!0),I(null);try{await a("/task/checklist",{id:d.id,action:"add",text:m}),T(""),await S()}catch(A){I(A instanceof Error?A.message:String(A))}finally{E(!1)}}},nn=async m=>{E(!0),I(null);try{await a("/task/checklist",{id:d.id,action:"toggle",itemId:m.id,done:!m.done,note:m.done?"":void 0}),await S()}catch(A){I(A instanceof Error?A.message:String(A))}finally{E(!1)}},cs=async m=>{E(!0),I(null);try{await a("/task/checklist",{id:d.id,action:"remove",itemId:m.id}),await S()}catch(A){I(A instanceof Error?A.message:String(A))}finally{E(!1)}},O=async()=>{const m=await c("SQLite 库文件路径",{title:"加一条数据库用例",defaultValue:""});if(m===null||String(m).trim()==="")return;const A=await c("SQL 语句(返回的行用来断言)",{title:"加一条数据库用例",defaultValue:"select 1 as n"});if(A===null||String(A).trim()==="")return;const se=await c("首行 n 列的期望值(可留空)",{title:"加一条数据库用例",defaultValue:""});if(se!==null){E(!0),I(null);try{const Ee={file:String(m).trim(),sql:String(A).trim()},Ge=String(se??"").trim();Ge!==""&&(Ee.expectColumn="n",Ee.expectValue=Ge);const sn=("db: "+Ee.sql).slice(0,60);await a("/task/case",{id:d.id,action:"add",cases:[{title:sn,expected:Ge===""?"能执行":"n = "+Ge,db:Ee}]}),await S()}catch(Ee){I(Ee instanceof Error?Ee.message:String(Ee))}finally{E(!1)}}},ue=async()=>{const m=await c("shell 命令(断言退出码 0)",{title:"加一条 shell 用例",defaultValue:""});if(m===null||String(m).trim()==="")return;const A=await c("期望输出里包含什么(可留空)",{title:"加一条 shell 用例",defaultValue:""});if(A!==null){E(!0),I(null);try{const se=String(A??"").trim(),Ee={title:("shell: "+String(m).trim()).slice(0,60),expected:se===""?"退出码 0":"退出码 0 且输出包含 "+se,shell:{command:String(m).trim(),expectExit:0,expectContains:se}};await a("/task/case",{id:d.id,action:"add",cases:[Ee]}),await S()}catch(se){I(se instanceof Error?se.message:String(se))}finally{E(!1)}}},Me=async()=>{const m=X.title.trim();if(m!==""){E(!0),I(null);try{const A=fx(X.steps),se={title:m,expected:X.expected.trim()};A.length>0&&(se.http={steps:A}),X.type!==void 0&&X.type!=="functional"&&(se.type=X.type),X.priority!==void 0&&X.priority!=="p2"&&(se.priority=X.priority),String(X.preconditions??"").trim()!==""&&(se.preconditions=String(X.preconditions).trim()),String(X.stepsText??"").trim()!==""&&(se.steps=String(X.stepsText).split(`
|
|
17
|
+
`).map(Ee=>Ee.trim()).filter(Ee=>Ee!=="")),await a("/task/case",{id:d.id,action:"add",cases:[se]}),oe({title:"",expected:"",steps:"",stepsText:"",type:"functional",priority:"p2",preconditions:""}),await S()}catch(A){I(A instanceof Error?A.message:String(A))}finally{E(!1)}}},xt=async(m,A)=>{E(!0),I(null),P(null);try{const se=await a("/task/case",{id:d.id,action:"update",caseId:m.id,result:A}),Ee=se?.bug??null;if(A==="fail"&&Ee!==null){const Ge=String(Ee.code??"")!==""?Ee.code:Ee.id;P(`用例判失败,已自动登记缺陷 ${Ge}(挂在同一条需求下,父任务指向本卡)。`)}else se?.error&&P(`用例已更新,但自动建缺陷失败:${se.error}`);await S()}catch(se){I(se instanceof Error?se.message:String(se))}finally{E(!1)}},ta=async m=>{W({busy:!0,note:""}),I(null);try{const A=await a("/task/case/run",{id:d.id,caseId:m,by:"我在界面里跑的"}),se=A?.run??{},Ee=(A?.bugs??[]).filter(sn=>sn.created===!0).length,Ge=[`跑了 ${se.total??0} 条:通过 ${se.passed??0},不通过 ${se.failed??0}`];Ee>0&&Ge.push(`自动开缺陷 ${Ee} 张`),W({busy:!1,note:Ge.join(",")}),await S()}catch(A){W({busy:!1,note:A instanceof Error?A.message:String(A)})}},rt=async()=>{ke({busy:!0,note:""}),I(null);try{const m=await a("/task/cases/generate",{id:d.id}),A=m?.added>0?`已生成 ${m.added} 条用例,这张卡现在共 ${m.total} 条`:`没生成用例:${m?.reason??"没有可用的验收条件"}`;ke({busy:!1,note:A}),await S()}catch(m){ke({busy:!1,note:m instanceof Error?m.message:String(m)})}},Re=async m=>{E(!0),I(null);try{await a("/task/case",{id:d.id,action:"remove",caseId:m.id}),await S()}catch(A){I(A instanceof Error?A.message:String(A))}finally{E(!1)}},Ye=async m=>{E(!0),I(null),P(null);try{await a("/task/case",{id:d.id,action:"update",caseId:m.id,flaky:m.flaky!==!0}),P(m.flaky===!0?"已取消不稳定标记":"已标记为不稳定用例:以后失败不会自动开缺陷"),await S()}catch(A){I(A instanceof Error?A.message:String(A))}finally{E(!1)}},In=async()=>{const m=Q.title.trim();if(m!==""){E(!0),I(null),P(null);try{const A=await a("/task/artifact",{id:d.id,action:"add",artifact:{kind:Q.kind,title:m,ref:Q.ref.trim(),content:Q.content,status:"delivered"}});R({kind:Q.kind,title:"",ref:"",content:""}),P("已登记,正在归档到飞书云盘…"),await S();try{const Ee=((await a("/task/artifact/sync",{id:d.id}))?.written??[])[0];P(Ee?.doc?.url?`已归档到飞书云盘:${Ee.doc.url}`:"归档失败,稍后可点「同步到云盘」重试。"),await S()}catch{P("登记成功,但归档失败:可点「同步到云盘」重试。")}}catch(A){I(A instanceof Error?A.message:String(A))}finally{E(!1)}}},Rn=async m=>{if(D!==null){E(!0),I(null),P(null);try{const A=D.content;await a("/task/artifact",{id:d.id,action:"update",artifactId:m.id,artifact:{content:A}}),K(null),Ve(se=>({...se,[m.id]:A})),await S();try{const Ee=((await a("/task/artifact/sync",{id:d.id,artifactId:m.id}))?.written??[])[0]?.doc;P(Ee?.url?`正文已更新并同步:${Ee.url}`:"正文已保存,归档失败可再点「更新」。"),await S()}catch{P("正文已保存,归档失败可再点「更新」。")}}catch(A){I(A instanceof Error?A.message:String(A))}finally{E(!1)}}},Py=async m=>{E(!0),I(null),P(null);try{const A=await a("/task/artifact/sync",{id:d.id,artifactId:m.id}),se=(A?.written??[])[0]?.doc,Ee=(A?.errors??[])[0];P(se?.url?`已归档:${se.url}`:`归档失败:${Ee?.error??"未知原因"}`),await S()}catch(A){I(A instanceof Error?A.message:String(A))}finally{E(!1)}},RE=async()=>{E(!0),I(null),P(null);try{const m=await a("/task/artifact/sync",{id:d.id}),A=(m?.written??[]).length,se=(m?.errors??[]).length;P(`已归档 ${A} 件${se>0?`,${se} 件失败:${m.errors[0]?.error??""}`:"。"}`),await S()}catch(m){I(m instanceof Error?m.message:String(m))}finally{E(!1)}},AE=async(m,A)=>{E(!0),I(null);try{await a("/task/artifact",{id:d.id,action:"update",artifactId:m.id,artifact:{status:A}}),await S()}catch(se){I(se instanceof Error?se.message:String(se))}finally{E(!1)}},jE=async m=>{E(!0),I(null);try{await a("/task/artifact",{id:d.id,action:"remove",artifactId:m.id}),await S()}catch(A){I(A instanceof Error?A.message:String(A))}finally{E(!1)}},DE=()=>Ue({agent:V?.agent??"",model:V?.model??"",branch:V?.branch??"",context:V?.context??"",total:String(V?.unitTests?.total??0),passed:String(V?.unitTests?.passed??0)}),Rp=async m=>{if(!(m==="remove"&&!await l("回收 worktree 会删掉这个目录和分支,未合并的改动会丢,确定?",{title:"回收 worktree",danger:!0,okText:"回收"}))){E(!0),I(null),ze("");try{const A=await a("/task/worktree",{id:d.id,action:m});m==="list"?ze(String(A.output??"").replace(/\s+/g," ").slice(0,400)||"(没有 worktree)"):A.ok===!0?ze(m==="create"?"已建好 worktree":"已回收"):ze(A.skipped||A.result?.error||"没成功"),m!=="list"&&await S()}catch(A){ze(A instanceof Error?A.message:String(A))}finally{E(!1)}}},OE=async()=>{if(Ie===null)return;const m=Math.max(0,Number(Ie.total)||0),A=Math.min(m,Math.max(0,Number(Ie.passed)||0));E(!0),I(null);try{await a("/task/coding",{id:d.id,action:"update",coding:{agent:Ie.agent.trim(),model:Ie.model.trim(),branch:Ie.branch.trim(),context:Ie.context,unitTests:{total:m,passed:A}}}),Ue(null),await S()}catch(se){I(se instanceof Error?se.message:String(se))}finally{E(!1)}},_y=async m=>{E(!0),I(null);try{await a("/task/coding",{id:d.id,action:"review",status:m,note:qa.trim()}),Tn(""),await S()}catch(A){I(A instanceof Error?A.message:String(A))}finally{E(!1)}},LE=async()=>{E(!0),I(null);try{await a("/task/coding",{id:d.id,action:"merge"}),await S()}catch(m){I(m instanceof Error?m.message:String(m))}finally{E(!1)}},ME=async()=>{Vt({busy:!0,line:"",ok:null});try{const m=await a("/task/coding/verify",{id:d.id}),A=m.report??{};A.skipped!==void 0?Vt({busy:!1,line:String(A.skipped),ok:!1}):Vt({busy:!1,line:String(m.line??""),ok:A.ok===!0}),await S()}catch(m){Vt({busy:!1,line:m instanceof Error?m.message:String(m),ok:!1})}},zE=async()=>{const m=await c("设计稿链接(Figma / 蓝湖 / 图片都行)",{title:"设计评审",defaultValue:d.design?.link??""});if(m===null)return;const A=await c("状态:pending 待评审 / changes_requested 要改 / approved 通过",{title:"设计评审",defaultValue:d.design?.status??"pending"});if(A!==null){E(!0),I(null),P(null);try{const se=await a("/task/design",{id:d.id,design:{link:m,status:A,note:d.design?.note??""}});P("设计已保存:"+String(se?.design?.status??A)),await S()}catch(se){I(se instanceof Error?se.message:String(se))}finally{E(!1)}}},FE=async()=>{E(!0),I(null),P(null);try{const A=(await a("/coding/gitlab",{id:d.id}))?.facts??null;P(A===null?"核对完成,但没有拿到结果":`GitLab 核对:文件 ${A.files.declared}→${A.files.actual} · 提交 ${A.commits.declared}→${A.commits.actual}${A.pipeline?` · 流水线 ${A.pipeline}`:""}${(A.mismatches??[]).length>0?` · ⚠ ${A.mismatches.join(";")}`:" · ✅ 一致"}`),await S()}catch(m){I(m instanceof Error?m.message:String(m))}finally{E(!1)}},BE=(h.statuses.find(m=>m.id===d.status)??{}).label??d.status,Iy=d.dispatch?.expert?js(h.config??{},{kind:"expert",id:d.dispatch.expert}):"";return e("div",{className:"ds-drawer-wrap",onClick:m=>{m.target===m.currentTarget&&y()}},e("div",{className:"ds-drawer"},e("div",{className:"ds-dw-head"},e("div",{className:"ds-grow"},e("div",{className:"ds-dw-title"},d.title),e("div",{className:"ds-dw-sub"},`${d.id} · ${BE}${Iy===""?"":` · ${Iy}`} · 更新 ${Qe(d.updatedAt)}`)),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"设计稿链接 + 评审状态;被配置成设计闸门的列,评审不通过进不去",onClick:()=>void zE()},"设计:"+(mx[d.design?.status]??"未登记")),e("button",{className:"ds-btn",onClick:y},"关闭"),(Number(d.agentFailures)||0)>0?o(d.retryAt>0?`下一次自动重试:${Qe(d.retryAt)}`:"失败次数已用完,重置后可以重新派单",e("button",{className:"ds-btn",disabled:C,"data-agent-failed":"1",onClick:()=>void Qt()},`AI 失败 ${Number(d.agentFailures)||0} 次 · 重新派单`)):null),n("TabsBar")!==null?e(n("TabsBar"),{items:_t.map(m=>({id:m.id,label:m.label,count:m.count})),value:st,onChange:m=>tt(m),className:"ds-dw-shadcn-tabs"}):e("div",{className:"ds-dw-tabs"},_t.map(m=>e("button",{key:m.id,className:"ds-dw-tab","data-on":st===m.id?"1":"0",onClick:()=>tt(m.id)},m.label,m.count===""||m.count===void 0||m.count===null?null:e("span",{className:"ds-dw-tab-count"},String(m.count))))),e("div",{className:"ds-dw-body",ref:q,"data-pane":st},e("div",{className:"ds-meta"},e(f,{className:"ds-chip"},d.id),d.type==="bug"?e(f,{className:"ds-chip ds-chip-bug","data-sev":d.severity??"p2"},`BUG ${String(d.severity||"p2").toUpperCase()}`):e(f,{className:"ds-chip"},zo[d.type]??d.type),e(f,{className:"ds-chip"},`当前列:${h.statuses.find(m=>m.id===d.status)?.label??d.status}`),e(f,{className:"ds-chip","data-role":d.dispatch?.state==="running"&&d.dispatch?.expert?void 0:d.role,"data-open":Bo(d,h.config??{}).label==="未指派"?"1":"0",title:Bo(d,h.config??{}).note},`负责:${Bo(d,h.config??{}).label}`),d.type==="bug"?e(x,{className:"ds-select",style:{height:20,fontSize:11,padding:"0 4px"},value:d.severity||"p2",title:"严重级别",onChange:m=>void jt({severity:m.target.value})},["p0","p1","p2","p3"].map(m=>e("option",{key:m,value:m},ql[m]))):null,e(f,{className:"ds-chip"},As[d.priority]??d.priority),e(f,{className:"ds-chip",title:"点一下改业务领域(决定派给同领域专家)",style:{cursor:"pointer"},onClick:async()=>{const m=await c("业务领域(如 支付 / 风控 / 会员),留空表示不限",{title:"改业务领域",defaultValue:d.domain||""});m!==null&&jt({domain:m})}},d.domain?`领域:${d.domain}`:"领域:未标"),e("span",{},`创建 ${Qe(d.createdAt)}`),e("span",{},`更新 ${Qe(d.updatedAt)}`)),e("div",{className:"ds-dw-cols"},e("div",{className:"ds-dw-col"},e("div",{className:"ds-sec",style:Pe("overview")},e("div",{className:"ds-sec-head"},"推进到",e("span",{className:"ds-hint"},"点一下就会移动卡片,并触发对应列的 AI")),e("div",{className:"ds-listrow-actions"},(()=>{const m=h.statuses,A=m.findIndex(Ct=>Ct.id===d.status),se=m[A+1]??null,Ee=m.filter(Ct=>Ct.id!==d.status&&(se===null||Ct.id!==se.id)),Ge=Ee.filter(Ct=>m.findIndex(ka=>ka.id===Ct.id)>A),sn=Ee.filter(Ct=>m.findIndex(ka=>ka.id===Ct.id)<A);return[se===null?null:e("button",{key:"next",className:"ds-btn ds-btn-primary",disabled:C,title:"推进到下一列,下一列的 AI 会接手",onClick:()=>void jt({status:se.id,role:se.role})},`推进到「${se.label}」`),Ee.length===0?null:e(x,{key:"other",className:"ds-select",value:"",disabled:C,onChange:Ct=>{const ka=Ct.target.value;if(ka==="")return;const Ap=m.find(UE=>UE.id===ka);Ap!==void 0&&jt({status:Ap.id,role:Ap.role})}},e("option",{value:""},`其他状态(${Ee.length})`),...Ge.map(Ct=>e("option",{key:Ct.id,value:Ct.id},`→ ${Ct.label}`)),...sn.map(Ct=>e("option",{key:Ct.id,value:Ct.id},`← ${Ct.label}(退回,AI 会重跑)`)))].filter(Boolean)})())),e("div",{className:"ds-sec",style:Pe("overview")},e("div",{className:"ds-sec-head"},"准出检查",e("span",{className:"ds-hint"},"进「已完成」之前必须过这一关:清单全勾、没有失败用例、不在阻塞、有人签字")),e("div",{className:"ds-sec-body"},wa===null?e("div",{className:"ds-row",style:{gap:8,alignItems:"center"}},e("button",{className:"ds-btn",onClick:()=>void ie()},"检查一下"),e("span",{className:"ds-hint"},"点一下看这张卡还差什么才能收口")):e("div",{className:"ds-gate","data-ready":wa.ready?"1":"0"},e("div",{className:"ds-gate-head"},e("b",null,wa.ready?"✅ 可以进「已完成」":`⛔ 还差 ${wa.blockers.length} 项`),e("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void ie()},"重新检查")),(wa.blockers??[]).map(m=>e("div",{key:m,className:"ds-gate-item","data-kind":"block"},`⛔ ${m}`)),(wa.warnings??[]).map(m=>e("div",{key:m,className:"ds-gate-item","data-kind":"warn"},`⚠ ${m}`)),(wa.blockers??[]).length===0&&(wa.warnings??[]).length===0?e("div",{className:"ds-hint"},"没有遗留项。"):null),d.signoff===null||d.signoff===void 0?e("div",{className:"ds-row",style:{gap:8,alignItems:"center",flexWrap:"wrap"}},e(u,{className:"ds-input",style:{flex:"1 1 260px"},value:Z,placeholder:"验收签字:验了什么、遗留什么",onChange:m=>U(m.target.value)}),e("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void Ce("sign")},"签字确认")):e("div",{className:"ds-gate-sign"},e("span",null,`✍ ${d.signoff.by} 于 ${new Date(d.signoff.at).toLocaleString()} 签字:${d.signoff.note}`),e("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void Ce("clear")},"取消签字")))),e("div",{className:"ds-sec",style:Pe("overview")},e("div",{className:"ds-sec-head"},"阻塞",e("span",{className:"ds-hint"},"卡住了打个标,卡留在本列停住,不会被自动往下派;怎么继续由人定")),We===null?e("div",{className:"ds-sec-body"},e("div",{className:"ds-hint"},"缺信息、缺权限、等外部依赖、测试过不去——都可以标阻塞,别硬编。"),e("div",{className:"ds-listrow-actions"},e("button",{className:"ds-btn ds-btn-ghost","data-warn":"1",disabled:C,onClick:()=>void Ke()},"⛔ 标记阻塞"))):e("div",{className:"ds-sec-body"},e("div",{className:"ds-blocked-box"},e("div",{style:{fontWeight:600}},`⛔ ${We.reason||"未填写原因"}`),e("div",{className:"ds-hint"},`${We.by||"人"} · ${Qe(We.at)} · 停在「${h.statuses.find(m=>m.id===d.status)?.label??d.status}」`)),e("div",{className:"ds-hint"},"怎么继续:"),e("div",{className:"ds-listrow-actions"},e("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void He("resume")},"继续,交本列负责人"),e("button",{className:"ds-btn",disabled:C,onClick:()=>void He("advance")},"推进到下一列"),e(x,{className:"ds-select",style:{width:190},value:G,disabled:C,onChange:m=>J(m.target.value)},e("option",{value:""},"选一个专家…"),(h.config?.experts??[]).filter(m=>m.enabled!==!1).map(m=>e("option",{key:m.id,value:m.id},`${m.emoji} ${m.name}`))),e("button",{className:"ds-btn",disabled:C||G==="",onClick:()=>void He("assign",G)},"改派给他"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>void He("clear")},"只解除,先不派")))),e("div",{className:"ds-sec",style:Pe("overview")},e("div",{className:"ds-sec-head"},"AI 处理",e("span",{className:"ds-hint"},"默认用本列负责人;也可以临时换人")),e("div",{className:"ds-sec-body"},e("div",{className:"ds-hint"},d.dispatch?.state==="running"?`${js(h.config??{},{kind:"expert",id:d.dispatch.expert??d.dispatch.role})||"AI"} 处理中 · 起于 ${Qe(d.dispatch.at)}`:d.dispatch?.state==="failed"?`上次派单失败:${d.dispatch.error??"未知原因"}`:d.dispatch?.state==="stopped"?"上次派单已被停止":"这张卡还没有派给 AI"),e("div",{className:"ds-field",style:{marginTop:4}},e("div",{className:"ds-label"},"派给谁"),e(x,{className:"ds-select",value:G,disabled:C,onChange:m=>J(m.target.value)},e("option",{value:""},"用本列负责人"),(h.config?.experts??[]).filter(m=>m.enabled!==!1).map(m=>e("option",{key:m.id,value:m.id},`${m.emoji} ${m.name}`)))),e("div",{className:"ds-listrow-actions",style:{marginTop:8}},e("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void Le()},"马上处理"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C||d.dispatch?.state!=="running",onClick:()=>void _n()},"停止")))),e("div",{className:"ds-sec",style:Pe("content")},e("div",{className:"ds-sec-head"},"内容"),e("div",{className:"ds-field"},e("div",{className:"ds-label"},"标题"),e(u,{className:"ds-input",value:Fe.title,onChange:m=>yt({...Fe,title:m.target.value})})),e("div",{className:"ds-field"},e("div",{className:"ds-label"},"需求 / 背景 / 验收标准"),String(Fe.requirement??"").trim()===""?null:e("div",{className:"ds-md-preview ds-reader","data-task-md":"1",style:{maxHeight:220}},s(Fe.requirement)),e(b,{className:"ds-textarea",rows:String(Fe.requirement??"").trim()===""?4:8,value:Fe.requirement,placeholder:"这张卡要解决什么、背景是什么、做到什么算完成——AI 接手前最好写清楚。",onChange:m=>yt({...Fe,requirement:m.target.value})}),String(Fe.requirement??"").trim()===""?e("div",{className:"ds-hint"},"这张卡还没有需求描述:专家只能按标题猜。补完点下面的「保存改动」。"):null),e("div",{className:"ds-field"},e("div",{className:"ds-label"},"对应功能点"),(()=>{const m=(h.requirements??[]).find(se=>se.id===d.requirementId);if(m===void 0)return e("div",{className:"ds-hint"},"这张卡还没挂需求,先在「计划」里挂到某个需求,才能选功能点。");const A=m.points??[];return A.length===0?e("div",{className:"ds-hint"},`需求 ${m.code||m.id} 还没拆功能点,去需求页「功能点与可追溯矩阵」加几条。`):e(x,{className:"ds-select",value:Fe.pointId??"",onChange:se=>yt({...Fe,pointId:se.target.value})},e("option",{value:""},"不归到具体功能点"),A.map(se=>e("option",{key:se.id,value:se.id},`${se.id} ${se.title}`)))})()),e("div",{className:"ds-row"},e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"GitLab Issue"),e(u,{className:"ds-input",value:Fe.gitlabIssue,onChange:m=>yt({...Fe,gitlabIssue:m.target.value})})),e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"GitLab MR"),(d.gitlabMR?.iid??0)>0?e("div",{className:"ds-art-row",style:{padding:"6px 0",borderBottom:"none"}},e(f,{className:"ds-chip","data-on":d.gitlabMR.state==="opened"?"1":void 0},`MR !${d.gitlabMR.iid} · ${d.gitlabMR.state}`),e("div",{className:"ds-grow"},e("div",{className:"ds-art-title"},d.gitlabMR.title||`MR !${d.gitlabMR.iid}`),d.gitlabMR.url===""?null:e("div",{className:"ds-art-ref"},d.gitlabMR.url),(d.gitlabMR.sourceBranch??"")===""?null:e("div",{className:"ds-art-ref"},`分支 ${d.gitlabMR.sourceBranch} → ${d.gitlabMR.targetBranch||"—"}`),d.gitlabMR.pipeline===null||d.gitlabMR.pipeline===void 0?null:e("div",{className:"ds-art-ref"},e(f,{className:"ds-chip","data-sla":d.gitlabMR.pipeline.status==="failed"?"overdue":void 0},`流水线 ${d.gitlabMR.pipeline.status}`)," ",d.gitlabMR.pipeline.url===""?null:e("a",{className:"ds-link",href:d.gitlabMR.pipeline.url,target:"_blank",rel:"noreferrer"},`#${d.gitlabMR.pipeline.id}`)))):e(u,{className:"ds-input",placeholder:"还没关联 MR;提了 MR 后会自动同步",value:Fe.gitlabMR,onChange:m=>yt({...Fe,gitlabMR:m.target.value})}))),e("div",{className:"ds-row"},e("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void jt((d.gitlabMR?.iid??0)>0?{...Fe,gitlabMR:void 0}:Fe)},"保存改动"),e("button",{className:"ds-btn",disabled:C,onClick:de},"只删卡"))),e("div",{className:"ds-sec",style:Pe("plan")},e("div",{className:"ds-sec-head"},"计划",e("span",{className:"ds-hint"},"这张卡属于哪个项目/迭代、谁提的、什么时候要")),e("div",{className:"ds-sec-body"},e("div",{className:"ds-row"},e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"业务项目"),e(x,{className:"ds-select",value:B.project,onChange:m=>L({...B,project:m.target.value,iteration:"",service:""})},e("option",{value:""},"不属于任何项目"),(h.config?.projects??[]).map(m=>e("option",{key:m.id,value:m.id},`${m.key?`${m.key} · `:""}${m.name}`)))),e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"迭代"),e(x,{className:"ds-select",value:B.iteration,onChange:m=>L({...B,iteration:m.target.value})},e("option",{value:""},"不指定迭代"),((h.config?.projects??[]).find(m=>m.id===B.project)?.iterations??[]).map(m=>e("option",{key:m.id,value:m.id},m.name))))),((h.config?.projects??[]).find(m=>m.id===B.project)?.services??[]).length===0?null:e("div",{className:"ds-field"},e("div",{className:"ds-label"},"服务(决定用哪个 git 路径切 worktree)"),e(x,{className:"ds-select",value:B.service??"",onChange:m=>L({...B,service:m.target.value})},e("option",{value:""},"用项目级默认目录"),((h.config?.projects??[]).find(m=>m.id===B.project)?.services??[]).map(m=>e("option",{key:m.id,value:m.id},`${m.name}${m.repoPath?` · ${m.repoPath}`:""}`))),e("div",{className:"ds-hint"},"一个项目有多个服务(每个服务一个 git 路径)时,这里决定这张卡改哪个服务。")),e("div",{className:"ds-row"},e("div",{className:"ds-field",style:{flex:2}},e("div",{className:"ds-label"},"业务负责人"),e(u,{className:"ds-input",value:B.owner,placeholder:"提需求的人,例如 张伟",onChange:m=>L({...B,owner:m.target.value})})),e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"期望完成"),e(u,{className:"ds-input",type:"date",value:B.due,onChange:m=>L({...B,due:m.target.value})}))),e("div",{className:"ds-row"},e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"所属版本"),e(x,{className:"ds-select",value:B.releaseId,onChange:m=>L({...B,releaseId:m.target.value})},e("option",{value:""},"不挂版本"),(h.releases??[]).map(m=>e("option",{key:m.id,value:m.id},`${m.version||m.id} ${m.name}`.trim())))),e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"编号"),e("div",{className:"ds-hint"},d.code===""?"—(未挂需求)":d.code))),e("div",{className:"ds-listrow-actions"},e("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void Do()},"保存计划"),d.dueAt>0&&d.dueAt<Date.now()&&d.status!=="done"?e("span",{className:"ds-err"},"已逾期"):null))),e("div",{className:"ds-sec",style:Pe("plan")},e("div",{className:"ds-sec-head"},"代码隔离(git worktree)",e("span",{className:"ds-hint"},he===null?"这张卡还没有独立工作目录":"这张卡自己的分支与目录")),e("div",{className:"ds-sec-body"},he===null?e("div",{className:"ds-field"},e("div",{className:"ds-hint"},"开启「代码隔离 = worktree」并给项目配好本机代码目录后,派单会自动切一条 task/<编号> 分支;也可以先手动建一个。"),e("div",{className:"ds-listrow-actions"},e("button",{className:"ds-btn",disabled:C,onClick:()=>void Rp("create")},"建 worktree"))):e("div",{className:"ds-field"},e("div",{className:"ds-code-line"},`${he.branch} · 基线 ${he.base}`),e("div",{className:"ds-code-line"},he.path),e("div",{className:"ds-hint"},`仓库 ${he.repo}${je?` · ${je}`:""}`),e("div",{className:"ds-listrow-actions"},e("button",{className:"ds-btn",disabled:C,onClick:()=>void Rp("list")},"看 git worktree 列表"),e("button",{className:"ds-btn",disabled:C,onClick:()=>void Rp("remove")},"回收 worktree"))),je&&he===null?e("div",{className:"ds-hint"},je):null)),e("div",{className:"ds-sec",style:Pe("coding")},e("div",{className:"ds-sec-head"},"AI Coding 执行记录",e("span",{className:"ds-hint"},V===null?"改代码要留记录:谁、什么模型、改了什么":"研发 agent 登记,人也可以补录或评审")),e("div",{className:"ds-sec-body"},V===null?e("div",{className:"ds-empty"},"还没有执行记录。"):e("div",{className:"ds-code-box"},e("div",{className:"ds-code-head"},e(f,{className:"ds-chip","data-review":V.review.status},nx[V.review.status]??V.review.status),e("div",{className:"ds-grow"},e("div",{className:"ds-code-line"},[V.agent||"未登记 agent",V.model,V.branch].filter(Boolean).join(" · ")),V.context===""?null:e("div",{className:"ds-hint"},V.context)),e("span",{className:"ds-hint"},V.unitTests.total>0?`单测 ${V.unitTests.passed}/${V.unitTests.total}`:"无单测"),he===null?null:o("拿 worktree 里的 git 记录,比执行记录里自报的提交 / 文件 / 分支",e("button",{className:"ds-btn ds-btn-ghost",disabled:C||Pt.busy,onClick:()=>void ME()},Pt.busy?"核对中…":Pt.line===""?"核对代码事实":"再核对一次")),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"拉 MR 的改动与流水线,和自报的文件数/提交数比一遍",onClick:()=>void FE()},"从 GitLab 核对")),Pt.line===""?V.verified===null||V.verified===void 0?null:e("div",{className:"ds-hint","data-verify":V.verified.ok?"ok":"bad",style:{marginTop:6}},`${V.verified.ok?"✅":"⚠"} 上次核对 ${Qe(V.verified.at)}:分支 ${V.verified.branch} · 提交 ${V.verified.commitCount.actual} 个 · 改动 ${V.verified.fileCount.actual} 个文件${V.verified.missingCommits.length+V.verified.missingFiles.length===0?"":` · ${V.verified.missingCommits.length+V.verified.missingFiles.length} 项对不上`}`):e("div",{className:"ds-hint","data-verify":Pt.ok===!0?"ok":"bad",style:{marginTop:6}},`${Pt.ok===!0?"✅":"⚠"} ${Pt.line}`),(V.commits??[]).length===0?null:e("div",{className:"ds-code-list"},V.commits.slice(0,6).map(m=>e("div",{key:m.id,className:"ds-code-item"},e("code",null,m.sha.slice(0,8)),e("span",{className:"ds-grow"},m.message||"(无提交说明)"),e("span",{className:"ds-hint"},`${m.files} 文件`))),V.commits.length>6?e("div",{className:"ds-hint"},`还有 ${V.commits.length-6} 次提交`):null),(V.files??[]).length===0?null:e("div",{className:"ds-code-files"},V.files.slice(0,12).map(m=>e("span",{key:m.id,className:"ds-code-file","data-change":m.change},`${m.path}${m.additions>0?` +${m.additions}`:""}${m.deletions>0?` -${m.deletions}`:""}`)),V.files.length>12?e("span",{className:"ds-hint"},`还有 ${V.files.length-12} 个`):null),V.review.note===""?null:e("div",{className:"ds-code-note"},`评审意见:${V.review.note}`),e("div",{className:"ds-row"},e(u,{className:"ds-input",style:{flex:1},value:qa,placeholder:"评审意见(可选,写清文件/行为什么/怎么改)",onChange:m=>Tn(m.target.value)}),e("button",{className:"ds-btn",disabled:C,onClick:()=>void _y("approved")},"评审通过"),e("button",{className:"ds-btn",disabled:C,onClick:()=>void _y("changes_requested")},"要求修改"),V.mergedAt>0?e("span",{className:"ds-hint"},`已合并 · ${V.mergedBy||"—"}`):e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>void LE()},"标记已合并"))),Ie===null?e("div",{className:"ds-row"},e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:DE},V===null?"手动补录执行记录":"编辑执行记录")):e("div",null,e("div",{className:"ds-row"},e("div",{className:"ds-field",style:{flex:1}},i("Coding Agent","这次改代码的 agent 名字,只作记录,不影响派单"),e(u,{className:"ds-input",value:Ie.agent,placeholder:"claude-code / codex / 自研",onChange:m=>Ue({...Ie,agent:m.target.value})})),e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"模型"),e(u,{className:"ds-input",value:Ie.model,placeholder:"deepseek-v4.1-flash",onChange:m=>Ue({...Ie,model:m.target.value})})),e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"分支"),e(u,{className:"ds-input",value:Ie.branch,placeholder:"feature/xxx",onChange:m=>Ue({...Ie,branch:m.target.value})}))),e("div",{className:"ds-row"},e("div",{className:"ds-field",style:{flex:"0 0 110px"}},i("单测总数","这次执行报的单测总数,可以 agent 写回,也可以手填"),e(u,{className:"ds-input",value:Ie.total,onChange:m=>Ue({...Ie,total:m.target.value})})),e("div",{className:"ds-field",style:{flex:"0 0 110px"}},i("通过数","通过的条数;少于总数时卡片过不了准出"),e(u,{className:"ds-input",value:Ie.passed,onChange:m=>Ue({...Ie,passed:m.target.value})})),e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"这次依据的上下文"),e(u,{className:"ds-input",value:Ie.context,placeholder:"例如 PRD v1.2 + 架构方案 v1",onChange:m=>Ue({...Ie,context:m.target.value})}))),e("div",{className:"ds-row"},e("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void OE()},"保存执行记录"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>Ue(null)},"取消")))))),e("div",{className:"ds-dw-col"},e("div",{className:"ds-sec",style:Pe("test")},e("div",{className:"ds-sec-head"},"验收清单",e("span",{className:"ds-hint"},bt.total===0?"这张卡还没有清单":`${ve} / ${bt.total} 已勾`)),e("div",{className:"ds-sec-body"},bt.total===0?null:e("div",{className:"ds-check-progress"},e("div",{className:"ds-check-bar","data-full":ve===bt.total?"1":"0"},e("span",{style:{width:`${bt.total===0?0:Math.round(ve/bt.total*100)}%`}}))),te===null&&bt.total>0?e("div",{className:"ds-hint"},"载入清单…"):ce.map(m=>e("div",{key:m.id,className:"ds-check-row","data-done":m.done?"1":"0"},e(v,{checked:m.done,disabled:C,onChange:()=>void nn(m)}),e("div",{className:"ds-grow"},e("div",{className:"ds-check-text"},m.text,e("span",{className:"ds-hint"},` #${m.id}`)),m.note||m.by?e("div",{className:"ds-hint"},`${m.by?`${m.by} · `:""}${m.at?Qe(m.at):""}${m.note?` · ${m.note}`:""}`):null),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>void cs(m)},"×"))),e("div",{className:"ds-row"},e(u,{className:"ds-input",style:{flex:1},value:w,placeholder:"再加一条验收条目,回车提交",onChange:m=>T(m.target.value),onKeyDown:m=>{m.key==="Enter"&&an()}}),e("button",{className:"ds-btn",disabled:C||w.trim()==="",onClick:()=>void an()},"+ 加一条")),e("div",{className:"ds-hint"},"清单就是「做完」的定义:AI 每完成一项要勾一项并附证据;人也可以直接勾。"))),e("div",{className:"ds-sec",style:Pe("deliver")},e("div",{className:"ds-sec-head"},"交付物",e("span",{className:"ds-hint"},"文档、MR、用例、报告——交付要有东西,不只是一句「做完了」;登记后会写成飞书云盘需求文件夹里的一份文档"),_r(d).length>0?e("span",{className:"ds-card-warn",title:"这些交付物还没写正文,点「正文」补上再同步"},`● ${_r(d).length} 件缺正文`):null,(d.artifacts??[]).length>0?e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"把这张卡的交付物全部写进需求文件夹(已归档的会覆盖更新)",onClick:()=>void RE()},"同步到云盘"):null),e("div",{className:"ds-sec-body","data-scroll":"1"},(d.artifacts??[]).length===0?e("div",{className:"ds-empty"},"还没有交付物。"):(d.artifacts??[]).map(m=>e("div",{key:m.id,className:"ds-art-wrap"},e("div",{className:"ds-art-row","data-missing":Te(m)?"0":"1"},e(f,{className:"ds-chip","data-kind":m.kind},Hp[m.kind]??m.kind),e("div",{className:"ds-grow"},e("div",{className:"ds-art-title"},Te(m)?null:e("span",{className:"ds-card-warn",style:{marginRight:6},title:"这条交付物还没写正文,云盘文档里只有标题"},"●"),m.title),e("div",{className:"ds-art-ref"},`正文 ${typeof m.contentLength=="number"?m.contentLength:String(m.content??"").length} 字${Te(m)?"":" · 缺正文"}${m.doc?.url?"":" · 还没归档"}`),m.ref===""?null:e("div",{className:"ds-art-ref"},m.ref),m.doc?.url?e("a",{className:"ds-art-ref",href:m.doc.url,target:"_blank",rel:"noreferrer"},`📄 ${m.doc.name||"云盘文档"}`):m.doc?.error?e("div",{className:"ds-error"},m.doc.error):null),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"直接读正文(Markdown 渲染)",onClick:()=>void nt(m)},we===m.id?"收起":"阅读"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"编辑正文",onClick:()=>void ct(m)},"正文"),m.doc?.url?e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"用最新正文覆盖云盘文档",onClick:()=>void Py(m)},"更新"):e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"写进需求文件夹",onClick:()=>void Py(m)},"归档"),e(x,{className:"ds-select",style:{width:92,height:22,fontSize:11},value:m.status,disabled:C,onChange:A=>void AE(m,A.target.value)},Jy.map(A=>e("option",{key:A,value:A},ax[A]))),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>void jE(m)},"×")),we===m.id?e("div",{className:"ds-md-preview ds-reader"},ye[m.id]===void 0&&Te(m)?e("span",{className:"ds-hint"},"读取中…"):Ne(m).trim()===""?e("span",{className:"ds-hint"},"这条交付物还没有正文。"):s(Ne(m))):null)),D===null?null:e("div",{style:{marginTop:8}},e(b,{className:"ds-input",style:{width:"100%"},rows:8,value:D.content,placeholder:"写清楚做了什么、结论、风险。这段会原样写进云盘文档正文。",onChange:m=>K({...D,content:m.target.value})}),e("div",{className:"ds-row",style:{justifyContent:"flex-end",marginTop:6}},e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>K(null)},"取消"),e("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void Rn({id:D.id})},"保存正文并同步"))),e("div",{className:"ds-row"},e(x,{className:"ds-select",style:{width:104},value:Q.kind,onChange:m=>R({...Q,kind:m.target.value})},Zy.map(m=>e("option",{key:m,value:m},Hp[m]))),e(u,{className:"ds-input",style:{flex:1},value:Q.title,placeholder:"交付物名称,例如 登录模块技术方案",onChange:m=>R({...Q,title:m.target.value})}),e(u,{className:"ds-input",style:{flex:1},value:Q.ref,placeholder:"路径 / 链接 / MR 号",onChange:m=>R({...Q,ref:m.target.value})})),e(b,{className:"ds-input",style:{width:"100%",marginTop:6},rows:5,value:Q.content,placeholder:"交付物正文(Markdown)。这段会原样写成云盘文档的正文:做什么、怎么做、结论、风险。留空也能登记,但云盘里只有标题。",onChange:m=>R({...Q,content:m.target.value})}),e("div",{className:"ds-row",style:{justifyContent:"flex-end",marginTop:6}},e("button",{className:"ds-btn",disabled:C||Q.title.trim()==="",onClick:()=>void In()},"登记并归档")))),e("div",{className:"ds-sec",style:Pe("test")},e("div",{className:"ds-sec-head"},"测试用例",e("span",{className:"ds-hint"},et.total===0?"测试同学把用例登记在这里,逐条执行并回填结果":le),e("button",{className:"ds-btn ds-btn-ghost",disabled:$e.busy,onClick:()=>void rt()},$e.busy?"生成中…":"✨ 按需求生成"),e("button",{className:"ds-btn ds-btn-ghost",disabled:me.busy||ds.filter(m=>m.http!=null).length===0,onClick:()=>void ta(void 0)},me.busy?"运行中…":"▶ 跑接口用例")),e("div",{className:"ds-sec-body","data-scroll":"1"},me.note===""?null:e("div",{className:"ds-hint"},me.note),$e.note===""?null:e("div",{className:"ds-hint"},$e.note),et.total===0?e("div",{className:"ds-empty"},"还没有用例。"):te===null?e("div",{className:"ds-hint"},"载入用例…"):ds.map(m=>e("div",{key:m.id,className:"ds-art-row","data-result":m.result},e(x,{className:"ds-select",style:{width:84,height:22,fontSize:11},value:m.result,disabled:C,onChange:A=>void xt(m,A.target.value)},Gp.map(A=>e("option",{key:A,value:A},Vl[A]))),e("div",{className:"ds-grow"},e("div",{className:"ds-art-title"},m.title),e("div",{className:"ds-row",style:{gap:6,alignItems:"center",marginTop:2}},e(f,{className:"ds-chip ds-chip-soft"},Kp[m.type??"functional"]??"功能"),e(f,{className:"ds-chip ds-chip-soft","data-pri":m.priority??"p2"},String(m.priority??"p2").toUpperCase()),String(m.preconditions??"")===""?null:e("span",{className:"ds-hint"},`前置:${m.preconditions}`),(m.steps??[]).length===0?null:e("span",{className:"ds-hint"},`步骤 ${m.steps.length} 条`)),m.expected===""?null:e("div",{className:"ds-art-ref"},`期望:${m.expected}`),m.shell==null?m.http==null?null:e("div",{className:"ds-art-ref"},`接口:${m.http.method} ${m.http.url} → 期望 ${m.http.expectStatus}${m.http.expectContains?` 且含 «${m.http.expectContains}»`:""}`):m.shell!=null?e("div",{className:"ds-art-ref"},"shell:"+m.shell.command):e("div",{className:"ds-art-ref"},"db:"+m.db.sql),m.lastRun==null?null:e("div",{className:"ds-art-ref"},`${m.lastRun.ok?"✅":"❌"} 最近执行:${m.lastRun.status===0?m.lastRun.error:`${m.lastRun.status} · ${m.lastRun.ms}ms`}(${new Date(m.lastRun.at).toLocaleString("zh-CN")})`),m.lastRun?.response?e("div",{className:"ds-code-note"},`响应片段:${String(m.lastRun.response).slice(0,400)}${String(m.lastRun.response).length>400?"…":""}`):null,(m.lastRun?.steps??[]).length===0?null:e("div",{className:"ds-art-ref"},`步骤:${m.lastRun.steps.map(A=>`${A.ok?"✅":"❌"} ${A.method} ${A.url}${A.status===0?"":` → ${A.status}`}`).join(";")}`),(m.http?.steps??[]).length===0?null:e(f,{className:"ds-chip ds-chip-soft"},`多步 ${m.http.steps.length}`),((h.requirements??[]).find(A=>A.id===d.requirementId)?.points??[]).length===0?m.pointId?e("div",{className:"ds-art-ref"},`功能点:${m.pointId}`):null:e("div",{className:"ds-row",style:{gap:6,alignItems:"center"}},e("span",{className:"ds-hint"},"功能点"),e(x,{className:"ds-select",style:{width:190,height:26},value:m.pointId??"",onChange:async A=>{try{await a("/task/case",{id:d.id,action:"update",caseId:m.id,pointId:A.target.value}),await S()}catch(se){I(se instanceof Error?se.message:String(se))}}},e("option",{value:""},"不归功能点"),((h.requirements??[]).find(A=>A.id===d.requirementId)?.points??[]).map(A=>e("option",{key:A.id,value:A.id},`${A.id} ${A.title}`)))),m.note===""?null:e("div",{className:"ds-art-ref"},`记录:${m.note}${m.by?` — ${m.by}`:""}`)),m.http==null?null:e("button",{className:"ds-btn ds-btn-ghost",disabled:me.busy,onClick:()=>void ta(m.id)},"▶"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"标记为不稳定用例:失败时不自动开缺陷","data-flaky":m.flaky===!0?"1":"0",onClick:()=>void Ye(m)},m.flaky===!0?"不稳":"标不稳"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>void Re(m)},"×"))),e("div",{className:"ds-row"},e(u,{className:"ds-input",style:{flex:1},value:X.title,placeholder:"用例:做什么,例如 用错误密码连续登录 5 次",onChange:m=>oe({...X,title:m.target.value})}),e(u,{className:"ds-input",style:{flex:1},value:X.expected,placeholder:"期望结果,例如 第 5 次返回 429 并锁定 10 分钟",onChange:m=>oe({...X,expected:m.target.value})}),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"加一条 shell 用例:跑命令看退出码与输出(需要先在设置里打开 allowShell)",onClick:()=>void ue()},"+ shell"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"加一条数据库用例:查库断言行数与某列值(需要先在设置里打开 allowDb)",onClick:()=>void O()},"+ 数据库"),e("button",{className:"ds-btn",disabled:C||X.title.trim()==="",onClick:()=>void Me()},"+ 加用例")),e("div",{className:"ds-row",style:{gap:8,flexWrap:"wrap",marginTop:6}},e(x,{className:"ds-select",style:{width:96},value:X.type??"functional",onChange:m=>oe({...X,type:m.target.value})},ex.map(m=>e("option",{key:m,value:m},Kp[m]))),e(x,{className:"ds-select",style:{width:84},value:X.priority??"p2",onChange:m=>oe({...X,priority:m.target.value})},tx.map(m=>e("option",{key:m,value:m},m.toUpperCase()))),e(u,{className:"ds-input",style:{flex:1,minWidth:200},value:X.preconditions??"",placeholder:"前置条件,例如 会员等级≥银卡、账户余额充足",onChange:m=>oe({...X,preconditions:m.target.value})})),e("div",{className:"ds-field"},e("label",{},"测试步骤(可选,一行一步)"),e(p,{className:"ds-input",rows:2,value:X.stepsText??"",placeholder:`1. 打开积分抵扣页
|
|
18
18
|
2. 选择「抵扣 10 元」
|
|
19
|
-
3. 提交订单`,onChange:m=>
|
|
20
|
-
GET /api/points | 200 |`,onChange:m=>le({...Z,steps:m.target.value})}),e("div",{className:"ds-hint"},"先登录取 token、再带 token 调业务接口时用;变量写成 {{data.token}} 放进 url 或 body。第一步失败后面不会跑。")))),e("div",{className:"ds-sec",style:$e("overview")},e("div",{className:"ds-sec-head"},"其它信息"),e("dl",{className:"ds-kv"},e("dt",{},"编号"),e("dd",{},d.code===void 0||d.code===""?"未挂需求(无编号)":d.code),e("dt",{},"所属需求"),e("dd",{},(()=>{const m=(h.requirements??[]).find(j=>j.id===d.requirementId);return m===void 0?"未挂需求":`${m.code||m.id}|${m.title}`})()),e("dt",{},"所属项目"),e("dd",{},(h.config?.projects??[]).find(m=>m.id===d.project)?.name??"未归属项目"),e("dt",{},"迭代"),e("dd",{},((h.config?.projects??[]).find(m=>m.id===d.project)?.iterations??[]).find(m=>m.id===d.iteration)?.name??"未排期"),e("dt",{},"服务"),e("dd",{},(()=>{const m=(h.config?.projects??[]).find(rt=>rt.id===d.project);if((d.service??"")==="")return"未指定(用项目默认目录)";const j=(m?.services??[]).find(rt=>rt.id===d.service);if(j===void 0)return`${d.service}(已失效)`;const ne=(j.dependsOn??[]).map(rt=>(m.services??[]).find(cs=>cs.id===rt)).filter(rt=>rt!==void 0),je=ne.length===0?"":` · 依赖 ${ne.map(rt=>rt.name).join("、")}`;return`${j.name}${j.repoPath?` · ${j.repoPath}`:""}${je}`})()),e("dt",{},"父任务"),e("dd",{},(()=>{if(d.parent===""||d.parent===void 0)return"无";const m=(h.tasks??[]).find(j=>j.id===d.parent);return m===void 0?d.parent:`${m.code||m.id}|${m.title}`})()),e("dt",{},"来源用例"),e("dd",{},d.bugSource==null?"无(不是用例自动开的缺陷)":`${d.bugSource.code||d.bugSource.taskId} · ${d.bugSource.caseTitle}(判失败于 ${Ye(d.bugSource.at)},${d.bugSource.by||"系统"})`),e("dt",{},"关联缺陷"),e("dd",{},(()=>{const m=(h.tasks??[]).filter(j=>j.bugSource!=null&&j.bugSource.taskId===d.id);return m.length===0?"无":m.map(j=>`${j.code||j.id}(${(h.statuses??[]).find(ne=>ne.id===j.status)?.label??j.status})`).join("、")})()),e("dt",{},"飞书会话"),e("dd",{},d.feishuThread===""||d.feishuThread===void 0?"未关联":d.feishuThread),e("dt",{},"状态历史"),e("dd",{},d.history.map(m=>{const j=(h.statuses??[]).find(je=>je.id===m.status)?.label??m.status,ne=m.note===void 0||m.note===""?"":`(${m.note})`;return`${j} · ${Ye(m.at)}${ne}`}).join(" → ")||"无"))),e("div",{className:"ds-sec",style:$e("discuss")},e("div",{className:"ds-sec-head"},`评论(${qe})`,e("span",{className:"ds-hint"},"最新的在最上面")),qe===0?e("div",{className:"ds-empty"},"还没有评论。在下面输入,或用 @专家名 直接点名派活。"):Se===null?e("div",{className:"ds-hint",style:{padding:"8px 2px"}},"载入评论…"):e("div",{className:"ds-comments"},Se.slice().reverse().map(m=>{const j=h.config?.experts??[],ne=j.find(ka=>ka.name===m.author)??j.find(ka=>m.author!==void 0&&m.author!==""&&(ka.name.includes(m.author)||m.author.includes(ka.name)))??j.find(ka=>m.author===(Aa[ka.role]??"")),je=/产品|架构|研发|开发|测试|运维|专家/.test(String(m.author??"")),rt=m.kind==="human"?!0:m.kind==="agent"?!1:!(ne!==void 0||je),cs=rt?m.author===void 0||m.author===""||m.author==="人"?"我":m.author:ne?.name??(m.author===""||m.author===void 0?"AI":m.author),Ct=s(m.body);return e("div",{className:"ds-cm",key:m.id,"data-kind":rt?"human":"agent","data-role":ne?.role??""},e("div",{className:"ds-cm-avatar"},rt?e("span",{className:"ds-cm-initial"},cs.slice(0,1)):ne?.emoji??"🤖"),e("div",{className:"ds-cm-main"},e("div",{className:"ds-cm-head"},e("span",{className:"ds-cm-name"},cs),e("span",{className:"ds-cm-kind"},rt?"我提出":"AI 回复"),ne!==void 0&&ne.domain!==""?e(f,{className:"ds-chip","data-role":ne.role},ne.domain):null,e("span",{className:"ds-cm-meta"},Ye(m.at))),e("div",{className:"ds-cm-bubble ds-md"},Ct.length===0?e("span",{className:"ds-hint"},"(这条评论没有正文)"):Ct)))})))))),e("div",{className:"ds-dw-foot"},e("div",{className:"ds-mention-bar"},e("button",{className:"ds-btn",disabled:C,onClick:()=>{Ra(0),la(m=>m===null||m.inline?{query:"",from:null,inline:!1}:null)}},St===null?`@ 提到谁(${Dt.length})`:"收起名单"),e("span",{className:"ds-hint"},"也可以在输入框里直接打「@」搜")),St!==null?e(k,{roster:Dt,query:St.query,active:Pn,onActive:Ra,onQuery:m=>{la(j=>j===null?{query:m,from:null,inline:!1}:{...j,query:m}),Ra(0)},onPick:z,onClose:()=>la(null)}):null,e("div",{className:"ds-composer"},e(p,{className:"ds-textarea",style:{minHeight:58},placeholder:"支持 Markdown:`# 标题`、`**粗体**`、`` `代码` ``、``` 代码块 ```、`- 列表`、`| 表格 |`;打「@」选专家派活。",value:A,onFocus:()=>et("discuss"),onChange:m=>{G(m.target.value),Q(m.target.value,m.target.selectionStart??m.target.value.length)},onKeyDown:m=>{if((m.metaKey||m.ctrlKey)&&(m.key==="Enter"||m.key==="NumpadEnter")){m.preventDefault(),pe();return}if(!(St===null||St.inline!==!0))if(m.key==="ArrowDown"||m.key==="ArrowUp"){if(m.preventDefault(),Ot.length===0)return;Ra(j=>(j+(m.key==="ArrowDown"?1:-1)+Ot.length)%Ot.length)}else m.key==="Enter"&&Ot.length>0?(m.preventDefault(),z(Ot[Math.min(Pn,Ot.length-1)].name)):m.key==="Escape"&&(m.preventDefault(),la(null))}}),e("div",{className:"ds-composer-bar"},e("span",{className:"ds-hint"},"Markdown 可用 · 打 @ 派活 · Ctrl/⌘+Enter 发送"),e("span",{className:"ds-composer-count"},A.trim()===""?"还没写":`${A.length} 字`),e("button",{className:"ds-btn ds-btn-primary",disabled:C||A.trim()==="",onClick:()=>void pe()},C?"发送中…":"发表评论")),L!==null?e("span",{className:"ds-ok"},L):null,_!==null?e("span",{className:"ds-err"},_):null))))}return g}const tf=(e,t)=>e.length>t?e.slice(0,t-1)+"…":e;function Ql(e){const t=[],a=new Map((e.statuses??[]).map(n=>[n.id,n.label]));for(const n of e.tasks??[])t.push({key:"task:"+n.id,kind:"task",id:n.id,label:`${n.code??""} ${n.title}`.trim(),hint:[a.get(n.status)??n.status,n.owner?.label??""].filter(Boolean).join(" · "),search:[n.code,n.title,n.requirementTitle,n.id].filter(Boolean).join(" ").toLowerCase()});for(const n of e.requirements??[])t.push({key:"requirement:"+n.id,kind:"requirement",id:n.id,label:`${n.code??""} ${n.title}`.trim(),hint:["需求",n.domain||"",n.owner||""].filter(Boolean).join(" · "),search:[n.code,n.title,n.domain].filter(Boolean).join(" ").toLowerCase()});for(const n of e.releases??[])t.push({key:"release:"+n.id,kind:"release",id:n.id,label:`${n.name??""} ${n.tagName??""}`.trim(),hint:["版本",n.status??"",n.at?Ye(n.at):""].filter(Boolean).join(" · "),search:[n.name,n.tagName,n.status].filter(Boolean).join(" ").toLowerCase()});for(const n of e.config?.experts??[])t.push({key:"expert:"+n.id,kind:"expert",id:n.id,label:`${n.emoji??""} ${n.name}`.trim(),hint:["专家",Aa[n.role]??n.role??"",n.domain??""].filter(Boolean).join(" · "),search:[n.name,n.id,n.domain,n.description,Aa[n.role]].filter(Boolean).join(" ").toLowerCase()});for(const n of e.config?.teams??[])t.push({key:"team:"+n.id,kind:"team",id:n.id,label:`👥 ${n.name}`.trim(),hint:["专家团",(n.members??[]).length+" 位成员"].join(" · "),search:[n.name,n.id,n.description,...(n.members??[]).map(r=>r.name??r.id)].filter(Boolean).join(" ").toLowerCase()});for(const n of e.config?.projects??[])t.push({key:"project:"+n.id,kind:"project",id:n.id,label:n.name,hint:["项目",(n.services??[]).length+" 个服务",(n.iterations??[]).length+" 个迭代"].filter(Boolean).join(" · "),search:[n.name,n.id,n.description,...(n.services??[]).map(r=>r.name??r.repoPath)].filter(Boolean).join(" ").toLowerCase()});for(const n of e.skills??[])t.push({key:"skill:"+n.name,kind:"skill",id:n.name,label:"🧩 "+n.name,hint:["技能",n.enabled===!1?"已停用":"已启用",(n.users??0)+" 位专家在用"].join(" · "),search:[n.name,n.description,...n.tags??[]].filter(Boolean).join(" ").toLowerCase()});return t}const gx=[{id:"projects",label:"项目与迭代"},{id:"experts",label:"专家"},{id:"teams",label:"专家团"},{id:"skills",label:"技能库"},{id:"columns",label:"列的负责人"},{id:"gitlab",label:"代码仓库"},{id:"feishu",label:"飞书机器人"},{id:"health",label:"集成健康"},{id:"agents",label:"自动派单"},{id:"testing",label:"测试执行"},{id:"costs",label:"成本与预算"},{id:"environments",label:"部署环境"},{id:"board",label:"看板外观"},{id:"ldap",label:"统一登录"},{id:"access",label:"权限与审计"},{id:"storage",label:"数据与备份"}],af=[{id:"new-requirement",key:"n",label:"Ctrl/⌘+Alt+Shift+N"},{id:"new-task",key:"t",label:"Ctrl/⌘+Alt+Shift+T"},{id:"card-dispatch",key:"d",label:"Ctrl/⌘+Alt+Shift+D"}],Xl=new Map(af.map(e=>[e.id,e.label]));function hx(e){if(e==null)return!1;const t=String(e.tagName??"").toUpperCase();return t==="INPUT"||t==="TEXTAREA"||t==="SELECT"?!0:e.isContentEditable===!0}function vx(e){return e==null||typeof e.getAttribute!="function"?!1:e.getAttribute("data-palette-input")==="1"}function bx(e){if(e==null||!(e.ctrlKey===!0||e.metaKey===!0)||e.altKey!==!0||e.shiftKey!==!0||!vx(e.target)&&hx(e.target))return null;const t=/^Key([A-Z])$/.exec(String(e.code??"")),a=t===null?String(e.key??"").toLowerCase():t[1].toLowerCase(),n=af.find(r=>r.key===a);return n===void 0?null:n.id}const yx=[{id:"new-requirement",shortcut:Xl.get("new-requirement"),label:"新建需求",hint:"需求 → 功能点 → 拆成卡",keys:"新建 需求 new requirement 提需求"},{id:"new-task",shortcut:Xl.get("new-task"),label:"新建任务",hint:"直接在看板上建一张卡",keys:"新建 任务 卡片 new task 建卡"},{id:"tab:board",label:"打开看板",hint:"八列泳道 · 拖拽换列",keys:"看板 board 泳道"},{id:"tab:requirements",label:"打开需求",hint:"需求 · 功能点 · 文档 · 准出",keys:"需求 requirements prd"},{id:"tab:cases",label:"打开用例",hint:"跨卡用例总览 · 最近结果",keys:"用例 case 用例库 测试用例 总览"},{id:"tab:releases",label:"打开版本",hint:"发布 · 灰度 · 部署记录",keys:"版本 release 发布 部署"},{id:"tab:analytics",label:"打开效能",hint:"周期 · 返工 · AI 采纳",keys:"效能 analytics 度量 报表"},{id:"tab:dashboard",label:"打开工作台",hint:"风险与今日待办",keys:"工作台 dashboard 风险 待办"},{id:"export:tasks",label:"导出任务 CSV",hint:"看板上的卡,Excel 可直接打开",keys:"导出 csv 任务 export tasks 下载"},{id:"export:requirements",label:"导出需求 CSV",hint:"需求与准出情况",keys:"导出 csv 需求 export requirements 下载"},{id:"theme:light",label:"切换主题:明亮",hint:"浅色界面",keys:"主题 明亮 light theme 浅色"},{id:"theme:dark",label:"切换主题:深色",hint:"深色界面",keys:"主题 深色 dark theme 夜间"},{id:"theme:system",label:"切换主题:跟随系统",hint:"跟随宿主或操作系统的深浅色",keys:"主题 系统 system theme 自动"},{id:"card-advance-note",label:"推进并留言",hint:"选一张卡 → 写一句 → 推进到下一列",keys:"推进 留言 advance note 交接 换列 card"},{id:"card-advance",label:"把卡片推进到下一列",hint:"选一张卡 → 推进到下一状态",keys:"推进 advance 下一列 换列 移动 move card"},{id:"card-dispatch",shortcut:Xl.get("card-dispatch"),label:"把卡片派给专家",hint:"选一张卡 → 选一位专家跑起来",keys:"派单 dispatch assign 执行 run 专家 expert card"},{id:"card-comment",label:"给卡片留言",hint:"选一张卡 → 写一句讨论",keys:"留言 comment 讨论 评论 card"},{id:"clear-recents",label:"忘掉最近用过的动作",hint:"清空这台电脑上记的最近动作顺序",keys:"清除 清空 忘掉 重置 最近 recent clear reset"},{id:"column-advance",label:"整列推进一列",hint:"选一列 → 把这一列的卡批量推进到下一列",keys:"整列 批量 批量推进 column batch advance"},{id:"refresh",label:"刷新数据",hint:"重新拉一次看板与需求",keys:"刷新 refresh 重载 同步"},...gx.map(e=>({id:"settings:"+e.id,label:"打开设置:"+e.label,hint:"设置 → "+e.label,keys:"设置 settings 配置 "+e.label+" "+e.id}))];function xx(){return yx.map(e=>({key:"action:"+e.id,kind:"action",id:e.id,label:e.label,hint:e.hint,shortcut:e.shortcut,search:(e.label+" "+e.hint+" "+e.keys+" "+(e.shortcut??"")).toLowerCase()}))}function wx(e,t){if(!Array.isArray(t)||t.length===0)return e.slice();const a=new Map;t.forEach((s,o)=>{a.has(s)||a.set(s,o)});const n=[],r=[];for(const s of e){const o=s.kind==="action"?a.get(s.id):void 0;o===void 0?r.push(s):n.push({item:s,hit:o})}return n.sort((s,o)=>s.hit-o.hit),[...n.map(s=>s.item),...r]}const Zl="dsh-studio:recent-actions",kx=6;function Nx(){try{globalThis.localStorage?.removeItem(Zl)}catch{}}function Sx(e,t,a=kx){return[t,...(Array.isArray(e)?e:[]).filter(r=>r!==t)].slice(0,a)}function Cx(e){return[...xx(),...Ql(e)]}function Uo(e,t,a=20){const n=String(t??"").toLowerCase().split(/\s+/).filter(Boolean);if(n.length===0)return e.slice(0,a);const r=[];return e.forEach((s,o)=>{let i=0,l=!0;for(const c of n){const u=s.search.indexOf(c);if(u<0){l=!1;break}i+=u===0?3:u<8?2:1}l&&r.push({item:s,score:i,order:o})}),r.sort((s,o)=>o.score-s.score||s.order-o.order),r.slice(0,a).map(s=>s.item)}const Ex={task:"卡片",requirement:"需求",release:"版本",expert:"专家",team:"专家团",project:"项目",skill:"技能",action:"操作"},qo={"card-advance":{step:"card",title:"推进到下一列"},"card-advance-note":{step:"card",title:"推进并留言"},"card-dispatch":{step:"card",title:"派给专家"},"card-comment":{step:"card",title:"给卡片留言"},"column-advance":{step:"column",title:"整列推进"}};function $x(e,t){const a=e.statuses??[],n=a.findIndex(s=>s.id===t);if(n<0)return null;const r=(e.tasks??[]).filter(s=>s.status===t).map(s=>s.id);return{column:a[n],next:n+1>=a.length?null:a[n+1],total:r.length,ids:r}}async function Tx(e,t){const{api:a,state:n,confirm:r,prompt:s,notify:o}=t,i=n?.statuses??[],l=p=>i.find(f=>f.id===p)?.label??p,c=(n?.tasks??[]).find(p=>p.id===e.cardId),u=c===void 0?e.cardId:((c.code??"")+" "+c.title).trim();try{if(e.action==="card-advance"){const p=nf(n,e.cardId);return p===null?(o("这张卡已经在最后一列了","error"),{}):(await a("/task/update",{id:e.cardId,status:p}),o("已把「"+u+"」推进到「"+l(p)+"」"),{refresh:!0,open:e.cardId})}if(e.action==="card-advance-note"){const p=nf(n,e.cardId);if(p===null)return o("这张卡已经在最后一列了","error"),{};const f=await s("推进「"+u+"」到「"+l(p)+"」并留一句话",{title:"推进并留言",placeholder:"例如:评审通过,转测试"});return f===null||String(f).trim()===""?{}:(await a("/task/comment",{id:e.cardId,body:String(f).trim()}),await a("/task/update",{id:e.cardId,status:p}),o("已推进到「"+l(p)+"」并留言"),{refresh:!0,open:e.cardId})}if(e.action==="card-dispatch"){const p=(n?.config?.experts??[]).find(f=>f.id===e.expertId);return await a("/agents/run",{id:e.cardId,expert:e.expertId}),o("已派给 "+(p===void 0?e.expertId:p.emoji+p.name)),{refresh:!0}}if(e.action==="card-comment"){const p=await s("给「"+u+"」留一句话",{title:"卡片留言",placeholder:"例如:压测已通过,可以进评审"});return p===null||String(p).trim()===""?{}:(await a("/task/comment",{id:e.cardId,body:String(p).trim()}),o("留言已发到「"+u+"」"),{refresh:!0})}if(e.action==="column-advance"){const p=await Px({api:a,state:n,columnId:e.columnId,confirm:r});return p.error!==void 0?(o(p.error,"error"),{}):p.canceled===!0?{}:(p.failed.length===0?o("已把 "+p.moved+" 张卡推进到「"+p.nextLabel+"」"):o("推进 "+p.moved+" 张,"+p.failed.length+" 张没动:"+p.failed[0],"error"),{refresh:!0})}}catch(p){o(p instanceof Error?p.message:String(p),"error")}return{}}async function Px({api:e,state:t,columnId:a,confirm:n}){const r=$x(t,a);if(r===null)return{error:"没找到这一列"};if(r.next===null)return{error:"「"+r.column.label+"」已经是最后一列了"};if(r.total===0)return{error:"「"+r.column.label+"」这一列没有卡"};if(await n("把「"+r.column.label+"」里的 "+r.total+" 张卡一起推进到「"+r.next.label+"」?",{title:"整列推进",okText:"推进 "+r.total+" 张"})!==!0)return{canceled:!0};let o=0;const i=[];for(const l of r.ids)try{await e("/task/update",{id:l,status:r.next.id}),o+=1}catch(c){const u=(t.tasks??[]).find(p=>p.id===l);i.push(((u?.code??"")+" "+(u?.title??l)).trim()+":"+(c instanceof Error?c.message:String(c)))}return{moved:o,failed:i,nextLabel:r.next.label}}function nf(e,t){const a=e.statuses??[],n=(e.tasks??[]).find(s=>s.id===t);if(n===void 0)return null;const r=a.findIndex(s=>s.id===n.status);return r<0||r+1>=a.length?null:a[r+1].id}function _x({h:e,React:t}){return function({state:n,onPick:r,onClose:s,initialAction:o,initialSeq:i}){const[l,c]=t.useState(""),[u,p]=t.useState(0),[f,v]=t.useState(null),[x,b]=t.useState(()=>{try{const P=window.localStorage.getItem(Zl),W=P===null?[]:JSON.parse(P);return Array.isArray(W)?W.filter(J=>typeof J=="string"):[]}catch{return[]}}),k=P=>{if(P==null||P.kind!=="action")return;const W=Sx(x,P.id);b(W);try{window.localStorage.setItem(Zl,JSON.stringify(W))}catch{}},g=t.useRef(null),d=t.useMemo(()=>Cx(n),[n]),h=t.useMemo(()=>Ql(n).filter(P=>P.kind==="task"),[n]),y=t.useMemo(()=>Ql(n).filter(P=>P.kind==="expert"),[n]),S=t.useMemo(()=>(n.statuses??[]).map(P=>({key:"column:"+P.id,kind:"column",id:P.id,label:P.label,hint:(n.tasks??[]).filter(W=>W.status===P.id).length+" 张卡",search:String(P.label??"").toLowerCase()})),[n.statuses,n.tasks]),C=t.useMemo(()=>f===null?wx(Uo(d,l),l===""?x:[]):f.step==="expert"?Uo(y,l):f.step==="column"?Uo(S,l):Uo(h,l),[f,d,h,S,y,l,x]);t.useEffect(()=>{g.current?.focus()},[]),t.useEffect(()=>{if(o==null)return;const P=d.find(W=>W.id===o);if(P!==void 0){if(P.kind==="action"&&qo[P.id]!==void 0){E(P.id);return}r(P),s()}},[i]),t.useEffect(()=>{p(0)},[l]);const E=P=>{v({action:P,step:qo[P].step}),c(""),p(0)},_=P=>{if(P!==void 0){if(f===null){if(P.id==="clear-recents"){Nx(),s();return}if(k(P),P.kind==="action"&&qo[P.id]!==void 0){E(P.id);return}r(P),s();return}if(f.step==="column"){r({kind:"run",action:f.action,columnId:P.id}),s();return}if(f.step==="card"){if(f.action==="card-dispatch"){v({action:f.action,cardId:P.id,step:"expert"}),c(""),p(0);return}r({kind:"run",action:f.action,cardId:P.id}),s();return}r({kind:"run",action:f.action,cardId:f.cardId,expertId:P.id}),s()}},R=()=>{if(f===null){s();return}v(f.step==="expert"?{action:f.action,step:"card"}:null),c(""),p(0)},A=P=>{if(P.key==="Escape"){P.preventDefault(),R();return}if(P.key==="ArrowDown"){P.preventDefault(),p(W=>Math.min(C.length-1,W+1));return}if(P.key==="ArrowUp"){P.preventDefault(),p(W=>Math.max(0,W-1));return}P.key==="Enter"&&(P.preventDefault(),_(C[u]))},G=f===null?"搜索卡片 / 需求 / 版本 / 专家 / 技能,或输入「新建」「导出」「推进」(↑↓ 选择,回车执行,Esc 关闭)":f.step==="expert"?"选一位专家(输入过滤,Esc 返回)":f.step==="column"?"选一列(输入过滤,Esc 返回)":"选一张卡片(输入过滤,Esc 返回)",L=f===null?null:e("div",{className:"ds-palette-flow","data-flow":f.step},qo[f.action].title+(f.step==="expert"?" → 选一位专家":f.step==="column"?" → 选一列":" → 选一张卡片"));return e("div",{className:"ds-palette-veil",onClick:s},e("div",{className:"ds-palette",role:"dialog","aria-label":"全局搜索","data-palette":"1",onClick:P=>P.stopPropagation()},L,e("input",{ref:g,className:"ds-palette-input",placeholder:G,value:l,onChange:P=>c(P.target.value),onKeyDown:A,"data-palette-input":"1"}),e("div",{className:"ds-palette-list"},C.length===0?e("div",{className:"ds-hint",style:{padding:"10px 12px"}},f===null?"没有匹配的内容":f.step==="expert"?"没有匹配的专家":"没有匹配的卡片"):C.map((P,W)=>e("div",{key:P.key,className:"ds-palette-item","data-active":W===u?"1":"0",onMouseEnter:()=>p(W),onClick:()=>_(P)},e("span",{className:"ds-palette-kind","data-kind":P.kind},Ex[P.kind]??P.kind),e("span",{className:"ds-palette-label"},tf(P.label,80)),P.hint===""?null:e("span",{className:"ds-palette-hint"},tf((P.kind==="action"&&l===""&&x.includes(P.id)?"最近用过 · ":"")+P.hint,40)),P.shortcut===void 0||P.shortcut===null?null:e("span",{className:"ds-palette-key",title:"全局快捷键"},P.shortcut))))))}}let Jl=null;function Ix(e){Jl=e}function vt(){if(Jl===null)throw new Error("studio client context is not ready");return Jl}function Rx({h:e,React:t}){function a({title:n,hint:r,rows:s,onAdd:o,addLabel:i,render:l,empty:c}){return e("div",{className:"ds-panel"},e("div",{className:"ds-panel-head"},e("span",{},n),e("button",{className:"ds-btn",onClick:o},i??"新增")),e("div",{className:"ds-panel-body"},r!==void 0?e("div",{className:"ds-hint"},r):null,s.length===0?e("div",{className:"ds-hint"},c??"还没有内容。"):null,s.map(l)))}return a}function Ax({config:e,onChanged:t}){const{h:a,React:n,Editor:r,api:s,toast:o,confirmDialog:i,tipOf:l,tipLabel:c,TextField:u,TextAreaField:p,ChipField:f,CheckField:v,SelectField:x,SideDrawer:b}=vt(),k=e.experts??[],[g,d]=n.useState(null),[h,y]=n.useState(null),[S,C]=n.useState(!1),E=["🧩","📋","🏛️","🛠️","🧪","🔍","🛡️","⚙️","📦","💰","💳","📊","📈","🧠","🤖","🧭","🎯","🚀","🧱","🔧","🧰","🧮","📝","📚","🗂️","🔐","🌐","☁️","🗄️","🧬","🩺","⚖️"],_=async()=>{if(g!==null){C(!0),y(null);try{await s("/experts/save",{expert:g}),d(null),await t()}catch(I){y(I instanceof Error?I.message:String(I))}finally{C(!1)}}},R=async I=>{if(await i(`删除专家「${I.name}」?已用它派的单会保留历史评论。`,{title:"删除专家",danger:!0,okText:"删除"})){C(!0),y(null);try{await s("/experts/delete",{id:I.id}),await t()}catch(O){y(O instanceof Error?O.message:String(O))}finally{C(!1)}}},A=(I,O)=>d({...g,[I]:O}),[G,L]=n.useState(""),[P,W]=n.useState([]);n.useEffect(()=>{let I=!0;return s("/skills").then(O=>{I&&W(O.skills??[])}).catch(()=>{}),()=>{I=!1}},[]);const J=I=>{const O=g.skills??[];A("skills",O.includes(I)?O.filter(K=>K!==I):[...O,I])},[V,F]=n.useState(""),M=()=>{const I=V.trim();if(I===""||g===null)return;const O=g.skills??[];O.includes(I)||A("skills",[...O,I]),F("")},w=async()=>{const I=G.trim();if(I.length!==0){C(!0),y(null);try{const O=[{role:"product",name:"产品经理",emoji:"📋",prompt:`你是${I}业务的产品经理。
|
|
19
|
+
3. 提交订单`,onChange:m=>oe({...X,stepsText:m.target.value})})),e("div",{className:"ds-field"},e("label",{},"多步接口(可选,一行一步:METHOD url | 期望状态码 | 提取变量)"),e(p,{className:"ds-input",rows:3,value:X.steps,placeholder:`POST /api/auth/login | 200 | data.token
|
|
20
|
+
GET /api/points | 200 |`,onChange:m=>oe({...X,steps:m.target.value})}),e("div",{className:"ds-hint"},"先登录取 token、再带 token 调业务接口时用;变量写成 {{data.token}} 放进 url 或 body。第一步失败后面不会跑。")))),e("div",{className:"ds-sec",style:Pe("overview")},e("div",{className:"ds-sec-head"},"其它信息"),e("dl",{className:"ds-kv"},e("dt",{},"编号"),e("dd",{},d.code===void 0||d.code===""?"未挂需求(无编号)":d.code),e("dt",{},"所属需求"),e("dd",{},(()=>{const m=(h.requirements??[]).find(A=>A.id===d.requirementId);return m===void 0?"未挂需求":`${m.code||m.id}|${m.title}`})()),e("dt",{},"所属项目"),e("dd",{},(h.config?.projects??[]).find(m=>m.id===d.project)?.name??"未归属项目"),e("dt",{},"迭代"),e("dd",{},((h.config?.projects??[]).find(m=>m.id===d.project)?.iterations??[]).find(m=>m.id===d.iteration)?.name??"未排期"),e("dt",{},"服务"),e("dd",{},(()=>{const m=(h.config?.projects??[]).find(Ge=>Ge.id===d.project);if((d.service??"")==="")return"未指定(用项目默认目录)";const A=(m?.services??[]).find(Ge=>Ge.id===d.service);if(A===void 0)return`${d.service}(已失效)`;const se=(A.dependsOn??[]).map(Ge=>(m.services??[]).find(sn=>sn.id===Ge)).filter(Ge=>Ge!==void 0),Ee=se.length===0?"":` · 依赖 ${se.map(Ge=>Ge.name).join("、")}`;return`${A.name}${A.repoPath?` · ${A.repoPath}`:""}${Ee}`})()),e("dt",{},"父任务"),e("dd",{},(()=>{if(d.parent===""||d.parent===void 0)return"无";const m=(h.tasks??[]).find(A=>A.id===d.parent);return m===void 0?d.parent:`${m.code||m.id}|${m.title}`})()),e("dt",{},"来源用例"),e("dd",{},d.bugSource==null?"无(不是用例自动开的缺陷)":`${d.bugSource.code||d.bugSource.taskId} · ${d.bugSource.caseTitle}(判失败于 ${Qe(d.bugSource.at)},${d.bugSource.by||"系统"})`),e("dt",{},"关联缺陷"),e("dd",{},(()=>{const m=(h.tasks??[]).filter(A=>A.bugSource!=null&&A.bugSource.taskId===d.id);return m.length===0?"无":m.map(A=>`${A.code||A.id}(${(h.statuses??[]).find(se=>se.id===A.status)?.label??A.status})`).join("、")})()),e("dt",{},"飞书会话"),e("dd",{},d.feishuThread===""||d.feishuThread===void 0?"未关联":d.feishuThread),e("dt",{},"状态历史"),e("dd",{},d.history.map(m=>{const A=(h.statuses??[]).find(Ee=>Ee.id===m.status)?.label??m.status,se=m.note===void 0||m.note===""?"":`(${m.note})`;return`${A} · ${Qe(m.at)}${se}`}).join(" → ")||"无"))),e("div",{className:"ds-sec",style:Pe("discuss")},e("div",{className:"ds-sec-head"},`评论(${qe})`,e("span",{className:"ds-hint"},"最新的在最上面")),qe===0?e("div",{className:"ds-empty"},"还没有评论。在下面输入,或用 @专家名 直接点名派活。"):ae===null?e("div",{className:"ds-hint",style:{padding:"8px 2px"}},"载入评论…"):e("div",{className:"ds-comments"},ae.slice().reverse().map(m=>{const A=h.config?.experts??[],se=A.find(ka=>ka.name===m.author)??A.find(ka=>m.author!==void 0&&m.author!==""&&(ka.name.includes(m.author)||m.author.includes(ka.name)))??A.find(ka=>m.author===(Aa[ka.role]??"")),Ee=/产品|架构|研发|开发|测试|运维|专家/.test(String(m.author??"")),Ge=m.kind==="human"?!0:m.kind==="agent"?!1:!(se!==void 0||Ee),sn=Ge?m.author===void 0||m.author===""||m.author==="人"?"我":m.author:se?.name??(m.author===""||m.author===void 0?"AI":m.author),Ct=s(m.body);return e("div",{className:"ds-cm",key:m.id,"data-kind":Ge?"human":"agent","data-role":se?.role??""},e("div",{className:"ds-cm-avatar"},Ge?e("span",{className:"ds-cm-initial"},sn.slice(0,1)):se?.emoji??"🤖"),e("div",{className:"ds-cm-main"},e("div",{className:"ds-cm-head"},e("span",{className:"ds-cm-name"},sn),e("span",{className:"ds-cm-kind"},Ge?"我提出":"AI 回复"),se!==void 0&&se.domain!==""?e(f,{className:"ds-chip","data-role":se.role},se.domain):null,e("span",{className:"ds-cm-meta"},Qe(m.at))),e("div",{className:"ds-cm-bubble ds-md"},Ct.length===0?e("span",{className:"ds-hint"},"(这条评论没有正文)"):Ct)))})))))),e("div",{className:"ds-dw-foot"},e("div",{className:"ds-mention-bar"},e("button",{className:"ds-btn",disabled:C,onClick:()=>{Ra(0),da(m=>m===null||m.inline?{query:"",from:null,inline:!1}:null)}},St===null?`@ 提到谁(${Dt.length})`:"收起名单"),e("span",{className:"ds-hint"},"也可以在输入框里直接打「@」搜")),St!==null?e(k,{roster:Dt,query:St.query,active:Pn,onActive:Ra,onQuery:m=>{da(A=>A===null?{query:m,from:null,inline:!1}:{...A,query:m}),Ra(0)},onPick:z,onClose:()=>da(null)}):null,e("div",{className:"ds-composer"},e(p,{className:"ds-textarea",style:{minHeight:58},placeholder:"支持 Markdown:`# 标题`、`**粗体**`、`` `代码` ``、``` 代码块 ```、`- 列表`、`| 表格 |`;打「@」选专家派活。",value:j,onFocus:()=>tt("discuss"),onChange:m=>{H(m.target.value),Y(m.target.value,m.target.selectionStart??m.target.value.length)},onKeyDown:m=>{if((m.metaKey||m.ctrlKey)&&(m.key==="Enter"||m.key==="NumpadEnter")){m.preventDefault(),ge();return}if(!(St===null||St.inline!==!0))if(m.key==="ArrowDown"||m.key==="ArrowUp"){if(m.preventDefault(),Ot.length===0)return;Ra(A=>(A+(m.key==="ArrowDown"?1:-1)+Ot.length)%Ot.length)}else m.key==="Enter"&&Ot.length>0?(m.preventDefault(),z(Ot[Math.min(Pn,Ot.length-1)].name)):m.key==="Escape"&&(m.preventDefault(),da(null))}}),e("div",{className:"ds-composer-bar"},e("span",{className:"ds-hint"},"Markdown 可用 · 打 @ 派活 · Ctrl/⌘+Enter 发送"),e("span",{className:"ds-composer-count"},j.trim()===""?"还没写":`${j.length} 字`),e("button",{className:"ds-btn ds-btn-primary",disabled:C||j.trim()==="",onClick:()=>void ge()},C?"发送中…":"发表评论")),M!==null?e("span",{className:"ds-ok"},M):null,_!==null?e("span",{className:"ds-err"},_):null))))}return g}const tf=(e,t)=>e.length>t?e.slice(0,t-1)+"…":e;function Ql(e){const t=[],a=new Map((e.statuses??[]).map(n=>[n.id,n.label]));for(const n of e.tasks??[])t.push({key:"task:"+n.id,kind:"task",id:n.id,label:`${n.code??""} ${n.title}`.trim(),hint:[a.get(n.status)??n.status,n.owner?.label??""].filter(Boolean).join(" · "),search:[n.code,n.title,n.requirementTitle,n.id].filter(Boolean).join(" ").toLowerCase()});for(const n of e.requirements??[])t.push({key:"requirement:"+n.id,kind:"requirement",id:n.id,label:`${n.code??""} ${n.title}`.trim(),hint:["需求",n.domain||"",n.owner||""].filter(Boolean).join(" · "),search:[n.code,n.title,n.domain].filter(Boolean).join(" ").toLowerCase()});for(const n of e.releases??[])t.push({key:"release:"+n.id,kind:"release",id:n.id,label:`${n.name??""} ${n.tagName??""}`.trim(),hint:["版本",n.status??"",n.at?Qe(n.at):""].filter(Boolean).join(" · "),search:[n.name,n.tagName,n.status].filter(Boolean).join(" ").toLowerCase()});for(const n of e.config?.experts??[])t.push({key:"expert:"+n.id,kind:"expert",id:n.id,label:`${n.emoji??""} ${n.name}`.trim(),hint:["专家",Aa[n.role]??n.role??"",n.domain??""].filter(Boolean).join(" · "),search:[n.name,n.id,n.domain,n.description,Aa[n.role]].filter(Boolean).join(" ").toLowerCase()});for(const n of e.config?.teams??[])t.push({key:"team:"+n.id,kind:"team",id:n.id,label:`👥 ${n.name}`.trim(),hint:["专家团",(n.members??[]).length+" 位成员"].join(" · "),search:[n.name,n.id,n.description,...(n.members??[]).map(r=>r.name??r.id)].filter(Boolean).join(" ").toLowerCase()});for(const n of e.config?.projects??[])t.push({key:"project:"+n.id,kind:"project",id:n.id,label:n.name,hint:["项目",(n.services??[]).length+" 个服务",(n.iterations??[]).length+" 个迭代"].filter(Boolean).join(" · "),search:[n.name,n.id,n.description,...(n.services??[]).map(r=>r.name??r.repoPath)].filter(Boolean).join(" ").toLowerCase()});for(const n of e.skills??[])t.push({key:"skill:"+n.name,kind:"skill",id:n.name,label:"🧩 "+n.name,hint:["技能",n.enabled===!1?"已停用":"已启用",(n.users??0)+" 位专家在用"].join(" · "),search:[n.name,n.description,...n.tags??[]].filter(Boolean).join(" ").toLowerCase()});return t}const hx=[{id:"projects",label:"项目与迭代"},{id:"experts",label:"专家"},{id:"teams",label:"专家团"},{id:"skills",label:"技能库"},{id:"columns",label:"列的负责人"},{id:"gitlab",label:"代码仓库"},{id:"feishu",label:"飞书机器人"},{id:"health",label:"集成健康"},{id:"agents",label:"自动派单"},{id:"testing",label:"测试执行"},{id:"costs",label:"成本与预算"},{id:"environments",label:"部署环境"},{id:"board",label:"看板外观"},{id:"ldap",label:"统一登录"},{id:"access",label:"权限与审计"},{id:"storage",label:"数据与备份"}],af=[{id:"new-requirement",key:"n",label:"Ctrl/⌘+Alt+Shift+N"},{id:"new-task",key:"t",label:"Ctrl/⌘+Alt+Shift+T"},{id:"card-dispatch",key:"d",label:"Ctrl/⌘+Alt+Shift+D"}],Xl=new Map(af.map(e=>[e.id,e.label]));function vx(e){if(e==null)return!1;const t=String(e.tagName??"").toUpperCase();return t==="INPUT"||t==="TEXTAREA"||t==="SELECT"?!0:e.isContentEditable===!0}function bx(e){return e==null||typeof e.getAttribute!="function"?!1:e.getAttribute("data-palette-input")==="1"}function yx(e){if(e==null||!(e.ctrlKey===!0||e.metaKey===!0)||e.altKey!==!0||e.shiftKey!==!0||!bx(e.target)&&vx(e.target))return null;const t=/^Key([A-Z])$/.exec(String(e.code??"")),a=t===null?String(e.key??"").toLowerCase():t[1].toLowerCase(),n=af.find(r=>r.key===a);return n===void 0?null:n.id}const xx=[{id:"new-requirement",shortcut:Xl.get("new-requirement"),label:"新建需求",hint:"需求 → 功能点 → 拆成卡",keys:"新建 需求 new requirement 提需求"},{id:"new-task",shortcut:Xl.get("new-task"),label:"新建任务",hint:"直接在看板上建一张卡",keys:"新建 任务 卡片 new task 建卡"},{id:"tab:board",label:"打开看板",hint:"八列泳道 · 拖拽换列",keys:"看板 board 泳道"},{id:"tab:requirements",label:"打开需求",hint:"需求 · 功能点 · 文档 · 准出",keys:"需求 requirements prd"},{id:"tab:cases",label:"打开用例",hint:"跨卡用例总览 · 最近结果",keys:"用例 case 用例库 测试用例 总览"},{id:"tab:releases",label:"打开版本",hint:"发布 · 灰度 · 部署记录",keys:"版本 release 发布 部署"},{id:"tab:analytics",label:"打开效能",hint:"周期 · 返工 · AI 采纳",keys:"效能 analytics 度量 报表"},{id:"tab:dashboard",label:"打开工作台",hint:"风险与今日待办",keys:"工作台 dashboard 风险 待办"},{id:"export:tasks",label:"导出任务 CSV",hint:"看板上的卡,Excel 可直接打开",keys:"导出 csv 任务 export tasks 下载"},{id:"export:requirements",label:"导出需求 CSV",hint:"需求与准出情况",keys:"导出 csv 需求 export requirements 下载"},{id:"theme:light",label:"切换主题:明亮",hint:"浅色界面",keys:"主题 明亮 light theme 浅色"},{id:"theme:dark",label:"切换主题:深色",hint:"深色界面",keys:"主题 深色 dark theme 夜间"},{id:"theme:system",label:"切换主题:跟随系统",hint:"跟随宿主或操作系统的深浅色",keys:"主题 系统 system theme 自动"},{id:"card-advance-note",label:"推进并留言",hint:"选一张卡 → 写一句 → 推进到下一列",keys:"推进 留言 advance note 交接 换列 card"},{id:"card-advance",label:"把卡片推进到下一列",hint:"选一张卡 → 推进到下一状态",keys:"推进 advance 下一列 换列 移动 move card"},{id:"card-dispatch",shortcut:Xl.get("card-dispatch"),label:"把卡片派给专家",hint:"选一张卡 → 选一位专家跑起来",keys:"派单 dispatch assign 执行 run 专家 expert card"},{id:"card-comment",label:"给卡片留言",hint:"选一张卡 → 写一句讨论",keys:"留言 comment 讨论 评论 card"},{id:"clear-recents",label:"忘掉最近用过的动作",hint:"清空这台电脑上记的最近动作顺序",keys:"清除 清空 忘掉 重置 最近 recent clear reset"},{id:"column-advance",label:"整列推进一列",hint:"选一列 → 把这一列的卡批量推进到下一列",keys:"整列 批量 批量推进 column batch advance"},{id:"refresh",label:"刷新数据",hint:"重新拉一次看板与需求",keys:"刷新 refresh 重载 同步"},...hx.map(e=>({id:"settings:"+e.id,label:"打开设置:"+e.label,hint:"设置 → "+e.label,keys:"设置 settings 配置 "+e.label+" "+e.id}))];function wx(){return xx.map(e=>({key:"action:"+e.id,kind:"action",id:e.id,label:e.label,hint:e.hint,shortcut:e.shortcut,search:(e.label+" "+e.hint+" "+e.keys+" "+(e.shortcut??"")).toLowerCase()}))}function kx(e,t){if(!Array.isArray(t)||t.length===0)return e.slice();const a=new Map;t.forEach((s,o)=>{a.has(s)||a.set(s,o)});const n=[],r=[];for(const s of e){const o=s.kind==="action"?a.get(s.id):void 0;o===void 0?r.push(s):n.push({item:s,hit:o})}return n.sort((s,o)=>s.hit-o.hit),[...n.map(s=>s.item),...r]}const Zl="dsh-studio:recent-actions",Nx=6;function Sx(){try{globalThis.localStorage?.removeItem(Zl)}catch{}}function Cx(e,t,a=Nx){return[t,...(Array.isArray(e)?e:[]).filter(r=>r!==t)].slice(0,a)}function Ex(e){return[...wx(),...Ql(e)]}function Uo(e,t,a=20){const n=String(t??"").toLowerCase().split(/\s+/).filter(Boolean);if(n.length===0)return e.slice(0,a);const r=[];return e.forEach((s,o)=>{let i=0,l=!0;for(const c of n){const u=s.search.indexOf(c);if(u<0){l=!1;break}i+=u===0?3:u<8?2:1}l&&r.push({item:s,score:i,order:o})}),r.sort((s,o)=>o.score-s.score||s.order-o.order),r.slice(0,a).map(s=>s.item)}const $x={task:"卡片",requirement:"需求",release:"版本",expert:"专家",team:"专家团",project:"项目",skill:"技能",action:"操作"},qo={"card-advance":{step:"card",title:"推进到下一列"},"card-advance-note":{step:"card",title:"推进并留言"},"card-dispatch":{step:"card",title:"派给专家"},"card-comment":{step:"card",title:"给卡片留言"},"column-advance":{step:"column",title:"整列推进"}};function Tx(e,t){const a=e.statuses??[],n=a.findIndex(s=>s.id===t);if(n<0)return null;const r=(e.tasks??[]).filter(s=>s.status===t).map(s=>s.id);return{column:a[n],next:n+1>=a.length?null:a[n+1],total:r.length,ids:r}}async function Px(e,t){const{api:a,state:n,confirm:r,prompt:s,notify:o}=t,i=n?.statuses??[],l=p=>i.find(f=>f.id===p)?.label??p,c=(n?.tasks??[]).find(p=>p.id===e.cardId),u=c===void 0?e.cardId:((c.code??"")+" "+c.title).trim();try{if(e.action==="card-advance"){const p=nf(n,e.cardId);return p===null?(o("这张卡已经在最后一列了","error"),{}):(await a("/task/update",{id:e.cardId,status:p}),o("已把「"+u+"」推进到「"+l(p)+"」"),{refresh:!0,open:e.cardId})}if(e.action==="card-advance-note"){const p=nf(n,e.cardId);if(p===null)return o("这张卡已经在最后一列了","error"),{};const f=await s("推进「"+u+"」到「"+l(p)+"」并留一句话",{title:"推进并留言",placeholder:"例如:评审通过,转测试"});return f===null||String(f).trim()===""?{}:(await a("/task/comment",{id:e.cardId,body:String(f).trim()}),await a("/task/update",{id:e.cardId,status:p}),o("已推进到「"+l(p)+"」并留言"),{refresh:!0,open:e.cardId})}if(e.action==="card-dispatch"){const p=(n?.config?.experts??[]).find(f=>f.id===e.expertId);return await a("/agents/run",{id:e.cardId,expert:e.expertId}),o("已派给 "+(p===void 0?e.expertId:p.emoji+p.name)),{refresh:!0}}if(e.action==="card-comment"){const p=await s("给「"+u+"」留一句话",{title:"卡片留言",placeholder:"例如:压测已通过,可以进评审"});return p===null||String(p).trim()===""?{}:(await a("/task/comment",{id:e.cardId,body:String(p).trim()}),o("留言已发到「"+u+"」"),{refresh:!0})}if(e.action==="column-advance"){const p=await _x({api:a,state:n,columnId:e.columnId,confirm:r});return p.error!==void 0?(o(p.error,"error"),{}):p.canceled===!0?{}:(p.failed.length===0?o("已把 "+p.moved+" 张卡推进到「"+p.nextLabel+"」"):o("推进 "+p.moved+" 张,"+p.failed.length+" 张没动:"+p.failed[0],"error"),{refresh:!0})}}catch(p){o(p instanceof Error?p.message:String(p),"error")}return{}}async function _x({api:e,state:t,columnId:a,confirm:n}){const r=Tx(t,a);if(r===null)return{error:"没找到这一列"};if(r.next===null)return{error:"「"+r.column.label+"」已经是最后一列了"};if(r.total===0)return{error:"「"+r.column.label+"」这一列没有卡"};if(await n("把「"+r.column.label+"」里的 "+r.total+" 张卡一起推进到「"+r.next.label+"」?",{title:"整列推进",okText:"推进 "+r.total+" 张"})!==!0)return{canceled:!0};let o=0;const i=[];for(const l of r.ids)try{await e("/task/update",{id:l,status:r.next.id}),o+=1}catch(c){const u=(t.tasks??[]).find(p=>p.id===l);i.push(((u?.code??"")+" "+(u?.title??l)).trim()+":"+(c instanceof Error?c.message:String(c)))}return{moved:o,failed:i,nextLabel:r.next.label}}function nf(e,t){const a=e.statuses??[],n=(e.tasks??[]).find(s=>s.id===t);if(n===void 0)return null;const r=a.findIndex(s=>s.id===n.status);return r<0||r+1>=a.length?null:a[r+1].id}function Ix({h:e,React:t}){return function({state:n,onPick:r,onClose:s,initialAction:o,initialSeq:i}){const[l,c]=t.useState(""),[u,p]=t.useState(0),[f,v]=t.useState(null),[x,b]=t.useState(()=>{try{const P=window.localStorage.getItem(Zl),G=P===null?[]:JSON.parse(P);return Array.isArray(G)?G.filter(J=>typeof J=="string"):[]}catch{return[]}}),k=P=>{if(P==null||P.kind!=="action")return;const G=Cx(x,P.id);b(G);try{window.localStorage.setItem(Zl,JSON.stringify(G))}catch{}},g=t.useRef(null),d=t.useMemo(()=>Ex(n),[n]),h=t.useMemo(()=>Ql(n).filter(P=>P.kind==="task"),[n]),y=t.useMemo(()=>Ql(n).filter(P=>P.kind==="expert"),[n]),S=t.useMemo(()=>(n.statuses??[]).map(P=>({key:"column:"+P.id,kind:"column",id:P.id,label:P.label,hint:(n.tasks??[]).filter(G=>G.status===P.id).length+" 张卡",search:String(P.label??"").toLowerCase()})),[n.statuses,n.tasks]),C=t.useMemo(()=>f===null?kx(Uo(d,l),l===""?x:[]):f.step==="expert"?Uo(y,l):f.step==="column"?Uo(S,l):Uo(h,l),[f,d,h,S,y,l,x]);t.useEffect(()=>{g.current?.focus()},[]),t.useEffect(()=>{if(o==null)return;const P=d.find(G=>G.id===o);if(P!==void 0){if(P.kind==="action"&&qo[P.id]!==void 0){E(P.id);return}r(P),s()}},[i]),t.useEffect(()=>{p(0)},[l]);const E=P=>{v({action:P,step:qo[P].step}),c(""),p(0)},_=P=>{if(P!==void 0){if(f===null){if(P.id==="clear-recents"){Sx(),s();return}if(k(P),P.kind==="action"&&qo[P.id]!==void 0){E(P.id);return}r(P),s();return}if(f.step==="column"){r({kind:"run",action:f.action,columnId:P.id}),s();return}if(f.step==="card"){if(f.action==="card-dispatch"){v({action:f.action,cardId:P.id,step:"expert"}),c(""),p(0);return}r({kind:"run",action:f.action,cardId:P.id}),s();return}r({kind:"run",action:f.action,cardId:f.cardId,expertId:P.id}),s()}},I=()=>{if(f===null){s();return}v(f.step==="expert"?{action:f.action,step:"card"}:null),c(""),p(0)},j=P=>{if(P.key==="Escape"){P.preventDefault(),I();return}if(P.key==="ArrowDown"){P.preventDefault(),p(G=>Math.min(C.length-1,G+1));return}if(P.key==="ArrowUp"){P.preventDefault(),p(G=>Math.max(0,G-1));return}P.key==="Enter"&&(P.preventDefault(),_(C[u]))},H=f===null?"搜索卡片 / 需求 / 版本 / 专家 / 技能,或输入「新建」「导出」「推进」(↑↓ 选择,回车执行,Esc 关闭)":f.step==="expert"?"选一位专家(输入过滤,Esc 返回)":f.step==="column"?"选一列(输入过滤,Esc 返回)":"选一张卡片(输入过滤,Esc 返回)",M=f===null?null:e("div",{className:"ds-palette-flow","data-flow":f.step},qo[f.action].title+(f.step==="expert"?" → 选一位专家":f.step==="column"?" → 选一列":" → 选一张卡片"));return e("div",{className:"ds-palette-veil",onClick:s},e("div",{className:"ds-palette",role:"dialog","aria-label":"全局搜索","data-palette":"1",onClick:P=>P.stopPropagation()},M,e("input",{ref:g,className:"ds-palette-input",placeholder:H,value:l,onChange:P=>c(P.target.value),onKeyDown:j,"data-palette-input":"1"}),e("div",{className:"ds-palette-list"},C.length===0?e("div",{className:"ds-hint",style:{padding:"10px 12px"}},f===null?"没有匹配的内容":f.step==="expert"?"没有匹配的专家":"没有匹配的卡片"):C.map((P,G)=>e("div",{key:P.key,className:"ds-palette-item","data-active":G===u?"1":"0",onMouseEnter:()=>p(G),onClick:()=>_(P)},e("span",{className:"ds-palette-kind","data-kind":P.kind},$x[P.kind]??P.kind),e("span",{className:"ds-palette-label"},tf(P.label,80)),P.hint===""?null:e("span",{className:"ds-palette-hint"},tf((P.kind==="action"&&l===""&&x.includes(P.id)?"最近用过 · ":"")+P.hint,40)),P.shortcut===void 0||P.shortcut===null?null:e("span",{className:"ds-palette-key",title:"全局快捷键"},P.shortcut))))))}}let Jl=null;function Rx(e){Jl=e}function ht(){if(Jl===null)throw new Error("studio client context is not ready");return Jl}function Ax({h:e,React:t}){function a({title:n,hint:r,rows:s,onAdd:o,addLabel:i,render:l,empty:c}){return e("div",{className:"ds-panel"},e("div",{className:"ds-panel-head"},e("span",{},n),e("button",{className:"ds-btn",onClick:o},i??"新增")),e("div",{className:"ds-panel-body"},r!==void 0?e("div",{className:"ds-hint"},r):null,s.length===0?e("div",{className:"ds-hint"},c??"还没有内容。"):null,s.map(l)))}return a}function jx({config:e,onChanged:t}){const{h:a,React:n,Editor:r,api:s,toast:o,confirmDialog:i,tipOf:l,tipLabel:c,TextField:u,TextAreaField:p,ChipField:f,CheckField:v,SelectField:x,SideDrawer:b}=ht(),k=e.experts??[],[g,d]=n.useState(null),[h,y]=n.useState(null),[S,C]=n.useState(!1),E=["🧩","📋","🏛️","🛠️","🧪","🔍","🛡️","⚙️","📦","💰","💳","📊","📈","🧠","🤖","🧭","🎯","🚀","🧱","🔧","🧰","🧮","📝","📚","🗂️","🔐","🌐","☁️","🗄️","🧬","🩺","⚖️"],_=async()=>{if(g!==null){C(!0),y(null);try{await s("/experts/save",{expert:g}),d(null),await t()}catch(R){y(R instanceof Error?R.message:String(R))}finally{C(!1)}}},I=async R=>{if(await i(`删除专家「${R.name}」?已用它派的单会保留历史评论。`,{title:"删除专家",danger:!0,okText:"删除"})){C(!0),y(null);try{await s("/experts/delete",{id:R.id}),await t()}catch(D){y(D instanceof Error?D.message:String(D))}finally{C(!1)}}},j=(R,D)=>d({...g,[R]:D}),[H,M]=n.useState(""),[P,G]=n.useState([]);n.useEffect(()=>{let R=!0;return s("/skills").then(D=>{R&&G(D.skills??[])}).catch(()=>{}),()=>{R=!1}},[]);const J=R=>{const D=g.skills??[];j("skills",D.includes(R)?D.filter(K=>K!==R):[...D,R])},[q,B]=n.useState(""),L=()=>{const R=q.trim();if(R===""||g===null)return;const D=g.skills??[];D.includes(R)||j("skills",[...D,R]),B("")},w=async()=>{const R=H.trim();if(R.length!==0){C(!0),y(null);try{const D=[{role:"product",name:"产品经理",emoji:"📋",prompt:`你是${R}业务的产品经理。
|
|
21
21
|
先读 docs/ 与本领域的历史工单,再动手。
|
|
22
|
-
需求写清:目标用户、主流程、异常路径、验收口径。`},{role:"architect",name:"架构师",emoji:"🏛️",prompt:`你是${
|
|
22
|
+
需求写清:目标用户、主流程、异常路径、验收口径。`},{role:"architect",name:"架构师",emoji:"🏛️",prompt:`你是${R}业务的架构师。
|
|
23
23
|
方案必须给出:数据模型、接口契约、失败与回滚、性能与容量估算。
|
|
24
|
-
不确定就去代码里找证据。`},{role:"dev",name:"开发工程师",emoji:"🛠️",prompt:`你是${
|
|
25
|
-
改动要小步可验证,跑测试,写清改动的文件与风险。`},{role:"qa",name:"测试工程师",emoji:"🧪",prompt:`你是${
|
|
26
|
-
按边界值、异常流、并发与幂等设计用例,列出实际执行结果。`}];for(const K of
|
|
24
|
+
不确定就去代码里找证据。`},{role:"dev",name:"开发工程师",emoji:"🛠️",prompt:`你是${R}业务的开发工程师。
|
|
25
|
+
改动要小步可验证,跑测试,写清改动的文件与风险。`},{role:"qa",name:"测试工程师",emoji:"🧪",prompt:`你是${R}业务的测试工程师。
|
|
26
|
+
按边界值、异常流、并发与幂等设计用例,列出实际执行结果。`}];for(const K of D)await s("/experts/save",{expert:{name:`${R}${K.name}`,emoji:K.emoji,role:K.role,domain:R,description:`负责${R}业务线的${K.name}工作`,prompt:K.prompt,model:"",preset:"",enabled:!0}});M(""),await t()}catch(D){y(D instanceof Error?D.message:String(D))}finally{C(!1)}}},T=R=>{const D=String(R??"").trim();if(D==="")return"";const K=D.replace(/\s*\n\s*/g," / ");return K.length>96?`${K.slice(0,96)}…`:K},Q=k.map(R=>a("div",{className:"ds-listrow",key:R.id},a("div",{className:"ds-listrow-main"},a("div",{},`${R.emoji} ${R.name}`,R.domain?a(f,{className:"ds-chip"},R.domain):null,R.enabled===!1?a("span",{className:"ds-hint"}," (已停用)"):null),a("div",{className:"ds-hint"},`${R.model||"跟随默认模型"}${R.description?" · "+R.description:""}`),T(R.prompt)===""?a("div",{className:"ds-hint","data-empty":"1"},"提示词:还没有写,会退回内置角色说明(点「编辑」补上)"):a("div",{className:"ds-hint","data-prompt":"1",title:String(R.prompt??""),style:{cursor:"pointer"},onClick:()=>d({...R})},`提示词:${T(R.prompt)}`),(R.skills??[]).length>0?a("div",{className:"ds-hint"},`技能:${R.skills.join("、")}`):null),a("div",{className:"ds-listrow-actions"},l("编辑这位专家",a("button",{className:"ds-btn",disabled:S,onClick:()=>d({...R})},"编辑")),l("删除这位专家",a("button",{className:"ds-btn",disabled:S,onClick:()=>void I(R),"data-danger":"1"},"删除")))));return a("div",{className:"ds-pane-stack"},a(r,{title:"专家(可在评论里 @ 他们)",hint:"每个专家有名字、业务领域、角色提示词和技能;评论里 @名字 就会把这条工作派给他。",rows:Q,onAdd:()=>d({id:"",name:"",emoji:"🧩",role:"",domain:"",description:"",prompt:"",skills:[],model:"",preset:"",sandbox:"",enabled:!0}),addLabel:"新增专家",render:R=>R,empty:"还没有专家,点「新增专家」建一个。"}),a("div",{className:"ds-row",style:{gap:8,alignItems:"center",padding:"6px 0 10px"}},a("span",{className:"ds-hint"},"按业务领域一次生成四位:"),a(u,{className:"ds-input",style:{maxWidth:180},value:H,placeholder:"支付 / 风控 / 会员",onChange:R=>M(R.target.value)}),a("button",{className:"ds-btn",disabled:S||H.trim().length===0,onClick:()=>void w()},"生成产品/架构/研发/测试"),h!==null?a("span",{className:"ds-error"},h):null),g===null?null:a(b,{title:g.id?`编辑专家:${g.name||g.id}`:"新增专家",hint:"技能与提示词会随下一次派活生效,改完点右下角「保存」。",onClose:()=>d(null),footer:[a("button",{key:"save",className:"ds-btn ds-btn-primary",disabled:S,onClick:()=>void _()},S?"保存中…":"保存"),a("button",{key:"cancel",className:"ds-btn",disabled:S,onClick:()=>d(null)},"取消"),h!==null?a("span",{key:"error",className:"ds-error ds-side-note"},h):null]},a("div",{className:"ds-row",style:{gap:12,alignItems:"flex-start"}},a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"名字(@ 用这个名字)"),a(u,{className:"ds-input",value:g.name,placeholder:"安全专家",onChange:R=>j("name",R.target.value)})),a("div",{className:"ds-field",style:{flex:"0 0 96px"}},a("div",{className:"ds-label"},"当前图标"),a("div",{className:"ds-emoji-preview"},g.emoji||"🧩"))),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"图标(点一个换上,也可以自己填)"),a("div",{className:"ds-emojigrid"},E.map(R=>a("button",{key:R,type:"button",className:"ds-emoji","data-on":g.emoji===R?"1":"0",title:R,onClick:()=>j("emoji",R)},R))),a("div",{className:"ds-row",style:{gap:8,marginTop:8,alignItems:"center"}},a(u,{className:"ds-input",style:{flex:"0 0 120px"},value:g.emoji,maxLength:4,placeholder:"🧩",onChange:R=>j("emoji",R.target.value)}),a("span",{className:"ds-hint"},"也可以粘一个 emoji,或者留空用默认的 🧩。"))),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"一句话定位"),a(u,{className:"ds-input",value:g.description,placeholder:"负责接口安全与权限模型评审",onChange:R=>j("description",R.target.value)})),a("div",{className:"ds-row",style:{gap:12,alignItems:"flex-start"}},a("div",{className:"ds-field",style:{flex:"0 0 132px"}},c("角色位","决定它对应看板上的哪一列;列负责人按角色位挑人时用得上"),a(x,{className:"ds-select",value:g.role??"",onChange:R=>j("role",R.target.value)},a("option",{value:""},"不限"),["product","architect","dev","qa"].map(R=>a("option",{key:R,value:R},Aa[R]??R))),a("div",{className:"ds-hint"},"决定默认接哪一列")),a("div",{className:"ds-field",style:{flex:1}},c("业务领域","「按专长匹配」看这里:领域相同的卡优先派给它"),a(u,{className:"ds-input",value:g.domain??"",placeholder:"支付 / 风控 / 会员(选填)",onChange:R=>j("domain",R.target.value)}),a("div",{className:"ds-hint"},"同一张卡会优先派给同领域的专家"))),a("div",{className:"ds-field"},a("div",{className:"ds-label"},`技能(从技能库勾选 · 已选 ${(g.skills??[]).length} 项)`),P.length>0?a("div",{className:"ds-skillbox"},P.map(R=>{const D=(g.skills??[]).includes(R.name),K=k.filter(we=>(we.skills??[]).includes(R.name)).length;return a("label",{key:R.name,className:"ds-skillopt","data-on":D?"1":"0",title:String(R.description??"")},a(v,{checked:D,onChange:()=>J(R.name)}),a("span",{className:"ds-skillname"},R.name),a("span",{className:"ds-skilldesc"},String(R.description??"").slice(0,46)),K>0?a("span",{className:"ds-skillusers"},`${K} 位在用`):null)})):a("div",{className:"ds-hint"},"技能库还是空的,去「技能库」建一条,或者在下面直接写名字。"),a("div",{className:"ds-row",style:{gap:8,marginTop:8,alignItems:"center"}},a(u,{className:"ds-input",style:{flex:1},value:q,placeholder:"技能库以外的技能名,例如 lark-doc、office-xlsx(回车或点「加上」)",onChange:R=>B(R.target.value),onKeyDown:R=>{R.key==="Enter"&&(R.preventDefault(),L())}}),a("button",{className:"ds-btn",onClick:()=>L()},"加上")),(g.skills??[]).filter(R=>!P.some(D=>D.name===R)).length>0?a("div",{className:"ds-row",style:{flexWrap:"wrap",gap:6,marginTop:6,alignItems:"center"}},a("span",{className:"ds-hint"},"不在技能库(仍会写进提示词):"),(g.skills??[]).filter(R=>!P.some(D=>D.name===R)).map(R=>a(f,{key:R,className:"ds-chip","data-missing":"1"},R,a("button",{className:"ds-chip-x",title:"移除",onClick:()=>j("skills",(g.skills??[]).filter(D=>D!==R))},"×")))):null),a("div",{className:"ds-row",style:{gap:8}},a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"模型"),a(u,{className:"ds-input",value:g.model,placeholder:"deepseek-v4.1-flash(留空跟随角色默认)",onChange:R=>j("model",R.target.value)})),a("div",{className:"ds-field",style:{flex:1}},c("Agent 预设","预设决定这个专家能用哪些工具、以什么身份干活(如 standard、架构师)"),a(u,{className:"ds-input",value:g.preset,placeholder:"standard",onChange:R=>j("preset",R.target.value)})),a("div",{className:"ds-field",style:{flex:1}},c("沙箱档位","read-only 只能看;workspace-write 能改工作区;danger-full-access 不做限制"),a(x,{className:"ds-input",value:g.sandbox??"",onChange:R=>j("sandbox",R.target.value)},[["","跟随全局"],["read-only","只读"],["workspace-write","只写工作区"],["danger-full-access","无沙箱"]].map(([R,D])=>a("option",{key:R,value:R},D))),a("div",{className:"ds-hint"},"研发/测试这类要真跑命令的专家建议「只写工作区」。"))),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"角色提示词(每次派活都会作为系统提示发给这个专家)"),a(p,{className:"ds-input",rows:9,value:g.prompt,placeholder:`例如:
|
|
27
27
|
你是支付域的产品经理。先读 docs/ 与支付相关的 ADR,再动手。
|
|
28
28
|
需求必须写清:目标用户、主流程、异常与退款路径、对账口径。
|
|
29
|
-
不确定的地方去代码或历史工单里找证据,禁止编造接口字段。`,onChange:I=>A("prompt",I.target.value)})),a("div",{className:"ds-field"},a("label",{className:"ds-row",style:{alignItems:"center",gap:8,cursor:"pointer"}},a(v,{checked:g.enabled!==!1,onChange:I=>A("enabled",I.target.checked)}),a("span",{},"启用这个专家")))))}function jx({config:e,onChanged:t}){const{h:a,React:n,Editor:r,api:s,toast:o,confirmDialog:i,tipOf:l,tipLabel:c,TextField:u,TextAreaField:p,ChipField:f,CheckField:v,SelectField:x,SideDrawer:b}=vt(),k=e.teams??[],g=e.experts??[],[d,h]=n.useState(null),[y,S]=n.useState(null),[C,E]=n.useState(!1),[_,R]=n.useState({});n.useEffect(()=>{let V=!0;return s("/team/memory",{}).then(F=>{V&&R(F?.memory??{})}).catch(()=>{}),()=>{V=!1}},[e.teams]);const A=async V=>{if(await i("清空「"+V.name+"」的团队记忆?",{title:"清空团队记忆",danger:!0,okText:"清空"}))try{const F=await s("/team/memory/clear",{teamId:V.id});R(F?.memory??{}),o("已清空这个团的记忆")}catch(F){S(F instanceof Error?F.message:String(F))}},G=V=>{const F=g.find(M=>M.id===V);return F===void 0?V:`${F.emoji} ${F.name}`},L=async()=>{if(d!==null){E(!0),S(null);try{await s("/teams/save",{team:d}),h(null),await t()}catch(V){S(V instanceof Error?V.message:String(V))}finally{E(!1)}}},P=async V=>{if(await i(`删除专家团「${V.name}」?`,{title:"删除专家团",danger:!0,okText:"删除"})){E(!0),S(null);try{await s("/teams/delete",{id:V.id}),await t()}catch(F){S(F instanceof Error?F.message:String(F))}finally{E(!1)}}},W=(V,F)=>h({...d,[V]:F}),J=k.map(V=>a("div",{className:"ds-listrow",key:V.id},a("div",{className:"ds-listrow-main"},a("div",{},`👥 ${V.name}`),a("div",{className:"ds-hint"},`团长 ${G(V.lead)} · 成员 ${V.members.map(G).join("、")}`),a("div",{className:"ds-hint"},(_[V.id]??[]).length===0?"🧠 团队记忆:还没有(卡做完会自动记一条,派活时带进提示词)":`🧠 团队记忆 ${_[V.id].length} 条 · 最近:${_[V.id][0]?.outcome??""} ${_[V.id][0]?.title??""}`)),a("div",{className:"ds-listrow-actions"},l("清空这个团的记忆",a("button",{className:"ds-btn ds-btn-ghost",disabled:C||(_[V.id]??[]).length===0,onClick:()=>void A(V)},"清空记忆")),l("编辑这个专家团",a("button",{className:"ds-btn",disabled:C,onClick:()=>h({...V})},"编辑")),l("删除这个专家团",a("button",{className:"ds-btn",disabled:C,onClick:()=>void P(V),"data-danger":"1"},"删除")))));return a("div",{className:"ds-pane-stack"},a(r,{title:"专家团(一起干活)",hint:"专家团有团长和成员。评论里 @团名,团长会拆活、给成员派活并汇总结论;成员之间可以继续 @ 接棒。",rows:J,onAdd:()=>h({id:"",name:"",description:"",members:[],lead:"",enabled:!0}),addLabel:"新增专家团",render:V=>V,empty:"还没有专家团。"}),d===null?null:a(b,{title:d.id?`编辑专家团:${d.name||d.id}`:"新增专家团",hint:"团长负责拆活,成员之间在评论里用 @名字 接棒;改完点右下角「保存」。",onClose:()=>h(null),footer:[a("button",{key:"save",className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void L()},C?"保存中…":"保存"),a("button",{key:"cancel",className:"ds-btn",disabled:C,onClick:()=>h(null)},"取消"),y!==null?a("span",{key:"error",className:"ds-error ds-side-note"},y):null]},a("div",{className:"ds-field"},a("div",{className:"ds-label"},"团名(@ 用这个名字)"),a(u,{className:"ds-input",value:d.name,placeholder:"需求交付组",onChange:V=>W("name",V.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"这个团负责什么"),a(u,{className:"ds-input",value:d.description,placeholder:"从需求澄清一路做到验收",onChange:V=>W("description",V.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"成员"),g.length===0?a("div",{className:"ds-hint"},"先去上面建几个专家。"):a("div",{className:"ds-row",style:{flexWrap:"wrap",gap:12}},g.map(V=>a("label",{className:"ds-row",key:V.id,style:{alignItems:"center",gap:6,cursor:"pointer"}},a(v,{checked:(d.members??[]).includes(V.id),onChange:F=>W("members",F.target.checked?[...d.members??[],V.id]:(d.members??[]).filter(M=>M!==V.id))}),a("span",{},`${V.emoji} ${V.name}`))))),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"团长(负责拆活和汇总)"),a(x,{className:"ds-input",value:d.lead??"",onChange:V=>W("lead",V.target.value)},a("option",{value:""},"自动(第一个成员)"),(d.members??[]).map(V=>a("option",{key:V,value:V},G(V)))))))}function Dx({config:e,onChanged:t}){const{h:a,React:n,Editor:r,api:s,toast:o,confirmDialog:i,tipOf:l,tipLabel:c,TextField:u,TextAreaField:p,ChipField:f,CheckField:v,SelectField:x,SideDrawer:b}=vt(),k=e.testing??{},g=Array.isArray(k.envs)?k.envs:[],[d,h]=n.useState(null),[y,S]=n.useState((Array.isArray(k.allowHosts)?k.allowHosts:[]).join(", ")),[C,E]=n.useState(String(k.timeoutMs??15e3)),[_,R]=n.useState(!1),[A,G]=n.useState(null),[L,P]=n.useState(null),W=async $=>{R(!0),G(null),P(null);try{await s("/config",{testing:{envs:$.envs??g,defaultEnv:$.defaultEnv!==void 0?$.defaultEnv:k.defaultEnv??"",timeoutMs:$.timeoutMs!==void 0?$.timeoutMs:k.timeoutMs??15e3,allowHosts:$.allowHosts!==void 0?$.allowHosts:Array.isArray(k.allowHosts)?k.allowHosts:[],concurrency:k.concurrency??4}}),P("已保存"),o("已保存"),await t()}catch(Y){G(Y instanceof Error?Y.message:String(Y))}finally{R(!1)}},J=async()=>{if(d===null)return;const $=String(d.name??"").trim(),Y=String(d.baseUrl??"").trim();if($===""){G("环境名不能为空");return}const I={id:d.id??"",name:$,baseUrl:Y},O=d.id===void 0||d.id===""?[...g,I]:g.map(K=>K.id===d.id?{...K,...I}:K);h(null),await W({envs:O,defaultEnv:k.defaultEnv===""?"":k.defaultEnv})},V=async $=>{if(!await i(`删除环境「${$.name}」?`,{title:"删除环境",danger:!0,okText:"删除"}))return;const Y=g.filter(I=>I.id!==$.id);await W({envs:Y,defaultEnv:k.defaultEnv===$.id?Y[0]?.id??"":k.defaultEnv})},F=async()=>{const $=y.split(/[,,\s]+/).map(I=>I.trim()).filter(I=>I!==""),Y=Number(C);await W({allowHosts:$,timeoutMs:Number.isFinite(Y)&&Y>0?Y:15e3})},M=$=>a("div",{key:$.id,className:"ds-listrow"},a("div",{className:"ds-listrow-main"},a("div",null,`${$.name}${k.defaultEnv===$.id?" · 默认":""}`),a("div",{className:"ds-hint"},$.baseUrl===""?"相对地址会因为没有 baseUrl 而失败":$.baseUrl)),a("div",{className:"ds-listrow-actions"},k.defaultEnv===$.id?null:a("button",{className:"ds-btn ds-btn-ghost",disabled:_,onClick:()=>void W({defaultEnv:$.id})},"设为默认"),a("button",{className:"ds-btn ds-btn-ghost",disabled:_,onClick:()=>h({...$})},"编辑"),a("button",{className:"ds-btn ds-btn-ghost",disabled:_,onClick:()=>void V($),"data-danger":"1"},"删除"))),w=d===null?null:a("div",{className:"ds-panel ds-form-panel"},a("div",{className:"ds-panel-head"},d.id===void 0||d.id===""?"新增环境":`编辑环境:${d.name}`),a("div",{className:"ds-panel-body"},a("div",{className:"ds-field"},a("div",{className:"ds-label"},"环境名"),a(u,{className:"ds-input",value:d.name??"",placeholder:"例如 测试环境 / 预发环境",onChange:$=>h({...d,name:$.target.value})})),a("div",{className:"ds-field"},c("baseUrl","接口测试的根地址,用例里的 /path 会拼在它后面"),a(u,{className:"ds-input",value:d.baseUrl??"",placeholder:"https://test.example.com",onChange:$=>h({...d,baseUrl:$.target.value})})),a("div",{className:"ds-row",style:{justifyContent:"flex-end"}},a("button",{className:"ds-btn ds-btn-ghost",disabled:_,onClick:()=>h(null)},"取消"),a("button",{className:"ds-btn ds-btn-primary",disabled:_,onClick:()=>void J()},"保存环境"))));return a("div",{className:"ds-pane-stack"},w,a("div",{className:"ds-panel"},a("div",{className:"ds-panel-head"},"测试环境",a("button",{className:"ds-btn ds-btn-ghost",disabled:_,onClick:()=>h({name:"",baseUrl:""})},"+ 新增环境")),a("div",{className:"ds-panel-body"},g.length===0?a("div",{className:"ds-empty"},"还没有环境。接口用例里的相对地址会拼到这里配置的 baseUrl。"):g.map(M))),a("div",{className:"ds-panel ds-form-panel"},a("div",{className:"ds-panel-head"},"执行约束"),a("div",{className:"ds-panel-body"},a("div",{className:"ds-field"},a("div",{className:"ds-label"},"允许访问的域名(逗号分隔,支持 *.example.com)"),a(u,{className:"ds-input",value:y,placeholder:"127.0.0.1, localhost, test.example.com",onChange:$=>S($.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"单条用例超时(毫秒)"),a(u,{className:"ds-input",value:C,onChange:$=>E($.target.value)})),a("div",{className:"ds-row",style:{justifyContent:"flex-end"}},a("button",{className:"ds-btn ds-btn-primary",disabled:_,onClick:()=>void F()},_?"保存中…":"保存约束")),L===null?null:a("div",{className:"ds-ok"},L),A===null?null:a("div",{className:"ds-err"},A))))}function Ox({config:e,onChanged:t}){const{h:a,React:n,Editor:r,api:s,toast:o,confirmDialog:i,tipOf:l,tipLabel:c,TextField:u,TextAreaField:p,ChipField:f,CheckField:v,SelectField:x,SideDrawer:b}=vt(),k=e.feishu??{},[g,d]=n.useState(""),[h,y]=n.useState(String(k.escalateAfter??3)),[S,C]=n.useState(!1),[E,_]=n.useState(null),[R,A]=n.useState(null),G=async()=>{C(!0),_(null),A(null);try{const L={};String(g??"").trim()!==""&&(L.escalateWebhook=String(g).trim()),L.escalateAfter=Number(h)||3,await s("/config",{feishu:L}),d(""),_("已保存:连续失败 "+(Number(h)||3)+" 次后往升级群发一条"),await t()}catch(L){A(L instanceof Error?L.message:String(L))}finally{C(!1)}};return a("div",{className:"ds-panel ds-form-panel",style:{marginTop:14}},a("div",{className:"ds-panel-head"},"通知升级"),a("div",{className:"ds-panel-body"},a("div",{className:"ds-field"},a("div",{className:"ds-label"},"升级群 Webhook"),a(u,{className:"ds-input",value:g,placeholder:k.escalateWebhookSet===!0?"已设置(留空表示不修改)":"https://open.feishu.cn/open-apis/bot/v2/hook/…",onChange:L=>d(L.target.value)})),a("div",{className:"ds-field"},c("连续失败几次后升级","同一通道连续失败到这个次数,就给升级群发消息"),a(u,{className:"ds-input",style:{width:90},value:h,onChange:L=>y(L.target.value)})),a("div",{className:"ds-hint"},"飞书通知、GitLab、云盘归档、代码隔离任一通道连续失败达到阈值时,只在跨过阈值那一次往升级群发一条,包含通道、失败次数与最近错误。"),a("div",{className:"ds-row",style:{justifyContent:"flex-end"}},a("button",{className:"ds-btn ds-btn-primary",disabled:S,onClick:()=>void G()},S?"保存中…":"保存升级设置")),E===null?null:a("div",{className:"ds-ok"},E),R===null?null:a("div",{className:"ds-err"},R)))}function Lx({config:e,onChanged:t}){const{h:a,React:n,Editor:r,api:s,toast:o,confirmDialog:i,tipOf:l,tipLabel:c,TextField:u,TextAreaField:p,ChipField:f,CheckField:v,SelectField:x,SideDrawer:b}=vt(),[k,g]=n.useState(()=>(e.environments??[]).map(J=>({id:J.id,name:J.name,kind:J.kind,note:J.note}))),[d,h]=n.useState(!1),[y,S]=n.useState(null),[C,E]=n.useState(null),[_,R]=n.useState(null),A=async J=>{R(null);try{await s("/config",{releaseRules:J}),R("发布准入已更新"),await t()}catch(V){R(V instanceof Error?V.message:String(V))}},G=()=>g(J=>J.length>=12?J:[...J,{id:"",name:"",kind:"other",note:""}]),L=(J,V)=>g(F=>F.map((M,w)=>w===J?{...M,...V}:M)),P=J=>g(V=>V.filter((F,M)=>M!==J)),W=async()=>{h(!0),S(null),E(null);try{const J=k.map(V=>({...V,name:String(V.name??"").trim()})).filter(V=>V.name!=="");if(J.length===0)throw new Error("至少留一个环境,否则部署记录没处挂");await s("/config",{environments:J}),S(`已保存 ${J.length} 个环境`),o(`已保存 ${J.length} 个环境`),await t()}catch(J){E(J instanceof Error?J.message:String(J))}finally{h(!1)}};return a("div",{className:"ds-panel ds-form-panel"},a("div",{className:"ds-panel-head"},"部署环境",a("span",{className:"ds-hint"},"只登记,不触发")),a("div",{className:"ds-panel-body"},a("div",{className:"ds-hint"},"这些环境只用来在版本上留痕:谁在什么时候把哪个版本放到了哪个环境。平台不会调用任何部署脚本、webhook 或 CI,部署仍然由人或你们自己的流水线完成。"),k.map((J,V)=>a("div",{key:`env-${V}`,className:"ds-row",style:{gap:8,marginTop:8,alignItems:"flex-end"}},a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"名字"),a(u,{className:"ds-input",value:J.name,placeholder:"例如 预发",onChange:F=>L(V,{name:F.target.value})})),a("div",{className:"ds-field",style:{flex:"0 0 120px"}},a("div",{className:"ds-label"},"类型"),a(x,{className:"ds-input",value:J.kind,onChange:F=>L(V,{kind:F.target.value})},["dev","staging","prod","other"].map(F=>a("option",{key:F,value:F},F)))),a("div",{className:"ds-field",style:{flex:2}},a("div",{className:"ds-label"},"说明"),a(u,{className:"ds-input",value:J.note,placeholder:"例如 上线前最后一关",onChange:F=>L(V,{note:F.target.value})})),a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>P(V),"data-danger":"1"},"删除"))),a("div",{className:"ds-row",style:{gap:8,marginTop:10}},a("button",{className:"ds-btn",onClick:G,disabled:k.length>=12},"+ 加一个环境")),a("div",{className:"ds-hint"},"id 由名字生成一次就固定了:改名不会断开已有的部署记录;删掉的环境,历史记录里的名字会显示成 id。"),a("div",{className:"ds-row",style:{justifyContent:"flex-end",marginTop:10}},a("button",{className:"ds-btn ds-btn-primary",disabled:d,onClick:()=>void W()},d?"保存中…":"保存环境")),y===null?null:a("div",{className:"ds-ok"},y),C===null?null:a("div",{className:"ds-err"},C)),a("div",{className:"ds-panel-body",style:{borderTop:"1px solid var(--ds-line)"}},a("div",{className:"ds-label"},"发布准入(发布时会检查,不满足要「强制发布」并写原因)"),a("label",{className:"ds-check",style:{marginTop:8}},a(v,{checked:(e.releaseRules?.requireStaging??!1)===!0,onChange:J=>void A({requireStaging:J.target.checked})}),a("span",{className:"ds-check-text"},"发布前必须先在「预发」环境登记过一次部署")),a("label",{className:"ds-check",style:{marginTop:6}},a(v,{checked:(e.releaseRules?.requireRequirementSignoff??!1)===!0,onChange:J=>void A({requireRequirementSignoff:J.target.checked})}),a("span",{className:"ds-check-text"},"关联需求必须都签过验收字")),a("div",{className:"ds-hint",style:{marginTop:6}},"两条默认都不勾:不勾的时候发布只看门禁,不看你上没上过预发、需不需要签字。"),_===null?null:a("div",{className:"ds-ok"},_)))}function Mx({config:e,onChanged:t}){const{h:a,Editor:n,api:r,toast:s,confirmDialog:o,tipOf:i,TextField:l,CheckField:c,SelectField:u,React:p}=vt(),f=e.ldap??{},[v,x]=p.useState({enabled:f.enabled===!0,url:f.url??"ldap://localhost:389",baseDN:f.baseDN??"DC=LYF,DC=COM",bindDN:f.bindDN??"cn=root",bindPassword:"",userFilter:f.userFilter??"(|(sAMAccountName={user})(uid={user})(mail={user}))",nameAttr:f.nameAttr??"displayName",mailAttr:f.mailAttr??"mail",deptAttr:f.deptAttr??"department",defaultRole:f.defaultRole??"member",requireLogin:f.requireLogin===!0,timeoutMs:String(f.timeoutMs??6e3)}),[b,k]=p.useState(!1),[g,d]=p.useState(!1),[h,y]=p.useState(null),[S,C]=p.useState(null),[E,_]=p.useState([]),R=e.localAuth??{},[A,G]=p.useState(""),[L,P]=p.useState(""),[W,J]=p.useState(!1),[V,F]=p.useState(null),[M,w]=p.useState(null),$=async()=>{J(!0),F(null),w(null);try{await r("/auth/password",{username:R.username,currentPassword:A,newPassword:L}),G(""),P(""),F("密码已更新"),t()}catch(K){w(K instanceof Error?K.message:String(K))}finally{J(!1)}},Y=K=>x(Ne=>({...Ne,...K})),I=async()=>{d(!0),y(null),C(null),_([]);try{const K=await r("/auth/ldap/test",{ldap:{url:v.url,baseDN:v.baseDN,bindDN:v.bindDN,userFilter:v.userFilter,nameAttr:v.nameAttr,mailAttr:v.mailAttr,deptAttr:v.deptAttr,timeoutMs:Number(v.timeoutMs)},bindPassword:v.bindPassword});_(K.steps??[]),y(K.message??"连接正常"),s(K.message??"连接正常",K.ok===!1?"error":"success")}catch(K){const Ne=K instanceof Error?K.message:String(K);C(Ne)}finally{d(!1)}},O=async()=>{k(!0),y(null),C(null);try{const K={ldap:{enabled:v.enabled,url:v.url.trim(),baseDN:v.baseDN.trim(),bindDN:v.bindDN.trim(),userFilter:v.userFilter.trim(),nameAttr:v.nameAttr.trim(),mailAttr:v.mailAttr.trim(),deptAttr:v.deptAttr.trim(),defaultRole:v.defaultRole,requireLogin:v.requireLogin,timeoutMs:Number(v.timeoutMs)||6e3}};v.bindPassword.trim()!==""&&(K.ldap.bindPassword=v.bindPassword.trim()),await r("/config",K),Y({bindPassword:""}),y(v.bindPassword.trim()===""?"已保存(服务账号密码没改)":"已保存,服务账号密码已写入密钥文件"),await t()}catch(K){C(K instanceof Error?K.message:String(K))}finally{k(!1)}};return a("div",{className:"ds-panel ds-form-panel"},a("div",{className:"ds-panel-head"},"统一登录(LDAP)",a("span",{className:"ds-hint"},f.bindPasswordSet===!0?"服务账号密码已保存":"服务账号密码还没保存")),a("div",{className:"ds-panel-body"},a("div",{className:"ds-hint"},"开启后,页头会出现登录框:用域账号登录,平台拿到的用户名会记进 config.users(首次登录建档、之后只更新最近登录),写操作和审计都挂在这个名字下。"),a("label",{className:"ds-check",style:{marginTop:8}},a(c,{checked:v.enabled,onChange:K=>Y({enabled:K.target.checked})}),a("span",{className:"ds-check-text"},"启用 LDAP 登录")),a("label",{className:"ds-check",style:{marginTop:6}},a(c,{checked:v.requireLogin,onChange:K=>Y({requireLogin:K.target.checked})}),a("span",{className:"ds-check-text"},"必须登录才能用(不勾也可以先配好再打开)")),a("div",{className:"ds-row",style:{gap:8,marginTop:8}},a("div",{className:"ds-field",style:{flex:2}},a("div",{className:"ds-label"},"服务器地址"),a(l,{className:"ds-input",value:v.url,placeholder:"ldap://host:389",onChange:K=>Y({url:K.target.value})})),a("div",{className:"ds-field",style:{flex:"0 0 110px"}},a("div",{className:"ds-label"},"超时(毫秒)"),a(l,{className:"ds-input",value:v.timeoutMs,onChange:K=>Y({timeoutMs:K.target.value})}))),a("div",{className:"ds-row",style:{gap:8,marginTop:8}},a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"BASE DN"),a(l,{className:"ds-input",value:v.baseDN,placeholder:"DC=LYF,DC=COM",onChange:K=>Y({baseDN:K.target.value})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"服务账号 DN"),a(l,{className:"ds-input",value:v.bindDN,placeholder:"cn=root",onChange:K=>Y({bindDN:K.target.value})}))),a("div",{className:"ds-row",style:{gap:8,marginTop:8}},a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},f.bindPasswordSet===!0?"服务账号密码(留空 = 不改)":"服务账号密码"),a(l,{className:"ds-input",type:"password",value:v.bindPassword,placeholder:f.bindPasswordSet===!0?"已保存,留空表示不修改":"写一次就进密钥文件",onChange:K=>Y({bindPassword:K.target.value})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"用户过滤器({user} 会被替换)"),a(l,{className:"ds-input",value:v.userFilter,onChange:K=>Y({userFilter:K.target.value})}))),a("div",{className:"ds-row",style:{gap:8,marginTop:8}},a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"显示名属性"),a(l,{className:"ds-input",value:v.nameAttr,onChange:K=>Y({nameAttr:K.target.value})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"邮箱属性"),a(l,{className:"ds-input",value:v.mailAttr,onChange:K=>Y({mailAttr:K.target.value})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"部门属性"),a(l,{className:"ds-input",value:v.deptAttr,onChange:K=>Y({deptAttr:K.target.value})}))),a("div",{className:"ds-row",style:{gap:8,marginTop:10}},a("button",{className:"ds-btn",disabled:g,onClick:()=>void I()},g?"测试中…":"测试连接"),a("button",{className:"ds-btn ds-btn-primary",disabled:b,onClick:()=>void O()},b?"保存中…":"保存")),E.length===0?null:a("div",{style:{marginTop:8}},E.map((K,Ne)=>a("div",{key:`ldap-step-${Ne}`,className:K.ok===!0?"ds-ok":"ds-error"},`${K.ok===!0?"✓":"✗"} ${K.name}:${K.message}${K.ms>0?`(${K.ms}ms)`:""}`))),h===null?null:a("div",{className:"ds-ok",style:{marginTop:8}},h),S===null?null:a("div",{className:"ds-error",style:{marginTop:8}},S),a("div",{className:"ds-hint",style:{marginTop:10}},"依赖系统里的 ldapsearch(Ubuntu:apt-get install ldap-utils)。密码只写进 ~/.dsh/dsh-studio.secrets.json(0600),不会出现在状态、导出和日志里。")),a("div",{className:"ds-panel-body",style:{borderTop:"1px solid var(--ds-line)"}},a("div",{className:"ds-label"},"本地超管账号"),a("div",{className:"ds-hint",style:{marginTop:4}},`账号:${R.username??"admin"} · ${R.hasPassword===!0?"已设置自己的密码":"还在用默认口令 admin"}。没启用 LDAP 时平台默认以这个身份使用,不需要登录;启用 LDAP 后它仍可用来兜底登录。`),a("div",{className:"ds-row",style:{gap:8,marginTop:8}},a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"当前密码"),a(l,{className:"ds-input",type:"password",value:A,onChange:K=>G(K.target.value)})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"新密码(至少 8 位)"),a(l,{className:"ds-input",type:"password",value:L,onChange:K=>P(K.target.value)})),a("button",{className:"ds-btn",disabled:W||A===""||L.length<8,onClick:()=>void $()},W?"提交中…":"改密码")),V===null?null:a("div",{className:"ds-ok",style:{marginTop:6}},V),M===null?null:a("div",{className:"ds-error",style:{marginTop:6}},M)),a("div",{className:"ds-panel-body",style:{borderTop:"1px solid var(--ds-line)"}},a("div",{className:"ds-label"},`登录过的人(${(e.users??[]).length})`),(e.users??[]).length===0?a("div",{className:"ds-hint",style:{marginTop:6}},"还没有人用 LDAP 登录过。"):a("div",{style:{marginTop:6}},(e.users??[]).slice(0,20).map(K=>a("div",{key:K.id,className:"ds-kv"},a("div",null,K.name),a("div",null,`${K.id} · ${K.dept===""?"(无部门)":K.dept} · 登录 ${K.loginCount} 次 · 最近 ${Ye(K.lastLoginAt)}`))))))}function zx({config:e,onChanged:t}){const{h:a,Editor:n,api:r,toast:s,confirmDialog:o,tipOf:i,TextField:l,CheckField:c,SelectField:u,React:p}=vt(),f=e.costs??{},[v,x]=p.useState(String(f.budgetRuns??500)),[b,k]=p.useState(String(f.budgetHours??80)),[g,d]=p.useState(String(f.warnAt??80)),[h,y]=p.useState(!1),[S,C]=p.useState(null),[E,_]=p.useState(null),R=async()=>{y(!0),C(null),_(null);try{const A=Number(v),G=Number(b),L=Number(g);if(!Number.isFinite(A)||A<=0)throw new Error("预算次数要是正整数");if(!Number.isFinite(G)||G<=0)throw new Error("预算小时要是正整数");await r("/config",{costs:{budgetRuns:Math.round(A),budgetHours:Math.round(G),warnAt:Number.isFinite(L)?Math.min(100,Math.max(10,Math.round(L))):80}}),C("已保存:预算"),await t()}catch(A){_(A instanceof Error?A.message:String(A))}finally{y(!1)}};return a("div",{className:"ds-panel ds-form-panel"},a("div",{className:"ds-panel-head"},"成本预算"),a("div",{className:"ds-panel-body ds-grid2"},a("div",{className:"ds-field"},a("div",{className:"ds-label"},"每月派单次数上限"),a(l,{className:"ds-input",value:v,onChange:A=>x(A.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"每月机上时长上限(小时)"),a(l,{className:"ds-input",value:b,onChange:A=>k(A.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"警告阈值(百分比)"),a(l,{className:"ds-input",value:g,onChange:A=>d(A.target.value)})),a("div",{className:"ds-field ds-span"},a("div",{className:"ds-hint"},"效能页的「AI 执行成本」下方会出现预算条;口径是派单次数与机上时长,宿主没有回传 token 用量。")),a("div",{className:"ds-row",style:{justifyContent:"flex-end"}},a("button",{className:"ds-btn ds-btn-primary",disabled:h,onClick:()=>void R()},h?"保存中…":"保存预算")),S===null?null:a("div",{className:"ds-ok"},S),E===null?null:a("div",{className:"ds-err"},E)))}function Fx({config:e,onChanged:t}){const{h:a,Editor:n,api:r,toast:s,confirmDialog:o,tipOf:i,TextField:l,CheckField:c,SelectField:u,React:p}=vt(),f=e.projects??[],v=e.gitlab?.projects??[],[x,b]=p.useState(null),[k,g]=p.useState(null),[d,h]=p.useState(null),[y,S]=p.useState(!1),[C,E]=p.useState({name:"",start:"",due:"",status:"planned"}),_=async()=>{if(x!==null){S(!0),g(null),h(null);try{await r("/projects/save",{project:{...x,iterations:x.iterations??[]}}),h("已保存"),s("已保存"),await t()}catch(w){g(w instanceof Error?w.message:String(w))}finally{S(!1)}}},R=async w=>{if(await o(`删除项目「${w.name}」?卡片会保留,但不再归属任何项目。`,{title:"删除项目",danger:!0,okText:"删除"})){S(!0),g(null);try{await r("/projects/delete",{id:w.id}),b(null),await t()}catch($){g($ instanceof Error?$.message:String($))}finally{S(!1)}}},A=async w=>{if(C.name.trim()!==""){S(!0),g(null);try{await r("/projects/iteration",{project:w.id,name:C.name.trim(),start:Pr(C.start),due:Pr(C.due),status:C.status}),E({name:"",start:"",due:"",status:"planned"}),await t()}catch($){g($ instanceof Error?$.message:String($))}finally{S(!1)}}},G=async(w,$)=>{S(!0),g(null);try{await r("/projects/iteration",{project:w.id,action:"remove",iteration:$.id}),await t()}catch(Y){g(Y instanceof Error?Y.message:String(Y))}finally{S(!1)}},L=(w,$)=>b({...x,[w]:$}),P=(w,$,Y)=>b({...x,services:(x.services??[]).map((I,O)=>O===w?{...I,[$]:Y}:I)}),W=()=>b({...x,services:[...x.services??[],{id:"",name:"",repoId:"",repoPath:"",baseBranch:x.baseBranch||"main",dependsOn:[]}]}),J=w=>b({...x,services:(x.services??[]).filter(($,Y)=>Y!==w)}),V=x===null?[]:x.services??[],F=(w,$)=>b({...x,services:(x.services??[]).map((Y,I)=>{if(I!==w)return Y;const O=Array.isArray(Y.dependsOn)?Y.dependsOn:[];return{...Y,dependsOn:O.includes($)?O.filter(K=>K!==$):[...O,$]}})}),M=f.map(w=>a("div",{className:"ds-listrow",key:w.id},a("div",{className:"ds-listrow-main"},a("div",{},`${w.key?`[${w.key}] `:""}${w.name} · ${Wl[w.status]??w.status}${w.lead?` · 负责人 ${w.lead}`:""}`),a("div",{className:"ds-hint"},`${(e.projects??[]).find($=>$.id===w.id)?.iterations?.length??0} 个迭代 · ${(w.services??[]).length} 个服务${(()=>{const $=(w.services??[]).reduce((Y,I)=>Y+(I.dependsOn??[]).length,0);return $>0?` · ${$} 条依赖`:""})()}${w.description?` · ${w.description}`:""}`)),a("div",{className:"ds-listrow-actions"},i("改项目信息、加迭代",a("button",{className:"ds-btn",disabled:y,onClick:()=>b({...w})},"编辑 / 迭代")),i("删除这个项目(卡不会删)",a("button",{className:"ds-btn",disabled:y,onClick:()=>void R(w),"data-danger":"1"},"删除")))));return a("div",{className:"ds-pane-stack"},a(n,{title:"业务项目(一个项目可以挂很多张卡和很多个迭代)",hint:"项目是看板的第一层分组:卡片挂项目,项目下面划迭代,看板可按项目和迭代筛选,项目页签看每个项目的体检数据。",rows:M,onAdd:()=>b({id:"",name:"",key:"",description:"",lead:"",status:"active",repos:[],services:[],iterations:[]}),addLabel:"新增项目",render:w=>w,empty:"还没有项目。团队只跑一个产品也可以先不建,直接在看板上干活。"}),d!==null?a("div",{className:"ds-ok",style:{marginBottom:8}},d):null,x===null?null:a("div",{className:"ds-panel ds-form-panel"},a("div",{className:"ds-panel-head"},x.id?`编辑项目:${x.name||x.id}`:"新增项目"),a("div",{className:"ds-panel-body"},a("div",{className:"ds-row",style:{gap:12}},a("div",{className:"ds-field",style:{flex:"0 0 110px"}},a("div",{className:"ds-label"},"代号"),a(l,{className:"ds-input",value:x.key??"",placeholder:"ORD",onChange:w=>L("key",w.target.value)})),a("div",{className:"ds-field",style:{flex:2}},a("div",{className:"ds-label"},"项目名"),a(l,{className:"ds-input",value:x.name??"",placeholder:"订单中心",onChange:w=>L("name",w.target.value)})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"状态"),a(u,{className:"ds-select",value:x.status??"active",onChange:w=>L("status",w.target.value)},Object.keys(Wl).map(w=>a("option",{key:w,value:w},Wl[w])))),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"业务负责人"),a(l,{className:"ds-input",value:x.lead??"",placeholder:"张伟",onChange:w=>L("lead",w.target.value)}))),a("div",{className:"ds-row",style:{gap:12}},a("div",{className:"ds-field",style:{flex:3}},a("div",{className:"ds-label"},"默认代码目录(没有分服务时用)"),a(l,{className:"ds-input",value:x.repoPath??"",placeholder:"~/repos/order-center",onChange:w=>L("repoPath",w.target.value)})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"基线分支"),a(l,{className:"ds-input",value:x.baseBranch??"",placeholder:"main",onChange:w=>L("baseBranch",w.target.value)}))),a("div",{className:"ds-hint",style:{margin:"-6px 0 4px"}},"配了代码目录且「代码隔离」选 worktree 时,每张卡会切一条 task/<编号> 分支,互不干扰。项目里有多个服务时,用下面的服务列表分开配。"),a("div",{className:"ds-field"},a("div",{className:"ds-label"},`服务(${V.length})· 一个服务一个 git 路径,卡片可以指定改哪个`),V.length===0?a("div",{className:"ds-empty"},"还没有分服务。只有一个仓库时留空即可,走上面的默认代码目录。"):V.map((w,$)=>{const Y=V.filter((I,O)=>O!==$&&String(I.id??"").trim()!=="");return a("div",{key:`${w.id}-${$}`,style:{marginBottom:8}},a("div",{className:"ds-row",style:{gap:8,alignItems:"flex-end"}},a("div",{className:"ds-field",style:{flex:"0 0 150px"}},a("div",{className:"ds-label"},"服务名"),a(l,{className:"ds-input",value:w.name??"",placeholder:"order-service",onChange:I=>P($,"name",I.target.value)})),a("div",{className:"ds-field",style:{flex:3}},a("div",{className:"ds-label"},"本机 git 路径"),a(l,{className:"ds-input",value:w.repoPath??"",placeholder:"~/repos/order-service",onChange:I=>P($,"repoPath",I.target.value)})),a("div",{className:"ds-field",style:{flex:"0 0 110px"}},a("div",{className:"ds-label"},"基线分支"),a(l,{className:"ds-input",value:w.baseBranch??"",placeholder:"main",onChange:I=>P($,"baseBranch",I.target.value)})),v.length===0?null:a("div",{className:"ds-field",style:{flex:"0 0 150px"}},a("div",{className:"ds-label"},"GitLab 仓库"),a(u,{className:"ds-select",value:w.repoId??"",onChange:I=>P($,"repoId",I.target.value)},a("option",{value:""},"不关联"),v.map(I=>a("option",{key:I.id,value:I.id},I.name||I.project)))),a("button",{className:"ds-btn",type:"button",onClick:()=>J($),"data-danger":"1"},"删除")),Y.length===0?null:a("div",{className:"ds-row",style:{gap:6,alignItems:"center",marginTop:4,flexWrap:"wrap"}},a("span",{className:"ds-hint"},"依赖"),a("span",{className:"ds-hint",style:{marginRight:2}},"(勾上的服务要先完成,本服务的卡才能收口)"),Y.map(I=>a("span",{key:I.id,className:"ds-chip","data-on":(w.dependsOn??[]).includes(I.id)?"1":"0",title:`依赖 ${I.name||I.id}`,onClick:()=>F($,I.id)},I.name||I.id))))}),a("div",{className:"ds-row",style:{gap:8}},a("button",{className:"ds-btn",type:"button",onClick:()=>W()},"+ 加一个服务"),a("span",{className:"ds-hint"},"服务名会被写进任务详情;worktree 从该服务的 git 路径切 task/<编号> 分支。"))),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"项目说明"),a(l,{className:"ds-input",value:x.description??"",placeholder:"这个项目做什么、给谁用",onChange:w=>L("description",w.target.value)})),a("div",{className:"ds-row",style:{gap:8}},a("button",{className:"ds-btn ds-btn-primary",disabled:y,onClick:()=>void _()},y?"保存中…":"保存项目"),a("button",{className:"ds-btn",disabled:y,onClick:()=>b(null)},"取消")))),x===null||x.id===""?null:a("div",{className:"ds-panel ds-form-panel"},a("div",{className:"ds-panel-head"},"迭代",a("span",{className:"ds-hint"},"迭代用来按时间切需求,看板可按迭代筛选")),a("div",{className:"ds-panel-body"},(x.iterations??[]).length===0?a("div",{className:"ds-empty"},"还没有迭代。可以先加一个「2026-11 迭代」。"):(x.iterations??[]).map(w=>a("div",{className:"ds-listrow",key:w.id},a("div",{className:"ds-listrow-main"},a("div",{},`${w.name} · ${Hl[w.status]??w.status}`),a("div",{className:"ds-hint"},`${w.start?new Date(w.start).toISOString().slice(0,10):"未定开始"} → ${w.due?new Date(w.due).toISOString().slice(0,10):"未定结束"}`)),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn ds-btn-ghost",disabled:y,onClick:()=>void G(x,w)},"×")))),a("div",{className:"ds-row",style:{gap:8,alignItems:"flex-end"}},a("div",{className:"ds-field",style:{flex:2}},a("div",{className:"ds-label"},"迭代名"),a(l,{className:"ds-input",value:C.name,placeholder:"2026-11 迭代",onChange:w=>E({...C,name:w.target.value})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"开始"),a(l,{className:"ds-input",type:"date",value:C.start,onChange:w=>E({...C,start:w.target.value})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"结束"),a(l,{className:"ds-input",type:"date",value:C.due,onChange:w=>E({...C,due:w.target.value})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"状态"),a(u,{className:"ds-select",value:C.status,onChange:w=>E({...C,status:w.target.value})},Object.keys(Hl).map(w=>a("option",{key:w,value:w},Hl[w])))),a("button",{className:"ds-btn",disabled:y||C.name.trim()==="",onClick:()=>void A(x)},"+ 加迭代")),a("div",{className:"ds-hint"},"迭代改完会立刻反映到看板的迭代筛选。"))))}function Bx({state:e,config:t,onChanged:a}){const{h:n,sessionToken:r,api:s,toast:o,currentUser:i,confirmDialog:l,TextField:c,ChipField:u,CheckField:p,SelectField:f,React:v}=vt(),x=t.access??{enabled:!1,members:[]},b=e.audit??[],[k,g]=v.useState({name:"",role:"member"}),[d,h]=v.useState(!1),[y,S]=v.useState(null),[C,E]=v.useState(""),[_,R]=v.useState(!1),[A,G]=v.useState(""),L=async(w,$)=>{h(!0),S(null);try{await s(w,$),await a()}catch(Y){{const I=Y instanceof Error?Y.message:String(Y);S(I),o(I,"error")}}finally{h(!1)}},P=async()=>{const w=k.name.trim();w!==""&&(await L("/access/save",{member:{name:w,role:k.role}}),g({name:"",role:"member"}))},W=Array.from(new Set(b.map(w=>w.by))).sort(),J=A.trim().toLowerCase(),V=b.filter(w=>(C===""||w.by===C)&&(_===!1||w.ok===!1)&&(J===""||`${ROUTE_LABEL[w.route]??w.route} ${w.by} ${w.summary}`.toLowerCase().includes(J))),F=V.slice(0,120),M=()=>{const w=new URLSearchParams({by:C,q:A.trim(),failed:_?"1":"0",token:r()??""}),$=document.createElement("a");$.href=`${API}/audit/export.csv?${w.toString()}`,$.rel="noopener",document.body.appendChild($),$.click(),document.body.removeChild($),o(`正在导出 ${V.length} 条审计记录`)};return n("div",{className:"ds-pane-stack"},n("div",{className:"ds-panel ds-form-panel"},n("div",{className:"ds-panel-head"},n("span",null,"成员权限"),n(u,{className:"ds-chip"},`当前身份:${i()}`)),n("div",{className:"ds-panel-body"},n("div",{className:"ds-row",style:{gap:10,alignItems:"center",flexWrap:"wrap"}},n("label",{className:"ds-check",style:{flex:"0 0 auto"}},n(p,{checked:x.enabled===!0,disabled:d,onChange:w=>void L("/access/save",{enabled:w.target.checked})}),n("span",null,"启用成员权限")),n("span",{className:"ds-hint"},x.enabled===!0?"已启用:写操作要认人,删除/配置/发布要管理员。":"未启用:任何人都是管理员(单机用法)。")),x.enabled===!0&&(x.members??[]).length===0?n("div",{className:"ds-error"},"已启用但名单是空的:除了名单里的人,其他人都动不了。先把你自己加进去。"):null,x.enabled===!0?n("label",{className:"ds-check"},n(p,{checked:(x.agents??"inherit")==="inherit",disabled:d,onChange:w=>void L("/access/save",{agents:w.target.checked?"inherit":"bypass"})}),n("span",null,"AI 专家也受这份名单约束")):null,x.enabled===!0?n("div",{className:"ds-hint"},(x.agents??"inherit")==="inherit"?"专家调工具时按同一张名单判权限:只读专家只能看,成员能干活,管理员才能改配置。名单里没有的专家会被拦下,记得在下面加进去。":"已豁免:专家调用工具不受名单限制,但仍记审计。适合「全交给 AI」的团队。"):null,(x.members??[]).map(w=>n("div",{key:w.name,className:"ds-listrow"},n("div",{className:"ds-listrow-main"},n("div",null,w.name,w.name===i()?n(u,{className:"ds-chip ds-chip-soft"},"我"):null),n("div",{className:"ds-hint"},(ACCESS_ROLE_OPTIONS.find($=>$.id===w.role)??ACCESS_ROLE_OPTIONS[1]).hint)),n("div",{className:"ds-listrow-actions"},n(f,{className:"ds-select",value:w.role,disabled:d,onChange:$=>void L("/access/save",{member:{name:w.name,role:$.target.value}})},ACCESS_ROLE_OPTIONS.map($=>n("option",{key:$.id,value:$.id},$.label))),n("button",{className:"ds-btn ds-btn-ghost",disabled:d,onClick:()=>void L("/access/delete",{name:w.name})},"移除")))),(x.members??[]).length===0?n("div",{className:"ds-empty"},"还没有成员。"):null,n("div",{className:"ds-row",style:{gap:8,flexWrap:"wrap"}},n(c,{className:"ds-input",placeholder:"成员名字(和页头「👤 我是…」一致)",value:k.name,style:{flex:"1 1 200px"},onChange:w=>g({...k,name:w.target.value})}),n(f,{className:"ds-select",value:k.role,style:{flex:"0 0 130px"},onChange:w=>g({...k,role:w.target.value})},ACCESS_ROLE_OPTIONS.map(w=>n("option",{key:w.id,value:w.id},w.label))),n("button",{className:"ds-btn ds-btn-primary",disabled:d||k.name.trim()==="",onClick:()=>void P()},"加成员")),y!==null?n("div",{className:"ds-error"},y):null)),n("div",{className:"ds-panel"},n("div",{className:"ds-panel-head"},n("span",null,`审计日志(显示 ${F.length} / 命中 ${V.length} / 共 ${b.length} 条)`),n("div",{className:"ds-row",style:{gap:8,marginLeft:"auto"}},n(c,{className:"ds-input",placeholder:"搜动作 / 人 / 详情",value:A,style:{width:170},onChange:w=>G(w.target.value)}),n(f,{className:"ds-select",value:C===""?"__all__":C,style:{minWidth:150},onChange:w=>E(w.target.value==="__all__"?"":w.target.value)},n("option",{value:"__all__"},"所有人"),W.map(w=>n("option",{key:w,value:w},w))),n("label",{className:"ds-check"},n(p,{checked:_,onChange:w=>R(w.target.checked)}),n("span",null,"只看失败")),n("button",{className:"ds-btn ds-btn-ghost",disabled:d,onClick:async()=>{await l("清空审计日志?清掉之后所有操作记录都没了。",{title:"清空审计日志",danger:!0,okText:"清空"})&&L("/audit/clear",{})}},"清空"),n("button",{className:"ds-btn ds-btn-ghost",disabled:V.length===0,onClick:M,title:"把当前筛选结果导出为 CSV(Excel 可直接打开)"},"导出 CSV"))),n("div",{className:"ds-panel-body"},F.length===0?n("div",{className:"ds-empty"},b.length===0?"还没有记录。做一次写操作就会出现在这里。":"没有符合筛选条件的记录。把关键字清空或换个人试试。"):F.map(w=>n("div",{key:w.id,className:"ds-audit-row","data-ok":w.ok?"1":"0"},n("span",{className:"ds-audit-time"},Ye(w.at)),n("span",{className:"ds-audit-by"},w.by),n("span",{className:"ds-audit-what"},ROUTE_LABEL[w.route]??w.route),n("span",{className:"ds-audit-detail"},w.summary),n("span",{className:"ds-audit-status","data-ok":w.ok?"1":"0"},w.ok?"成功":`失败 ${w.status}`))))))}function Ux({state:e,onChanged:t}){const{h:a,sessionToken:n,api:r,toast:s,currentUser:o,confirmDialog:i,TextField:l,ChipField:c,CheckField:u,SelectField:p,React:f}=vt(),v=e.config,[x,b]=f.useState(null),[k,g]=f.useState(!1),[d,h]=f.useState(null),[y,S]=f.useState(""),C=e.statuses??[],E=f.useMemo(()=>ef(v),[v]),_=F=>{const M=v.columns?.[F];return M==null?[]:Array.isArray(M.members)?M.members:M.kind==="none"?[]:[{kind:M.kind,id:M.id}]},R=F=>v.columns?.[F]?.strategy??"round_robin",A=F=>{if(F.kind==="role")return"🎯 "+(Aa[F.id]??F.id);if(F.kind==="team"){const w=(v.teams??[]).find($=>$.id===F.id);return w===void 0?`👥 ${F.id}`:`${w.emoji??"👥"} ${w.name}`}const M=(v.experts??[]).find(w=>w.id===F.id);return M===void 0?F.id:`${M.emoji} ${M.name}`},G=Array.isArray(v.design?.columns)?v.design.columns:["dev"],L=async F=>{g(!0),b(null);try{await r("/config",{design:{...v.design??{},...F}}),await t()}catch(M){b(M instanceof Error?M.message:String(M))}finally{g(!1)}},P=F=>{const M=G.includes(F)?G.filter(w=>w!==F):[...G,F];L({columns:M})},W=async(F,M,w)=>{g(!0),b(null);try{await r("/columns/save",{status:F,members:M,strategy:w}),await t()}catch($){b($ instanceof Error?$.message:String($))}finally{g(!1)}},J=(F,M)=>{const w=M.key.startsWith("t:")?"team":M.key.startsWith("r:")?"role":"expert",$=M.key.slice(2),Y=_(F);Y.some(I=>I.kind===w&&I.id===$)||(S(""),W(F,[...Y,{kind:w,id:$}],R(F)))},V=(F,M)=>void W(F,_(F).filter((w,$)=>$!==M),R(F));return a("div",{className:"ds-panel"},a("div",{className:"ds-panel-head"},"每一列由谁负责"),a("div",{className:"ds-panel-body"},a("div",{className:"ds-hint"},"推荐挂「角色位」:澄清/验收挂产品经理、开发挂研发工程师、测试挂测试工程师——派单时会按卡片的业务领域自动挑对应领域专家(如支付产品经理);也可以直接指定某位专家或专家团。一列可挂多人(候选池),一个都不挂就只把卡停在原地等人认领。"),a("div",{className:"ds-hint",style:{marginTop:14}},"设计闸门:打开后,卡片进下面选中的列之前设计必须评审通过(验收时可 override 强推)。"),a("div",{className:"ds-row",style:{gap:8,flexWrap:"wrap",marginTop:6}},a("button",{className:v.design?.enabled===!0?"ds-btn ds-btn-primary":"ds-btn",disabled:k,"data-design-gate":v.design?.enabled===!0?"on":"off",onClick:()=>void L({enabled:v.design?.enabled!==!0})},v.design?.enabled===!0?"设计闸门:已开启":"设计闸门:已关闭"),C.map(F=>a("button",{key:"gate-"+F.id,className:G.includes(F.id)?"ds-btn ds-btn-primary":"ds-btn",disabled:k,onClick:()=>P(F.id)},F.label??F.id))),C.map(F=>{const M=_(F.id),w=R(F.id);return a("div",{className:"ds-colrow",key:F.id},a("div",{className:"ds-colrow-head"},a("span",{className:"ds-colrow-name"},F.label??F.id),M.length===0?a("span",{className:"ds-hint"},"👤 等人认领(不自动派)"):M.map(($,Y)=>a(c,{className:"ds-chip ds-chip-owner",key:`${$.kind}:${$.id}`},A($),a("button",{className:"ds-chip-x",title:"从候选里去掉",disabled:k,onClick:()=>V(F.id,Y)},"×"))),a("button",{className:"ds-btn",style:{marginLeft:"auto"},disabled:k,onClick:()=>{S(""),h($=>$===F.id?null:F.id)}},d===F.id?"收起":"+ 加候选"),M.length>=2?a(p,{className:"ds-input",style:{width:240},value:w,disabled:k,onChange:$=>void W(F.id,M,$.target.value)},STRATEGIES.map($=>a("option",{key:$.id,value:$.id},$.label))):null),d===F.id?a("div",{className:"ds-colpick"},a(l,{className:"ds-mention-search",autoFocus:!0,value:y,placeholder:"搜专家或专家团,点一下加进候选",onChange:$=>S($.target.value)}),a("div",{className:"ds-colpick-list"},Fo(E,y).length===0?a("div",{className:"ds-mention-empty"},"没有匹配的专家或专家团"):Fo(E,y).map($=>a("button",{key:$.key,className:"ds-mention-item",onClick:()=>J(F.id,$)},a("span",null,$.emoji),a("span",null,$.name),a("span",{className:"ds-hint"},$.hint))))):null)}),x!==null?a("div",{className:"ds-error"},x):null))}function qx({state:e,onChanged:t}){const{h:a,sessionToken:n,api:r,toast:s,currentUser:o,confirmDialog:i,TextField:l,ChipField:c,CheckField:u,SelectField:p,React:f}=vt(),[v,x]=f.useState(e.storage??null),[b,k]=f.useState([]),[g,d]=f.useState(null),[h,y]=f.useState(null),[S,C]=f.useState(!1),E=f.useCallback(()=>{r("/snapshots").then(A=>{x(A.storage??null),k(A.snapshots??[]),d(null)}).catch(A=>d(A instanceof Error?A.message:String(A)))},[]);f.useEffect(()=>{E()},[E,e.revision]);const _=async A=>{await i(`把看板回滚到快照 #${A}?当前的这一版会先另存一份,不会丢。`,{title:"回滚快照",okText:"回滚"})&&(C(!0),y(null),r("/snapshot/restore",{id:A}).then(()=>{y(`已回滚到快照 #${A}`),E(),t?.()}).catch(G=>d(G instanceof Error?G.message:String(G))).finally(()=>C(!1)))},R=A=>{const G=new Date(Number(A)||0);return`${G.getMonth()+1}-${String(G.getDate()).padStart(2,"0")} ${String(G.getHours()).padStart(2,"0")}:${String(G.getMinutes()).padStart(2,"0")}:${String(G.getSeconds()).padStart(2,"0")}`};return a("div",{className:"ds-pane-stack"},a("div",{className:"ds-panel ds-form-panel"},a("div",{className:"ds-panel-head"},"台账存储",a(c,{className:"ds-chip","data-on":v?.engine==="sqlite"?"1":"0"},v?.engine==="sqlite"?"SQLite":"单文件")),a("div",{className:"ds-panel-body"},a("div",{className:"ds-an-kv"},a("span",{},"数据文件"),a("b",{},v?.db??"—")),a("div",{className:"ds-an-kv"},a("span",{},"密钥文件(600 权限,明文不进台账)"),a("b",{},v?.secretsFile??"—")),a("div",{className:"ds-an-kv"},a("span",{},"保留快照"),a("b",{},`${v?.snapshots??0} / ${v?.snapshotLimit??0}`)),a("div",{className:"ds-hint"},"每次写操作都会在同一个事务里先存一份快照,再更新台账;多进程同时写会排队(busy_timeout 5s),不会互相覆盖。"))),a("div",{className:"ds-panel"},a("div",{className:"ds-panel-head"},"快照",a("button",{className:"ds-btn ds-btn-ghost",style:{marginLeft:"auto"},onClick:E,disabled:S},"刷新")),a("div",{className:"ds-panel-body"},h!==null?a("div",{className:"ds-ok"},h):null,g!==null?a("div",{className:"ds-error"},g):null,b.length===0?a("div",{className:"ds-hint"},v?.engine==="sqlite"?"还没有快照。":"单文件模式没有快照(这台机器的 node 不支持 node:sqlite 时会退回单文件)。"):b.map(A=>a("div",{key:A.id,className:"ds-listrow"},a("div",{className:"ds-listrow-main"},a("div",null,`#${A.id} · rev ${A.revision}`),a("div",{className:"ds-hint"},`${R(A.at)} · ${(A.bytes/1024).toFixed(1)} KB`)),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn ds-btn-ghost",disabled:S,onClick:()=>_(A.id)},"回滚到这版")))))))}function Vx({state:e,config:t,onChanged:a}){const{h:n,sessionToken:r,api:s,toast:o,currentUser:i,confirmDialog:l,TextField:c,ChipField:u,CheckField:p,SelectField:f,React:v}=vt(),x=e.integrations??{channels:[],broken:0},[b,k]=v.useState(""),[g,d]=v.useState(null),h=(e.requirements??[]).find(w=>(w.folder?.token??"")!==""),y=e.agents??{},S=y.lock??null,C=S===null?0:Math.max(0,Date.now()-(Number(S.at)||0)),[E,_]=v.useState(""),[R,A]=v.useState(!1),G=E.trim().toLowerCase(),L=(y.log??[]).filter(w=>{const $=String(w?.line??"");return R&&!/失败|错误|异常|拦|拒绝/.test($)?!1:G===""||$.toLowerCase().includes(G)}),P=L.slice(0,12),W=()=>{const w=new URLSearchParams({q:E.trim(),failed:R?"1":"0",token:r()??""}),$=document.createElement("a");$.href=`${API}/export/dispatch.csv?${w.toString()}`,$.rel="noopener",document.body.appendChild($),$.click(),document.body.removeChild($),o(`正在导出 ${L.length} 条派单日志`)},J=async w=>{k(w),d(null);try{if(w==="gitlab"){const $=await s("/gitlab/sync",{});d($.report===void 0?"已触发 GitLab 同步":`已同步:${($.report.projects??[]).map(Y=>`${Y.name} +${Y.created}`).join(",")||"无新卡"}`)}else if(w==="drive")if(h===void 0)d("还没有带云盘文件夹的需求,先建一条需求并归档一次。");else{const $=await s("/requirement/sync",{id:h.id});d(`已归档 ${$.report?.written??0} / ${$.report?.total??0} 件`),o(`已归档 ${$.report?.written??0} / ${$.report?.total??0} 件`)}else if(w==="feishu"){const $=await s("/feishu/test",{});d($.ok===!0?"测试消息已发出":`发送失败:${$.result?.error??"没配置机器人"}`)}else d("代码隔离没有独立的重试入口,下一张卡派单时会自动重试。");await a()}catch($){{const Y=$ instanceof Error?$.message:String($);d(Y),o(Y,"error")}}finally{k("")}},V=w=>{const $=Number(w)||0;if($===0)return"—";const Y=new Date($);return`${Y.getMonth()+1}-${String(Y.getDate()).padStart(2,"0")} ${String(Y.getHours()).padStart(2,"0")}:${String(Y.getMinutes()).padStart(2,"0")}`},F={ok:"正常",error:"异常",idle:"还没用过"},M={ok:"#0f9d58",error:"#e5484d",idle:"#8a8f98"};return n("div",{className:"ds-pane-stack"},n("div",{className:"ds-panel"},n("div",{className:"ds-panel-head"},"派单运行状态",n(u,{className:"ds-chip","data-on":y.enabled===!0?"1":"0"},y.enabled===!0?"运行中":"已停用"),n("div",{className:"ds-row",style:{gap:8,marginLeft:"auto"}},n(c,{className:"ds-input",placeholder:"搜派单日志",value:E,style:{width:150},onChange:w=>_(w.target.value)}),n("label",{className:"ds-check"},n(p,{checked:R,onChange:w=>A(w.target.checked)}),n("span",null,"只看失败")),n("button",{className:"ds-btn ds-btn-ghost",disabled:L.length===0,onClick:W,title:"把当前筛选结果导出为 CSV"},"导出 CSV"))),n("div",{className:"ds-panel-body"},n("div",{className:"ds-kv"},n("dt",{},"实例"),n("dd",{},String(y.instance??"—")),n("dt",{},"派单锁"),n("dd",{},S===null?"还没抢到过(可能是内存模式)":`${S.mine===!0?"本进程持有":"其他实例持有"} · ${Math.round(C/1e3)} 秒前续租`),n("dt",{},"并发占用"),n("dd",{},`${(y.running??[]).length} / ${y.maxConcurrent??"—"}`),n("dt",{},"最近一轮"),n("dd",{},V(y.lastTickAt)),n("dt",{},"最近错误"),n("dd",{},String(y.lastError??"")===""?"无":String(y.lastError))),(y.log??[]).length===0?n("div",{className:"ds-empty"},"还没有派单日志。卡进入自动列后,这里会出现派单、空闲、失败记录。"):P.length===0?n("div",{className:"ds-empty"},"没有符合筛选条件的派单日志。"):n("div",{className:"ds-log"},P.map((w,$)=>n("div",{key:String($),className:"ds-log-line"},`${V(w.at)} · ${String(w.line??"")}`))),(y.log??[]).length>0&&L.length>P.length?n("div",{className:"ds-hint"},`只显示最近 ${P.length} / 命中 ${L.length} 条,导出可看全量`):null)),n("div",{className:"ds-panel"},n("div",{className:"ds-panel-head"},"集成状态",n(u,{className:"ds-chip","data-on":x.broken===0?"1":"0"},x.broken===0?"全部正常":`${x.broken} 条异常`),n("button",{className:"ds-btn ds-btn-ghost",style:{marginLeft:"auto"},onClick:()=>void a()},"刷新")),n("div",{className:"ds-panel-body"},g!==null?n("div",{className:"ds-hint"},g):null,x.channels.length===0?n("div",{className:"ds-empty"},"还没有调用过任何外部集成。配好 GitLab / 飞书机器人 / 云盘文件夹后,第一次成功或失败就会出现在这里。"):x.channels.map(w=>n("div",{key:w.channel,className:"ds-listrow"},n("div",{className:"ds-listrow-main"},n("div",null,n("span",{style:{color:M[w.state],fontWeight:700}},"● "),w.label,n(u,{className:"ds-chip ds-chip-soft",style:{marginLeft:6}},F[w.state])),n("div",{className:"ds-hint"},w.hint),n("div",{className:"ds-hint"},`最近一次:${V(w.at)} · 成功 ${V(w.lastOkAt)} · 失败 ${V(w.lastErrorAt)}${w.attempts>0?` · 试着调了 ${w.attempts} 次,连挂 ${w.failures} 次`:""}`),w.lastError===""?null:n("div",{className:"ds-error"},w.lastError)),n("div",{className:"ds-listrow-actions"},n("button",{className:"ds-btn ds-btn-ghost",disabled:b!=="",onClick:()=>void J(w.channel)},b===w.channel?"重试中…":"再试一次")))))),n("div",{className:"ds-panel ds-form-panel"},n("div",{className:"ds-panel-head"},"失败了会怎样"),n("div",{className:"ds-panel-body"},n("div",{className:"ds-hint"},"· 飞书通知:同一条消息会自动重发一次,两次都失败才记异常(飞书 200 但 body 里 code≠0 也算失败)。"),n("div",{className:"ds-hint"},"· GitLab:拉 Issue、回写评论、对 MR 失败会记在这里;同步定时器仍会自动重试下一轮。"),n("div",{className:"ds-hint"},"· 飞书云盘:归档失败会挂在交付物自身的 doc.error 上,这里再汇总一份。"),n("div",{className:"ds-hint"},"· 代码隔离:worktree 建失败只影响这一张卡(退回普通工作区),不影响别的卡。"))))}function Wx({config:e,onChanged:t}){const{h:a,Editor:n,api:r,toast:s,confirmDialog:o,tipOf:i,TextField:l,ChipField:c,CheckField:u,MdField:p,SideDrawer:f,React:v}=vt(),x=e.gitlab?.projects??[],[b,k]=v.useState(null),[g,d]=v.useState(null),[h,y]=v.useState(null),[S,C]=v.useState(!1),E=async()=>{if(b!==null){C(!0),d(null),y(null);try{await r("/repos/save",{project:b}),k(null),y("已保存"),s("已保存"),await t()}catch(P){d(P instanceof Error?P.message:String(P))}finally{C(!1)}}},_=async P=>{if(await o(`删除 GitLab 项目「${P.name}」?已同步的卡片会保留。`,{title:"删除 GitLab 项目",danger:!0,okText:"删除"})){C(!0),d(null);try{await r("/repos/delete",{id:P.id}),await t()}catch(W){d(W instanceof Error?W.message:String(W))}finally{C(!1)}}},R=async P=>{C(!0),d(null),y(null);try{const W=await r("/repos/test",{id:P.id});y(`连通:${P.project}(示例 Issue ${W.sample} 条)`)}catch(W){d(W instanceof Error?W.message:String(W))}finally{C(!1)}},A=async P=>{C(!0),d(null),y(null);try{const J=((await r("/gitlab/sync",{project:P.id})).summary?.projects??[])[0];y(J===void 0?"没有可同步的项目":`${J.name}:拉取 ${J.fetched},新建 ${J.created}${J.error?",错误 "+J.error:""}`),await t()}catch(W){d(W instanceof Error?W.message:String(W))}finally{C(!1)}},G=(P,W)=>k({...b,[P]:W}),L=x.map(P=>a("div",{className:"ds-listrow",key:P.id},a("div",{className:"ds-listrow-main"},a("div",{},`${P.name||P.project}${P.syncEnabled?" · 自动同步":""}${P.tokenSet?"":" · 缺令牌"}`),a("div",{className:"ds-hint"},`${P.url||e.gitlab.url||"(未填地址)"} / ${P.project}${P.lastSyncAt?" · 上次 "+new Date(P.lastSyncAt).toLocaleString():""}`),P.lastSyncError?a("div",{className:"ds-error"},P.lastSyncError):null),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn",disabled:S,onClick:()=>void A(P)},"同步"),a("button",{className:"ds-btn",disabled:S,onClick:()=>void R(P)},"测试"),a("button",{className:"ds-btn",disabled:S,onClick:()=>k({...P,token:""})},"编辑"),i("删除这个项目(卡不会删)",a("button",{className:"ds-btn",disabled:S,onClick:()=>void _(P),"data-danger":"1"},"删除")))));return a("div",{className:"ds-pane-stack"},a(n,{title:"代码仓库(GitLab,可以有多个)",hint:"每个项目单独填地址、项目路径和令牌;同步时按项目分开去重,两个仓库都有 #12 也不会串。",rows:L,onAdd:()=>k({id:"",name:"",url:e.gitlab?.url??"",project:"",token:"",syncEnabled:!1,syncLabel:""}),addLabel:"新增项目",render:P=>P,empty:"还没有项目,点「新增项目」。"}),h!==null?a("div",{className:"ds-ok",style:{marginBottom:8}},h):null,b===null?null:a(f,{title:b.id?`编辑仓库:${b.name||b.project}`:"新增仓库",hint:"一个仓库对应 GitLab 上的一个项目;令牌只写盘不回显,留空表示不修改。",onClose:()=>k(null),footer:[a("button",{key:"save",className:"ds-btn ds-btn-primary",disabled:S,onClick:()=>void E()},S?"保存中…":"保存"),a("button",{key:"cancel",className:"ds-btn",disabled:S,onClick:()=>k(null)},"取消"),g!==null?a("span",{key:"error",className:"ds-error ds-side-note"},g):null]},a("div",{className:"ds-field"},a("div",{className:"ds-label"},"显示名"),a(l,{className:"ds-input",value:b.name,placeholder:"订单服务",onChange:P=>G("name",P.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"GitLab 地址"),a(l,{className:"ds-input",value:b.url,placeholder:"https://gitlab.example.com",onChange:P=>G("url",P.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"项目路径(含 namespace)"),a(l,{className:"ds-input",value:b.project,placeholder:"backend/order-service",onChange:P=>G("project",P.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},b.tokenSet?"Access Token(已设置,留空则不修改)":"Access Token"),a(l,{className:"ds-input",type:"password",value:b.token,placeholder:b.tokenSet?"••••••••":"glpat-…",onChange:P=>G("token",P.target.value)}),a("div",{className:"ds-hint"},"需要 api 权限;只写入磁盘,不回显。")),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"只同步带此标签的 Issue"),a(l,{className:"ds-input",value:b.syncLabel,placeholder:"留空则同步全部 open Issue",onChange:P=>G("syncLabel",P.target.value)})),a("div",{className:"ds-field"},a("label",{className:"ds-row",style:{alignItems:"center",gap:8,cursor:"pointer"}},a(u,{checked:b.syncEnabled===!0,onChange:P=>G("syncEnabled",P.target.checked)}),a("span",{},"每分钟自动把这个项目的新 Issue 拉成卡片")))))}const sf=[{key:"change",label:"卡片状态变化"},{key:"sla",label:"缺陷 SLA 超时"},{key:"bug",label:"自动开缺陷"},{key:"release",label:"版本发布"}],Hx=e=>{const t=e.events!==null&&typeof e.events=="object"?e.events:null;return t===null?e.notifyOnChange===!1?[]:["change","sla","bug","release"]:sf.filter(a=>t[a.key]!==!1).map(a=>a.label)};function Gx({config:e,onChanged:t}){const{h:a,Editor:n,api:r,toast:s,confirmDialog:o,tipOf:i,TextField:l,ChipField:c,CheckField:u,MdField:p,SideDrawer:f,React:v}=vt(),x=e.feishu?.bots??[],[b,k]=v.useState(null),[g,d]=v.useState(null),[h,y]=v.useState(null),[S,C]=v.useState(!1),[E,_]=v.useState(e.feishu?.driveFolder??""),[R,A]=v.useState(e.feishu?.autoSyncArtifacts!==!1),[G,L]=v.useState(!1),[P,W]=v.useState(null),J=async()=>{L(!0),W(null);try{await r("/config",{feishu:{driveFolder:E.trim(),autoSyncArtifacts:R}}),W("已保存"),await t()}catch(O){W(O instanceof Error?O.message:String(O))}finally{L(!1)}},V=async()=>{if(b!==null){C(!0),d(null),y(null);try{await r("/bots/save",{bot:b}),k(null),y("已保存"),s("已保存"),await t()}catch(O){d(O instanceof Error?O.message:String(O))}finally{C(!1)}}},F=async O=>{if(await o(`删除飞书机器人「${O.name}」?`,{title:"删除机器人",danger:!0,okText:"删除"})){C(!0),d(null);try{await r("/bots/delete",{id:O.id}),await t()}catch(K){d(K instanceof Error?K.message:String(K))}finally{C(!1)}}},M=async O=>{C(!0),d(null),y(null);try{const Ne=((await r("/feishu/test",{id:O.id})).results??[])[0];y(Ne!==void 0&&Ne.ok===!0?`「${O.name}」测试消息已发送`:`「${O.name}」发送失败:${Ne?.error??"检查 Webhook"}`)}catch(K){d(K instanceof Error?K.message:String(K))}finally{C(!1)}},w=(O,K)=>k({...b,[O]:K}),$=O=>{const K=b.events!==null&&typeof b.events=="object"?b.events:null;return K===null?O==="change"?b.notifyOnChange!==!1:!0:K[O]!==!1},Y=(O,K)=>{const fe={...b.events!==null&&typeof b.events=="object"?b.events:{},[O]:K};k({...b,events:fe,notifyOnChange:fe.change!==!1})},I=x.map(O=>a("div",{className:"ds-listrow",key:O.id},a("div",{className:"ds-listrow-main"},a("div",{},`${O.name}${O.enabled===!1?" (已停用)":""}${O.webhookSet?"":" · 缺 Webhook"}`),a("div",{className:"ds-hint"},`Webhook ${O.webhookHint||"(未设置)"}${O.chatId?" · 群 "+O.chatId:""} · 收:${Hx(O).join(" / ")||"什么都不收"}`)),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn",disabled:S,onClick:()=>void M(O)},"测试"),a("button",{className:"ds-btn",disabled:S,onClick:()=>k({...O,webhook:""})},"编辑"),a("button",{className:"ds-btn",disabled:S,onClick:()=>void F(O),"data-danger":"1"},"删除"))));return a("div",{className:"ds-pane-stack"},a(n,{title:"飞书机器人(可以有多个)",hint:"一个群建一个机器人,并在下面勾选它要收哪些事件;研发群只勾缺陷相关,产品群只勾版本发布。",rows:I,onAdd:()=>k({id:"",name:"",webhook:"",chatId:"",notifyOnChange:!0,events:{change:!0,sla:!0,bug:!0,release:!0},enabled:!0}),addLabel:"新增机器人",render:O=>O,empty:"还没有机器人。"}),h!==null?a("div",{className:"ds-ok",style:{marginBottom:8}},h):null,a("div",{className:"ds-panel ds-form-panel"},a("div",{className:"ds-panel-head"},"云盘归档(产物文档)"),a("div",{className:"ds-panel-body"},a("div",{className:"ds-field"},a("div",{className:"ds-label"},"云盘根文件夹 token 或链接"),a(l,{className:"ds-input",value:E,placeholder:"IuJPfTCtWlDrzwdCFmLc71aynbg 或文件夹链接",onChange:O=>_(O.target.value)}),a("div",{className:"ds-hint"},`每条需求会在它下面建一个「编号 + 标题」的同名文件夹,交付物写成文件夹里的一份 .md 文档。飞书授权:${e.feishu?.larkReady?"lark-cli 已就绪":"lark-cli 未就绪或未授权"}`)),a("label",{className:"ds-row",style:{alignItems:"center",gap:8,cursor:"pointer"}},a(u,{checked:R,onChange:O=>A(O.target.checked)}),a("span",{},"专家登记交付物时自动归档(关掉就只存平台里)")),a("div",{className:"ds-row",style:{gap:8}},a("button",{className:"ds-btn ds-btn-primary",disabled:G,onClick:()=>void J()},G?"保存中…":"保存"),P!==null?a("div",{className:"ds-hint"},P):null))),b===null?null:a(f,{title:b.id?`编辑机器人:${b.name||b.id}`:"新增机器人",hint:"Webhook 只写盘不回显,留空表示不修改;一个群建一个机器人即可。",onClose:()=>k(null),footer:[a("button",{key:"save",className:"ds-btn ds-btn-primary",disabled:S,onClick:()=>void V()},S?"保存中…":"保存"),a("button",{key:"cancel",className:"ds-btn",disabled:S,onClick:()=>k(null)},"取消"),g!==null?a("span",{key:"error",className:"ds-error ds-side-note"},g):null]},a("div",{className:"ds-field"},a("div",{className:"ds-label"},"名字"),a(l,{className:"ds-input",value:b.name,placeholder:"研发群通知",onChange:O=>w("name",O.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},b.webhookSet?"Webhook(已设置,留空则不修改)":"Webhook"),a(l,{className:"ds-input",type:"password",value:b.webhook,placeholder:"https://open.feishu.cn/open-apis/bot/v2/hook/…",onChange:O=>w("webhook",O.target.value)}),a("div",{className:"ds-hint"},"在飞书群里「添加机器人 → 自定义机器人」即可拿到,不需要自建应用。")),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"备注群 chat_id(可选)"),a(l,{className:"ds-input",value:b.chatId,placeholder:"oc_…",onChange:O=>w("chatId",O.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"收哪些事件"),a("div",{className:"ds-row",style:{gap:16,flexWrap:"wrap"}},...sf.map(O=>a("label",{key:O.key,className:"ds-row",style:{alignItems:"center",gap:8,cursor:"pointer"}},a(u,{checked:$(O.key),onChange:K=>Y(O.key,K.target.checked)}),a("span",{},O.label)))),a("div",{className:"ds-hint"},"不勾任何一项就等于这个群静默(只保留测试消息)。")),a("div",{className:"ds-row",style:{gap:16}},a("label",{className:"ds-row",style:{alignItems:"center",gap:8,cursor:"pointer"}},a(u,{checked:b.enabled!==!1,onChange:O=>w("enabled",O.target.checked)}),a("span",{},"启用")))))}function Kx({config:e,onChanged:t}){const{h:a,Editor:n,api:r,toast:s,confirmDialog:o,tipOf:i,TextField:l,ChipField:c,CheckField:u,MdField:p,SideDrawer:f,React:v}=vt(),[x,b]=v.useState(null),[k,g]=v.useState(null),[d,h]=v.useState(null),[y,S]=v.useState(null),[C,E]=v.useState(!1),[_,R]=v.useState(!1),[A,G]=v.useState(!1),L=v.useCallback(async()=>{try{const O=await r("/skills");b({root:O.root,skills:O.skills??[],onDisk:O.onDisk??[]})}catch(O){h(O instanceof Error?O.message:String(O))}},[]);v.useEffect(()=>{L()},[L]);const P=x?.skills??[],W=x?.onDisk??[],J=O=>(e.experts??[]).filter(K=>(K.skills??[]).includes(O)),V=(O,K)=>g({...k,[O]:K}),F=async()=>{if(k!==null){E(!0),h(null),S(null);try{const O=await r("/skills/save",{skill:{name:k.name,description:k.description,whenToUse:k.whenToUse,tags:k.tags,content:k.content,enabled:k.enabled!==!1}});g(null),S(O.warning??(O.file?`已写入 ${O.file}`:"已保存")),await L(),await t()}catch(O){h(O instanceof Error?O.message:String(O))}finally{E(!1)}}},M=async O=>{if(await o(`删除技能「${O.name}」?磁盘上的 SKILL.md 也会一起删掉。`,{title:"删除技能",danger:!0,okText:"删除"})){E(!0),h(null),S(null);try{await r("/skills/delete",{name:O.name}),await L(),await t()}catch(K){h(K instanceof Error?K.message:String(K))}finally{E(!1)}}},w=async()=>{E(!0),h(null),S(null);try{const O=await r("/skills/sync",{});S(`已重新写入 ${(O.written??[]).length} 条技能`),await L()}catch(O){h(O instanceof Error?O.message:String(O))}finally{E(!1)}},$=async O=>{if(O!=null){R(!0),h(null),S(null);try{const K=new Uint8Array(await O.arrayBuffer());let Ne="";const fe=32768;for(let Se=0;Se<K.length;Se+=fe)Ne+=String.fromCharCode.apply(null,K.subarray(Se,Se+fe));const xe=await r("/skills/upload",{fileName:O.name,dataBase64:window.btoa(Ne),overwrite:A}),He=xe.overwritten===!0?"已覆盖":"已上传";S(`${He}技能「${xe.skill.name}」${xe.file?`,写入 ${xe.file}`:""}`),g(null),await L(),await t()}catch(K){h(K instanceof Error?K.message:String(K))}finally{R(!1)}}},Y=P.map(O=>a("div",{className:"ds-listrow",key:O.name},a("div",{className:"ds-listrow-main"},a("div",{},a("code",{},O.name),(O.tags??[]).map(K=>a(c,{className:"ds-chip",key:K},K)),O.enabled===!1?a("span",{className:"ds-hint"}," (已停用)"):null,W.includes(O.name)?null:a("span",{className:"ds-err"}," 未落盘")),a("div",{className:"ds-hint"},O.description),O.whenToUse?a("div",{className:"ds-hint"},`何时用:${O.whenToUse}`):null,J(O.name).length>0?a("div",{className:"ds-hint"},`使用中的专家:${J(O.name).map(K=>`${K.emoji}${K.name}`).join("、")}`):a("div",{className:"ds-empty"},"还没有专家挂这个技能")),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn",disabled:C,onClick:()=>{S(null),g({...O,editing:!0,tags:(O.tags??[]).join(", ")})}},"编辑"),a("button",{className:"ds-btn",disabled:C,onClick:()=>void M(O),"data-danger":"1"},"删除")))),I=W.filter(O=>!P.some(K=>K.name===O));return a("div",{className:"ds-pane-stack"},a(n,{title:"技能库(skills-manager)",hint:x===null?"读取中…":`保存在 ${x.root}/<名字>/SKILL.md,所有专家都能用 skill 工具加载;专家也可以自己用 studio_skill_save 往这里加技能。支持上传 SKILL.md 或包含 SKILL.md 的 .zip 技能包。`,rows:Y,addLabel:"新建技能",onAdd:()=>{S(null),g({name:"",description:"",whenToUse:"",tags:"",content:`# 什么时候用
|
|
29
|
+
不确定的地方去代码或历史工单里找证据,禁止编造接口字段。`,onChange:R=>j("prompt",R.target.value)})),a("div",{className:"ds-field"},a("label",{className:"ds-row",style:{alignItems:"center",gap:8,cursor:"pointer"}},a(v,{checked:g.enabled!==!1,onChange:R=>j("enabled",R.target.checked)}),a("span",{},"启用这个专家")))))}function Dx({config:e,onChanged:t}){const{h:a,React:n,Editor:r,api:s,toast:o,confirmDialog:i,tipOf:l,tipLabel:c,TextField:u,TextAreaField:p,ChipField:f,CheckField:v,SelectField:x,SideDrawer:b}=ht(),k=e.teams??[],g=e.experts??[],[d,h]=n.useState(null),[y,S]=n.useState(null),[C,E]=n.useState(!1),[_,I]=n.useState({});n.useEffect(()=>{let q=!0;return s("/team/memory",{}).then(B=>{q&&I(B?.memory??{})}).catch(()=>{}),()=>{q=!1}},[e.teams]);const j=async q=>{if(await i("清空「"+q.name+"」的团队记忆?",{title:"清空团队记忆",danger:!0,okText:"清空"}))try{const B=await s("/team/memory/clear",{teamId:q.id});I(B?.memory??{}),o("已清空这个团的记忆")}catch(B){S(B instanceof Error?B.message:String(B))}},H=q=>{const B=g.find(L=>L.id===q);return B===void 0?q:`${B.emoji} ${B.name}`},M=async()=>{if(d!==null){E(!0),S(null);try{await s("/teams/save",{team:d}),h(null),await t()}catch(q){S(q instanceof Error?q.message:String(q))}finally{E(!1)}}},P=async q=>{if(await i(`删除专家团「${q.name}」?`,{title:"删除专家团",danger:!0,okText:"删除"})){E(!0),S(null);try{await s("/teams/delete",{id:q.id}),await t()}catch(B){S(B instanceof Error?B.message:String(B))}finally{E(!1)}}},G=(q,B)=>h({...d,[q]:B}),J=k.map(q=>a("div",{className:"ds-listrow",key:q.id},a("div",{className:"ds-listrow-main"},a("div",{},`👥 ${q.name}`),a("div",{className:"ds-hint"},`团长 ${H(q.lead)} · 成员 ${q.members.map(H).join("、")}`),a("div",{className:"ds-hint"},(_[q.id]??[]).length===0?"🧠 团队记忆:还没有(卡做完会自动记一条,派活时带进提示词)":`🧠 团队记忆 ${_[q.id].length} 条 · 最近:${_[q.id][0]?.outcome??""} ${_[q.id][0]?.title??""}`)),a("div",{className:"ds-listrow-actions"},l("清空这个团的记忆",a("button",{className:"ds-btn ds-btn-ghost",disabled:C||(_[q.id]??[]).length===0,onClick:()=>void j(q)},"清空记忆")),l("编辑这个专家团",a("button",{className:"ds-btn",disabled:C,onClick:()=>h({...q})},"编辑")),l("删除这个专家团",a("button",{className:"ds-btn",disabled:C,onClick:()=>void P(q),"data-danger":"1"},"删除")))));return a("div",{className:"ds-pane-stack"},a(r,{title:"专家团(一起干活)",hint:"专家团有团长和成员。评论里 @团名,团长会拆活、给成员派活并汇总结论;成员之间可以继续 @ 接棒。",rows:J,onAdd:()=>h({id:"",name:"",description:"",members:[],lead:"",enabled:!0}),addLabel:"新增专家团",render:q=>q,empty:"还没有专家团。"}),d===null?null:a(b,{title:d.id?`编辑专家团:${d.name||d.id}`:"新增专家团",hint:"团长负责拆活,成员之间在评论里用 @名字 接棒;改完点右下角「保存」。",onClose:()=>h(null),footer:[a("button",{key:"save",className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void M()},C?"保存中…":"保存"),a("button",{key:"cancel",className:"ds-btn",disabled:C,onClick:()=>h(null)},"取消"),y!==null?a("span",{key:"error",className:"ds-error ds-side-note"},y):null]},a("div",{className:"ds-field"},a("div",{className:"ds-label"},"团名(@ 用这个名字)"),a(u,{className:"ds-input",value:d.name,placeholder:"需求交付组",onChange:q=>G("name",q.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"这个团负责什么"),a(u,{className:"ds-input",value:d.description,placeholder:"从需求澄清一路做到验收",onChange:q=>G("description",q.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"成员"),g.length===0?a("div",{className:"ds-hint"},"先去上面建几个专家。"):a("div",{className:"ds-row",style:{flexWrap:"wrap",gap:12}},g.map(q=>a("label",{className:"ds-row",key:q.id,style:{alignItems:"center",gap:6,cursor:"pointer"}},a(v,{checked:(d.members??[]).includes(q.id),onChange:B=>G("members",B.target.checked?[...d.members??[],q.id]:(d.members??[]).filter(L=>L!==q.id))}),a("span",{},`${q.emoji} ${q.name}`))))),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"团长(负责拆活和汇总)"),a(x,{className:"ds-input",value:d.lead??"",onChange:q=>G("lead",q.target.value)},a("option",{value:""},"自动(第一个成员)"),(d.members??[]).map(q=>a("option",{key:q,value:q},H(q)))))))}function Ox({config:e,onChanged:t}){const{h:a,React:n,Editor:r,api:s,toast:o,confirmDialog:i,tipOf:l,tipLabel:c,TextField:u,TextAreaField:p,ChipField:f,CheckField:v,SelectField:x,SideDrawer:b}=ht(),k=e.testing??{},g=Array.isArray(k.envs)?k.envs:[],[d,h]=n.useState(null),[y,S]=n.useState((Array.isArray(k.allowHosts)?k.allowHosts:[]).join(", ")),[C,E]=n.useState(String(k.timeoutMs??15e3)),[_,I]=n.useState(!1),[j,H]=n.useState(null),[M,P]=n.useState(null),[G,J]=n.useState({allowShell:k.allowShell===!0,allowDb:k.allowDb===!0}),[q,B]=n.useState({casesPerTask:e.limits?.casesPerTask??60,runKeys:e.limits?.runKeys??60,artifactsPerTask:e.limits?.artifactsPerTask??40}),[L,w]=n.useState(()=>(Array.isArray(e.webhooks)?e.webhooks:[]).map(ae=>({...ae}))),T=async ae=>{J(ae),I(!0),P(null);try{await s("/config",{testing:{...k,allowShell:ae.allowShell,allowDb:ae.allowDb}}),P("已保存"),await t()}catch(F){H(F instanceof Error?F.message:String(F))}finally{I(!1)}},Q=async()=>{I(!0),P(null);try{await s("/config",{limits:q}),P("上限已保存"),o("上限已保存"),await t()}catch(ae){H(ae instanceof Error?ae.message:String(ae))}finally{I(!1)}},R=async()=>{I(!0),P(null);try{await s("/config",{webhooks:L.filter(ae=>String(ae.url??"").trim()!=="")}),P("webhook 已保存"),o("webhook 已保存"),await t()}catch(ae){H(ae instanceof Error?ae.message:String(ae))}finally{I(!1)}},D=async ae=>{I(!0),H(null),P(null);try{await s("/config",{testing:{envs:ae.envs??g,defaultEnv:ae.defaultEnv!==void 0?ae.defaultEnv:k.defaultEnv??"",timeoutMs:ae.timeoutMs!==void 0?ae.timeoutMs:k.timeoutMs??15e3,allowHosts:ae.allowHosts!==void 0?ae.allowHosts:Array.isArray(k.allowHosts)?k.allowHosts:[],concurrency:k.concurrency??4}}),P("已保存"),o("已保存"),await t()}catch(F){H(F instanceof Error?F.message:String(F))}finally{I(!1)}},K=async()=>{if(d===null)return;const ae=String(d.name??"").trim(),F=String(d.baseUrl??"").trim();if(ae===""){H("环境名不能为空");return}const te={id:d.id??"",name:ae,baseUrl:F},xe=d.id===void 0||d.id===""?[...g,te]:g.map(X=>X.id===d.id?{...X,...te}:X);h(null),await D({envs:xe,defaultEnv:k.defaultEnv===""?"":k.defaultEnv})},we=async ae=>{if(!await i(`删除环境「${ae.name}」?`,{title:"删除环境",danger:!0,okText:"删除"}))return;const F=g.filter(te=>te.id!==ae.id);await D({envs:F,defaultEnv:k.defaultEnv===ae.id?F[0]?.id??"":k.defaultEnv})},fe=async()=>{const ae=y.split(/[,,\s]+/).map(te=>te.trim()).filter(te=>te!==""),F=Number(C);await D({allowHosts:ae,timeoutMs:Number.isFinite(F)&&F>0?F:15e3})},ye=ae=>a("div",{key:ae.id,className:"ds-listrow"},a("div",{className:"ds-listrow-main"},a("div",null,`${ae.name}${k.defaultEnv===ae.id?" · 默认":""}`),a("div",{className:"ds-hint"},ae.baseUrl===""?"相对地址会因为没有 baseUrl 而失败":ae.baseUrl)),a("div",{className:"ds-listrow-actions"},k.defaultEnv===ae.id?null:a("button",{className:"ds-btn ds-btn-ghost",disabled:_,onClick:()=>void D({defaultEnv:ae.id})},"设为默认"),a("button",{className:"ds-btn ds-btn-ghost",disabled:_,onClick:()=>h({...ae})},"编辑"),a("button",{className:"ds-btn ds-btn-ghost",disabled:_,onClick:()=>void we(ae),"data-danger":"1"},"删除"))),Ve=d===null?null:a("div",{className:"ds-panel ds-form-panel"},a("div",{className:"ds-panel-head"},d.id===void 0||d.id===""?"新增环境":`编辑环境:${d.name}`),a("div",{className:"ds-panel-body"},a("div",{className:"ds-field"},a("div",{className:"ds-label"},"环境名"),a(u,{className:"ds-input",value:d.name??"",placeholder:"例如 测试环境 / 预发环境",onChange:ae=>h({...d,name:ae.target.value})})),a("div",{className:"ds-field"},c("baseUrl","接口测试的根地址,用例里的 /path 会拼在它后面"),a(u,{className:"ds-input",value:d.baseUrl??"",placeholder:"https://test.example.com",onChange:ae=>h({...d,baseUrl:ae.target.value})})),a("div",{className:"ds-row",style:{justifyContent:"flex-end"}},a("button",{className:"ds-btn ds-btn-ghost",disabled:_,onClick:()=>h(null)},"取消"),a("button",{className:"ds-btn ds-btn-primary",disabled:_,onClick:()=>void K()},"保存环境"))));return a("div",{className:"ds-pane-stack"},Ve,a("div",{className:"ds-panel"},a("div",{className:"ds-panel-head"},"执行开关",a("span",{className:"ds-hint"},"默认都关:打开等于把宿主机的能力交给看板使用者")),a("div",{className:"ds-panel-body"},a("label",{className:"ds-check"},a(v,{checked:G.allowShell,disabled:_,onChange:ae=>void T({...G,allowShell:ae.target.checked})}),a("span",{className:"ds-check-text"},"允许 shell 用例(能在宿主机执行命令)")),a("label",{className:"ds-check",style:{marginTop:6}},a(v,{checked:G.allowDb,disabled:_,onChange:ae=>void T({...G,allowDb:ae.target.checked})}),a("span",{className:"ds-check-text"},"允许数据库用例(默认只读打开 SQLite)")))),a("div",{className:"ds-panel"},a("div",{className:"ds-panel-head"},"数量上限"),a("div",{className:"ds-panel-body"},a("div",{className:"ds-row",style:{gap:8,flexWrap:"wrap"}},a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"每张卡用例上限"),a(u,{className:"ds-input",type:"number",value:String(q.casesPerTask),onChange:ae=>B({...q,casesPerTask:Number(ae.target.value)})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"一次批量跑上限"),a(u,{className:"ds-input",type:"number",value:String(q.runKeys),onChange:ae=>B({...q,runKeys:Number(ae.target.value)})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"交付物上限"),a(u,{className:"ds-input",type:"number",value:String(q.artifactsPerTask),onChange:ae=>B({...q,artifactsPerTask:Number(ae.target.value)})}))),a("div",{className:"ds-row",style:{justifyContent:"flex-end",marginTop:6}},a("button",{className:"ds-btn ds-btn-primary",disabled:_,onClick:()=>void Q()},"保存上限")))),a("div",{className:"ds-panel"},a("div",{className:"ds-panel-head"},"出站 webhook",a("button",{className:"ds-btn ds-btn-ghost",disabled:_,onClick:()=>w(ae=>[...ae,{url:"",events:["task/moved"],enabled:!0}])},"+ 加一个")),a("div",{className:"ds-panel-body"},L.length===0?a("div",{className:"ds-empty"},"还没有 webhook。配一个就能把卡片流转、用例失败、门禁拦截推给 CI / IM / 工单系统。"):L.map((ae,F)=>a("div",{key:F,style:{marginBottom:8}},a("div",{className:"ds-row",style:{gap:6,alignItems:"center"}},a(u,{className:"ds-input",style:{flex:1},placeholder:"https://ci.example/hook",value:ae.url??"",onChange:te=>w(xe=>xe.map((X,oe)=>oe===F?{...X,url:te.target.value}:X))}),a(v,{checked:ae.enabled!==!1,onChange:te=>w(xe=>xe.map((X,oe)=>oe===F?{...X,enabled:te.target.checked}:X))}),a("button",{className:"ds-btn ds-btn-ghost",disabled:_,onClick:()=>w(te=>te.filter((xe,X)=>X!==F))},"×")),a("div",{className:"ds-row",style:{gap:10,flexWrap:"wrap",marginTop:2}},["task/moved","case/failed","gate/blocked","agent/failed"].map(te=>a("label",{className:"ds-check",key:te},a(v,{checked:(ae.events??[]).includes(te),onChange:xe=>w(X=>X.map((oe,me)=>me===F?{...oe,events:xe.target.checked?Array.from(new Set([...oe.events??[],te])):(oe.events??[]).filter(W=>W!==te)}:oe))}),a("span",{className:"ds-check-text",style:{fontSize:12}},te)))))),L.length===0?null:a("div",{className:"ds-row",style:{justifyContent:"flex-end"}},a("button",{className:"ds-btn ds-btn-primary",disabled:_,onClick:()=>void R()},"保存 webhook")))),a("div",{className:"ds-panel"},a("div",{className:"ds-panel-head"},"测试环境",a("button",{className:"ds-btn ds-btn-ghost",disabled:_,onClick:()=>h({name:"",baseUrl:""})},"+ 新增环境")),a("div",{className:"ds-panel-body"},g.length===0?a("div",{className:"ds-empty"},"还没有环境。接口用例里的相对地址会拼到这里配置的 baseUrl。"):g.map(ye))),a("div",{className:"ds-panel ds-form-panel"},a("div",{className:"ds-panel-head"},"执行约束"),a("div",{className:"ds-panel-body"},a("div",{className:"ds-field"},a("div",{className:"ds-label"},"允许访问的域名(逗号分隔,支持 *.example.com)"),a(u,{className:"ds-input",value:y,placeholder:"127.0.0.1, localhost, test.example.com",onChange:ae=>S(ae.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"单条用例超时(毫秒)"),a(u,{className:"ds-input",value:C,onChange:ae=>E(ae.target.value)})),a("div",{className:"ds-row",style:{justifyContent:"flex-end"}},a("button",{className:"ds-btn ds-btn-primary",disabled:_,onClick:()=>void fe()},_?"保存中…":"保存约束")),M===null?null:a("div",{className:"ds-ok"},M),j===null?null:a("div",{className:"ds-err"},j))))}function Lx({config:e,onChanged:t}){const{h:a,React:n,Editor:r,api:s,toast:o,confirmDialog:i,tipOf:l,tipLabel:c,TextField:u,TextAreaField:p,ChipField:f,CheckField:v,SelectField:x,SideDrawer:b}=ht(),k=e.feishu??{},[g,d]=n.useState(""),[h,y]=n.useState(String(k.escalateAfter??3)),[S,C]=n.useState(!1),[E,_]=n.useState(null),[I,j]=n.useState(null),H=async()=>{C(!0),_(null),j(null);try{const M={};String(g??"").trim()!==""&&(M.escalateWebhook=String(g).trim()),M.escalateAfter=Number(h)||3,await s("/config",{feishu:M}),d(""),_("已保存:连续失败 "+(Number(h)||3)+" 次后往升级群发一条"),await t()}catch(M){j(M instanceof Error?M.message:String(M))}finally{C(!1)}};return a("div",{className:"ds-panel ds-form-panel",style:{marginTop:14}},a("div",{className:"ds-panel-head"},"通知升级"),a("div",{className:"ds-panel-body"},a("div",{className:"ds-field"},a("div",{className:"ds-label"},"升级群 Webhook"),a(u,{className:"ds-input",value:g,placeholder:k.escalateWebhookSet===!0?"已设置(留空表示不修改)":"https://open.feishu.cn/open-apis/bot/v2/hook/…",onChange:M=>d(M.target.value)})),a("div",{className:"ds-field"},c("连续失败几次后升级","同一通道连续失败到这个次数,就给升级群发消息"),a(u,{className:"ds-input",style:{width:90},value:h,onChange:M=>y(M.target.value)})),a("div",{className:"ds-hint"},"飞书通知、GitLab、云盘归档、代码隔离任一通道连续失败达到阈值时,只在跨过阈值那一次往升级群发一条,包含通道、失败次数与最近错误。"),a("div",{className:"ds-row",style:{justifyContent:"flex-end"}},a("button",{className:"ds-btn ds-btn-primary",disabled:S,onClick:()=>void H()},S?"保存中…":"保存升级设置")),E===null?null:a("div",{className:"ds-ok"},E),I===null?null:a("div",{className:"ds-err"},I)))}function Mx({config:e,onChanged:t}){const{h:a,React:n,Editor:r,api:s,toast:o,confirmDialog:i,tipOf:l,tipLabel:c,TextField:u,TextAreaField:p,ChipField:f,CheckField:v,SelectField:x,SideDrawer:b}=ht(),[k,g]=n.useState(()=>(e.environments??[]).map(J=>({id:J.id,name:J.name,kind:J.kind,note:J.note}))),[d,h]=n.useState(!1),[y,S]=n.useState(null),[C,E]=n.useState(null),[_,I]=n.useState(null),j=async J=>{I(null);try{await s("/config",{releaseRules:J}),I("发布准入已更新"),await t()}catch(q){I(q instanceof Error?q.message:String(q))}},H=()=>g(J=>J.length>=12?J:[...J,{id:"",name:"",kind:"other",note:""}]),M=(J,q)=>g(B=>B.map((L,w)=>w===J?{...L,...q}:L)),P=J=>g(q=>q.filter((B,L)=>L!==J)),G=async()=>{h(!0),S(null),E(null);try{const J=k.map(q=>({...q,name:String(q.name??"").trim()})).filter(q=>q.name!=="");if(J.length===0)throw new Error("至少留一个环境,否则部署记录没处挂");await s("/config",{environments:J}),S(`已保存 ${J.length} 个环境`),o(`已保存 ${J.length} 个环境`),await t()}catch(J){E(J instanceof Error?J.message:String(J))}finally{h(!1)}};return a("div",{className:"ds-panel ds-form-panel"},a("div",{className:"ds-panel-head"},"部署环境",a("span",{className:"ds-hint"},"只登记,不触发")),a("div",{className:"ds-panel-body"},a("div",{className:"ds-hint"},"这些环境只用来在版本上留痕:谁在什么时候把哪个版本放到了哪个环境。平台不会调用任何部署脚本、webhook 或 CI,部署仍然由人或你们自己的流水线完成。"),k.map((J,q)=>a("div",{key:`env-${q}`,className:"ds-row",style:{gap:8,marginTop:8,alignItems:"flex-end"}},a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"名字"),a(u,{className:"ds-input",value:J.name,placeholder:"例如 预发",onChange:B=>M(q,{name:B.target.value})})),a("div",{className:"ds-field",style:{flex:"0 0 120px"}},a("div",{className:"ds-label"},"类型"),a(x,{className:"ds-input",value:J.kind,onChange:B=>M(q,{kind:B.target.value})},["dev","staging","prod","other"].map(B=>a("option",{key:B,value:B},B)))),a("div",{className:"ds-field",style:{flex:2}},a("div",{className:"ds-label"},"说明"),a(u,{className:"ds-input",value:J.note,placeholder:"例如 上线前最后一关",onChange:B=>M(q,{note:B.target.value})})),a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>P(q),"data-danger":"1"},"删除"))),a("div",{className:"ds-row",style:{gap:8,marginTop:10}},a("button",{className:"ds-btn",onClick:H,disabled:k.length>=12},"+ 加一个环境")),a("div",{className:"ds-hint"},"id 由名字生成一次就固定了:改名不会断开已有的部署记录;删掉的环境,历史记录里的名字会显示成 id。"),a("div",{className:"ds-row",style:{justifyContent:"flex-end",marginTop:10}},a("button",{className:"ds-btn ds-btn-primary",disabled:d,onClick:()=>void G()},d?"保存中…":"保存环境")),y===null?null:a("div",{className:"ds-ok"},y),C===null?null:a("div",{className:"ds-err"},C)),a("div",{className:"ds-panel-body",style:{borderTop:"1px solid var(--ds-line)"}},a("div",{className:"ds-label"},"发布准入(发布时会检查,不满足要「强制发布」并写原因)"),a("label",{className:"ds-check",style:{marginTop:8}},a(v,{checked:(e.releaseRules?.requireStaging??!1)===!0,onChange:J=>void j({requireStaging:J.target.checked})}),a("span",{className:"ds-check-text"},"发布前必须先在「预发」环境登记过一次部署")),a("label",{className:"ds-check",style:{marginTop:6}},a(v,{checked:(e.releaseRules?.requireRequirementSignoff??!1)===!0,onChange:J=>void j({requireRequirementSignoff:J.target.checked})}),a("span",{className:"ds-check-text"},"关联需求必须都签过验收字")),a("div",{className:"ds-hint",style:{marginTop:6}},"两条默认都不勾:不勾的时候发布只看门禁,不看你上没上过预发、需不需要签字。"),_===null?null:a("div",{className:"ds-ok"},_)))}function zx({config:e,onChanged:t}){const{h:a,Editor:n,api:r,toast:s,confirmDialog:o,tipOf:i,TextField:l,CheckField:c,SelectField:u,React:p}=ht(),f=e.ldap??{},[v,x]=p.useState({enabled:f.enabled===!0,url:f.url??"ldap://localhost:389",baseDN:f.baseDN??"DC=LYF,DC=COM",bindDN:f.bindDN??"cn=root",bindPassword:"",userFilter:f.userFilter??"(|(sAMAccountName={user})(uid={user})(mail={user}))",nameAttr:f.nameAttr??"displayName",mailAttr:f.mailAttr??"mail",deptAttr:f.deptAttr??"department",defaultRole:f.defaultRole??"member",requireLogin:f.requireLogin===!0,timeoutMs:String(f.timeoutMs??6e3)}),[b,k]=p.useState(!1),[g,d]=p.useState(!1),[h,y]=p.useState(null),[S,C]=p.useState(null),[E,_]=p.useState([]),I=e.localAuth??{},[j,H]=p.useState(""),[M,P]=p.useState(""),[G,J]=p.useState(!1),[q,B]=p.useState(null),[L,w]=p.useState(null),T=async()=>{J(!0),B(null),w(null);try{await r("/auth/password",{username:I.username,currentPassword:j,newPassword:M}),H(""),P(""),B("密码已更新"),t()}catch(K){w(K instanceof Error?K.message:String(K))}finally{J(!1)}},Q=K=>x(we=>({...we,...K})),R=async()=>{d(!0),y(null),C(null),_([]);try{const K=await r("/auth/ldap/test",{ldap:{url:v.url,baseDN:v.baseDN,bindDN:v.bindDN,userFilter:v.userFilter,nameAttr:v.nameAttr,mailAttr:v.mailAttr,deptAttr:v.deptAttr,timeoutMs:Number(v.timeoutMs)},bindPassword:v.bindPassword});_(K.steps??[]),y(K.message??"连接正常"),s(K.message??"连接正常",K.ok===!1?"error":"success")}catch(K){const we=K instanceof Error?K.message:String(K);C(we)}finally{d(!1)}},D=async()=>{k(!0),y(null),C(null);try{const K={ldap:{enabled:v.enabled,url:v.url.trim(),baseDN:v.baseDN.trim(),bindDN:v.bindDN.trim(),userFilter:v.userFilter.trim(),nameAttr:v.nameAttr.trim(),mailAttr:v.mailAttr.trim(),deptAttr:v.deptAttr.trim(),defaultRole:v.defaultRole,requireLogin:v.requireLogin,timeoutMs:Number(v.timeoutMs)||6e3}};v.bindPassword.trim()!==""&&(K.ldap.bindPassword=v.bindPassword.trim()),await r("/config",K),Q({bindPassword:""}),y(v.bindPassword.trim()===""?"已保存(服务账号密码没改)":"已保存,服务账号密码已写入密钥文件"),await t()}catch(K){C(K instanceof Error?K.message:String(K))}finally{k(!1)}};return a("div",{className:"ds-panel ds-form-panel"},a("div",{className:"ds-panel-head"},"统一登录(LDAP)",a("span",{className:"ds-hint"},f.bindPasswordSet===!0?"服务账号密码已保存":"服务账号密码还没保存")),a("div",{className:"ds-panel-body"},a("div",{className:"ds-hint"},"开启后,页头会出现登录框:用域账号登录,平台拿到的用户名会记进 config.users(首次登录建档、之后只更新最近登录),写操作和审计都挂在这个名字下。"),a("label",{className:"ds-check",style:{marginTop:8}},a(c,{checked:v.enabled,onChange:K=>Q({enabled:K.target.checked})}),a("span",{className:"ds-check-text"},"启用 LDAP 登录")),a("label",{className:"ds-check",style:{marginTop:6}},a(c,{checked:v.requireLogin,onChange:K=>Q({requireLogin:K.target.checked})}),a("span",{className:"ds-check-text"},"必须登录才能用(不勾也可以先配好再打开)")),a("div",{className:"ds-row",style:{gap:8,marginTop:8}},a("div",{className:"ds-field",style:{flex:2}},a("div",{className:"ds-label"},"服务器地址"),a(l,{className:"ds-input",value:v.url,placeholder:"ldap://host:389",onChange:K=>Q({url:K.target.value})})),a("div",{className:"ds-field",style:{flex:"0 0 110px"}},a("div",{className:"ds-label"},"超时(毫秒)"),a(l,{className:"ds-input",value:v.timeoutMs,onChange:K=>Q({timeoutMs:K.target.value})}))),a("div",{className:"ds-row",style:{gap:8,marginTop:8}},a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"BASE DN"),a(l,{className:"ds-input",value:v.baseDN,placeholder:"DC=LYF,DC=COM",onChange:K=>Q({baseDN:K.target.value})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"服务账号 DN"),a(l,{className:"ds-input",value:v.bindDN,placeholder:"cn=root",onChange:K=>Q({bindDN:K.target.value})}))),a("div",{className:"ds-row",style:{gap:8,marginTop:8}},a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},f.bindPasswordSet===!0?"服务账号密码(留空 = 不改)":"服务账号密码"),a(l,{className:"ds-input",type:"password",value:v.bindPassword,placeholder:f.bindPasswordSet===!0?"已保存,留空表示不修改":"写一次就进密钥文件",onChange:K=>Q({bindPassword:K.target.value})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"用户过滤器({user} 会被替换)"),a(l,{className:"ds-input",value:v.userFilter,onChange:K=>Q({userFilter:K.target.value})}))),a("div",{className:"ds-row",style:{gap:8,marginTop:8}},a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"显示名属性"),a(l,{className:"ds-input",value:v.nameAttr,onChange:K=>Q({nameAttr:K.target.value})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"邮箱属性"),a(l,{className:"ds-input",value:v.mailAttr,onChange:K=>Q({mailAttr:K.target.value})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"部门属性"),a(l,{className:"ds-input",value:v.deptAttr,onChange:K=>Q({deptAttr:K.target.value})}))),a("div",{className:"ds-row",style:{gap:8,marginTop:10}},a("button",{className:"ds-btn",disabled:g,onClick:()=>void R()},g?"测试中…":"测试连接"),a("button",{className:"ds-btn ds-btn-primary",disabled:b,onClick:()=>void D()},b?"保存中…":"保存")),E.length===0?null:a("div",{style:{marginTop:8}},E.map((K,we)=>a("div",{key:`ldap-step-${we}`,className:K.ok===!0?"ds-ok":"ds-error"},`${K.ok===!0?"✓":"✗"} ${K.name}:${K.message}${K.ms>0?`(${K.ms}ms)`:""}`))),h===null?null:a("div",{className:"ds-ok",style:{marginTop:8}},h),S===null?null:a("div",{className:"ds-error",style:{marginTop:8}},S),a("div",{className:"ds-hint",style:{marginTop:10}},"依赖系统里的 ldapsearch(Ubuntu:apt-get install ldap-utils)。密码只写进 ~/.dsh/dsh-studio.secrets.json(0600),不会出现在状态、导出和日志里。")),a("div",{className:"ds-panel-body",style:{borderTop:"1px solid var(--ds-line)"}},a("div",{className:"ds-label"},"本地超管账号"),a("div",{className:"ds-hint",style:{marginTop:4}},`账号:${I.username??"admin"} · ${I.hasPassword===!0?"已设置自己的密码":"还在用默认口令 admin"}。没启用 LDAP 时平台默认以这个身份使用,不需要登录;启用 LDAP 后它仍可用来兜底登录。`),a("div",{className:"ds-row",style:{gap:8,marginTop:8}},a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"当前密码"),a(l,{className:"ds-input",type:"password",value:j,onChange:K=>H(K.target.value)})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"新密码(至少 8 位)"),a(l,{className:"ds-input",type:"password",value:M,onChange:K=>P(K.target.value)})),a("button",{className:"ds-btn",disabled:G||j===""||M.length<8,onClick:()=>void T()},G?"提交中…":"改密码")),q===null?null:a("div",{className:"ds-ok",style:{marginTop:6}},q),L===null?null:a("div",{className:"ds-error",style:{marginTop:6}},L)),a("div",{className:"ds-panel-body",style:{borderTop:"1px solid var(--ds-line)"}},a("div",{className:"ds-label"},`登录过的人(${(e.users??[]).length})`),(e.users??[]).length===0?a("div",{className:"ds-hint",style:{marginTop:6}},"还没有人用 LDAP 登录过。"):a("div",{style:{marginTop:6}},(e.users??[]).slice(0,20).map(K=>a("div",{key:K.id,className:"ds-kv"},a("div",null,K.name),a("div",null,`${K.id} · ${K.dept===""?"(无部门)":K.dept} · 登录 ${K.loginCount} 次 · 最近 ${Qe(K.lastLoginAt)}`))))))}function Fx({config:e,onChanged:t}){const{h:a,Editor:n,api:r,toast:s,confirmDialog:o,tipOf:i,TextField:l,CheckField:c,SelectField:u,React:p}=ht(),f=e.costs??{},[v,x]=p.useState(String(f.budgetRuns??500)),[b,k]=p.useState(String(f.budgetHours??80)),[g,d]=p.useState(String(f.warnAt??80)),[h,y]=p.useState(!1),[S,C]=p.useState(null),[E,_]=p.useState(null),I=async()=>{y(!0),C(null),_(null);try{const j=Number(v),H=Number(b),M=Number(g);if(!Number.isFinite(j)||j<=0)throw new Error("预算次数要是正整数");if(!Number.isFinite(H)||H<=0)throw new Error("预算小时要是正整数");await r("/config",{costs:{budgetRuns:Math.round(j),budgetHours:Math.round(H),warnAt:Number.isFinite(M)?Math.min(100,Math.max(10,Math.round(M))):80}}),C("已保存:预算"),await t()}catch(j){_(j instanceof Error?j.message:String(j))}finally{y(!1)}};return a("div",{className:"ds-panel ds-form-panel"},a("div",{className:"ds-panel-head"},"成本预算"),a("div",{className:"ds-panel-body ds-grid2"},a("div",{className:"ds-field"},a("div",{className:"ds-label"},"每月派单次数上限"),a(l,{className:"ds-input",value:v,onChange:j=>x(j.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"每月机上时长上限(小时)"),a(l,{className:"ds-input",value:b,onChange:j=>k(j.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"警告阈值(百分比)"),a(l,{className:"ds-input",value:g,onChange:j=>d(j.target.value)})),a("div",{className:"ds-field ds-span"},a("div",{className:"ds-hint"},"效能页的「AI 执行成本」下方会出现预算条;口径是派单次数与机上时长,宿主没有回传 token 用量。")),a("div",{className:"ds-row",style:{justifyContent:"flex-end"}},a("button",{className:"ds-btn ds-btn-primary",disabled:h,onClick:()=>void I()},h?"保存中…":"保存预算")),S===null?null:a("div",{className:"ds-ok"},S),E===null?null:a("div",{className:"ds-err"},E)))}function Bx({config:e,onChanged:t}){const{h:a,Editor:n,api:r,toast:s,confirmDialog:o,tipOf:i,TextField:l,CheckField:c,SelectField:u,React:p}=ht(),f=e.projects??[],v=e.gitlab?.projects??[],[x,b]=p.useState(null),[k,g]=p.useState(null),[d,h]=p.useState(null),[y,S]=p.useState(!1),[C,E]=p.useState({name:"",start:"",due:"",status:"planned"}),_=async()=>{if(x!==null){S(!0),g(null),h(null);try{await r("/projects/save",{project:{...x,iterations:x.iterations??[]}}),h("已保存"),s("已保存"),await t()}catch(w){g(w instanceof Error?w.message:String(w))}finally{S(!1)}}},I=async w=>{if(await o(`删除项目「${w.name}」?卡片会保留,但不再归属任何项目。`,{title:"删除项目",danger:!0,okText:"删除"})){S(!0),g(null);try{await r("/projects/delete",{id:w.id}),b(null),await t()}catch(T){g(T instanceof Error?T.message:String(T))}finally{S(!1)}}},j=async w=>{if(C.name.trim()!==""){S(!0),g(null);try{await r("/projects/iteration",{project:w.id,name:C.name.trim(),start:Pr(C.start),due:Pr(C.due),status:C.status}),E({name:"",start:"",due:"",status:"planned"}),await t()}catch(T){g(T instanceof Error?T.message:String(T))}finally{S(!1)}}},H=async(w,T)=>{S(!0),g(null);try{await r("/projects/iteration",{project:w.id,action:"remove",iteration:T.id}),await t()}catch(Q){g(Q instanceof Error?Q.message:String(Q))}finally{S(!1)}},M=(w,T)=>b({...x,[w]:T}),P=(w,T,Q)=>b({...x,services:(x.services??[]).map((R,D)=>D===w?{...R,[T]:Q}:R)}),G=()=>b({...x,services:[...x.services??[],{id:"",name:"",repoId:"",repoPath:"",baseBranch:x.baseBranch||"main",dependsOn:[]}]}),J=w=>b({...x,services:(x.services??[]).filter((T,Q)=>Q!==w)}),q=x===null?[]:x.services??[],B=(w,T)=>b({...x,services:(x.services??[]).map((Q,R)=>{if(R!==w)return Q;const D=Array.isArray(Q.dependsOn)?Q.dependsOn:[];return{...Q,dependsOn:D.includes(T)?D.filter(K=>K!==T):[...D,T]}})}),L=f.map(w=>a("div",{className:"ds-listrow",key:w.id},a("div",{className:"ds-listrow-main"},a("div",{},`${w.key?`[${w.key}] `:""}${w.name} · ${Wl[w.status]??w.status}${w.lead?` · 负责人 ${w.lead}`:""}`),a("div",{className:"ds-hint"},`${(e.projects??[]).find(T=>T.id===w.id)?.iterations?.length??0} 个迭代 · ${(w.services??[]).length} 个服务${(()=>{const T=(w.services??[]).reduce((Q,R)=>Q+(R.dependsOn??[]).length,0);return T>0?` · ${T} 条依赖`:""})()}${w.description?` · ${w.description}`:""}`)),a("div",{className:"ds-listrow-actions"},i("改项目信息、加迭代",a("button",{className:"ds-btn",disabled:y,onClick:()=>b({...w})},"编辑 / 迭代")),i("删除这个项目(卡不会删)",a("button",{className:"ds-btn",disabled:y,onClick:()=>void I(w),"data-danger":"1"},"删除")))));return a("div",{className:"ds-pane-stack"},a(n,{title:"业务项目(一个项目可以挂很多张卡和很多个迭代)",hint:"项目是看板的第一层分组:卡片挂项目,项目下面划迭代,看板可按项目和迭代筛选,项目页签看每个项目的体检数据。",rows:L,onAdd:()=>b({id:"",name:"",key:"",description:"",lead:"",status:"active",repos:[],services:[],iterations:[]}),addLabel:"新增项目",render:w=>w,empty:"还没有项目。团队只跑一个产品也可以先不建,直接在看板上干活。"}),d!==null?a("div",{className:"ds-ok",style:{marginBottom:8}},d):null,x===null?null:a("div",{className:"ds-panel ds-form-panel"},a("div",{className:"ds-panel-head"},x.id?`编辑项目:${x.name||x.id}`:"新增项目"),a("div",{className:"ds-panel-body"},a("div",{className:"ds-row",style:{gap:12}},a("div",{className:"ds-field",style:{flex:"0 0 110px"}},a("div",{className:"ds-label"},"代号"),a(l,{className:"ds-input",value:x.key??"",placeholder:"ORD",onChange:w=>M("key",w.target.value)})),a("div",{className:"ds-field",style:{flex:2}},a("div",{className:"ds-label"},"项目名"),a(l,{className:"ds-input",value:x.name??"",placeholder:"订单中心",onChange:w=>M("name",w.target.value)})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"状态"),a(u,{className:"ds-select",value:x.status??"active",onChange:w=>M("status",w.target.value)},Object.keys(Wl).map(w=>a("option",{key:w,value:w},Wl[w])))),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"业务负责人"),a(l,{className:"ds-input",value:x.lead??"",placeholder:"张伟",onChange:w=>M("lead",w.target.value)}))),a("div",{className:"ds-row",style:{gap:12}},a("div",{className:"ds-field",style:{flex:3}},a("div",{className:"ds-label"},"默认代码目录(没有分服务时用)"),a(l,{className:"ds-input",value:x.repoPath??"",placeholder:"~/repos/order-center",onChange:w=>M("repoPath",w.target.value)})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"基线分支"),a(l,{className:"ds-input",value:x.baseBranch??"",placeholder:"main",onChange:w=>M("baseBranch",w.target.value)}))),a("div",{className:"ds-hint",style:{margin:"-6px 0 4px"}},"配了代码目录且「代码隔离」选 worktree 时,每张卡会切一条 task/<编号> 分支,互不干扰。项目里有多个服务时,用下面的服务列表分开配。"),a("div",{className:"ds-field"},a("div",{className:"ds-label"},`服务(${q.length})· 一个服务一个 git 路径,卡片可以指定改哪个`),q.length===0?a("div",{className:"ds-empty"},"还没有分服务。只有一个仓库时留空即可,走上面的默认代码目录。"):q.map((w,T)=>{const Q=q.filter((R,D)=>D!==T&&String(R.id??"").trim()!=="");return a("div",{key:`${w.id}-${T}`,style:{marginBottom:8}},a("div",{className:"ds-row",style:{gap:8,alignItems:"flex-end"}},a("div",{className:"ds-field",style:{flex:"0 0 150px"}},a("div",{className:"ds-label"},"服务名"),a(l,{className:"ds-input",value:w.name??"",placeholder:"order-service",onChange:R=>P(T,"name",R.target.value)})),a("div",{className:"ds-field",style:{flex:3}},a("div",{className:"ds-label"},"本机 git 路径"),a(l,{className:"ds-input",value:w.repoPath??"",placeholder:"~/repos/order-service",onChange:R=>P(T,"repoPath",R.target.value)})),a("div",{className:"ds-field",style:{flex:"0 0 110px"}},a("div",{className:"ds-label"},"基线分支"),a(l,{className:"ds-input",value:w.baseBranch??"",placeholder:"main",onChange:R=>P(T,"baseBranch",R.target.value)})),v.length===0?null:a("div",{className:"ds-field",style:{flex:"0 0 150px"}},a("div",{className:"ds-label"},"GitLab 仓库"),a(u,{className:"ds-select",value:w.repoId??"",onChange:R=>P(T,"repoId",R.target.value)},a("option",{value:""},"不关联"),v.map(R=>a("option",{key:R.id,value:R.id},R.name||R.project)))),a("button",{className:"ds-btn",type:"button",onClick:()=>J(T),"data-danger":"1"},"删除")),Q.length===0?null:a("div",{className:"ds-row",style:{gap:6,alignItems:"center",marginTop:4,flexWrap:"wrap"}},a("span",{className:"ds-hint"},"依赖"),a("span",{className:"ds-hint",style:{marginRight:2}},"(勾上的服务要先完成,本服务的卡才能收口)"),Q.map(R=>a("span",{key:R.id,className:"ds-chip","data-on":(w.dependsOn??[]).includes(R.id)?"1":"0",title:`依赖 ${R.name||R.id}`,onClick:()=>B(T,R.id)},R.name||R.id))))}),a("div",{className:"ds-row",style:{gap:8}},a("button",{className:"ds-btn",type:"button",onClick:()=>G()},"+ 加一个服务"),a("span",{className:"ds-hint"},"服务名会被写进任务详情;worktree 从该服务的 git 路径切 task/<编号> 分支。"))),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"项目说明"),a(l,{className:"ds-input",value:x.description??"",placeholder:"这个项目做什么、给谁用",onChange:w=>M("description",w.target.value)})),a("div",{className:"ds-row",style:{gap:8}},a("button",{className:"ds-btn ds-btn-primary",disabled:y,onClick:()=>void _()},y?"保存中…":"保存项目"),a("button",{className:"ds-btn",disabled:y,onClick:()=>b(null)},"取消")))),x===null||x.id===""?null:a("div",{className:"ds-panel ds-form-panel"},a("div",{className:"ds-panel-head"},"迭代",a("span",{className:"ds-hint"},"迭代用来按时间切需求,看板可按迭代筛选")),a("div",{className:"ds-panel-body"},(x.iterations??[]).length===0?a("div",{className:"ds-empty"},"还没有迭代。可以先加一个「2026-11 迭代」。"):(x.iterations??[]).map(w=>a("div",{className:"ds-listrow",key:w.id},a("div",{className:"ds-listrow-main"},a("div",{},`${w.name} · ${Hl[w.status]??w.status}`),a("div",{className:"ds-hint"},`${w.start?new Date(w.start).toISOString().slice(0,10):"未定开始"} → ${w.due?new Date(w.due).toISOString().slice(0,10):"未定结束"}`)),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn ds-btn-ghost",disabled:y,onClick:()=>void H(x,w)},"×")))),a("div",{className:"ds-row",style:{gap:8,alignItems:"flex-end"}},a("div",{className:"ds-field",style:{flex:2}},a("div",{className:"ds-label"},"迭代名"),a(l,{className:"ds-input",value:C.name,placeholder:"2026-11 迭代",onChange:w=>E({...C,name:w.target.value})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"开始"),a(l,{className:"ds-input",type:"date",value:C.start,onChange:w=>E({...C,start:w.target.value})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"结束"),a(l,{className:"ds-input",type:"date",value:C.due,onChange:w=>E({...C,due:w.target.value})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"状态"),a(u,{className:"ds-select",value:C.status,onChange:w=>E({...C,status:w.target.value})},Object.keys(Hl).map(w=>a("option",{key:w,value:w},Hl[w])))),a("button",{className:"ds-btn",disabled:y||C.name.trim()==="",onClick:()=>void j(x)},"+ 加迭代")),a("div",{className:"ds-hint"},"迭代改完会立刻反映到看板的迭代筛选。"))))}function Ux({state:e,config:t,onChanged:a}){const{h:n,sessionToken:r,api:s,toast:o,currentUser:i,confirmDialog:l,TextField:c,ChipField:u,CheckField:p,SelectField:f,React:v}=ht(),x=t.access??{enabled:!1,members:[]},b=e.audit??[],[k,g]=v.useState({name:"",role:"member"}),[d,h]=v.useState(!1),[y,S]=v.useState(null),[C,E]=v.useState(""),[_,I]=v.useState(!1),[j,H]=v.useState(""),M=async(w,T)=>{h(!0),S(null);try{await s(w,T),await a()}catch(Q){{const R=Q instanceof Error?Q.message:String(Q);S(R),o(R,"error")}}finally{h(!1)}},P=async()=>{const w=k.name.trim();w!==""&&(await M("/access/save",{member:{name:w,role:k.role}}),g({name:"",role:"member"}))},G=Array.from(new Set(b.map(w=>w.by))).sort(),J=j.trim().toLowerCase(),q=b.filter(w=>(C===""||w.by===C)&&(_===!1||w.ok===!1)&&(J===""||`${ROUTE_LABEL[w.route]??w.route} ${w.by} ${w.summary}`.toLowerCase().includes(J))),B=q.slice(0,120),L=()=>{const w=new URLSearchParams({by:C,q:j.trim(),failed:_?"1":"0",token:r()??""}),T=document.createElement("a");T.href=`${API}/audit/export.csv?${w.toString()}`,T.rel="noopener",document.body.appendChild(T),T.click(),document.body.removeChild(T),o(`正在导出 ${q.length} 条审计记录`)};return n("div",{className:"ds-pane-stack"},n("div",{className:"ds-panel ds-form-panel"},n("div",{className:"ds-panel-head"},n("span",null,"成员权限"),n(u,{className:"ds-chip"},`当前身份:${i()}`)),n("div",{className:"ds-panel-body"},n("div",{className:"ds-row",style:{gap:10,alignItems:"center",flexWrap:"wrap"}},n("label",{className:"ds-check",style:{flex:"0 0 auto"}},n(p,{checked:x.enabled===!0,disabled:d,onChange:w=>void M("/access/save",{enabled:w.target.checked})}),n("span",null,"启用成员权限")),n("span",{className:"ds-hint"},x.enabled===!0?"已启用:写操作要认人,删除/配置/发布要管理员。":"未启用:任何人都是管理员(单机用法)。")),x.enabled===!0&&(x.members??[]).length===0?n("div",{className:"ds-error"},"已启用但名单是空的:除了名单里的人,其他人都动不了。先把你自己加进去。"):null,x.enabled===!0?n("label",{className:"ds-check"},n(p,{checked:(x.agents??"inherit")==="inherit",disabled:d,onChange:w=>void M("/access/save",{agents:w.target.checked?"inherit":"bypass"})}),n("span",null,"AI 专家也受这份名单约束")):null,x.enabled===!0?n("div",{className:"ds-hint"},(x.agents??"inherit")==="inherit"?"专家调工具时按同一张名单判权限:只读专家只能看,成员能干活,管理员才能改配置。名单里没有的专家会被拦下,记得在下面加进去。":"已豁免:专家调用工具不受名单限制,但仍记审计。适合「全交给 AI」的团队。"):null,(x.members??[]).map(w=>n("div",{key:w.name,className:"ds-listrow"},n("div",{className:"ds-listrow-main"},n("div",null,w.name,w.name===i()?n(u,{className:"ds-chip ds-chip-soft"},"我"):null),n("div",{className:"ds-hint"},(ACCESS_ROLE_OPTIONS.find(T=>T.id===w.role)??ACCESS_ROLE_OPTIONS[1]).hint)),n("div",{className:"ds-listrow-actions"},n(f,{className:"ds-select",value:w.role,disabled:d,onChange:T=>void M("/access/save",{member:{name:w.name,role:T.target.value}})},ACCESS_ROLE_OPTIONS.map(T=>n("option",{key:T.id,value:T.id},T.label))),n("button",{className:"ds-btn ds-btn-ghost",disabled:d,onClick:()=>void M("/access/delete",{name:w.name})},"移除")))),(x.members??[]).length===0?n("div",{className:"ds-empty"},"还没有成员。"):null,n("div",{className:"ds-row",style:{gap:8,flexWrap:"wrap"}},n(c,{className:"ds-input",placeholder:"成员名字(和页头「👤 我是…」一致)",value:k.name,style:{flex:"1 1 200px"},onChange:w=>g({...k,name:w.target.value})}),n(f,{className:"ds-select",value:k.role,style:{flex:"0 0 130px"},onChange:w=>g({...k,role:w.target.value})},ACCESS_ROLE_OPTIONS.map(w=>n("option",{key:w.id,value:w.id},w.label))),n("button",{className:"ds-btn ds-btn-primary",disabled:d||k.name.trim()==="",onClick:()=>void P()},"加成员")),y!==null?n("div",{className:"ds-error"},y):null)),n("div",{className:"ds-panel"},n("div",{className:"ds-panel-head"},n("span",null,`审计日志(显示 ${B.length} / 命中 ${q.length} / 共 ${b.length} 条)`),n("div",{className:"ds-row",style:{gap:8,marginLeft:"auto"}},n(c,{className:"ds-input",placeholder:"搜动作 / 人 / 详情",value:j,style:{width:170},onChange:w=>H(w.target.value)}),n(f,{className:"ds-select",value:C===""?"__all__":C,style:{minWidth:150},onChange:w=>E(w.target.value==="__all__"?"":w.target.value)},n("option",{value:"__all__"},"所有人"),G.map(w=>n("option",{key:w,value:w},w))),n("label",{className:"ds-check"},n(p,{checked:_,onChange:w=>I(w.target.checked)}),n("span",null,"只看失败")),n("button",{className:"ds-btn ds-btn-ghost",disabled:d,onClick:async()=>{await l("清空审计日志?清掉之后所有操作记录都没了。",{title:"清空审计日志",danger:!0,okText:"清空"})&&M("/audit/clear",{})}},"清空"),n("button",{className:"ds-btn ds-btn-ghost",disabled:q.length===0,onClick:L,title:"把当前筛选结果导出为 CSV(Excel 可直接打开)"},"导出 CSV"))),n("div",{className:"ds-panel-body"},B.length===0?n("div",{className:"ds-empty"},b.length===0?"还没有记录。做一次写操作就会出现在这里。":"没有符合筛选条件的记录。把关键字清空或换个人试试。"):B.map(w=>n("div",{key:w.id,className:"ds-audit-row","data-ok":w.ok?"1":"0"},n("span",{className:"ds-audit-time"},Qe(w.at)),n("span",{className:"ds-audit-by"},w.by),n("span",{className:"ds-audit-what"},ROUTE_LABEL[w.route]??w.route),n("span",{className:"ds-audit-detail"},w.summary),n("span",{className:"ds-audit-status","data-ok":w.ok?"1":"0"},w.ok?"成功":`失败 ${w.status}`))))))}function qx({state:e,onChanged:t}){const{h:a,sessionToken:n,api:r,toast:s,currentUser:o,confirmDialog:i,TextField:l,ChipField:c,CheckField:u,SelectField:p,React:f}=ht(),v=e.config,[x,b]=f.useState(null),[k,g]=f.useState(!1),[d,h]=f.useState(null),[y,S]=f.useState(""),C=e.statuses??[],E=f.useMemo(()=>ef(v),[v]),_=B=>{const L=v.columns?.[B];return L==null?[]:Array.isArray(L.members)?L.members:L.kind==="none"?[]:[{kind:L.kind,id:L.id}]},I=B=>v.columns?.[B]?.strategy??"round_robin",j=B=>{if(B.kind==="role")return"🎯 "+(Aa[B.id]??B.id);if(B.kind==="team"){const w=(v.teams??[]).find(T=>T.id===B.id);return w===void 0?`👥 ${B.id}`:`${w.emoji??"👥"} ${w.name}`}const L=(v.experts??[]).find(w=>w.id===B.id);return L===void 0?B.id:`${L.emoji} ${L.name}`},H=Array.isArray(v.design?.columns)?v.design.columns:["dev"],M=async B=>{g(!0),b(null);try{await r("/config",{design:{...v.design??{},...B}}),await t()}catch(L){b(L instanceof Error?L.message:String(L))}finally{g(!1)}},P=B=>{const L=H.includes(B)?H.filter(w=>w!==B):[...H,B];M({columns:L})},G=async(B,L,w)=>{g(!0),b(null);try{await r("/columns/save",{status:B,members:L,strategy:w}),await t()}catch(T){b(T instanceof Error?T.message:String(T))}finally{g(!1)}},J=(B,L)=>{const w=L.key.startsWith("t:")?"team":L.key.startsWith("r:")?"role":"expert",T=L.key.slice(2),Q=_(B);Q.some(R=>R.kind===w&&R.id===T)||(S(""),G(B,[...Q,{kind:w,id:T}],I(B)))},q=(B,L)=>void G(B,_(B).filter((w,T)=>T!==L),I(B));return a("div",{className:"ds-panel"},a("div",{className:"ds-panel-head"},"每一列由谁负责"),a("div",{className:"ds-panel-body"},a("div",{className:"ds-hint"},"推荐挂「角色位」:澄清/验收挂产品经理、开发挂研发工程师、测试挂测试工程师——派单时会按卡片的业务领域自动挑对应领域专家(如支付产品经理);也可以直接指定某位专家或专家团。一列可挂多人(候选池),一个都不挂就只把卡停在原地等人认领。"),a("div",{className:"ds-hint",style:{marginTop:14}},"设计闸门:打开后,卡片进下面选中的列之前设计必须评审通过(验收时可 override 强推)。"),a("div",{className:"ds-row",style:{gap:8,flexWrap:"wrap",marginTop:6}},a("button",{className:v.design?.enabled===!0?"ds-btn ds-btn-primary":"ds-btn",disabled:k,"data-design-gate":v.design?.enabled===!0?"on":"off",onClick:()=>void M({enabled:v.design?.enabled!==!0})},v.design?.enabled===!0?"设计闸门:已开启":"设计闸门:已关闭"),C.map(B=>a("button",{key:"gate-"+B.id,className:H.includes(B.id)?"ds-btn ds-btn-primary":"ds-btn",disabled:k,onClick:()=>P(B.id)},B.label??B.id))),C.map(B=>{const L=_(B.id),w=I(B.id);return a("div",{className:"ds-colrow",key:B.id},a("div",{className:"ds-colrow-head"},a("span",{className:"ds-colrow-name"},B.label??B.id),L.length===0?a("span",{className:"ds-hint"},"👤 等人认领(不自动派)"):L.map((T,Q)=>a(c,{className:"ds-chip ds-chip-owner",key:`${T.kind}:${T.id}`},j(T),a("button",{className:"ds-chip-x",title:"从候选里去掉",disabled:k,onClick:()=>q(B.id,Q)},"×"))),a("button",{className:"ds-btn",style:{marginLeft:"auto"},disabled:k,onClick:()=>{S(""),h(T=>T===B.id?null:B.id)}},d===B.id?"收起":"+ 加候选"),L.length>=2?a(p,{className:"ds-input",style:{width:240},value:w,disabled:k,onChange:T=>void G(B.id,L,T.target.value)},STRATEGIES.map(T=>a("option",{key:T.id,value:T.id},T.label))):null),d===B.id?a("div",{className:"ds-colpick"},a(l,{className:"ds-mention-search",autoFocus:!0,value:y,placeholder:"搜专家或专家团,点一下加进候选",onChange:T=>S(T.target.value)}),a("div",{className:"ds-colpick-list"},Fo(E,y).length===0?a("div",{className:"ds-mention-empty"},"没有匹配的专家或专家团"):Fo(E,y).map(T=>a("button",{key:T.key,className:"ds-mention-item",onClick:()=>J(B.id,T)},a("span",null,T.emoji),a("span",null,T.name),a("span",{className:"ds-hint"},T.hint))))):null)}),x!==null?a("div",{className:"ds-error"},x):null))}function Vx({state:e,onChanged:t}){const{h:a,sessionToken:n,api:r,toast:s,currentUser:o,confirmDialog:i,TextField:l,ChipField:c,CheckField:u,SelectField:p,React:f}=ht(),[v,x]=f.useState(e.storage??null),[b,k]=f.useState([]),[g,d]=f.useState(null),[h,y]=f.useState(null),[S,C]=f.useState(!1),E=f.useCallback(()=>{r("/snapshots").then(j=>{x(j.storage??null),k(j.snapshots??[]),d(null)}).catch(j=>d(j instanceof Error?j.message:String(j)))},[]);f.useEffect(()=>{E()},[E,e.revision]);const _=async j=>{await i(`把看板回滚到快照 #${j}?当前的这一版会先另存一份,不会丢。`,{title:"回滚快照",okText:"回滚"})&&(C(!0),y(null),r("/snapshot/restore",{id:j}).then(()=>{y(`已回滚到快照 #${j}`),E(),t?.()}).catch(H=>d(H instanceof Error?H.message:String(H))).finally(()=>C(!1)))},I=j=>{const H=new Date(Number(j)||0);return`${H.getMonth()+1}-${String(H.getDate()).padStart(2,"0")} ${String(H.getHours()).padStart(2,"0")}:${String(H.getMinutes()).padStart(2,"0")}:${String(H.getSeconds()).padStart(2,"0")}`};return a("div",{className:"ds-pane-stack"},a("div",{className:"ds-panel ds-form-panel"},a("div",{className:"ds-panel-head"},"台账存储",a(c,{className:"ds-chip","data-on":v?.engine==="sqlite"?"1":"0"},v?.engine==="sqlite"?"SQLite":"单文件")),a("div",{className:"ds-panel-body"},a("div",{className:"ds-an-kv"},a("span",{},"数据文件"),a("b",{},v?.db??"—")),a("div",{className:"ds-an-kv"},a("span",{},"密钥文件(600 权限,明文不进台账)"),a("b",{},v?.secretsFile??"—")),a("div",{className:"ds-an-kv"},a("span",{},"保留快照"),a("b",{},`${v?.snapshots??0} / ${v?.snapshotLimit??0}`)),a("div",{className:"ds-hint"},"每次写操作都会在同一个事务里先存一份快照,再更新台账;多进程同时写会排队(busy_timeout 5s),不会互相覆盖。"))),a("div",{className:"ds-panel"},a("div",{className:"ds-panel-head"},"快照",a("button",{className:"ds-btn ds-btn-ghost",style:{marginLeft:"auto"},onClick:E,disabled:S},"刷新")),a("div",{className:"ds-panel-body"},h!==null?a("div",{className:"ds-ok"},h):null,g!==null?a("div",{className:"ds-error"},g):null,b.length===0?a("div",{className:"ds-hint"},v?.engine==="sqlite"?"还没有快照。":"单文件模式没有快照(这台机器的 node 不支持 node:sqlite 时会退回单文件)。"):b.map(j=>a("div",{key:j.id,className:"ds-listrow"},a("div",{className:"ds-listrow-main"},a("div",null,`#${j.id} · rev ${j.revision}`),a("div",{className:"ds-hint"},`${I(j.at)} · ${(j.bytes/1024).toFixed(1)} KB`)),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn ds-btn-ghost",disabled:S,onClick:()=>_(j.id)},"回滚到这版")))))))}function Wx({state:e,config:t,onChanged:a}){const{h:n,sessionToken:r,api:s,toast:o,currentUser:i,confirmDialog:l,TextField:c,ChipField:u,CheckField:p,SelectField:f,React:v}=ht(),x=e.integrations??{channels:[],broken:0},[b,k]=v.useState(""),[g,d]=v.useState(null),h=(e.requirements??[]).find(w=>(w.folder?.token??"")!==""),y=e.agents??{},S=y.lock??null,C=S===null?0:Math.max(0,Date.now()-(Number(S.at)||0)),[E,_]=v.useState(""),[I,j]=v.useState(!1),H=E.trim().toLowerCase(),M=(y.log??[]).filter(w=>{const T=String(w?.line??"");return I&&!/失败|错误|异常|拦|拒绝/.test(T)?!1:H===""||T.toLowerCase().includes(H)}),P=M.slice(0,12),G=()=>{const w=new URLSearchParams({q:E.trim(),failed:I?"1":"0",token:r()??""}),T=document.createElement("a");T.href=`${API}/export/dispatch.csv?${w.toString()}`,T.rel="noopener",document.body.appendChild(T),T.click(),document.body.removeChild(T),o(`正在导出 ${M.length} 条派单日志`)},J=async w=>{k(w),d(null);try{if(w==="gitlab"){const T=await s("/gitlab/sync",{});d(T.report===void 0?"已触发 GitLab 同步":`已同步:${(T.report.projects??[]).map(Q=>`${Q.name} +${Q.created}`).join(",")||"无新卡"}`)}else if(w==="drive")if(h===void 0)d("还没有带云盘文件夹的需求,先建一条需求并归档一次。");else{const T=await s("/requirement/sync",{id:h.id});d(`已归档 ${T.report?.written??0} / ${T.report?.total??0} 件`),o(`已归档 ${T.report?.written??0} / ${T.report?.total??0} 件`)}else if(w==="feishu"){const T=await s("/feishu/test",{});d(T.ok===!0?"测试消息已发出":`发送失败:${T.result?.error??"没配置机器人"}`)}else d("代码隔离没有独立的重试入口,下一张卡派单时会自动重试。");await a()}catch(T){{const Q=T instanceof Error?T.message:String(T);d(Q),o(Q,"error")}}finally{k("")}},q=w=>{const T=Number(w)||0;if(T===0)return"—";const Q=new Date(T);return`${Q.getMonth()+1}-${String(Q.getDate()).padStart(2,"0")} ${String(Q.getHours()).padStart(2,"0")}:${String(Q.getMinutes()).padStart(2,"0")}`},B={ok:"正常",error:"异常",idle:"还没用过"},L={ok:"#0f9d58",error:"#e5484d",idle:"#8a8f98"};return n("div",{className:"ds-pane-stack"},n("div",{className:"ds-panel"},n("div",{className:"ds-panel-head"},"派单运行状态",n(u,{className:"ds-chip","data-on":y.enabled===!0?"1":"0"},y.enabled===!0?"运行中":"已停用"),n("div",{className:"ds-row",style:{gap:8,marginLeft:"auto"}},n(c,{className:"ds-input",placeholder:"搜派单日志",value:E,style:{width:150},onChange:w=>_(w.target.value)}),n("label",{className:"ds-check"},n(p,{checked:I,onChange:w=>j(w.target.checked)}),n("span",null,"只看失败")),n("button",{className:"ds-btn ds-btn-ghost",disabled:M.length===0,onClick:G,title:"把当前筛选结果导出为 CSV"},"导出 CSV"))),n("div",{className:"ds-panel-body"},n("div",{className:"ds-kv"},n("dt",{},"实例"),n("dd",{},String(y.instance??"—")),n("dt",{},"派单锁"),n("dd",{},S===null?"还没抢到过(可能是内存模式)":`${S.mine===!0?"本进程持有":"其他实例持有"} · ${Math.round(C/1e3)} 秒前续租`),n("dt",{},"并发占用"),n("dd",{},`${(y.running??[]).length} / ${y.maxConcurrent??"—"}`),n("dt",{},"最近一轮"),n("dd",{},q(y.lastTickAt)),n("dt",{},"最近错误"),n("dd",{},String(y.lastError??"")===""?"无":String(y.lastError))),(y.log??[]).length===0?n("div",{className:"ds-empty"},"还没有派单日志。卡进入自动列后,这里会出现派单、空闲、失败记录。"):P.length===0?n("div",{className:"ds-empty"},"没有符合筛选条件的派单日志。"):n("div",{className:"ds-log"},P.map((w,T)=>n("div",{key:String(T),className:"ds-log-line"},`${q(w.at)} · ${String(w.line??"")}`))),(y.log??[]).length>0&&M.length>P.length?n("div",{className:"ds-hint"},`只显示最近 ${P.length} / 命中 ${M.length} 条,导出可看全量`):null)),n("div",{className:"ds-panel"},n("div",{className:"ds-panel-head"},"集成状态",n(u,{className:"ds-chip","data-on":x.broken===0?"1":"0"},x.broken===0?"全部正常":`${x.broken} 条异常`),n("button",{className:"ds-btn ds-btn-ghost",style:{marginLeft:"auto"},onClick:()=>void a()},"刷新")),n("div",{className:"ds-panel-body"},g!==null?n("div",{className:"ds-hint"},g):null,x.channels.length===0?n("div",{className:"ds-empty"},"还没有调用过任何外部集成。配好 GitLab / 飞书机器人 / 云盘文件夹后,第一次成功或失败就会出现在这里。"):x.channels.map(w=>n("div",{key:w.channel,className:"ds-listrow"},n("div",{className:"ds-listrow-main"},n("div",null,n("span",{style:{color:L[w.state],fontWeight:700}},"● "),w.label,n(u,{className:"ds-chip ds-chip-soft",style:{marginLeft:6}},B[w.state])),n("div",{className:"ds-hint"},w.hint),n("div",{className:"ds-hint"},`最近一次:${q(w.at)} · 成功 ${q(w.lastOkAt)} · 失败 ${q(w.lastErrorAt)}${w.attempts>0?` · 试着调了 ${w.attempts} 次,连挂 ${w.failures} 次`:""}`),w.lastError===""?null:n("div",{className:"ds-error"},w.lastError)),n("div",{className:"ds-listrow-actions"},n("button",{className:"ds-btn ds-btn-ghost",disabled:b!=="",onClick:()=>void J(w.channel)},b===w.channel?"重试中…":"再试一次")))))),n("div",{className:"ds-panel ds-form-panel"},n("div",{className:"ds-panel-head"},"失败了会怎样"),n("div",{className:"ds-panel-body"},n("div",{className:"ds-hint"},"· 飞书通知:同一条消息会自动重发一次,两次都失败才记异常(飞书 200 但 body 里 code≠0 也算失败)。"),n("div",{className:"ds-hint"},"· GitLab:拉 Issue、回写评论、对 MR 失败会记在这里;同步定时器仍会自动重试下一轮。"),n("div",{className:"ds-hint"},"· 飞书云盘:归档失败会挂在交付物自身的 doc.error 上,这里再汇总一份。"),n("div",{className:"ds-hint"},"· 代码隔离:worktree 建失败只影响这一张卡(退回普通工作区),不影响别的卡。"))))}function Hx({config:e,onChanged:t}){const{h:a,Editor:n,api:r,toast:s,confirmDialog:o,tipOf:i,TextField:l,ChipField:c,CheckField:u,MdField:p,SideDrawer:f,React:v}=ht(),x=e.gitlab?.projects??[],[b,k]=v.useState(null),[g,d]=v.useState(null),[h,y]=v.useState(null),[S,C]=v.useState(!1),E=async()=>{if(b!==null){C(!0),d(null),y(null);try{await r("/repos/save",{project:b}),k(null),y("已保存"),s("已保存"),await t()}catch(P){d(P instanceof Error?P.message:String(P))}finally{C(!1)}}},_=async P=>{if(await o(`删除 GitLab 项目「${P.name}」?已同步的卡片会保留。`,{title:"删除 GitLab 项目",danger:!0,okText:"删除"})){C(!0),d(null);try{await r("/repos/delete",{id:P.id}),await t()}catch(G){d(G instanceof Error?G.message:String(G))}finally{C(!1)}}},I=async P=>{C(!0),d(null),y(null);try{const G=await r("/repos/test",{id:P.id});y(`连通:${P.project}(示例 Issue ${G.sample} 条)`)}catch(G){d(G instanceof Error?G.message:String(G))}finally{C(!1)}},j=async P=>{C(!0),d(null),y(null);try{const J=((await r("/gitlab/sync",{project:P.id})).summary?.projects??[])[0];y(J===void 0?"没有可同步的项目":`${J.name}:拉取 ${J.fetched},新建 ${J.created}${J.error?",错误 "+J.error:""}`),await t()}catch(G){d(G instanceof Error?G.message:String(G))}finally{C(!1)}},H=(P,G)=>k({...b,[P]:G}),M=x.map(P=>a("div",{className:"ds-listrow",key:P.id},a("div",{className:"ds-listrow-main"},a("div",{},`${P.name||P.project}${P.syncEnabled?" · 自动同步":""}${P.tokenSet?"":" · 缺令牌"}`),a("div",{className:"ds-hint"},`${P.url||e.gitlab.url||"(未填地址)"} / ${P.project}${P.lastSyncAt?" · 上次 "+new Date(P.lastSyncAt).toLocaleString():""}`),P.lastSyncError?a("div",{className:"ds-error"},P.lastSyncError):null),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn",disabled:S,onClick:()=>void j(P)},"同步"),a("button",{className:"ds-btn",disabled:S,onClick:()=>void I(P)},"测试"),a("button",{className:"ds-btn",disabled:S,onClick:()=>k({...P,token:""})},"编辑"),i("删除这个项目(卡不会删)",a("button",{className:"ds-btn",disabled:S,onClick:()=>void _(P),"data-danger":"1"},"删除")))));return a("div",{className:"ds-pane-stack"},a(n,{title:"代码仓库(GitLab,可以有多个)",hint:"每个项目单独填地址、项目路径和令牌;同步时按项目分开去重,两个仓库都有 #12 也不会串。",rows:M,onAdd:()=>k({id:"",name:"",url:e.gitlab?.url??"",project:"",token:"",syncEnabled:!1,syncLabel:""}),addLabel:"新增项目",render:P=>P,empty:"还没有项目,点「新增项目」。"}),h!==null?a("div",{className:"ds-ok",style:{marginBottom:8}},h):null,b===null?null:a(f,{title:b.id?`编辑仓库:${b.name||b.project}`:"新增仓库",hint:"一个仓库对应 GitLab 上的一个项目;令牌只写盘不回显,留空表示不修改。",onClose:()=>k(null),footer:[a("button",{key:"save",className:"ds-btn ds-btn-primary",disabled:S,onClick:()=>void E()},S?"保存中…":"保存"),a("button",{key:"cancel",className:"ds-btn",disabled:S,onClick:()=>k(null)},"取消"),g!==null?a("span",{key:"error",className:"ds-error ds-side-note"},g):null]},a("div",{className:"ds-field"},a("div",{className:"ds-label"},"显示名"),a(l,{className:"ds-input",value:b.name,placeholder:"订单服务",onChange:P=>H("name",P.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"GitLab 地址"),a(l,{className:"ds-input",value:b.url,placeholder:"https://gitlab.example.com",onChange:P=>H("url",P.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"项目路径(含 namespace)"),a(l,{className:"ds-input",value:b.project,placeholder:"backend/order-service",onChange:P=>H("project",P.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},b.tokenSet?"Access Token(已设置,留空则不修改)":"Access Token"),a(l,{className:"ds-input",type:"password",value:b.token,placeholder:b.tokenSet?"••••••••":"glpat-…",onChange:P=>H("token",P.target.value)}),a("div",{className:"ds-hint"},"需要 api 权限;只写入磁盘,不回显。")),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"只同步带此标签的 Issue"),a(l,{className:"ds-input",value:b.syncLabel,placeholder:"留空则同步全部 open Issue",onChange:P=>H("syncLabel",P.target.value)})),a("div",{className:"ds-field"},a("label",{className:"ds-row",style:{alignItems:"center",gap:8,cursor:"pointer"}},a(u,{checked:b.syncEnabled===!0,onChange:P=>H("syncEnabled",P.target.checked)}),a("span",{},"每分钟自动把这个项目的新 Issue 拉成卡片")))))}const sf=[{key:"change",label:"卡片状态变化"},{key:"sla",label:"缺陷 SLA 超时"},{key:"bug",label:"自动开缺陷"},{key:"release",label:"版本发布"}],Gx=e=>{const t=e.events!==null&&typeof e.events=="object"?e.events:null;return t===null?e.notifyOnChange===!1?[]:["change","sla","bug","release"]:sf.filter(a=>t[a.key]!==!1).map(a=>a.label)};function Kx({config:e,onChanged:t}){const{h:a,Editor:n,api:r,toast:s,confirmDialog:o,tipOf:i,TextField:l,ChipField:c,CheckField:u,MdField:p,SideDrawer:f,React:v}=ht(),x=e.feishu?.bots??[],[b,k]=v.useState(null),[g,d]=v.useState(null),[h,y]=v.useState(null),[S,C]=v.useState(!1),[E,_]=v.useState(e.feishu?.driveFolder??""),[I,j]=v.useState(e.feishu?.autoSyncArtifacts!==!1),[H,M]=v.useState(!1),[P,G]=v.useState(null),J=async()=>{M(!0),G(null);try{await r("/config",{feishu:{driveFolder:E.trim(),autoSyncArtifacts:I}}),G("已保存"),await t()}catch(D){G(D instanceof Error?D.message:String(D))}finally{M(!1)}},q=async()=>{if(b!==null){C(!0),d(null),y(null);try{await r("/bots/save",{bot:b}),k(null),y("已保存"),s("已保存"),await t()}catch(D){d(D instanceof Error?D.message:String(D))}finally{C(!1)}}},B=async D=>{if(await o(`删除飞书机器人「${D.name}」?`,{title:"删除机器人",danger:!0,okText:"删除"})){C(!0),d(null);try{await r("/bots/delete",{id:D.id}),await t()}catch(K){d(K instanceof Error?K.message:String(K))}finally{C(!1)}}},L=async D=>{C(!0),d(null),y(null);try{const we=((await r("/feishu/test",{id:D.id})).results??[])[0];y(we!==void 0&&we.ok===!0?`「${D.name}」测试消息已发送`:`「${D.name}」发送失败:${we?.error??"检查 Webhook"}`)}catch(K){d(K instanceof Error?K.message:String(K))}finally{C(!1)}},w=(D,K)=>k({...b,[D]:K}),T=D=>{const K=b.events!==null&&typeof b.events=="object"?b.events:null;return K===null?D==="change"?b.notifyOnChange!==!1:!0:K[D]!==!1},Q=(D,K)=>{const fe={...b.events!==null&&typeof b.events=="object"?b.events:{},[D]:K};k({...b,events:fe,notifyOnChange:fe.change!==!1})},R=x.map(D=>a("div",{className:"ds-listrow",key:D.id},a("div",{className:"ds-listrow-main"},a("div",{},`${D.name}${D.enabled===!1?" (已停用)":""}${D.webhookSet?"":" · 缺 Webhook"}`),a("div",{className:"ds-hint"},`Webhook ${D.webhookHint||"(未设置)"}${D.chatId?" · 群 "+D.chatId:""} · 收:${Gx(D).join(" / ")||"什么都不收"}`)),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn",disabled:S,onClick:()=>void L(D)},"测试"),a("button",{className:"ds-btn",disabled:S,onClick:()=>k({...D,webhook:""})},"编辑"),a("button",{className:"ds-btn",disabled:S,onClick:()=>void B(D),"data-danger":"1"},"删除"))));return a("div",{className:"ds-pane-stack"},a(n,{title:"飞书机器人(可以有多个)",hint:"一个群建一个机器人,并在下面勾选它要收哪些事件;研发群只勾缺陷相关,产品群只勾版本发布。",rows:R,onAdd:()=>k({id:"",name:"",webhook:"",chatId:"",notifyOnChange:!0,events:{change:!0,sla:!0,bug:!0,release:!0},enabled:!0}),addLabel:"新增机器人",render:D=>D,empty:"还没有机器人。"}),h!==null?a("div",{className:"ds-ok",style:{marginBottom:8}},h):null,a("div",{className:"ds-panel ds-form-panel"},a("div",{className:"ds-panel-head"},"云盘归档(产物文档)"),a("div",{className:"ds-panel-body"},a("div",{className:"ds-field"},a("div",{className:"ds-label"},"云盘根文件夹 token 或链接"),a(l,{className:"ds-input",value:E,placeholder:"IuJPfTCtWlDrzwdCFmLc71aynbg 或文件夹链接",onChange:D=>_(D.target.value)}),a("div",{className:"ds-hint"},`每条需求会在它下面建一个「编号 + 标题」的同名文件夹,交付物写成文件夹里的一份 .md 文档。飞书授权:${e.feishu?.larkReady?"lark-cli 已就绪":"lark-cli 未就绪或未授权"}`)),a("label",{className:"ds-row",style:{alignItems:"center",gap:8,cursor:"pointer"}},a(u,{checked:I,onChange:D=>j(D.target.checked)}),a("span",{},"专家登记交付物时自动归档(关掉就只存平台里)")),a("div",{className:"ds-row",style:{gap:8}},a("button",{className:"ds-btn ds-btn-primary",disabled:H,onClick:()=>void J()},H?"保存中…":"保存"),P!==null?a("div",{className:"ds-hint"},P):null))),b===null?null:a(f,{title:b.id?`编辑机器人:${b.name||b.id}`:"新增机器人",hint:"Webhook 只写盘不回显,留空表示不修改;一个群建一个机器人即可。",onClose:()=>k(null),footer:[a("button",{key:"save",className:"ds-btn ds-btn-primary",disabled:S,onClick:()=>void q()},S?"保存中…":"保存"),a("button",{key:"cancel",className:"ds-btn",disabled:S,onClick:()=>k(null)},"取消"),g!==null?a("span",{key:"error",className:"ds-error ds-side-note"},g):null]},a("div",{className:"ds-field"},a("div",{className:"ds-label"},"名字"),a(l,{className:"ds-input",value:b.name,placeholder:"研发群通知",onChange:D=>w("name",D.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},b.webhookSet?"Webhook(已设置,留空则不修改)":"Webhook"),a(l,{className:"ds-input",type:"password",value:b.webhook,placeholder:"https://open.feishu.cn/open-apis/bot/v2/hook/…",onChange:D=>w("webhook",D.target.value)}),a("div",{className:"ds-hint"},"在飞书群里「添加机器人 → 自定义机器人」即可拿到,不需要自建应用。")),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"备注群 chat_id(可选)"),a(l,{className:"ds-input",value:b.chatId,placeholder:"oc_…",onChange:D=>w("chatId",D.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"收哪些事件"),a("div",{className:"ds-row",style:{gap:16,flexWrap:"wrap"}},...sf.map(D=>a("label",{key:D.key,className:"ds-row",style:{alignItems:"center",gap:8,cursor:"pointer"}},a(u,{checked:T(D.key),onChange:K=>Q(D.key,K.target.checked)}),a("span",{},D.label)))),a("div",{className:"ds-hint"},"不勾任何一项就等于这个群静默(只保留测试消息)。")),a("div",{className:"ds-row",style:{gap:16}},a("label",{className:"ds-row",style:{alignItems:"center",gap:8,cursor:"pointer"}},a(u,{checked:b.enabled!==!1,onChange:D=>w("enabled",D.target.checked)}),a("span",{},"启用")))))}function Yx({config:e,onChanged:t}){const{h:a,Editor:n,api:r,toast:s,confirmDialog:o,tipOf:i,TextField:l,ChipField:c,CheckField:u,MdField:p,SideDrawer:f,React:v}=ht(),[x,b]=v.useState(null),[k,g]=v.useState(null),[d,h]=v.useState(null),[y,S]=v.useState(null),[C,E]=v.useState(!1),[_,I]=v.useState(!1),[j,H]=v.useState(!1),M=v.useCallback(async()=>{try{const D=await r("/skills");b({root:D.root,skills:D.skills??[],onDisk:D.onDisk??[]})}catch(D){h(D instanceof Error?D.message:String(D))}},[]);v.useEffect(()=>{M()},[M]);const P=x?.skills??[],G=x?.onDisk??[],J=D=>(e.experts??[]).filter(K=>(K.skills??[]).includes(D)),q=(D,K)=>g({...k,[D]:K}),B=async()=>{if(k!==null){E(!0),h(null),S(null);try{const D=await r("/skills/save",{skill:{name:k.name,description:k.description,whenToUse:k.whenToUse,tags:k.tags,content:k.content,enabled:k.enabled!==!1}});g(null),S(D.warning??(D.file?`已写入 ${D.file}`:"已保存")),await M(),await t()}catch(D){h(D instanceof Error?D.message:String(D))}finally{E(!1)}}},L=async D=>{if(await o(`删除技能「${D.name}」?磁盘上的 SKILL.md 也会一起删掉。`,{title:"删除技能",danger:!0,okText:"删除"})){E(!0),h(null),S(null);try{await r("/skills/delete",{name:D.name}),await M(),await t()}catch(K){h(K instanceof Error?K.message:String(K))}finally{E(!1)}}},w=async()=>{E(!0),h(null),S(null);try{const D=await r("/skills/sync",{});S(`已重新写入 ${(D.written??[]).length} 条技能`),await M()}catch(D){h(D instanceof Error?D.message:String(D))}finally{E(!1)}},T=async D=>{if(D!=null){I(!0),h(null),S(null);try{const K=new Uint8Array(await D.arrayBuffer());let we="";const fe=32768;for(let ae=0;ae<K.length;ae+=fe)we+=String.fromCharCode.apply(null,K.subarray(ae,ae+fe));const ye=await r("/skills/upload",{fileName:D.name,dataBase64:window.btoa(we),overwrite:j}),Ve=ye.overwritten===!0?"已覆盖":"已上传";S(`${Ve}技能「${ye.skill.name}」${ye.file?`,写入 ${ye.file}`:""}`),g(null),await M(),await t()}catch(K){h(K instanceof Error?K.message:String(K))}finally{I(!1)}}},Q=P.map(D=>a("div",{className:"ds-listrow",key:D.name},a("div",{className:"ds-listrow-main"},a("div",{},a("code",{},D.name),(D.tags??[]).map(K=>a(c,{className:"ds-chip",key:K},K)),D.enabled===!1?a("span",{className:"ds-hint"}," (已停用)"):null,G.includes(D.name)?null:a("span",{className:"ds-err"}," 未落盘")),a("div",{className:"ds-hint"},D.description),D.whenToUse?a("div",{className:"ds-hint"},`何时用:${D.whenToUse}`):null,J(D.name).length>0?a("div",{className:"ds-hint"},`使用中的专家:${J(D.name).map(K=>`${K.emoji}${K.name}`).join("、")}`):a("div",{className:"ds-empty"},"还没有专家挂这个技能")),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn",disabled:C,onClick:()=>{S(null),g({...D,editing:!0,tags:(D.tags??[]).join(", ")})}},"编辑"),a("button",{className:"ds-btn",disabled:C,onClick:()=>void L(D),"data-danger":"1"},"删除")))),R=G.filter(D=>!P.some(K=>K.name===D));return a("div",{className:"ds-pane-stack"},a(n,{title:"技能库(skills-manager)",hint:x===null?"读取中…":`保存在 ${x.root}/<名字>/SKILL.md,所有专家都能用 skill 工具加载;专家也可以自己用 studio_skill_save 往这里加技能。支持上传 SKILL.md 或包含 SKILL.md 的 .zip 技能包。`,rows:Q,addLabel:"新建技能",onAdd:()=>{S(null),g({name:"",description:"",whenToUse:"",tags:"",content:`# 什么时候用
|
|
30
30
|
|
|
31
31
|
# 步骤
|
|
32
32
|
|
|
33
33
|
1.
|
|
34
|
-
`,enabled:!0,editing:!1})},render:
|
|
34
|
+
`,enabled:!0,editing:!1})},render:D=>D,empty:"还没有技能。把一次摸索出来的做法写成第一条,下次就不用重新摸索。"}),R.length>0?a("div",{className:"ds-hint"},`磁盘上还有 ${R.length} 个不归这里管的技能目录:${R.join("、")}`):null,a("div",{className:"ds-row",style:{gap:8,alignItems:"center",padding:"6px 0 10px",flexWrap:"wrap"}},a("label",{className:"ds-btn",style:{cursor:_?"progress":"pointer",opacity:_?.6:1}},_?"上传中…":"上传技能",a("input",{type:"file",accept:".md,.markdown,.txt,.zip",style:{display:"none"},disabled:_,onChange:D=>{const K=D.target.files===null?void 0:D.target.files[0];D.target.value="",T(K)}})),a("label",{className:"ds-hint",style:{display:"flex",alignItems:"center",gap:6,cursor:"pointer"}},a(u,{checked:j,onChange:D=>H(D.target.checked)}),"覆盖同名技能"),a("button",{className:"ds-btn",disabled:C||P.length===0,onClick:()=>void w()},"重新写入磁盘"),y!==null?a("span",{className:"ds-ok"},y):null,d!==null?a("span",{className:"ds-error"},d):null),k===null?null:a(f,{title:k.editing===!0?`编辑技能:${k.name}`:"新建技能",hint:"技能正文就是一个 SKILL.md:什么情况用、步骤、命令、踩过的坑。保存后写入 ~/.dsh/skills/<名字>/SKILL.md。",onClose:()=>g(null),footer:[a("button",{key:"save",className:"ds-btn ds-btn-primary",disabled:C||k.name.length===0||k.content.trim().length===0,onClick:()=>void B()},C?"保存中…":"保存技能"),a("button",{key:"cancel",className:"ds-btn",disabled:C,onClick:()=>g(null)},"取消"),d!==null?a("span",{key:"error",className:"ds-error ds-side-note"},d):null]},a("div",{className:"ds-row",style:{gap:8}},a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"技能名(kebab-case)"),a(l,{className:"ds-input",value:k.name,disabled:k.editing===!0,placeholder:"gitlab-mr-review",onChange:D=>q("name",D.target.value.trim().toLowerCase().replace(/[^a-z0-9-]+/g,"-"))})),a("div",{className:"ds-field",style:{flex:2}},a("div",{className:"ds-label"},"什么时候该用(一行,模型据此决定要不要加载)"),a(l,{className:"ds-input",value:k.description,placeholder:"评审 GitLab MR 时:怎么读 diff、怎么留评论",onChange:D=>q("description",D.target.value)}))),a("div",{className:"ds-row",style:{gap:8}},a("div",{className:"ds-field",style:{flex:2}},a("div",{className:"ds-label"},"补充触发条件(选填)"),a(l,{className:"ds-input",value:k.whenToUse,placeholder:"收到 @研发 且带 MR 链接时",onChange:D=>q("whenToUse",D.target.value)})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"标签(逗号分隔)"),a(l,{className:"ds-input",value:k.tags,placeholder:"gitlab, review",onChange:D=>q("tags",D.target.value)}))),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"技能正文(Markdown:什么情况用、步骤、命令、坑)"),a(p,{className:"ds-input",rows:14,value:k.content,placeholder:`# 什么时候用
|
|
35
35
|
|
|
36
36
|
# 步骤
|
|
37
37
|
|
|
@@ -39,11 +39,11 @@ GET /api/points | 200 |`,onChange:m=>le({...Z,steps:m.target.value})}),e("div",{
|
|
|
39
39
|
|
|
40
40
|
# 坑
|
|
41
41
|
|
|
42
|
-
- `,onChange:O=>V("content",O.target.value)})),a("div",{className:"ds-field"},a("label",{className:"ds-row",style:{alignItems:"center",gap:8,cursor:"pointer"}},a(u,{checked:k.enabled!==!1,onChange:O=>V("enabled",O.target.checked)}),a("span",{},"启用(停用则不写入磁盘)")))))}function Yx({state:e,onOpenTask:t,onOpenBoard:a,onOpenCases:n}){const{h:r,React:s,api:o,toast:i}=vt(),[l,c]=s.useState(null),[u,p]=s.useState(null),[f,v]=s.useState(null);if(s.useEffect(()=>{let S=!0;return(async()=>{try{const C=await o("/dashboard");S&&(c(C?.dashboard??null),p(C?.regression??null))}catch(C){if(S){const E=C instanceof Error?C.message:String(C);v(E),i(E,"error")}}})(),()=>{S=!1}},[e.revision]),l===null)return r("div",{className:"ds-body"},r("div",{className:"ds-hint"},f===null?"正在算今天该看什么…":`算不出来:${f}`));const x=u===null?null:(()=>{const S=(Number(u.failed)||0)+(Number(u.failedCards)||0)>0;return r("div",{className:"ds-reg-banner","data-bad":S?"1":"0"},r("span",null,`最近回归 · ${Ye(u.at)} · ${u.by||"人"}`),r("span",{className:"ds-hint"},`${u.cards} 张卡 / ${u.total} 条:通过 ${u.passed}${S?`,不通过 ${u.failed}`:""}${u.bugs>0?` · 自动开缺陷 ${u.bugs} 张`:""}`),n===void 0?null:r("button",{className:"ds-btn ds-btn-ghost",onClick:()=>n()},"看用例"))})(),b=l.risks??{},k=l.flow??{},g=l.ai??{},d=(S,C,E,_)=>r("div",{className:"ds-kpi","data-warn":_===!0?"1":"0"},r("div",{className:"ds-kpi-value"},String(C??0)),r("div",{className:"ds-kpi-label"},S),r("div",{className:"ds-kpi-hint"},E)),h=S=>r("div",{key:S.id,className:"ds-listrow"},r("div",{className:"ds-listrow-main"},r("div",null,`${S.code||S.id} · ${S.title}`),r("div",{className:"ds-hint"},`${S.statusLabel}${S.dueAt>0?` · 截止 ${Wa(S.dueAt)}`:""}${S.sla?.state==="overdue"?" · 缺陷超时":""}`)),r("div",{className:"ds-listrow-actions"},r("button",{className:"ds-btn ds-btn-ghost",onClick:()=>t(S.id)},"打开"))),y=(S,C,E,_)=>r("div",{className:"ds-panel"},r("div",{className:"ds-panel-head"},r("span",null,S),r("span",{className:"ds-hint"},_??"")),r("div",{className:"ds-panel-body"},C.length===0?r("div",{className:"ds-hint"},E):C));return r("div",{className:"ds-body"},x,r("div",{className:"ds-kpi-grid"},d("在办卡",l.scope.open,`共 ${l.scope.tasks} 张`),d("逾期",b.overdue,"过了期望完成时间还没完成",b.overdue>0),d("阻塞",b.blocked,"挂着阻塞标记等人决策",b.blocked>0),d("缺陷超时",b.slaOverdue,"按 P0-P3 时限算",b.slaOverdue>0),d("准出被拦",b.gateFailed,"待测试/待验收里过不了准出",b.gateFailed>0),d("流水线失败",b.pipelineFailed,"最近一次 CI 没通过",b.pipelineFailed>0),d("集成异常",b.integrationsBroken,"飞书/GitLab/云盘/隔离",b.integrationsBroken>0),d("AI 在跑",g.running,`今天派单 ${g.todayRuns} 次`)),r("div",{className:"ds-panel"},r("div",{className:"ds-panel-head"},r("span",null,"流程与产出"),r("span",{className:"ds-hint"},"需要人动手的地方")),r("div",{className:"ds-panel-body ds-grid4"},r("div",{className:"ds-field"},r("div",{className:"ds-label"},"待评审"),r("div",null,String(k.review??0))),r("div",{className:"ds-field"},r("div",{className:"ds-label"},"待测试"),r("div",null,String(k.test??0))),r("div",{className:"ds-field"},r("div",{className:"ds-label"},"待验收"),r("div",null,String(k.accept??0))),r("div",{className:"ds-field"},r("div",{className:"ds-label"},"今天完成"),r("div",null,String(k.doneToday??0))),r("div",{className:"ds-field"},r("div",{className:"ds-label"},"近 7 天完成"),r("div",null,String(k.doneWeek??0))),r("div",{className:"ds-field"},r("div",{className:"ds-label"},"需求卡住"),r("div",null,String(b.requirementBlocked??0))),r("div",{className:"ds-field"},r("div",{className:"ds-label"},"版本卡住"),r("div",null,String(b.releaseBlocked??0))),r("div",{className:"ds-field"},r("div",{className:"ds-label"},""),r("button",{className:"ds-btn ds-btn-ghost",onClick:()=>a()},"去看板")))),y("逾期",(l.list?.overdue??[]).map(h),"没有逾期的卡。"),y("阻塞",(l.list?.blocked??[]).map(h),"没有卡在等人决策。"),y("缺陷超时",(l.list?.slaOverdue??[]).map(h),"缺陷都在时限内。"),y("准出被拦",(l.list?.gateFailed??[]).map(h),"没有卡被准出规则拦住。","清单没勾完 / 用例不通过 / 已签过字但被打回"),y("流水线失败",(l.list?.pipelineFailed??[]).map(h),"没有 CI 失败的卡。"),y("需求与版本卡住",[...(l.list?.requirementBlocked??[]).map(S=>r("div",{key:S.id,className:"ds-listrow"},r("div",{className:"ds-listrow-main"},r("div",null,`${S.code||S.id} · ${S.title}`),r("div",{className:"ds-hint"},`需求:${(S.blockers??[]).join(";")}`)))),...(l.list?.releaseBlocked??[]).map(S=>r("div",{key:S.id,className:"ds-listrow"},r("div",{className:"ds-listrow-main"},r("div",null,`${S.version||S.id} · ${S.name||""}`),r("div",{className:"ds-hint"},`版本:${(S.blockers??[]).join(";")}`))))],"需求与版本都还顺。"),r("div",{className:"ds-hint"},`统计时间 ${Ye(l.at)},数字随看板变化实时算,不落库。`))}function Qx({state:e,onOpenTask:t}){const{h:a,React:n,api:r,toast:s,confirmDialog:o,promptDialog:i,TextField:l,SelectField:c,ChipField:u,CheckField:p}=vt(),[f,v]=n.useState(null),[x,b]=n.useState(null),[k,g]=n.useState(""),[d,h]=n.useState("__all__"),[y,S]=n.useState("__all__"),[C,E]=n.useState(()=>new Set),[_,R]=n.useState(!1),[A,G]=n.useState([]),[L,P]=n.useState({}),[W,J]=n.useState({}),[V,F]=n.useState(null),[M,w]=n.useState(""),[$,Y]=n.useState([]),[I,O]=n.useState(null),K=n.useCallback(async()=>{try{const q=await r("/cases",{});v(Array.isArray(q.cases)?q.cases:[]),Y(Array.isArray(q.regressions)?q.regressions:[]),G(Array.isArray(q.suites)?q.suites:[]),P(Object.fromEntries((q.counts??[]).map(me=>[me.id,me.count]))),J(Object.fromEntries((q.counts??[]).map(me=>[me.id,me.keys??[]]))),b(null)}catch(q){b(q instanceof Error?q.message:String(q)),v([])}},[]),Ne=(e.tasks??[]).reduce((q,me)=>{const Ae=me.caseSummary??{total:0,pass:0,fail:0};return q+Ae.total*7+Ae.pass*13+Ae.fail*17},0);n.useEffect(()=>{K()},[K,Ne]);const fe=n.useMemo(()=>{const q=k.trim().toLowerCase(),me=V===null?null:new Set(W[V]??[]);return(f??[]).filter(Ae=>me!==null&&!me.has(Ae.key)||d!=="__all__"&&Ae.requirementId!==d||y!=="__all__"&&Ae.result!==y?!1:q===""?!0:`${Ae.id} ${Ae.title} ${Ae.taskTitle} ${Ae.requirementTitle} ${Ae.pointId}`.toLowerCase().includes(q))},[f,k,d,y,V,W]),xe=n.useMemo(()=>{const q=fe.filter(ze=>ze.result==="pass").length,me=fe.filter(ze=>ze.result==="fail").length,Ae=fe.filter(ze=>ze.result==="skip").length;return{pass:q,fail:me,skip:Ae,rest:fe.length-q-me-Ae}},[fe]),He=e.requirements??[],Se=fe.filter(q=>q.http),U=Se.filter(q=>C.has(q.key)),ae=q=>E(me=>{const Ae=new Set(me);return Ae.has(q)?Ae.delete(q):Ae.add(q),Ae}),Te=()=>E(new Set(Se.map(q=>q.key))),Z=()=>E(new Set),le=async q=>{if(q.length===0){w("先勾几条带接口定义的用例再跑(手工用例没有 http,跑不了)");return}R(!0),w("");try{const Ae=(await r("/cases/run",{keys:q.map(Je=>Je.key),by:"回归"}))?.results??[],ze=Je=>Ae.reduce((yt,ls)=>yt+(Number(ls[Je])||0),0),Pt=Ae.filter(Je=>Je.ok===!1),Vt=[`跑了 ${Ae.length} 张卡 / ${ze("total")} 条:通过 ${ze("passed")},不通过 ${ze("failed")}`];ze("bugs")>0&&Vt.push(`自动开缺陷 ${ze("bugs")} 张`),Pt.length>0&&Vt.push(`${Pt.length} 张卡报错:${Pt[0].error??""}`),w(Vt.join(",")),E(new Set),await K()}catch(me){w(me instanceof Error?me.message:String(me))}finally{R(!1)}},he=q=>{const me=q?.results??[],Ae=Vt=>me.reduce((Je,yt)=>Je+(Number(yt[Vt])||0),0),ze=me.filter(Vt=>Vt.ok===!1),Pt=[`跑了 ${me.length} 张卡 / ${Ae("total")} 条:通过 ${Ae("passed")},不通过 ${Ae("failed")}`];return Ae("bugs")>0&&Pt.push(`自动开缺陷 ${Ae("bugs")} 张`),ze.length>0&&Pt.push(`${ze.length} 张卡报错:${ze[0].error??""}`),q?.truncated!==void 0&&Pt.push(`套件共 ${q.truncated.total} 条,本次只跑了前 ${q.truncated.ran} 条`),Pt.join(",")},H=async q=>{R(!0),w("");try{const me=await r("/suite/run",{id:q.id});w(he(me)),await K()}catch(me){w(me instanceof Error?me.message:String(me))}finally{R(!1)}},Ce=async()=>{const q=await i("套件名字(跑的就是当前筛选里的用例)",{title:"新建回归套件",defaultValue:"默认回归"});if(!(q===null||String(q).trim()===""))try{await r("/suite/save",{suite:{name:String(q).trim().slice(0,40),rules:{requirementIds:d==="__all__"?[]:[d],httpOnly:!0},keys:[],isDefault:A.length===0},by:"人"}),s("已保存套件"),await K()}catch(me){s(me instanceof Error?me.message:String(me),"error")}},be=async q=>{try{await r("/suite/save",{suite:{...q,isDefault:!0},by:"人"}),s(`夜间回归改跑「${q.name}」`),await K()}catch(me){s(me instanceof Error?me.message:String(me),"error")}},_e=async q=>{if(await o(`删除套件「${q.name}」?用例本身不受影响。`,{title:"删除套件",danger:!0,okText:"删除"}))try{await r("/suite/delete",{id:q.id}),await K()}catch(me){s(me instanceof Error?me.message:String(me),"error")}},Ue=fe.filter(q=>q.http&&q.result==="fail"),qa=()=>le(U),Tn=()=>le(Ue);return a("div",{className:"ds-body"},a("div",{className:"ds-panel"},a("div",{className:"ds-panel-head"},a("span",null,"用例总览"),a("span",{className:"ds-hint"},"全公司的用例按卡片汇总:点一行跳回那张卡;用例本身仍在卡片的「测试」里维护"),a(u,{className:"ds-chip",style:{marginLeft:"auto"}},`${fe.length} 条 · ✅ ${xe.pass} · ❌ ${xe.fail}${xe.skip>0?` · ⏭️ ${xe.skip}`:""}${xe.rest>0?` · ⬜ ${xe.rest}`:""}`),a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void K()},"刷新")),a("div",{className:"ds-panel-body"},a("div",{className:"ds-row"},a(l,{className:"ds-input",style:{width:240},value:k,placeholder:"搜用例 / 卡片 / 需求 / 功能点",onChange:q=>g(q.target.value)}),a(c,{className:"ds-select",style:{width:220},value:d,onChange:q=>h(q.target.value)},a("option",{value:"__all__"},"全部需求"),He.map(q=>a("option",{key:q.id,value:q.id},`${q.code||q.id} ${q.title}`))),a(c,{className:"ds-select",style:{width:140},value:y,onChange:q=>S(q.target.value)},a("option",{value:"__all__"},"全部结果"),Gp.map(q=>a("option",{key:q,value:q},Vl[q])))),a("div",{className:"ds-row",style:{marginTop:8}},a("button",{className:"ds-btn ds-btn-ghost",disabled:_||Se.length===0,onClick:Te},`全选可跑的 ${Se.length} 条`),a("button",{className:"ds-btn ds-btn-ghost",disabled:_||C.size===0,onClick:Z},"清空选择"),a("button",{className:"ds-btn ds-btn-primary",disabled:_||U.length===0,onClick:()=>void qa()},_?"跑着…":`▶ 跑选中的 ${U.length} 条`),a("button",{className:"ds-btn",disabled:_||Ue.length===0,title:"只补跑上次不通过、且有接口定义的用例",onClick:()=>void Tn()},`↻ 只跑上次失败的 ${Ue.length} 条`),a("span",{className:"ds-hint"},"按卡串行跑,每张卡一轮;失败的照旧自动开缺陷(最多一次 60 条)")),a("div",{className:"ds-row",style:{marginTop:8,flexWrap:"wrap",gap:8}},a("span",{className:"ds-hint"},"回归套件:"),A.length===0?a("span",{className:"ds-hint"},"还没有套件。把当前筛选存成套件,夜间就自动跑它。"):A.map(q=>a("span",{key:q.id,className:"ds-suite","data-default":q.isDefault?"1":"0"},a("span",{style:{cursor:"pointer"},title:"点一下只看这个套件里的用例,再点一次取消",onClick:()=>F(me=>me===q.id?null:q.id)},`📦 ${q.name}${q.isDefault?" · 默认":""} · ${L[q.id]??0} 条${V===q.id?"(只看中)":""}`),a("button",{className:"ds-btn ds-btn-ghost",disabled:_||(L[q.id]??0)===0,onClick:()=>void H(q)},"▶ 跑"),q.isDefault?null:a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void be(q)},"设为默认"),a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void _e(q),"data-danger":"1"},"删除"))),a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void Ce()},"+ 存为套件")),M===""?null:a("div",{className:"ds-hint",style:{marginTop:6}},M),$.length===0?null:a("div",{className:"ds-reg-list"},a("span",{className:"ds-hint"},"最近回归:"),$.slice(0,4).map(q=>a("span",{key:String(q.at),className:"ds-reg-item","data-bad":(Number(q.failed)||0)+(Number(q.failedCards)||0)>0?"1":"0",title:`${new Date(q.at).toLocaleString("zh-CN")} · ${q.by||"人"}`},`${Ye(q.at)} ${q.by||""} · ${q.cards} 卡 / ${q.total} 条 · ✅${q.passed} ❌${q.failed}${q.bugs>0?` 🐞${q.bugs}`:""}`))),x!==null?a("div",{className:"ds-err"},x):null,f===null?a("div",{className:"ds-hint",style:{padding:"10px 2px"}},"载入用例…"):fe.length===0?a("div",{className:"ds-empty"},"没有符合条件的用例。用例登记在卡片详情的「测试」里。"):a("div",{className:"ds-case-lib"},fe.map(q=>a("div",{key:q.key,className:"ds-case-lib-wrap"},a("div",{className:"ds-case-lib-row","data-result":q.result,title:"打开所属卡片",onClick:()=>t(q.taskId)},a("span",{className:"ds-case-lib-pick",onClick:me=>me.stopPropagation()},a(p,{checked:C.has(q.key),disabled:_||!q.http,onChange:()=>ae(q.key)})),a("span",{className:"ds-case-lib-result"},Vl[q.result]??q.result),a("span",{className:"ds-case-lib-title"},q.title),a("span",{className:"ds-case-lib-meta"},`${q.taskCode||q.taskId} · ${q.requirementTitle||"未挂需求"}${q.pointId?" · "+q.pointId:""}`),a("span",{className:"ds-case-lib-meta"},q.http?"接口":"手工"),a("span",{className:"ds-case-lib-pri"},q.priority),a("span",{className:"ds-case-lib-at"},q.lastRunAt>0?Ye(q.lastRunAt):"没跑过"),a("button",{className:"ds-btn ds-btn-ghost ds-case-lib-more",title:"看最近一次执行的明细",onClick:me=>{me.stopPropagation(),O(I===q.key?null:q.key)}},I===q.key?"收起":"明细")),I===q.key?a("div",{className:"ds-case-lib-detail"},a("div",null,`期望:${q.expected||"—"}`),a("div",null,`最近一次:${q.note||(q.lastRunAt>0?"只有结果,没有记录":"还没跑过")}`),q.lastError===""?null:a("div",{className:"ds-err"},`错误:${q.lastError}`),q.lastPreview===""?null:a("pre",{className:"ds-case-lib-preview"},q.lastPreview),a("div",{className:"ds-hint"},`用例编号 ${q.id} · 所属卡片 ${q.taskCode||q.taskId}`)):null))))))}function Xx({value:e,tone:t}){const{h:a,kit:n}=vt(),r=n("ProgressBar"),s=Math.max(0,Math.min(100,Number(e)||0));if(r!==null)return a(r,{value:s,tone:t});const o=t==="over"?"#e5484d":t==="warn"?"#d97706":void 0;return a("div",{className:"ds-an-track"},a("div",{className:"ds-an-fill",style:{width:`${s}%`,background:o}}))}function Zx({series:e}){const{h:t,kit:a}=vt(),n=Array.isArray(e)?e:[];if(n.length===0)return t("div",{className:"ds-empty"},"还没有数据。");const r=n.map(u=>Math.max(0,Number(u.remaining)||0)),s=Math.max(1,...r),o=n.length===1?100:100/(n.length-1),i=n.map((u,p)=>({x:p*o,y:38-r[p]/s*32,remaining:r[p],day:String(u.day??"")})),l=i.map((u,p)=>`${p===0?"M":"L"}${u.x.toFixed(2)},${u.y.toFixed(2)}`).join(" "),c=`${l} L100,40 L0,40 Z`;return t("div",{className:"ds-burn"},t("svg",{viewBox:"0 0 100 40",preserveAspectRatio:"none",className:"ds-burn-svg",role:"img","aria-label":"燃尽趋势"},t("path",{d:c,className:"ds-burn-area"}),t("path",{d:l,className:"ds-burn-line",vectorEffect:"non-scaling-stroke"}),i.map(u=>t("circle",{key:u.day,cx:u.x,cy:u.y,r:1.1,className:"ds-burn-dot"},t("title",{},`${u.day}:还剩 ${u.remaining} 张`)))),t("div",{className:"ds-burn-axis"},t("span",{},i[0].day),t("span",{},i[i.length-1].day)))}const ed=800;function rf(e){const t=String(e??"").replace(/\r\n?/g,`
|
|
42
|
+
- `,onChange:D=>q("content",D.target.value)})),a("div",{className:"ds-field"},a("label",{className:"ds-row",style:{alignItems:"center",gap:8,cursor:"pointer"}},a(u,{checked:k.enabled!==!1,onChange:D=>q("enabled",D.target.checked)}),a("span",{},"启用(停用则不写入磁盘)")))))}function Qx({state:e,onOpenTask:t,onOpenBoard:a,onOpenCases:n}){const{h:r,React:s,api:o,toast:i}=ht(),[l,c]=s.useState(null),[u,p]=s.useState(null),[f,v]=s.useState(null);if(s.useEffect(()=>{let S=!0;return(async()=>{try{const C=await o("/dashboard");S&&(c(C?.dashboard??null),p(C?.regression??null))}catch(C){if(S){const E=C instanceof Error?C.message:String(C);v(E),i(E,"error")}}})(),()=>{S=!1}},[e.revision]),l===null)return r("div",{className:"ds-body"},r("div",{className:"ds-hint"},f===null?"正在算今天该看什么…":`算不出来:${f}`));const x=u===null?null:(()=>{const S=(Number(u.failed)||0)+(Number(u.failedCards)||0)>0;return r("div",{className:"ds-reg-banner","data-bad":S?"1":"0"},r("span",null,`最近回归 · ${Qe(u.at)} · ${u.by||"人"}`),r("span",{className:"ds-hint"},`${u.cards} 张卡 / ${u.total} 条:通过 ${u.passed}${S?`,不通过 ${u.failed}`:""}${u.bugs>0?` · 自动开缺陷 ${u.bugs} 张`:""}`),n===void 0?null:r("button",{className:"ds-btn ds-btn-ghost",onClick:()=>n()},"看用例"))})(),b=l.risks??{},k=l.flow??{},g=l.ai??{},d=(S,C,E,_)=>r("div",{className:"ds-kpi","data-warn":_===!0?"1":"0"},r("div",{className:"ds-kpi-value"},String(C??0)),r("div",{className:"ds-kpi-label"},S),r("div",{className:"ds-kpi-hint"},E)),h=S=>r("div",{key:S.id,className:"ds-listrow"},r("div",{className:"ds-listrow-main"},r("div",null,`${S.code||S.id} · ${S.title}`),r("div",{className:"ds-hint"},`${S.statusLabel}${S.dueAt>0?` · 截止 ${Wa(S.dueAt)}`:""}${S.sla?.state==="overdue"?" · 缺陷超时":""}`)),r("div",{className:"ds-listrow-actions"},r("button",{className:"ds-btn ds-btn-ghost",onClick:()=>t(S.id)},"打开"))),y=(S,C,E,_)=>r("div",{className:"ds-panel"},r("div",{className:"ds-panel-head"},r("span",null,S),r("span",{className:"ds-hint"},_??"")),r("div",{className:"ds-panel-body"},C.length===0?r("div",{className:"ds-hint"},E):C));return r("div",{className:"ds-body"},x,r("div",{className:"ds-kpi-grid"},d("在办卡",l.scope.open,`共 ${l.scope.tasks} 张`),d("逾期",b.overdue,"过了期望完成时间还没完成",b.overdue>0),d("阻塞",b.blocked,"挂着阻塞标记等人决策",b.blocked>0),d("缺陷超时",b.slaOverdue,"按 P0-P3 时限算",b.slaOverdue>0),d("准出被拦",b.gateFailed,"待测试/待验收里过不了准出",b.gateFailed>0),d("流水线失败",b.pipelineFailed,"最近一次 CI 没通过",b.pipelineFailed>0),d("集成异常",b.integrationsBroken,"飞书/GitLab/云盘/隔离",b.integrationsBroken>0),d("AI 在跑",g.running,`今天派单 ${g.todayRuns} 次`)),r("div",{className:"ds-panel"},r("div",{className:"ds-panel-head"},r("span",null,"流程与产出"),r("span",{className:"ds-hint"},"需要人动手的地方")),r("div",{className:"ds-panel-body ds-grid4"},r("div",{className:"ds-field"},r("div",{className:"ds-label"},"待评审"),r("div",null,String(k.review??0))),r("div",{className:"ds-field"},r("div",{className:"ds-label"},"待测试"),r("div",null,String(k.test??0))),r("div",{className:"ds-field"},r("div",{className:"ds-label"},"待验收"),r("div",null,String(k.accept??0))),r("div",{className:"ds-field"},r("div",{className:"ds-label"},"今天完成"),r("div",null,String(k.doneToday??0))),r("div",{className:"ds-field"},r("div",{className:"ds-label"},"近 7 天完成"),r("div",null,String(k.doneWeek??0))),r("div",{className:"ds-field"},r("div",{className:"ds-label"},"需求卡住"),r("div",null,String(b.requirementBlocked??0))),r("div",{className:"ds-field"},r("div",{className:"ds-label"},"版本卡住"),r("div",null,String(b.releaseBlocked??0))),r("div",{className:"ds-field"},r("div",{className:"ds-label"},""),r("button",{className:"ds-btn ds-btn-ghost",onClick:()=>a()},"去看板")))),y("逾期",(l.list?.overdue??[]).map(h),"没有逾期的卡。"),y("阻塞",(l.list?.blocked??[]).map(h),"没有卡在等人决策。"),y("缺陷超时",(l.list?.slaOverdue??[]).map(h),"缺陷都在时限内。"),y("准出被拦",(l.list?.gateFailed??[]).map(h),"没有卡被准出规则拦住。","清单没勾完 / 用例不通过 / 已签过字但被打回"),y("流水线失败",(l.list?.pipelineFailed??[]).map(h),"没有 CI 失败的卡。"),y("需求与版本卡住",[...(l.list?.requirementBlocked??[]).map(S=>r("div",{key:S.id,className:"ds-listrow"},r("div",{className:"ds-listrow-main"},r("div",null,`${S.code||S.id} · ${S.title}`),r("div",{className:"ds-hint"},`需求:${(S.blockers??[]).join(";")}`)))),...(l.list?.releaseBlocked??[]).map(S=>r("div",{key:S.id,className:"ds-listrow"},r("div",{className:"ds-listrow-main"},r("div",null,`${S.version||S.id} · ${S.name||""}`),r("div",{className:"ds-hint"},`版本:${(S.blockers??[]).join(";")}`))))],"需求与版本都还顺。"),r("div",{className:"ds-hint"},`统计时间 ${Qe(l.at)},数字随看板变化实时算,不落库。`))}function Xx({state:e,onOpenTask:t}){const{h:a,React:n,api:r,toast:s,confirmDialog:o,promptDialog:i,TextField:l,SelectField:c,ChipField:u,CheckField:p}=ht(),[f,v]=n.useState(null),[x,b]=n.useState(null),[k,g]=n.useState(""),[d,h]=n.useState("__all__"),[y,S]=n.useState("__all__"),[C,E]=n.useState(()=>new Set),[_,I]=n.useState(!1),[j,H]=n.useState([]),[M,P]=n.useState({}),[G,J]=n.useState({}),[q,B]=n.useState(null),[L,w]=n.useState(""),[T,Q]=n.useState([]),[R,D]=n.useState(null),K=n.useCallback(async()=>{try{const V=await r("/cases",{});v(Array.isArray(V.cases)?V.cases:[]),Q(Array.isArray(V.regressions)?V.regressions:[]),H(Array.isArray(V.suites)?V.suites:[]),P(Object.fromEntries((V.counts??[]).map(he=>[he.id,he.count]))),J(Object.fromEntries((V.counts??[]).map(he=>[he.id,he.keys??[]]))),b(null)}catch(V){b(V instanceof Error?V.message:String(V)),v([])}},[]),we=(e.tasks??[]).reduce((V,he)=>{const je=he.caseSummary??{total:0,pass:0,fail:0};return V+je.total*7+je.pass*13+je.fail*17},0);n.useEffect(()=>{K()},[K,we]);const fe=n.useMemo(()=>{const V=k.trim().toLowerCase(),he=q===null?null:new Set(G[q]??[]);return(f??[]).filter(je=>he!==null&&!he.has(je.key)||d!=="__all__"&&je.requirementId!==d||y!=="__all__"&&je.result!==y?!1:V===""?!0:`${je.id} ${je.title} ${je.taskTitle} ${je.requirementTitle} ${je.pointId}`.toLowerCase().includes(V))},[f,k,d,y,q,G]),ye=n.useMemo(()=>{const V=fe.filter(ze=>ze.result==="pass").length,he=fe.filter(ze=>ze.result==="fail").length,je=fe.filter(ze=>ze.result==="skip").length;return{pass:V,fail:he,skip:je,rest:fe.length-V-he-je}},[fe]),Ve=e.requirements??[],ae=fe.filter(V=>V.http),F=ae.filter(V=>C.has(V.key)),te=V=>E(he=>{const je=new Set(he);return je.has(V)?je.delete(V):je.add(V),je}),xe=()=>E(new Set(ae.map(V=>V.key))),X=()=>E(new Set),oe=async V=>{if(V.length===0){w("先勾几条带接口定义的用例再跑(手工用例没有 http,跑不了)");return}I(!0),w("");try{const je=(await r("/cases/run",{keys:V.map(et=>et.key),by:"回归"}))?.results??[],ze=et=>je.reduce((bt,ds)=>bt+(Number(ds[et])||0),0),Pt=je.filter(et=>et.ok===!1),Vt=[`跑了 ${je.length} 张卡 / ${ze("total")} 条:通过 ${ze("passed")},不通过 ${ze("failed")}`];ze("bugs")>0&&Vt.push(`自动开缺陷 ${ze("bugs")} 张`),Pt.length>0&&Vt.push(`${Pt.length} 张卡报错:${Pt[0].error??""}`),w(Vt.join(",")),E(new Set),await K()}catch(he){w(he instanceof Error?he.message:String(he))}finally{I(!1)}},me=V=>{const he=V?.results??[],je=Vt=>he.reduce((et,bt)=>et+(Number(bt[Vt])||0),0),ze=he.filter(Vt=>Vt.ok===!1),Pt=[`跑了 ${he.length} 张卡 / ${je("total")} 条:通过 ${je("passed")},不通过 ${je("failed")}`];return je("bugs")>0&&Pt.push(`自动开缺陷 ${je("bugs")} 张`),ze.length>0&&Pt.push(`${ze.length} 张卡报错:${ze[0].error??""}`),V?.truncated!==void 0&&Pt.push(`套件共 ${V.truncated.total} 条,本次只跑了前 ${V.truncated.ran} 条`),Pt.join(",")},W=async V=>{I(!0),w("");try{const he=await r("/suite/run",{id:V.id});w(me(he)),await K()}catch(he){w(he instanceof Error?he.message:String(he))}finally{I(!1)}},$e=async()=>{const V=await i("套件名字(跑的就是当前筛选里的用例)",{title:"新建回归套件",defaultValue:"默认回归"});if(!(V===null||String(V).trim()===""))try{await r("/suite/save",{suite:{name:String(V).trim().slice(0,40),rules:{requirementIds:d==="__all__"?[]:[d],httpOnly:!0},keys:[],isDefault:j.length===0},by:"人"}),s("已保存套件"),await K()}catch(he){s(he instanceof Error?he.message:String(he),"error")}},ke=async V=>{try{await r("/suite/save",{suite:{...V,isDefault:!0},by:"人"}),s(`夜间回归改跑「${V.name}」`),await K()}catch(he){s(he instanceof Error?he.message:String(he),"error")}},Ie=async V=>{if(await o(`删除套件「${V.name}」?用例本身不受影响。`,{title:"删除套件",danger:!0,okText:"删除"}))try{await r("/suite/delete",{id:V.id}),await K()}catch(he){s(he instanceof Error?he.message:String(he),"error")}},Ue=fe.filter(V=>V.http&&V.result==="fail"),qa=()=>oe(F),Tn=()=>oe(Ue);return a("div",{className:"ds-body"},a("div",{className:"ds-panel"},a("div",{className:"ds-panel-head"},a("span",null,"用例总览"),a("span",{className:"ds-hint"},"全公司的用例按卡片汇总:点一行跳回那张卡;用例本身仍在卡片的「测试」里维护"),a(u,{className:"ds-chip",style:{marginLeft:"auto"}},`${fe.length} 条 · ✅ ${ye.pass} · ❌ ${ye.fail}${ye.skip>0?` · ⏭️ ${ye.skip}`:""}${ye.rest>0?` · ⬜ ${ye.rest}`:""}`),a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void K()},"刷新")),a("div",{className:"ds-panel-body"},a("div",{className:"ds-row"},a(l,{className:"ds-input",style:{width:240},value:k,placeholder:"搜用例 / 卡片 / 需求 / 功能点",onChange:V=>g(V.target.value)}),a(c,{className:"ds-select",style:{width:220},value:d,onChange:V=>h(V.target.value)},a("option",{value:"__all__"},"全部需求"),Ve.map(V=>a("option",{key:V.id,value:V.id},`${V.code||V.id} ${V.title}`))),a(c,{className:"ds-select",style:{width:140},value:y,onChange:V=>S(V.target.value)},a("option",{value:"__all__"},"全部结果"),Gp.map(V=>a("option",{key:V,value:V},Vl[V])))),a("div",{className:"ds-row",style:{marginTop:8}},a("button",{className:"ds-btn ds-btn-ghost",disabled:_||ae.length===0,onClick:xe},`全选可跑的 ${ae.length} 条`),a("button",{className:"ds-btn ds-btn-ghost",disabled:_||C.size===0,onClick:X},"清空选择"),a("button",{className:"ds-btn ds-btn-primary",disabled:_||F.length===0,onClick:()=>void qa()},_?"跑着…":`▶ 跑选中的 ${F.length} 条`),a("button",{className:"ds-btn",disabled:_||Ue.length===0,title:"只补跑上次不通过、且有接口定义的用例",onClick:()=>void Tn()},`↻ 只跑上次失败的 ${Ue.length} 条`),a("span",{className:"ds-hint"},"按卡串行跑,每张卡一轮;失败的照旧自动开缺陷(最多一次 60 条)")),a("div",{className:"ds-row",style:{marginTop:8,flexWrap:"wrap",gap:8}},a("span",{className:"ds-hint"},"回归套件:"),j.length===0?a("span",{className:"ds-hint"},"还没有套件。把当前筛选存成套件,夜间就自动跑它。"):j.map(V=>a("span",{key:V.id,className:"ds-suite","data-default":V.isDefault?"1":"0"},a("span",{style:{cursor:"pointer"},title:"点一下只看这个套件里的用例,再点一次取消",onClick:()=>B(he=>he===V.id?null:V.id)},`📦 ${V.name}${V.isDefault?" · 默认":""} · ${M[V.id]??0} 条${q===V.id?"(只看中)":""}`),a("button",{className:"ds-btn ds-btn-ghost",disabled:_||(M[V.id]??0)===0,onClick:()=>void W(V)},"▶ 跑"),V.isDefault?null:a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void ke(V)},"设为默认"),a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void Ie(V),"data-danger":"1"},"删除"))),a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void $e()},"+ 存为套件")),L===""?null:a("div",{className:"ds-hint",style:{marginTop:6}},L),T.length===0?null:a("div",{className:"ds-reg-list"},a("span",{className:"ds-hint"},"最近回归:"),T.slice(0,4).map(V=>a("span",{key:String(V.at),className:"ds-reg-item","data-bad":(Number(V.failed)||0)+(Number(V.failedCards)||0)>0?"1":"0",title:`${new Date(V.at).toLocaleString("zh-CN")} · ${V.by||"人"}`},`${Qe(V.at)} ${V.by||""} · ${V.cards} 卡 / ${V.total} 条 · ✅${V.passed} ❌${V.failed}${V.bugs>0?` 🐞${V.bugs}`:""}`))),x!==null?a("div",{className:"ds-err"},x):null,f===null?a("div",{className:"ds-hint",style:{padding:"10px 2px"}},"载入用例…"):fe.length===0?a("div",{className:"ds-empty"},"没有符合条件的用例。用例登记在卡片详情的「测试」里。"):a("div",{className:"ds-case-lib"},fe.map(V=>a("div",{key:V.key,className:"ds-case-lib-wrap"},a("div",{className:"ds-case-lib-row","data-result":V.result,title:"打开所属卡片",onClick:()=>t(V.taskId)},a("span",{className:"ds-case-lib-pick",onClick:he=>he.stopPropagation()},a(p,{checked:C.has(V.key),disabled:_||!V.http,onChange:()=>te(V.key)})),a("span",{className:"ds-case-lib-result"},Vl[V.result]??V.result),a("span",{className:"ds-case-lib-title"},V.title),a("span",{className:"ds-case-lib-meta"},`${V.taskCode||V.taskId} · ${V.requirementTitle||"未挂需求"}${V.pointId?" · "+V.pointId:""}`),a("span",{className:"ds-case-lib-meta"},V.http?"接口":"手工"),a("span",{className:"ds-case-lib-pri"},V.priority),a("span",{className:"ds-case-lib-at"},V.lastRunAt>0?Qe(V.lastRunAt):"没跑过"),a("button",{className:"ds-btn ds-btn-ghost ds-case-lib-more",title:"看最近一次执行的明细",onClick:he=>{he.stopPropagation(),D(R===V.key?null:V.key)}},R===V.key?"收起":"明细")),R===V.key?a("div",{className:"ds-case-lib-detail"},a("div",null,`期望:${V.expected||"—"}`),a("div",null,`最近一次:${V.note||(V.lastRunAt>0?"只有结果,没有记录":"还没跑过")}`),V.lastError===""?null:a("div",{className:"ds-err"},`错误:${V.lastError}`),V.lastPreview===""?null:a("pre",{className:"ds-case-lib-preview"},V.lastPreview),a("div",{className:"ds-hint"},`用例编号 ${V.id} · 所属卡片 ${V.taskCode||V.taskId}`)):null))))))}function Zx({value:e,tone:t}){const{h:a,kit:n}=ht(),r=n("ProgressBar"),s=Math.max(0,Math.min(100,Number(e)||0));if(r!==null)return a(r,{value:s,tone:t});const o=t==="over"?"#e5484d":t==="warn"?"#d97706":void 0;return a("div",{className:"ds-an-track"},a("div",{className:"ds-an-fill",style:{width:`${s}%`,background:o}}))}function Jx({series:e}){const{h:t,kit:a}=ht(),n=Array.isArray(e)?e:[];if(n.length===0)return t("div",{className:"ds-empty"},"还没有数据。");const r=n.map(u=>Math.max(0,Number(u.remaining)||0)),s=Math.max(1,...r),o=n.length===1?100:100/(n.length-1),i=n.map((u,p)=>({x:p*o,y:38-r[p]/s*32,remaining:r[p],day:String(u.day??"")})),l=i.map((u,p)=>`${p===0?"M":"L"}${u.x.toFixed(2)},${u.y.toFixed(2)}`).join(" "),c=`${l} L100,40 L0,40 Z`;return t("div",{className:"ds-burn"},t("svg",{viewBox:"0 0 100 40",preserveAspectRatio:"none",className:"ds-burn-svg",role:"img","aria-label":"燃尽趋势"},t("path",{d:c,className:"ds-burn-area"}),t("path",{d:l,className:"ds-burn-line",vectorEffect:"non-scaling-stroke"}),i.map(u=>t("circle",{key:u.day,cx:u.x,cy:u.y,r:1.1,className:"ds-burn-dot"},t("title",{},`${u.day}:还剩 ${u.remaining} 张`)))),t("div",{className:"ds-burn-axis"},t("span",{},i[0].day),t("span",{},i[i.length-1].day)))}const ed=800;function rf(e){const t=String(e??"").replace(/\r\n?/g,`
|
|
43
43
|
`);if(t==="")return[];const a=t.split(`
|
|
44
|
-
`);return a.length>0&&a[a.length-1]===""&&a.pop(),a}function
|
|
45
|
-
`).map(Le=>Le.trim()).filter(Le=>Le!==""),z={id:le.id??`p${(B.points??[]).length+1}`,title:le.title,description:le.description??"",priority:le.priority??"normal",status:le.status??"draft",acceptance:Q.map((Le,Ve)=>({id:`a${Ve+1}`,text:Le,done:!1}))},ie=(B.points??[]).filter(Le=>Le.id!==z.id);await yt([...ie,z])},Is=async Q=>{B!==null&&await u("删除这个功能点?挂在上面的卡会变成「未归功能点」。",{title:"删除功能点",danger:!0,okText:"删除"})&&await yt((B.points??[]).filter(z=>z.id!==Q))},X=async(Q,z)=>{try{await i("/task/update",{id:Q,pointId:z}),B!==null&&await Je(B.id)}catch(ie){Z(ie.message)}},B=h.find(Q=>Q.id===S)??null,ee=Q=>e.tasks.filter(z=>z.requirementId===Q),ve=Q=>e.statuses.find(z=>z.id===Q)?.label??Q;o.useEffect(()=>{ae(null),Z(null),B!==null&&Je(B.id)},[B===null?"":B.id,Je]);const te=async()=>{if(_!==null){if(String(_.title??"").trim()===""){G("需求标题不能为空");return}P(!0);try{const Q=await i("/requirement/save",{requirement:{id:_.id,title:_.title,description:_.description,project:_.project,owner:_.owner,domain:_.domain??"",priority:_.priority,status:_.status,links:{prd:_.prd,proto:_.proto,acceptance:_.acceptance}}});C(Q.requirement.id),R(null),G(null),l(Q.created===!0?"需求已创建":"需求已保存")}catch(Q){G(Q.message)}finally{P(!1)}}},oe=async Q=>{if(B!==null)try{await i("/requirement/save",{requirement:{...B,links:B.links??{},status:Q}}),l("需求状态已更新")}catch(z){G(z.message)}},de=async Q=>{if(await u("删除这条需求?它下面的卡会保留,只是不再挂需求。",{title:"删除需求",danger:!0,okText:"删除"}))try{await i("/requirement/delete",{id:Q}),C(null)}catch(z){G(z.message)}},ge={pending:"待评审",approved:"评审通过",changes_requested:"评审打回"},[we,ye]=o.useState(!1),[Ee,tt]=o.useState(null),at=async(Q,z)=>{if(B!==null){ye(!0),tt(null);try{const ie=await i("/requirement/review",{id:B.id,decision:Q,note:z??"",by:c(),operator:c()});tt(`已${Q==="approve"?"通过":Q==="reject"?"打回":"提交"}评审:${ge[ie.review?.status]??""}`),typeof a=="function"&&a()}catch(ie){tt(ie.message)}finally{ye(!1)}}},ct=async()=>{const Q=await p("打回要给意见(会记在评审记录里):",{title:"评审打回",danger:!0,okText:"打回",placeholder:"写清楚哪里不满足,之后要据此改"});if(Q!==null){if(String(Q).trim()===""){tt("打回必须写意见");return}at("reject",String(Q).trim().slice(0,600))}},[qe,nt]=o.useState(!1),[et,$e]=o.useState(null),_t=async()=>{if(B!==null){nt(!0),$e(null);try{const z=(await i("/requirement/split",{id:B.id})).created??[];$e(z.length===0?"没有可拆的功能点:要么都覆盖了,要么还没加功能点。":`已建 ${z.length} 张卡:${z.map(ie=>ie.code||ie.id).join("、")}`),typeof a=="function"&&a()}catch(Q){$e(Q.message)}finally{nt(!1)}}},Fe=()=>({kind:"prd",title:"",url:B?.links?.prd??"",version:"v1.0",content:"",status:"draft"}),xt=async Q=>{if(F(null),Q===null){J(Fe());return}try{const ie=((await i("/requirement/get",{id:B.id})).requirement?.docs??[]).find(Le=>Le.id===Q);J(ie===void 0?Fe():{...ie})}catch(z){G(z.message)}},jt=async Q=>{if(M!==null&&M.id===Q){w(null);return}w({id:Q,content:"",busy:!0});try{const ie=((await i("/requirement/get",{id:B.id})).requirement?.docs??[]).find(Le=>Le.id===Q);w({id:Q,content:String(ie?.content??""),busy:!1})}catch(z){G(z.message),w(null)}},Qt=async()=>{if($!==null){Y(null);return}try{const z=(await i("/requirement/get",{id:B.id})).requirement??{},ie=z.baseline??null,Ve=[...z.docs??[]].sort((_n,Do)=>(Number(Do.at)||0)-(Number(_n.at)||0)),Ge=Ve.find(_n=>_n.kind==="prd")??Ve[0]??null;if(ie===null){Y(null),G("这条需求还没有基线,先挑一份文档「设为基线」");return}if(Ge===null){Y(null),G("这条需求还没有文档可以对比");return}const We=Jx(ie.content??"",Ge.content??"");Y({rows:We,summary:ew(We),version:ie.version,docTitle:Ge.title})}catch(Q){Y(null),G(Q instanceof Error?Q.message:String(Q))}},re=async()=>{if(I!==null){O(null);return}try{const Q=await i("/requirement/get",{id:B.id}),z={};for(const ie of Q.requirement?.docs??[])z[ie.id]=String(ie.content??"");O(z)}catch(Q){G(Q.message)}},ke=async()=>{if(W!==null){if(String(W.title??"").trim()===""){F("文档要有标题");return}Ne(!0);try{const Q=await i("/requirement/doc",{id:B.id,action:W.id===void 0?"add":"update",docId:W.id,doc:{kind:W.kind,title:W.title,url:W.url,version:W.version,content:W.content,status:W.status}});J(null),F(null)}catch(Q){F(Q.message)}finally{Ne(!1)}}},pe=async()=>{Se(!0),xe(null);try{const Q=await i("/requirement/folder",{id:B.id});xe(Q.ok?`云盘文件夹已就绪:${Q.folder?.url??""}`:`创建失败:${Q.error||Q.folder?.error||"未知原因"}`)}catch(Q){xe(Q.message)}finally{Se(!1)}},Va=async()=>{Se(!0),xe(null);try{const z=(await i("/requirement/sync",{id:B.id})).report??{},ie=Number(z.failed??0);xe(`归档完成:共 ${z.total??0} 件,成功 ${z.written??0} 件${ie>0?`,失败 ${ie} 件(${z.errors?.[0]??""})`:"。"}`)}catch(Q){xe(Q.message)}finally{Se(!1)}},St=async Q=>{try{await i("/requirement/doc",{id:B.id,action:"baseline",docId:Q,by:"人"}),F("这一版已生效,之后新建的卡都会记下它。")}catch(z){F(z.message)}},la=async()=>{try{await i("/requirement/doc",{id:B.id,action:"clear-baseline"}),F("基线已取消,需求回到「评审中」。")}catch(Q){F(Q.message)}},Pn=async Q=>{if(await u("删除这份文档?",{title:"删除文档",danger:!0,okText:"删除"}))try{await i("/requirement/doc",{id:B.id,action:"remove",docId:Q})}catch(z){F(z.message)}},Ra=async()=>{Ne(!0),F(null);try{const Q=await i("/requirement/pull",{url:W?.url??""});if(Q.ok===!0){const z=String(Q.text??"");J(ie=>({...ie,title:String(ie?.title??"").trim()===""?String(Q.title??""):ie.title,content:z})),F(`已拉取 ${z.length} 字正文${Q.title?`,标题取自文档「${Q.title}」`:""}。`)}else F(Q.error??"拉取失败")}catch(Q){F(Q.message)}finally{Ne(!1)}},Dt=_===null?null:s("div",{className:"ds-panel ds-form-panel"},s("div",{className:"ds-panel-head"},_.id===void 0?"新建需求":`编辑 ${B?.code??""}`),s("div",{className:"ds-panel-body"},s("div",{className:"ds-field"},s("div",{className:"ds-label"},"需求标题"),s(v,{className:"ds-input",value:_.title,onChange:Q=>R({..._,title:Q.target.value})})),s("div",{className:"ds-row"},s("div",{className:"ds-field",style:{flex:1}},s("div",{className:"ds-label"},"业务项目"),s(g,{className:"ds-select",value:_.project,onChange:Q=>R({..._,project:Q.target.value})},s("option",{value:""},"不指定"),y.map(Q=>s("option",{key:Q.id,value:Q.id},Q.name)))),s("div",{className:"ds-field",style:{flex:1}},s("div",{className:"ds-label"},"状态"),s(g,{className:"ds-select",value:_.status,onChange:Q=>R({..._,status:Q.target.value})},Yp.map(Q=>s("option",{key:Q,value:Q},Tr[Q])))),s("div",{className:"ds-field",style:{flex:1}},s("div",{className:"ds-label"},"业务负责人"),s(v,{className:"ds-input",value:_.owner,onChange:Q=>R({..._,owner:Q.target.value})})),s("div",{className:"ds-field",style:{flex:1}},s("div",{className:"ds-label"},"业务领域"),s(v,{className:"ds-input",placeholder:"支付 / 风控 / 会员(决定派给哪位领域专家)",value:_.domain??"",onChange:Q=>R({..._,domain:Q.target.value})}))),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"PRD 链接"),s(v,{className:"ds-input",placeholder:"https://…(飞书云文档)",value:_.prd,onChange:Q=>R({..._,prd:Q.target.value})})),s("div",{className:"ds-row"},s("div",{className:"ds-field",style:{flex:1}},s("div",{className:"ds-label"},"原型链接"),s(v,{className:"ds-input",value:_.proto,onChange:Q=>R({..._,proto:Q.target.value})})),s("div",{className:"ds-field",style:{flex:1}},s("div",{className:"ds-label"},"验收标准链接"),s(v,{className:"ds-input",value:_.acceptance,onChange:Q=>R({..._,acceptance:Q.target.value})}))),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"需求正文 / PRD 摘要"),s(d,{className:"ds-textarea",rows:10,style:{minHeight:180},placeholder:"支持 Markdown:`# 背景`、`- 列表`、`**重点**`、`` `代码` ``、`| 表格 |`;保存后在「需求明细」里按 Markdown 渲染,不再截断。",value:_.description,onChange:Q=>R({..._,description:Q.target.value})})),s("div",{className:"ds-row",style:{justifyContent:"flex-end",gap:8}},s("button",{className:"ds-btn",onClick:()=>{R(null),G(null)}},"取消"),s("button",{className:"ds-btn ds-btn-primary",disabled:L,onClick:()=>void te()},L?"保存中…":"保存需求")))),Ot=B===null?s("div",{className:"ds-empty"},"左边选一条需求,或先新建一条。"):(()=>{const Q=ee(B.id),z=Q.filter(D=>D.status==="done").length,ie=Q.filter(D=>D.blocked!==void 0&&D.blocked!==null).length,Le=Q.filter(D=>D.type==="bug"&&D.status!=="done").length,Ve=Q.reduce((D,ce)=>{const Me=Kl(ce);return{done:D.done+Me.done,total:D.total+Me.total}},{done:0,total:0}),Ge=Q.reduce((D,ce)=>{const Me=Gl(ce);return{pass:D.pass+Me.pass,total:D.total+Me.total}},{pass:0,total:0}),We=Q.flatMap(D=>(D.artifacts??[]).map(ce=>({...ce,task:D}))),_n=Q.filter(D=>(D.gitlabMR?.iid??0)>0),Do=Ge.pass,an=B.links??{},nn=B.folder??{},ds=(D,ce)=>ce===""?null:s("a",{className:"ds-link",href:ce,target:"_blank",rel:"noreferrer"},D);return s("div",{className:"ds-req-body"},s("div",{className:"ds-req-headline"},s("div",null,s("div",{className:"ds-req-code"},B.code||B.id),s("div",{className:"ds-req-name"},B.title)),s("div",{className:"ds-req-actions"},s(g,{className:"ds-select",value:B.status,onChange:D=>void oe(D.target.value)},Yp.map(D=>s("option",{key:D,value:D},Tr[D]))),s("button",{className:"ds-btn",onClick:()=>R({...B,...an})},"编辑"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void de(B.id),"data-danger":"1"},"删除"))),(()=>{const D=B.review??null,ce=D===null?"还没提交评审":ge[D.status]??D.status,Me=D===null||D.status==="changes_requested",ht=D!==null&&D.status==="pending";return s("div",{className:"ds-panel","data-review":D===null?"none":D.status,style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"需求评审"),s(b,{className:"ds-chip","data-on":D?.status==="approved"?"1":"0",style:{marginLeft:8}},ce),D===null||D.at===0?null:s("span",{className:"ds-hint",style:{marginLeft:"auto"}},`${Ye(D.at)}${D.by===""?"":` · ${D.by}`}`)),s("div",{className:"ds-panel-body"},D!==null&&String(D.note??"")!==""?s("div",{className:"ds-hint",style:{marginBottom:8}},`评审意见:${D.note}`):null,s("div",{className:"ds-row",style:{flexWrap:"wrap",gap:8}},Me?s("button",{className:"ds-btn ds-btn-primary",disabled:we,onClick:()=>void at("submit")},we?"提交中…":"提交评审"):null,ht?s("button",{className:"ds-btn ds-btn-primary",disabled:we,onClick:()=>void at("approve")},"评审通过"):null,ht?s("button",{className:"ds-btn ds-btn-ghost",disabled:we,onClick:ct,"data-danger":"1"},"打回"):null,D?.status==="approved"?s("span",{className:"ds-hint"},"评审已通过,可以拆卡和派活了。"):null),Ee===null?null:s("div",{className:"ds-hint",style:{marginTop:8}},Ee)))})(),ds("PRD",an.prd)||ds("原型",an.proto)||ds("验收标准",an.acceptance)?s("div",{className:"ds-req-links"},ds("PRD 文档",an.prd),ds("原型",an.proto),ds("验收标准",an.acceptance)):s("div",{className:"ds-empty"},[s("span",null,"还没有登记 PRD / 原型 / 验收标准链接;PRD 与原型由产品在澄清后输出,可在这里补,或点右边「让产品补 PRD」。"),s("button",{className:"ds-btn ds-btn-ghost",style:{marginLeft:8},onClick:async()=>{const D=await p("想请产品补什么?",{title:"申请产品补 PRD",defaultValue:"需要产品输出 PRD 与原型"});if(D!==null)try{await i("/requirement/request-prd",{id:B.id,by:c(),note:D}),l("已申请产品补 PRD"),a()}catch(ce){l(ce.message??String(ce),"error")}}},"让产品补 PRD")]),B.description?s("div",{className:"ds-panel ds-req-desc-panel",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"需求明细"),B.source==="business"?s("span",{className:"ds-hint","data-src":"business"},`业务提单 · ${B.requester?.name||"未署名"}${B.requester?.dept?"("+B.requester.dept+")":""} · ${Ye(B.requester?.at||B.createdAt)}`):null,s("span",{className:"ds-hint",style:{marginLeft:"auto"}},"支持 Markdown")),s("div",{className:"ds-panel-body"},s("div",{className:"ds-req-desc ds-md"},f(B.description)))):s("div",{className:"ds-req-desc ds-hint"},"还没有写需求描述:产品背景、要解决的问题、验收口径都建议写在这里,点右侧「编辑」补上。"),(()=>{const D=(B.history??[]).slice().reverse();if(D.length===0||(B.change??null)!==null)return null;const ce={title:"标题",description:"需求明细",priority:"优先级",status:"状态",owner:"负责人",project:"项目",iteration:"迭代"};return s("div",{className:"ds-panel ds-history-panel",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"变更记录"),s("span",{className:"ds-hint",style:{marginLeft:"auto"}},`最近 ${D.length} 条`)),s("div",{className:"ds-panel-body"},s("div",{style:{display:"flex",flexDirection:"column",gap:6,maxHeight:260,overflowY:"auto"}},D.map((Me,ht)=>s("div",{key:`${Me.at}-${ht}`,style:{display:"flex",gap:8,alignItems:"baseline",fontSize:12}},s("span",{className:"ds-hint",style:{flex:"0 0 auto",fontVariantNumeric:"tabular-nums"}},Ye(Me.at)),s("span",{style:{flex:"0 0 auto"}},Me.by===""?"人":Me.by),s("span",{className:"ds-chip",style:{flex:"0 0 auto"}},ce[Me.field]??Me.field),s("span",{className:"ds-hint",style:{minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}},`${Me.from===""?"(空)":Me.from} → ${Me.to===""?"(空)":Me.to}`))))))})(),(()=>{const D=B.pool??{reach:0,impact:0,confidence:0,effort:0,score:0},ce=async(ht,da,st)=>{const Ie=await p(da,{title:ht,defaultValue:String(st??0)});if(Ie===null)return null;const Ke=Number(String(Ie).trim());return Number.isFinite(Ke)&&Ke>=0?Ke:null},Me=async()=>{const ht=await ce("影响面 Reach","影响多少用户或多少笔交易?估算依据写进正文",D.reach);if(ht===null)return;const da=await ce("影响度 Impact","3 显著 / 2 高 / 1 中 / 0.5 低",D.impact);if(da===null)return;const st=await ce("置信度 Confidence","100 有数据 / 80 有访谈 / 50 只有猜测(百分数)",D.confidence);if(st===null)return;const Ie=await ce("成本 Effort","人日(研发+测试+联调)",D.effort);if(Ie!==null)try{await i("/requirement/pool",{id:B.id,pool:{reach:ht,impact:da,confidence:st,effort:Ie}}),l("需求池评分已更新"),await a()}catch(Ke){l(Ke instanceof Error?Ke.message:String(Ke),"error")}};return s("div",{className:"ds-panel ds-pool-panel",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"需求池评分(RICE)"),s("span",{className:"ds-hint",style:{marginLeft:"auto"}},D.score>0?`得分 ${D.score}`:"还没打分:不打分就没法和别的需求比优先级"),s("button",{className:"ds-btn ds-btn-ghost",style:{marginLeft:8},onClick:()=>void Me()},D.score>0?"重新打分":"打分")),D.score>0?s("div",{className:"ds-panel-body"},s("div",{className:"ds-row",style:{flexWrap:"wrap",gap:8}},s("span",{className:"ds-chip"},`影响面 ${D.reach}`),s("span",{className:"ds-chip"},`影响度 ${D.impact}`),s("span",{className:"ds-chip"},`置信度 ${D.confidence}%`),s("span",{className:"ds-chip"},`成本 ${D.effort} 人日`),s("span",{className:"ds-chip","data-on":"1"},`得分 ${D.score}`))):null)})(),(()=>{const D=B.questions??[],ce=D.filter(Ie=>Ie.status==="open").length,Me=async(Ie,Ke)=>{try{await i("/requirement/questions",{id:B.id,...Ie}),Ke&&l(Ke),await a()}catch(In){l(In instanceof Error?In.message:String(In),"error")}},ht=async()=>{const Ie=await p("还没确认清楚的问题是什么?",{title:"加一个待确认问题",placeholder:"例如:退款失败时是否允许人工补发?"});Ie===null||Ie.trim()===""||await Me({action:"add",text:Ie},"已加入待确认清单")},da=async Ie=>{const Ke=await p(Ie.text,{title:"回答这个问题",defaultValue:Ie.answer??"",placeholder:"写清结论与依据"});Ke===null||Ke.trim()===""||await Me({action:"answer",questionId:Ie.id,answer:Ke},"已回答")},st=async Ie=>{await u("删掉这个问题?",{title:"删除待确认项",danger:!0,okText:"删除"})===!0&&await Me({action:"delete",questionId:Ie.id},"已删除")};return s("div",{className:"ds-panel ds-question-panel","data-open":ce>0?"1":"0",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"待确认清单"),s("span",{className:"ds-hint",style:{marginLeft:"auto"}},ce>0?`${ce} 个没回答,回答完才能拆卡`:D.length===0?"澄清阶段把不确定的先记在这里":"全部已回答"),s("button",{className:"ds-btn ds-btn-ghost",style:{marginLeft:8},onClick:()=>void ht()},"+ 加问题")),s("div",{className:"ds-panel-body"},D.length===0?s("div",{className:"ds-empty"},"还没有待确认的问题。产品澄清时把「需要业务拍板」的点写在这里,避免猜业务规则。"):s("div",{style:{display:"flex",flexDirection:"column",gap:8}},D.map(Ie=>s("div",{key:Ie.id,className:"ds-question-row","data-status":Ie.status,style:{display:"flex",gap:10,alignItems:"flex-start",padding:"8px 10px",border:"1px solid var(--border)",borderRadius:8,background:"var(--card)"}},s("span",{className:"ds-chip","data-on":Ie.status==="answered"?"1":"0"},Ie.status==="answered"?"已回答":"待回答"),s("div",{style:{flex:"1 1 auto",minWidth:0}},s("div",{style:{fontSize:13}},Ie.text),Ie.answer===""||Ie.answer===void 0?null:s("div",{className:"ds-hint",style:{marginTop:4}},`答:${Ie.answer}`)),s("div",{style:{display:"flex",gap:6,flex:"0 0 auto"}},s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void da(Ie)},Ie.status==="answered"?"改答案":"回答"),s("button",{className:"ds-btn ds-btn-ghost","data-danger":"1",onClick:()=>void st(Ie)},"删除")))))))})(),(()=>{const D=B.change??null;if(D===null)return null;const ce=D.affected??[],Me=D.affectedCases??[],ht=new Map(Q.map(st=>[st.id,st])),da=st=>e.statuses.find(Ie=>Ie.id===st)?.label??st;return s("div",{className:"ds-panel ds-change-panel","data-invalidated":D.invalidated?"1":"0",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,D.invalidated?"变更影响(签字已作废)":"变更影响"),s("span",{className:"ds-hint",style:{marginLeft:"auto"}},`${Ye(D.at)}${D.by===""?"":` · ${D.by}`}`)),s("div",{className:"ds-panel-body"},function(){const st=(B.history??[]).slice().reverse();if(st.length===0)return null;const Ie={title:"标题",description:"需求明细",priority:"优先级",status:"状态",owner:"负责人",project:"项目",iteration:"迭代"};return s("div",{style:{display:"flex",flexDirection:"column",gap:6,maxHeight:220,overflowY:"auto",marginBottom:8,paddingBottom:8,borderBottom:"1px dashed var(--border)"}},s("div",{className:"ds-hint",style:{fontWeight:600}},`变更记录 · 最近 ${st.length} 条`),st.map((Ke,In)=>s("div",{key:`${Ke.at}-${In}`,style:{display:"flex",gap:8,alignItems:"baseline",fontSize:12}},s("span",{className:"ds-hint"},Ye(Ke.at)),s("span",null,Ke.by===""?"人":Ke.by),s("span",{className:"ds-chip"},Ie[Ke.field]??Ke.field),s("span",{className:"ds-hint"},`${Ke.from===""?"(空)":Ke.from} → ${Ke.to===""?"(空)":Ke.to}`))))}(),s("div",{className:"ds-hint"},`改了:${(D.parts??[]).join("、")}。${ce.length===0?"当时没有已产出的卡受影响,不用返工。":`${ce.length} 张卡已经产出过东西${Me.length===0?"":`、${Me.length} 条用例要重跑`},要按新版复核:`}`),ce.length===0?null:s("div",{className:"ds-row",style:{flexWrap:"wrap",gap:8,marginTop:8}},ce.map(st=>s("span",{key:st.id,className:"ds-chip","data-pt":"open",style:{cursor:"pointer"},title:st.title,onClick:()=>{const Ie=ht.get(st.id);Ie!==void 0&&typeof t=="function"&&t(Ie)}},`${st.code||st.id} ${da(st.status)}`))),D.invalidated?s("div",{className:"ds-hint",style:{marginTop:8}},"验收签字已清空:这些卡是按旧版做的,复核完重新签一次。"):null))})(),(()=>{const D=B.deploys??[];return D.length===0?null:s("div",{className:"ds-panel",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"上线足迹"),s("span",{className:"ds-hint",style:{marginLeft:"auto"}},"来自版本的部署记录,只留痕不触发")),s("div",{className:"ds-panel-body"},s("div",{className:"ds-row",style:{flexWrap:"wrap",gap:8}},D.map(ce=>s("span",{key:ce.id,className:"ds-chip","data-env":ce.kind,title:`${ce.releaseName??""} · ${Ye(ce.at)} · ${ce.by}`},`${ce.name} · ${Wa(ce.at)}`)))))})(),s("div",{className:"ds-panel",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"依赖与排序")),s("div",{className:"ds-panel-body"},s("div",{className:"ds-row"},s("span",{className:"ds-hint"},"排序号"),s(v,{className:"ds-input",style:{width:90},value:Ue,onChange:D=>qa(D.target.value)}),s("span",{className:"ds-hint"},"被依赖的需求没交付,这条需求的准出会被拦")),s("div",{className:"ds-row",style:{flexWrap:"wrap",gap:10}},h.filter(D=>D.id!==B.id).map(D=>s("label",{key:D.id,className:"ds-check-row"},s(k,{checked:Tn.includes(D.id),onChange:ce=>q(Me=>ce.target.checked?[...Me,D.id]:Me.filter(ht=>ht!==D.id))}),s("span",{className:"ds-check-text"},`${D.code||D.id} ${D.title}(${Tr[D.status]??D.status})`))),h.length<=1?s("span",{className:"ds-hint"},"只有这一条需求,暂时没有可依赖的对象。"):null),s("div",{className:"ds-row"},s("button",{className:"ds-btn ds-btn-primary",onClick:()=>void Pt()},"保存排序与依赖"),me===null?null:s("span",{className:"ds-hint"},me)))),(()=>{const D=B.progress??null,ce=D?.gate??{ready:!1,blockers:["还没有加载出准出状态,稍后自动刷新"],warnings:[]},Me=ce.stats??{},ht=B.signoff??null,da=D?.progress??(Q.length===0?0:Math.round(z/Q.length*100)),st=Me.coveredPoints??0,Ie=Me.points??(B.points??[]).length,Ke=Me.pass??Do,In=Me.cases??Ge.total;return s("div",{className:"ds-panel",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"需求准出与验收签字"),s(b,{className:"ds-chip","data-pt":ce.ready?"covered":"open",style:{marginLeft:"auto"}},ce.ready?"可以交付":`还差 ${ce.blockers.length} 项`)),s("div",{className:"ds-panel-body"},s("div",{className:"ds-check-progress"},s("div",{className:"ds-check-bar","data-full":da===100?"1":"0"},s("span",{style:{width:`${da}%`}})),s("div",{className:"ds-hint"},`${da}% · ${z}/${Q.length} 张卡完成 · 功能点覆盖 ${st}/${Ie} · 用例通过 ${Ke}/${In}`)),(ce.blockers??[]).map(sn=>s("div",{key:sn,className:"ds-gate-item","data-kind":"block"},`⛔ ${sn}`)),(ce.warnings??[]).map(sn=>s("div",{key:sn,className:"ds-gate-item","data-kind":"warn"},`⚠ ${sn}`)),ce.ready?s("div",{className:"ds-hint"},"门禁已通过:签完字这条需求就算交付。"):null,ht===null?s("div",{className:"ds-gate-sign"},s(v,{className:"ds-input",style:{flex:1,minWidth:220},placeholder:"验收结论:交付了什么、遗留什么",value:H,onChange:sn=>Ce(sn.target.value)}),s("button",{className:"ds-btn ds-btn-primary",onClick:()=>void Vt("sign")},"需求验收签字")):s("div",{className:"ds-gate-sign"},s("div",{className:"ds-hint",style:{flex:1}},`✍ ${ht.by} 于 ${Ye(ht.at)} 签字:${ht.note}`),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void Vt("clear")},"取消签字")),be===null?null:s("div",{className:"ds-hint"},be)))})(),s("div",{className:"ds-sec-head",style:{marginTop:16}},"交付物归档(飞书云盘)",s("div",{className:"ds-req-actions"},nn.url?s("a",{className:"ds-link",href:nn.url,target:"_blank",rel:"noreferrer"},"打开文件夹"):null,s("button",{className:"ds-btn ds-btn-ghost",disabled:He,onClick:()=>void pe()},nn.url?"校验文件夹":"创建文件夹"),s("button",{className:"ds-btn",disabled:He||We.length===0,onClick:()=>void Va()},He?"归档中…":`归档 ${We.length} 件交付物`))),s("div",{className:"ds-hint"},nn.url?`文件夹:${nn.name||nn.token} 已归档 ${We.filter(D=>D.doc?.url).length}/${We.length} 件交付物`:nn.error?`上次创建失败:${nn.error}`:"还没有云盘文件夹;建好后,这条需求下每件交付物都会写成文件夹里的一份 Markdown 文档。"),fe?s("div",{className:"ds-hint"},fe):null,s("div",{className:"ds-sec-head",style:{marginTop:16}},"文档与基线",s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void xt(null)},"+ 添加文档")),B.baseline?s("div",{className:"ds-base-box"},s("div",{className:"ds-base-main"},s("b",null,`当前基线 ${B.baseline.version}`),s("span",null,`${B.baseline.title} · 生效于 ${Ye(B.baseline.at)} · ${B.baseline.by||"人"} · 正文 ${B.baseline.contentLength??0} 字`)),s("button",{className:"ds-btn ds-btn-ghost",title:"把当前文档和这份基线逐行比一遍(只读)",onClick:()=>void Qt()},$===null?"对比基线":"收起对比"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void la()},"取消基线")):s("div",{className:"ds-base-box","data-empty":"1"},s("div",{className:"ds-base-main"},s("b",null,"还没有基线"),s("span",null,"PRD 评审通过后点「设为基线」,之后建的卡都会记下用的是哪一版。"))),B.baseline!==null&&$!==null?s("div",{className:"ds-diff"},s("div",{className:"ds-diff-head"},s("b",null,`基线 ${$.version} → 当前:${$.docTitle}`),s("span",{className:"ds-hint"},$.summary.added+$.summary.removed===0?"正文没有变化":`+${$.summary.added} 行 / −${$.summary.removed} 行`)),s("div",{className:"ds-diff-body"},$.rows.slice(0,400).map((D,ce)=>s("div",{key:ce,className:"ds-diff-line","data-kind":D.kind},`${D.kind==="add"?"+":D.kind==="del"?"−":" "} ${D.text}`)),$.rows.length>400?s("div",{className:"ds-hint"},`(还有 ${$.rows.length-400} 行未显示)`):null)):null,(B.docs??[]).length===0?s("div",{className:"ds-hint",style:{marginTop:8}},"还没有登记文档。可以先加 PRD 链接,把正文粘进来,评审通过后设为基线。"):s("div",null,s("div",{className:"ds-row",style:{marginTop:8,gap:8,alignItems:"center"}},s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void re()},I===null?"全部展开":"全部收起"),s("span",{className:"ds-hint"},`共 ${(B.docs??[]).length} 篇,展开后可直接读 Markdown 正文`)),s("div",{className:"ds-doc-list"},(B.docs??[]).map(D=>s("div",{key:D.id,className:"ds-doc-wrap"},s("div",{className:"ds-doc-row"},s(b,{className:"ds-chip","data-doc":D.kind},Qp[D.kind]??D.kind),s("div",{className:"ds-doc-main"},s("div",{className:"ds-doc-title"},D.url===""?D.title:s("a",{className:"ds-link",href:D.url,target:"_blank",rel:"noreferrer"},D.title),s("span",{className:"ds-chip-code"},D.version),s(b,{className:"ds-chip","data-docstatus":D.status},rx[D.status]??D.status)),s("div",{className:"ds-doc-meta"},`正文 ${D.contentLength??0} 字 · ${D.by||"—"} · ${D.at>0?Ye(D.at):"—"}`)),s("div",{className:"ds-listrow-actions"},D.status==="baseline"?null:s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void St(D.id)},"设为基线"),s("button",{className:"ds-btn ds-btn-ghost",title:"直接读正文(Markdown 渲染)",onClick:()=>void jt(D.id)},M!==null&&M.id===D.id?"收起":"阅读"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void xt(D.id)},"编辑"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void Pn(D.id),"data-danger":"1"},"删除"))),M!==null&&M.id===D.id?s("div",{className:"ds-md-preview ds-reader"},M.busy?s("span",{className:"ds-hint"},"读取中…"):M.content.trim()===""?s("span",{className:"ds-hint"},"这条文档还没有正文。"):f(M.content)):I!==null&&I[D.id]!==void 0?s("div",{className:"ds-md-preview ds-reader"},I[D.id].trim()===""?s("span",{className:"ds-hint"},"这条文档还没有正文。"):f(I[D.id])):null)))),V===null?null:s("div",{className:"ds-hint",style:{marginTop:6}},V),W===null?null:s("div",{className:"ds-panel ds-form-panel",style:{marginTop:10}},s("div",{className:"ds-panel-head"},W.id===void 0?"添加文档":`编辑 ${W.title}`),s("div",{className:"ds-panel-body"},s("div",{className:"ds-row",style:{gap:10}},s("div",{className:"ds-field",style:{flex:"0 0 150px"}},s("div",{className:"ds-label"},"类型"),s(g,{className:"ds-select",value:W.kind,onChange:D=>J({...W,kind:D.target.value})},sx.map(D=>s("option",{key:D,value:D},Qp[D])))),s("div",{className:"ds-field",style:{flex:"1 1 220px"}},s("div",{className:"ds-label"},"标题"),s(v,{className:"ds-input",value:W.title,placeholder:"例如 会员积分抵扣 PRD",onChange:D=>J({...W,title:D.target.value})})),s("div",{className:"ds-field",style:{flex:"0 0 110px"}},s("div",{className:"ds-label"},"版本"),s(v,{className:"ds-input",value:W.version,placeholder:"v1.0",onChange:D=>J({...W,version:D.target.value})}))),s("div",{className:"ds-row",style:{gap:10}},s("div",{className:"ds-field",style:{flex:"1 1 auto"}},s("div",{className:"ds-label"},"飞书文档链接"),s(v,{className:"ds-input",value:W.url,placeholder:"https://<租户>.feishu.cn/wiki/…",onChange:D=>J({...W,url:D.target.value})})),s("div",{className:"ds-field",style:{flex:"0 0 auto",justifyContent:"flex-end"}},s("div",{className:"ds-label"}," "),s("button",{className:"ds-btn",disabled:K,onClick:()=>void Ra()},K?"拉取中…":"从链接拉正文"))),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"文档正文(拉不到就自己粘,研发和测试都读这一份)"),s(d,{className:"ds-textarea",rows:8,value:W.content,onChange:D=>J({...W,content:D.target.value})})),s("div",{className:"ds-row",style:{justifyContent:"flex-end",gap:8}},s("button",{className:"ds-btn",onClick:()=>{J(null),F(null)}},"取消"),s("button",{className:"ds-btn ds-btn-primary",disabled:K,onClick:()=>void ke()},"保存文档")))),s("div",{className:"ds-pane-head",style:{marginTop:16}},s("div",{className:"ds-pane-title"},"功能点与可追溯矩阵"),s("div",{className:"ds-pane-desc"},"功能点是需求的骨架:一条功能点对若干张卡、若干条用例。卡和用例上都挂 pointId,这里就能看出哪条没人做、哪条没被验证。")),U===null?s("div",{className:"ds-hint",style:{padding:"6px 0"}},"还没有功能点。点「+ 加功能点」把需求拆成可交付、可验证的条目。"):s("div",{className:"ds-matrix"},s("div",{className:"ds-matrix-sum"},`功能点 ${U.summary.points} · 已覆盖 ${U.summary.coveredPoints}${U.summary.pointsWithoutCases>0?`(${U.summary.pointsWithoutCases} 条还没有用例,覆盖率 ${U.summary.coverageRate}%)`:""} · 卡 ${U.summary.cards}(未归点 ${U.summary.looseCards})· 用例 ${U.summary.cases}(通过 ${U.summary.pass}${U.summary.fail>0?`,失败 ${U.summary.fail}`:""})· 通过率 ${U.summary.passRate}%`),(U.points??[]).map(D=>s("div",{key:D.id,className:"ds-pt-row","data-covered":D.covered?"1":"0"},s("div",{className:"ds-pt-main"},s("div",{className:"ds-pt-title"},s("span",{className:"ds-chip-code"},D.id),s("b",null,D.title),s(b,{className:"ds-chip","data-pt":D.covered?"covered":"open"},D.covered?"已覆盖":"未覆盖")),String(D.description??"")===""?null:s("div",{className:"ds-req-desc ds-md"},f(D.description)),s("div",{className:"ds-pt-meta"},`卡 ${D.cards.length}${D.cards.length===0?"(还没人做)":":"+D.cards.map(ce=>ce.code||ce.id).join("、")}`,` · 用例 ${D.cases.total}(通过 ${D.cases.pass}${D.cases.fail>0?`,失败 ${D.cases.fail}`:""}${D.cases.pending>0?`,没跑 ${D.cases.pending}`:""})`,D.acceptance.length===0?"":` · 验收条件 ${D.acceptance.filter(ce=>ce.covered).length}/${D.acceptance.length}`)),s("div",{className:"ds-listrow-actions"},s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>he({...D,acceptanceText:(D.acceptance??[]).map(ce=>ce.text).join(`
|
|
46
|
-
`)})},"编辑"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void Is(D.id),"data-danger":"1"},"删除")))),(U.loose??[]).length===0?null:s("div",{className:"ds-pt-loose"},s("div",{className:"ds-hint",style:{marginBottom:6}},`还有 ${U.loose.length} 张卡没归到功能点,选一个挂上去,矩阵才算完整:`),U.loose.map(D=>s("div",{key:D.id,className:"ds-pt-loose-row"},s("span",{className:"ds-chip-code"},D.code||D.id),s("span",{className:"ds-pt-loose-title"},D.title),s(g,{className:"ds-select",style:{width:220},value:"",onChange:ce=>{ce.target.value!==""&&X(D.id,ce.target.value)}},s("option",{value:""},"挂到…"),(U.points??[]).map(ce=>s("option",{key:ce.id,value:ce.id},`${ce.id} ${ce.title}`))))))),s("div",{className:"ds-row",style:{gap:8,marginTop:10,alignItems:"center"}},s("button",{className:"ds-btn",onClick:()=>he(ls())},"+ 加功能点"),s("button",{className:"ds-btn ds-btn-primary",disabled:qe,onClick:()=>void _t()},qe?"拆卡中…":"按未覆盖的功能点拆卡"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>{B!==null&&Je(B.id)}},"刷新矩阵"),et===null?null:s("span",{className:"ds-hint"},et),Te===null?null:s("span",{className:"ds-hint"},Te)),le===null?null:s("div",{className:"ds-panel ds-form-panel",style:{marginTop:10}},s("div",{className:"ds-panel-head"},le.id===void 0?"新增功能点":`编辑功能点 ${le.id}`),s("div",{className:"ds-panel-body"},s("div",{className:"ds-field"},s("div",{className:"ds-label"},"功能点标题"),s(v,{className:"ds-input",value:le.title,placeholder:"例如 结算页展示可用积分",onChange:D=>he({...le,title:D.target.value})})),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"说明"),s(d,{className:"ds-textarea",rows:3,value:le.description??"",onChange:D=>he({...le,description:D.target.value})})),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"验收条件(一行一条,做成什么样算完成)"),s(x,{className:"ds-textarea",rows:4,value:le.acceptanceText??"",onChange:D=>he({...le,acceptanceText:D.target.value})})),s("div",{className:"ds-row",style:{gap:10}},s("div",{className:"ds-field",style:{flex:"0 0 150px"}},s("div",{className:"ds-label"},"优先级"),s(g,{className:"ds-select",value:le.priority,onChange:D=>he({...le,priority:D.target.value})},s("option",{value:"urgent"},"紧急"),s("option",{value:"normal"},"普通"),s("option",{value:"relaxed"},"可缓"))),s("div",{className:"ds-field",style:{flex:"0 0 150px"}},s("div",{className:"ds-label"},"状态"),s(g,{className:"ds-select",value:le.status,onChange:D=>he({...le,status:D.target.value})},s("option",{value:"draft"},"草稿"),s("option",{value:"ready"},"就绪"),s("option",{value:"done"},"已完成")))),s("div",{className:"ds-row",style:{justifyContent:"flex-end",gap:8}},s("button",{className:"ds-btn",onClick:()=>he(null)},"取消"),s("button",{className:"ds-btn ds-btn-primary",onClick:()=>void wa()},"保存功能点")))),s("div",{className:"ds-req-stats"},s("div",{className:"ds-stat-box"},s("b",null,`${z}/${Q.length}`),s("span",null,"卡已完成")),s("div",{className:"ds-stat-box","data-warn":ie>0?"1":"0"},s("b",null,String(ie)),s("span",null,"阻塞")),s("div",{className:"ds-stat-box","data-warn":Le>0?"1":"0"},s("b",null,String(Le)),s("span",null,"未结缺陷")),s("div",{className:"ds-stat-box"},s("b",null,`${Ve.done}/${Ve.total}`),s("span",null,"验收清单")),s("div",{className:"ds-stat-box"},s("b",null,`${Ge.pass}/${Ge.total}`),s("span",null,"用例通过")),s("div",{className:"ds-stat-box"},s("b",null,String(We.length)),s("span",null,"交付物")),s("div",{className:"ds-stat-box"},s("b",null,String(_n.length)),s("span",null,"MR"))),s("div",{className:"ds-sec-head",style:{marginTop:14}},`这张需求下的 ${Q.length} 张卡`),Q.length===0?s("div",{className:"ds-empty"},"还没有挂上来的卡。建卡时选择这条需求,编号会自动分配。"):s("div",{className:"ds-req-tasks"},Q.map(D=>s("div",{key:D.id,className:"ds-listrow ds-req-task",onClick:()=>t(D.id)},s("div",{className:"ds-listrow-main"},s("div",{className:"ds-req-task-title"},D.code?s(b,{className:"ds-chip ds-chip-code"},D.code):null,s("span",null,D.title)),s("div",{className:"ds-hint"},`${ve(D.status)}${(()=>{const ce=D.expert===""?"":(e.config.experts??[]).find(Me=>Me.id===D.expert)?.name??D.expert;return ce===""?"":` · ${ce}`})()}${D.dueAt>0?` · 截止 ${Wa(D.dueAt)}`:""}`)),s("div",{className:"ds-listrow-actions"},D.blocked!==void 0&&D.blocked!==null?s(b,{className:"ds-chip ds-chip-blocked"},"⛔"):null,D.type==="bug"?s(b,{className:"ds-chip ds-chip-bug","data-sev":D.severity??"p2"},"BUG"):null)))),_n.length>0?s("div",null,s("div",{className:"ds-sec-head",style:{marginTop:14}},"关联 MR"),_n.map(D=>s("div",{key:D.id,className:"ds-hint"},`${D.code||D.id} · !${D.gitlabMR.iid} ${D.gitlabMR.title??""}(${D.gitlabMR.state||"open"})`))):null)})();return s("div",{className:"ds-body"},A!==null?s("div",{className:"ds-err",style:{marginBottom:10}},A):null,Dt,s("div",{className:"ds-req-grid"},s("div",{className:"ds-intake-launch",style:{display:"flex",gap:8,padding:"0 0 8px"}},s("span",{className:"ds-hint"},"新建需求请用右上角「+ 新建」")),s("div",{className:"ds-req-list"},s("div",{className:"ds-req-list-head"},s("span",null,`需求 ${h.length}`),s("button",{className:"ds-btn ds-btn-ghost",style:{marginLeft:8},title:"按来源筛选:全部 / 业务提单 / 内部",onClick:()=>{const Q=window.localStorage.getItem("dsh-studio:reqsrc")??"all";window.localStorage.setItem("dsh-studio:reqsrc",Q==="all"?"business":Q==="business"?"internal":"all"),window.dispatchEvent(new Event("resize"))}},(window.localStorage.getItem("dsh-studio:reqsrc")??"all")==="all"?"来源:全部":window.localStorage.getItem("dsh-studio:reqsrc")==="business"?"来源:业务提单":"来源:内部")),h.length===0?s("div",{className:"ds-empty"},"还没有需求。先建一条——后面所有的卡、用例、缺陷、MR 都会挂在它下面。"):((window.localStorage.getItem("dsh-studio:reqsort")??"score")==="score"?h.slice().sort((Q,z)=>(z.pool?.score??0)-(Q.pool?.score??0)):h).map(Q=>{const z=window.localStorage.getItem("dsh-studio:reqsrc")??"all";if(z!=="all"&&(Q.source==="business"?"business":"internal")!==z)return null;const ie=ee(Q.id),Le=ie.filter(We=>We.status==="done").length,Ve=Q.progress?.progress??(ie.length===0?0:Math.round(Le/ie.length*100)),Ge=Q.progress?.gate??null;return s("div",{key:Q.id,className:"ds-req-item","data-on":Q.id===S?"1":"0",onClick:()=>C(Q.id)},s("div",{className:"ds-req-item-title"},Q.title),s("div",{className:"ds-req-item-meta"},s(b,{className:"ds-chip ds-chip-code"},Q.code||"未编号"),Q.source==="business"?s(b,{className:"ds-chip","data-src":"business",title:[Q.requester?.name,Q.requester?.dept].filter(Boolean).join(" · ")||"业务提单"},"业务提单"):null,s(b,{className:"ds-chip","data-req":Q.status},Tr[Q.status]??Q.status),s("span",{className:"ds-hint"},`${Le}/${ie.length} 卡`),Ge===null?null:s("span",{className:"ds-hint",style:{color:Ge.ready?"#0f9d58":"#b26a00"}},Ge.ready?"准出通过":`还差 ${Ge.blockers.length} 项`)),s("div",{className:"ds-check-bar","data-full":Ve===100?"1":"0",style:{marginTop:2}},s("span",{style:{width:`${Ve}%`}})))})),s("div",{className:"ds-req-detail"},Ot)))}function aw({state:e,onOpenTask:t}){const{h:a,React:n,api:r,toast:s,confirmDialog:o,promptDialog:i,tipOf:l,TextField:c,ChipField:u,CheckField:p,SelectField:f,MdField:v}=vt(),[x,b]=n.useState([]),[k,g]=n.useState(null),[d,h]=n.useState(null),[y,S]=n.useState(null),[C,E]=n.useState(""),[_,R]=n.useState(null),[A,G]=n.useState(""),[L,P]=n.useState(!1),[W,J]=n.useState(""),[V,F]=n.useState(""),[M,w]=n.useState(""),[$,Y]=n.useState("10"),[I,O]=n.useState(""),[K,Ne]=n.useState(""),fe=n.useCallback(async H=>{const be=(await r("/releases")).releases??[];b(be);const _e=H??(be.some(qa=>qa.id===k)?k:be[0]?.id??null);if(g(_e),_e===null){h(null);return}const Ue=await r("/release/get",{id:_e});h(Ue),S({id:Ue.release.id,version:Ue.release.version,name:Ue.release.name,project:Ue.release.project,owner:Ue.release.owner,status:Ue.release.status,plannedAt:Ue.release.plannedAt,tagName:Ue.release.tagName??"",commitSha:Ue.release.commitSha??""}),E(Ue.release.notes??"")},[k]);n.useEffect(()=>{let H=!0;return fe().then(()=>{H&&R(null)}).catch(Ce=>{H&&R(Ce instanceof Error?Ce.message:String(Ce))}),()=>{H=!1}},[e.revision,fe]);async function xe(H){g(H),P(!0);try{const Ce=await r("/release/get",{id:H});h(Ce),S({id:Ce.release.id,version:Ce.release.version,name:Ce.release.name,project:Ce.release.project,owner:Ce.release.owner,status:Ce.release.status,plannedAt:Ce.release.plannedAt,tagName:Ce.release.tagName??"",commitSha:Ce.release.commitSha??""}),E(Ce.release.notes??""),G("")}catch(Ce){R(Ce instanceof Error?Ce.message:String(Ce))}finally{P(!1)}}function He(){g(null),h(null),S({id:"",version:"",name:"",project:"",owner:"",status:"draft",plannedAt:0,tagName:"",commitSha:""}),E(""),G("")}async function Se(H,Ce,be){P(!0),R(null);try{const _e=await r(H,Ce);G(be??"已保存"),s(be??"已保存"),s(be??"已保存"),await fe(_e.release?.id??k)}catch(_e){const Ue=_e instanceof Error?_e.message:String(_e);R(Ue),s(Ue,"error")}finally{P(!1)}}if(_!==null&&x.length===0)return a("div",{className:"ds-body"},a("div",{className:"ds-err"},_));const U=d?.gate,ae=d?.release,Te=d?.tasks??[],Z=e.tasks.filter(H=>H.releaseId===""||H.releaseId===void 0),le=a("div",{className:"ds-req-list"},a("div",{className:"ds-row",style:{justifyContent:"space-between",marginBottom:6}},a("span",{className:"ds-hint"},`${x.length} 个版本`),a("button",{className:"ds-btn",onClick:He},"+ 新建版本")),x.length===0?a("div",{className:"ds-empty"},"还没有版本。先建一个版本,再把卡挂上来。"):x.map(H=>a("div",{key:H.id,className:"ds-req-item","data-on":k===H.id?"1":"0",onClick:()=>void xe(H.id)},a("div",{className:"ds-req-item-title"},`${H.version||H.id} ${H.name}`.trim()),a("div",{className:"ds-req-item-meta"},a(u,{className:"ds-chip","data-kind":H.status},Xp[H.status]??H.status),a(u,{className:"ds-chip"},`${H.gate.stats.done}/${H.gate.stats.tasks} 卡`),H.gate.blockers.length===0?a(u,{className:"ds-chip",style:{color:"#0f9d58",borderColor:"#0f9d5855"}},"门禁通过"):a(u,{className:"ds-chip ds-chip-blocked"},`${H.gate.blockers.length} 项拦着`))))),he=y===null?a("div",{className:"ds-hint"},"左边选一个版本,或者新建一个。"):a("div",{className:"ds-req-detail"},(ae?.requirements??[]).length===0?null:a("div",{className:"ds-row",style:{flexWrap:"wrap",gap:6,marginBottom:8}},a("span",{className:"ds-hint"},`这个版本涉及 ${ae.requirements.length} 条需求:`),ae.requirements.map(H=>a("span",{key:H.id,className:"ds-chip",title:H.title},`${H.code||H.id} ${H.title}(${Tr[H.derived]??H.derived})`))),a("div",{className:"ds-req-headline"},a("div",null,a("div",{className:"ds-req-name"},`${y.version||"未编号"} ${y.name}`.trim()),a("div",{className:"ds-hint"},ae==null?"新版本:先填版本号与名字,保存后可以把卡挂进来":`创建于 ${Wa(ae.createdAt)}${ae.releasedAt>0?` · 发布于 ${Wa(ae.releasedAt)}`:""}${ae.approveBy!==""?` · 审批人 ${ae.approveBy}`:""}`)),a("div",{className:"ds-req-actions"},a(f,{className:"ds-select",style:{width:108},value:y.status,onChange:H=>S({...y,status:H.target.value})},ox.map(H=>a("option",{key:H,value:H},Xp[H]))))),a("div",{className:"ds-panel",style:{marginTop:4}},a("div",{className:"ds-panel-head"},"版本信息"),a("div",{className:"ds-panel-body ds-grid2"},a("label",{className:"ds-field"},a("span",{},"版本号"),a(c,{className:"ds-input",value:y.version,placeholder:"v1.3.0",disabled:ae?.status==="released",onChange:H=>S({...y,version:H.target.value})})),a("label",{className:"ds-field"},a("span",{},"版本名"),a(c,{className:"ds-input",value:y.name,placeholder:"积分抵扣首个版本",onChange:H=>S({...y,name:H.target.value})})),a("label",{className:"ds-field"},a("span",{},"业务项目"),a(f,{className:"ds-select",value:y.project,onChange:H=>S({...y,project:H.target.value})},a("option",{value:""},"不属于任何项目"),(e.config.projects??[]).map(H=>a("option",{key:H.id,value:H.id},H.name)))),a("label",{className:"ds-field"},a("span",{},"发布负责人"),a(c,{className:"ds-input",value:y.owner,onChange:H=>S({...y,owner:H.target.value})})),a("label",{className:"ds-field"},a("span",{},"计划发布时间"),a(c,{className:"ds-input",type:"date",value:Zp(y.plannedAt),onChange:H=>S({...y,plannedAt:Pr(H.target.value)})})),a("label",{className:"ds-field"},a("span",{},"发布标签(tag)"),a(c,{className:"ds-input",value:y.tagName??"",placeholder:"v1.0.0",onChange:H=>S({...y,tagName:H.target.value})})),a("label",{className:"ds-field"},a("span",{},"对应提交(sha,选填)"),a(c,{className:"ds-input",value:y.commitSha??"",placeholder:"a1b2c3d",onChange:H=>S({...y,commitSha:H.target.value})})),a("div",{className:"ds-row",style:{alignItems:"flex-end",justifyContent:"flex-end",gap:8}},a("button",{className:"ds-btn ds-btn-primary",disabled:L,onClick:()=>void Se("/release/save",{release:y},"版本已保存")},"保存"),y.id===""?null:a("button",{className:"ds-btn ds-btn-ghost",disabled:L,style:{color:"var(--destructive)"},onClick:async()=>{await o("删除这个版本?卡会保留,只是脱离版本。",{title:"删除版本",danger:!0,okText:"删除"})&&Se("/release/delete",{id:y.id},"版本已删除")}},"删除")))),ae==null?null:a("div",{className:"ds-panel",style:{marginTop:12}},a("div",{className:"ds-panel-head"},"发布门禁",a("span",{className:"ds-hint"},"卡全做完、没阻塞、缺陷关闭、用例没有失败,才算能发")),a("div",{className:"ds-panel-body"},a("div",{className:"ds-req-stats"},a("div",{className:"ds-stat-box"},a("b",{},String(U?.stats.done??0)),a("span",{},"已完成卡")),a("div",{className:"ds-stat-box"},a("b",{"data-warn":(U?.stats.open??0)>0?"1":"0"},String(U?.stats.open??0)),a("span",{},"未完成")),a("div",{className:"ds-stat-box"},a("b",{"data-warn":(U?.stats.blocked??0)>0?"1":"0"},String(U?.stats.blocked??0)),a("span",{},"阻塞")),a("div",{className:"ds-stat-box"},a("b",{"data-warn":(U?.stats.bugs??0)>0?"1":"0"},String(U?.stats.bugs??0)),a("span",{},"未结缺陷")),a("div",{className:"ds-stat-box"},a("b",{"data-warn":(U?.stats.failing??0)>0?"1":"0"},String(U?.stats.failing??0)),a("span",{},"失败用例")),a("div",{className:"ds-stat-box"},a("b",{},String(U?.stats.artifacts??0)),a("span",{},"交付物"))),(U?.blockers??[]).map((H,Ce)=>a("div",{key:`b${Ce}`,className:"ds-error"},`⛔ ${H}`)),(U?.warnings??[]).map((H,Ce)=>a("div",{key:`w${Ce}`,className:"ds-hint"},`⚠ ${H}`)),a("div",{className:"ds-action-bar"},a("div",{className:"ds-action-bar-left"},a("button",{className:"ds-btn ds-btn-ghost",disabled:L,onClick:()=>void Se("/release/notes",{id:y.id},"发布说明已生成")},"生成发布说明"),a("button",{className:"ds-btn",disabled:L||!U?.ready,onClick:()=>void Se("/release/approve",{id:y.id,by:"人"},"已审批,可以发布了")},"审批通过")),a("div",{className:"ds-action-bar-right"},a("button",{className:"ds-btn ds-btn-primary",disabled:L||!U?.ready||ae.status==="released",onClick:()=>void Se("/release/publish",{id:y.id,by:"人"},"已发布")},ae.status==="released"?"已发布":"发布"),l("发布准入(预发部署 / 需求签字)没过时也要发:必须写原因,会记进部署日志",a("button",{className:"ds-btn ds-btn-ghost",disabled:L||!U?.ready||ae.status==="released","data-force":"1",onClick:async()=>{const H=await i("强制发布的原因(会记进部署日志,便于复盘):",{title:"强制发布",okText:"强制发布",placeholder:"为什么不等预发部署 / 需求签字?"});if(H!==null){if(String(H).trim()===""){G("强制发布必须写原因");return}Se("/release/publish",{id:y.id,by:"人",force:!0,forceNote:String(H).trim()},"已强制发布(原因已记入部署日志)")}}},"强制发布")),ae.status==="released"?a("button",{className:"ds-btn ds-btn-ghost",disabled:L,onClick:async()=>{const H=await i("回滚原因(要进复盘记录):",{title:"回滚这个版本",danger:!0,okText:"回滚"});H!==null&&H.trim()!==""&&Se("/release/rollback",{id:y.id,reason:H},"已回滚")}},"回滚"):null)),ae.rollbackReason===""?null:a("div",{className:"ds-error"},`回滚原因:${ae.rollbackReason}`))),ae==null?null:a("div",{className:"ds-panel",style:{marginTop:12}},a("div",{className:"ds-panel-head"},"发布冒烟清单",a("span",{className:"ds-hint"},`${(ae.smoke??[]).filter(H=>H.done).length}/${(ae.smoke??[]).length} 项已过 · 发布前逐条点过,门禁才算过`)),a("div",{className:"ds-panel-body"},(ae.smoke??[]).length===0?a("div",{className:"ds-empty"},"还没有冒烟项:把发布前必验的几条写在这里,比如「能登录」「下单支付成功」「首页不报错」。"):null,(ae.smoke??[]).map(H=>a("div",{key:H.id,className:"ds-listrow"},a("label",{className:"ds-row",style:{gap:8,alignItems:"center",flex:1,cursor:"pointer"}},a(p,{checked:H.done===!0,onChange:()=>void Se("/release/smoke",{id:y.id,action:"toggle",itemId:H.id,done:H.done!==!0,by:"人"},H.done?"已取消":"冒烟项已过")}),a("span",{className:H.done?"ds-smoke-done":""},H.text)),H.done&&H.by!==""?a("span",{className:"ds-hint"},`${H.by} · ${Wa(H.at)}`):null,a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn ds-btn-ghost",disabled:L,onClick:()=>void Se("/release/smoke",{id:y.id,action:"remove",itemId:H.id},"已删除")},"×")))),a("div",{className:"ds-row",style:{gap:8,marginTop:8}},a(c,{className:"ds-input",style:{flex:1},value:V,placeholder:"发布前必须验证什么?",onChange:H=>F(H.target.value)}),a("button",{className:"ds-btn",disabled:L||V.trim()==="",onClick:()=>{const H=V.trim();H!==""&&(F(""),Se("/release/smoke",{id:y.id,action:"add",text:H},"已加冒烟项"))}},"+ 加一条")))),ae==null?null:a("div",{className:"ds-panel",style:{marginTop:12}},a("div",{className:"ds-panel-head"},"审批、灰度与部署记录",a("span",{className:"ds-hint"},`审批 ${(ae.approvals??[]).length} 条 · 灰度 ${(ae.grayBatches??[]).length} 批`)),a("div",{className:"ds-panel-body"},(ae.approvals??[]).length===0?a("div",{className:"ds-empty"},"还没有审批记录:点上面的「审批通过」,系统会把谁批的、什么结论记在这里。"):(ae.approvals??[]).map(H=>a("div",{key:H.id,className:"ds-listrow"},a("div",{className:"ds-listrow-main"},a("div",null,`${H.by} 审批通过`),a("div",{className:"ds-hint"},H.note||"(没写结论)")),a("span",{className:"ds-hint"},Wa(H.at)))),a("div",{style:{borderTop:"1px solid var(--ds-line)",margin:"10px 0"}}),(ae.grayBatches??[]).length===0?a("div",{className:"ds-hint"},"没有灰度批次:发布就是一次性全量。先加一批 10% 跑一轮再全量,出事好收。"):(ae.grayBatches??[]).map(H=>a("div",{key:H.id,className:"ds-listrow"},a("div",{className:"ds-listrow-main"},a("div",null,`${H.name} · ${H.percent}%`),a("div",{className:"ds-hint"},`${{pending:"待开始",running:"灰度中",passed:"已通过",rolled_back:"已回滚"}[H.status]??H.status}${H.note===""?"":` · ${H.note}`}`)),a("div",{className:"ds-listrow-actions"},H.status==="pending"?a("button",{className:"ds-btn ds-btn-ghost",disabled:L,onClick:()=>void Se("/release/gray",{id:y.id,action:"start",batchId:H.id,by:"人"},"已开始灰度")},"开始"):null,H.status==="running"?a("button",{className:"ds-btn ds-btn-ghost",disabled:L,onClick:()=>void Se("/release/gray",{id:y.id,action:"advance",batchId:H.id,by:"人"},"这一批已通过")},"通过"):null,H.status==="passed"?a(u,{className:"ds-chip","data-on":"1"},"已通过"):null,H.status==="rolled_back"?a(u,{className:"ds-chip","data-sla":"overdue"},"已回滚"):null))),a("div",{className:"ds-row",style:{gap:8,marginTop:8}},a(c,{className:"ds-input",style:{flex:2},value:M,placeholder:"批次名,例如 内测用户",onChange:H=>w(H.target.value)}),a(c,{className:"ds-input",style:{flex:"0 0 88px"},type:"number",min:1,max:100,value:$,onChange:H=>Y(H.target.value)}),a("button",{className:"ds-btn",disabled:L||Number($)<=0,onClick:async()=>{await Se("/release/gray",{id:y.id,action:"add",name:M,percent:Number($),by:"人"},"已加一批灰度"),w(""),Y("10")}},"+ 加一批")),a("div",{style:{borderTop:"1px solid var(--ds-line)",margin:"10px 0"}}),a("div",{className:"ds-hint"},"上过哪些环境(只登记,不触发部署)"),(ae.deploys??[]).length===0?null:a("div",{className:"ds-row",style:{flexWrap:"wrap",gap:6,marginTop:6}},ae.deploys.map(H=>a("span",{key:H.id,className:"ds-chip","data-env":H.kind,"data-on":H.at===0?"0":"1",title:H.at===0?`还没登记部署到「${H.name}」`:`${H.name}:${Wa(H.at)} ${H.action} · ${H.by}`},H.at===0?`${H.name} —`:`${H.name} ✓`))),a("div",{className:"ds-row",style:{gap:8,marginTop:8}},a(f,{className:"ds-input",style:{flex:"0 0 148px"},value:I,onChange:H=>O(H.target.value)},a("option",{value:""},"选环境…"),(e.config?.environments??[]).map(H=>a("option",{key:H.id,value:H.id},H.name))),a(c,{className:"ds-input",style:{flex:1},value:K,placeholder:"备注:谁发的、发了什么(可留空)",onChange:H=>Ne(H.target.value)}),a("button",{className:"ds-btn",disabled:L||I==="",onClick:async()=>{await Se("/release/deploy",{id:y.id,env:I,note:K,by:"人"},"已登记部署(没有触发任何部署)"),Ne("")}},"登记部署")),a("div",{className:"ds-hint",style:{marginTop:10}},"部署与灰度记录(最近 8 条)"),(()=>{const H={pending:"待开始",running:"灰度中",passed:"已通过",rolled_back:"已回滚"},Ce=[...(ae.deployLog??[]).map(be=>({at:be.at,kind:"deploy",by:be.by,text:`${be.action}${be.env===""?"":` · ${(e.config?.environments??[]).find(_e=>_e.id===be.env)?.name??be.env}`}`,note:be.note})),...(ae.grayBatches??[]).map(be=>({at:be.at??be.createdAt??0,kind:"gray",by:be.by??"人",text:`灰度 ${be.name} ${be.percent}%`,note:H[be.status]??be.status}))].filter(be=>be.at).sort((be,_e)=>be.at-_e.at).slice(-8).reverse();return Ce.length===0?a("div",{className:"ds-empty"},"还没有部署或灰度记录。"):Ce.map(be=>a("div",{key:`${be.at}-${be.kind}-${be.text}`,className:"ds-hint"},a("span",{className:"ds-chip",style:{marginRight:6}},be.kind==="gray"?"灰度":"部署"),`${Wa(be.at)} · ${be.text} · ${be.by}${be.note===""||be.note===void 0?"":`:${be.note}`}`))})())),ae==null?null:a("div",{className:"ds-panel",style:{marginTop:12}},a("div",{className:"ds-panel-head"},"这个版本里的卡",a("span",{className:"ds-hint"},`${Te.length} 张`)),a("div",{className:"ds-panel-body"},Te.length===0?a("div",{className:"ds-empty"},"还没有卡。从下面挑,或者在卡片详情里选「所属版本」。"):Te.map(H=>a("div",{key:H.id,className:"ds-listrow"},a("div",{className:"ds-listrow-main"},a("div",null,`${H.code?`${H.code} `:""}${H.title}`),a("div",{className:"ds-hint"},`${(e.statuses??[]).find(Ce=>Ce.id===H.status)?.label??H.status}${H.blocked!==null&&H.blocked!==void 0?" · 阻塞":""}${H.type==="bug"?" · 缺陷":""}`)),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>t(H.id)},"打开"),a("button",{className:"ds-btn ds-btn-ghost",disabled:L,onClick:()=>void Se("/release/link",{id:y.id,taskId:H.id,action:"remove"},"已从版本移除")},"移除")))),a("div",{className:"ds-row",style:{marginTop:8}},a(f,{className:"ds-select",style:{flex:1},value:W,onChange:H=>J(H.target.value)},a("option",{value:""},`挑一张卡挂进来(${Z.length} 张可选)`),Z.map(H=>a("option",{key:H.id,value:H.id},`${H.code?`${H.code} `:""}${H.title}`))),a("button",{className:"ds-btn",disabled:L||W==="",onClick:async()=>{await Se("/release/link",{id:y.id,taskId:W,action:"add"},"已挂到这个版本"),J("")}},"挂进来")))),ae==null?null:a("div",{className:"ds-panel",style:{marginTop:12}},a("div",{className:"ds-panel-head"},"发布说明",a("button",{className:"ds-btn ds-btn-ghost",disabled:L,onClick:()=>void navigator.clipboard?.writeText(C).then(()=>G("发布说明已复制"),()=>{})},"复制")),a("div",{className:"ds-panel-body"},a(v,{className:"ds-input",rows:12,value:C,placeholder:"点「生成发布说明」按类型自动汇总;之后可以在这里手动补充",onChange:H=>E(H.target.value),onBlur:()=>{C!==(ae.notes??"")&&Se("/release/save",{release:{...y,notes:C}},"发布说明已保存")}}))),_===null?null:a("div",{className:"ds-error",style:{marginTop:8}},_),A===""?null:a("div",{className:"ds-hint",style:{marginTop:8}},A));return a("div",{className:"ds-body"},a("div",{className:"ds-req-grid"},le,he))}function nw({state:e,onOpenTask:t}){const{h:a,React:n,api:r,SelectField:s}=vt(),[o,i]=n.useState(30),[l,c]=n.useState(""),[u,p]=n.useState(null),[f,v]=n.useState(null),[x,b]=n.useState(null),[k,g]=n.useState(null),[d,h]=n.useState(null),[y,S]=n.useState(null);if(n.useEffect(()=>{let w=!0;const $=`/analytics?days=${o}${l===""?"":`&project=${encodeURIComponent(l)}`}`;r($).then(I=>{w&&(p(I.analytics),v(null))}).catch(I=>{w&&v(I instanceof Error?I.message:String(I))});const Y=l===""?"":`&project=${encodeURIComponent(l)}`;return Promise.all([r("/workload"),r(`/burndown?days=14${Y}`),r("/costs"),r("/quality")]).then(([I,O,K,Ne])=>{w&&(b(I.workload??null),g(O.burndown??null),h({...K.costs??{},budget:K.budget??null}),S(Ne.quality??null))}).catch(()=>{}),()=>{w=!1}},[o,l,e.revision]),f!==null)return a("div",{className:"ds-body"},a("div",{className:"ds-err"},f));if(u===null)return a("div",{className:"ds-loading"},"正在统计…");const C=w=>`${Math.round((w??0)*100)}%`,E=w=>{const $=Number(w)||0;return $<=0?"0":$*1440<60?`${Math.max(1,Math.round($*1440))} 分钟`:$<1?`${($*24).toFixed(1)} 小时`:`${$.toFixed(1)} 天`},_=(w,$,Y,I)=>a("div",{className:"ds-kpi","data-warn":I===!0?"1":"0"},a("div",{className:"ds-kpi-value"},$),a("div",{className:"ds-kpi-label"},w),a("div",{className:"ds-kpi-hint"},Y)),R=(u.cycle.buckets??[]).reduce((w,$)=>w+$.count,0),A=Math.max(1,...(u.throughput??[]).map(w=>w.count),...(u.cycle.buckets??[]).map(w=>w.count)),G=Math.max(.001,...(u.columns??[]).map(w=>w.avgDays)),L=(u.columns??[]).reduce((w,$)=>w===null||$.avgDays>w.avgDays?$:w,null),P=(u.throughput??[]).reduce((w,$)=>w+$.count,0),W=(x?.experts??[]).filter(w=>w.enabled),J=W.reduce((w,$)=>w+$.open,0),V=W.reduce((w,$)=>w+($.overdue??0),0),F=k?.series??[],M=F.length===0?null:F[F.length-1];return a("div",{className:"ds-body"},a("div",{className:"ds-board-bar"},a("span",{className:"ds-hint"},`统计口径:最近 ${u.days} 天 · ${u.scope.tasks} 张卡(${u.scope.done} 张已完成)`),a(s,{className:"ds-select",value:l,style:{width:"auto",minWidth:130},onChange:w=>c(w.target.value)},a("option",{value:""},"全部项目"),(e.config.projects??[]).map(w=>a("option",{key:w.id,value:w.id},`${w.key?`[${w.key}] `:""}${w.name}`))),a(s,{className:"ds-select",value:String(o),style:{width:"auto",minWidth:96},onChange:w=>i(Number(w.target.value))},a("option",{value:"7"},"近 7 天"),a("option",{value:"30"},"近 30 天"),a("option",{value:"90"},"近 90 天"))),a("div",{className:"ds-an-sec"},"质量",a("span",{className:"ds-hint"},"先看这四个数:返工多不多、多久能做完、AI 交的东西有多少被人验收")),a("div",{className:"ds-kpi-grid"},_("一次通过率",C(u.rework.firstPassRate),"完成的卡里,从没被退回过的比例",u.rework.firstPassRate<.6),_("返工率",C(u.rework.rate),`${u.rework.reworked}/${u.rework.moved} 张卡倒退过`,u.rework.rate>.3),_("中位周期",E(u.cycle.medianDays),`平均 ${E(u.cycle.avgDays)} · P90 ${E(u.cycle.p90Days)}`),_("AI 交付物采纳率",C(u.ai.acceptedRate),`${u.ai.accepted}/${u.ai.artifactsAi} 件已被验收 · 占全部交付物 ${C(u.ai.aiShare)}`)),a("div",{className:"ds-an-sec"},"流程与产能",a("span",{className:"ds-hint"},"完成的卡各花了多久 · 时间都卡在哪一列 · 最近每天完成几张")),a("div",{className:"ds-an-grid"},a("div",{className:"ds-span-4",style:{display:"grid",gap:12,gridTemplateRows:"auto 1fr",alignContent:"stretch"}},a("div",{className:"ds-panel"},a("div",{className:"ds-panel-head"},"周期分布",a("span",{className:"ds-hint",style:{marginLeft:"auto"}},`${R} 张已完成`)),a("div",{className:"ds-panel-body"},(u.cycle.buckets??[]).map(w=>a("div",{key:w.id,className:"ds-an-row"},a("span",{className:"ds-an-name"},w.label),a("div",{className:"ds-an-track","data-empty":w.count===0?"1":"0"},a("div",{className:"ds-an-fill",style:{width:`${Math.round(w.count/A*100)}%`}})),a("span",{className:"ds-an-num"},`${w.count}`))),R===0?a("div",{className:"ds-hint"},"这个区间里还没有完成的卡。"):null,a("div",{className:"ds-an-foot"},`平均 ${E(u.cycle.avgDays)} · 中位 ${E(u.cycle.medianDays)} · P90 ${E(u.cycle.p90Days)}`))),a("div",{className:"ds-panel"},a("div",{className:"ds-panel-head"},"近 14 天完成"),a("div",{className:"ds-panel-body"},a("div",{className:"ds-spark"},(u.throughput??[]).map((w,$)=>a("div",{key:w.day,className:"ds-spark-col",title:`${w.day}:完成 ${w.count} 张`},a("div",{className:"ds-spark-bar",style:{height:`${Math.round(w.count/Math.max(1,Math.max(...u.throughput.map(Y=>Y.count)))*100)}%`}}),a("span",{className:"ds-spark-day"},$%2===0?w.day:"")))),a("div",{className:"ds-an-foot"},`近 14 天合计 ${P} 张 · 日均 ${(P/14).toFixed(1)} 张 · 空着的日子是没卡完成,不是没数据`)))),a("div",{className:"ds-panel ds-span-8"},a("div",{className:"ds-panel-head"},"每列停留(平均)"),a("div",{className:"ds-panel-body"},(u.columns??[]).map(w=>a("div",{key:w.status,className:"ds-an-row"},a("span",{className:"ds-an-name"},w.label),a("div",{className:"ds-an-track","data-empty":w.avgDays===0?"1":"0"},a("div",{className:"ds-an-fill ds-an-fill-warn",style:{width:`${Math.round(w.avgDays/G*100)}%`}})),a("span",{className:"ds-an-num"},E(w.avgDays)))),a("div",{className:"ds-an-foot"},L===null?"还没有数据。":`最慢的是「${L.label}」:平均 ${E(L.avgDays)},时间主要压在这一列。`)))),a("div",{className:"ds-an-sec"},"交付、成本与返工",a("span",{className:"ds-hint"},"AI 交的东西被验收多少 · 谁手上压得最多 · 派单花了多少 · 哪些卡来回折腾")),a("div",{className:"ds-an-grid"},a("div",{className:"ds-panel ds-span-4"},a("div",{className:"ds-panel-head"},"按专家看质量",a("span",{className:"ds-hint"},"派单量来自运行日志(内存最近 300 条)")),a("div",{className:"ds-panel-body"},y===null?a("div",{className:"ds-hint"},"还没算出来"):(y.experts??[]).length===0?a("div",{className:"ds-hint"},"还没有派出过活"):a("div",null,(y.experts??[]).slice(0,8).map(w=>a("div",{className:"ds-an-kv",key:w.expert},a("span",{},`${w.label} · ${w.dispatched} 次`),a("b",{"data-warn":w.reworkRate!==null&&w.reworkRate>=40?"1":"0"},`${w.done}/${w.cards} 完成 · 一次过 ${w.firstPassRate===null?"—":w.firstPassRate+"%"}`))),a("div",{className:"ds-hint",style:{marginTop:6}},`合计:派单 ${y.totals.dispatched} 次 · 平均耗时 ${y.totals.avgMs>0?Math.round(y.totals.avgMs/1e3)+" 秒":"—"} · 返工率 ${y.totals.reworkRate===null?"—":y.totals.reworkRate+"%"} · AI 失败 ${y.totals.failures} 次 · 缺陷重开 ${y.totals.reopens} 次`),a("div",{className:"ds-hint"},y.cost?.note??"")))),a("div",{className:"ds-panel ds-span-4"},a("div",{className:"ds-panel-head"},"AI 产出质量"),a("div",{className:"ds-panel-body"},a("div",{className:"ds-an-kv"},a("span",{},"交付物由专家登记"),a("b",{},`${u.ai.artifactsAi} / ${u.ai.artifactsTotal}`)),a("div",{className:"ds-an-kv"},a("span",{},"其中被人验收"),a("b",{},`${u.ai.accepted}(${C(u.ai.acceptedRate)})`)),a("div",{className:"ds-an-kv"},a("span",{},"缺正文(只有标题)"),a("b",{"data-warn":u.ai.emptyBody>0?"1":"0"},`${u.ai.emptyBody}`)),a("div",{className:"ds-an-kv"},a("span",{},"写码卡有执行记录"),a("b",{},`${u.ai.codingTasks}`)),a("div",{className:"ds-an-kv"},a("span",{},"评审通过 / 要求修改"),a("b",{},`${u.ai.codingApproved} / ${u.ai.codingChanges}`)),a("div",{className:"ds-an-kv"},a("span",{},"单测通过"),a("b",{},`${u.ai.unitPassed}/${u.ai.unitTests}(${C(u.ai.unitPassRate)})`)),a("div",{className:"ds-an-kv"},a("span",{},"已合并"),a("b",{},`${u.ai.merged}`)))),a("div",{className:"ds-panel ds-span-4"},a("div",{className:"ds-panel-head"},"团队负载",a("span",{className:"ds-hint",style:{marginLeft:"auto"}},`${x?.busy??0} 位在跑`)),a("div",{className:"ds-panel-body"},(x?.experts??[]).filter(w=>w.enabled).length===0?a("div",{className:"ds-empty"},"还没有启用的专家。"):(x?.experts??[]).filter(w=>w.enabled).map(w=>a("div",{key:w.id,className:"ds-an-row"},a("span",{className:"ds-an-name"},`${w.emoji} ${w.name}`),a("div",{className:"ds-an-track"},a("div",{className:"ds-an-fill",style:{width:`${Math.round(w.open/Math.max(1,...(x.experts??[]).map($=>$.open))*100)}%`}})),a("span",{className:"ds-an-num"},`在办 ${w.open}${w.running>0?` · 跑 ${w.running}`:""}${w.overdue>0?` · 逾期 ${w.overdue}`:""}`))),a("div",{className:"ds-an-foot"},`${W.length} 位在岗,手上合计 ${J} 张${V>0?`,其中 ${V} 张逾期`:",没有逾期的"}`))),a("div",{className:"ds-panel ds-span-4"},a("div",{className:"ds-panel-head"},"燃尽(近 14 天剩余)",a("span",{className:"ds-hint",style:{marginLeft:"auto"}},`现在还剩 ${k?.now?.remaining??0} 张`)),a("div",{className:"ds-panel-body"},a(Zx,{series:k?.series??[]}),a("div",{className:"ds-an-foot"},M===null?"还没有数据。":`累计建 ${M.created} · 累计完成 ${M.done} · 现在还剩 ${M.remaining} 张`))),a("div",{className:"ds-panel ds-span-4"},a("div",{className:"ds-panel-head"},"AI 执行成本",a("span",{className:"ds-hint",style:{marginLeft:"auto"}},`${d?.total??0} 次派单`)),a("div",{className:"ds-panel-body"},a("div",{className:"ds-an-kv"},a("span",{},"平均执行时长"),a("b",{},`${Math.round((d?.avgMs??0)/1e3)} 秒`)),(d?.byModel??[]).slice(0,3).map(w=>a("div",{key:`m-${w.key}`,className:"ds-an-kv"},a("span",{},`模型 ${w.key}`),a("b",{},`${w.runs} 次`))),(d?.byPromptVersion??[]).slice(0,3).map(w=>a("div",{key:`p-${w.key}`,className:"ds-an-kv"},a("span",{},`提示词 ${w.key}`),a("b",{},`${w.runs} 次`))),a("div",{className:"ds-hint"},d?.note??""),d?.budget===null||d?.budget===void 0?null:a("div",{style:{marginTop:8}},a("div",{className:"ds-an-kv"},a("span",{},"预算使用"),a("b",{style:{color:d.budget.level==="over"?"#e5484d":d.budget.level==="warn"?"#d97706":void 0}},`${Math.max(d.budget.runRate,d.budget.hourRate)}%`)),a(Xx,{value:Math.min(100,Math.max(d.budget.runRate,d.budget.hourRate)),tone:d.budget.level}),a("div",{className:"ds-hint"},`${d.budget.runs}/${d.budget.budgetRuns} 次 · ${d.budget.hours}/${d.budget.budgetHours} 小时 · ${d.budget.hint}`)))),a("div",{className:"ds-panel ds-span-8"},a("div",{className:"ds-panel-head"},"返工最多的卡",a("span",{className:"ds-hint",style:{marginLeft:"auto"}},`评审打回 ${u.rework.reviewRework} 次 · 测试打回 ${u.rework.testRework} 次`)),a("div",{className:"ds-panel-body"},(u.rework.worst??[]).length===0?a("div",{className:"ds-hint"},"没有卡倒退过,挺好。"):u.rework.worst.map(w=>a("div",{key:w.id,className:"ds-listrow"},a("div",{className:"ds-listrow-main"},a("div",null,`${w.code===""?"":`${w.code} `}${w.title}`),a("div",{className:"ds-hint"},`倒退 ${w.backward} 次 · 现在在「${(e.statuses.find($=>$.id===w.status)??{}).label??w.status}」`)),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>t(w.id)},"打开"))))))))}function sw(e,t){const a="studio",n="/studio-api";let r=null;function s(X){r=X??null}function o(X){return r===null?null:r[X]??null}function i(X,B){if(B==null)return B;const ee=B.props??{},ve=ee.title!==void 0?B:t(B.type,{...ee,title:X}),te=o("Tip");return te===null?ve:t(te,{key:B.key,label:X},ve)}const{TextField:l,TextAreaField:c,ChipField:u,CheckField:p,SelectField:f}=ix({h:t,kit:o,React:e}),v=lx({h:t,kit:o}),x=Rx({h:t,React:e}),b=dx({h:t,ChipField:u}),k=cx({h:t,React:e,Card:b,TextField:l,SelectField:f,CheckField:p,toast:W});function g({rows:X=6,value:B,onChange:ee,placeholder:ve,className:te,...oe}){const[de,ge]=e.useState(!1),we=String(B??"");return t("div",{className:"ds-md-field"},t("div",{className:"ds-md-bar"},t("span",{className:"ds-hint"},"支持 Markdown:标题 / 列表 / 粗体 / 代码块 / 表格"),t("button",{className:"ds-btn ds-btn-ghost",type:"button",onClick:()=>ge(!de)},de?"回到编辑":"预览渲染")),de?t("div",{className:"ds-md-preview ds-req-desc ds-md"},we.trim()===""?t("span",{className:"ds-hint"},"还没写内容。"):Ce(we)):t(c,{className:te??"ds-textarea",rows:X,value:B,onChange:ee,placeholder:ve,...oe}))}function d(X,B){const ee=t("div",{className:"ds-label",style:{cursor:"help"}},X);return B==null||B===""?ee:i(B,ee)}let h=null,y=null;function S(X){h=X,typeof y=="function"&&y(X)}function C(X,B){const ee=B??{};return o("DialogBox")===null?Promise.resolve(window.confirm(String(X))):new Promise(te=>{S({kind:"confirm",title:ee.title??"确认操作",message:String(X??""),danger:ee.danger===!0,okText:ee.okText??"确定",cancelText:ee.cancelText??"取消",resolve:te})})}function E(X,B){const ee=B??{};return o("DialogBox")===null?Promise.resolve(window.prompt(String(X),ee.defaultValue??"")):new Promise(te=>{S({kind:"prompt",title:ee.title??"需要填写",message:String(X??""),value:String(ee.defaultValue??""),placeholder:ee.placeholder??"",okText:ee.okText??"确定",cancelText:"取消",resolve:te})})}function _(){const[X,B]=e.useState(null),[ee,ve]=e.useState("");e.useEffect(()=>{const de=ge=>{B(ge),ve(ge!==null&&ge.kind==="prompt"?ge.value:"")};return y=de,h!==null&&de(h),()=>{y===de&&(y=null)}},[]);const te=o("DialogBox");if(X===null||te===null)return null;const oe=de=>{const ge=X.resolve;B(null),h=null,ge(de)};return t(te,{open:!0,title:X.title,message:X.message,danger:X.danger===!0,okText:X.okText,cancelText:X.cancelText,input:X.kind==="prompt",value:ee,placeholder:X.placeholder,onChange:de=>ve(de),onOk:()=>oe(X.kind==="prompt"?ee.trim():!0),onCancel:()=>oe(X.kind==="prompt"?null:!1)})}let R=0,A=[],G=[],L={text:"",at:0};function P(){const X=A.slice();for(const B of G.slice())B(X)}function W(X,B="success",ee=3200){const ve=String(X??"").trim();if(ve==="")return null;const te=Date.now();if(L.text===ve&&te-L.at<600)return null;L={text:ve,at:te};const oe=++R;return A=A.concat([{id:oe,text:ve,tone:B}]),P(),window.setTimeout(()=>{J(oe)},ee),oe}function J(X){const B=A.filter(ee=>ee.id!==X);B.length!==A.length&&(A=B,P())}const V={success:"✓",error:"!",info:"i"};function F(){const[X,B]=e.useState(()=>A.slice());return e.useEffect(()=>(G.push(B),()=>{G=G.filter(ee=>ee!==B)}),[]),X.length===0?null:t("div",{className:"ds-toasts",role:"status","aria-live":"polite"},X.map(ee=>t("div",{key:ee.id,className:"ds-toast","data-tone":ee.tone},t("span",{className:"ds-toast-icon","aria-hidden":"true"},V[ee.tone]??"i"),t("span",{className:"ds-toast-text"},ee.text),t("button",{type:"button",className:"ds-toast-close","aria-label":"关闭提示",onClick:()=>J(ee.id)},"×"))))}const M="dsh-studio:user";function w(){try{const X=window.localStorage.getItem(M);if(typeof X=="string"&&X.trim()!=="")return X.trim().slice(0,40)}catch{}return"人"}function $(X){const B=String(X??"").trim().slice(0,40)||"人";try{window.localStorage.setItem(M,B)}catch{}return B}const Y="dsh-studio:theme",I=[["light","☀ 明亮"],["dark","☾ 黑暗"],["system","跟随系统"]];function O(){return typeof window.matchMedia=="function"?window.matchMedia("(prefers-color-scheme: dark)"):null}function K(){try{const X=window.getComputedStyle(document.body).backgroundColor,B=/rgba?\(([^)]+)\)/.exec(String(X??""));if(B===null)return null;const ee=B[1].split(",").map(ge=>Number(ge.trim())),[ve,te,oe,de]=ee;return![ve,te,oe].every(ge=>Number.isFinite(ge))||Number.isFinite(de)&&de<.2?null:.2126*ve+.7152*te+.0722*oe<128?"dark":"light"}catch{return null}}function Ne(){try{const X=window.localStorage.getItem(Y);if(X==="light"||X==="dark"||X==="system")return X}catch{}return"system"}function fe(X){const B=X==="light"||X==="dark"?X:"system";try{window.localStorage.setItem(Y,B)}catch{}return B}const xe="dsh-studio:session",He="dsh-studio:auth-user";function Se(){try{const X=window.localStorage.getItem(xe);if(typeof X=="string"&&X.trim()!=="")return X.trim()}catch{}return""}function U(X){try{X===""||X===null||X===void 0?window.localStorage.removeItem(xe):window.localStorage.setItem(xe,String(X))}catch{}}function ae(){try{const X=window.localStorage.getItem(He);if(typeof X=="string"&&X!==""){const B=JSON.parse(X);if(B!==null&&typeof B=="object")return B}}catch{}return null}function Te(X){try{X==null?window.localStorage.removeItem(He):window.localStorage.setItem(He,JSON.stringify(X))}catch{}return X??null}async function Z(X,B){const ee={"x-studio-user":encodeURIComponent(w())},ve=Se();ve!==""&&(ee["x-studio-session"]=ve),B!==void 0&&(ee["content-type"]="application/json");const te=B===void 0?{method:"GET",headers:ee}:{method:"POST",headers:ee,body:JSON.stringify(B)},oe=await fetch(n+X,te);let de={};try{de=await oe.json()}catch{}if(!oe.ok||de.ok===!1)throw new Error(de.error??`请求失败(HTTP ${oe.status})`);return de}const le=`
|
|
44
|
+
`);return a.length>0&&a[a.length-1]===""&&a.pop(),a}function ew(e,t){const a=rf(e),n=rf(t);if(a.length>ed||n.length>ed)return[{kind:"del",text:`(原基线 ${a.length} 行,超过 ${ed} 行的对比上限)`},{kind:"add",text:`(当前文档 ${n.length} 行)`}];const r=Array.from({length:a.length+1},()=>new Array(n.length+1).fill(0));for(let l=a.length-1;l>=0;l-=1)for(let c=n.length-1;c>=0;c-=1)r[l][c]=a[l]===n[c]?r[l+1][c+1]+1:Math.max(r[l+1][c],r[l][c+1]);const s=[];let o=0,i=0;for(;o<a.length&&i<n.length;){if(a[o]===n[i]){s.push({kind:"same",text:a[o]}),o+=1,i+=1;continue}if(r[o+1][i]>=r[o][i+1]){s.push({kind:"del",text:a[o]}),o+=1;continue}s.push({kind:"add",text:n[i]}),i+=1}for(;o<a.length;)s.push({kind:"del",text:a[o]}),o+=1;for(;i<n.length;)s.push({kind:"add",text:n[i]}),i+=1;return s}function tw(e){const t=Array.isArray(e)?e:[];return{added:t.filter(a=>a.kind==="add").length,removed:t.filter(a=>a.kind==="del").length,same:t.filter(a=>a.kind==="same").length}}function aw({state:e,onOpenTask:t,onChanged:a,createSignal:n,focusReq:r}){const{h:s,React:o,api:i,toast:l,currentUser:c,confirmDialog:u,promptDialog:p,renderMarkdown:f,TextField:v,TextAreaField:x,ChipField:b,CheckField:k,SelectField:g,MdField:d}=ht(),h=e.requirements??[],y=e.config.projects??[],[S,C]=o.useState(h.length>0?h[0].id:null),E=()=>{I({title:"",description:"",project:"",iteration:"",owner:"",priority:"normal",status:"draft",links:{}}),H(null)};o.useEffect(()=>{Number(n)>0&&E()},[n]),o.useEffect(()=>{r&&r.id&&C(r.id)},[r]);const[_,I]=o.useState(null),[j,H]=o.useState(null),[M,P]=o.useState(!1),[G,J]=o.useState(null),[q,B]=o.useState(null),[L,w]=o.useState(null),[T,Q]=o.useState(null),[R,D]=o.useState(null),[K,we]=o.useState(!1),[fe,ye]=o.useState(null),[Ve,ae]=o.useState(!1),[F,te]=o.useState(null),[xe,X]=o.useState(null),[oe,me]=o.useState(null),[W,$e]=o.useState(""),[ke,Ie]=o.useState(null),[Ue,qa]=o.useState("0"),[Tn,V]=o.useState([]),[he,je]=o.useState(null),ze=h.find(Y=>Y.id===S)??null;o.useEffect(()=>{qa(String(ze?.order??0)),V(Array.isArray(ze?.dependsOn)?ze.dependsOn:[]),je(null)},[S,ze?.updatedAt]);const Pt=async()=>{if(ze!==null)try{await i("/requirement/save",{requirement:{id:ze.id,title:ze.title,description:ze.description??"",project:ze.project??"",iteration:ze.iteration??"",owner:ze.owner??"",priority:ze.priority??"normal",status:ze.status??"draft",links:ze.links??{},order:Number(Ue)||0,dependsOn:Tn}}),je("已保存:排序与依赖"),l("排序与依赖已保存"),a!==void 0&&a()}catch(Y){je(Y instanceof Error?Y.message:String(Y))}},Vt=async Y=>{if(U===null)return;const z=String(W??"").trim();if(Y==="sign"&&z===""){Ie("签字要写一句结论:交付了什么、遗留什么");return}try{await i("/requirement/signoff",{id:U.id,action:Y,note:z,by:c()}),Ie(Y==="sign"?"已签字":"已取消签字"),l(Y==="sign"?"需求已签字":"已取消需求签字"),$e(""),a!==void 0&&a()}catch(de){Ie(de.message)}},et=o.useCallback(async Y=>{if(Y==null||Y===""){te(null);return}try{const z=await i("/requirement/matrix",{id:Y});te(z.matrix)}catch(z){X(z.message)}},[]),bt=async Y=>{if(U!==null)try{await i("/requirement/save",{requirement:{...U,links:U.links??{},points:Y}}),await et(U.id),X("功能点已保存"),me(null)}catch(z){X(z.message)}},ds=()=>({title:"",description:"",priority:"normal",status:"draft",acceptance:[]}),wa=async()=>{if(oe===null||U===null)return;if(String(oe.title??"").trim()===""){X("功能点要有标题");return}const Y=String(oe.acceptanceText??"").split(`
|
|
45
|
+
`).map(Le=>Le.trim()).filter(Le=>Le!==""),z={id:oe.id??`p${(U.points??[]).length+1}`,title:oe.title,description:oe.description??"",priority:oe.priority??"normal",status:oe.status??"draft",acceptance:Y.map((Le,We)=>({id:`a${We+1}`,text:Le,done:!1}))},de=(U.points??[]).filter(Le=>Le.id!==z.id);await bt([...de,z])},Is=async Y=>{U!==null&&await u("删除这个功能点?挂在上面的卡会变成「未归功能点」。",{title:"删除功能点",danger:!0,okText:"删除"})&&await bt((U.points??[]).filter(z=>z.id!==Y))},Z=async(Y,z)=>{try{await i("/task/update",{id:Y,pointId:z}),U!==null&&await et(U.id)}catch(de){X(de.message)}},U=h.find(Y=>Y.id===S)??null,ee=Y=>e.tasks.filter(z=>z.requirementId===Y),be=Y=>e.statuses.find(z=>z.id===Y)?.label??Y;o.useEffect(()=>{te(null),X(null),U!==null&&et(U.id)},[U===null?"":U.id,et]);const ne=async()=>{if(_!==null){if(String(_.title??"").trim()===""){H("需求标题不能为空");return}P(!0);try{const Y=await i("/requirement/save",{requirement:{id:_.id,title:_.title,description:_.description,project:_.project,owner:_.owner,domain:_.domain??"",priority:_.priority,status:_.status,links:{prd:_.prd,proto:_.proto,acceptance:_.acceptance}}});C(Y.requirement.id),I(null),H(null),l(Y.created===!0?"需求已创建":"需求已保存")}catch(Y){H(Y.message)}finally{P(!1)}}},le=async Y=>{if(U!==null)try{await i("/requirement/save",{requirement:{...U,links:U.links??{},status:Y}}),l("需求状态已更新")}catch(z){H(z.message)}},ce=async Y=>{if(await u("删除这条需求?它下面的卡会保留,只是不再挂需求。",{title:"删除需求",danger:!0,okText:"删除"}))try{await i("/requirement/delete",{id:Y}),C(null)}catch(z){H(z.message)}},ve={pending:"待评审",approved:"评审通过",changes_requested:"评审打回"},[Se,Ne]=o.useState(!1),[Te,at]=o.useState(null),nt=async(Y,z)=>{if(U!==null){Ne(!0),at(null);try{const de=await i("/requirement/review",{id:U.id,decision:Y,note:z??"",by:c(),operator:c()});at(`已${Y==="approve"?"通过":Y==="reject"?"打回":"提交"}评审:${ve[de.review?.status]??""}`),typeof a=="function"&&a()}catch(de){at(de.message)}finally{Ne(!1)}}},ct=async()=>{const Y=await p("打回要给意见(会记在评审记录里):",{title:"评审打回",danger:!0,okText:"打回",placeholder:"写清楚哪里不满足,之后要据此改"});if(Y!==null){if(String(Y).trim()===""){at("打回必须写意见");return}nt("reject",String(Y).trim().slice(0,600))}},[qe,st]=o.useState(!1),[tt,Pe]=o.useState(null),_t=async()=>{if(U!==null){st(!0),Pe(null);try{const z=(await i("/requirement/split",{id:U.id})).created??[];Pe(z.length===0?"没有可拆的功能点:要么都覆盖了,要么还没加功能点。":`已建 ${z.length} 张卡:${z.map(de=>de.code||de.id).join("、")}`),typeof a=="function"&&a()}catch(Y){Pe(Y.message)}finally{st(!1)}}},Fe=()=>({kind:"prd",title:"",url:U?.links?.prd??"",version:"v1.0",content:"",status:"draft"}),yt=async Y=>{if(B(null),Y===null){J(Fe());return}try{const de=((await i("/requirement/get",{id:U.id})).requirement?.docs??[]).find(Le=>Le.id===Y);J(de===void 0?Fe():{...de})}catch(z){H(z.message)}},jt=async Y=>{if(L!==null&&L.id===Y){w(null);return}w({id:Y,content:"",busy:!0});try{const de=((await i("/requirement/get",{id:U.id})).requirement?.docs??[]).find(Le=>Le.id===Y);w({id:Y,content:String(de?.content??""),busy:!1})}catch(z){H(z.message),w(null)}},Qt=async()=>{if(T!==null){Q(null);return}try{const z=(await i("/requirement/get",{id:U.id})).requirement??{},de=z.baseline??null,We=[...z.docs??[]].sort((_n,Do)=>(Number(Do.at)||0)-(Number(_n.at)||0)),Ke=We.find(_n=>_n.kind==="prd")??We[0]??null;if(de===null){Q(null),H("这条需求还没有基线,先挑一份文档「设为基线」");return}if(Ke===null){Q(null),H("这条需求还没有文档可以对比");return}const He=ew(de.content??"",Ke.content??"");Q({rows:He,summary:tw(He),version:de.version,docTitle:Ke.title})}catch(Y){Q(null),H(Y instanceof Error?Y.message:String(Y))}},ie=async()=>{if(R!==null){D(null);return}try{const Y=await i("/requirement/get",{id:U.id}),z={};for(const de of Y.requirement?.docs??[])z[de.id]=String(de.content??"");D(z)}catch(Y){H(Y.message)}},Ce=async()=>{if(G!==null){if(String(G.title??"").trim()===""){B("文档要有标题");return}we(!0);try{const Y=await i("/requirement/doc",{id:U.id,action:G.id===void 0?"add":"update",docId:G.id,doc:{kind:G.kind,title:G.title,url:G.url,version:G.version,content:G.content,status:G.status}});J(null),B(null)}catch(Y){B(Y.message)}finally{we(!1)}}},ge=async()=>{ae(!0),ye(null);try{const Y=await i("/requirement/folder",{id:U.id});ye(Y.ok?`云盘文件夹已就绪:${Y.folder?.url??""}`:`创建失败:${Y.error||Y.folder?.error||"未知原因"}`)}catch(Y){ye(Y.message)}finally{ae(!1)}},Va=async()=>{ae(!0),ye(null);try{const z=(await i("/requirement/sync",{id:U.id})).report??{},de=Number(z.failed??0);ye(`归档完成:共 ${z.total??0} 件,成功 ${z.written??0} 件${de>0?`,失败 ${de} 件(${z.errors?.[0]??""})`:"。"}`)}catch(Y){ye(Y.message)}finally{ae(!1)}},St=async Y=>{try{await i("/requirement/doc",{id:U.id,action:"baseline",docId:Y,by:"人"}),B("这一版已生效,之后新建的卡都会记下它。")}catch(z){B(z.message)}},da=async()=>{try{await i("/requirement/doc",{id:U.id,action:"clear-baseline"}),B("基线已取消,需求回到「评审中」。")}catch(Y){B(Y.message)}},Pn=async Y=>{if(await u("删除这份文档?",{title:"删除文档",danger:!0,okText:"删除"}))try{await i("/requirement/doc",{id:U.id,action:"remove",docId:Y})}catch(z){B(z.message)}},Ra=async()=>{we(!0),B(null);try{const Y=await i("/requirement/pull",{url:G?.url??""});if(Y.ok===!0){const z=String(Y.text??"");J(de=>({...de,title:String(de?.title??"").trim()===""?String(Y.title??""):de.title,content:z})),B(`已拉取 ${z.length} 字正文${Y.title?`,标题取自文档「${Y.title}」`:""}。`)}else B(Y.error??"拉取失败")}catch(Y){B(Y.message)}finally{we(!1)}},Dt=_===null?null:s("div",{className:"ds-panel ds-form-panel"},s("div",{className:"ds-panel-head"},_.id===void 0?"新建需求":`编辑 ${U?.code??""}`),s("div",{className:"ds-panel-body"},s("div",{className:"ds-field"},s("div",{className:"ds-label"},"需求标题"),s(v,{className:"ds-input",value:_.title,onChange:Y=>I({..._,title:Y.target.value})})),s("div",{className:"ds-row"},s("div",{className:"ds-field",style:{flex:1}},s("div",{className:"ds-label"},"业务项目"),s(g,{className:"ds-select",value:_.project,onChange:Y=>I({..._,project:Y.target.value})},s("option",{value:""},"不指定"),y.map(Y=>s("option",{key:Y.id,value:Y.id},Y.name)))),s("div",{className:"ds-field",style:{flex:1}},s("div",{className:"ds-label"},"状态"),s(g,{className:"ds-select",value:_.status,onChange:Y=>I({..._,status:Y.target.value})},Yp.map(Y=>s("option",{key:Y,value:Y},Tr[Y])))),s("div",{className:"ds-field",style:{flex:1}},s("div",{className:"ds-label"},"业务负责人"),s(v,{className:"ds-input",value:_.owner,onChange:Y=>I({..._,owner:Y.target.value})})),s("div",{className:"ds-field",style:{flex:1}},s("div",{className:"ds-label"},"业务领域"),s(v,{className:"ds-input",placeholder:"支付 / 风控 / 会员(决定派给哪位领域专家)",value:_.domain??"",onChange:Y=>I({..._,domain:Y.target.value})}))),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"PRD 链接"),s(v,{className:"ds-input",placeholder:"https://…(飞书云文档)",value:_.prd,onChange:Y=>I({..._,prd:Y.target.value})})),s("div",{className:"ds-row"},s("div",{className:"ds-field",style:{flex:1}},s("div",{className:"ds-label"},"原型链接"),s(v,{className:"ds-input",value:_.proto,onChange:Y=>I({..._,proto:Y.target.value})})),s("div",{className:"ds-field",style:{flex:1}},s("div",{className:"ds-label"},"验收标准链接"),s(v,{className:"ds-input",value:_.acceptance,onChange:Y=>I({..._,acceptance:Y.target.value})}))),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"需求正文 / PRD 摘要"),s(d,{className:"ds-textarea",rows:10,style:{minHeight:180},placeholder:"支持 Markdown:`# 背景`、`- 列表`、`**重点**`、`` `代码` ``、`| 表格 |`;保存后在「需求明细」里按 Markdown 渲染,不再截断。",value:_.description,onChange:Y=>I({..._,description:Y.target.value})})),s("div",{className:"ds-row",style:{justifyContent:"flex-end",gap:8}},s("button",{className:"ds-btn",onClick:()=>{I(null),H(null)}},"取消"),s("button",{className:"ds-btn ds-btn-primary",disabled:M,onClick:()=>void ne()},M?"保存中…":"保存需求")))),Ot=U===null?s("div",{className:"ds-empty"},"左边选一条需求,或先新建一条。"):(()=>{const Y=ee(U.id),z=Y.filter(O=>O.status==="done").length,de=Y.filter(O=>O.blocked!==void 0&&O.blocked!==null).length,Le=Y.filter(O=>O.type==="bug"&&O.status!=="done").length,We=Y.reduce((O,ue)=>{const Me=Kl(ue);return{done:O.done+Me.done,total:O.total+Me.total}},{done:0,total:0}),Ke=Y.reduce((O,ue)=>{const Me=Gl(ue);return{pass:O.pass+Me.pass,total:O.total+Me.total}},{pass:0,total:0}),He=Y.flatMap(O=>(O.artifacts??[]).map(ue=>({...ue,task:O}))),_n=Y.filter(O=>(O.gitlabMR?.iid??0)>0),Do=Ke.pass,an=U.links??{},nn=U.folder??{},cs=(O,ue)=>ue===""?null:s("a",{className:"ds-link",href:ue,target:"_blank",rel:"noreferrer"},O);return s("div",{className:"ds-req-body"},s("div",{className:"ds-req-headline"},s("div",null,s("div",{className:"ds-req-code"},U.code||U.id),s("div",{className:"ds-req-name"},U.title)),s("div",{className:"ds-req-actions"},s(g,{className:"ds-select",value:U.status,onChange:O=>void le(O.target.value)},Yp.map(O=>s("option",{key:O,value:O},Tr[O]))),s("button",{className:"ds-btn",onClick:()=>I({...U,...an})},"编辑"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void ce(U.id),"data-danger":"1"},"删除"))),(()=>{const O=U.review??null,ue=O===null?"还没提交评审":ve[O.status]??O.status,Me=O===null||O.status==="changes_requested",xt=O!==null&&O.status==="pending";return s("div",{className:"ds-panel","data-review":O===null?"none":O.status,style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"需求评审"),s(b,{className:"ds-chip","data-on":O?.status==="approved"?"1":"0",style:{marginLeft:8}},ue),O===null||O.at===0?null:s("span",{className:"ds-hint",style:{marginLeft:"auto"}},`${Qe(O.at)}${O.by===""?"":` · ${O.by}`}`)),s("div",{className:"ds-panel-body"},O!==null&&String(O.note??"")!==""?s("div",{className:"ds-hint",style:{marginBottom:8}},`评审意见:${O.note}`):null,s("div",{className:"ds-row",style:{flexWrap:"wrap",gap:8}},Me?s("button",{className:"ds-btn ds-btn-primary",disabled:Se,onClick:()=>void nt("submit")},Se?"提交中…":"提交评审"):null,xt?s("button",{className:"ds-btn ds-btn-primary",disabled:Se,onClick:()=>void nt("approve")},"评审通过"):null,xt?s("button",{className:"ds-btn ds-btn-ghost",disabled:Se,onClick:ct,"data-danger":"1"},"打回"):null,O?.status==="approved"?s("span",{className:"ds-hint"},"评审已通过,可以拆卡和派活了。"):null),Te===null?null:s("div",{className:"ds-hint",style:{marginTop:8}},Te)))})(),cs("PRD",an.prd)||cs("原型",an.proto)||cs("验收标准",an.acceptance)?s("div",{className:"ds-req-links"},cs("PRD 文档",an.prd),cs("原型",an.proto),cs("验收标准",an.acceptance)):s("div",{className:"ds-empty"},[s("span",null,"还没有登记 PRD / 原型 / 验收标准链接;PRD 与原型由产品在澄清后输出,可在这里补,或点右边「让产品补 PRD」。"),s("button",{className:"ds-btn ds-btn-ghost",style:{marginLeft:8},onClick:async()=>{const O=await p("想请产品补什么?",{title:"申请产品补 PRD",defaultValue:"需要产品输出 PRD 与原型"});if(O!==null)try{await i("/requirement/request-prd",{id:U.id,by:c(),note:O}),l("已申请产品补 PRD"),a()}catch(ue){l(ue.message??String(ue),"error")}}},"让产品补 PRD")]),U.description?s("div",{className:"ds-panel ds-req-desc-panel",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"需求明细"),U.source==="business"?s("span",{className:"ds-hint","data-src":"business"},`业务提单 · ${U.requester?.name||"未署名"}${U.requester?.dept?"("+U.requester.dept+")":""} · ${Qe(U.requester?.at||U.createdAt)}`):null,s("span",{className:"ds-hint",style:{marginLeft:"auto"}},"支持 Markdown")),s("div",{className:"ds-panel-body"},s("div",{className:"ds-req-desc ds-md"},f(U.description)))):s("div",{className:"ds-req-desc ds-hint"},"还没有写需求描述:产品背景、要解决的问题、验收口径都建议写在这里,点右侧「编辑」补上。"),(()=>{const O=(U.history??[]).slice().reverse();if(O.length===0||(U.change??null)!==null)return null;const ue={title:"标题",description:"需求明细",priority:"优先级",status:"状态",owner:"负责人",project:"项目",iteration:"迭代"};return s("div",{className:"ds-panel ds-history-panel",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"变更记录"),s("span",{className:"ds-hint",style:{marginLeft:"auto"}},`最近 ${O.length} 条`)),s("div",{className:"ds-panel-body"},s("div",{style:{display:"flex",flexDirection:"column",gap:6,maxHeight:260,overflowY:"auto"}},O.map((Me,xt)=>s("div",{key:`${Me.at}-${xt}`,style:{display:"flex",gap:8,alignItems:"baseline",fontSize:12}},s("span",{className:"ds-hint",style:{flex:"0 0 auto",fontVariantNumeric:"tabular-nums"}},Qe(Me.at)),s("span",{style:{flex:"0 0 auto"}},Me.by===""?"人":Me.by),s("span",{className:"ds-chip",style:{flex:"0 0 auto"}},ue[Me.field]??Me.field),s("span",{className:"ds-hint",style:{minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}},`${Me.from===""?"(空)":Me.from} → ${Me.to===""?"(空)":Me.to}`))))))})(),(()=>{const O=U.pool??{reach:0,impact:0,confidence:0,effort:0,score:0},ue=async(xt,ta,rt)=>{const Re=await p(ta,{title:xt,defaultValue:String(rt??0)});if(Re===null)return null;const Ye=Number(String(Re).trim());return Number.isFinite(Ye)&&Ye>=0?Ye:null},Me=async()=>{const xt=await ue("影响面 Reach","影响多少用户或多少笔交易?估算依据写进正文",O.reach);if(xt===null)return;const ta=await ue("影响度 Impact","3 显著 / 2 高 / 1 中 / 0.5 低",O.impact);if(ta===null)return;const rt=await ue("置信度 Confidence","100 有数据 / 80 有访谈 / 50 只有猜测(百分数)",O.confidence);if(rt===null)return;const Re=await ue("成本 Effort","人日(研发+测试+联调)",O.effort);if(Re!==null)try{await i("/requirement/pool",{id:U.id,pool:{reach:xt,impact:ta,confidence:rt,effort:Re}}),l("需求池评分已更新"),await a()}catch(Ye){l(Ye instanceof Error?Ye.message:String(Ye),"error")}};return s("div",{className:"ds-panel ds-pool-panel",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"需求池评分(RICE)"),s("span",{className:"ds-hint",style:{marginLeft:"auto"}},O.score>0?`得分 ${O.score}`:"还没打分:不打分就没法和别的需求比优先级"),s("button",{className:"ds-btn ds-btn-ghost",style:{marginLeft:8},onClick:()=>void Me()},O.score>0?"重新打分":"打分")),O.score>0?s("div",{className:"ds-panel-body"},s("div",{className:"ds-row",style:{flexWrap:"wrap",gap:8}},s("span",{className:"ds-chip"},`影响面 ${O.reach}`),s("span",{className:"ds-chip"},`影响度 ${O.impact}`),s("span",{className:"ds-chip"},`置信度 ${O.confidence}%`),s("span",{className:"ds-chip"},`成本 ${O.effort} 人日`),s("span",{className:"ds-chip","data-on":"1"},`得分 ${O.score}`))):null)})(),(()=>{const O=U.questions??[],ue=O.filter(Re=>Re.status==="open").length,Me=async(Re,Ye)=>{try{await i("/requirement/questions",{id:U.id,...Re}),Ye&&l(Ye),await a()}catch(In){l(In instanceof Error?In.message:String(In),"error")}},xt=async()=>{const Re=await p("还没确认清楚的问题是什么?",{title:"加一个待确认问题",placeholder:"例如:退款失败时是否允许人工补发?"});Re===null||Re.trim()===""||await Me({action:"add",text:Re},"已加入待确认清单")},ta=async Re=>{const Ye=await p(Re.text,{title:"回答这个问题",defaultValue:Re.answer??"",placeholder:"写清结论与依据"});Ye===null||Ye.trim()===""||await Me({action:"answer",questionId:Re.id,answer:Ye},"已回答")},rt=async Re=>{await u("删掉这个问题?",{title:"删除待确认项",danger:!0,okText:"删除"})===!0&&await Me({action:"delete",questionId:Re.id},"已删除")};return s("div",{className:"ds-panel ds-question-panel","data-open":ue>0?"1":"0",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"待确认清单"),s("span",{className:"ds-hint",style:{marginLeft:"auto"}},ue>0?`${ue} 个没回答,回答完才能拆卡`:O.length===0?"澄清阶段把不确定的先记在这里":"全部已回答"),s("button",{className:"ds-btn ds-btn-ghost",style:{marginLeft:8},onClick:()=>void xt()},"+ 加问题")),s("div",{className:"ds-panel-body"},O.length===0?s("div",{className:"ds-empty"},"还没有待确认的问题。产品澄清时把「需要业务拍板」的点写在这里,避免猜业务规则。"):s("div",{style:{display:"flex",flexDirection:"column",gap:8}},O.map(Re=>s("div",{key:Re.id,className:"ds-question-row","data-status":Re.status,style:{display:"flex",gap:10,alignItems:"flex-start",padding:"8px 10px",border:"1px solid var(--border)",borderRadius:8,background:"var(--card)"}},s("span",{className:"ds-chip","data-on":Re.status==="answered"?"1":"0"},Re.status==="answered"?"已回答":"待回答"),s("div",{style:{flex:"1 1 auto",minWidth:0}},s("div",{style:{fontSize:13}},Re.text),Re.answer===""||Re.answer===void 0?null:s("div",{className:"ds-hint",style:{marginTop:4}},`答:${Re.answer}`)),s("div",{style:{display:"flex",gap:6,flex:"0 0 auto"}},s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void ta(Re)},Re.status==="answered"?"改答案":"回答"),s("button",{className:"ds-btn ds-btn-ghost","data-danger":"1",onClick:()=>void rt(Re)},"删除")))))))})(),(()=>{const O=U.change??null;if(O===null)return null;const ue=O.affected??[],Me=O.affectedCases??[],xt=new Map(Y.map(rt=>[rt.id,rt])),ta=rt=>e.statuses.find(Re=>Re.id===rt)?.label??rt;return s("div",{className:"ds-panel ds-change-panel","data-invalidated":O.invalidated?"1":"0",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,O.invalidated?"变更影响(签字已作废)":"变更影响"),s("span",{className:"ds-hint",style:{marginLeft:"auto"}},`${Qe(O.at)}${O.by===""?"":` · ${O.by}`}`)),s("div",{className:"ds-panel-body"},function(){const rt=(U.history??[]).slice().reverse();if(rt.length===0)return null;const Re={title:"标题",description:"需求明细",priority:"优先级",status:"状态",owner:"负责人",project:"项目",iteration:"迭代"};return s("div",{style:{display:"flex",flexDirection:"column",gap:6,maxHeight:220,overflowY:"auto",marginBottom:8,paddingBottom:8,borderBottom:"1px dashed var(--border)"}},s("div",{className:"ds-hint",style:{fontWeight:600}},`变更记录 · 最近 ${rt.length} 条`),rt.map((Ye,In)=>s("div",{key:`${Ye.at}-${In}`,style:{display:"flex",gap:8,alignItems:"baseline",fontSize:12}},s("span",{className:"ds-hint"},Qe(Ye.at)),s("span",null,Ye.by===""?"人":Ye.by),s("span",{className:"ds-chip"},Re[Ye.field]??Ye.field),s("span",{className:"ds-hint"},`${Ye.from===""?"(空)":Ye.from} → ${Ye.to===""?"(空)":Ye.to}`))))}(),s("div",{className:"ds-hint"},`改了:${(O.parts??[]).join("、")}。${ue.length===0?"当时没有已产出的卡受影响,不用返工。":`${ue.length} 张卡已经产出过东西${Me.length===0?"":`、${Me.length} 条用例要重跑`},要按新版复核:`}`),ue.length===0?null:s("div",{className:"ds-row",style:{flexWrap:"wrap",gap:8,marginTop:8}},ue.map(rt=>s("span",{key:rt.id,className:"ds-chip","data-pt":"open",style:{cursor:"pointer"},title:rt.title,onClick:()=>{const Re=xt.get(rt.id);Re!==void 0&&typeof t=="function"&&t(Re)}},`${rt.code||rt.id} ${ta(rt.status)}`))),O.invalidated?s("div",{className:"ds-hint",style:{marginTop:8}},"验收签字已清空:这些卡是按旧版做的,复核完重新签一次。"):null))})(),(()=>{const O=U.deploys??[];return O.length===0?null:s("div",{className:"ds-panel",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"上线足迹"),s("span",{className:"ds-hint",style:{marginLeft:"auto"}},"来自版本的部署记录,只留痕不触发")),s("div",{className:"ds-panel-body"},s("div",{className:"ds-row",style:{flexWrap:"wrap",gap:8}},O.map(ue=>s("span",{key:ue.id,className:"ds-chip","data-env":ue.kind,title:`${ue.releaseName??""} · ${Qe(ue.at)} · ${ue.by}`},`${ue.name} · ${Wa(ue.at)}`)))))})(),s("div",{className:"ds-panel",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"依赖与排序")),s("div",{className:"ds-panel-body"},s("div",{className:"ds-row"},s("span",{className:"ds-hint"},"排序号"),s(v,{className:"ds-input",style:{width:90},value:Ue,onChange:O=>qa(O.target.value)}),s("span",{className:"ds-hint"},"被依赖的需求没交付,这条需求的准出会被拦")),s("div",{className:"ds-row",style:{flexWrap:"wrap",gap:10}},h.filter(O=>O.id!==U.id).map(O=>s("label",{key:O.id,className:"ds-check-row"},s(k,{checked:Tn.includes(O.id),onChange:ue=>V(Me=>ue.target.checked?[...Me,O.id]:Me.filter(xt=>xt!==O.id))}),s("span",{className:"ds-check-text"},`${O.code||O.id} ${O.title}(${Tr[O.status]??O.status})`))),h.length<=1?s("span",{className:"ds-hint"},"只有这一条需求,暂时没有可依赖的对象。"):null),s("div",{className:"ds-row"},s("button",{className:"ds-btn ds-btn-primary",onClick:()=>void Pt()},"保存排序与依赖"),he===null?null:s("span",{className:"ds-hint"},he)))),(()=>{const O=U.progress??null,ue=O?.gate??{ready:!1,blockers:["还没有加载出准出状态,稍后自动刷新"],warnings:[]},Me=ue.stats??{},xt=U.signoff??null,ta=O?.progress??(Y.length===0?0:Math.round(z/Y.length*100)),rt=Me.coveredPoints??0,Re=Me.points??(U.points??[]).length,Ye=Me.pass??Do,In=Me.cases??Ke.total;return s("div",{className:"ds-panel",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"需求准出与验收签字"),s(b,{className:"ds-chip","data-pt":ue.ready?"covered":"open",style:{marginLeft:"auto"}},ue.ready?"可以交付":`还差 ${ue.blockers.length} 项`)),s("div",{className:"ds-panel-body"},s("div",{className:"ds-check-progress"},s("div",{className:"ds-check-bar","data-full":ta===100?"1":"0"},s("span",{style:{width:`${ta}%`}})),s("div",{className:"ds-hint"},`${ta}% · ${z}/${Y.length} 张卡完成 · 功能点覆盖 ${rt}/${Re} · 用例通过 ${Ye}/${In}`)),(ue.blockers??[]).map(Rn=>s("div",{key:Rn,className:"ds-gate-item","data-kind":"block"},`⛔ ${Rn}`)),(ue.warnings??[]).map(Rn=>s("div",{key:Rn,className:"ds-gate-item","data-kind":"warn"},`⚠ ${Rn}`)),ue.ready?s("div",{className:"ds-hint"},"门禁已通过:签完字这条需求就算交付。"):null,xt===null?s("div",{className:"ds-gate-sign"},s(v,{className:"ds-input",style:{flex:1,minWidth:220},placeholder:"验收结论:交付了什么、遗留什么",value:W,onChange:Rn=>$e(Rn.target.value)}),s("button",{className:"ds-btn ds-btn-primary",onClick:()=>void Vt("sign")},"需求验收签字")):s("div",{className:"ds-gate-sign"},s("div",{className:"ds-hint",style:{flex:1}},`✍ ${xt.by} 于 ${Qe(xt.at)} 签字:${xt.note}`),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void Vt("clear")},"取消签字")),ke===null?null:s("div",{className:"ds-hint"},ke)))})(),s("div",{className:"ds-sec-head",style:{marginTop:16}},"交付物归档(飞书云盘)",s("div",{className:"ds-req-actions"},nn.url?s("a",{className:"ds-link",href:nn.url,target:"_blank",rel:"noreferrer"},"打开文件夹"):null,s("button",{className:"ds-btn ds-btn-ghost",disabled:Ve,onClick:()=>void ge()},nn.url?"校验文件夹":"创建文件夹"),s("button",{className:"ds-btn",disabled:Ve||He.length===0,onClick:()=>void Va()},Ve?"归档中…":`归档 ${He.length} 件交付物`))),s("div",{className:"ds-hint"},nn.url?`文件夹:${nn.name||nn.token} 已归档 ${He.filter(O=>O.doc?.url).length}/${He.length} 件交付物`:nn.error?`上次创建失败:${nn.error}`:"还没有云盘文件夹;建好后,这条需求下每件交付物都会写成文件夹里的一份 Markdown 文档。"),fe?s("div",{className:"ds-hint"},fe):null,s("div",{className:"ds-sec-head",style:{marginTop:16}},"文档与基线",s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void yt(null)},"+ 添加文档")),U.baseline?s("div",{className:"ds-base-box"},s("div",{className:"ds-base-main"},s("b",null,`当前基线 ${U.baseline.version}`),s("span",null,`${U.baseline.title} · 生效于 ${Qe(U.baseline.at)} · ${U.baseline.by||"人"} · 正文 ${U.baseline.contentLength??0} 字`)),s("button",{className:"ds-btn ds-btn-ghost",title:"把当前文档和这份基线逐行比一遍(只读)",onClick:()=>void Qt()},T===null?"对比基线":"收起对比"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void da()},"取消基线")):s("div",{className:"ds-base-box","data-empty":"1"},s("div",{className:"ds-base-main"},s("b",null,"还没有基线"),s("span",null,"PRD 评审通过后点「设为基线」,之后建的卡都会记下用的是哪一版。"))),U.baseline!==null&&T!==null?s("div",{className:"ds-diff"},s("div",{className:"ds-diff-head"},s("b",null,`基线 ${T.version} → 当前:${T.docTitle}`),s("span",{className:"ds-hint"},T.summary.added+T.summary.removed===0?"正文没有变化":`+${T.summary.added} 行 / −${T.summary.removed} 行`)),s("div",{className:"ds-diff-body"},T.rows.slice(0,400).map((O,ue)=>s("div",{key:ue,className:"ds-diff-line","data-kind":O.kind},`${O.kind==="add"?"+":O.kind==="del"?"−":" "} ${O.text}`)),T.rows.length>400?s("div",{className:"ds-hint"},`(还有 ${T.rows.length-400} 行未显示)`):null)):null,(U.docs??[]).length===0?s("div",{className:"ds-hint",style:{marginTop:8}},"还没有登记文档。可以先加 PRD 链接,把正文粘进来,评审通过后设为基线。"):s("div",null,s("div",{className:"ds-row",style:{marginTop:8,gap:8,alignItems:"center"}},s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void ie()},R===null?"全部展开":"全部收起"),s("span",{className:"ds-hint"},`共 ${(U.docs??[]).length} 篇,展开后可直接读 Markdown 正文`)),s("div",{className:"ds-doc-list"},(U.docs??[]).map(O=>s("div",{key:O.id,className:"ds-doc-wrap"},s("div",{className:"ds-doc-row"},s(b,{className:"ds-chip","data-doc":O.kind},Qp[O.kind]??O.kind),s("div",{className:"ds-doc-main"},s("div",{className:"ds-doc-title"},O.url===""?O.title:s("a",{className:"ds-link",href:O.url,target:"_blank",rel:"noreferrer"},O.title),s("span",{className:"ds-chip-code"},O.version),s(b,{className:"ds-chip","data-docstatus":O.status},ox[O.status]??O.status)),s("div",{className:"ds-doc-meta"},`正文 ${O.contentLength??0} 字 · ${O.by||"—"} · ${O.at>0?Qe(O.at):"—"}`)),s("div",{className:"ds-listrow-actions"},O.status==="baseline"?null:s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void St(O.id)},"设为基线"),s("button",{className:"ds-btn ds-btn-ghost",title:"直接读正文(Markdown 渲染)",onClick:()=>void jt(O.id)},L!==null&&L.id===O.id?"收起":"阅读"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void yt(O.id)},"编辑"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void Pn(O.id),"data-danger":"1"},"删除"))),L!==null&&L.id===O.id?s("div",{className:"ds-md-preview ds-reader"},L.busy?s("span",{className:"ds-hint"},"读取中…"):L.content.trim()===""?s("span",{className:"ds-hint"},"这条文档还没有正文。"):f(L.content)):R!==null&&R[O.id]!==void 0?s("div",{className:"ds-md-preview ds-reader"},R[O.id].trim()===""?s("span",{className:"ds-hint"},"这条文档还没有正文。"):f(R[O.id])):null)))),q===null?null:s("div",{className:"ds-hint",style:{marginTop:6}},q),G===null?null:s("div",{className:"ds-panel ds-form-panel",style:{marginTop:10}},s("div",{className:"ds-panel-head"},G.id===void 0?"添加文档":`编辑 ${G.title}`),s("div",{className:"ds-panel-body"},s("div",{className:"ds-row",style:{gap:10}},s("div",{className:"ds-field",style:{flex:"0 0 150px"}},s("div",{className:"ds-label"},"类型"),s(g,{className:"ds-select",value:G.kind,onChange:O=>J({...G,kind:O.target.value})},rx.map(O=>s("option",{key:O,value:O},Qp[O])))),s("div",{className:"ds-field",style:{flex:"1 1 220px"}},s("div",{className:"ds-label"},"标题"),s(v,{className:"ds-input",value:G.title,placeholder:"例如 会员积分抵扣 PRD",onChange:O=>J({...G,title:O.target.value})})),s("div",{className:"ds-field",style:{flex:"0 0 110px"}},s("div",{className:"ds-label"},"版本"),s(v,{className:"ds-input",value:G.version,placeholder:"v1.0",onChange:O=>J({...G,version:O.target.value})}))),s("div",{className:"ds-row",style:{gap:10}},s("div",{className:"ds-field",style:{flex:"1 1 auto"}},s("div",{className:"ds-label"},"飞书文档链接"),s(v,{className:"ds-input",value:G.url,placeholder:"https://<租户>.feishu.cn/wiki/…",onChange:O=>J({...G,url:O.target.value})})),s("div",{className:"ds-field",style:{flex:"0 0 auto",justifyContent:"flex-end"}},s("div",{className:"ds-label"}," "),s("button",{className:"ds-btn",disabled:K,onClick:()=>void Ra()},K?"拉取中…":"从链接拉正文"))),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"文档正文(拉不到就自己粘,研发和测试都读这一份)"),s(d,{className:"ds-textarea",rows:8,value:G.content,onChange:O=>J({...G,content:O.target.value})})),s("div",{className:"ds-row",style:{justifyContent:"flex-end",gap:8}},s("button",{className:"ds-btn",onClick:()=>{J(null),B(null)}},"取消"),s("button",{className:"ds-btn ds-btn-primary",disabled:K,onClick:()=>void Ce()},"保存文档")))),s("div",{className:"ds-pane-head",style:{marginTop:16}},s("div",{className:"ds-pane-title"},"功能点与可追溯矩阵"),s("div",{className:"ds-pane-desc"},"功能点是需求的骨架:一条功能点对若干张卡、若干条用例。卡和用例上都挂 pointId,这里就能看出哪条没人做、哪条没被验证。")),F===null?s("div",{className:"ds-hint",style:{padding:"6px 0"}},"还没有功能点。点「+ 加功能点」把需求拆成可交付、可验证的条目。"):s("div",{className:"ds-matrix"},s("div",{className:"ds-matrix-sum"},`功能点 ${F.summary.points} · 已覆盖 ${F.summary.coveredPoints}${F.summary.pointsWithoutCases>0?`(${F.summary.pointsWithoutCases} 条还没有用例,覆盖率 ${F.summary.coverageRate}%)`:""} · 卡 ${F.summary.cards}(未归点 ${F.summary.looseCards})· 用例 ${F.summary.cases}(通过 ${F.summary.pass}${F.summary.fail>0?`,失败 ${F.summary.fail}`:""})· 通过率 ${F.summary.passRate}%`),(F.points??[]).map(O=>s("div",{key:O.id,className:"ds-pt-row","data-covered":O.covered?"1":"0"},s("div",{className:"ds-pt-main"},s("div",{className:"ds-pt-title"},s("span",{className:"ds-chip-code"},O.id),s("b",null,O.title),s(b,{className:"ds-chip","data-pt":O.covered?"covered":"open"},O.covered?"已覆盖":"未覆盖")),String(O.description??"")===""?null:s("div",{className:"ds-req-desc ds-md"},f(O.description)),s("div",{className:"ds-pt-meta"},`卡 ${O.cards.length}${O.cards.length===0?"(还没人做)":":"+O.cards.map(ue=>ue.code||ue.id).join("、")}`,` · 用例 ${O.cases.total}(通过 ${O.cases.pass}${O.cases.fail>0?`,失败 ${O.cases.fail}`:""}${O.cases.pending>0?`,没跑 ${O.cases.pending}`:""})`,O.acceptance.length===0?"":` · 验收条件 ${O.acceptance.filter(ue=>ue.covered).length}/${O.acceptance.length}`)),s("div",{className:"ds-listrow-actions"},s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>me({...O,acceptanceText:(O.acceptance??[]).map(ue=>ue.text).join(`
|
|
46
|
+
`)})},"编辑"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void Is(O.id),"data-danger":"1"},"删除")))),(F.loose??[]).length===0?null:s("div",{className:"ds-pt-loose"},s("div",{className:"ds-hint",style:{marginBottom:6}},`还有 ${F.loose.length} 张卡没归到功能点,选一个挂上去,矩阵才算完整:`),F.loose.map(O=>s("div",{key:O.id,className:"ds-pt-loose-row"},s("span",{className:"ds-chip-code"},O.code||O.id),s("span",{className:"ds-pt-loose-title"},O.title),s(g,{className:"ds-select",style:{width:220},value:"",onChange:ue=>{ue.target.value!==""&&Z(O.id,ue.target.value)}},s("option",{value:""},"挂到…"),(F.points??[]).map(ue=>s("option",{key:ue.id,value:ue.id},`${ue.id} ${ue.title}`))))))),s("div",{className:"ds-row",style:{gap:8,marginTop:10,alignItems:"center"}},s("button",{className:"ds-btn",onClick:()=>me(ds())},"+ 加功能点"),s("button",{className:"ds-btn ds-btn-primary",disabled:qe,onClick:()=>void _t()},qe?"拆卡中…":"按未覆盖的功能点拆卡"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>{U!==null&&et(U.id)}},"刷新矩阵"),tt===null?null:s("span",{className:"ds-hint"},tt),xe===null?null:s("span",{className:"ds-hint"},xe)),oe===null?null:s("div",{className:"ds-panel ds-form-panel",style:{marginTop:10}},s("div",{className:"ds-panel-head"},oe.id===void 0?"新增功能点":`编辑功能点 ${oe.id}`),s("div",{className:"ds-panel-body"},s("div",{className:"ds-field"},s("div",{className:"ds-label"},"功能点标题"),s(v,{className:"ds-input",value:oe.title,placeholder:"例如 结算页展示可用积分",onChange:O=>me({...oe,title:O.target.value})})),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"说明"),s(d,{className:"ds-textarea",rows:3,value:oe.description??"",onChange:O=>me({...oe,description:O.target.value})})),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"验收条件(一行一条,做成什么样算完成)"),s(x,{className:"ds-textarea",rows:4,value:oe.acceptanceText??"",onChange:O=>me({...oe,acceptanceText:O.target.value})})),s("div",{className:"ds-row",style:{gap:10}},s("div",{className:"ds-field",style:{flex:"0 0 150px"}},s("div",{className:"ds-label"},"优先级"),s(g,{className:"ds-select",value:oe.priority,onChange:O=>me({...oe,priority:O.target.value})},s("option",{value:"urgent"},"紧急"),s("option",{value:"normal"},"普通"),s("option",{value:"relaxed"},"可缓"))),s("div",{className:"ds-field",style:{flex:"0 0 150px"}},s("div",{className:"ds-label"},"状态"),s(g,{className:"ds-select",value:oe.status,onChange:O=>me({...oe,status:O.target.value})},s("option",{value:"draft"},"草稿"),s("option",{value:"ready"},"就绪"),s("option",{value:"done"},"已完成")))),s("div",{className:"ds-row",style:{justifyContent:"flex-end",gap:8}},s("button",{className:"ds-btn",onClick:()=>me(null)},"取消"),s("button",{className:"ds-btn ds-btn-primary",onClick:()=>void wa()},"保存功能点")))),s("div",{className:"ds-req-stats"},s("div",{className:"ds-stat-box"},s("b",null,`${z}/${Y.length}`),s("span",null,"卡已完成")),s("div",{className:"ds-stat-box","data-warn":de>0?"1":"0"},s("b",null,String(de)),s("span",null,"阻塞")),s("div",{className:"ds-stat-box","data-warn":Le>0?"1":"0"},s("b",null,String(Le)),s("span",null,"未结缺陷")),s("div",{className:"ds-stat-box"},s("b",null,`${We.done}/${We.total}`),s("span",null,"验收清单")),s("div",{className:"ds-stat-box"},s("b",null,`${Ke.pass}/${Ke.total}`),s("span",null,"用例通过")),s("div",{className:"ds-stat-box"},s("b",null,String(He.length)),s("span",null,"交付物")),s("div",{className:"ds-stat-box"},s("b",null,String(_n.length)),s("span",null,"MR"))),s("div",{className:"ds-sec-head",style:{marginTop:14}},`这张需求下的 ${Y.length} 张卡`),Y.length===0?s("div",{className:"ds-empty"},"还没有挂上来的卡。建卡时选择这条需求,编号会自动分配。"):s("div",{className:"ds-req-tasks"},Y.map(O=>s("div",{key:O.id,className:"ds-listrow ds-req-task",onClick:()=>t(O.id)},s("div",{className:"ds-listrow-main"},s("div",{className:"ds-req-task-title"},O.code?s(b,{className:"ds-chip ds-chip-code"},O.code):null,s("span",null,O.title)),s("div",{className:"ds-hint"},`${be(O.status)}${(()=>{const ue=O.expert===""?"":(e.config.experts??[]).find(Me=>Me.id===O.expert)?.name??O.expert;return ue===""?"":` · ${ue}`})()}${O.dueAt>0?` · 截止 ${Wa(O.dueAt)}`:""}`)),s("div",{className:"ds-listrow-actions"},O.blocked!==void 0&&O.blocked!==null?s(b,{className:"ds-chip ds-chip-blocked"},"⛔"):null,O.type==="bug"?s(b,{className:"ds-chip ds-chip-bug","data-sev":O.severity??"p2"},"BUG"):null)))),_n.length>0?s("div",null,s("div",{className:"ds-sec-head",style:{marginTop:14}},"关联 MR"),_n.map(O=>s("div",{key:O.id,className:"ds-hint"},`${O.code||O.id} · !${O.gitlabMR.iid} ${O.gitlabMR.title??""}(${O.gitlabMR.state||"open"})`))):null)})();return s("div",{className:"ds-body"},j!==null?s("div",{className:"ds-err",style:{marginBottom:10}},j):null,Dt,s("div",{className:"ds-req-grid"},s("div",{className:"ds-intake-launch",style:{display:"flex",gap:8,padding:"0 0 8px"}},s("span",{className:"ds-hint"},"新建需求请用右上角「+ 新建」")),s("div",{className:"ds-req-list"},s("div",{className:"ds-req-list-head"},s("span",null,`需求 ${h.length}`),s("button",{className:"ds-btn ds-btn-ghost",style:{marginLeft:8},title:"按来源筛选:全部 / 业务提单 / 内部",onClick:()=>{const Y=window.localStorage.getItem("dsh-studio:reqsrc")??"all";window.localStorage.setItem("dsh-studio:reqsrc",Y==="all"?"business":Y==="business"?"internal":"all"),window.dispatchEvent(new Event("resize"))}},(window.localStorage.getItem("dsh-studio:reqsrc")??"all")==="all"?"来源:全部":window.localStorage.getItem("dsh-studio:reqsrc")==="business"?"来源:业务提单":"来源:内部")),h.length===0?s("div",{className:"ds-empty"},"还没有需求。先建一条——后面所有的卡、用例、缺陷、MR 都会挂在它下面。"):((window.localStorage.getItem("dsh-studio:reqsort")??"score")==="score"?h.slice().sort((Y,z)=>(z.pool?.score??0)-(Y.pool?.score??0)):h).map(Y=>{const z=window.localStorage.getItem("dsh-studio:reqsrc")??"all";if(z!=="all"&&(Y.source==="business"?"business":"internal")!==z)return null;const de=ee(Y.id),Le=de.filter(He=>He.status==="done").length,We=Y.progress?.progress??(de.length===0?0:Math.round(Le/de.length*100)),Ke=Y.progress?.gate??null;return s("div",{key:Y.id,className:"ds-req-item","data-on":Y.id===S?"1":"0",onClick:()=>C(Y.id)},s("div",{className:"ds-req-item-title"},Y.title),s("div",{className:"ds-req-item-meta"},s(b,{className:"ds-chip ds-chip-code"},Y.code||"未编号"),Y.source==="business"?s(b,{className:"ds-chip","data-src":"business",title:[Y.requester?.name,Y.requester?.dept].filter(Boolean).join(" · ")||"业务提单"},"业务提单"):null,s(b,{className:"ds-chip","data-req":Y.status},Tr[Y.status]??Y.status),s("span",{className:"ds-hint"},`${Le}/${de.length} 卡`),Ke===null?null:s("span",{className:"ds-hint",style:{color:Ke.ready?"#0f9d58":"#b26a00"}},Ke.ready?"准出通过":`还差 ${Ke.blockers.length} 项`)),s("div",{className:"ds-check-bar","data-full":We===100?"1":"0",style:{marginTop:2}},s("span",{style:{width:`${We}%`}})))})),s("div",{className:"ds-req-detail"},Ot)))}function nw({state:e,onOpenTask:t}){const{h:a,React:n,api:r,toast:s,confirmDialog:o,promptDialog:i,tipOf:l,TextField:c,ChipField:u,CheckField:p,SelectField:f,MdField:v}=ht(),[x,b]=n.useState([]),[k,g]=n.useState(null),[d,h]=n.useState(null),[y,S]=n.useState(null),[C,E]=n.useState(""),[_,I]=n.useState(null),[j,H]=n.useState(""),[M,P]=n.useState(!1),[G,J]=n.useState(""),[q,B]=n.useState(""),[L,w]=n.useState(""),[T,Q]=n.useState("10"),[R,D]=n.useState(""),[K,we]=n.useState(""),fe=n.useCallback(async W=>{const ke=(await r("/releases")).releases??[];b(ke);const Ie=W??(ke.some(qa=>qa.id===k)?k:ke[0]?.id??null);if(g(Ie),Ie===null){h(null);return}const Ue=await r("/release/get",{id:Ie});h(Ue),S({id:Ue.release.id,version:Ue.release.version,name:Ue.release.name,project:Ue.release.project,owner:Ue.release.owner,status:Ue.release.status,plannedAt:Ue.release.plannedAt,tagName:Ue.release.tagName??"",commitSha:Ue.release.commitSha??""}),E(Ue.release.notes??"")},[k]);n.useEffect(()=>{let W=!0;return fe().then(()=>{W&&I(null)}).catch($e=>{W&&I($e instanceof Error?$e.message:String($e))}),()=>{W=!1}},[e.revision,fe]);async function ye(W){g(W),P(!0);try{const $e=await r("/release/get",{id:W});h($e),S({id:$e.release.id,version:$e.release.version,name:$e.release.name,project:$e.release.project,owner:$e.release.owner,status:$e.release.status,plannedAt:$e.release.plannedAt,tagName:$e.release.tagName??"",commitSha:$e.release.commitSha??""}),E($e.release.notes??""),H("")}catch($e){I($e instanceof Error?$e.message:String($e))}finally{P(!1)}}function Ve(){g(null),h(null),S({id:"",version:"",name:"",project:"",owner:"",status:"draft",plannedAt:0,tagName:"",commitSha:""}),E(""),H("")}async function ae(W,$e,ke){P(!0),I(null);try{const Ie=await r(W,$e);H(ke??"已保存"),s(ke??"已保存"),s(ke??"已保存"),await fe(Ie.release?.id??k)}catch(Ie){const Ue=Ie instanceof Error?Ie.message:String(Ie);I(Ue),s(Ue,"error")}finally{P(!1)}}if(_!==null&&x.length===0)return a("div",{className:"ds-body"},a("div",{className:"ds-err"},_));const F=d?.gate,te=d?.release,xe=d?.tasks??[],X=e.tasks.filter(W=>W.releaseId===""||W.releaseId===void 0),oe=a("div",{className:"ds-req-list"},a("div",{className:"ds-row",style:{justifyContent:"space-between",marginBottom:6}},a("span",{className:"ds-hint"},`${x.length} 个版本`),a("button",{className:"ds-btn",onClick:Ve},"+ 新建版本")),x.length===0?a("div",{className:"ds-empty"},"还没有版本。先建一个版本,再把卡挂上来。"):x.map(W=>a("div",{key:W.id,className:"ds-req-item","data-on":k===W.id?"1":"0",onClick:()=>void ye(W.id)},a("div",{className:"ds-req-item-title"},`${W.version||W.id} ${W.name}`.trim()),a("div",{className:"ds-req-item-meta"},a(u,{className:"ds-chip","data-kind":W.status},Xp[W.status]??W.status),a(u,{className:"ds-chip"},`${W.gate.stats.done}/${W.gate.stats.tasks} 卡`),W.gate.blockers.length===0?a(u,{className:"ds-chip",style:{color:"#0f9d58",borderColor:"#0f9d5855"}},"门禁通过"):a(u,{className:"ds-chip ds-chip-blocked"},`${W.gate.blockers.length} 项拦着`))))),me=y===null?a("div",{className:"ds-hint"},"左边选一个版本,或者新建一个。"):a("div",{className:"ds-req-detail"},(te?.requirements??[]).length===0?null:a("div",{className:"ds-row",style:{flexWrap:"wrap",gap:6,marginBottom:8}},a("span",{className:"ds-hint"},`这个版本涉及 ${te.requirements.length} 条需求:`),te.requirements.map(W=>a("span",{key:W.id,className:"ds-chip",title:W.title},`${W.code||W.id} ${W.title}(${Tr[W.derived]??W.derived})`))),a("div",{className:"ds-req-headline"},a("div",null,a("div",{className:"ds-req-name"},`${y.version||"未编号"} ${y.name}`.trim()),a("div",{className:"ds-hint"},te==null?"新版本:先填版本号与名字,保存后可以把卡挂进来":`创建于 ${Wa(te.createdAt)}${te.releasedAt>0?` · 发布于 ${Wa(te.releasedAt)}`:""}${te.approveBy!==""?` · 审批人 ${te.approveBy}`:""}`)),a("div",{className:"ds-req-actions"},a(f,{className:"ds-select",style:{width:108},value:y.status,onChange:W=>S({...y,status:W.target.value})},ix.map(W=>a("option",{key:W,value:W},Xp[W]))))),a("div",{className:"ds-panel",style:{marginTop:4}},a("div",{className:"ds-panel-head"},"版本信息"),a("div",{className:"ds-panel-body ds-grid2"},a("label",{className:"ds-field"},a("span",{},"版本号"),a(c,{className:"ds-input",value:y.version,placeholder:"v1.3.0",disabled:te?.status==="released",onChange:W=>S({...y,version:W.target.value})})),a("label",{className:"ds-field"},a("span",{},"版本名"),a(c,{className:"ds-input",value:y.name,placeholder:"积分抵扣首个版本",onChange:W=>S({...y,name:W.target.value})})),a("label",{className:"ds-field"},a("span",{},"业务项目"),a(f,{className:"ds-select",value:y.project,onChange:W=>S({...y,project:W.target.value})},a("option",{value:""},"不属于任何项目"),(e.config.projects??[]).map(W=>a("option",{key:W.id,value:W.id},W.name)))),a("label",{className:"ds-field"},a("span",{},"发布负责人"),a(c,{className:"ds-input",value:y.owner,onChange:W=>S({...y,owner:W.target.value})})),a("label",{className:"ds-field"},a("span",{},"计划发布时间"),a(c,{className:"ds-input",type:"date",value:Zp(y.plannedAt),onChange:W=>S({...y,plannedAt:Pr(W.target.value)})})),a("label",{className:"ds-field"},a("span",{},"发布标签(tag)"),a(c,{className:"ds-input",value:y.tagName??"",placeholder:"v1.0.0",onChange:W=>S({...y,tagName:W.target.value})})),a("label",{className:"ds-field"},a("span",{},"对应提交(sha,选填)"),a(c,{className:"ds-input",value:y.commitSha??"",placeholder:"a1b2c3d",onChange:W=>S({...y,commitSha:W.target.value})})),a("div",{className:"ds-row",style:{alignItems:"flex-end",justifyContent:"flex-end",gap:8}},a("button",{className:"ds-btn ds-btn-primary",disabled:M,onClick:()=>void ae("/release/save",{release:y},"版本已保存")},"保存"),y.id===""?null:a("button",{className:"ds-btn ds-btn-ghost",disabled:M,style:{color:"var(--destructive)"},onClick:async()=>{await o("删除这个版本?卡会保留,只是脱离版本。",{title:"删除版本",danger:!0,okText:"删除"})&&ae("/release/delete",{id:y.id},"版本已删除")}},"删除")))),te==null?null:a("div",{className:"ds-panel",style:{marginTop:12}},a("div",{className:"ds-panel-head"},"发布门禁",a("span",{className:"ds-hint"},"卡全做完、没阻塞、缺陷关闭、用例没有失败,才算能发")),a("div",{className:"ds-panel-body"},a("div",{className:"ds-req-stats"},a("div",{className:"ds-stat-box"},a("b",{},String(F?.stats.done??0)),a("span",{},"已完成卡")),a("div",{className:"ds-stat-box"},a("b",{"data-warn":(F?.stats.open??0)>0?"1":"0"},String(F?.stats.open??0)),a("span",{},"未完成")),a("div",{className:"ds-stat-box"},a("b",{"data-warn":(F?.stats.blocked??0)>0?"1":"0"},String(F?.stats.blocked??0)),a("span",{},"阻塞")),a("div",{className:"ds-stat-box"},a("b",{"data-warn":(F?.stats.bugs??0)>0?"1":"0"},String(F?.stats.bugs??0)),a("span",{},"未结缺陷")),a("div",{className:"ds-stat-box"},a("b",{"data-warn":(F?.stats.failing??0)>0?"1":"0"},String(F?.stats.failing??0)),a("span",{},"失败用例")),a("div",{className:"ds-stat-box"},a("b",{},String(F?.stats.artifacts??0)),a("span",{},"交付物"))),(F?.blockers??[]).map((W,$e)=>a("div",{key:`b${$e}`,className:"ds-error"},`⛔ ${W}`)),(F?.warnings??[]).map((W,$e)=>a("div",{key:`w${$e}`,className:"ds-hint"},`⚠ ${W}`)),a("div",{className:"ds-action-bar"},a("div",{className:"ds-action-bar-left"},a("button",{className:"ds-btn ds-btn-ghost",disabled:M,onClick:()=>void ae("/release/notes",{id:y.id},"发布说明已生成")},"生成发布说明"),a("button",{className:"ds-btn",disabled:M||!F?.ready,onClick:()=>void ae("/release/approve",{id:y.id,by:"人"},"已审批,可以发布了")},"审批通过")),a("div",{className:"ds-action-bar-right"},a("button",{className:"ds-btn ds-btn-primary",disabled:M||!F?.ready||te.status==="released",onClick:()=>void ae("/release/publish",{id:y.id,by:"人"},"已发布")},te.status==="released"?"已发布":"发布"),l("发布准入(预发部署 / 需求签字)没过时也要发:必须写原因,会记进部署日志",a("button",{className:"ds-btn ds-btn-ghost",disabled:M||!F?.ready||te.status==="released","data-force":"1",onClick:async()=>{const W=await i("强制发布的原因(会记进部署日志,便于复盘):",{title:"强制发布",okText:"强制发布",placeholder:"为什么不等预发部署 / 需求签字?"});if(W!==null){if(String(W).trim()===""){H("强制发布必须写原因");return}ae("/release/publish",{id:y.id,by:"人",force:!0,forceNote:String(W).trim()},"已强制发布(原因已记入部署日志)")}}},"强制发布")),te.status==="released"?a("button",{className:"ds-btn ds-btn-ghost",disabled:M,onClick:async()=>{const W=await i("回滚原因(要进复盘记录):",{title:"回滚这个版本",danger:!0,okText:"回滚"});W!==null&&W.trim()!==""&&ae("/release/rollback",{id:y.id,reason:W},"已回滚")}},"回滚"):null)),te.rollbackReason===""?null:a("div",{className:"ds-error"},`回滚原因:${te.rollbackReason}`))),te==null?null:a("div",{className:"ds-panel",style:{marginTop:12}},a("div",{className:"ds-panel-head"},"发布冒烟清单",a("span",{className:"ds-hint"},`${(te.smoke??[]).filter(W=>W.done).length}/${(te.smoke??[]).length} 项已过 · 发布前逐条点过,门禁才算过`)),a("div",{className:"ds-panel-body"},(te.smoke??[]).length===0?a("div",{className:"ds-empty"},"还没有冒烟项:把发布前必验的几条写在这里,比如「能登录」「下单支付成功」「首页不报错」。"):null,(te.smoke??[]).map(W=>a("div",{key:W.id,className:"ds-listrow"},a("label",{className:"ds-row",style:{gap:8,alignItems:"center",flex:1,cursor:"pointer"}},a(p,{checked:W.done===!0,onChange:()=>void ae("/release/smoke",{id:y.id,action:"toggle",itemId:W.id,done:W.done!==!0,by:"人"},W.done?"已取消":"冒烟项已过")}),a("span",{className:W.done?"ds-smoke-done":""},W.text)),W.done&&W.by!==""?a("span",{className:"ds-hint"},`${W.by} · ${Wa(W.at)}`):null,a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn ds-btn-ghost",disabled:M,onClick:()=>void ae("/release/smoke",{id:y.id,action:"remove",itemId:W.id},"已删除")},"×")))),a("div",{className:"ds-row",style:{gap:8,marginTop:8}},a(c,{className:"ds-input",style:{flex:1},value:q,placeholder:"发布前必须验证什么?",onChange:W=>B(W.target.value)}),a("button",{className:"ds-btn",disabled:M||q.trim()==="",onClick:()=>{const W=q.trim();W!==""&&(B(""),ae("/release/smoke",{id:y.id,action:"add",text:W},"已加冒烟项"))}},"+ 加一条")))),te==null?null:a("div",{className:"ds-panel",style:{marginTop:12}},a("div",{className:"ds-panel-head"},"审批、灰度与部署记录",a("span",{className:"ds-hint"},`审批 ${(te.approvals??[]).length} 条 · 灰度 ${(te.grayBatches??[]).length} 批`)),a("div",{className:"ds-panel-body"},(te.approvals??[]).length===0?a("div",{className:"ds-empty"},"还没有审批记录:点上面的「审批通过」,系统会把谁批的、什么结论记在这里。"):(te.approvals??[]).map(W=>a("div",{key:W.id,className:"ds-listrow"},a("div",{className:"ds-listrow-main"},a("div",null,`${W.by} 审批通过`),a("div",{className:"ds-hint"},W.note||"(没写结论)")),a("span",{className:"ds-hint"},Wa(W.at)))),a("div",{style:{borderTop:"1px solid var(--ds-line)",margin:"10px 0"}}),(te.grayBatches??[]).length===0?a("div",{className:"ds-hint"},"没有灰度批次:发布就是一次性全量。先加一批 10% 跑一轮再全量,出事好收。"):(te.grayBatches??[]).map(W=>a("div",{key:W.id,className:"ds-listrow"},a("div",{className:"ds-listrow-main"},a("div",null,`${W.name} · ${W.percent}%`),a("div",{className:"ds-hint"},`${{pending:"待开始",running:"灰度中",passed:"已通过",rolled_back:"已回滚"}[W.status]??W.status}${W.note===""?"":` · ${W.note}`}`)),a("div",{className:"ds-listrow-actions"},W.status==="pending"?a("button",{className:"ds-btn ds-btn-ghost",disabled:M,onClick:()=>void ae("/release/gray",{id:y.id,action:"start",batchId:W.id,by:"人"},"已开始灰度")},"开始"):null,W.status==="running"?a("button",{className:"ds-btn ds-btn-ghost",disabled:M,onClick:()=>void ae("/release/gray",{id:y.id,action:"advance",batchId:W.id,by:"人"},"这一批已通过")},"通过"):null,W.status==="passed"?a(u,{className:"ds-chip","data-on":"1"},"已通过"):null,W.status==="rolled_back"?a(u,{className:"ds-chip","data-sla":"overdue"},"已回滚"):null))),a("div",{className:"ds-row",style:{gap:8,marginTop:8}},a(c,{className:"ds-input",style:{flex:2},value:L,placeholder:"批次名,例如 内测用户",onChange:W=>w(W.target.value)}),a(c,{className:"ds-input",style:{flex:"0 0 88px"},type:"number",min:1,max:100,value:T,onChange:W=>Q(W.target.value)}),a("button",{className:"ds-btn",disabled:M||Number(T)<=0,onClick:async()=>{await ae("/release/gray",{id:y.id,action:"add",name:L,percent:Number(T),by:"人"},"已加一批灰度"),w(""),Q("10")}},"+ 加一批")),a("div",{style:{borderTop:"1px solid var(--ds-line)",margin:"10px 0"}}),a("div",{className:"ds-hint"},"上过哪些环境(只登记,不触发部署)"),(te.deploys??[]).length===0?null:a("div",{className:"ds-row",style:{flexWrap:"wrap",gap:6,marginTop:6}},te.deploys.map(W=>a("span",{key:W.id,className:"ds-chip","data-env":W.kind,"data-on":W.at===0?"0":"1",title:W.at===0?`还没登记部署到「${W.name}」`:`${W.name}:${Wa(W.at)} ${W.action} · ${W.by}`},W.at===0?`${W.name} —`:`${W.name} ✓`))),a("div",{className:"ds-row",style:{gap:8,marginTop:8}},a(f,{className:"ds-input",style:{flex:"0 0 148px"},value:R,onChange:W=>D(W.target.value)},a("option",{value:""},"选环境…"),(e.config?.environments??[]).map(W=>a("option",{key:W.id,value:W.id},W.name))),a(c,{className:"ds-input",style:{flex:1},value:K,placeholder:"备注:谁发的、发了什么(可留空)",onChange:W=>we(W.target.value)}),a("button",{className:"ds-btn",disabled:M||R==="",onClick:async()=>{await ae("/release/deploy",{id:y.id,env:R,note:K,by:"人"},"已登记部署(没有触发任何部署)"),we("")}},"登记部署")),a("div",{className:"ds-hint",style:{marginTop:10}},"部署与灰度记录(最近 8 条)"),(()=>{const W={pending:"待开始",running:"灰度中",passed:"已通过",rolled_back:"已回滚"},$e=[...(te.deployLog??[]).map(ke=>({at:ke.at,kind:"deploy",by:ke.by,text:`${ke.action}${ke.env===""?"":` · ${(e.config?.environments??[]).find(Ie=>Ie.id===ke.env)?.name??ke.env}`}`,note:ke.note})),...(te.grayBatches??[]).map(ke=>({at:ke.at??ke.createdAt??0,kind:"gray",by:ke.by??"人",text:`灰度 ${ke.name} ${ke.percent}%`,note:W[ke.status]??ke.status}))].filter(ke=>ke.at).sort((ke,Ie)=>ke.at-Ie.at).slice(-8).reverse();return $e.length===0?a("div",{className:"ds-empty"},"还没有部署或灰度记录。"):$e.map(ke=>a("div",{key:`${ke.at}-${ke.kind}-${ke.text}`,className:"ds-hint"},a("span",{className:"ds-chip",style:{marginRight:6}},ke.kind==="gray"?"灰度":"部署"),`${Wa(ke.at)} · ${ke.text} · ${ke.by}${ke.note===""||ke.note===void 0?"":`:${ke.note}`}`))})())),te==null?null:a("div",{className:"ds-panel",style:{marginTop:12}},a("div",{className:"ds-panel-head"},"这个版本里的卡",a("span",{className:"ds-hint"},`${xe.length} 张`)),a("div",{className:"ds-panel-body"},xe.length===0?a("div",{className:"ds-empty"},"还没有卡。从下面挑,或者在卡片详情里选「所属版本」。"):xe.map(W=>a("div",{key:W.id,className:"ds-listrow"},a("div",{className:"ds-listrow-main"},a("div",null,`${W.code?`${W.code} `:""}${W.title}`),a("div",{className:"ds-hint"},`${(e.statuses??[]).find($e=>$e.id===W.status)?.label??W.status}${W.blocked!==null&&W.blocked!==void 0?" · 阻塞":""}${W.type==="bug"?" · 缺陷":""}`)),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>t(W.id)},"打开"),a("button",{className:"ds-btn ds-btn-ghost",disabled:M,onClick:()=>void ae("/release/link",{id:y.id,taskId:W.id,action:"remove"},"已从版本移除")},"移除")))),a("div",{className:"ds-row",style:{marginTop:8}},a(f,{className:"ds-select",style:{flex:1},value:G,onChange:W=>J(W.target.value)},a("option",{value:""},`挑一张卡挂进来(${X.length} 张可选)`),X.map(W=>a("option",{key:W.id,value:W.id},`${W.code?`${W.code} `:""}${W.title}`))),a("button",{className:"ds-btn",disabled:M||G==="",onClick:async()=>{await ae("/release/link",{id:y.id,taskId:G,action:"add"},"已挂到这个版本"),J("")}},"挂进来")))),te==null?null:a("div",{className:"ds-panel",style:{marginTop:12}},a("div",{className:"ds-panel-head"},"发布说明",a("button",{className:"ds-btn ds-btn-ghost",disabled:M,onClick:()=>void navigator.clipboard?.writeText(C).then(()=>H("发布说明已复制"),()=>{})},"复制")),a("div",{className:"ds-panel-body"},a(v,{className:"ds-input",rows:12,value:C,placeholder:"点「生成发布说明」按类型自动汇总;之后可以在这里手动补充",onChange:W=>E(W.target.value),onBlur:()=>{C!==(te.notes??"")&&ae("/release/save",{release:{...y,notes:C}},"发布说明已保存")}}))),_===null?null:a("div",{className:"ds-error",style:{marginTop:8}},_),j===""?null:a("div",{className:"ds-hint",style:{marginTop:8}},j));return a("div",{className:"ds-body"},a("div",{className:"ds-req-grid"},oe,me))}function sw({state:e,onOpenTask:t}){const{h:a,React:n,api:r,SelectField:s}=ht(),[o,i]=n.useState(30),[l,c]=n.useState(""),[u,p]=n.useState(null),[f,v]=n.useState(null),[x,b]=n.useState(null),[k,g]=n.useState(null),[d,h]=n.useState(null),[y,S]=n.useState(null);if(n.useEffect(()=>{let w=!0;const T=`/analytics?days=${o}${l===""?"":`&project=${encodeURIComponent(l)}`}`;r(T).then(R=>{w&&(p(R.analytics),v(null))}).catch(R=>{w&&v(R instanceof Error?R.message:String(R))});const Q=l===""?"":`&project=${encodeURIComponent(l)}`;return Promise.all([r("/workload"),r(`/burndown?days=14${Q}`),r("/costs"),r("/quality")]).then(([R,D,K,we])=>{w&&(b(R.workload??null),g(D.burndown??null),h({...K.costs??{},budget:K.budget??null}),S(we.quality??null))}).catch(()=>{}),()=>{w=!1}},[o,l,e.revision]),f!==null)return a("div",{className:"ds-body"},a("div",{className:"ds-err"},f));if(u===null)return a("div",{className:"ds-loading"},"正在统计…");const C=w=>`${Math.round((w??0)*100)}%`,E=w=>{const T=Number(w)||0;return T<=0?"0":T*1440<60?`${Math.max(1,Math.round(T*1440))} 分钟`:T<1?`${(T*24).toFixed(1)} 小时`:`${T.toFixed(1)} 天`},_=(w,T,Q,R)=>a("div",{className:"ds-kpi","data-warn":R===!0?"1":"0"},a("div",{className:"ds-kpi-value"},T),a("div",{className:"ds-kpi-label"},w),a("div",{className:"ds-kpi-hint"},Q)),I=(u.cycle.buckets??[]).reduce((w,T)=>w+T.count,0),j=Math.max(1,...(u.throughput??[]).map(w=>w.count),...(u.cycle.buckets??[]).map(w=>w.count)),H=Math.max(.001,...(u.columns??[]).map(w=>w.avgDays)),M=(u.columns??[]).reduce((w,T)=>w===null||T.avgDays>w.avgDays?T:w,null),P=(u.throughput??[]).reduce((w,T)=>w+T.count,0),G=(x?.experts??[]).filter(w=>w.enabled),J=G.reduce((w,T)=>w+T.open,0),q=G.reduce((w,T)=>w+(T.overdue??0),0),B=k?.series??[],L=B.length===0?null:B[B.length-1];return a("div",{className:"ds-body"},a("div",{className:"ds-board-bar"},a("span",{className:"ds-hint"},`统计口径:最近 ${u.days} 天 · ${u.scope.tasks} 张卡(${u.scope.done} 张已完成)`),a(s,{className:"ds-select",value:l,style:{width:"auto",minWidth:130},onChange:w=>c(w.target.value)},a("option",{value:""},"全部项目"),(e.config.projects??[]).map(w=>a("option",{key:w.id,value:w.id},`${w.key?`[${w.key}] `:""}${w.name}`))),a(s,{className:"ds-select",value:String(o),style:{width:"auto",minWidth:96},onChange:w=>i(Number(w.target.value))},a("option",{value:"7"},"近 7 天"),a("option",{value:"30"},"近 30 天"),a("option",{value:"90"},"近 90 天"))),a("div",{className:"ds-an-sec"},"质量",a("span",{className:"ds-hint"},"先看这四个数:返工多不多、多久能做完、AI 交的东西有多少被人验收")),a("div",{className:"ds-kpi-grid"},_("一次通过率",C(u.rework.firstPassRate),"完成的卡里,从没被退回过的比例",u.rework.firstPassRate<.6),_("返工率",C(u.rework.rate),`${u.rework.reworked}/${u.rework.moved} 张卡倒退过`,u.rework.rate>.3),_("中位周期",E(u.cycle.medianDays),`平均 ${E(u.cycle.avgDays)} · P90 ${E(u.cycle.p90Days)}`),_("AI 交付物采纳率",C(u.ai.acceptedRate),`${u.ai.accepted}/${u.ai.artifactsAi} 件已被验收 · 占全部交付物 ${C(u.ai.aiShare)}`)),a("div",{className:"ds-an-sec"},"流程与产能",a("span",{className:"ds-hint"},"完成的卡各花了多久 · 时间都卡在哪一列 · 最近每天完成几张")),a("div",{className:"ds-an-grid"},a("div",{className:"ds-span-4",style:{display:"grid",gap:12,gridTemplateRows:"auto 1fr",alignContent:"stretch"}},a("div",{className:"ds-panel"},a("div",{className:"ds-panel-head"},"周期分布",a("span",{className:"ds-hint",style:{marginLeft:"auto"}},`${I} 张已完成`)),a("div",{className:"ds-panel-body"},(u.cycle.buckets??[]).map(w=>a("div",{key:w.id,className:"ds-an-row"},a("span",{className:"ds-an-name"},w.label),a("div",{className:"ds-an-track","data-empty":w.count===0?"1":"0"},a("div",{className:"ds-an-fill",style:{width:`${Math.round(w.count/j*100)}%`}})),a("span",{className:"ds-an-num"},`${w.count}`))),I===0?a("div",{className:"ds-hint"},"这个区间里还没有完成的卡。"):null,a("div",{className:"ds-an-foot"},`平均 ${E(u.cycle.avgDays)} · 中位 ${E(u.cycle.medianDays)} · P90 ${E(u.cycle.p90Days)}`))),a("div",{className:"ds-panel"},a("div",{className:"ds-panel-head"},"近 14 天完成"),a("div",{className:"ds-panel-body"},a("div",{className:"ds-spark"},(u.throughput??[]).map((w,T)=>a("div",{key:w.day,className:"ds-spark-col",title:`${w.day}:完成 ${w.count} 张`},a("div",{className:"ds-spark-bar",style:{height:`${Math.round(w.count/Math.max(1,Math.max(...u.throughput.map(Q=>Q.count)))*100)}%`}}),a("span",{className:"ds-spark-day"},T%2===0?w.day:"")))),a("div",{className:"ds-an-foot"},`近 14 天合计 ${P} 张 · 日均 ${(P/14).toFixed(1)} 张 · 空着的日子是没卡完成,不是没数据`)))),a("div",{className:"ds-panel ds-span-8"},a("div",{className:"ds-panel-head"},"每列停留(平均)"),a("div",{className:"ds-panel-body"},(u.columns??[]).map(w=>a("div",{key:w.status,className:"ds-an-row"},a("span",{className:"ds-an-name"},w.label),a("div",{className:"ds-an-track","data-empty":w.avgDays===0?"1":"0"},a("div",{className:"ds-an-fill ds-an-fill-warn",style:{width:`${Math.round(w.avgDays/H*100)}%`}})),a("span",{className:"ds-an-num"},E(w.avgDays)))),a("div",{className:"ds-an-foot"},M===null?"还没有数据。":`最慢的是「${M.label}」:平均 ${E(M.avgDays)},时间主要压在这一列。`)))),a("div",{className:"ds-an-sec"},"交付、成本与返工",a("span",{className:"ds-hint"},"AI 交的东西被验收多少 · 谁手上压得最多 · 派单花了多少 · 哪些卡来回折腾")),a("div",{className:"ds-an-grid"},a("div",{className:"ds-panel ds-span-4"},a("div",{className:"ds-panel-head"},"按专家看质量",a("span",{className:"ds-hint"},"派单量来自运行日志(内存最近 300 条)")),a("div",{className:"ds-panel-body"},y===null?a("div",{className:"ds-hint"},"还没算出来"):(y.experts??[]).length===0?a("div",{className:"ds-hint"},"还没有派出过活"):a("div",null,(y.experts??[]).slice(0,8).map(w=>a("div",{className:"ds-an-kv",key:w.expert},a("span",{},`${w.label} · ${w.dispatched} 次`),a("b",{"data-warn":w.reworkRate!==null&&w.reworkRate>=40?"1":"0"},`${w.done}/${w.cards} 完成 · 一次过 ${w.firstPassRate===null?"—":w.firstPassRate+"%"}`))),a("div",{className:"ds-hint",style:{marginTop:6}},`合计:派单 ${y.totals.dispatched} 次 · 平均耗时 ${y.totals.avgMs>0?Math.round(y.totals.avgMs/1e3)+" 秒":"—"} · 返工率 ${y.totals.reworkRate===null?"—":y.totals.reworkRate+"%"} · AI 失败 ${y.totals.failures} 次 · 缺陷重开 ${y.totals.reopens} 次`),a("div",{className:"ds-hint"},y.cost?.note??"")))),a("div",{className:"ds-panel ds-span-4"},a("div",{className:"ds-panel-head"},"AI 产出质量"),a("div",{className:"ds-panel-body"},a("div",{className:"ds-an-kv"},a("span",{},"交付物由专家登记"),a("b",{},`${u.ai.artifactsAi} / ${u.ai.artifactsTotal}`)),a("div",{className:"ds-an-kv"},a("span",{},"其中被人验收"),a("b",{},`${u.ai.accepted}(${C(u.ai.acceptedRate)})`)),a("div",{className:"ds-an-kv"},a("span",{},"缺正文(只有标题)"),a("b",{"data-warn":u.ai.emptyBody>0?"1":"0"},`${u.ai.emptyBody}`)),a("div",{className:"ds-an-kv"},a("span",{},"写码卡有执行记录"),a("b",{},`${u.ai.codingTasks}`)),a("div",{className:"ds-an-kv"},a("span",{},"评审通过 / 要求修改"),a("b",{},`${u.ai.codingApproved} / ${u.ai.codingChanges}`)),a("div",{className:"ds-an-kv"},a("span",{},"单测通过"),a("b",{},`${u.ai.unitPassed}/${u.ai.unitTests}(${C(u.ai.unitPassRate)})`)),a("div",{className:"ds-an-kv"},a("span",{},"已合并"),a("b",{},`${u.ai.merged}`)))),a("div",{className:"ds-panel ds-span-4"},a("div",{className:"ds-panel-head"},"团队负载",a("span",{className:"ds-hint",style:{marginLeft:"auto"}},`${x?.busy??0} 位在跑`)),a("div",{className:"ds-panel-body"},(x?.experts??[]).filter(w=>w.enabled).length===0?a("div",{className:"ds-empty"},"还没有启用的专家。"):(x?.experts??[]).filter(w=>w.enabled).map(w=>a("div",{key:w.id,className:"ds-an-row"},a("span",{className:"ds-an-name"},`${w.emoji} ${w.name}`),a("div",{className:"ds-an-track"},a("div",{className:"ds-an-fill",style:{width:`${Math.round(w.open/Math.max(1,...(x.experts??[]).map(T=>T.open))*100)}%`}})),a("span",{className:"ds-an-num"},`在办 ${w.open}${w.running>0?` · 跑 ${w.running}`:""}${w.overdue>0?` · 逾期 ${w.overdue}`:""}`))),a("div",{className:"ds-an-foot"},`${G.length} 位在岗,手上合计 ${J} 张${q>0?`,其中 ${q} 张逾期`:",没有逾期的"}`))),a("div",{className:"ds-panel ds-span-4"},a("div",{className:"ds-panel-head"},"燃尽(近 14 天剩余)",a("span",{className:"ds-hint",style:{marginLeft:"auto"}},`现在还剩 ${k?.now?.remaining??0} 张`)),a("div",{className:"ds-panel-body"},a(Jx,{series:k?.series??[]}),a("div",{className:"ds-an-foot"},L===null?"还没有数据。":`累计建 ${L.created} · 累计完成 ${L.done} · 现在还剩 ${L.remaining} 张`))),a("div",{className:"ds-panel ds-span-4"},a("div",{className:"ds-panel-head"},"AI 执行成本",a("span",{className:"ds-hint",style:{marginLeft:"auto"}},`${d?.total??0} 次派单`)),a("div",{className:"ds-panel-body"},a("div",{className:"ds-an-kv"},a("span",{},"平均执行时长"),a("b",{},`${Math.round((d?.avgMs??0)/1e3)} 秒`)),(d?.byModel??[]).slice(0,3).map(w=>a("div",{key:`m-${w.key}`,className:"ds-an-kv"},a("span",{},`模型 ${w.key}`),a("b",{},`${w.runs} 次`))),(d?.byPromptVersion??[]).slice(0,3).map(w=>a("div",{key:`p-${w.key}`,className:"ds-an-kv"},a("span",{},`提示词 ${w.key}`),a("b",{},`${w.runs} 次`))),a("div",{className:"ds-hint"},d?.note??""),d?.budget===null||d?.budget===void 0?null:a("div",{style:{marginTop:8}},a("div",{className:"ds-an-kv"},a("span",{},"预算使用"),a("b",{style:{color:d.budget.level==="over"?"#e5484d":d.budget.level==="warn"?"#d97706":void 0}},`${Math.max(d.budget.runRate,d.budget.hourRate)}%`)),a(Zx,{value:Math.min(100,Math.max(d.budget.runRate,d.budget.hourRate)),tone:d.budget.level}),a("div",{className:"ds-hint"},`${d.budget.runs}/${d.budget.budgetRuns} 次 · ${d.budget.hours}/${d.budget.budgetHours} 小时 · ${d.budget.hint}`)))),a("div",{className:"ds-panel ds-span-8"},a("div",{className:"ds-panel-head"},"返工最多的卡",a("span",{className:"ds-hint",style:{marginLeft:"auto"}},`评审打回 ${u.rework.reviewRework} 次 · 测试打回 ${u.rework.testRework} 次`)),a("div",{className:"ds-panel-body"},(u.rework.worst??[]).length===0?a("div",{className:"ds-hint"},"没有卡倒退过,挺好。"):u.rework.worst.map(w=>a("div",{key:w.id,className:"ds-listrow"},a("div",{className:"ds-listrow-main"},a("div",null,`${w.code===""?"":`${w.code} `}${w.title}`),a("div",{className:"ds-hint"},`倒退 ${w.backward} 次 · 现在在「${(e.statuses.find(T=>T.id===w.status)??{}).label??w.status}」`)),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>t(w.id)},"打开"))))))))}function rw(e,t){const a="studio",n="/studio-api";let r=null;function s(Z){r=Z??null}function o(Z){return r===null?null:r[Z]??null}function i(Z,U){if(U==null)return U;const ee=U.props??{},be=ee.title!==void 0?U:t(U.type,{...ee,title:Z}),ne=o("Tip");return ne===null?be:t(ne,{key:U.key,label:Z},be)}const{TextField:l,TextAreaField:c,ChipField:u,CheckField:p,SelectField:f}=lx({h:t,kit:o,React:e}),v=dx({h:t,kit:o}),x=Ax({h:t,React:e}),b=cx({h:t,ChipField:u}),k=ux({h:t,React:e,Card:b,TextField:l,SelectField:f,CheckField:p,toast:G});function g({rows:Z=6,value:U,onChange:ee,placeholder:be,className:ne,...le}){const[ce,ve]=e.useState(!1),Se=String(U??"");return t("div",{className:"ds-md-field"},t("div",{className:"ds-md-bar"},t("span",{className:"ds-hint"},"支持 Markdown:标题 / 列表 / 粗体 / 代码块 / 表格"),t("button",{className:"ds-btn ds-btn-ghost",type:"button",onClick:()=>ve(!ce)},ce?"回到编辑":"预览渲染")),ce?t("div",{className:"ds-md-preview ds-req-desc ds-md"},Se.trim()===""?t("span",{className:"ds-hint"},"还没写内容。"):$e(Se)):t(c,{className:ne??"ds-textarea",rows:Z,value:U,onChange:ee,placeholder:be,...le}))}function d(Z,U){const ee=t("div",{className:"ds-label",style:{cursor:"help"}},Z);return U==null||U===""?ee:i(U,ee)}let h=null,y=null;function S(Z){h=Z,typeof y=="function"&&y(Z)}function C(Z,U){const ee=U??{};return o("DialogBox")===null?Promise.resolve(window.confirm(String(Z))):new Promise(ne=>{S({kind:"confirm",title:ee.title??"确认操作",message:String(Z??""),danger:ee.danger===!0,okText:ee.okText??"确定",cancelText:ee.cancelText??"取消",resolve:ne})})}function E(Z,U){const ee=U??{};return o("DialogBox")===null?Promise.resolve(window.prompt(String(Z),ee.defaultValue??"")):new Promise(ne=>{S({kind:"prompt",title:ee.title??"需要填写",message:String(Z??""),value:String(ee.defaultValue??""),placeholder:ee.placeholder??"",okText:ee.okText??"确定",cancelText:"取消",resolve:ne})})}function _(){const[Z,U]=e.useState(null),[ee,be]=e.useState("");e.useEffect(()=>{const ce=ve=>{U(ve),be(ve!==null&&ve.kind==="prompt"?ve.value:"")};return y=ce,h!==null&&ce(h),()=>{y===ce&&(y=null)}},[]);const ne=o("DialogBox");if(Z===null||ne===null)return null;const le=ce=>{const ve=Z.resolve;U(null),h=null,ve(ce)};return t(ne,{open:!0,title:Z.title,message:Z.message,danger:Z.danger===!0,okText:Z.okText,cancelText:Z.cancelText,input:Z.kind==="prompt",value:ee,placeholder:Z.placeholder,onChange:ce=>be(ce),onOk:()=>le(Z.kind==="prompt"?ee.trim():!0),onCancel:()=>le(Z.kind==="prompt"?null:!1)})}let I=0,j=[],H=[],M={text:"",at:0};function P(){const Z=j.slice();for(const U of H.slice())U(Z)}function G(Z,U="success",ee=3200){const be=String(Z??"").trim();if(be==="")return null;const ne=Date.now();if(M.text===be&&ne-M.at<600)return null;M={text:be,at:ne};const le=++I;return j=j.concat([{id:le,text:be,tone:U}]),P(),window.setTimeout(()=>{J(le)},ee),le}function J(Z){const U=j.filter(ee=>ee.id!==Z);U.length!==j.length&&(j=U,P())}const q={success:"✓",error:"!",info:"i"};function B(){const[Z,U]=e.useState(()=>j.slice());return e.useEffect(()=>(H.push(U),()=>{H=H.filter(ee=>ee!==U)}),[]),Z.length===0?null:t("div",{className:"ds-toasts",role:"status","aria-live":"polite"},Z.map(ee=>t("div",{key:ee.id,className:"ds-toast","data-tone":ee.tone},t("span",{className:"ds-toast-icon","aria-hidden":"true"},q[ee.tone]??"i"),t("span",{className:"ds-toast-text"},ee.text),t("button",{type:"button",className:"ds-toast-close","aria-label":"关闭提示",onClick:()=>J(ee.id)},"×"))))}const L="dsh-studio:user";function w(){try{const Z=window.localStorage.getItem(L);if(typeof Z=="string"&&Z.trim()!=="")return Z.trim().slice(0,40)}catch{}return"人"}function T(Z){const U=String(Z??"").trim().slice(0,40)||"人";try{window.localStorage.setItem(L,U)}catch{}return U}const Q="dsh-studio:theme",R=[["light","☀ 明亮"],["dark","☾ 黑暗"],["system","跟随系统"]];function D(){return typeof window.matchMedia=="function"?window.matchMedia("(prefers-color-scheme: dark)"):null}function K(){try{const Z=window.getComputedStyle(document.body).backgroundColor,U=/rgba?\(([^)]+)\)/.exec(String(Z??""));if(U===null)return null;const ee=U[1].split(",").map(ve=>Number(ve.trim())),[be,ne,le,ce]=ee;return![be,ne,le].every(ve=>Number.isFinite(ve))||Number.isFinite(ce)&&ce<.2?null:.2126*be+.7152*ne+.0722*le<128?"dark":"light"}catch{return null}}function we(){try{const Z=window.localStorage.getItem(Q);if(Z==="light"||Z==="dark"||Z==="system")return Z}catch{}return"system"}function fe(Z){const U=Z==="light"||Z==="dark"?Z:"system";try{window.localStorage.setItem(Q,U)}catch{}return U}const ye="dsh-studio:session",Ve="dsh-studio:auth-user";function ae(){try{const Z=window.localStorage.getItem(ye);if(typeof Z=="string"&&Z.trim()!=="")return Z.trim()}catch{}return""}function F(Z){try{Z===""||Z===null||Z===void 0?window.localStorage.removeItem(ye):window.localStorage.setItem(ye,String(Z))}catch{}}function te(){try{const Z=window.localStorage.getItem(Ve);if(typeof Z=="string"&&Z!==""){const U=JSON.parse(Z);if(U!==null&&typeof U=="object")return U}}catch{}return null}function xe(Z){try{Z==null?window.localStorage.removeItem(Ve):window.localStorage.setItem(Ve,JSON.stringify(Z))}catch{}return Z??null}async function X(Z,U){const ee={"x-studio-user":encodeURIComponent(w())},be=ae();be!==""&&(ee["x-studio-session"]=be),U!==void 0&&(ee["content-type"]="application/json");const ne=U===void 0?{method:"GET",headers:ee}:{method:"POST",headers:ee,body:JSON.stringify(U)},le=await fetch(n+Z,ne);let ce={};try{ce=await le.json()}catch{}if(!le.ok||ce.ok===!1)throw new Error(ce.error??`请求失败(HTTP ${le.status})`);return ce}const oe=`
|
|
47
47
|
html[data-dsh-theme="dark"] body { background: #0e1014 !important; color: #e6e8ee }
|
|
48
48
|
html[data-dsh-theme="dark"] [class*="frame"],
|
|
49
49
|
html[data-dsh-theme="dark"] [class*="centerCol"],
|
|
@@ -58,7 +58,7 @@ html[data-dsh-theme="dark"] [class*="handle"] { background: #22262e !important }
|
|
|
58
58
|
html[data-dsh-theme="light"] body { background: #ffffff !important; color: #1f2328 }
|
|
59
59
|
html[data-dsh-theme="light"] [class*="sidebarCol"],
|
|
60
60
|
html[data-dsh-theme="light"] [class*="rightbarCol"] { background: #fafafa !important; color: #1f2328 !important; border-color: #e4e4e7 !important }
|
|
61
|
-
`,
|
|
61
|
+
`,me=`
|
|
62
62
|
[data-dsh-studio] { display:flex; flex-direction:column; height:100%; min-height:0; color:currentColor;
|
|
63
63
|
--ds-line: color-mix(in srgb, currentColor 18%, transparent);
|
|
64
64
|
--ds-line-soft: color-mix(in srgb, currentColor 9%, transparent);
|
|
@@ -824,11 +824,11 @@ html[data-dsh-theme="light"] [class*="rightbarCol"] { background: #fafafa !impor
|
|
|
824
824
|
[data-dsh-studio] .ds-sec-head, [data-dsh-studio] .ds-an-sec { font-size:12px; font-weight:600; color:var(--muted-foreground); text-transform:none; letter-spacing:.01em; }
|
|
825
825
|
[data-dsh-studio] .ds-panel-head .ds-hint, [data-dsh-studio] .ds-head .ds-sub { font-size:11.5px; }
|
|
826
826
|
[data-dsh-studio] .ds-filters, [data-dsh-studio] .ds-check-bar { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
|
|
827
|
-
`;function H(){const[X,B]=e.useState(null),[ee,ve]=e.useState(null),te=e.useRef(""),oe=e.useCallback(async(de=!1)=>{if(!(typeof document<"u"&&document.hidden===!0))try{const ge=await Z("/state"),we={...ge.state??{},locked:ge.locked===!0},ye=[we.revision??"",(we.tasks??[]).length,(we.requirements??[]).length,(we.agents??[]).length,we.locked===!0?1:0].join("|");if(!de&&ye===te.current){ve(null);return}te.current=ye,B(we),ve(null)}catch(ge){ve(ge instanceof Error?ge.message:String(ge))}},[]);return e.useEffect(()=>{let de=!0;const ge=async()=>{de&&await oe()};ge();const we=setInterval(()=>{ge()},15e3),ye=()=>{document.hidden!==!0&&ge()};return document.addEventListener("visibilitychange",ye),()=>{de=!1,clearInterval(we),document.removeEventListener("visibilitychange",ye)}},[oe]),{state:X,error:ee,reload:oe}}const Ce=Qy(t),be=ux({h:t,TextField:l}),_e=mx({h:t,React:e,api:Z,kit:o,currentUser:w,renderMarkdown:Ce,tipOf:i,tipLabel:d,confirmDialog:C,promptDialog:E,TextField:l,TextAreaField:c,ChipField:u,CheckField:p,SelectField:f,MdField:g,MentionPicker:be}),Ue=_x({h:t,React:e});Ix({h:t,React:e,Editor:x,api:Z,kit:o,toast:W,sessionToken:Se,currentUser:w,confirmDialog:C,promptDialog:E,tipOf:i,tipLabel:d,renderMarkdown:Ce,SideDrawer:v,MentionPicker:be,Card:b,TextField:l,TextAreaField:c,ChipField:u,CheckField:p,SelectField:f,MdField:g});function qa({state:X,onChanged:B}){const[ee,ve]=e.useState(null),[te,oe]=e.useState(null),[de,ge]=e.useState(null),[we,ye]=e.useState(null),[Ee,tt]=e.useState({name:"",spec:"",description:""}),[at,ct]=e.useState(!1),[qe,nt]=e.useState(!1),et=e.useCallback(async()=>{try{ve(await Z("/market"))}catch(re){ge(re instanceof Error?re.message:String(re))}},[]);e.useEffect(()=>{et()},[et]);const $e=new Set(ee?.installed??[]),_t=re=>re.replace(/^link:/,"").split("/").pop().replace(/^dsh-/,"dsh-"),Fe=async(re,ke)=>{oe(re.id),ge(null),ye(null);try{const pe=await Z(`/market/${ke}`,{id:re.id});if(pe.ok===!1)throw new Error((pe.result?.output??"").slice(-300)||"安装失败");ye(ke==="install"?"已安装,重启工作空间后生效":"已移除,重启工作空间后生效"),await et()}catch(pe){ge(pe instanceof Error?pe.message:String(pe))}finally{oe(null)}},xt=async()=>{if(!(Ee.name.trim()===""||Ee.spec.trim()==="")){nt(!0),ge(null);try{const re=[...X.config.market.items??[],{id:`m-${Math.random().toString(16).slice(2,10)}`,name:Ee.name.trim(),spec:Ee.spec.trim(),description:Ee.description.trim()}];await Z("/config",{market:{items:re}}),tt({name:"",spec:"",description:""}),ct(!1),await B(),await et()}catch(re){ge(re instanceof Error?re.message:String(re))}finally{nt(!1)}}},jt=async re=>{if(!await C(`从市场列表移除「${re.name}」?不会卸载已安装的插件。`,{title:"移除插件",danger:!0,okText:"移除"}))return;const ke=(X.config.market.items??[]).filter(pe=>pe.id!==re.id);await Z("/config",{market:{items:ke}}).catch(()=>{}),await B(),await et()},Qt=ee?.items??X.config.market.items??[];return t("div",null,t("div",{className:"ds-row",style:{marginBottom:12}},t("div",{style:{fontSize:13.5,fontWeight:650}},ee?.title??X.config.market.title),t("span",{className:"ds-stat"},`${Qt.length} 个条目 · profile ${X.profile??"—"}`),t("div",{className:"ds-grow"}),t("button",{className:"ds-btn",onClick:()=>ct(!at)},at?"收起":"+ 添加条目")),de!==null?t("div",{className:"ds-err",style:{padding:"0 0 8px"}},de):null,we!==null?t("div",{className:"ds-ok",style:{padding:"0 0 8px"}},we):null,Qt.length===0?t("div",{className:"ds-empty"},"还没有条目。把公司内部的插件包加进来,同事就能一键安装。"):t("div",{className:"ds-market-grid"},Qt.map(re=>{const ke=_t(re.spec),pe=$e.has(ke)||$e.has(re.name);return t("div",{key:re.id,className:"ds-market-card"},t("div",{className:"ds-mc-head"},t("span",{className:"ds-mc-name ds-grow"},re.name),t(u,{className:"ds-chip","data-on":pe?"1":"0"},pe?"已安装":"未安装")),re.description!==""?t("div",{className:"ds-mc-desc"},re.description):null,t("code",null,re.spec),t("div",{className:"ds-row",style:{marginTop:"auto"}},t("button",{className:pe?"ds-btn":"ds-btn ds-btn-primary",disabled:te===re.id,onClick:async()=>{await C(pe?`从 profile 移除「${ke}」?`:`安装「${ke}」到工作空间?`,{title:pe?"移除插件":"安装插件",danger:pe,okText:pe?"移除":"安装"})&&Fe(re,pe?"uninstall":"install")}},te===re.id?"处理中…":pe?"移除":"安装"),t("button",{className:"ds-btn",style:{marginLeft:"auto",opacity:.7},onClick:()=>void jt(re)},"删条目")))})),at?t("div",{className:"ds-panel",style:{marginTop:14}},t("div",{className:"ds-panel-head"},"添加条目"),t("div",{className:"ds-panel-body"},t("div",{className:"ds-field"},t("div",{className:"ds-label"},"显示名"),t(l,{className:"ds-input",value:Ee.name,placeholder:"代码评审助手",onChange:re=>tt({...Ee,name:re.target.value})})),t("div",{className:"ds-field"},t("div",{className:"ds-label"},"包名或路径"),t(l,{className:"ds-input",value:Ee.spec,placeholder:"@company/dsh-reviewer 或 link:~/pkgs/reviewer",onChange:re=>tt({...Ee,spec:re.target.value})})),t("div",{className:"ds-field"},t("div",{className:"ds-label"},"一句话说明"),t(l,{className:"ds-input",value:Ee.description,placeholder:"自动跑 GitLab MR 的评审清单",onChange:re=>tt({...Ee,description:re.target.value})}))),t("div",{style:{padding:"0 14px 14px"}},t("button",{className:"ds-btn ds-btn-primary",disabled:qe||Ee.name.trim()===""||Ee.spec.trim()==="",onClick:()=>void xt()},qe?"添加中…":"加入市场"))):null)}function Tn({state:X,onChanged:B,initialSection:ee,onSection:ve}){const te=X.config,[oe,de]=e.useState({boardTitle:te.board.title,gitlabUrl:te.gitlab.url,gitlabGroup:te.gitlab.group,gitlabProject:te.gitlab.project,gitlabToken:"",feishuAppId:te.feishu.appId,feishuAppSecret:"",feishuChatId:te.feishu.chatId,feishuBaseToken:te.feishu.baseToken,feishuTableId:te.feishu.tableId,feishuWebhook:"",feishuNotify:te.feishu.notifyOnChange!==!1,gitlabSyncEnabled:te.gitlab.syncEnabled===!0,gitlabSyncLabel:te.gitlab.syncLabel??"",roles:JSON.parse(JSON.stringify(te.roles)),agentsEnabled:te.agents?.enabled===!0,agentsMaxConcurrent:String(te.agents?.maxConcurrent??2),agentsPreset:te.agents?.agentPreset??"standard",agentsWorkspace:te.agents?.workspaceDir??"",agentsSandbox:te.agents?.sandbox??"workspace-write",agentsIsolation:te.agents?.isolation??"none",agentsWorktreeRoot:te.agents?.worktreeRoot??"",agentsCleanup:te.agents?.cleanupWorktree??"manual",agentsAuto:Array.isArray(te.agents?.autoStatuses)?te.agents.autoStatuses:["design","dev_ready","test"]}),[ge,we]=e.useState(null),[ye,Ee]=e.useState(null),[tt,at]=e.useState(!1),ct=async()=>{at(!0),Ee(null),we(null);try{await Z("/config",{board:{title:oe.boardTitle},roles:oe.roles,agents:{enabled:oe.agentsEnabled,maxConcurrent:Number(oe.agentsMaxConcurrent)||2,agentPreset:oe.agentsPreset,workspaceDir:oe.agentsWorkspace,sandbox:oe.agentsSandbox,isolation:oe.agentsIsolation,worktreeRoot:oe.agentsWorktreeRoot,cleanupWorktree:oe.agentsCleanup,autoStatuses:oe.agentsAuto}}),we("已保存"),await B()}catch(re){Ee(re instanceof Error?re.message:String(re))}finally{at(!1)}},qe=(re,ke,pe,Va)=>t("div",{className:"ds-field",key:re},t("div",{className:"ds-label"},ke),t(l,{className:"ds-input",type:"text",value:oe[re],placeholder:pe??"",onChange:St=>de({...oe,[re]:St.target.value})})),nt=Object.keys(oe.roles),[et,$e]=e.useState(ee??"experts");e.useEffect(()=>{typeof ee=="string"&&ee!==""&&$e(ee)},[ee]);const _t=re=>{$e(re),ve?.(re)},Fe={projects:["项目与迭代","项目是看板的第一层分组:卡片挂项目、项目下面划迭代,之后按项目/迭代筛选和考核。"],experts:["专家","每个专家是一个能独立接活的工作单元。角色位决定它接哪一列,业务领域决定它懂哪块业务,角色提示词和技能决定它怎么做。"],teams:["专家团","团长负责拆活和汇总,成员各自干活;评论里 @团名 就交给团长。"],skills:["技能库","技能是一段可复用的做法。写进技能库后会落成 SKILL.md,专家在需要时自己加载,也可以自己新增。"],columns:["列的负责人","看板每一列默认派给谁。选「默认」用系统自带的那一位。"],gitlab:["代码仓库","一个仓库一条记录:地址、路径、令牌各自独立,同步时互不干扰。"],feishu:["飞书机器人","卡片状态变化时往群里发消息。可以按团队或项目建多个机器人。"],agents:["自动派单","卡片进入勾选的列时,自动把活派给该列的负责人;这里是全局开关与并发上限。"],models:["模型","每个角色位用哪个模型。单个专家还能在「专家」里单独覆盖。"],testing:["测试执行","接口用例跑在哪、能访问哪些域名、超时多少。执行器就跑在这台机器上(.218),不依赖外部 CI。"],costs:["成本与预算","一个月允许派多少次活、跑多少小时,超了在效能页亮黄亮红。"],environments:["部署环境","版本可以登记「上过哪个环境」,只留痕:平台不接 CD,不会触发任何部署。"],board:["看板外观","看板顶部显示的标题。"],access:["权限与审计","启用成员名单后,每个写操作都要认人:只读不能改,成员能推进卡,管理员才能改配置、删数据、发布版本。所有写操作都会进下面的审计日志。"],ldap:["统一登录(LDAP)","用公司账号登录平台:登录成功后服务端记住这个人,写操作和审计都挂在他的名字下。密码只存服务端密钥文件,不回显。"],storage:["数据与备份","台账存在哪、密钥存在哪,以及每次写操作留下的快照。改坏了可以回滚到上一版。"],health:["集成健康","飞书通知、GitLab、飞书云盘、代码隔离四条外部通道最近一次是成功还是失败。以前这些失败只写进日志,现在会在这里亮出来,坏了能看见、能补一次。"]},xt=t("div",{className:"ds-row",style:{gap:10,marginTop:2}},t("button",{className:"ds-btn ds-btn-primary",disabled:tt,onClick:()=>void ct()},tt?"保存中…":"保存"),ge!==null?t("span",{className:"ds-ok"},ge):null,ye!==null?t("span",{className:"ds-err"},ye):null),jt=[{group:"团队"},{id:"projects",label:"项目与迭代",count:(te.projects??[]).length},{id:"experts",label:"专家",count:(te.experts??[]).length},{id:"teams",label:"专家团",count:(te.teams??[]).length},{id:"skills",label:"技能库"},{id:"columns",label:"列的负责人"},{group:"接入"},{id:"gitlab",label:"代码仓库",count:(te.gitlab.projects??[]).length},{id:"feishu",label:"飞书机器人",count:(te.feishu.bots??[]).length},{id:"health",label:"集成健康",count:X.integrations?.broken??0},{group:"运行"},{id:"agents",label:"自动派单"},{id:"testing",label:"测试执行",count:(te.testing?.envs??[]).length},{id:"costs",label:"成本与预算"},{id:"environments",label:"部署环境",count:(te.environments??[]).length},{id:"board",label:"看板外观"},{group:"安全"},{id:"ldap",label:"统一登录(LDAP)",count:te.ldap?.enabled===!0?te.ldap?.requireLogin===!0?"必须":"开":0},{id:"access",label:"权限与审计",count:(te.access?.members??[]).length},{id:"storage",label:"数据与备份",count:X.storage?.snapshots??0}],Qt=re=>re==="projects"?t(Fx,{config:te,onChanged:B}):re==="experts"?t(Ax,{config:te,onChanged:B}):re==="teams"?t(jx,{config:te,onChanged:B}):re==="skills"?t(Kx,{config:te,onChanged:B}):re==="columns"?t(Ux,{state:X,onChanged:B}):re==="testing"?t(Dx,{config:te,onChanged:B}):re==="costs"?t(zx,{config:te,onChanged:B}):re==="environments"?t(Lx,{config:te,onChanged:B}):re==="access"?t(Bx,{state:X,config:te,onChanged:B}):re==="ldap"?t(Mx,{config:te,onChanged:B}):re==="storage"?t(qx,{state:X,onChanged:B}):re==="gitlab"?t(Wx,{config:te,onChanged:B}):re==="feishu"?t("div",null,t(Gx,{config:te,onChanged:B}),t(Ox,{config:te,onChanged:B})):re==="health"?t(Vx,{state:X,config:te,onChanged:B}):re==="board"?t("div",null,t("div",{className:"ds-panel ds-form-panel"},t("div",{className:"ds-panel-head"},"看板"),t("div",{className:"ds-panel-body"},qe("boardTitle","看板标题","需求&任务工作空间"))),xt):re==="models"?t("div",null,t("div",{className:"ds-panel ds-form-panel"},t("div",{className:"ds-panel-head"},"角色与模型"),t("div",{className:"ds-panel-body ds-grid2"},nt.map(ke=>t("div",{className:"ds-field",key:ke},t("div",{className:"ds-label"},`${Aa[ke]??ke}`),t(l,{className:"ds-input",value:oe.roles[ke].model,placeholder:"deepseek-v4.1-flash",onChange:pe=>de({...oe,roles:{...oe.roles,[ke]:{...oe.roles[ke],model:pe.target.value}}})}))))),t("div",{className:"ds-hint",style:{margin:"-6px 0 12px"}},"单个专家可以在「专家」里单独指定模型,优先级:专家模型 → 这里的角色模型 → 宿主默认。"),xt):t("div",null,t("div",{className:"ds-panel ds-form-panel"},t("div",{className:"ds-panel-head"},"自动派单(专家 agent)"),t("div",{className:"ds-panel-body"},t("div",{className:"ds-field",style:{gridColumn:"1 / -1"}},t("label",{className:"ds-row",style:{alignItems:"center",gap:8,cursor:"pointer"}},t(p,{checked:oe.agentsEnabled,onChange:ke=>de({...oe,agentsEnabled:ke.target.checked})}),t("span",{},"卡片进入勾选的列时,自动派给该列的负责人")),t("div",{className:"ds-hint"},"关闭后仍可在卡片抽屉里点「马上处理」手动派单;派单结果会写回评论并推进卡片。")),t("div",{className:"ds-field",style:{gridColumn:"1 / -1"}},t("div",{className:"ds-label"},"哪些列自动派单"),t("div",{className:"ds-row",style:{flexWrap:"wrap",gap:14}},[["design","待方案"],["dev_ready","待开发"],["dev","开发中"],["test","待测试"]].map(([ke,pe])=>t("label",{className:"ds-row",key:ke,style:{alignItems:"center",gap:6,cursor:"pointer"}},t(p,{checked:oe.agentsAuto.includes(ke),onChange:Va=>de({...oe,agentsAuto:Va.target.checked?[...oe.agentsAuto,ke]:oe.agentsAuto.filter(St=>St!==ke)})}),t("span",{},pe)))),t("div",{className:"ds-hint"},"勾选的列在卡片进入时自动派给该列对应的负责人;其余列只能手动「马上处理」。")),qe("agentsMaxConcurrent","同时最多几个 agent","2"),qe("agentsPreset","Agent 预设","standard"),qe("agentsWorkspace","工作区目录","~/dsh-workspace"),t("div",{className:"ds-hint",style:{gridColumn:"1 / -1"}},"预设决定 agent 手里有哪些工具:standard 带 shell 与文件读写,minimal 只有基础工具。"),t("div",{className:"ds-field",key:"agentsSandbox"},t("div",{className:"ds-label"},"沙箱档位(这个会话能写哪、能跑什么)"),t(f,{className:"ds-input",value:oe.agentsSandbox,onChange:ke=>de({...oe,agentsSandbox:ke.target.value})},[["read-only","只读:能看不能改"],["workspace-write","只写工作区(推荐):能改自己的目录,改不到系统别处"],["danger-full-access","无沙箱:可以写任何地方(危险)"]].map(([ke,pe])=>t("option",{key:ke,value:ke},pe))),t("div",{className:"ds-hint"},"由 DSH 的 permission preset 执行:read-only / workspace-write 走 bwrap 或 Landlock 隔离。单个专家可以在「专家」里覆盖。")),t("div",{className:"ds-field",key:"agentsIsolation"},t("div",{className:"ds-label"},"代码隔离"),t(f,{className:"ds-input",value:oe.agentsIsolation,onChange:ke=>de({...oe,agentsIsolation:ke.target.value})},[["none","不隔离:所有卡共用一个工作区"],["worktree","一卡一个 git worktree(推荐给多卡并行)"]].map(([ke,pe])=>t("option",{key:ke,value:ke},pe))),t("div",{className:"ds-hint"},"开启后,卡要挂在配了「本机代码目录」的项目上,派单时会为它切一条 task/<编号> 分支。")),qe("agentsWorktreeRoot","worktree 根目录","留空 = 工作区同级的 dsh-worktrees"),t("div",{className:"ds-field",key:"agentsCleanup"},t("div",{className:"ds-label"},"卡完成时"),t(f,{className:"ds-input",value:oe.agentsCleanup,onChange:ke=>de({...oe,agentsCleanup:ke.target.value})},[["manual","保留 worktree 和分支,等人看 diff"],["on_done","自动删掉 worktree 和分支"]].map(([ke,pe])=>t("option",{key:ke,value:ke},pe)))))),xt);return t("div",{className:"ds-settings"},t("div",{className:"ds-settings-nav"},jt.map((re,ke)=>re.group!==void 0?t("div",{className:"ds-settings-nav-group",key:`group-${ke}`},re.group):i((Fe[re.id]??[re.label,""])[1]||re.label,t("button",{key:re.id,className:"ds-nav-item","data-active":et===re.id?"1":"0",onClick:()=>_t(re.id)},t("span",{},re.label),re.count===void 0?null:t("span",{className:"ds-nav-count"},String(re.count)))))),t("div",{className:"ds-settings-pane"},t("div",{className:"ds-pane-head"},t("div",null,t("div",{className:"ds-pane-title"},(Fe[et]??["设置"])[0]),t("div",{className:"ds-pane-desc"},(Fe[et]??["",""])[1]))),Qt(et)))}function q({state:X,onClose:B,onCreated:ee}){const ve=X?.config?.projects??[],[te,oe]=e.useState(""),[de,ge]=e.useState(""),[we,ye]=e.useState("requirement"),[Ee,tt]=e.useState("normal"),[at,ct]=e.useState("p2"),[qe,nt]=e.useState(""),et=X?.requirements??[],[$e,_t]=e.useState(""),[Fe,xt]=e.useState(ve.length===1?ve[0].id:""),[jt,Qt]=e.useState(""),[re,ke]=e.useState(""),[pe,Va]=e.useState(""),[St,la]=e.useState(null),[Pn,Ra]=e.useState(!1),Dt=we==="bug",Ot=ve.find(z=>z.id===Fe)?.iterations??[],Q=async()=>{Ra(!0),la(null);try{await Z("/task/create",{title:te,requirement:de,type:we,priority:Ee,domain:qe,severity:Dt?at:"",role:Dt?"dev":"product",status:Dt?"dev_ready":"clarify",project:Fe,iteration:Fe===""?"":jt,owner:re.trim(),dueAt:Pr(pe),requirementId:$e}),await ee(),B()}catch(z){la(z instanceof Error?z.message:String(z))}finally{Ra(!1)}};return t("div",{className:"ds-modal-wrap",onClick:z=>{z.target===z.currentTarget&&B()}},t("div",{className:"ds-modal"},t("h3",{},Dt?"登记缺陷":"新建任务"),t("div",{className:"ds-field"},t("div",{className:"ds-label"},"标题"),t(l,{className:"ds-input",autoFocus:!0,placeholder:Dt?"一句话说清什么坏了,例如「优惠券叠加后金额算错」":"一句话说清要做什么",value:te,onChange:z=>oe(z.target.value),onKeyDown:z=>{z.key==="Enter"&&!z.isComposing&&Q()}})),t("div",{className:"ds-field"},t("div",{className:"ds-label"},Dt?"复现步骤 / 现象":"需求 / 背景"),t(g,{className:"ds-textarea",rows:5,placeholder:Dt?`复现步骤:1… 2…
|
|
827
|
+
`;function W(){const[Z,U]=e.useState(null),[ee,be]=e.useState(null),ne=e.useRef(""),le=e.useCallback(async(ce=!1)=>{if(!(typeof document<"u"&&document.hidden===!0))try{const ve=await X("/state"),Se={...ve.state??{},locked:ve.locked===!0},Ne=[Se.revision??"",(Se.tasks??[]).length,(Se.requirements??[]).length,(Se.agents??[]).length,Se.locked===!0?1:0].join("|");if(!ce&&Ne===ne.current){be(null);return}ne.current=Ne,U(Se),be(null)}catch(ve){be(ve instanceof Error?ve.message:String(ve))}},[]);return e.useEffect(()=>{let ce=!0;const ve=async()=>{ce&&await le()};ve();const Se=setInterval(()=>{ve()},15e3),Ne=()=>{document.hidden!==!0&&ve()};return document.addEventListener("visibilitychange",Ne),()=>{ce=!1,clearInterval(Se),document.removeEventListener("visibilitychange",Ne)}},[le]),{state:Z,error:ee,reload:le}}const $e=Xy(t),ke=px({h:t,TextField:l}),Ie=gx({h:t,React:e,api:X,kit:o,currentUser:w,renderMarkdown:$e,tipOf:i,tipLabel:d,confirmDialog:C,promptDialog:E,TextField:l,TextAreaField:c,ChipField:u,CheckField:p,SelectField:f,MdField:g,MentionPicker:ke}),Ue=Ix({h:t,React:e});Rx({h:t,React:e,Editor:x,api:X,kit:o,toast:G,sessionToken:ae,currentUser:w,confirmDialog:C,promptDialog:E,tipOf:i,tipLabel:d,renderMarkdown:$e,SideDrawer:v,MentionPicker:ke,Card:b,TextField:l,TextAreaField:c,ChipField:u,CheckField:p,SelectField:f,MdField:g});function qa({state:Z,onChanged:U}){const[ee,be]=e.useState(null),[ne,le]=e.useState(null),[ce,ve]=e.useState(null),[Se,Ne]=e.useState(null),[Te,at]=e.useState({name:"",spec:"",description:""}),[nt,ct]=e.useState(!1),[qe,st]=e.useState(!1),tt=e.useCallback(async()=>{try{be(await X("/market"))}catch(ie){ve(ie instanceof Error?ie.message:String(ie))}},[]);e.useEffect(()=>{tt()},[tt]);const Pe=new Set(ee?.installed??[]),_t=ie=>ie.replace(/^link:/,"").split("/").pop().replace(/^dsh-/,"dsh-"),Fe=async(ie,Ce)=>{le(ie.id),ve(null),Ne(null);try{const ge=await X(`/market/${Ce}`,{id:ie.id});if(ge.ok===!1)throw new Error((ge.result?.output??"").slice(-300)||"安装失败");Ne(Ce==="install"?"已安装,重启工作空间后生效":"已移除,重启工作空间后生效"),await tt()}catch(ge){ve(ge instanceof Error?ge.message:String(ge))}finally{le(null)}},yt=async()=>{if(!(Te.name.trim()===""||Te.spec.trim()==="")){st(!0),ve(null);try{const ie=[...Z.config.market.items??[],{id:`m-${Math.random().toString(16).slice(2,10)}`,name:Te.name.trim(),spec:Te.spec.trim(),description:Te.description.trim()}];await X("/config",{market:{items:ie}}),at({name:"",spec:"",description:""}),ct(!1),await U(),await tt()}catch(ie){ve(ie instanceof Error?ie.message:String(ie))}finally{st(!1)}}},jt=async ie=>{if(!await C(`从市场列表移除「${ie.name}」?不会卸载已安装的插件。`,{title:"移除插件",danger:!0,okText:"移除"}))return;const Ce=(Z.config.market.items??[]).filter(ge=>ge.id!==ie.id);await X("/config",{market:{items:Ce}}).catch(()=>{}),await U(),await tt()},Qt=ee?.items??Z.config.market.items??[];return t("div",null,t("div",{className:"ds-row",style:{marginBottom:12}},t("div",{style:{fontSize:13.5,fontWeight:650}},ee?.title??Z.config.market.title),t("span",{className:"ds-stat"},`${Qt.length} 个条目 · profile ${Z.profile??"—"}`),t("div",{className:"ds-grow"}),t("button",{className:"ds-btn",onClick:()=>ct(!nt)},nt?"收起":"+ 添加条目")),ce!==null?t("div",{className:"ds-err",style:{padding:"0 0 8px"}},ce):null,Se!==null?t("div",{className:"ds-ok",style:{padding:"0 0 8px"}},Se):null,Qt.length===0?t("div",{className:"ds-empty"},"还没有条目。把公司内部的插件包加进来,同事就能一键安装。"):t("div",{className:"ds-market-grid"},Qt.map(ie=>{const Ce=_t(ie.spec),ge=Pe.has(Ce)||Pe.has(ie.name);return t("div",{key:ie.id,className:"ds-market-card"},t("div",{className:"ds-mc-head"},t("span",{className:"ds-mc-name ds-grow"},ie.name),t(u,{className:"ds-chip","data-on":ge?"1":"0"},ge?"已安装":"未安装")),ie.description!==""?t("div",{className:"ds-mc-desc"},ie.description):null,t("code",null,ie.spec),t("div",{className:"ds-row",style:{marginTop:"auto"}},t("button",{className:ge?"ds-btn":"ds-btn ds-btn-primary",disabled:ne===ie.id,onClick:async()=>{await C(ge?`从 profile 移除「${Ce}」?`:`安装「${Ce}」到工作空间?`,{title:ge?"移除插件":"安装插件",danger:ge,okText:ge?"移除":"安装"})&&Fe(ie,ge?"uninstall":"install")}},ne===ie.id?"处理中…":ge?"移除":"安装"),t("button",{className:"ds-btn",style:{marginLeft:"auto",opacity:.7},onClick:()=>void jt(ie)},"删条目")))})),nt?t("div",{className:"ds-panel",style:{marginTop:14}},t("div",{className:"ds-panel-head"},"添加条目"),t("div",{className:"ds-panel-body"},t("div",{className:"ds-field"},t("div",{className:"ds-label"},"显示名"),t(l,{className:"ds-input",value:Te.name,placeholder:"代码评审助手",onChange:ie=>at({...Te,name:ie.target.value})})),t("div",{className:"ds-field"},t("div",{className:"ds-label"},"包名或路径"),t(l,{className:"ds-input",value:Te.spec,placeholder:"@company/dsh-reviewer 或 link:~/pkgs/reviewer",onChange:ie=>at({...Te,spec:ie.target.value})})),t("div",{className:"ds-field"},t("div",{className:"ds-label"},"一句话说明"),t(l,{className:"ds-input",value:Te.description,placeholder:"自动跑 GitLab MR 的评审清单",onChange:ie=>at({...Te,description:ie.target.value})}))),t("div",{style:{padding:"0 14px 14px"}},t("button",{className:"ds-btn ds-btn-primary",disabled:qe||Te.name.trim()===""||Te.spec.trim()==="",onClick:()=>void yt()},qe?"添加中…":"加入市场"))):null)}function Tn({state:Z,onChanged:U,initialSection:ee,onSection:be}){const ne=Z.config,[le,ce]=e.useState({boardTitle:ne.board.title,gitlabUrl:ne.gitlab.url,gitlabGroup:ne.gitlab.group,gitlabProject:ne.gitlab.project,gitlabToken:"",feishuAppId:ne.feishu.appId,feishuAppSecret:"",feishuChatId:ne.feishu.chatId,feishuBaseToken:ne.feishu.baseToken,feishuTableId:ne.feishu.tableId,feishuWebhook:"",feishuNotify:ne.feishu.notifyOnChange!==!1,gitlabSyncEnabled:ne.gitlab.syncEnabled===!0,gitlabSyncLabel:ne.gitlab.syncLabel??"",roles:JSON.parse(JSON.stringify(ne.roles)),agentsEnabled:ne.agents?.enabled===!0,agentsMaxConcurrent:String(ne.agents?.maxConcurrent??2),agentsPreset:ne.agents?.agentPreset??"standard",agentsWorkspace:ne.agents?.workspaceDir??"",agentsSandbox:ne.agents?.sandbox??"workspace-write",agentsIsolation:ne.agents?.isolation??"none",agentsWorktreeRoot:ne.agents?.worktreeRoot??"",agentsCleanup:ne.agents?.cleanupWorktree??"manual",agentsAuto:Array.isArray(ne.agents?.autoStatuses)?ne.agents.autoStatuses:["design","dev_ready","test"]}),[ve,Se]=e.useState(null),[Ne,Te]=e.useState(null),[at,nt]=e.useState(!1),ct=async()=>{nt(!0),Te(null),Se(null);try{await X("/config",{board:{title:le.boardTitle},roles:le.roles,agents:{enabled:le.agentsEnabled,maxConcurrent:Number(le.agentsMaxConcurrent)||2,agentPreset:le.agentsPreset,workspaceDir:le.agentsWorkspace,sandbox:le.agentsSandbox,isolation:le.agentsIsolation,worktreeRoot:le.agentsWorktreeRoot,cleanupWorktree:le.agentsCleanup,autoStatuses:le.agentsAuto}}),Se("已保存"),await U()}catch(ie){Te(ie instanceof Error?ie.message:String(ie))}finally{nt(!1)}},qe=(ie,Ce,ge,Va)=>t("div",{className:"ds-field",key:ie},t("div",{className:"ds-label"},Ce),t(l,{className:"ds-input",type:"text",value:le[ie],placeholder:ge??"",onChange:St=>ce({...le,[ie]:St.target.value})})),st=Object.keys(le.roles),[tt,Pe]=e.useState(ee??"experts");e.useEffect(()=>{typeof ee=="string"&&ee!==""&&Pe(ee)},[ee]);const _t=ie=>{Pe(ie),be?.(ie)},Fe={projects:["项目与迭代","项目是看板的第一层分组:卡片挂项目、项目下面划迭代,之后按项目/迭代筛选和考核。"],experts:["专家","每个专家是一个能独立接活的工作单元。角色位决定它接哪一列,业务领域决定它懂哪块业务,角色提示词和技能决定它怎么做。"],teams:["专家团","团长负责拆活和汇总,成员各自干活;评论里 @团名 就交给团长。"],skills:["技能库","技能是一段可复用的做法。写进技能库后会落成 SKILL.md,专家在需要时自己加载,也可以自己新增。"],columns:["列的负责人","看板每一列默认派给谁。选「默认」用系统自带的那一位。"],gitlab:["代码仓库","一个仓库一条记录:地址、路径、令牌各自独立,同步时互不干扰。"],feishu:["飞书机器人","卡片状态变化时往群里发消息。可以按团队或项目建多个机器人。"],agents:["自动派单","卡片进入勾选的列时,自动把活派给该列的负责人;这里是全局开关与并发上限。"],models:["模型","每个角色位用哪个模型。单个专家还能在「专家」里单独覆盖。"],testing:["测试执行","接口用例跑在哪、能访问哪些域名、超时多少。执行器就跑在这台机器上(.218),不依赖外部 CI。"],costs:["成本与预算","一个月允许派多少次活、跑多少小时,超了在效能页亮黄亮红。"],environments:["部署环境","版本可以登记「上过哪个环境」,只留痕:平台不接 CD,不会触发任何部署。"],board:["看板外观","看板顶部显示的标题。"],access:["权限与审计","启用成员名单后,每个写操作都要认人:只读不能改,成员能推进卡,管理员才能改配置、删数据、发布版本。所有写操作都会进下面的审计日志。"],ldap:["统一登录(LDAP)","用公司账号登录平台:登录成功后服务端记住这个人,写操作和审计都挂在他的名字下。密码只存服务端密钥文件,不回显。"],storage:["数据与备份","台账存在哪、密钥存在哪,以及每次写操作留下的快照。改坏了可以回滚到上一版。"],health:["集成健康","飞书通知、GitLab、飞书云盘、代码隔离四条外部通道最近一次是成功还是失败。以前这些失败只写进日志,现在会在这里亮出来,坏了能看见、能补一次。"]},yt=t("div",{className:"ds-row",style:{gap:10,marginTop:2}},t("button",{className:"ds-btn ds-btn-primary",disabled:at,onClick:()=>void ct()},at?"保存中…":"保存"),ve!==null?t("span",{className:"ds-ok"},ve):null,Ne!==null?t("span",{className:"ds-err"},Ne):null),jt=[{group:"团队"},{id:"projects",label:"项目与迭代",count:(ne.projects??[]).length},{id:"experts",label:"专家",count:(ne.experts??[]).length},{id:"teams",label:"专家团",count:(ne.teams??[]).length},{id:"skills",label:"技能库"},{id:"columns",label:"列的负责人"},{group:"接入"},{id:"gitlab",label:"代码仓库",count:(ne.gitlab.projects??[]).length},{id:"feishu",label:"飞书机器人",count:(ne.feishu.bots??[]).length},{id:"health",label:"集成健康",count:Z.integrations?.broken??0},{group:"运行"},{id:"agents",label:"自动派单"},{id:"testing",label:"测试执行",count:(ne.testing?.envs??[]).length},{id:"costs",label:"成本与预算"},{id:"environments",label:"部署环境",count:(ne.environments??[]).length},{id:"board",label:"看板外观"},{group:"安全"},{id:"ldap",label:"统一登录(LDAP)",count:ne.ldap?.enabled===!0?ne.ldap?.requireLogin===!0?"必须":"开":0},{id:"access",label:"权限与审计",count:(ne.access?.members??[]).length},{id:"storage",label:"数据与备份",count:Z.storage?.snapshots??0}],Qt=ie=>ie==="projects"?t(Bx,{config:ne,onChanged:U}):ie==="experts"?t(jx,{config:ne,onChanged:U}):ie==="teams"?t(Dx,{config:ne,onChanged:U}):ie==="skills"?t(Yx,{config:ne,onChanged:U}):ie==="columns"?t(qx,{state:Z,onChanged:U}):ie==="testing"?t(Ox,{config:ne,onChanged:U}):ie==="costs"?t(Fx,{config:ne,onChanged:U}):ie==="environments"?t(Mx,{config:ne,onChanged:U}):ie==="access"?t(Ux,{state:Z,config:ne,onChanged:U}):ie==="ldap"?t(zx,{config:ne,onChanged:U}):ie==="storage"?t(Vx,{state:Z,onChanged:U}):ie==="gitlab"?t(Hx,{config:ne,onChanged:U}):ie==="feishu"?t("div",null,t(Kx,{config:ne,onChanged:U}),t(Lx,{config:ne,onChanged:U})):ie==="health"?t(Wx,{state:Z,config:ne,onChanged:U}):ie==="board"?t("div",null,t("div",{className:"ds-panel ds-form-panel"},t("div",{className:"ds-panel-head"},"看板"),t("div",{className:"ds-panel-body"},qe("boardTitle","看板标题","需求&任务工作空间"))),yt):ie==="models"?t("div",null,t("div",{className:"ds-panel ds-form-panel"},t("div",{className:"ds-panel-head"},"角色与模型"),t("div",{className:"ds-panel-body ds-grid2"},st.map(Ce=>t("div",{className:"ds-field",key:Ce},t("div",{className:"ds-label"},`${Aa[Ce]??Ce}`),t(l,{className:"ds-input",value:le.roles[Ce].model,placeholder:"deepseek-v4.1-flash",onChange:ge=>ce({...le,roles:{...le.roles,[Ce]:{...le.roles[Ce],model:ge.target.value}}})}))))),t("div",{className:"ds-hint",style:{margin:"-6px 0 12px"}},"单个专家可以在「专家」里单独指定模型,优先级:专家模型 → 这里的角色模型 → 宿主默认。"),yt):t("div",null,t("div",{className:"ds-panel ds-form-panel"},t("div",{className:"ds-panel-head"},"自动派单(专家 agent)"),t("div",{className:"ds-panel-body"},t("div",{className:"ds-field",style:{gridColumn:"1 / -1"}},t("label",{className:"ds-row",style:{alignItems:"center",gap:8,cursor:"pointer"}},t(p,{checked:le.agentsEnabled,onChange:Ce=>ce({...le,agentsEnabled:Ce.target.checked})}),t("span",{},"卡片进入勾选的列时,自动派给该列的负责人")),t("div",{className:"ds-hint"},"关闭后仍可在卡片抽屉里点「马上处理」手动派单;派单结果会写回评论并推进卡片。")),t("div",{className:"ds-field",style:{gridColumn:"1 / -1"}},t("div",{className:"ds-label"},"哪些列自动派单"),t("div",{className:"ds-row",style:{flexWrap:"wrap",gap:14}},[["design","待方案"],["dev_ready","待开发"],["dev","开发中"],["test","待测试"]].map(([Ce,ge])=>t("label",{className:"ds-row",key:Ce,style:{alignItems:"center",gap:6,cursor:"pointer"}},t(p,{checked:le.agentsAuto.includes(Ce),onChange:Va=>ce({...le,agentsAuto:Va.target.checked?[...le.agentsAuto,Ce]:le.agentsAuto.filter(St=>St!==Ce)})}),t("span",{},ge)))),t("div",{className:"ds-hint"},"勾选的列在卡片进入时自动派给该列对应的负责人;其余列只能手动「马上处理」。")),qe("agentsMaxConcurrent","同时最多几个 agent","2"),qe("agentsPreset","Agent 预设","standard"),qe("agentsWorkspace","工作区目录","~/dsh-workspace"),t("div",{className:"ds-hint",style:{gridColumn:"1 / -1"}},"预设决定 agent 手里有哪些工具:standard 带 shell 与文件读写,minimal 只有基础工具。"),t("div",{className:"ds-field",key:"agentsSandbox"},t("div",{className:"ds-label"},"沙箱档位(这个会话能写哪、能跑什么)"),t(f,{className:"ds-input",value:le.agentsSandbox,onChange:Ce=>ce({...le,agentsSandbox:Ce.target.value})},[["read-only","只读:能看不能改"],["workspace-write","只写工作区(推荐):能改自己的目录,改不到系统别处"],["danger-full-access","无沙箱:可以写任何地方(危险)"]].map(([Ce,ge])=>t("option",{key:Ce,value:Ce},ge))),t("div",{className:"ds-hint"},"由 DSH 的 permission preset 执行:read-only / workspace-write 走 bwrap 或 Landlock 隔离。单个专家可以在「专家」里覆盖。")),t("div",{className:"ds-field",key:"agentsIsolation"},t("div",{className:"ds-label"},"代码隔离"),t(f,{className:"ds-input",value:le.agentsIsolation,onChange:Ce=>ce({...le,agentsIsolation:Ce.target.value})},[["none","不隔离:所有卡共用一个工作区"],["worktree","一卡一个 git worktree(推荐给多卡并行)"]].map(([Ce,ge])=>t("option",{key:Ce,value:Ce},ge))),t("div",{className:"ds-hint"},"开启后,卡要挂在配了「本机代码目录」的项目上,派单时会为它切一条 task/<编号> 分支。")),qe("agentsWorktreeRoot","worktree 根目录","留空 = 工作区同级的 dsh-worktrees"),t("div",{className:"ds-field",key:"agentsCleanup"},t("div",{className:"ds-label"},"卡完成时"),t(f,{className:"ds-input",value:le.agentsCleanup,onChange:Ce=>ce({...le,agentsCleanup:Ce.target.value})},[["manual","保留 worktree 和分支,等人看 diff"],["on_done","自动删掉 worktree 和分支"]].map(([Ce,ge])=>t("option",{key:Ce,value:Ce},ge)))))),yt);return t("div",{className:"ds-settings"},t("div",{className:"ds-settings-nav"},jt.map((ie,Ce)=>ie.group!==void 0?t("div",{className:"ds-settings-nav-group",key:`group-${Ce}`},ie.group):i((Fe[ie.id]??[ie.label,""])[1]||ie.label,t("button",{key:ie.id,className:"ds-nav-item","data-active":tt===ie.id?"1":"0",onClick:()=>_t(ie.id)},t("span",{},ie.label),ie.count===void 0?null:t("span",{className:"ds-nav-count"},String(ie.count)))))),t("div",{className:"ds-settings-pane"},t("div",{className:"ds-pane-head"},t("div",null,t("div",{className:"ds-pane-title"},(Fe[tt]??["设置"])[0]),t("div",{className:"ds-pane-desc"},(Fe[tt]??["",""])[1]))),Qt(tt)))}function V({state:Z,onClose:U,onCreated:ee}){const be=Z?.config?.projects??[],[ne,le]=e.useState(""),[ce,ve]=e.useState(""),[Se,Ne]=e.useState("requirement"),[Te,at]=e.useState("normal"),[nt,ct]=e.useState("p2"),[qe,st]=e.useState(""),tt=Z?.requirements??[],[Pe,_t]=e.useState(""),[Fe,yt]=e.useState(be.length===1?be[0].id:""),[jt,Qt]=e.useState(""),[ie,Ce]=e.useState(""),[ge,Va]=e.useState(""),[St,da]=e.useState(null),[Pn,Ra]=e.useState(!1),Dt=Se==="bug",Ot=be.find(z=>z.id===Fe)?.iterations??[],Y=async()=>{Ra(!0),da(null);try{await X("/task/create",{title:ne,requirement:ce,type:Se,priority:Te,domain:qe,severity:Dt?nt:"",role:Dt?"dev":"product",status:Dt?"dev_ready":"clarify",project:Fe,iteration:Fe===""?"":jt,owner:ie.trim(),dueAt:Pr(ge),requirementId:Pe}),await ee(),U()}catch(z){da(z instanceof Error?z.message:String(z))}finally{Ra(!1)}};return t("div",{className:"ds-modal-wrap",onClick:z=>{z.target===z.currentTarget&&U()}},t("div",{className:"ds-modal"},t("h3",{},Dt?"登记缺陷":"新建任务"),t("div",{className:"ds-field"},t("div",{className:"ds-label"},"标题"),t(l,{className:"ds-input",autoFocus:!0,placeholder:Dt?"一句话说清什么坏了,例如「优惠券叠加后金额算错」":"一句话说清要做什么",value:ne,onChange:z=>le(z.target.value),onKeyDown:z=>{z.key==="Enter"&&!z.isComposing&&Y()}})),t("div",{className:"ds-field"},t("div",{className:"ds-label"},Dt?"复现步骤 / 现象":"需求 / 背景"),t(g,{className:"ds-textarea",rows:5,placeholder:Dt?`复现步骤:1… 2…
|
|
828
828
|
实际结果:
|
|
829
829
|
期望结果:
|
|
830
|
-
影响范围 / 环境(版本、账号、数据条件):`:"背景、期望结果、验收口径。专家会照这段去开工。",value:de,onChange:z=>ge(z.target.value)})),t("div",{className:"ds-modal-grid"},t("div",{className:"ds-field"},t("div",{className:"ds-label"},"类型"),t(f,{className:"ds-select",value:we,onChange:z=>ye(z.target.value)},Object.keys(zo).map(z=>t("option",{key:z,value:z},zo[z])))),Dt?t("div",{className:"ds-field"},t("div",{className:"ds-label"},"严重级别"),t(f,{className:"ds-select",value:at,onChange:z=>ct(z.target.value)},Object.keys(ql).map(z=>t("option",{key:z,value:z},ql[z])))):t("div",{className:"ds-field"},t("div",{className:"ds-label"},"优先级"),t(f,{className:"ds-select",value:Ee,onChange:z=>tt(z.target.value)},Object.keys(As).map(z=>t("option",{key:z,value:z},As[z])))),Dt?t("div",{className:"ds-field"},t("div",{className:"ds-label"},"优先级"),t(f,{className:"ds-select",value:Ee,onChange:z=>tt(z.target.value)},Object.keys(As).map(z=>t("option",{key:z,value:z},As[z])))):null,t("div",{className:"ds-field",style:{gridColumn:"1 / -1"}},t("div",{className:"ds-label"},"挂在哪个需求下"),et.length===0?t("div",{className:"ds-hint",style:{fontSize:11.5}},"还没有需求。到「需求」页先建一条,这张卡就能拿到 DEV-001 这样的编号。"):t(f,{className:"ds-select",value:$e,onChange:z=>_t(z.target.value)},t("option",{value:""},"暂不挂需求(编号留空)"),et.map(z=>t("option",{key:z.id,value:z.id},`${z.code||z.id} · ${z.title}`)))),t("div",{className:"ds-field",style:{gridColumn:"1 / -1"}},t("div",{className:"ds-label"},"业务领域(选填)"),t(l,{className:"ds-input",placeholder:"例如 支付 / 会员 / 履约,填了会自动派给同领域的专家",value:qe,onChange:z=>nt(z.target.value)})),ve.length===0?null:t("div",{className:"ds-field"},t("div",{className:"ds-label"},"业务项目"),t(f,{className:"ds-select",value:Fe,onChange:z=>{xt(z.target.value),Qt("")}},t("option",{value:""},"不属于任何项目"),ve.map(z=>t("option",{key:z.id,value:z.id},`${z.key?`${z.key} · `:""}${z.name}`)))),ve.length===0||Ot.length===0?null:t("div",{className:"ds-field"},t("div",{className:"ds-label"},"迭代"),t(f,{className:"ds-select",value:jt,onChange:z=>Qt(z.target.value)},t("option",{value:""},"不指定迭代"),Ot.map(z=>t("option",{key:z.id,value:z.id},z.name)))),t("div",{className:"ds-field"},t("div",{className:"ds-label"},"业务负责人(选填)"),t(l,{className:"ds-input",placeholder:"提需求的人,例如 张伟",value:re,onChange:z=>ke(z.target.value)})),t("div",{className:"ds-field"},t("div",{className:"ds-label"},"期望完成(选填)"),t(l,{className:"ds-input",type:"date",value:pe,onChange:z=>Va(z.target.value)}))),Dt?t("div",{className:"ds-hint",style:{fontSize:11.5}},"缺陷卡会直接落到「待开发」,由研发先复现、定位根因再修,修完自动交给测试验证。"):null,t("div",{className:"ds-modal-foot"},St!==null?t("span",{className:"ds-err"},St):null,t("div",{className:"ds-grow"}),t("button",{className:"ds-btn",onClick:B},"取消"),t("button",{className:"ds-btn ds-btn-primary",disabled:Pn||te.trim()==="",onClick:()=>void Q()},Pn?"创建中…":Dt?"登记缺陷":"创建"))))}function me({state:X,onOpenBoard:B}){const[ee,ve]=e.useState(null),[te,oe]=e.useState(null);if(e.useEffect(()=>{let ge=!0;return Z("/metrics").then(we=>{ge&&ve(we.metrics)}).catch(we=>{ge&&oe(we instanceof Error?we.message:String(we))}),()=>{ge=!1}},[X.revision]),te!==null)return t("div",{className:"ds-body"},t("div",{className:"ds-err"},te));if(ee===null)return t("div",{className:"ds-loading"},"正在统计…");const de=(ge,we,ye,Ee)=>t("div",{className:"ds-proj-card",key:Ee},t("div",{className:"ds-proj-head"},t("div",null,t("div",{className:"ds-proj-name"},ge),t("div",{className:"ds-hint"},we)),t("button",{className:"ds-btn",onClick:()=>B(Ee)},"看这些卡")),t("div",{className:"ds-proj-stats"},t("div",null,t("b",{},ye.inProgress),t("span",{},"进行中")),t("div",null,t("b",{"data-warn":ye.blocked>0?"1":"0"},ye.blocked),t("span",{},"阻塞")),t("div",null,t("b",{"data-warn":ye.overdue>0?"1":"0"},ye.overdue),t("span",{},"逾期")),t("div",null,t("b",{},ye.done),t("span",{},"已完成")),t("div",null,t("b",{},`${ye.checklistRate}%`),t("span",{},"清单完成")),t("div",null,t("b",{},ye.artifacts),t("span",{},"交付物"))),t("div",{className:"ds-proj-bar"},t("div",{className:"ds-check-bar","data-full":ye.checklistRate===100?"1":"0"},t("span",{style:{width:`${ye.checklistRate}%`}}))),ye.cycleDays>0?t("div",{className:"ds-hint"},`平均周期 ${ye.cycleDays} 天 · 近 7 天完成 ${ye.throughput7d} 张`):t("div",{className:"ds-hint"},`近 7 天完成 ${ye.throughput7d} 张`));return t("div",{className:"ds-body"},t("div",{className:"ds-proj-grid"},(ee.projects??[]).map(ge=>de(`${ge.key?`[${ge.key}] `:""}${ge.name}`,`${(ge.iterations??[]).length} 个迭代`,ge.metrics,ge.id)),ee.unassigned!==null&&ee.unassigned.total>0?de("未归属项目","还没挂到项目上的卡",ee.unassigned,""):null),(ee.projects??[]).length===0&&(ee.unassigned===null||ee.unassigned.total===0)?t("div",{className:"ds-empty"},"还没有卡片。先去「设置 → 项目与迭代」建一个项目,再新建任务。"):null)}const Ae={INPUT:1,TEXTAREA:1,SELECT:1,BUTTON:1,A:1,OPTION:1},ze='[data-on],[data-role],[role="button"],[tabindex],[class*="ds-"]';function Pt(X){if(X===null||X.nodeType!==1||Ae[X.tagName]===1||X.dataset.kb==="1"||typeof X.className=="string"&&X.className.indexOf("mask")>=0||X.getAttribute("contenteditable")==="true")return!1;let B="";try{B=window.getComputedStyle(X).cursor}catch{B=""}return B==="pointer"}function Vt(X){X.dataset.kb="1",X.getAttribute("tabindex")===null&&X.setAttribute("tabindex","0"),X.getAttribute("role")===null&&X.setAttribute("role","button");const B=X.getAttribute("data-on");if(B!==null&&X.setAttribute("aria-pressed",B==="1"?"true":"false"),X.getAttribute("aria-label")===null){const ee=String(X.getAttribute("title")??X.textContent??"").trim().replace(/\s+/g," ").slice(0,80);ee.length>0&&X.setAttribute("aria-label",ee)}X.addEventListener("keydown",ee=>{ee.key!=="Enter"&&ee.key!==" "||X.getAttribute("aria-disabled")!=="true"&&(ee.preventDefault(),X.click())})}function Je(){if(typeof document>"u")return()=>{};const X=B=>{const ee=B.target,ve=ee instanceof Element?ee.closest(".ds-board"):null;ve!==null&&(ve.scrollWidth<=ve.clientWidth+1||B.shiftKey||Math.abs(B.deltaY)<=Math.abs(B.deltaX)||(ve.scrollLeft+=B.deltaY,B.preventDefault()))};return document.addEventListener("wheel",X,{passive:!1}),()=>document.removeEventListener("wheel",X)}function yt(){if(typeof document>"u")return()=>{};const X=new WeakSet,B=[];let ee=!1;const ve=()=>typeof performance<"u"?performance.now():Date.now(),te=new WeakSet,oe=[];let de=null;const ge=()=>{ee=!1;const at=ve()+6,ct=[];for(;B.length>0&&ct.length<60&&ve()<at;)ct.push(B.pop());const qe=[],nt=[];for(const $e of ct)$e.isConnected!==!1&&(Pt($e)?qe.push($e):nt.push($e));for(const $e of qe)X.add($e),Vt($e);let et=!1;for(const $e of nt)te.has($e)||(te.add($e),$e.isConnected!==!1&&(oe.push($e),et=!0));et&&de===null&&(de=window.setTimeout(()=>{de=null,B.push(...oe.splice(0)),we()},400)),B.length>0&&we()},we=()=>{ee!==!0&&(ee=!0,typeof window.requestIdleCallback=="function"?window.requestIdleCallback(ge,{timeout:300}):window.setTimeout(ge,16))},ye=()=>{const at=document.querySelector("[data-dsh-studio]");if(at!==null){for(const ct of at.querySelectorAll(ze))X.has(ct)||te.has(ct)||ct.dataset.kb==="1"||B.push(ct);B.length>0&&we()}};ye();let Ee=null;const tt=new MutationObserver(()=>{Ee===null&&(Ee=window.setTimeout(()=>{Ee=null,ye()},200))});return tt.observe(document.body,{childList:!0,subtree:!0}),()=>tt.disconnect()}function ls({config:X,theme:B,message:ee,onDone:ve,onClose:te,overlay:oe}){const de=String(X?.localAuth?.username??"admin"),ge=X?.localAuth?.enabled!==!1,we=X?.ldap?.enabled===!0,[ye,Ee]=e.useState(we?"ldap":"local"),[tt,at]=e.useState(we?"":de),[ct,qe]=e.useState(""),[nt,et]=e.useState(!1),[$e,_t]=e.useState(ee??""),Fe=pe=>{pe!==ye&&(Ee(pe),_t(""),qe(""),at(pe==="local"?de:""))},xt=async()=>{if(!nt){if(tt.trim()===""||ct===""){_t(ye==="local"?"本地账号和密码都要填":"域账号和密码都要填");return}et(!0),_t("");try{const pe=await Z("/auth/login",{username:tt.trim(),password:ct,mode:ye});U(pe.token),Te(pe.user??null),$(String(pe.user?.name??pe.user?.id??tt.trim())),qe(""),ve()}catch(pe){_t(pe instanceof Error?pe.message:String(pe))}finally{et(!1)}}},jt=t("div",{className:"ds-seg",style:{alignSelf:"flex-start"}},t("button",{className:"ds-seg-btn",type:"button","data-on":ye==="ldap"?"1":"0",disabled:!we,title:we?"用公司目录(LDAP)的账号登录":"LDAP 还没启用,先在设置里配好再用",onClick:()=>Fe("ldap")},"LDAP 账号"),t("button",{className:"ds-seg-btn",type:"button","data-on":ye==="local"?"1":"0",disabled:!ge,title:"用平台自带的超管账号登录",onClick:()=>Fe("local")},"本地超管")),Qt=ye==="ldap"?t("div",{className:"ds-login-hint"},"用公司账号登录(LDAP)。登录后会记下你的名字,写操作和审计都挂在这个名字下。"):t("div",{className:"ds-login-hint"},`用平台自带的超管账号登录。默认账号 ${de},默认口令 admin(改过之后就用新口令)。`),re=t("div",{className:"ds-login"},t("div",{className:"ds-login-brand"},"◈ ",X?.board?.title??"工作空间"),jt,Qt,t("label",{className:"ds-field"},t("span",null,ye==="local"?"超管账号":"域账号"),t("input",{value:tt,autoFocus:ye==="ldap",name:"studio-account",autoComplete:"off",spellCheck:!1,placeholder:ye==="local"?de:"域账号",onChange:pe=>at(pe.target.value),onKeyDown:pe=>{pe.key==="Enter"&&xt()}})),t("label",{className:"ds-field"},t("span",null,"密码"),t("input",{type:"password",value:ct,autoFocus:ye==="local",name:"studio-pass",autoComplete:"new-password",placeholder:ye==="local"?"默认口令 admin":"域密码",onChange:pe=>qe(pe.target.value),onKeyDown:pe=>{pe.key==="Enter"&&xt()}})),$e===""?null:t("div",{className:"ds-error"},$e),$e!==""&&/LDAP|域|目录|连不上/.test($e)?t("div",{className:"ds-login-note"},"连不上目录服务时,切到「本地超管」用平台账号进来;等网络打通再用域账号。"):null,t("div",{className:"ds-login-actions"},t("button",{className:"ds-btn ds-btn-primary",disabled:nt,onClick:()=>void xt()},nt?"登录中…":ye==="local"?"登录(本地超管)":"登录(LDAP)"),typeof te=="function"?t("button",{className:"ds-btn ds-btn-ghost",onClick:()=>te()},"先不登录"):null),t("div",{className:"ds-login-note"},ye==="ldap"?`${X?.ldap?.url??"—"} · BASE:${X?.ldap?.baseDN??"—"}`:"本地账号存在服务端密钥里(scrypt 哈希),改密码在「设置 → 统一登录(LDAP)」")),ke=t("div",{className:"ds-login-wrap","data-overlay":oe===!0?"1":"0"},re);return oe===!0?ke:t("div",{"data-dsh-studio":"","data-theme":B},t("style",null,he),ke)}function wa(X){const B=X?.loginGate??ls,{state:ee,error:ve,reload:te}=H(),[oe,de]=e.useState("dashboard"),[ge,we]=e.useState("experts"),[ye,Ee]=e.useState(null),[tt,at]=e.useState(!1);async function ct(z){const ie=await Tx(z,{api:Z,state:ee,confirm:C,prompt:E,notify:W});ie.refresh===!0&&await te(!0),ie.open!==void 0&&Ee(ie.open)}const[qe,nt]=e.useState(!1),[et,$e]=e.useState(0);e.useEffect(()=>{if(!qe)return;const z=()=>nt(!1);return document.addEventListener("click",z),()=>document.removeEventListener("click",z)},[qe]);const[_t,Fe]=e.useState(Ne),[xt,jt]=e.useState(()=>K()??(O()?.matches?"dark":"light")),[Qt,re]=e.useState(!1),[ke,pe]=e.useState(!1),[Va,St]=e.useState(null),[la,Pn]=e.useState(0),[Ra,Dt]=e.useState(null);e.useEffect(()=>{const z=ie=>{const Le=String(ie.key).toLowerCase();if((ie.metaKey||ie.ctrlKey)&&!ie.shiftKey&&!ie.altKey&&Le==="k"){ie.preventDefault(),St(null),pe(Ge=>!Ge);return}const Ve=bx(ie);Ve!==null&&(ie.preventDefault(),St(Ve),Pn(Ge=>Ge+1),pe(!0))};return document.addEventListener("keydown",z),()=>document.removeEventListener("keydown",z)},[]),e.useEffect(()=>{const z=()=>{const Ge=K()??(O()?.matches?"dark":"light");jt(We=>We===Ge?We:Ge)};z();const ie=O(),Le=()=>z();ie!==null&&ie.addEventListener("change",Le);const Ve=window.setInterval(z,1500);return()=>{ie!==null&&ie.removeEventListener("change",Le),window.clearInterval(Ve)}},[]);const Ot=_t==="system"?xt:_t;if(e.useEffect(()=>{const z=document.documentElement;z.setAttribute("data-dsh-theme",Ot),z.style.colorScheme=Ot;let ie=document.getElementById("dsh-studio-global-theme");return ie===null&&(ie=document.createElement("style"),ie.id="dsh-studio-global-theme",ie.textContent=le,document.head.appendChild(ie)),()=>{z.removeAttribute("data-dsh-theme"),z.style.colorScheme=""}},[Ot]),e.useEffect(()=>yt(),[]),e.useEffect(()=>Je(),[]),ee===null)return t("div",{"data-dsh-studio":"","data-theme":Ot},t("style",null,he),t("div",{className:"ds-loading"},ve===null?"正在载入工作空间…":`载入失败:${ve}`));if(ee.locked===!0)return t(B,{config:ee.config,theme:Ot,message:"",onDone:()=>void te()});const Q=ye===null?null:ee.tasks.find(z=>z.id===ye)??null;return ee.tasks.reduce((z,ie)=>(z[ie.status]=(z[ie.status]??0)+1,z),{}),t("div",{"data-dsh-studio":"","data-theme":Ot},t("style",null,he),t(_,null),t(F,null),t("div",{className:"ds-head"},t("div",{className:"ds-head-top"},t("div",{className:"ds-brand"},t("span",{className:"ds-brand-mark"},"◈"),t("div",null,t("div",{className:"ds-title"},ee.config.board.title),t("div",{className:"ds-sub"},`${ee.tasks.length} 个任务 · rev ${ee.revision} · 更新于 ${Ye(ee.updatedAt)}`))),t("div",{className:"ds-head-actions"},ae()===null?t(u,{className:"ds-chip","data-on":"1",title:"没配 LDAP 时平台默认以超管身份使用,不需要登录;写操作与审计都记在它名下"},`👤 超管 ${ee.config.localAuth?.username??"admin"}`):t(u,{className:"ds-chip",title:`已登录:${ae()?.id??""}`},`👤 ${ae()?.name??ae()?.id}`),ae()===null?t("button",{className:"ds-btn ds-btn-ghost",title:"用域账号或本地超管账号登录",onClick:()=>re(!0)},"登录"):i("退出当前账号(退出后回到超管身份)",t("button",{className:"ds-btn ds-btn-ghost",onClick:async()=>{try{await Z("/auth/logout",{})}catch{}U(""),Te(null),re(!1),te()}},"退出登录")),(()=>{const z=o("SegGroup"),ie=I.map(([Le,Ve])=>({id:Le,label:Ve}));return z!==null?t(z,{value:_t,onChange:Le=>Fe(fe(Le)),options:ie}):t("div",{className:"ds-seg",title:"显示模式;「跟随系统」会先跟宿主界面的深浅色,宿主没给出信号时再跟操作系统"},I.map(([Le,Ve])=>t("button",{key:Le,className:"ds-seg-btn","data-on":_t===Le?"1":"0",onClick:()=>Fe(fe(Le))},Ve)))})(),t("button",{className:"ds-btn",onClick:()=>void te()},"刷新"),t("a",{className:"ds-btn ds-btn-ghost",style:{textDecoration:"none"},href:"/studio-api/export/tasks.csv",title:"把看板上的卡导出成 CSV(Excel 可直接打开)"},"导出卡"),t("a",{className:"ds-btn ds-btn-ghost",style:{textDecoration:"none"},href:"/studio-api/export/requirements.csv",title:"把需求与准出情况导出成 CSV"},"导出需求"),(ee.integrations?.broken??0)>0?t("button",{className:"ds-btn ds-btn-ghost",style:{color:"#e5484d",borderColor:"color-mix(in srgb, #e5484d 40%, var(--ds-line))"},title:(ee.integrations.channels??[]).filter(z=>z.state==="error").map(z=>`${z.label}:${z.lastError}`).join(`
|
|
831
|
-
`),onClick:()=>{
|
|
830
|
+
影响范围 / 环境(版本、账号、数据条件):`:"背景、期望结果、验收口径。专家会照这段去开工。",value:ce,onChange:z=>ve(z.target.value)})),t("div",{className:"ds-modal-grid"},t("div",{className:"ds-field"},t("div",{className:"ds-label"},"类型"),t(f,{className:"ds-select",value:Se,onChange:z=>Ne(z.target.value)},Object.keys(zo).map(z=>t("option",{key:z,value:z},zo[z])))),Dt?t("div",{className:"ds-field"},t("div",{className:"ds-label"},"严重级别"),t(f,{className:"ds-select",value:nt,onChange:z=>ct(z.target.value)},Object.keys(ql).map(z=>t("option",{key:z,value:z},ql[z])))):t("div",{className:"ds-field"},t("div",{className:"ds-label"},"优先级"),t(f,{className:"ds-select",value:Te,onChange:z=>at(z.target.value)},Object.keys(As).map(z=>t("option",{key:z,value:z},As[z])))),Dt?t("div",{className:"ds-field"},t("div",{className:"ds-label"},"优先级"),t(f,{className:"ds-select",value:Te,onChange:z=>at(z.target.value)},Object.keys(As).map(z=>t("option",{key:z,value:z},As[z])))):null,t("div",{className:"ds-field",style:{gridColumn:"1 / -1"}},t("div",{className:"ds-label"},"挂在哪个需求下"),tt.length===0?t("div",{className:"ds-hint",style:{fontSize:11.5}},"还没有需求。到「需求」页先建一条,这张卡就能拿到 DEV-001 这样的编号。"):t(f,{className:"ds-select",value:Pe,onChange:z=>_t(z.target.value)},t("option",{value:""},"暂不挂需求(编号留空)"),tt.map(z=>t("option",{key:z.id,value:z.id},`${z.code||z.id} · ${z.title}`)))),t("div",{className:"ds-field",style:{gridColumn:"1 / -1"}},t("div",{className:"ds-label"},"业务领域(选填)"),t(l,{className:"ds-input",placeholder:"例如 支付 / 会员 / 履约,填了会自动派给同领域的专家",value:qe,onChange:z=>st(z.target.value)})),be.length===0?null:t("div",{className:"ds-field"},t("div",{className:"ds-label"},"业务项目"),t(f,{className:"ds-select",value:Fe,onChange:z=>{yt(z.target.value),Qt("")}},t("option",{value:""},"不属于任何项目"),be.map(z=>t("option",{key:z.id,value:z.id},`${z.key?`${z.key} · `:""}${z.name}`)))),be.length===0||Ot.length===0?null:t("div",{className:"ds-field"},t("div",{className:"ds-label"},"迭代"),t(f,{className:"ds-select",value:jt,onChange:z=>Qt(z.target.value)},t("option",{value:""},"不指定迭代"),Ot.map(z=>t("option",{key:z.id,value:z.id},z.name)))),t("div",{className:"ds-field"},t("div",{className:"ds-label"},"业务负责人(选填)"),t(l,{className:"ds-input",placeholder:"提需求的人,例如 张伟",value:ie,onChange:z=>Ce(z.target.value)})),t("div",{className:"ds-field"},t("div",{className:"ds-label"},"期望完成(选填)"),t(l,{className:"ds-input",type:"date",value:ge,onChange:z=>Va(z.target.value)}))),Dt?t("div",{className:"ds-hint",style:{fontSize:11.5}},"缺陷卡会直接落到「待开发」,由研发先复现、定位根因再修,修完自动交给测试验证。"):null,t("div",{className:"ds-modal-foot"},St!==null?t("span",{className:"ds-err"},St):null,t("div",{className:"ds-grow"}),t("button",{className:"ds-btn",onClick:U},"取消"),t("button",{className:"ds-btn ds-btn-primary",disabled:Pn||ne.trim()==="",onClick:()=>void Y()},Pn?"创建中…":Dt?"登记缺陷":"创建"))))}function he({state:Z,onOpenBoard:U}){const[ee,be]=e.useState(null),[ne,le]=e.useState(null);if(e.useEffect(()=>{let ve=!0;return X("/metrics").then(Se=>{ve&&be(Se.metrics)}).catch(Se=>{ve&&le(Se instanceof Error?Se.message:String(Se))}),()=>{ve=!1}},[Z.revision]),ne!==null)return t("div",{className:"ds-body"},t("div",{className:"ds-err"},ne));if(ee===null)return t("div",{className:"ds-loading"},"正在统计…");const ce=(ve,Se,Ne,Te)=>t("div",{className:"ds-proj-card",key:Te},t("div",{className:"ds-proj-head"},t("div",null,t("div",{className:"ds-proj-name"},ve),t("div",{className:"ds-hint"},Se)),t("button",{className:"ds-btn",onClick:()=>U(Te)},"看这些卡")),t("div",{className:"ds-proj-stats"},t("div",null,t("b",{},Ne.inProgress),t("span",{},"进行中")),t("div",null,t("b",{"data-warn":Ne.blocked>0?"1":"0"},Ne.blocked),t("span",{},"阻塞")),t("div",null,t("b",{"data-warn":Ne.overdue>0?"1":"0"},Ne.overdue),t("span",{},"逾期")),t("div",null,t("b",{},Ne.done),t("span",{},"已完成")),t("div",null,t("b",{},`${Ne.checklistRate}%`),t("span",{},"清单完成")),t("div",null,t("b",{},Ne.artifacts),t("span",{},"交付物"))),t("div",{className:"ds-proj-bar"},t("div",{className:"ds-check-bar","data-full":Ne.checklistRate===100?"1":"0"},t("span",{style:{width:`${Ne.checklistRate}%`}}))),Ne.cycleDays>0?t("div",{className:"ds-hint"},`平均周期 ${Ne.cycleDays} 天 · 近 7 天完成 ${Ne.throughput7d} 张`):t("div",{className:"ds-hint"},`近 7 天完成 ${Ne.throughput7d} 张`));return t("div",{className:"ds-body"},t("div",{className:"ds-proj-grid"},(ee.projects??[]).map(ve=>ce(`${ve.key?`[${ve.key}] `:""}${ve.name}`,`${(ve.iterations??[]).length} 个迭代`,ve.metrics,ve.id)),ee.unassigned!==null&&ee.unassigned.total>0?ce("未归属项目","还没挂到项目上的卡",ee.unassigned,""):null),(ee.projects??[]).length===0&&(ee.unassigned===null||ee.unassigned.total===0)?t("div",{className:"ds-empty"},"还没有卡片。先去「设置 → 项目与迭代」建一个项目,再新建任务。"):null)}const je={INPUT:1,TEXTAREA:1,SELECT:1,BUTTON:1,A:1,OPTION:1},ze='[data-on],[data-role],[role="button"],[tabindex],[class*="ds-"]';function Pt(Z){if(Z===null||Z.nodeType!==1||je[Z.tagName]===1||Z.dataset.kb==="1"||typeof Z.className=="string"&&Z.className.indexOf("mask")>=0||Z.getAttribute("contenteditable")==="true")return!1;let U="";try{U=window.getComputedStyle(Z).cursor}catch{U=""}return U==="pointer"}function Vt(Z){Z.dataset.kb="1",Z.getAttribute("tabindex")===null&&Z.setAttribute("tabindex","0"),Z.getAttribute("role")===null&&Z.setAttribute("role","button");const U=Z.getAttribute("data-on");if(U!==null&&Z.setAttribute("aria-pressed",U==="1"?"true":"false"),Z.getAttribute("aria-label")===null){const ee=String(Z.getAttribute("title")??Z.textContent??"").trim().replace(/\s+/g," ").slice(0,80);ee.length>0&&Z.setAttribute("aria-label",ee)}Z.addEventListener("keydown",ee=>{ee.key!=="Enter"&&ee.key!==" "||Z.getAttribute("aria-disabled")!=="true"&&(ee.preventDefault(),Z.click())})}function et(){if(typeof document>"u")return()=>{};const Z=U=>{const ee=U.target,be=ee instanceof Element?ee.closest(".ds-board"):null;be!==null&&(be.scrollWidth<=be.clientWidth+1||U.shiftKey||Math.abs(U.deltaY)<=Math.abs(U.deltaX)||(be.scrollLeft+=U.deltaY,U.preventDefault()))};return document.addEventListener("wheel",Z,{passive:!1}),()=>document.removeEventListener("wheel",Z)}function bt(){if(typeof document>"u")return()=>{};const Z=new WeakSet,U=[];let ee=!1;const be=()=>typeof performance<"u"?performance.now():Date.now(),ne=new WeakSet,le=[];let ce=null;const ve=()=>{ee=!1;const nt=be()+6,ct=[];for(;U.length>0&&ct.length<60&&be()<nt;)ct.push(U.pop());const qe=[],st=[];for(const Pe of ct)Pe.isConnected!==!1&&(Pt(Pe)?qe.push(Pe):st.push(Pe));for(const Pe of qe)Z.add(Pe),Vt(Pe);let tt=!1;for(const Pe of st)ne.has(Pe)||(ne.add(Pe),Pe.isConnected!==!1&&(le.push(Pe),tt=!0));tt&&ce===null&&(ce=window.setTimeout(()=>{ce=null,U.push(...le.splice(0)),Se()},400)),U.length>0&&Se()},Se=()=>{ee!==!0&&(ee=!0,typeof window.requestIdleCallback=="function"?window.requestIdleCallback(ve,{timeout:300}):window.setTimeout(ve,16))},Ne=()=>{const nt=document.querySelector("[data-dsh-studio]");if(nt!==null){for(const ct of nt.querySelectorAll(ze))Z.has(ct)||ne.has(ct)||ct.dataset.kb==="1"||U.push(ct);U.length>0&&Se()}};Ne();let Te=null;const at=new MutationObserver(()=>{Te===null&&(Te=window.setTimeout(()=>{Te=null,Ne()},200))});return at.observe(document.body,{childList:!0,subtree:!0}),()=>at.disconnect()}function ds({config:Z,theme:U,message:ee,onDone:be,onClose:ne,overlay:le}){const ce=String(Z?.localAuth?.username??"admin"),ve=Z?.localAuth?.enabled!==!1,Se=Z?.ldap?.enabled===!0,[Ne,Te]=e.useState(Se?"ldap":"local"),[at,nt]=e.useState(Se?"":ce),[ct,qe]=e.useState(""),[st,tt]=e.useState(!1),[Pe,_t]=e.useState(ee??""),Fe=ge=>{ge!==Ne&&(Te(ge),_t(""),qe(""),nt(ge==="local"?ce:""))},yt=async()=>{if(!st){if(at.trim()===""||ct===""){_t(Ne==="local"?"本地账号和密码都要填":"域账号和密码都要填");return}tt(!0),_t("");try{const ge=await X("/auth/login",{username:at.trim(),password:ct,mode:Ne});F(ge.token),xe(ge.user??null),T(String(ge.user?.name??ge.user?.id??at.trim())),qe(""),be()}catch(ge){_t(ge instanceof Error?ge.message:String(ge))}finally{tt(!1)}}},jt=t("div",{className:"ds-seg",style:{alignSelf:"flex-start"}},t("button",{className:"ds-seg-btn",type:"button","data-on":Ne==="ldap"?"1":"0",disabled:!Se,title:Se?"用公司目录(LDAP)的账号登录":"LDAP 还没启用,先在设置里配好再用",onClick:()=>Fe("ldap")},"LDAP 账号"),t("button",{className:"ds-seg-btn",type:"button","data-on":Ne==="local"?"1":"0",disabled:!ve,title:"用平台自带的超管账号登录",onClick:()=>Fe("local")},"本地超管")),Qt=Ne==="ldap"?t("div",{className:"ds-login-hint"},"用公司账号登录(LDAP)。登录后会记下你的名字,写操作和审计都挂在这个名字下。"):t("div",{className:"ds-login-hint"},`用平台自带的超管账号登录。默认账号 ${ce},默认口令 admin(改过之后就用新口令)。`),ie=t("div",{className:"ds-login"},t("div",{className:"ds-login-brand"},"◈ ",Z?.board?.title??"工作空间"),jt,Qt,t("label",{className:"ds-field"},t("span",null,Ne==="local"?"超管账号":"域账号"),t("input",{value:at,autoFocus:Ne==="ldap",name:"studio-account",autoComplete:"off",spellCheck:!1,placeholder:Ne==="local"?ce:"域账号",onChange:ge=>nt(ge.target.value),onKeyDown:ge=>{ge.key==="Enter"&&yt()}})),t("label",{className:"ds-field"},t("span",null,"密码"),t("input",{type:"password",value:ct,autoFocus:Ne==="local",name:"studio-pass",autoComplete:"new-password",placeholder:Ne==="local"?"默认口令 admin":"域密码",onChange:ge=>qe(ge.target.value),onKeyDown:ge=>{ge.key==="Enter"&&yt()}})),Pe===""?null:t("div",{className:"ds-error"},Pe),Pe!==""&&/LDAP|域|目录|连不上/.test(Pe)?t("div",{className:"ds-login-note"},"连不上目录服务时,切到「本地超管」用平台账号进来;等网络打通再用域账号。"):null,t("div",{className:"ds-login-actions"},t("button",{className:"ds-btn ds-btn-primary",disabled:st,onClick:()=>void yt()},st?"登录中…":Ne==="local"?"登录(本地超管)":"登录(LDAP)"),typeof ne=="function"?t("button",{className:"ds-btn ds-btn-ghost",onClick:()=>ne()},"先不登录"):null),t("div",{className:"ds-login-note"},Ne==="ldap"?`${Z?.ldap?.url??"—"} · BASE:${Z?.ldap?.baseDN??"—"}`:"本地账号存在服务端密钥里(scrypt 哈希),改密码在「设置 → 统一登录(LDAP)」")),Ce=t("div",{className:"ds-login-wrap","data-overlay":le===!0?"1":"0"},ie);return le===!0?Ce:t("div",{"data-dsh-studio":"","data-theme":U},t("style",null,me),Ce)}function wa(Z){const U=Z?.loginGate??ds,{state:ee,error:be,reload:ne}=W(),[le,ce]=e.useState("dashboard"),[ve,Se]=e.useState("experts"),[Ne,Te]=e.useState(null),[at,nt]=e.useState(!1);async function ct(z){const de=await Px(z,{api:X,state:ee,confirm:C,prompt:E,notify:G});de.refresh===!0&&await ne(!0),de.open!==void 0&&Te(de.open)}const[qe,st]=e.useState(!1),[tt,Pe]=e.useState(0);e.useEffect(()=>{if(!qe)return;const z=()=>st(!1);return document.addEventListener("click",z),()=>document.removeEventListener("click",z)},[qe]);const[_t,Fe]=e.useState(we),[yt,jt]=e.useState(()=>K()??(D()?.matches?"dark":"light")),[Qt,ie]=e.useState(!1),[Ce,ge]=e.useState(!1),[Va,St]=e.useState(null),[da,Pn]=e.useState(0),[Ra,Dt]=e.useState(null);e.useEffect(()=>{const z=de=>{const Le=String(de.key).toLowerCase();if((de.metaKey||de.ctrlKey)&&!de.shiftKey&&!de.altKey&&Le==="k"){de.preventDefault(),St(null),ge(Ke=>!Ke);return}const We=yx(de);We!==null&&(de.preventDefault(),St(We),Pn(Ke=>Ke+1),ge(!0))};return document.addEventListener("keydown",z),()=>document.removeEventListener("keydown",z)},[]),e.useEffect(()=>{const z=()=>{const Ke=K()??(D()?.matches?"dark":"light");jt(He=>He===Ke?He:Ke)};z();const de=D(),Le=()=>z();de!==null&&de.addEventListener("change",Le);const We=window.setInterval(z,1500);return()=>{de!==null&&de.removeEventListener("change",Le),window.clearInterval(We)}},[]);const Ot=_t==="system"?yt:_t;if(e.useEffect(()=>{const z=document.documentElement;z.setAttribute("data-dsh-theme",Ot),z.style.colorScheme=Ot;let de=document.getElementById("dsh-studio-global-theme");return de===null&&(de=document.createElement("style"),de.id="dsh-studio-global-theme",de.textContent=oe,document.head.appendChild(de)),()=>{z.removeAttribute("data-dsh-theme"),z.style.colorScheme=""}},[Ot]),e.useEffect(()=>bt(),[]),e.useEffect(()=>et(),[]),ee===null)return t("div",{"data-dsh-studio":"","data-theme":Ot},t("style",null,me),t("div",{className:"ds-loading"},be===null?"正在载入工作空间…":`载入失败:${be}`));if(ee.locked===!0)return t(U,{config:ee.config,theme:Ot,message:"",onDone:()=>void ne()});const Y=Ne===null?null:ee.tasks.find(z=>z.id===Ne)??null;return ee.tasks.reduce((z,de)=>(z[de.status]=(z[de.status]??0)+1,z),{}),t("div",{"data-dsh-studio":"","data-theme":Ot},t("style",null,me),t(_,null),t(B,null),t("div",{className:"ds-head"},t("div",{className:"ds-head-top"},t("div",{className:"ds-brand"},t("span",{className:"ds-brand-mark"},"◈"),t("div",null,t("div",{className:"ds-title"},ee.config.board.title),t("div",{className:"ds-sub"},`${ee.tasks.length} 个任务 · rev ${ee.revision} · 更新于 ${Qe(ee.updatedAt)}`))),t("div",{className:"ds-head-actions"},te()===null?t(u,{className:"ds-chip","data-on":"1",title:"没配 LDAP 时平台默认以超管身份使用,不需要登录;写操作与审计都记在它名下"},`👤 超管 ${ee.config.localAuth?.username??"admin"}`):t(u,{className:"ds-chip",title:`已登录:${te()?.id??""}`},`👤 ${te()?.name??te()?.id}`),te()===null?t("button",{className:"ds-btn ds-btn-ghost",title:"用域账号或本地超管账号登录",onClick:()=>ie(!0)},"登录"):i("退出当前账号(退出后回到超管身份)",t("button",{className:"ds-btn ds-btn-ghost",onClick:async()=>{try{await X("/auth/logout",{})}catch{}F(""),xe(null),ie(!1),ne()}},"退出登录")),(()=>{const z=o("SegGroup"),de=R.map(([Le,We])=>({id:Le,label:We}));return z!==null?t(z,{value:_t,onChange:Le=>Fe(fe(Le)),options:de}):t("div",{className:"ds-seg",title:"显示模式;「跟随系统」会先跟宿主界面的深浅色,宿主没给出信号时再跟操作系统"},R.map(([Le,We])=>t("button",{key:Le,className:"ds-seg-btn","data-on":_t===Le?"1":"0",onClick:()=>Fe(fe(Le))},We)))})(),t("button",{className:"ds-btn",onClick:()=>void ne()},"刷新"),t("a",{className:"ds-btn ds-btn-ghost",style:{textDecoration:"none"},href:"/studio-api/export/tasks.csv",title:"把看板上的卡导出成 CSV(Excel 可直接打开)"},"导出卡"),t("a",{className:"ds-btn ds-btn-ghost",style:{textDecoration:"none"},href:"/studio-api/export/requirements.csv",title:"把需求与准出情况导出成 CSV"},"导出需求"),(ee.integrations?.broken??0)>0?t("button",{className:"ds-btn ds-btn-ghost",style:{color:"#e5484d",borderColor:"color-mix(in srgb, #e5484d 40%, var(--ds-line))"},title:(ee.integrations.channels??[]).filter(z=>z.state==="error").map(z=>`${z.label}:${z.lastError}`).join(`
|
|
831
|
+
`),onClick:()=>{ce("settings"),Se("health")}},`⚠ 集成异常 ${ee.integrations.broken}`):null,t("div",{className:"ds-newmenu",style:{position:"relative"}},t("button",{className:"ds-btn ds-btn-primary","aria-haspopup":"menu","aria-expanded":qe?"true":"false",onClick:z=>{z.stopPropagation(),st(de=>!de)}},"+ 新建"),qe?t("div",{role:"menu",className:"ds-menu",style:{position:"absolute",right:0,top:"calc(100% + 6px)",zIndex:80,minWidth:232,padding:6,background:"var(--ds-surface)",border:"1px solid var(--ds-line)",borderRadius:10,boxShadow:"0 12px 32px rgba(0,0,0,.22)"},onClick:z=>z.stopPropagation()},t("button",{role:"menuitem",className:"ds-btn ds-btn-ghost",style:{display:"block",width:"100%",textAlign:"left",height:"auto",padding:"9px 10px"},title:"先建需求,再按功能点拆卡",onClick:()=>{st(!1),ce("requirements"),Pe(z=>z+1)}},t("div",{style:{fontWeight:600}},"新建需求"),t("div",{className:"ds-hint",style:{marginTop:2}},"需求 → 功能点 → 拆成卡")),t("button",{role:"menuitem",className:"ds-btn ds-btn-ghost",style:{display:"block",width:"100%",textAlign:"left",height:"auto",padding:"9px 10px",marginTop:2},title:"直接在看板上建一张卡",onClick:()=>{st(!1),ce("board"),nt(!0)}},t("div",{style:{fontWeight:600}},"新建任务"),t("div",{className:"ds-hint",style:{marginTop:2}},"直接在看板上建一张卡"))):null))),t("div",{className:"ds-head-tabs"},(()=>{const z=o("TabsBar"),de=o("Tabs"),Le=o("TabsList"),We=o("TabsTrigger"),Ke=[{id:"dashboard",label:"工作台",hint:"今天该看什么:在办、逾期、阻塞、缺陷超时、准出被拦"},{id:"board",label:"看板",hint:"按列推进卡片;点开卡片能看计划、交付物、测试、讨论"},{id:"requirements",label:"需求",hint:"需求、功能点、可追溯矩阵与需求级准出"},{id:"cases",label:"用例",hint:"跨卡用例总览:谁在跑、最近结果、挂在哪条需求"},{id:"releases",label:"版本",hint:"版本清单、发布门禁、灰度与部署记录"},{id:"projects",label:"项目",hint:"业务项目、迭代与每个服务对应的代码目录"},{id:"analytics",label:"效能",hint:"周期分布、每列停留、团队负载、返工与 AI 成本"},{id:"settings",label:"设置",hint:"列、模型、自动派单、集成、权限、备份"}];return de!==null&&Le!==null&&We!==null?t(de,{value:le,onValueChange:He=>ce(He)},t(Le,{className:""},Ke.map(He=>t(We,{key:He.id,value:He.id,title:He.hint,className:""},He.label)))):z!==null?t(z,{items:Ke,value:le,onChange:He=>ce(He)}):t("div",{className:"ds-tabs"},Ke.map(He=>t("button",{key:He.id,className:"ds-tab","data-on":le===He.id?"1":"0",onClick:()=>ce(He.id)},He.label)))})(),t("div",{className:"ds-grow"}),t("span",{className:"ds-stat"},le==="dashboard"?"今天该看什么:风险 · 流程 · 待办":le==="board"?`${(ee.config.experts??[]).filter(z=>z.enabled!==!1).length} 位专家 · ${(ee.config.teams??[]).length} 个专家团`:le==="requirements"?`${(ee.requirements??[]).length} 条需求 · ${ee.tasks.filter(z=>(z.requirementId??"")==="").length} 张卡未挂需求`:le==="releases"?`${(ee.releases??[]).length} 个版本 · ${ee.tasks.filter(z=>(z.releaseId??"")!=="").length} 张卡已挂版本`:le==="projects"?`${(ee.config.projects??[]).length} 个项目`:le==="cases"?`${(ee.tasks??[]).reduce((z,de)=>z+(de.caseSummary?.total??0),0)} 条用例 · 点一行跳回卡片`:le==="analytics"?"过程指标:通过率 · 返工 · 周期":le==="settings"?"改动即时生效,技能与专家保存在 ~/.dsh":"内部插件市场"))),be!==null?t("div",{className:"ds-err",style:{padding:"6px 18px"}},be):null,le==="board"?t(k,{state:ee,onWip:async(z,de)=>{const Le=await E("这一列的 WIP 上限(0 = 不限,最多 50)",{title:"WIP 上限",defaultValue:String(de)});if(Le===null)return;const We=Math.min(50,Math.max(0,Math.trunc(Number(String(Le).trim())||0)));try{await X("/columns/wip",{status:z,wip:We}),G(We===0?"已取消 WIP 上限":`WIP 上限设为 ${We}`),await ne()}catch(Ke){G(Ke instanceof Error?Ke.message:String(Ke),"error")}},onMove:async(z,de)=>{await X("/task/update",{id:z,status:de}),await ne()},onOpen:Te}):le==="dashboard"?t(Qx,{state:ee,onOpenTask:Te,onOpenBoard:()=>ce("board"),onOpenCases:()=>ce("cases")}):le==="requirements"?t(aw,{state:ee,onOpenTask:Te,onChanged:ne,createSignal:tt,focusReq:Ra}):le==="cases"?t(Xx,{state:ee,onOpenTask:Te}):le==="releases"?t(nw,{state:ee,onOpenTask:Te}):le==="projects"?t(he,{state:ee,onOpenBoard:()=>ce("board")}):le==="analytics"?t(sw,{state:ee,onOpenTask:Te}):le==="market"?t("div",{className:"ds-body"},t(qa,{state:ee,onChanged:ne})):t("div",{className:"ds-body"},t(Tn,{state:ee,onChanged:ne,initialSection:ve,onSection:Se})),Ce?t(Ue,{state:ee,initialAction:Va,initialSeq:da,onClose:()=>{ge(!1),St(null)},onPick:z=>{if(z.kind==="run"){ct(z);return}if(z.kind==="task"){Te(z.id);return}if(z.kind==="requirement"){ce("requirements"),Dt({id:z.id,at:Date.now()});return}if(z.kind==="release"){ce("releases");return}if(z.kind==="expert"){ce("settings"),Se("experts");return}if(z.kind==="team"){ce("settings"),Se("teams");return}if(z.kind==="project"){ce("projects");return}if(z.kind==="skill"){ce("settings"),Se("skills");return}if(z.kind==="action"){if(z.id==="new-requirement"){ce("requirements"),Pe(de=>de+1);return}if(z.id==="new-task"){ce("board"),nt(!0);return}if(z.id.startsWith("tab:")){ce(z.id.slice(4));return}if(z.id==="export:tasks"){window.open("/studio-api/export/tasks.csv","_blank");return}if(z.id==="export:requirements"){window.open("/studio-api/export/requirements.csv","_blank");return}if(z.id.startsWith("theme:")){Fe(fe(z.id.slice(6)));return}if(z.id==="refresh"){ne();return}z.id.startsWith("settings:")&&(ce("settings"),Se(z.id.slice(9)))}}}):null,Y!==null?t(Ie,{task:Y,state:ee,onClose:()=>Te(null),onChanged:ne}):null,at?t(V,{state:ee,onClose:()=>nt(!1),onCreated:ne}):null,Qt&&ee.locked!==!0?t(U,{config:ee.config,theme:Ot,message:"",overlay:!0,onDone:()=>{ie(!1),ne()},onClose:()=>ie(!1)}):null)}function Is(Z){const U=typeof Z.size=="number"?Z.size:16;return t("svg",{width:U,height:U,viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:1.3,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0},t("rect",{x:1.5,y:2.5,width:4,height:11,rx:1}),t("rect",{x:6,y:2.5,width:4,height:7,rx:1}),t("rect",{x:10.5,y:2.5,width:4,height:9,rx:1}))}return{inject:["slots"],apply(Z){const U=[];U.push(Z.slots.inject("main",()=>Z.slots.register({name:"main",key:a},wa))),U.push(Z.slots.inject("sidebar.panellist",()=>Z.slots.register({name:"sidebar.panellist",id:a,order:12,label:()=>"需求&任务工作空间"},Is)));const ee=()=>{for(const be of U.splice(0).reverse())be()};return typeof Z.effect=="function"&&Z.effect(()=>ee),ee},StudioPage:wa,StudioIcon:Is,useUIKit:s}}var of={exports:{}},ua={},lf={exports:{}},df={};/**
|
|
832
832
|
* @license React
|
|
833
833
|
* scheduler.production.min.js
|
|
834
834
|
*
|
|
@@ -836,7 +836,7 @@ html[data-dsh-theme="light"] [class*="rightbarCol"] { background: #fafafa !impor
|
|
|
836
836
|
*
|
|
837
837
|
* This source code is licensed under the MIT license found in the
|
|
838
838
|
* LICENSE file in the root directory of this source tree.
|
|
839
|
-
*/(function(e){function t(
|
|
839
|
+
*/(function(e){function t(L,w){var T=L.length;L.push(w);e:for(;0<T;){var Q=T-1>>>1,R=L[Q];if(0<r(R,w))L[Q]=w,L[T]=R,T=Q;else break e}}function a(L){return L.length===0?null:L[0]}function n(L){if(L.length===0)return null;var w=L[0],T=L.pop();if(T!==w){L[0]=T;e:for(var Q=0,R=L.length,D=R>>>1;Q<D;){var K=2*(Q+1)-1,we=L[K],fe=K+1,ye=L[fe];if(0>r(we,T))fe<R&&0>r(ye,we)?(L[Q]=ye,L[fe]=T,Q=fe):(L[Q]=we,L[K]=T,Q=K);else if(fe<R&&0>r(ye,T))L[Q]=ye,L[fe]=T,Q=fe;else break e}}return w}function r(L,w){var T=L.sortIndex-w.sortIndex;return T!==0?T:L.id-w.id}if(typeof performance=="object"&&typeof performance.now=="function"){var s=performance;e.unstable_now=function(){return s.now()}}else{var o=Date,i=o.now();e.unstable_now=function(){return o.now()-i}}var l=[],c=[],u=1,p=null,f=3,v=!1,x=!1,b=!1,k=typeof setTimeout=="function"?setTimeout:null,g=typeof clearTimeout=="function"?clearTimeout:null,d=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function h(L){for(var w=a(c);w!==null;){if(w.callback===null)n(c);else if(w.startTime<=L)n(c),w.sortIndex=w.expirationTime,t(l,w);else break;w=a(c)}}function y(L){if(b=!1,h(L),!x)if(a(l)!==null)x=!0,q(S);else{var w=a(c);w!==null&&B(y,w.startTime-L)}}function S(L,w){x=!1,b&&(b=!1,g(_),_=-1),v=!0;var T=f;try{for(h(w),p=a(l);p!==null&&(!(p.expirationTime>w)||L&&!H());){var Q=p.callback;if(typeof Q=="function"){p.callback=null,f=p.priorityLevel;var R=Q(p.expirationTime<=w);w=e.unstable_now(),typeof R=="function"?p.callback=R:p===a(l)&&n(l),h(w)}else n(l);p=a(l)}if(p!==null)var D=!0;else{var K=a(c);K!==null&&B(y,K.startTime-w),D=!1}return D}finally{p=null,f=T,v=!1}}var C=!1,E=null,_=-1,I=5,j=-1;function H(){return!(e.unstable_now()-j<I)}function M(){if(E!==null){var L=e.unstable_now();j=L;var w=!0;try{w=E(!0,L)}finally{w?P():(C=!1,E=null)}}else C=!1}var P;if(typeof d=="function")P=function(){d(M)};else if(typeof MessageChannel<"u"){var G=new MessageChannel,J=G.port2;G.port1.onmessage=M,P=function(){J.postMessage(null)}}else P=function(){k(M,0)};function q(L){E=L,C||(C=!0,P())}function B(L,w){_=k(function(){L(e.unstable_now())},w)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(L){L.callback=null},e.unstable_continueExecution=function(){x||v||(x=!0,q(S))},e.unstable_forceFrameRate=function(L){0>L||125<L?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):I=0<L?Math.floor(1e3/L):5},e.unstable_getCurrentPriorityLevel=function(){return f},e.unstable_getFirstCallbackNode=function(){return a(l)},e.unstable_next=function(L){switch(f){case 1:case 2:case 3:var w=3;break;default:w=f}var T=f;f=w;try{return L()}finally{f=T}},e.unstable_pauseExecution=function(){},e.unstable_requestPaint=function(){},e.unstable_runWithPriority=function(L,w){switch(L){case 1:case 2:case 3:case 4:case 5:break;default:L=3}var T=f;f=L;try{return w()}finally{f=T}},e.unstable_scheduleCallback=function(L,w,T){var Q=e.unstable_now();switch(typeof T=="object"&&T!==null?(T=T.delay,T=typeof T=="number"&&0<T?Q+T:Q):T=Q,L){case 1:var R=-1;break;case 2:R=250;break;case 5:R=1073741823;break;case 4:R=1e4;break;default:R=5e3}return R=T+R,L={id:u++,callback:w,priorityLevel:L,startTime:T,expirationTime:R,sortIndex:-1},T>Q?(L.sortIndex=T,t(c,L),a(l)===null&&L===a(c)&&(b?(g(_),_=-1):b=!0,B(y,T-Q))):(L.sortIndex=R,t(l,L),x||v||(x=!0,q(S))),L},e.unstable_shouldYield=H,e.unstable_wrapCallback=function(L){var w=f;return function(){var T=f;f=w;try{return L.apply(this,arguments)}finally{f=T}}}})(df),lf.exports=df;var ow=lf.exports;/**
|
|
840
840
|
* @license React
|
|
841
841
|
* react-dom.production.min.js
|
|
842
842
|
*
|
|
@@ -844,15 +844,15 @@ html[data-dsh-theme="light"] [class*="rightbarCol"] { background: #fafafa !impor
|
|
|
844
844
|
*
|
|
845
845
|
* This source code is licensed under the MIT license found in the
|
|
846
846
|
* LICENSE file in the root directory of this source tree.
|
|
847
|
-
*/var
|
|
847
|
+
*/var iw=N,pa=ow;function re(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,a=1;a<arguments.length;a++)t+="&args[]="+encodeURIComponent(arguments[a]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var cf=new Set,Rr={};function us(e,t){Ds(e,t),Ds(e+"Capture",t)}function Ds(e,t){for(Rr[e]=t,e=0;e<t.length;e++)cf.add(t[e])}var rn=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),td=Object.prototype.hasOwnProperty,lw=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,uf={},pf={};function dw(e){return td.call(pf,e)?!0:td.call(uf,e)?!1:lw.test(e)?pf[e]=!0:(uf[e]=!0,!1)}function cw(e,t,a,n){if(a!==null&&a.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return n?!1:a!==null?!a.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function uw(e,t,a,n){if(t===null||typeof t>"u"||cw(e,t,a,n))return!0;if(n)return!1;if(a!==null)switch(a.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function Zt(e,t,a,n,r,s,o){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=n,this.attributeNamespace=r,this.mustUseProperty=a,this.propertyName=e,this.type=t,this.sanitizeURL=s,this.removeEmptyString=o}var Bt={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Bt[e]=new Zt(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Bt[t]=new Zt(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){Bt[e]=new Zt(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Bt[e]=new Zt(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Bt[e]=new Zt(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){Bt[e]=new Zt(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){Bt[e]=new Zt(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){Bt[e]=new Zt(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){Bt[e]=new Zt(e,5,!1,e.toLowerCase(),null,!1,!1)});var ad=/[\-:]([a-z])/g;function nd(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(ad,nd);Bt[t]=new Zt(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(ad,nd);Bt[t]=new Zt(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(ad,nd);Bt[t]=new Zt(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){Bt[e]=new Zt(e,1,!1,e.toLowerCase(),null,!1,!1)}),Bt.xlinkHref=new Zt("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){Bt[e]=new Zt(e,1,!1,e.toLowerCase(),null,!0,!0)});function sd(e,t,a,n){var r=Bt.hasOwnProperty(t)?Bt[t]:null;(r!==null?r.type!==0:n||!(2<t.length)||t[0]!=="o"&&t[0]!=="O"||t[1]!=="n"&&t[1]!=="N")&&(uw(t,a,r,n)&&(a=null),n||r===null?dw(t)&&(a===null?e.removeAttribute(t):e.setAttribute(t,""+a)):r.mustUseProperty?e[r.propertyName]=a===null?r.type===3?!1:"":a:(t=r.attributeName,n=r.attributeNamespace,a===null?e.removeAttribute(t):(r=r.type,a=r===3||r===4&&a===!0?"":""+a,n?e.setAttributeNS(n,t,a):e.setAttribute(t,a))))}var on=iw.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,Vo=Symbol.for("react.element"),Os=Symbol.for("react.portal"),Ls=Symbol.for("react.fragment"),rd=Symbol.for("react.strict_mode"),od=Symbol.for("react.profiler"),ff=Symbol.for("react.provider"),mf=Symbol.for("react.context"),id=Symbol.for("react.forward_ref"),ld=Symbol.for("react.suspense"),dd=Symbol.for("react.suspense_list"),cd=Symbol.for("react.memo"),jn=Symbol.for("react.lazy"),gf=Symbol.for("react.offscreen"),hf=Symbol.iterator;function Ar(e){return e===null||typeof e!="object"?null:(e=hf&&e[hf]||e["@@iterator"],typeof e=="function"?e:null)}var ft=Object.assign,ud;function jr(e){if(ud===void 0)try{throw Error()}catch(a){var t=a.stack.trim().match(/\n( *(at )?)/);ud=t&&t[1]||""}return`
|
|
848
848
|
`+ud+e}var pd=!1;function fd(e,t){if(!e||pd)return"";pd=!0;var a=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(t,[])}catch(c){var n=c}Reflect.construct(e,[],t)}else{try{t.call()}catch(c){n=c}e.call(t.prototype)}else{try{throw Error()}catch(c){n=c}e()}}catch(c){if(c&&n&&typeof c.stack=="string"){for(var r=c.stack.split(`
|
|
849
849
|
`),s=n.stack.split(`
|
|
850
850
|
`),o=r.length-1,i=s.length-1;1<=o&&0<=i&&r[o]!==s[i];)i--;for(;1<=o&&0<=i;o--,i--)if(r[o]!==s[i]){if(o!==1||i!==1)do if(o--,i--,0>i||r[o]!==s[i]){var l=`
|
|
851
|
-
`+r[o].replace(" at new "," at ");return e.displayName&&l.includes("<anonymous>")&&(l=l.replace("<anonymous>",e.displayName)),l}while(1<=o&&0<=i);break}}}finally{pd=!1,Error.prepareStackTrace=a}return(e=e?e.displayName||e.name:"")?jr(e):""}function uw(e){switch(e.tag){case 5:return jr(e.type);case 16:return jr("Lazy");case 13:return jr("Suspense");case 19:return jr("SuspenseList");case 0:case 2:case 15:return e=fd(e.type,!1),e;case 11:return e=fd(e.type.render,!1),e;case 1:return e=fd(e.type,!0),e;default:return""}}function md(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Ls:return"Fragment";case Os:return"Portal";case od:return"Profiler";case rd:return"StrictMode";case ld:return"Suspense";case dd:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case mf:return(e.displayName||"Context")+".Consumer";case ff:return(e._context.displayName||"Context")+".Provider";case id:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case cd:return t=e.displayName||null,t!==null?t:md(e.type)||"Memo";case An:t=e._payload,e=e._init;try{return md(e(t))}catch{}}return null}function pw(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return md(t);case 8:return t===rd?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function jn(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function vf(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function fw(e){var t=vf(e)?"checked":"value",a=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),n=""+e[t];if(!e.hasOwnProperty(t)&&typeof a<"u"&&typeof a.get=="function"&&typeof a.set=="function"){var r=a.get,s=a.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return r.call(this)},set:function(o){n=""+o,s.call(this,o)}}),Object.defineProperty(e,t,{enumerable:a.enumerable}),{getValue:function(){return n},setValue:function(o){n=""+o},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Wo(e){e._valueTracker||(e._valueTracker=fw(e))}function bf(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var a=t.getValue(),n="";return e&&(n=vf(e)?e.checked?"true":"false":e.value),e=n,e!==a?(t.setValue(e),!0):!1}function Ho(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function gd(e,t){var a=t.checked;return ft({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:a??e._wrapperState.initialChecked})}function yf(e,t){var a=t.defaultValue==null?"":t.defaultValue,n=t.checked!=null?t.checked:t.defaultChecked;a=jn(t.value!=null?t.value:a),e._wrapperState={initialChecked:n,initialValue:a,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function xf(e,t){t=t.checked,t!=null&&sd(e,"checked",t,!1)}function hd(e,t){xf(e,t);var a=jn(t.value),n=t.type;if(a!=null)n==="number"?(a===0&&e.value===""||e.value!=a)&&(e.value=""+a):e.value!==""+a&&(e.value=""+a);else if(n==="submit"||n==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?vd(e,t.type,a):t.hasOwnProperty("defaultValue")&&vd(e,t.type,jn(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function wf(e,t,a){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var n=t.type;if(!(n!=="submit"&&n!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,a||t===e.value||(e.value=t),e.defaultValue=t}a=e.name,a!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,a!==""&&(e.name=a)}function vd(e,t,a){(t!=="number"||Ho(e.ownerDocument)!==e)&&(a==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+a&&(e.defaultValue=""+a))}var Dr=Array.isArray;function Ms(e,t,a,n){if(e=e.options,t){t={};for(var r=0;r<a.length;r++)t["$"+a[r]]=!0;for(a=0;a<e.length;a++)r=t.hasOwnProperty("$"+e[a].value),e[a].selected!==r&&(e[a].selected=r),r&&n&&(e[a].defaultSelected=!0)}else{for(a=""+jn(a),t=null,r=0;r<e.length;r++){if(e[r].value===a){e[r].selected=!0,n&&(e[r].defaultSelected=!0);return}t!==null||e[r].disabled||(t=e[r])}t!==null&&(t.selected=!0)}}function bd(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(se(91));return ft({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function kf(e,t){var a=t.value;if(a==null){if(a=t.children,t=t.defaultValue,a!=null){if(t!=null)throw Error(se(92));if(Dr(a)){if(1<a.length)throw Error(se(93));a=a[0]}t=a}t==null&&(t=""),a=t}e._wrapperState={initialValue:jn(a)}}function Nf(e,t){var a=jn(t.value),n=jn(t.defaultValue);a!=null&&(a=""+a,a!==e.value&&(e.value=a),t.defaultValue==null&&e.defaultValue!==a&&(e.defaultValue=a)),n!=null&&(e.defaultValue=""+n)}function Sf(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!==""&&t!==null&&(e.value=t)}function Cf(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function yd(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?Cf(t):e==="http://www.w3.org/2000/svg"&&t==="foreignObject"?"http://www.w3.org/1999/xhtml":e}var Go,Ef=function(e){return typeof MSApp<"u"&&MSApp.execUnsafeLocalFunction?function(t,a,n,r){MSApp.execUnsafeLocalFunction(function(){return e(t,a,n,r)})}:e}(function(e,t){if(e.namespaceURI!=="http://www.w3.org/2000/svg"||"innerHTML"in e)e.innerHTML=t;else{for(Go=Go||document.createElement("div"),Go.innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=Go.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Or(e,t){if(t){var a=e.firstChild;if(a&&a===e.lastChild&&a.nodeType===3){a.nodeValue=t;return}}e.textContent=t}var Lr={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},mw=["Webkit","ms","Moz","O"];Object.keys(Lr).forEach(function(e){mw.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Lr[t]=Lr[e]})});function $f(e,t,a){return t==null||typeof t=="boolean"||t===""?"":a||typeof t!="number"||t===0||Lr.hasOwnProperty(e)&&Lr[e]?(""+t).trim():t+"px"}function Tf(e,t){e=e.style;for(var a in t)if(t.hasOwnProperty(a)){var n=a.indexOf("--")===0,r=$f(a,t[a],n);a==="float"&&(a="cssFloat"),n?e.setProperty(a,r):e[a]=r}}var gw=ft({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function xd(e,t){if(t){if(gw[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(se(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(se(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(se(61))}if(t.style!=null&&typeof t.style!="object")throw Error(se(62))}}function wd(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var kd=null;function Nd(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Sd=null,zs=null,Fs=null;function Pf(e){if(e=ro(e)){if(typeof Sd!="function")throw Error(se(280));var t=e.stateNode;t&&(t=hi(t),Sd(e.stateNode,e.type,t))}}function _f(e){zs?Fs?Fs.push(e):Fs=[e]:zs=e}function If(){if(zs){var e=zs,t=Fs;if(Fs=zs=null,Pf(e),t)for(e=0;e<t.length;e++)Pf(t[e])}}function Rf(e,t){return e(t)}function Af(){}var Cd=!1;function jf(e,t,a){if(Cd)return e(t,a);Cd=!0;try{return Rf(e,t,a)}finally{Cd=!1,(zs!==null||Fs!==null)&&(Af(),If())}}function Mr(e,t){var a=e.stateNode;if(a===null)return null;var n=hi(a);if(n===null)return null;a=n[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(n=!n.disabled)||(e=e.type,n=!(e==="button"||e==="input"||e==="select"||e==="textarea")),e=!n;break e;default:e=!1}if(e)return null;if(a&&typeof a!="function")throw Error(se(231,t,typeof a));return a}var Ed=!1;if(rn)try{var zr={};Object.defineProperty(zr,"passive",{get:function(){Ed=!0}}),window.addEventListener("test",zr,zr),window.removeEventListener("test",zr,zr)}catch{Ed=!1}function hw(e,t,a,n,r,s,o,i,l){var c=Array.prototype.slice.call(arguments,3);try{t.apply(a,c)}catch(u){this.onError(u)}}var Fr=!1,Ko=null,Yo=!1,$d=null,vw={onError:function(e){Fr=!0,Ko=e}};function bw(e,t,a,n,r,s,o,i,l){Fr=!1,Ko=null,hw.apply(vw,arguments)}function yw(e,t,a,n,r,s,o,i,l){if(bw.apply(this,arguments),Fr){if(Fr){var c=Ko;Fr=!1,Ko=null}else throw Error(se(198));Yo||(Yo=!0,$d=c)}}function ps(e){var t=e,a=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,t.flags&4098&&(a=t.return),e=t.return;while(e)}return t.tag===3?a:null}function Df(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function Of(e){if(ps(e)!==e)throw Error(se(188))}function xw(e){var t=e.alternate;if(!t){if(t=ps(e),t===null)throw Error(se(188));return t!==e?null:e}for(var a=e,n=t;;){var r=a.return;if(r===null)break;var s=r.alternate;if(s===null){if(n=r.return,n!==null){a=n;continue}break}if(r.child===s.child){for(s=r.child;s;){if(s===a)return Of(r),e;if(s===n)return Of(r),t;s=s.sibling}throw Error(se(188))}if(a.return!==n.return)a=r,n=s;else{for(var o=!1,i=r.child;i;){if(i===a){o=!0,a=r,n=s;break}if(i===n){o=!0,n=r,a=s;break}i=i.sibling}if(!o){for(i=s.child;i;){if(i===a){o=!0,a=s,n=r;break}if(i===n){o=!0,n=s,a=r;break}i=i.sibling}if(!o)throw Error(se(189))}}if(a.alternate!==n)throw Error(se(190))}if(a.tag!==3)throw Error(se(188));return a.stateNode.current===a?e:t}function Lf(e){return e=xw(e),e!==null?Mf(e):null}function Mf(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;){var t=Mf(e);if(t!==null)return t;e=e.sibling}return null}var zf=pa.unstable_scheduleCallback,Ff=pa.unstable_cancelCallback,ww=pa.unstable_shouldYield,kw=pa.unstable_requestPaint,wt=pa.unstable_now,Nw=pa.unstable_getCurrentPriorityLevel,Td=pa.unstable_ImmediatePriority,Bf=pa.unstable_UserBlockingPriority,Qo=pa.unstable_NormalPriority,Sw=pa.unstable_LowPriority,Uf=pa.unstable_IdlePriority,Xo=null,Ha=null;function Cw(e){if(Ha&&typeof Ha.onCommitFiberRoot=="function")try{Ha.onCommitFiberRoot(Xo,e,void 0,(e.current.flags&128)===128)}catch{}}var ja=Math.clz32?Math.clz32:Tw,Ew=Math.log,$w=Math.LN2;function Tw(e){return e>>>=0,e===0?32:31-(Ew(e)/$w|0)|0}var Zo=64,Jo=4194304;function Br(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function ei(e,t){var a=e.pendingLanes;if(a===0)return 0;var n=0,r=e.suspendedLanes,s=e.pingedLanes,o=a&268435455;if(o!==0){var i=o&~r;i!==0?n=Br(i):(s&=o,s!==0&&(n=Br(s)))}else o=a&~r,o!==0?n=Br(o):s!==0&&(n=Br(s));if(n===0)return 0;if(t!==0&&t!==n&&!(t&r)&&(r=n&-n,s=t&-t,r>=s||r===16&&(s&4194240)!==0))return t;if(n&4&&(n|=a&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=n;0<t;)a=31-ja(t),r=1<<a,n|=e[a],t&=~r;return n}function Pw(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function _w(e,t){for(var a=e.suspendedLanes,n=e.pingedLanes,r=e.expirationTimes,s=e.pendingLanes;0<s;){var o=31-ja(s),i=1<<o,l=r[o];l===-1?(!(i&a)||i&n)&&(r[o]=Pw(i,t)):l<=t&&(e.expiredLanes|=i),s&=~i}}function Pd(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?1073741824:0}function qf(){var e=Zo;return Zo<<=1,!(Zo&4194240)&&(Zo=64),e}function _d(e){for(var t=[],a=0;31>a;a++)t.push(e);return t}function Ur(e,t,a){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-ja(t),e[t]=a}function Iw(e,t){var a=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var n=e.eventTimes;for(e=e.expirationTimes;0<a;){var r=31-ja(a),s=1<<r;t[r]=0,n[r]=-1,e[r]=-1,a&=~s}}function Id(e,t){var a=e.entangledLanes|=t;for(e=e.entanglements;a;){var n=31-ja(a),r=1<<n;r&t|e[n]&t&&(e[n]|=t),a&=~r}}var Qe=0;function Vf(e){return e&=-e,1<e?4<e?e&268435455?16:536870912:4:1}var Wf,Rd,Hf,Gf,Kf,Ad=!1,ti=[],Dn=null,On=null,Ln=null,qr=new Map,Vr=new Map,Mn=[],Rw="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function Yf(e,t){switch(e){case"focusin":case"focusout":Dn=null;break;case"dragenter":case"dragleave":On=null;break;case"mouseover":case"mouseout":Ln=null;break;case"pointerover":case"pointerout":qr.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Vr.delete(t.pointerId)}}function Wr(e,t,a,n,r,s){return e===null||e.nativeEvent!==s?(e={blockedOn:t,domEventName:a,eventSystemFlags:n,nativeEvent:s,targetContainers:[r]},t!==null&&(t=ro(t),t!==null&&Rd(t)),e):(e.eventSystemFlags|=n,t=e.targetContainers,r!==null&&t.indexOf(r)===-1&&t.push(r),e)}function Aw(e,t,a,n,r){switch(t){case"focusin":return Dn=Wr(Dn,e,t,a,n,r),!0;case"dragenter":return On=Wr(On,e,t,a,n,r),!0;case"mouseover":return Ln=Wr(Ln,e,t,a,n,r),!0;case"pointerover":var s=r.pointerId;return qr.set(s,Wr(qr.get(s)||null,e,t,a,n,r)),!0;case"gotpointercapture":return s=r.pointerId,Vr.set(s,Wr(Vr.get(s)||null,e,t,a,n,r)),!0}return!1}function Qf(e){var t=fs(e.target);if(t!==null){var a=ps(t);if(a!==null){if(t=a.tag,t===13){if(t=Df(a),t!==null){e.blockedOn=t,Kf(e.priority,function(){Hf(a)});return}}else if(t===3&&a.stateNode.current.memoizedState.isDehydrated){e.blockedOn=a.tag===3?a.stateNode.containerInfo:null;return}}}e.blockedOn=null}function ai(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var a=Dd(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(a===null){a=e.nativeEvent;var n=new a.constructor(a.type,a);kd=n,a.target.dispatchEvent(n),kd=null}else return t=ro(a),t!==null&&Rd(t),e.blockedOn=a,!1;t.shift()}return!0}function Xf(e,t,a){ai(e)&&a.delete(t)}function jw(){Ad=!1,Dn!==null&&ai(Dn)&&(Dn=null),On!==null&&ai(On)&&(On=null),Ln!==null&&ai(Ln)&&(Ln=null),qr.forEach(Xf),Vr.forEach(Xf)}function Hr(e,t){e.blockedOn===t&&(e.blockedOn=null,Ad||(Ad=!0,pa.unstable_scheduleCallback(pa.unstable_NormalPriority,jw)))}function Gr(e){function t(r){return Hr(r,e)}if(0<ti.length){Hr(ti[0],e);for(var a=1;a<ti.length;a++){var n=ti[a];n.blockedOn===e&&(n.blockedOn=null)}}for(Dn!==null&&Hr(Dn,e),On!==null&&Hr(On,e),Ln!==null&&Hr(Ln,e),qr.forEach(t),Vr.forEach(t),a=0;a<Mn.length;a++)n=Mn[a],n.blockedOn===e&&(n.blockedOn=null);for(;0<Mn.length&&(a=Mn[0],a.blockedOn===null);)Qf(a),a.blockedOn===null&&Mn.shift()}var Bs=on.ReactCurrentBatchConfig,ni=!0;function Dw(e,t,a,n){var r=Qe,s=Bs.transition;Bs.transition=null;try{Qe=1,jd(e,t,a,n)}finally{Qe=r,Bs.transition=s}}function Ow(e,t,a,n){var r=Qe,s=Bs.transition;Bs.transition=null;try{Qe=4,jd(e,t,a,n)}finally{Qe=r,Bs.transition=s}}function jd(e,t,a,n){if(ni){var r=Dd(e,t,a,n);if(r===null)Zd(e,t,n,si,a),Yf(e,n);else if(Aw(r,e,t,a,n))n.stopPropagation();else if(Yf(e,n),t&4&&-1<Rw.indexOf(e)){for(;r!==null;){var s=ro(r);if(s!==null&&Wf(s),s=Dd(e,t,a,n),s===null&&Zd(e,t,n,si,a),s===r)break;r=s}r!==null&&n.stopPropagation()}else Zd(e,t,n,null,a)}}var si=null;function Dd(e,t,a,n){if(si=null,e=Nd(n),e=fs(e),e!==null)if(t=ps(e),t===null)e=null;else if(a=t.tag,a===13){if(e=Df(t),e!==null)return e;e=null}else if(a===3){if(t.stateNode.current.memoizedState.isDehydrated)return t.tag===3?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return si=e,null}function Zf(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(Nw()){case Td:return 1;case Bf:return 4;case Qo:case Sw:return 16;case Uf:return 536870912;default:return 16}default:return 16}}var zn=null,Od=null,ri=null;function Jf(){if(ri)return ri;var e,t=Od,a=t.length,n,r="value"in zn?zn.value:zn.textContent,s=r.length;for(e=0;e<a&&t[e]===r[e];e++);var o=a-e;for(n=1;n<=o&&t[a-n]===r[s-n];n++);return ri=r.slice(e,1<n?1-n:void 0)}function oi(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&&t===13&&(e=13)):e=t,e===10&&(e=13),32<=e||e===13?e:0}function ii(){return!0}function em(){return!1}function fa(e){function t(a,n,r,s,o){this._reactName=a,this._targetInst=r,this.type=n,this.nativeEvent=s,this.target=o,this.currentTarget=null;for(var i in e)e.hasOwnProperty(i)&&(a=e[i],this[i]=a?a(s):s[i]);return this.isDefaultPrevented=(s.defaultPrevented!=null?s.defaultPrevented:s.returnValue===!1)?ii:em,this.isPropagationStopped=em,this}return ft(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():typeof a.returnValue!="unknown"&&(a.returnValue=!1),this.isDefaultPrevented=ii)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():typeof a.cancelBubble!="unknown"&&(a.cancelBubble=!0),this.isPropagationStopped=ii)},persist:function(){},isPersistent:ii}),t}var Us={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},Ld=fa(Us),Kr=ft({},Us,{view:0,detail:0}),Lw=fa(Kr),Md,zd,Yr,li=ft({},Kr,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Bd,button:0,buttons:0,relatedTarget:function(e){return e.relatedTarget===void 0?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==Yr&&(Yr&&e.type==="mousemove"?(Md=e.screenX-Yr.screenX,zd=e.screenY-Yr.screenY):zd=Md=0,Yr=e),Md)},movementY:function(e){return"movementY"in e?e.movementY:zd}}),tm=fa(li),Mw=ft({},li,{dataTransfer:0}),zw=fa(Mw),Fw=ft({},Kr,{relatedTarget:0}),Fd=fa(Fw),Bw=ft({},Us,{animationName:0,elapsedTime:0,pseudoElement:0}),Uw=fa(Bw),qw=ft({},Us,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),Vw=fa(qw),Ww=ft({},Us,{data:0}),am=fa(Ww),Hw={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},Gw={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",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",224:"Meta"},Kw={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Yw(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):(e=Kw[e])?!!t[e]:!1}function Bd(){return Yw}var Qw=ft({},Kr,{key:function(e){if(e.key){var t=Hw[e.key]||e.key;if(t!=="Unidentified")return t}return e.type==="keypress"?(e=oi(e),e===13?"Enter":String.fromCharCode(e)):e.type==="keydown"||e.type==="keyup"?Gw[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Bd,charCode:function(e){return e.type==="keypress"?oi(e):0},keyCode:function(e){return e.type==="keydown"||e.type==="keyup"?e.keyCode:0},which:function(e){return e.type==="keypress"?oi(e):e.type==="keydown"||e.type==="keyup"?e.keyCode:0}}),Xw=fa(Qw),Zw=ft({},li,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),nm=fa(Zw),Jw=ft({},Kr,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Bd}),e0=fa(Jw),t0=ft({},Us,{propertyName:0,elapsedTime:0,pseudoElement:0}),a0=fa(t0),n0=ft({},li,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),s0=fa(n0),r0=[9,13,27,32],Ud=rn&&"CompositionEvent"in window,Qr=null;rn&&"documentMode"in document&&(Qr=document.documentMode);var o0=rn&&"TextEvent"in window&&!Qr,sm=rn&&(!Ud||Qr&&8<Qr&&11>=Qr),rm=" ",om=!1;function im(e,t){switch(e){case"keyup":return r0.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function lm(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var qs=!1;function i0(e,t){switch(e){case"compositionend":return lm(t);case"keypress":return t.which!==32?null:(om=!0,rm);case"textInput":return e=t.data,e===rm&&om?null:e;default:return null}}function l0(e,t){if(qs)return e==="compositionend"||!Ud&&im(e,t)?(e=Jf(),ri=Od=zn=null,qs=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return sm&&t.locale!=="ko"?null:t.data;default:return null}}var d0={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function dm(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t==="input"?!!d0[e.type]:t==="textarea"}function cm(e,t,a,n){_f(n),t=fi(t,"onChange"),0<t.length&&(a=new Ld("onChange","change",null,a,n),e.push({event:a,listeners:t}))}var Xr=null,Zr=null;function c0(e){Tm(e,0)}function di(e){var t=Ks(e);if(bf(t))return e}function u0(e,t){if(e==="change")return t}var um=!1;if(rn){var qd;if(rn){var Vd="oninput"in document;if(!Vd){var pm=document.createElement("div");pm.setAttribute("oninput","return;"),Vd=typeof pm.oninput=="function"}qd=Vd}else qd=!1;um=qd&&(!document.documentMode||9<document.documentMode)}function fm(){Xr&&(Xr.detachEvent("onpropertychange",mm),Zr=Xr=null)}function mm(e){if(e.propertyName==="value"&&di(Zr)){var t=[];cm(t,Zr,e,Nd(e)),jf(c0,t)}}function p0(e,t,a){e==="focusin"?(fm(),Xr=t,Zr=a,Xr.attachEvent("onpropertychange",mm)):e==="focusout"&&fm()}function f0(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")return di(Zr)}function m0(e,t){if(e==="click")return di(t)}function g0(e,t){if(e==="input"||e==="change")return di(t)}function h0(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var Da=typeof Object.is=="function"?Object.is:h0;function Jr(e,t){if(Da(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;var a=Object.keys(e),n=Object.keys(t);if(a.length!==n.length)return!1;for(n=0;n<a.length;n++){var r=a[n];if(!td.call(t,r)||!Da(e[r],t[r]))return!1}return!0}function gm(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function hm(e,t){var a=gm(e);e=0;for(var n;a;){if(a.nodeType===3){if(n=e+a.textContent.length,e<=t&&n>=t)return{node:a,offset:t-e};e=n}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=gm(a)}}function vm(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?vm(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function bm(){for(var e=window,t=Ho();t instanceof e.HTMLIFrameElement;){try{var a=typeof t.contentWindow.location.href=="string"}catch{a=!1}if(a)e=t.contentWindow;else break;t=Ho(e.document)}return t}function Wd(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function v0(e){var t=bm(),a=e.focusedElem,n=e.selectionRange;if(t!==a&&a&&a.ownerDocument&&vm(a.ownerDocument.documentElement,a)){if(n!==null&&Wd(a)){if(t=n.start,e=n.end,e===void 0&&(e=t),"selectionStart"in a)a.selectionStart=t,a.selectionEnd=Math.min(e,a.value.length);else if(e=(t=a.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var r=a.textContent.length,s=Math.min(n.start,r);n=n.end===void 0?s:Math.min(n.end,r),!e.extend&&s>n&&(r=n,n=s,s=r),r=hm(a,s);var o=hm(a,n);r&&o&&(e.rangeCount!==1||e.anchorNode!==r.node||e.anchorOffset!==r.offset||e.focusNode!==o.node||e.focusOffset!==o.offset)&&(t=t.createRange(),t.setStart(r.node,r.offset),e.removeAllRanges(),s>n?(e.addRange(t),e.extend(o.node,o.offset)):(t.setEnd(o.node,o.offset),e.addRange(t)))}}for(t=[],e=a;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof a.focus=="function"&&a.focus(),a=0;a<t.length;a++)e=t[a],e.element.scrollLeft=e.left,e.element.scrollTop=e.top}}var b0=rn&&"documentMode"in document&&11>=document.documentMode,Vs=null,Hd=null,eo=null,Gd=!1;function ym(e,t,a){var n=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;Gd||Vs==null||Vs!==Ho(n)||(n=Vs,"selectionStart"in n&&Wd(n)?n={start:n.selectionStart,end:n.selectionEnd}:(n=(n.ownerDocument&&n.ownerDocument.defaultView||window).getSelection(),n={anchorNode:n.anchorNode,anchorOffset:n.anchorOffset,focusNode:n.focusNode,focusOffset:n.focusOffset}),eo&&Jr(eo,n)||(eo=n,n=fi(Hd,"onSelect"),0<n.length&&(t=new Ld("onSelect","select",null,t,a),e.push({event:t,listeners:n}),t.target=Vs)))}function ci(e,t){var a={};return a[e.toLowerCase()]=t.toLowerCase(),a["Webkit"+e]="webkit"+t,a["Moz"+e]="moz"+t,a}var Ws={animationend:ci("Animation","AnimationEnd"),animationiteration:ci("Animation","AnimationIteration"),animationstart:ci("Animation","AnimationStart"),transitionend:ci("Transition","TransitionEnd")},Kd={},xm={};rn&&(xm=document.createElement("div").style,"AnimationEvent"in window||(delete Ws.animationend.animation,delete Ws.animationiteration.animation,delete Ws.animationstart.animation),"TransitionEvent"in window||delete Ws.transitionend.transition);function ui(e){if(Kd[e])return Kd[e];if(!Ws[e])return e;var t=Ws[e],a;for(a in t)if(t.hasOwnProperty(a)&&a in xm)return Kd[e]=t[a];return e}var wm=ui("animationend"),km=ui("animationiteration"),Nm=ui("animationstart"),Sm=ui("transitionend"),Cm=new Map,Em="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Fn(e,t){Cm.set(e,t),us(t,[e])}for(var Yd=0;Yd<Em.length;Yd++){var Qd=Em[Yd],y0=Qd.toLowerCase(),x0=Qd[0].toUpperCase()+Qd.slice(1);Fn(y0,"on"+x0)}Fn(wm,"onAnimationEnd"),Fn(km,"onAnimationIteration"),Fn(Nm,"onAnimationStart"),Fn("dblclick","onDoubleClick"),Fn("focusin","onFocus"),Fn("focusout","onBlur"),Fn(Sm,"onTransitionEnd"),Ds("onMouseEnter",["mouseout","mouseover"]),Ds("onMouseLeave",["mouseout","mouseover"]),Ds("onPointerEnter",["pointerout","pointerover"]),Ds("onPointerLeave",["pointerout","pointerover"]),us("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),us("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),us("onBeforeInput",["compositionend","keypress","textInput","paste"]),us("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),us("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),us("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var to="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),w0=new Set("cancel close invalid load scroll toggle".split(" ").concat(to));function $m(e,t,a){var n=e.type||"unknown-event";e.currentTarget=a,yw(n,t,void 0,e),e.currentTarget=null}function Tm(e,t){t=(t&4)!==0;for(var a=0;a<e.length;a++){var n=e[a],r=n.event;n=n.listeners;e:{var s=void 0;if(t)for(var o=n.length-1;0<=o;o--){var i=n[o],l=i.instance,c=i.currentTarget;if(i=i.listener,l!==s&&r.isPropagationStopped())break e;$m(r,i,c),s=l}else for(o=0;o<n.length;o++){if(i=n[o],l=i.instance,c=i.currentTarget,i=i.listener,l!==s&&r.isPropagationStopped())break e;$m(r,i,c),s=l}}}if(Yo)throw e=$d,Yo=!1,$d=null,e}function it(e,t){var a=t[sc];a===void 0&&(a=t[sc]=new Set);var n=e+"__bubble";a.has(n)||(Pm(t,e,2,!1),a.add(n))}function Xd(e,t,a){var n=0;t&&(n|=4),Pm(a,e,n,t)}var pi="_reactListening"+Math.random().toString(36).slice(2);function ao(e){if(!e[pi]){e[pi]=!0,cf.forEach(function(a){a!=="selectionchange"&&(w0.has(a)||Xd(a,!1,e),Xd(a,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[pi]||(t[pi]=!0,Xd("selectionchange",!1,t))}}function Pm(e,t,a,n){switch(Zf(t)){case 1:var r=Dw;break;case 4:r=Ow;break;default:r=jd}a=r.bind(null,t,a,e),r=void 0,!Ed||t!=="touchstart"&&t!=="touchmove"&&t!=="wheel"||(r=!0),n?r!==void 0?e.addEventListener(t,a,{capture:!0,passive:r}):e.addEventListener(t,a,!0):r!==void 0?e.addEventListener(t,a,{passive:r}):e.addEventListener(t,a,!1)}function Zd(e,t,a,n,r){var s=n;if(!(t&1)&&!(t&2)&&n!==null)e:for(;;){if(n===null)return;var o=n.tag;if(o===3||o===4){var i=n.stateNode.containerInfo;if(i===r||i.nodeType===8&&i.parentNode===r)break;if(o===4)for(o=n.return;o!==null;){var l=o.tag;if((l===3||l===4)&&(l=o.stateNode.containerInfo,l===r||l.nodeType===8&&l.parentNode===r))return;o=o.return}for(;i!==null;){if(o=fs(i),o===null)return;if(l=o.tag,l===5||l===6){n=s=o;continue e}i=i.parentNode}}n=n.return}jf(function(){var c=s,u=Nd(a),p=[];e:{var f=Cm.get(e);if(f!==void 0){var v=Ld,x=e;switch(e){case"keypress":if(oi(a)===0)break e;case"keydown":case"keyup":v=Xw;break;case"focusin":x="focus",v=Fd;break;case"focusout":x="blur",v=Fd;break;case"beforeblur":case"afterblur":v=Fd;break;case"click":if(a.button===2)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":v=tm;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":v=zw;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":v=e0;break;case wm:case km:case Nm:v=Uw;break;case Sm:v=a0;break;case"scroll":v=Lw;break;case"wheel":v=s0;break;case"copy":case"cut":case"paste":v=Vw;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":v=nm}var b=(t&4)!==0,k=!b&&e==="scroll",g=b?f!==null?f+"Capture":null:f;b=[];for(var d=c,h;d!==null;){h=d;var y=h.stateNode;if(h.tag===5&&y!==null&&(h=y,g!==null&&(y=Mr(d,g),y!=null&&b.push(no(d,y,h)))),k)break;d=d.return}0<b.length&&(f=new v(f,x,null,a,u),p.push({event:f,listeners:b}))}}if(!(t&7)){e:{if(f=e==="mouseover"||e==="pointerover",v=e==="mouseout"||e==="pointerout",f&&a!==kd&&(x=a.relatedTarget||a.fromElement)&&(fs(x)||x[ln]))break e;if((v||f)&&(f=u.window===u?u:(f=u.ownerDocument)?f.defaultView||f.parentWindow:window,v?(x=a.relatedTarget||a.toElement,v=c,x=x?fs(x):null,x!==null&&(k=ps(x),x!==k||x.tag!==5&&x.tag!==6)&&(x=null)):(v=null,x=c),v!==x)){if(b=tm,y="onMouseLeave",g="onMouseEnter",d="mouse",(e==="pointerout"||e==="pointerover")&&(b=nm,y="onPointerLeave",g="onPointerEnter",d="pointer"),k=v==null?f:Ks(v),h=x==null?f:Ks(x),f=new b(y,d+"leave",v,a,u),f.target=k,f.relatedTarget=h,y=null,fs(u)===c&&(b=new b(g,d+"enter",x,a,u),b.target=h,b.relatedTarget=k,y=b),k=y,v&&x)t:{for(b=v,g=x,d=0,h=b;h;h=Hs(h))d++;for(h=0,y=g;y;y=Hs(y))h++;for(;0<d-h;)b=Hs(b),d--;for(;0<h-d;)g=Hs(g),h--;for(;d--;){if(b===g||g!==null&&b===g.alternate)break t;b=Hs(b),g=Hs(g)}b=null}else b=null;v!==null&&_m(p,f,v,b,!1),x!==null&&k!==null&&_m(p,k,x,b,!0)}}e:{if(f=c?Ks(c):window,v=f.nodeName&&f.nodeName.toLowerCase(),v==="select"||v==="input"&&f.type==="file")var S=u0;else if(dm(f))if(um)S=g0;else{S=f0;var C=p0}else(v=f.nodeName)&&v.toLowerCase()==="input"&&(f.type==="checkbox"||f.type==="radio")&&(S=m0);if(S&&(S=S(e,c))){cm(p,S,a,u);break e}C&&C(e,f,c),e==="focusout"&&(C=f._wrapperState)&&C.controlled&&f.type==="number"&&vd(f,"number",f.value)}switch(C=c?Ks(c):window,e){case"focusin":(dm(C)||C.contentEditable==="true")&&(Vs=C,Hd=c,eo=null);break;case"focusout":eo=Hd=Vs=null;break;case"mousedown":Gd=!0;break;case"contextmenu":case"mouseup":case"dragend":Gd=!1,ym(p,a,u);break;case"selectionchange":if(b0)break;case"keydown":case"keyup":ym(p,a,u)}var E;if(Ud)e:{switch(e){case"compositionstart":var _="onCompositionStart";break e;case"compositionend":_="onCompositionEnd";break e;case"compositionupdate":_="onCompositionUpdate";break e}_=void 0}else qs?im(e,a)&&(_="onCompositionEnd"):e==="keydown"&&a.keyCode===229&&(_="onCompositionStart");_&&(sm&&a.locale!=="ko"&&(qs||_!=="onCompositionStart"?_==="onCompositionEnd"&&qs&&(E=Jf()):(zn=u,Od="value"in zn?zn.value:zn.textContent,qs=!0)),C=fi(c,_),0<C.length&&(_=new am(_,e,null,a,u),p.push({event:_,listeners:C}),E?_.data=E:(E=lm(a),E!==null&&(_.data=E)))),(E=o0?i0(e,a):l0(e,a))&&(c=fi(c,"onBeforeInput"),0<c.length&&(u=new am("onBeforeInput","beforeinput",null,a,u),p.push({event:u,listeners:c}),u.data=E))}Tm(p,t)})}function no(e,t,a){return{instance:e,listener:t,currentTarget:a}}function fi(e,t){for(var a=t+"Capture",n=[];e!==null;){var r=e,s=r.stateNode;r.tag===5&&s!==null&&(r=s,s=Mr(e,a),s!=null&&n.unshift(no(e,s,r)),s=Mr(e,t),s!=null&&n.push(no(e,s,r))),e=e.return}return n}function Hs(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5);return e||null}function _m(e,t,a,n,r){for(var s=t._reactName,o=[];a!==null&&a!==n;){var i=a,l=i.alternate,c=i.stateNode;if(l!==null&&l===n)break;i.tag===5&&c!==null&&(i=c,r?(l=Mr(a,s),l!=null&&o.unshift(no(a,l,i))):r||(l=Mr(a,s),l!=null&&o.push(no(a,l,i)))),a=a.return}o.length!==0&&e.push({event:t,listeners:o})}var k0=/\r\n?/g,N0=/\u0000|\uFFFD/g;function Im(e){return(typeof e=="string"?e:""+e).replace(k0,`
|
|
852
|
-
`).replace(N0,"")}function mi(e,t,a){if(t=Im(t),Im(e)!==t&&a)throw Error(se(425))}function gi(){}var Jd=null,ec=null;function tc(e,t){return e==="textarea"||e==="noscript"||typeof t.children=="string"||typeof t.children=="number"||typeof t.dangerouslySetInnerHTML=="object"&&t.dangerouslySetInnerHTML!==null&&t.dangerouslySetInnerHTML.__html!=null}var ac=typeof setTimeout=="function"?setTimeout:void 0,S0=typeof clearTimeout=="function"?clearTimeout:void 0,Rm=typeof Promise=="function"?Promise:void 0,C0=typeof queueMicrotask=="function"?queueMicrotask:typeof Rm<"u"?function(e){return Rm.resolve(null).then(e).catch(E0)}:ac;function E0(e){setTimeout(function(){throw e})}function nc(e,t){var a=t,n=0;do{var r=a.nextSibling;if(e.removeChild(a),r&&r.nodeType===8)if(a=r.data,a==="/$"){if(n===0){e.removeChild(r),Gr(t);return}n--}else a!=="$"&&a!=="$?"&&a!=="$!"||n++;a=r}while(a);Gr(t)}function Bn(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||t===3)break;if(t===8){if(t=e.data,t==="$"||t==="$!"||t==="$?")break;if(t==="/$")return null}}return e}function Am(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){var a=e.data;if(a==="$"||a==="$!"||a==="$?"){if(t===0)return e;t--}else a==="/$"&&t++}e=e.previousSibling}return null}var Gs=Math.random().toString(36).slice(2),Ga="__reactFiber$"+Gs,so="__reactProps$"+Gs,ln="__reactContainer$"+Gs,sc="__reactEvents$"+Gs,$0="__reactListeners$"+Gs,T0="__reactHandles$"+Gs;function fs(e){var t=e[Ga];if(t)return t;for(var a=e.parentNode;a;){if(t=a[ln]||a[Ga]){if(a=t.alternate,t.child!==null||a!==null&&a.child!==null)for(e=Am(e);e!==null;){if(a=e[Ga])return a;e=Am(e)}return t}e=a,a=e.parentNode}return null}function ro(e){return e=e[Ga]||e[ln],!e||e.tag!==5&&e.tag!==6&&e.tag!==13&&e.tag!==3?null:e}function Ks(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(se(33))}function hi(e){return e[so]||null}var rc=[],Ys=-1;function Un(e){return{current:e}}function lt(e){0>Ys||(e.current=rc[Ys],rc[Ys]=null,Ys--)}function ot(e,t){Ys++,rc[Ys]=e.current,e.current=t}var qn={},Ht=Un(qn),aa=Un(!1),ms=qn;function Qs(e,t){var a=e.type.contextTypes;if(!a)return qn;var n=e.stateNode;if(n&&n.__reactInternalMemoizedUnmaskedChildContext===t)return n.__reactInternalMemoizedMaskedChildContext;var r={},s;for(s in a)r[s]=t[s];return n&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=r),r}function na(e){return e=e.childContextTypes,e!=null}function vi(){lt(aa),lt(Ht)}function jm(e,t,a){if(Ht.current!==qn)throw Error(se(168));ot(Ht,t),ot(aa,a)}function Dm(e,t,a){var n=e.stateNode;if(t=t.childContextTypes,typeof n.getChildContext!="function")return a;n=n.getChildContext();for(var r in n)if(!(r in t))throw Error(se(108,pw(e)||"Unknown",r));return ft({},a,n)}function bi(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||qn,ms=Ht.current,ot(Ht,e),ot(aa,aa.current),!0}function Om(e,t,a){var n=e.stateNode;if(!n)throw Error(se(169));a?(e=Dm(e,t,ms),n.__reactInternalMemoizedMergedChildContext=e,lt(aa),lt(Ht),ot(Ht,e)):lt(aa),ot(aa,a)}var dn=null,yi=!1,oc=!1;function Lm(e){dn===null?dn=[e]:dn.push(e)}function P0(e){yi=!0,Lm(e)}function Vn(){if(!oc&&dn!==null){oc=!0;var e=0,t=Qe;try{var a=dn;for(Qe=1;e<a.length;e++){var n=a[e];do n=n(!0);while(n!==null)}dn=null,yi=!1}catch(r){throw dn!==null&&(dn=dn.slice(e+1)),zf(Td,Vn),r}finally{Qe=t,oc=!1}}return null}var Xs=[],Zs=0,xi=null,wi=0,Na=[],Sa=0,gs=null,cn=1,un="";function hs(e,t){Xs[Zs++]=wi,Xs[Zs++]=xi,xi=e,wi=t}function Mm(e,t,a){Na[Sa++]=cn,Na[Sa++]=un,Na[Sa++]=gs,gs=e;var n=cn;e=un;var r=32-ja(n)-1;n&=~(1<<r),a+=1;var s=32-ja(t)+r;if(30<s){var o=r-r%5;s=(n&(1<<o)-1).toString(32),n>>=o,r-=o,cn=1<<32-ja(t)+r|a<<r|n,un=s+e}else cn=1<<s|a<<r|n,un=e}function ic(e){e.return!==null&&(hs(e,1),Mm(e,1,0))}function lc(e){for(;e===xi;)xi=Xs[--Zs],Xs[Zs]=null,wi=Xs[--Zs],Xs[Zs]=null;for(;e===gs;)gs=Na[--Sa],Na[Sa]=null,un=Na[--Sa],Na[Sa]=null,cn=Na[--Sa],Na[Sa]=null}var ma=null,ga=null,ut=!1,Oa=null;function zm(e,t){var a=Ta(5,null,null,0);a.elementType="DELETED",a.stateNode=t,a.return=e,t=e.deletions,t===null?(e.deletions=[a],e.flags|=16):t.push(a)}function Fm(e,t){switch(e.tag){case 5:var a=e.type;return t=t.nodeType!==1||a.toLowerCase()!==t.nodeName.toLowerCase()?null:t,t!==null?(e.stateNode=t,ma=e,ga=Bn(t.firstChild),!0):!1;case 6:return t=e.pendingProps===""||t.nodeType!==3?null:t,t!==null?(e.stateNode=t,ma=e,ga=null,!0):!1;case 13:return t=t.nodeType!==8?null:t,t!==null?(a=gs!==null?{id:cn,overflow:un}:null,e.memoizedState={dehydrated:t,treeContext:a,retryLane:1073741824},a=Ta(18,null,null,0),a.stateNode=t,a.return=e,e.child=a,ma=e,ga=null,!0):!1;default:return!1}}function dc(e){return(e.mode&1)!==0&&(e.flags&128)===0}function cc(e){if(ut){var t=ga;if(t){var a=t;if(!Fm(e,t)){if(dc(e))throw Error(se(418));t=Bn(a.nextSibling);var n=ma;t&&Fm(e,t)?zm(n,a):(e.flags=e.flags&-4097|2,ut=!1,ma=e)}}else{if(dc(e))throw Error(se(418));e.flags=e.flags&-4097|2,ut=!1,ma=e}}}function Bm(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13;)e=e.return;ma=e}function ki(e){if(e!==ma)return!1;if(!ut)return Bm(e),ut=!0,!1;var t;if((t=e.tag!==3)&&!(t=e.tag!==5)&&(t=e.type,t=t!=="head"&&t!=="body"&&!tc(e.type,e.memoizedProps)),t&&(t=ga)){if(dc(e))throw Um(),Error(se(418));for(;t;)zm(e,t),t=Bn(t.nextSibling)}if(Bm(e),e.tag===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(se(317));e:{for(e=e.nextSibling,t=0;e;){if(e.nodeType===8){var a=e.data;if(a==="/$"){if(t===0){ga=Bn(e.nextSibling);break e}t--}else a!=="$"&&a!=="$!"&&a!=="$?"||t++}e=e.nextSibling}ga=null}}else ga=ma?Bn(e.stateNode.nextSibling):null;return!0}function Um(){for(var e=ga;e;)e=Bn(e.nextSibling)}function Js(){ga=ma=null,ut=!1}function uc(e){Oa===null?Oa=[e]:Oa.push(e)}var _0=on.ReactCurrentBatchConfig;function oo(e,t,a){if(e=a.ref,e!==null&&typeof e!="function"&&typeof e!="object"){if(a._owner){if(a=a._owner,a){if(a.tag!==1)throw Error(se(309));var n=a.stateNode}if(!n)throw Error(se(147,e));var r=n,s=""+e;return t!==null&&t.ref!==null&&typeof t.ref=="function"&&t.ref._stringRef===s?t.ref:(t=function(o){var i=r.refs;o===null?delete i[s]:i[s]=o},t._stringRef=s,t)}if(typeof e!="string")throw Error(se(284));if(!a._owner)throw Error(se(290,e))}return e}function Ni(e,t){throw e=Object.prototype.toString.call(t),Error(se(31,e==="[object Object]"?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function qm(e){var t=e._init;return t(e._payload)}function Vm(e){function t(g,d){if(e){var h=g.deletions;h===null?(g.deletions=[d],g.flags|=16):h.push(d)}}function a(g,d){if(!e)return null;for(;d!==null;)t(g,d),d=d.sibling;return null}function n(g,d){for(g=new Map;d!==null;)d.key!==null?g.set(d.key,d):g.set(d.index,d),d=d.sibling;return g}function r(g,d){return g=Zn(g,d),g.index=0,g.sibling=null,g}function s(g,d,h){return g.index=h,e?(h=g.alternate,h!==null?(h=h.index,h<d?(g.flags|=2,d):h):(g.flags|=2,d)):(g.flags|=1048576,d)}function o(g){return e&&g.alternate===null&&(g.flags|=2),g}function i(g,d,h,y){return d===null||d.tag!==6?(d=au(h,g.mode,y),d.return=g,d):(d=r(d,h),d.return=g,d)}function l(g,d,h,y){var S=h.type;return S===Ls?u(g,d,h.props.children,y,h.key):d!==null&&(d.elementType===S||typeof S=="object"&&S!==null&&S.$$typeof===An&&qm(S)===d.type)?(y=r(d,h.props),y.ref=oo(g,d,h),y.return=g,y):(y=Gi(h.type,h.key,h.props,null,g.mode,y),y.ref=oo(g,d,h),y.return=g,y)}function c(g,d,h,y){return d===null||d.tag!==4||d.stateNode.containerInfo!==h.containerInfo||d.stateNode.implementation!==h.implementation?(d=nu(h,g.mode,y),d.return=g,d):(d=r(d,h.children||[]),d.return=g,d)}function u(g,d,h,y,S){return d===null||d.tag!==7?(d=Ss(h,g.mode,y,S),d.return=g,d):(d=r(d,h),d.return=g,d)}function p(g,d,h){if(typeof d=="string"&&d!==""||typeof d=="number")return d=au(""+d,g.mode,h),d.return=g,d;if(typeof d=="object"&&d!==null){switch(d.$$typeof){case Vo:return h=Gi(d.type,d.key,d.props,null,g.mode,h),h.ref=oo(g,null,d),h.return=g,h;case Os:return d=nu(d,g.mode,h),d.return=g,d;case An:var y=d._init;return p(g,y(d._payload),h)}if(Dr(d)||Ar(d))return d=Ss(d,g.mode,h,null),d.return=g,d;Ni(g,d)}return null}function f(g,d,h,y){var S=d!==null?d.key:null;if(typeof h=="string"&&h!==""||typeof h=="number")return S!==null?null:i(g,d,""+h,y);if(typeof h=="object"&&h!==null){switch(h.$$typeof){case Vo:return h.key===S?l(g,d,h,y):null;case Os:return h.key===S?c(g,d,h,y):null;case An:return S=h._init,f(g,d,S(h._payload),y)}if(Dr(h)||Ar(h))return S!==null?null:u(g,d,h,y,null);Ni(g,h)}return null}function v(g,d,h,y,S){if(typeof y=="string"&&y!==""||typeof y=="number")return g=g.get(h)||null,i(d,g,""+y,S);if(typeof y=="object"&&y!==null){switch(y.$$typeof){case Vo:return g=g.get(y.key===null?h:y.key)||null,l(d,g,y,S);case Os:return g=g.get(y.key===null?h:y.key)||null,c(d,g,y,S);case An:var C=y._init;return v(g,d,h,C(y._payload),S)}if(Dr(y)||Ar(y))return g=g.get(h)||null,u(d,g,y,S,null);Ni(d,y)}return null}function x(g,d,h,y){for(var S=null,C=null,E=d,_=d=0,R=null;E!==null&&_<h.length;_++){E.index>_?(R=E,E=null):R=E.sibling;var A=f(g,E,h[_],y);if(A===null){E===null&&(E=R);break}e&&E&&A.alternate===null&&t(g,E),d=s(A,d,_),C===null?S=A:C.sibling=A,C=A,E=R}if(_===h.length)return a(g,E),ut&&hs(g,_),S;if(E===null){for(;_<h.length;_++)E=p(g,h[_],y),E!==null&&(d=s(E,d,_),C===null?S=E:C.sibling=E,C=E);return ut&&hs(g,_),S}for(E=n(g,E);_<h.length;_++)R=v(E,g,_,h[_],y),R!==null&&(e&&R.alternate!==null&&E.delete(R.key===null?_:R.key),d=s(R,d,_),C===null?S=R:C.sibling=R,C=R);return e&&E.forEach(function(G){return t(g,G)}),ut&&hs(g,_),S}function b(g,d,h,y){var S=Ar(h);if(typeof S!="function")throw Error(se(150));if(h=S.call(h),h==null)throw Error(se(151));for(var C=S=null,E=d,_=d=0,R=null,A=h.next();E!==null&&!A.done;_++,A=h.next()){E.index>_?(R=E,E=null):R=E.sibling;var G=f(g,E,A.value,y);if(G===null){E===null&&(E=R);break}e&&E&&G.alternate===null&&t(g,E),d=s(G,d,_),C===null?S=G:C.sibling=G,C=G,E=R}if(A.done)return a(g,E),ut&&hs(g,_),S;if(E===null){for(;!A.done;_++,A=h.next())A=p(g,A.value,y),A!==null&&(d=s(A,d,_),C===null?S=A:C.sibling=A,C=A);return ut&&hs(g,_),S}for(E=n(g,E);!A.done;_++,A=h.next())A=v(E,g,_,A.value,y),A!==null&&(e&&A.alternate!==null&&E.delete(A.key===null?_:A.key),d=s(A,d,_),C===null?S=A:C.sibling=A,C=A);return e&&E.forEach(function(L){return t(g,L)}),ut&&hs(g,_),S}function k(g,d,h,y){if(typeof h=="object"&&h!==null&&h.type===Ls&&h.key===null&&(h=h.props.children),typeof h=="object"&&h!==null){switch(h.$$typeof){case Vo:e:{for(var S=h.key,C=d;C!==null;){if(C.key===S){if(S=h.type,S===Ls){if(C.tag===7){a(g,C.sibling),d=r(C,h.props.children),d.return=g,g=d;break e}}else if(C.elementType===S||typeof S=="object"&&S!==null&&S.$$typeof===An&&qm(S)===C.type){a(g,C.sibling),d=r(C,h.props),d.ref=oo(g,C,h),d.return=g,g=d;break e}a(g,C);break}else t(g,C);C=C.sibling}h.type===Ls?(d=Ss(h.props.children,g.mode,y,h.key),d.return=g,g=d):(y=Gi(h.type,h.key,h.props,null,g.mode,y),y.ref=oo(g,d,h),y.return=g,g=y)}return o(g);case Os:e:{for(C=h.key;d!==null;){if(d.key===C)if(d.tag===4&&d.stateNode.containerInfo===h.containerInfo&&d.stateNode.implementation===h.implementation){a(g,d.sibling),d=r(d,h.children||[]),d.return=g,g=d;break e}else{a(g,d);break}else t(g,d);d=d.sibling}d=nu(h,g.mode,y),d.return=g,g=d}return o(g);case An:return C=h._init,k(g,d,C(h._payload),y)}if(Dr(h))return x(g,d,h,y);if(Ar(h))return b(g,d,h,y);Ni(g,h)}return typeof h=="string"&&h!==""||typeof h=="number"?(h=""+h,d!==null&&d.tag===6?(a(g,d.sibling),d=r(d,h),d.return=g,g=d):(a(g,d),d=au(h,g.mode,y),d.return=g,g=d),o(g)):a(g,d)}return k}var er=Vm(!0),Wm=Vm(!1),Si=Un(null),Ci=null,tr=null,pc=null;function fc(){pc=tr=Ci=null}function mc(e){var t=Si.current;lt(Si),e._currentValue=t}function gc(e,t,a){for(;e!==null;){var n=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,n!==null&&(n.childLanes|=t)):n!==null&&(n.childLanes&t)!==t&&(n.childLanes|=t),e===a)break;e=e.return}}function ar(e,t){Ci=e,pc=tr=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(sa=!0),e.firstContext=null)}function Ca(e){var t=e._currentValue;if(pc!==e)if(e={context:e,memoizedValue:t,next:null},tr===null){if(Ci===null)throw Error(se(308));tr=e,Ci.dependencies={lanes:0,firstContext:e}}else tr=tr.next=e;return t}var vs=null;function hc(e){vs===null?vs=[e]:vs.push(e)}function Hm(e,t,a,n){var r=t.interleaved;return r===null?(a.next=a,hc(t)):(a.next=r.next,r.next=a),t.interleaved=a,pn(e,n)}function pn(e,t){e.lanes|=t;var a=e.alternate;for(a!==null&&(a.lanes|=t),a=e,e=e.return;e!==null;)e.childLanes|=t,a=e.alternate,a!==null&&(a.childLanes|=t),a=e,e=e.return;return a.tag===3?a.stateNode:null}var Wn=!1;function vc(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Gm(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function fn(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Hn(e,t,a){var n=e.updateQueue;if(n===null)return null;if(n=n.shared,Be&2){var r=n.pending;return r===null?t.next=t:(t.next=r.next,r.next=t),n.pending=t,pn(e,a)}return r=n.interleaved,r===null?(t.next=t,hc(n)):(t.next=r.next,r.next=t),n.interleaved=t,pn(e,a)}function Ei(e,t,a){if(t=t.updateQueue,t!==null&&(t=t.shared,(a&4194240)!==0)){var n=t.lanes;n&=e.pendingLanes,a|=n,t.lanes=a,Id(e,a)}}function Km(e,t){var a=e.updateQueue,n=e.alternate;if(n!==null&&(n=n.updateQueue,a===n)){var r=null,s=null;if(a=a.firstBaseUpdate,a!==null){do{var o={eventTime:a.eventTime,lane:a.lane,tag:a.tag,payload:a.payload,callback:a.callback,next:null};s===null?r=s=o:s=s.next=o,a=a.next}while(a!==null);s===null?r=s=t:s=s.next=t}else r=s=t;a={baseState:n.baseState,firstBaseUpdate:r,lastBaseUpdate:s,shared:n.shared,effects:n.effects},e.updateQueue=a;return}e=a.lastBaseUpdate,e===null?a.firstBaseUpdate=t:e.next=t,a.lastBaseUpdate=t}function $i(e,t,a,n){var r=e.updateQueue;Wn=!1;var s=r.firstBaseUpdate,o=r.lastBaseUpdate,i=r.shared.pending;if(i!==null){r.shared.pending=null;var l=i,c=l.next;l.next=null,o===null?s=c:o.next=c,o=l;var u=e.alternate;u!==null&&(u=u.updateQueue,i=u.lastBaseUpdate,i!==o&&(i===null?u.firstBaseUpdate=c:i.next=c,u.lastBaseUpdate=l))}if(s!==null){var p=r.baseState;o=0,u=c=l=null,i=s;do{var f=i.lane,v=i.eventTime;if((n&f)===f){u!==null&&(u=u.next={eventTime:v,lane:0,tag:i.tag,payload:i.payload,callback:i.callback,next:null});e:{var x=e,b=i;switch(f=t,v=a,b.tag){case 1:if(x=b.payload,typeof x=="function"){p=x.call(v,p,f);break e}p=x;break e;case 3:x.flags=x.flags&-65537|128;case 0:if(x=b.payload,f=typeof x=="function"?x.call(v,p,f):x,f==null)break e;p=ft({},p,f);break e;case 2:Wn=!0}}i.callback!==null&&i.lane!==0&&(e.flags|=64,f=r.effects,f===null?r.effects=[i]:f.push(i))}else v={eventTime:v,lane:f,tag:i.tag,payload:i.payload,callback:i.callback,next:null},u===null?(c=u=v,l=p):u=u.next=v,o|=f;if(i=i.next,i===null){if(i=r.shared.pending,i===null)break;f=i,i=f.next,f.next=null,r.lastBaseUpdate=f,r.shared.pending=null}}while(!0);if(u===null&&(l=p),r.baseState=l,r.firstBaseUpdate=c,r.lastBaseUpdate=u,t=r.shared.interleaved,t!==null){r=t;do o|=r.lane,r=r.next;while(r!==t)}else s===null&&(r.shared.lanes=0);xs|=o,e.lanes=o,e.memoizedState=p}}function Ym(e,t,a){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.length;t++){var n=e[t],r=n.callback;if(r!==null){if(n.callback=null,n=a,typeof r!="function")throw Error(se(191,r));r.call(n)}}}var io={},Ka=Un(io),lo=Un(io),co=Un(io);function bs(e){if(e===io)throw Error(se(174));return e}function bc(e,t){switch(ot(co,t),ot(lo,e),ot(Ka,io),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:yd(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=yd(t,e)}lt(Ka),ot(Ka,t)}function nr(){lt(Ka),lt(lo),lt(co)}function Qm(e){bs(co.current);var t=bs(Ka.current),a=yd(t,e.type);t!==a&&(ot(lo,e),ot(Ka,a))}function yc(e){lo.current===e&&(lt(Ka),lt(lo))}var mt=Un(0);function Ti(e){for(var t=e;t!==null;){if(t.tag===13){var a=t.memoizedState;if(a!==null&&(a=a.dehydrated,a===null||a.data==="$?"||a.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var xc=[];function wc(){for(var e=0;e<xc.length;e++)xc[e]._workInProgressVersionPrimary=null;xc.length=0}var Pi=on.ReactCurrentDispatcher,kc=on.ReactCurrentBatchConfig,ys=0,gt=null,It=null,Lt=null,_i=!1,uo=!1,po=0,I0=0;function Gt(){throw Error(se(321))}function Nc(e,t){if(t===null)return!1;for(var a=0;a<t.length&&a<e.length;a++)if(!Da(e[a],t[a]))return!1;return!0}function Sc(e,t,a,n,r,s){if(ys=s,gt=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Pi.current=e===null||e.memoizedState===null?D0:O0,e=a(n,r),uo){s=0;do{if(uo=!1,po=0,25<=s)throw Error(se(301));s+=1,Lt=It=null,t.updateQueue=null,Pi.current=L0,e=a(n,r)}while(uo)}if(Pi.current=Ai,t=It!==null&&It.next!==null,ys=0,Lt=It=gt=null,_i=!1,t)throw Error(se(300));return e}function Cc(){var e=po!==0;return po=0,e}function Ya(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return Lt===null?gt.memoizedState=Lt=e:Lt=Lt.next=e,Lt}function Ea(){if(It===null){var e=gt.alternate;e=e!==null?e.memoizedState:null}else e=It.next;var t=Lt===null?gt.memoizedState:Lt.next;if(t!==null)Lt=t,It=e;else{if(e===null)throw Error(se(310));It=e,e={memoizedState:It.memoizedState,baseState:It.baseState,baseQueue:It.baseQueue,queue:It.queue,next:null},Lt===null?gt.memoizedState=Lt=e:Lt=Lt.next=e}return Lt}function fo(e,t){return typeof t=="function"?t(e):t}function Ec(e){var t=Ea(),a=t.queue;if(a===null)throw Error(se(311));a.lastRenderedReducer=e;var n=It,r=n.baseQueue,s=a.pending;if(s!==null){if(r!==null){var o=r.next;r.next=s.next,s.next=o}n.baseQueue=r=s,a.pending=null}if(r!==null){s=r.next,n=n.baseState;var i=o=null,l=null,c=s;do{var u=c.lane;if((ys&u)===u)l!==null&&(l=l.next={lane:0,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null}),n=c.hasEagerState?c.eagerState:e(n,c.action);else{var p={lane:u,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null};l===null?(i=l=p,o=n):l=l.next=p,gt.lanes|=u,xs|=u}c=c.next}while(c!==null&&c!==s);l===null?o=n:l.next=i,Da(n,t.memoizedState)||(sa=!0),t.memoizedState=n,t.baseState=o,t.baseQueue=l,a.lastRenderedState=n}if(e=a.interleaved,e!==null){r=e;do s=r.lane,gt.lanes|=s,xs|=s,r=r.next;while(r!==e)}else r===null&&(a.lanes=0);return[t.memoizedState,a.dispatch]}function $c(e){var t=Ea(),a=t.queue;if(a===null)throw Error(se(311));a.lastRenderedReducer=e;var n=a.dispatch,r=a.pending,s=t.memoizedState;if(r!==null){a.pending=null;var o=r=r.next;do s=e(s,o.action),o=o.next;while(o!==r);Da(s,t.memoizedState)||(sa=!0),t.memoizedState=s,t.baseQueue===null&&(t.baseState=s),a.lastRenderedState=s}return[s,n]}function Xm(){}function Zm(e,t){var a=gt,n=Ea(),r=t(),s=!Da(n.memoizedState,r);if(s&&(n.memoizedState=r,sa=!0),n=n.queue,Tc(tg.bind(null,a,n,e),[e]),n.getSnapshot!==t||s||Lt!==null&&Lt.memoizedState.tag&1){if(a.flags|=2048,mo(9,eg.bind(null,a,n,r,t),void 0,null),Mt===null)throw Error(se(349));ys&30||Jm(a,t,r)}return r}function Jm(e,t,a){e.flags|=16384,e={getSnapshot:t,value:a},t=gt.updateQueue,t===null?(t={lastEffect:null,stores:null},gt.updateQueue=t,t.stores=[e]):(a=t.stores,a===null?t.stores=[e]:a.push(e))}function eg(e,t,a,n){t.value=a,t.getSnapshot=n,ag(t)&&ng(e)}function tg(e,t,a){return a(function(){ag(t)&&ng(e)})}function ag(e){var t=e.getSnapshot;e=e.value;try{var a=t();return!Da(e,a)}catch{return!0}}function ng(e){var t=pn(e,1);t!==null&&Fa(t,e,1,-1)}function sg(e){var t=Ya();return typeof e=="function"&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:fo,lastRenderedState:e},t.queue=e,e=e.dispatch=j0.bind(null,gt,e),[t.memoizedState,e]}function mo(e,t,a,n){return e={tag:e,create:t,destroy:a,deps:n,next:null},t=gt.updateQueue,t===null?(t={lastEffect:null,stores:null},gt.updateQueue=t,t.lastEffect=e.next=e):(a=t.lastEffect,a===null?t.lastEffect=e.next=e:(n=a.next,a.next=e,e.next=n,t.lastEffect=e)),e}function rg(){return Ea().memoizedState}function Ii(e,t,a,n){var r=Ya();gt.flags|=e,r.memoizedState=mo(1|t,a,void 0,n===void 0?null:n)}function Ri(e,t,a,n){var r=Ea();n=n===void 0?null:n;var s=void 0;if(It!==null){var o=It.memoizedState;if(s=o.destroy,n!==null&&Nc(n,o.deps)){r.memoizedState=mo(t,a,s,n);return}}gt.flags|=e,r.memoizedState=mo(1|t,a,s,n)}function og(e,t){return Ii(8390656,8,e,t)}function Tc(e,t){return Ri(2048,8,e,t)}function ig(e,t){return Ri(4,2,e,t)}function lg(e,t){return Ri(4,4,e,t)}function dg(e,t){if(typeof t=="function")return e=e(),t(e),function(){t(null)};if(t!=null)return e=e(),t.current=e,function(){t.current=null}}function cg(e,t,a){return a=a!=null?a.concat([e]):null,Ri(4,4,dg.bind(null,t,e),a)}function Pc(){}function ug(e,t){var a=Ea();t=t===void 0?null:t;var n=a.memoizedState;return n!==null&&t!==null&&Nc(t,n[1])?n[0]:(a.memoizedState=[e,t],e)}function pg(e,t){var a=Ea();t=t===void 0?null:t;var n=a.memoizedState;return n!==null&&t!==null&&Nc(t,n[1])?n[0]:(e=e(),a.memoizedState=[e,t],e)}function fg(e,t,a){return ys&21?(Da(a,t)||(a=qf(),gt.lanes|=a,xs|=a,e.baseState=!0),t):(e.baseState&&(e.baseState=!1,sa=!0),e.memoizedState=a)}function R0(e,t){var a=Qe;Qe=a!==0&&4>a?a:4,e(!0);var n=kc.transition;kc.transition={};try{e(!1),t()}finally{Qe=a,kc.transition=n}}function mg(){return Ea().memoizedState}function A0(e,t,a){var n=Qn(e);if(a={lane:n,action:a,hasEagerState:!1,eagerState:null,next:null},gg(e))hg(t,a);else if(a=Hm(e,t,a,n),a!==null){var r=ea();Fa(a,e,n,r),vg(a,t,n)}}function j0(e,t,a){var n=Qn(e),r={lane:n,action:a,hasEagerState:!1,eagerState:null,next:null};if(gg(e))hg(t,r);else{var s=e.alternate;if(e.lanes===0&&(s===null||s.lanes===0)&&(s=t.lastRenderedReducer,s!==null))try{var o=t.lastRenderedState,i=s(o,a);if(r.hasEagerState=!0,r.eagerState=i,Da(i,o)){var l=t.interleaved;l===null?(r.next=r,hc(t)):(r.next=l.next,l.next=r),t.interleaved=r;return}}catch{}finally{}a=Hm(e,t,r,n),a!==null&&(r=ea(),Fa(a,e,n,r),vg(a,t,n))}}function gg(e){var t=e.alternate;return e===gt||t!==null&&t===gt}function hg(e,t){uo=_i=!0;var a=e.pending;a===null?t.next=t:(t.next=a.next,a.next=t),e.pending=t}function vg(e,t,a){if(a&4194240){var n=t.lanes;n&=e.pendingLanes,a|=n,t.lanes=a,Id(e,a)}}var Ai={readContext:Ca,useCallback:Gt,useContext:Gt,useEffect:Gt,useImperativeHandle:Gt,useInsertionEffect:Gt,useLayoutEffect:Gt,useMemo:Gt,useReducer:Gt,useRef:Gt,useState:Gt,useDebugValue:Gt,useDeferredValue:Gt,useTransition:Gt,useMutableSource:Gt,useSyncExternalStore:Gt,useId:Gt,unstable_isNewReconciler:!1},D0={readContext:Ca,useCallback:function(e,t){return Ya().memoizedState=[e,t===void 0?null:t],e},useContext:Ca,useEffect:og,useImperativeHandle:function(e,t,a){return a=a!=null?a.concat([e]):null,Ii(4194308,4,dg.bind(null,t,e),a)},useLayoutEffect:function(e,t){return Ii(4194308,4,e,t)},useInsertionEffect:function(e,t){return Ii(4,2,e,t)},useMemo:function(e,t){var a=Ya();return t=t===void 0?null:t,e=e(),a.memoizedState=[e,t],e},useReducer:function(e,t,a){var n=Ya();return t=a!==void 0?a(t):t,n.memoizedState=n.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},n.queue=e,e=e.dispatch=A0.bind(null,gt,e),[n.memoizedState,e]},useRef:function(e){var t=Ya();return e={current:e},t.memoizedState=e},useState:sg,useDebugValue:Pc,useDeferredValue:function(e){return Ya().memoizedState=e},useTransition:function(){var e=sg(!1),t=e[0];return e=R0.bind(null,e[1]),Ya().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,a){var n=gt,r=Ya();if(ut){if(a===void 0)throw Error(se(407));a=a()}else{if(a=t(),Mt===null)throw Error(se(349));ys&30||Jm(n,t,a)}r.memoizedState=a;var s={value:a,getSnapshot:t};return r.queue=s,og(tg.bind(null,n,s,e),[e]),n.flags|=2048,mo(9,eg.bind(null,n,s,a,t),void 0,null),a},useId:function(){var e=Ya(),t=Mt.identifierPrefix;if(ut){var a=un,n=cn;a=(n&~(1<<32-ja(n)-1)).toString(32)+a,t=":"+t+"R"+a,a=po++,0<a&&(t+="H"+a.toString(32)),t+=":"}else a=I0++,t=":"+t+"r"+a.toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},O0={readContext:Ca,useCallback:ug,useContext:Ca,useEffect:Tc,useImperativeHandle:cg,useInsertionEffect:ig,useLayoutEffect:lg,useMemo:pg,useReducer:Ec,useRef:rg,useState:function(){return Ec(fo)},useDebugValue:Pc,useDeferredValue:function(e){var t=Ea();return fg(t,It.memoizedState,e)},useTransition:function(){var e=Ec(fo)[0],t=Ea().memoizedState;return[e,t]},useMutableSource:Xm,useSyncExternalStore:Zm,useId:mg,unstable_isNewReconciler:!1},L0={readContext:Ca,useCallback:ug,useContext:Ca,useEffect:Tc,useImperativeHandle:cg,useInsertionEffect:ig,useLayoutEffect:lg,useMemo:pg,useReducer:$c,useRef:rg,useState:function(){return $c(fo)},useDebugValue:Pc,useDeferredValue:function(e){var t=Ea();return It===null?t.memoizedState=e:fg(t,It.memoizedState,e)},useTransition:function(){var e=$c(fo)[0],t=Ea().memoizedState;return[e,t]},useMutableSource:Xm,useSyncExternalStore:Zm,useId:mg,unstable_isNewReconciler:!1};function La(e,t){if(e&&e.defaultProps){t=ft({},t),e=e.defaultProps;for(var a in e)t[a]===void 0&&(t[a]=e[a]);return t}return t}function _c(e,t,a,n){t=e.memoizedState,a=a(n,t),a=a==null?t:ft({},t,a),e.memoizedState=a,e.lanes===0&&(e.updateQueue.baseState=a)}var ji={isMounted:function(e){return(e=e._reactInternals)?ps(e)===e:!1},enqueueSetState:function(e,t,a){e=e._reactInternals;var n=ea(),r=Qn(e),s=fn(n,r);s.payload=t,a!=null&&(s.callback=a),t=Hn(e,s,r),t!==null&&(Fa(t,e,r,n),Ei(t,e,r))},enqueueReplaceState:function(e,t,a){e=e._reactInternals;var n=ea(),r=Qn(e),s=fn(n,r);s.tag=1,s.payload=t,a!=null&&(s.callback=a),t=Hn(e,s,r),t!==null&&(Fa(t,e,r,n),Ei(t,e,r))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var a=ea(),n=Qn(e),r=fn(a,n);r.tag=2,t!=null&&(r.callback=t),t=Hn(e,r,n),t!==null&&(Fa(t,e,n,a),Ei(t,e,n))}};function bg(e,t,a,n,r,s,o){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(n,s,o):t.prototype&&t.prototype.isPureReactComponent?!Jr(a,n)||!Jr(r,s):!0}function yg(e,t,a){var n=!1,r=qn,s=t.contextType;return typeof s=="object"&&s!==null?s=Ca(s):(r=na(t)?ms:Ht.current,n=t.contextTypes,s=(n=n!=null)?Qs(e,r):qn),t=new t(a,s),e.memoizedState=t.state!==null&&t.state!==void 0?t.state:null,t.updater=ji,e.stateNode=t,t._reactInternals=e,n&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=r,e.__reactInternalMemoizedMaskedChildContext=s),t}function xg(e,t,a,n){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(a,n),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(a,n),t.state!==e&&ji.enqueueReplaceState(t,t.state,null)}function Ic(e,t,a,n){var r=e.stateNode;r.props=a,r.state=e.memoizedState,r.refs={},vc(e);var s=t.contextType;typeof s=="object"&&s!==null?r.context=Ca(s):(s=na(t)?ms:Ht.current,r.context=Qs(e,s)),r.state=e.memoizedState,s=t.getDerivedStateFromProps,typeof s=="function"&&(_c(e,t,s,a),r.state=e.memoizedState),typeof t.getDerivedStateFromProps=="function"||typeof r.getSnapshotBeforeUpdate=="function"||typeof r.UNSAFE_componentWillMount!="function"&&typeof r.componentWillMount!="function"||(t=r.state,typeof r.componentWillMount=="function"&&r.componentWillMount(),typeof r.UNSAFE_componentWillMount=="function"&&r.UNSAFE_componentWillMount(),t!==r.state&&ji.enqueueReplaceState(r,r.state,null),$i(e,a,r,n),r.state=e.memoizedState),typeof r.componentDidMount=="function"&&(e.flags|=4194308)}function sr(e,t){try{var a="",n=t;do a+=uw(n),n=n.return;while(n);var r=a}catch(s){r=`
|
|
851
|
+
`+r[o].replace(" at new "," at ");return e.displayName&&l.includes("<anonymous>")&&(l=l.replace("<anonymous>",e.displayName)),l}while(1<=o&&0<=i);break}}}finally{pd=!1,Error.prepareStackTrace=a}return(e=e?e.displayName||e.name:"")?jr(e):""}function pw(e){switch(e.tag){case 5:return jr(e.type);case 16:return jr("Lazy");case 13:return jr("Suspense");case 19:return jr("SuspenseList");case 0:case 2:case 15:return e=fd(e.type,!1),e;case 11:return e=fd(e.type.render,!1),e;case 1:return e=fd(e.type,!0),e;default:return""}}function md(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Ls:return"Fragment";case Os:return"Portal";case od:return"Profiler";case rd:return"StrictMode";case ld:return"Suspense";case dd:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case mf:return(e.displayName||"Context")+".Consumer";case ff:return(e._context.displayName||"Context")+".Provider";case id:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case cd:return t=e.displayName||null,t!==null?t:md(e.type)||"Memo";case jn:t=e._payload,e=e._init;try{return md(e(t))}catch{}}return null}function fw(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return md(t);case 8:return t===rd?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Dn(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function vf(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function mw(e){var t=vf(e)?"checked":"value",a=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),n=""+e[t];if(!e.hasOwnProperty(t)&&typeof a<"u"&&typeof a.get=="function"&&typeof a.set=="function"){var r=a.get,s=a.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return r.call(this)},set:function(o){n=""+o,s.call(this,o)}}),Object.defineProperty(e,t,{enumerable:a.enumerable}),{getValue:function(){return n},setValue:function(o){n=""+o},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Wo(e){e._valueTracker||(e._valueTracker=mw(e))}function bf(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var a=t.getValue(),n="";return e&&(n=vf(e)?e.checked?"true":"false":e.value),e=n,e!==a?(t.setValue(e),!0):!1}function Ho(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function gd(e,t){var a=t.checked;return ft({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:a??e._wrapperState.initialChecked})}function yf(e,t){var a=t.defaultValue==null?"":t.defaultValue,n=t.checked!=null?t.checked:t.defaultChecked;a=Dn(t.value!=null?t.value:a),e._wrapperState={initialChecked:n,initialValue:a,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function xf(e,t){t=t.checked,t!=null&&sd(e,"checked",t,!1)}function hd(e,t){xf(e,t);var a=Dn(t.value),n=t.type;if(a!=null)n==="number"?(a===0&&e.value===""||e.value!=a)&&(e.value=""+a):e.value!==""+a&&(e.value=""+a);else if(n==="submit"||n==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?vd(e,t.type,a):t.hasOwnProperty("defaultValue")&&vd(e,t.type,Dn(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function wf(e,t,a){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var n=t.type;if(!(n!=="submit"&&n!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,a||t===e.value||(e.value=t),e.defaultValue=t}a=e.name,a!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,a!==""&&(e.name=a)}function vd(e,t,a){(t!=="number"||Ho(e.ownerDocument)!==e)&&(a==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+a&&(e.defaultValue=""+a))}var Dr=Array.isArray;function Ms(e,t,a,n){if(e=e.options,t){t={};for(var r=0;r<a.length;r++)t["$"+a[r]]=!0;for(a=0;a<e.length;a++)r=t.hasOwnProperty("$"+e[a].value),e[a].selected!==r&&(e[a].selected=r),r&&n&&(e[a].defaultSelected=!0)}else{for(a=""+Dn(a),t=null,r=0;r<e.length;r++){if(e[r].value===a){e[r].selected=!0,n&&(e[r].defaultSelected=!0);return}t!==null||e[r].disabled||(t=e[r])}t!==null&&(t.selected=!0)}}function bd(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(re(91));return ft({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function kf(e,t){var a=t.value;if(a==null){if(a=t.children,t=t.defaultValue,a!=null){if(t!=null)throw Error(re(92));if(Dr(a)){if(1<a.length)throw Error(re(93));a=a[0]}t=a}t==null&&(t=""),a=t}e._wrapperState={initialValue:Dn(a)}}function Nf(e,t){var a=Dn(t.value),n=Dn(t.defaultValue);a!=null&&(a=""+a,a!==e.value&&(e.value=a),t.defaultValue==null&&e.defaultValue!==a&&(e.defaultValue=a)),n!=null&&(e.defaultValue=""+n)}function Sf(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!==""&&t!==null&&(e.value=t)}function Cf(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function yd(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?Cf(t):e==="http://www.w3.org/2000/svg"&&t==="foreignObject"?"http://www.w3.org/1999/xhtml":e}var Go,Ef=function(e){return typeof MSApp<"u"&&MSApp.execUnsafeLocalFunction?function(t,a,n,r){MSApp.execUnsafeLocalFunction(function(){return e(t,a,n,r)})}:e}(function(e,t){if(e.namespaceURI!=="http://www.w3.org/2000/svg"||"innerHTML"in e)e.innerHTML=t;else{for(Go=Go||document.createElement("div"),Go.innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=Go.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Or(e,t){if(t){var a=e.firstChild;if(a&&a===e.lastChild&&a.nodeType===3){a.nodeValue=t;return}}e.textContent=t}var Lr={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},gw=["Webkit","ms","Moz","O"];Object.keys(Lr).forEach(function(e){gw.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Lr[t]=Lr[e]})});function $f(e,t,a){return t==null||typeof t=="boolean"||t===""?"":a||typeof t!="number"||t===0||Lr.hasOwnProperty(e)&&Lr[e]?(""+t).trim():t+"px"}function Tf(e,t){e=e.style;for(var a in t)if(t.hasOwnProperty(a)){var n=a.indexOf("--")===0,r=$f(a,t[a],n);a==="float"&&(a="cssFloat"),n?e.setProperty(a,r):e[a]=r}}var hw=ft({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function xd(e,t){if(t){if(hw[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(re(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(re(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(re(61))}if(t.style!=null&&typeof t.style!="object")throw Error(re(62))}}function wd(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var kd=null;function Nd(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Sd=null,zs=null,Fs=null;function Pf(e){if(e=ro(e)){if(typeof Sd!="function")throw Error(re(280));var t=e.stateNode;t&&(t=hi(t),Sd(e.stateNode,e.type,t))}}function _f(e){zs?Fs?Fs.push(e):Fs=[e]:zs=e}function If(){if(zs){var e=zs,t=Fs;if(Fs=zs=null,Pf(e),t)for(e=0;e<t.length;e++)Pf(t[e])}}function Rf(e,t){return e(t)}function Af(){}var Cd=!1;function jf(e,t,a){if(Cd)return e(t,a);Cd=!0;try{return Rf(e,t,a)}finally{Cd=!1,(zs!==null||Fs!==null)&&(Af(),If())}}function Mr(e,t){var a=e.stateNode;if(a===null)return null;var n=hi(a);if(n===null)return null;a=n[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(n=!n.disabled)||(e=e.type,n=!(e==="button"||e==="input"||e==="select"||e==="textarea")),e=!n;break e;default:e=!1}if(e)return null;if(a&&typeof a!="function")throw Error(re(231,t,typeof a));return a}var Ed=!1;if(rn)try{var zr={};Object.defineProperty(zr,"passive",{get:function(){Ed=!0}}),window.addEventListener("test",zr,zr),window.removeEventListener("test",zr,zr)}catch{Ed=!1}function vw(e,t,a,n,r,s,o,i,l){var c=Array.prototype.slice.call(arguments,3);try{t.apply(a,c)}catch(u){this.onError(u)}}var Fr=!1,Ko=null,Yo=!1,$d=null,bw={onError:function(e){Fr=!0,Ko=e}};function yw(e,t,a,n,r,s,o,i,l){Fr=!1,Ko=null,vw.apply(bw,arguments)}function xw(e,t,a,n,r,s,o,i,l){if(yw.apply(this,arguments),Fr){if(Fr){var c=Ko;Fr=!1,Ko=null}else throw Error(re(198));Yo||(Yo=!0,$d=c)}}function ps(e){var t=e,a=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,t.flags&4098&&(a=t.return),e=t.return;while(e)}return t.tag===3?a:null}function Df(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function Of(e){if(ps(e)!==e)throw Error(re(188))}function ww(e){var t=e.alternate;if(!t){if(t=ps(e),t===null)throw Error(re(188));return t!==e?null:e}for(var a=e,n=t;;){var r=a.return;if(r===null)break;var s=r.alternate;if(s===null){if(n=r.return,n!==null){a=n;continue}break}if(r.child===s.child){for(s=r.child;s;){if(s===a)return Of(r),e;if(s===n)return Of(r),t;s=s.sibling}throw Error(re(188))}if(a.return!==n.return)a=r,n=s;else{for(var o=!1,i=r.child;i;){if(i===a){o=!0,a=r,n=s;break}if(i===n){o=!0,n=r,a=s;break}i=i.sibling}if(!o){for(i=s.child;i;){if(i===a){o=!0,a=s,n=r;break}if(i===n){o=!0,n=s,a=r;break}i=i.sibling}if(!o)throw Error(re(189))}}if(a.alternate!==n)throw Error(re(190))}if(a.tag!==3)throw Error(re(188));return a.stateNode.current===a?e:t}function Lf(e){return e=ww(e),e!==null?Mf(e):null}function Mf(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;){var t=Mf(e);if(t!==null)return t;e=e.sibling}return null}var zf=pa.unstable_scheduleCallback,Ff=pa.unstable_cancelCallback,kw=pa.unstable_shouldYield,Nw=pa.unstable_requestPaint,wt=pa.unstable_now,Sw=pa.unstable_getCurrentPriorityLevel,Td=pa.unstable_ImmediatePriority,Bf=pa.unstable_UserBlockingPriority,Qo=pa.unstable_NormalPriority,Cw=pa.unstable_LowPriority,Uf=pa.unstable_IdlePriority,Xo=null,Ha=null;function Ew(e){if(Ha&&typeof Ha.onCommitFiberRoot=="function")try{Ha.onCommitFiberRoot(Xo,e,void 0,(e.current.flags&128)===128)}catch{}}var ja=Math.clz32?Math.clz32:Pw,$w=Math.log,Tw=Math.LN2;function Pw(e){return e>>>=0,e===0?32:31-($w(e)/Tw|0)|0}var Zo=64,Jo=4194304;function Br(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function ei(e,t){var a=e.pendingLanes;if(a===0)return 0;var n=0,r=e.suspendedLanes,s=e.pingedLanes,o=a&268435455;if(o!==0){var i=o&~r;i!==0?n=Br(i):(s&=o,s!==0&&(n=Br(s)))}else o=a&~r,o!==0?n=Br(o):s!==0&&(n=Br(s));if(n===0)return 0;if(t!==0&&t!==n&&!(t&r)&&(r=n&-n,s=t&-t,r>=s||r===16&&(s&4194240)!==0))return t;if(n&4&&(n|=a&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=n;0<t;)a=31-ja(t),r=1<<a,n|=e[a],t&=~r;return n}function _w(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Iw(e,t){for(var a=e.suspendedLanes,n=e.pingedLanes,r=e.expirationTimes,s=e.pendingLanes;0<s;){var o=31-ja(s),i=1<<o,l=r[o];l===-1?(!(i&a)||i&n)&&(r[o]=_w(i,t)):l<=t&&(e.expiredLanes|=i),s&=~i}}function Pd(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?1073741824:0}function qf(){var e=Zo;return Zo<<=1,!(Zo&4194240)&&(Zo=64),e}function _d(e){for(var t=[],a=0;31>a;a++)t.push(e);return t}function Ur(e,t,a){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-ja(t),e[t]=a}function Rw(e,t){var a=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var n=e.eventTimes;for(e=e.expirationTimes;0<a;){var r=31-ja(a),s=1<<r;t[r]=0,n[r]=-1,e[r]=-1,a&=~s}}function Id(e,t){var a=e.entangledLanes|=t;for(e=e.entanglements;a;){var n=31-ja(a),r=1<<n;r&t|e[n]&t&&(e[n]|=t),a&=~r}}var Xe=0;function Vf(e){return e&=-e,1<e?4<e?e&268435455?16:536870912:4:1}var Wf,Rd,Hf,Gf,Kf,Ad=!1,ti=[],On=null,Ln=null,Mn=null,qr=new Map,Vr=new Map,zn=[],Aw="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function Yf(e,t){switch(e){case"focusin":case"focusout":On=null;break;case"dragenter":case"dragleave":Ln=null;break;case"mouseover":case"mouseout":Mn=null;break;case"pointerover":case"pointerout":qr.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Vr.delete(t.pointerId)}}function Wr(e,t,a,n,r,s){return e===null||e.nativeEvent!==s?(e={blockedOn:t,domEventName:a,eventSystemFlags:n,nativeEvent:s,targetContainers:[r]},t!==null&&(t=ro(t),t!==null&&Rd(t)),e):(e.eventSystemFlags|=n,t=e.targetContainers,r!==null&&t.indexOf(r)===-1&&t.push(r),e)}function jw(e,t,a,n,r){switch(t){case"focusin":return On=Wr(On,e,t,a,n,r),!0;case"dragenter":return Ln=Wr(Ln,e,t,a,n,r),!0;case"mouseover":return Mn=Wr(Mn,e,t,a,n,r),!0;case"pointerover":var s=r.pointerId;return qr.set(s,Wr(qr.get(s)||null,e,t,a,n,r)),!0;case"gotpointercapture":return s=r.pointerId,Vr.set(s,Wr(Vr.get(s)||null,e,t,a,n,r)),!0}return!1}function Qf(e){var t=fs(e.target);if(t!==null){var a=ps(t);if(a!==null){if(t=a.tag,t===13){if(t=Df(a),t!==null){e.blockedOn=t,Kf(e.priority,function(){Hf(a)});return}}else if(t===3&&a.stateNode.current.memoizedState.isDehydrated){e.blockedOn=a.tag===3?a.stateNode.containerInfo:null;return}}}e.blockedOn=null}function ai(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var a=Dd(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(a===null){a=e.nativeEvent;var n=new a.constructor(a.type,a);kd=n,a.target.dispatchEvent(n),kd=null}else return t=ro(a),t!==null&&Rd(t),e.blockedOn=a,!1;t.shift()}return!0}function Xf(e,t,a){ai(e)&&a.delete(t)}function Dw(){Ad=!1,On!==null&&ai(On)&&(On=null),Ln!==null&&ai(Ln)&&(Ln=null),Mn!==null&&ai(Mn)&&(Mn=null),qr.forEach(Xf),Vr.forEach(Xf)}function Hr(e,t){e.blockedOn===t&&(e.blockedOn=null,Ad||(Ad=!0,pa.unstable_scheduleCallback(pa.unstable_NormalPriority,Dw)))}function Gr(e){function t(r){return Hr(r,e)}if(0<ti.length){Hr(ti[0],e);for(var a=1;a<ti.length;a++){var n=ti[a];n.blockedOn===e&&(n.blockedOn=null)}}for(On!==null&&Hr(On,e),Ln!==null&&Hr(Ln,e),Mn!==null&&Hr(Mn,e),qr.forEach(t),Vr.forEach(t),a=0;a<zn.length;a++)n=zn[a],n.blockedOn===e&&(n.blockedOn=null);for(;0<zn.length&&(a=zn[0],a.blockedOn===null);)Qf(a),a.blockedOn===null&&zn.shift()}var Bs=on.ReactCurrentBatchConfig,ni=!0;function Ow(e,t,a,n){var r=Xe,s=Bs.transition;Bs.transition=null;try{Xe=1,jd(e,t,a,n)}finally{Xe=r,Bs.transition=s}}function Lw(e,t,a,n){var r=Xe,s=Bs.transition;Bs.transition=null;try{Xe=4,jd(e,t,a,n)}finally{Xe=r,Bs.transition=s}}function jd(e,t,a,n){if(ni){var r=Dd(e,t,a,n);if(r===null)Zd(e,t,n,si,a),Yf(e,n);else if(jw(r,e,t,a,n))n.stopPropagation();else if(Yf(e,n),t&4&&-1<Aw.indexOf(e)){for(;r!==null;){var s=ro(r);if(s!==null&&Wf(s),s=Dd(e,t,a,n),s===null&&Zd(e,t,n,si,a),s===r)break;r=s}r!==null&&n.stopPropagation()}else Zd(e,t,n,null,a)}}var si=null;function Dd(e,t,a,n){if(si=null,e=Nd(n),e=fs(e),e!==null)if(t=ps(e),t===null)e=null;else if(a=t.tag,a===13){if(e=Df(t),e!==null)return e;e=null}else if(a===3){if(t.stateNode.current.memoizedState.isDehydrated)return t.tag===3?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return si=e,null}function Zf(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(Sw()){case Td:return 1;case Bf:return 4;case Qo:case Cw:return 16;case Uf:return 536870912;default:return 16}default:return 16}}var Fn=null,Od=null,ri=null;function Jf(){if(ri)return ri;var e,t=Od,a=t.length,n,r="value"in Fn?Fn.value:Fn.textContent,s=r.length;for(e=0;e<a&&t[e]===r[e];e++);var o=a-e;for(n=1;n<=o&&t[a-n]===r[s-n];n++);return ri=r.slice(e,1<n?1-n:void 0)}function oi(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&&t===13&&(e=13)):e=t,e===10&&(e=13),32<=e||e===13?e:0}function ii(){return!0}function em(){return!1}function fa(e){function t(a,n,r,s,o){this._reactName=a,this._targetInst=r,this.type=n,this.nativeEvent=s,this.target=o,this.currentTarget=null;for(var i in e)e.hasOwnProperty(i)&&(a=e[i],this[i]=a?a(s):s[i]);return this.isDefaultPrevented=(s.defaultPrevented!=null?s.defaultPrevented:s.returnValue===!1)?ii:em,this.isPropagationStopped=em,this}return ft(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():typeof a.returnValue!="unknown"&&(a.returnValue=!1),this.isDefaultPrevented=ii)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():typeof a.cancelBubble!="unknown"&&(a.cancelBubble=!0),this.isPropagationStopped=ii)},persist:function(){},isPersistent:ii}),t}var Us={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},Ld=fa(Us),Kr=ft({},Us,{view:0,detail:0}),Mw=fa(Kr),Md,zd,Yr,li=ft({},Kr,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Bd,button:0,buttons:0,relatedTarget:function(e){return e.relatedTarget===void 0?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==Yr&&(Yr&&e.type==="mousemove"?(Md=e.screenX-Yr.screenX,zd=e.screenY-Yr.screenY):zd=Md=0,Yr=e),Md)},movementY:function(e){return"movementY"in e?e.movementY:zd}}),tm=fa(li),zw=ft({},li,{dataTransfer:0}),Fw=fa(zw),Bw=ft({},Kr,{relatedTarget:0}),Fd=fa(Bw),Uw=ft({},Us,{animationName:0,elapsedTime:0,pseudoElement:0}),qw=fa(Uw),Vw=ft({},Us,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),Ww=fa(Vw),Hw=ft({},Us,{data:0}),am=fa(Hw),Gw={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},Kw={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",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",224:"Meta"},Yw={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Qw(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):(e=Yw[e])?!!t[e]:!1}function Bd(){return Qw}var Xw=ft({},Kr,{key:function(e){if(e.key){var t=Gw[e.key]||e.key;if(t!=="Unidentified")return t}return e.type==="keypress"?(e=oi(e),e===13?"Enter":String.fromCharCode(e)):e.type==="keydown"||e.type==="keyup"?Kw[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Bd,charCode:function(e){return e.type==="keypress"?oi(e):0},keyCode:function(e){return e.type==="keydown"||e.type==="keyup"?e.keyCode:0},which:function(e){return e.type==="keypress"?oi(e):e.type==="keydown"||e.type==="keyup"?e.keyCode:0}}),Zw=fa(Xw),Jw=ft({},li,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),nm=fa(Jw),e0=ft({},Kr,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Bd}),t0=fa(e0),a0=ft({},Us,{propertyName:0,elapsedTime:0,pseudoElement:0}),n0=fa(a0),s0=ft({},li,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),r0=fa(s0),o0=[9,13,27,32],Ud=rn&&"CompositionEvent"in window,Qr=null;rn&&"documentMode"in document&&(Qr=document.documentMode);var i0=rn&&"TextEvent"in window&&!Qr,sm=rn&&(!Ud||Qr&&8<Qr&&11>=Qr),rm=" ",om=!1;function im(e,t){switch(e){case"keyup":return o0.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function lm(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var qs=!1;function l0(e,t){switch(e){case"compositionend":return lm(t);case"keypress":return t.which!==32?null:(om=!0,rm);case"textInput":return e=t.data,e===rm&&om?null:e;default:return null}}function d0(e,t){if(qs)return e==="compositionend"||!Ud&&im(e,t)?(e=Jf(),ri=Od=Fn=null,qs=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return sm&&t.locale!=="ko"?null:t.data;default:return null}}var c0={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function dm(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t==="input"?!!c0[e.type]:t==="textarea"}function cm(e,t,a,n){_f(n),t=fi(t,"onChange"),0<t.length&&(a=new Ld("onChange","change",null,a,n),e.push({event:a,listeners:t}))}var Xr=null,Zr=null;function u0(e){Tm(e,0)}function di(e){var t=Ks(e);if(bf(t))return e}function p0(e,t){if(e==="change")return t}var um=!1;if(rn){var qd;if(rn){var Vd="oninput"in document;if(!Vd){var pm=document.createElement("div");pm.setAttribute("oninput","return;"),Vd=typeof pm.oninput=="function"}qd=Vd}else qd=!1;um=qd&&(!document.documentMode||9<document.documentMode)}function fm(){Xr&&(Xr.detachEvent("onpropertychange",mm),Zr=Xr=null)}function mm(e){if(e.propertyName==="value"&&di(Zr)){var t=[];cm(t,Zr,e,Nd(e)),jf(u0,t)}}function f0(e,t,a){e==="focusin"?(fm(),Xr=t,Zr=a,Xr.attachEvent("onpropertychange",mm)):e==="focusout"&&fm()}function m0(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")return di(Zr)}function g0(e,t){if(e==="click")return di(t)}function h0(e,t){if(e==="input"||e==="change")return di(t)}function v0(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var Da=typeof Object.is=="function"?Object.is:v0;function Jr(e,t){if(Da(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;var a=Object.keys(e),n=Object.keys(t);if(a.length!==n.length)return!1;for(n=0;n<a.length;n++){var r=a[n];if(!td.call(t,r)||!Da(e[r],t[r]))return!1}return!0}function gm(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function hm(e,t){var a=gm(e);e=0;for(var n;a;){if(a.nodeType===3){if(n=e+a.textContent.length,e<=t&&n>=t)return{node:a,offset:t-e};e=n}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=gm(a)}}function vm(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?vm(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function bm(){for(var e=window,t=Ho();t instanceof e.HTMLIFrameElement;){try{var a=typeof t.contentWindow.location.href=="string"}catch{a=!1}if(a)e=t.contentWindow;else break;t=Ho(e.document)}return t}function Wd(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function b0(e){var t=bm(),a=e.focusedElem,n=e.selectionRange;if(t!==a&&a&&a.ownerDocument&&vm(a.ownerDocument.documentElement,a)){if(n!==null&&Wd(a)){if(t=n.start,e=n.end,e===void 0&&(e=t),"selectionStart"in a)a.selectionStart=t,a.selectionEnd=Math.min(e,a.value.length);else if(e=(t=a.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var r=a.textContent.length,s=Math.min(n.start,r);n=n.end===void 0?s:Math.min(n.end,r),!e.extend&&s>n&&(r=n,n=s,s=r),r=hm(a,s);var o=hm(a,n);r&&o&&(e.rangeCount!==1||e.anchorNode!==r.node||e.anchorOffset!==r.offset||e.focusNode!==o.node||e.focusOffset!==o.offset)&&(t=t.createRange(),t.setStart(r.node,r.offset),e.removeAllRanges(),s>n?(e.addRange(t),e.extend(o.node,o.offset)):(t.setEnd(o.node,o.offset),e.addRange(t)))}}for(t=[],e=a;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof a.focus=="function"&&a.focus(),a=0;a<t.length;a++)e=t[a],e.element.scrollLeft=e.left,e.element.scrollTop=e.top}}var y0=rn&&"documentMode"in document&&11>=document.documentMode,Vs=null,Hd=null,eo=null,Gd=!1;function ym(e,t,a){var n=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;Gd||Vs==null||Vs!==Ho(n)||(n=Vs,"selectionStart"in n&&Wd(n)?n={start:n.selectionStart,end:n.selectionEnd}:(n=(n.ownerDocument&&n.ownerDocument.defaultView||window).getSelection(),n={anchorNode:n.anchorNode,anchorOffset:n.anchorOffset,focusNode:n.focusNode,focusOffset:n.focusOffset}),eo&&Jr(eo,n)||(eo=n,n=fi(Hd,"onSelect"),0<n.length&&(t=new Ld("onSelect","select",null,t,a),e.push({event:t,listeners:n}),t.target=Vs)))}function ci(e,t){var a={};return a[e.toLowerCase()]=t.toLowerCase(),a["Webkit"+e]="webkit"+t,a["Moz"+e]="moz"+t,a}var Ws={animationend:ci("Animation","AnimationEnd"),animationiteration:ci("Animation","AnimationIteration"),animationstart:ci("Animation","AnimationStart"),transitionend:ci("Transition","TransitionEnd")},Kd={},xm={};rn&&(xm=document.createElement("div").style,"AnimationEvent"in window||(delete Ws.animationend.animation,delete Ws.animationiteration.animation,delete Ws.animationstart.animation),"TransitionEvent"in window||delete Ws.transitionend.transition);function ui(e){if(Kd[e])return Kd[e];if(!Ws[e])return e;var t=Ws[e],a;for(a in t)if(t.hasOwnProperty(a)&&a in xm)return Kd[e]=t[a];return e}var wm=ui("animationend"),km=ui("animationiteration"),Nm=ui("animationstart"),Sm=ui("transitionend"),Cm=new Map,Em="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Bn(e,t){Cm.set(e,t),us(t,[e])}for(var Yd=0;Yd<Em.length;Yd++){var Qd=Em[Yd],x0=Qd.toLowerCase(),w0=Qd[0].toUpperCase()+Qd.slice(1);Bn(x0,"on"+w0)}Bn(wm,"onAnimationEnd"),Bn(km,"onAnimationIteration"),Bn(Nm,"onAnimationStart"),Bn("dblclick","onDoubleClick"),Bn("focusin","onFocus"),Bn("focusout","onBlur"),Bn(Sm,"onTransitionEnd"),Ds("onMouseEnter",["mouseout","mouseover"]),Ds("onMouseLeave",["mouseout","mouseover"]),Ds("onPointerEnter",["pointerout","pointerover"]),Ds("onPointerLeave",["pointerout","pointerover"]),us("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),us("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),us("onBeforeInput",["compositionend","keypress","textInput","paste"]),us("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),us("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),us("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var to="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),k0=new Set("cancel close invalid load scroll toggle".split(" ").concat(to));function $m(e,t,a){var n=e.type||"unknown-event";e.currentTarget=a,xw(n,t,void 0,e),e.currentTarget=null}function Tm(e,t){t=(t&4)!==0;for(var a=0;a<e.length;a++){var n=e[a],r=n.event;n=n.listeners;e:{var s=void 0;if(t)for(var o=n.length-1;0<=o;o--){var i=n[o],l=i.instance,c=i.currentTarget;if(i=i.listener,l!==s&&r.isPropagationStopped())break e;$m(r,i,c),s=l}else for(o=0;o<n.length;o++){if(i=n[o],l=i.instance,c=i.currentTarget,i=i.listener,l!==s&&r.isPropagationStopped())break e;$m(r,i,c),s=l}}}if(Yo)throw e=$d,Yo=!1,$d=null,e}function it(e,t){var a=t[sc];a===void 0&&(a=t[sc]=new Set);var n=e+"__bubble";a.has(n)||(Pm(t,e,2,!1),a.add(n))}function Xd(e,t,a){var n=0;t&&(n|=4),Pm(a,e,n,t)}var pi="_reactListening"+Math.random().toString(36).slice(2);function ao(e){if(!e[pi]){e[pi]=!0,cf.forEach(function(a){a!=="selectionchange"&&(k0.has(a)||Xd(a,!1,e),Xd(a,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[pi]||(t[pi]=!0,Xd("selectionchange",!1,t))}}function Pm(e,t,a,n){switch(Zf(t)){case 1:var r=Ow;break;case 4:r=Lw;break;default:r=jd}a=r.bind(null,t,a,e),r=void 0,!Ed||t!=="touchstart"&&t!=="touchmove"&&t!=="wheel"||(r=!0),n?r!==void 0?e.addEventListener(t,a,{capture:!0,passive:r}):e.addEventListener(t,a,!0):r!==void 0?e.addEventListener(t,a,{passive:r}):e.addEventListener(t,a,!1)}function Zd(e,t,a,n,r){var s=n;if(!(t&1)&&!(t&2)&&n!==null)e:for(;;){if(n===null)return;var o=n.tag;if(o===3||o===4){var i=n.stateNode.containerInfo;if(i===r||i.nodeType===8&&i.parentNode===r)break;if(o===4)for(o=n.return;o!==null;){var l=o.tag;if((l===3||l===4)&&(l=o.stateNode.containerInfo,l===r||l.nodeType===8&&l.parentNode===r))return;o=o.return}for(;i!==null;){if(o=fs(i),o===null)return;if(l=o.tag,l===5||l===6){n=s=o;continue e}i=i.parentNode}}n=n.return}jf(function(){var c=s,u=Nd(a),p=[];e:{var f=Cm.get(e);if(f!==void 0){var v=Ld,x=e;switch(e){case"keypress":if(oi(a)===0)break e;case"keydown":case"keyup":v=Zw;break;case"focusin":x="focus",v=Fd;break;case"focusout":x="blur",v=Fd;break;case"beforeblur":case"afterblur":v=Fd;break;case"click":if(a.button===2)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":v=tm;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":v=Fw;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":v=t0;break;case wm:case km:case Nm:v=qw;break;case Sm:v=n0;break;case"scroll":v=Mw;break;case"wheel":v=r0;break;case"copy":case"cut":case"paste":v=Ww;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":v=nm}var b=(t&4)!==0,k=!b&&e==="scroll",g=b?f!==null?f+"Capture":null:f;b=[];for(var d=c,h;d!==null;){h=d;var y=h.stateNode;if(h.tag===5&&y!==null&&(h=y,g!==null&&(y=Mr(d,g),y!=null&&b.push(no(d,y,h)))),k)break;d=d.return}0<b.length&&(f=new v(f,x,null,a,u),p.push({event:f,listeners:b}))}}if(!(t&7)){e:{if(f=e==="mouseover"||e==="pointerover",v=e==="mouseout"||e==="pointerout",f&&a!==kd&&(x=a.relatedTarget||a.fromElement)&&(fs(x)||x[ln]))break e;if((v||f)&&(f=u.window===u?u:(f=u.ownerDocument)?f.defaultView||f.parentWindow:window,v?(x=a.relatedTarget||a.toElement,v=c,x=x?fs(x):null,x!==null&&(k=ps(x),x!==k||x.tag!==5&&x.tag!==6)&&(x=null)):(v=null,x=c),v!==x)){if(b=tm,y="onMouseLeave",g="onMouseEnter",d="mouse",(e==="pointerout"||e==="pointerover")&&(b=nm,y="onPointerLeave",g="onPointerEnter",d="pointer"),k=v==null?f:Ks(v),h=x==null?f:Ks(x),f=new b(y,d+"leave",v,a,u),f.target=k,f.relatedTarget=h,y=null,fs(u)===c&&(b=new b(g,d+"enter",x,a,u),b.target=h,b.relatedTarget=k,y=b),k=y,v&&x)t:{for(b=v,g=x,d=0,h=b;h;h=Hs(h))d++;for(h=0,y=g;y;y=Hs(y))h++;for(;0<d-h;)b=Hs(b),d--;for(;0<h-d;)g=Hs(g),h--;for(;d--;){if(b===g||g!==null&&b===g.alternate)break t;b=Hs(b),g=Hs(g)}b=null}else b=null;v!==null&&_m(p,f,v,b,!1),x!==null&&k!==null&&_m(p,k,x,b,!0)}}e:{if(f=c?Ks(c):window,v=f.nodeName&&f.nodeName.toLowerCase(),v==="select"||v==="input"&&f.type==="file")var S=p0;else if(dm(f))if(um)S=h0;else{S=m0;var C=f0}else(v=f.nodeName)&&v.toLowerCase()==="input"&&(f.type==="checkbox"||f.type==="radio")&&(S=g0);if(S&&(S=S(e,c))){cm(p,S,a,u);break e}C&&C(e,f,c),e==="focusout"&&(C=f._wrapperState)&&C.controlled&&f.type==="number"&&vd(f,"number",f.value)}switch(C=c?Ks(c):window,e){case"focusin":(dm(C)||C.contentEditable==="true")&&(Vs=C,Hd=c,eo=null);break;case"focusout":eo=Hd=Vs=null;break;case"mousedown":Gd=!0;break;case"contextmenu":case"mouseup":case"dragend":Gd=!1,ym(p,a,u);break;case"selectionchange":if(y0)break;case"keydown":case"keyup":ym(p,a,u)}var E;if(Ud)e:{switch(e){case"compositionstart":var _="onCompositionStart";break e;case"compositionend":_="onCompositionEnd";break e;case"compositionupdate":_="onCompositionUpdate";break e}_=void 0}else qs?im(e,a)&&(_="onCompositionEnd"):e==="keydown"&&a.keyCode===229&&(_="onCompositionStart");_&&(sm&&a.locale!=="ko"&&(qs||_!=="onCompositionStart"?_==="onCompositionEnd"&&qs&&(E=Jf()):(Fn=u,Od="value"in Fn?Fn.value:Fn.textContent,qs=!0)),C=fi(c,_),0<C.length&&(_=new am(_,e,null,a,u),p.push({event:_,listeners:C}),E?_.data=E:(E=lm(a),E!==null&&(_.data=E)))),(E=i0?l0(e,a):d0(e,a))&&(c=fi(c,"onBeforeInput"),0<c.length&&(u=new am("onBeforeInput","beforeinput",null,a,u),p.push({event:u,listeners:c}),u.data=E))}Tm(p,t)})}function no(e,t,a){return{instance:e,listener:t,currentTarget:a}}function fi(e,t){for(var a=t+"Capture",n=[];e!==null;){var r=e,s=r.stateNode;r.tag===5&&s!==null&&(r=s,s=Mr(e,a),s!=null&&n.unshift(no(e,s,r)),s=Mr(e,t),s!=null&&n.push(no(e,s,r))),e=e.return}return n}function Hs(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5);return e||null}function _m(e,t,a,n,r){for(var s=t._reactName,o=[];a!==null&&a!==n;){var i=a,l=i.alternate,c=i.stateNode;if(l!==null&&l===n)break;i.tag===5&&c!==null&&(i=c,r?(l=Mr(a,s),l!=null&&o.unshift(no(a,l,i))):r||(l=Mr(a,s),l!=null&&o.push(no(a,l,i)))),a=a.return}o.length!==0&&e.push({event:t,listeners:o})}var N0=/\r\n?/g,S0=/\u0000|\uFFFD/g;function Im(e){return(typeof e=="string"?e:""+e).replace(N0,`
|
|
852
|
+
`).replace(S0,"")}function mi(e,t,a){if(t=Im(t),Im(e)!==t&&a)throw Error(re(425))}function gi(){}var Jd=null,ec=null;function tc(e,t){return e==="textarea"||e==="noscript"||typeof t.children=="string"||typeof t.children=="number"||typeof t.dangerouslySetInnerHTML=="object"&&t.dangerouslySetInnerHTML!==null&&t.dangerouslySetInnerHTML.__html!=null}var ac=typeof setTimeout=="function"?setTimeout:void 0,C0=typeof clearTimeout=="function"?clearTimeout:void 0,Rm=typeof Promise=="function"?Promise:void 0,E0=typeof queueMicrotask=="function"?queueMicrotask:typeof Rm<"u"?function(e){return Rm.resolve(null).then(e).catch($0)}:ac;function $0(e){setTimeout(function(){throw e})}function nc(e,t){var a=t,n=0;do{var r=a.nextSibling;if(e.removeChild(a),r&&r.nodeType===8)if(a=r.data,a==="/$"){if(n===0){e.removeChild(r),Gr(t);return}n--}else a!=="$"&&a!=="$?"&&a!=="$!"||n++;a=r}while(a);Gr(t)}function Un(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||t===3)break;if(t===8){if(t=e.data,t==="$"||t==="$!"||t==="$?")break;if(t==="/$")return null}}return e}function Am(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){var a=e.data;if(a==="$"||a==="$!"||a==="$?"){if(t===0)return e;t--}else a==="/$"&&t++}e=e.previousSibling}return null}var Gs=Math.random().toString(36).slice(2),Ga="__reactFiber$"+Gs,so="__reactProps$"+Gs,ln="__reactContainer$"+Gs,sc="__reactEvents$"+Gs,T0="__reactListeners$"+Gs,P0="__reactHandles$"+Gs;function fs(e){var t=e[Ga];if(t)return t;for(var a=e.parentNode;a;){if(t=a[ln]||a[Ga]){if(a=t.alternate,t.child!==null||a!==null&&a.child!==null)for(e=Am(e);e!==null;){if(a=e[Ga])return a;e=Am(e)}return t}e=a,a=e.parentNode}return null}function ro(e){return e=e[Ga]||e[ln],!e||e.tag!==5&&e.tag!==6&&e.tag!==13&&e.tag!==3?null:e}function Ks(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(re(33))}function hi(e){return e[so]||null}var rc=[],Ys=-1;function qn(e){return{current:e}}function lt(e){0>Ys||(e.current=rc[Ys],rc[Ys]=null,Ys--)}function ot(e,t){Ys++,rc[Ys]=e.current,e.current=t}var Vn={},Ht=qn(Vn),na=qn(!1),ms=Vn;function Qs(e,t){var a=e.type.contextTypes;if(!a)return Vn;var n=e.stateNode;if(n&&n.__reactInternalMemoizedUnmaskedChildContext===t)return n.__reactInternalMemoizedMaskedChildContext;var r={},s;for(s in a)r[s]=t[s];return n&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=r),r}function sa(e){return e=e.childContextTypes,e!=null}function vi(){lt(na),lt(Ht)}function jm(e,t,a){if(Ht.current!==Vn)throw Error(re(168));ot(Ht,t),ot(na,a)}function Dm(e,t,a){var n=e.stateNode;if(t=t.childContextTypes,typeof n.getChildContext!="function")return a;n=n.getChildContext();for(var r in n)if(!(r in t))throw Error(re(108,fw(e)||"Unknown",r));return ft({},a,n)}function bi(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Vn,ms=Ht.current,ot(Ht,e),ot(na,na.current),!0}function Om(e,t,a){var n=e.stateNode;if(!n)throw Error(re(169));a?(e=Dm(e,t,ms),n.__reactInternalMemoizedMergedChildContext=e,lt(na),lt(Ht),ot(Ht,e)):lt(na),ot(na,a)}var dn=null,yi=!1,oc=!1;function Lm(e){dn===null?dn=[e]:dn.push(e)}function _0(e){yi=!0,Lm(e)}function Wn(){if(!oc&&dn!==null){oc=!0;var e=0,t=Xe;try{var a=dn;for(Xe=1;e<a.length;e++){var n=a[e];do n=n(!0);while(n!==null)}dn=null,yi=!1}catch(r){throw dn!==null&&(dn=dn.slice(e+1)),zf(Td,Wn),r}finally{Xe=t,oc=!1}}return null}var Xs=[],Zs=0,xi=null,wi=0,Na=[],Sa=0,gs=null,cn=1,un="";function hs(e,t){Xs[Zs++]=wi,Xs[Zs++]=xi,xi=e,wi=t}function Mm(e,t,a){Na[Sa++]=cn,Na[Sa++]=un,Na[Sa++]=gs,gs=e;var n=cn;e=un;var r=32-ja(n)-1;n&=~(1<<r),a+=1;var s=32-ja(t)+r;if(30<s){var o=r-r%5;s=(n&(1<<o)-1).toString(32),n>>=o,r-=o,cn=1<<32-ja(t)+r|a<<r|n,un=s+e}else cn=1<<s|a<<r|n,un=e}function ic(e){e.return!==null&&(hs(e,1),Mm(e,1,0))}function lc(e){for(;e===xi;)xi=Xs[--Zs],Xs[Zs]=null,wi=Xs[--Zs],Xs[Zs]=null;for(;e===gs;)gs=Na[--Sa],Na[Sa]=null,un=Na[--Sa],Na[Sa]=null,cn=Na[--Sa],Na[Sa]=null}var ma=null,ga=null,ut=!1,Oa=null;function zm(e,t){var a=Ta(5,null,null,0);a.elementType="DELETED",a.stateNode=t,a.return=e,t=e.deletions,t===null?(e.deletions=[a],e.flags|=16):t.push(a)}function Fm(e,t){switch(e.tag){case 5:var a=e.type;return t=t.nodeType!==1||a.toLowerCase()!==t.nodeName.toLowerCase()?null:t,t!==null?(e.stateNode=t,ma=e,ga=Un(t.firstChild),!0):!1;case 6:return t=e.pendingProps===""||t.nodeType!==3?null:t,t!==null?(e.stateNode=t,ma=e,ga=null,!0):!1;case 13:return t=t.nodeType!==8?null:t,t!==null?(a=gs!==null?{id:cn,overflow:un}:null,e.memoizedState={dehydrated:t,treeContext:a,retryLane:1073741824},a=Ta(18,null,null,0),a.stateNode=t,a.return=e,e.child=a,ma=e,ga=null,!0):!1;default:return!1}}function dc(e){return(e.mode&1)!==0&&(e.flags&128)===0}function cc(e){if(ut){var t=ga;if(t){var a=t;if(!Fm(e,t)){if(dc(e))throw Error(re(418));t=Un(a.nextSibling);var n=ma;t&&Fm(e,t)?zm(n,a):(e.flags=e.flags&-4097|2,ut=!1,ma=e)}}else{if(dc(e))throw Error(re(418));e.flags=e.flags&-4097|2,ut=!1,ma=e}}}function Bm(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13;)e=e.return;ma=e}function ki(e){if(e!==ma)return!1;if(!ut)return Bm(e),ut=!0,!1;var t;if((t=e.tag!==3)&&!(t=e.tag!==5)&&(t=e.type,t=t!=="head"&&t!=="body"&&!tc(e.type,e.memoizedProps)),t&&(t=ga)){if(dc(e))throw Um(),Error(re(418));for(;t;)zm(e,t),t=Un(t.nextSibling)}if(Bm(e),e.tag===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(re(317));e:{for(e=e.nextSibling,t=0;e;){if(e.nodeType===8){var a=e.data;if(a==="/$"){if(t===0){ga=Un(e.nextSibling);break e}t--}else a!=="$"&&a!=="$!"&&a!=="$?"||t++}e=e.nextSibling}ga=null}}else ga=ma?Un(e.stateNode.nextSibling):null;return!0}function Um(){for(var e=ga;e;)e=Un(e.nextSibling)}function Js(){ga=ma=null,ut=!1}function uc(e){Oa===null?Oa=[e]:Oa.push(e)}var I0=on.ReactCurrentBatchConfig;function oo(e,t,a){if(e=a.ref,e!==null&&typeof e!="function"&&typeof e!="object"){if(a._owner){if(a=a._owner,a){if(a.tag!==1)throw Error(re(309));var n=a.stateNode}if(!n)throw Error(re(147,e));var r=n,s=""+e;return t!==null&&t.ref!==null&&typeof t.ref=="function"&&t.ref._stringRef===s?t.ref:(t=function(o){var i=r.refs;o===null?delete i[s]:i[s]=o},t._stringRef=s,t)}if(typeof e!="string")throw Error(re(284));if(!a._owner)throw Error(re(290,e))}return e}function Ni(e,t){throw e=Object.prototype.toString.call(t),Error(re(31,e==="[object Object]"?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function qm(e){var t=e._init;return t(e._payload)}function Vm(e){function t(g,d){if(e){var h=g.deletions;h===null?(g.deletions=[d],g.flags|=16):h.push(d)}}function a(g,d){if(!e)return null;for(;d!==null;)t(g,d),d=d.sibling;return null}function n(g,d){for(g=new Map;d!==null;)d.key!==null?g.set(d.key,d):g.set(d.index,d),d=d.sibling;return g}function r(g,d){return g=Jn(g,d),g.index=0,g.sibling=null,g}function s(g,d,h){return g.index=h,e?(h=g.alternate,h!==null?(h=h.index,h<d?(g.flags|=2,d):h):(g.flags|=2,d)):(g.flags|=1048576,d)}function o(g){return e&&g.alternate===null&&(g.flags|=2),g}function i(g,d,h,y){return d===null||d.tag!==6?(d=au(h,g.mode,y),d.return=g,d):(d=r(d,h),d.return=g,d)}function l(g,d,h,y){var S=h.type;return S===Ls?u(g,d,h.props.children,y,h.key):d!==null&&(d.elementType===S||typeof S=="object"&&S!==null&&S.$$typeof===jn&&qm(S)===d.type)?(y=r(d,h.props),y.ref=oo(g,d,h),y.return=g,y):(y=Gi(h.type,h.key,h.props,null,g.mode,y),y.ref=oo(g,d,h),y.return=g,y)}function c(g,d,h,y){return d===null||d.tag!==4||d.stateNode.containerInfo!==h.containerInfo||d.stateNode.implementation!==h.implementation?(d=nu(h,g.mode,y),d.return=g,d):(d=r(d,h.children||[]),d.return=g,d)}function u(g,d,h,y,S){return d===null||d.tag!==7?(d=Ss(h,g.mode,y,S),d.return=g,d):(d=r(d,h),d.return=g,d)}function p(g,d,h){if(typeof d=="string"&&d!==""||typeof d=="number")return d=au(""+d,g.mode,h),d.return=g,d;if(typeof d=="object"&&d!==null){switch(d.$$typeof){case Vo:return h=Gi(d.type,d.key,d.props,null,g.mode,h),h.ref=oo(g,null,d),h.return=g,h;case Os:return d=nu(d,g.mode,h),d.return=g,d;case jn:var y=d._init;return p(g,y(d._payload),h)}if(Dr(d)||Ar(d))return d=Ss(d,g.mode,h,null),d.return=g,d;Ni(g,d)}return null}function f(g,d,h,y){var S=d!==null?d.key:null;if(typeof h=="string"&&h!==""||typeof h=="number")return S!==null?null:i(g,d,""+h,y);if(typeof h=="object"&&h!==null){switch(h.$$typeof){case Vo:return h.key===S?l(g,d,h,y):null;case Os:return h.key===S?c(g,d,h,y):null;case jn:return S=h._init,f(g,d,S(h._payload),y)}if(Dr(h)||Ar(h))return S!==null?null:u(g,d,h,y,null);Ni(g,h)}return null}function v(g,d,h,y,S){if(typeof y=="string"&&y!==""||typeof y=="number")return g=g.get(h)||null,i(d,g,""+y,S);if(typeof y=="object"&&y!==null){switch(y.$$typeof){case Vo:return g=g.get(y.key===null?h:y.key)||null,l(d,g,y,S);case Os:return g=g.get(y.key===null?h:y.key)||null,c(d,g,y,S);case jn:var C=y._init;return v(g,d,h,C(y._payload),S)}if(Dr(y)||Ar(y))return g=g.get(h)||null,u(d,g,y,S,null);Ni(d,y)}return null}function x(g,d,h,y){for(var S=null,C=null,E=d,_=d=0,I=null;E!==null&&_<h.length;_++){E.index>_?(I=E,E=null):I=E.sibling;var j=f(g,E,h[_],y);if(j===null){E===null&&(E=I);break}e&&E&&j.alternate===null&&t(g,E),d=s(j,d,_),C===null?S=j:C.sibling=j,C=j,E=I}if(_===h.length)return a(g,E),ut&&hs(g,_),S;if(E===null){for(;_<h.length;_++)E=p(g,h[_],y),E!==null&&(d=s(E,d,_),C===null?S=E:C.sibling=E,C=E);return ut&&hs(g,_),S}for(E=n(g,E);_<h.length;_++)I=v(E,g,_,h[_],y),I!==null&&(e&&I.alternate!==null&&E.delete(I.key===null?_:I.key),d=s(I,d,_),C===null?S=I:C.sibling=I,C=I);return e&&E.forEach(function(H){return t(g,H)}),ut&&hs(g,_),S}function b(g,d,h,y){var S=Ar(h);if(typeof S!="function")throw Error(re(150));if(h=S.call(h),h==null)throw Error(re(151));for(var C=S=null,E=d,_=d=0,I=null,j=h.next();E!==null&&!j.done;_++,j=h.next()){E.index>_?(I=E,E=null):I=E.sibling;var H=f(g,E,j.value,y);if(H===null){E===null&&(E=I);break}e&&E&&H.alternate===null&&t(g,E),d=s(H,d,_),C===null?S=H:C.sibling=H,C=H,E=I}if(j.done)return a(g,E),ut&&hs(g,_),S;if(E===null){for(;!j.done;_++,j=h.next())j=p(g,j.value,y),j!==null&&(d=s(j,d,_),C===null?S=j:C.sibling=j,C=j);return ut&&hs(g,_),S}for(E=n(g,E);!j.done;_++,j=h.next())j=v(E,g,_,j.value,y),j!==null&&(e&&j.alternate!==null&&E.delete(j.key===null?_:j.key),d=s(j,d,_),C===null?S=j:C.sibling=j,C=j);return e&&E.forEach(function(M){return t(g,M)}),ut&&hs(g,_),S}function k(g,d,h,y){if(typeof h=="object"&&h!==null&&h.type===Ls&&h.key===null&&(h=h.props.children),typeof h=="object"&&h!==null){switch(h.$$typeof){case Vo:e:{for(var S=h.key,C=d;C!==null;){if(C.key===S){if(S=h.type,S===Ls){if(C.tag===7){a(g,C.sibling),d=r(C,h.props.children),d.return=g,g=d;break e}}else if(C.elementType===S||typeof S=="object"&&S!==null&&S.$$typeof===jn&&qm(S)===C.type){a(g,C.sibling),d=r(C,h.props),d.ref=oo(g,C,h),d.return=g,g=d;break e}a(g,C);break}else t(g,C);C=C.sibling}h.type===Ls?(d=Ss(h.props.children,g.mode,y,h.key),d.return=g,g=d):(y=Gi(h.type,h.key,h.props,null,g.mode,y),y.ref=oo(g,d,h),y.return=g,g=y)}return o(g);case Os:e:{for(C=h.key;d!==null;){if(d.key===C)if(d.tag===4&&d.stateNode.containerInfo===h.containerInfo&&d.stateNode.implementation===h.implementation){a(g,d.sibling),d=r(d,h.children||[]),d.return=g,g=d;break e}else{a(g,d);break}else t(g,d);d=d.sibling}d=nu(h,g.mode,y),d.return=g,g=d}return o(g);case jn:return C=h._init,k(g,d,C(h._payload),y)}if(Dr(h))return x(g,d,h,y);if(Ar(h))return b(g,d,h,y);Ni(g,h)}return typeof h=="string"&&h!==""||typeof h=="number"?(h=""+h,d!==null&&d.tag===6?(a(g,d.sibling),d=r(d,h),d.return=g,g=d):(a(g,d),d=au(h,g.mode,y),d.return=g,g=d),o(g)):a(g,d)}return k}var er=Vm(!0),Wm=Vm(!1),Si=qn(null),Ci=null,tr=null,pc=null;function fc(){pc=tr=Ci=null}function mc(e){var t=Si.current;lt(Si),e._currentValue=t}function gc(e,t,a){for(;e!==null;){var n=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,n!==null&&(n.childLanes|=t)):n!==null&&(n.childLanes&t)!==t&&(n.childLanes|=t),e===a)break;e=e.return}}function ar(e,t){Ci=e,pc=tr=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(ra=!0),e.firstContext=null)}function Ca(e){var t=e._currentValue;if(pc!==e)if(e={context:e,memoizedValue:t,next:null},tr===null){if(Ci===null)throw Error(re(308));tr=e,Ci.dependencies={lanes:0,firstContext:e}}else tr=tr.next=e;return t}var vs=null;function hc(e){vs===null?vs=[e]:vs.push(e)}function Hm(e,t,a,n){var r=t.interleaved;return r===null?(a.next=a,hc(t)):(a.next=r.next,r.next=a),t.interleaved=a,pn(e,n)}function pn(e,t){e.lanes|=t;var a=e.alternate;for(a!==null&&(a.lanes|=t),a=e,e=e.return;e!==null;)e.childLanes|=t,a=e.alternate,a!==null&&(a.childLanes|=t),a=e,e=e.return;return a.tag===3?a.stateNode:null}var Hn=!1;function vc(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Gm(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function fn(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Gn(e,t,a){var n=e.updateQueue;if(n===null)return null;if(n=n.shared,Be&2){var r=n.pending;return r===null?t.next=t:(t.next=r.next,r.next=t),n.pending=t,pn(e,a)}return r=n.interleaved,r===null?(t.next=t,hc(n)):(t.next=r.next,r.next=t),n.interleaved=t,pn(e,a)}function Ei(e,t,a){if(t=t.updateQueue,t!==null&&(t=t.shared,(a&4194240)!==0)){var n=t.lanes;n&=e.pendingLanes,a|=n,t.lanes=a,Id(e,a)}}function Km(e,t){var a=e.updateQueue,n=e.alternate;if(n!==null&&(n=n.updateQueue,a===n)){var r=null,s=null;if(a=a.firstBaseUpdate,a!==null){do{var o={eventTime:a.eventTime,lane:a.lane,tag:a.tag,payload:a.payload,callback:a.callback,next:null};s===null?r=s=o:s=s.next=o,a=a.next}while(a!==null);s===null?r=s=t:s=s.next=t}else r=s=t;a={baseState:n.baseState,firstBaseUpdate:r,lastBaseUpdate:s,shared:n.shared,effects:n.effects},e.updateQueue=a;return}e=a.lastBaseUpdate,e===null?a.firstBaseUpdate=t:e.next=t,a.lastBaseUpdate=t}function $i(e,t,a,n){var r=e.updateQueue;Hn=!1;var s=r.firstBaseUpdate,o=r.lastBaseUpdate,i=r.shared.pending;if(i!==null){r.shared.pending=null;var l=i,c=l.next;l.next=null,o===null?s=c:o.next=c,o=l;var u=e.alternate;u!==null&&(u=u.updateQueue,i=u.lastBaseUpdate,i!==o&&(i===null?u.firstBaseUpdate=c:i.next=c,u.lastBaseUpdate=l))}if(s!==null){var p=r.baseState;o=0,u=c=l=null,i=s;do{var f=i.lane,v=i.eventTime;if((n&f)===f){u!==null&&(u=u.next={eventTime:v,lane:0,tag:i.tag,payload:i.payload,callback:i.callback,next:null});e:{var x=e,b=i;switch(f=t,v=a,b.tag){case 1:if(x=b.payload,typeof x=="function"){p=x.call(v,p,f);break e}p=x;break e;case 3:x.flags=x.flags&-65537|128;case 0:if(x=b.payload,f=typeof x=="function"?x.call(v,p,f):x,f==null)break e;p=ft({},p,f);break e;case 2:Hn=!0}}i.callback!==null&&i.lane!==0&&(e.flags|=64,f=r.effects,f===null?r.effects=[i]:f.push(i))}else v={eventTime:v,lane:f,tag:i.tag,payload:i.payload,callback:i.callback,next:null},u===null?(c=u=v,l=p):u=u.next=v,o|=f;if(i=i.next,i===null){if(i=r.shared.pending,i===null)break;f=i,i=f.next,f.next=null,r.lastBaseUpdate=f,r.shared.pending=null}}while(!0);if(u===null&&(l=p),r.baseState=l,r.firstBaseUpdate=c,r.lastBaseUpdate=u,t=r.shared.interleaved,t!==null){r=t;do o|=r.lane,r=r.next;while(r!==t)}else s===null&&(r.shared.lanes=0);xs|=o,e.lanes=o,e.memoizedState=p}}function Ym(e,t,a){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.length;t++){var n=e[t],r=n.callback;if(r!==null){if(n.callback=null,n=a,typeof r!="function")throw Error(re(191,r));r.call(n)}}}var io={},Ka=qn(io),lo=qn(io),co=qn(io);function bs(e){if(e===io)throw Error(re(174));return e}function bc(e,t){switch(ot(co,t),ot(lo,e),ot(Ka,io),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:yd(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=yd(t,e)}lt(Ka),ot(Ka,t)}function nr(){lt(Ka),lt(lo),lt(co)}function Qm(e){bs(co.current);var t=bs(Ka.current),a=yd(t,e.type);t!==a&&(ot(lo,e),ot(Ka,a))}function yc(e){lo.current===e&&(lt(Ka),lt(lo))}var mt=qn(0);function Ti(e){for(var t=e;t!==null;){if(t.tag===13){var a=t.memoizedState;if(a!==null&&(a=a.dehydrated,a===null||a.data==="$?"||a.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var xc=[];function wc(){for(var e=0;e<xc.length;e++)xc[e]._workInProgressVersionPrimary=null;xc.length=0}var Pi=on.ReactCurrentDispatcher,kc=on.ReactCurrentBatchConfig,ys=0,gt=null,It=null,Lt=null,_i=!1,uo=!1,po=0,R0=0;function Gt(){throw Error(re(321))}function Nc(e,t){if(t===null)return!1;for(var a=0;a<t.length&&a<e.length;a++)if(!Da(e[a],t[a]))return!1;return!0}function Sc(e,t,a,n,r,s){if(ys=s,gt=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Pi.current=e===null||e.memoizedState===null?O0:L0,e=a(n,r),uo){s=0;do{if(uo=!1,po=0,25<=s)throw Error(re(301));s+=1,Lt=It=null,t.updateQueue=null,Pi.current=M0,e=a(n,r)}while(uo)}if(Pi.current=Ai,t=It!==null&&It.next!==null,ys=0,Lt=It=gt=null,_i=!1,t)throw Error(re(300));return e}function Cc(){var e=po!==0;return po=0,e}function Ya(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return Lt===null?gt.memoizedState=Lt=e:Lt=Lt.next=e,Lt}function Ea(){if(It===null){var e=gt.alternate;e=e!==null?e.memoizedState:null}else e=It.next;var t=Lt===null?gt.memoizedState:Lt.next;if(t!==null)Lt=t,It=e;else{if(e===null)throw Error(re(310));It=e,e={memoizedState:It.memoizedState,baseState:It.baseState,baseQueue:It.baseQueue,queue:It.queue,next:null},Lt===null?gt.memoizedState=Lt=e:Lt=Lt.next=e}return Lt}function fo(e,t){return typeof t=="function"?t(e):t}function Ec(e){var t=Ea(),a=t.queue;if(a===null)throw Error(re(311));a.lastRenderedReducer=e;var n=It,r=n.baseQueue,s=a.pending;if(s!==null){if(r!==null){var o=r.next;r.next=s.next,s.next=o}n.baseQueue=r=s,a.pending=null}if(r!==null){s=r.next,n=n.baseState;var i=o=null,l=null,c=s;do{var u=c.lane;if((ys&u)===u)l!==null&&(l=l.next={lane:0,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null}),n=c.hasEagerState?c.eagerState:e(n,c.action);else{var p={lane:u,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null};l===null?(i=l=p,o=n):l=l.next=p,gt.lanes|=u,xs|=u}c=c.next}while(c!==null&&c!==s);l===null?o=n:l.next=i,Da(n,t.memoizedState)||(ra=!0),t.memoizedState=n,t.baseState=o,t.baseQueue=l,a.lastRenderedState=n}if(e=a.interleaved,e!==null){r=e;do s=r.lane,gt.lanes|=s,xs|=s,r=r.next;while(r!==e)}else r===null&&(a.lanes=0);return[t.memoizedState,a.dispatch]}function $c(e){var t=Ea(),a=t.queue;if(a===null)throw Error(re(311));a.lastRenderedReducer=e;var n=a.dispatch,r=a.pending,s=t.memoizedState;if(r!==null){a.pending=null;var o=r=r.next;do s=e(s,o.action),o=o.next;while(o!==r);Da(s,t.memoizedState)||(ra=!0),t.memoizedState=s,t.baseQueue===null&&(t.baseState=s),a.lastRenderedState=s}return[s,n]}function Xm(){}function Zm(e,t){var a=gt,n=Ea(),r=t(),s=!Da(n.memoizedState,r);if(s&&(n.memoizedState=r,ra=!0),n=n.queue,Tc(tg.bind(null,a,n,e),[e]),n.getSnapshot!==t||s||Lt!==null&&Lt.memoizedState.tag&1){if(a.flags|=2048,mo(9,eg.bind(null,a,n,r,t),void 0,null),Mt===null)throw Error(re(349));ys&30||Jm(a,t,r)}return r}function Jm(e,t,a){e.flags|=16384,e={getSnapshot:t,value:a},t=gt.updateQueue,t===null?(t={lastEffect:null,stores:null},gt.updateQueue=t,t.stores=[e]):(a=t.stores,a===null?t.stores=[e]:a.push(e))}function eg(e,t,a,n){t.value=a,t.getSnapshot=n,ag(t)&&ng(e)}function tg(e,t,a){return a(function(){ag(t)&&ng(e)})}function ag(e){var t=e.getSnapshot;e=e.value;try{var a=t();return!Da(e,a)}catch{return!0}}function ng(e){var t=pn(e,1);t!==null&&Fa(t,e,1,-1)}function sg(e){var t=Ya();return typeof e=="function"&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:fo,lastRenderedState:e},t.queue=e,e=e.dispatch=D0.bind(null,gt,e),[t.memoizedState,e]}function mo(e,t,a,n){return e={tag:e,create:t,destroy:a,deps:n,next:null},t=gt.updateQueue,t===null?(t={lastEffect:null,stores:null},gt.updateQueue=t,t.lastEffect=e.next=e):(a=t.lastEffect,a===null?t.lastEffect=e.next=e:(n=a.next,a.next=e,e.next=n,t.lastEffect=e)),e}function rg(){return Ea().memoizedState}function Ii(e,t,a,n){var r=Ya();gt.flags|=e,r.memoizedState=mo(1|t,a,void 0,n===void 0?null:n)}function Ri(e,t,a,n){var r=Ea();n=n===void 0?null:n;var s=void 0;if(It!==null){var o=It.memoizedState;if(s=o.destroy,n!==null&&Nc(n,o.deps)){r.memoizedState=mo(t,a,s,n);return}}gt.flags|=e,r.memoizedState=mo(1|t,a,s,n)}function og(e,t){return Ii(8390656,8,e,t)}function Tc(e,t){return Ri(2048,8,e,t)}function ig(e,t){return Ri(4,2,e,t)}function lg(e,t){return Ri(4,4,e,t)}function dg(e,t){if(typeof t=="function")return e=e(),t(e),function(){t(null)};if(t!=null)return e=e(),t.current=e,function(){t.current=null}}function cg(e,t,a){return a=a!=null?a.concat([e]):null,Ri(4,4,dg.bind(null,t,e),a)}function Pc(){}function ug(e,t){var a=Ea();t=t===void 0?null:t;var n=a.memoizedState;return n!==null&&t!==null&&Nc(t,n[1])?n[0]:(a.memoizedState=[e,t],e)}function pg(e,t){var a=Ea();t=t===void 0?null:t;var n=a.memoizedState;return n!==null&&t!==null&&Nc(t,n[1])?n[0]:(e=e(),a.memoizedState=[e,t],e)}function fg(e,t,a){return ys&21?(Da(a,t)||(a=qf(),gt.lanes|=a,xs|=a,e.baseState=!0),t):(e.baseState&&(e.baseState=!1,ra=!0),e.memoizedState=a)}function A0(e,t){var a=Xe;Xe=a!==0&&4>a?a:4,e(!0);var n=kc.transition;kc.transition={};try{e(!1),t()}finally{Xe=a,kc.transition=n}}function mg(){return Ea().memoizedState}function j0(e,t,a){var n=Xn(e);if(a={lane:n,action:a,hasEagerState:!1,eagerState:null,next:null},gg(e))hg(t,a);else if(a=Hm(e,t,a,n),a!==null){var r=ea();Fa(a,e,n,r),vg(a,t,n)}}function D0(e,t,a){var n=Xn(e),r={lane:n,action:a,hasEagerState:!1,eagerState:null,next:null};if(gg(e))hg(t,r);else{var s=e.alternate;if(e.lanes===0&&(s===null||s.lanes===0)&&(s=t.lastRenderedReducer,s!==null))try{var o=t.lastRenderedState,i=s(o,a);if(r.hasEagerState=!0,r.eagerState=i,Da(i,o)){var l=t.interleaved;l===null?(r.next=r,hc(t)):(r.next=l.next,l.next=r),t.interleaved=r;return}}catch{}finally{}a=Hm(e,t,r,n),a!==null&&(r=ea(),Fa(a,e,n,r),vg(a,t,n))}}function gg(e){var t=e.alternate;return e===gt||t!==null&&t===gt}function hg(e,t){uo=_i=!0;var a=e.pending;a===null?t.next=t:(t.next=a.next,a.next=t),e.pending=t}function vg(e,t,a){if(a&4194240){var n=t.lanes;n&=e.pendingLanes,a|=n,t.lanes=a,Id(e,a)}}var Ai={readContext:Ca,useCallback:Gt,useContext:Gt,useEffect:Gt,useImperativeHandle:Gt,useInsertionEffect:Gt,useLayoutEffect:Gt,useMemo:Gt,useReducer:Gt,useRef:Gt,useState:Gt,useDebugValue:Gt,useDeferredValue:Gt,useTransition:Gt,useMutableSource:Gt,useSyncExternalStore:Gt,useId:Gt,unstable_isNewReconciler:!1},O0={readContext:Ca,useCallback:function(e,t){return Ya().memoizedState=[e,t===void 0?null:t],e},useContext:Ca,useEffect:og,useImperativeHandle:function(e,t,a){return a=a!=null?a.concat([e]):null,Ii(4194308,4,dg.bind(null,t,e),a)},useLayoutEffect:function(e,t){return Ii(4194308,4,e,t)},useInsertionEffect:function(e,t){return Ii(4,2,e,t)},useMemo:function(e,t){var a=Ya();return t=t===void 0?null:t,e=e(),a.memoizedState=[e,t],e},useReducer:function(e,t,a){var n=Ya();return t=a!==void 0?a(t):t,n.memoizedState=n.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},n.queue=e,e=e.dispatch=j0.bind(null,gt,e),[n.memoizedState,e]},useRef:function(e){var t=Ya();return e={current:e},t.memoizedState=e},useState:sg,useDebugValue:Pc,useDeferredValue:function(e){return Ya().memoizedState=e},useTransition:function(){var e=sg(!1),t=e[0];return e=A0.bind(null,e[1]),Ya().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,a){var n=gt,r=Ya();if(ut){if(a===void 0)throw Error(re(407));a=a()}else{if(a=t(),Mt===null)throw Error(re(349));ys&30||Jm(n,t,a)}r.memoizedState=a;var s={value:a,getSnapshot:t};return r.queue=s,og(tg.bind(null,n,s,e),[e]),n.flags|=2048,mo(9,eg.bind(null,n,s,a,t),void 0,null),a},useId:function(){var e=Ya(),t=Mt.identifierPrefix;if(ut){var a=un,n=cn;a=(n&~(1<<32-ja(n)-1)).toString(32)+a,t=":"+t+"R"+a,a=po++,0<a&&(t+="H"+a.toString(32)),t+=":"}else a=R0++,t=":"+t+"r"+a.toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},L0={readContext:Ca,useCallback:ug,useContext:Ca,useEffect:Tc,useImperativeHandle:cg,useInsertionEffect:ig,useLayoutEffect:lg,useMemo:pg,useReducer:Ec,useRef:rg,useState:function(){return Ec(fo)},useDebugValue:Pc,useDeferredValue:function(e){var t=Ea();return fg(t,It.memoizedState,e)},useTransition:function(){var e=Ec(fo)[0],t=Ea().memoizedState;return[e,t]},useMutableSource:Xm,useSyncExternalStore:Zm,useId:mg,unstable_isNewReconciler:!1},M0={readContext:Ca,useCallback:ug,useContext:Ca,useEffect:Tc,useImperativeHandle:cg,useInsertionEffect:ig,useLayoutEffect:lg,useMemo:pg,useReducer:$c,useRef:rg,useState:function(){return $c(fo)},useDebugValue:Pc,useDeferredValue:function(e){var t=Ea();return It===null?t.memoizedState=e:fg(t,It.memoizedState,e)},useTransition:function(){var e=$c(fo)[0],t=Ea().memoizedState;return[e,t]},useMutableSource:Xm,useSyncExternalStore:Zm,useId:mg,unstable_isNewReconciler:!1};function La(e,t){if(e&&e.defaultProps){t=ft({},t),e=e.defaultProps;for(var a in e)t[a]===void 0&&(t[a]=e[a]);return t}return t}function _c(e,t,a,n){t=e.memoizedState,a=a(n,t),a=a==null?t:ft({},t,a),e.memoizedState=a,e.lanes===0&&(e.updateQueue.baseState=a)}var ji={isMounted:function(e){return(e=e._reactInternals)?ps(e)===e:!1},enqueueSetState:function(e,t,a){e=e._reactInternals;var n=ea(),r=Xn(e),s=fn(n,r);s.payload=t,a!=null&&(s.callback=a),t=Gn(e,s,r),t!==null&&(Fa(t,e,r,n),Ei(t,e,r))},enqueueReplaceState:function(e,t,a){e=e._reactInternals;var n=ea(),r=Xn(e),s=fn(n,r);s.tag=1,s.payload=t,a!=null&&(s.callback=a),t=Gn(e,s,r),t!==null&&(Fa(t,e,r,n),Ei(t,e,r))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var a=ea(),n=Xn(e),r=fn(a,n);r.tag=2,t!=null&&(r.callback=t),t=Gn(e,r,n),t!==null&&(Fa(t,e,n,a),Ei(t,e,n))}};function bg(e,t,a,n,r,s,o){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(n,s,o):t.prototype&&t.prototype.isPureReactComponent?!Jr(a,n)||!Jr(r,s):!0}function yg(e,t,a){var n=!1,r=Vn,s=t.contextType;return typeof s=="object"&&s!==null?s=Ca(s):(r=sa(t)?ms:Ht.current,n=t.contextTypes,s=(n=n!=null)?Qs(e,r):Vn),t=new t(a,s),e.memoizedState=t.state!==null&&t.state!==void 0?t.state:null,t.updater=ji,e.stateNode=t,t._reactInternals=e,n&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=r,e.__reactInternalMemoizedMaskedChildContext=s),t}function xg(e,t,a,n){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(a,n),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(a,n),t.state!==e&&ji.enqueueReplaceState(t,t.state,null)}function Ic(e,t,a,n){var r=e.stateNode;r.props=a,r.state=e.memoizedState,r.refs={},vc(e);var s=t.contextType;typeof s=="object"&&s!==null?r.context=Ca(s):(s=sa(t)?ms:Ht.current,r.context=Qs(e,s)),r.state=e.memoizedState,s=t.getDerivedStateFromProps,typeof s=="function"&&(_c(e,t,s,a),r.state=e.memoizedState),typeof t.getDerivedStateFromProps=="function"||typeof r.getSnapshotBeforeUpdate=="function"||typeof r.UNSAFE_componentWillMount!="function"&&typeof r.componentWillMount!="function"||(t=r.state,typeof r.componentWillMount=="function"&&r.componentWillMount(),typeof r.UNSAFE_componentWillMount=="function"&&r.UNSAFE_componentWillMount(),t!==r.state&&ji.enqueueReplaceState(r,r.state,null),$i(e,a,r,n),r.state=e.memoizedState),typeof r.componentDidMount=="function"&&(e.flags|=4194308)}function sr(e,t){try{var a="",n=t;do a+=pw(n),n=n.return;while(n);var r=a}catch(s){r=`
|
|
853
853
|
Error generating stack: `+s.message+`
|
|
854
|
-
`+s.stack}return{value:e,source:t,stack:r,digest:null}}function Rc(e,t,a){return{value:e,source:null,stack:a??null,digest:t??null}}function Ac(e,t){try{console.error(t.value)}catch(a){setTimeout(function(){throw a})}}var M0=typeof WeakMap=="function"?WeakMap:Map;function wg(e,t,a){a=fn(-1,a),a.tag=3,a.payload={element:null};var n=t.value;return a.callback=function(){Bi||(Bi=!0,Kc=n),Ac(e,t)},a}function kg(e,t,a){a=fn(-1,a),a.tag=3;var n=e.type.getDerivedStateFromError;if(typeof n=="function"){var r=t.value;a.payload=function(){return n(r)},a.callback=function(){Ac(e,t)}}var s=e.stateNode;return s!==null&&typeof s.componentDidCatch=="function"&&(a.callback=function(){Ac(e,t),typeof n!="function"&&(Kn===null?Kn=new Set([this]):Kn.add(this));var o=t.stack;this.componentDidCatch(t.value,{componentStack:o!==null?o:""})}),a}function Ng(e,t,a){var n=e.pingCache;if(n===null){n=e.pingCache=new M0;var r=new Set;n.set(t,r)}else r=n.get(t),r===void 0&&(r=new Set,n.set(t,r));r.has(a)||(r.add(a),e=Z0.bind(null,e,t,a),t.then(e,e))}function Sg(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function Cg(e,t,a,n,r){return e.mode&1?(e.flags|=65536,e.lanes=r,e):(e===t?e.flags|=65536:(e.flags|=128,a.flags|=131072,a.flags&=-52805,a.tag===1&&(a.alternate===null?a.tag=17:(t=fn(-1,1),t.tag=2,Hn(a,t,1))),a.lanes|=1),e)}var z0=on.ReactCurrentOwner,sa=!1;function Jt(e,t,a,n){t.child=e===null?Wm(t,null,a,n):er(t,e.child,a,n)}function Eg(e,t,a,n,r){a=a.render;var s=t.ref;return ar(t,r),n=Sc(e,t,a,n,s,r),a=Cc(),e!==null&&!sa?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~r,mn(e,t,r)):(ut&&a&&ic(t),t.flags|=1,Jt(e,t,n,r),t.child)}function $g(e,t,a,n,r){if(e===null){var s=a.type;return typeof s=="function"&&!tu(s)&&s.defaultProps===void 0&&a.compare===null&&a.defaultProps===void 0?(t.tag=15,t.type=s,Tg(e,t,s,n,r)):(e=Gi(a.type,null,n,t,t.mode,r),e.ref=t.ref,e.return=t,t.child=e)}if(s=e.child,!(e.lanes&r)){var o=s.memoizedProps;if(a=a.compare,a=a!==null?a:Jr,a(o,n)&&e.ref===t.ref)return mn(e,t,r)}return t.flags|=1,e=Zn(s,n),e.ref=t.ref,e.return=t,t.child=e}function Tg(e,t,a,n,r){if(e!==null){var s=e.memoizedProps;if(Jr(s,n)&&e.ref===t.ref)if(sa=!1,t.pendingProps=n=s,(e.lanes&r)!==0)e.flags&131072&&(sa=!0);else return t.lanes=e.lanes,mn(e,t,r)}return jc(e,t,a,n,r)}function Pg(e,t,a){var n=t.pendingProps,r=n.children,s=e!==null?e.memoizedState:null;if(n.mode==="hidden")if(!(t.mode&1))t.memoizedState={baseLanes:0,cachePool:null,transitions:null},ot(or,ha),ha|=a;else{if(!(a&1073741824))return e=s!==null?s.baseLanes|a:a,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,ot(or,ha),ha|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},n=s!==null?s.baseLanes:a,ot(or,ha),ha|=n}else s!==null?(n=s.baseLanes|a,t.memoizedState=null):n=a,ot(or,ha),ha|=n;return Jt(e,t,r,a),t.child}function _g(e,t){var a=t.ref;(e===null&&a!==null||e!==null&&e.ref!==a)&&(t.flags|=512,t.flags|=2097152)}function jc(e,t,a,n,r){var s=na(a)?ms:Ht.current;return s=Qs(t,s),ar(t,r),a=Sc(e,t,a,n,s,r),n=Cc(),e!==null&&!sa?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~r,mn(e,t,r)):(ut&&n&&ic(t),t.flags|=1,Jt(e,t,a,r),t.child)}function Ig(e,t,a,n,r){if(na(a)){var s=!0;bi(t)}else s=!1;if(ar(t,r),t.stateNode===null)Oi(e,t),yg(t,a,n),Ic(t,a,n,r),n=!0;else if(e===null){var o=t.stateNode,i=t.memoizedProps;o.props=i;var l=o.context,c=a.contextType;typeof c=="object"&&c!==null?c=Ca(c):(c=na(a)?ms:Ht.current,c=Qs(t,c));var u=a.getDerivedStateFromProps,p=typeof u=="function"||typeof o.getSnapshotBeforeUpdate=="function";p||typeof o.UNSAFE_componentWillReceiveProps!="function"&&typeof o.componentWillReceiveProps!="function"||(i!==n||l!==c)&&xg(t,o,n,c),Wn=!1;var f=t.memoizedState;o.state=f,$i(t,n,o,r),l=t.memoizedState,i!==n||f!==l||aa.current||Wn?(typeof u=="function"&&(_c(t,a,u,n),l=t.memoizedState),(i=Wn||bg(t,a,i,n,f,l,c))?(p||typeof o.UNSAFE_componentWillMount!="function"&&typeof o.componentWillMount!="function"||(typeof o.componentWillMount=="function"&&o.componentWillMount(),typeof o.UNSAFE_componentWillMount=="function"&&o.UNSAFE_componentWillMount()),typeof o.componentDidMount=="function"&&(t.flags|=4194308)):(typeof o.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=n,t.memoizedState=l),o.props=n,o.state=l,o.context=c,n=i):(typeof o.componentDidMount=="function"&&(t.flags|=4194308),n=!1)}else{o=t.stateNode,Gm(e,t),i=t.memoizedProps,c=t.type===t.elementType?i:La(t.type,i),o.props=c,p=t.pendingProps,f=o.context,l=a.contextType,typeof l=="object"&&l!==null?l=Ca(l):(l=na(a)?ms:Ht.current,l=Qs(t,l));var v=a.getDerivedStateFromProps;(u=typeof v=="function"||typeof o.getSnapshotBeforeUpdate=="function")||typeof o.UNSAFE_componentWillReceiveProps!="function"&&typeof o.componentWillReceiveProps!="function"||(i!==p||f!==l)&&xg(t,o,n,l),Wn=!1,f=t.memoizedState,o.state=f,$i(t,n,o,r);var x=t.memoizedState;i!==p||f!==x||aa.current||Wn?(typeof v=="function"&&(_c(t,a,v,n),x=t.memoizedState),(c=Wn||bg(t,a,c,n,f,x,l)||!1)?(u||typeof o.UNSAFE_componentWillUpdate!="function"&&typeof o.componentWillUpdate!="function"||(typeof o.componentWillUpdate=="function"&&o.componentWillUpdate(n,x,l),typeof o.UNSAFE_componentWillUpdate=="function"&&o.UNSAFE_componentWillUpdate(n,x,l)),typeof o.componentDidUpdate=="function"&&(t.flags|=4),typeof o.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof o.componentDidUpdate!="function"||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),typeof o.getSnapshotBeforeUpdate!="function"||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),t.memoizedProps=n,t.memoizedState=x),o.props=n,o.state=x,o.context=l,n=c):(typeof o.componentDidUpdate!="function"||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),typeof o.getSnapshotBeforeUpdate!="function"||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),n=!1)}return Dc(e,t,a,n,s,r)}function Dc(e,t,a,n,r,s){_g(e,t);var o=(t.flags&128)!==0;if(!n&&!o)return r&&Om(t,a,!1),mn(e,t,s);n=t.stateNode,z0.current=t;var i=o&&typeof a.getDerivedStateFromError!="function"?null:n.render();return t.flags|=1,e!==null&&o?(t.child=er(t,e.child,null,s),t.child=er(t,null,i,s)):Jt(e,t,i,s),t.memoizedState=n.state,r&&Om(t,a,!0),t.child}function Rg(e){var t=e.stateNode;t.pendingContext?jm(e,t.pendingContext,t.pendingContext!==t.context):t.context&&jm(e,t.context,!1),bc(e,t.containerInfo)}function Ag(e,t,a,n,r){return Js(),uc(r),t.flags|=256,Jt(e,t,a,n),t.child}var Oc={dehydrated:null,treeContext:null,retryLane:0};function Lc(e){return{baseLanes:e,cachePool:null,transitions:null}}function jg(e,t,a){var n=t.pendingProps,r=mt.current,s=!1,o=(t.flags&128)!==0,i;if((i=o)||(i=e!==null&&e.memoizedState===null?!1:(r&2)!==0),i?(s=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(r|=1),ot(mt,r&1),e===null)return cc(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?(t.mode&1?e.data==="$!"?t.lanes=8:t.lanes=1073741824:t.lanes=1,null):(o=n.children,e=n.fallback,s?(n=t.mode,s=t.child,o={mode:"hidden",children:o},!(n&1)&&s!==null?(s.childLanes=0,s.pendingProps=o):s=Ki(o,n,0,null),e=Ss(e,n,a,null),s.return=t,e.return=t,s.sibling=e,t.child=s,t.child.memoizedState=Lc(a),t.memoizedState=Oc,e):Mc(t,o));if(r=e.memoizedState,r!==null&&(i=r.dehydrated,i!==null))return F0(e,t,o,n,i,r,a);if(s){s=n.fallback,o=t.mode,r=e.child,i=r.sibling;var l={mode:"hidden",children:n.children};return!(o&1)&&t.child!==r?(n=t.child,n.childLanes=0,n.pendingProps=l,t.deletions=null):(n=Zn(r,l),n.subtreeFlags=r.subtreeFlags&14680064),i!==null?s=Zn(i,s):(s=Ss(s,o,a,null),s.flags|=2),s.return=t,n.return=t,n.sibling=s,t.child=n,n=s,s=t.child,o=e.child.memoizedState,o=o===null?Lc(a):{baseLanes:o.baseLanes|a,cachePool:null,transitions:o.transitions},s.memoizedState=o,s.childLanes=e.childLanes&~a,t.memoizedState=Oc,n}return s=e.child,e=s.sibling,n=Zn(s,{mode:"visible",children:n.children}),!(t.mode&1)&&(n.lanes=a),n.return=t,n.sibling=null,e!==null&&(a=t.deletions,a===null?(t.deletions=[e],t.flags|=16):a.push(e)),t.child=n,t.memoizedState=null,n}function Mc(e,t){return t=Ki({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function Di(e,t,a,n){return n!==null&&uc(n),er(t,e.child,null,a),e=Mc(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function F0(e,t,a,n,r,s,o){if(a)return t.flags&256?(t.flags&=-257,n=Rc(Error(se(422))),Di(e,t,o,n)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(s=n.fallback,r=t.mode,n=Ki({mode:"visible",children:n.children},r,0,null),s=Ss(s,r,o,null),s.flags|=2,n.return=t,s.return=t,n.sibling=s,t.child=n,t.mode&1&&er(t,e.child,null,o),t.child.memoizedState=Lc(o),t.memoizedState=Oc,s);if(!(t.mode&1))return Di(e,t,o,null);if(r.data==="$!"){if(n=r.nextSibling&&r.nextSibling.dataset,n)var i=n.dgst;return n=i,s=Error(se(419)),n=Rc(s,n,void 0),Di(e,t,o,n)}if(i=(o&e.childLanes)!==0,sa||i){if(n=Mt,n!==null){switch(o&-o){case 4:r=2;break;case 16:r=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:r=32;break;case 536870912:r=268435456;break;default:r=0}r=r&(n.suspendedLanes|o)?0:r,r!==0&&r!==s.retryLane&&(s.retryLane=r,pn(e,r),Fa(n,e,r,-1))}return eu(),n=Rc(Error(se(421))),Di(e,t,o,n)}return r.data==="$?"?(t.flags|=128,t.child=e.child,t=J0.bind(null,e),r._reactRetry=t,null):(e=s.treeContext,ga=Bn(r.nextSibling),ma=t,ut=!0,Oa=null,e!==null&&(Na[Sa++]=cn,Na[Sa++]=un,Na[Sa++]=gs,cn=e.id,un=e.overflow,gs=t),t=Mc(t,n.children),t.flags|=4096,t)}function Dg(e,t,a){e.lanes|=t;var n=e.alternate;n!==null&&(n.lanes|=t),gc(e.return,t,a)}function zc(e,t,a,n,r){var s=e.memoizedState;s===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:n,tail:a,tailMode:r}:(s.isBackwards=t,s.rendering=null,s.renderingStartTime=0,s.last=n,s.tail=a,s.tailMode=r)}function Og(e,t,a){var n=t.pendingProps,r=n.revealOrder,s=n.tail;if(Jt(e,t,n.children,a),n=mt.current,n&2)n=n&1|2,t.flags|=128;else{if(e!==null&&e.flags&128)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&Dg(e,a,t);else if(e.tag===19)Dg(e,a,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}n&=1}if(ot(mt,n),!(t.mode&1))t.memoizedState=null;else switch(r){case"forwards":for(a=t.child,r=null;a!==null;)e=a.alternate,e!==null&&Ti(e)===null&&(r=a),a=a.sibling;a=r,a===null?(r=t.child,t.child=null):(r=a.sibling,a.sibling=null),zc(t,!1,r,a,s);break;case"backwards":for(a=null,r=t.child,t.child=null;r!==null;){if(e=r.alternate,e!==null&&Ti(e)===null){t.child=r;break}e=r.sibling,r.sibling=a,a=r,r=e}zc(t,!0,a,null,s);break;case"together":zc(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Oi(e,t){!(t.mode&1)&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function mn(e,t,a){if(e!==null&&(t.dependencies=e.dependencies),xs|=t.lanes,!(a&t.childLanes))return null;if(e!==null&&t.child!==e.child)throw Error(se(153));if(t.child!==null){for(e=t.child,a=Zn(e,e.pendingProps),t.child=a,a.return=t;e.sibling!==null;)e=e.sibling,a=a.sibling=Zn(e,e.pendingProps),a.return=t;a.sibling=null}return t.child}function B0(e,t,a){switch(t.tag){case 3:Rg(t),Js();break;case 5:Qm(t);break;case 1:na(t.type)&&bi(t);break;case 4:bc(t,t.stateNode.containerInfo);break;case 10:var n=t.type._context,r=t.memoizedProps.value;ot(Si,n._currentValue),n._currentValue=r;break;case 13:if(n=t.memoizedState,n!==null)return n.dehydrated!==null?(ot(mt,mt.current&1),t.flags|=128,null):a&t.child.childLanes?jg(e,t,a):(ot(mt,mt.current&1),e=mn(e,t,a),e!==null?e.sibling:null);ot(mt,mt.current&1);break;case 19:if(n=(a&t.childLanes)!==0,e.flags&128){if(n)return Og(e,t,a);t.flags|=128}if(r=t.memoizedState,r!==null&&(r.rendering=null,r.tail=null,r.lastEffect=null),ot(mt,mt.current),n)break;return null;case 22:case 23:return t.lanes=0,Pg(e,t,a)}return mn(e,t,a)}var Lg,Fc,Mg,zg;Lg=function(e,t){for(var a=t.child;a!==null;){if(a.tag===5||a.tag===6)e.appendChild(a.stateNode);else if(a.tag!==4&&a.child!==null){a.child.return=a,a=a.child;continue}if(a===t)break;for(;a.sibling===null;){if(a.return===null||a.return===t)return;a=a.return}a.sibling.return=a.return,a=a.sibling}},Fc=function(){},Mg=function(e,t,a,n){var r=e.memoizedProps;if(r!==n){e=t.stateNode,bs(Ka.current);var s=null;switch(a){case"input":r=gd(e,r),n=gd(e,n),s=[];break;case"select":r=ft({},r,{value:void 0}),n=ft({},n,{value:void 0}),s=[];break;case"textarea":r=bd(e,r),n=bd(e,n),s=[];break;default:typeof r.onClick!="function"&&typeof n.onClick=="function"&&(e.onclick=gi)}xd(a,n);var o;a=null;for(c in r)if(!n.hasOwnProperty(c)&&r.hasOwnProperty(c)&&r[c]!=null)if(c==="style"){var i=r[c];for(o in i)i.hasOwnProperty(o)&&(a||(a={}),a[o]="")}else c!=="dangerouslySetInnerHTML"&&c!=="children"&&c!=="suppressContentEditableWarning"&&c!=="suppressHydrationWarning"&&c!=="autoFocus"&&(Rr.hasOwnProperty(c)?s||(s=[]):(s=s||[]).push(c,null));for(c in n){var l=n[c];if(i=r?.[c],n.hasOwnProperty(c)&&l!==i&&(l!=null||i!=null))if(c==="style")if(i){for(o in i)!i.hasOwnProperty(o)||l&&l.hasOwnProperty(o)||(a||(a={}),a[o]="");for(o in l)l.hasOwnProperty(o)&&i[o]!==l[o]&&(a||(a={}),a[o]=l[o])}else a||(s||(s=[]),s.push(c,a)),a=l;else c==="dangerouslySetInnerHTML"?(l=l?l.__html:void 0,i=i?i.__html:void 0,l!=null&&i!==l&&(s=s||[]).push(c,l)):c==="children"?typeof l!="string"&&typeof l!="number"||(s=s||[]).push(c,""+l):c!=="suppressContentEditableWarning"&&c!=="suppressHydrationWarning"&&(Rr.hasOwnProperty(c)?(l!=null&&c==="onScroll"&&it("scroll",e),s||i===l||(s=[])):(s=s||[]).push(c,l))}a&&(s=s||[]).push("style",a);var c=s;(t.updateQueue=c)&&(t.flags|=4)}},zg=function(e,t,a,n){a!==n&&(t.flags|=4)};function go(e,t){if(!ut)switch(e.tailMode){case"hidden":t=e.tail;for(var a=null;t!==null;)t.alternate!==null&&(a=t),t=t.sibling;a===null?e.tail=null:a.sibling=null;break;case"collapsed":a=e.tail;for(var n=null;a!==null;)a.alternate!==null&&(n=a),a=a.sibling;n===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:n.sibling=null}}function Kt(e){var t=e.alternate!==null&&e.alternate.child===e.child,a=0,n=0;if(t)for(var r=e.child;r!==null;)a|=r.lanes|r.childLanes,n|=r.subtreeFlags&14680064,n|=r.flags&14680064,r.return=e,r=r.sibling;else for(r=e.child;r!==null;)a|=r.lanes|r.childLanes,n|=r.subtreeFlags,n|=r.flags,r.return=e,r=r.sibling;return e.subtreeFlags|=n,e.childLanes=a,t}function U0(e,t,a){var n=t.pendingProps;switch(lc(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Kt(t),null;case 1:return na(t.type)&&vi(),Kt(t),null;case 3:return n=t.stateNode,nr(),lt(aa),lt(Ht),wc(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),(e===null||e.child===null)&&(ki(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&!(t.flags&256)||(t.flags|=1024,Oa!==null&&(Xc(Oa),Oa=null))),Fc(e,t),Kt(t),null;case 5:yc(t);var r=bs(co.current);if(a=t.type,e!==null&&t.stateNode!=null)Mg(e,t,a,n,r),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!n){if(t.stateNode===null)throw Error(se(166));return Kt(t),null}if(e=bs(Ka.current),ki(t)){n=t.stateNode,a=t.type;var s=t.memoizedProps;switch(n[Ga]=t,n[so]=s,e=(t.mode&1)!==0,a){case"dialog":it("cancel",n),it("close",n);break;case"iframe":case"object":case"embed":it("load",n);break;case"video":case"audio":for(r=0;r<to.length;r++)it(to[r],n);break;case"source":it("error",n);break;case"img":case"image":case"link":it("error",n),it("load",n);break;case"details":it("toggle",n);break;case"input":yf(n,s),it("invalid",n);break;case"select":n._wrapperState={wasMultiple:!!s.multiple},it("invalid",n);break;case"textarea":kf(n,s),it("invalid",n)}xd(a,s),r=null;for(var o in s)if(s.hasOwnProperty(o)){var i=s[o];o==="children"?typeof i=="string"?n.textContent!==i&&(s.suppressHydrationWarning!==!0&&mi(n.textContent,i,e),r=["children",i]):typeof i=="number"&&n.textContent!==""+i&&(s.suppressHydrationWarning!==!0&&mi(n.textContent,i,e),r=["children",""+i]):Rr.hasOwnProperty(o)&&i!=null&&o==="onScroll"&&it("scroll",n)}switch(a){case"input":Wo(n),wf(n,s,!0);break;case"textarea":Wo(n),Sf(n);break;case"select":case"option":break;default:typeof s.onClick=="function"&&(n.onclick=gi)}n=r,t.updateQueue=n,n!==null&&(t.flags|=4)}else{o=r.nodeType===9?r:r.ownerDocument,e==="http://www.w3.org/1999/xhtml"&&(e=Cf(a)),e==="http://www.w3.org/1999/xhtml"?a==="script"?(e=o.createElement("div"),e.innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):typeof n.is=="string"?e=o.createElement(a,{is:n.is}):(e=o.createElement(a),a==="select"&&(o=e,n.multiple?o.multiple=!0:n.size&&(o.size=n.size))):e=o.createElementNS(e,a),e[Ga]=t,e[so]=n,Lg(e,t,!1,!1),t.stateNode=e;e:{switch(o=wd(a,n),a){case"dialog":it("cancel",e),it("close",e),r=n;break;case"iframe":case"object":case"embed":it("load",e),r=n;break;case"video":case"audio":for(r=0;r<to.length;r++)it(to[r],e);r=n;break;case"source":it("error",e),r=n;break;case"img":case"image":case"link":it("error",e),it("load",e),r=n;break;case"details":it("toggle",e),r=n;break;case"input":yf(e,n),r=gd(e,n),it("invalid",e);break;case"option":r=n;break;case"select":e._wrapperState={wasMultiple:!!n.multiple},r=ft({},n,{value:void 0}),it("invalid",e);break;case"textarea":kf(e,n),r=bd(e,n),it("invalid",e);break;default:r=n}xd(a,r),i=r;for(s in i)if(i.hasOwnProperty(s)){var l=i[s];s==="style"?Tf(e,l):s==="dangerouslySetInnerHTML"?(l=l?l.__html:void 0,l!=null&&Ef(e,l)):s==="children"?typeof l=="string"?(a!=="textarea"||l!=="")&&Or(e,l):typeof l=="number"&&Or(e,""+l):s!=="suppressContentEditableWarning"&&s!=="suppressHydrationWarning"&&s!=="autoFocus"&&(Rr.hasOwnProperty(s)?l!=null&&s==="onScroll"&&it("scroll",e):l!=null&&sd(e,s,l,o))}switch(a){case"input":Wo(e),wf(e,n,!1);break;case"textarea":Wo(e),Sf(e);break;case"option":n.value!=null&&e.setAttribute("value",""+jn(n.value));break;case"select":e.multiple=!!n.multiple,s=n.value,s!=null?Ms(e,!!n.multiple,s,!1):n.defaultValue!=null&&Ms(e,!!n.multiple,n.defaultValue,!0);break;default:typeof r.onClick=="function"&&(e.onclick=gi)}switch(a){case"button":case"input":case"select":case"textarea":n=!!n.autoFocus;break e;case"img":n=!0;break e;default:n=!1}}n&&(t.flags|=4)}t.ref!==null&&(t.flags|=512,t.flags|=2097152)}return Kt(t),null;case 6:if(e&&t.stateNode!=null)zg(e,t,e.memoizedProps,n);else{if(typeof n!="string"&&t.stateNode===null)throw Error(se(166));if(a=bs(co.current),bs(Ka.current),ki(t)){if(n=t.stateNode,a=t.memoizedProps,n[Ga]=t,(s=n.nodeValue!==a)&&(e=ma,e!==null))switch(e.tag){case 3:mi(n.nodeValue,a,(e.mode&1)!==0);break;case 5:e.memoizedProps.suppressHydrationWarning!==!0&&mi(n.nodeValue,a,(e.mode&1)!==0)}s&&(t.flags|=4)}else n=(a.nodeType===9?a:a.ownerDocument).createTextNode(n),n[Ga]=t,t.stateNode=n}return Kt(t),null;case 13:if(lt(mt),n=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(ut&&ga!==null&&t.mode&1&&!(t.flags&128))Um(),Js(),t.flags|=98560,s=!1;else if(s=ki(t),n!==null&&n.dehydrated!==null){if(e===null){if(!s)throw Error(se(318));if(s=t.memoizedState,s=s!==null?s.dehydrated:null,!s)throw Error(se(317));s[Ga]=t}else Js(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Kt(t),s=!1}else Oa!==null&&(Xc(Oa),Oa=null),s=!0;if(!s)return t.flags&65536?t:null}return t.flags&128?(t.lanes=a,t):(n=n!==null,n!==(e!==null&&e.memoizedState!==null)&&n&&(t.child.flags|=8192,t.mode&1&&(e===null||mt.current&1?Rt===0&&(Rt=3):eu())),t.updateQueue!==null&&(t.flags|=4),Kt(t),null);case 4:return nr(),Fc(e,t),e===null&&ao(t.stateNode.containerInfo),Kt(t),null;case 10:return mc(t.type._context),Kt(t),null;case 17:return na(t.type)&&vi(),Kt(t),null;case 19:if(lt(mt),s=t.memoizedState,s===null)return Kt(t),null;if(n=(t.flags&128)!==0,o=s.rendering,o===null)if(n)go(s,!1);else{if(Rt!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=Ti(e),o!==null){for(t.flags|=128,go(s,!1),n=o.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),t.subtreeFlags=0,n=a,a=t.child;a!==null;)s=a,e=n,s.flags&=14680066,o=s.alternate,o===null?(s.childLanes=0,s.lanes=e,s.child=null,s.subtreeFlags=0,s.memoizedProps=null,s.memoizedState=null,s.updateQueue=null,s.dependencies=null,s.stateNode=null):(s.childLanes=o.childLanes,s.lanes=o.lanes,s.child=o.child,s.subtreeFlags=0,s.deletions=null,s.memoizedProps=o.memoizedProps,s.memoizedState=o.memoizedState,s.updateQueue=o.updateQueue,s.type=o.type,e=o.dependencies,s.dependencies=e===null?null:{lanes:e.lanes,firstContext:e.firstContext}),a=a.sibling;return ot(mt,mt.current&1|2),t.child}e=e.sibling}s.tail!==null&&wt()>ir&&(t.flags|=128,n=!0,go(s,!1),t.lanes=4194304)}else{if(!n)if(e=Ti(o),e!==null){if(t.flags|=128,n=!0,a=e.updateQueue,a!==null&&(t.updateQueue=a,t.flags|=4),go(s,!0),s.tail===null&&s.tailMode==="hidden"&&!o.alternate&&!ut)return Kt(t),null}else 2*wt()-s.renderingStartTime>ir&&a!==1073741824&&(t.flags|=128,n=!0,go(s,!1),t.lanes=4194304);s.isBackwards?(o.sibling=t.child,t.child=o):(a=s.last,a!==null?a.sibling=o:t.child=o,s.last=o)}return s.tail!==null?(t=s.tail,s.rendering=t,s.tail=t.sibling,s.renderingStartTime=wt(),t.sibling=null,a=mt.current,ot(mt,n?a&1|2:a&1),t):(Kt(t),null);case 22:case 23:return Jc(),n=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==n&&(t.flags|=8192),n&&t.mode&1?ha&1073741824&&(Kt(t),t.subtreeFlags&6&&(t.flags|=8192)):Kt(t),null;case 24:return null;case 25:return null}throw Error(se(156,t.tag))}function q0(e,t){switch(lc(t),t.tag){case 1:return na(t.type)&&vi(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return nr(),lt(aa),lt(Ht),wc(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return yc(t),null;case 13:if(lt(mt),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(se(340));Js()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return lt(mt),null;case 4:return nr(),null;case 10:return mc(t.type._context),null;case 22:case 23:return Jc(),null;case 24:return null;default:return null}}var Li=!1,Yt=!1,V0=typeof WeakSet=="function"?WeakSet:Set,ue=null;function rr(e,t){var a=e.ref;if(a!==null)if(typeof a=="function")try{a(null)}catch(n){bt(e,t,n)}else a.current=null}function Bc(e,t,a){try{a()}catch(n){bt(e,t,n)}}var Fg=!1;function W0(e,t){if(Jd=ni,e=bm(),Wd(e)){if("selectionStart"in e)var a={start:e.selectionStart,end:e.selectionEnd};else e:{a=(a=e.ownerDocument)&&a.defaultView||window;var n=a.getSelection&&a.getSelection();if(n&&n.rangeCount!==0){a=n.anchorNode;var r=n.anchorOffset,s=n.focusNode;n=n.focusOffset;try{a.nodeType,s.nodeType}catch{a=null;break e}var o=0,i=-1,l=-1,c=0,u=0,p=e,f=null;t:for(;;){for(var v;p!==a||r!==0&&p.nodeType!==3||(i=o+r),p!==s||n!==0&&p.nodeType!==3||(l=o+n),p.nodeType===3&&(o+=p.nodeValue.length),(v=p.firstChild)!==null;)f=p,p=v;for(;;){if(p===e)break t;if(f===a&&++c===r&&(i=o),f===s&&++u===n&&(l=o),(v=p.nextSibling)!==null)break;p=f,f=p.parentNode}p=v}a=i===-1||l===-1?null:{start:i,end:l}}else a=null}a=a||{start:0,end:0}}else a=null;for(ec={focusedElem:e,selectionRange:a},ni=!1,ue=t;ue!==null;)if(t=ue,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,ue=e;else for(;ue!==null;){t=ue;try{var x=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(x!==null){var b=x.memoizedProps,k=x.memoizedState,g=t.stateNode,d=g.getSnapshotBeforeUpdate(t.elementType===t.type?b:La(t.type,b),k);g.__reactInternalSnapshotBeforeUpdate=d}break;case 3:var h=t.stateNode.containerInfo;h.nodeType===1?h.textContent="":h.nodeType===9&&h.documentElement&&h.removeChild(h.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(se(163))}}catch(y){bt(t,t.return,y)}if(e=t.sibling,e!==null){e.return=t.return,ue=e;break}ue=t.return}return x=Fg,Fg=!1,x}function ho(e,t,a){var n=t.updateQueue;if(n=n!==null?n.lastEffect:null,n!==null){var r=n=n.next;do{if((r.tag&e)===e){var s=r.destroy;r.destroy=void 0,s!==void 0&&Bc(t,a,s)}r=r.next}while(r!==n)}}function Mi(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var a=t=t.next;do{if((a.tag&e)===e){var n=a.create;a.destroy=n()}a=a.next}while(a!==t)}}function Uc(e){var t=e.ref;if(t!==null){var a=e.stateNode;switch(e.tag){case 5:e=a;break;default:e=a}typeof t=="function"?t(e):t.current=e}}function Bg(e){var t=e.alternate;t!==null&&(e.alternate=null,Bg(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Ga],delete t[so],delete t[sc],delete t[$0],delete t[T0])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Ug(e){return e.tag===5||e.tag===3||e.tag===4}function qg(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Ug(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function qc(e,t,a){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?a.nodeType===8?a.parentNode.insertBefore(e,t):a.insertBefore(e,t):(a.nodeType===8?(t=a.parentNode,t.insertBefore(e,a)):(t=a,t.appendChild(e)),a=a._reactRootContainer,a!=null||t.onclick!==null||(t.onclick=gi));else if(n!==4&&(e=e.child,e!==null))for(qc(e,t,a),e=e.sibling;e!==null;)qc(e,t,a),e=e.sibling}function Vc(e,t,a){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?a.insertBefore(e,t):a.appendChild(e);else if(n!==4&&(e=e.child,e!==null))for(Vc(e,t,a),e=e.sibling;e!==null;)Vc(e,t,a),e=e.sibling}var Ut=null,Ma=!1;function Gn(e,t,a){for(a=a.child;a!==null;)Vg(e,t,a),a=a.sibling}function Vg(e,t,a){if(Ha&&typeof Ha.onCommitFiberUnmount=="function")try{Ha.onCommitFiberUnmount(Xo,a)}catch{}switch(a.tag){case 5:Yt||rr(a,t);case 6:var n=Ut,r=Ma;Ut=null,Gn(e,t,a),Ut=n,Ma=r,Ut!==null&&(Ma?(e=Ut,a=a.stateNode,e.nodeType===8?e.parentNode.removeChild(a):e.removeChild(a)):Ut.removeChild(a.stateNode));break;case 18:Ut!==null&&(Ma?(e=Ut,a=a.stateNode,e.nodeType===8?nc(e.parentNode,a):e.nodeType===1&&nc(e,a),Gr(e)):nc(Ut,a.stateNode));break;case 4:n=Ut,r=Ma,Ut=a.stateNode.containerInfo,Ma=!0,Gn(e,t,a),Ut=n,Ma=r;break;case 0:case 11:case 14:case 15:if(!Yt&&(n=a.updateQueue,n!==null&&(n=n.lastEffect,n!==null))){r=n=n.next;do{var s=r,o=s.destroy;s=s.tag,o!==void 0&&(s&2||s&4)&&Bc(a,t,o),r=r.next}while(r!==n)}Gn(e,t,a);break;case 1:if(!Yt&&(rr(a,t),n=a.stateNode,typeof n.componentWillUnmount=="function"))try{n.props=a.memoizedProps,n.state=a.memoizedState,n.componentWillUnmount()}catch(i){bt(a,t,i)}Gn(e,t,a);break;case 21:Gn(e,t,a);break;case 22:a.mode&1?(Yt=(n=Yt)||a.memoizedState!==null,Gn(e,t,a),Yt=n):Gn(e,t,a);break;default:Gn(e,t,a)}}function Wg(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var a=e.stateNode;a===null&&(a=e.stateNode=new V0),t.forEach(function(n){var r=e1.bind(null,e,n);a.has(n)||(a.add(n),n.then(r,r))})}}function za(e,t){var a=t.deletions;if(a!==null)for(var n=0;n<a.length;n++){var r=a[n];try{var s=e,o=t,i=o;e:for(;i!==null;){switch(i.tag){case 5:Ut=i.stateNode,Ma=!1;break e;case 3:Ut=i.stateNode.containerInfo,Ma=!0;break e;case 4:Ut=i.stateNode.containerInfo,Ma=!0;break e}i=i.return}if(Ut===null)throw Error(se(160));Vg(s,o,r),Ut=null,Ma=!1;var l=r.alternate;l!==null&&(l.return=null),r.return=null}catch(c){bt(r,t,c)}}if(t.subtreeFlags&12854)for(t=t.child;t!==null;)Hg(t,e),t=t.sibling}function Hg(e,t){var a=e.alternate,n=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(za(t,e),Qa(e),n&4){try{ho(3,e,e.return),Mi(3,e)}catch(b){bt(e,e.return,b)}try{ho(5,e,e.return)}catch(b){bt(e,e.return,b)}}break;case 1:za(t,e),Qa(e),n&512&&a!==null&&rr(a,a.return);break;case 5:if(za(t,e),Qa(e),n&512&&a!==null&&rr(a,a.return),e.flags&32){var r=e.stateNode;try{Or(r,"")}catch(b){bt(e,e.return,b)}}if(n&4&&(r=e.stateNode,r!=null)){var s=e.memoizedProps,o=a!==null?a.memoizedProps:s,i=e.type,l=e.updateQueue;if(e.updateQueue=null,l!==null)try{i==="input"&&s.type==="radio"&&s.name!=null&&xf(r,s),wd(i,o);var c=wd(i,s);for(o=0;o<l.length;o+=2){var u=l[o],p=l[o+1];u==="style"?Tf(r,p):u==="dangerouslySetInnerHTML"?Ef(r,p):u==="children"?Or(r,p):sd(r,u,p,c)}switch(i){case"input":hd(r,s);break;case"textarea":Nf(r,s);break;case"select":var f=r._wrapperState.wasMultiple;r._wrapperState.wasMultiple=!!s.multiple;var v=s.value;v!=null?Ms(r,!!s.multiple,v,!1):f!==!!s.multiple&&(s.defaultValue!=null?Ms(r,!!s.multiple,s.defaultValue,!0):Ms(r,!!s.multiple,s.multiple?[]:"",!1))}r[so]=s}catch(b){bt(e,e.return,b)}}break;case 6:if(za(t,e),Qa(e),n&4){if(e.stateNode===null)throw Error(se(162));r=e.stateNode,s=e.memoizedProps;try{r.nodeValue=s}catch(b){bt(e,e.return,b)}}break;case 3:if(za(t,e),Qa(e),n&4&&a!==null&&a.memoizedState.isDehydrated)try{Gr(t.containerInfo)}catch(b){bt(e,e.return,b)}break;case 4:za(t,e),Qa(e);break;case 13:za(t,e),Qa(e),r=e.child,r.flags&8192&&(s=r.memoizedState!==null,r.stateNode.isHidden=s,!s||r.alternate!==null&&r.alternate.memoizedState!==null||(Gc=wt())),n&4&&Wg(e);break;case 22:if(u=a!==null&&a.memoizedState!==null,e.mode&1?(Yt=(c=Yt)||u,za(t,e),Yt=c):za(t,e),Qa(e),n&8192){if(c=e.memoizedState!==null,(e.stateNode.isHidden=c)&&!u&&e.mode&1)for(ue=e,u=e.child;u!==null;){for(p=ue=u;ue!==null;){switch(f=ue,v=f.child,f.tag){case 0:case 11:case 14:case 15:ho(4,f,f.return);break;case 1:rr(f,f.return);var x=f.stateNode;if(typeof x.componentWillUnmount=="function"){n=f,a=f.return;try{t=n,x.props=t.memoizedProps,x.state=t.memoizedState,x.componentWillUnmount()}catch(b){bt(n,a,b)}}break;case 5:rr(f,f.return);break;case 22:if(f.memoizedState!==null){Yg(p);continue}}v!==null?(v.return=f,ue=v):Yg(p)}u=u.sibling}e:for(u=null,p=e;;){if(p.tag===5){if(u===null){u=p;try{r=p.stateNode,c?(s=r.style,typeof s.setProperty=="function"?s.setProperty("display","none","important"):s.display="none"):(i=p.stateNode,l=p.memoizedProps.style,o=l!=null&&l.hasOwnProperty("display")?l.display:null,i.style.display=$f("display",o))}catch(b){bt(e,e.return,b)}}}else if(p.tag===6){if(u===null)try{p.stateNode.nodeValue=c?"":p.memoizedProps}catch(b){bt(e,e.return,b)}}else if((p.tag!==22&&p.tag!==23||p.memoizedState===null||p===e)&&p.child!==null){p.child.return=p,p=p.child;continue}if(p===e)break e;for(;p.sibling===null;){if(p.return===null||p.return===e)break e;u===p&&(u=null),p=p.return}u===p&&(u=null),p.sibling.return=p.return,p=p.sibling}}break;case 19:za(t,e),Qa(e),n&4&&Wg(e);break;case 21:break;default:za(t,e),Qa(e)}}function Qa(e){var t=e.flags;if(t&2){try{e:{for(var a=e.return;a!==null;){if(Ug(a)){var n=a;break e}a=a.return}throw Error(se(160))}switch(n.tag){case 5:var r=n.stateNode;n.flags&32&&(Or(r,""),n.flags&=-33);var s=qg(e);Vc(e,s,r);break;case 3:case 4:var o=n.stateNode.containerInfo,i=qg(e);qc(e,i,o);break;default:throw Error(se(161))}}catch(l){bt(e,e.return,l)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function H0(e,t,a){ue=e,Gg(e)}function Gg(e,t,a){for(var n=(e.mode&1)!==0;ue!==null;){var r=ue,s=r.child;if(r.tag===22&&n){var o=r.memoizedState!==null||Li;if(!o){var i=r.alternate,l=i!==null&&i.memoizedState!==null||Yt;i=Li;var c=Yt;if(Li=o,(Yt=l)&&!c)for(ue=r;ue!==null;)o=ue,l=o.child,o.tag===22&&o.memoizedState!==null?Qg(r):l!==null?(l.return=o,ue=l):Qg(r);for(;s!==null;)ue=s,Gg(s),s=s.sibling;ue=r,Li=i,Yt=c}Kg(e)}else r.subtreeFlags&8772&&s!==null?(s.return=r,ue=s):Kg(e)}}function Kg(e){for(;ue!==null;){var t=ue;if(t.flags&8772){var a=t.alternate;try{if(t.flags&8772)switch(t.tag){case 0:case 11:case 15:Yt||Mi(5,t);break;case 1:var n=t.stateNode;if(t.flags&4&&!Yt)if(a===null)n.componentDidMount();else{var r=t.elementType===t.type?a.memoizedProps:La(t.type,a.memoizedProps);n.componentDidUpdate(r,a.memoizedState,n.__reactInternalSnapshotBeforeUpdate)}var s=t.updateQueue;s!==null&&Ym(t,s,n);break;case 3:var o=t.updateQueue;if(o!==null){if(a=null,t.child!==null)switch(t.child.tag){case 5:a=t.child.stateNode;break;case 1:a=t.child.stateNode}Ym(t,o,a)}break;case 5:var i=t.stateNode;if(a===null&&t.flags&4){a=i;var l=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":l.autoFocus&&a.focus();break;case"img":l.src&&(a.src=l.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(t.memoizedState===null){var c=t.alternate;if(c!==null){var u=c.memoizedState;if(u!==null){var p=u.dehydrated;p!==null&&Gr(p)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;default:throw Error(se(163))}Yt||t.flags&512&&Uc(t)}catch(f){bt(t,t.return,f)}}if(t===e){ue=null;break}if(a=t.sibling,a!==null){a.return=t.return,ue=a;break}ue=t.return}}function Yg(e){for(;ue!==null;){var t=ue;if(t===e){ue=null;break}var a=t.sibling;if(a!==null){a.return=t.return,ue=a;break}ue=t.return}}function Qg(e){for(;ue!==null;){var t=ue;try{switch(t.tag){case 0:case 11:case 15:var a=t.return;try{Mi(4,t)}catch(l){bt(t,a,l)}break;case 1:var n=t.stateNode;if(typeof n.componentDidMount=="function"){var r=t.return;try{n.componentDidMount()}catch(l){bt(t,r,l)}}var s=t.return;try{Uc(t)}catch(l){bt(t,s,l)}break;case 5:var o=t.return;try{Uc(t)}catch(l){bt(t,o,l)}}}catch(l){bt(t,t.return,l)}if(t===e){ue=null;break}var i=t.sibling;if(i!==null){i.return=t.return,ue=i;break}ue=t.return}}var G0=Math.ceil,zi=on.ReactCurrentDispatcher,Wc=on.ReactCurrentOwner,$a=on.ReactCurrentBatchConfig,Be=0,Mt=null,Et=null,qt=0,ha=0,or=Un(0),Rt=0,vo=null,xs=0,Fi=0,Hc=0,bo=null,ra=null,Gc=0,ir=1/0,gn=null,Bi=!1,Kc=null,Kn=null,Ui=!1,Yn=null,qi=0,yo=0,Yc=null,Vi=-1,Wi=0;function ea(){return Be&6?wt():Vi!==-1?Vi:Vi=wt()}function Qn(e){return e.mode&1?Be&2&&qt!==0?qt&-qt:_0.transition!==null?(Wi===0&&(Wi=qf()),Wi):(e=Qe,e!==0||(e=window.event,e=e===void 0?16:Zf(e.type)),e):1}function Fa(e,t,a,n){if(50<yo)throw yo=0,Yc=null,Error(se(185));Ur(e,a,n),(!(Be&2)||e!==Mt)&&(e===Mt&&(!(Be&2)&&(Fi|=a),Rt===4&&Xn(e,qt)),oa(e,n),a===1&&Be===0&&!(t.mode&1)&&(ir=wt()+500,yi&&Vn()))}function oa(e,t){var a=e.callbackNode;_w(e,t);var n=ei(e,e===Mt?qt:0);if(n===0)a!==null&&Ff(a),e.callbackNode=null,e.callbackPriority=0;else if(t=n&-n,e.callbackPriority!==t){if(a!=null&&Ff(a),t===1)e.tag===0?P0(Zg.bind(null,e)):Lm(Zg.bind(null,e)),C0(function(){!(Be&6)&&Vn()}),a=null;else{switch(Vf(n)){case 1:a=Td;break;case 4:a=Bf;break;case 16:a=Qo;break;case 536870912:a=Uf;break;default:a=Qo}a=oh(a,Xg.bind(null,e))}e.callbackPriority=t,e.callbackNode=a}}function Xg(e,t){if(Vi=-1,Wi=0,Be&6)throw Error(se(327));var a=e.callbackNode;if(lr()&&e.callbackNode!==a)return null;var n=ei(e,e===Mt?qt:0);if(n===0)return null;if(n&30||n&e.expiredLanes||t)t=Hi(e,n);else{t=n;var r=Be;Be|=2;var s=eh();(Mt!==e||qt!==t)&&(gn=null,ir=wt()+500,ks(e,t));do try{Q0();break}catch(i){Jg(e,i)}while(!0);fc(),zi.current=s,Be=r,Et!==null?t=0:(Mt=null,qt=0,t=Rt)}if(t!==0){if(t===2&&(r=Pd(e),r!==0&&(n=r,t=Qc(e,r))),t===1)throw a=vo,ks(e,0),Xn(e,n),oa(e,wt()),a;if(t===6)Xn(e,n);else{if(r=e.current.alternate,!(n&30)&&!K0(r)&&(t=Hi(e,n),t===2&&(s=Pd(e),s!==0&&(n=s,t=Qc(e,s))),t===1))throw a=vo,ks(e,0),Xn(e,n),oa(e,wt()),a;switch(e.finishedWork=r,e.finishedLanes=n,t){case 0:case 1:throw Error(se(345));case 2:Ns(e,ra,gn);break;case 3:if(Xn(e,n),(n&130023424)===n&&(t=Gc+500-wt(),10<t)){if(ei(e,0)!==0)break;if(r=e.suspendedLanes,(r&n)!==n){ea(),e.pingedLanes|=e.suspendedLanes&r;break}e.timeoutHandle=ac(Ns.bind(null,e,ra,gn),t);break}Ns(e,ra,gn);break;case 4:if(Xn(e,n),(n&4194240)===n)break;for(t=e.eventTimes,r=-1;0<n;){var o=31-ja(n);s=1<<o,o=t[o],o>r&&(r=o),n&=~s}if(n=r,n=wt()-n,n=(120>n?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*G0(n/1960))-n,10<n){e.timeoutHandle=ac(Ns.bind(null,e,ra,gn),n);break}Ns(e,ra,gn);break;case 5:Ns(e,ra,gn);break;default:throw Error(se(329))}}}return oa(e,wt()),e.callbackNode===a?Xg.bind(null,e):null}function Qc(e,t){var a=bo;return e.current.memoizedState.isDehydrated&&(ks(e,t).flags|=256),e=Hi(e,t),e!==2&&(t=ra,ra=a,t!==null&&Xc(t)),e}function Xc(e){ra===null?ra=e:ra.push.apply(ra,e)}function K0(e){for(var t=e;;){if(t.flags&16384){var a=t.updateQueue;if(a!==null&&(a=a.stores,a!==null))for(var n=0;n<a.length;n++){var r=a[n],s=r.getSnapshot;r=r.value;try{if(!Da(s(),r))return!1}catch{return!1}}}if(a=t.child,t.subtreeFlags&16384&&a!==null)a.return=t,t=a;else{if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}function Xn(e,t){for(t&=~Hc,t&=~Fi,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var a=31-ja(t),n=1<<a;e[a]=-1,t&=~n}}function Zg(e){if(Be&6)throw Error(se(327));lr();var t=ei(e,0);if(!(t&1))return oa(e,wt()),null;var a=Hi(e,t);if(e.tag!==0&&a===2){var n=Pd(e);n!==0&&(t=n,a=Qc(e,n))}if(a===1)throw a=vo,ks(e,0),Xn(e,t),oa(e,wt()),a;if(a===6)throw Error(se(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,Ns(e,ra,gn),oa(e,wt()),null}function Zc(e,t){var a=Be;Be|=1;try{return e(t)}finally{Be=a,Be===0&&(ir=wt()+500,yi&&Vn())}}function ws(e){Yn!==null&&Yn.tag===0&&!(Be&6)&&lr();var t=Be;Be|=1;var a=$a.transition,n=Qe;try{if($a.transition=null,Qe=1,e)return e()}finally{Qe=n,$a.transition=a,Be=t,!(Be&6)&&Vn()}}function Jc(){ha=or.current,lt(or)}function ks(e,t){e.finishedWork=null,e.finishedLanes=0;var a=e.timeoutHandle;if(a!==-1&&(e.timeoutHandle=-1,S0(a)),Et!==null)for(a=Et.return;a!==null;){var n=a;switch(lc(n),n.tag){case 1:n=n.type.childContextTypes,n!=null&&vi();break;case 3:nr(),lt(aa),lt(Ht),wc();break;case 5:yc(n);break;case 4:nr();break;case 13:lt(mt);break;case 19:lt(mt);break;case 10:mc(n.type._context);break;case 22:case 23:Jc()}a=a.return}if(Mt=e,Et=e=Zn(e.current,null),qt=ha=t,Rt=0,vo=null,Hc=Fi=xs=0,ra=bo=null,vs!==null){for(t=0;t<vs.length;t++)if(a=vs[t],n=a.interleaved,n!==null){a.interleaved=null;var r=n.next,s=a.pending;if(s!==null){var o=s.next;s.next=r,n.next=o}a.pending=n}vs=null}return e}function Jg(e,t){do{var a=Et;try{if(fc(),Pi.current=Ai,_i){for(var n=gt.memoizedState;n!==null;){var r=n.queue;r!==null&&(r.pending=null),n=n.next}_i=!1}if(ys=0,Lt=It=gt=null,uo=!1,po=0,Wc.current=null,a===null||a.return===null){Rt=1,vo=t,Et=null;break}e:{var s=e,o=a.return,i=a,l=t;if(t=qt,i.flags|=32768,l!==null&&typeof l=="object"&&typeof l.then=="function"){var c=l,u=i,p=u.tag;if(!(u.mode&1)&&(p===0||p===11||p===15)){var f=u.alternate;f?(u.updateQueue=f.updateQueue,u.memoizedState=f.memoizedState,u.lanes=f.lanes):(u.updateQueue=null,u.memoizedState=null)}var v=Sg(o);if(v!==null){v.flags&=-257,Cg(v,o,i,s,t),v.mode&1&&Ng(s,c,t),t=v,l=c;var x=t.updateQueue;if(x===null){var b=new Set;b.add(l),t.updateQueue=b}else x.add(l);break e}else{if(!(t&1)){Ng(s,c,t),eu();break e}l=Error(se(426))}}else if(ut&&i.mode&1){var k=Sg(o);if(k!==null){!(k.flags&65536)&&(k.flags|=256),Cg(k,o,i,s,t),uc(sr(l,i));break e}}s=l=sr(l,i),Rt!==4&&(Rt=2),bo===null?bo=[s]:bo.push(s),s=o;do{switch(s.tag){case 3:s.flags|=65536,t&=-t,s.lanes|=t;var g=wg(s,l,t);Km(s,g);break e;case 1:i=l;var d=s.type,h=s.stateNode;if(!(s.flags&128)&&(typeof d.getDerivedStateFromError=="function"||h!==null&&typeof h.componentDidCatch=="function"&&(Kn===null||!Kn.has(h)))){s.flags|=65536,t&=-t,s.lanes|=t;var y=kg(s,i,t);Km(s,y);break e}}s=s.return}while(s!==null)}ah(a)}catch(S){t=S,Et===a&&a!==null&&(Et=a=a.return);continue}break}while(!0)}function eh(){var e=zi.current;return zi.current=Ai,e===null?Ai:e}function eu(){(Rt===0||Rt===3||Rt===2)&&(Rt=4),Mt===null||!(xs&268435455)&&!(Fi&268435455)||Xn(Mt,qt)}function Hi(e,t){var a=Be;Be|=2;var n=eh();(Mt!==e||qt!==t)&&(gn=null,ks(e,t));do try{Y0();break}catch(r){Jg(e,r)}while(!0);if(fc(),Be=a,zi.current=n,Et!==null)throw Error(se(261));return Mt=null,qt=0,Rt}function Y0(){for(;Et!==null;)th(Et)}function Q0(){for(;Et!==null&&!ww();)th(Et)}function th(e){var t=rh(e.alternate,e,ha);e.memoizedProps=e.pendingProps,t===null?ah(e):Et=t,Wc.current=null}function ah(e){var t=e;do{var a=t.alternate;if(e=t.return,t.flags&32768){if(a=q0(a,t),a!==null){a.flags&=32767,Et=a;return}if(e!==null)e.flags|=32768,e.subtreeFlags=0,e.deletions=null;else{Rt=6,Et=null;return}}else if(a=U0(a,t,ha),a!==null){Et=a;return}if(t=t.sibling,t!==null){Et=t;return}Et=t=e}while(t!==null);Rt===0&&(Rt=5)}function Ns(e,t,a){var n=Qe,r=$a.transition;try{$a.transition=null,Qe=1,X0(e,t,a,n)}finally{$a.transition=r,Qe=n}return null}function X0(e,t,a,n){do lr();while(Yn!==null);if(Be&6)throw Error(se(327));a=e.finishedWork;var r=e.finishedLanes;if(a===null)return null;if(e.finishedWork=null,e.finishedLanes=0,a===e.current)throw Error(se(177));e.callbackNode=null,e.callbackPriority=0;var s=a.lanes|a.childLanes;if(Iw(e,s),e===Mt&&(Et=Mt=null,qt=0),!(a.subtreeFlags&2064)&&!(a.flags&2064)||Ui||(Ui=!0,oh(Qo,function(){return lr(),null})),s=(a.flags&15990)!==0,a.subtreeFlags&15990||s){s=$a.transition,$a.transition=null;var o=Qe;Qe=1;var i=Be;Be|=4,Wc.current=null,W0(e,a),Hg(a,e),v0(ec),ni=!!Jd,ec=Jd=null,e.current=a,H0(a),kw(),Be=i,Qe=o,$a.transition=s}else e.current=a;if(Ui&&(Ui=!1,Yn=e,qi=r),s=e.pendingLanes,s===0&&(Kn=null),Cw(a.stateNode),oa(e,wt()),t!==null)for(n=e.onRecoverableError,a=0;a<t.length;a++)r=t[a],n(r.value,{componentStack:r.stack,digest:r.digest});if(Bi)throw Bi=!1,e=Kc,Kc=null,e;return qi&1&&e.tag!==0&&lr(),s=e.pendingLanes,s&1?e===Yc?yo++:(yo=0,Yc=e):yo=0,Vn(),null}function lr(){if(Yn!==null){var e=Vf(qi),t=$a.transition,a=Qe;try{if($a.transition=null,Qe=16>e?16:e,Yn===null)var n=!1;else{if(e=Yn,Yn=null,qi=0,Be&6)throw Error(se(331));var r=Be;for(Be|=4,ue=e.current;ue!==null;){var s=ue,o=s.child;if(ue.flags&16){var i=s.deletions;if(i!==null){for(var l=0;l<i.length;l++){var c=i[l];for(ue=c;ue!==null;){var u=ue;switch(u.tag){case 0:case 11:case 15:ho(8,u,s)}var p=u.child;if(p!==null)p.return=u,ue=p;else for(;ue!==null;){u=ue;var f=u.sibling,v=u.return;if(Bg(u),u===c){ue=null;break}if(f!==null){f.return=v,ue=f;break}ue=v}}}var x=s.alternate;if(x!==null){var b=x.child;if(b!==null){x.child=null;do{var k=b.sibling;b.sibling=null,b=k}while(b!==null)}}ue=s}}if(s.subtreeFlags&2064&&o!==null)o.return=s,ue=o;else e:for(;ue!==null;){if(s=ue,s.flags&2048)switch(s.tag){case 0:case 11:case 15:ho(9,s,s.return)}var g=s.sibling;if(g!==null){g.return=s.return,ue=g;break e}ue=s.return}}var d=e.current;for(ue=d;ue!==null;){o=ue;var h=o.child;if(o.subtreeFlags&2064&&h!==null)h.return=o,ue=h;else e:for(o=d;ue!==null;){if(i=ue,i.flags&2048)try{switch(i.tag){case 0:case 11:case 15:Mi(9,i)}}catch(S){bt(i,i.return,S)}if(i===o){ue=null;break e}var y=i.sibling;if(y!==null){y.return=i.return,ue=y;break e}ue=i.return}}if(Be=r,Vn(),Ha&&typeof Ha.onPostCommitFiberRoot=="function")try{Ha.onPostCommitFiberRoot(Xo,e)}catch{}n=!0}return n}finally{Qe=a,$a.transition=t}}return!1}function nh(e,t,a){t=sr(a,t),t=wg(e,t,1),e=Hn(e,t,1),t=ea(),e!==null&&(Ur(e,1,t),oa(e,t))}function bt(e,t,a){if(e.tag===3)nh(e,e,a);else for(;t!==null;){if(t.tag===3){nh(t,e,a);break}else if(t.tag===1){var n=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof n.componentDidCatch=="function"&&(Kn===null||!Kn.has(n))){e=sr(a,e),e=kg(t,e,1),t=Hn(t,e,1),e=ea(),t!==null&&(Ur(t,1,e),oa(t,e));break}}t=t.return}}function Z0(e,t,a){var n=e.pingCache;n!==null&&n.delete(t),t=ea(),e.pingedLanes|=e.suspendedLanes&a,Mt===e&&(qt&a)===a&&(Rt===4||Rt===3&&(qt&130023424)===qt&&500>wt()-Gc?ks(e,0):Hc|=a),oa(e,t)}function sh(e,t){t===0&&(e.mode&1?(t=Jo,Jo<<=1,!(Jo&130023424)&&(Jo=4194304)):t=1);var a=ea();e=pn(e,t),e!==null&&(Ur(e,t,a),oa(e,a))}function J0(e){var t=e.memoizedState,a=0;t!==null&&(a=t.retryLane),sh(e,a)}function e1(e,t){var a=0;switch(e.tag){case 13:var n=e.stateNode,r=e.memoizedState;r!==null&&(a=r.retryLane);break;case 19:n=e.stateNode;break;default:throw Error(se(314))}n!==null&&n.delete(t),sh(e,a)}var rh;rh=function(e,t,a){if(e!==null)if(e.memoizedProps!==t.pendingProps||aa.current)sa=!0;else{if(!(e.lanes&a)&&!(t.flags&128))return sa=!1,B0(e,t,a);sa=!!(e.flags&131072)}else sa=!1,ut&&t.flags&1048576&&Mm(t,wi,t.index);switch(t.lanes=0,t.tag){case 2:var n=t.type;Oi(e,t),e=t.pendingProps;var r=Qs(t,Ht.current);ar(t,a),r=Sc(null,t,n,e,r,a);var s=Cc();return t.flags|=1,typeof r=="object"&&r!==null&&typeof r.render=="function"&&r.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,na(n)?(s=!0,bi(t)):s=!1,t.memoizedState=r.state!==null&&r.state!==void 0?r.state:null,vc(t),r.updater=ji,t.stateNode=r,r._reactInternals=t,Ic(t,n,e,a),t=Dc(null,t,n,!0,s,a)):(t.tag=0,ut&&s&&ic(t),Jt(null,t,r,a),t=t.child),t;case 16:n=t.elementType;e:{switch(Oi(e,t),e=t.pendingProps,r=n._init,n=r(n._payload),t.type=n,r=t.tag=a1(n),e=La(n,e),r){case 0:t=jc(null,t,n,e,a);break e;case 1:t=Ig(null,t,n,e,a);break e;case 11:t=Eg(null,t,n,e,a);break e;case 14:t=$g(null,t,n,La(n.type,e),a);break e}throw Error(se(306,n,""))}return t;case 0:return n=t.type,r=t.pendingProps,r=t.elementType===n?r:La(n,r),jc(e,t,n,r,a);case 1:return n=t.type,r=t.pendingProps,r=t.elementType===n?r:La(n,r),Ig(e,t,n,r,a);case 3:e:{if(Rg(t),e===null)throw Error(se(387));n=t.pendingProps,s=t.memoizedState,r=s.element,Gm(e,t),$i(t,n,null,a);var o=t.memoizedState;if(n=o.element,s.isDehydrated)if(s={element:n,isDehydrated:!1,cache:o.cache,pendingSuspenseBoundaries:o.pendingSuspenseBoundaries,transitions:o.transitions},t.updateQueue.baseState=s,t.memoizedState=s,t.flags&256){r=sr(Error(se(423)),t),t=Ag(e,t,n,a,r);break e}else if(n!==r){r=sr(Error(se(424)),t),t=Ag(e,t,n,a,r);break e}else for(ga=Bn(t.stateNode.containerInfo.firstChild),ma=t,ut=!0,Oa=null,a=Wm(t,null,n,a),t.child=a;a;)a.flags=a.flags&-3|4096,a=a.sibling;else{if(Js(),n===r){t=mn(e,t,a);break e}Jt(e,t,n,a)}t=t.child}return t;case 5:return Qm(t),e===null&&cc(t),n=t.type,r=t.pendingProps,s=e!==null?e.memoizedProps:null,o=r.children,tc(n,r)?o=null:s!==null&&tc(n,s)&&(t.flags|=32),_g(e,t),Jt(e,t,o,a),t.child;case 6:return e===null&&cc(t),null;case 13:return jg(e,t,a);case 4:return bc(t,t.stateNode.containerInfo),n=t.pendingProps,e===null?t.child=er(t,null,n,a):Jt(e,t,n,a),t.child;case 11:return n=t.type,r=t.pendingProps,r=t.elementType===n?r:La(n,r),Eg(e,t,n,r,a);case 7:return Jt(e,t,t.pendingProps,a),t.child;case 8:return Jt(e,t,t.pendingProps.children,a),t.child;case 12:return Jt(e,t,t.pendingProps.children,a),t.child;case 10:e:{if(n=t.type._context,r=t.pendingProps,s=t.memoizedProps,o=r.value,ot(Si,n._currentValue),n._currentValue=o,s!==null)if(Da(s.value,o)){if(s.children===r.children&&!aa.current){t=mn(e,t,a);break e}}else for(s=t.child,s!==null&&(s.return=t);s!==null;){var i=s.dependencies;if(i!==null){o=s.child;for(var l=i.firstContext;l!==null;){if(l.context===n){if(s.tag===1){l=fn(-1,a&-a),l.tag=2;var c=s.updateQueue;if(c!==null){c=c.shared;var u=c.pending;u===null?l.next=l:(l.next=u.next,u.next=l),c.pending=l}}s.lanes|=a,l=s.alternate,l!==null&&(l.lanes|=a),gc(s.return,a,t),i.lanes|=a;break}l=l.next}}else if(s.tag===10)o=s.type===t.type?null:s.child;else if(s.tag===18){if(o=s.return,o===null)throw Error(se(341));o.lanes|=a,i=o.alternate,i!==null&&(i.lanes|=a),gc(o,a,t),o=s.sibling}else o=s.child;if(o!==null)o.return=s;else for(o=s;o!==null;){if(o===t){o=null;break}if(s=o.sibling,s!==null){s.return=o.return,o=s;break}o=o.return}s=o}Jt(e,t,r.children,a),t=t.child}return t;case 9:return r=t.type,n=t.pendingProps.children,ar(t,a),r=Ca(r),n=n(r),t.flags|=1,Jt(e,t,n,a),t.child;case 14:return n=t.type,r=La(n,t.pendingProps),r=La(n.type,r),$g(e,t,n,r,a);case 15:return Tg(e,t,t.type,t.pendingProps,a);case 17:return n=t.type,r=t.pendingProps,r=t.elementType===n?r:La(n,r),Oi(e,t),t.tag=1,na(n)?(e=!0,bi(t)):e=!1,ar(t,a),yg(t,n,r),Ic(t,n,r,a),Dc(null,t,n,!0,e,a);case 19:return Og(e,t,a);case 22:return Pg(e,t,a)}throw Error(se(156,t.tag))};function oh(e,t){return zf(e,t)}function t1(e,t,a,n){this.tag=e,this.key=a,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=n,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Ta(e,t,a,n){return new t1(e,t,a,n)}function tu(e){return e=e.prototype,!(!e||!e.isReactComponent)}function a1(e){if(typeof e=="function")return tu(e)?1:0;if(e!=null){if(e=e.$$typeof,e===id)return 11;if(e===cd)return 14}return 2}function Zn(e,t){var a=e.alternate;return a===null?(a=Ta(e.tag,t,e.key,e.mode),a.elementType=e.elementType,a.type=e.type,a.stateNode=e.stateNode,a.alternate=e,e.alternate=a):(a.pendingProps=t,a.type=e.type,a.flags=0,a.subtreeFlags=0,a.deletions=null),a.flags=e.flags&14680064,a.childLanes=e.childLanes,a.lanes=e.lanes,a.child=e.child,a.memoizedProps=e.memoizedProps,a.memoizedState=e.memoizedState,a.updateQueue=e.updateQueue,t=e.dependencies,a.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},a.sibling=e.sibling,a.index=e.index,a.ref=e.ref,a}function Gi(e,t,a,n,r,s){var o=2;if(n=e,typeof e=="function")tu(e)&&(o=1);else if(typeof e=="string")o=5;else e:switch(e){case Ls:return Ss(a.children,r,s,t);case rd:o=8,r|=8;break;case od:return e=Ta(12,a,t,r|2),e.elementType=od,e.lanes=s,e;case ld:return e=Ta(13,a,t,r),e.elementType=ld,e.lanes=s,e;case dd:return e=Ta(19,a,t,r),e.elementType=dd,e.lanes=s,e;case gf:return Ki(a,r,s,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case ff:o=10;break e;case mf:o=9;break e;case id:o=11;break e;case cd:o=14;break e;case An:o=16,n=null;break e}throw Error(se(130,e==null?e:typeof e,""))}return t=Ta(o,a,t,r),t.elementType=e,t.type=n,t.lanes=s,t}function Ss(e,t,a,n){return e=Ta(7,e,n,t),e.lanes=a,e}function Ki(e,t,a,n){return e=Ta(22,e,n,t),e.elementType=gf,e.lanes=a,e.stateNode={isHidden:!1},e}function au(e,t,a){return e=Ta(6,e,null,t),e.lanes=a,e}function nu(e,t,a){return t=Ta(4,e.children!==null?e.children:[],e.key,t),t.lanes=a,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function n1(e,t,a,n,r){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=_d(0),this.expirationTimes=_d(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=_d(0),this.identifierPrefix=n,this.onRecoverableError=r,this.mutableSourceEagerHydrationData=null}function su(e,t,a,n,r,s,o,i,l){return e=new n1(e,t,a,i,l),t===1?(t=1,s===!0&&(t|=8)):t=0,s=Ta(3,null,null,t),e.current=s,s.stateNode=e,s.memoizedState={element:n,isDehydrated:a,cache:null,transitions:null,pendingSuspenseBoundaries:null},vc(s),e}function s1(e,t,a){var n=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:Os,key:n==null?null:""+n,children:e,containerInfo:t,implementation:a}}function ih(e){if(!e)return qn;e=e._reactInternals;e:{if(ps(e)!==e||e.tag!==1)throw Error(se(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(na(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(t!==null);throw Error(se(171))}if(e.tag===1){var a=e.type;if(na(a))return Dm(e,a,t)}return t}function lh(e,t,a,n,r,s,o,i,l){return e=su(a,n,!0,e,r,s,o,i,l),e.context=ih(null),a=e.current,n=ea(),r=Qn(a),s=fn(n,r),s.callback=t??null,Hn(a,s,r),e.current.lanes=r,Ur(e,r,n),oa(e,n),e}function Yi(e,t,a,n){var r=t.current,s=ea(),o=Qn(r);return a=ih(a),t.context===null?t.context=a:t.pendingContext=a,t=fn(s,o),t.payload={element:e},n=n===void 0?null:n,n!==null&&(t.callback=n),e=Hn(r,t,o),e!==null&&(Fa(e,r,o,s),Ei(e,r,o)),o}function Qi(e){if(e=e.current,!e.child)return null;switch(e.child.tag){case 5:return e.child.stateNode;default:return e.child.stateNode}}function dh(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var a=e.retryLane;e.retryLane=a!==0&&a<t?a:t}}function ru(e,t){dh(e,t),(e=e.alternate)&&dh(e,t)}function r1(){return null}var ch=typeof reportError=="function"?reportError:function(e){console.error(e)};function ou(e){this._internalRoot=e}Xi.prototype.render=ou.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(se(409));Yi(e,t,null,null)},Xi.prototype.unmount=ou.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;ws(function(){Yi(null,e,null,null)}),t[ln]=null}};function Xi(e){this._internalRoot=e}Xi.prototype.unstable_scheduleHydration=function(e){if(e){var t=Gf();e={blockedOn:null,target:e,priority:t};for(var a=0;a<Mn.length&&t!==0&&t<Mn[a].priority;a++);Mn.splice(a,0,e),a===0&&Qf(e)}};function iu(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function Zi(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11&&(e.nodeType!==8||e.nodeValue!==" react-mount-point-unstable "))}function uh(){}function o1(e,t,a,n,r){if(r){if(typeof n=="function"){var s=n;n=function(){var c=Qi(o);s.call(c)}}var o=lh(t,n,e,0,null,!1,!1,"",uh);return e._reactRootContainer=o,e[ln]=o.current,ao(e.nodeType===8?e.parentNode:e),ws(),o}for(;r=e.lastChild;)e.removeChild(r);if(typeof n=="function"){var i=n;n=function(){var c=Qi(l);i.call(c)}}var l=su(e,0,!1,null,null,!1,!1,"",uh);return e._reactRootContainer=l,e[ln]=l.current,ao(e.nodeType===8?e.parentNode:e),ws(function(){Yi(t,l,a,n)}),l}function Ji(e,t,a,n,r){var s=a._reactRootContainer;if(s){var o=s;if(typeof r=="function"){var i=r;r=function(){var l=Qi(o);i.call(l)}}Yi(t,o,e,r)}else o=o1(a,t,e,r,n);return Qi(o)}Wf=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var a=Br(t.pendingLanes);a!==0&&(Id(t,a|1),oa(t,wt()),!(Be&6)&&(ir=wt()+500,Vn()))}break;case 13:ws(function(){var n=pn(e,1);if(n!==null){var r=ea();Fa(n,e,1,r)}}),ru(e,1)}},Rd=function(e){if(e.tag===13){var t=pn(e,134217728);if(t!==null){var a=ea();Fa(t,e,134217728,a)}ru(e,134217728)}},Hf=function(e){if(e.tag===13){var t=Qn(e),a=pn(e,t);if(a!==null){var n=ea();Fa(a,e,t,n)}ru(e,t)}},Gf=function(){return Qe},Kf=function(e,t){var a=Qe;try{return Qe=e,t()}finally{Qe=a}},Sd=function(e,t,a){switch(t){case"input":if(hd(e,a),t=a.name,a.type==="radio"&&t!=null){for(a=e;a.parentNode;)a=a.parentNode;for(a=a.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<a.length;t++){var n=a[t];if(n!==e&&n.form===e.form){var r=hi(n);if(!r)throw Error(se(90));bf(n),hd(n,r)}}}break;case"textarea":Nf(e,a);break;case"select":t=a.value,t!=null&&Ms(e,!!a.multiple,t,!1)}},Rf=Zc,Af=ws;var i1={usingClientEntryPoint:!1,Events:[ro,Ks,hi,_f,If,Zc]},xo={findFiberByHostInstance:fs,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},l1={bundleType:xo.bundleType,version:xo.version,rendererPackageName:xo.rendererPackageName,rendererConfig:xo.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:on.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return e=Lf(e),e===null?null:e.stateNode},findFiberByHostInstance:xo.findFiberByHostInstance||r1,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1-next-f1338f8080-20240426"};if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"){var el=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!el.isDisabled&&el.supportsFiber)try{Xo=el.inject(l1),Ha=el}catch{}}ua.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=i1,ua.createPortal=function(e,t){var a=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!iu(t))throw Error(se(200));return s1(e,t,null,a)},ua.createRoot=function(e,t){if(!iu(e))throw Error(se(299));var a=!1,n="",r=ch;return t!=null&&(t.unstable_strictMode===!0&&(a=!0),t.identifierPrefix!==void 0&&(n=t.identifierPrefix),t.onRecoverableError!==void 0&&(r=t.onRecoverableError)),t=su(e,1,!1,null,null,a,!1,n,r),e[ln]=t.current,ao(e.nodeType===8?e.parentNode:e),new ou(t)},ua.findDOMNode=function(e){if(e==null)return null;if(e.nodeType===1)return e;var t=e._reactInternals;if(t===void 0)throw typeof e.render=="function"?Error(se(188)):(e=Object.keys(e).join(","),Error(se(268,e)));return e=Lf(t),e=e===null?null:e.stateNode,e},ua.flushSync=function(e){return ws(e)},ua.hydrate=function(e,t,a){if(!Zi(t))throw Error(se(200));return Ji(null,e,t,!0,a)},ua.hydrateRoot=function(e,t,a){if(!iu(e))throw Error(se(405));var n=a!=null&&a.hydratedSources||null,r=!1,s="",o=ch;if(a!=null&&(a.unstable_strictMode===!0&&(r=!0),a.identifierPrefix!==void 0&&(s=a.identifierPrefix),a.onRecoverableError!==void 0&&(o=a.onRecoverableError)),t=lh(t,null,e,1,a??null,r,!1,s,o),e[ln]=t.current,ao(e),n)for(e=0;e<n.length;e++)a=n[e],r=a._getVersion,r=r(a._source),t.mutableSourceEagerHydrationData==null?t.mutableSourceEagerHydrationData=[a,r]:t.mutableSourceEagerHydrationData.push(a,r);return new Xi(t)},ua.render=function(e,t,a){if(!Zi(t))throw Error(se(200));return Ji(null,e,t,!1,a)},ua.unmountComponentAtNode=function(e){if(!Zi(e))throw Error(se(40));return e._reactRootContainer?(ws(function(){Ji(null,null,e,!1,function(){e._reactRootContainer=null,e[ln]=null})}),!0):!1},ua.unstable_batchedUpdates=Zc,ua.unstable_renderSubtreeIntoContainer=function(e,t,a,n){if(!Zi(a))throw Error(se(200));if(e==null||e._reactInternals===void 0)throw Error(se(38));return Ji(e,t,a,!1,n)},ua.version="18.3.1-next-f1338f8080-20240426";function ph(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(ph)}catch(e){console.error(e)}}ph(),of.exports=ua;var dr=of.exports,fh,mh=dr;fh=mh.createRoot,mh.hydrateRoot;class d1 extends N.Component{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t){console.error("[dsh-studio] render failed:",t)}render(){return this.state.error?N.createElement("div",{style:{padding:"16px 18px",fontSize:"12px",lineHeight:1.6,whiteSpace:"pre-wrap",color:"#b31d28",fontFamily:"ui-monospace, SFMono-Regular, Menlo, monospace"}},`工作空间渲染失败:
|
|
855
|
-
`+String(this.state.error?.message??this.state.error)):this.props.children}}function
|
|
854
|
+
`+s.stack}return{value:e,source:t,stack:r,digest:null}}function Rc(e,t,a){return{value:e,source:null,stack:a??null,digest:t??null}}function Ac(e,t){try{console.error(t.value)}catch(a){setTimeout(function(){throw a})}}var z0=typeof WeakMap=="function"?WeakMap:Map;function wg(e,t,a){a=fn(-1,a),a.tag=3,a.payload={element:null};var n=t.value;return a.callback=function(){Bi||(Bi=!0,Kc=n),Ac(e,t)},a}function kg(e,t,a){a=fn(-1,a),a.tag=3;var n=e.type.getDerivedStateFromError;if(typeof n=="function"){var r=t.value;a.payload=function(){return n(r)},a.callback=function(){Ac(e,t)}}var s=e.stateNode;return s!==null&&typeof s.componentDidCatch=="function"&&(a.callback=function(){Ac(e,t),typeof n!="function"&&(Yn===null?Yn=new Set([this]):Yn.add(this));var o=t.stack;this.componentDidCatch(t.value,{componentStack:o!==null?o:""})}),a}function Ng(e,t,a){var n=e.pingCache;if(n===null){n=e.pingCache=new z0;var r=new Set;n.set(t,r)}else r=n.get(t),r===void 0&&(r=new Set,n.set(t,r));r.has(a)||(r.add(a),e=J0.bind(null,e,t,a),t.then(e,e))}function Sg(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function Cg(e,t,a,n,r){return e.mode&1?(e.flags|=65536,e.lanes=r,e):(e===t?e.flags|=65536:(e.flags|=128,a.flags|=131072,a.flags&=-52805,a.tag===1&&(a.alternate===null?a.tag=17:(t=fn(-1,1),t.tag=2,Gn(a,t,1))),a.lanes|=1),e)}var F0=on.ReactCurrentOwner,ra=!1;function Jt(e,t,a,n){t.child=e===null?Wm(t,null,a,n):er(t,e.child,a,n)}function Eg(e,t,a,n,r){a=a.render;var s=t.ref;return ar(t,r),n=Sc(e,t,a,n,s,r),a=Cc(),e!==null&&!ra?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~r,mn(e,t,r)):(ut&&a&&ic(t),t.flags|=1,Jt(e,t,n,r),t.child)}function $g(e,t,a,n,r){if(e===null){var s=a.type;return typeof s=="function"&&!tu(s)&&s.defaultProps===void 0&&a.compare===null&&a.defaultProps===void 0?(t.tag=15,t.type=s,Tg(e,t,s,n,r)):(e=Gi(a.type,null,n,t,t.mode,r),e.ref=t.ref,e.return=t,t.child=e)}if(s=e.child,!(e.lanes&r)){var o=s.memoizedProps;if(a=a.compare,a=a!==null?a:Jr,a(o,n)&&e.ref===t.ref)return mn(e,t,r)}return t.flags|=1,e=Jn(s,n),e.ref=t.ref,e.return=t,t.child=e}function Tg(e,t,a,n,r){if(e!==null){var s=e.memoizedProps;if(Jr(s,n)&&e.ref===t.ref)if(ra=!1,t.pendingProps=n=s,(e.lanes&r)!==0)e.flags&131072&&(ra=!0);else return t.lanes=e.lanes,mn(e,t,r)}return jc(e,t,a,n,r)}function Pg(e,t,a){var n=t.pendingProps,r=n.children,s=e!==null?e.memoizedState:null;if(n.mode==="hidden")if(!(t.mode&1))t.memoizedState={baseLanes:0,cachePool:null,transitions:null},ot(or,ha),ha|=a;else{if(!(a&1073741824))return e=s!==null?s.baseLanes|a:a,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,ot(or,ha),ha|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},n=s!==null?s.baseLanes:a,ot(or,ha),ha|=n}else s!==null?(n=s.baseLanes|a,t.memoizedState=null):n=a,ot(or,ha),ha|=n;return Jt(e,t,r,a),t.child}function _g(e,t){var a=t.ref;(e===null&&a!==null||e!==null&&e.ref!==a)&&(t.flags|=512,t.flags|=2097152)}function jc(e,t,a,n,r){var s=sa(a)?ms:Ht.current;return s=Qs(t,s),ar(t,r),a=Sc(e,t,a,n,s,r),n=Cc(),e!==null&&!ra?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~r,mn(e,t,r)):(ut&&n&&ic(t),t.flags|=1,Jt(e,t,a,r),t.child)}function Ig(e,t,a,n,r){if(sa(a)){var s=!0;bi(t)}else s=!1;if(ar(t,r),t.stateNode===null)Oi(e,t),yg(t,a,n),Ic(t,a,n,r),n=!0;else if(e===null){var o=t.stateNode,i=t.memoizedProps;o.props=i;var l=o.context,c=a.contextType;typeof c=="object"&&c!==null?c=Ca(c):(c=sa(a)?ms:Ht.current,c=Qs(t,c));var u=a.getDerivedStateFromProps,p=typeof u=="function"||typeof o.getSnapshotBeforeUpdate=="function";p||typeof o.UNSAFE_componentWillReceiveProps!="function"&&typeof o.componentWillReceiveProps!="function"||(i!==n||l!==c)&&xg(t,o,n,c),Hn=!1;var f=t.memoizedState;o.state=f,$i(t,n,o,r),l=t.memoizedState,i!==n||f!==l||na.current||Hn?(typeof u=="function"&&(_c(t,a,u,n),l=t.memoizedState),(i=Hn||bg(t,a,i,n,f,l,c))?(p||typeof o.UNSAFE_componentWillMount!="function"&&typeof o.componentWillMount!="function"||(typeof o.componentWillMount=="function"&&o.componentWillMount(),typeof o.UNSAFE_componentWillMount=="function"&&o.UNSAFE_componentWillMount()),typeof o.componentDidMount=="function"&&(t.flags|=4194308)):(typeof o.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=n,t.memoizedState=l),o.props=n,o.state=l,o.context=c,n=i):(typeof o.componentDidMount=="function"&&(t.flags|=4194308),n=!1)}else{o=t.stateNode,Gm(e,t),i=t.memoizedProps,c=t.type===t.elementType?i:La(t.type,i),o.props=c,p=t.pendingProps,f=o.context,l=a.contextType,typeof l=="object"&&l!==null?l=Ca(l):(l=sa(a)?ms:Ht.current,l=Qs(t,l));var v=a.getDerivedStateFromProps;(u=typeof v=="function"||typeof o.getSnapshotBeforeUpdate=="function")||typeof o.UNSAFE_componentWillReceiveProps!="function"&&typeof o.componentWillReceiveProps!="function"||(i!==p||f!==l)&&xg(t,o,n,l),Hn=!1,f=t.memoizedState,o.state=f,$i(t,n,o,r);var x=t.memoizedState;i!==p||f!==x||na.current||Hn?(typeof v=="function"&&(_c(t,a,v,n),x=t.memoizedState),(c=Hn||bg(t,a,c,n,f,x,l)||!1)?(u||typeof o.UNSAFE_componentWillUpdate!="function"&&typeof o.componentWillUpdate!="function"||(typeof o.componentWillUpdate=="function"&&o.componentWillUpdate(n,x,l),typeof o.UNSAFE_componentWillUpdate=="function"&&o.UNSAFE_componentWillUpdate(n,x,l)),typeof o.componentDidUpdate=="function"&&(t.flags|=4),typeof o.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof o.componentDidUpdate!="function"||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),typeof o.getSnapshotBeforeUpdate!="function"||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),t.memoizedProps=n,t.memoizedState=x),o.props=n,o.state=x,o.context=l,n=c):(typeof o.componentDidUpdate!="function"||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),typeof o.getSnapshotBeforeUpdate!="function"||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),n=!1)}return Dc(e,t,a,n,s,r)}function Dc(e,t,a,n,r,s){_g(e,t);var o=(t.flags&128)!==0;if(!n&&!o)return r&&Om(t,a,!1),mn(e,t,s);n=t.stateNode,F0.current=t;var i=o&&typeof a.getDerivedStateFromError!="function"?null:n.render();return t.flags|=1,e!==null&&o?(t.child=er(t,e.child,null,s),t.child=er(t,null,i,s)):Jt(e,t,i,s),t.memoizedState=n.state,r&&Om(t,a,!0),t.child}function Rg(e){var t=e.stateNode;t.pendingContext?jm(e,t.pendingContext,t.pendingContext!==t.context):t.context&&jm(e,t.context,!1),bc(e,t.containerInfo)}function Ag(e,t,a,n,r){return Js(),uc(r),t.flags|=256,Jt(e,t,a,n),t.child}var Oc={dehydrated:null,treeContext:null,retryLane:0};function Lc(e){return{baseLanes:e,cachePool:null,transitions:null}}function jg(e,t,a){var n=t.pendingProps,r=mt.current,s=!1,o=(t.flags&128)!==0,i;if((i=o)||(i=e!==null&&e.memoizedState===null?!1:(r&2)!==0),i?(s=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(r|=1),ot(mt,r&1),e===null)return cc(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?(t.mode&1?e.data==="$!"?t.lanes=8:t.lanes=1073741824:t.lanes=1,null):(o=n.children,e=n.fallback,s?(n=t.mode,s=t.child,o={mode:"hidden",children:o},!(n&1)&&s!==null?(s.childLanes=0,s.pendingProps=o):s=Ki(o,n,0,null),e=Ss(e,n,a,null),s.return=t,e.return=t,s.sibling=e,t.child=s,t.child.memoizedState=Lc(a),t.memoizedState=Oc,e):Mc(t,o));if(r=e.memoizedState,r!==null&&(i=r.dehydrated,i!==null))return B0(e,t,o,n,i,r,a);if(s){s=n.fallback,o=t.mode,r=e.child,i=r.sibling;var l={mode:"hidden",children:n.children};return!(o&1)&&t.child!==r?(n=t.child,n.childLanes=0,n.pendingProps=l,t.deletions=null):(n=Jn(r,l),n.subtreeFlags=r.subtreeFlags&14680064),i!==null?s=Jn(i,s):(s=Ss(s,o,a,null),s.flags|=2),s.return=t,n.return=t,n.sibling=s,t.child=n,n=s,s=t.child,o=e.child.memoizedState,o=o===null?Lc(a):{baseLanes:o.baseLanes|a,cachePool:null,transitions:o.transitions},s.memoizedState=o,s.childLanes=e.childLanes&~a,t.memoizedState=Oc,n}return s=e.child,e=s.sibling,n=Jn(s,{mode:"visible",children:n.children}),!(t.mode&1)&&(n.lanes=a),n.return=t,n.sibling=null,e!==null&&(a=t.deletions,a===null?(t.deletions=[e],t.flags|=16):a.push(e)),t.child=n,t.memoizedState=null,n}function Mc(e,t){return t=Ki({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function Di(e,t,a,n){return n!==null&&uc(n),er(t,e.child,null,a),e=Mc(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function B0(e,t,a,n,r,s,o){if(a)return t.flags&256?(t.flags&=-257,n=Rc(Error(re(422))),Di(e,t,o,n)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(s=n.fallback,r=t.mode,n=Ki({mode:"visible",children:n.children},r,0,null),s=Ss(s,r,o,null),s.flags|=2,n.return=t,s.return=t,n.sibling=s,t.child=n,t.mode&1&&er(t,e.child,null,o),t.child.memoizedState=Lc(o),t.memoizedState=Oc,s);if(!(t.mode&1))return Di(e,t,o,null);if(r.data==="$!"){if(n=r.nextSibling&&r.nextSibling.dataset,n)var i=n.dgst;return n=i,s=Error(re(419)),n=Rc(s,n,void 0),Di(e,t,o,n)}if(i=(o&e.childLanes)!==0,ra||i){if(n=Mt,n!==null){switch(o&-o){case 4:r=2;break;case 16:r=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:r=32;break;case 536870912:r=268435456;break;default:r=0}r=r&(n.suspendedLanes|o)?0:r,r!==0&&r!==s.retryLane&&(s.retryLane=r,pn(e,r),Fa(n,e,r,-1))}return eu(),n=Rc(Error(re(421))),Di(e,t,o,n)}return r.data==="$?"?(t.flags|=128,t.child=e.child,t=e1.bind(null,e),r._reactRetry=t,null):(e=s.treeContext,ga=Un(r.nextSibling),ma=t,ut=!0,Oa=null,e!==null&&(Na[Sa++]=cn,Na[Sa++]=un,Na[Sa++]=gs,cn=e.id,un=e.overflow,gs=t),t=Mc(t,n.children),t.flags|=4096,t)}function Dg(e,t,a){e.lanes|=t;var n=e.alternate;n!==null&&(n.lanes|=t),gc(e.return,t,a)}function zc(e,t,a,n,r){var s=e.memoizedState;s===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:n,tail:a,tailMode:r}:(s.isBackwards=t,s.rendering=null,s.renderingStartTime=0,s.last=n,s.tail=a,s.tailMode=r)}function Og(e,t,a){var n=t.pendingProps,r=n.revealOrder,s=n.tail;if(Jt(e,t,n.children,a),n=mt.current,n&2)n=n&1|2,t.flags|=128;else{if(e!==null&&e.flags&128)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&Dg(e,a,t);else if(e.tag===19)Dg(e,a,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}n&=1}if(ot(mt,n),!(t.mode&1))t.memoizedState=null;else switch(r){case"forwards":for(a=t.child,r=null;a!==null;)e=a.alternate,e!==null&&Ti(e)===null&&(r=a),a=a.sibling;a=r,a===null?(r=t.child,t.child=null):(r=a.sibling,a.sibling=null),zc(t,!1,r,a,s);break;case"backwards":for(a=null,r=t.child,t.child=null;r!==null;){if(e=r.alternate,e!==null&&Ti(e)===null){t.child=r;break}e=r.sibling,r.sibling=a,a=r,r=e}zc(t,!0,a,null,s);break;case"together":zc(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Oi(e,t){!(t.mode&1)&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function mn(e,t,a){if(e!==null&&(t.dependencies=e.dependencies),xs|=t.lanes,!(a&t.childLanes))return null;if(e!==null&&t.child!==e.child)throw Error(re(153));if(t.child!==null){for(e=t.child,a=Jn(e,e.pendingProps),t.child=a,a.return=t;e.sibling!==null;)e=e.sibling,a=a.sibling=Jn(e,e.pendingProps),a.return=t;a.sibling=null}return t.child}function U0(e,t,a){switch(t.tag){case 3:Rg(t),Js();break;case 5:Qm(t);break;case 1:sa(t.type)&&bi(t);break;case 4:bc(t,t.stateNode.containerInfo);break;case 10:var n=t.type._context,r=t.memoizedProps.value;ot(Si,n._currentValue),n._currentValue=r;break;case 13:if(n=t.memoizedState,n!==null)return n.dehydrated!==null?(ot(mt,mt.current&1),t.flags|=128,null):a&t.child.childLanes?jg(e,t,a):(ot(mt,mt.current&1),e=mn(e,t,a),e!==null?e.sibling:null);ot(mt,mt.current&1);break;case 19:if(n=(a&t.childLanes)!==0,e.flags&128){if(n)return Og(e,t,a);t.flags|=128}if(r=t.memoizedState,r!==null&&(r.rendering=null,r.tail=null,r.lastEffect=null),ot(mt,mt.current),n)break;return null;case 22:case 23:return t.lanes=0,Pg(e,t,a)}return mn(e,t,a)}var Lg,Fc,Mg,zg;Lg=function(e,t){for(var a=t.child;a!==null;){if(a.tag===5||a.tag===6)e.appendChild(a.stateNode);else if(a.tag!==4&&a.child!==null){a.child.return=a,a=a.child;continue}if(a===t)break;for(;a.sibling===null;){if(a.return===null||a.return===t)return;a=a.return}a.sibling.return=a.return,a=a.sibling}},Fc=function(){},Mg=function(e,t,a,n){var r=e.memoizedProps;if(r!==n){e=t.stateNode,bs(Ka.current);var s=null;switch(a){case"input":r=gd(e,r),n=gd(e,n),s=[];break;case"select":r=ft({},r,{value:void 0}),n=ft({},n,{value:void 0}),s=[];break;case"textarea":r=bd(e,r),n=bd(e,n),s=[];break;default:typeof r.onClick!="function"&&typeof n.onClick=="function"&&(e.onclick=gi)}xd(a,n);var o;a=null;for(c in r)if(!n.hasOwnProperty(c)&&r.hasOwnProperty(c)&&r[c]!=null)if(c==="style"){var i=r[c];for(o in i)i.hasOwnProperty(o)&&(a||(a={}),a[o]="")}else c!=="dangerouslySetInnerHTML"&&c!=="children"&&c!=="suppressContentEditableWarning"&&c!=="suppressHydrationWarning"&&c!=="autoFocus"&&(Rr.hasOwnProperty(c)?s||(s=[]):(s=s||[]).push(c,null));for(c in n){var l=n[c];if(i=r?.[c],n.hasOwnProperty(c)&&l!==i&&(l!=null||i!=null))if(c==="style")if(i){for(o in i)!i.hasOwnProperty(o)||l&&l.hasOwnProperty(o)||(a||(a={}),a[o]="");for(o in l)l.hasOwnProperty(o)&&i[o]!==l[o]&&(a||(a={}),a[o]=l[o])}else a||(s||(s=[]),s.push(c,a)),a=l;else c==="dangerouslySetInnerHTML"?(l=l?l.__html:void 0,i=i?i.__html:void 0,l!=null&&i!==l&&(s=s||[]).push(c,l)):c==="children"?typeof l!="string"&&typeof l!="number"||(s=s||[]).push(c,""+l):c!=="suppressContentEditableWarning"&&c!=="suppressHydrationWarning"&&(Rr.hasOwnProperty(c)?(l!=null&&c==="onScroll"&&it("scroll",e),s||i===l||(s=[])):(s=s||[]).push(c,l))}a&&(s=s||[]).push("style",a);var c=s;(t.updateQueue=c)&&(t.flags|=4)}},zg=function(e,t,a,n){a!==n&&(t.flags|=4)};function go(e,t){if(!ut)switch(e.tailMode){case"hidden":t=e.tail;for(var a=null;t!==null;)t.alternate!==null&&(a=t),t=t.sibling;a===null?e.tail=null:a.sibling=null;break;case"collapsed":a=e.tail;for(var n=null;a!==null;)a.alternate!==null&&(n=a),a=a.sibling;n===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:n.sibling=null}}function Kt(e){var t=e.alternate!==null&&e.alternate.child===e.child,a=0,n=0;if(t)for(var r=e.child;r!==null;)a|=r.lanes|r.childLanes,n|=r.subtreeFlags&14680064,n|=r.flags&14680064,r.return=e,r=r.sibling;else for(r=e.child;r!==null;)a|=r.lanes|r.childLanes,n|=r.subtreeFlags,n|=r.flags,r.return=e,r=r.sibling;return e.subtreeFlags|=n,e.childLanes=a,t}function q0(e,t,a){var n=t.pendingProps;switch(lc(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Kt(t),null;case 1:return sa(t.type)&&vi(),Kt(t),null;case 3:return n=t.stateNode,nr(),lt(na),lt(Ht),wc(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),(e===null||e.child===null)&&(ki(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&!(t.flags&256)||(t.flags|=1024,Oa!==null&&(Xc(Oa),Oa=null))),Fc(e,t),Kt(t),null;case 5:yc(t);var r=bs(co.current);if(a=t.type,e!==null&&t.stateNode!=null)Mg(e,t,a,n,r),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!n){if(t.stateNode===null)throw Error(re(166));return Kt(t),null}if(e=bs(Ka.current),ki(t)){n=t.stateNode,a=t.type;var s=t.memoizedProps;switch(n[Ga]=t,n[so]=s,e=(t.mode&1)!==0,a){case"dialog":it("cancel",n),it("close",n);break;case"iframe":case"object":case"embed":it("load",n);break;case"video":case"audio":for(r=0;r<to.length;r++)it(to[r],n);break;case"source":it("error",n);break;case"img":case"image":case"link":it("error",n),it("load",n);break;case"details":it("toggle",n);break;case"input":yf(n,s),it("invalid",n);break;case"select":n._wrapperState={wasMultiple:!!s.multiple},it("invalid",n);break;case"textarea":kf(n,s),it("invalid",n)}xd(a,s),r=null;for(var o in s)if(s.hasOwnProperty(o)){var i=s[o];o==="children"?typeof i=="string"?n.textContent!==i&&(s.suppressHydrationWarning!==!0&&mi(n.textContent,i,e),r=["children",i]):typeof i=="number"&&n.textContent!==""+i&&(s.suppressHydrationWarning!==!0&&mi(n.textContent,i,e),r=["children",""+i]):Rr.hasOwnProperty(o)&&i!=null&&o==="onScroll"&&it("scroll",n)}switch(a){case"input":Wo(n),wf(n,s,!0);break;case"textarea":Wo(n),Sf(n);break;case"select":case"option":break;default:typeof s.onClick=="function"&&(n.onclick=gi)}n=r,t.updateQueue=n,n!==null&&(t.flags|=4)}else{o=r.nodeType===9?r:r.ownerDocument,e==="http://www.w3.org/1999/xhtml"&&(e=Cf(a)),e==="http://www.w3.org/1999/xhtml"?a==="script"?(e=o.createElement("div"),e.innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):typeof n.is=="string"?e=o.createElement(a,{is:n.is}):(e=o.createElement(a),a==="select"&&(o=e,n.multiple?o.multiple=!0:n.size&&(o.size=n.size))):e=o.createElementNS(e,a),e[Ga]=t,e[so]=n,Lg(e,t,!1,!1),t.stateNode=e;e:{switch(o=wd(a,n),a){case"dialog":it("cancel",e),it("close",e),r=n;break;case"iframe":case"object":case"embed":it("load",e),r=n;break;case"video":case"audio":for(r=0;r<to.length;r++)it(to[r],e);r=n;break;case"source":it("error",e),r=n;break;case"img":case"image":case"link":it("error",e),it("load",e),r=n;break;case"details":it("toggle",e),r=n;break;case"input":yf(e,n),r=gd(e,n),it("invalid",e);break;case"option":r=n;break;case"select":e._wrapperState={wasMultiple:!!n.multiple},r=ft({},n,{value:void 0}),it("invalid",e);break;case"textarea":kf(e,n),r=bd(e,n),it("invalid",e);break;default:r=n}xd(a,r),i=r;for(s in i)if(i.hasOwnProperty(s)){var l=i[s];s==="style"?Tf(e,l):s==="dangerouslySetInnerHTML"?(l=l?l.__html:void 0,l!=null&&Ef(e,l)):s==="children"?typeof l=="string"?(a!=="textarea"||l!=="")&&Or(e,l):typeof l=="number"&&Or(e,""+l):s!=="suppressContentEditableWarning"&&s!=="suppressHydrationWarning"&&s!=="autoFocus"&&(Rr.hasOwnProperty(s)?l!=null&&s==="onScroll"&&it("scroll",e):l!=null&&sd(e,s,l,o))}switch(a){case"input":Wo(e),wf(e,n,!1);break;case"textarea":Wo(e),Sf(e);break;case"option":n.value!=null&&e.setAttribute("value",""+Dn(n.value));break;case"select":e.multiple=!!n.multiple,s=n.value,s!=null?Ms(e,!!n.multiple,s,!1):n.defaultValue!=null&&Ms(e,!!n.multiple,n.defaultValue,!0);break;default:typeof r.onClick=="function"&&(e.onclick=gi)}switch(a){case"button":case"input":case"select":case"textarea":n=!!n.autoFocus;break e;case"img":n=!0;break e;default:n=!1}}n&&(t.flags|=4)}t.ref!==null&&(t.flags|=512,t.flags|=2097152)}return Kt(t),null;case 6:if(e&&t.stateNode!=null)zg(e,t,e.memoizedProps,n);else{if(typeof n!="string"&&t.stateNode===null)throw Error(re(166));if(a=bs(co.current),bs(Ka.current),ki(t)){if(n=t.stateNode,a=t.memoizedProps,n[Ga]=t,(s=n.nodeValue!==a)&&(e=ma,e!==null))switch(e.tag){case 3:mi(n.nodeValue,a,(e.mode&1)!==0);break;case 5:e.memoizedProps.suppressHydrationWarning!==!0&&mi(n.nodeValue,a,(e.mode&1)!==0)}s&&(t.flags|=4)}else n=(a.nodeType===9?a:a.ownerDocument).createTextNode(n),n[Ga]=t,t.stateNode=n}return Kt(t),null;case 13:if(lt(mt),n=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(ut&&ga!==null&&t.mode&1&&!(t.flags&128))Um(),Js(),t.flags|=98560,s=!1;else if(s=ki(t),n!==null&&n.dehydrated!==null){if(e===null){if(!s)throw Error(re(318));if(s=t.memoizedState,s=s!==null?s.dehydrated:null,!s)throw Error(re(317));s[Ga]=t}else Js(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Kt(t),s=!1}else Oa!==null&&(Xc(Oa),Oa=null),s=!0;if(!s)return t.flags&65536?t:null}return t.flags&128?(t.lanes=a,t):(n=n!==null,n!==(e!==null&&e.memoizedState!==null)&&n&&(t.child.flags|=8192,t.mode&1&&(e===null||mt.current&1?Rt===0&&(Rt=3):eu())),t.updateQueue!==null&&(t.flags|=4),Kt(t),null);case 4:return nr(),Fc(e,t),e===null&&ao(t.stateNode.containerInfo),Kt(t),null;case 10:return mc(t.type._context),Kt(t),null;case 17:return sa(t.type)&&vi(),Kt(t),null;case 19:if(lt(mt),s=t.memoizedState,s===null)return Kt(t),null;if(n=(t.flags&128)!==0,o=s.rendering,o===null)if(n)go(s,!1);else{if(Rt!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=Ti(e),o!==null){for(t.flags|=128,go(s,!1),n=o.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),t.subtreeFlags=0,n=a,a=t.child;a!==null;)s=a,e=n,s.flags&=14680066,o=s.alternate,o===null?(s.childLanes=0,s.lanes=e,s.child=null,s.subtreeFlags=0,s.memoizedProps=null,s.memoizedState=null,s.updateQueue=null,s.dependencies=null,s.stateNode=null):(s.childLanes=o.childLanes,s.lanes=o.lanes,s.child=o.child,s.subtreeFlags=0,s.deletions=null,s.memoizedProps=o.memoizedProps,s.memoizedState=o.memoizedState,s.updateQueue=o.updateQueue,s.type=o.type,e=o.dependencies,s.dependencies=e===null?null:{lanes:e.lanes,firstContext:e.firstContext}),a=a.sibling;return ot(mt,mt.current&1|2),t.child}e=e.sibling}s.tail!==null&&wt()>ir&&(t.flags|=128,n=!0,go(s,!1),t.lanes=4194304)}else{if(!n)if(e=Ti(o),e!==null){if(t.flags|=128,n=!0,a=e.updateQueue,a!==null&&(t.updateQueue=a,t.flags|=4),go(s,!0),s.tail===null&&s.tailMode==="hidden"&&!o.alternate&&!ut)return Kt(t),null}else 2*wt()-s.renderingStartTime>ir&&a!==1073741824&&(t.flags|=128,n=!0,go(s,!1),t.lanes=4194304);s.isBackwards?(o.sibling=t.child,t.child=o):(a=s.last,a!==null?a.sibling=o:t.child=o,s.last=o)}return s.tail!==null?(t=s.tail,s.rendering=t,s.tail=t.sibling,s.renderingStartTime=wt(),t.sibling=null,a=mt.current,ot(mt,n?a&1|2:a&1),t):(Kt(t),null);case 22:case 23:return Jc(),n=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==n&&(t.flags|=8192),n&&t.mode&1?ha&1073741824&&(Kt(t),t.subtreeFlags&6&&(t.flags|=8192)):Kt(t),null;case 24:return null;case 25:return null}throw Error(re(156,t.tag))}function V0(e,t){switch(lc(t),t.tag){case 1:return sa(t.type)&&vi(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return nr(),lt(na),lt(Ht),wc(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return yc(t),null;case 13:if(lt(mt),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(re(340));Js()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return lt(mt),null;case 4:return nr(),null;case 10:return mc(t.type._context),null;case 22:case 23:return Jc(),null;case 24:return null;default:return null}}var Li=!1,Yt=!1,W0=typeof WeakSet=="function"?WeakSet:Set,pe=null;function rr(e,t){var a=e.ref;if(a!==null)if(typeof a=="function")try{a(null)}catch(n){vt(e,t,n)}else a.current=null}function Bc(e,t,a){try{a()}catch(n){vt(e,t,n)}}var Fg=!1;function H0(e,t){if(Jd=ni,e=bm(),Wd(e)){if("selectionStart"in e)var a={start:e.selectionStart,end:e.selectionEnd};else e:{a=(a=e.ownerDocument)&&a.defaultView||window;var n=a.getSelection&&a.getSelection();if(n&&n.rangeCount!==0){a=n.anchorNode;var r=n.anchorOffset,s=n.focusNode;n=n.focusOffset;try{a.nodeType,s.nodeType}catch{a=null;break e}var o=0,i=-1,l=-1,c=0,u=0,p=e,f=null;t:for(;;){for(var v;p!==a||r!==0&&p.nodeType!==3||(i=o+r),p!==s||n!==0&&p.nodeType!==3||(l=o+n),p.nodeType===3&&(o+=p.nodeValue.length),(v=p.firstChild)!==null;)f=p,p=v;for(;;){if(p===e)break t;if(f===a&&++c===r&&(i=o),f===s&&++u===n&&(l=o),(v=p.nextSibling)!==null)break;p=f,f=p.parentNode}p=v}a=i===-1||l===-1?null:{start:i,end:l}}else a=null}a=a||{start:0,end:0}}else a=null;for(ec={focusedElem:e,selectionRange:a},ni=!1,pe=t;pe!==null;)if(t=pe,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,pe=e;else for(;pe!==null;){t=pe;try{var x=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(x!==null){var b=x.memoizedProps,k=x.memoizedState,g=t.stateNode,d=g.getSnapshotBeforeUpdate(t.elementType===t.type?b:La(t.type,b),k);g.__reactInternalSnapshotBeforeUpdate=d}break;case 3:var h=t.stateNode.containerInfo;h.nodeType===1?h.textContent="":h.nodeType===9&&h.documentElement&&h.removeChild(h.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(re(163))}}catch(y){vt(t,t.return,y)}if(e=t.sibling,e!==null){e.return=t.return,pe=e;break}pe=t.return}return x=Fg,Fg=!1,x}function ho(e,t,a){var n=t.updateQueue;if(n=n!==null?n.lastEffect:null,n!==null){var r=n=n.next;do{if((r.tag&e)===e){var s=r.destroy;r.destroy=void 0,s!==void 0&&Bc(t,a,s)}r=r.next}while(r!==n)}}function Mi(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var a=t=t.next;do{if((a.tag&e)===e){var n=a.create;a.destroy=n()}a=a.next}while(a!==t)}}function Uc(e){var t=e.ref;if(t!==null){var a=e.stateNode;switch(e.tag){case 5:e=a;break;default:e=a}typeof t=="function"?t(e):t.current=e}}function Bg(e){var t=e.alternate;t!==null&&(e.alternate=null,Bg(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Ga],delete t[so],delete t[sc],delete t[T0],delete t[P0])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Ug(e){return e.tag===5||e.tag===3||e.tag===4}function qg(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Ug(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function qc(e,t,a){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?a.nodeType===8?a.parentNode.insertBefore(e,t):a.insertBefore(e,t):(a.nodeType===8?(t=a.parentNode,t.insertBefore(e,a)):(t=a,t.appendChild(e)),a=a._reactRootContainer,a!=null||t.onclick!==null||(t.onclick=gi));else if(n!==4&&(e=e.child,e!==null))for(qc(e,t,a),e=e.sibling;e!==null;)qc(e,t,a),e=e.sibling}function Vc(e,t,a){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?a.insertBefore(e,t):a.appendChild(e);else if(n!==4&&(e=e.child,e!==null))for(Vc(e,t,a),e=e.sibling;e!==null;)Vc(e,t,a),e=e.sibling}var Ut=null,Ma=!1;function Kn(e,t,a){for(a=a.child;a!==null;)Vg(e,t,a),a=a.sibling}function Vg(e,t,a){if(Ha&&typeof Ha.onCommitFiberUnmount=="function")try{Ha.onCommitFiberUnmount(Xo,a)}catch{}switch(a.tag){case 5:Yt||rr(a,t);case 6:var n=Ut,r=Ma;Ut=null,Kn(e,t,a),Ut=n,Ma=r,Ut!==null&&(Ma?(e=Ut,a=a.stateNode,e.nodeType===8?e.parentNode.removeChild(a):e.removeChild(a)):Ut.removeChild(a.stateNode));break;case 18:Ut!==null&&(Ma?(e=Ut,a=a.stateNode,e.nodeType===8?nc(e.parentNode,a):e.nodeType===1&&nc(e,a),Gr(e)):nc(Ut,a.stateNode));break;case 4:n=Ut,r=Ma,Ut=a.stateNode.containerInfo,Ma=!0,Kn(e,t,a),Ut=n,Ma=r;break;case 0:case 11:case 14:case 15:if(!Yt&&(n=a.updateQueue,n!==null&&(n=n.lastEffect,n!==null))){r=n=n.next;do{var s=r,o=s.destroy;s=s.tag,o!==void 0&&(s&2||s&4)&&Bc(a,t,o),r=r.next}while(r!==n)}Kn(e,t,a);break;case 1:if(!Yt&&(rr(a,t),n=a.stateNode,typeof n.componentWillUnmount=="function"))try{n.props=a.memoizedProps,n.state=a.memoizedState,n.componentWillUnmount()}catch(i){vt(a,t,i)}Kn(e,t,a);break;case 21:Kn(e,t,a);break;case 22:a.mode&1?(Yt=(n=Yt)||a.memoizedState!==null,Kn(e,t,a),Yt=n):Kn(e,t,a);break;default:Kn(e,t,a)}}function Wg(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var a=e.stateNode;a===null&&(a=e.stateNode=new W0),t.forEach(function(n){var r=t1.bind(null,e,n);a.has(n)||(a.add(n),n.then(r,r))})}}function za(e,t){var a=t.deletions;if(a!==null)for(var n=0;n<a.length;n++){var r=a[n];try{var s=e,o=t,i=o;e:for(;i!==null;){switch(i.tag){case 5:Ut=i.stateNode,Ma=!1;break e;case 3:Ut=i.stateNode.containerInfo,Ma=!0;break e;case 4:Ut=i.stateNode.containerInfo,Ma=!0;break e}i=i.return}if(Ut===null)throw Error(re(160));Vg(s,o,r),Ut=null,Ma=!1;var l=r.alternate;l!==null&&(l.return=null),r.return=null}catch(c){vt(r,t,c)}}if(t.subtreeFlags&12854)for(t=t.child;t!==null;)Hg(t,e),t=t.sibling}function Hg(e,t){var a=e.alternate,n=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(za(t,e),Qa(e),n&4){try{ho(3,e,e.return),Mi(3,e)}catch(b){vt(e,e.return,b)}try{ho(5,e,e.return)}catch(b){vt(e,e.return,b)}}break;case 1:za(t,e),Qa(e),n&512&&a!==null&&rr(a,a.return);break;case 5:if(za(t,e),Qa(e),n&512&&a!==null&&rr(a,a.return),e.flags&32){var r=e.stateNode;try{Or(r,"")}catch(b){vt(e,e.return,b)}}if(n&4&&(r=e.stateNode,r!=null)){var s=e.memoizedProps,o=a!==null?a.memoizedProps:s,i=e.type,l=e.updateQueue;if(e.updateQueue=null,l!==null)try{i==="input"&&s.type==="radio"&&s.name!=null&&xf(r,s),wd(i,o);var c=wd(i,s);for(o=0;o<l.length;o+=2){var u=l[o],p=l[o+1];u==="style"?Tf(r,p):u==="dangerouslySetInnerHTML"?Ef(r,p):u==="children"?Or(r,p):sd(r,u,p,c)}switch(i){case"input":hd(r,s);break;case"textarea":Nf(r,s);break;case"select":var f=r._wrapperState.wasMultiple;r._wrapperState.wasMultiple=!!s.multiple;var v=s.value;v!=null?Ms(r,!!s.multiple,v,!1):f!==!!s.multiple&&(s.defaultValue!=null?Ms(r,!!s.multiple,s.defaultValue,!0):Ms(r,!!s.multiple,s.multiple?[]:"",!1))}r[so]=s}catch(b){vt(e,e.return,b)}}break;case 6:if(za(t,e),Qa(e),n&4){if(e.stateNode===null)throw Error(re(162));r=e.stateNode,s=e.memoizedProps;try{r.nodeValue=s}catch(b){vt(e,e.return,b)}}break;case 3:if(za(t,e),Qa(e),n&4&&a!==null&&a.memoizedState.isDehydrated)try{Gr(t.containerInfo)}catch(b){vt(e,e.return,b)}break;case 4:za(t,e),Qa(e);break;case 13:za(t,e),Qa(e),r=e.child,r.flags&8192&&(s=r.memoizedState!==null,r.stateNode.isHidden=s,!s||r.alternate!==null&&r.alternate.memoizedState!==null||(Gc=wt())),n&4&&Wg(e);break;case 22:if(u=a!==null&&a.memoizedState!==null,e.mode&1?(Yt=(c=Yt)||u,za(t,e),Yt=c):za(t,e),Qa(e),n&8192){if(c=e.memoizedState!==null,(e.stateNode.isHidden=c)&&!u&&e.mode&1)for(pe=e,u=e.child;u!==null;){for(p=pe=u;pe!==null;){switch(f=pe,v=f.child,f.tag){case 0:case 11:case 14:case 15:ho(4,f,f.return);break;case 1:rr(f,f.return);var x=f.stateNode;if(typeof x.componentWillUnmount=="function"){n=f,a=f.return;try{t=n,x.props=t.memoizedProps,x.state=t.memoizedState,x.componentWillUnmount()}catch(b){vt(n,a,b)}}break;case 5:rr(f,f.return);break;case 22:if(f.memoizedState!==null){Yg(p);continue}}v!==null?(v.return=f,pe=v):Yg(p)}u=u.sibling}e:for(u=null,p=e;;){if(p.tag===5){if(u===null){u=p;try{r=p.stateNode,c?(s=r.style,typeof s.setProperty=="function"?s.setProperty("display","none","important"):s.display="none"):(i=p.stateNode,l=p.memoizedProps.style,o=l!=null&&l.hasOwnProperty("display")?l.display:null,i.style.display=$f("display",o))}catch(b){vt(e,e.return,b)}}}else if(p.tag===6){if(u===null)try{p.stateNode.nodeValue=c?"":p.memoizedProps}catch(b){vt(e,e.return,b)}}else if((p.tag!==22&&p.tag!==23||p.memoizedState===null||p===e)&&p.child!==null){p.child.return=p,p=p.child;continue}if(p===e)break e;for(;p.sibling===null;){if(p.return===null||p.return===e)break e;u===p&&(u=null),p=p.return}u===p&&(u=null),p.sibling.return=p.return,p=p.sibling}}break;case 19:za(t,e),Qa(e),n&4&&Wg(e);break;case 21:break;default:za(t,e),Qa(e)}}function Qa(e){var t=e.flags;if(t&2){try{e:{for(var a=e.return;a!==null;){if(Ug(a)){var n=a;break e}a=a.return}throw Error(re(160))}switch(n.tag){case 5:var r=n.stateNode;n.flags&32&&(Or(r,""),n.flags&=-33);var s=qg(e);Vc(e,s,r);break;case 3:case 4:var o=n.stateNode.containerInfo,i=qg(e);qc(e,i,o);break;default:throw Error(re(161))}}catch(l){vt(e,e.return,l)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function G0(e,t,a){pe=e,Gg(e)}function Gg(e,t,a){for(var n=(e.mode&1)!==0;pe!==null;){var r=pe,s=r.child;if(r.tag===22&&n){var o=r.memoizedState!==null||Li;if(!o){var i=r.alternate,l=i!==null&&i.memoizedState!==null||Yt;i=Li;var c=Yt;if(Li=o,(Yt=l)&&!c)for(pe=r;pe!==null;)o=pe,l=o.child,o.tag===22&&o.memoizedState!==null?Qg(r):l!==null?(l.return=o,pe=l):Qg(r);for(;s!==null;)pe=s,Gg(s),s=s.sibling;pe=r,Li=i,Yt=c}Kg(e)}else r.subtreeFlags&8772&&s!==null?(s.return=r,pe=s):Kg(e)}}function Kg(e){for(;pe!==null;){var t=pe;if(t.flags&8772){var a=t.alternate;try{if(t.flags&8772)switch(t.tag){case 0:case 11:case 15:Yt||Mi(5,t);break;case 1:var n=t.stateNode;if(t.flags&4&&!Yt)if(a===null)n.componentDidMount();else{var r=t.elementType===t.type?a.memoizedProps:La(t.type,a.memoizedProps);n.componentDidUpdate(r,a.memoizedState,n.__reactInternalSnapshotBeforeUpdate)}var s=t.updateQueue;s!==null&&Ym(t,s,n);break;case 3:var o=t.updateQueue;if(o!==null){if(a=null,t.child!==null)switch(t.child.tag){case 5:a=t.child.stateNode;break;case 1:a=t.child.stateNode}Ym(t,o,a)}break;case 5:var i=t.stateNode;if(a===null&&t.flags&4){a=i;var l=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":l.autoFocus&&a.focus();break;case"img":l.src&&(a.src=l.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(t.memoizedState===null){var c=t.alternate;if(c!==null){var u=c.memoizedState;if(u!==null){var p=u.dehydrated;p!==null&&Gr(p)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;default:throw Error(re(163))}Yt||t.flags&512&&Uc(t)}catch(f){vt(t,t.return,f)}}if(t===e){pe=null;break}if(a=t.sibling,a!==null){a.return=t.return,pe=a;break}pe=t.return}}function Yg(e){for(;pe!==null;){var t=pe;if(t===e){pe=null;break}var a=t.sibling;if(a!==null){a.return=t.return,pe=a;break}pe=t.return}}function Qg(e){for(;pe!==null;){var t=pe;try{switch(t.tag){case 0:case 11:case 15:var a=t.return;try{Mi(4,t)}catch(l){vt(t,a,l)}break;case 1:var n=t.stateNode;if(typeof n.componentDidMount=="function"){var r=t.return;try{n.componentDidMount()}catch(l){vt(t,r,l)}}var s=t.return;try{Uc(t)}catch(l){vt(t,s,l)}break;case 5:var o=t.return;try{Uc(t)}catch(l){vt(t,o,l)}}}catch(l){vt(t,t.return,l)}if(t===e){pe=null;break}var i=t.sibling;if(i!==null){i.return=t.return,pe=i;break}pe=t.return}}var K0=Math.ceil,zi=on.ReactCurrentDispatcher,Wc=on.ReactCurrentOwner,$a=on.ReactCurrentBatchConfig,Be=0,Mt=null,Et=null,qt=0,ha=0,or=qn(0),Rt=0,vo=null,xs=0,Fi=0,Hc=0,bo=null,oa=null,Gc=0,ir=1/0,gn=null,Bi=!1,Kc=null,Yn=null,Ui=!1,Qn=null,qi=0,yo=0,Yc=null,Vi=-1,Wi=0;function ea(){return Be&6?wt():Vi!==-1?Vi:Vi=wt()}function Xn(e){return e.mode&1?Be&2&&qt!==0?qt&-qt:I0.transition!==null?(Wi===0&&(Wi=qf()),Wi):(e=Xe,e!==0||(e=window.event,e=e===void 0?16:Zf(e.type)),e):1}function Fa(e,t,a,n){if(50<yo)throw yo=0,Yc=null,Error(re(185));Ur(e,a,n),(!(Be&2)||e!==Mt)&&(e===Mt&&(!(Be&2)&&(Fi|=a),Rt===4&&Zn(e,qt)),ia(e,n),a===1&&Be===0&&!(t.mode&1)&&(ir=wt()+500,yi&&Wn()))}function ia(e,t){var a=e.callbackNode;Iw(e,t);var n=ei(e,e===Mt?qt:0);if(n===0)a!==null&&Ff(a),e.callbackNode=null,e.callbackPriority=0;else if(t=n&-n,e.callbackPriority!==t){if(a!=null&&Ff(a),t===1)e.tag===0?_0(Zg.bind(null,e)):Lm(Zg.bind(null,e)),E0(function(){!(Be&6)&&Wn()}),a=null;else{switch(Vf(n)){case 1:a=Td;break;case 4:a=Bf;break;case 16:a=Qo;break;case 536870912:a=Uf;break;default:a=Qo}a=oh(a,Xg.bind(null,e))}e.callbackPriority=t,e.callbackNode=a}}function Xg(e,t){if(Vi=-1,Wi=0,Be&6)throw Error(re(327));var a=e.callbackNode;if(lr()&&e.callbackNode!==a)return null;var n=ei(e,e===Mt?qt:0);if(n===0)return null;if(n&30||n&e.expiredLanes||t)t=Hi(e,n);else{t=n;var r=Be;Be|=2;var s=eh();(Mt!==e||qt!==t)&&(gn=null,ir=wt()+500,ks(e,t));do try{X0();break}catch(i){Jg(e,i)}while(!0);fc(),zi.current=s,Be=r,Et!==null?t=0:(Mt=null,qt=0,t=Rt)}if(t!==0){if(t===2&&(r=Pd(e),r!==0&&(n=r,t=Qc(e,r))),t===1)throw a=vo,ks(e,0),Zn(e,n),ia(e,wt()),a;if(t===6)Zn(e,n);else{if(r=e.current.alternate,!(n&30)&&!Y0(r)&&(t=Hi(e,n),t===2&&(s=Pd(e),s!==0&&(n=s,t=Qc(e,s))),t===1))throw a=vo,ks(e,0),Zn(e,n),ia(e,wt()),a;switch(e.finishedWork=r,e.finishedLanes=n,t){case 0:case 1:throw Error(re(345));case 2:Ns(e,oa,gn);break;case 3:if(Zn(e,n),(n&130023424)===n&&(t=Gc+500-wt(),10<t)){if(ei(e,0)!==0)break;if(r=e.suspendedLanes,(r&n)!==n){ea(),e.pingedLanes|=e.suspendedLanes&r;break}e.timeoutHandle=ac(Ns.bind(null,e,oa,gn),t);break}Ns(e,oa,gn);break;case 4:if(Zn(e,n),(n&4194240)===n)break;for(t=e.eventTimes,r=-1;0<n;){var o=31-ja(n);s=1<<o,o=t[o],o>r&&(r=o),n&=~s}if(n=r,n=wt()-n,n=(120>n?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*K0(n/1960))-n,10<n){e.timeoutHandle=ac(Ns.bind(null,e,oa,gn),n);break}Ns(e,oa,gn);break;case 5:Ns(e,oa,gn);break;default:throw Error(re(329))}}}return ia(e,wt()),e.callbackNode===a?Xg.bind(null,e):null}function Qc(e,t){var a=bo;return e.current.memoizedState.isDehydrated&&(ks(e,t).flags|=256),e=Hi(e,t),e!==2&&(t=oa,oa=a,t!==null&&Xc(t)),e}function Xc(e){oa===null?oa=e:oa.push.apply(oa,e)}function Y0(e){for(var t=e;;){if(t.flags&16384){var a=t.updateQueue;if(a!==null&&(a=a.stores,a!==null))for(var n=0;n<a.length;n++){var r=a[n],s=r.getSnapshot;r=r.value;try{if(!Da(s(),r))return!1}catch{return!1}}}if(a=t.child,t.subtreeFlags&16384&&a!==null)a.return=t,t=a;else{if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}function Zn(e,t){for(t&=~Hc,t&=~Fi,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var a=31-ja(t),n=1<<a;e[a]=-1,t&=~n}}function Zg(e){if(Be&6)throw Error(re(327));lr();var t=ei(e,0);if(!(t&1))return ia(e,wt()),null;var a=Hi(e,t);if(e.tag!==0&&a===2){var n=Pd(e);n!==0&&(t=n,a=Qc(e,n))}if(a===1)throw a=vo,ks(e,0),Zn(e,t),ia(e,wt()),a;if(a===6)throw Error(re(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,Ns(e,oa,gn),ia(e,wt()),null}function Zc(e,t){var a=Be;Be|=1;try{return e(t)}finally{Be=a,Be===0&&(ir=wt()+500,yi&&Wn())}}function ws(e){Qn!==null&&Qn.tag===0&&!(Be&6)&&lr();var t=Be;Be|=1;var a=$a.transition,n=Xe;try{if($a.transition=null,Xe=1,e)return e()}finally{Xe=n,$a.transition=a,Be=t,!(Be&6)&&Wn()}}function Jc(){ha=or.current,lt(or)}function ks(e,t){e.finishedWork=null,e.finishedLanes=0;var a=e.timeoutHandle;if(a!==-1&&(e.timeoutHandle=-1,C0(a)),Et!==null)for(a=Et.return;a!==null;){var n=a;switch(lc(n),n.tag){case 1:n=n.type.childContextTypes,n!=null&&vi();break;case 3:nr(),lt(na),lt(Ht),wc();break;case 5:yc(n);break;case 4:nr();break;case 13:lt(mt);break;case 19:lt(mt);break;case 10:mc(n.type._context);break;case 22:case 23:Jc()}a=a.return}if(Mt=e,Et=e=Jn(e.current,null),qt=ha=t,Rt=0,vo=null,Hc=Fi=xs=0,oa=bo=null,vs!==null){for(t=0;t<vs.length;t++)if(a=vs[t],n=a.interleaved,n!==null){a.interleaved=null;var r=n.next,s=a.pending;if(s!==null){var o=s.next;s.next=r,n.next=o}a.pending=n}vs=null}return e}function Jg(e,t){do{var a=Et;try{if(fc(),Pi.current=Ai,_i){for(var n=gt.memoizedState;n!==null;){var r=n.queue;r!==null&&(r.pending=null),n=n.next}_i=!1}if(ys=0,Lt=It=gt=null,uo=!1,po=0,Wc.current=null,a===null||a.return===null){Rt=1,vo=t,Et=null;break}e:{var s=e,o=a.return,i=a,l=t;if(t=qt,i.flags|=32768,l!==null&&typeof l=="object"&&typeof l.then=="function"){var c=l,u=i,p=u.tag;if(!(u.mode&1)&&(p===0||p===11||p===15)){var f=u.alternate;f?(u.updateQueue=f.updateQueue,u.memoizedState=f.memoizedState,u.lanes=f.lanes):(u.updateQueue=null,u.memoizedState=null)}var v=Sg(o);if(v!==null){v.flags&=-257,Cg(v,o,i,s,t),v.mode&1&&Ng(s,c,t),t=v,l=c;var x=t.updateQueue;if(x===null){var b=new Set;b.add(l),t.updateQueue=b}else x.add(l);break e}else{if(!(t&1)){Ng(s,c,t),eu();break e}l=Error(re(426))}}else if(ut&&i.mode&1){var k=Sg(o);if(k!==null){!(k.flags&65536)&&(k.flags|=256),Cg(k,o,i,s,t),uc(sr(l,i));break e}}s=l=sr(l,i),Rt!==4&&(Rt=2),bo===null?bo=[s]:bo.push(s),s=o;do{switch(s.tag){case 3:s.flags|=65536,t&=-t,s.lanes|=t;var g=wg(s,l,t);Km(s,g);break e;case 1:i=l;var d=s.type,h=s.stateNode;if(!(s.flags&128)&&(typeof d.getDerivedStateFromError=="function"||h!==null&&typeof h.componentDidCatch=="function"&&(Yn===null||!Yn.has(h)))){s.flags|=65536,t&=-t,s.lanes|=t;var y=kg(s,i,t);Km(s,y);break e}}s=s.return}while(s!==null)}ah(a)}catch(S){t=S,Et===a&&a!==null&&(Et=a=a.return);continue}break}while(!0)}function eh(){var e=zi.current;return zi.current=Ai,e===null?Ai:e}function eu(){(Rt===0||Rt===3||Rt===2)&&(Rt=4),Mt===null||!(xs&268435455)&&!(Fi&268435455)||Zn(Mt,qt)}function Hi(e,t){var a=Be;Be|=2;var n=eh();(Mt!==e||qt!==t)&&(gn=null,ks(e,t));do try{Q0();break}catch(r){Jg(e,r)}while(!0);if(fc(),Be=a,zi.current=n,Et!==null)throw Error(re(261));return Mt=null,qt=0,Rt}function Q0(){for(;Et!==null;)th(Et)}function X0(){for(;Et!==null&&!kw();)th(Et)}function th(e){var t=rh(e.alternate,e,ha);e.memoizedProps=e.pendingProps,t===null?ah(e):Et=t,Wc.current=null}function ah(e){var t=e;do{var a=t.alternate;if(e=t.return,t.flags&32768){if(a=V0(a,t),a!==null){a.flags&=32767,Et=a;return}if(e!==null)e.flags|=32768,e.subtreeFlags=0,e.deletions=null;else{Rt=6,Et=null;return}}else if(a=q0(a,t,ha),a!==null){Et=a;return}if(t=t.sibling,t!==null){Et=t;return}Et=t=e}while(t!==null);Rt===0&&(Rt=5)}function Ns(e,t,a){var n=Xe,r=$a.transition;try{$a.transition=null,Xe=1,Z0(e,t,a,n)}finally{$a.transition=r,Xe=n}return null}function Z0(e,t,a,n){do lr();while(Qn!==null);if(Be&6)throw Error(re(327));a=e.finishedWork;var r=e.finishedLanes;if(a===null)return null;if(e.finishedWork=null,e.finishedLanes=0,a===e.current)throw Error(re(177));e.callbackNode=null,e.callbackPriority=0;var s=a.lanes|a.childLanes;if(Rw(e,s),e===Mt&&(Et=Mt=null,qt=0),!(a.subtreeFlags&2064)&&!(a.flags&2064)||Ui||(Ui=!0,oh(Qo,function(){return lr(),null})),s=(a.flags&15990)!==0,a.subtreeFlags&15990||s){s=$a.transition,$a.transition=null;var o=Xe;Xe=1;var i=Be;Be|=4,Wc.current=null,H0(e,a),Hg(a,e),b0(ec),ni=!!Jd,ec=Jd=null,e.current=a,G0(a),Nw(),Be=i,Xe=o,$a.transition=s}else e.current=a;if(Ui&&(Ui=!1,Qn=e,qi=r),s=e.pendingLanes,s===0&&(Yn=null),Ew(a.stateNode),ia(e,wt()),t!==null)for(n=e.onRecoverableError,a=0;a<t.length;a++)r=t[a],n(r.value,{componentStack:r.stack,digest:r.digest});if(Bi)throw Bi=!1,e=Kc,Kc=null,e;return qi&1&&e.tag!==0&&lr(),s=e.pendingLanes,s&1?e===Yc?yo++:(yo=0,Yc=e):yo=0,Wn(),null}function lr(){if(Qn!==null){var e=Vf(qi),t=$a.transition,a=Xe;try{if($a.transition=null,Xe=16>e?16:e,Qn===null)var n=!1;else{if(e=Qn,Qn=null,qi=0,Be&6)throw Error(re(331));var r=Be;for(Be|=4,pe=e.current;pe!==null;){var s=pe,o=s.child;if(pe.flags&16){var i=s.deletions;if(i!==null){for(var l=0;l<i.length;l++){var c=i[l];for(pe=c;pe!==null;){var u=pe;switch(u.tag){case 0:case 11:case 15:ho(8,u,s)}var p=u.child;if(p!==null)p.return=u,pe=p;else for(;pe!==null;){u=pe;var f=u.sibling,v=u.return;if(Bg(u),u===c){pe=null;break}if(f!==null){f.return=v,pe=f;break}pe=v}}}var x=s.alternate;if(x!==null){var b=x.child;if(b!==null){x.child=null;do{var k=b.sibling;b.sibling=null,b=k}while(b!==null)}}pe=s}}if(s.subtreeFlags&2064&&o!==null)o.return=s,pe=o;else e:for(;pe!==null;){if(s=pe,s.flags&2048)switch(s.tag){case 0:case 11:case 15:ho(9,s,s.return)}var g=s.sibling;if(g!==null){g.return=s.return,pe=g;break e}pe=s.return}}var d=e.current;for(pe=d;pe!==null;){o=pe;var h=o.child;if(o.subtreeFlags&2064&&h!==null)h.return=o,pe=h;else e:for(o=d;pe!==null;){if(i=pe,i.flags&2048)try{switch(i.tag){case 0:case 11:case 15:Mi(9,i)}}catch(S){vt(i,i.return,S)}if(i===o){pe=null;break e}var y=i.sibling;if(y!==null){y.return=i.return,pe=y;break e}pe=i.return}}if(Be=r,Wn(),Ha&&typeof Ha.onPostCommitFiberRoot=="function")try{Ha.onPostCommitFiberRoot(Xo,e)}catch{}n=!0}return n}finally{Xe=a,$a.transition=t}}return!1}function nh(e,t,a){t=sr(a,t),t=wg(e,t,1),e=Gn(e,t,1),t=ea(),e!==null&&(Ur(e,1,t),ia(e,t))}function vt(e,t,a){if(e.tag===3)nh(e,e,a);else for(;t!==null;){if(t.tag===3){nh(t,e,a);break}else if(t.tag===1){var n=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof n.componentDidCatch=="function"&&(Yn===null||!Yn.has(n))){e=sr(a,e),e=kg(t,e,1),t=Gn(t,e,1),e=ea(),t!==null&&(Ur(t,1,e),ia(t,e));break}}t=t.return}}function J0(e,t,a){var n=e.pingCache;n!==null&&n.delete(t),t=ea(),e.pingedLanes|=e.suspendedLanes&a,Mt===e&&(qt&a)===a&&(Rt===4||Rt===3&&(qt&130023424)===qt&&500>wt()-Gc?ks(e,0):Hc|=a),ia(e,t)}function sh(e,t){t===0&&(e.mode&1?(t=Jo,Jo<<=1,!(Jo&130023424)&&(Jo=4194304)):t=1);var a=ea();e=pn(e,t),e!==null&&(Ur(e,t,a),ia(e,a))}function e1(e){var t=e.memoizedState,a=0;t!==null&&(a=t.retryLane),sh(e,a)}function t1(e,t){var a=0;switch(e.tag){case 13:var n=e.stateNode,r=e.memoizedState;r!==null&&(a=r.retryLane);break;case 19:n=e.stateNode;break;default:throw Error(re(314))}n!==null&&n.delete(t),sh(e,a)}var rh;rh=function(e,t,a){if(e!==null)if(e.memoizedProps!==t.pendingProps||na.current)ra=!0;else{if(!(e.lanes&a)&&!(t.flags&128))return ra=!1,U0(e,t,a);ra=!!(e.flags&131072)}else ra=!1,ut&&t.flags&1048576&&Mm(t,wi,t.index);switch(t.lanes=0,t.tag){case 2:var n=t.type;Oi(e,t),e=t.pendingProps;var r=Qs(t,Ht.current);ar(t,a),r=Sc(null,t,n,e,r,a);var s=Cc();return t.flags|=1,typeof r=="object"&&r!==null&&typeof r.render=="function"&&r.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,sa(n)?(s=!0,bi(t)):s=!1,t.memoizedState=r.state!==null&&r.state!==void 0?r.state:null,vc(t),r.updater=ji,t.stateNode=r,r._reactInternals=t,Ic(t,n,e,a),t=Dc(null,t,n,!0,s,a)):(t.tag=0,ut&&s&&ic(t),Jt(null,t,r,a),t=t.child),t;case 16:n=t.elementType;e:{switch(Oi(e,t),e=t.pendingProps,r=n._init,n=r(n._payload),t.type=n,r=t.tag=n1(n),e=La(n,e),r){case 0:t=jc(null,t,n,e,a);break e;case 1:t=Ig(null,t,n,e,a);break e;case 11:t=Eg(null,t,n,e,a);break e;case 14:t=$g(null,t,n,La(n.type,e),a);break e}throw Error(re(306,n,""))}return t;case 0:return n=t.type,r=t.pendingProps,r=t.elementType===n?r:La(n,r),jc(e,t,n,r,a);case 1:return n=t.type,r=t.pendingProps,r=t.elementType===n?r:La(n,r),Ig(e,t,n,r,a);case 3:e:{if(Rg(t),e===null)throw Error(re(387));n=t.pendingProps,s=t.memoizedState,r=s.element,Gm(e,t),$i(t,n,null,a);var o=t.memoizedState;if(n=o.element,s.isDehydrated)if(s={element:n,isDehydrated:!1,cache:o.cache,pendingSuspenseBoundaries:o.pendingSuspenseBoundaries,transitions:o.transitions},t.updateQueue.baseState=s,t.memoizedState=s,t.flags&256){r=sr(Error(re(423)),t),t=Ag(e,t,n,a,r);break e}else if(n!==r){r=sr(Error(re(424)),t),t=Ag(e,t,n,a,r);break e}else for(ga=Un(t.stateNode.containerInfo.firstChild),ma=t,ut=!0,Oa=null,a=Wm(t,null,n,a),t.child=a;a;)a.flags=a.flags&-3|4096,a=a.sibling;else{if(Js(),n===r){t=mn(e,t,a);break e}Jt(e,t,n,a)}t=t.child}return t;case 5:return Qm(t),e===null&&cc(t),n=t.type,r=t.pendingProps,s=e!==null?e.memoizedProps:null,o=r.children,tc(n,r)?o=null:s!==null&&tc(n,s)&&(t.flags|=32),_g(e,t),Jt(e,t,o,a),t.child;case 6:return e===null&&cc(t),null;case 13:return jg(e,t,a);case 4:return bc(t,t.stateNode.containerInfo),n=t.pendingProps,e===null?t.child=er(t,null,n,a):Jt(e,t,n,a),t.child;case 11:return n=t.type,r=t.pendingProps,r=t.elementType===n?r:La(n,r),Eg(e,t,n,r,a);case 7:return Jt(e,t,t.pendingProps,a),t.child;case 8:return Jt(e,t,t.pendingProps.children,a),t.child;case 12:return Jt(e,t,t.pendingProps.children,a),t.child;case 10:e:{if(n=t.type._context,r=t.pendingProps,s=t.memoizedProps,o=r.value,ot(Si,n._currentValue),n._currentValue=o,s!==null)if(Da(s.value,o)){if(s.children===r.children&&!na.current){t=mn(e,t,a);break e}}else for(s=t.child,s!==null&&(s.return=t);s!==null;){var i=s.dependencies;if(i!==null){o=s.child;for(var l=i.firstContext;l!==null;){if(l.context===n){if(s.tag===1){l=fn(-1,a&-a),l.tag=2;var c=s.updateQueue;if(c!==null){c=c.shared;var u=c.pending;u===null?l.next=l:(l.next=u.next,u.next=l),c.pending=l}}s.lanes|=a,l=s.alternate,l!==null&&(l.lanes|=a),gc(s.return,a,t),i.lanes|=a;break}l=l.next}}else if(s.tag===10)o=s.type===t.type?null:s.child;else if(s.tag===18){if(o=s.return,o===null)throw Error(re(341));o.lanes|=a,i=o.alternate,i!==null&&(i.lanes|=a),gc(o,a,t),o=s.sibling}else o=s.child;if(o!==null)o.return=s;else for(o=s;o!==null;){if(o===t){o=null;break}if(s=o.sibling,s!==null){s.return=o.return,o=s;break}o=o.return}s=o}Jt(e,t,r.children,a),t=t.child}return t;case 9:return r=t.type,n=t.pendingProps.children,ar(t,a),r=Ca(r),n=n(r),t.flags|=1,Jt(e,t,n,a),t.child;case 14:return n=t.type,r=La(n,t.pendingProps),r=La(n.type,r),$g(e,t,n,r,a);case 15:return Tg(e,t,t.type,t.pendingProps,a);case 17:return n=t.type,r=t.pendingProps,r=t.elementType===n?r:La(n,r),Oi(e,t),t.tag=1,sa(n)?(e=!0,bi(t)):e=!1,ar(t,a),yg(t,n,r),Ic(t,n,r,a),Dc(null,t,n,!0,e,a);case 19:return Og(e,t,a);case 22:return Pg(e,t,a)}throw Error(re(156,t.tag))};function oh(e,t){return zf(e,t)}function a1(e,t,a,n){this.tag=e,this.key=a,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=n,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Ta(e,t,a,n){return new a1(e,t,a,n)}function tu(e){return e=e.prototype,!(!e||!e.isReactComponent)}function n1(e){if(typeof e=="function")return tu(e)?1:0;if(e!=null){if(e=e.$$typeof,e===id)return 11;if(e===cd)return 14}return 2}function Jn(e,t){var a=e.alternate;return a===null?(a=Ta(e.tag,t,e.key,e.mode),a.elementType=e.elementType,a.type=e.type,a.stateNode=e.stateNode,a.alternate=e,e.alternate=a):(a.pendingProps=t,a.type=e.type,a.flags=0,a.subtreeFlags=0,a.deletions=null),a.flags=e.flags&14680064,a.childLanes=e.childLanes,a.lanes=e.lanes,a.child=e.child,a.memoizedProps=e.memoizedProps,a.memoizedState=e.memoizedState,a.updateQueue=e.updateQueue,t=e.dependencies,a.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},a.sibling=e.sibling,a.index=e.index,a.ref=e.ref,a}function Gi(e,t,a,n,r,s){var o=2;if(n=e,typeof e=="function")tu(e)&&(o=1);else if(typeof e=="string")o=5;else e:switch(e){case Ls:return Ss(a.children,r,s,t);case rd:o=8,r|=8;break;case od:return e=Ta(12,a,t,r|2),e.elementType=od,e.lanes=s,e;case ld:return e=Ta(13,a,t,r),e.elementType=ld,e.lanes=s,e;case dd:return e=Ta(19,a,t,r),e.elementType=dd,e.lanes=s,e;case gf:return Ki(a,r,s,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case ff:o=10;break e;case mf:o=9;break e;case id:o=11;break e;case cd:o=14;break e;case jn:o=16,n=null;break e}throw Error(re(130,e==null?e:typeof e,""))}return t=Ta(o,a,t,r),t.elementType=e,t.type=n,t.lanes=s,t}function Ss(e,t,a,n){return e=Ta(7,e,n,t),e.lanes=a,e}function Ki(e,t,a,n){return e=Ta(22,e,n,t),e.elementType=gf,e.lanes=a,e.stateNode={isHidden:!1},e}function au(e,t,a){return e=Ta(6,e,null,t),e.lanes=a,e}function nu(e,t,a){return t=Ta(4,e.children!==null?e.children:[],e.key,t),t.lanes=a,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function s1(e,t,a,n,r){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=_d(0),this.expirationTimes=_d(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=_d(0),this.identifierPrefix=n,this.onRecoverableError=r,this.mutableSourceEagerHydrationData=null}function su(e,t,a,n,r,s,o,i,l){return e=new s1(e,t,a,i,l),t===1?(t=1,s===!0&&(t|=8)):t=0,s=Ta(3,null,null,t),e.current=s,s.stateNode=e,s.memoizedState={element:n,isDehydrated:a,cache:null,transitions:null,pendingSuspenseBoundaries:null},vc(s),e}function r1(e,t,a){var n=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:Os,key:n==null?null:""+n,children:e,containerInfo:t,implementation:a}}function ih(e){if(!e)return Vn;e=e._reactInternals;e:{if(ps(e)!==e||e.tag!==1)throw Error(re(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(sa(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(t!==null);throw Error(re(171))}if(e.tag===1){var a=e.type;if(sa(a))return Dm(e,a,t)}return t}function lh(e,t,a,n,r,s,o,i,l){return e=su(a,n,!0,e,r,s,o,i,l),e.context=ih(null),a=e.current,n=ea(),r=Xn(a),s=fn(n,r),s.callback=t??null,Gn(a,s,r),e.current.lanes=r,Ur(e,r,n),ia(e,n),e}function Yi(e,t,a,n){var r=t.current,s=ea(),o=Xn(r);return a=ih(a),t.context===null?t.context=a:t.pendingContext=a,t=fn(s,o),t.payload={element:e},n=n===void 0?null:n,n!==null&&(t.callback=n),e=Gn(r,t,o),e!==null&&(Fa(e,r,o,s),Ei(e,r,o)),o}function Qi(e){if(e=e.current,!e.child)return null;switch(e.child.tag){case 5:return e.child.stateNode;default:return e.child.stateNode}}function dh(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var a=e.retryLane;e.retryLane=a!==0&&a<t?a:t}}function ru(e,t){dh(e,t),(e=e.alternate)&&dh(e,t)}function o1(){return null}var ch=typeof reportError=="function"?reportError:function(e){console.error(e)};function ou(e){this._internalRoot=e}Xi.prototype.render=ou.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(re(409));Yi(e,t,null,null)},Xi.prototype.unmount=ou.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;ws(function(){Yi(null,e,null,null)}),t[ln]=null}};function Xi(e){this._internalRoot=e}Xi.prototype.unstable_scheduleHydration=function(e){if(e){var t=Gf();e={blockedOn:null,target:e,priority:t};for(var a=0;a<zn.length&&t!==0&&t<zn[a].priority;a++);zn.splice(a,0,e),a===0&&Qf(e)}};function iu(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function Zi(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11&&(e.nodeType!==8||e.nodeValue!==" react-mount-point-unstable "))}function uh(){}function i1(e,t,a,n,r){if(r){if(typeof n=="function"){var s=n;n=function(){var c=Qi(o);s.call(c)}}var o=lh(t,n,e,0,null,!1,!1,"",uh);return e._reactRootContainer=o,e[ln]=o.current,ao(e.nodeType===8?e.parentNode:e),ws(),o}for(;r=e.lastChild;)e.removeChild(r);if(typeof n=="function"){var i=n;n=function(){var c=Qi(l);i.call(c)}}var l=su(e,0,!1,null,null,!1,!1,"",uh);return e._reactRootContainer=l,e[ln]=l.current,ao(e.nodeType===8?e.parentNode:e),ws(function(){Yi(t,l,a,n)}),l}function Ji(e,t,a,n,r){var s=a._reactRootContainer;if(s){var o=s;if(typeof r=="function"){var i=r;r=function(){var l=Qi(o);i.call(l)}}Yi(t,o,e,r)}else o=i1(a,t,e,r,n);return Qi(o)}Wf=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var a=Br(t.pendingLanes);a!==0&&(Id(t,a|1),ia(t,wt()),!(Be&6)&&(ir=wt()+500,Wn()))}break;case 13:ws(function(){var n=pn(e,1);if(n!==null){var r=ea();Fa(n,e,1,r)}}),ru(e,1)}},Rd=function(e){if(e.tag===13){var t=pn(e,134217728);if(t!==null){var a=ea();Fa(t,e,134217728,a)}ru(e,134217728)}},Hf=function(e){if(e.tag===13){var t=Xn(e),a=pn(e,t);if(a!==null){var n=ea();Fa(a,e,t,n)}ru(e,t)}},Gf=function(){return Xe},Kf=function(e,t){var a=Xe;try{return Xe=e,t()}finally{Xe=a}},Sd=function(e,t,a){switch(t){case"input":if(hd(e,a),t=a.name,a.type==="radio"&&t!=null){for(a=e;a.parentNode;)a=a.parentNode;for(a=a.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<a.length;t++){var n=a[t];if(n!==e&&n.form===e.form){var r=hi(n);if(!r)throw Error(re(90));bf(n),hd(n,r)}}}break;case"textarea":Nf(e,a);break;case"select":t=a.value,t!=null&&Ms(e,!!a.multiple,t,!1)}},Rf=Zc,Af=ws;var l1={usingClientEntryPoint:!1,Events:[ro,Ks,hi,_f,If,Zc]},xo={findFiberByHostInstance:fs,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},d1={bundleType:xo.bundleType,version:xo.version,rendererPackageName:xo.rendererPackageName,rendererConfig:xo.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:on.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return e=Lf(e),e===null?null:e.stateNode},findFiberByHostInstance:xo.findFiberByHostInstance||o1,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1-next-f1338f8080-20240426"};if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"){var el=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!el.isDisabled&&el.supportsFiber)try{Xo=el.inject(d1),Ha=el}catch{}}ua.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=l1,ua.createPortal=function(e,t){var a=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!iu(t))throw Error(re(200));return r1(e,t,null,a)},ua.createRoot=function(e,t){if(!iu(e))throw Error(re(299));var a=!1,n="",r=ch;return t!=null&&(t.unstable_strictMode===!0&&(a=!0),t.identifierPrefix!==void 0&&(n=t.identifierPrefix),t.onRecoverableError!==void 0&&(r=t.onRecoverableError)),t=su(e,1,!1,null,null,a,!1,n,r),e[ln]=t.current,ao(e.nodeType===8?e.parentNode:e),new ou(t)},ua.findDOMNode=function(e){if(e==null)return null;if(e.nodeType===1)return e;var t=e._reactInternals;if(t===void 0)throw typeof e.render=="function"?Error(re(188)):(e=Object.keys(e).join(","),Error(re(268,e)));return e=Lf(t),e=e===null?null:e.stateNode,e},ua.flushSync=function(e){return ws(e)},ua.hydrate=function(e,t,a){if(!Zi(t))throw Error(re(200));return Ji(null,e,t,!0,a)},ua.hydrateRoot=function(e,t,a){if(!iu(e))throw Error(re(405));var n=a!=null&&a.hydratedSources||null,r=!1,s="",o=ch;if(a!=null&&(a.unstable_strictMode===!0&&(r=!0),a.identifierPrefix!==void 0&&(s=a.identifierPrefix),a.onRecoverableError!==void 0&&(o=a.onRecoverableError)),t=lh(t,null,e,1,a??null,r,!1,s,o),e[ln]=t.current,ao(e),n)for(e=0;e<n.length;e++)a=n[e],r=a._getVersion,r=r(a._source),t.mutableSourceEagerHydrationData==null?t.mutableSourceEagerHydrationData=[a,r]:t.mutableSourceEagerHydrationData.push(a,r);return new Xi(t)},ua.render=function(e,t,a){if(!Zi(t))throw Error(re(200));return Ji(null,e,t,!1,a)},ua.unmountComponentAtNode=function(e){if(!Zi(e))throw Error(re(40));return e._reactRootContainer?(ws(function(){Ji(null,null,e,!1,function(){e._reactRootContainer=null,e[ln]=null})}),!0):!1},ua.unstable_batchedUpdates=Zc,ua.unstable_renderSubtreeIntoContainer=function(e,t,a,n){if(!Zi(a))throw Error(re(200));if(e==null||e._reactInternals===void 0)throw Error(re(38));return Ji(e,t,a,!1,n)},ua.version="18.3.1-next-f1338f8080-20240426";function ph(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(ph)}catch(e){console.error(e)}}ph(),of.exports=ua;var dr=of.exports,fh,mh=dr;fh=mh.createRoot,mh.hydrateRoot;class c1 extends N.Component{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t){console.error("[dsh-studio] render failed:",t)}render(){return this.state.error?N.createElement("div",{style:{padding:"16px 18px",fontSize:"12px",lineHeight:1.6,whiteSpace:"pre-wrap",color:"#b31d28",fontFamily:"ui-monospace, SFMono-Regular, Menlo, monospace"}},`工作空间渲染失败:
|
|
855
|
+
`+String(this.state.error?.message??this.state.error)):this.props.children}}function u1(e,t,a={}){class n extends t.Component{constructor(s){super(s),this.container=null,this.root=null,this.attach=o=>{this.container=o}}componentDidMount(){this.container&&(this.root=fh(this.container),this.root.render(N.createElement(c1,null,N.createElement(e.StudioPage,a.pageProps??{}))))}componentWillUnmount(){const s=this.root;this.root=null,s&&s.unmount()}render(){return t.createElement("div",{ref:this.attach,style:{display:"contents"}})}}return n.displayName="StudioBridge",n}var gh={exports:{}},tl={};/**
|
|
856
856
|
* @license React
|
|
857
857
|
* react-jsx-runtime.production.min.js
|
|
858
858
|
*
|
|
@@ -860,27 +860,27 @@ Error generating stack: `+s.message+`
|
|
|
860
860
|
*
|
|
861
861
|
* This source code is licensed under the MIT license found in the
|
|
862
862
|
* LICENSE file in the root directory of this source tree.
|
|
863
|
-
*/var
|
|
863
|
+
*/var p1=N,f1=Symbol.for("react.element"),m1=Symbol.for("react.fragment"),g1=Object.prototype.hasOwnProperty,h1=p1.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,v1={key:!0,ref:!0,__self:!0,__source:!0};function hh(e,t,a){var n,r={},s=null,o=null;a!==void 0&&(s=""+a),t.key!==void 0&&(s=""+t.key),t.ref!==void 0&&(o=t.ref);for(n in t)g1.call(t,n)&&!v1.hasOwnProperty(n)&&(r[n]=t[n]);if(e&&e.defaultProps)for(n in t=e.defaultProps,t)r[n]===void 0&&(r[n]=t[n]);return{$$typeof:f1,type:e,key:s,ref:o,props:r,_owner:h1.current}}tl.Fragment=m1,tl.jsx=hh,tl.jsxs=hh,gh.exports=tl;var $=gh.exports;/**
|
|
864
864
|
* @license lucide-react v0.475.0 - ISC
|
|
865
865
|
*
|
|
866
866
|
* This source code is licensed under the ISC license.
|
|
867
867
|
* See the LICENSE file in the root directory of this source tree.
|
|
868
|
-
*/const
|
|
868
|
+
*/const b1=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),vh=(...e)=>e.filter((t,a,n)=>!!t&&t.trim()!==""&&n.indexOf(t)===a).join(" ").trim();/**
|
|
869
869
|
* @license lucide-react v0.475.0 - ISC
|
|
870
870
|
*
|
|
871
871
|
* This source code is licensed under the ISC license.
|
|
872
872
|
* See the LICENSE file in the root directory of this source tree.
|
|
873
|
-
*/var
|
|
873
|
+
*/var y1={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/**
|
|
874
874
|
* @license lucide-react v0.475.0 - ISC
|
|
875
875
|
*
|
|
876
876
|
* This source code is licensed under the ISC license.
|
|
877
877
|
* See the LICENSE file in the root directory of this source tree.
|
|
878
|
-
*/const
|
|
878
|
+
*/const x1=N.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:a=2,absoluteStrokeWidth:n,className:r="",children:s,iconNode:o,...i},l)=>N.createElement("svg",{ref:l,...y1,width:t,height:t,stroke:e,strokeWidth:n?Number(a)*24/Number(t):a,className:vh("lucide",r),...i},[...o.map(([c,u])=>N.createElement(c,u)),...Array.isArray(s)?s:[s]]));/**
|
|
879
879
|
* @license lucide-react v0.475.0 - ISC
|
|
880
880
|
*
|
|
881
881
|
* This source code is licensed under the ISC license.
|
|
882
882
|
* See the LICENSE file in the root directory of this source tree.
|
|
883
|
-
*/const wo=(e,t)=>{const a=N.forwardRef(({className:n,...r},s)=>N.createElement(
|
|
883
|
+
*/const wo=(e,t)=>{const a=N.forwardRef(({className:n,...r},s)=>N.createElement(x1,{ref:s,iconNode:t,className:vh(`lucide-${b1(e)}`,n),...r}));return a.displayName=`${e}`,a};/**
|
|
884
884
|
* @license lucide-react v0.475.0 - ISC
|
|
885
885
|
*
|
|
886
886
|
* This source code is licensed under the ISC license.
|
|
@@ -890,23 +890,23 @@ Error generating stack: `+s.message+`
|
|
|
890
890
|
*
|
|
891
891
|
* This source code is licensed under the ISC license.
|
|
892
892
|
* See the LICENSE file in the root directory of this source tree.
|
|
893
|
-
*/const
|
|
893
|
+
*/const w1=wo("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/**
|
|
894
894
|
* @license lucide-react v0.475.0 - ISC
|
|
895
895
|
*
|
|
896
896
|
* This source code is licensed under the ISC license.
|
|
897
897
|
* See the LICENSE file in the root directory of this source tree.
|
|
898
|
-
*/const
|
|
898
|
+
*/const k1=wo("EyeOff",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);/**
|
|
899
899
|
* @license lucide-react v0.475.0 - ISC
|
|
900
900
|
*
|
|
901
901
|
* This source code is licensed under the ISC license.
|
|
902
902
|
* See the LICENSE file in the root directory of this source tree.
|
|
903
|
-
*/const
|
|
903
|
+
*/const N1=wo("Eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/**
|
|
904
904
|
* @license lucide-react v0.475.0 - ISC
|
|
905
905
|
*
|
|
906
906
|
* This source code is licensed under the ISC license.
|
|
907
907
|
* See the LICENSE file in the root directory of this source tree.
|
|
908
|
-
*/const yh=wo("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);var N1=Object.defineProperty,lu=(e,t)=>N1(e,"name",{value:t,configurable:!0});function du(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}lu(du,"setRef");function xh(...e){return t=>{let a=!1;const n=e.map(r=>{const s=du(r,t);return!a&&typeof s=="function"&&(a=!0),s});if(a)return()=>{for(let r=0;r<n.length;r++){const s=n[r];typeof s=="function"?s():du(e[r],null)}}}}lu(xh,"composeRefs");function Xe(...e){return N.useCallback(xh(...e),e)}lu(Xe,"useComposedRefs");var S1=Object.defineProperty,va=(e,t)=>S1(e,"name",{value:t,configurable:!0});function hn(e){const t=N.forwardRef((a,n)=>{let{children:r,...s}=a,o=null,i=!1;const l=[];r=$h(r),N.Children.forEach(r,f=>{if(Ch(f)){i=!0;const v=f;let x="child"in v.props?v.props.child:v.props.children;for(;cu(x)&&typeof al=="function";)x=al(x._payload);o=E1(v,x),l.push(o?.props?.children)}else l.push(f)}),o?o=N.cloneElement(o,void 0,l):!i&&N.Children.count(r)===1&&N.isValidElement(r)&&(o=r);const c=o?Sh(o):void 0,u=Xe(n,c);if(!o){if(r||r===0)throw new Error(i?P1(e):T1(e));return r}const p=Nh(s,o.props??{});return o.type!==N.Fragment&&(p.ref=n?u:c),N.cloneElement(o,p)});return t.displayName=`${e}.Slot`,t}va(hn,"createSlot");var C1=hn("Slot"),wh=Symbol.for("radix.slottable");function kh(e){const t=va(a=>"child"in a?a.children(a.child):a.children,"Slottable");return t.displayName=`${e}.Slottable`,t.__radixId=wh,t}va(kh,"createSlottable");var E1=va((e,t)=>"child"in e.props?N.isValidElement(t)?N.cloneElement(t,void 0,e.props.children(t.props.children)):null:N.isValidElement(t)?t:null,"getSlottableElementFromSlottable");function Nh(e,t){const a={...t};for(const n in t){const r=e[n],s=t[n];/^on[A-Z]/.test(n)?r&&s?a[n]=(...i)=>{const l=s(...i);return r(...i),l}:r&&(a[n]=r):n==="style"?a[n]={...r,...s}:n==="className"?a[n]=[r,s].filter(Boolean).join(" "):n==="aria-describedby"&&(a[n]=Th(s,r))}return{...e,...a}}va(Nh,"mergeProps");function Sh(e){let t=Object.getOwnPropertyDescriptor(e.props,"ref")?.get,a=t&&"isReactWarning"in t&&t.isReactWarning;return a?e.ref:(t=Object.getOwnPropertyDescriptor(e,"ref")?.get,a=t&&"isReactWarning"in t&&t.isReactWarning,a?e.props.ref:e.props.ref||e.ref)}va(Sh,"getElementRef");function Ch(e){return N.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===wh}va(Ch,"isSlottable");var $1=Symbol.for("react.lazy");function cu(e){return e!=null&&typeof e=="object"&&"$$typeof"in e&&e.$$typeof===$1&&"_payload"in e&&Eh(e._payload)}va(cu,"isLazyComponent");function Eh(e){return typeof e=="object"&&e!==null&&"then"in e}va(Eh,"isPromiseLike");function $h(e){let t=e;for(;cu(t)&&typeof al=="function";)t=al(t._payload);return t}va($h,"useUnwrappedLazy");function Th(...e){const t=new Set;for(const a of e)if(typeof a=="string")for(const n of String(a).trim().split(/\s+/))n&&t.add(n);return t.size>0?Array.from(t).join(" "):void 0}va(Th,"concatAriaDescribedby");var T1=va(e=>`${e} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,"createSlotError"),P1=va(e=>`${e} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,"createSlottableError"),al=Rn[" use ".trim().toString()],_1=Object.defineProperty,cr=(e,t)=>_1(e,"name",{value:t,configurable:!0}),Ph=!!(typeof window<"u"&&window.document&&window.document.createElement);function Pe(e,t,{checkForDefaultPrevented:a=!0}={}){return cr(function(r){if(e?.(r),a===!1||!r||!r.defaultPrevented)return t?.(r)},"handleEvent")}cr(Pe,"composeEventHandlers");function I1(e){if(!Ph)throw new Error("Cannot access window outside of the DOM");return e?.ownerDocument?.defaultView??window}cr(I1,"getOwnerWindow");function uu(e){if(!Ph)throw new Error("Cannot access document outside of the DOM");return e?.ownerDocument??document}cr(uu,"getOwnerDocument");function _h(e,t=!1){const{activeElement:a}=uu(e);if(!a?.nodeName)return null;if(Ih(a)&&a.contentDocument)return _h(a.contentDocument.body,t);if(t){const n=a.getAttribute("aria-activedescendant");if(n){const r=uu(a).getElementById(n);if(r)return r}}return a}cr(_h,"getActiveElement");function Ih(e){return e.tagName==="IFRAME"}cr(Ih,"isFrame");var R1=Object.defineProperty,Pa=(e,t)=>R1(e,"name",{value:t,configurable:!0});function A1(e,t){const a=N.createContext(t);a.displayName=e+"Context";const n=Pa(s=>{const{children:o,...i}=s,l=N.useMemo(()=>i,Object.values(i));return T.jsx(a.Provider,{value:l,children:o})},"Provider");n.displayName=e+"Provider";function r(s,o={}){const{optional:i=!1}=o,l=N.useContext(a);if(l)return l;if(t!==void 0)return t;if(!i)throw new Error(`\`${s}\` must be used within \`${e}\``)}return Pa(r,"useContext"),[n,r]}Pa(A1,"createContext");function ba(e,t=[]){let a=[];function n(s,o){const i=N.createContext(o);i.displayName=s+"Context";const l=a.length;a=[...a,o];const c=Pa(p=>{const{scope:f,children:v,...x}=p,b=f?.[e]?.[l]||i,k=N.useMemo(()=>x,Object.values(x));return T.jsx(b.Provider,{value:k,children:v})},"Provider");c.displayName=s+"Provider";function u(p,f,v={}){const{optional:x=!1}=v,b=f?.[e]?.[l]||i,k=N.useContext(b);if(k)return k;if(o!==void 0)return o;if(!x)throw new Error(`\`${p}\` must be used within \`${s}\``)}return Pa(u,"useContext"),[c,u]}Pa(n,"createContext");const r=Pa(()=>{const s=a.map(o=>N.createContext(o));return Pa(function(i){const l=i?.[e]||s;return N.useMemo(()=>({[`__scope${e}`]:{...i,[e]:l}}),[i,l])},"useScope")},"createScope");return r.scopeName=e,[n,Rh(r,...t)]}Pa(ba,"createContextScope");function Rh(...e){const t=e[0];if(e.length===1)return t;const a=Pa(()=>{const n=e.map(r=>({useScope:r(),scopeName:r.scopeName}));return Pa(function(s){const o=n.reduce((i,{useScope:l,scopeName:c})=>{const p=l(s)[`__scope${c}`];return{...i,...p}},{});return N.useMemo(()=>({[`__scope${t.scopeName}`]:o}),[o])},"useComposedScopes")},"createScope");return a.scopeName=t.scopeName,a}Pa(Rh,"composeContextScopes");var kt=globalThis?.document?N.useLayoutEffect:()=>{},j1=Object.defineProperty,D1=(e,t)=>j1(e,"name",{value:t,configurable:!0}),O1=Rn[" useId ".trim().toString()]||(()=>{}),L1=0;function vn(e){const[t,a]=N.useState(O1());return kt(()=>{e||a(n=>n??String(L1++))},[e]),e||(t?`radix-${t}`:"")}D1(vn,"useId");var M1=Object.defineProperty,z1=(e,t)=>M1(e,"name",{value:t,configurable:!0}),Ah=Rn[" useEffectEvent ".trim().toString()],jh=Rn[" useInsertionEffect ".trim().toString()];function Dh(e){if(typeof Ah=="function")return Ah(e);const t=N.useRef(()=>{throw new Error("Cannot call an event handler while rendering.")});return typeof jh=="function"?jh(()=>{t.current=e}):kt(()=>{t.current=e}),N.useMemo(()=>(...a)=>t.current?.(...a),[])}z1(Dh,"useEffectEvent");var F1=Object.defineProperty,ko=(e,t)=>F1(e,"name",{value:t,configurable:!0}),B1=Rn[" useInsertionEffect ".trim().toString()]||kt;function _a({prop:e,defaultProp:t,onChange:a=ko(()=>{},"onChange"),caller:n}){const[r,s,o]=Oh({defaultProp:t,onChange:a}),i=e!==void 0,l=i?e:r,c=N.useCallback(u=>{if(i){const p=Lh(u)?u(e):u;p!==e&&o.current?.(p)}else s(u)},[i,e,s,o]);return[l,c]}ko(_a,"useControllableState");function Oh({defaultProp:e,onChange:t}){const[a,n]=N.useState(e),r=N.useRef(a),s=N.useRef(t);return B1(()=>{s.current=t},[t]),N.useEffect(()=>{r.current!==a&&(s.current?.(a),r.current=a)},[a,r]),[a,n,s]}ko(Oh,"useUncontrolledState");function Lh(e){return typeof e=="function"}ko(Lh,"isFunction");var Mh=Symbol("RADIX:SYNC_STATE");function U1(e,t,a,n){const{prop:r,defaultProp:s,onChange:o,caller:i}=t,l=r!==void 0,c=Dh(o),u=[{...a,state:s}];n&&u.push(n);const[p,f]=N.useReducer((k,g)=>{if(g.type===Mh)return{...k,state:g.state};const d=e(k,g);return l&&!Object.is(d.state,k.state)&&c(d.state),d},...u),v=p.state,x=N.useRef(v);N.useEffect(()=>{x.current!==v&&(x.current=v,l||c(v))},[v,x,l]);const b=N.useMemo(()=>r!==void 0?{...p,state:r}:p,[p,r]);return N.useEffect(()=>{l&&!Object.is(r,p.state)&&f({type:Mh,state:r})},[r,p.state,l]),[b,f]}ko(U1,"useControllableStateReducer");var q1=Object.defineProperty,V1=(e,t)=>q1(e,"name",{value:t,configurable:!0}),W1=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Oe=W1.reduce((e,t)=>{const a=hn(`Primitive.${t}`),n=N.forwardRef((r,s)=>{const{asChild:o,...i}=r,l=o?a:t;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),T.jsx(l,{...i,ref:s})});return n.displayName=`Primitive.${t}`,{...e,[t]:n}},{});function zh(e,t){e&&dr.flushSync(()=>e.dispatchEvent(t))}V1(zh,"dispatchDiscreteCustomEvent");var H1=Object.defineProperty,G1=(e,t)=>H1(e,"name",{value:t,configurable:!0}),Fh=Rn[" useInsertionEffect ".trim().toString()];function Ba(e){const t=N.useRef(e);return typeof Fh=="function"?Fh(()=>{t.current=e}):kt(()=>{t.current=e}),N.useMemo(()=>(...a)=>t.current?.(...a),[])}G1(Ba,"useCallbackRef");var K1=Object.defineProperty,zt=(e,t)=>K1(e,"name",{value:t,configurable:!0}),pu="dismissableLayer.update",Y1="dismissableLayer.pointerDownOutside",Q1="dismissableLayer.focusOutside",Bh,Uh=N.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set,dismissableSurfaces:new Set}),fu=N.forwardRef(zt(function(t,a){const{disableOutsidePointerEvents:n=!1,deferPointerDownOutside:r=!1,onEscapeKeyDown:s,onPointerDownOutside:o,onFocusOutside:i,onInteractOutside:l,onDismiss:c,...u}=t,p=N.useContext(Uh),[f,v]=N.useState(null),x=f?.ownerDocument??globalThis?.document,[,b]=N.useState({}),k=Xe(a,v),g=Array.from(p.layers),[d]=[...p.layersWithOutsidePointerEventsDisabled].slice(-1),h=d?g.indexOf(d):-1,y=f?g.indexOf(f):-1,S=p.layersWithOutsidePointerEventsDisabled.size>0,C=y>=h,E=N.useRef(!1),_=Vh(L=>{o?.(L),l?.(L),L.defaultPrevented||c?.()},{ownerDocument:x,deferPointerDownOutside:r,isDeferredPointerDownOutsideRef:E,dismissableSurfaces:p.dismissableSurfaces,shouldHandlePointerDownOutside:N.useCallback(L=>{if(!(L instanceof Node))return!1;const P=[...p.branches].some(W=>W.contains(L));return C&&!P},[p.branches,C])}),R=Wh(L=>{if(r&&E.current)return;const P=L.target;[...p.branches].some(J=>J.contains(P))||(i?.(L),l?.(L),L.defaultPrevented||c?.())},x),A=f?y===g.length-1:!1,G=Ba(L=>{L.key==="Escape"&&(s?.(L),!L.defaultPrevented&&c&&(L.preventDefault(),c()))});return N.useEffect(()=>{if(A)return x.addEventListener("keydown",G,{capture:!0}),()=>x.removeEventListener("keydown",G,{capture:!0})},[x,A,G]),N.useEffect(()=>{if(f)return n&&(p.layersWithOutsidePointerEventsDisabled.size===0&&(Bh=x.body.style.pointerEvents,x.body.style.pointerEvents="none"),p.layersWithOutsidePointerEventsDisabled.add(f)),p.layers.add(f),mu(),()=>{n&&(p.layersWithOutsidePointerEventsDisabled.delete(f),p.layersWithOutsidePointerEventsDisabled.size===0&&(x.body.style.pointerEvents=Bh))}},[f,x,n,p]),N.useEffect(()=>()=>{f&&(p.layers.delete(f),p.layersWithOutsidePointerEventsDisabled.delete(f),mu())},[f,p]),N.useEffect(()=>{const L=zt(()=>b({}),"handleUpdate");return document.addEventListener(pu,L),()=>document.removeEventListener(pu,L)},[]),T.jsx(Oe.div,{...u,ref:k,style:{pointerEvents:S?C?"auto":"none":void 0,...t.style},onFocusCapture:Pe(t.onFocusCapture,R.onFocusCapture),onBlurCapture:Pe(t.onBlurCapture,R.onBlurCapture),onPointerDownCapture:Pe(t.onPointerDownCapture,_.onPointerDownCapture)})},"DismissableLayer"));function qh(){const e=N.useContext(Uh),[t,a]=N.useState(null);return N.useEffect(()=>{if(t)return e.dismissableSurfaces.add(t),()=>{e.dismissableSurfaces.delete(t)}},[t,e.dismissableSurfaces]),a}zt(qh,"useDismissableLayerSurface");var X1=zt(()=>!0,"IS_TRUE");function Vh(e,t){const{ownerDocument:a=globalThis?.document,deferPointerDownOutside:n=!1,isDeferredPointerDownOutsideRef:r,dismissableSurfaces:s,shouldHandlePointerDownOutside:o=X1}=t,i=Ba(e),l=N.useRef(!1),c=N.useRef(!1),u=N.useRef(new Map),p=N.useRef(()=>{});return N.useEffect(()=>{function f(){c.current=!1,r.current=!1,u.current.clear()}zt(f,"resetOutsideInteraction");function v(){return Array.from(u.current.values()).some(Boolean)}zt(v,"isOutsideInteractionIntercepted");function x(h){if(!c.current)return;const y=h.target;y instanceof Node&&[...s].some(C=>C.contains(y))||u.current.set(h.type,!0),h.type==="click"&&window.setTimeout(()=>{c.current&&p.current()},0)}zt(x,"handleInteractionCapture");function b(h){c.current&&u.current.set(h.type,!1)}zt(b,"handleInteractionBubble");const k=zt(h=>{if(h.target&&!l.current){let y=function(){a.removeEventListener("click",p.current);const C=v();f(),C||gu(Y1,i,S,{discrete:!0})};if(zt(y,"handleAndDispatchPointerDownOutsideEvent"),!o(h.target)){a.removeEventListener("click",p.current),f(),l.current=!1;return}const S={originalEvent:h};c.current=!0,r.current=n&&h.button===0,u.current.clear(),!n||h.button!==0?y():(a.removeEventListener("click",p.current),p.current=y,a.addEventListener("click",p.current,{once:!0}))}else a.removeEventListener("click",p.current),f();l.current=!1},"handlePointerDown"),g=["pointerup","mousedown","mouseup","touchstart","touchend","click"];for(const h of g)a.addEventListener(h,x,!0),a.addEventListener(h,b);const d=window.setTimeout(()=>{a.addEventListener("pointerdown",k)},0);return()=>{window.clearTimeout(d),a.removeEventListener("pointerdown",k),a.removeEventListener("click",p.current);for(const h of g)a.removeEventListener(h,x,!0),a.removeEventListener(h,b)}},[a,i,n,r,s,o]),{onPointerDownCapture:zt(()=>l.current=!0,"onPointerDownCapture")}}zt(Vh,"usePointerDownOutside");function Wh(e,t=globalThis?.document){const a=Ba(e),n=N.useRef(!1);return N.useEffect(()=>{const r=zt(s=>{s.target&&!n.current&&gu(Q1,a,{originalEvent:s},{discrete:!1})},"handleFocus");return t.addEventListener("focusin",r),()=>t.removeEventListener("focusin",r)},[t,a]),{onFocusCapture:zt(()=>n.current=!0,"onFocusCapture"),onBlurCapture:zt(()=>n.current=!1,"onBlurCapture")}}zt(Wh,"useFocusOutside");function mu(){const e=new CustomEvent(pu);document.dispatchEvent(e)}zt(mu,"dispatchUpdate");function gu(e,t,a,{discrete:n}){const r=a.originalEvent.target,s=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:a});t&&r.addEventListener(e,t,{once:!0}),n?zh(r,s):r.dispatchEvent(s)}zt(gu,"handleAndDispatchCustomEvent");var Z1=Object.defineProperty,$t=(e,t)=>Z1(e,"name",{value:t,configurable:!0}),hu="focusScope.autoFocusOnMount",vu="focusScope.autoFocusOnUnmount",Hh={bubbles:!1,cancelable:!0},Gh=N.forwardRef($t(function(t,a){const{loop:n=!1,trapped:r=!1,branches:s,onMountAutoFocus:o,onUnmountAutoFocus:i,...l}=t,[c,u]=N.useState(null),p=Ba(o),f=Ba(i),v=N.useRef(null),x=Xe(a,u),b=N.useRef(s);N.useEffect(()=>{b.current=s});const k=N.useCallback(h=>h?c?.contains(h)?!0:!!b.current?.some(y=>y.contains(h)):!1,[c]),g=N.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;N.useEffect(()=>{if(r){let h=function(E){if(g.paused||!c)return;const _=E.target;k(_)?v.current=_:bn(v.current,{select:!0})},y=function(E){if(g.paused||!c)return;const _=E.relatedTarget;_!==null&&(k(_)||bn(v.current,{select:!0}))},S=function(E){if(document.activeElement===document.body)for(const R of E)R.removedNodes.length>0&&bn(c)};$t(h,"handleFocusIn"),$t(y,"handleFocusOut"),$t(S,"handleMutations"),document.addEventListener("focusin",h),document.addEventListener("focusout",y);const C=new MutationObserver(S);return c&&C.observe(c,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",h),document.removeEventListener("focusout",y),C.disconnect()}}},[r,c,g.paused,k]),N.useEffect(()=>{if(c){av.add(g);const h=document.activeElement;if(!c.contains(h)){const S=new CustomEvent(hu,Hh);c.addEventListener(hu,p),c.dispatchEvent(S),S.defaultPrevented||(Zh(sv(bu(c)),{select:!0}),document.activeElement===h&&bn(c))}return()=>{c.removeEventListener(hu,p);const S=c.ownerDocument,C=CustomEvent;setTimeout(()=>{const E=new C(vu,Hh);c.addEventListener(vu,f),c.dispatchEvent(E),E.defaultPrevented||bn(h??S.body,{select:!0}),c.removeEventListener(vu,f),av.remove(g)},0)}}},[c,p,f,g]);const d=N.useCallback(h=>{if(!n&&!r||g.paused)return;const y=h.key==="Tab"&&!h.altKey&&!h.ctrlKey&&!h.metaKey,S=document.activeElement;if(y&&S){const C=h.currentTarget,[E,_]=Jh(C);E&&_?!h.shiftKey&&S===_?(h.preventDefault(),n&&bn(E,{select:!0})):h.shiftKey&&S===E&&(h.preventDefault(),n&&bn(_,{select:!0})):S===C&&h.preventDefault()}},[n,r,g.paused]);return T.jsx(Oe.div,{tabIndex:-1,...l,ref:x,onKeyDown:d})},"FocusScope")),Kh=N.createContext(null);function Yh({registry:e,children:t}){return e?T.jsx(Kh.Provider,{value:e,children:t}):t}$t(Yh,"FocusScopeBranchProvider");function Qh(){const[e,t]=N.useState([]),a=N.useMemo(()=>({add:$t(n=>t(r=>r.includes(n)?r:[...r,n]),"add"),remove:$t(n=>t(r=>r.filter(s=>s!==n)),"remove")}),[]);return{nodes:e,registry:a}}$t(Qh,"useFocusScopeBranchRegistry");function Xh(e){const t=N.useContext(Kh);N.useEffect(()=>{if(!(!e||!t))return t.add(e),()=>t.remove(e)},[e,t])}$t(Xh,"useFocusScopeBranch");function Zh(e,{select:t=!1}={}){const a=document.activeElement;for(const n of e)if(bn(n,{select:t}),document.activeElement!==a)return}$t(Zh,"focusFirst");function Jh(e){const t=bu(e),a=yu(t,e),n=yu(t.reverse(),e);return[a,n]}$t(Jh,"getTabbableEdges");function bu(e){const t=[],n=e.ownerDocument.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:$t(r=>{const s=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||s?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP},"acceptNode")});for(;n.nextNode();)t.push(n.currentNode);return t}$t(bu,"getTabbableCandidates");function yu(e,t){const a=typeof t.checkVisibility=="function"&&t.checkVisibility({checkVisibilityCSS:!0});for(const n of e)if(!(a?!n.checkVisibility({checkVisibilityCSS:!0}):ev(n,{upTo:t})))return n}$t(yu,"findVisible");function ev(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}$t(ev,"isHidden");function tv(e){return e.tagName==="INPUT"&&typeof e.select=="function"}$t(tv,"isSelectableInput");function bn(e,{select:t=!1}={}){if(e&&e.focus){const n=(e.ownerDocument??document).activeElement;e.focus({preventScroll:!0}),e!==n&&tv(e)&&t&&e.select()}}$t(bn,"focus");var av=nv();function nv(){let e=[];return{add(t){const a=e[0];t!==a&&a?.pause(),e=xu(e,t),e.unshift(t)},remove(t){e=xu(e,t),e[0]?.resume()}}}$t(nv,"createFocusScopesStack");function xu(e,t){const a=[...e],n=a.indexOf(t);return n!==-1&&a.splice(n,1),a}$t(xu,"arrayRemove");function sv(e){return e.filter(t=>t.tagName!=="A")}$t(sv,"removeLinks");var J1=Object.defineProperty,ek=(e,t)=>J1(e,"name",{value:t,configurable:!0}),wu=N.forwardRef(ek(function(t,a){const{container:n,...r}=t,[s,o]=N.useState(!1);kt(()=>o(!0),[]);const i=n||s&&globalThis?.document?.body;return i?dr.createPortal(T.jsx(Oe.div,{...r,ref:a}),i):null},"Portal")),tk=Object.defineProperty,yn=(e,t)=>tk(e,"name",{value:t,configurable:!0});function rv(e,t){return N.useReducer((a,n)=>t[a][n]??a,e)}yn(rv,"useStateMachine");var Jn=yn(e=>{const{present:t,children:a}=e,n=ov(t),r=typeof a=="function"?a({present:n.isPresent}):N.Children.only(a),s=iv(n.ref,lv(r));return typeof a=="function"||n.isPresent?N.cloneElement(r,{ref:s}):null},"Presence");function ov(e){const[t,a]=N.useState(),n=N.useRef(null),r=N.useRef(e),s=N.useRef("none"),o=N.useRef(void 0),i=e?"mounted":"unmounted",[l,c]=rv(i,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return N.useEffect(()=>{l==="mounted"?(s.current=o.current??ur(n.current),o.current=void 0):s.current="none"},[l]),kt(()=>{const u=n.current,p=r.current;if(p!==e){const v=s.current,x=ur(u);e?(o.current=x,c("MOUNT")):x==="none"||u?.display==="none"?c("UNMOUNT"):c(p&&v!==x?"ANIMATION_OUT":"UNMOUNT"),r.current=e}},[e,c]),kt(()=>{if(t){let u;const p=t.ownerDocument.defaultView??window,f=yn(x=>{const k=ur(n.current).includes(CSS.escape(x.animationName));if(x.target===t&&k&&(c("ANIMATION_END"),!r.current)){const g=t.style.animationFillMode;t.style.animationFillMode="forwards",u=p.setTimeout(()=>{t.style.animationFillMode==="forwards"&&(t.style.animationFillMode=g)})}},"handleAnimationEnd"),v=yn(x=>{x.target===t&&(s.current=ur(n.current))},"handleAnimationStart");return t.addEventListener("animationstart",v),t.addEventListener("animationcancel",f),t.addEventListener("animationend",f),()=>{p.clearTimeout(u),t.removeEventListener("animationstart",v),t.removeEventListener("animationcancel",f),t.removeEventListener("animationend",f)}}else c("ANIMATION_END")},[t,c]),{isPresent:["mounted","unmountSuspended"].includes(l),ref:N.useCallback(u=>{if(u){const p=getComputedStyle(u);n.current=p,o.current=ur(p)}else n.current=null;a(u)},[])}}yn(ov,"usePresence");function ku(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}yn(ku,"setRef");function iv(...e){const t=N.useRef(e);return t.current=e,N.useCallback(a=>{const n=t.current;let r=!1;const s=n.map(o=>{const i=ku(o,a);return!r&&typeof i=="function"&&(r=!0),i});if(r)return()=>{for(let o=0;o<s.length;o++){const i=s[o];typeof i=="function"?i():ku(n[o],null)}}},[])}yn(iv,"useStableComposedRefs");function ur(e){return e?.animationName||"none"}yn(ur,"getAnimationName");function lv(e){let t=Object.getOwnPropertyDescriptor(e.props,"ref")?.get,a=t&&"isReactWarning"in t&&t.isReactWarning;return a?e.ref:(t=Object.getOwnPropertyDescriptor(e,"ref")?.get,a=t&&"isReactWarning"in t&&t.isReactWarning,a?e.props.ref:e.props.ref||e.ref)}yn(lv,"getElementRef");var ak=Object.defineProperty,Nu=(e,t)=>ak(e,"name",{value:t,configurable:!0}),nl=0,pr=null;function nk(e){return sl(),e.children}Nu(nk,"FocusGuards");function sl(){N.useEffect(()=>{pr||(pr={start:Su(),end:Su()});const{start:e,end:t}=pr;return document.body.firstElementChild!==e&&document.body.insertAdjacentElement("afterbegin",e),document.body.lastElementChild!==t&&document.body.insertAdjacentElement("beforeend",t),nl++,()=>{nl===1&&(pr?.start.remove(),pr?.end.remove(),pr=null),nl=Math.max(0,nl-1)}},[])}Nu(sl,"useFocusGuards");function Su(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}Nu(Su,"createFocusGuard");var Xa=function(){return Xa=Object.assign||function(t){for(var a,n=1,r=arguments.length;n<r;n++){a=arguments[n];for(var s in a)Object.prototype.hasOwnProperty.call(a,s)&&(t[s]=a[s])}return t},Xa.apply(this,arguments)};function dv(e,t){var a={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(a[n]=e[n]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,n=Object.getOwnPropertySymbols(e);r<n.length;r++)t.indexOf(n[r])<0&&Object.prototype.propertyIsEnumerable.call(e,n[r])&&(a[n[r]]=e[n[r]]);return a}function sk(e,t,a){if(a||arguments.length===2)for(var n=0,r=t.length,s;n<r;n++)(s||!(n in t))&&(s||(s=Array.prototype.slice.call(t,0,n)),s[n]=t[n]);return e.concat(s||Array.prototype.slice.call(t))}typeof SuppressedError=="function"&&SuppressedError;var rl="right-scroll-bar-position",ol="width-before-scroll-bar",rk="with-scroll-bars-hidden",ok="--removed-body-scroll-bar-size";function Cu(e,t){return typeof e=="function"?e(t):e&&(e.current=t),e}function ik(e,t){var a=N.useState(function(){return{value:e,callback:t,facade:{get current(){return a.value},set current(n){var r=a.value;r!==n&&(a.value=n,a.callback(n,r))}}}})[0];return a.callback=t,a.facade}var lk=typeof window<"u"?N.useLayoutEffect:N.useEffect,cv=new WeakMap;function dk(e,t){var a=ik(null,function(n){return e.forEach(function(r){return Cu(r,n)})});return lk(function(){var n=cv.get(a);if(n){var r=new Set(n),s=new Set(e),o=a.current;r.forEach(function(i){s.has(i)||Cu(i,null)}),s.forEach(function(i){r.has(i)||Cu(i,o)})}cv.set(a,e)},[e]),a}function ck(e){return e}function uk(e,t){t===void 0&&(t=ck);var a=[],n=!1,r={read:function(){if(n)throw new Error("Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.");return a.length?a[a.length-1]:e},useMedium:function(s){var o=t(s,n);return a.push(o),function(){a=a.filter(function(i){return i!==o})}},assignSyncMedium:function(s){for(n=!0;a.length;){var o=a;a=[],o.forEach(s)}a={push:function(i){return s(i)},filter:function(){return a}}},assignMedium:function(s){n=!0;var o=[];if(a.length){var i=a;a=[],i.forEach(s),o=a}var l=function(){var u=o;o=[],u.forEach(s)},c=function(){return Promise.resolve().then(l)};c(),a={push:function(u){o.push(u),c()},filter:function(u){return o=o.filter(u),a}}}};return r}function pk(e){e===void 0&&(e={});var t=uk(null);return t.options=Xa({async:!0,ssr:!1},e),t}var uv=function(e){var t=e.sideCar,a=dv(e,["sideCar"]);if(!t)throw new Error("Sidecar: please provide `sideCar` property to import the right car");var n=t.read();if(!n)throw new Error("Sidecar medium not found");return N.createElement(n,Xa({},a))};uv.isSideCarExport=!0;function fk(e,t){return e.useMedium(t),uv}var pv=pk(),Eu=function(){},il=N.forwardRef(function(e,t){var a=N.useRef(null),n=N.useState({onScrollCapture:Eu,onWheelCapture:Eu,onTouchMoveCapture:Eu}),r=n[0],s=n[1],o=e.forwardProps,i=e.children,l=e.className,c=e.removeScrollBar,u=e.enabled,p=e.shards,f=e.sideCar,v=e.noRelative,x=e.noIsolation,b=e.inert,k=e.allowPinchZoom,g=e.as,d=g===void 0?"div":g,h=e.gapMode,y=dv(e,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noRelative","noIsolation","inert","allowPinchZoom","as","gapMode"]),S=f,C=dk([a,t]),E=Xa(Xa({},y),r);return N.createElement(N.Fragment,null,u&&N.createElement(S,{sideCar:pv,removeScrollBar:c,shards:p,noRelative:v,noIsolation:x,inert:b,setCallbacks:s,allowPinchZoom:!!k,lockRef:a,gapMode:h}),o?N.cloneElement(N.Children.only(i),Xa(Xa({},E),{ref:C})):N.createElement(d,Xa({},E,{className:l,ref:C}),i))});il.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1},il.classNames={fullWidth:ol,zeroRight:rl};var mk=function(){if(typeof __webpack_nonce__<"u")return __webpack_nonce__};function gk(){if(!document)return null;var e=document.createElement("style");e.type="text/css";var t=mk();return t&&e.setAttribute("nonce",t),e}function hk(e,t){e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t))}function vk(e){var t=document.head||document.getElementsByTagName("head")[0];t.appendChild(e)}var bk=function(){var e=0,t=null;return{add:function(a){e==0&&(t=gk())&&(hk(t,a),vk(t)),e++},remove:function(){e--,!e&&t&&(t.parentNode&&t.parentNode.removeChild(t),t=null)}}},yk=function(){var e=bk();return function(t,a){N.useEffect(function(){return e.add(t),function(){e.remove()}},[t&&a])}},fv=function(){var e=yk(),t=function(a){var n=a.styles,r=a.dynamic;return e(n,r),null};return t},xk={left:0,top:0,right:0,gap:0},$u=function(e){return parseInt(e||"",10)||0},wk=function(e){var t=window.getComputedStyle(document.body),a=t[e==="padding"?"paddingLeft":"marginLeft"],n=t[e==="padding"?"paddingTop":"marginTop"],r=t[e==="padding"?"paddingRight":"marginRight"];return[$u(a),$u(n),$u(r)]},kk=function(e){if(e===void 0&&(e="margin"),typeof window>"u")return xk;var t=wk(e),a=document.documentElement.clientWidth,n=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,n-a+t[2]-t[0])}},Nk=fv(),fr="data-scroll-locked",Sk=function(e,t,a,n){var r=e.left,s=e.top,o=e.right,i=e.gap;return a===void 0&&(a="margin"),`
|
|
909
|
-
.`.concat(
|
|
908
|
+
*/const yh=wo("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);var S1=Object.defineProperty,lu=(e,t)=>S1(e,"name",{value:t,configurable:!0});function du(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}lu(du,"setRef");function xh(...e){return t=>{let a=!1;const n=e.map(r=>{const s=du(r,t);return!a&&typeof s=="function"&&(a=!0),s});if(a)return()=>{for(let r=0;r<n.length;r++){const s=n[r];typeof s=="function"?s():du(e[r],null)}}}}lu(xh,"composeRefs");function Ze(...e){return N.useCallback(xh(...e),e)}lu(Ze,"useComposedRefs");var C1=Object.defineProperty,va=(e,t)=>C1(e,"name",{value:t,configurable:!0});function hn(e){const t=N.forwardRef((a,n)=>{let{children:r,...s}=a,o=null,i=!1;const l=[];r=$h(r),N.Children.forEach(r,f=>{if(Ch(f)){i=!0;const v=f;let x="child"in v.props?v.props.child:v.props.children;for(;cu(x)&&typeof al=="function";)x=al(x._payload);o=$1(v,x),l.push(o?.props?.children)}else l.push(f)}),o?o=N.cloneElement(o,void 0,l):!i&&N.Children.count(r)===1&&N.isValidElement(r)&&(o=r);const c=o?Sh(o):void 0,u=Ze(n,c);if(!o){if(r||r===0)throw new Error(i?_1(e):P1(e));return r}const p=Nh(s,o.props??{});return o.type!==N.Fragment&&(p.ref=n?u:c),N.cloneElement(o,p)});return t.displayName=`${e}.Slot`,t}va(hn,"createSlot");var E1=hn("Slot"),wh=Symbol.for("radix.slottable");function kh(e){const t=va(a=>"child"in a?a.children(a.child):a.children,"Slottable");return t.displayName=`${e}.Slottable`,t.__radixId=wh,t}va(kh,"createSlottable");var $1=va((e,t)=>"child"in e.props?N.isValidElement(t)?N.cloneElement(t,void 0,e.props.children(t.props.children)):null:N.isValidElement(t)?t:null,"getSlottableElementFromSlottable");function Nh(e,t){const a={...t};for(const n in t){const r=e[n],s=t[n];/^on[A-Z]/.test(n)?r&&s?a[n]=(...i)=>{const l=s(...i);return r(...i),l}:r&&(a[n]=r):n==="style"?a[n]={...r,...s}:n==="className"?a[n]=[r,s].filter(Boolean).join(" "):n==="aria-describedby"&&(a[n]=Th(s,r))}return{...e,...a}}va(Nh,"mergeProps");function Sh(e){let t=Object.getOwnPropertyDescriptor(e.props,"ref")?.get,a=t&&"isReactWarning"in t&&t.isReactWarning;return a?e.ref:(t=Object.getOwnPropertyDescriptor(e,"ref")?.get,a=t&&"isReactWarning"in t&&t.isReactWarning,a?e.props.ref:e.props.ref||e.ref)}va(Sh,"getElementRef");function Ch(e){return N.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===wh}va(Ch,"isSlottable");var T1=Symbol.for("react.lazy");function cu(e){return e!=null&&typeof e=="object"&&"$$typeof"in e&&e.$$typeof===T1&&"_payload"in e&&Eh(e._payload)}va(cu,"isLazyComponent");function Eh(e){return typeof e=="object"&&e!==null&&"then"in e}va(Eh,"isPromiseLike");function $h(e){let t=e;for(;cu(t)&&typeof al=="function";)t=al(t._payload);return t}va($h,"useUnwrappedLazy");function Th(...e){const t=new Set;for(const a of e)if(typeof a=="string")for(const n of String(a).trim().split(/\s+/))n&&t.add(n);return t.size>0?Array.from(t).join(" "):void 0}va(Th,"concatAriaDescribedby");var P1=va(e=>`${e} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,"createSlotError"),_1=va(e=>`${e} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,"createSlottableError"),al=An[" use ".trim().toString()],I1=Object.defineProperty,cr=(e,t)=>I1(e,"name",{value:t,configurable:!0}),Ph=!!(typeof window<"u"&&window.document&&window.document.createElement);function _e(e,t,{checkForDefaultPrevented:a=!0}={}){return cr(function(r){if(e?.(r),a===!1||!r||!r.defaultPrevented)return t?.(r)},"handleEvent")}cr(_e,"composeEventHandlers");function R1(e){if(!Ph)throw new Error("Cannot access window outside of the DOM");return e?.ownerDocument?.defaultView??window}cr(R1,"getOwnerWindow");function uu(e){if(!Ph)throw new Error("Cannot access document outside of the DOM");return e?.ownerDocument??document}cr(uu,"getOwnerDocument");function _h(e,t=!1){const{activeElement:a}=uu(e);if(!a?.nodeName)return null;if(Ih(a)&&a.contentDocument)return _h(a.contentDocument.body,t);if(t){const n=a.getAttribute("aria-activedescendant");if(n){const r=uu(a).getElementById(n);if(r)return r}}return a}cr(_h,"getActiveElement");function Ih(e){return e.tagName==="IFRAME"}cr(Ih,"isFrame");var A1=Object.defineProperty,Pa=(e,t)=>A1(e,"name",{value:t,configurable:!0});function j1(e,t){const a=N.createContext(t);a.displayName=e+"Context";const n=Pa(s=>{const{children:o,...i}=s,l=N.useMemo(()=>i,Object.values(i));return $.jsx(a.Provider,{value:l,children:o})},"Provider");n.displayName=e+"Provider";function r(s,o={}){const{optional:i=!1}=o,l=N.useContext(a);if(l)return l;if(t!==void 0)return t;if(!i)throw new Error(`\`${s}\` must be used within \`${e}\``)}return Pa(r,"useContext"),[n,r]}Pa(j1,"createContext");function ba(e,t=[]){let a=[];function n(s,o){const i=N.createContext(o);i.displayName=s+"Context";const l=a.length;a=[...a,o];const c=Pa(p=>{const{scope:f,children:v,...x}=p,b=f?.[e]?.[l]||i,k=N.useMemo(()=>x,Object.values(x));return $.jsx(b.Provider,{value:k,children:v})},"Provider");c.displayName=s+"Provider";function u(p,f,v={}){const{optional:x=!1}=v,b=f?.[e]?.[l]||i,k=N.useContext(b);if(k)return k;if(o!==void 0)return o;if(!x)throw new Error(`\`${p}\` must be used within \`${s}\``)}return Pa(u,"useContext"),[c,u]}Pa(n,"createContext");const r=Pa(()=>{const s=a.map(o=>N.createContext(o));return Pa(function(i){const l=i?.[e]||s;return N.useMemo(()=>({[`__scope${e}`]:{...i,[e]:l}}),[i,l])},"useScope")},"createScope");return r.scopeName=e,[n,Rh(r,...t)]}Pa(ba,"createContextScope");function Rh(...e){const t=e[0];if(e.length===1)return t;const a=Pa(()=>{const n=e.map(r=>({useScope:r(),scopeName:r.scopeName}));return Pa(function(s){const o=n.reduce((i,{useScope:l,scopeName:c})=>{const p=l(s)[`__scope${c}`];return{...i,...p}},{});return N.useMemo(()=>({[`__scope${t.scopeName}`]:o}),[o])},"useComposedScopes")},"createScope");return a.scopeName=t.scopeName,a}Pa(Rh,"composeContextScopes");var kt=globalThis?.document?N.useLayoutEffect:()=>{},D1=Object.defineProperty,O1=(e,t)=>D1(e,"name",{value:t,configurable:!0}),L1=An[" useId ".trim().toString()]||(()=>{}),M1=0;function vn(e){const[t,a]=N.useState(L1());return kt(()=>{e||a(n=>n??String(M1++))},[e]),e||(t?`radix-${t}`:"")}O1(vn,"useId");var z1=Object.defineProperty,F1=(e,t)=>z1(e,"name",{value:t,configurable:!0}),Ah=An[" useEffectEvent ".trim().toString()],jh=An[" useInsertionEffect ".trim().toString()];function Dh(e){if(typeof Ah=="function")return Ah(e);const t=N.useRef(()=>{throw new Error("Cannot call an event handler while rendering.")});return typeof jh=="function"?jh(()=>{t.current=e}):kt(()=>{t.current=e}),N.useMemo(()=>(...a)=>t.current?.(...a),[])}F1(Dh,"useEffectEvent");var B1=Object.defineProperty,ko=(e,t)=>B1(e,"name",{value:t,configurable:!0}),U1=An[" useInsertionEffect ".trim().toString()]||kt;function _a({prop:e,defaultProp:t,onChange:a=ko(()=>{},"onChange"),caller:n}){const[r,s,o]=Oh({defaultProp:t,onChange:a}),i=e!==void 0,l=i?e:r,c=N.useCallback(u=>{if(i){const p=Lh(u)?u(e):u;p!==e&&o.current?.(p)}else s(u)},[i,e,s,o]);return[l,c]}ko(_a,"useControllableState");function Oh({defaultProp:e,onChange:t}){const[a,n]=N.useState(e),r=N.useRef(a),s=N.useRef(t);return U1(()=>{s.current=t},[t]),N.useEffect(()=>{r.current!==a&&(s.current?.(a),r.current=a)},[a,r]),[a,n,s]}ko(Oh,"useUncontrolledState");function Lh(e){return typeof e=="function"}ko(Lh,"isFunction");var Mh=Symbol("RADIX:SYNC_STATE");function q1(e,t,a,n){const{prop:r,defaultProp:s,onChange:o,caller:i}=t,l=r!==void 0,c=Dh(o),u=[{...a,state:s}];n&&u.push(n);const[p,f]=N.useReducer((k,g)=>{if(g.type===Mh)return{...k,state:g.state};const d=e(k,g);return l&&!Object.is(d.state,k.state)&&c(d.state),d},...u),v=p.state,x=N.useRef(v);N.useEffect(()=>{x.current!==v&&(x.current=v,l||c(v))},[v,x,l]);const b=N.useMemo(()=>r!==void 0?{...p,state:r}:p,[p,r]);return N.useEffect(()=>{l&&!Object.is(r,p.state)&&f({type:Mh,state:r})},[r,p.state,l]),[b,f]}ko(q1,"useControllableStateReducer");var V1=Object.defineProperty,W1=(e,t)=>V1(e,"name",{value:t,configurable:!0}),H1=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Oe=H1.reduce((e,t)=>{const a=hn(`Primitive.${t}`),n=N.forwardRef((r,s)=>{const{asChild:o,...i}=r,l=o?a:t;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),$.jsx(l,{...i,ref:s})});return n.displayName=`Primitive.${t}`,{...e,[t]:n}},{});function zh(e,t){e&&dr.flushSync(()=>e.dispatchEvent(t))}W1(zh,"dispatchDiscreteCustomEvent");var G1=Object.defineProperty,K1=(e,t)=>G1(e,"name",{value:t,configurable:!0}),Fh=An[" useInsertionEffect ".trim().toString()];function Ba(e){const t=N.useRef(e);return typeof Fh=="function"?Fh(()=>{t.current=e}):kt(()=>{t.current=e}),N.useMemo(()=>(...a)=>t.current?.(...a),[])}K1(Ba,"useCallbackRef");var Y1=Object.defineProperty,zt=(e,t)=>Y1(e,"name",{value:t,configurable:!0}),pu="dismissableLayer.update",Q1="dismissableLayer.pointerDownOutside",X1="dismissableLayer.focusOutside",Bh,Uh=N.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set,dismissableSurfaces:new Set}),fu=N.forwardRef(zt(function(t,a){const{disableOutsidePointerEvents:n=!1,deferPointerDownOutside:r=!1,onEscapeKeyDown:s,onPointerDownOutside:o,onFocusOutside:i,onInteractOutside:l,onDismiss:c,...u}=t,p=N.useContext(Uh),[f,v]=N.useState(null),x=f?.ownerDocument??globalThis?.document,[,b]=N.useState({}),k=Ze(a,v),g=Array.from(p.layers),[d]=[...p.layersWithOutsidePointerEventsDisabled].slice(-1),h=d?g.indexOf(d):-1,y=f?g.indexOf(f):-1,S=p.layersWithOutsidePointerEventsDisabled.size>0,C=y>=h,E=N.useRef(!1),_=Vh(M=>{o?.(M),l?.(M),M.defaultPrevented||c?.()},{ownerDocument:x,deferPointerDownOutside:r,isDeferredPointerDownOutsideRef:E,dismissableSurfaces:p.dismissableSurfaces,shouldHandlePointerDownOutside:N.useCallback(M=>{if(!(M instanceof Node))return!1;const P=[...p.branches].some(G=>G.contains(M));return C&&!P},[p.branches,C])}),I=Wh(M=>{if(r&&E.current)return;const P=M.target;[...p.branches].some(J=>J.contains(P))||(i?.(M),l?.(M),M.defaultPrevented||c?.())},x),j=f?y===g.length-1:!1,H=Ba(M=>{M.key==="Escape"&&(s?.(M),!M.defaultPrevented&&c&&(M.preventDefault(),c()))});return N.useEffect(()=>{if(j)return x.addEventListener("keydown",H,{capture:!0}),()=>x.removeEventListener("keydown",H,{capture:!0})},[x,j,H]),N.useEffect(()=>{if(f)return n&&(p.layersWithOutsidePointerEventsDisabled.size===0&&(Bh=x.body.style.pointerEvents,x.body.style.pointerEvents="none"),p.layersWithOutsidePointerEventsDisabled.add(f)),p.layers.add(f),mu(),()=>{n&&(p.layersWithOutsidePointerEventsDisabled.delete(f),p.layersWithOutsidePointerEventsDisabled.size===0&&(x.body.style.pointerEvents=Bh))}},[f,x,n,p]),N.useEffect(()=>()=>{f&&(p.layers.delete(f),p.layersWithOutsidePointerEventsDisabled.delete(f),mu())},[f,p]),N.useEffect(()=>{const M=zt(()=>b({}),"handleUpdate");return document.addEventListener(pu,M),()=>document.removeEventListener(pu,M)},[]),$.jsx(Oe.div,{...u,ref:k,style:{pointerEvents:S?C?"auto":"none":void 0,...t.style},onFocusCapture:_e(t.onFocusCapture,I.onFocusCapture),onBlurCapture:_e(t.onBlurCapture,I.onBlurCapture),onPointerDownCapture:_e(t.onPointerDownCapture,_.onPointerDownCapture)})},"DismissableLayer"));function qh(){const e=N.useContext(Uh),[t,a]=N.useState(null);return N.useEffect(()=>{if(t)return e.dismissableSurfaces.add(t),()=>{e.dismissableSurfaces.delete(t)}},[t,e.dismissableSurfaces]),a}zt(qh,"useDismissableLayerSurface");var Z1=zt(()=>!0,"IS_TRUE");function Vh(e,t){const{ownerDocument:a=globalThis?.document,deferPointerDownOutside:n=!1,isDeferredPointerDownOutsideRef:r,dismissableSurfaces:s,shouldHandlePointerDownOutside:o=Z1}=t,i=Ba(e),l=N.useRef(!1),c=N.useRef(!1),u=N.useRef(new Map),p=N.useRef(()=>{});return N.useEffect(()=>{function f(){c.current=!1,r.current=!1,u.current.clear()}zt(f,"resetOutsideInteraction");function v(){return Array.from(u.current.values()).some(Boolean)}zt(v,"isOutsideInteractionIntercepted");function x(h){if(!c.current)return;const y=h.target;y instanceof Node&&[...s].some(C=>C.contains(y))||u.current.set(h.type,!0),h.type==="click"&&window.setTimeout(()=>{c.current&&p.current()},0)}zt(x,"handleInteractionCapture");function b(h){c.current&&u.current.set(h.type,!1)}zt(b,"handleInteractionBubble");const k=zt(h=>{if(h.target&&!l.current){let y=function(){a.removeEventListener("click",p.current);const C=v();f(),C||gu(Q1,i,S,{discrete:!0})};if(zt(y,"handleAndDispatchPointerDownOutsideEvent"),!o(h.target)){a.removeEventListener("click",p.current),f(),l.current=!1;return}const S={originalEvent:h};c.current=!0,r.current=n&&h.button===0,u.current.clear(),!n||h.button!==0?y():(a.removeEventListener("click",p.current),p.current=y,a.addEventListener("click",p.current,{once:!0}))}else a.removeEventListener("click",p.current),f();l.current=!1},"handlePointerDown"),g=["pointerup","mousedown","mouseup","touchstart","touchend","click"];for(const h of g)a.addEventListener(h,x,!0),a.addEventListener(h,b);const d=window.setTimeout(()=>{a.addEventListener("pointerdown",k)},0);return()=>{window.clearTimeout(d),a.removeEventListener("pointerdown",k),a.removeEventListener("click",p.current);for(const h of g)a.removeEventListener(h,x,!0),a.removeEventListener(h,b)}},[a,i,n,r,s,o]),{onPointerDownCapture:zt(()=>l.current=!0,"onPointerDownCapture")}}zt(Vh,"usePointerDownOutside");function Wh(e,t=globalThis?.document){const a=Ba(e),n=N.useRef(!1);return N.useEffect(()=>{const r=zt(s=>{s.target&&!n.current&&gu(X1,a,{originalEvent:s},{discrete:!1})},"handleFocus");return t.addEventListener("focusin",r),()=>t.removeEventListener("focusin",r)},[t,a]),{onFocusCapture:zt(()=>n.current=!0,"onFocusCapture"),onBlurCapture:zt(()=>n.current=!1,"onBlurCapture")}}zt(Wh,"useFocusOutside");function mu(){const e=new CustomEvent(pu);document.dispatchEvent(e)}zt(mu,"dispatchUpdate");function gu(e,t,a,{discrete:n}){const r=a.originalEvent.target,s=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:a});t&&r.addEventListener(e,t,{once:!0}),n?zh(r,s):r.dispatchEvent(s)}zt(gu,"handleAndDispatchCustomEvent");var J1=Object.defineProperty,$t=(e,t)=>J1(e,"name",{value:t,configurable:!0}),hu="focusScope.autoFocusOnMount",vu="focusScope.autoFocusOnUnmount",Hh={bubbles:!1,cancelable:!0},Gh=N.forwardRef($t(function(t,a){const{loop:n=!1,trapped:r=!1,branches:s,onMountAutoFocus:o,onUnmountAutoFocus:i,...l}=t,[c,u]=N.useState(null),p=Ba(o),f=Ba(i),v=N.useRef(null),x=Ze(a,u),b=N.useRef(s);N.useEffect(()=>{b.current=s});const k=N.useCallback(h=>h?c?.contains(h)?!0:!!b.current?.some(y=>y.contains(h)):!1,[c]),g=N.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;N.useEffect(()=>{if(r){let h=function(E){if(g.paused||!c)return;const _=E.target;k(_)?v.current=_:bn(v.current,{select:!0})},y=function(E){if(g.paused||!c)return;const _=E.relatedTarget;_!==null&&(k(_)||bn(v.current,{select:!0}))},S=function(E){if(document.activeElement===document.body)for(const I of E)I.removedNodes.length>0&&bn(c)};$t(h,"handleFocusIn"),$t(y,"handleFocusOut"),$t(S,"handleMutations"),document.addEventListener("focusin",h),document.addEventListener("focusout",y);const C=new MutationObserver(S);return c&&C.observe(c,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",h),document.removeEventListener("focusout",y),C.disconnect()}}},[r,c,g.paused,k]),N.useEffect(()=>{if(c){av.add(g);const h=document.activeElement;if(!c.contains(h)){const S=new CustomEvent(hu,Hh);c.addEventListener(hu,p),c.dispatchEvent(S),S.defaultPrevented||(Zh(sv(bu(c)),{select:!0}),document.activeElement===h&&bn(c))}return()=>{c.removeEventListener(hu,p);const S=c.ownerDocument,C=CustomEvent;setTimeout(()=>{const E=new C(vu,Hh);c.addEventListener(vu,f),c.dispatchEvent(E),E.defaultPrevented||bn(h??S.body,{select:!0}),c.removeEventListener(vu,f),av.remove(g)},0)}}},[c,p,f,g]);const d=N.useCallback(h=>{if(!n&&!r||g.paused)return;const y=h.key==="Tab"&&!h.altKey&&!h.ctrlKey&&!h.metaKey,S=document.activeElement;if(y&&S){const C=h.currentTarget,[E,_]=Jh(C);E&&_?!h.shiftKey&&S===_?(h.preventDefault(),n&&bn(E,{select:!0})):h.shiftKey&&S===E&&(h.preventDefault(),n&&bn(_,{select:!0})):S===C&&h.preventDefault()}},[n,r,g.paused]);return $.jsx(Oe.div,{tabIndex:-1,...l,ref:x,onKeyDown:d})},"FocusScope")),Kh=N.createContext(null);function Yh({registry:e,children:t}){return e?$.jsx(Kh.Provider,{value:e,children:t}):t}$t(Yh,"FocusScopeBranchProvider");function Qh(){const[e,t]=N.useState([]),a=N.useMemo(()=>({add:$t(n=>t(r=>r.includes(n)?r:[...r,n]),"add"),remove:$t(n=>t(r=>r.filter(s=>s!==n)),"remove")}),[]);return{nodes:e,registry:a}}$t(Qh,"useFocusScopeBranchRegistry");function Xh(e){const t=N.useContext(Kh);N.useEffect(()=>{if(!(!e||!t))return t.add(e),()=>t.remove(e)},[e,t])}$t(Xh,"useFocusScopeBranch");function Zh(e,{select:t=!1}={}){const a=document.activeElement;for(const n of e)if(bn(n,{select:t}),document.activeElement!==a)return}$t(Zh,"focusFirst");function Jh(e){const t=bu(e),a=yu(t,e),n=yu(t.reverse(),e);return[a,n]}$t(Jh,"getTabbableEdges");function bu(e){const t=[],n=e.ownerDocument.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:$t(r=>{const s=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||s?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP},"acceptNode")});for(;n.nextNode();)t.push(n.currentNode);return t}$t(bu,"getTabbableCandidates");function yu(e,t){const a=typeof t.checkVisibility=="function"&&t.checkVisibility({checkVisibilityCSS:!0});for(const n of e)if(!(a?!n.checkVisibility({checkVisibilityCSS:!0}):ev(n,{upTo:t})))return n}$t(yu,"findVisible");function ev(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}$t(ev,"isHidden");function tv(e){return e.tagName==="INPUT"&&typeof e.select=="function"}$t(tv,"isSelectableInput");function bn(e,{select:t=!1}={}){if(e&&e.focus){const n=(e.ownerDocument??document).activeElement;e.focus({preventScroll:!0}),e!==n&&tv(e)&&t&&e.select()}}$t(bn,"focus");var av=nv();function nv(){let e=[];return{add(t){const a=e[0];t!==a&&a?.pause(),e=xu(e,t),e.unshift(t)},remove(t){e=xu(e,t),e[0]?.resume()}}}$t(nv,"createFocusScopesStack");function xu(e,t){const a=[...e],n=a.indexOf(t);return n!==-1&&a.splice(n,1),a}$t(xu,"arrayRemove");function sv(e){return e.filter(t=>t.tagName!=="A")}$t(sv,"removeLinks");var ek=Object.defineProperty,tk=(e,t)=>ek(e,"name",{value:t,configurable:!0}),wu=N.forwardRef(tk(function(t,a){const{container:n,...r}=t,[s,o]=N.useState(!1);kt(()=>o(!0),[]);const i=n||s&&globalThis?.document?.body;return i?dr.createPortal($.jsx(Oe.div,{...r,ref:a}),i):null},"Portal")),ak=Object.defineProperty,yn=(e,t)=>ak(e,"name",{value:t,configurable:!0});function rv(e,t){return N.useReducer((a,n)=>t[a][n]??a,e)}yn(rv,"useStateMachine");var es=yn(e=>{const{present:t,children:a}=e,n=ov(t),r=typeof a=="function"?a({present:n.isPresent}):N.Children.only(a),s=iv(n.ref,lv(r));return typeof a=="function"||n.isPresent?N.cloneElement(r,{ref:s}):null},"Presence");function ov(e){const[t,a]=N.useState(),n=N.useRef(null),r=N.useRef(e),s=N.useRef("none"),o=N.useRef(void 0),i=e?"mounted":"unmounted",[l,c]=rv(i,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return N.useEffect(()=>{l==="mounted"?(s.current=o.current??ur(n.current),o.current=void 0):s.current="none"},[l]),kt(()=>{const u=n.current,p=r.current;if(p!==e){const v=s.current,x=ur(u);e?(o.current=x,c("MOUNT")):x==="none"||u?.display==="none"?c("UNMOUNT"):c(p&&v!==x?"ANIMATION_OUT":"UNMOUNT"),r.current=e}},[e,c]),kt(()=>{if(t){let u;const p=t.ownerDocument.defaultView??window,f=yn(x=>{const k=ur(n.current).includes(CSS.escape(x.animationName));if(x.target===t&&k&&(c("ANIMATION_END"),!r.current)){const g=t.style.animationFillMode;t.style.animationFillMode="forwards",u=p.setTimeout(()=>{t.style.animationFillMode==="forwards"&&(t.style.animationFillMode=g)})}},"handleAnimationEnd"),v=yn(x=>{x.target===t&&(s.current=ur(n.current))},"handleAnimationStart");return t.addEventListener("animationstart",v),t.addEventListener("animationcancel",f),t.addEventListener("animationend",f),()=>{p.clearTimeout(u),t.removeEventListener("animationstart",v),t.removeEventListener("animationcancel",f),t.removeEventListener("animationend",f)}}else c("ANIMATION_END")},[t,c]),{isPresent:["mounted","unmountSuspended"].includes(l),ref:N.useCallback(u=>{if(u){const p=getComputedStyle(u);n.current=p,o.current=ur(p)}else n.current=null;a(u)},[])}}yn(ov,"usePresence");function ku(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}yn(ku,"setRef");function iv(...e){const t=N.useRef(e);return t.current=e,N.useCallback(a=>{const n=t.current;let r=!1;const s=n.map(o=>{const i=ku(o,a);return!r&&typeof i=="function"&&(r=!0),i});if(r)return()=>{for(let o=0;o<s.length;o++){const i=s[o];typeof i=="function"?i():ku(n[o],null)}}},[])}yn(iv,"useStableComposedRefs");function ur(e){return e?.animationName||"none"}yn(ur,"getAnimationName");function lv(e){let t=Object.getOwnPropertyDescriptor(e.props,"ref")?.get,a=t&&"isReactWarning"in t&&t.isReactWarning;return a?e.ref:(t=Object.getOwnPropertyDescriptor(e,"ref")?.get,a=t&&"isReactWarning"in t&&t.isReactWarning,a?e.props.ref:e.props.ref||e.ref)}yn(lv,"getElementRef");var nk=Object.defineProperty,Nu=(e,t)=>nk(e,"name",{value:t,configurable:!0}),nl=0,pr=null;function sk(e){return sl(),e.children}Nu(sk,"FocusGuards");function sl(){N.useEffect(()=>{pr||(pr={start:Su(),end:Su()});const{start:e,end:t}=pr;return document.body.firstElementChild!==e&&document.body.insertAdjacentElement("afterbegin",e),document.body.lastElementChild!==t&&document.body.insertAdjacentElement("beforeend",t),nl++,()=>{nl===1&&(pr?.start.remove(),pr?.end.remove(),pr=null),nl=Math.max(0,nl-1)}},[])}Nu(sl,"useFocusGuards");function Su(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.style.position="fixed",e.style.pointerEvents="none",e}Nu(Su,"createFocusGuard");var Xa=function(){return Xa=Object.assign||function(t){for(var a,n=1,r=arguments.length;n<r;n++){a=arguments[n];for(var s in a)Object.prototype.hasOwnProperty.call(a,s)&&(t[s]=a[s])}return t},Xa.apply(this,arguments)};function dv(e,t){var a={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(a[n]=e[n]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,n=Object.getOwnPropertySymbols(e);r<n.length;r++)t.indexOf(n[r])<0&&Object.prototype.propertyIsEnumerable.call(e,n[r])&&(a[n[r]]=e[n[r]]);return a}function rk(e,t,a){if(a||arguments.length===2)for(var n=0,r=t.length,s;n<r;n++)(s||!(n in t))&&(s||(s=Array.prototype.slice.call(t,0,n)),s[n]=t[n]);return e.concat(s||Array.prototype.slice.call(t))}typeof SuppressedError=="function"&&SuppressedError;var rl="right-scroll-bar-position",ol="width-before-scroll-bar",ok="with-scroll-bars-hidden",ik="--removed-body-scroll-bar-size";function Cu(e,t){return typeof e=="function"?e(t):e&&(e.current=t),e}function lk(e,t){var a=N.useState(function(){return{value:e,callback:t,facade:{get current(){return a.value},set current(n){var r=a.value;r!==n&&(a.value=n,a.callback(n,r))}}}})[0];return a.callback=t,a.facade}var dk=typeof window<"u"?N.useLayoutEffect:N.useEffect,cv=new WeakMap;function ck(e,t){var a=lk(null,function(n){return e.forEach(function(r){return Cu(r,n)})});return dk(function(){var n=cv.get(a);if(n){var r=new Set(n),s=new Set(e),o=a.current;r.forEach(function(i){s.has(i)||Cu(i,null)}),s.forEach(function(i){r.has(i)||Cu(i,o)})}cv.set(a,e)},[e]),a}function uk(e){return e}function pk(e,t){t===void 0&&(t=uk);var a=[],n=!1,r={read:function(){if(n)throw new Error("Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.");return a.length?a[a.length-1]:e},useMedium:function(s){var o=t(s,n);return a.push(o),function(){a=a.filter(function(i){return i!==o})}},assignSyncMedium:function(s){for(n=!0;a.length;){var o=a;a=[],o.forEach(s)}a={push:function(i){return s(i)},filter:function(){return a}}},assignMedium:function(s){n=!0;var o=[];if(a.length){var i=a;a=[],i.forEach(s),o=a}var l=function(){var u=o;o=[],u.forEach(s)},c=function(){return Promise.resolve().then(l)};c(),a={push:function(u){o.push(u),c()},filter:function(u){return o=o.filter(u),a}}}};return r}function fk(e){e===void 0&&(e={});var t=pk(null);return t.options=Xa({async:!0,ssr:!1},e),t}var uv=function(e){var t=e.sideCar,a=dv(e,["sideCar"]);if(!t)throw new Error("Sidecar: please provide `sideCar` property to import the right car");var n=t.read();if(!n)throw new Error("Sidecar medium not found");return N.createElement(n,Xa({},a))};uv.isSideCarExport=!0;function mk(e,t){return e.useMedium(t),uv}var pv=fk(),Eu=function(){},il=N.forwardRef(function(e,t){var a=N.useRef(null),n=N.useState({onScrollCapture:Eu,onWheelCapture:Eu,onTouchMoveCapture:Eu}),r=n[0],s=n[1],o=e.forwardProps,i=e.children,l=e.className,c=e.removeScrollBar,u=e.enabled,p=e.shards,f=e.sideCar,v=e.noRelative,x=e.noIsolation,b=e.inert,k=e.allowPinchZoom,g=e.as,d=g===void 0?"div":g,h=e.gapMode,y=dv(e,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noRelative","noIsolation","inert","allowPinchZoom","as","gapMode"]),S=f,C=ck([a,t]),E=Xa(Xa({},y),r);return N.createElement(N.Fragment,null,u&&N.createElement(S,{sideCar:pv,removeScrollBar:c,shards:p,noRelative:v,noIsolation:x,inert:b,setCallbacks:s,allowPinchZoom:!!k,lockRef:a,gapMode:h}),o?N.cloneElement(N.Children.only(i),Xa(Xa({},E),{ref:C})):N.createElement(d,Xa({},E,{className:l,ref:C}),i))});il.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1},il.classNames={fullWidth:ol,zeroRight:rl};var gk=function(){if(typeof __webpack_nonce__<"u")return __webpack_nonce__};function hk(){if(!document)return null;var e=document.createElement("style");e.type="text/css";var t=gk();return t&&e.setAttribute("nonce",t),e}function vk(e,t){e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t))}function bk(e){var t=document.head||document.getElementsByTagName("head")[0];t.appendChild(e)}var yk=function(){var e=0,t=null;return{add:function(a){e==0&&(t=hk())&&(vk(t,a),bk(t)),e++},remove:function(){e--,!e&&t&&(t.parentNode&&t.parentNode.removeChild(t),t=null)}}},xk=function(){var e=yk();return function(t,a){N.useEffect(function(){return e.add(t),function(){e.remove()}},[t&&a])}},fv=function(){var e=xk(),t=function(a){var n=a.styles,r=a.dynamic;return e(n,r),null};return t},wk={left:0,top:0,right:0,gap:0},$u=function(e){return parseInt(e||"",10)||0},kk=function(e){var t=window.getComputedStyle(document.body),a=t[e==="padding"?"paddingLeft":"marginLeft"],n=t[e==="padding"?"paddingTop":"marginTop"],r=t[e==="padding"?"paddingRight":"marginRight"];return[$u(a),$u(n),$u(r)]},Nk=function(e){if(e===void 0&&(e="margin"),typeof window>"u")return wk;var t=kk(e),a=document.documentElement.clientWidth,n=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,n-a+t[2]-t[0])}},Sk=fv(),fr="data-scroll-locked",Ck=function(e,t,a,n){var r=e.left,s=e.top,o=e.right,i=e.gap;return a===void 0&&(a="margin"),`
|
|
909
|
+
.`.concat(ok,` {
|
|
910
910
|
overflow: hidden `).concat(n,`;
|
|
911
911
|
padding-right: `).concat(i,"px ").concat(n,`;
|
|
912
912
|
}
|
|
@@ -940,14 +940,14 @@ Error generating stack: `+s.message+`
|
|
|
940
940
|
}
|
|
941
941
|
|
|
942
942
|
body[`).concat(fr,`] {
|
|
943
|
-
`).concat(
|
|
943
|
+
`).concat(ik,": ").concat(i,`px;
|
|
944
944
|
}
|
|
945
|
-
`)},mv=function(){var e=parseInt(document.body.getAttribute(fr)||"0",10);return isFinite(e)?e:0},
|
|
945
|
+
`)},mv=function(){var e=parseInt(document.body.getAttribute(fr)||"0",10);return isFinite(e)?e:0},Ek=function(){N.useEffect(function(){return document.body.setAttribute(fr,(mv()+1).toString()),function(){var e=mv()-1;e<=0?document.body.removeAttribute(fr):document.body.setAttribute(fr,e.toString())}},[])},$k=function(e){var t=e.noRelative,a=e.noImportant,n=e.gapMode,r=n===void 0?"margin":n;Ek();var s=N.useMemo(function(){return Nk(r)},[r]);return N.createElement(Sk,{styles:Ck(s,!t,r,a?"":"!important")})},Tu=!1;if(typeof window<"u")try{var ll=Object.defineProperty({},"passive",{get:function(){return Tu=!0,!0}});window.addEventListener("test",ll,ll),window.removeEventListener("test",ll,ll)}catch{Tu=!1}var mr=Tu?{passive:!1}:!1,Tk=function(e){return e.tagName==="TEXTAREA"},gv=function(e,t){if(!(e instanceof Element))return!1;var a=window.getComputedStyle(e);return a[t]!=="hidden"&&!(a.overflowY===a.overflowX&&!Tk(e)&&a[t]==="visible")},Pk=function(e){return gv(e,"overflowY")},_k=function(e){return gv(e,"overflowX")},hv=function(e,t){var a=t.ownerDocument,n=t;do{typeof ShadowRoot<"u"&&n instanceof ShadowRoot&&(n=n.host);var r=vv(e,n);if(r){var s=bv(e,n),o=s[1],i=s[2];if(o>i)return!0}n=n.parentNode}while(n&&n!==a.body);return!1},Ik=function(e){var t=e.scrollTop,a=e.scrollHeight,n=e.clientHeight;return[t,a,n]},Rk=function(e){var t=e.scrollLeft,a=e.scrollWidth,n=e.clientWidth;return[t,a,n]},vv=function(e,t){return e==="v"?Pk(t):_k(t)},bv=function(e,t){return e==="v"?Ik(t):Rk(t)},Ak=function(e,t){return e==="h"&&t==="rtl"?-1:1},jk=function(e,t,a,n,r){var s=Ak(e,window.getComputedStyle(t).direction),o=s*n,i=a.target,l=t.contains(i),c=!1,u=o>0,p=0,f=0;do{if(!i)break;var v=bv(e,i),x=v[0],b=v[1],k=v[2],g=b-k-s*x;(x||g)&&vv(e,i)&&(p+=g,f+=x);var d=i.parentNode;i=d&&d.nodeType===Node.DOCUMENT_FRAGMENT_NODE?d.host:d}while(!l&&i!==document.body||l&&(t.contains(i)||t===i));return(u&&Math.abs(p)<1||!u&&Math.abs(f)<1)&&(c=!0),c},dl=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},yv=function(e){return[e.deltaX,e.deltaY]},xv=function(e){return e&&"current"in e?e.current:e},Dk=function(e,t){return e[0]===t[0]&&e[1]===t[1]},Ok=function(e){return`
|
|
946
946
|
.block-interactivity-`.concat(e,` {pointer-events: none;}
|
|
947
947
|
.allow-interactivity-`).concat(e,` {pointer-events: all;}
|
|
948
|
-
`)},Ok=0,gr=[];function Lk(e){var t=N.useRef([]),a=N.useRef([0,0]),n=N.useRef(),r=N.useState(Ok++)[0],s=N.useState(fv)[0],o=N.useRef(e);N.useEffect(function(){o.current=e},[e]),N.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(r));var b=sk([e.lockRef.current],(e.shards||[]).map(xv),!0).filter(Boolean);return b.forEach(function(k){return k.classList.add("allow-interactivity-".concat(r))}),function(){document.body.classList.remove("block-interactivity-".concat(r)),b.forEach(function(k){return k.classList.remove("allow-interactivity-".concat(r))})}}},[e.inert,e.lockRef.current,e.shards]);var i=N.useCallback(function(b,k){if("touches"in b&&b.touches.length===2||b.type==="wheel"&&b.ctrlKey)return!o.current.allowPinchZoom;var g=dl(b),d=a.current,h="deltaX"in b?b.deltaX:d[0]-g[0],y="deltaY"in b?b.deltaY:d[1]-g[1],S,C=b.target,E=Math.abs(h)>Math.abs(y)?"h":"v";if("touches"in b&&E==="h"&&C.type==="range")return!1;var _=window.getSelection(),R=_&&_.anchorNode,A=R?R===C||R.contains(C):!1;if(A)return!1;var G=hv(E,C);if(!G)return!0;if(G?S=E:(S=E==="v"?"h":"v",G=hv(E,C)),!G)return!1;if(!n.current&&"changedTouches"in b&&(h||y)&&(n.current=S),!S)return!0;var L=n.current||S;return Ak(L,k,b,L==="h"?h:y)},[]),l=N.useCallback(function(b){var k=b;if(!(!gr.length||gr[gr.length-1]!==s)){var g="deltaY"in k?yv(k):dl(k),d=t.current.filter(function(S){return S.name===k.type&&(S.target===k.target||k.target===S.shadowParent)&&jk(S.delta,g)})[0];if(d&&d.should){k.cancelable&&k.preventDefault();return}if(!d){var h=(o.current.shards||[]).map(xv).filter(Boolean).filter(function(S){return S.contains(k.target)}),y=h.length>0?i(k,h[0]):!o.current.noIsolation;y&&k.cancelable&&k.preventDefault()}}},[]),c=N.useCallback(function(b,k,g,d){var h={name:b,delta:k,target:g,should:d,shadowParent:Mk(g)};t.current.push(h),setTimeout(function(){t.current=t.current.filter(function(y){return y!==h})},1)},[]),u=N.useCallback(function(b){a.current=dl(b),n.current=void 0},[]),p=N.useCallback(function(b){c(b.type,yv(b),b.target,i(b,e.lockRef.current))},[]),f=N.useCallback(function(b){c(b.type,dl(b),b.target,i(b,e.lockRef.current))},[]);N.useEffect(function(){return gr.push(s),e.setCallbacks({onScrollCapture:p,onWheelCapture:p,onTouchMoveCapture:f}),document.addEventListener("wheel",l,mr),document.addEventListener("touchmove",l,mr),document.addEventListener("touchstart",u,mr),function(){gr=gr.filter(function(b){return b!==s}),document.removeEventListener("wheel",l,mr),document.removeEventListener("touchmove",l,mr),document.removeEventListener("touchstart",u,mr)}},[]);var v=e.removeScrollBar,x=e.inert;return N.createElement(N.Fragment,null,x?N.createElement(s,{styles:Dk(r)}):null,v?N.createElement(Ek,{noRelative:e.noRelative,gapMode:e.gapMode}):null)}function Mk(e){for(var t=null;e!==null;)e instanceof ShadowRoot&&(t=e.host,e=e.host),e=e.parentNode;return t}const zk=fk(pv,Lk);var Pu=N.forwardRef(function(e,t){return N.createElement(il,Xa({},e,{ref:t,sideCar:zk}))});Pu.classNames=il.classNames;var Fk=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},hr=new WeakMap,cl=new WeakMap,ul={},_u=0,wv=function(e){return e&&(e.host||wv(e.parentNode))},Bk=function(e,t){return t.map(function(a){if(e.contains(a))return a;var n=wv(a);return n&&e.contains(n)?n:(console.error("aria-hidden",a,"in not contained inside",e,". Doing nothing"),null)}).filter(function(a){return!!a})},Uk=function(e,t,a,n){var r=Bk(t,Array.isArray(e)?e:[e]);ul[a]||(ul[a]=new WeakMap);var s=ul[a],o=[],i=new Set,l=new Set(r),c=function(p){!p||i.has(p)||(i.add(p),c(p.parentNode))};r.forEach(c);var u=function(p){!p||l.has(p)||Array.prototype.forEach.call(p.children,function(f){if(i.has(f))u(f);else try{var v=f.getAttribute(n),x=v!==null&&v!=="false",b=(hr.get(f)||0)+1,k=(s.get(f)||0)+1;hr.set(f,b),s.set(f,k),o.push(f),b===1&&x&&cl.set(f,!0),k===1&&f.setAttribute(a,"true"),x||f.setAttribute(n,"true")}catch(g){console.error("aria-hidden: cannot operate on ",f,g)}})};return u(t),i.clear(),_u++,function(){o.forEach(function(p){var f=hr.get(p)-1,v=s.get(p)-1;hr.set(p,f),s.set(p,v),f||(cl.has(p)||p.removeAttribute(n),cl.delete(p)),v||p.removeAttribute(a)}),_u--,_u||(hr=new WeakMap,hr=new WeakMap,cl=new WeakMap,ul={})}},kv=function(e,t,a){a===void 0&&(a="data-aria-hidden");var n=Array.from(Array.isArray(e)?e:[e]),r=Fk(e);return r?(n.push.apply(n,Array.from(r.querySelectorAll("[aria-live], script"))),Uk(n,r,a,"aria-hidden")):function(){return null}},qk=Object.defineProperty,ya=(e,t)=>qk(e,"name",{value:t,configurable:!0}),Iu="Dialog",[Nv,KE]=ba(Iu),[Vk,Za]=Nv(Iu),Sv=ya(e=>{const{__scopeDialog:t,children:a,open:n,defaultOpen:r,onOpenChange:s,modal:o=!0}=e,i=N.useRef(null),l=N.useRef(null),{nodes:c,registry:u}=Qh(),[p,f]=_a({prop:n,defaultProp:r??!1,onChange:s,caller:Iu}),[v,x]=N.useState(0),[b,k]=N.useState(0);return T.jsx(Vk,{scope:t,triggerRef:i,contentRef:l,contentId:vn(),titleId:vn(),descriptionId:vn(),titlePresent:v>0,descriptionPresent:b>0,setTitleCount:x,setDescriptionCount:k,open:p,onOpenChange:f,onOpenToggle:N.useCallback(()=>f(g=>!g),[f]),modal:o,branchNodes:c,branchRegistry:u,children:a})},"Dialog"),Cv="DialogPortal",[Wk,Ev]=Nv(Cv,{forceMount:void 0}),Ru=ya(e=>{const{__scopeDialog:t,forceMount:a,children:n,container:r}=e,s=Za(Cv,t);return T.jsx(Wk,{scope:t,forceMount:a,children:N.Children.map(n,o=>T.jsx(Jn,{present:a||s.open,children:T.jsx(wu,{asChild:!0,container:r,children:o})}))})},"DialogPortal"),Au="DialogOverlay",ju=N.forwardRef(ya(function(t,a){const n=Ev(Au,t.__scopeDialog),{forceMount:r=n.forceMount,...s}=t,o=Za(Au,t.__scopeDialog);return o.modal?T.jsx(Jn,{present:r||o.open,children:T.jsx(Gk,{...s,ref:a})}):null},"DialogOverlay")),Hk=hn("DialogOverlay.RemoveScroll"),Gk=N.forwardRef(ya(function(t,a){const{__scopeDialog:n,...r}=t,s=Za(Au,n),o=qh(),i=Xe(a,o);return T.jsx(Pu,{as:Hk,allowPinchZoom:!0,shards:N.useMemo(()=>[s.contentRef,...s.branchNodes.map(l=>({current:l}))],[s.contentRef,s.branchNodes]),children:T.jsx(Oe.div,{"data-state":Lu(s.open),...r,ref:i,style:{pointerEvents:"auto",...r.style}})})},"DialogOverlayImpl")),No="DialogContent",Du=N.forwardRef(ya(function(t,a){const n=Ev(No,t.__scopeDialog),{forceMount:r=n.forceMount,...s}=t,o=Za(No,t.__scopeDialog);return T.jsx(Jn,{present:r||o.open,children:o.modal?T.jsx(Kk,{...s,ref:a}):T.jsx(Yk,{...s,ref:a})})},"DialogContent")),Kk=N.forwardRef(ya(function(t,a){const n=Za(No,t.__scopeDialog),r=N.useRef(null),s=Xe(a,n.contentRef,r);return N.useEffect(()=>{const o=r.current;if(o)return kv(o)},[]),T.jsx($v,{...t,ref:s,trapFocus:n.open,disableOutsidePointerEvents:n.open,onCloseAutoFocus:Pe(t.onCloseAutoFocus,o=>{o.preventDefault(),n.triggerRef.current?.focus()}),onPointerDownOutside:Pe(t.onPointerDownOutside,o=>{const i=o.detail.originalEvent,l=i.button===0&&i.ctrlKey===!0;(i.button===2||l)&&o.preventDefault()}),onFocusOutside:Pe(t.onFocusOutside,o=>o.preventDefault())})},"DialogContentModal")),Yk=N.forwardRef(ya(function(t,a){const n=Za(No,t.__scopeDialog),r=N.useRef(!1),s=N.useRef(!1);return T.jsx($v,{...t,ref:a,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:o=>{t.onCloseAutoFocus?.(o),o.defaultPrevented||(r.current||n.triggerRef.current?.focus(),o.preventDefault()),r.current=!1,s.current=!1},onInteractOutside:o=>{t.onInteractOutside?.(o),o.defaultPrevented||(r.current=!0,o.detail.originalEvent.type==="pointerdown"&&(s.current=!0));const i=o.target;n.triggerRef.current?.contains(i)&&o.preventDefault(),o.detail.originalEvent.type==="focusin"&&s.current&&o.preventDefault()}})},"DialogContentNonModal")),$v=N.forwardRef(ya(function(t,a){const{__scopeDialog:n,trapFocus:r,onOpenAutoFocus:s,onCloseAutoFocus:o,"aria-describedby":i,children:l,...c}=t,u=Za(No,n);return sl(),T.jsx(Yh,{registry:u.branchRegistry,children:T.jsx(Gh,{asChild:!0,loop:!0,trapped:r,branches:u.branchNodes,onMountAutoFocus:s,onUnmountAutoFocus:o,children:T.jsx(fu,{role:"dialog",id:u.contentId,"aria-labelledby":u.titlePresent?u.titleId:void 0,"aria-describedby":u.descriptionPresent?_v(i,u.descriptionId):i,"data-state":Lu(u.open),...c,ref:a,deferPointerDownOutside:!0,onDismiss:()=>u.onOpenChange(!1),children:l})})})},"DialogContentImpl")),Ou=N.forwardRef(ya(function(t,a){const{__scopeDialog:n,...r}=t,s=Za("DialogTitle",n),{setTitleCount:o}=s;return kt(()=>(o(i=>i+1),()=>o(i=>i-1)),[o]),T.jsx(Oe.h2,{id:s.titleId,...r,ref:a})},"DialogTitle")),Tv=N.forwardRef(ya(function(t,a){const{__scopeDialog:n,...r}=t,s=Za("DialogDescription",n),{setDescriptionCount:o}=s;return kt(()=>(o(i=>i+1),()=>o(i=>i-1)),[o]),T.jsx(Oe.p,{id:s.descriptionId,...r,ref:a})},"DialogDescription")),Qk="DialogClose",Pv=N.forwardRef(ya(function(t,a){const{__scopeDialog:n,...r}=t,s=Za(Qk,n);return T.jsx(Oe.button,{type:"button",...r,ref:a,onClick:Pe(t.onClick,()=>s.onOpenChange(!1))})},"DialogClose"));function _v(...e){const t=new Set;for(const a of e)if(typeof a=="string")for(const n of String(a).trim().split(/\s+/))n&&t.add(n);return t.size>0?Array.from(t).join(" "):void 0}ya(_v,"concatAriaDescribedby");function Lu(e){return e?"open":"closed"}ya(Lu,"getState");var Xk=Object.defineProperty,At=(e,t)=>Xk(e,"name",{value:t,configurable:!0});function Mu(e){const t=e+"CollectionProvider",[a,n]=ba(t),[r,s]=a(t,{collectionRef:{current:null},itemMap:new Map}),o=At(b=>{const{scope:k,children:g}=b,d=N.useRef(null),h=N.useRef(new Map).current;return T.jsx(r,{scope:k,itemMap:h,collectionRef:d,children:g})},"CollectionProvider");o.displayName=t;const i=e+"CollectionSlot",l=hn(i),c=N.forwardRef((b,k)=>{const{scope:g,children:d}=b,h=s(i,g),y=Xe(k,h.collectionRef);return T.jsx(l,{ref:y,children:d})});c.displayName=i;const u=e+"CollectionItemSlot",p="data-radix-collection-item",f=hn(u),v=N.forwardRef((b,k)=>{const{scope:g,children:d,...h}=b,y=N.useRef(null),S=Xe(k,y),C=s(u,g);return N.useEffect(()=>(C.itemMap.set(y,{ref:y,...h}),()=>void C.itemMap.delete(y))),T.jsx(f,{[p]:"",ref:S,children:d})});v.displayName=u;function x(b){const k=s(e+"CollectionConsumer",b);return N.useCallback(()=>{const d=k.collectionRef.current;if(!d)return[];const h=Array.from(d.querySelectorAll(`[${p}]`));return Array.from(k.itemMap.values()).sort((C,E)=>h.indexOf(C.ref.current)-h.indexOf(E.ref.current))},[k.collectionRef,k.itemMap])}return At(x,"useCollection"),[{Provider:o,Slot:c,ItemSlot:v},x,n]}At(Mu,"createCollection");var Iv=new WeakMap,pl=(xa=class extends Map{constructor(a){super(a);Ay(this,Nt);jp(this,Nt,[...super.keys()]),Iv.set(this,!0)}set(a,n){return Iv.get(this)&&!this.has(a)&&Wt(this,Nt).push(a),super.set(a,n),this}insert(a,n,r){const s=this.has(n),o=s?this.size:this.size+1,i=zu(a),l=i>=0?Math.min(i,o-1):Math.max(o+i,0);if(s?Wt(this,Nt).indexOf(n)===l:l===this.size)return this.set(n,r),this;const c=Wt(this,Nt).filter(p=>p!==n);c.splice(l,0,n);const u=c.map(p=>[p,p===n?r:this.get(p)]);this.clear();for(const[p,f]of u)this.set(p,f);return this}with(a,n,r){const s=new xa(this);return s.insert(a,n,r),s}before(a){const n=Wt(this,Nt).indexOf(a)-1;if(!(n<0))return this.entryAt(n)}setBefore(a,n,r){const s=Wt(this,Nt).indexOf(a);if(s===-1)return this;const o=Wt(this,Nt).indexOf(n),i=o!==-1&&o<s?s-1:s;return this.insert(i,n,r)}after(a){let n=Wt(this,Nt).indexOf(a);if(n=n===-1||n===this.size-1?-1:n+1,n!==-1)return this.entryAt(n)}setAfter(a,n,r){const s=Wt(this,Nt).indexOf(a);if(s===-1)return this;const o=Wt(this,Nt).indexOf(n),i=o!==-1&&o<=s?s:s+1;return this.insert(i,n,r)}first(){return this.entryAt(0)}last(){return this.entryAt(-1)}clear(){return jp(this,Nt,[]),super.clear()}delete(a){const n=super.delete(a);return n&&Wt(this,Nt).splice(Wt(this,Nt).indexOf(a),1),n}deleteAt(a){const n=this.keyAt(a);return n!==void 0?this.delete(n):!1}at(a){const n=fl(Wt(this,Nt),a);if(n!==void 0)return this.get(n)}entryAt(a){const n=fl(Wt(this,Nt),a);if(n!==void 0)return[n,this.get(n)]}indexOf(a){return Wt(this,Nt).indexOf(a)}keyAt(a){return fl(Wt(this,Nt),a)}from(a,n){const r=this.indexOf(a);if(r===-1)return;let s=r+n;return s<0&&(s=0),s>=this.size&&(s=this.size-1),this.at(s)}keyFrom(a,n){const r=this.indexOf(a);if(r===-1)return;let s=r+n;return s<0&&(s=0),s>=this.size&&(s=this.size-1),this.keyAt(s)}find(a,n){let r=0;for(const s of this){if(Reflect.apply(a,n,[s,r,this]))return s;r++}}findIndex(a,n){let r=0;for(const s of this){if(Reflect.apply(a,n,[s,r,this]))return r;r++}return-1}filter(a,n){const r=[];let s=0;for(const o of this)Reflect.apply(a,n,[o,s,this])&&r.push(o),s++;return new xa(r)}map(a,n){const r=[];let s=0;for(const o of this)r.push([o[0],Reflect.apply(a,n,[o,s,this])]),s++;return new xa(r)}reduce(...a){const[n,r]=a,s=a.length>1;if(!s&&this.size===0)throw new TypeError("Reduce of empty OrderedDict with no initial value");let o=0,i=r;for(const l of this)o===0&&!s?i=l:i=Reflect.apply(n,this,[i,l,o,this]),o++;return i}reduceRight(...a){const[n,r]=a,s=a.length>1;if(!s&&this.size===0)throw new TypeError("Reduce of empty OrderedDict with no initial value");let o=r;for(let i=this.size-1;i>=0;i--){const l=this.entryAt(i);i===this.size-1&&!s?o=l:o=Reflect.apply(n,this,[o,l,i,this])}return o}sort(a){if(typeof a!="function")throw new TypeError("OrderedDict.sort requires a compare function");const n=[...this.entries()].sort(a);this.clear();for(const[r,s]of n)this.set(r,s);return this}toSorted(a){if(typeof a!="function")throw new TypeError("OrderedDict.toSorted requires a compare function");const n=[...this.entries()].sort(a);return new xa(n)}toReversed(){const a=new xa;for(let n=this.size-1;n>=0;n--){const r=this.keyAt(n),s=this.get(r);a.set(r,s)}return a}toSpliced(...a){const n=[...this.entries()];return n.splice(...a),new xa(n)}slice(a,n){const r=new xa;for(const s of Wt(this,Nt).slice(a,n))r.set(s,this.get(s));return r}every(a,n){let r=0;for(const s of this){if(!Reflect.apply(a,n,[s,r,this]))return!1;r++}return!0}some(a,n){let r=0;for(const s of this){if(Reflect.apply(a,n,[s,r,this]))return!0;r++}return!1}},Nt=new WeakMap,At(xa,"OrderedDict"),xa);function fl(e,t){if("at"in Array.prototype)return Array.prototype.at.call(e,t);const a=Rv(e,t);return a===-1?void 0:e[a]}At(fl,"at");function Rv(e,t){const a=e.length,n=zu(t),r=n>=0?n:a+n;return r<0||r>=a?-1:r}At(Rv,"toSafeIndex");function zu(e){return e!==e||e===0?0:Math.trunc(e)}At(zu,"toSafeInteger");function Zk(e){const t=e+"CollectionProvider",[a,n]=ba(t),[r,s]=a(t);r.displayName=e+"CollectionStableContextProvider";const[o,i]=a(t);o.displayName=e+"CollectionStatefulContextProvider";const l=At(({state:C,...E})=>C?T.jsx(u,{...E,state:C}):T.jsx(c,{...E}),"CollectionProvider");l.displayName=t;const c=At(C=>{const E=d();return T.jsx(u,{...C,state:E})},"CollectionInit");c.displayName=e+"CollectionInit";const u=At(C=>{const{scope:E,children:_,state:R}=C,A=N.useRef(null),[G,L]=N.useState(null),P=Xe(A,L),[W,J]=R,V=N.useRef(new pl),F=N.useCallback(()=>{const M=V.current;return Dv(M)||M.sort(ml),M},[]);return N.useEffect(()=>{if(!G)return;const M=Ov(()=>{J(w=>{const $=w.toSorted(ml);return $.some(([I],O)=>w.keyAt(O)!==I)?$:w})});return M.observe(G,{childList:!0,subtree:!0}),()=>{M.disconnect()}},[G,J]),T.jsx(r,{scope:E,collectionElementRef:P,collectionElementRefObject:A,getCollection:F,setCollection:J,registryRef:V,children:T.jsx(o,{scope:E,collectionElement:G,collection:W,children:_})})},"CollectionProviderImpl");u.displayName=e+"CollectionProviderImpl";const p=e+"CollectionSlot",f=hn(p),v=N.forwardRef((C,E)=>{const{scope:_,children:R}=C,A=s(p,_),G=Xe(E,A.collectionElementRef);return T.jsx(f,{ref:G,children:R})});v.displayName=p;const x=e+"CollectionItemSlot",b="data-radix-collection-item",k=hn(x),g=N.forwardRef((C,E)=>{const{scope:_,children:R,...A}=C,G=N.useRef(null),L=s(x,_),{setCollection:P,registryRef:W}=L,J=N.useRef(A);Av(J.current,A)||(J.current=A);const V=J.current,F=N.useCallback($=>{const Y=W.current;$?Y.set($,{...J.current,element:$}):G.current&&Y.delete(G.current)},[W]),M=Xe(E,F,G);kt(()=>{const $=G.current,Y=W.current;$&&Y.has($)&&Y.set($,{...V,element:$})},[V,W]);const w=N.useRef(null);return N.useEffect(()=>{const $=G.current,Y=w.current;(Y?.element??null)===$&&(!$||Y?.itemData===V)||(w.current=$?{element:$,itemData:V}:null,P(I=>{const O=new pl(I);return Y&&Y.element!==$&&O.delete(Y.element),$&&O.set($,{...V,element:$}),O.sort(ml)}))}),N.useEffect(()=>()=>{const $=w.current;w.current=null,$&&P(Y=>{if(!Y.has($.element))return Y;const I=new pl(Y);return I.delete($.element),I})},[P]),T.jsx(k,{[b]:"",ref:M,children:R})});g.displayName=x;function d(){return N.useState(new pl)}At(d,"useInitCollection");function h(C){const{collection:E}=i(e+"CollectionConsumer",C);return E}At(h,"useCollection");function y(C){const{getCollection:E}=s(e+"CollectionConsumer",C);return E}return At(y,"useGetCollection"),[{Provider:l,Slot:v,ItemSlot:g},{createCollectionScope:n,useCollection:h,useGetCollection:y,useInitCollection:d}]}At(Zk,"createCollection");function Av(e,t){if(e===t)return!0;if(typeof e!="object"||typeof t!="object"||e==null||t==null)return!1;const a=Object.keys(e),n=Object.keys(t);if(a.length!==n.length)return!1;for(const r of a)if(!Object.prototype.hasOwnProperty.call(t,r)||e[r]!==t[r])return!1;return!0}At(Av,"shallowEqual");function jv(e,t){return!!(t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_PRECEDING)}At(jv,"isElementPreceding");function Dv(e){let t;for(const a of e.keys()){if(t){const n=t.compareDocumentPosition(a);if(!(n&Node.DOCUMENT_POSITION_DISCONNECTED)&&n&Node.DOCUMENT_POSITION_PRECEDING)return!1}t=a}return!0}At(Dv,"isInDocumentOrder");function ml(e,t){return!e[1].element||!t[1].element?0:jv(e[1].element,t[1].element)?-1:1}At(ml,"sortByDocumentPosition");function Ov(e){return new MutationObserver(a=>{for(const n of a)if(n.type==="childList"){e();return}})}At(Ov,"getChildListObserver");var Jk=Object.defineProperty,eN=(e,t)=>Jk(e,"name",{value:t,configurable:!0}),tN={LTR:"ltr"},aN=N.createContext(void 0);function So(e){const t=N.useContext(aN);return e||t||tN.LTR}eN(So,"useDirection");var nN=Object.defineProperty,Fu=(e,t)=>nN(e,"name",{value:t,configurable:!0}),Bu=!1;function Lv(){const[e,t]=N.useState(Bu);return N.useEffect(()=>{Bu||(Bu=!0,t(!0))},[]),e}Fu(Lv,"useIsHydrated");var Mv=Rn[" useSyncExternalStore ".trim().toString()];function zv(){return()=>{}}Fu(zv,"subscribe");function Fv(){return Mv(zv,()=>!0,()=>!1)}Fu(Fv,"useIsHydratedModern");var sN=typeof Mv=="function"?Fv:Lv,rN=Object.defineProperty,Cs=(e,t)=>rN(e,"name",{value:t,configurable:!0}),Uu="rovingFocusGroup.onEntryFocus",oN={bubbles:!1,cancelable:!0},gl="RovingFocusGroup",[qu,Bv,iN]=Mu(gl),[lN,hl]=ba(gl,[iN]),Uv={Vertical:"vertical",Horizontal:"horizontal"},dN={RTL:"rtl"},[cN,uN]=lN(gl),qv=N.forwardRef(Cs(function(t,a){return T.jsx(qu.Provider,{scope:t.__scopeRovingFocusGroup,children:T.jsx(qu.Slot,{scope:t.__scopeRovingFocusGroup,children:T.jsx(pN,{...t,ref:a})})})},"RovingFocusGroup")),pN=N.forwardRef(Cs(function(t,a){const{__scopeRovingFocusGroup:n,orientation:r,loop:s=!1,dir:o,currentTabStopId:i,defaultCurrentTabStopId:l,onCurrentTabStopIdChange:c,onEntryFocus:u,preventScrollOnEntryFocus:p=!1,...f}=t,v=N.useRef(null),x=Xe(a,v),b=So(o),[k,g]=_a({prop:i,defaultProp:l??null,onChange:c,caller:gl}),[d,h]=N.useState(!1),y=Ba(u),S=Bv(n),C=N.useRef(!1),[E,_]=N.useState(0);return N.useEffect(()=>{const R=v.current;if(R)return R.addEventListener(Uu,y),()=>R.removeEventListener(Uu,y)},[y]),T.jsx(cN,{scope:n,orientation:r,dir:b,loop:s,currentTabStopId:k,onItemFocus:N.useCallback(R=>g(R),[g]),onItemShiftTab:N.useCallback(()=>h(!0),[]),onFocusableItemAdd:N.useCallback(()=>_(R=>R+1),[]),onFocusableItemRemove:N.useCallback(()=>_(R=>R-1),[]),children:T.jsx(Oe.div,{tabIndex:d||E===0?-1:0,"data-orientation":r,...f,ref:x,style:{outline:"none",...t.style},onMouseDown:Pe(t.onMouseDown,()=>{C.current=!0}),onFocus:Pe(t.onFocus,R=>{const A=!C.current;if(R.target===R.currentTarget&&A&&!d){const G=new CustomEvent(Uu,oN);if(R.currentTarget.dispatchEvent(G),!G.defaultPrevented){const L=S().filter(F=>F.focusable),P=L.find(F=>F.active),W=L.find(F=>F.id===k),V=[P,W,...L].filter(Boolean).map(F=>F.ref.current);Vu(V,p)}}C.current=!1}),onBlur:Pe(t.onBlur,()=>h(!1))})})},"RovingFocusGroupImpl")),fN="RovingFocusGroupItem",Vv=N.forwardRef(Cs(function(t,a){const{__scopeRovingFocusGroup:n,focusable:r=!0,active:s=!1,tabStopId:o,children:i,...l}=t,c=vn(),u=o||c,p=uN(fN,n),f=p.currentTabStopId===u,v=Bv(n),{onFocusableItemAdd:x,onFocusableItemRemove:b,currentTabStopId:k}=p,g=sN();return kt(()=>{if(!(!g||!r))return x(),()=>b()},[g,r,x,b]),N.useEffect(()=>{if(!(g||!r))return x(),()=>b()},[g,r,x,b]),T.jsx(qu.ItemSlot,{scope:n,id:u,focusable:r,active:s,children:T.jsx(Oe.span,{tabIndex:f?0:-1,"data-orientation":p.orientation,...l,ref:a,onMouseDown:Pe(t.onMouseDown,d=>{r?p.onItemFocus(u):d.preventDefault()}),onFocus:Pe(t.onFocus,()=>p.onItemFocus(u)),onKeyDown:Pe(t.onKeyDown,d=>{if(d.key==="Tab"&&d.shiftKey){p.onItemShiftTab();return}if(d.target!==d.currentTarget)return;const h=Hv(d,p.orientation,p.dir);if(h!==void 0){if(d.metaKey||d.ctrlKey||d.altKey||d.shiftKey)return;d.preventDefault();let S=v().filter(C=>C.focusable).map(C=>C.ref.current);if(h==="last")S.reverse();else if(h==="prev"||h==="next"){h==="prev"&&S.reverse();const C=S.indexOf(d.currentTarget);S=p.loop?Gv(S,C+1):S.slice(C+1)}setTimeout(()=>Vu(S))}}),children:typeof i=="function"?i({isCurrentTabStop:f,hasTabStop:k!=null}):i})})},"RovingFocusGroupItem")),mN={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function Wv(e,t){return t!==dN.RTL?e:e==="ArrowLeft"?"ArrowRight":e==="ArrowRight"?"ArrowLeft":e}Cs(Wv,"getDirectionAwareKey");function Hv(e,t,a){const n=Wv(e.key,a);if(!(t===Uv.Vertical&&["ArrowLeft","ArrowRight"].includes(n))&&!(t===Uv.Horizontal&&["ArrowUp","ArrowDown"].includes(n)))return mN[n]}Cs(Hv,"getFocusIntent");function Vu(e,t=!1){const a=document.activeElement;for(const n of e)if(n===a||(n.focus({preventScroll:t}),document.activeElement!==a))return}Cs(Vu,"focusFirst");function Gv(e,t){return e.map((a,n)=>e[(t+n)%e.length])}Cs(Gv,"wrapArray");var gN=Object.defineProperty,vr=(e,t)=>gN(e,"name",{value:t,configurable:!0}),Kv={Automatic:"automatic",Manual:"manual"},Wu="Tabs",[hN,YE]=ba(Wu,[hl]),Yv=hl(),[vN,Hu]=hN(Wu),bN=N.forwardRef(vr(function(t,a){const{__scopeTabs:n,value:r,onValueChange:s,defaultValue:o,orientation:i="horizontal",dir:l,activationMode:c=Kv.Automatic,...u}=t,p=So(l),[f,v]=_a({prop:r,onChange:s,defaultProp:o??"",caller:Wu});return T.jsx(vN,{scope:n,baseId:vn(),value:f,onValueChange:v,orientation:i,dir:p,activationMode:c,children:T.jsx(Oe.div,{dir:p,"data-orientation":i,...u,ref:a})})},"Tabs")),yN="TabsList",xN=N.forwardRef(vr(function(t,a){const{__scopeTabs:n,loop:r=!0,...s}=t,o=Hu(yN,n),i=Yv(n);return T.jsx(qv,{asChild:!0,...i,orientation:o.orientation,dir:o.dir,loop:r,children:T.jsx(Oe.div,{role:"tablist","aria-orientation":o.orientation,...s,ref:a})})},"TabsList")),wN="TabsTrigger",kN=N.forwardRef(vr(function(t,a){const{__scopeTabs:n,value:r,disabled:s=!1,...o}=t,i=Hu(wN,n),l=Yv(n),c=Gu(i.baseId,r),u=Ku(i.baseId,r),p=r===i.value;return T.jsx(Vv,{asChild:!0,...l,focusable:!s,active:p,children:T.jsx(Oe.button,{type:"button",role:"tab","aria-selected":p,"aria-controls":u,"data-state":p?"active":"inactive","data-disabled":s?"":void 0,disabled:s,id:c,...o,ref:a,onMouseDown:Pe(t.onMouseDown,f=>{!s&&f.button===0&&f.ctrlKey===!1?(f.currentTarget.focus(),i.onValueChange(r)):f.preventDefault()}),onKeyDown:Pe(t.onKeyDown,f=>{s||f.target!==f.currentTarget||[" ","Enter"].includes(f.key)&&i.onValueChange(r)}),onFocus:Pe(t.onFocus,()=>{const f=i.activationMode!==Kv.Manual;!p&&!s&&f&&i.onValueChange(r)})})})},"TabsTrigger")),NN="TabsContent",SN=N.forwardRef(vr(function(t,a){const{__scopeTabs:n,value:r,forceMount:s,children:o,...i}=t,l=Hu(NN,n),c=Gu(l.baseId,r),u=Ku(l.baseId,r),p=r===l.value,f=N.useRef(p);return N.useEffect(()=>{const v=requestAnimationFrame(()=>f.current=!1);return()=>cancelAnimationFrame(v)},[]),T.jsx(Jn,{present:s||p,children:({present:v})=>T.jsx(Oe.div,{"data-state":p?"active":"inactive","data-orientation":l.orientation,role:"tabpanel","aria-labelledby":c,hidden:!v,id:u,tabIndex:0,...i,ref:a,style:{...t.style,animationDuration:f.current?"0s":void 0},children:v&&o})})},"TabsContent"));function Gu(e,t){return`${e}-trigger-${t}`}vr(Gu,"makeTriggerId");function Ku(e,t){return`${e}-content-${t}`}vr(Ku,"makeContentId");var CN=Object.defineProperty,EN=(e,t)=>CN(e,"name",{value:t,configurable:!0});function vl(e){const[t,a]=N.useState(void 0);return kt(()=>{if(e){a({width:e.offsetWidth,height:e.offsetHeight});let n=0;const r=new ResizeObserver(s=>{if(!Array.isArray(s)||!s.length)return;const o=s[0];window.cancelAnimationFrame(n),n=window.requestAnimationFrame(()=>{let i,l;if("borderBoxSize"in o){const c=o.borderBoxSize,u=Array.isArray(c)?c[0]:c;i=u.inlineSize,l=u.blockSize}else i=e.offsetWidth,l=e.offsetHeight;a({width:i,height:l})})});return r.observe(e,{box:"border-box"}),()=>{window.cancelAnimationFrame(n),r.unobserve(e)}}else a(void 0)},[e]),t}EN(vl,"useSize");var $N=Object.defineProperty,es=(e,t)=>$N(e,"name",{value:t,configurable:!0}),Yu="Switch",[TN,QE]=ba(Yu),[PN,Qu]=TN(Yu);function Qv(e){const{__scopeSwitch:t,checked:a,children:n,defaultChecked:r,disabled:s,form:o,name:i,onCheckedChange:l,required:c,value:u="on",internal_do_not_use_render:p}=e,[f,v]=_a({prop:a,defaultProp:r??!1,onChange:l,caller:Yu}),[x,b]=N.useState(null),[k,g]=N.useState(null),[d,h]=N.useState(null),y=x?!!o||!!x.closest("form"):!0,S={checked:f,setChecked:v,disabled:s,control:x,setControl:b,name:i,form:o,value:u,userClick:d,onUserClick:h,required:c,defaultChecked:r,isFormControl:y,bubbleInput:k,setBubbleInput:g};return T.jsx(PN,{scope:t,...S,children:Jv(p)?p(S):n})}es(Qv,"SwitchProvider");var _N="SwitchTrigger",IN=N.forwardRef(es(function({__scopeSwitch:t,onClick:a,...n},r){const{control:s,form:o,value:i,disabled:l,checked:c,required:u,setControl:p,setChecked:f,onUserClick:v,isFormControl:x,bubbleInput:b}=Qu(_N,t),k=Xe(r,p),g=N.useRef(c);return N.useEffect(()=>{const d=o?s?.ownerDocument.getElementById(o):s?.form;if(d instanceof HTMLFormElement){const h=es(()=>f(g.current),"reset");return d.addEventListener("reset",h),()=>d.removeEventListener("reset",h)}},[s,o,f]),T.jsx(Oe.button,{type:"button",role:"switch","aria-checked":c,"aria-required":u,"data-state":Xu(c),"data-disabled":l?"":void 0,disabled:l,value:i,...n,ref:k,onClick:Pe(a,d=>{const h=d.isPropagationStopped();v({requestedChecked:!c,hasConsumerStoppedPropagation:h}),f(y=>!y),b&&x&&(h||d.stopPropagation())})})},"SwitchTrigger")),Xv=N.forwardRef(es(function(t,a){const{__scopeSwitch:n,name:r,checked:s,defaultChecked:o,required:i,disabled:l,value:c,onCheckedChange:u,form:p,...f}=t;return T.jsx(Qv,{__scopeSwitch:n,checked:s,defaultChecked:o,disabled:l,required:i,onCheckedChange:u,name:r,form:p,value:c,internal_do_not_use_render:({isFormControl:v})=>T.jsxs(T.Fragment,{children:[T.jsx(IN,{...f,ref:a,__scopeSwitch:n}),v&&T.jsx(jN,{__scopeSwitch:n})]})})},"Switch")),RN="SwitchThumb",Zv=N.forwardRef(es(function(t,a){const{__scopeSwitch:n,...r}=t,s=Qu(RN,n);return T.jsx(Oe.span,{"data-state":Xu(s.checked),"data-disabled":s.disabled?"":void 0,...r,ref:a})},"SwitchThumb")),AN="SwitchBubbleInput",jN=N.forwardRef(es(function({__scopeSwitch:t,onClick:a,...n},r){const{control:s,userClick:o,checked:i,defaultChecked:l,required:c,disabled:u,name:p,value:f,form:v,bubbleInput:x,setBubbleInput:b}=Qu(AN,t),k=Xe(r,b),g=vl(s),d=N.useRef(!1),h=N.useRef(i),y=N.useRef(o),S=N.useRef(null);N.useEffect(()=>{const E=x;if(!E)return;const _=window.HTMLInputElement.prototype,A=Object.getOwnPropertyDescriptor(_,"checked").set;if(!A)return;const G=h.current!==i;h.current=i;const L=o!==null&&o!==y.current;if(y.current=o,L)S.current=G?null:o,G&&A.call(E,i),E.dispatchEvent(new Event("click",{bubbles:!o.hasConsumerStoppedPropagation}));else if(G){const P=S.current;S.current=null;const W=P?.requestedChecked===i;d.current=!0,A.call(E,i),E.dispatchEvent(new Event("click",{bubbles:!(W&&P.hasConsumerStoppedPropagation)})),d.current=!1}},[x,i,o]);const C=N.useRef(i);return T.jsx(Oe.input,{type:"checkbox","aria-hidden":!0,defaultChecked:l??C.current,required:c,disabled:u,name:p,value:f,form:v,...n,tabIndex:-1,ref:k,onClick:Pe(a,E=>{d.current&&E.stopPropagation()}),style:{...n.style,...g,position:"absolute",pointerEvents:"none",opacity:0,margin:0,transform:"translateX(-100%)"}})},"SwitchBubbleInput"));function Jv(e){return typeof e=="function"}es(Jv,"isFunction");function Xu(e){return e?"checked":"unchecked"}es(Xu,"getState");var DN=Object.defineProperty,xn=(e,t)=>DN(e,"name",{value:t,configurable:!0}),Zu="Checkbox",[ON,XE]=ba(Zu),[LN,Ju]=ON(Zu);function eb(e){const{__scopeCheckbox:t,checked:a,children:n,defaultChecked:r,disabled:s,form:o,name:i,onCheckedChange:l,required:c,value:u="on",internal_do_not_use_render:p}=e,[f,v]=_a({prop:a,defaultProp:r??!1,onChange:l,caller:Zu}),[x,b]=N.useState(null),[k,g]=N.useState(null),[d,h]=N.useState(null),y=x?!!o||!!x.closest("form"):!0,S={checked:f,disabled:s,setChecked:v,control:x,setControl:b,name:i,form:o,value:u,userClick:d,onUserClick:h,required:c,defaultChecked:Ia(r)?!1:r,isFormControl:y,bubbleInput:k,setBubbleInput:g};return T.jsx(LN,{scope:t,...S,children:tb(p)?p(S):n})}xn(eb,"CheckboxProvider");var MN="CheckboxTrigger",zN=N.forwardRef(xn(function({__scopeCheckbox:t,onKeyDown:a,onClick:n,...r},s){const{control:o,value:i,disabled:l,checked:c,required:u,setControl:p,setChecked:f,onUserClick:v,isFormControl:x,bubbleInput:b}=Ju(MN,t),k=Xe(s,p),g=N.useRef(c);return N.useEffect(()=>{const d=o?.form;if(d){const h=xn(()=>f(g.current),"reset");return d.addEventListener("reset",h),()=>d.removeEventListener("reset",h)}},[o,f]),T.jsx(Oe.button,{type:"button",role:"checkbox","aria-checked":Ia(c)?"mixed":c,"aria-required":u,"data-state":ep(c),"data-disabled":l?"":void 0,disabled:l,value:i,...r,ref:k,onKeyDown:Pe(a,d=>{d.key==="Enter"&&d.preventDefault()}),onClick:Pe(n,d=>{const h=d.isPropagationStopped();v({requestedChecked:Ia(c)?!0:!c,hasConsumerStoppedPropagation:h}),f(y=>Ia(y)?!0:!y),b&&x&&(h||d.stopPropagation())})})},"CheckboxTrigger")),FN=N.forwardRef(xn(function(t,a){const{__scopeCheckbox:n,name:r,checked:s,defaultChecked:o,required:i,disabled:l,value:c,onCheckedChange:u,form:p,...f}=t;return T.jsx(eb,{__scopeCheckbox:n,checked:s,defaultChecked:o,disabled:l,required:i,onCheckedChange:u,name:r,form:p,value:c,internal_do_not_use_render:({isFormControl:v})=>T.jsxs(T.Fragment,{children:[T.jsx(zN,{...f,ref:a,__scopeCheckbox:n}),v&&T.jsx(VN,{__scopeCheckbox:n})]})})},"Checkbox")),BN="CheckboxIndicator",UN=N.forwardRef(xn(function(t,a){const{__scopeCheckbox:n,forceMount:r,...s}=t,o=Ju(BN,n);return T.jsx(Jn,{present:r||Ia(o.checked)||o.checked===!0,children:T.jsx(Oe.span,{"data-state":ep(o.checked),"data-disabled":o.disabled?"":void 0,...s,ref:a,style:{pointerEvents:"none",...t.style}})})},"CheckboxIndicator")),qN="CheckboxBubbleInput",VN=N.forwardRef(xn(function({__scopeCheckbox:t,onClick:a,...n},r){const{control:s,userClick:o,checked:i,defaultChecked:l,required:c,disabled:u,name:p,value:f,form:v,bubbleInput:x,setBubbleInput:b}=Ju(qN,t),k=Xe(r,b),g=vl(s),d=N.useRef(!1),h=N.useRef(i),y=N.useRef(o),S=N.useRef(null);N.useEffect(()=>{const E=x;if(!E)return;const _=window.HTMLInputElement.prototype,A=Object.getOwnPropertyDescriptor(_,"checked").set;if(!A)return;const G=h.current!==i;h.current=i;const L=o!==null&&o!==y.current;if(y.current=o,L)S.current=G?null:o,G&&(E.indeterminate=Ia(i),A.call(E,Ia(i)?!1:i)),E.dispatchEvent(new Event("click",{bubbles:!o.hasConsumerStoppedPropagation}));else if(G){const P=S.current;S.current=null;const W=P?.requestedChecked===i;d.current=!0,E.indeterminate=Ia(i),A.call(E,Ia(i)?!1:i),E.dispatchEvent(new Event("click",{bubbles:!(W&&P.hasConsumerStoppedPropagation)})),d.current=!1}},[x,i,o]);const C=N.useRef(Ia(i)?!1:i);return T.jsx(Oe.input,{type:"checkbox","aria-hidden":!0,defaultChecked:l??C.current,required:c,disabled:u,name:p,value:f,form:v,...n,tabIndex:-1,ref:k,onClick:Pe(a,E=>{d.current&&E.stopPropagation()}),style:{...n.style,...g,position:"absolute",pointerEvents:"none",opacity:0,margin:0,transform:"translateX(-100%)"}})},"CheckboxBubbleInput"));function tb(e){return typeof e=="function"}xn(tb,"isFunction");function Ia(e){return e==="indeterminate"}xn(Ia,"isIndeterminate");function ep(e){return Ia(e)?"indeterminate":e?"checked":"unchecked"}xn(ep,"getState");var WN=Object.defineProperty,HN=(e,t)=>WN(e,"name",{value:t,configurable:!0}),GN=N.forwardRef(HN(function(t,a){return T.jsx(Oe.label,{...t,ref:a,onMouseDown:n=>{n.target.closest("button, input, select, textarea")||(t.onMouseDown?.(n),!n.defaultPrevented&&n.detail>1&&n.preventDefault())}})},"Label"));function ab(e){var t,a,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var r=e.length;for(t=0;t<r;t++)e[t]&&(a=ab(e[t]))&&(n&&(n+=" "),n+=a)}else for(a in e)e[a]&&(n&&(n+=" "),n+=a);return n}function nb(){for(var e,t,a=0,n="",r=arguments.length;a<r;a++)(e=arguments[a])&&(t=ab(e))&&(n&&(n+=" "),n+=t);return n}const sb=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,rb=nb,ob=(e,t)=>a=>{var n;if(t?.variants==null)return rb(e,a?.class,a?.className);const{variants:r,defaultVariants:s}=t,o=Object.keys(r).map(c=>{const u=a?.[c],p=s?.[c];if(u===null)return null;const f=sb(u)||sb(p);return r[c][f]}),i=a&&Object.entries(a).reduce((c,u)=>{let[p,f]=u;return f===void 0||(c[p]=f),c},{}),l=t==null||(n=t.compoundVariants)===null||n===void 0?void 0:n.reduce((c,u)=>{let{class:p,className:f,...v}=u;return Object.entries(v).every(x=>{let[b,k]=x;return Array.isArray(k)?k.includes({...s,...i}[b]):{...s,...i}[b]===k})?[...c,p,f]:c},[]);return rb(e,o,l,a?.class,a?.className)},tp="-",KN=e=>{const t=QN(e),{conflictingClassGroups:a,conflictingClassGroupModifiers:n}=e;return{getClassGroupId:o=>{const i=o.split(tp);return i[0]===""&&i.length!==1&&i.shift(),ib(i,t)||YN(o)},getConflictingClassGroupIds:(o,i)=>{const l=a[o]||[];return i&&n[o]?[...l,...n[o]]:l}}},ib=(e,t)=>{if(e.length===0)return t.classGroupId;const a=e[0],n=t.nextPart.get(a),r=n?ib(e.slice(1),n):void 0;if(r)return r;if(t.validators.length===0)return;const s=e.join(tp);return t.validators.find(({validator:o})=>o(s))?.classGroupId},lb=/^\[(.+)\]$/,YN=e=>{if(lb.test(e)){const t=lb.exec(e)[1],a=t?.substring(0,t.indexOf(":"));if(a)return"arbitrary.."+a}},QN=e=>{const{theme:t,prefix:a}=e,n={nextPart:new Map,validators:[]};return ZN(Object.entries(e.classGroups),a).forEach(([s,o])=>{ap(o,n,s,t)}),n},ap=(e,t,a,n)=>{e.forEach(r=>{if(typeof r=="string"){const s=r===""?t:db(t,r);s.classGroupId=a;return}if(typeof r=="function"){if(XN(r)){ap(r(n),t,a,n);return}t.validators.push({validator:r,classGroupId:a});return}Object.entries(r).forEach(([s,o])=>{ap(o,db(t,s),a,n)})})},db=(e,t)=>{let a=e;return t.split(tp).forEach(n=>{a.nextPart.has(n)||a.nextPart.set(n,{nextPart:new Map,validators:[]}),a=a.nextPart.get(n)}),a},XN=e=>e.isThemeGetter,ZN=(e,t)=>t?e.map(([a,n])=>{const r=n.map(s=>typeof s=="string"?t+s:typeof s=="object"?Object.fromEntries(Object.entries(s).map(([o,i])=>[t+o,i])):s);return[a,r]}):e,JN=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,a=new Map,n=new Map;const r=(s,o)=>{a.set(s,o),t++,t>e&&(t=0,n=a,a=new Map)};return{get(s){let o=a.get(s);if(o!==void 0)return o;if((o=n.get(s))!==void 0)return r(s,o),o},set(s,o){a.has(s)?a.set(s,o):r(s,o)}}},cb="!",eS=e=>{const{separator:t,experimentalParseClassName:a}=e,n=t.length===1,r=t[0],s=t.length,o=i=>{const l=[];let c=0,u=0,p;for(let k=0;k<i.length;k++){let g=i[k];if(c===0){if(g===r&&(n||i.slice(k,k+s)===t)){l.push(i.slice(u,k)),u=k+s;continue}if(g==="/"){p=k;continue}}g==="["?c++:g==="]"&&c--}const f=l.length===0?i:i.substring(u),v=f.startsWith(cb),x=v?f.substring(1):f,b=p&&p>u?p-u:void 0;return{modifiers:l,hasImportantModifier:v,baseClassName:x,maybePostfixModifierPosition:b}};return a?i=>a({className:i,parseClassName:o}):o},tS=e=>{if(e.length<=1)return e;const t=[];let a=[];return e.forEach(n=>{n[0]==="["?(t.push(...a.sort(),n),a=[]):a.push(n)}),t.push(...a.sort()),t},aS=e=>({cache:JN(e.cacheSize),parseClassName:eS(e),...KN(e)}),nS=/\s+/,sS=(e,t)=>{const{parseClassName:a,getClassGroupId:n,getConflictingClassGroupIds:r}=t,s=[],o=e.trim().split(nS);let i="";for(let l=o.length-1;l>=0;l-=1){const c=o[l],{modifiers:u,hasImportantModifier:p,baseClassName:f,maybePostfixModifierPosition:v}=a(c);let x=!!v,b=n(x?f.substring(0,v):f);if(!b){if(!x){i=c+(i.length>0?" "+i:i);continue}if(b=n(f),!b){i=c+(i.length>0?" "+i:i);continue}x=!1}const k=tS(u).join(":"),g=p?k+cb:k,d=g+b;if(s.includes(d))continue;s.push(d);const h=r(b,x);for(let y=0;y<h.length;++y){const S=h[y];s.push(g+S)}i=c+(i.length>0?" "+i:i)}return i};function rS(){let e=0,t,a,n="";for(;e<arguments.length;)(t=arguments[e++])&&(a=ub(t))&&(n&&(n+=" "),n+=a);return n}const ub=e=>{if(typeof e=="string")return e;let t,a="";for(let n=0;n<e.length;n++)e[n]&&(t=ub(e[n]))&&(a&&(a+=" "),a+=t);return a};function oS(e,...t){let a,n,r,s=o;function o(l){const c=t.reduce((u,p)=>p(u),e());return a=aS(c),n=a.cache.get,r=a.cache.set,s=i,i(l)}function i(l){const c=n(l);if(c)return c;const u=sS(l,a);return r(l,u),u}return function(){return s(rS.apply(null,arguments))}}const dt=e=>{const t=a=>a[e]||[];return t.isThemeGetter=!0,t},pb=/^\[(?:([a-z-]+):)?(.+)\]$/i,iS=/^\d+\/\d+$/,lS=new Set(["px","full","screen"]),dS=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,cS=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,uS=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,pS=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,fS=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,wn=e=>br(e)||lS.has(e)||iS.test(e),ts=e=>yr(e,"length",wS),br=e=>!!e&&!Number.isNaN(Number(e)),np=e=>yr(e,"number",br),Co=e=>!!e&&Number.isInteger(Number(e)),mS=e=>e.endsWith("%")&&br(e.slice(0,-1)),Re=e=>pb.test(e),as=e=>dS.test(e),gS=new Set(["length","size","percentage"]),hS=e=>yr(e,gS,fb),vS=e=>yr(e,"position",fb),bS=new Set(["image","url"]),yS=e=>yr(e,bS,NS),xS=e=>yr(e,"",kS),Eo=()=>!0,yr=(e,t,a)=>{const n=pb.exec(e);return n?n[1]?typeof t=="string"?n[1]===t:t.has(n[1]):a(n[2]):!1},wS=e=>cS.test(e)&&!uS.test(e),fb=()=>!1,kS=e=>pS.test(e),NS=e=>fS.test(e),SS=oS(()=>{const e=dt("colors"),t=dt("spacing"),a=dt("blur"),n=dt("brightness"),r=dt("borderColor"),s=dt("borderRadius"),o=dt("borderSpacing"),i=dt("borderWidth"),l=dt("contrast"),c=dt("grayscale"),u=dt("hueRotate"),p=dt("invert"),f=dt("gap"),v=dt("gradientColorStops"),x=dt("gradientColorStopPositions"),b=dt("inset"),k=dt("margin"),g=dt("opacity"),d=dt("padding"),h=dt("saturate"),y=dt("scale"),S=dt("sepia"),C=dt("skew"),E=dt("space"),_=dt("translate"),R=()=>["auto","contain","none"],A=()=>["auto","hidden","clip","visible","scroll"],G=()=>["auto",Re,t],L=()=>[Re,t],P=()=>["",wn,ts],W=()=>["auto",br,Re],J=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],V=()=>["solid","dashed","dotted","double","none"],F=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],M=()=>["start","end","center","between","around","evenly","stretch"],w=()=>["","0",Re],$=()=>["auto","avoid","all","avoid-page","page","left","right","column"],Y=()=>[br,Re];return{cacheSize:500,separator:":",theme:{colors:[Eo],spacing:[wn,ts],blur:["none","",as,Re],brightness:Y(),borderColor:[e],borderRadius:["none","","full",as,Re],borderSpacing:L(),borderWidth:P(),contrast:Y(),grayscale:w(),hueRotate:Y(),invert:w(),gap:L(),gradientColorStops:[e],gradientColorStopPositions:[mS,ts],inset:G(),margin:G(),opacity:Y(),padding:L(),saturate:Y(),scale:Y(),sepia:w(),skew:Y(),space:L(),translate:L()},classGroups:{aspect:[{aspect:["auto","square","video",Re]}],container:["container"],columns:[{columns:[as]}],"break-after":[{"break-after":$()}],"break-before":[{"break-before":$()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...J(),Re]}],overflow:[{overflow:A()}],"overflow-x":[{"overflow-x":A()}],"overflow-y":[{"overflow-y":A()}],overscroll:[{overscroll:R()}],"overscroll-x":[{"overscroll-x":R()}],"overscroll-y":[{"overscroll-y":R()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[b]}],"inset-x":[{"inset-x":[b]}],"inset-y":[{"inset-y":[b]}],start:[{start:[b]}],end:[{end:[b]}],top:[{top:[b]}],right:[{right:[b]}],bottom:[{bottom:[b]}],left:[{left:[b]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",Co,Re]}],basis:[{basis:G()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",Re]}],grow:[{grow:w()}],shrink:[{shrink:w()}],order:[{order:["first","last","none",Co,Re]}],"grid-cols":[{"grid-cols":[Eo]}],"col-start-end":[{col:["auto",{span:["full",Co,Re]},Re]}],"col-start":[{"col-start":W()}],"col-end":[{"col-end":W()}],"grid-rows":[{"grid-rows":[Eo]}],"row-start-end":[{row:["auto",{span:[Co,Re]},Re]}],"row-start":[{"row-start":W()}],"row-end":[{"row-end":W()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",Re]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",Re]}],gap:[{gap:[f]}],"gap-x":[{"gap-x":[f]}],"gap-y":[{"gap-y":[f]}],"justify-content":[{justify:["normal",...M()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...M(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...M(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[d]}],px:[{px:[d]}],py:[{py:[d]}],ps:[{ps:[d]}],pe:[{pe:[d]}],pt:[{pt:[d]}],pr:[{pr:[d]}],pb:[{pb:[d]}],pl:[{pl:[d]}],m:[{m:[k]}],mx:[{mx:[k]}],my:[{my:[k]}],ms:[{ms:[k]}],me:[{me:[k]}],mt:[{mt:[k]}],mr:[{mr:[k]}],mb:[{mb:[k]}],ml:[{ml:[k]}],"space-x":[{"space-x":[E]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[E]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",Re,t]}],"min-w":[{"min-w":[Re,t,"min","max","fit"]}],"max-w":[{"max-w":[Re,t,"none","full","min","max","fit","prose",{screen:[as]},as]}],h:[{h:[Re,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[Re,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[Re,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[Re,t,"auto","min","max","fit"]}],"font-size":[{text:["base",as,ts]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",np]}],"font-family":[{font:[Eo]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",Re]}],"line-clamp":[{"line-clamp":["none",br,np]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",wn,Re]}],"list-image":[{"list-image":["none",Re]}],"list-style-type":[{list:["none","disc","decimal",Re]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[g]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[g]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...V(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",wn,ts]}],"underline-offset":[{"underline-offset":["auto",wn,Re]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:L()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",Re]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",Re]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[g]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...J(),vS]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",hS]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},yS]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[x]}],"gradient-via-pos":[{via:[x]}],"gradient-to-pos":[{to:[x]}],"gradient-from":[{from:[v]}],"gradient-via":[{via:[v]}],"gradient-to":[{to:[v]}],rounded:[{rounded:[s]}],"rounded-s":[{"rounded-s":[s]}],"rounded-e":[{"rounded-e":[s]}],"rounded-t":[{"rounded-t":[s]}],"rounded-r":[{"rounded-r":[s]}],"rounded-b":[{"rounded-b":[s]}],"rounded-l":[{"rounded-l":[s]}],"rounded-ss":[{"rounded-ss":[s]}],"rounded-se":[{"rounded-se":[s]}],"rounded-ee":[{"rounded-ee":[s]}],"rounded-es":[{"rounded-es":[s]}],"rounded-tl":[{"rounded-tl":[s]}],"rounded-tr":[{"rounded-tr":[s]}],"rounded-br":[{"rounded-br":[s]}],"rounded-bl":[{"rounded-bl":[s]}],"border-w":[{border:[i]}],"border-w-x":[{"border-x":[i]}],"border-w-y":[{"border-y":[i]}],"border-w-s":[{"border-s":[i]}],"border-w-e":[{"border-e":[i]}],"border-w-t":[{"border-t":[i]}],"border-w-r":[{"border-r":[i]}],"border-w-b":[{"border-b":[i]}],"border-w-l":[{"border-l":[i]}],"border-opacity":[{"border-opacity":[g]}],"border-style":[{border:[...V(),"hidden"]}],"divide-x":[{"divide-x":[i]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[i]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[g]}],"divide-style":[{divide:V()}],"border-color":[{border:[r]}],"border-color-x":[{"border-x":[r]}],"border-color-y":[{"border-y":[r]}],"border-color-s":[{"border-s":[r]}],"border-color-e":[{"border-e":[r]}],"border-color-t":[{"border-t":[r]}],"border-color-r":[{"border-r":[r]}],"border-color-b":[{"border-b":[r]}],"border-color-l":[{"border-l":[r]}],"divide-color":[{divide:[r]}],"outline-style":[{outline:["",...V()]}],"outline-offset":[{"outline-offset":[wn,Re]}],"outline-w":[{outline:[wn,ts]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:P()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[g]}],"ring-offset-w":[{"ring-offset":[wn,ts]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",as,xS]}],"shadow-color":[{shadow:[Eo]}],opacity:[{opacity:[g]}],"mix-blend":[{"mix-blend":[...F(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":F()}],filter:[{filter:["","none"]}],blur:[{blur:[a]}],brightness:[{brightness:[n]}],contrast:[{contrast:[l]}],"drop-shadow":[{"drop-shadow":["","none",as,Re]}],grayscale:[{grayscale:[c]}],"hue-rotate":[{"hue-rotate":[u]}],invert:[{invert:[p]}],saturate:[{saturate:[h]}],sepia:[{sepia:[S]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[a]}],"backdrop-brightness":[{"backdrop-brightness":[n]}],"backdrop-contrast":[{"backdrop-contrast":[l]}],"backdrop-grayscale":[{"backdrop-grayscale":[c]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[u]}],"backdrop-invert":[{"backdrop-invert":[p]}],"backdrop-opacity":[{"backdrop-opacity":[g]}],"backdrop-saturate":[{"backdrop-saturate":[h]}],"backdrop-sepia":[{"backdrop-sepia":[S]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[o]}],"border-spacing-x":[{"border-spacing-x":[o]}],"border-spacing-y":[{"border-spacing-y":[o]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",Re]}],duration:[{duration:Y()}],ease:[{ease:["linear","in","out","in-out",Re]}],delay:[{delay:Y()}],animate:[{animate:["none","spin","ping","pulse","bounce",Re]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[y]}],"scale-x":[{"scale-x":[y]}],"scale-y":[{"scale-y":[y]}],rotate:[{rotate:[Co,Re]}],"translate-x":[{"translate-x":[_]}],"translate-y":[{"translate-y":[_]}],"skew-x":[{"skew-x":[C]}],"skew-y":[{"skew-y":[C]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",Re]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",Re]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":L()}],"scroll-mx":[{"scroll-mx":L()}],"scroll-my":[{"scroll-my":L()}],"scroll-ms":[{"scroll-ms":L()}],"scroll-me":[{"scroll-me":L()}],"scroll-mt":[{"scroll-mt":L()}],"scroll-mr":[{"scroll-mr":L()}],"scroll-mb":[{"scroll-mb":L()}],"scroll-ml":[{"scroll-ml":L()}],"scroll-p":[{"scroll-p":L()}],"scroll-px":[{"scroll-px":L()}],"scroll-py":[{"scroll-py":L()}],"scroll-ps":[{"scroll-ps":L()}],"scroll-pe":[{"scroll-pe":L()}],"scroll-pt":[{"scroll-pt":L()}],"scroll-pr":[{"scroll-pr":L()}],"scroll-pb":[{"scroll-pb":L()}],"scroll-pl":[{"scroll-pl":L()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",Re]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[wn,ts,np]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}});function pt(...e){return SS(nb(e))}function xr(){if(typeof document>"u")return;const e=document.querySelector("[data-dsh-studio]:not([data-dsh-studio-portal])"),t=e&&e.getAttribute("data-theme")==="dark"?"dark":"light";let a=document.querySelector("[data-dsh-studio-portal]");return a===null&&(a=document.createElement("div"),a.setAttribute("data-dsh-studio-portal",""),a.setAttribute("data-dsh-studio",""),document.body.appendChild(a)),a.setAttribute("data-dsh-studio",""),a.setAttribute("data-theme",t),a}const CS=ob("inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium outline-none transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50",{variants:{variant:{default:"bg-primary text-primary-foreground shadow-sm hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90 focus-visible:ring-destructive/20",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9"}},defaultVariants:{variant:"default",size:"default"}}),wr=N.forwardRef(({className:e,variant:t,size:a,asChild:n=!1,...r},s)=>{const o=n?C1:"button";return T.jsx(o,{className:pt(CS({variant:t,size:a,className:e})),ref:s,...r})});wr.displayName="Button";const bl=N.forwardRef(({className:e,type:t,...a},n)=>T.jsx("input",{type:t,className:pt("flex h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm outline-none transition-[color,box-shadow] selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive",e),ref:n,...a}));bl.displayName="Input";const mb=N.forwardRef(({className:e,...t},a)=>T.jsx("textarea",{className:pt("flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm outline-none transition-[color,box-shadow] placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50 md:text-sm focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive",e),ref:a,...t}));mb.displayName="Textarea";const yl=N.forwardRef(({className:e,...t},a)=>T.jsx(GN,{ref:a,className:pt("flex items-center gap-2 text-sm leading-none font-medium select-none",e),...t}));yl.displayName="Label";const gb=N.forwardRef(({className:e,...t},a)=>T.jsx("div",{ref:a,className:pt("flex flex-col gap-6 rounded-xl border border-border bg-card py-6 text-card-foreground shadow-sm",e),...t}));gb.displayName="Card";const ES=({className:e,...t})=>T.jsx("div",{className:pt("grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6",e),...t}),$S=({className:e,...t})=>T.jsx("div",{className:pt("leading-none font-semibold",e),...t}),TS=({className:e,...t})=>T.jsx("div",{className:pt("px-6",e),...t}),PS=({className:e,...t})=>T.jsx("div",{className:pt("flex items-center px-6 [.border-t]:pt-6",e),...t}),_S=ob("inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-md border px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [&>svg]:pointer-events-none [&>svg]:size-3",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground",secondary:"border-transparent bg-secondary text-secondary-foreground",destructive:"border-transparent bg-destructive text-destructive-foreground shadow",outline:"text-foreground"}},defaultVariants:{variant:"default"}}),IS=({className:e,variant:t,...a})=>T.jsx("div",{className:pt(_S({variant:t}),e),...a}),sp=bN,xl=N.forwardRef(({className:e,...t},a)=>T.jsx(xN,{ref:a,className:pt("inline-flex w-fit items-center justify-center rounded-lg bg-muted p-[3px] text-muted-foreground data-[orientation=horizontal]:h-8 data-[orientation=vertical]:h-fit data-[orientation=vertical]:flex-col",e),...t}));xl.displayName="TabsList";const $o=N.forwardRef(({className:e,...t},a)=>T.jsx(kN,{ref:a,className:pt("relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 whitespace-nowrap rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium text-foreground/60 transition-all hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm dark:text-muted-foreground dark:hover:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 dark:data-[state=active]:text-foreground",e),...t}));$o.displayName="TabsTrigger";const RS=N.forwardRef(({className:e,...t},a)=>T.jsx(SN,{ref:a,className:pt("mt-3 focus-visible:outline-none",e),...t}));RS.displayName="TabsContent";const AS=({...e})=>T.jsx(Ru,{container:xr(),...e}),hb=N.forwardRef(({className:e,...t},a)=>T.jsx(ju,{ref:a,className:pt("fixed inset-0 z-[95] bg-black/50",e),...t}));hb.displayName="DialogOverlay";const jS=N.forwardRef(({className:e,children:t,...a},n)=>T.jsxs(AS,{children:[T.jsx(hb,{}),T.jsxs(Du,{ref:n,className:pt("fixed left-[50%] top-[50%] z-[96] grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border border-border bg-card p-6 text-card-foreground shadow-lg sm:max-w-lg",e),...a,children:[t,T.jsxs(Pv,{className:"absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring",children:[T.jsx(yh,{className:"h-4 w-4"}),T.jsx("span",{className:"sr-only",children:"关闭"})]})]})]}));jS.displayName="DialogContent";const DS=N.forwardRef(({className:e,...t},a)=>T.jsx(Ou,{ref:a,className:pt("text-base font-semibold leading-none tracking-tight",e),...t}));DS.displayName="DialogTitle";const OS=N.forwardRef(({className:e,...t},a)=>T.jsx(Tv,{ref:a,className:pt("text-sm text-muted-foreground",e),...t}));OS.displayName="DialogDescription";const LS=N.forwardRef(({className:e,...t},a)=>T.jsx(Xv,{className:pt("peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",e),...t,ref:a,children:T.jsx(Zv,{className:"pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0"})}));LS.displayName="Switch";const MS=N.forwardRef(({className:e,...t},a)=>T.jsx(FN,{ref:a,className:pt("peer h-4 w-4 shrink-0 rounded-sm border border-input shadow focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",e),...t,children:T.jsx(UN,{className:pt("flex items-center justify-center text-current"),children:T.jsx(bh,{className:"h-3.5 w-3.5"})})}));MS.displayName="Checkbox";const zS="dsh-studio:session",FS="dsh-studio:auth-user",BS="dsh-studio:user";function rp(e,t){try{t==null||t===""?window.localStorage.removeItem(e):window.localStorage.setItem(e,t)}catch{}}async function US(e){const t=await fetch("/studio-api/auth/login",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)}),a=await t.json().catch(()=>({}));if(!t.ok||a.ok!==!0)throw new Error(String(a.error??`登录失败(HTTP ${t.status})`));return a}function qS({config:e,theme:t,message:a,onDone:n,onClose:r,overlay:s}){const o=String(e?.localAuth?.username??"admin"),i=e?.localAuth?.enabled!==!1,l=e?.ldap?.enabled===!0,[c,u]=N.useState(l?"ldap":"local"),[p,f]=N.useState(l?"":o),[v,x]=N.useState(""),[b,k]=N.useState(!1),[g,d]=N.useState(String(a??"")),[h,y]=N.useState(!1),S=N.useRef(null),C=N.useRef(null);N.useEffect(()=>{const L=window.setTimeout(()=>{c==="local"?S.current?.focus():C.current?.focus()},30);return()=>window.clearTimeout(L)},[c]);const E=L=>{L!==c&&(u(L),d(""),x(""),f(L==="local"?o:""))},_=async L=>{if(L&&L.preventDefault(),!b){if(p.trim()===""||v===""){d(c==="local"?"本地账号和密码都要填":"域账号和密码都要填");return}k(!0),d("");try{const P=await US({username:p.trim().normalize("NFKC"),password:v.normalize("NFKC"),mode:c});rp(zS,P.token),rp(FS,JSON.stringify(P.user??null)),rp(BS,String(P.user?.name??P.user?.id??p.trim())),x(""),n()}catch(P){d(P instanceof Error?P.message:String(P))}finally{k(!1)}}},R=String(e?.board?.title??"工作空间"),A=/LDAP|域|目录|连不上/.test(g),G=T.jsxs(gb,{className:"w-[380px] shrink-0 py-0 shadow-md",children:[T.jsx(ES,{className:"gap-2 px-5 pb-4 pt-5",children:T.jsxs("div",{className:"flex items-center gap-2",children:[T.jsx("span",{className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-lg bg-primary text-[13px] leading-none text-primary-foreground","aria-hidden":!0,children:"◈"}),T.jsxs("div",{className:"min-w-0",children:[T.jsx($S,{className:"truncate text-[15px] leading-tight",children:R}),T.jsx("div",{className:"text-[11px] leading-tight text-muted-foreground",children:"需求与任务工作空间"})]})]})}),T.jsxs(TS,{className:"px-5 pb-0",children:[T.jsx(sp,{value:c,onValueChange:E,children:T.jsxs(xl,{className:"w-full",children:[T.jsx($o,{value:"ldap",disabled:!l,className:"flex-1 text-[13px]",children:"LDAP 账号"}),T.jsx($o,{value:"local",disabled:!i,className:"flex-1 text-[13px]",children:"本地超管"})]})}),T.jsx("p",{className:"mb-3 mt-3 text-[12px] leading-relaxed text-muted-foreground",children:c==="ldap"?"用公司目录账号登录,登录后写操作与审计都记在这个名字下。":`用平台自带的超管账号登录。默认 ${o} / admin,改过之后用新口令。`}),T.jsxs("form",{className:"grid w-full max-w-full gap-3",onSubmit:_,children:[T.jsxs("div",{className:"grid min-w-0 gap-1.5",children:[T.jsx(yl,{htmlFor:"studio-account",className:"text-[12px] text-muted-foreground",children:c==="local"?"超管账号":"域账号"}),T.jsx(bl,{id:"studio-account",ref:C,name:"studio-account",autoComplete:"off",spellCheck:!1,className:"box-border h-9 w-full min-w-0 text-[13px]",value:p,placeholder:c==="local"?o:"域账号",onChange:L=>f(L.target.value)})]}),T.jsxs("div",{className:"grid min-w-0 gap-1.5",children:[T.jsx(yl,{htmlFor:"studio-pass",className:"text-[12px] text-muted-foreground",children:"密码"}),T.jsxs("div",{className:"relative min-w-0",children:[T.jsx(bl,{id:"studio-pass",ref:S,type:h?"text":"password",name:"studio-pass",autoComplete:"new-password",className:"box-border h-9 w-full min-w-0 pr-9 text-[13px]",value:v,placeholder:c==="local"?"默认口令 admin":"域密码",onChange:L=>x(L.target.value)}),T.jsx("button",{type:"button","aria-label":h?"隐藏密码":"显示密码",title:h?"隐藏密码":"显示密码(看清是不是被输入法打成了全角)",onClick:()=>y(L=>!L),className:"absolute right-1 top-1 flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground hover:bg-muted hover:text-foreground",children:h?T.jsx(w1,{size:14}):T.jsx(k1,{size:14})})]})]}),g===""?null:T.jsxs("div",{className:"flex items-start gap-1.5 rounded-md border border-destructive/35 bg-destructive/5 px-2.5 py-2 text-[12px] leading-relaxed text-destructive",children:[T.jsx("span",{"aria-hidden":!0,children:"!"}),T.jsx("span",{className:"min-w-0 break-words",children:g})]}),A?T.jsx("div",{className:"text-[11px] leading-relaxed text-muted-foreground",children:"连不上目录服务时,切到「本地超管」用平台账号进来;网络打通后再用域账号。"}):null,T.jsx(wr,{type:"submit",disabled:b,className:"h-9 w-full text-[13px]",children:b?"登录中…":c==="local"?"登录(本地超管)":"登录(LDAP)"})]})]}),T.jsxs(PS,{className:"mt-4 flex flex-col items-stretch gap-2 border-t border-border px-5 py-3",children:[T.jsx("div",{className:"truncate text-[11px] leading-relaxed text-muted-foreground",title:c==="ldap"?`${e?.ldap?.url??"—"} · BASE ${e?.ldap?.baseDN??"—"}`:"",children:c==="ldap"?`${e?.ldap?.url??"—"} · BASE ${e?.ldap?.baseDN??"—"}`:"口令以 scrypt 哈希存在服务端,改密码在「设置 → 统一登录(LDAP)」"}),T.jsxs("div",{className:"flex items-center justify-between",children:[T.jsx("span",{className:"text-[11px] text-muted-foreground",children:c==="local"?"回车即登录":"账号是域账号,不是邮箱"}),typeof r=="function"?T.jsx(wr,{type:"button",variant:"ghost",size:"sm",className:"h-7 px-2 text-[12px]",onClick:()=>r(),children:"先不登录"}):null]})]})]});return s===!0?T.jsx("div",{className:"fixed inset-0 z-[90] flex items-center justify-center bg-background/70 p-4 backdrop-blur-sm",children:G}):T.jsx("div",{"data-dsh-studio":"","data-theme":t,className:"dsh-studio-fill",children:T.jsx("div",{className:"flex min-h-full w-full items-center justify-center px-6 py-10",children:G})})}var VS=Object.defineProperty,WS=(e,t)=>VS(e,"name",{value:t,configurable:!0}),HS="Toggle",GS=N.forwardRef(WS(function(t,a){const{pressed:n,defaultPressed:r,onPressedChange:s,...o}=t,[i,l]=_a({prop:n,onChange:s,defaultProp:r??!1,caller:HS});return T.jsx(Oe.button,{type:"button","aria-pressed":i,"data-state":i?"on":"off","data-disabled":t.disabled?"":void 0,...o,ref:a,onClick:Pe(t.onClick,()=>{t.disabled||l(!i)})})},"Toggle")),KS=Object.defineProperty,ns=(e,t)=>KS(e,"name",{value:t,configurable:!0}),kr="ToggleGroup",To={Single:"single",Multiple:"multiple"},[vb,JE]=ba(kr,[hl]),bb=hl(),YS=N.forwardRef(ns(function(t,a){const{type:n,...r}=t;if(n===To.Single){const s=r;return T.jsx(QS,{role:"radiogroup",...s,ref:a})}if(n===To.Multiple){const s=r;return T.jsx(XS,{role:"toolbar",...s,ref:a})}throw new Error(`Missing prop \`type\` expected on \`${kr}\``)},"ToggleGroup")),[yb,xb]=vb(kr),QS=N.forwardRef(ns(function(t,a){const{value:n,defaultValue:r,onValueChange:s=ns(()=>{},"onValueChange"),...o}=t,[i,l]=_a({prop:n,defaultProp:r??"",onChange:s,caller:kr});return T.jsx(yb,{scope:t.__scopeToggleGroup,type:To.Single,value:N.useMemo(()=>i?[i]:[],[i]),onItemActivate:l,onItemDeactivate:N.useCallback(()=>l(""),[l]),children:T.jsx(wb,{...o,ref:a})})},"ToggleGroupImplSingle")),XS=N.forwardRef(ns(function(t,a){const{value:n,defaultValue:r,onValueChange:s=ns(()=>{},"onValueChange"),...o}=t,[i,l]=_a({prop:n,defaultProp:r??[],onChange:s,caller:kr}),c=N.useCallback(p=>l((f=[])=>[...f,p]),[l]),u=N.useCallback(p=>l((f=[])=>f.filter(v=>v!==p)),[l]);return T.jsx(yb,{scope:t.__scopeToggleGroup,type:To.Multiple,value:i,onItemActivate:c,onItemDeactivate:u,children:T.jsx(wb,{...o,ref:a})})},"ToggleGroupImplMultiple")),[ZS,JS]=vb(kr),wb=N.forwardRef(ns(function(t,a){const{__scopeToggleGroup:n,disabled:r=!1,rovingFocus:s=!0,orientation:o,dir:i,loop:l=!0,...c}=t,u=bb(n),p=So(i),f={dir:p,...c};return T.jsx(ZS,{scope:n,rovingFocus:s,disabled:r,children:s?T.jsx(qv,{asChild:!0,...u,orientation:o,dir:p,loop:l,children:T.jsx(Oe.div,{...f,ref:a})}):T.jsx(Oe.div,{...f,ref:a})})},"ToggleGroupImpl")),op="ToggleGroupItem",eC=N.forwardRef(ns(function(t,a){const n=xb(op,t.__scopeToggleGroup),r=JS(op,t.__scopeToggleGroup),s=bb(t.__scopeToggleGroup),o=n.value.includes(t.value),i=r.disabled||t.disabled,l={...t,pressed:o,disabled:i},c=N.useRef(null);return r.rovingFocus?T.jsx(Vv,{asChild:!0,...s,focusable:!i,active:o,ref:c,children:T.jsx(kb,{...l,ref:a})}):T.jsx(kb,{...l,ref:a})},"ToggleGroupItem")),kb=N.forwardRef(ns(function(t,a){const{__scopeToggleGroup:n,value:r,...s}=t,o=xb(op,n),i={role:"radio","aria-checked":t.pressed,"aria-pressed":void 0},l=o.type===To.Single?i:void 0;return T.jsx(GS,{...l,...s,ref:a,onPressedChange:c=>{c?o.onItemActivate(r):o.onItemDeactivate(r)}})},"ToggleGroupItemImpl")),tC=Object.defineProperty,aC=(e,t)=>tC(e,"name",{value:t,configurable:!0});function ip(e,[t,a]){return Math.min(a,Math.max(t,e))}aC(ip,"clamp");const nC=["top","right","bottom","left"],ss=Math.min,kn=Math.max,wl=Math.round,kl=Math.floor,Nn=e=>({x:e,y:e}),sC={left:"right",right:"left",bottom:"top",top:"bottom"};function Nb(e,t,a){return kn(e,ss(t,a))}function Sn(e,t){return typeof e=="function"?e(t):e}function rs(e){return e.split("-")[0]}function Nr(e){return e.split("-")[1]}function lp(e){return e==="x"?"y":"x"}function dp(e){return e==="y"?"height":"width"}function Ja(e){const t=e[0];return t==="t"||t==="b"?"y":"x"}function cp(e){return lp(Ja(e))}function rC(e,t,a){a===void 0&&(a=!1);const n=Nr(e),r=cp(e),s=dp(r);let o=r==="x"?n===(a?"end":"start")?"right":"left":n==="start"?"bottom":"top";return t.reference[s]>t.floating[s]&&(o=Nl(o)),[o,Nl(o)]}function oC(e){const t=Nl(e);return[up(e),t,up(t)]}function up(e){return e.includes("start")?e.replace("start","end"):e.replace("end","start")}const Sb=["left","right"],Cb=["right","left"],iC=["top","bottom"],lC=["bottom","top"];function dC(e,t,a){switch(e){case"top":case"bottom":return a?t?Cb:Sb:t?Sb:Cb;case"left":case"right":return t?iC:lC;default:return[]}}function cC(e,t,a,n){const r=Nr(e);let s=dC(rs(e),a==="start",n);return r&&(s=s.map(o=>o+"-"+r),t&&(s=s.concat(s.map(up)))),s}function Nl(e){const t=rs(e);return sC[t]+e.slice(t.length)}function uC(e){var t,a,n,r;return{top:(t=e.top)!=null?t:0,right:(a=e.right)!=null?a:0,bottom:(n=e.bottom)!=null?n:0,left:(r=e.left)!=null?r:0}}function Eb(e){return typeof e!="number"?uC(e):{top:e,right:e,bottom:e,left:e}}function Sl(e){const{x:t,y:a,width:n,height:r}=e;return{width:n,height:r,top:a,left:t,right:t+n,bottom:a+r,x:t,y:a}}function $b(e,t,a){let{reference:n,floating:r}=e;const s=Ja(t),o=cp(t),i=dp(o),l=rs(t),c=s==="y",u=n.x+n.width/2-r.width/2,p=n.y+n.height/2-r.height/2,f=n[i]/2-r[i]/2;let v;switch(l){case"top":v={x:u,y:n.y-r.height};break;case"bottom":v={x:u,y:n.y+n.height};break;case"right":v={x:n.x+n.width,y:p};break;case"left":v={x:n.x-r.width,y:p};break;default:v={x:n.x,y:n.y}}const x=Nr(t);return x&&(v[o]+=f*(x==="end"?1:-1)*(a&&c?-1:1)),v}async function pC(e,t){var a;t===void 0&&(t={});const{x:n,y:r,platform:s,rects:o,elements:i,strategy:l}=e,{boundary:c="clippingAncestors",rootBoundary:u="viewport",elementContext:p="floating",altBoundary:f=!1,padding:v=0}=Sn(t,e),x=Eb(v),k=i[f?p==="floating"?"reference":"floating":p],g=Sl(await s.getClippingRect({element:(a=await(s.isElement==null?void 0:s.isElement(k)))==null||a?k:k.contextElement||await(s.getDocumentElement==null?void 0:s.getDocumentElement(i.floating)),boundary:c,rootBoundary:u,strategy:l})),d=p==="floating"?{x:n,y:r,width:o.floating.width,height:o.floating.height}:o.reference,h=await(s.getOffsetParent==null?void 0:s.getOffsetParent(i.floating)),y=await(s.isElement==null?void 0:s.isElement(h))&&await(s.getScale==null?void 0:s.getScale(h))||{x:1,y:1},S=Sl(s.convertOffsetParentRelativeRectToViewportRelativeRect?await s.convertOffsetParentRelativeRectToViewportRelativeRect({elements:i,rect:d,offsetParent:h,strategy:l}):d);return{top:(g.top-S.top+x.top)/y.y,bottom:(S.bottom-g.bottom+x.bottom)/y.y,left:(g.left-S.left+x.left)/y.x,right:(S.right-g.right+x.right)/y.x}}const fC=50,mC=async(e,t,a)=>{const{placement:n="bottom",strategy:r="absolute",middleware:s=[],platform:o}=a,i=o.detectOverflow?o:{...o,detectOverflow:pC},l=await(o.isRTL==null?void 0:o.isRTL(t));let c=await o.getElementRects({reference:e,floating:t,strategy:r}),{x:u,y:p}=$b(c,n,l),f=n,v=0;const x={};for(let b=0;b<s.length;b++){const k=s[b];if(!k)continue;const{name:g,fn:d}=k,{x:h,y,data:S,reset:C}=await d({x:u,y:p,initialPlacement:n,placement:f,strategy:r,middlewareData:x,rects:c,platform:i,elements:{reference:e,floating:t}});u=h??u,p=y??p,x[g]={...x[g],...S},C&&v<fC&&(v++,typeof C=="object"&&(C.placement&&(f=C.placement),C.rects&&(c=C.rects===!0?await o.getElementRects({reference:e,floating:t,strategy:r}):C.rects),{x:u,y:p}=$b(c,f,l)),b=-1)}return{x:u,y:p,placement:f,strategy:r,middlewareData:x}},gC=e=>({name:"arrow",options:e,async fn(t){const{x:a,y:n,placement:r,rects:s,platform:o,elements:i,middlewareData:l}=t,{element:c,padding:u=0}=Sn(e,t)||{};if(c==null)return{};const p=Eb(u),f={x:a,y:n},v=cp(r),x=dp(v),b=await o.getDimensions(c),k=v==="y",g=k?"top":"left",d=k?"bottom":"right",h=k?"clientHeight":"clientWidth",y=s.reference[x]+s.reference[v]-f[v]-s.floating[x],S=f[v]-s.reference[v],C=await(o.getOffsetParent==null?void 0:o.getOffsetParent(c));let E=C?C[h]:0;(!E||!await(o.isElement==null?void 0:o.isElement(C)))&&(E=i.floating[h]||s.floating[x]);const _=y/2-S/2,R=E/2-b[x]/2-1,A=ss(p[g],R),G=ss(p[d],R),L=E-b[x]-G,P=E/2-b[x]/2+_,W=Nb(A,P,L),J=!l.arrow&&Nr(r)!=null&&P!==W&&s.reference[x]/2-(P<A?A:G)-b[x]/2<0,V=J?P<A?P-A:P-L:0;return{[v]:f[v]+V,data:{[v]:W,centerOffset:P-W-V,...J&&{alignmentOffset:V}},reset:J}}}),hC=function(e){return e===void 0&&(e={}),{name:"flip",options:e,async fn(t){var a,n;const{placement:r,middlewareData:s,rects:o,initialPlacement:i,platform:l,elements:c}=t,{mainAxis:u=!0,crossAxis:p=!0,fallbackPlacements:f,fallbackStrategy:v="bestFit",fallbackAxisSideDirection:x="none",flipAlignment:b=!0,...k}=Sn(e,t);if((a=s.arrow)!=null&&a.alignmentOffset)return{};const g=rs(r),d=Ja(i),h=rs(i)===i,y=await(l.isRTL==null?void 0:l.isRTL(c.floating)),S=f||(h||!b?[Nl(i)]:oC(i)),C=x!=="none";!f&&C&&S.push(...cC(i,b,x,y));const E=[i,...S],_=await l.detectOverflow(t,k),R=[];let A=((n=s.flip)==null?void 0:n.overflows)||[];if(u&&R.push(_[g]),p){const W=rC(r,o,y);R.push(_[W[0]],_[W[1]])}if(A=[...A,{placement:r,overflows:R}],!R.every(W=>W<=0)){var G,L;const W=(((G=s.flip)==null?void 0:G.index)||0)+1,J=E[W];if(J&&(!(p==="alignment"?d!==Ja(J):!1)||A.every(M=>Ja(M.placement)===d?M.overflows[0]>0:!0)))return{data:{index:W,overflows:A},reset:{placement:J}};let V=(L=A.filter(F=>F.overflows[0]<=0).sort((F,M)=>F.overflows[1]-M.overflows[1])[0])==null?void 0:L.placement;if(!V)switch(v){case"bestFit":{var P;const F=(P=A.filter(M=>{if(C){const w=Ja(M.placement);return w===d||w==="y"}return!0}).map(M=>[M.placement,M.overflows.filter(w=>w>0).reduce((w,$)=>w+$,0)]).sort((M,w)=>M[1]-w[1])[0])==null?void 0:P[0];F&&(V=F);break}case"initialPlacement":V=i;break}if(r!==V)return{reset:{placement:V}}}return{}}}};function Tb(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function Pb(e){return nC.some(t=>e[t]>=0)}const vC=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){const{rects:a,platform:n}=t,{strategy:r="referenceHidden",...s}=Sn(e,t);switch(r){case"referenceHidden":{const o=await n.detectOverflow(t,{...s,elementContext:"reference"}),i=Tb(o,a.reference);return{data:{referenceHiddenOffsets:i,referenceHidden:Pb(i)}}}case"escaped":{const o=await n.detectOverflow(t,{...s,altBoundary:!0}),i=Tb(o,a.floating);return{data:{escapedOffsets:i,escaped:Pb(i)}}}default:return{}}}}},_b=new Set(["left","top"]);async function bC(e,t){const{placement:a,platform:n,elements:r}=e,s=await(n.isRTL==null?void 0:n.isRTL(r.floating)),o=rs(a),i=Nr(a),l=Ja(a)==="y",c=_b.has(o)?-1:1,u=s&&l?-1:1,p=Sn(t,e);let{mainAxis:f,crossAxis:v,alignmentAxis:x}=typeof p=="number"?{mainAxis:p,crossAxis:0,alignmentAxis:null}:{mainAxis:p.mainAxis||0,crossAxis:p.crossAxis||0,alignmentAxis:p.alignmentAxis};return i&&typeof x=="number"&&(v=i==="end"?x*-1:x),l?{x:v*u,y:f*c}:{x:f*c,y:v*u}}const yC=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){var a,n;const{x:r,y:s,placement:o,middlewareData:i}=t,l=await bC(t,e);return o===((a=i.offset)==null?void 0:a.placement)&&(n=i.arrow)!=null&&n.alignmentOffset?{}:{x:r+l.x,y:s+l.y,data:{...l,placement:o}}}}},xC=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:a,y:n,placement:r,platform:s}=t,{mainAxis:o=!0,crossAxis:i=!1,limiter:l={fn:d=>{let{x:h,y}=d;return{x:h,y}}},...c}=Sn(e,t),u={x:a,y:n},p=await s.detectOverflow(t,c),f=Ja(r),v=lp(f);let x=u[v],b=u[f];const k=(d,h)=>Nb(h+p[d==="y"?"top":"left"],h,h-p[d==="y"?"bottom":"right"]);o&&(x=k(v,x)),i&&(b=k(f,b));const g=l.fn({...t,[v]:x,[f]:b});return{...g,data:{x:g.x-a,y:g.y-n,enabled:{[v]:o,[f]:i}}}}}},wC=function(e){return e===void 0&&(e={}),{options:e,fn(t){var a,n;const{x:r,y:s,placement:o,rects:i,middlewareData:l}=t,{offset:c=0,mainAxis:u=!0,crossAxis:p=!0}=Sn(e,t),f={x:r,y:s},v=Ja(o),x=lp(v);let b=f[x],k=f[v];const g=Sn(c,t),d=typeof g=="number"?{mainAxis:g,crossAxis:0}:{mainAxis:(a=g.mainAxis)!=null?a:0,crossAxis:(n=g.crossAxis)!=null?n:0};if(u){const S=x==="y"?"height":"width",C=i.reference[x]-i.floating[S]+d.mainAxis,E=i.reference[x]+i.reference[S]-d.mainAxis;b<C?b=C:b>E&&(b=E)}if(p){var h,y;const S=x==="y"?"width":"height",C=_b.has(rs(o)),E=i.reference[v]-i.floating[S]+(C&&((h=l.offset)==null?void 0:h[v])||0)+(C?0:d.crossAxis),_=i.reference[v]+i.reference[S]+(C?0:((y=l.offset)==null?void 0:y[v])||0)-(C?d.crossAxis:0);k<E?k=E:k>_&&(k=_)}return{[x]:b,[v]:k}}}},kC=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){const{placement:a,rects:n,platform:r,elements:s}=t,{apply:o=()=>{},...i}=Sn(e,t),l=await r.detectOverflow(t,i),c=rs(a),u=Nr(a),p=Ja(a)==="y",{width:f,height:v}=n.floating;let x,b;c==="top"||c==="bottom"?(x=c,b=u===(await(r.isRTL==null?void 0:r.isRTL(s.floating))?"start":"end")?"left":"right"):(b=c,x=u==="end"?"top":"bottom");const k=v-l.top-l.bottom,g=f-l.left-l.right,d=ss(v-l[x],k),h=ss(f-l[b],g),y=t.middlewareData.shift,S=!y;let C=d,E=h;y!=null&&y.enabled.x&&(E=g),y!=null&&y.enabled.y&&(C=k),S&&!u&&(p?E=f-2*kn(l.left,l.right):C=v-2*kn(l.top,l.bottom)),await o({...t,availableWidth:E,availableHeight:C});const _=await r.getDimensions(s.floating);return f!==_.width||v!==_.height?{reset:{rects:!0}}:{}}}};function Cl(){return typeof window<"u"}function Sr(e){return Ib(e)?(e.nodeName||"").toLowerCase():"#document"}function ia(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function Cn(e){var t;return(t=(Ib(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function Ib(e){return Cl()?e instanceof Node||e instanceof ia(e).Node:!1}function en(e){return Cl()?e instanceof Element||e instanceof ia(e).Element:!1}function os(e){return Cl()?e instanceof HTMLElement||e instanceof ia(e).HTMLElement:!1}function Rb(e){return!Cl()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof ia(e).ShadowRoot}function El(e){const{overflow:t,overflowX:a,overflowY:n,display:r}=tn(e);return/auto|scroll|overlay|hidden|clip/.test(t+n+a)&&r!=="inline"&&r!=="contents"}function NC(e){return/^(table|td|th)$/.test(Sr(e))}function $l(e){try{if(e.matches(":popover-open"))return!0}catch{}try{return e.matches(":modal")}catch{return!1}}const SC=/transform|translate|scale|rotate|perspective|filter/,CC=/paint|layout|strict|content/,Es=e=>!!e&&e!=="none";let pp;function fp(e){const t=en(e)?tn(e):e;return Es(t.transform)||Es(t.translate)||Es(t.scale)||Es(t.rotate)||Es(t.perspective)||!mp()&&(Es(t.backdropFilter)||Es(t.filter))||SC.test(t.willChange||"")||CC.test(t.contain||"")}function EC(e){let t=$s(e);for(;os(t)&&!Po(t);){if(fp(t))return t;if($l(t))return null;t=$s(t)}return null}function mp(){return pp==null&&(pp=typeof CSS<"u"&&CSS.supports&&CSS.supports("-webkit-backdrop-filter","none")),pp}function Po(e){return/^(html|body|#document)$/.test(Sr(e))}function tn(e){return ia(e).getComputedStyle(e)}function Tl(e){return en(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function $s(e){if(Sr(e)==="html")return e;const t=e.assignedSlot||e.parentNode||Rb(e)&&e.host||Cn(e);return Rb(t)?t.host:t}function Ab(e){const t=$s(e);return Po(t)?(e.ownerDocument||e).body:os(t)&&El(t)?t:Ab(t)}function _o(e,t,a){var n;t===void 0&&(t=[]),a===void 0&&(a=!0);const r=Ab(e),s=r===((n=e.ownerDocument)==null?void 0:n.body),o=ia(r);if(s){const i=gp(o);return t.concat(o,o.visualViewport||[],El(r)?r:[],i&&a?_o(i):[])}else return t.concat(r,_o(r,[],a))}function gp(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function jb(e){const t=tn(e);let a=parseFloat(t.width)||0,n=parseFloat(t.height)||0;const r=os(e),s=r?e.offsetWidth:a,o=r?e.offsetHeight:n,i=wl(a)!==s||wl(n)!==o;return i&&(a=s,n=o),{width:a,height:n,$:i}}function hp(e){return en(e)?e:e.contextElement}function Cr(e){const t=hp(e);if(!os(t))return Nn(1);const a=t.getBoundingClientRect(),{width:n,height:r,$:s}=jb(t);let o=(s?wl(a.width):a.width)/n,i=(s?wl(a.height):a.height)/r;return(!o||!Number.isFinite(o))&&(o=1),(!i||!Number.isFinite(i))&&(i=1),{x:o,y:i}}const $C=Nn(0);function Db(e){const t=ia(e);return!mp()||!t.visualViewport?$C:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function TC(e,t,a){return t===void 0&&(t=!1),!!a&&t&&a===ia(e)}function Ts(e,t,a,n){t===void 0&&(t=!1),a===void 0&&(a=!1);const r=e.getBoundingClientRect(),s=hp(e);let o=Nn(1);t&&(n?en(n)&&(o=Cr(n)):o=Cr(e));const i=TC(s,a,n)?Db(s):Nn(0);let l=(r.left+i.x)/o.x,c=(r.top+i.y)/o.y,u=r.width/o.x,p=r.height/o.y;if(s&&n){const f=ia(s),v=en(n)?ia(n):n;let x=f,b=gp(x);for(;b&&v!==x;){const k=Cr(b),g=b.getBoundingClientRect(),d=tn(b),h=g.left+(b.clientLeft+parseFloat(d.paddingLeft))*k.x,y=g.top+(b.clientTop+parseFloat(d.paddingTop))*k.y;l*=k.x,c*=k.y,u*=k.x,p*=k.y,l+=h,c+=y,x=ia(b),b=gp(x)}}return Sl({width:u,height:p,x:l,y:c})}function Pl(e,t){const a=Tl(e).scrollLeft;return t?t.left+a:Ts(Cn(e)).left+a}function Ob(e,t){const a=e.getBoundingClientRect(),n=a.left+t.scrollLeft-Pl(e,a),r=a.top+t.scrollTop;return{x:n,y:r}}function PC(e){let{elements:t,rect:a,offsetParent:n,strategy:r}=e;const s=r==="fixed",o=Cn(n),i=t?$l(t.floating):!1;if(n===o||i&&s)return a;let l={scrollLeft:0,scrollTop:0},c=Nn(1);const u=Nn(0),p=os(n);if((p||!s)&&((Sr(n)!=="body"||El(o))&&(l=Tl(n)),p)){const v=Ts(n);c=Cr(n),u.x=v.x+n.clientLeft,u.y=v.y+n.clientTop}const f=o&&!p&&!s?Ob(o,l):Nn(0);return{width:a.width*c.x,height:a.height*c.y,x:a.x*c.x-l.scrollLeft*c.x+u.x+f.x,y:a.y*c.y-l.scrollTop*c.y+u.y+f.y}}function _C(e){return e.getClientRects?Array.from(e.getClientRects()):[]}function IC(e){const t=Tl(e),a=e.ownerDocument.body,n=kn(e.scrollWidth,e.clientWidth,a.scrollWidth,a.clientWidth),r=kn(e.scrollHeight,e.clientHeight,a.scrollHeight,a.clientHeight);let s=-t.scrollLeft+Pl(e);const o=-t.scrollTop;return tn(a).direction==="rtl"&&(s+=kn(e.clientWidth,a.clientWidth)-n),{width:n,height:r,x:s,y:o}}const RC=25;function AC(e,t,a){a===void 0&&(a="viewport");const n=a==="layoutViewport",r=ia(e),s=Cn(e),o=r.visualViewport;let i=s.clientWidth,l=s.clientHeight,c=0,u=0;if(o){const f=!mp()||t==="fixed";n?f||(c=-o.offsetLeft,u=-o.offsetTop):(i=o.width,l=o.height,f&&(c=o.offsetLeft,u=o.offsetTop))}if(Pl(s)<=0){const f=s.ownerDocument,v=f.body,x=getComputedStyle(v),b=f.compatMode==="CSS1Compat"&&parseFloat(x.marginLeft)+parseFloat(x.marginRight)||0,k=Math.abs(s.clientWidth-v.clientWidth-b),g=getComputedStyle(s).scrollbarGutter==="stable both-edges"?k/2:k;g<=RC&&(i-=g)}return{width:i,height:l,x:c,y:u}}function jC(e,t){const a=Ts(e,!0,t==="fixed"),n=a.top+e.clientTop,r=a.left+e.clientLeft,s=Cr(e),o=e.clientWidth*s.x,i=e.clientHeight*s.y,l=r*s.x,c=n*s.y;return{width:o,height:i,x:l,y:c}}function Lb(e,t,a){let n;if(t==="viewport"||t==="layoutViewport")n=AC(e,a,t);else if(t==="document")n=IC(Cn(e));else if(en(t))n=jC(t,a);else{const r=Db(e);n={x:t.x-r.x,y:t.y-r.y,width:t.width,height:t.height}}return Sl(n)}function DC(e,t){const a=t.get(e);if(a)return a;let n=_o(e,[],!1).filter(i=>en(i)&&Sr(i)!=="body"),r=null;const s=tn(e).position==="fixed";let o=s?$s(e):e;for(;en(o)&&!Po(o);){const i=tn(o),l=fp(o),c=r?r.position:s?"fixed":"";!l&&(c==="fixed"||c==="absolute"&&i.position==="static")?n=n.filter(p=>p!==o):r=i,o=$s(o)}return t.set(e,n),n}function OC(e){let{element:t,boundary:a,rootBoundary:n,strategy:r}=e;const o=[...a==="clippingAncestors"?$l(t)?[]:DC(t,this._c):[].concat(a),n],i=Lb(t,o[0],r);let l=i.top,c=i.right,u=i.bottom,p=i.left;for(let f=1;f<o.length;f++){const v=Lb(t,o[f],r);l=kn(v.top,l),c=ss(v.right,c),u=ss(v.bottom,u),p=kn(v.left,p)}return{width:c-p,height:u-l,x:p,y:l}}function LC(e){const{width:t,height:a}=jb(e);return{width:t,height:a}}function MC(e,t,a){const n=os(t),r=Cn(t),s=a==="fixed",o=Ts(e,!0,s,t);let i={scrollLeft:0,scrollTop:0};const l=Nn(0);if((n||!s)&&((Sr(t)!=="body"||El(r))&&(i=Tl(t)),n)){const f=Ts(t,!0,s,t);l.x=f.x+t.clientLeft,l.y=f.y+t.clientTop}!n&&r&&(l.x=Pl(r));const c=r&&!n&&!s?Ob(r,i):Nn(0),u=o.left+i.scrollLeft-l.x-c.x,p=o.top+i.scrollTop-l.y-c.y;return{x:u,y:p,width:o.width,height:o.height}}function vp(e){return tn(e).position==="static"}function Mb(e,t){if(!os(e)||tn(e).position==="fixed")return null;if(t)return t(e);let a=e.offsetParent;return Cn(e)===a&&(a=a.ownerDocument.body),a}function zb(e,t){const a=ia(e);if($l(e))return a;if(!os(e)){let r=$s(e);for(;r&&!Po(r);){if(en(r)&&!vp(r))return r;r=$s(r)}return a}let n=Mb(e,t);for(;n&&NC(n)&&vp(n);)n=Mb(n,t);return n&&Po(n)&&vp(n)&&!fp(n)?a:n||EC(e)||a}const zC=async function(e){const t=this.getOffsetParent||zb,a=this.getDimensions,n=await a(e.floating);return{reference:MC(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,width:n.width,height:n.height}}};function FC(e){return tn(e).direction==="rtl"}const BC={convertOffsetParentRelativeRectToViewportRelativeRect:PC,getDocumentElement:Cn,getClippingRect:OC,getOffsetParent:zb,getElementRects:zC,getClientRects:_C,getDimensions:LC,getScale:Cr,isElement:en,isRTL:FC};function Fb(e,t){return e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function UC(e,t,a){let n=null,r;const s=Cn(e);function o(){var u;clearTimeout(r),(u=n)==null||u.disconnect(),n=null}function i(u,p){u===void 0&&(u=!1),p===void 0&&(p=1),o();const f=e.getBoundingClientRect(),{left:v,top:x,width:b,height:k}=f;if(u||t(),!b||!k)return;const g=kl(x),d=kl(s.clientWidth-(v+b)),h=kl(s.clientHeight-(x+k)),y=kl(v),C={rootMargin:-g+"px "+-d+"px "+-h+"px "+-y+"px",threshold:kn(0,ss(1,p))||1};let E=!0;function _(R){const A=R[0].intersectionRatio;if(!Fb(f,e.getBoundingClientRect()))return i();if(A!==p){if(!E)return i();A?i(!1,A):r=setTimeout(()=>{i(!1,1e-7)},1e3)}E=!1}try{n=new IntersectionObserver(_,{...C,root:s.ownerDocument})}catch{n=new IntersectionObserver(_,C)}n.observe(e)}const l=ia(e),c=()=>i(a);return l.addEventListener("resize",c),i(!0),()=>{l.removeEventListener("resize",c),o()}}function qC(e,t,a,n){n===void 0&&(n={});const{ancestorScroll:r=!0,ancestorResize:s=!0,elementResize:o=typeof ResizeObserver=="function",layoutShift:i=typeof IntersectionObserver=="function",animationFrame:l=!1}=n,c=hp(e),u=r||s?[...c?_o(c):[],...t?_o(t):[]]:[];u.forEach(g=>{r&&g.addEventListener("scroll",a),s&&g.addEventListener("resize",a)});const p=c&&i?UC(c,a,s):null;let f=-1,v=null;o&&(v=new ResizeObserver(g=>{let[d]=g;d&&d.target===c&&v&&t&&(v.unobserve(t),cancelAnimationFrame(f),f=requestAnimationFrame(()=>{var h;(h=v)==null||h.observe(t)})),a()}),c&&!l&&v.observe(c),t&&v.observe(t));let x,b=l?Ts(e):null;l&&k();function k(){const g=Ts(e);b&&!Fb(b,g)&&a(),b=g,x=requestAnimationFrame(k)}return a(),()=>{var g;u.forEach(d=>{r&&d.removeEventListener("scroll",a),s&&d.removeEventListener("resize",a)}),p?.(),(g=v)==null||g.disconnect(),v=null,l&&cancelAnimationFrame(x)}}const VC=yC,WC=xC,HC=hC,GC=kC,KC=vC,Bb=gC,YC=wC,QC=(e,t,a)=>{const n=new Map,r=a??{},s={...BC,...r.platform,_c:n};return mC(e,t,{...r,platform:s})};var XC=typeof document<"u",ZC=function(){},_l=XC?N.useLayoutEffect:ZC;function Il(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e=="function"&&e.toString()===t.toString())return!0;let a,n,r;if(e&&t&&typeof e=="object"){if(Array.isArray(e)){if(a=e.length,a!==t.length)return!1;for(n=a;n--!==0;)if(!Il(e[n],t[n]))return!1;return!0}if(r=Object.keys(e),a=r.length,a!==Object.keys(t).length)return!1;for(n=a;n--!==0;)if(!{}.hasOwnProperty.call(t,r[n]))return!1;for(n=a;n--!==0;){const s=r[n];if(!(s==="_owner"&&e.$$typeof)&&!Il(e[s],t[s]))return!1}return!0}return e!==e&&t!==t}function Ub(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function qb(e,t){const a=Ub(e);return Math.round(t*a)/a}function bp(e){const t=N.useRef(e);return _l(()=>{t.current=e}),t}function JC(e){e===void 0&&(e={});const{placement:t="bottom",strategy:a="absolute",middleware:n=[],platform:r,elements:{reference:s,floating:o}={},transform:i=!0,whileElementsMounted:l,open:c}=e,[u,p]=N.useState({x:0,y:0,strategy:a,placement:t,middlewareData:{},isPositioned:!1}),[f,v]=N.useState(n);Il(f,n)||v(n);const[x,b]=N.useState(null),[k,g]=N.useState(null),d=N.useCallback(M=>{M!==C.current&&(C.current=M,b(M))},[]),h=N.useCallback(M=>{M!==E.current&&(E.current=M,g(M))},[]),y=s||x,S=o||k,C=N.useRef(null),E=N.useRef(null),_=N.useRef(u),R=l!=null,A=bp(l),G=bp(r),L=bp(c),P=N.useCallback(()=>{if(!C.current||!E.current)return;const M={placement:t,strategy:a,middleware:f};G.current&&(M.platform=G.current),QC(C.current,E.current,M).then(w=>{const $={...w,isPositioned:L.current!==!1};W.current&&!Il(_.current,$)&&(_.current=$,dr.flushSync(()=>{p($)}))})},[f,t,a,G,L]);_l(()=>{c===!1&&_.current.isPositioned&&(_.current.isPositioned=!1,p(M=>({...M,isPositioned:!1})))},[c]);const W=N.useRef(!1);_l(()=>(W.current=!0,()=>{W.current=!1}),[]),_l(()=>{if(y&&(C.current=y),S&&(E.current=S),y&&S){if(A.current)return A.current(y,S,P);P()}},[y,S,P,A,R]);const J=N.useMemo(()=>({reference:C,floating:E,setReference:d,setFloating:h}),[d,h]),V=N.useMemo(()=>({reference:y,floating:S}),[y,S]),F=N.useMemo(()=>{const M={position:a,left:0,top:0};if(!V.floating)return M;const w=qb(V.floating,u.x),$=qb(V.floating,u.y);return i?{...M,transform:"translate("+w+"px, "+$+"px)",...Ub(V.floating)>=1.5&&{willChange:"transform"}}:{position:a,left:w,top:$}},[a,i,V.floating,u.x,u.y]);return N.useMemo(()=>({...u,update:P,refs:J,elements:V,floatingStyles:F}),[u,P,J,V,F])}const e2=e=>{function t(a){return{}.hasOwnProperty.call(a,"current")}return{name:"arrow",options:e,fn(a){const{element:n,padding:r}=typeof e=="function"?e(a):e;return n&&t(n)?n.current!=null?Bb({element:n.current,padding:r}).fn(a):{}:n?Bb({element:n,padding:r}).fn(a):{}}}},t2=(e,t)=>{const a=VC(e);return{name:a.name,fn:a.fn,options:[e,t]}},a2=(e,t)=>{const a=WC(e);return{name:a.name,fn:a.fn,options:[e,t]}},n2=(e,t)=>({fn:YC(e).fn,options:[e,t]}),s2=(e,t)=>{const a=HC(e);return{name:a.name,fn:a.fn,options:[e,t]}},r2=(e,t)=>{const a=GC(e);return{name:a.name,fn:a.fn,options:[e,t]}},o2=(e,t)=>{const a=KC(e);return{name:a.name,fn:a.fn,options:[e,t]}},i2=(e,t)=>{const a=e2(e);return{name:a.name,fn:a.fn,options:[e,t]}};var l2=Object.defineProperty,d2=(e,t)=>l2(e,"name",{value:t,configurable:!0}),c2=N.forwardRef(d2(function(t,a){const{children:n,width:r=10,height:s=5,...o}=t;return T.jsx(Oe.svg,{...o,ref:a,width:r,height:s,viewBox:"0 0 30 10",preserveAspectRatio:"none",children:t.asChild?n:T.jsx("polygon",{points:"0,0 30,0 15,10"})})},"Arrow")),u2=Object.defineProperty,En=(e,t)=>u2(e,"name",{value:t,configurable:!0}),Vb={Partial:"partial"},Wb={Optimized:"optimized",Always:"always"},Hb="Popper",[Gb,Rl]=ba(Hb),[p2,Kb]=Gb(Hb),Yb=En(e=>{const{__scopePopper:t,children:a}=e,[n,r]=N.useState(null),[s,o]=N.useState(void 0);return T.jsx(p2,{scope:t,anchor:n,onAnchorChange:r,placementState:s,setPlacementState:o,children:a})},"Popper"),f2="PopperAnchor",Qb=N.forwardRef(En(function(t,a){const{__scopePopper:n,virtualRef:r,...s}=t,o=Kb(f2,n),i=N.useRef(null),l=o.onAnchorChange,c=N.useCallback(b=>{i.current=b,b&&l(b)},[l]),u=Xe(a,c),p=N.useRef(null);N.useEffect(()=>{if(!r)return;const b=p.current;p.current=r.current,b!==p.current&&l(p.current)});const f=o.placementState&&Al(o.placementState),v=f?.[0],x=f?.[1];return r?null:T.jsx(Oe.div,{"data-radix-popper-side":v,"data-radix-popper-align":x,...s,ref:u})},"PopperAnchor")),Xb="PopperContent",[m2,g2]=Gb(Xb),Zb=N.forwardRef(En(function(t,a){const{__scopePopper:n,side:r="bottom",sideOffset:s=0,align:o="center",alignOffset:i=0,arrowPadding:l=0,avoidCollisions:c=!0,collisionBoundary:u=[],collisionPadding:p=0,sticky:f=Vb.Partial,hideWhenDetached:v=!1,updatePositionStrategy:x=Wb.Optimized,onPlaced:b,...k}=t,g=Kb(Xb,n),[d,h]=N.useState(null),y=Xe(a,h),[S,C]=N.useState(null),E=vl(S),_=E?.width??0,R=E?.height??0,A=r+(o!=="center"?"-"+o:""),G=typeof p=="number"?p:{top:0,right:0,bottom:0,left:0,...p},L=Array.isArray(u)?u:[u],P=L.length>0,W={padding:G,boundary:L.filter(Jb),altBoundary:P},{refs:J,floatingStyles:V,placement:F,isPositioned:M,middlewareData:w}=JC({strategy:"fixed",placement:A,whileElementsMounted:En((...Se)=>qC(...Se,{animationFrame:x===Wb.Always}),"whileElementsMounted"),elements:{reference:g.anchor},middleware:[t2({mainAxis:s+R,alignmentAxis:i}),c&&a2({mainAxis:!0,crossAxis:!1,...f===Vb.Partial?{limiter:n2()}:{},...W}),c&&s2({...W}),r2({...W,apply:En(({elements:Se,rects:U,availableWidth:ae,availableHeight:Te})=>{const{width:Z,height:le}=U.reference,he=Se.floating.style;he.setProperty("--radix-popper-available-width",`${ae}px`),he.setProperty("--radix-popper-available-height",`${Te}px`),he.setProperty("--radix-popper-anchor-width",`${Z}px`),he.setProperty("--radix-popper-anchor-height",`${le}px`)},"apply")}),S&&i2({element:S,padding:l}),y2({arrowWidth:_,arrowHeight:R}),v&&o2(P?{strategy:"referenceHidden",...W}:{strategy:"referenceHidden",padding:W.padding,altBoundary:W.altBoundary})]}),$=g.setPlacementState;kt(()=>($(F),()=>{$(void 0)}),[F,$]);const[Y,I]=Al(F),O=Ba(b);kt(()=>{M&&O?.()},[M,O]);const K=w.arrow?.x,Ne=w.arrow?.y,fe=w.arrow?.centerOffset!==0,[xe,He]=N.useState();return kt(()=>{d&&He(window.getComputedStyle(d).zIndex)},[d]),T.jsx("div",{ref:J.setFloating,"data-radix-popper-content-wrapper":"",style:{...V,transform:M?V.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:xe,"--radix-popper-transform-origin":[w.transformOrigin?.x,w.transformOrigin?.y].join(" "),...w.hide?.referenceHidden&&{visibility:"hidden",pointerEvents:"none"}},dir:t.dir,children:T.jsx(m2,{scope:n,placedSide:Y,placedAlign:I,onArrowChange:C,arrowX:K,arrowY:Ne,shouldHideArrow:fe,children:T.jsx(Oe.div,{"data-side":Y,"data-align":I,...k,ref:y,style:{...k.style,animation:M?k.style?.animation:"none"}})})})},"PopperContent")),h2="PopperArrow",v2={top:"bottom",right:"left",bottom:"top",left:"right"},b2=N.forwardRef(En(function(t,a){const{__scopePopper:n,...r}=t,s=g2(h2,n),o=v2[s.placedSide];return T.jsx("span",{ref:s.onArrowChange,style:{position:"absolute",left:s.arrowX,top:s.arrowY,[o]:0,transformOrigin:{top:"",right:"0 0",bottom:"center 0",left:"100% 0"}[s.placedSide],transform:{top:"translateY(100%)",right:"translateY(50%) rotate(90deg) translateX(-50%)",bottom:"rotate(180deg)",left:"translateY(50%) rotate(-90deg) translateX(50%)"}[s.placedSide],visibility:s.shouldHideArrow?"hidden":void 0},children:T.jsx(c2,{...r,ref:a,style:{...r.style,display:"block"}})})},"PopperArrow"));function Jb(e){return e!==null}En(Jb,"isNotNull");var y2=En(e=>({name:"transformOrigin",options:e,fn(t){const{placement:a,rects:n,middlewareData:r}=t,o=r.arrow?.centerOffset!==0,i=o?0:e.arrowWidth,l=o?0:e.arrowHeight,[c,u]=Al(a),p={start:"0%",center:"50%",end:"100%"}[u],f=(r.arrow?.x??0)+i/2,v=(r.arrow?.y??0)+l/2;let x="",b="";return c==="bottom"?(x=o?p:`${f}px`,b=`${-l}px`):c==="top"?(x=o?p:`${f}px`,b=`${n.floating.height+l}px`):c==="right"?(x=`${-l}px`,b=o?p:`${v}px`):c==="left"&&(x=`${n.floating.width+l}px`,b=o?p:`${v}px`),{data:{x,y:b}}}}),"transformOrigin");function Al(e){const[t,a="center"]=e.split("-");return[t,a]}En(Al,"getSideAndAlignFromPlacement");var x2=Object.defineProperty,w2=(e,t)=>x2(e,"name",{value:t,configurable:!0}),ey=Object.freeze({position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal"}),k2=N.forwardRef(w2(function(t,a){return T.jsx(Oe.span,{...t,ref:a,style:{...ey,...t.style}})},"VisuallyHidden")),N2=Object.defineProperty,Ze=(e,t)=>N2(e,"name",{value:t,configurable:!0}),ty={ItemAligned:"item-aligned",Popper:"popper"},S2={RTL:"rtl"},C2=[" ","Enter","ArrowUp","ArrowDown"],E2=[" ","Enter"],Er="Select",[jl,yp,$2]=Mu(Er),[Ps,e$]=ba(Er,[$2,Rl]),xp=Rl(),[T2,is]=Ps(Er),[P2,_2]=Ps(Er);function ay(e){const{__scopeSelect:t,children:a,open:n,defaultOpen:r,onOpenChange:s,value:o,defaultValue:i,onValueChange:l,dir:c,name:u,autoComplete:p,disabled:f,required:v,form:x,internal_do_not_use_render:b}=e,k=xp(t),[g,d]=N.useState(null),[h,y]=N.useState(null),[S,C]=N.useState(!1),E=So(c),[_,R]=_a({prop:n,defaultProp:r??!1,onChange:s,caller:Er}),[A,G]=_a({prop:o,defaultProp:i,onChange:l,caller:Er}),L=N.useRef(null),P=N.useRef(!1),[W,J]=N.useState(null),V=Ze(fe=>{J({value:fe,hasConsumerStoppedPropagation:P.current}),G(fe)},"handleUserSelect"),F=N.useRef(A);N.useEffect(()=>{const fe=x?g?.ownerDocument.getElementById(x):g?.form;if(fe instanceof HTMLFormElement){const xe=Ze(()=>G(F.current),"reset");return fe.addEventListener("reset",xe),()=>fe.removeEventListener("reset",xe)}},[x,g,G]);const M=g?!!x||!!g.closest("form"):!0,[w,$]=N.useState(new Set),Y=vn(),I=Array.from(w).map(fe=>fe.props.value).join(";"),O=N.useCallback(fe=>{$(xe=>new Set(xe).add(fe))},[]),K=N.useCallback(fe=>{$(xe=>{const He=new Set(xe);return He.delete(fe),He})},[]),Ne={required:v,trigger:g,onTriggerChange:d,valueNode:h,onValueNodeChange:y,valueNodeHasChildren:S,onValueNodeHasChildrenChange:C,contentId:Y,value:A,onValueChange:G,hasConsumerStoppedPropagationRef:P,userSelection:W,onUserSelect:V,open:_,onOpenChange:R,dir:E,triggerPointerDownPosRef:L,disabled:f,name:u,autoComplete:p,form:x,nativeOptions:w,nativeSelectKey:I,isFormControl:M};return T.jsx(Yb,{...k,children:T.jsx(T2,{scope:t,...Ne,children:T.jsx(jl.Provider,{scope:t,children:T.jsx(P2,{scope:t,onNativeOptionAdd:O,onNativeOptionRemove:K,children:iy(b)?b(Ne):a})})})})}Ze(ay,"SelectProvider");var I2=Ze(e=>{const{__scopeSelect:t,children:a,...n}=e;return T.jsx(ay,{__scopeSelect:t,...n,internal_do_not_use_render:({isFormControl:r})=>T.jsxs(T.Fragment,{children:[a,r?T.jsx(aE,{__scopeSelect:t}):null]})})},"Select"),R2="SelectTrigger",A2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,disabled:r=!1,...s}=t,o=xp(n),i=is(R2,n),l=i.disabled||r,c=Xe(a,i.onTriggerChange),u=yp(n),p=N.useRef("touch"),[f,v,x]=kp(k=>{const g=u().filter(y=>!y.disabled),d=g.find(y=>y.value===i.value),h=Np(g,k,d);h!==void 0&&i.onUserSelect(h.value)}),b=Ze(k=>{l||(i.onOpenChange(!0),x()),k&&(i.triggerPointerDownPosRef.current={x:Math.round(k.pageX),y:Math.round(k.pageY)})},"handleOpen");return T.jsx(Qb,{asChild:!0,...o,children:T.jsx(Oe.button,{type:"button",role:"combobox","aria-controls":i.open?i.contentId:void 0,"aria-expanded":i.open,"aria-required":i.required,"aria-autocomplete":"none",dir:i.dir,"data-state":i.open?"open":"closed",disabled:l,"data-disabled":l?"":void 0,"data-placeholder":Io(i.value)?"":void 0,...s,ref:c,onClick:Pe(s.onClick,k=>{k.currentTarget.focus(),p.current!=="mouse"&&b(k)}),onPointerDown:Pe(s.onPointerDown,k=>{p.current=k.pointerType;const g=k.target;g.hasPointerCapture(k.pointerId)&&g.releasePointerCapture(k.pointerId),k.button===0&&k.ctrlKey===!1&&k.pointerType==="mouse"&&(b(k),k.preventDefault())}),onKeyDown:Pe(s.onKeyDown,k=>{const g=f.current!=="";!(k.ctrlKey||k.altKey||k.metaKey)&&k.key.length===1&&(i.hasConsumerStoppedPropagationRef.current=k.isPropagationStopped(),v(k.key)),!(g&&k.key===" ")&&C2.includes(k.key)&&(b(),k.preventDefault())})})})},"SelectTrigger")),j2="SelectValue",D2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,className:r,style:s,children:o,placeholder:i="",...l}=t,c=is(j2,n),{onValueNodeHasChildrenChange:u}=c,p=o!==void 0,f=Xe(a,c.onValueNodeChange);kt(()=>{u(p)},[u,p]);const v=Io(c.value);return T.jsx(Oe.span,{...l,asChild:v?!1:l.asChild,ref:f,style:{pointerEvents:"none"},children:T.jsx(N.Fragment,{children:v?i:o},v?"placeholder":"value")})},"SelectValue")),O2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,children:r,...s}=t;return T.jsx(Oe.span,{"aria-hidden":!0,...s,ref:a,children:r||"▼"})},"SelectIcon")),L2="SelectPortal",[M2,z2]=Ps(L2,{forceMount:void 0}),F2=Ze(e=>{const{__scopeSelect:t,forceMount:a,...n}=e;return T.jsx(M2,{scope:e.__scopeSelect,forceMount:a,children:T.jsx(wu,{asChild:!0,...n})})},"SelectPortal"),_s="SelectContent",B2=N.forwardRef(Ze(function(t,a){const n=z2(_s,t.__scopeSelect),{forceMount:r=n.forceMount,...s}=t,o=is(_s,t.__scopeSelect),[i,l]=N.useState();return kt(()=>{l(new DocumentFragment)},[]),T.jsx(Jn,{present:r||o.open,children:({present:c})=>c?T.jsx(V2,{...s,ref:a}):T.jsx(U2,{...s,fragment:i})})},"SelectContent")),U2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,children:r,fragment:s}=t;return s?dr.createPortal(T.jsx(ny,{scope:n,children:T.jsx(jl.Slot,{scope:n,children:T.jsx("div",{ref:a,children:r})})}),s):null},"SelectContentFragment")),Ua=10,[ny,Dl]=Ps(_s),q2=hn("SelectContent.RemoveScroll"),V2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n}=t,{position:r=ty.ItemAligned,onCloseAutoFocus:s,onEscapeKeyDown:o,onPointerDownOutside:i,side:l,sideOffset:c,align:u,alignOffset:p,arrowPadding:f,collisionBoundary:v,collisionPadding:x,sticky:b,hideWhenDetached:k,avoidCollisions:g,...d}=t,h=is(_s,n),[y,S]=N.useState(null),[C,E]=N.useState(null),_=Xe(a,S),[R,A]=N.useState(null),[G,L]=N.useState(null),P=yp(n),[W,J]=N.useState(!1),V=N.useRef(!1),F=N.useRef(!1),M=N.useRef(!1);N.useEffect(()=>{if(y)return kv(y)},[y]),sl();const w=N.useCallback(U=>{const[ae,...Te]=P().map(he=>he.ref.current),[Z]=Te.slice(-1),le=document.activeElement;for(const he of U)if(he===le||(he?.scrollIntoView({block:"nearest"}),he===ae&&C&&(C.scrollTop=0),he===Z&&C&&(C.scrollTop=C.scrollHeight),he?.focus(),document.activeElement!==le))return},[P,C]),$=N.useCallback(()=>w([R,y]),[w,R,y]);N.useEffect(()=>{W&&$()},[W,$]);const{onOpenChange:Y,triggerPointerDownPosRef:I}=h;N.useEffect(()=>{if(y){let U={x:0,y:0};const ae=Ze(Z=>{U={x:Math.abs(Math.round(Z.pageX)-(I.current?.x??0)),y:Math.abs(Math.round(Z.pageY)-(I.current?.y??0))}},"handlePointerMove"),Te=Ze(Z=>{U.x<=10&&U.y<=10?Z.preventDefault():Z.composedPath().includes(y)||Y(!1),document.removeEventListener("pointermove",ae),I.current=null},"handlePointerUp");return I.current!==null&&(document.addEventListener("pointermove",ae),document.addEventListener("pointerup",Te,{capture:!0,once:!0})),()=>{document.removeEventListener("pointermove",ae),document.removeEventListener("pointerup",Te,{capture:!0})}}},[y,Y,I]),N.useEffect(()=>{const U=Ze(()=>Y(!1),"close");return window.addEventListener("blur",U),window.addEventListener("resize",U),()=>{window.removeEventListener("blur",U),window.removeEventListener("resize",U)}},[Y]);const[O,K]=kp(U=>{const ae=P().filter(le=>!le.disabled),Te=ae.find(le=>le.ref.current===document.activeElement),Z=Np(ae,U,Te);Z&&setTimeout(()=>Z.ref.current?.focus())}),Ne=N.useCallback((U,ae,Te)=>{const Z=!F.current;Z&&(F.current=!0);const le=!V.current&&!Te;h.value!==void 0&&h.value===ae||le?(A(U),le&&(V.current=!0)):Z&&A(U)},[h.value]),fe=N.useCallback(()=>y?.focus(),[y]),xe=N.useCallback((U,ae,Te)=>{if(!U)return;const Z=!M.current;Z&&(M.current=!0);const le=!V.current&&!Te;(h.value!==void 0&&h.value===ae||le||Z)&&L(U)},[h.value]),He=r===ty.Popper?sy:W2,Se=He===sy?{side:l,sideOffset:c,align:u,alignOffset:p,arrowPadding:f,collisionBoundary:v,collisionPadding:x,sticky:b,hideWhenDetached:k,avoidCollisions:g}:{};return T.jsx(ny,{scope:n,content:y,viewport:C,onViewportChange:E,itemRefCallback:Ne,selectedItem:R,onItemLeave:fe,itemTextRefCallback:xe,focusSelectedItem:$,selectedItemText:G,position:r,isPositioned:W,searchRef:O,children:T.jsx(Pu,{as:q2,allowPinchZoom:!0,children:T.jsx(Gh,{asChild:!0,trapped:h.open,onMountAutoFocus:U=>{U.preventDefault()},onUnmountAutoFocus:Pe(s,U=>{h.trigger?.focus({preventScroll:!0}),U.preventDefault()}),children:T.jsx(fu,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:o,onPointerDownOutside:i,onFocusOutside:U=>U.preventDefault(),onDismiss:()=>h.onOpenChange(!1),children:T.jsx(He,{role:"listbox",id:h.contentId,"data-state":h.open?"open":"closed",dir:h.dir,onContextMenu:U=>U.preventDefault(),...d,...Se,onPlaced:()=>J(!0),ref:_,style:{display:"flex",flexDirection:"column",outline:"none",...d.style},onKeyDown:Pe(d.onKeyDown,U=>{const ae=U.ctrlKey||U.altKey||U.metaKey;if(U.key==="Tab"&&U.preventDefault(),!ae&&U.key.length===1&&K(U.key),["ArrowUp","ArrowDown","Home","End"].includes(U.key)){let Z=P().filter(le=>!le.disabled).map(le=>le.ref.current);if(["ArrowUp","End"].includes(U.key)&&(Z=Z.slice().reverse()),["ArrowUp","ArrowDown"].includes(U.key)){const le=U.target,he=Z.indexOf(le);Z=Z.slice(he+1)}setTimeout(()=>w(Z)),U.preventDefault()}})})})})})})},"SelectContentImpl")),W2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,onPlaced:r,...s}=t,o=is(_s,n),i=Dl(_s,n),[l,c]=N.useState(null),[u,p]=N.useState(null),f=Xe(a,p),v=yp(n),x=N.useRef(!1),b=N.useRef(!0),{viewport:k,selectedItem:g,selectedItemText:d,focusSelectedItem:h}=i,y=N.useCallback(()=>{if(o.trigger&&o.valueNode&&l&&u&&k&&g&&d){const _=o.trigger.getBoundingClientRect(),R=u.getBoundingClientRect(),A=o.valueNode.getBoundingClientRect(),G=d.getBoundingClientRect();if(o.dir!==S2.RTL){const Te=G.left-R.left,Z=A.left-Te,le=_.left-Z,he=_.width+le,H=Math.max(he,R.width),Ce=window.innerWidth-Ua,be=ip(Z,[Ua,Math.max(Ua,Ce-H)]);l.style.minWidth=he+"px",l.style.left=be+"px"}else{const Te=R.right-G.right,Z=window.innerWidth-A.right-Te,le=window.innerWidth-_.right-Z,he=_.width+le,H=Math.max(he,R.width),Ce=window.innerWidth-Ua,be=ip(Z,[Ua,Math.max(Ua,Ce-H)]);l.style.minWidth=he+"px",l.style.right=be+"px"}const L=v(),P=window.innerHeight-Ua*2,W=k.scrollHeight,J=window.getComputedStyle(u),V=parseInt(J.borderTopWidth,10),F=parseInt(J.paddingTop,10),M=parseInt(J.borderBottomWidth,10),w=parseInt(J.paddingBottom,10),$=V+F+W+w+M,Y=Math.min(g.offsetHeight*5,$),I=window.getComputedStyle(k),O=parseInt(I.paddingTop,10),K=parseInt(I.paddingBottom,10),Ne=_.top+_.height/2-Ua,fe=P-Ne,xe=g.offsetHeight/2,He=g.offsetTop+xe,Se=V+F+He,U=$-Se;if(Se<=Ne){const Te=L.length>0&&g===L[L.length-1].ref.current;l.style.bottom="0px";const Z=u.clientHeight-k.offsetTop-k.offsetHeight,le=Math.max(fe,xe+(Te?K:0)+Z+M),he=Se+le;l.style.height=he+"px"}else{const Te=L.length>0&&g===L[0].ref.current;l.style.top="0px";const le=Math.max(Ne,V+k.offsetTop+(Te?O:0)+xe)+U;l.style.height=le+"px",k.scrollTop=Se-Ne+k.offsetTop}l.style.margin=`${Ua}px 0`,l.style.minHeight=Y+"px",l.style.maxHeight=P+"px",r?.(),requestAnimationFrame(()=>x.current=!0)}},[v,o.trigger,o.valueNode,l,u,k,g,d,o.dir,r]);kt(()=>y(),[y]);const[S,C]=N.useState();kt(()=>{u&&C(window.getComputedStyle(u).zIndex)},[u]);const E=N.useCallback(_=>{_&&b.current===!0&&(y(),h?.(),b.current=!1)},[y,h]);return T.jsx(H2,{scope:n,contentWrapper:l,shouldExpandOnScrollRef:x,onScrollButtonChange:E,children:T.jsx("div",{ref:c,style:{display:"flex",flexDirection:"column",position:"fixed",zIndex:S},children:T.jsx(Oe.div,{...s,ref:f,style:{boxSizing:"border-box",maxHeight:"100%",...s.style}})})})},"SelectItemAlignedPosition")),sy=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,align:r="start",collisionPadding:s=Ua,...o}=t,i=xp(n);return T.jsx(Zb,{...i,...o,ref:a,align:r,collisionPadding:s,style:{boxSizing:"border-box",...o.style,"--radix-select-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-select-content-available-width":"var(--radix-popper-available-width)","--radix-select-content-available-height":"var(--radix-popper-available-height)","--radix-select-trigger-width":"var(--radix-popper-anchor-width)","--radix-select-trigger-height":"var(--radix-popper-anchor-height)"}})},"SelectPopperPosition")),[H2,G2]=Ps(_s,{}),ry="SelectViewport",K2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,nonce:r,...s}=t,o=Dl(ry,n),i=G2(ry,n),l=Xe(a,o.onViewportChange),c=N.useRef(0);return T.jsxs(T.Fragment,{children:[T.jsx("style",{dangerouslySetInnerHTML:{__html:"[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}"},nonce:r}),T.jsx(jl.Slot,{scope:n,children:T.jsx(Oe.div,{"data-radix-select-viewport":"",role:"presentation",...s,ref:l,style:{position:"relative",flex:1,overflow:"hidden auto",...s.style},onScroll:Pe(s.onScroll,u=>{const p=u.currentTarget,{contentWrapper:f,shouldExpandOnScrollRef:v}=i;if(v?.current&&f){const x=Math.abs(c.current-p.scrollTop);if(x>0){const b=window.innerHeight-Ua*2,k=parseFloat(f.style.minHeight),g=parseFloat(f.style.height),d=Math.max(k,g);if(d<b){const h=d+x,y=Math.min(b,h),S=h-y;f.style.height=y+"px",f.style.bottom==="0px"&&(p.scrollTop=S>0?S:0,f.style.justifyContent="flex-end")}}}c.current=p.scrollTop})})})]})},"SelectViewport")),Y2="SelectGroup",[t$,a$]=Ps(Y2),wp="SelectItem",[Q2,oy]=Ps(wp),X2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,value:r,disabled:s=!1,textValue:o,...i}=t,l=is(wp,n),c=Dl(wp,n),u=l.value===r,[p,f]=N.useState(o??""),[v,x]=N.useState(!1),b=Ba(y=>c.itemRefCallback?.(y,r,s)),k=Xe(a,b),g=vn(),d=N.useRef("touch");function h(y){l.hasConsumerStoppedPropagationRef.current=y.isPropagationStopped(),l.onUserSelect(r),l.onOpenChange(!1)}return Ze(h,"handleSelect"),T.jsx(Q2,{scope:n,value:r,disabled:s,textId:g,isSelected:u,onItemTextChange:N.useCallback(y=>{f(S=>S||(y?.textContent??"").trim())},[]),children:T.jsx(jl.ItemSlot,{scope:n,value:r,disabled:s,textValue:p,children:T.jsx(Oe.div,{role:"option","aria-labelledby":g,"data-highlighted":v?"":void 0,"aria-selected":u&&v,"data-state":u?"checked":"unchecked","aria-disabled":s||void 0,"data-disabled":s?"":void 0,tabIndex:s?void 0:-1,...i,ref:k,onFocus:Pe(i.onFocus,()=>x(!0)),onBlur:Pe(i.onBlur,()=>x(!1)),onClick:Pe(i.onClick,y=>{s||d.current!=="mouse"&&h(y)}),onPointerUp:Pe(i.onPointerUp,y=>{s||d.current==="mouse"&&h(y)}),onPointerDown:Pe(i.onPointerDown,y=>{d.current=y.pointerType}),onPointerMove:Pe(i.onPointerMove,y=>{d.current=y.pointerType,s?c.onItemLeave?.():d.current==="mouse"&&y.currentTarget.focus({preventScroll:!0})}),onPointerLeave:Pe(i.onPointerLeave,y=>{y.currentTarget===document.activeElement&&c.onItemLeave?.()}),onKeyDown:Pe(i.onKeyDown,y=>{s||y.target!==y.currentTarget||c.searchRef?.current!==""&&y.key===" "||(E2.includes(y.key)&&h(y),y.key===" "&&y.preventDefault())})})})})},"SelectItem")),Ol="SelectItemText",Z2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,className:r,style:s,...o}=t,i=is(Ol,n),l=Dl(Ol,n),c=oy(Ol,n),u=_2(Ol,n),[p,f]=N.useState(null),v=Ba(h=>l.itemTextRefCallback?.(h,c.value,c.disabled)),x=Xe(a,f,c.onItemTextChange,v),b=p?.textContent,k=N.useMemo(()=>T.jsx("option",{value:c.value,disabled:c.disabled,children:b},c.value),[c.disabled,c.value,b]),{onNativeOptionAdd:g,onNativeOptionRemove:d}=u;return kt(()=>(g(k),()=>d(k)),[g,d,k]),T.jsxs(T.Fragment,{children:[T.jsx(Oe.span,{id:c.textId,...o,ref:x}),c.isSelected&&i.valueNode&&!i.valueNodeHasChildren&&!Io(i.value)?dr.createPortal(o.children,i.valueNode):null]})},"SelectItemText")),J2="SelectItemIndicator",eE=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,...r}=t;return oy(J2,n).isSelected?T.jsx(Oe.span,{"aria-hidden":!0,...r,ref:a}):null},"SelectItemIndicator")),tE="SelectBubbleInput",aE=N.forwardRef(Ze(function({__scopeSelect:t,...a},n){const r=is(tE,t),{value:s,onValueChange:o,required:i,disabled:l,name:c,autoComplete:u,form:p,userSelection:f}=r,{nativeOptions:v,nativeSelectKey:x}=r,b=N.useRef(null),k=Xe(n,b),g=s??"",d=N.useRef(g),h=N.useRef(f),y=N.useRef(!1),S=Array.from(v).some(C=>(C.props.value??"")==="");return N.useEffect(()=>{const C=b.current;if(!C)return;const E=window.HTMLSelectElement.prototype,R=Object.getOwnPropertyDescriptor(E,"value").set,A=f!==null&&f!==h.current;h.current=f;const G=d.current!==g;d.current=g;const L=A&&G;if(A&&!G&&f.value!==g&&!f.hasConsumerStoppedPropagation&&R){y.current=!0;try{R.call(C,f.value),C.dispatchEvent(new Event("change",{bubbles:!0}))}finally{y.current=!1,R.call(C,g)}return}const P=L&&!f.hasConsumerStoppedPropagation;if(G&&R){const W=new Event("change",{bubbles:P});R.call(C,g),C.dispatchEvent(W)}},[g,f]),T.jsxs(Oe.select,{"aria-hidden":!0,required:i,tabIndex:-1,name:c,autoComplete:u,disabled:l,form:p,onChange:C=>{y.current||o(C.target.value)},...a,style:{...ey,...a.style},ref:k,defaultValue:g,children:[Io(s)&&!S?T.jsx("option",{value:""}):null,Array.from(v)]},x)},"SelectBubbleInput"));function iy(e){return typeof e=="function"}Ze(iy,"isFunction");function Io(e){return e===""||e===void 0}Ze(Io,"shouldShowPlaceholder");function kp(e){const t=Ba(e),a=N.useRef(""),n=N.useRef(0),r=N.useCallback(o=>{const i=a.current+o;t(i);function l(c){a.current=c,window.clearTimeout(n.current),c!==""&&(n.current=window.setTimeout(()=>l(""),1e3))}Ze(l,"updateSearch"),l(i)},[t]),s=N.useCallback(()=>{a.current="",window.clearTimeout(n.current)},[]);return N.useEffect(()=>()=>window.clearTimeout(n.current),[]),[a,r,s]}Ze(kp,"useTypeaheadSearch");function Np(e,t,a){const r=t.length>1&&Array.from(t).every(c=>c===t[0])?t[0]:t,s=a?e.indexOf(a):-1;let o=ly(e,Math.max(s,0));r.length===1&&(o=o.filter(c=>c!==a));const l=o.find(c=>c.textValue.toLowerCase().startsWith(r.toLowerCase()));return l!==a?l:void 0}Ze(Np,"findNextItem");function ly(e,t){return e.map((a,n)=>e[(t+n)%e.length])}Ze(ly,"wrapArray");var nE=Object.defineProperty,Tt=(e,t)=>nE(e,"name",{value:t,configurable:!0}),[Sp,n$]=ba("Tooltip",[Rl]),Ll=Rl(),sE="TooltipProvider",rE=700,Cp="tooltip.open",[oE,Ep]=Sp(sE),iE=Tt(e=>{const{__scopeTooltip:t,delayDuration:a=rE,skipDelayDuration:n=300,disableHoverableContent:r=!1,children:s}=e,o=N.useRef(!0),i=N.useRef(!1),l=N.useRef(0);return N.useEffect(()=>{const c=l.current;return()=>window.clearTimeout(c)},[]),T.jsx(oE,{scope:t,isOpenDelayedRef:o,delayDuration:a,onOpen:N.useCallback(()=>{n<=0||(window.clearTimeout(l.current),o.current=!1)},[n]),onClose:N.useCallback(()=>{n<=0||(window.clearTimeout(l.current),l.current=window.setTimeout(()=>o.current=!0,n))},[n]),isPointerInTransitRef:i,onPointerInTransitChange:N.useCallback(c=>{i.current=c},[]),disableHoverableContent:r,children:s})},"TooltipProvider"),$p="Tooltip",[lE,Ro]=Sp($p),dy=Tt(e=>{const{__scopeTooltip:t,children:a,open:n,defaultOpen:r,onOpenChange:s,disableHoverableContent:o,delayDuration:i}=e,l=Ep($p,e.__scopeTooltip),c=Ll(t),[u,p]=N.useState(null),[f,v]=N.useState(void 0),x=vn(),b=N.useRef(0),k=o??l.disableHoverableContent,g=i??l.delayDuration,d=N.useRef(!1),[h,y]=_a({prop:n,defaultProp:r??!1,onChange:Tt(A=>{A?(l.onOpen(),document.dispatchEvent(new CustomEvent(Cp))):l.onClose(),s?.(A)},"onChange"),caller:$p}),S=N.useMemo(()=>h?d.current?"delayed-open":"instant-open":"closed",[h]),C=N.useCallback(()=>{window.clearTimeout(b.current),b.current=0,d.current=!1,y(!0)},[y]),E=N.useCallback(()=>{window.clearTimeout(b.current),b.current=0,y(!1)},[y]),_=N.useCallback(()=>{window.clearTimeout(b.current),b.current=window.setTimeout(()=>{d.current=!0,y(!0),b.current=0},g)},[g,y]);N.useEffect(()=>()=>{b.current&&(window.clearTimeout(b.current),b.current=0)},[]);const R=f??x;return T.jsx(Yb,{...c,children:T.jsx(lE,{scope:t,contentId:R,setContentId:v,open:h,stateAttribute:S,trigger:u,onTriggerChange:p,onTriggerEnter:N.useCallback(()=>{l.isOpenDelayedRef.current?_():C()},[l.isOpenDelayedRef,_,C]),onTriggerLeave:N.useCallback(()=>{k?E():(window.clearTimeout(b.current),b.current=0)},[E,k]),onOpen:C,onClose:E,disableHoverableContent:k,children:a})})},"Tooltip"),cy="TooltipTrigger",uy=N.forwardRef(Tt(function(t,a){const{__scopeTooltip:n,"aria-describedby":r,...s}=t,o=Ro(cy,n),i=Ep(cy,n),l=Ll(n),c=N.useRef(null),u=Xe(a,c,o.onTriggerChange),p=N.useRef(!1),f=N.useRef(!1),v=N.useCallback(()=>p.current=!1,[]);return N.useEffect(()=>()=>document.removeEventListener("pointerup",v),[v]),T.jsx(Qb,{asChild:!0,...l,children:T.jsx(Oe.button,{"aria-describedby":o.open?ky(r,o.contentId):r,"data-state":o.stateAttribute,...s,ref:u,onPointerMove:Pe(t.onPointerMove,x=>{x.pointerType!=="touch"&&!f.current&&!i.isPointerInTransitRef.current&&(o.onTriggerEnter(),f.current=!0)}),onPointerLeave:Pe(t.onPointerLeave,()=>{o.onTriggerLeave(),f.current=!1}),onPointerDown:Pe(t.onPointerDown,()=>{o.open&&o.onClose(),p.current=!0,document.addEventListener("pointerup",v,{once:!0})}),onFocus:Pe(t.onFocus,()=>{p.current||o.onOpen()}),onBlur:Pe(t.onBlur,o.onClose),onClick:Pe(t.onClick,o.onClose)})})},"TooltipTrigger")),py="TooltipPortal",[dE,cE]=Sp(py,{forceMount:void 0}),fy=Tt(e=>{const{__scopeTooltip:t,forceMount:a,children:n,container:r}=e,s=Ro(py,t);return T.jsx(dE,{scope:t,forceMount:a,children:T.jsx(Jn,{present:a||s.open,children:T.jsx(wu,{asChild:!0,container:r,children:n})})})},"TooltipPortal"),Ao="TooltipContent",my=N.forwardRef(Tt(function(t,a){const n=cE(Ao,t.__scopeTooltip),{forceMount:r=n.forceMount,side:s="top",...o}=t,i=Ro(Ao,t.__scopeTooltip);return T.jsx(Jn,{present:r||i.open,children:i.disableHoverableContent?T.jsx(gy,{side:s,...o,ref:a}):T.jsx(uE,{side:s,...o,ref:a})})},"TooltipContent")),uE=N.forwardRef(Tt(function(t,a){const n=Ro(Ao,t.__scopeTooltip),r=Ep(Ao,t.__scopeTooltip),s=N.useRef(null),o=Xe(a,s),[i,l]=N.useState(null),{trigger:c,onClose:u}=n,p=s.current,{onPointerInTransitChange:f}=r,v=N.useCallback(()=>{l(null),f(!1)},[f]),x=N.useCallback((b,k)=>{const g=b.currentTarget,d={x:b.clientX,y:b.clientY},h=hy(d,g.getBoundingClientRect()),y=vy(d,h),S=by(k.getBoundingClientRect()),C=xy([...y,...S]);l(C),f(!0)},[f]);return N.useEffect(()=>()=>v(),[v]),N.useEffect(()=>{if(c&&p){const b=Tt(g=>x(g,p),"handleTriggerLeave"),k=Tt(g=>x(g,c),"handleContentLeave");return c.addEventListener("pointerleave",b),p.addEventListener("pointerleave",k),()=>{c.removeEventListener("pointerleave",b),p.removeEventListener("pointerleave",k)}}},[c,p,x,v]),N.useEffect(()=>{if(i){const b=Tt(k=>{const g=k.target,d={x:k.clientX,y:k.clientY},h=c?.contains(g)||p?.contains(g),y=!yy(d,i);h?v():y&&(v(),u())},"handleTrackPointerGrace");return document.addEventListener("pointermove",b),()=>document.removeEventListener("pointermove",b)}},[c,p,i,u,v]),T.jsx(gy,{...t,ref:o})},"TooltipContentHoverable")),pE=kh("TooltipContent"),gy=N.forwardRef(Tt(function(t,a){const{__scopeTooltip:n,children:r,"aria-label":s,id:o,onEscapeKeyDown:i,onPointerDownOutside:l,...c}=t,u=Ro(Ao,n),p=Ll(n),{onClose:f}=u,[v,x]=N.useState(null),b=Xe(a,x);Xh(v),N.useEffect(()=>(document.addEventListener(Cp,f),()=>document.removeEventListener(Cp,f)),[f]),N.useEffect(()=>{if(u.trigger){const g=Tt(d=>{d.target instanceof Node&&d.target.contains(u.trigger)&&f()},"handleScroll");return window.addEventListener("scroll",g,{capture:!0}),()=>window.removeEventListener("scroll",g,{capture:!0})}},[u.trigger,f]);const{setContentId:k}=u;return kt(()=>(k(o),()=>{k(void 0)}),[o,k]),T.jsx(fu,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:i,onPointerDownOutside:l,onFocusOutside:g=>g.preventDefault(),onDismiss:f,children:T.jsxs(Zb,{"data-state":u.stateAttribute,role:s?void 0:"tooltip",id:s?void 0:u.contentId,...p,...c,ref:b,style:{...c.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"},children:[T.jsx(pE,{children:r}),s?T.jsx(k2,{id:u.contentId,role:"tooltip",children:s}):null]})})},"TooltipContentImpl")),fE=N.forwardRef(Tt(function(t,a){const{__scopeTooltip:n,...r}=t,s=Ll(n);return T.jsx(b2,{...s,...r,ref:a})},"TooltipArrow"));function hy(e,t){const a=Math.abs(t.top-e.y),n=Math.abs(t.bottom-e.y),r=Math.abs(t.right-e.x),s=Math.abs(t.left-e.x);switch(Math.min(a,n,r,s)){case s:return"left";case r:return"right";case a:return"top";case n:return"bottom";default:throw new Error("unreachable")}}Tt(hy,"getExitSideFromRect");function vy(e,t,a=5){const n=[];switch(t){case"top":n.push({x:e.x-a,y:e.y+a},{x:e.x+a,y:e.y+a});break;case"bottom":n.push({x:e.x-a,y:e.y-a},{x:e.x+a,y:e.y-a});break;case"left":n.push({x:e.x+a,y:e.y-a},{x:e.x+a,y:e.y+a});break;case"right":n.push({x:e.x-a,y:e.y-a},{x:e.x-a,y:e.y+a});break}return n}Tt(vy,"getPaddedExitPoints");function by(e){const{top:t,right:a,bottom:n,left:r}=e;return[{x:r,y:t},{x:a,y:t},{x:a,y:n},{x:r,y:n}]}Tt(by,"getPointsFromRect");function yy(e,t){const{x:a,y:n}=e;let r=!1;for(let s=0,o=t.length-1;s<t.length;o=s++){const i=t[s],l=t[o],c=i.x,u=i.y,p=l.x,f=l.y;u>n!=f>n&&a<(p-c)*(n-u)/(f-u)+c&&(r=!r)}return r}Tt(yy,"isPointInPolygon");function xy(e){const t=e.slice();return t.sort((a,n)=>a.x<n.x?-1:a.x>n.x?1:a.y<n.y?-1:a.y>n.y?1:0),wy(t)}Tt(xy,"getHull");function wy(e){if(e.length<=1)return e.slice();const t=[];for(let n=0;n<e.length;n++){const r=e[n];for(;t.length>=2;){const s=t[t.length-1],o=t[t.length-2];if((s.x-o.x)*(r.y-o.y)>=(s.y-o.y)*(r.x-o.x))t.pop();else break}t.push(r)}t.pop();const a=[];for(let n=e.length-1;n>=0;n--){const r=e[n];for(;a.length>=2;){const s=a[a.length-1],o=a[a.length-2];if((s.x-o.x)*(r.y-o.y)>=(s.y-o.y)*(r.x-o.x))a.pop();else break}a.push(r)}return a.pop(),t.length===1&&a.length===1&&t[0].x===a[0].x&&t[0].y===a[0].y?t:t.concat(a)}Tt(wy,"getHullPresorted");function ky(...e){const t=new Set;for(const a of e)if(typeof a=="string")for(const n of String(a).trim().split(/\s+/))n&&t.add(n);return t.size>0?Array.from(t).join(" "):void 0}Tt(ky,"concatAriaDescribedby");var mE=Object.defineProperty,$n=(e,t)=>mE(e,"name",{value:t,configurable:!0}),Ny="Progress",Tp=100,[gE,s$]=ba(Ny),[hE,vE]=gE(Ny),bE=N.forwardRef($n(function(t,a){const{__scopeProgress:n,value:r=null,max:s,getValueLabel:o=Sy,...i}=t;(s||s===0)&&!_p(s)&&console.error(Cy(`${s}`,"Progress"));const l=_p(s)?s:Tp;r!==null&&!Ip(r,l)&&console.error(Ey(`${r}`,"Progress"));const c=Ip(r,l)?r:null,u=jo(c)?o(c,l):void 0;return T.jsx(hE,{scope:n,value:c,max:l,children:T.jsx(Oe.div,{"aria-valuemax":l,"aria-valuemin":0,"aria-valuenow":jo(c)?c:void 0,"aria-valuetext":u,role:"progressbar","data-state":Pp(c,l),"data-value":c??void 0,"data-max":l,...i,ref:a})})},"Progress")),yE="ProgressIndicator",xE=N.forwardRef($n(function(t,a){const{__scopeProgress:n,...r}=t,s=vE(yE,n);return T.jsx(Oe.div,{"data-state":Pp(s.value,s.max),"data-value":s.value??void 0,"data-max":s.max,...r,ref:a})},"ProgressIndicator"));function Sy(e,t){return`${Math.round(e/t*100)}%`}$n(Sy,"defaultGetValueLabel");function Pp(e,t){return e==null?"indeterminate":e===t?"complete":"loading"}$n(Pp,"getProgressState");function jo(e){return typeof e=="number"}$n(jo,"isNumber");function _p(e){return jo(e)&&!isNaN(e)&&e>0}$n(_p,"isValidMaxNumber");function Ip(e,t){return jo(e)&&!isNaN(e)&&e<=t&&e>=0}$n(Ip,"isValidValueNumber");function Cy(e,t){return`Invalid prop \`max\` of value \`${e}\` supplied to \`${t}\`. Only numbers greater than 0 are valid max values. Defaulting to \`${Tp}\`.`}$n(Cy,"getInvalidMaxError");function Ey(e,t){return`Invalid prop \`value\` of value \`${e}\` supplied to \`${t}\`. The \`value\` prop must be:
|
|
948
|
+
`)},Lk=0,gr=[];function Mk(e){var t=N.useRef([]),a=N.useRef([0,0]),n=N.useRef(),r=N.useState(Lk++)[0],s=N.useState(fv)[0],o=N.useRef(e);N.useEffect(function(){o.current=e},[e]),N.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(r));var b=rk([e.lockRef.current],(e.shards||[]).map(xv),!0).filter(Boolean);return b.forEach(function(k){return k.classList.add("allow-interactivity-".concat(r))}),function(){document.body.classList.remove("block-interactivity-".concat(r)),b.forEach(function(k){return k.classList.remove("allow-interactivity-".concat(r))})}}},[e.inert,e.lockRef.current,e.shards]);var i=N.useCallback(function(b,k){if("touches"in b&&b.touches.length===2||b.type==="wheel"&&b.ctrlKey)return!o.current.allowPinchZoom;var g=dl(b),d=a.current,h="deltaX"in b?b.deltaX:d[0]-g[0],y="deltaY"in b?b.deltaY:d[1]-g[1],S,C=b.target,E=Math.abs(h)>Math.abs(y)?"h":"v";if("touches"in b&&E==="h"&&C.type==="range")return!1;var _=window.getSelection(),I=_&&_.anchorNode,j=I?I===C||I.contains(C):!1;if(j)return!1;var H=hv(E,C);if(!H)return!0;if(H?S=E:(S=E==="v"?"h":"v",H=hv(E,C)),!H)return!1;if(!n.current&&"changedTouches"in b&&(h||y)&&(n.current=S),!S)return!0;var M=n.current||S;return jk(M,k,b,M==="h"?h:y)},[]),l=N.useCallback(function(b){var k=b;if(!(!gr.length||gr[gr.length-1]!==s)){var g="deltaY"in k?yv(k):dl(k),d=t.current.filter(function(S){return S.name===k.type&&(S.target===k.target||k.target===S.shadowParent)&&Dk(S.delta,g)})[0];if(d&&d.should){k.cancelable&&k.preventDefault();return}if(!d){var h=(o.current.shards||[]).map(xv).filter(Boolean).filter(function(S){return S.contains(k.target)}),y=h.length>0?i(k,h[0]):!o.current.noIsolation;y&&k.cancelable&&k.preventDefault()}}},[]),c=N.useCallback(function(b,k,g,d){var h={name:b,delta:k,target:g,should:d,shadowParent:zk(g)};t.current.push(h),setTimeout(function(){t.current=t.current.filter(function(y){return y!==h})},1)},[]),u=N.useCallback(function(b){a.current=dl(b),n.current=void 0},[]),p=N.useCallback(function(b){c(b.type,yv(b),b.target,i(b,e.lockRef.current))},[]),f=N.useCallback(function(b){c(b.type,dl(b),b.target,i(b,e.lockRef.current))},[]);N.useEffect(function(){return gr.push(s),e.setCallbacks({onScrollCapture:p,onWheelCapture:p,onTouchMoveCapture:f}),document.addEventListener("wheel",l,mr),document.addEventListener("touchmove",l,mr),document.addEventListener("touchstart",u,mr),function(){gr=gr.filter(function(b){return b!==s}),document.removeEventListener("wheel",l,mr),document.removeEventListener("touchmove",l,mr),document.removeEventListener("touchstart",u,mr)}},[]);var v=e.removeScrollBar,x=e.inert;return N.createElement(N.Fragment,null,x?N.createElement(s,{styles:Ok(r)}):null,v?N.createElement($k,{noRelative:e.noRelative,gapMode:e.gapMode}):null)}function zk(e){for(var t=null;e!==null;)e instanceof ShadowRoot&&(t=e.host,e=e.host),e=e.parentNode;return t}const Fk=mk(pv,Mk);var Pu=N.forwardRef(function(e,t){return N.createElement(il,Xa({},e,{ref:t,sideCar:Fk}))});Pu.classNames=il.classNames;var Bk=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},hr=new WeakMap,cl=new WeakMap,ul={},_u=0,wv=function(e){return e&&(e.host||wv(e.parentNode))},Uk=function(e,t){return t.map(function(a){if(e.contains(a))return a;var n=wv(a);return n&&e.contains(n)?n:(console.error("aria-hidden",a,"in not contained inside",e,". Doing nothing"),null)}).filter(function(a){return!!a})},qk=function(e,t,a,n){var r=Uk(t,Array.isArray(e)?e:[e]);ul[a]||(ul[a]=new WeakMap);var s=ul[a],o=[],i=new Set,l=new Set(r),c=function(p){!p||i.has(p)||(i.add(p),c(p.parentNode))};r.forEach(c);var u=function(p){!p||l.has(p)||Array.prototype.forEach.call(p.children,function(f){if(i.has(f))u(f);else try{var v=f.getAttribute(n),x=v!==null&&v!=="false",b=(hr.get(f)||0)+1,k=(s.get(f)||0)+1;hr.set(f,b),s.set(f,k),o.push(f),b===1&&x&&cl.set(f,!0),k===1&&f.setAttribute(a,"true"),x||f.setAttribute(n,"true")}catch(g){console.error("aria-hidden: cannot operate on ",f,g)}})};return u(t),i.clear(),_u++,function(){o.forEach(function(p){var f=hr.get(p)-1,v=s.get(p)-1;hr.set(p,f),s.set(p,v),f||(cl.has(p)||p.removeAttribute(n),cl.delete(p)),v||p.removeAttribute(a)}),_u--,_u||(hr=new WeakMap,hr=new WeakMap,cl=new WeakMap,ul={})}},kv=function(e,t,a){a===void 0&&(a="data-aria-hidden");var n=Array.from(Array.isArray(e)?e:[e]),r=Bk(e);return r?(n.push.apply(n,Array.from(r.querySelectorAll("[aria-live], script"))),qk(n,r,a,"aria-hidden")):function(){return null}},Vk=Object.defineProperty,ya=(e,t)=>Vk(e,"name",{value:t,configurable:!0}),Iu="Dialog",[Nv,YE]=ba(Iu),[Wk,Za]=Nv(Iu),Sv=ya(e=>{const{__scopeDialog:t,children:a,open:n,defaultOpen:r,onOpenChange:s,modal:o=!0}=e,i=N.useRef(null),l=N.useRef(null),{nodes:c,registry:u}=Qh(),[p,f]=_a({prop:n,defaultProp:r??!1,onChange:s,caller:Iu}),[v,x]=N.useState(0),[b,k]=N.useState(0);return $.jsx(Wk,{scope:t,triggerRef:i,contentRef:l,contentId:vn(),titleId:vn(),descriptionId:vn(),titlePresent:v>0,descriptionPresent:b>0,setTitleCount:x,setDescriptionCount:k,open:p,onOpenChange:f,onOpenToggle:N.useCallback(()=>f(g=>!g),[f]),modal:o,branchNodes:c,branchRegistry:u,children:a})},"Dialog"),Cv="DialogPortal",[Hk,Ev]=Nv(Cv,{forceMount:void 0}),Ru=ya(e=>{const{__scopeDialog:t,forceMount:a,children:n,container:r}=e,s=Za(Cv,t);return $.jsx(Hk,{scope:t,forceMount:a,children:N.Children.map(n,o=>$.jsx(es,{present:a||s.open,children:$.jsx(wu,{asChild:!0,container:r,children:o})}))})},"DialogPortal"),Au="DialogOverlay",ju=N.forwardRef(ya(function(t,a){const n=Ev(Au,t.__scopeDialog),{forceMount:r=n.forceMount,...s}=t,o=Za(Au,t.__scopeDialog);return o.modal?$.jsx(es,{present:r||o.open,children:$.jsx(Kk,{...s,ref:a})}):null},"DialogOverlay")),Gk=hn("DialogOverlay.RemoveScroll"),Kk=N.forwardRef(ya(function(t,a){const{__scopeDialog:n,...r}=t,s=Za(Au,n),o=qh(),i=Ze(a,o);return $.jsx(Pu,{as:Gk,allowPinchZoom:!0,shards:N.useMemo(()=>[s.contentRef,...s.branchNodes.map(l=>({current:l}))],[s.contentRef,s.branchNodes]),children:$.jsx(Oe.div,{"data-state":Lu(s.open),...r,ref:i,style:{pointerEvents:"auto",...r.style}})})},"DialogOverlayImpl")),No="DialogContent",Du=N.forwardRef(ya(function(t,a){const n=Ev(No,t.__scopeDialog),{forceMount:r=n.forceMount,...s}=t,o=Za(No,t.__scopeDialog);return $.jsx(es,{present:r||o.open,children:o.modal?$.jsx(Yk,{...s,ref:a}):$.jsx(Qk,{...s,ref:a})})},"DialogContent")),Yk=N.forwardRef(ya(function(t,a){const n=Za(No,t.__scopeDialog),r=N.useRef(null),s=Ze(a,n.contentRef,r);return N.useEffect(()=>{const o=r.current;if(o)return kv(o)},[]),$.jsx($v,{...t,ref:s,trapFocus:n.open,disableOutsidePointerEvents:n.open,onCloseAutoFocus:_e(t.onCloseAutoFocus,o=>{o.preventDefault(),n.triggerRef.current?.focus()}),onPointerDownOutside:_e(t.onPointerDownOutside,o=>{const i=o.detail.originalEvent,l=i.button===0&&i.ctrlKey===!0;(i.button===2||l)&&o.preventDefault()}),onFocusOutside:_e(t.onFocusOutside,o=>o.preventDefault())})},"DialogContentModal")),Qk=N.forwardRef(ya(function(t,a){const n=Za(No,t.__scopeDialog),r=N.useRef(!1),s=N.useRef(!1);return $.jsx($v,{...t,ref:a,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:o=>{t.onCloseAutoFocus?.(o),o.defaultPrevented||(r.current||n.triggerRef.current?.focus(),o.preventDefault()),r.current=!1,s.current=!1},onInteractOutside:o=>{t.onInteractOutside?.(o),o.defaultPrevented||(r.current=!0,o.detail.originalEvent.type==="pointerdown"&&(s.current=!0));const i=o.target;n.triggerRef.current?.contains(i)&&o.preventDefault(),o.detail.originalEvent.type==="focusin"&&s.current&&o.preventDefault()}})},"DialogContentNonModal")),$v=N.forwardRef(ya(function(t,a){const{__scopeDialog:n,trapFocus:r,onOpenAutoFocus:s,onCloseAutoFocus:o,"aria-describedby":i,children:l,...c}=t,u=Za(No,n);return sl(),$.jsx(Yh,{registry:u.branchRegistry,children:$.jsx(Gh,{asChild:!0,loop:!0,trapped:r,branches:u.branchNodes,onMountAutoFocus:s,onUnmountAutoFocus:o,children:$.jsx(fu,{role:"dialog",id:u.contentId,"aria-labelledby":u.titlePresent?u.titleId:void 0,"aria-describedby":u.descriptionPresent?_v(i,u.descriptionId):i,"data-state":Lu(u.open),...c,ref:a,deferPointerDownOutside:!0,onDismiss:()=>u.onOpenChange(!1),children:l})})})},"DialogContentImpl")),Ou=N.forwardRef(ya(function(t,a){const{__scopeDialog:n,...r}=t,s=Za("DialogTitle",n),{setTitleCount:o}=s;return kt(()=>(o(i=>i+1),()=>o(i=>i-1)),[o]),$.jsx(Oe.h2,{id:s.titleId,...r,ref:a})},"DialogTitle")),Tv=N.forwardRef(ya(function(t,a){const{__scopeDialog:n,...r}=t,s=Za("DialogDescription",n),{setDescriptionCount:o}=s;return kt(()=>(o(i=>i+1),()=>o(i=>i-1)),[o]),$.jsx(Oe.p,{id:s.descriptionId,...r,ref:a})},"DialogDescription")),Xk="DialogClose",Pv=N.forwardRef(ya(function(t,a){const{__scopeDialog:n,...r}=t,s=Za(Xk,n);return $.jsx(Oe.button,{type:"button",...r,ref:a,onClick:_e(t.onClick,()=>s.onOpenChange(!1))})},"DialogClose"));function _v(...e){const t=new Set;for(const a of e)if(typeof a=="string")for(const n of String(a).trim().split(/\s+/))n&&t.add(n);return t.size>0?Array.from(t).join(" "):void 0}ya(_v,"concatAriaDescribedby");function Lu(e){return e?"open":"closed"}ya(Lu,"getState");var Zk=Object.defineProperty,At=(e,t)=>Zk(e,"name",{value:t,configurable:!0});function Mu(e){const t=e+"CollectionProvider",[a,n]=ba(t),[r,s]=a(t,{collectionRef:{current:null},itemMap:new Map}),o=At(b=>{const{scope:k,children:g}=b,d=N.useRef(null),h=N.useRef(new Map).current;return $.jsx(r,{scope:k,itemMap:h,collectionRef:d,children:g})},"CollectionProvider");o.displayName=t;const i=e+"CollectionSlot",l=hn(i),c=N.forwardRef((b,k)=>{const{scope:g,children:d}=b,h=s(i,g),y=Ze(k,h.collectionRef);return $.jsx(l,{ref:y,children:d})});c.displayName=i;const u=e+"CollectionItemSlot",p="data-radix-collection-item",f=hn(u),v=N.forwardRef((b,k)=>{const{scope:g,children:d,...h}=b,y=N.useRef(null),S=Ze(k,y),C=s(u,g);return N.useEffect(()=>(C.itemMap.set(y,{ref:y,...h}),()=>void C.itemMap.delete(y))),$.jsx(f,{[p]:"",ref:S,children:d})});v.displayName=u;function x(b){const k=s(e+"CollectionConsumer",b);return N.useCallback(()=>{const d=k.collectionRef.current;if(!d)return[];const h=Array.from(d.querySelectorAll(`[${p}]`));return Array.from(k.itemMap.values()).sort((C,E)=>h.indexOf(C.ref.current)-h.indexOf(E.ref.current))},[k.collectionRef,k.itemMap])}return At(x,"useCollection"),[{Provider:o,Slot:c,ItemSlot:v},x,n]}At(Mu,"createCollection");var Iv=new WeakMap,pl=(xa=class extends Map{constructor(a){super(a);jy(this,Nt);jp(this,Nt,[...super.keys()]),Iv.set(this,!0)}set(a,n){return Iv.get(this)&&!this.has(a)&&Wt(this,Nt).push(a),super.set(a,n),this}insert(a,n,r){const s=this.has(n),o=s?this.size:this.size+1,i=zu(a),l=i>=0?Math.min(i,o-1):Math.max(o+i,0);if(s?Wt(this,Nt).indexOf(n)===l:l===this.size)return this.set(n,r),this;const c=Wt(this,Nt).filter(p=>p!==n);c.splice(l,0,n);const u=c.map(p=>[p,p===n?r:this.get(p)]);this.clear();for(const[p,f]of u)this.set(p,f);return this}with(a,n,r){const s=new xa(this);return s.insert(a,n,r),s}before(a){const n=Wt(this,Nt).indexOf(a)-1;if(!(n<0))return this.entryAt(n)}setBefore(a,n,r){const s=Wt(this,Nt).indexOf(a);if(s===-1)return this;const o=Wt(this,Nt).indexOf(n),i=o!==-1&&o<s?s-1:s;return this.insert(i,n,r)}after(a){let n=Wt(this,Nt).indexOf(a);if(n=n===-1||n===this.size-1?-1:n+1,n!==-1)return this.entryAt(n)}setAfter(a,n,r){const s=Wt(this,Nt).indexOf(a);if(s===-1)return this;const o=Wt(this,Nt).indexOf(n),i=o!==-1&&o<=s?s:s+1;return this.insert(i,n,r)}first(){return this.entryAt(0)}last(){return this.entryAt(-1)}clear(){return jp(this,Nt,[]),super.clear()}delete(a){const n=super.delete(a);return n&&Wt(this,Nt).splice(Wt(this,Nt).indexOf(a),1),n}deleteAt(a){const n=this.keyAt(a);return n!==void 0?this.delete(n):!1}at(a){const n=fl(Wt(this,Nt),a);if(n!==void 0)return this.get(n)}entryAt(a){const n=fl(Wt(this,Nt),a);if(n!==void 0)return[n,this.get(n)]}indexOf(a){return Wt(this,Nt).indexOf(a)}keyAt(a){return fl(Wt(this,Nt),a)}from(a,n){const r=this.indexOf(a);if(r===-1)return;let s=r+n;return s<0&&(s=0),s>=this.size&&(s=this.size-1),this.at(s)}keyFrom(a,n){const r=this.indexOf(a);if(r===-1)return;let s=r+n;return s<0&&(s=0),s>=this.size&&(s=this.size-1),this.keyAt(s)}find(a,n){let r=0;for(const s of this){if(Reflect.apply(a,n,[s,r,this]))return s;r++}}findIndex(a,n){let r=0;for(const s of this){if(Reflect.apply(a,n,[s,r,this]))return r;r++}return-1}filter(a,n){const r=[];let s=0;for(const o of this)Reflect.apply(a,n,[o,s,this])&&r.push(o),s++;return new xa(r)}map(a,n){const r=[];let s=0;for(const o of this)r.push([o[0],Reflect.apply(a,n,[o,s,this])]),s++;return new xa(r)}reduce(...a){const[n,r]=a,s=a.length>1;if(!s&&this.size===0)throw new TypeError("Reduce of empty OrderedDict with no initial value");let o=0,i=r;for(const l of this)o===0&&!s?i=l:i=Reflect.apply(n,this,[i,l,o,this]),o++;return i}reduceRight(...a){const[n,r]=a,s=a.length>1;if(!s&&this.size===0)throw new TypeError("Reduce of empty OrderedDict with no initial value");let o=r;for(let i=this.size-1;i>=0;i--){const l=this.entryAt(i);i===this.size-1&&!s?o=l:o=Reflect.apply(n,this,[o,l,i,this])}return o}sort(a){if(typeof a!="function")throw new TypeError("OrderedDict.sort requires a compare function");const n=[...this.entries()].sort(a);this.clear();for(const[r,s]of n)this.set(r,s);return this}toSorted(a){if(typeof a!="function")throw new TypeError("OrderedDict.toSorted requires a compare function");const n=[...this.entries()].sort(a);return new xa(n)}toReversed(){const a=new xa;for(let n=this.size-1;n>=0;n--){const r=this.keyAt(n),s=this.get(r);a.set(r,s)}return a}toSpliced(...a){const n=[...this.entries()];return n.splice(...a),new xa(n)}slice(a,n){const r=new xa;for(const s of Wt(this,Nt).slice(a,n))r.set(s,this.get(s));return r}every(a,n){let r=0;for(const s of this){if(!Reflect.apply(a,n,[s,r,this]))return!1;r++}return!0}some(a,n){let r=0;for(const s of this){if(Reflect.apply(a,n,[s,r,this]))return!0;r++}return!1}},Nt=new WeakMap,At(xa,"OrderedDict"),xa);function fl(e,t){if("at"in Array.prototype)return Array.prototype.at.call(e,t);const a=Rv(e,t);return a===-1?void 0:e[a]}At(fl,"at");function Rv(e,t){const a=e.length,n=zu(t),r=n>=0?n:a+n;return r<0||r>=a?-1:r}At(Rv,"toSafeIndex");function zu(e){return e!==e||e===0?0:Math.trunc(e)}At(zu,"toSafeInteger");function Jk(e){const t=e+"CollectionProvider",[a,n]=ba(t),[r,s]=a(t);r.displayName=e+"CollectionStableContextProvider";const[o,i]=a(t);o.displayName=e+"CollectionStatefulContextProvider";const l=At(({state:C,...E})=>C?$.jsx(u,{...E,state:C}):$.jsx(c,{...E}),"CollectionProvider");l.displayName=t;const c=At(C=>{const E=d();return $.jsx(u,{...C,state:E})},"CollectionInit");c.displayName=e+"CollectionInit";const u=At(C=>{const{scope:E,children:_,state:I}=C,j=N.useRef(null),[H,M]=N.useState(null),P=Ze(j,M),[G,J]=I,q=N.useRef(new pl),B=N.useCallback(()=>{const L=q.current;return Dv(L)||L.sort(ml),L},[]);return N.useEffect(()=>{if(!H)return;const L=Ov(()=>{J(w=>{const T=w.toSorted(ml);return T.some(([R],D)=>w.keyAt(D)!==R)?T:w})});return L.observe(H,{childList:!0,subtree:!0}),()=>{L.disconnect()}},[H,J]),$.jsx(r,{scope:E,collectionElementRef:P,collectionElementRefObject:j,getCollection:B,setCollection:J,registryRef:q,children:$.jsx(o,{scope:E,collectionElement:H,collection:G,children:_})})},"CollectionProviderImpl");u.displayName=e+"CollectionProviderImpl";const p=e+"CollectionSlot",f=hn(p),v=N.forwardRef((C,E)=>{const{scope:_,children:I}=C,j=s(p,_),H=Ze(E,j.collectionElementRef);return $.jsx(f,{ref:H,children:I})});v.displayName=p;const x=e+"CollectionItemSlot",b="data-radix-collection-item",k=hn(x),g=N.forwardRef((C,E)=>{const{scope:_,children:I,...j}=C,H=N.useRef(null),M=s(x,_),{setCollection:P,registryRef:G}=M,J=N.useRef(j);Av(J.current,j)||(J.current=j);const q=J.current,B=N.useCallback(T=>{const Q=G.current;T?Q.set(T,{...J.current,element:T}):H.current&&Q.delete(H.current)},[G]),L=Ze(E,B,H);kt(()=>{const T=H.current,Q=G.current;T&&Q.has(T)&&Q.set(T,{...q,element:T})},[q,G]);const w=N.useRef(null);return N.useEffect(()=>{const T=H.current,Q=w.current;(Q?.element??null)===T&&(!T||Q?.itemData===q)||(w.current=T?{element:T,itemData:q}:null,P(R=>{const D=new pl(R);return Q&&Q.element!==T&&D.delete(Q.element),T&&D.set(T,{...q,element:T}),D.sort(ml)}))}),N.useEffect(()=>()=>{const T=w.current;w.current=null,T&&P(Q=>{if(!Q.has(T.element))return Q;const R=new pl(Q);return R.delete(T.element),R})},[P]),$.jsx(k,{[b]:"",ref:L,children:I})});g.displayName=x;function d(){return N.useState(new pl)}At(d,"useInitCollection");function h(C){const{collection:E}=i(e+"CollectionConsumer",C);return E}At(h,"useCollection");function y(C){const{getCollection:E}=s(e+"CollectionConsumer",C);return E}return At(y,"useGetCollection"),[{Provider:l,Slot:v,ItemSlot:g},{createCollectionScope:n,useCollection:h,useGetCollection:y,useInitCollection:d}]}At(Jk,"createCollection");function Av(e,t){if(e===t)return!0;if(typeof e!="object"||typeof t!="object"||e==null||t==null)return!1;const a=Object.keys(e),n=Object.keys(t);if(a.length!==n.length)return!1;for(const r of a)if(!Object.prototype.hasOwnProperty.call(t,r)||e[r]!==t[r])return!1;return!0}At(Av,"shallowEqual");function jv(e,t){return!!(t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_PRECEDING)}At(jv,"isElementPreceding");function Dv(e){let t;for(const a of e.keys()){if(t){const n=t.compareDocumentPosition(a);if(!(n&Node.DOCUMENT_POSITION_DISCONNECTED)&&n&Node.DOCUMENT_POSITION_PRECEDING)return!1}t=a}return!0}At(Dv,"isInDocumentOrder");function ml(e,t){return!e[1].element||!t[1].element?0:jv(e[1].element,t[1].element)?-1:1}At(ml,"sortByDocumentPosition");function Ov(e){return new MutationObserver(a=>{for(const n of a)if(n.type==="childList"){e();return}})}At(Ov,"getChildListObserver");var eN=Object.defineProperty,tN=(e,t)=>eN(e,"name",{value:t,configurable:!0}),aN={LTR:"ltr"},nN=N.createContext(void 0);function So(e){const t=N.useContext(nN);return e||t||aN.LTR}tN(So,"useDirection");var sN=Object.defineProperty,Fu=(e,t)=>sN(e,"name",{value:t,configurable:!0}),Bu=!1;function Lv(){const[e,t]=N.useState(Bu);return N.useEffect(()=>{Bu||(Bu=!0,t(!0))},[]),e}Fu(Lv,"useIsHydrated");var Mv=An[" useSyncExternalStore ".trim().toString()];function zv(){return()=>{}}Fu(zv,"subscribe");function Fv(){return Mv(zv,()=>!0,()=>!1)}Fu(Fv,"useIsHydratedModern");var rN=typeof Mv=="function"?Fv:Lv,oN=Object.defineProperty,Cs=(e,t)=>oN(e,"name",{value:t,configurable:!0}),Uu="rovingFocusGroup.onEntryFocus",iN={bubbles:!1,cancelable:!0},gl="RovingFocusGroup",[qu,Bv,lN]=Mu(gl),[dN,hl]=ba(gl,[lN]),Uv={Vertical:"vertical",Horizontal:"horizontal"},cN={RTL:"rtl"},[uN,pN]=dN(gl),qv=N.forwardRef(Cs(function(t,a){return $.jsx(qu.Provider,{scope:t.__scopeRovingFocusGroup,children:$.jsx(qu.Slot,{scope:t.__scopeRovingFocusGroup,children:$.jsx(fN,{...t,ref:a})})})},"RovingFocusGroup")),fN=N.forwardRef(Cs(function(t,a){const{__scopeRovingFocusGroup:n,orientation:r,loop:s=!1,dir:o,currentTabStopId:i,defaultCurrentTabStopId:l,onCurrentTabStopIdChange:c,onEntryFocus:u,preventScrollOnEntryFocus:p=!1,...f}=t,v=N.useRef(null),x=Ze(a,v),b=So(o),[k,g]=_a({prop:i,defaultProp:l??null,onChange:c,caller:gl}),[d,h]=N.useState(!1),y=Ba(u),S=Bv(n),C=N.useRef(!1),[E,_]=N.useState(0);return N.useEffect(()=>{const I=v.current;if(I)return I.addEventListener(Uu,y),()=>I.removeEventListener(Uu,y)},[y]),$.jsx(uN,{scope:n,orientation:r,dir:b,loop:s,currentTabStopId:k,onItemFocus:N.useCallback(I=>g(I),[g]),onItemShiftTab:N.useCallback(()=>h(!0),[]),onFocusableItemAdd:N.useCallback(()=>_(I=>I+1),[]),onFocusableItemRemove:N.useCallback(()=>_(I=>I-1),[]),children:$.jsx(Oe.div,{tabIndex:d||E===0?-1:0,"data-orientation":r,...f,ref:x,style:{outline:"none",...t.style},onMouseDown:_e(t.onMouseDown,()=>{C.current=!0}),onFocus:_e(t.onFocus,I=>{const j=!C.current;if(I.target===I.currentTarget&&j&&!d){const H=new CustomEvent(Uu,iN);if(I.currentTarget.dispatchEvent(H),!H.defaultPrevented){const M=S().filter(B=>B.focusable),P=M.find(B=>B.active),G=M.find(B=>B.id===k),q=[P,G,...M].filter(Boolean).map(B=>B.ref.current);Vu(q,p)}}C.current=!1}),onBlur:_e(t.onBlur,()=>h(!1))})})},"RovingFocusGroupImpl")),mN="RovingFocusGroupItem",Vv=N.forwardRef(Cs(function(t,a){const{__scopeRovingFocusGroup:n,focusable:r=!0,active:s=!1,tabStopId:o,children:i,...l}=t,c=vn(),u=o||c,p=pN(mN,n),f=p.currentTabStopId===u,v=Bv(n),{onFocusableItemAdd:x,onFocusableItemRemove:b,currentTabStopId:k}=p,g=rN();return kt(()=>{if(!(!g||!r))return x(),()=>b()},[g,r,x,b]),N.useEffect(()=>{if(!(g||!r))return x(),()=>b()},[g,r,x,b]),$.jsx(qu.ItemSlot,{scope:n,id:u,focusable:r,active:s,children:$.jsx(Oe.span,{tabIndex:f?0:-1,"data-orientation":p.orientation,...l,ref:a,onMouseDown:_e(t.onMouseDown,d=>{r?p.onItemFocus(u):d.preventDefault()}),onFocus:_e(t.onFocus,()=>p.onItemFocus(u)),onKeyDown:_e(t.onKeyDown,d=>{if(d.key==="Tab"&&d.shiftKey){p.onItemShiftTab();return}if(d.target!==d.currentTarget)return;const h=Hv(d,p.orientation,p.dir);if(h!==void 0){if(d.metaKey||d.ctrlKey||d.altKey||d.shiftKey)return;d.preventDefault();let S=v().filter(C=>C.focusable).map(C=>C.ref.current);if(h==="last")S.reverse();else if(h==="prev"||h==="next"){h==="prev"&&S.reverse();const C=S.indexOf(d.currentTarget);S=p.loop?Gv(S,C+1):S.slice(C+1)}setTimeout(()=>Vu(S))}}),children:typeof i=="function"?i({isCurrentTabStop:f,hasTabStop:k!=null}):i})})},"RovingFocusGroupItem")),gN={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function Wv(e,t){return t!==cN.RTL?e:e==="ArrowLeft"?"ArrowRight":e==="ArrowRight"?"ArrowLeft":e}Cs(Wv,"getDirectionAwareKey");function Hv(e,t,a){const n=Wv(e.key,a);if(!(t===Uv.Vertical&&["ArrowLeft","ArrowRight"].includes(n))&&!(t===Uv.Horizontal&&["ArrowUp","ArrowDown"].includes(n)))return gN[n]}Cs(Hv,"getFocusIntent");function Vu(e,t=!1){const a=document.activeElement;for(const n of e)if(n===a||(n.focus({preventScroll:t}),document.activeElement!==a))return}Cs(Vu,"focusFirst");function Gv(e,t){return e.map((a,n)=>e[(t+n)%e.length])}Cs(Gv,"wrapArray");var hN=Object.defineProperty,vr=(e,t)=>hN(e,"name",{value:t,configurable:!0}),Kv={Automatic:"automatic",Manual:"manual"},Wu="Tabs",[vN,QE]=ba(Wu,[hl]),Yv=hl(),[bN,Hu]=vN(Wu),yN=N.forwardRef(vr(function(t,a){const{__scopeTabs:n,value:r,onValueChange:s,defaultValue:o,orientation:i="horizontal",dir:l,activationMode:c=Kv.Automatic,...u}=t,p=So(l),[f,v]=_a({prop:r,onChange:s,defaultProp:o??"",caller:Wu});return $.jsx(bN,{scope:n,baseId:vn(),value:f,onValueChange:v,orientation:i,dir:p,activationMode:c,children:$.jsx(Oe.div,{dir:p,"data-orientation":i,...u,ref:a})})},"Tabs")),xN="TabsList",wN=N.forwardRef(vr(function(t,a){const{__scopeTabs:n,loop:r=!0,...s}=t,o=Hu(xN,n),i=Yv(n);return $.jsx(qv,{asChild:!0,...i,orientation:o.orientation,dir:o.dir,loop:r,children:$.jsx(Oe.div,{role:"tablist","aria-orientation":o.orientation,...s,ref:a})})},"TabsList")),kN="TabsTrigger",NN=N.forwardRef(vr(function(t,a){const{__scopeTabs:n,value:r,disabled:s=!1,...o}=t,i=Hu(kN,n),l=Yv(n),c=Gu(i.baseId,r),u=Ku(i.baseId,r),p=r===i.value;return $.jsx(Vv,{asChild:!0,...l,focusable:!s,active:p,children:$.jsx(Oe.button,{type:"button",role:"tab","aria-selected":p,"aria-controls":u,"data-state":p?"active":"inactive","data-disabled":s?"":void 0,disabled:s,id:c,...o,ref:a,onMouseDown:_e(t.onMouseDown,f=>{!s&&f.button===0&&f.ctrlKey===!1?(f.currentTarget.focus(),i.onValueChange(r)):f.preventDefault()}),onKeyDown:_e(t.onKeyDown,f=>{s||f.target!==f.currentTarget||[" ","Enter"].includes(f.key)&&i.onValueChange(r)}),onFocus:_e(t.onFocus,()=>{const f=i.activationMode!==Kv.Manual;!p&&!s&&f&&i.onValueChange(r)})})})},"TabsTrigger")),SN="TabsContent",CN=N.forwardRef(vr(function(t,a){const{__scopeTabs:n,value:r,forceMount:s,children:o,...i}=t,l=Hu(SN,n),c=Gu(l.baseId,r),u=Ku(l.baseId,r),p=r===l.value,f=N.useRef(p);return N.useEffect(()=>{const v=requestAnimationFrame(()=>f.current=!1);return()=>cancelAnimationFrame(v)},[]),$.jsx(es,{present:s||p,children:({present:v})=>$.jsx(Oe.div,{"data-state":p?"active":"inactive","data-orientation":l.orientation,role:"tabpanel","aria-labelledby":c,hidden:!v,id:u,tabIndex:0,...i,ref:a,style:{...t.style,animationDuration:f.current?"0s":void 0},children:v&&o})})},"TabsContent"));function Gu(e,t){return`${e}-trigger-${t}`}vr(Gu,"makeTriggerId");function Ku(e,t){return`${e}-content-${t}`}vr(Ku,"makeContentId");var EN=Object.defineProperty,$N=(e,t)=>EN(e,"name",{value:t,configurable:!0});function vl(e){const[t,a]=N.useState(void 0);return kt(()=>{if(e){a({width:e.offsetWidth,height:e.offsetHeight});let n=0;const r=new ResizeObserver(s=>{if(!Array.isArray(s)||!s.length)return;const o=s[0];window.cancelAnimationFrame(n),n=window.requestAnimationFrame(()=>{let i,l;if("borderBoxSize"in o){const c=o.borderBoxSize,u=Array.isArray(c)?c[0]:c;i=u.inlineSize,l=u.blockSize}else i=e.offsetWidth,l=e.offsetHeight;a({width:i,height:l})})});return r.observe(e,{box:"border-box"}),()=>{window.cancelAnimationFrame(n),r.unobserve(e)}}else a(void 0)},[e]),t}$N(vl,"useSize");var TN=Object.defineProperty,ts=(e,t)=>TN(e,"name",{value:t,configurable:!0}),Yu="Switch",[PN,XE]=ba(Yu),[_N,Qu]=PN(Yu);function Qv(e){const{__scopeSwitch:t,checked:a,children:n,defaultChecked:r,disabled:s,form:o,name:i,onCheckedChange:l,required:c,value:u="on",internal_do_not_use_render:p}=e,[f,v]=_a({prop:a,defaultProp:r??!1,onChange:l,caller:Yu}),[x,b]=N.useState(null),[k,g]=N.useState(null),[d,h]=N.useState(null),y=x?!!o||!!x.closest("form"):!0,S={checked:f,setChecked:v,disabled:s,control:x,setControl:b,name:i,form:o,value:u,userClick:d,onUserClick:h,required:c,defaultChecked:r,isFormControl:y,bubbleInput:k,setBubbleInput:g};return $.jsx(_N,{scope:t,...S,children:Jv(p)?p(S):n})}ts(Qv,"SwitchProvider");var IN="SwitchTrigger",RN=N.forwardRef(ts(function({__scopeSwitch:t,onClick:a,...n},r){const{control:s,form:o,value:i,disabled:l,checked:c,required:u,setControl:p,setChecked:f,onUserClick:v,isFormControl:x,bubbleInput:b}=Qu(IN,t),k=Ze(r,p),g=N.useRef(c);return N.useEffect(()=>{const d=o?s?.ownerDocument.getElementById(o):s?.form;if(d instanceof HTMLFormElement){const h=ts(()=>f(g.current),"reset");return d.addEventListener("reset",h),()=>d.removeEventListener("reset",h)}},[s,o,f]),$.jsx(Oe.button,{type:"button",role:"switch","aria-checked":c,"aria-required":u,"data-state":Xu(c),"data-disabled":l?"":void 0,disabled:l,value:i,...n,ref:k,onClick:_e(a,d=>{const h=d.isPropagationStopped();v({requestedChecked:!c,hasConsumerStoppedPropagation:h}),f(y=>!y),b&&x&&(h||d.stopPropagation())})})},"SwitchTrigger")),Xv=N.forwardRef(ts(function(t,a){const{__scopeSwitch:n,name:r,checked:s,defaultChecked:o,required:i,disabled:l,value:c,onCheckedChange:u,form:p,...f}=t;return $.jsx(Qv,{__scopeSwitch:n,checked:s,defaultChecked:o,disabled:l,required:i,onCheckedChange:u,name:r,form:p,value:c,internal_do_not_use_render:({isFormControl:v})=>$.jsxs($.Fragment,{children:[$.jsx(RN,{...f,ref:a,__scopeSwitch:n}),v&&$.jsx(DN,{__scopeSwitch:n})]})})},"Switch")),AN="SwitchThumb",Zv=N.forwardRef(ts(function(t,a){const{__scopeSwitch:n,...r}=t,s=Qu(AN,n);return $.jsx(Oe.span,{"data-state":Xu(s.checked),"data-disabled":s.disabled?"":void 0,...r,ref:a})},"SwitchThumb")),jN="SwitchBubbleInput",DN=N.forwardRef(ts(function({__scopeSwitch:t,onClick:a,...n},r){const{control:s,userClick:o,checked:i,defaultChecked:l,required:c,disabled:u,name:p,value:f,form:v,bubbleInput:x,setBubbleInput:b}=Qu(jN,t),k=Ze(r,b),g=vl(s),d=N.useRef(!1),h=N.useRef(i),y=N.useRef(o),S=N.useRef(null);N.useEffect(()=>{const E=x;if(!E)return;const _=window.HTMLInputElement.prototype,j=Object.getOwnPropertyDescriptor(_,"checked").set;if(!j)return;const H=h.current!==i;h.current=i;const M=o!==null&&o!==y.current;if(y.current=o,M)S.current=H?null:o,H&&j.call(E,i),E.dispatchEvent(new Event("click",{bubbles:!o.hasConsumerStoppedPropagation}));else if(H){const P=S.current;S.current=null;const G=P?.requestedChecked===i;d.current=!0,j.call(E,i),E.dispatchEvent(new Event("click",{bubbles:!(G&&P.hasConsumerStoppedPropagation)})),d.current=!1}},[x,i,o]);const C=N.useRef(i);return $.jsx(Oe.input,{type:"checkbox","aria-hidden":!0,defaultChecked:l??C.current,required:c,disabled:u,name:p,value:f,form:v,...n,tabIndex:-1,ref:k,onClick:_e(a,E=>{d.current&&E.stopPropagation()}),style:{...n.style,...g,position:"absolute",pointerEvents:"none",opacity:0,margin:0,transform:"translateX(-100%)"}})},"SwitchBubbleInput"));function Jv(e){return typeof e=="function"}ts(Jv,"isFunction");function Xu(e){return e?"checked":"unchecked"}ts(Xu,"getState");var ON=Object.defineProperty,xn=(e,t)=>ON(e,"name",{value:t,configurable:!0}),Zu="Checkbox",[LN,ZE]=ba(Zu),[MN,Ju]=LN(Zu);function eb(e){const{__scopeCheckbox:t,checked:a,children:n,defaultChecked:r,disabled:s,form:o,name:i,onCheckedChange:l,required:c,value:u="on",internal_do_not_use_render:p}=e,[f,v]=_a({prop:a,defaultProp:r??!1,onChange:l,caller:Zu}),[x,b]=N.useState(null),[k,g]=N.useState(null),[d,h]=N.useState(null),y=x?!!o||!!x.closest("form"):!0,S={checked:f,disabled:s,setChecked:v,control:x,setControl:b,name:i,form:o,value:u,userClick:d,onUserClick:h,required:c,defaultChecked:Ia(r)?!1:r,isFormControl:y,bubbleInput:k,setBubbleInput:g};return $.jsx(MN,{scope:t,...S,children:tb(p)?p(S):n})}xn(eb,"CheckboxProvider");var zN="CheckboxTrigger",FN=N.forwardRef(xn(function({__scopeCheckbox:t,onKeyDown:a,onClick:n,...r},s){const{control:o,value:i,disabled:l,checked:c,required:u,setControl:p,setChecked:f,onUserClick:v,isFormControl:x,bubbleInput:b}=Ju(zN,t),k=Ze(s,p),g=N.useRef(c);return N.useEffect(()=>{const d=o?.form;if(d){const h=xn(()=>f(g.current),"reset");return d.addEventListener("reset",h),()=>d.removeEventListener("reset",h)}},[o,f]),$.jsx(Oe.button,{type:"button",role:"checkbox","aria-checked":Ia(c)?"mixed":c,"aria-required":u,"data-state":ep(c),"data-disabled":l?"":void 0,disabled:l,value:i,...r,ref:k,onKeyDown:_e(a,d=>{d.key==="Enter"&&d.preventDefault()}),onClick:_e(n,d=>{const h=d.isPropagationStopped();v({requestedChecked:Ia(c)?!0:!c,hasConsumerStoppedPropagation:h}),f(y=>Ia(y)?!0:!y),b&&x&&(h||d.stopPropagation())})})},"CheckboxTrigger")),BN=N.forwardRef(xn(function(t,a){const{__scopeCheckbox:n,name:r,checked:s,defaultChecked:o,required:i,disabled:l,value:c,onCheckedChange:u,form:p,...f}=t;return $.jsx(eb,{__scopeCheckbox:n,checked:s,defaultChecked:o,disabled:l,required:i,onCheckedChange:u,name:r,form:p,value:c,internal_do_not_use_render:({isFormControl:v})=>$.jsxs($.Fragment,{children:[$.jsx(FN,{...f,ref:a,__scopeCheckbox:n}),v&&$.jsx(WN,{__scopeCheckbox:n})]})})},"Checkbox")),UN="CheckboxIndicator",qN=N.forwardRef(xn(function(t,a){const{__scopeCheckbox:n,forceMount:r,...s}=t,o=Ju(UN,n);return $.jsx(es,{present:r||Ia(o.checked)||o.checked===!0,children:$.jsx(Oe.span,{"data-state":ep(o.checked),"data-disabled":o.disabled?"":void 0,...s,ref:a,style:{pointerEvents:"none",...t.style}})})},"CheckboxIndicator")),VN="CheckboxBubbleInput",WN=N.forwardRef(xn(function({__scopeCheckbox:t,onClick:a,...n},r){const{control:s,userClick:o,checked:i,defaultChecked:l,required:c,disabled:u,name:p,value:f,form:v,bubbleInput:x,setBubbleInput:b}=Ju(VN,t),k=Ze(r,b),g=vl(s),d=N.useRef(!1),h=N.useRef(i),y=N.useRef(o),S=N.useRef(null);N.useEffect(()=>{const E=x;if(!E)return;const _=window.HTMLInputElement.prototype,j=Object.getOwnPropertyDescriptor(_,"checked").set;if(!j)return;const H=h.current!==i;h.current=i;const M=o!==null&&o!==y.current;if(y.current=o,M)S.current=H?null:o,H&&(E.indeterminate=Ia(i),j.call(E,Ia(i)?!1:i)),E.dispatchEvent(new Event("click",{bubbles:!o.hasConsumerStoppedPropagation}));else if(H){const P=S.current;S.current=null;const G=P?.requestedChecked===i;d.current=!0,E.indeterminate=Ia(i),j.call(E,Ia(i)?!1:i),E.dispatchEvent(new Event("click",{bubbles:!(G&&P.hasConsumerStoppedPropagation)})),d.current=!1}},[x,i,o]);const C=N.useRef(Ia(i)?!1:i);return $.jsx(Oe.input,{type:"checkbox","aria-hidden":!0,defaultChecked:l??C.current,required:c,disabled:u,name:p,value:f,form:v,...n,tabIndex:-1,ref:k,onClick:_e(a,E=>{d.current&&E.stopPropagation()}),style:{...n.style,...g,position:"absolute",pointerEvents:"none",opacity:0,margin:0,transform:"translateX(-100%)"}})},"CheckboxBubbleInput"));function tb(e){return typeof e=="function"}xn(tb,"isFunction");function Ia(e){return e==="indeterminate"}xn(Ia,"isIndeterminate");function ep(e){return Ia(e)?"indeterminate":e?"checked":"unchecked"}xn(ep,"getState");var HN=Object.defineProperty,GN=(e,t)=>HN(e,"name",{value:t,configurable:!0}),KN=N.forwardRef(GN(function(t,a){return $.jsx(Oe.label,{...t,ref:a,onMouseDown:n=>{n.target.closest("button, input, select, textarea")||(t.onMouseDown?.(n),!n.defaultPrevented&&n.detail>1&&n.preventDefault())}})},"Label"));function ab(e){var t,a,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var r=e.length;for(t=0;t<r;t++)e[t]&&(a=ab(e[t]))&&(n&&(n+=" "),n+=a)}else for(a in e)e[a]&&(n&&(n+=" "),n+=a);return n}function nb(){for(var e,t,a=0,n="",r=arguments.length;a<r;a++)(e=arguments[a])&&(t=ab(e))&&(n&&(n+=" "),n+=t);return n}const sb=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,rb=nb,ob=(e,t)=>a=>{var n;if(t?.variants==null)return rb(e,a?.class,a?.className);const{variants:r,defaultVariants:s}=t,o=Object.keys(r).map(c=>{const u=a?.[c],p=s?.[c];if(u===null)return null;const f=sb(u)||sb(p);return r[c][f]}),i=a&&Object.entries(a).reduce((c,u)=>{let[p,f]=u;return f===void 0||(c[p]=f),c},{}),l=t==null||(n=t.compoundVariants)===null||n===void 0?void 0:n.reduce((c,u)=>{let{class:p,className:f,...v}=u;return Object.entries(v).every(x=>{let[b,k]=x;return Array.isArray(k)?k.includes({...s,...i}[b]):{...s,...i}[b]===k})?[...c,p,f]:c},[]);return rb(e,o,l,a?.class,a?.className)},tp="-",YN=e=>{const t=XN(e),{conflictingClassGroups:a,conflictingClassGroupModifiers:n}=e;return{getClassGroupId:o=>{const i=o.split(tp);return i[0]===""&&i.length!==1&&i.shift(),ib(i,t)||QN(o)},getConflictingClassGroupIds:(o,i)=>{const l=a[o]||[];return i&&n[o]?[...l,...n[o]]:l}}},ib=(e,t)=>{if(e.length===0)return t.classGroupId;const a=e[0],n=t.nextPart.get(a),r=n?ib(e.slice(1),n):void 0;if(r)return r;if(t.validators.length===0)return;const s=e.join(tp);return t.validators.find(({validator:o})=>o(s))?.classGroupId},lb=/^\[(.+)\]$/,QN=e=>{if(lb.test(e)){const t=lb.exec(e)[1],a=t?.substring(0,t.indexOf(":"));if(a)return"arbitrary.."+a}},XN=e=>{const{theme:t,prefix:a}=e,n={nextPart:new Map,validators:[]};return JN(Object.entries(e.classGroups),a).forEach(([s,o])=>{ap(o,n,s,t)}),n},ap=(e,t,a,n)=>{e.forEach(r=>{if(typeof r=="string"){const s=r===""?t:db(t,r);s.classGroupId=a;return}if(typeof r=="function"){if(ZN(r)){ap(r(n),t,a,n);return}t.validators.push({validator:r,classGroupId:a});return}Object.entries(r).forEach(([s,o])=>{ap(o,db(t,s),a,n)})})},db=(e,t)=>{let a=e;return t.split(tp).forEach(n=>{a.nextPart.has(n)||a.nextPart.set(n,{nextPart:new Map,validators:[]}),a=a.nextPart.get(n)}),a},ZN=e=>e.isThemeGetter,JN=(e,t)=>t?e.map(([a,n])=>{const r=n.map(s=>typeof s=="string"?t+s:typeof s=="object"?Object.fromEntries(Object.entries(s).map(([o,i])=>[t+o,i])):s);return[a,r]}):e,eS=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,a=new Map,n=new Map;const r=(s,o)=>{a.set(s,o),t++,t>e&&(t=0,n=a,a=new Map)};return{get(s){let o=a.get(s);if(o!==void 0)return o;if((o=n.get(s))!==void 0)return r(s,o),o},set(s,o){a.has(s)?a.set(s,o):r(s,o)}}},cb="!",tS=e=>{const{separator:t,experimentalParseClassName:a}=e,n=t.length===1,r=t[0],s=t.length,o=i=>{const l=[];let c=0,u=0,p;for(let k=0;k<i.length;k++){let g=i[k];if(c===0){if(g===r&&(n||i.slice(k,k+s)===t)){l.push(i.slice(u,k)),u=k+s;continue}if(g==="/"){p=k;continue}}g==="["?c++:g==="]"&&c--}const f=l.length===0?i:i.substring(u),v=f.startsWith(cb),x=v?f.substring(1):f,b=p&&p>u?p-u:void 0;return{modifiers:l,hasImportantModifier:v,baseClassName:x,maybePostfixModifierPosition:b}};return a?i=>a({className:i,parseClassName:o}):o},aS=e=>{if(e.length<=1)return e;const t=[];let a=[];return e.forEach(n=>{n[0]==="["?(t.push(...a.sort(),n),a=[]):a.push(n)}),t.push(...a.sort()),t},nS=e=>({cache:eS(e.cacheSize),parseClassName:tS(e),...YN(e)}),sS=/\s+/,rS=(e,t)=>{const{parseClassName:a,getClassGroupId:n,getConflictingClassGroupIds:r}=t,s=[],o=e.trim().split(sS);let i="";for(let l=o.length-1;l>=0;l-=1){const c=o[l],{modifiers:u,hasImportantModifier:p,baseClassName:f,maybePostfixModifierPosition:v}=a(c);let x=!!v,b=n(x?f.substring(0,v):f);if(!b){if(!x){i=c+(i.length>0?" "+i:i);continue}if(b=n(f),!b){i=c+(i.length>0?" "+i:i);continue}x=!1}const k=aS(u).join(":"),g=p?k+cb:k,d=g+b;if(s.includes(d))continue;s.push(d);const h=r(b,x);for(let y=0;y<h.length;++y){const S=h[y];s.push(g+S)}i=c+(i.length>0?" "+i:i)}return i};function oS(){let e=0,t,a,n="";for(;e<arguments.length;)(t=arguments[e++])&&(a=ub(t))&&(n&&(n+=" "),n+=a);return n}const ub=e=>{if(typeof e=="string")return e;let t,a="";for(let n=0;n<e.length;n++)e[n]&&(t=ub(e[n]))&&(a&&(a+=" "),a+=t);return a};function iS(e,...t){let a,n,r,s=o;function o(l){const c=t.reduce((u,p)=>p(u),e());return a=nS(c),n=a.cache.get,r=a.cache.set,s=i,i(l)}function i(l){const c=n(l);if(c)return c;const u=rS(l,a);return r(l,u),u}return function(){return s(oS.apply(null,arguments))}}const dt=e=>{const t=a=>a[e]||[];return t.isThemeGetter=!0,t},pb=/^\[(?:([a-z-]+):)?(.+)\]$/i,lS=/^\d+\/\d+$/,dS=new Set(["px","full","screen"]),cS=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,uS=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,pS=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,fS=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,mS=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,wn=e=>br(e)||dS.has(e)||lS.test(e),as=e=>yr(e,"length",kS),br=e=>!!e&&!Number.isNaN(Number(e)),np=e=>yr(e,"number",br),Co=e=>!!e&&Number.isInteger(Number(e)),gS=e=>e.endsWith("%")&&br(e.slice(0,-1)),Ae=e=>pb.test(e),ns=e=>cS.test(e),hS=new Set(["length","size","percentage"]),vS=e=>yr(e,hS,fb),bS=e=>yr(e,"position",fb),yS=new Set(["image","url"]),xS=e=>yr(e,yS,SS),wS=e=>yr(e,"",NS),Eo=()=>!0,yr=(e,t,a)=>{const n=pb.exec(e);return n?n[1]?typeof t=="string"?n[1]===t:t.has(n[1]):a(n[2]):!1},kS=e=>uS.test(e)&&!pS.test(e),fb=()=>!1,NS=e=>fS.test(e),SS=e=>mS.test(e),CS=iS(()=>{const e=dt("colors"),t=dt("spacing"),a=dt("blur"),n=dt("brightness"),r=dt("borderColor"),s=dt("borderRadius"),o=dt("borderSpacing"),i=dt("borderWidth"),l=dt("contrast"),c=dt("grayscale"),u=dt("hueRotate"),p=dt("invert"),f=dt("gap"),v=dt("gradientColorStops"),x=dt("gradientColorStopPositions"),b=dt("inset"),k=dt("margin"),g=dt("opacity"),d=dt("padding"),h=dt("saturate"),y=dt("scale"),S=dt("sepia"),C=dt("skew"),E=dt("space"),_=dt("translate"),I=()=>["auto","contain","none"],j=()=>["auto","hidden","clip","visible","scroll"],H=()=>["auto",Ae,t],M=()=>[Ae,t],P=()=>["",wn,as],G=()=>["auto",br,Ae],J=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],q=()=>["solid","dashed","dotted","double","none"],B=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],L=()=>["start","end","center","between","around","evenly","stretch"],w=()=>["","0",Ae],T=()=>["auto","avoid","all","avoid-page","page","left","right","column"],Q=()=>[br,Ae];return{cacheSize:500,separator:":",theme:{colors:[Eo],spacing:[wn,as],blur:["none","",ns,Ae],brightness:Q(),borderColor:[e],borderRadius:["none","","full",ns,Ae],borderSpacing:M(),borderWidth:P(),contrast:Q(),grayscale:w(),hueRotate:Q(),invert:w(),gap:M(),gradientColorStops:[e],gradientColorStopPositions:[gS,as],inset:H(),margin:H(),opacity:Q(),padding:M(),saturate:Q(),scale:Q(),sepia:w(),skew:Q(),space:M(),translate:M()},classGroups:{aspect:[{aspect:["auto","square","video",Ae]}],container:["container"],columns:[{columns:[ns]}],"break-after":[{"break-after":T()}],"break-before":[{"break-before":T()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...J(),Ae]}],overflow:[{overflow:j()}],"overflow-x":[{"overflow-x":j()}],"overflow-y":[{"overflow-y":j()}],overscroll:[{overscroll:I()}],"overscroll-x":[{"overscroll-x":I()}],"overscroll-y":[{"overscroll-y":I()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[b]}],"inset-x":[{"inset-x":[b]}],"inset-y":[{"inset-y":[b]}],start:[{start:[b]}],end:[{end:[b]}],top:[{top:[b]}],right:[{right:[b]}],bottom:[{bottom:[b]}],left:[{left:[b]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",Co,Ae]}],basis:[{basis:H()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",Ae]}],grow:[{grow:w()}],shrink:[{shrink:w()}],order:[{order:["first","last","none",Co,Ae]}],"grid-cols":[{"grid-cols":[Eo]}],"col-start-end":[{col:["auto",{span:["full",Co,Ae]},Ae]}],"col-start":[{"col-start":G()}],"col-end":[{"col-end":G()}],"grid-rows":[{"grid-rows":[Eo]}],"row-start-end":[{row:["auto",{span:[Co,Ae]},Ae]}],"row-start":[{"row-start":G()}],"row-end":[{"row-end":G()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",Ae]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",Ae]}],gap:[{gap:[f]}],"gap-x":[{"gap-x":[f]}],"gap-y":[{"gap-y":[f]}],"justify-content":[{justify:["normal",...L()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...L(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...L(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[d]}],px:[{px:[d]}],py:[{py:[d]}],ps:[{ps:[d]}],pe:[{pe:[d]}],pt:[{pt:[d]}],pr:[{pr:[d]}],pb:[{pb:[d]}],pl:[{pl:[d]}],m:[{m:[k]}],mx:[{mx:[k]}],my:[{my:[k]}],ms:[{ms:[k]}],me:[{me:[k]}],mt:[{mt:[k]}],mr:[{mr:[k]}],mb:[{mb:[k]}],ml:[{ml:[k]}],"space-x":[{"space-x":[E]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[E]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",Ae,t]}],"min-w":[{"min-w":[Ae,t,"min","max","fit"]}],"max-w":[{"max-w":[Ae,t,"none","full","min","max","fit","prose",{screen:[ns]},ns]}],h:[{h:[Ae,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[Ae,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[Ae,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[Ae,t,"auto","min","max","fit"]}],"font-size":[{text:["base",ns,as]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",np]}],"font-family":[{font:[Eo]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",Ae]}],"line-clamp":[{"line-clamp":["none",br,np]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",wn,Ae]}],"list-image":[{"list-image":["none",Ae]}],"list-style-type":[{list:["none","disc","decimal",Ae]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[g]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[g]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...q(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",wn,as]}],"underline-offset":[{"underline-offset":["auto",wn,Ae]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:M()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",Ae]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",Ae]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[g]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...J(),bS]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",vS]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},xS]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[x]}],"gradient-via-pos":[{via:[x]}],"gradient-to-pos":[{to:[x]}],"gradient-from":[{from:[v]}],"gradient-via":[{via:[v]}],"gradient-to":[{to:[v]}],rounded:[{rounded:[s]}],"rounded-s":[{"rounded-s":[s]}],"rounded-e":[{"rounded-e":[s]}],"rounded-t":[{"rounded-t":[s]}],"rounded-r":[{"rounded-r":[s]}],"rounded-b":[{"rounded-b":[s]}],"rounded-l":[{"rounded-l":[s]}],"rounded-ss":[{"rounded-ss":[s]}],"rounded-se":[{"rounded-se":[s]}],"rounded-ee":[{"rounded-ee":[s]}],"rounded-es":[{"rounded-es":[s]}],"rounded-tl":[{"rounded-tl":[s]}],"rounded-tr":[{"rounded-tr":[s]}],"rounded-br":[{"rounded-br":[s]}],"rounded-bl":[{"rounded-bl":[s]}],"border-w":[{border:[i]}],"border-w-x":[{"border-x":[i]}],"border-w-y":[{"border-y":[i]}],"border-w-s":[{"border-s":[i]}],"border-w-e":[{"border-e":[i]}],"border-w-t":[{"border-t":[i]}],"border-w-r":[{"border-r":[i]}],"border-w-b":[{"border-b":[i]}],"border-w-l":[{"border-l":[i]}],"border-opacity":[{"border-opacity":[g]}],"border-style":[{border:[...q(),"hidden"]}],"divide-x":[{"divide-x":[i]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[i]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[g]}],"divide-style":[{divide:q()}],"border-color":[{border:[r]}],"border-color-x":[{"border-x":[r]}],"border-color-y":[{"border-y":[r]}],"border-color-s":[{"border-s":[r]}],"border-color-e":[{"border-e":[r]}],"border-color-t":[{"border-t":[r]}],"border-color-r":[{"border-r":[r]}],"border-color-b":[{"border-b":[r]}],"border-color-l":[{"border-l":[r]}],"divide-color":[{divide:[r]}],"outline-style":[{outline:["",...q()]}],"outline-offset":[{"outline-offset":[wn,Ae]}],"outline-w":[{outline:[wn,as]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:P()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[g]}],"ring-offset-w":[{"ring-offset":[wn,as]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",ns,wS]}],"shadow-color":[{shadow:[Eo]}],opacity:[{opacity:[g]}],"mix-blend":[{"mix-blend":[...B(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":B()}],filter:[{filter:["","none"]}],blur:[{blur:[a]}],brightness:[{brightness:[n]}],contrast:[{contrast:[l]}],"drop-shadow":[{"drop-shadow":["","none",ns,Ae]}],grayscale:[{grayscale:[c]}],"hue-rotate":[{"hue-rotate":[u]}],invert:[{invert:[p]}],saturate:[{saturate:[h]}],sepia:[{sepia:[S]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[a]}],"backdrop-brightness":[{"backdrop-brightness":[n]}],"backdrop-contrast":[{"backdrop-contrast":[l]}],"backdrop-grayscale":[{"backdrop-grayscale":[c]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[u]}],"backdrop-invert":[{"backdrop-invert":[p]}],"backdrop-opacity":[{"backdrop-opacity":[g]}],"backdrop-saturate":[{"backdrop-saturate":[h]}],"backdrop-sepia":[{"backdrop-sepia":[S]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[o]}],"border-spacing-x":[{"border-spacing-x":[o]}],"border-spacing-y":[{"border-spacing-y":[o]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",Ae]}],duration:[{duration:Q()}],ease:[{ease:["linear","in","out","in-out",Ae]}],delay:[{delay:Q()}],animate:[{animate:["none","spin","ping","pulse","bounce",Ae]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[y]}],"scale-x":[{"scale-x":[y]}],"scale-y":[{"scale-y":[y]}],rotate:[{rotate:[Co,Ae]}],"translate-x":[{"translate-x":[_]}],"translate-y":[{"translate-y":[_]}],"skew-x":[{"skew-x":[C]}],"skew-y":[{"skew-y":[C]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",Ae]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",Ae]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":M()}],"scroll-mx":[{"scroll-mx":M()}],"scroll-my":[{"scroll-my":M()}],"scroll-ms":[{"scroll-ms":M()}],"scroll-me":[{"scroll-me":M()}],"scroll-mt":[{"scroll-mt":M()}],"scroll-mr":[{"scroll-mr":M()}],"scroll-mb":[{"scroll-mb":M()}],"scroll-ml":[{"scroll-ml":M()}],"scroll-p":[{"scroll-p":M()}],"scroll-px":[{"scroll-px":M()}],"scroll-py":[{"scroll-py":M()}],"scroll-ps":[{"scroll-ps":M()}],"scroll-pe":[{"scroll-pe":M()}],"scroll-pt":[{"scroll-pt":M()}],"scroll-pr":[{"scroll-pr":M()}],"scroll-pb":[{"scroll-pb":M()}],"scroll-pl":[{"scroll-pl":M()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",Ae]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[wn,as,np]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}});function pt(...e){return CS(nb(e))}function xr(){if(typeof document>"u")return;const e=document.querySelector("[data-dsh-studio]:not([data-dsh-studio-portal])"),t=e&&e.getAttribute("data-theme")==="dark"?"dark":"light";let a=document.querySelector("[data-dsh-studio-portal]");return a===null&&(a=document.createElement("div"),a.setAttribute("data-dsh-studio-portal",""),a.setAttribute("data-dsh-studio",""),document.body.appendChild(a)),a.setAttribute("data-dsh-studio",""),a.setAttribute("data-theme",t),a}const ES=ob("inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium outline-none transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50",{variants:{variant:{default:"bg-primary text-primary-foreground shadow-sm hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90 focus-visible:ring-destructive/20",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9"}},defaultVariants:{variant:"default",size:"default"}}),wr=N.forwardRef(({className:e,variant:t,size:a,asChild:n=!1,...r},s)=>{const o=n?E1:"button";return $.jsx(o,{className:pt(ES({variant:t,size:a,className:e})),ref:s,...r})});wr.displayName="Button";const bl=N.forwardRef(({className:e,type:t,...a},n)=>$.jsx("input",{type:t,className:pt("flex h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm outline-none transition-[color,box-shadow] selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive",e),ref:n,...a}));bl.displayName="Input";const mb=N.forwardRef(({className:e,...t},a)=>$.jsx("textarea",{className:pt("flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm outline-none transition-[color,box-shadow] placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50 md:text-sm focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive",e),ref:a,...t}));mb.displayName="Textarea";const yl=N.forwardRef(({className:e,...t},a)=>$.jsx(KN,{ref:a,className:pt("flex items-center gap-2 text-sm leading-none font-medium select-none",e),...t}));yl.displayName="Label";const gb=N.forwardRef(({className:e,...t},a)=>$.jsx("div",{ref:a,className:pt("flex flex-col gap-6 rounded-xl border border-border bg-card py-6 text-card-foreground shadow-sm",e),...t}));gb.displayName="Card";const $S=({className:e,...t})=>$.jsx("div",{className:pt("grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6",e),...t}),TS=({className:e,...t})=>$.jsx("div",{className:pt("leading-none font-semibold",e),...t}),PS=({className:e,...t})=>$.jsx("div",{className:pt("px-6",e),...t}),_S=({className:e,...t})=>$.jsx("div",{className:pt("flex items-center px-6 [.border-t]:pt-6",e),...t}),IS=ob("inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-md border px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [&>svg]:pointer-events-none [&>svg]:size-3",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground",secondary:"border-transparent bg-secondary text-secondary-foreground",destructive:"border-transparent bg-destructive text-destructive-foreground shadow",outline:"text-foreground"}},defaultVariants:{variant:"default"}}),RS=({className:e,variant:t,...a})=>$.jsx("div",{className:pt(IS({variant:t}),e),...a}),sp=yN,xl=N.forwardRef(({className:e,...t},a)=>$.jsx(wN,{ref:a,className:pt("inline-flex w-fit items-center justify-center rounded-lg bg-muted p-[3px] text-muted-foreground data-[orientation=horizontal]:h-8 data-[orientation=vertical]:h-fit data-[orientation=vertical]:flex-col",e),...t}));xl.displayName="TabsList";const $o=N.forwardRef(({className:e,...t},a)=>$.jsx(NN,{ref:a,className:pt("relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 whitespace-nowrap rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium text-foreground/60 transition-all hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm dark:text-muted-foreground dark:hover:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 dark:data-[state=active]:text-foreground",e),...t}));$o.displayName="TabsTrigger";const AS=N.forwardRef(({className:e,...t},a)=>$.jsx(CN,{ref:a,className:pt("mt-3 focus-visible:outline-none",e),...t}));AS.displayName="TabsContent";const jS=({...e})=>$.jsx(Ru,{container:xr(),...e}),hb=N.forwardRef(({className:e,...t},a)=>$.jsx(ju,{ref:a,className:pt("fixed inset-0 z-[95] bg-black/50",e),...t}));hb.displayName="DialogOverlay";const DS=N.forwardRef(({className:e,children:t,...a},n)=>$.jsxs(jS,{children:[$.jsx(hb,{}),$.jsxs(Du,{ref:n,className:pt("fixed left-[50%] top-[50%] z-[96] grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border border-border bg-card p-6 text-card-foreground shadow-lg sm:max-w-lg",e),...a,children:[t,$.jsxs(Pv,{className:"absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring",children:[$.jsx(yh,{className:"h-4 w-4"}),$.jsx("span",{className:"sr-only",children:"关闭"})]})]})]}));DS.displayName="DialogContent";const OS=N.forwardRef(({className:e,...t},a)=>$.jsx(Ou,{ref:a,className:pt("text-base font-semibold leading-none tracking-tight",e),...t}));OS.displayName="DialogTitle";const LS=N.forwardRef(({className:e,...t},a)=>$.jsx(Tv,{ref:a,className:pt("text-sm text-muted-foreground",e),...t}));LS.displayName="DialogDescription";const MS=N.forwardRef(({className:e,...t},a)=>$.jsx(Xv,{className:pt("peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",e),...t,ref:a,children:$.jsx(Zv,{className:"pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0"})}));MS.displayName="Switch";const zS=N.forwardRef(({className:e,...t},a)=>$.jsx(BN,{ref:a,className:pt("peer h-4 w-4 shrink-0 rounded-sm border border-input shadow focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",e),...t,children:$.jsx(qN,{className:pt("flex items-center justify-center text-current"),children:$.jsx(bh,{className:"h-3.5 w-3.5"})})}));zS.displayName="Checkbox";const FS="dsh-studio:session",BS="dsh-studio:auth-user",US="dsh-studio:user";function rp(e,t){try{t==null||t===""?window.localStorage.removeItem(e):window.localStorage.setItem(e,t)}catch{}}async function qS(e){const t=await fetch("/studio-api/auth/login",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)}),a=await t.json().catch(()=>({}));if(!t.ok||a.ok!==!0)throw new Error(String(a.error??`登录失败(HTTP ${t.status})`));return a}function VS({config:e,theme:t,message:a,onDone:n,onClose:r,overlay:s}){const o=String(e?.localAuth?.username??"admin"),i=e?.localAuth?.enabled!==!1,l=e?.ldap?.enabled===!0,[c,u]=N.useState(l?"ldap":"local"),[p,f]=N.useState(l?"":o),[v,x]=N.useState(""),[b,k]=N.useState(!1),[g,d]=N.useState(String(a??"")),[h,y]=N.useState(!1),S=N.useRef(null),C=N.useRef(null);N.useEffect(()=>{const M=window.setTimeout(()=>{c==="local"?S.current?.focus():C.current?.focus()},30);return()=>window.clearTimeout(M)},[c]);const E=M=>{M!==c&&(u(M),d(""),x(""),f(M==="local"?o:""))},_=async M=>{if(M&&M.preventDefault(),!b){if(p.trim()===""||v===""){d(c==="local"?"本地账号和密码都要填":"域账号和密码都要填");return}k(!0),d("");try{const P=await qS({username:p.trim().normalize("NFKC"),password:v.normalize("NFKC"),mode:c});rp(FS,P.token),rp(BS,JSON.stringify(P.user??null)),rp(US,String(P.user?.name??P.user?.id??p.trim())),x(""),n()}catch(P){d(P instanceof Error?P.message:String(P))}finally{k(!1)}}},I=String(e?.board?.title??"工作空间"),j=/LDAP|域|目录|连不上/.test(g),H=$.jsxs(gb,{className:"w-[380px] shrink-0 py-0 shadow-md",children:[$.jsx($S,{className:"gap-2 px-5 pb-4 pt-5",children:$.jsxs("div",{className:"flex items-center gap-2",children:[$.jsx("span",{className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-lg bg-primary text-[13px] leading-none text-primary-foreground","aria-hidden":!0,children:"◈"}),$.jsxs("div",{className:"min-w-0",children:[$.jsx(TS,{className:"truncate text-[15px] leading-tight",children:I}),$.jsx("div",{className:"text-[11px] leading-tight text-muted-foreground",children:"需求与任务工作空间"})]})]})}),$.jsxs(PS,{className:"px-5 pb-0",children:[$.jsx(sp,{value:c,onValueChange:E,children:$.jsxs(xl,{className:"w-full",children:[$.jsx($o,{value:"ldap",disabled:!l,className:"flex-1 text-[13px]",children:"LDAP 账号"}),$.jsx($o,{value:"local",disabled:!i,className:"flex-1 text-[13px]",children:"本地超管"})]})}),$.jsx("p",{className:"mb-3 mt-3 text-[12px] leading-relaxed text-muted-foreground",children:c==="ldap"?"用公司目录账号登录,登录后写操作与审计都记在这个名字下。":`用平台自带的超管账号登录。默认 ${o} / admin,改过之后用新口令。`}),$.jsxs("form",{className:"grid w-full max-w-full gap-3",onSubmit:_,children:[$.jsxs("div",{className:"grid min-w-0 gap-1.5",children:[$.jsx(yl,{htmlFor:"studio-account",className:"text-[12px] text-muted-foreground",children:c==="local"?"超管账号":"域账号"}),$.jsx(bl,{id:"studio-account",ref:C,name:"studio-account",autoComplete:"off",spellCheck:!1,className:"box-border h-9 w-full min-w-0 text-[13px]",value:p,placeholder:c==="local"?o:"域账号",onChange:M=>f(M.target.value)})]}),$.jsxs("div",{className:"grid min-w-0 gap-1.5",children:[$.jsx(yl,{htmlFor:"studio-pass",className:"text-[12px] text-muted-foreground",children:"密码"}),$.jsxs("div",{className:"relative min-w-0",children:[$.jsx(bl,{id:"studio-pass",ref:S,type:h?"text":"password",name:"studio-pass",autoComplete:"new-password",className:"box-border h-9 w-full min-w-0 pr-9 text-[13px]",value:v,placeholder:c==="local"?"默认口令 admin":"域密码",onChange:M=>x(M.target.value)}),$.jsx("button",{type:"button","aria-label":h?"隐藏密码":"显示密码",title:h?"隐藏密码":"显示密码(看清是不是被输入法打成了全角)",onClick:()=>y(M=>!M),className:"absolute right-1 top-1 flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground hover:bg-muted hover:text-foreground",children:h?$.jsx(k1,{size:14}):$.jsx(N1,{size:14})})]})]}),g===""?null:$.jsxs("div",{className:"flex items-start gap-1.5 rounded-md border border-destructive/35 bg-destructive/5 px-2.5 py-2 text-[12px] leading-relaxed text-destructive",children:[$.jsx("span",{"aria-hidden":!0,children:"!"}),$.jsx("span",{className:"min-w-0 break-words",children:g})]}),j?$.jsx("div",{className:"text-[11px] leading-relaxed text-muted-foreground",children:"连不上目录服务时,切到「本地超管」用平台账号进来;网络打通后再用域账号。"}):null,$.jsx(wr,{type:"submit",disabled:b,className:"h-9 w-full text-[13px]",children:b?"登录中…":c==="local"?"登录(本地超管)":"登录(LDAP)"})]})]}),$.jsxs(_S,{className:"mt-4 flex flex-col items-stretch gap-2 border-t border-border px-5 py-3",children:[$.jsx("div",{className:"truncate text-[11px] leading-relaxed text-muted-foreground",title:c==="ldap"?`${e?.ldap?.url??"—"} · BASE ${e?.ldap?.baseDN??"—"}`:"",children:c==="ldap"?`${e?.ldap?.url??"—"} · BASE ${e?.ldap?.baseDN??"—"}`:"口令以 scrypt 哈希存在服务端,改密码在「设置 → 统一登录(LDAP)」"}),$.jsxs("div",{className:"flex items-center justify-between",children:[$.jsx("span",{className:"text-[11px] text-muted-foreground",children:c==="local"?"回车即登录":"账号是域账号,不是邮箱"}),typeof r=="function"?$.jsx(wr,{type:"button",variant:"ghost",size:"sm",className:"h-7 px-2 text-[12px]",onClick:()=>r(),children:"先不登录"}):null]})]})]});return s===!0?$.jsx("div",{className:"fixed inset-0 z-[90] flex items-center justify-center bg-background/70 p-4 backdrop-blur-sm",children:H}):$.jsx("div",{"data-dsh-studio":"","data-theme":t,className:"dsh-studio-fill",children:$.jsx("div",{className:"flex min-h-full w-full items-center justify-center px-6 py-10",children:H})})}var WS=Object.defineProperty,HS=(e,t)=>WS(e,"name",{value:t,configurable:!0}),GS="Toggle",KS=N.forwardRef(HS(function(t,a){const{pressed:n,defaultPressed:r,onPressedChange:s,...o}=t,[i,l]=_a({prop:n,onChange:s,defaultProp:r??!1,caller:GS});return $.jsx(Oe.button,{type:"button","aria-pressed":i,"data-state":i?"on":"off","data-disabled":t.disabled?"":void 0,...o,ref:a,onClick:_e(t.onClick,()=>{t.disabled||l(!i)})})},"Toggle")),YS=Object.defineProperty,ss=(e,t)=>YS(e,"name",{value:t,configurable:!0}),kr="ToggleGroup",To={Single:"single",Multiple:"multiple"},[vb,e$]=ba(kr,[hl]),bb=hl(),QS=N.forwardRef(ss(function(t,a){const{type:n,...r}=t;if(n===To.Single){const s=r;return $.jsx(XS,{role:"radiogroup",...s,ref:a})}if(n===To.Multiple){const s=r;return $.jsx(ZS,{role:"toolbar",...s,ref:a})}throw new Error(`Missing prop \`type\` expected on \`${kr}\``)},"ToggleGroup")),[yb,xb]=vb(kr),XS=N.forwardRef(ss(function(t,a){const{value:n,defaultValue:r,onValueChange:s=ss(()=>{},"onValueChange"),...o}=t,[i,l]=_a({prop:n,defaultProp:r??"",onChange:s,caller:kr});return $.jsx(yb,{scope:t.__scopeToggleGroup,type:To.Single,value:N.useMemo(()=>i?[i]:[],[i]),onItemActivate:l,onItemDeactivate:N.useCallback(()=>l(""),[l]),children:$.jsx(wb,{...o,ref:a})})},"ToggleGroupImplSingle")),ZS=N.forwardRef(ss(function(t,a){const{value:n,defaultValue:r,onValueChange:s=ss(()=>{},"onValueChange"),...o}=t,[i,l]=_a({prop:n,defaultProp:r??[],onChange:s,caller:kr}),c=N.useCallback(p=>l((f=[])=>[...f,p]),[l]),u=N.useCallback(p=>l((f=[])=>f.filter(v=>v!==p)),[l]);return $.jsx(yb,{scope:t.__scopeToggleGroup,type:To.Multiple,value:i,onItemActivate:c,onItemDeactivate:u,children:$.jsx(wb,{...o,ref:a})})},"ToggleGroupImplMultiple")),[JS,eC]=vb(kr),wb=N.forwardRef(ss(function(t,a){const{__scopeToggleGroup:n,disabled:r=!1,rovingFocus:s=!0,orientation:o,dir:i,loop:l=!0,...c}=t,u=bb(n),p=So(i),f={dir:p,...c};return $.jsx(JS,{scope:n,rovingFocus:s,disabled:r,children:s?$.jsx(qv,{asChild:!0,...u,orientation:o,dir:p,loop:l,children:$.jsx(Oe.div,{...f,ref:a})}):$.jsx(Oe.div,{...f,ref:a})})},"ToggleGroupImpl")),op="ToggleGroupItem",tC=N.forwardRef(ss(function(t,a){const n=xb(op,t.__scopeToggleGroup),r=eC(op,t.__scopeToggleGroup),s=bb(t.__scopeToggleGroup),o=n.value.includes(t.value),i=r.disabled||t.disabled,l={...t,pressed:o,disabled:i},c=N.useRef(null);return r.rovingFocus?$.jsx(Vv,{asChild:!0,...s,focusable:!i,active:o,ref:c,children:$.jsx(kb,{...l,ref:a})}):$.jsx(kb,{...l,ref:a})},"ToggleGroupItem")),kb=N.forwardRef(ss(function(t,a){const{__scopeToggleGroup:n,value:r,...s}=t,o=xb(op,n),i={role:"radio","aria-checked":t.pressed,"aria-pressed":void 0},l=o.type===To.Single?i:void 0;return $.jsx(KS,{...l,...s,ref:a,onPressedChange:c=>{c?o.onItemActivate(r):o.onItemDeactivate(r)}})},"ToggleGroupItemImpl")),aC=Object.defineProperty,nC=(e,t)=>aC(e,"name",{value:t,configurable:!0});function ip(e,[t,a]){return Math.min(a,Math.max(t,e))}nC(ip,"clamp");const sC=["top","right","bottom","left"],rs=Math.min,kn=Math.max,wl=Math.round,kl=Math.floor,Nn=e=>({x:e,y:e}),rC={left:"right",right:"left",bottom:"top",top:"bottom"};function Nb(e,t,a){return kn(e,rs(t,a))}function Sn(e,t){return typeof e=="function"?e(t):e}function os(e){return e.split("-")[0]}function Nr(e){return e.split("-")[1]}function lp(e){return e==="x"?"y":"x"}function dp(e){return e==="y"?"height":"width"}function Ja(e){const t=e[0];return t==="t"||t==="b"?"y":"x"}function cp(e){return lp(Ja(e))}function oC(e,t,a){a===void 0&&(a=!1);const n=Nr(e),r=cp(e),s=dp(r);let o=r==="x"?n===(a?"end":"start")?"right":"left":n==="start"?"bottom":"top";return t.reference[s]>t.floating[s]&&(o=Nl(o)),[o,Nl(o)]}function iC(e){const t=Nl(e);return[up(e),t,up(t)]}function up(e){return e.includes("start")?e.replace("start","end"):e.replace("end","start")}const Sb=["left","right"],Cb=["right","left"],lC=["top","bottom"],dC=["bottom","top"];function cC(e,t,a){switch(e){case"top":case"bottom":return a?t?Cb:Sb:t?Sb:Cb;case"left":case"right":return t?lC:dC;default:return[]}}function uC(e,t,a,n){const r=Nr(e);let s=cC(os(e),a==="start",n);return r&&(s=s.map(o=>o+"-"+r),t&&(s=s.concat(s.map(up)))),s}function Nl(e){const t=os(e);return rC[t]+e.slice(t.length)}function pC(e){var t,a,n,r;return{top:(t=e.top)!=null?t:0,right:(a=e.right)!=null?a:0,bottom:(n=e.bottom)!=null?n:0,left:(r=e.left)!=null?r:0}}function Eb(e){return typeof e!="number"?pC(e):{top:e,right:e,bottom:e,left:e}}function Sl(e){const{x:t,y:a,width:n,height:r}=e;return{width:n,height:r,top:a,left:t,right:t+n,bottom:a+r,x:t,y:a}}function $b(e,t,a){let{reference:n,floating:r}=e;const s=Ja(t),o=cp(t),i=dp(o),l=os(t),c=s==="y",u=n.x+n.width/2-r.width/2,p=n.y+n.height/2-r.height/2,f=n[i]/2-r[i]/2;let v;switch(l){case"top":v={x:u,y:n.y-r.height};break;case"bottom":v={x:u,y:n.y+n.height};break;case"right":v={x:n.x+n.width,y:p};break;case"left":v={x:n.x-r.width,y:p};break;default:v={x:n.x,y:n.y}}const x=Nr(t);return x&&(v[o]+=f*(x==="end"?1:-1)*(a&&c?-1:1)),v}async function fC(e,t){var a;t===void 0&&(t={});const{x:n,y:r,platform:s,rects:o,elements:i,strategy:l}=e,{boundary:c="clippingAncestors",rootBoundary:u="viewport",elementContext:p="floating",altBoundary:f=!1,padding:v=0}=Sn(t,e),x=Eb(v),k=i[f?p==="floating"?"reference":"floating":p],g=Sl(await s.getClippingRect({element:(a=await(s.isElement==null?void 0:s.isElement(k)))==null||a?k:k.contextElement||await(s.getDocumentElement==null?void 0:s.getDocumentElement(i.floating)),boundary:c,rootBoundary:u,strategy:l})),d=p==="floating"?{x:n,y:r,width:o.floating.width,height:o.floating.height}:o.reference,h=await(s.getOffsetParent==null?void 0:s.getOffsetParent(i.floating)),y=await(s.isElement==null?void 0:s.isElement(h))&&await(s.getScale==null?void 0:s.getScale(h))||{x:1,y:1},S=Sl(s.convertOffsetParentRelativeRectToViewportRelativeRect?await s.convertOffsetParentRelativeRectToViewportRelativeRect({elements:i,rect:d,offsetParent:h,strategy:l}):d);return{top:(g.top-S.top+x.top)/y.y,bottom:(S.bottom-g.bottom+x.bottom)/y.y,left:(g.left-S.left+x.left)/y.x,right:(S.right-g.right+x.right)/y.x}}const mC=50,gC=async(e,t,a)=>{const{placement:n="bottom",strategy:r="absolute",middleware:s=[],platform:o}=a,i=o.detectOverflow?o:{...o,detectOverflow:fC},l=await(o.isRTL==null?void 0:o.isRTL(t));let c=await o.getElementRects({reference:e,floating:t,strategy:r}),{x:u,y:p}=$b(c,n,l),f=n,v=0;const x={};for(let b=0;b<s.length;b++){const k=s[b];if(!k)continue;const{name:g,fn:d}=k,{x:h,y,data:S,reset:C}=await d({x:u,y:p,initialPlacement:n,placement:f,strategy:r,middlewareData:x,rects:c,platform:i,elements:{reference:e,floating:t}});u=h??u,p=y??p,x[g]={...x[g],...S},C&&v<mC&&(v++,typeof C=="object"&&(C.placement&&(f=C.placement),C.rects&&(c=C.rects===!0?await o.getElementRects({reference:e,floating:t,strategy:r}):C.rects),{x:u,y:p}=$b(c,f,l)),b=-1)}return{x:u,y:p,placement:f,strategy:r,middlewareData:x}},hC=e=>({name:"arrow",options:e,async fn(t){const{x:a,y:n,placement:r,rects:s,platform:o,elements:i,middlewareData:l}=t,{element:c,padding:u=0}=Sn(e,t)||{};if(c==null)return{};const p=Eb(u),f={x:a,y:n},v=cp(r),x=dp(v),b=await o.getDimensions(c),k=v==="y",g=k?"top":"left",d=k?"bottom":"right",h=k?"clientHeight":"clientWidth",y=s.reference[x]+s.reference[v]-f[v]-s.floating[x],S=f[v]-s.reference[v],C=await(o.getOffsetParent==null?void 0:o.getOffsetParent(c));let E=C?C[h]:0;(!E||!await(o.isElement==null?void 0:o.isElement(C)))&&(E=i.floating[h]||s.floating[x]);const _=y/2-S/2,I=E/2-b[x]/2-1,j=rs(p[g],I),H=rs(p[d],I),M=E-b[x]-H,P=E/2-b[x]/2+_,G=Nb(j,P,M),J=!l.arrow&&Nr(r)!=null&&P!==G&&s.reference[x]/2-(P<j?j:H)-b[x]/2<0,q=J?P<j?P-j:P-M:0;return{[v]:f[v]+q,data:{[v]:G,centerOffset:P-G-q,...J&&{alignmentOffset:q}},reset:J}}}),vC=function(e){return e===void 0&&(e={}),{name:"flip",options:e,async fn(t){var a,n;const{placement:r,middlewareData:s,rects:o,initialPlacement:i,platform:l,elements:c}=t,{mainAxis:u=!0,crossAxis:p=!0,fallbackPlacements:f,fallbackStrategy:v="bestFit",fallbackAxisSideDirection:x="none",flipAlignment:b=!0,...k}=Sn(e,t);if((a=s.arrow)!=null&&a.alignmentOffset)return{};const g=os(r),d=Ja(i),h=os(i)===i,y=await(l.isRTL==null?void 0:l.isRTL(c.floating)),S=f||(h||!b?[Nl(i)]:iC(i)),C=x!=="none";!f&&C&&S.push(...uC(i,b,x,y));const E=[i,...S],_=await l.detectOverflow(t,k),I=[];let j=((n=s.flip)==null?void 0:n.overflows)||[];if(u&&I.push(_[g]),p){const G=oC(r,o,y);I.push(_[G[0]],_[G[1]])}if(j=[...j,{placement:r,overflows:I}],!I.every(G=>G<=0)){var H,M;const G=(((H=s.flip)==null?void 0:H.index)||0)+1,J=E[G];if(J&&(!(p==="alignment"?d!==Ja(J):!1)||j.every(L=>Ja(L.placement)===d?L.overflows[0]>0:!0)))return{data:{index:G,overflows:j},reset:{placement:J}};let q=(M=j.filter(B=>B.overflows[0]<=0).sort((B,L)=>B.overflows[1]-L.overflows[1])[0])==null?void 0:M.placement;if(!q)switch(v){case"bestFit":{var P;const B=(P=j.filter(L=>{if(C){const w=Ja(L.placement);return w===d||w==="y"}return!0}).map(L=>[L.placement,L.overflows.filter(w=>w>0).reduce((w,T)=>w+T,0)]).sort((L,w)=>L[1]-w[1])[0])==null?void 0:P[0];B&&(q=B);break}case"initialPlacement":q=i;break}if(r!==q)return{reset:{placement:q}}}return{}}}};function Tb(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function Pb(e){return sC.some(t=>e[t]>=0)}const bC=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){const{rects:a,platform:n}=t,{strategy:r="referenceHidden",...s}=Sn(e,t);switch(r){case"referenceHidden":{const o=await n.detectOverflow(t,{...s,elementContext:"reference"}),i=Tb(o,a.reference);return{data:{referenceHiddenOffsets:i,referenceHidden:Pb(i)}}}case"escaped":{const o=await n.detectOverflow(t,{...s,altBoundary:!0}),i=Tb(o,a.floating);return{data:{escapedOffsets:i,escaped:Pb(i)}}}default:return{}}}}},_b=new Set(["left","top"]);async function yC(e,t){const{placement:a,platform:n,elements:r}=e,s=await(n.isRTL==null?void 0:n.isRTL(r.floating)),o=os(a),i=Nr(a),l=Ja(a)==="y",c=_b.has(o)?-1:1,u=s&&l?-1:1,p=Sn(t,e);let{mainAxis:f,crossAxis:v,alignmentAxis:x}=typeof p=="number"?{mainAxis:p,crossAxis:0,alignmentAxis:null}:{mainAxis:p.mainAxis||0,crossAxis:p.crossAxis||0,alignmentAxis:p.alignmentAxis};return i&&typeof x=="number"&&(v=i==="end"?x*-1:x),l?{x:v*u,y:f*c}:{x:f*c,y:v*u}}const xC=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){var a,n;const{x:r,y:s,placement:o,middlewareData:i}=t,l=await yC(t,e);return o===((a=i.offset)==null?void 0:a.placement)&&(n=i.arrow)!=null&&n.alignmentOffset?{}:{x:r+l.x,y:s+l.y,data:{...l,placement:o}}}}},wC=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:a,y:n,placement:r,platform:s}=t,{mainAxis:o=!0,crossAxis:i=!1,limiter:l={fn:d=>{let{x:h,y}=d;return{x:h,y}}},...c}=Sn(e,t),u={x:a,y:n},p=await s.detectOverflow(t,c),f=Ja(r),v=lp(f);let x=u[v],b=u[f];const k=(d,h)=>Nb(h+p[d==="y"?"top":"left"],h,h-p[d==="y"?"bottom":"right"]);o&&(x=k(v,x)),i&&(b=k(f,b));const g=l.fn({...t,[v]:x,[f]:b});return{...g,data:{x:g.x-a,y:g.y-n,enabled:{[v]:o,[f]:i}}}}}},kC=function(e){return e===void 0&&(e={}),{options:e,fn(t){var a,n;const{x:r,y:s,placement:o,rects:i,middlewareData:l}=t,{offset:c=0,mainAxis:u=!0,crossAxis:p=!0}=Sn(e,t),f={x:r,y:s},v=Ja(o),x=lp(v);let b=f[x],k=f[v];const g=Sn(c,t),d=typeof g=="number"?{mainAxis:g,crossAxis:0}:{mainAxis:(a=g.mainAxis)!=null?a:0,crossAxis:(n=g.crossAxis)!=null?n:0};if(u){const S=x==="y"?"height":"width",C=i.reference[x]-i.floating[S]+d.mainAxis,E=i.reference[x]+i.reference[S]-d.mainAxis;b<C?b=C:b>E&&(b=E)}if(p){var h,y;const S=x==="y"?"width":"height",C=_b.has(os(o)),E=i.reference[v]-i.floating[S]+(C&&((h=l.offset)==null?void 0:h[v])||0)+(C?0:d.crossAxis),_=i.reference[v]+i.reference[S]+(C?0:((y=l.offset)==null?void 0:y[v])||0)-(C?d.crossAxis:0);k<E?k=E:k>_&&(k=_)}return{[x]:b,[v]:k}}}},NC=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){const{placement:a,rects:n,platform:r,elements:s}=t,{apply:o=()=>{},...i}=Sn(e,t),l=await r.detectOverflow(t,i),c=os(a),u=Nr(a),p=Ja(a)==="y",{width:f,height:v}=n.floating;let x,b;c==="top"||c==="bottom"?(x=c,b=u===(await(r.isRTL==null?void 0:r.isRTL(s.floating))?"start":"end")?"left":"right"):(b=c,x=u==="end"?"top":"bottom");const k=v-l.top-l.bottom,g=f-l.left-l.right,d=rs(v-l[x],k),h=rs(f-l[b],g),y=t.middlewareData.shift,S=!y;let C=d,E=h;y!=null&&y.enabled.x&&(E=g),y!=null&&y.enabled.y&&(C=k),S&&!u&&(p?E=f-2*kn(l.left,l.right):C=v-2*kn(l.top,l.bottom)),await o({...t,availableWidth:E,availableHeight:C});const _=await r.getDimensions(s.floating);return f!==_.width||v!==_.height?{reset:{rects:!0}}:{}}}};function Cl(){return typeof window<"u"}function Sr(e){return Ib(e)?(e.nodeName||"").toLowerCase():"#document"}function la(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function Cn(e){var t;return(t=(Ib(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function Ib(e){return Cl()?e instanceof Node||e instanceof la(e).Node:!1}function en(e){return Cl()?e instanceof Element||e instanceof la(e).Element:!1}function is(e){return Cl()?e instanceof HTMLElement||e instanceof la(e).HTMLElement:!1}function Rb(e){return!Cl()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof la(e).ShadowRoot}function El(e){const{overflow:t,overflowX:a,overflowY:n,display:r}=tn(e);return/auto|scroll|overlay|hidden|clip/.test(t+n+a)&&r!=="inline"&&r!=="contents"}function SC(e){return/^(table|td|th)$/.test(Sr(e))}function $l(e){try{if(e.matches(":popover-open"))return!0}catch{}try{return e.matches(":modal")}catch{return!1}}const CC=/transform|translate|scale|rotate|perspective|filter/,EC=/paint|layout|strict|content/,Es=e=>!!e&&e!=="none";let pp;function fp(e){const t=en(e)?tn(e):e;return Es(t.transform)||Es(t.translate)||Es(t.scale)||Es(t.rotate)||Es(t.perspective)||!mp()&&(Es(t.backdropFilter)||Es(t.filter))||CC.test(t.willChange||"")||EC.test(t.contain||"")}function $C(e){let t=$s(e);for(;is(t)&&!Po(t);){if(fp(t))return t;if($l(t))return null;t=$s(t)}return null}function mp(){return pp==null&&(pp=typeof CSS<"u"&&CSS.supports&&CSS.supports("-webkit-backdrop-filter","none")),pp}function Po(e){return/^(html|body|#document)$/.test(Sr(e))}function tn(e){return la(e).getComputedStyle(e)}function Tl(e){return en(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function $s(e){if(Sr(e)==="html")return e;const t=e.assignedSlot||e.parentNode||Rb(e)&&e.host||Cn(e);return Rb(t)?t.host:t}function Ab(e){const t=$s(e);return Po(t)?(e.ownerDocument||e).body:is(t)&&El(t)?t:Ab(t)}function _o(e,t,a){var n;t===void 0&&(t=[]),a===void 0&&(a=!0);const r=Ab(e),s=r===((n=e.ownerDocument)==null?void 0:n.body),o=la(r);if(s){const i=gp(o);return t.concat(o,o.visualViewport||[],El(r)?r:[],i&&a?_o(i):[])}else return t.concat(r,_o(r,[],a))}function gp(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function jb(e){const t=tn(e);let a=parseFloat(t.width)||0,n=parseFloat(t.height)||0;const r=is(e),s=r?e.offsetWidth:a,o=r?e.offsetHeight:n,i=wl(a)!==s||wl(n)!==o;return i&&(a=s,n=o),{width:a,height:n,$:i}}function hp(e){return en(e)?e:e.contextElement}function Cr(e){const t=hp(e);if(!is(t))return Nn(1);const a=t.getBoundingClientRect(),{width:n,height:r,$:s}=jb(t);let o=(s?wl(a.width):a.width)/n,i=(s?wl(a.height):a.height)/r;return(!o||!Number.isFinite(o))&&(o=1),(!i||!Number.isFinite(i))&&(i=1),{x:o,y:i}}const TC=Nn(0);function Db(e){const t=la(e);return!mp()||!t.visualViewport?TC:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function PC(e,t,a){return t===void 0&&(t=!1),!!a&&t&&a===la(e)}function Ts(e,t,a,n){t===void 0&&(t=!1),a===void 0&&(a=!1);const r=e.getBoundingClientRect(),s=hp(e);let o=Nn(1);t&&(n?en(n)&&(o=Cr(n)):o=Cr(e));const i=PC(s,a,n)?Db(s):Nn(0);let l=(r.left+i.x)/o.x,c=(r.top+i.y)/o.y,u=r.width/o.x,p=r.height/o.y;if(s&&n){const f=la(s),v=en(n)?la(n):n;let x=f,b=gp(x);for(;b&&v!==x;){const k=Cr(b),g=b.getBoundingClientRect(),d=tn(b),h=g.left+(b.clientLeft+parseFloat(d.paddingLeft))*k.x,y=g.top+(b.clientTop+parseFloat(d.paddingTop))*k.y;l*=k.x,c*=k.y,u*=k.x,p*=k.y,l+=h,c+=y,x=la(b),b=gp(x)}}return Sl({width:u,height:p,x:l,y:c})}function Pl(e,t){const a=Tl(e).scrollLeft;return t?t.left+a:Ts(Cn(e)).left+a}function Ob(e,t){const a=e.getBoundingClientRect(),n=a.left+t.scrollLeft-Pl(e,a),r=a.top+t.scrollTop;return{x:n,y:r}}function _C(e){let{elements:t,rect:a,offsetParent:n,strategy:r}=e;const s=r==="fixed",o=Cn(n),i=t?$l(t.floating):!1;if(n===o||i&&s)return a;let l={scrollLeft:0,scrollTop:0},c=Nn(1);const u=Nn(0),p=is(n);if((p||!s)&&((Sr(n)!=="body"||El(o))&&(l=Tl(n)),p)){const v=Ts(n);c=Cr(n),u.x=v.x+n.clientLeft,u.y=v.y+n.clientTop}const f=o&&!p&&!s?Ob(o,l):Nn(0);return{width:a.width*c.x,height:a.height*c.y,x:a.x*c.x-l.scrollLeft*c.x+u.x+f.x,y:a.y*c.y-l.scrollTop*c.y+u.y+f.y}}function IC(e){return e.getClientRects?Array.from(e.getClientRects()):[]}function RC(e){const t=Tl(e),a=e.ownerDocument.body,n=kn(e.scrollWidth,e.clientWidth,a.scrollWidth,a.clientWidth),r=kn(e.scrollHeight,e.clientHeight,a.scrollHeight,a.clientHeight);let s=-t.scrollLeft+Pl(e);const o=-t.scrollTop;return tn(a).direction==="rtl"&&(s+=kn(e.clientWidth,a.clientWidth)-n),{width:n,height:r,x:s,y:o}}const AC=25;function jC(e,t,a){a===void 0&&(a="viewport");const n=a==="layoutViewport",r=la(e),s=Cn(e),o=r.visualViewport;let i=s.clientWidth,l=s.clientHeight,c=0,u=0;if(o){const f=!mp()||t==="fixed";n?f||(c=-o.offsetLeft,u=-o.offsetTop):(i=o.width,l=o.height,f&&(c=o.offsetLeft,u=o.offsetTop))}if(Pl(s)<=0){const f=s.ownerDocument,v=f.body,x=getComputedStyle(v),b=f.compatMode==="CSS1Compat"&&parseFloat(x.marginLeft)+parseFloat(x.marginRight)||0,k=Math.abs(s.clientWidth-v.clientWidth-b),g=getComputedStyle(s).scrollbarGutter==="stable both-edges"?k/2:k;g<=AC&&(i-=g)}return{width:i,height:l,x:c,y:u}}function DC(e,t){const a=Ts(e,!0,t==="fixed"),n=a.top+e.clientTop,r=a.left+e.clientLeft,s=Cr(e),o=e.clientWidth*s.x,i=e.clientHeight*s.y,l=r*s.x,c=n*s.y;return{width:o,height:i,x:l,y:c}}function Lb(e,t,a){let n;if(t==="viewport"||t==="layoutViewport")n=jC(e,a,t);else if(t==="document")n=RC(Cn(e));else if(en(t))n=DC(t,a);else{const r=Db(e);n={x:t.x-r.x,y:t.y-r.y,width:t.width,height:t.height}}return Sl(n)}function OC(e,t){const a=t.get(e);if(a)return a;let n=_o(e,[],!1).filter(i=>en(i)&&Sr(i)!=="body"),r=null;const s=tn(e).position==="fixed";let o=s?$s(e):e;for(;en(o)&&!Po(o);){const i=tn(o),l=fp(o),c=r?r.position:s?"fixed":"";!l&&(c==="fixed"||c==="absolute"&&i.position==="static")?n=n.filter(p=>p!==o):r=i,o=$s(o)}return t.set(e,n),n}function LC(e){let{element:t,boundary:a,rootBoundary:n,strategy:r}=e;const o=[...a==="clippingAncestors"?$l(t)?[]:OC(t,this._c):[].concat(a),n],i=Lb(t,o[0],r);let l=i.top,c=i.right,u=i.bottom,p=i.left;for(let f=1;f<o.length;f++){const v=Lb(t,o[f],r);l=kn(v.top,l),c=rs(v.right,c),u=rs(v.bottom,u),p=kn(v.left,p)}return{width:c-p,height:u-l,x:p,y:l}}function MC(e){const{width:t,height:a}=jb(e);return{width:t,height:a}}function zC(e,t,a){const n=is(t),r=Cn(t),s=a==="fixed",o=Ts(e,!0,s,t);let i={scrollLeft:0,scrollTop:0};const l=Nn(0);if((n||!s)&&((Sr(t)!=="body"||El(r))&&(i=Tl(t)),n)){const f=Ts(t,!0,s,t);l.x=f.x+t.clientLeft,l.y=f.y+t.clientTop}!n&&r&&(l.x=Pl(r));const c=r&&!n&&!s?Ob(r,i):Nn(0),u=o.left+i.scrollLeft-l.x-c.x,p=o.top+i.scrollTop-l.y-c.y;return{x:u,y:p,width:o.width,height:o.height}}function vp(e){return tn(e).position==="static"}function Mb(e,t){if(!is(e)||tn(e).position==="fixed")return null;if(t)return t(e);let a=e.offsetParent;return Cn(e)===a&&(a=a.ownerDocument.body),a}function zb(e,t){const a=la(e);if($l(e))return a;if(!is(e)){let r=$s(e);for(;r&&!Po(r);){if(en(r)&&!vp(r))return r;r=$s(r)}return a}let n=Mb(e,t);for(;n&&SC(n)&&vp(n);)n=Mb(n,t);return n&&Po(n)&&vp(n)&&!fp(n)?a:n||$C(e)||a}const FC=async function(e){const t=this.getOffsetParent||zb,a=this.getDimensions,n=await a(e.floating);return{reference:zC(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,width:n.width,height:n.height}}};function BC(e){return tn(e).direction==="rtl"}const UC={convertOffsetParentRelativeRectToViewportRelativeRect:_C,getDocumentElement:Cn,getClippingRect:LC,getOffsetParent:zb,getElementRects:FC,getClientRects:IC,getDimensions:MC,getScale:Cr,isElement:en,isRTL:BC};function Fb(e,t){return e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function qC(e,t,a){let n=null,r;const s=Cn(e);function o(){var u;clearTimeout(r),(u=n)==null||u.disconnect(),n=null}function i(u,p){u===void 0&&(u=!1),p===void 0&&(p=1),o();const f=e.getBoundingClientRect(),{left:v,top:x,width:b,height:k}=f;if(u||t(),!b||!k)return;const g=kl(x),d=kl(s.clientWidth-(v+b)),h=kl(s.clientHeight-(x+k)),y=kl(v),C={rootMargin:-g+"px "+-d+"px "+-h+"px "+-y+"px",threshold:kn(0,rs(1,p))||1};let E=!0;function _(I){const j=I[0].intersectionRatio;if(!Fb(f,e.getBoundingClientRect()))return i();if(j!==p){if(!E)return i();j?i(!1,j):r=setTimeout(()=>{i(!1,1e-7)},1e3)}E=!1}try{n=new IntersectionObserver(_,{...C,root:s.ownerDocument})}catch{n=new IntersectionObserver(_,C)}n.observe(e)}const l=la(e),c=()=>i(a);return l.addEventListener("resize",c),i(!0),()=>{l.removeEventListener("resize",c),o()}}function VC(e,t,a,n){n===void 0&&(n={});const{ancestorScroll:r=!0,ancestorResize:s=!0,elementResize:o=typeof ResizeObserver=="function",layoutShift:i=typeof IntersectionObserver=="function",animationFrame:l=!1}=n,c=hp(e),u=r||s?[...c?_o(c):[],...t?_o(t):[]]:[];u.forEach(g=>{r&&g.addEventListener("scroll",a),s&&g.addEventListener("resize",a)});const p=c&&i?qC(c,a,s):null;let f=-1,v=null;o&&(v=new ResizeObserver(g=>{let[d]=g;d&&d.target===c&&v&&t&&(v.unobserve(t),cancelAnimationFrame(f),f=requestAnimationFrame(()=>{var h;(h=v)==null||h.observe(t)})),a()}),c&&!l&&v.observe(c),t&&v.observe(t));let x,b=l?Ts(e):null;l&&k();function k(){const g=Ts(e);b&&!Fb(b,g)&&a(),b=g,x=requestAnimationFrame(k)}return a(),()=>{var g;u.forEach(d=>{r&&d.removeEventListener("scroll",a),s&&d.removeEventListener("resize",a)}),p?.(),(g=v)==null||g.disconnect(),v=null,l&&cancelAnimationFrame(x)}}const WC=xC,HC=wC,GC=vC,KC=NC,YC=bC,Bb=hC,QC=kC,XC=(e,t,a)=>{const n=new Map,r=a??{},s={...UC,...r.platform,_c:n};return gC(e,t,{...r,platform:s})};var ZC=typeof document<"u",JC=function(){},_l=ZC?N.useLayoutEffect:JC;function Il(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e=="function"&&e.toString()===t.toString())return!0;let a,n,r;if(e&&t&&typeof e=="object"){if(Array.isArray(e)){if(a=e.length,a!==t.length)return!1;for(n=a;n--!==0;)if(!Il(e[n],t[n]))return!1;return!0}if(r=Object.keys(e),a=r.length,a!==Object.keys(t).length)return!1;for(n=a;n--!==0;)if(!{}.hasOwnProperty.call(t,r[n]))return!1;for(n=a;n--!==0;){const s=r[n];if(!(s==="_owner"&&e.$$typeof)&&!Il(e[s],t[s]))return!1}return!0}return e!==e&&t!==t}function Ub(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function qb(e,t){const a=Ub(e);return Math.round(t*a)/a}function bp(e){const t=N.useRef(e);return _l(()=>{t.current=e}),t}function e2(e){e===void 0&&(e={});const{placement:t="bottom",strategy:a="absolute",middleware:n=[],platform:r,elements:{reference:s,floating:o}={},transform:i=!0,whileElementsMounted:l,open:c}=e,[u,p]=N.useState({x:0,y:0,strategy:a,placement:t,middlewareData:{},isPositioned:!1}),[f,v]=N.useState(n);Il(f,n)||v(n);const[x,b]=N.useState(null),[k,g]=N.useState(null),d=N.useCallback(L=>{L!==C.current&&(C.current=L,b(L))},[]),h=N.useCallback(L=>{L!==E.current&&(E.current=L,g(L))},[]),y=s||x,S=o||k,C=N.useRef(null),E=N.useRef(null),_=N.useRef(u),I=l!=null,j=bp(l),H=bp(r),M=bp(c),P=N.useCallback(()=>{if(!C.current||!E.current)return;const L={placement:t,strategy:a,middleware:f};H.current&&(L.platform=H.current),XC(C.current,E.current,L).then(w=>{const T={...w,isPositioned:M.current!==!1};G.current&&!Il(_.current,T)&&(_.current=T,dr.flushSync(()=>{p(T)}))})},[f,t,a,H,M]);_l(()=>{c===!1&&_.current.isPositioned&&(_.current.isPositioned=!1,p(L=>({...L,isPositioned:!1})))},[c]);const G=N.useRef(!1);_l(()=>(G.current=!0,()=>{G.current=!1}),[]),_l(()=>{if(y&&(C.current=y),S&&(E.current=S),y&&S){if(j.current)return j.current(y,S,P);P()}},[y,S,P,j,I]);const J=N.useMemo(()=>({reference:C,floating:E,setReference:d,setFloating:h}),[d,h]),q=N.useMemo(()=>({reference:y,floating:S}),[y,S]),B=N.useMemo(()=>{const L={position:a,left:0,top:0};if(!q.floating)return L;const w=qb(q.floating,u.x),T=qb(q.floating,u.y);return i?{...L,transform:"translate("+w+"px, "+T+"px)",...Ub(q.floating)>=1.5&&{willChange:"transform"}}:{position:a,left:w,top:T}},[a,i,q.floating,u.x,u.y]);return N.useMemo(()=>({...u,update:P,refs:J,elements:q,floatingStyles:B}),[u,P,J,q,B])}const t2=e=>{function t(a){return{}.hasOwnProperty.call(a,"current")}return{name:"arrow",options:e,fn(a){const{element:n,padding:r}=typeof e=="function"?e(a):e;return n&&t(n)?n.current!=null?Bb({element:n.current,padding:r}).fn(a):{}:n?Bb({element:n,padding:r}).fn(a):{}}}},a2=(e,t)=>{const a=WC(e);return{name:a.name,fn:a.fn,options:[e,t]}},n2=(e,t)=>{const a=HC(e);return{name:a.name,fn:a.fn,options:[e,t]}},s2=(e,t)=>({fn:QC(e).fn,options:[e,t]}),r2=(e,t)=>{const a=GC(e);return{name:a.name,fn:a.fn,options:[e,t]}},o2=(e,t)=>{const a=KC(e);return{name:a.name,fn:a.fn,options:[e,t]}},i2=(e,t)=>{const a=YC(e);return{name:a.name,fn:a.fn,options:[e,t]}},l2=(e,t)=>{const a=t2(e);return{name:a.name,fn:a.fn,options:[e,t]}};var d2=Object.defineProperty,c2=(e,t)=>d2(e,"name",{value:t,configurable:!0}),u2=N.forwardRef(c2(function(t,a){const{children:n,width:r=10,height:s=5,...o}=t;return $.jsx(Oe.svg,{...o,ref:a,width:r,height:s,viewBox:"0 0 30 10",preserveAspectRatio:"none",children:t.asChild?n:$.jsx("polygon",{points:"0,0 30,0 15,10"})})},"Arrow")),p2=Object.defineProperty,En=(e,t)=>p2(e,"name",{value:t,configurable:!0}),Vb={Partial:"partial"},Wb={Optimized:"optimized",Always:"always"},Hb="Popper",[Gb,Rl]=ba(Hb),[f2,Kb]=Gb(Hb),Yb=En(e=>{const{__scopePopper:t,children:a}=e,[n,r]=N.useState(null),[s,o]=N.useState(void 0);return $.jsx(f2,{scope:t,anchor:n,onAnchorChange:r,placementState:s,setPlacementState:o,children:a})},"Popper"),m2="PopperAnchor",Qb=N.forwardRef(En(function(t,a){const{__scopePopper:n,virtualRef:r,...s}=t,o=Kb(m2,n),i=N.useRef(null),l=o.onAnchorChange,c=N.useCallback(b=>{i.current=b,b&&l(b)},[l]),u=Ze(a,c),p=N.useRef(null);N.useEffect(()=>{if(!r)return;const b=p.current;p.current=r.current,b!==p.current&&l(p.current)});const f=o.placementState&&Al(o.placementState),v=f?.[0],x=f?.[1];return r?null:$.jsx(Oe.div,{"data-radix-popper-side":v,"data-radix-popper-align":x,...s,ref:u})},"PopperAnchor")),Xb="PopperContent",[g2,h2]=Gb(Xb),Zb=N.forwardRef(En(function(t,a){const{__scopePopper:n,side:r="bottom",sideOffset:s=0,align:o="center",alignOffset:i=0,arrowPadding:l=0,avoidCollisions:c=!0,collisionBoundary:u=[],collisionPadding:p=0,sticky:f=Vb.Partial,hideWhenDetached:v=!1,updatePositionStrategy:x=Wb.Optimized,onPlaced:b,...k}=t,g=Kb(Xb,n),[d,h]=N.useState(null),y=Ze(a,h),[S,C]=N.useState(null),E=vl(S),_=E?.width??0,I=E?.height??0,j=r+(o!=="center"?"-"+o:""),H=typeof p=="number"?p:{top:0,right:0,bottom:0,left:0,...p},M=Array.isArray(u)?u:[u],P=M.length>0,G={padding:H,boundary:M.filter(Jb),altBoundary:P},{refs:J,floatingStyles:q,placement:B,isPositioned:L,middlewareData:w}=e2({strategy:"fixed",placement:j,whileElementsMounted:En((...ae)=>VC(...ae,{animationFrame:x===Wb.Always}),"whileElementsMounted"),elements:{reference:g.anchor},middleware:[a2({mainAxis:s+I,alignmentAxis:i}),c&&n2({mainAxis:!0,crossAxis:!1,...f===Vb.Partial?{limiter:s2()}:{},...G}),c&&r2({...G}),o2({...G,apply:En(({elements:ae,rects:F,availableWidth:te,availableHeight:xe})=>{const{width:X,height:oe}=F.reference,me=ae.floating.style;me.setProperty("--radix-popper-available-width",`${te}px`),me.setProperty("--radix-popper-available-height",`${xe}px`),me.setProperty("--radix-popper-anchor-width",`${X}px`),me.setProperty("--radix-popper-anchor-height",`${oe}px`)},"apply")}),S&&l2({element:S,padding:l}),x2({arrowWidth:_,arrowHeight:I}),v&&i2(P?{strategy:"referenceHidden",...G}:{strategy:"referenceHidden",padding:G.padding,altBoundary:G.altBoundary})]}),T=g.setPlacementState;kt(()=>(T(B),()=>{T(void 0)}),[B,T]);const[Q,R]=Al(B),D=Ba(b);kt(()=>{L&&D?.()},[L,D]);const K=w.arrow?.x,we=w.arrow?.y,fe=w.arrow?.centerOffset!==0,[ye,Ve]=N.useState();return kt(()=>{d&&Ve(window.getComputedStyle(d).zIndex)},[d]),$.jsx("div",{ref:J.setFloating,"data-radix-popper-content-wrapper":"",style:{...q,transform:L?q.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:ye,"--radix-popper-transform-origin":[w.transformOrigin?.x,w.transformOrigin?.y].join(" "),...w.hide?.referenceHidden&&{visibility:"hidden",pointerEvents:"none"}},dir:t.dir,children:$.jsx(g2,{scope:n,placedSide:Q,placedAlign:R,onArrowChange:C,arrowX:K,arrowY:we,shouldHideArrow:fe,children:$.jsx(Oe.div,{"data-side":Q,"data-align":R,...k,ref:y,style:{...k.style,animation:L?k.style?.animation:"none"}})})})},"PopperContent")),v2="PopperArrow",b2={top:"bottom",right:"left",bottom:"top",left:"right"},y2=N.forwardRef(En(function(t,a){const{__scopePopper:n,...r}=t,s=h2(v2,n),o=b2[s.placedSide];return $.jsx("span",{ref:s.onArrowChange,style:{position:"absolute",left:s.arrowX,top:s.arrowY,[o]:0,transformOrigin:{top:"",right:"0 0",bottom:"center 0",left:"100% 0"}[s.placedSide],transform:{top:"translateY(100%)",right:"translateY(50%) rotate(90deg) translateX(-50%)",bottom:"rotate(180deg)",left:"translateY(50%) rotate(-90deg) translateX(50%)"}[s.placedSide],visibility:s.shouldHideArrow?"hidden":void 0},children:$.jsx(u2,{...r,ref:a,style:{...r.style,display:"block"}})})},"PopperArrow"));function Jb(e){return e!==null}En(Jb,"isNotNull");var x2=En(e=>({name:"transformOrigin",options:e,fn(t){const{placement:a,rects:n,middlewareData:r}=t,o=r.arrow?.centerOffset!==0,i=o?0:e.arrowWidth,l=o?0:e.arrowHeight,[c,u]=Al(a),p={start:"0%",center:"50%",end:"100%"}[u],f=(r.arrow?.x??0)+i/2,v=(r.arrow?.y??0)+l/2;let x="",b="";return c==="bottom"?(x=o?p:`${f}px`,b=`${-l}px`):c==="top"?(x=o?p:`${f}px`,b=`${n.floating.height+l}px`):c==="right"?(x=`${-l}px`,b=o?p:`${v}px`):c==="left"&&(x=`${n.floating.width+l}px`,b=o?p:`${v}px`),{data:{x,y:b}}}}),"transformOrigin");function Al(e){const[t,a="center"]=e.split("-");return[t,a]}En(Al,"getSideAndAlignFromPlacement");var w2=Object.defineProperty,k2=(e,t)=>w2(e,"name",{value:t,configurable:!0}),ey=Object.freeze({position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal"}),N2=N.forwardRef(k2(function(t,a){return $.jsx(Oe.span,{...t,ref:a,style:{...ey,...t.style}})},"VisuallyHidden")),S2=Object.defineProperty,Je=(e,t)=>S2(e,"name",{value:t,configurable:!0}),ty={ItemAligned:"item-aligned",Popper:"popper"},C2={RTL:"rtl"},E2=[" ","Enter","ArrowUp","ArrowDown"],$2=[" ","Enter"],Er="Select",[jl,yp,T2]=Mu(Er),[Ps,t$]=ba(Er,[T2,Rl]),xp=Rl(),[P2,ls]=Ps(Er),[_2,I2]=Ps(Er);function ay(e){const{__scopeSelect:t,children:a,open:n,defaultOpen:r,onOpenChange:s,value:o,defaultValue:i,onValueChange:l,dir:c,name:u,autoComplete:p,disabled:f,required:v,form:x,internal_do_not_use_render:b}=e,k=xp(t),[g,d]=N.useState(null),[h,y]=N.useState(null),[S,C]=N.useState(!1),E=So(c),[_,I]=_a({prop:n,defaultProp:r??!1,onChange:s,caller:Er}),[j,H]=_a({prop:o,defaultProp:i,onChange:l,caller:Er}),M=N.useRef(null),P=N.useRef(!1),[G,J]=N.useState(null),q=Je(fe=>{J({value:fe,hasConsumerStoppedPropagation:P.current}),H(fe)},"handleUserSelect"),B=N.useRef(j);N.useEffect(()=>{const fe=x?g?.ownerDocument.getElementById(x):g?.form;if(fe instanceof HTMLFormElement){const ye=Je(()=>H(B.current),"reset");return fe.addEventListener("reset",ye),()=>fe.removeEventListener("reset",ye)}},[x,g,H]);const L=g?!!x||!!g.closest("form"):!0,[w,T]=N.useState(new Set),Q=vn(),R=Array.from(w).map(fe=>fe.props.value).join(";"),D=N.useCallback(fe=>{T(ye=>new Set(ye).add(fe))},[]),K=N.useCallback(fe=>{T(ye=>{const Ve=new Set(ye);return Ve.delete(fe),Ve})},[]),we={required:v,trigger:g,onTriggerChange:d,valueNode:h,onValueNodeChange:y,valueNodeHasChildren:S,onValueNodeHasChildrenChange:C,contentId:Q,value:j,onValueChange:H,hasConsumerStoppedPropagationRef:P,userSelection:G,onUserSelect:q,open:_,onOpenChange:I,dir:E,triggerPointerDownPosRef:M,disabled:f,name:u,autoComplete:p,form:x,nativeOptions:w,nativeSelectKey:R,isFormControl:L};return $.jsx(Yb,{...k,children:$.jsx(P2,{scope:t,...we,children:$.jsx(jl.Provider,{scope:t,children:$.jsx(_2,{scope:t,onNativeOptionAdd:D,onNativeOptionRemove:K,children:iy(b)?b(we):a})})})})}Je(ay,"SelectProvider");var R2=Je(e=>{const{__scopeSelect:t,children:a,...n}=e;return $.jsx(ay,{__scopeSelect:t,...n,internal_do_not_use_render:({isFormControl:r})=>$.jsxs($.Fragment,{children:[a,r?$.jsx(nE,{__scopeSelect:t}):null]})})},"Select"),A2="SelectTrigger",j2=N.forwardRef(Je(function(t,a){const{__scopeSelect:n,disabled:r=!1,...s}=t,o=xp(n),i=ls(A2,n),l=i.disabled||r,c=Ze(a,i.onTriggerChange),u=yp(n),p=N.useRef("touch"),[f,v,x]=kp(k=>{const g=u().filter(y=>!y.disabled),d=g.find(y=>y.value===i.value),h=Np(g,k,d);h!==void 0&&i.onUserSelect(h.value)}),b=Je(k=>{l||(i.onOpenChange(!0),x()),k&&(i.triggerPointerDownPosRef.current={x:Math.round(k.pageX),y:Math.round(k.pageY)})},"handleOpen");return $.jsx(Qb,{asChild:!0,...o,children:$.jsx(Oe.button,{type:"button",role:"combobox","aria-controls":i.open?i.contentId:void 0,"aria-expanded":i.open,"aria-required":i.required,"aria-autocomplete":"none",dir:i.dir,"data-state":i.open?"open":"closed",disabled:l,"data-disabled":l?"":void 0,"data-placeholder":Io(i.value)?"":void 0,...s,ref:c,onClick:_e(s.onClick,k=>{k.currentTarget.focus(),p.current!=="mouse"&&b(k)}),onPointerDown:_e(s.onPointerDown,k=>{p.current=k.pointerType;const g=k.target;g.hasPointerCapture(k.pointerId)&&g.releasePointerCapture(k.pointerId),k.button===0&&k.ctrlKey===!1&&k.pointerType==="mouse"&&(b(k),k.preventDefault())}),onKeyDown:_e(s.onKeyDown,k=>{const g=f.current!=="";!(k.ctrlKey||k.altKey||k.metaKey)&&k.key.length===1&&(i.hasConsumerStoppedPropagationRef.current=k.isPropagationStopped(),v(k.key)),!(g&&k.key===" ")&&E2.includes(k.key)&&(b(),k.preventDefault())})})})},"SelectTrigger")),D2="SelectValue",O2=N.forwardRef(Je(function(t,a){const{__scopeSelect:n,className:r,style:s,children:o,placeholder:i="",...l}=t,c=ls(D2,n),{onValueNodeHasChildrenChange:u}=c,p=o!==void 0,f=Ze(a,c.onValueNodeChange);kt(()=>{u(p)},[u,p]);const v=Io(c.value);return $.jsx(Oe.span,{...l,asChild:v?!1:l.asChild,ref:f,style:{pointerEvents:"none"},children:$.jsx(N.Fragment,{children:v?i:o},v?"placeholder":"value")})},"SelectValue")),L2=N.forwardRef(Je(function(t,a){const{__scopeSelect:n,children:r,...s}=t;return $.jsx(Oe.span,{"aria-hidden":!0,...s,ref:a,children:r||"▼"})},"SelectIcon")),M2="SelectPortal",[z2,F2]=Ps(M2,{forceMount:void 0}),B2=Je(e=>{const{__scopeSelect:t,forceMount:a,...n}=e;return $.jsx(z2,{scope:e.__scopeSelect,forceMount:a,children:$.jsx(wu,{asChild:!0,...n})})},"SelectPortal"),_s="SelectContent",U2=N.forwardRef(Je(function(t,a){const n=F2(_s,t.__scopeSelect),{forceMount:r=n.forceMount,...s}=t,o=ls(_s,t.__scopeSelect),[i,l]=N.useState();return kt(()=>{l(new DocumentFragment)},[]),$.jsx(es,{present:r||o.open,children:({present:c})=>c?$.jsx(W2,{...s,ref:a}):$.jsx(q2,{...s,fragment:i})})},"SelectContent")),q2=N.forwardRef(Je(function(t,a){const{__scopeSelect:n,children:r,fragment:s}=t;return s?dr.createPortal($.jsx(ny,{scope:n,children:$.jsx(jl.Slot,{scope:n,children:$.jsx("div",{ref:a,children:r})})}),s):null},"SelectContentFragment")),Ua=10,[ny,Dl]=Ps(_s),V2=hn("SelectContent.RemoveScroll"),W2=N.forwardRef(Je(function(t,a){const{__scopeSelect:n}=t,{position:r=ty.ItemAligned,onCloseAutoFocus:s,onEscapeKeyDown:o,onPointerDownOutside:i,side:l,sideOffset:c,align:u,alignOffset:p,arrowPadding:f,collisionBoundary:v,collisionPadding:x,sticky:b,hideWhenDetached:k,avoidCollisions:g,...d}=t,h=ls(_s,n),[y,S]=N.useState(null),[C,E]=N.useState(null),_=Ze(a,S),[I,j]=N.useState(null),[H,M]=N.useState(null),P=yp(n),[G,J]=N.useState(!1),q=N.useRef(!1),B=N.useRef(!1),L=N.useRef(!1);N.useEffect(()=>{if(y)return kv(y)},[y]),sl();const w=N.useCallback(F=>{const[te,...xe]=P().map(me=>me.ref.current),[X]=xe.slice(-1),oe=document.activeElement;for(const me of F)if(me===oe||(me?.scrollIntoView({block:"nearest"}),me===te&&C&&(C.scrollTop=0),me===X&&C&&(C.scrollTop=C.scrollHeight),me?.focus(),document.activeElement!==oe))return},[P,C]),T=N.useCallback(()=>w([I,y]),[w,I,y]);N.useEffect(()=>{G&&T()},[G,T]);const{onOpenChange:Q,triggerPointerDownPosRef:R}=h;N.useEffect(()=>{if(y){let F={x:0,y:0};const te=Je(X=>{F={x:Math.abs(Math.round(X.pageX)-(R.current?.x??0)),y:Math.abs(Math.round(X.pageY)-(R.current?.y??0))}},"handlePointerMove"),xe=Je(X=>{F.x<=10&&F.y<=10?X.preventDefault():X.composedPath().includes(y)||Q(!1),document.removeEventListener("pointermove",te),R.current=null},"handlePointerUp");return R.current!==null&&(document.addEventListener("pointermove",te),document.addEventListener("pointerup",xe,{capture:!0,once:!0})),()=>{document.removeEventListener("pointermove",te),document.removeEventListener("pointerup",xe,{capture:!0})}}},[y,Q,R]),N.useEffect(()=>{const F=Je(()=>Q(!1),"close");return window.addEventListener("blur",F),window.addEventListener("resize",F),()=>{window.removeEventListener("blur",F),window.removeEventListener("resize",F)}},[Q]);const[D,K]=kp(F=>{const te=P().filter(oe=>!oe.disabled),xe=te.find(oe=>oe.ref.current===document.activeElement),X=Np(te,F,xe);X&&setTimeout(()=>X.ref.current?.focus())}),we=N.useCallback((F,te,xe)=>{const X=!B.current;X&&(B.current=!0);const oe=!q.current&&!xe;h.value!==void 0&&h.value===te||oe?(j(F),oe&&(q.current=!0)):X&&j(F)},[h.value]),fe=N.useCallback(()=>y?.focus(),[y]),ye=N.useCallback((F,te,xe)=>{if(!F)return;const X=!L.current;X&&(L.current=!0);const oe=!q.current&&!xe;(h.value!==void 0&&h.value===te||oe||X)&&M(F)},[h.value]),Ve=r===ty.Popper?sy:H2,ae=Ve===sy?{side:l,sideOffset:c,align:u,alignOffset:p,arrowPadding:f,collisionBoundary:v,collisionPadding:x,sticky:b,hideWhenDetached:k,avoidCollisions:g}:{};return $.jsx(ny,{scope:n,content:y,viewport:C,onViewportChange:E,itemRefCallback:we,selectedItem:I,onItemLeave:fe,itemTextRefCallback:ye,focusSelectedItem:T,selectedItemText:H,position:r,isPositioned:G,searchRef:D,children:$.jsx(Pu,{as:V2,allowPinchZoom:!0,children:$.jsx(Gh,{asChild:!0,trapped:h.open,onMountAutoFocus:F=>{F.preventDefault()},onUnmountAutoFocus:_e(s,F=>{h.trigger?.focus({preventScroll:!0}),F.preventDefault()}),children:$.jsx(fu,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:o,onPointerDownOutside:i,onFocusOutside:F=>F.preventDefault(),onDismiss:()=>h.onOpenChange(!1),children:$.jsx(Ve,{role:"listbox",id:h.contentId,"data-state":h.open?"open":"closed",dir:h.dir,onContextMenu:F=>F.preventDefault(),...d,...ae,onPlaced:()=>J(!0),ref:_,style:{display:"flex",flexDirection:"column",outline:"none",...d.style},onKeyDown:_e(d.onKeyDown,F=>{const te=F.ctrlKey||F.altKey||F.metaKey;if(F.key==="Tab"&&F.preventDefault(),!te&&F.key.length===1&&K(F.key),["ArrowUp","ArrowDown","Home","End"].includes(F.key)){let X=P().filter(oe=>!oe.disabled).map(oe=>oe.ref.current);if(["ArrowUp","End"].includes(F.key)&&(X=X.slice().reverse()),["ArrowUp","ArrowDown"].includes(F.key)){const oe=F.target,me=X.indexOf(oe);X=X.slice(me+1)}setTimeout(()=>w(X)),F.preventDefault()}})})})})})})},"SelectContentImpl")),H2=N.forwardRef(Je(function(t,a){const{__scopeSelect:n,onPlaced:r,...s}=t,o=ls(_s,n),i=Dl(_s,n),[l,c]=N.useState(null),[u,p]=N.useState(null),f=Ze(a,p),v=yp(n),x=N.useRef(!1),b=N.useRef(!0),{viewport:k,selectedItem:g,selectedItemText:d,focusSelectedItem:h}=i,y=N.useCallback(()=>{if(o.trigger&&o.valueNode&&l&&u&&k&&g&&d){const _=o.trigger.getBoundingClientRect(),I=u.getBoundingClientRect(),j=o.valueNode.getBoundingClientRect(),H=d.getBoundingClientRect();if(o.dir!==C2.RTL){const xe=H.left-I.left,X=j.left-xe,oe=_.left-X,me=_.width+oe,W=Math.max(me,I.width),$e=window.innerWidth-Ua,ke=ip(X,[Ua,Math.max(Ua,$e-W)]);l.style.minWidth=me+"px",l.style.left=ke+"px"}else{const xe=I.right-H.right,X=window.innerWidth-j.right-xe,oe=window.innerWidth-_.right-X,me=_.width+oe,W=Math.max(me,I.width),$e=window.innerWidth-Ua,ke=ip(X,[Ua,Math.max(Ua,$e-W)]);l.style.minWidth=me+"px",l.style.right=ke+"px"}const M=v(),P=window.innerHeight-Ua*2,G=k.scrollHeight,J=window.getComputedStyle(u),q=parseInt(J.borderTopWidth,10),B=parseInt(J.paddingTop,10),L=parseInt(J.borderBottomWidth,10),w=parseInt(J.paddingBottom,10),T=q+B+G+w+L,Q=Math.min(g.offsetHeight*5,T),R=window.getComputedStyle(k),D=parseInt(R.paddingTop,10),K=parseInt(R.paddingBottom,10),we=_.top+_.height/2-Ua,fe=P-we,ye=g.offsetHeight/2,Ve=g.offsetTop+ye,ae=q+B+Ve,F=T-ae;if(ae<=we){const xe=M.length>0&&g===M[M.length-1].ref.current;l.style.bottom="0px";const X=u.clientHeight-k.offsetTop-k.offsetHeight,oe=Math.max(fe,ye+(xe?K:0)+X+L),me=ae+oe;l.style.height=me+"px"}else{const xe=M.length>0&&g===M[0].ref.current;l.style.top="0px";const oe=Math.max(we,q+k.offsetTop+(xe?D:0)+ye)+F;l.style.height=oe+"px",k.scrollTop=ae-we+k.offsetTop}l.style.margin=`${Ua}px 0`,l.style.minHeight=Q+"px",l.style.maxHeight=P+"px",r?.(),requestAnimationFrame(()=>x.current=!0)}},[v,o.trigger,o.valueNode,l,u,k,g,d,o.dir,r]);kt(()=>y(),[y]);const[S,C]=N.useState();kt(()=>{u&&C(window.getComputedStyle(u).zIndex)},[u]);const E=N.useCallback(_=>{_&&b.current===!0&&(y(),h?.(),b.current=!1)},[y,h]);return $.jsx(G2,{scope:n,contentWrapper:l,shouldExpandOnScrollRef:x,onScrollButtonChange:E,children:$.jsx("div",{ref:c,style:{display:"flex",flexDirection:"column",position:"fixed",zIndex:S},children:$.jsx(Oe.div,{...s,ref:f,style:{boxSizing:"border-box",maxHeight:"100%",...s.style}})})})},"SelectItemAlignedPosition")),sy=N.forwardRef(Je(function(t,a){const{__scopeSelect:n,align:r="start",collisionPadding:s=Ua,...o}=t,i=xp(n);return $.jsx(Zb,{...i,...o,ref:a,align:r,collisionPadding:s,style:{boxSizing:"border-box",...o.style,"--radix-select-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-select-content-available-width":"var(--radix-popper-available-width)","--radix-select-content-available-height":"var(--radix-popper-available-height)","--radix-select-trigger-width":"var(--radix-popper-anchor-width)","--radix-select-trigger-height":"var(--radix-popper-anchor-height)"}})},"SelectPopperPosition")),[G2,K2]=Ps(_s,{}),ry="SelectViewport",Y2=N.forwardRef(Je(function(t,a){const{__scopeSelect:n,nonce:r,...s}=t,o=Dl(ry,n),i=K2(ry,n),l=Ze(a,o.onViewportChange),c=N.useRef(0);return $.jsxs($.Fragment,{children:[$.jsx("style",{dangerouslySetInnerHTML:{__html:"[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}"},nonce:r}),$.jsx(jl.Slot,{scope:n,children:$.jsx(Oe.div,{"data-radix-select-viewport":"",role:"presentation",...s,ref:l,style:{position:"relative",flex:1,overflow:"hidden auto",...s.style},onScroll:_e(s.onScroll,u=>{const p=u.currentTarget,{contentWrapper:f,shouldExpandOnScrollRef:v}=i;if(v?.current&&f){const x=Math.abs(c.current-p.scrollTop);if(x>0){const b=window.innerHeight-Ua*2,k=parseFloat(f.style.minHeight),g=parseFloat(f.style.height),d=Math.max(k,g);if(d<b){const h=d+x,y=Math.min(b,h),S=h-y;f.style.height=y+"px",f.style.bottom==="0px"&&(p.scrollTop=S>0?S:0,f.style.justifyContent="flex-end")}}}c.current=p.scrollTop})})})]})},"SelectViewport")),Q2="SelectGroup",[a$,n$]=Ps(Q2),wp="SelectItem",[X2,oy]=Ps(wp),Z2=N.forwardRef(Je(function(t,a){const{__scopeSelect:n,value:r,disabled:s=!1,textValue:o,...i}=t,l=ls(wp,n),c=Dl(wp,n),u=l.value===r,[p,f]=N.useState(o??""),[v,x]=N.useState(!1),b=Ba(y=>c.itemRefCallback?.(y,r,s)),k=Ze(a,b),g=vn(),d=N.useRef("touch");function h(y){l.hasConsumerStoppedPropagationRef.current=y.isPropagationStopped(),l.onUserSelect(r),l.onOpenChange(!1)}return Je(h,"handleSelect"),$.jsx(X2,{scope:n,value:r,disabled:s,textId:g,isSelected:u,onItemTextChange:N.useCallback(y=>{f(S=>S||(y?.textContent??"").trim())},[]),children:$.jsx(jl.ItemSlot,{scope:n,value:r,disabled:s,textValue:p,children:$.jsx(Oe.div,{role:"option","aria-labelledby":g,"data-highlighted":v?"":void 0,"aria-selected":u&&v,"data-state":u?"checked":"unchecked","aria-disabled":s||void 0,"data-disabled":s?"":void 0,tabIndex:s?void 0:-1,...i,ref:k,onFocus:_e(i.onFocus,()=>x(!0)),onBlur:_e(i.onBlur,()=>x(!1)),onClick:_e(i.onClick,y=>{s||d.current!=="mouse"&&h(y)}),onPointerUp:_e(i.onPointerUp,y=>{s||d.current==="mouse"&&h(y)}),onPointerDown:_e(i.onPointerDown,y=>{d.current=y.pointerType}),onPointerMove:_e(i.onPointerMove,y=>{d.current=y.pointerType,s?c.onItemLeave?.():d.current==="mouse"&&y.currentTarget.focus({preventScroll:!0})}),onPointerLeave:_e(i.onPointerLeave,y=>{y.currentTarget===document.activeElement&&c.onItemLeave?.()}),onKeyDown:_e(i.onKeyDown,y=>{s||y.target!==y.currentTarget||c.searchRef?.current!==""&&y.key===" "||($2.includes(y.key)&&h(y),y.key===" "&&y.preventDefault())})})})})},"SelectItem")),Ol="SelectItemText",J2=N.forwardRef(Je(function(t,a){const{__scopeSelect:n,className:r,style:s,...o}=t,i=ls(Ol,n),l=Dl(Ol,n),c=oy(Ol,n),u=I2(Ol,n),[p,f]=N.useState(null),v=Ba(h=>l.itemTextRefCallback?.(h,c.value,c.disabled)),x=Ze(a,f,c.onItemTextChange,v),b=p?.textContent,k=N.useMemo(()=>$.jsx("option",{value:c.value,disabled:c.disabled,children:b},c.value),[c.disabled,c.value,b]),{onNativeOptionAdd:g,onNativeOptionRemove:d}=u;return kt(()=>(g(k),()=>d(k)),[g,d,k]),$.jsxs($.Fragment,{children:[$.jsx(Oe.span,{id:c.textId,...o,ref:x}),c.isSelected&&i.valueNode&&!i.valueNodeHasChildren&&!Io(i.value)?dr.createPortal(o.children,i.valueNode):null]})},"SelectItemText")),eE="SelectItemIndicator",tE=N.forwardRef(Je(function(t,a){const{__scopeSelect:n,...r}=t;return oy(eE,n).isSelected?$.jsx(Oe.span,{"aria-hidden":!0,...r,ref:a}):null},"SelectItemIndicator")),aE="SelectBubbleInput",nE=N.forwardRef(Je(function({__scopeSelect:t,...a},n){const r=ls(aE,t),{value:s,onValueChange:o,required:i,disabled:l,name:c,autoComplete:u,form:p,userSelection:f}=r,{nativeOptions:v,nativeSelectKey:x}=r,b=N.useRef(null),k=Ze(n,b),g=s??"",d=N.useRef(g),h=N.useRef(f),y=N.useRef(!1),S=Array.from(v).some(C=>(C.props.value??"")==="");return N.useEffect(()=>{const C=b.current;if(!C)return;const E=window.HTMLSelectElement.prototype,I=Object.getOwnPropertyDescriptor(E,"value").set,j=f!==null&&f!==h.current;h.current=f;const H=d.current!==g;d.current=g;const M=j&&H;if(j&&!H&&f.value!==g&&!f.hasConsumerStoppedPropagation&&I){y.current=!0;try{I.call(C,f.value),C.dispatchEvent(new Event("change",{bubbles:!0}))}finally{y.current=!1,I.call(C,g)}return}const P=M&&!f.hasConsumerStoppedPropagation;if(H&&I){const G=new Event("change",{bubbles:P});I.call(C,g),C.dispatchEvent(G)}},[g,f]),$.jsxs(Oe.select,{"aria-hidden":!0,required:i,tabIndex:-1,name:c,autoComplete:u,disabled:l,form:p,onChange:C=>{y.current||o(C.target.value)},...a,style:{...ey,...a.style},ref:k,defaultValue:g,children:[Io(s)&&!S?$.jsx("option",{value:""}):null,Array.from(v)]},x)},"SelectBubbleInput"));function iy(e){return typeof e=="function"}Je(iy,"isFunction");function Io(e){return e===""||e===void 0}Je(Io,"shouldShowPlaceholder");function kp(e){const t=Ba(e),a=N.useRef(""),n=N.useRef(0),r=N.useCallback(o=>{const i=a.current+o;t(i);function l(c){a.current=c,window.clearTimeout(n.current),c!==""&&(n.current=window.setTimeout(()=>l(""),1e3))}Je(l,"updateSearch"),l(i)},[t]),s=N.useCallback(()=>{a.current="",window.clearTimeout(n.current)},[]);return N.useEffect(()=>()=>window.clearTimeout(n.current),[]),[a,r,s]}Je(kp,"useTypeaheadSearch");function Np(e,t,a){const r=t.length>1&&Array.from(t).every(c=>c===t[0])?t[0]:t,s=a?e.indexOf(a):-1;let o=ly(e,Math.max(s,0));r.length===1&&(o=o.filter(c=>c!==a));const l=o.find(c=>c.textValue.toLowerCase().startsWith(r.toLowerCase()));return l!==a?l:void 0}Je(Np,"findNextItem");function ly(e,t){return e.map((a,n)=>e[(t+n)%e.length])}Je(ly,"wrapArray");var sE=Object.defineProperty,Tt=(e,t)=>sE(e,"name",{value:t,configurable:!0}),[Sp,s$]=ba("Tooltip",[Rl]),Ll=Rl(),rE="TooltipProvider",oE=700,Cp="tooltip.open",[iE,Ep]=Sp(rE),lE=Tt(e=>{const{__scopeTooltip:t,delayDuration:a=oE,skipDelayDuration:n=300,disableHoverableContent:r=!1,children:s}=e,o=N.useRef(!0),i=N.useRef(!1),l=N.useRef(0);return N.useEffect(()=>{const c=l.current;return()=>window.clearTimeout(c)},[]),$.jsx(iE,{scope:t,isOpenDelayedRef:o,delayDuration:a,onOpen:N.useCallback(()=>{n<=0||(window.clearTimeout(l.current),o.current=!1)},[n]),onClose:N.useCallback(()=>{n<=0||(window.clearTimeout(l.current),l.current=window.setTimeout(()=>o.current=!0,n))},[n]),isPointerInTransitRef:i,onPointerInTransitChange:N.useCallback(c=>{i.current=c},[]),disableHoverableContent:r,children:s})},"TooltipProvider"),$p="Tooltip",[dE,Ro]=Sp($p),dy=Tt(e=>{const{__scopeTooltip:t,children:a,open:n,defaultOpen:r,onOpenChange:s,disableHoverableContent:o,delayDuration:i}=e,l=Ep($p,e.__scopeTooltip),c=Ll(t),[u,p]=N.useState(null),[f,v]=N.useState(void 0),x=vn(),b=N.useRef(0),k=o??l.disableHoverableContent,g=i??l.delayDuration,d=N.useRef(!1),[h,y]=_a({prop:n,defaultProp:r??!1,onChange:Tt(j=>{j?(l.onOpen(),document.dispatchEvent(new CustomEvent(Cp))):l.onClose(),s?.(j)},"onChange"),caller:$p}),S=N.useMemo(()=>h?d.current?"delayed-open":"instant-open":"closed",[h]),C=N.useCallback(()=>{window.clearTimeout(b.current),b.current=0,d.current=!1,y(!0)},[y]),E=N.useCallback(()=>{window.clearTimeout(b.current),b.current=0,y(!1)},[y]),_=N.useCallback(()=>{window.clearTimeout(b.current),b.current=window.setTimeout(()=>{d.current=!0,y(!0),b.current=0},g)},[g,y]);N.useEffect(()=>()=>{b.current&&(window.clearTimeout(b.current),b.current=0)},[]);const I=f??x;return $.jsx(Yb,{...c,children:$.jsx(dE,{scope:t,contentId:I,setContentId:v,open:h,stateAttribute:S,trigger:u,onTriggerChange:p,onTriggerEnter:N.useCallback(()=>{l.isOpenDelayedRef.current?_():C()},[l.isOpenDelayedRef,_,C]),onTriggerLeave:N.useCallback(()=>{k?E():(window.clearTimeout(b.current),b.current=0)},[E,k]),onOpen:C,onClose:E,disableHoverableContent:k,children:a})})},"Tooltip"),cy="TooltipTrigger",uy=N.forwardRef(Tt(function(t,a){const{__scopeTooltip:n,"aria-describedby":r,...s}=t,o=Ro(cy,n),i=Ep(cy,n),l=Ll(n),c=N.useRef(null),u=Ze(a,c,o.onTriggerChange),p=N.useRef(!1),f=N.useRef(!1),v=N.useCallback(()=>p.current=!1,[]);return N.useEffect(()=>()=>document.removeEventListener("pointerup",v),[v]),$.jsx(Qb,{asChild:!0,...l,children:$.jsx(Oe.button,{"aria-describedby":o.open?ky(r,o.contentId):r,"data-state":o.stateAttribute,...s,ref:u,onPointerMove:_e(t.onPointerMove,x=>{x.pointerType!=="touch"&&!f.current&&!i.isPointerInTransitRef.current&&(o.onTriggerEnter(),f.current=!0)}),onPointerLeave:_e(t.onPointerLeave,()=>{o.onTriggerLeave(),f.current=!1}),onPointerDown:_e(t.onPointerDown,()=>{o.open&&o.onClose(),p.current=!0,document.addEventListener("pointerup",v,{once:!0})}),onFocus:_e(t.onFocus,()=>{p.current||o.onOpen()}),onBlur:_e(t.onBlur,o.onClose),onClick:_e(t.onClick,o.onClose)})})},"TooltipTrigger")),py="TooltipPortal",[cE,uE]=Sp(py,{forceMount:void 0}),fy=Tt(e=>{const{__scopeTooltip:t,forceMount:a,children:n,container:r}=e,s=Ro(py,t);return $.jsx(cE,{scope:t,forceMount:a,children:$.jsx(es,{present:a||s.open,children:$.jsx(wu,{asChild:!0,container:r,children:n})})})},"TooltipPortal"),Ao="TooltipContent",my=N.forwardRef(Tt(function(t,a){const n=uE(Ao,t.__scopeTooltip),{forceMount:r=n.forceMount,side:s="top",...o}=t,i=Ro(Ao,t.__scopeTooltip);return $.jsx(es,{present:r||i.open,children:i.disableHoverableContent?$.jsx(gy,{side:s,...o,ref:a}):$.jsx(pE,{side:s,...o,ref:a})})},"TooltipContent")),pE=N.forwardRef(Tt(function(t,a){const n=Ro(Ao,t.__scopeTooltip),r=Ep(Ao,t.__scopeTooltip),s=N.useRef(null),o=Ze(a,s),[i,l]=N.useState(null),{trigger:c,onClose:u}=n,p=s.current,{onPointerInTransitChange:f}=r,v=N.useCallback(()=>{l(null),f(!1)},[f]),x=N.useCallback((b,k)=>{const g=b.currentTarget,d={x:b.clientX,y:b.clientY},h=hy(d,g.getBoundingClientRect()),y=vy(d,h),S=by(k.getBoundingClientRect()),C=xy([...y,...S]);l(C),f(!0)},[f]);return N.useEffect(()=>()=>v(),[v]),N.useEffect(()=>{if(c&&p){const b=Tt(g=>x(g,p),"handleTriggerLeave"),k=Tt(g=>x(g,c),"handleContentLeave");return c.addEventListener("pointerleave",b),p.addEventListener("pointerleave",k),()=>{c.removeEventListener("pointerleave",b),p.removeEventListener("pointerleave",k)}}},[c,p,x,v]),N.useEffect(()=>{if(i){const b=Tt(k=>{const g=k.target,d={x:k.clientX,y:k.clientY},h=c?.contains(g)||p?.contains(g),y=!yy(d,i);h?v():y&&(v(),u())},"handleTrackPointerGrace");return document.addEventListener("pointermove",b),()=>document.removeEventListener("pointermove",b)}},[c,p,i,u,v]),$.jsx(gy,{...t,ref:o})},"TooltipContentHoverable")),fE=kh("TooltipContent"),gy=N.forwardRef(Tt(function(t,a){const{__scopeTooltip:n,children:r,"aria-label":s,id:o,onEscapeKeyDown:i,onPointerDownOutside:l,...c}=t,u=Ro(Ao,n),p=Ll(n),{onClose:f}=u,[v,x]=N.useState(null),b=Ze(a,x);Xh(v),N.useEffect(()=>(document.addEventListener(Cp,f),()=>document.removeEventListener(Cp,f)),[f]),N.useEffect(()=>{if(u.trigger){const g=Tt(d=>{d.target instanceof Node&&d.target.contains(u.trigger)&&f()},"handleScroll");return window.addEventListener("scroll",g,{capture:!0}),()=>window.removeEventListener("scroll",g,{capture:!0})}},[u.trigger,f]);const{setContentId:k}=u;return kt(()=>(k(o),()=>{k(void 0)}),[o,k]),$.jsx(fu,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:i,onPointerDownOutside:l,onFocusOutside:g=>g.preventDefault(),onDismiss:f,children:$.jsxs(Zb,{"data-state":u.stateAttribute,role:s?void 0:"tooltip",id:s?void 0:u.contentId,...p,...c,ref:b,style:{...c.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"},children:[$.jsx(fE,{children:r}),s?$.jsx(N2,{id:u.contentId,role:"tooltip",children:s}):null]})})},"TooltipContentImpl")),mE=N.forwardRef(Tt(function(t,a){const{__scopeTooltip:n,...r}=t,s=Ll(n);return $.jsx(y2,{...s,...r,ref:a})},"TooltipArrow"));function hy(e,t){const a=Math.abs(t.top-e.y),n=Math.abs(t.bottom-e.y),r=Math.abs(t.right-e.x),s=Math.abs(t.left-e.x);switch(Math.min(a,n,r,s)){case s:return"left";case r:return"right";case a:return"top";case n:return"bottom";default:throw new Error("unreachable")}}Tt(hy,"getExitSideFromRect");function vy(e,t,a=5){const n=[];switch(t){case"top":n.push({x:e.x-a,y:e.y+a},{x:e.x+a,y:e.y+a});break;case"bottom":n.push({x:e.x-a,y:e.y-a},{x:e.x+a,y:e.y-a});break;case"left":n.push({x:e.x+a,y:e.y-a},{x:e.x+a,y:e.y+a});break;case"right":n.push({x:e.x-a,y:e.y-a},{x:e.x-a,y:e.y+a});break}return n}Tt(vy,"getPaddedExitPoints");function by(e){const{top:t,right:a,bottom:n,left:r}=e;return[{x:r,y:t},{x:a,y:t},{x:a,y:n},{x:r,y:n}]}Tt(by,"getPointsFromRect");function yy(e,t){const{x:a,y:n}=e;let r=!1;for(let s=0,o=t.length-1;s<t.length;o=s++){const i=t[s],l=t[o],c=i.x,u=i.y,p=l.x,f=l.y;u>n!=f>n&&a<(p-c)*(n-u)/(f-u)+c&&(r=!r)}return r}Tt(yy,"isPointInPolygon");function xy(e){const t=e.slice();return t.sort((a,n)=>a.x<n.x?-1:a.x>n.x?1:a.y<n.y?-1:a.y>n.y?1:0),wy(t)}Tt(xy,"getHull");function wy(e){if(e.length<=1)return e.slice();const t=[];for(let n=0;n<e.length;n++){const r=e[n];for(;t.length>=2;){const s=t[t.length-1],o=t[t.length-2];if((s.x-o.x)*(r.y-o.y)>=(s.y-o.y)*(r.x-o.x))t.pop();else break}t.push(r)}t.pop();const a=[];for(let n=e.length-1;n>=0;n--){const r=e[n];for(;a.length>=2;){const s=a[a.length-1],o=a[a.length-2];if((s.x-o.x)*(r.y-o.y)>=(s.y-o.y)*(r.x-o.x))a.pop();else break}a.push(r)}return a.pop(),t.length===1&&a.length===1&&t[0].x===a[0].x&&t[0].y===a[0].y?t:t.concat(a)}Tt(wy,"getHullPresorted");function ky(...e){const t=new Set;for(const a of e)if(typeof a=="string")for(const n of String(a).trim().split(/\s+/))n&&t.add(n);return t.size>0?Array.from(t).join(" "):void 0}Tt(ky,"concatAriaDescribedby");var gE=Object.defineProperty,$n=(e,t)=>gE(e,"name",{value:t,configurable:!0}),Ny="Progress",Tp=100,[hE,r$]=ba(Ny),[vE,bE]=hE(Ny),yE=N.forwardRef($n(function(t,a){const{__scopeProgress:n,value:r=null,max:s,getValueLabel:o=Sy,...i}=t;(s||s===0)&&!_p(s)&&console.error(Cy(`${s}`,"Progress"));const l=_p(s)?s:Tp;r!==null&&!Ip(r,l)&&console.error(Ey(`${r}`,"Progress"));const c=Ip(r,l)?r:null,u=jo(c)?o(c,l):void 0;return $.jsx(vE,{scope:n,value:c,max:l,children:$.jsx(Oe.div,{"aria-valuemax":l,"aria-valuemin":0,"aria-valuenow":jo(c)?c:void 0,"aria-valuetext":u,role:"progressbar","data-state":Pp(c,l),"data-value":c??void 0,"data-max":l,...i,ref:a})})},"Progress")),xE="ProgressIndicator",wE=N.forwardRef($n(function(t,a){const{__scopeProgress:n,...r}=t,s=bE(xE,n);return $.jsx(Oe.div,{"data-state":Pp(s.value,s.max),"data-value":s.value??void 0,"data-max":s.max,...r,ref:a})},"ProgressIndicator"));function Sy(e,t){return`${Math.round(e/t*100)}%`}$n(Sy,"defaultGetValueLabel");function Pp(e,t){return e==null?"indeterminate":e===t?"complete":"loading"}$n(Pp,"getProgressState");function jo(e){return typeof e=="number"}$n(jo,"isNumber");function _p(e){return jo(e)&&!isNaN(e)&&e>0}$n(_p,"isValidMaxNumber");function Ip(e,t){return jo(e)&&!isNaN(e)&&e<=t&&e>=0}$n(Ip,"isValidValueNumber");function Cy(e,t){return`Invalid prop \`max\` of value \`${e}\` supplied to \`${t}\`. Only numbers greater than 0 are valid max values. Defaulting to \`${Tp}\`.`}$n(Cy,"getInvalidMaxError");function Ey(e,t){return`Invalid prop \`value\` of value \`${e}\` supplied to \`${t}\`. The \`value\` prop must be:
|
|
949
949
|
- a positive number
|
|
950
950
|
- less than the value passed to \`max\` (or ${Tp} if no \`max\` prop is set)
|
|
951
951
|
- \`null\` or \`undefined\` if the progress is indeterminate.
|
|
952
952
|
|
|
953
|
-
Defaulting to \`null\`.`}$n(Ey,"getInvalidValueError");const $y=
|
|
953
|
+
Defaulting to \`null\`.`}$n(Ey,"getInvalidValueError");const $y=lE;function kE({title:e,hint:t,onClose:a,footer:n,children:r}){return N.useEffect(()=>{const s=o=>{o.key==="Escape"&&(o.stopPropagation(),a())};return window.addEventListener("keydown",s),()=>window.removeEventListener("keydown",s)},[a]),$.jsx(Sv,{open:!0,onOpenChange:s=>{s||a()},children:$.jsxs(Ru,{container:xr(),children:[$.jsx(ju,{className:"fixed inset-0 z-[95] bg-black/45 backdrop-blur-[1px] data-[state=open]:animate-in data-[state=open]:fade-in-0"}),$.jsxs(Du,{"aria-describedby":void 0,className:"fixed right-0 top-0 z-[96] flex h-full w-[min(760px,96vw)] flex-col border-l border-border bg-card text-card-foreground shadow-[0_0_60px_rgba(0,0,0,.35)] outline-none",children:[$.jsxs("div",{className:"flex shrink-0 items-start justify-between gap-4 border-b border-border px-5 py-3.5",children:[$.jsxs("div",{className:"min-w-0",children:[$.jsx(Ou,{className:"truncate text-[15px] font-semibold leading-tight",children:e}),t?$.jsx("div",{className:"mt-1 text-[11.5px] leading-relaxed text-muted-foreground",children:t}):null]}),$.jsx(Pv,{asChild:!0,children:$.jsxs(wr,{variant:"ghost",size:"sm",className:"h-7 shrink-0 px-2 text-[12px]",children:[$.jsx(yh,{className:"mr-1 h-3.5 w-3.5"}),"关闭"]})})]}),$.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto px-5 py-4",children:r}),n?$.jsx("div",{className:"shrink-0 border-t border-border px-5 py-3",children:n}):null]})]})})}function NE({label:e,children:t}){return e==null||e===""?t:$.jsx($y,{delayDuration:260,children:$.jsxs(dy,{children:[$.jsx(uy,{asChild:!0,children:t}),$.jsx(fy,{container:xr(),children:$.jsx(my,{sideOffset:6,className:"z-[120] max-w-[240px] rounded-md border border-border bg-card px-2 py-1 text-[11.5px] leading-[1.45] text-foreground shadow-md",children:e})})]})})}function SE({items:e,value:t,onChange:a,className:n}){return $.jsx(sp,{value:t,onValueChange:a,className:pt("min-w-0",n),children:$.jsx(xl,{children:e.map(r=>$.jsx(NE,{label:r.hint,children:$.jsxs($o,{value:r.id,children:[r.label,r.count===void 0||r.count===null||r.count===""?null:$.jsx("span",{className:"ml-1 rounded-[4px] bg-foreground/8 px-1 text-[10.5px] font-medium tabular-nums text-muted-foreground",children:String(r.count)})]})},r.id))})})}function CE({value:e,onChange:t,options:a,className:n}){return $.jsx(QS,{type:"single",value:e,onValueChange:r=>r&&t(r),className:pt("inline-flex items-center gap-0.5 rounded-lg border border-border bg-muted p-0.5",n),children:a.map(r=>$.jsx(tC,{value:r.id,"aria-label":r.label,className:"inline-flex h-6 items-center gap-1 rounded-md px-2 text-[11.5px] text-muted-foreground transition hover:text-foreground data-[state=on]:bg-primary data-[state=on]:text-primary-foreground data-[state=on]:shadow-sm",children:r.label},r.id))})}function EE({value:e,onChange:t,options:a,placeholder:n="请选择",id:r,disabled:s,className:o,style:i}){return $.jsxs(R2,{value:e===""||e===void 0?void 0:String(e),onValueChange:t,disabled:s,children:[$.jsxs(j2,{id:r,style:i,className:pt("flex h-9 w-full min-w-0 items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-1 text-sm whitespace-nowrap shadow-sm transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-[placeholder]:text-muted-foreground [&_svg:not([class*=text-])]:text-muted-foreground dark:hover:bg-input/50",o),children:[$.jsx(O2,{placeholder:n}),$.jsx(L2,{asChild:!0,children:$.jsx(w1,{className:"h-3.5 w-3.5 opacity-60"})})]}),$.jsx(B2,{container:xr(),children:$.jsx(U2,{position:"popper",sideOffset:4,className:"relative z-[120] max-h-[280px] min-w-[8rem] overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-md",children:$.jsx(Y2,{className:"p-1",children:a.map(l=>$.jsxs(Z2,{value:String(l.value),className:"relative flex w-full cursor-default select-none items-center gap-2 rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",children:[$.jsx(tE,{className:"absolute left-1.5 flex items-center",children:$.jsx(bh,{className:"h-3.5 w-3.5"})}),$.jsx(J2,{children:l.label})]},String(l.value)))})})})]})}function $E({checked:e,onChange:t,label:a,hint:n,disabled:r,bare:s=!1}){const o=$.jsx(Xv,{checked:e===!0,onCheckedChange:i=>t(i),disabled:r,className:"h-5 w-9 shrink-0 rounded-full border border-transparent bg-input transition-colors data-[state=checked]:bg-primary disabled:opacity-50",children:$.jsx(Zv,{className:"block h-4 w-4 translate-x-0.5 rounded-full bg-card shadow transition-transform data-[state=checked]:translate-x-[18px]"})});return s===!0||a===void 0&&n===void 0?o:$.jsxs("div",{className:"flex items-start justify-between gap-4 py-1.5",children:[$.jsxs("div",{className:"min-w-0",children:[$.jsx("div",{className:"text-[12.5px] leading-snug",children:a}),n?$.jsx("div",{className:"mt-0.5 text-[11px] leading-relaxed text-muted-foreground",children:n}):null]}),$.jsx("div",{className:"mt-0.5",children:o})]})}function TE({label:e,children:t}){return e?$.jsx($y,{delayDuration:250,children:$.jsxs(dy,{children:[$.jsx(uy,{asChild:!0,children:t}),$.jsx(fy,{container:xr(),children:$.jsxs(my,{sideOffset:6,className:"z-[130] max-w-[280px] rounded-md bg-primary px-2 py-1 text-[11.5px] leading-snug text-primary-foreground shadow",children:[e,$.jsx(mE,{className:"fill-primary"})]})})]})}):t}function PE({value:e,tone:t,className:a}){const n=Math.max(0,Math.min(100,Number(e)||0)),r=t==="over"?"bg-destructive":t==="warn"?"bg-amber-500":"bg-primary";return $.jsx(yE,{className:pt("relative h-2 w-full overflow-hidden rounded-full bg-muted",a),value:n,children:$.jsx(wE,{className:"h-full w-full transition-transform "+r,style:{transform:`translateX(-${100-n}%)`}})})}function _E({open:e,title:t,message:a,danger:n=!1,okText:r="确定",cancelText:s="取消",input:o=!1,value:i="",placeholder:l="",onChange:c,onOk:u,onCancel:p}){return $.jsx(Sv,{open:e===!0,onOpenChange:f=>{f||p()},children:$.jsxs(Ru,{container:xr(),children:[$.jsx(ju,{className:"fixed inset-0 z-[95] bg-black/55 backdrop-blur-[2px]"}),$.jsxs(Du,{className:"fixed left-1/2 top-1/2 z-[96] w-[min(440px,92vw)] -translate-x-1/2 -translate-y-1/2 rounded-xl border border-border bg-card p-4 text-card-foreground shadow-xl",children:[$.jsx(Ou,{className:"text-[13px] font-semibold leading-snug",children:t}),a?$.jsx(Tv,{className:"mt-1.5 whitespace-pre-wrap text-[12px] leading-relaxed text-muted-foreground",children:a}):null,o?$.jsx("textarea",{autoFocus:!0,rows:3,value:i,placeholder:l,onChange:f=>c(f.target.value),className:"mt-3 box-border w-full min-w-0 resize-y rounded-md border border-input bg-card px-2.5 py-2 text-[12.5px] leading-relaxed focus:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/35"}):null,$.jsxs("div",{className:"mt-4 flex items-center justify-end gap-2",children:[$.jsx(wr,{variant:"outline",size:"sm",onClick:p,children:s}),$.jsx(wr,{variant:n?"destructive":"default",size:"sm",onClick:u,children:r})]})]})]})})}const Ty="dsh-studio-tw";function IE(){if(typeof document>"u"||document.getElementById(Ty))return;const e=document.createElement("style");e.id=Ty,e.textContent=Qy,(document.body??document.head).appendChild(e)}window.__ModuleLoader__.load({id:"dsh-studio",factory(e){IE();const t=e("react"),a=rw(An,N.createElement),n={SegGroup:CE,Tabs:sp,TabsList:xl,TabsTrigger:$o,SheetDrawer:kE,TabsBar:SE,SelectBox:EE,SwitchBox:$E,Tip:TE,ProgressBar:PE,DialogBox:_E,Badge:RS,Input:bl,Textarea:mb,Label:yl};typeof a.useUIKit=="function"&&a.useUIKit(n);const r=u1(a,t,{pageProps:{loginGate:VS,ui:n}});return{inject:["slots"],apply(s){const o=[];o.push(s.slots.inject("main",()=>s.slots.register({name:"main",key:"studio"},r))),o.push(s.slots.inject("sidebar.panellist",()=>s.slots.register({name:"sidebar.panellist",id:"studio",order:12,label:()=>"需求&任务工作空间"},a.StudioIcon)));const i=()=>{for(const l of o.splice(0).reverse())l()};return typeof s.effect=="function"&&s.effect(()=>i),i},StudioPage:a.StudioPage,StudioIcon:a.StudioIcon}}})})();
|