@marsken/dsh-studio 0.1.9 → 0.1.11
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/AGENTS.md +4 -1
- package/README.md +11 -0
- package/client.js +48 -48
- package/dist/client.js +48 -48
- package/docs/compatibility.md +1 -1
- package/docs/publish.md +2 -0
- package/package.json +4 -2
- package/src/host/cases.js +4 -0
- package/src/host/impact.js +4 -2
- package/src/host/quality.js +17 -1
- package/src/host/routes/requirements.js +20 -1
- package/src/host/routes/tasks.js +1 -1
package/dist/client.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var
|
|
1
|
+
var Oy=qt=>{throw TypeError(qt)};var Ly=(qt,oa,ga)=>oa.has(qt)||Oy("Cannot "+ga);var Yt=(qt,oa,ga)=>(Ly(qt,oa,"read from private field"),ga?ga.call(qt):oa.get(qt)),My=(qt,oa,ga)=>oa.has(qt)?Oy("Cannot add the same private member more than once"):oa instanceof WeakSet?oa.add(qt):oa.set(qt,ga),zp=(qt,oa,ga,Me)=>(Ly(qt,oa,"write to private field"),Me?Me.call(qt,ga):oa.set(qt,ga),ga);(function(){"use strict";var St,Ca;function qt(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 oa(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var ga={exports:{}},Me={};/**
|
|
2
2
|
* @license React
|
|
3
3
|
* react.production.min.js
|
|
4
4
|
*
|
|
@@ -6,32 +6,32 @@ var Ry=Ft=>{throw TypeError(Ft)};var Ay=(Ft,na,ua)=>na.has(Ft)||Ry("Cannot "+ua)
|
|
|
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"),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 zl(e,t,a){this.props=e,this.context=t,this.refs=Mp,this.updater=a||Op}var Fl=zl.prototype=new zp;Fl.constructor=zl,Lp(Fl,Rs.prototype),Fl.isPureReactComponent=!0;var Fp=Array.isArray,Bp=Object.prototype.hasOwnProperty,Bl={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:Bl.current}}function Hy(e,t){return{$$typeof:$r,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}function Ul(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 ql(e,t){return typeof e=="object"&&e!==null&&e.key!=null?Gy(""+e.key):t.toString(36)}function Lo(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===""?"."+ql(o,0):n,Fp(r)?(a="",e!=null&&(a=e.replace(Vp,"$&/")+"/"),Lo(r,t,a,"",function(c){return c})):r!=null&&(Ul(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+ql(s,i);o+=Lo(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+ql(s,i++),o+=Lo(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 Mo(e,t,a){if(e==null)return e;var n=[],r=0;return Lo(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},zo={transition:null},Yy={ReactCurrentDispatcher:Xt,ReactCurrentBatchConfig:zo,ReactCurrentOwner:Bl};function Wp(){throw Error("act(...) is not supported in production builds of React.")}De.Children={map:Mo,forEach:function(e,t,a){Mo(e,function(){t.apply(this,arguments)},a)},count:function(e){var t=0;return Mo(e,function(){t++}),t},toArray:function(e){return Mo(e,function(t){return t})||[]},only:function(e){if(!Ul(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=zl,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=Bl.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=Ul,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=zo.transition;zo.transition={};try{e()}finally{zo.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",ua.exports=De;var N=ua.exports;const An=Ft({__proto__:null,default:na(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,`
|
|
9
|
+
*/var Rr=Symbol.for("react.element"),zy=Symbol.for("react.portal"),Fy=Symbol.for("react.fragment"),By=Symbol.for("react.strict_mode"),Uy=Symbol.for("react.profiler"),qy=Symbol.for("react.provider"),Vy=Symbol.for("react.context"),Wy=Symbol.for("react.forward_ref"),Hy=Symbol.for("react.suspense"),Gy=Symbol.for("react.memo"),Ky=Symbol.for("react.lazy"),Fp=Symbol.iterator;function Yy(e){return e===null||typeof e!="object"?null:(e=Fp&&e[Fp]||e["@@iterator"],typeof e=="function"?e:null)}var Bp={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Up=Object.assign,qp={};function Ls(e,t,a){this.props=e,this.context=t,this.refs=qp,this.updater=a||Bp}Ls.prototype.isReactComponent={},Ls.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")},Ls.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Vp(){}Vp.prototype=Ls.prototype;function Vl(e,t,a){this.props=e,this.context=t,this.refs=qp,this.updater=a||Bp}var Wl=Vl.prototype=new Vp;Wl.constructor=Vl,Up(Wl,Ls.prototype),Wl.isPureReactComponent=!0;var Wp=Array.isArray,Hp=Object.prototype.hasOwnProperty,Hl={current:null},Gp={key:!0,ref:!0,__self:!0,__source:!0};function Kp(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)Hp.call(t,n)&&!Gp.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:Rr,type:e,key:s,ref:o,props:r,_owner:Hl.current}}function Qy(e,t){return{$$typeof:Rr,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}function Gl(e){return typeof e=="object"&&e!==null&&e.$$typeof===Rr}function Xy(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(a){return t[a]})}var Yp=/\/+/g;function Kl(e,t){return typeof e=="object"&&e!==null&&e.key!=null?Xy(""+e.key):t.toString(36)}function Uo(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 Rr:case zy:o=!0}}if(o)return o=e,r=r(o),e=n===""?"."+Kl(o,0):n,Wp(r)?(a="",e!=null&&(a=e.replace(Yp,"$&/")+"/"),Uo(r,t,a,"",function(c){return c})):r!=null&&(Gl(r)&&(r=Qy(r,a+(!r.key||o&&o.key===r.key?"":(""+r.key).replace(Yp,"$&/")+"/")+e)),t.push(r)),1;if(o=0,n=n===""?".":n+":",Wp(e))for(var i=0;i<e.length;i++){s=e[i];var l=n+Kl(s,i);o+=Uo(s,t,a,l,r)}else if(l=Yy(e),typeof l=="function")for(e=l.call(e),i=0;!(s=e.next()).done;)s=s.value,l=n+Kl(s,i++),o+=Uo(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 qo(e,t,a){if(e==null)return e;var n=[],r=0;return Uo(e,n,"","",function(s){return t.call(a,s,r++)}),n}function Zy(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 ta={current:null},Vo={transition:null},Jy={ReactCurrentDispatcher:ta,ReactCurrentBatchConfig:Vo,ReactCurrentOwner:Hl};function Qp(){throw Error("act(...) is not supported in production builds of React.")}Me.Children={map:qo,forEach:function(e,t,a){qo(e,function(){t.apply(this,arguments)},a)},count:function(e){var t=0;return qo(e,function(){t++}),t},toArray:function(e){return qo(e,function(t){return t})||[]},only:function(e){if(!Gl(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},Me.Component=Ls,Me.Fragment=Fy,Me.Profiler=Uy,Me.PureComponent=Vl,Me.StrictMode=By,Me.Suspense=Hy,Me.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Jy,Me.act=Qp,Me.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=Up({},e.props),r=e.key,s=e.ref,o=e._owner;if(t!=null){if(t.ref!==void 0&&(s=t.ref,o=Hl.current),t.key!==void 0&&(r=""+t.key),e.type&&e.type.defaultProps)var i=e.type.defaultProps;for(l in t)Hp.call(t,l)&&!Gp.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:Rr,type:e.type,key:r,ref:s,props:n,_owner:o}},Me.createContext=function(e){return e={$$typeof:Vy,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null},e.Provider={$$typeof:qy,_context:e},e.Consumer=e},Me.createElement=Kp,Me.createFactory=function(e){var t=Kp.bind(null,e);return t.type=e,t},Me.createRef=function(){return{current:null}},Me.forwardRef=function(e){return{$$typeof:Wy,render:e}},Me.isValidElement=Gl,Me.lazy=function(e){return{$$typeof:Ky,_payload:{_status:-1,_result:e},_init:Zy}},Me.memo=function(e,t){return{$$typeof:Gy,type:e,compare:t===void 0?null:t}},Me.startTransition=function(e){var t=Vo.transition;Vo.transition={};try{e()}finally{Vo.transition=t}},Me.unstable_act=Qp,Me.useCallback=function(e,t){return ta.current.useCallback(e,t)},Me.useContext=function(e){return ta.current.useContext(e)},Me.useDebugValue=function(){},Me.useDeferredValue=function(e){return ta.current.useDeferredValue(e)},Me.useEffect=function(e,t){return ta.current.useEffect(e,t)},Me.useId=function(){return ta.current.useId()},Me.useImperativeHandle=function(e,t,a){return ta.current.useImperativeHandle(e,t,a)},Me.useInsertionEffect=function(e,t){return ta.current.useInsertionEffect(e,t)},Me.useLayoutEffect=function(e,t){return ta.current.useLayoutEffect(e,t)},Me.useMemo=function(e,t){return ta.current.useMemo(e,t)},Me.useReducer=function(e,t,a){return ta.current.useReducer(e,t,a)},Me.useRef=function(e){return ta.current.useRef(e)},Me.useState=function(e){return ta.current.useState(e)},Me.useSyncExternalStore=function(e,t,a){return ta.current.useSyncExternalStore(e,t,a)},Me.useTransition=function(){return ta.current.useTransition()},Me.version="18.3.1",ga.exports=Me;var N=ga.exports;const Fn=qt({__proto__:null,default:oa(N)},[N]),ex=`[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 tx(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 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 Ha(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 ja={product:"产品",architect:"架构",dev:"研发",qa:"测试"},As={urgent:"紧急",normal:"普通",relaxed:"宽松"},Fo={requirement:"需求",bug:"缺陷",design:"设计",dev:"开发",test:"测试",ops:"运维"},Vl={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"],Wl={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:"要求修改"},Hl={active:"进行中",paused:"暂停",archived:"已归档"},Gl={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`🎯 ${ja[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?ja[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:"角色 · "+(ja[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} · ${ja[a.role]??a.role}`:ja[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 Bo(e,t){const a=String(t??"").trim().toLowerCase();return a===""?e:e.filter(n=>`${n.name} ${n.hint}`.toLowerCase().includes(a))}function Uo(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 Kl(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 Yl(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 Ql(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=Uo(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=Yl(n),g=Kl(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},`· ${
|
|
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(Pe=>Pe.trim()).filter(Pe=>Pe!=="")),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)}}},wt=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}),Pe=se?.bug??null;if(A==="fail"&&Pe!==null){const Be=String(Pe.code??"")!==""?Pe.code:Pe.id;P(`用例判失败,已自动登记缺陷 ${Be}(挂在同一条需求下,父任务指向本卡)。`)}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??{},Pe=(A?.bugs??[]).filter(Na=>Na.created===!0).length,Be=[`跑了 ${se.total??0} 条:通过 ${se.passed??0},不通过 ${se.failed??0}`];Pe>0&&Be.push(`自动开缺陷 ${Pe} 张`),W({busy:!1,note:Be.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 Pe=((await a("/task/artifact/sync",{id:d.id}))?.written??[])[0];P(Pe?.doc?.url?`已归档到飞书云盘:${Pe.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),We(se=>({...se,[m.id]:A})),await S();try{const Pe=((await a("/task/artifact/sync",{id:d.id,artifactId:m.id}))?.written??[])[0]?.doc;P(Pe?.url?`正文已更新并同步:${Pe.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,Pe=(A?.errors??[])[0];P(se?.url?`已归档:${se.url}`:`归档失败:${Pe?.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=()=>qe({agent:V?.agent??"",model:V?.model??"",branch:V?.branch??"",context:V?.context??"",total:String(V?.unitTests?.total??0),passed:String(V?.unitTests?.passed??0)}),Ap=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}}}),qe(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:Va.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"},Fo[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":Uo(d,h.config??{}).label==="未指派"?"1":"0",title:Uo(d,h.config??{}).note},`负责:${Uo(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},Vl[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:Te("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(ft=>ft.id===d.status),se=m[A+1]??null,Pe=m.filter(ft=>ft.id!==d.status&&(se===null||ft.id!==se.id)),Be=Pe.filter(ft=>m.findIndex(aa=>aa.id===ft.id)>A),Na=Pe.filter(ft=>m.findIndex(aa=>aa.id===ft.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}」`),Pe.length===0?null:e(x,{key:"other",className:"ds-select",value:"",disabled:C,onChange:ft=>{const aa=ft.target.value;if(aa==="")return;const Oo=m.find(UE=>UE.id===aa);Oo!==void 0&&jt({status:Oo.id,role:Oo.role})}},e("option",{value:""},`其他状态(${Pe.length})`),...Be.map(ft=>e("option",{key:ft.id,value:ft.id},`→ ${ft.label}`)),...Na.map(ft=>e("option",{key:ft.id,value:ft.id},`← ${ft.label}(退回,AI 会重跑)`)))].filter(Boolean)})())),e("div",{className:"ds-sec",style:Te("overview")},e("div",{className:"ds-sec-head"},"准出检查",e("span",{className:"ds-hint"},"进「已完成」之前必须过这一关:清单全勾、没有失败用例、不在阻塞、有人签字")),e("div",{className:"ds-sec-body"},ka===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":ka.ready?"1":"0"},e("div",{className:"ds-gate-head"},e("b",null,ka.ready?"✅ 可以进「已完成」":`⛔ 还差 ${ka.blockers.length} 项`),e("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void ie()},"重新检查")),(ka.blockers??[]).map(m=>e("div",{key:m,className:"ds-gate-item","data-kind":"block"},`⛔ ${m}`)),(ka.warnings??[]).map(m=>e("div",{key:m,className:"ds-gate-item","data-kind":"warn"},`⚠ ${m}`)),(ka.blockers??[]).length===0&&(ka.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:Te("overview")},e("div",{className:"ds-sec-head"},"阻塞",e("span",{className:"ds-hint"},"卡住了打个标,卡留在本列停住,不会被自动往下派;怎么继续由人定")),He===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}},`⛔ ${He.reason||"未填写原因"}`),e("div",{className:"ds-hint"},`${He.by||"人"} · ${Qe(He.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 Ge("resume")},"继续,交本列负责人"),e("button",{className:"ds-btn",disabled:C,onClick:()=>void Ge("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 Ge("assign",G)},"改派给他"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>void Ge("clear")},"只解除,先不派")))),e("div",{className:"ds-sec",style:Te("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:Te("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(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=>xt({...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=>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:de},"只删卡"))),e("div",{className:"ds-sec",style:Te("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:Te("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 Ap("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 Ap("list")},"看 git worktree 列表"),e("button",{className:"ds-btn",disabled:C,onClick:()=>void Ap("remove")},"回收 worktree"))),je&&he===null?e("div",{className:"ds-hint"},je):null)),e("div",{className:"ds-sec",style:Te("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:Va,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=>qe({...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=>qe({...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=>qe({...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=>qe({...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=>qe({...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=>qe({...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:()=>qe(null)},"取消")))))),e("div",{className:"ds-dw-col"},e("div",{className:"ds-sec",style:Te("test")},e("div",{className:"ds-sec-head"},"验收清单",e("span",{className:"ds-hint"},yt.total===0?"这张卡还没有清单":`${ve} / ${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":ve===yt.total?"1":"0"},e("span",{style:{width:`${yt.total===0?0:Math.round(ve/yt.total*100)}%`}}))),te===null&&yt.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 sn(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"&&nn()}}),e("button",{className:"ds-btn",disabled:C||w.trim()==="",onClick:()=>void nn()},"+ 加一条")),e("div",{className:"ds-hint"},"清单就是「做完」的定义:AI 每完成一项要勾一项并附证据;人也可以直接勾。"))),e("div",{className:"ds-sec",style:Te("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":$e(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"},$e(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} 字${$e(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&&$e(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:Te("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:Ee.busy,onClick:()=>void rt()},Ee.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),Ee.note===""?null:e("div",{className:"ds-hint"},Ee.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 wt(m,A.target.value)},Gp.map(A=>e("option",{key:A,value:A},Wl[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. 打开积分抵扣页
|
|
14
|
+
`),i(p))))}return s}return a}function Ke(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 Xa(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 za={product:"产品",architect:"架构",dev:"研发",qa:"测试"},Ms={urgent:"紧急",normal:"普通",relaxed:"宽松"},Wo={requirement:"需求",bug:"缺陷",design:"设计",dev:"开发",test:"测试",ops:"运维"},Yl={p0:"P0 致命",p1:"P1 严重",p2:"P2 一般",p3:"P3 轻微"},ax=["requirement","design","mr","cases","report","release","doc","screenshot","other"],Xp={requirement:"需求",design:"方案",mr:"MR",cases:"用例",report:"报告",release:"发布",doc:"文档",screenshot:"截图",other:"其它"},nx=["draft","delivered","accepted"],Zp=["pending","pass","fail","skip"],Ql={pending:"⬜ 未跑",pass:"✅ 通过",fail:"❌ 不通过",skip:"⏭️ 跳过"},sx=["functional","api","ui","performance","security","other"],Jp={functional:"功能",api:"接口",ui:"界面",performance:"性能",security:"安全",other:"其它"},rx=["p0","p1","p2","p3"],ox={draft:"草稿",delivered:"已交付",accepted:"已验收"},ix={pending:"待评审",approved:"评审通过",changes_requested:"要求修改"},Xl={active:"进行中",paused:"暂停",archived:"已归档"},Zl={planned:"未开始",active:"进行中",closed:"已结束"},lx={round_robin:"轮询",best_match:"按专长匹配",lead:"团长分派"},ef=["draft","review","active","delivered","closed"],tf={prd:"PRD",proto:"原型",acceptance:"验收标准",other:"其它"},dx=["prd","proto","acceptance","other"],cx={draft:"草稿",review:"评审中",baseline:"已生效"},ux=["draft","candidate","approved","released","rolled_back"],Ar={draft:"草稿",review:"待评审",active:"进行中",delivered:"已交付",closed:"已关闭"},af={draft:"草稿",candidate:"待发布",approved:"已审批",released:"已发布",rolled_back:"已回滚"};function nf(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 jr(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 sf(e,t){if(t==null)return"";if(t.kind==="role")return`🎯 ${za[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?za[t.id]??String(t.id??""):`${a.emoji} ${a.name}`}function zs(e,t){if(t==null)return"";if(t.kind==="pool"){const a=(t.members??[]).map(n=>sf(e,n)).filter(n=>n!=="");return a.length===0?"":a.length===1?a[0]:`${a[0]} 等 ${a.length} 位`}return sf(e,t)}function rf(e){const t=[];for(const a of["product","architect","dev","qa"])t.push({key:"r:"+a,name:"角色 · "+(za[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} · ${za[a.role]??a.role}`:za[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 Ho(e,t){const a=String(t??"").trim().toLowerCase();return a===""?e:e.filter(n=>`${n.name} ${n.hint}`.toLowerCase().includes(a))}function Go(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=zs(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=lx[r.strategy??"round_robin"]??"轮询";return{label:`候选池 ${r.members.length} 人`,note:`本列候选:${r.members.map(o=>zs(t,o)).join("、")}(${s})`,expert:void 0}}if(r!==void 0&&r.kind!=="none"){const s=zs(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 Jl(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 ed(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 td(e){return typeof e?.commentCount=="number"?e.commentCount:Array.isArray(e?.comments)?e.comments.length:0}function Dr(e){return(e.artifacts??[]).filter(t=>{const a=String(t.content??"");return a!==""?a.trim()==="":(typeof t.contentLength=="number"?t.contentLength:0)===0})}function px({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 fx({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 mx({h:e,ChipField:t}){function a({task:n,onOpen:r,config:s,requirements:o,onPickRequirement:i,onPickProject:l}){const c=Go(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=ed(n),g=Jl(n),d=(n.artifacts??[]).length,h=Dr(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:Ms[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},`· ${Xa(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,td(n)>0?e("span",{},`· ${td(n)} 评论`):null,e("span",{style:{marginLeft:"auto"}},Ke(n.updatedAt))))}return a}const Or=40;function gx({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(""),[D,W]=t.useState(""),[M,P]=t.useState(!1),[H,J]=t.useState(!1),[U,F]=t.useState(!1),[L,w]=t.useState({}),T=f.projects??[],K=T.find(z=>z.id===y),R=t.useMemo(()=>{const z=x.trim().toLowerCase(),te=new Map;for(const X of l.statuses)te.set(X.id,[]);for(const X of l.tasks)H&&(X.blocked??null)===null||U&&Dr(X).length===0||d!==""&&(X.type??"requirement")!==d||y!==""&&X.project!==y||C!==""&&X.iteration!==C||_!==""&&(X.service??"")!==_||D!==""&&(X.requirementId??"")!==D||k!==""&&X.expert!==k&&X.dispatch?.expert!==k||z!==""&&!`${X.title} ${X.requirement} ${X.domain} ${X.id}`.toLowerCase().includes(z)||(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((ie,ge)=>(xe[ie.priority]??1)-(xe[ge.priority]??1)||ge.updatedAt-ie.updatedAt);return te},[l,x,k,d,y,C,_,D,H,U]),O=[...R.values()].reduce((z,te)=>z+te.length,0),G=[...R.values()].reduce((z,te)=>z+te.filter(xe=>xe.type==="bug").length,0),we=l.tasks.filter(z=>z.design!==null&&z.design!==void 0&&z.design.status!=="approved").length,fe=l.tasks.filter(z=>(z.blocked??null)!==null).length,ye=l.tasks.filter(z=>Dr(z).length>0).length,He=l.statuses.filter(z=>!M||(R.get(z.id)??[]).length>0),ae=x!==""||k!==""||d!==""||H||U||y!==""||C!==""||_!==""||D!=="";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:z=>b(z.target.value)})),T.length>0?e(r,{className:"ds-select",style:{width:150,fontSize:12},value:y,onChange:z=>{S(z.target.value),E(""),I("")}},e("option",{value:""},`全部项目(${T.filter(z=>z.status!=="archived").length})`),T.map(z=>e("option",{key:z.id,value:z.id},`${z.key?`${z.key} · `:""}${z.name}`))):null,K!==void 0&&(K.iterations??[]).length>0?e(r,{className:"ds-select",style:{width:132,fontSize:12},value:C,onChange:z=>E(z.target.value)},e("option",{value:""},"全部迭代"),K.iterations.map(z=>e("option",{key:z.id,value:z.id},z.name))):null,K!==void 0&&(K.services??[]).length>0?e(r,{className:"ds-select",style:{width:150,fontSize:12},value:_,onChange:z=>I(z.target.value)},e("option",{value:""},`全部服务(${(K.services??[]).length})`),K.services.map(z=>e("option",{key:z.id,value:z.id},z.name||z.id))):null,(l.requirements??[]).length>0?e(r,{className:"ds-select",style:{width:190,fontSize:12},value:D,title:"只看某条需求下的卡(需求是整条链路的锚点)",onChange:z=>W(z.target.value)},e("option",{value:""},`全部需求(${(l.requirements??[]).length})`),(l.requirements??[]).map(z=>e("option",{key:z.id,value:z.id},`${z.code||z.id} ${z.title}`))):null,e(r,{className:"ds-select",style:{width:108,fontSize:12},value:d,onChange:z=>h(z.target.value)},e("option",{value:""},"全部类型"),["requirement","bug","design","dev","test","ops"].map(z=>e("option",{key:z,value:z},Wo[z]??z))),e(r,{className:"ds-select",style:{width:158,fontSize:12},value:k,onChange:z=>g(z.target.value)},e("option",{value:""},"全部专家"),v.filter(z=>z.enabled!==!1).map(z=>e("option",{key:z.id,value:z.id},`${z.emoji} ${z.name}`))),e("label",{className:"ds-row",style:{gap:5,fontSize:12,cursor:"pointer",opacity:.8}},e(s,{checked:M,onChange:z=>P(z.target.checked)}),e("span",{},"隐藏空列")),fe>0?e("label",{className:"ds-row",style:{gap:5,fontSize:12,cursor:"pointer",color:"#c0392b"},title:"只看被标记为阻塞的卡(它们停在原列,等人决定怎么继续)"},e(s,{checked:H,onChange:z=>J(z.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:U,onChange:z=>F(z.target.checked)}),e("span",{},`只看缺正文 ${ye}`)):null,ae?e("button",{className:"ds-btn",style:{padding:"4px 10px"},onClick:()=>{b(""),g(""),h(""),J(!1),F(!1),S(""),E(""),I(""),W("")}},"清除筛选"):null,e("span",{className:"ds-stat",style:{marginLeft:"auto"}},`${O} 张卡 · ${we>0?`${we} 个设计待评审 · `:""}${G>0?`${G} 个缺陷`:`${He.length} 列`}`)),e("div",{className:"ds-board",tabIndex:0,"aria-label":"看板列,左右滚动或用方向键"},He.map(z=>{const te=R.get(z.id)??[],xe=zs(f,f.columns?.[z.id]);return e("div",{className:"ds-col",key:z.id,"data-col":z.id,"data-role":z.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 ie=X.dataTransfer===null?"":X.dataTransfer.getData("text/plain");if(ie===""||ie===void 0)return;const ge=Number(f.columns?.[z.id]?.wip)||0,V=(R.get(z.id)??[]).length;if(ge>0&&V>=ge){o(`「${z.label}」已到 WIP 上限 ${ge},先把列里的卡往前推`,"error");return}u(ie,z.id)}},e("div",{className:"ds-col-head"},e("div",{className:"ds-col-title"},e("span",{className:"ds-col-name"},z.label),(()=>{const X=Number(f.columns?.[z.id]?.wip)||0,ie=X>0&&te.length>X;return e("span",{className:"ds-count","data-zero":te.length===0?"1":"0","data-over":ie?"1":"0",onClick:ge=>{ge.stopPropagation(),typeof p=="function"&&p(z.id,X)},title:X>0?`WIP 上限 ${X} 张,当前 ${te.length} 张${ie?"(已超出,先消化再加)":""}`:"这一列没有设 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[z.id]??Or).map(X=>e(a,{key:X.id,task:X,onOpen:c,config:f,requirements:l.requirements??[],onPickRequirement:ie=>W(ge=>ge===ie?"":ie),onPickProject:ie=>{S(ge=>ge===ie?"":ie),E("")}})),te.length>(L[z.id]??Or)?e("button",{className:"ds-btn ds-btn-ghost",style:{width:"100%",marginTop:6,fontSize:12},onClick:()=>w(X=>({...X,[z.id]:(X[z.id]??Or)+Or}))},`显示更多(还有 ${te.length-(L[z.id]??Or)} 张)`):null))})))}return i}function hx({h:e,TextField:t}){function a({roster:n,query:r,active:s,onQuery:o,onActive:i,onPick:l,onClose:c}){const u=Ho(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 vx=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),bx={approved:"已通过",pending:"待评审",changes_requested:"要改"};function yx({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),[D,W]=t.useState(""),[M,P]=t.useState(null),[H,J]=t.useState(""),U=t.useRef(null);t.useEffect(()=>{const m=j=>{j.key==="Escape"&&y()};return window.addEventListener("keydown",m),()=>window.removeEventListener("keydown",m)},[y]);const[F,L]=t.useState({project:d.project??"",iteration:d.iteration??"",service:d.service??"",owner:d.owner??"",due:nf(d.dueAt),releaseId:d.releaseId??""}),[w,T]=t.useState(""),[K,R]=t.useState({kind:"doc",title:"",ref:"",content:""}),[O,G]=t.useState(null),[we,fe]=t.useState(null),[ye,He]=t.useState({}),[ae,z]=t.useState(null),[te,xe]=t.useState(null);t.useEffect(()=>{He({}),fe(null),G(null)},[d.id]);const[X,ie]=t.useState({title:"",expected:"",steps:"",stepsText:"",type:"functional",priority:"p2",preconditions:""}),[ge,V]=t.useState({busy:!1,note:""}),[Ee,ke]=t.useState({busy:!1,note:""}),[Ae,Ve]=t.useState(null),[Ya,Rn]=t.useState(""),B=d.coding??null,he=d.worktree??null,[je,Ue]=t.useState(""),[_t,Gt]=t.useState({busy:!1,line:"",ok:null}),st=Jl(d),Ct=ed(d),pt=te!==null&&Array.isArray(te.cases)?te.cases:Array.isArray(d.cases)?d.cases:[],[Ea,hs]=t.useState(null),[Y,ne]=t.useState(""),ee=st.pass,be=st.fail,se=Math.max(0,st.total-ee-be),de=st.total===0?"":`${st.total} 条 · ✅ 通过 ${ee} · ❌ 不通过 ${be}${se>0?` · ⬜ 没跑 ${se}`:""}`,Q=te!==null&&Array.isArray(te.checklist)?te.checklist:Array.isArray(d.checklist)?d.checklist:[],ve=Ct.done,Ce=d.artifacts??[],Se=m=>ye[m.id]!==void 0?ye[m.id]:String(m.content??""),Pe=m=>typeof m.contentLength=="number"?m.contentLength>0:String(m.content??"").trim()!=="",dt=async m=>{const j=ye[m.id];if(j!==void 0)return j;const re=await a("/task/artifact",{id:d.id,action:"get",artifactId:m.id}),$e=String(re?.artifact?.content??"");return He(Ie=>({...Ie,[m.id]:$e})),$e},rt=async m=>{if(we===m.id){fe(null);return}if(fe(m.id),ye[m.id]===void 0)try{await dt(m)}catch(j){I(j instanceof Error?j.message:String(j)),fe(null)}},Je=async m=>{if(O!==null&&O.id===m.id){G(null);return}try{G({id:m.id,content:await dt(m)})}catch(j){I(j instanceof Error?j.message:String(j))}},We=td(d);ae??(Array.isArray(d.comments)&&d.comments),t.useEffect(()=>{if(We===0){z([]);return}let m=!0;return a("/task/comments",{id:d.id}).then(j=>{m&&z(Array.isArray(j?.comments)?j.comments:[])}).catch(()=>{m&&z([])}),()=>{m=!1}},[d.id,We]),t.useEffect(()=>{if(st.total===0&&Ct.total===0){xe({cases:[],checklist:[]});return}let m=!0;return a("/task/parts",{id:d.id}).then(j=>{m&&xe({cases:Array.isArray(j?.cases)?j.cases:[],checklist:Array.isArray(j?.checklist)?j.checklist:[]})}).catch(()=>{m&&xe({cases:[],checklist:[]})}),()=>{m=!1}},[d.id,st.total,st.pass,st.fail,Ct.total,Ct.done]);const[tt,Ge]=t.useState("overview");t.useEffect(()=>{Ge("overview")},[d.id]),t.useEffect(()=>{const m=U.current;m!==null&&(m.scrollTop=0)},[tt,d.id]);const Te=m=>tt===m?void 0:{display:"none"},It=[{id:"overview",label:"概览",hint:"标题、状态、负责人、阻塞原因与关键时间"},{id:"content",label:"内容",hint:"需求正文与验收标准,支持 Markdown"},{id:"plan",label:"计划",hint:"项目、迭代、服务、挂哪条需求、优先级"},{id:"deliver",label:"交付物",count:Ce.length>0?Ce.length:"",hint:"文档 / MR / 用例 / 报告;空的交付物会被准出拦下"},{id:"test",label:"测试",count:st.total>0?`${ee}/${st.total}`:Ct.total>0?`☑${ve}/${Ct.total}`:"",hint:"验收清单、用例执行记录;失败的用例会自动开缺陷"},{id:"coding",label:"执行记录",count:B===null?"":B.review?.status==="approved"?"✓ 已评审":"",hint:"AI 的分支、提交、改动文件;可以「核对代码事实」"},{id:"discuss",label:"讨论",count:We>0?We:"",hint:"评论;在评论里 @ 专家或专家团即派单"}],[Be,yt]=t.useState({title:d.title,requirement:d.requirement,gitlabIssue:d.gitlabIssue,gitlabMR:d.gitlabMR?.url??"",pointId:d.pointId??""}),Rt=async m=>{E(!0),I(null);try{await a("/task/update",{id:d.id,patch:m}),await S()}catch(j){I(j instanceof Error?j.message:String(j))}finally{E(!1)}},Ut=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)}},le=async()=>{E(!0),I(null);try{const m=await a("/task/gate",{id:d.id});hs(m.gate)}catch(m){I(m instanceof Error?m.message:String(m))}finally{E(!1)}},Ne=async m=>{E(!0),I(null);try{const j=await a("/task/signoff",{id:d.id,action:m,note:Y,by:r()});ne(""),hs(j.gate??null),await S()}catch(j){I(j instanceof Error?j.message:String(j))}finally{E(!1)}},me=async()=>{if(D.trim().length!==0){E(!0),I(null);try{const j=((await a("/task/comment",{id:d.id,body:D,author:"人",kind:"human"})).mentions??[]).map(re=>re.label??re.id);W(""),j.length>0&&I(null),P(j.length>0?`已通知 ${j.join("、")}`:null),await S()}catch(m){I(m instanceof Error?m.message:String(m))}finally{E(!1)}}},Qa=m=>W(j=>j.replace(/\s*$/,j.length===0?"":" ")+`@${m} `),[Et,fa]=t.useState(null),[An,La]=t.useState(0),Lt=t.useMemo(()=>rf(h.config),[h.config]),Mt=Et===null?[]:Ho(Lt,Et.query),jn=(m,j)=>{const re=m.slice(0,j),$e=/@([^\s@]{0,24})$/.exec(re);if($e===null){fa(Ie=>Ie!==null&&Ie.inline?null:Ie);return}fa({query:$e[1],from:j-$e[0].length,inline:!0}),La(0)},Z=m=>{const j=Et;if(j!==null&&j.inline&&j.from!==null){const re=j.from;W($e=>$e.slice(0,re)+`@${m} `)}else Qa(m);fa(null)},_e=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)}}},xt=async()=>{E(!0),I(null);try{await a("/agents/run",{id:d.id,expert:H}),await S()}catch(m){I(m instanceof Error?m.message:String(m))}finally{E(!1)}},ht=d.blocked??null,q=async()=>{const m=await c("卡在哪了?(写清楚,之后要据此决定怎么继续)",{title:"标记阻塞",defaultValue:ht?.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(j){I(j instanceof Error?j.message:String(j))}finally{E(!1)}}},ce=async(m,j)=>{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:j}),P(m==="advance"?"已解除阻塞,推进到下一列":m==="assign"?"已解除阻塞,已交给指定专家":m==="clear"?"已解除阻塞(暂不派单)":"已解除阻塞,已交回本列负责人"),await S()}catch(re){I(re instanceof Error?re.message:String(re))}finally{E(!1)}}},Le=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)}},At=async()=>{await Rt({project:F.project,iteration:F.project===""?"":F.iteration,service:F.project===""?"":F.service??"",owner:F.owner,dueAt:jr(F.due),releaseId:F.releaseId??""})},$a=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(j){I(j instanceof Error?j.message:String(j))}finally{E(!1)}}},ra=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(j){I(j instanceof Error?j.message:String(j))}finally{E(!1)}},Ma=async m=>{E(!0),I(null);try{await a("/task/checklist",{id:d.id,action:"remove",itemId:m.id}),await S()}catch(j){I(j instanceof Error?j.message:String(j))}finally{E(!1)}},Dn=async()=>{const m=await c("SQLite 库文件路径",{title:"加一条数据库用例",defaultValue:""});if(m===null||String(m).trim()==="")return;const j=await c("SQL 语句(返回的行用来断言)",{title:"加一条数据库用例",defaultValue:"select 1 as n"});if(j===null||String(j).trim()==="")return;const re=await c("断言首行的哪一列(留空就只看能不能执行)",{title:"加一条数据库用例",defaultValue:"n"});if(re===null)return;const $e=await c("这一列的期望值(可留空)",{title:"加一条数据库用例",defaultValue:""});if($e!==null){E(!0),I(null);try{const Ie={file:String(m).trim(),sql:String(j).trim()},ea=String($e??"").trim(),at=String(re??"").trim();ea!==""&&at!==""&&(Ie.expectColumn=at,Ie.expectValue=ea);const Kt=("db: "+Ie.sql).slice(0,60),Bo=String(re??"n").trim()||"n";await a("/task/case",{id:d.id,action:"add",cases:[{title:Kt,expected:ea===""?"能执行":Bo+" = "+ea,db:Ie}]}),await S()}catch(Ie){I(Ie instanceof Error?Ie.message:String(Ie))}finally{E(!1)}}},Fo=async()=>{const m=await c("shell 命令(断言退出码 0)",{title:"加一条 shell 用例",defaultValue:""});if(m===null||String(m).trim()==="")return;const j=await c("期望输出里包含什么(可留空)",{title:"加一条 shell 用例",defaultValue:""});if(j!==null){E(!0),I(null);try{const re=String(j??"").trim(),$e={title:("shell: "+String(m).trim()).slice(0,60),expected:re===""?"退出码 0":"退出码 0 且输出包含 "+re,shell:{command:String(m).trim(),expectExit:0,expectContains:re}};await a("/task/case",{id:d.id,action:"add",cases:[$e]}),await S()}catch(re){I(re instanceof Error?re.message:String(re))}finally{E(!1)}}},On=async()=>{const m=X.title.trim();if(m!==""){E(!0),I(null);try{const j=vx(X.steps),re={title:m,expected:X.expected.trim()};j.length>0&&(re.http={steps:j}),X.type!==void 0&&X.type!=="functional"&&(re.type=X.type),X.priority!==void 0&&X.priority!=="p2"&&(re.priority=X.priority),String(X.preconditions??"").trim()!==""&&(re.preconditions=String(X.preconditions).trim()),String(X.stepsText??"").trim()!==""&&(re.steps=String(X.stepsText).split(`
|
|
17
|
+
`).map($e=>$e.trim()).filter($e=>$e!=="")),await a("/task/case",{id:d.id,action:"add",cases:[re]}),ie({title:"",expected:"",steps:"",stepsText:"",type:"functional",priority:"p2",preconditions:""}),await S()}catch(j){I(j instanceof Error?j.message:String(j))}finally{E(!1)}}},dn=async(m,j)=>{E(!0),I(null),P(null);try{const re=await a("/task/case",{id:d.id,action:"update",caseId:m.id,result:j}),$e=re?.bug??null;if(j==="fail"&&$e!==null){const Ie=String($e.code??"")!==""?$e.code:$e.id;P(`用例判失败,已自动登记缺陷 ${Ie}(挂在同一条需求下,父任务指向本卡)。`)}else re?.error&&P(`用例已更新,但自动建缺陷失败:${re.error}`);await S()}catch(re){I(re instanceof Error?re.message:String(re))}finally{E(!1)}},Ln=async m=>{V({busy:!0,note:""}),I(null);try{const j=await a("/task/case/run",{id:d.id,caseId:m,by:"我在界面里跑的"}),re=j?.run??{},$e=(j?.bugs??[]).filter(ea=>ea.created===!0).length,Ie=[`跑了 ${re.total??0} 条:通过 ${re.passed??0},不通过 ${re.failed??0}`];$e>0&&Ie.push(`自动开缺陷 ${$e} 张`),V({busy:!1,note:Ie.join(",")}),await S()}catch(j){V({busy:!1,note:j instanceof Error?j.message:String(j)})}},A=async()=>{ke({busy:!0,note:""}),I(null);try{const m=await a("/task/cases/generate",{id:d.id}),j=m?.added>0?`已生成 ${m.added} 条用例,这张卡现在共 ${m.total} 条`:`没生成用例:${m?.reason??"没有可用的验收条件"}`;ke({busy:!1,note:j}),await S()}catch(m){ke({busy:!1,note:m instanceof Error?m.message:String(m)})}},ue=async m=>{E(!0),I(null);try{await a("/task/case",{id:d.id,action:"remove",caseId:m.id}),await S()}catch(j){I(j instanceof Error?j.message:String(j))}finally{E(!1)}},Fe=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(j){I(j instanceof Error?j.message:String(j))}finally{E(!1)}},wt=async()=>{const m=K.title.trim();if(m!==""){E(!0),I(null),P(null);try{const j=await a("/task/artifact",{id:d.id,action:"add",artifact:{kind:K.kind,title:m,ref:K.ref.trim(),content:K.content,status:"delivered"}});R({kind:K.kind,title:"",ref:"",content:""}),P("已登记,正在归档到飞书云盘…"),await S();try{const $e=((await a("/task/artifact/sync",{id:d.id}))?.written??[])[0];P($e?.doc?.url?`已归档到飞书云盘:${$e.doc.url}`:"归档失败,稍后可点「同步到云盘」重试。"),await S()}catch{P("登记成功,但归档失败:可点「同步到云盘」重试。")}}catch(j){I(j instanceof Error?j.message:String(j))}finally{E(!1)}}},ma=async m=>{if(O!==null){E(!0),I(null),P(null);try{const j=O.content;await a("/task/artifact",{id:d.id,action:"update",artifactId:m.id,artifact:{content:j}}),G(null),He(re=>({...re,[m.id]:j})),await S();try{const $e=((await a("/task/artifact/sync",{id:d.id,artifactId:m.id}))?.written??[])[0]?.doc;P($e?.url?`正文已更新并同步:${$e.url}`:"正文已保存,归档失败可再点「更新」。"),await S()}catch{P("正文已保存,归档失败可再点「更新」。")}}catch(j){I(j instanceof Error?j.message:String(j))}finally{E(!1)}}},et=async m=>{E(!0),I(null),P(null);try{const j=await a("/task/artifact/sync",{id:d.id,artifactId:m.id}),re=(j?.written??[])[0]?.doc,$e=(j?.errors??[])[0];P(re?.url?`已归档:${re.url}`:`归档失败:${$e?.error??"未知原因"}`),await S()}catch(j){I(j instanceof Error?j.message:String(j))}finally{E(!1)}},De=async()=>{E(!0),I(null),P(null);try{const m=await a("/task/artifact/sync",{id:d.id}),j=(m?.written??[]).length,re=(m?.errors??[]).length;P(`已归档 ${j} 件${re>0?`,${re} 件失败:${m.errors[0]?.error??""}`:"。"}`),await S()}catch(m){I(m instanceof Error?m.message:String(m))}finally{E(!1)}},Ye=async(m,j)=>{E(!0),I(null);try{await a("/task/artifact",{id:d.id,action:"update",artifactId:m.id,artifact:{status:j}}),await S()}catch(re){I(re instanceof Error?re.message:String(re))}finally{E(!1)}},Mn=async m=>{E(!0),I(null);try{await a("/task/artifact",{id:d.id,action:"remove",artifactId:m.id}),await S()}catch(j){I(j instanceof Error?j.message:String(j))}finally{E(!1)}},zn=()=>Ve({agent:B?.agent??"",model:B?.model??"",branch:B?.branch??"",context:B?.context??"",total:String(B?.unitTests?.total??0),passed:String(B?.unitTests?.passed??0)}),Mp=async m=>{if(!(m==="remove"&&!await l("回收 worktree 会删掉这个目录和分支,未合并的改动会丢,确定?",{title:"回收 worktree",danger:!0,okText:"回收"}))){E(!0),I(null),Ue("");try{const j=await a("/task/worktree",{id:d.id,action:m});m==="list"?Ue(String(j.output??"").replace(/\s+/g," ").slice(0,400)||"(没有 worktree)"):j.ok===!0?Ue(m==="create"?"已建好 worktree":"已回收"):Ue(j.skipped||j.result?.error||"没成功"),m!=="list"&&await S()}catch(j){Ue(j instanceof Error?j.message:String(j))}finally{E(!1)}}},OE=async()=>{if(Ae===null)return;const m=Math.max(0,Number(Ae.total)||0),j=Math.min(m,Math.max(0,Number(Ae.passed)||0));E(!0),I(null);try{await a("/task/coding",{id:d.id,action:"update",coding:{agent:Ae.agent.trim(),model:Ae.model.trim(),branch:Ae.branch.trim(),context:Ae.context,unitTests:{total:m,passed:j}}}),Ve(null),await S()}catch(re){I(re instanceof Error?re.message:String(re))}finally{E(!1)}},jy=async m=>{E(!0),I(null);try{await a("/task/coding",{id:d.id,action:"review",status:m,note:Ya.trim()}),Rn(""),await S()}catch(j){I(j instanceof Error?j.message:String(j))}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()=>{Gt({busy:!0,line:"",ok:null});try{const m=await a("/task/coding/verify",{id:d.id}),j=m.report??{};j.skipped!==void 0?Gt({busy:!1,line:String(j.skipped),ok:!1}):Gt({busy:!1,line:String(m.line??""),ok:j.ok===!0}),await S()}catch(m){Gt({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 j=await c("状态:pending 待评审 / changes_requested 要改 / approved 通过",{title:"设计评审",defaultValue:d.design?.status??"pending"});if(j===null)return;const re=await c("还原度差异百分比(design-diff 输出,留空跳过)",{title:"设计还原度",defaultValue:d.design?.diff==null?"":String(d.design.diff.percent)});if(re===null)return;const $e=await c("规范体检野值数(design-audit 输出,留空跳过)",{title:"设计规范体检",defaultValue:d.design?.spec==null?"":String(d.design.spec.violations)});if($e!==null){E(!0),I(null),P(null);try{const Ie={link:m,status:j,note:d.design?.note??""},ea=Number(String(re).trim());String(re).trim()!==""&&Number.isFinite(ea)&&(Ie.diff={percent:ea,url:String(d.design?.diff?.url??"")});const at=Number(String($e).trim());String($e).trim()!==""&&Number.isFinite(at)&&(Ie.spec={checked:d.design?.spec?.checked??0,violations:at,top:d.design?.spec?.top??[]});const Kt=await a("/task/design",{id:d.id,design:Ie});P("设计已保存:"+String(Kt?.design?.status??j)),await S()}catch(Ie){I(Ie instanceof Error?Ie.message:String(Ie))}finally{E(!1)}}},FE=async()=>{E(!0),I(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){I(m instanceof Error?m.message:String(m))}finally{E(!1)}},BE=(h.statuses.find(m=>m.id===d.status)??{}).label??d.status,Dy=d.dispatch?.expert?zs(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}${Dy===""?"":` · ${Dy}`} · 更新 ${Ke(d.updatedAt)}`)),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"设计稿链接 + 评审状态;被配置成设计闸门的列,评审不通过进不去",onClick:()=>void zE()},"设计:"+(bx[d.design?.status]??"未登记")),e("button",{className:"ds-btn",onClick:y},"关闭"),(Number(d.agentFailures)||0)>0?o(d.retryAt>0?`下一次自动重试:${Ke(d.retryAt)}`:"失败次数已用完,重置后可以重新派单",e("button",{className:"ds-btn",disabled:C,"data-agent-failed":"1",onClick:()=>void Ut()},`AI 失败 ${Number(d.agentFailures)||0} 次 · 重新派单`)):null),n("TabsBar")!==null?e(n("TabsBar"),{items:It.map(m=>({id:m.id,label:m.label,count:m.count})),value:tt,onChange:m=>Ge(m),className:"ds-dw-shadcn-tabs"}):e("div",{className:"ds-dw-tabs"},It.map(m=>e("button",{key:m.id,className:"ds-dw-tab","data-on":tt===m.id?"1":"0",onClick:()=>Ge(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:U,"data-pane":tt},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"},Wo[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":Go(d,h.config??{}).label==="未指派"?"1":"0",title:Go(d,h.config??{}).note},`负责:${Go(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 Rt({severity:m.target.value})},["p0","p1","p2","p3"].map(m=>e("option",{key:m,value:m},Yl[m]))):null,e(f,{className:"ds-chip"},Ms[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&&Rt({domain:m})}},d.domain?`领域:${d.domain}`:"领域:未标"),e("span",{},`创建 ${Ke(d.createdAt)}`),e("span",{},`更新 ${Ke(d.updatedAt)}`)),e("div",{className:"ds-dw-cols"},e("div",{className:"ds-dw-col"},e("div",{className:"ds-sec",style:Te("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(at=>at.id===d.status),re=m[j+1]??null,$e=m.filter(at=>at.id!==d.status&&(re===null||at.id!==re.id)),Ie=$e.filter(at=>m.findIndex(Kt=>Kt.id===at.id)>j),ea=$e.filter(at=>m.findIndex(Kt=>Kt.id===at.id)<j);return[re===null?null:e("button",{key:"next",className:"ds-btn ds-btn-primary",disabled:C,title:"推进到下一列,下一列的 AI 会接手",onClick:()=>void Rt({status:re.id,role:re.role})},`推进到「${re.label}」`),$e.length===0?null:e(x,{key:"other",className:"ds-select",value:"",disabled:C,onChange:at=>{const Kt=at.target.value;if(Kt==="")return;const Bo=m.find(UE=>UE.id===Kt);Bo!==void 0&&Rt({status:Bo.id,role:Bo.role})}},e("option",{value:""},`其他状态(${$e.length})`),...Ie.map(at=>e("option",{key:at.id,value:at.id},`→ ${at.label}`)),...ea.map(at=>e("option",{key:at.id,value:at.id},`← ${at.label}(退回,AI 会重跑)`)))].filter(Boolean)})())),e("div",{className:"ds-sec",style:Te("overview")},e("div",{className:"ds-sec-head"},"准出检查",e("span",{className:"ds-hint"},"进「已完成」之前必须过这一关:清单全勾、没有失败用例、不在阻塞、有人签字")),e("div",{className:"ds-sec-body"},Ea===null?e("div",{className:"ds-row",style:{gap:8,alignItems:"center"}},e("button",{className:"ds-btn",onClick:()=>void le()},"检查一下"),e("span",{className:"ds-hint"},"点一下看这张卡还差什么才能收口")):e("div",{className:"ds-gate","data-ready":Ea.ready?"1":"0"},e("div",{className:"ds-gate-head"},e("b",null,Ea.ready?"✅ 可以进「已完成」":`⛔ 还差 ${Ea.blockers.length} 项`),e("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void le()},"重新检查")),(Ea.blockers??[]).map(m=>e("div",{key:m,className:"ds-gate-item","data-kind":"block"},`⛔ ${m}`)),(Ea.warnings??[]).map(m=>e("div",{key:m,className:"ds-gate-item","data-kind":"warn"},`⚠ ${m}`)),(Ea.blockers??[]).length===0&&(Ea.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:Y,placeholder:"验收签字:验了什么、遗留什么",onChange:m=>ne(m.target.value)}),e("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void Ne("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 Ne("clear")},"取消签字")))),e("div",{className:"ds-sec",style:Te("overview")},e("div",{className:"ds-sec-head"},"阻塞",e("span",{className:"ds-hint"},"卡住了打个标,卡留在本列停住,不会被自动往下派;怎么继续由人定")),ht===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 q()},"⛔ 标记阻塞"))):e("div",{className:"ds-sec-body"},e("div",{className:"ds-blocked-box"},e("div",{style:{fontWeight:600}},`⛔ ${ht.reason||"未填写原因"}`),e("div",{className:"ds-hint"},`${ht.by||"人"} · ${Ke(ht.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 ce("resume")},"继续,交本列负责人"),e("button",{className:"ds-btn",disabled:C,onClick:()=>void ce("advance")},"推进到下一列"),e(x,{className:"ds-select",style:{width:190},value:H,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||H==="",onClick:()=>void ce("assign",H)},"改派给他"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>void ce("clear")},"只解除,先不派")))),e("div",{className:"ds-sec",style:Te("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"?`${zs(h.config??{},{kind:"expert",id:d.dispatch.expert??d.dispatch.role})||"AI"} 处理中 · 起于 ${Ke(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:H,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 xt()},"马上处理"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C||d.dispatch?.state!=="running",onClick:()=>void Le()},"停止")))),e("div",{className:"ds-sec",style:Te("content")},e("div",{className:"ds-sec-head"},"内容"),e("div",{className:"ds-field"},e("div",{className:"ds-label"},"标题"),e(u,{className:"ds-input",value:Be.title,onChange:m=>yt({...Be,title:m.target.value})})),e("div",{className:"ds-field"},e("div",{className:"ds-label"},"需求 / 背景 / 验收标准"),String(Be.requirement??"").trim()===""?null:e("div",{className:"ds-md-preview ds-reader","data-task-md":"1",style:{maxHeight:220}},s(Be.requirement)),e(b,{className:"ds-textarea",rows:String(Be.requirement??"").trim()===""?4:8,value:Be.requirement,placeholder:"这张卡要解决什么、背景是什么、做到什么算完成——AI 接手前最好写清楚。",onChange:m=>yt({...Be,requirement:m.target.value})}),String(Be.requirement??"").trim()===""?e("div",{className:"ds-hint"},"这张卡还没有需求描述:专家只能按标题猜。补完点下面的「保存改动」。"):null),e("div",{className:"ds-field"},e("div",{className:"ds-label"},"对应功能点"),(()=>{const m=(h.requirements??[]).find(re=>re.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:Be.pointId??"",onChange:re=>yt({...Be,pointId:re.target.value})},e("option",{value:""},"不归到具体功能点"),j.map(re=>e("option",{key:re.id,value:re.id},`${re.id} ${re.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:Be.gitlabIssue,onChange:m=>yt({...Be,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:Be.gitlabMR,onChange:m=>yt({...Be,gitlabMR:m.target.value})}))),e("div",{className:"ds-row"},e("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void Rt((d.gitlabMR?.iid??0)>0?{...Be,gitlabMR:void 0}:Be)},"保存改动"),e("button",{className:"ds-btn",disabled:C,onClick:_e},"只删卡"))),e("div",{className:"ds-sec",style:Te("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=>L({...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=>L({...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=>L({...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=>L({...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=>L({...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=>L({...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 At()},"保存计划"),d.dueAt>0&&d.dueAt<Date.now()&&d.status!=="done"?e("span",{className:"ds-err"},"已逾期"):null))),e("div",{className:"ds-sec",style:Te("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 Mp("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 Mp("list")},"看 git worktree 列表"),e("button",{className:"ds-btn",disabled:C,onClick:()=>void Mp("remove")},"回收 worktree"))),je&&he===null?e("div",{className:"ds-hint"},je):null)),e("div",{className:"ds-sec",style:Te("coding")},e("div",{className:"ds-sec-head"},"AI Coding 执行记录",e("span",{className:"ds-hint"},B===null?"改代码要留记录:谁、什么模型、改了什么":"研发 agent 登记,人也可以补录或评审")),e("div",{className:"ds-sec-body"},B===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":B.review.status},ix[B.review.status]??B.review.status),e("div",{className:"ds-grow"},e("div",{className:"ds-code-line"},[B.agent||"未登记 agent",B.model,B.branch].filter(Boolean).join(" · ")),B.context===""?null:e("div",{className:"ds-hint"},B.context)),e("span",{className:"ds-hint"},B.unitTests.total>0?`单测 ${B.unitTests.passed}/${B.unitTests.total}`:"无单测"),he===null?null:o("拿 worktree 里的 git 记录,比执行记录里自报的提交 / 文件 / 分支",e("button",{className:"ds-btn ds-btn-ghost",disabled:C||_t.busy,onClick:()=>void ME()},_t.busy?"核对中…":_t.line===""?"核对代码事实":"再核对一次")),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"拉 MR 的改动与流水线,和自报的文件数/提交数比一遍",onClick:()=>void FE()},"从 GitLab 核对")),_t.line===""?B.verified===null||B.verified===void 0?null:e("div",{className:"ds-hint","data-verify":B.verified.ok?"ok":"bad",style:{marginTop:6}},`${B.verified.ok?"✅":"⚠"} 上次核对 ${Ke(B.verified.at)}:分支 ${B.verified.branch} · 提交 ${B.verified.commitCount.actual} 个 · 改动 ${B.verified.fileCount.actual} 个文件${B.verified.missingCommits.length+B.verified.missingFiles.length===0?"":` · ${B.verified.missingCommits.length+B.verified.missingFiles.length} 项对不上`}`):e("div",{className:"ds-hint","data-verify":_t.ok===!0?"ok":"bad",style:{marginTop:6}},`${_t.ok===!0?"✅":"⚠"} ${_t.line}`),B.gitlab===null||B.gitlab===void 0?null:e("div",{className:"ds-hint","data-gitlab-facts":B.gitlab.state},"上次 GitLab 核对 "+Ke(B.gitlab.at)+":文件 "+B.gitlab.files.declared+"→"+B.gitlab.files.actual+" · 提交 "+B.gitlab.commits.declared+"→"+B.gitlab.commits.actual+(B.gitlab.pipeline===null?"":" · 流水线 "+B.gitlab.pipeline)+((B.gitlab.mismatches??[]).length===0?" · 一致":" · "+B.gitlab.mismatches.join(";"))),(B.commits??[]).length===0?null:e("div",{className:"ds-code-list"},B.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} 文件`))),B.commits.length>6?e("div",{className:"ds-hint"},`还有 ${B.commits.length-6} 次提交`):null),(B.files??[]).length===0?null:e("div",{className:"ds-code-files"},B.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}`:""}`)),B.files.length>12?e("span",{className:"ds-hint"},`还有 ${B.files.length-12} 个`):null),B.review.note===""?null:e("div",{className:"ds-code-note"},`评审意见:${B.review.note}`),e("div",{className:"ds-row"},e(u,{className:"ds-input",style:{flex:1},value:Ya,placeholder:"评审意见(可选,写清文件/行为什么/怎么改)",onChange:m=>Rn(m.target.value)}),e("button",{className:"ds-btn",disabled:C,onClick:()=>void jy("approved")},"评审通过"),e("button",{className:"ds-btn",disabled:C,onClick:()=>void jy("changes_requested")},"要求修改"),B.mergedAt>0?e("span",{className:"ds-hint"},`已合并 · ${B.mergedBy||"—"}`):e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>void LE()},"标记已合并"))),Ae===null?e("div",{className:"ds-row"},e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:zn},B===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:Ae.agent,placeholder:"claude-code / codex / 自研",onChange:m=>Ve({...Ae,agent:m.target.value})})),e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"模型"),e(u,{className:"ds-input",value:Ae.model,placeholder:"deepseek-v4.1-flash",onChange:m=>Ve({...Ae,model:m.target.value})})),e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"分支"),e(u,{className:"ds-input",value:Ae.branch,placeholder:"feature/xxx",onChange:m=>Ve({...Ae,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:Ae.total,onChange:m=>Ve({...Ae,total:m.target.value})})),e("div",{className:"ds-field",style:{flex:"0 0 110px"}},i("通过数","通过的条数;少于总数时卡片过不了准出"),e(u,{className:"ds-input",value:Ae.passed,onChange:m=>Ve({...Ae,passed:m.target.value})})),e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"这次依据的上下文"),e(u,{className:"ds-input",value:Ae.context,placeholder:"例如 PRD v1.2 + 架构方案 v1",onChange:m=>Ve({...Ae,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:()=>Ve(null)},"取消")))))),e("div",{className:"ds-dw-col"},e("div",{className:"ds-sec",style:Te("test")},e("div",{className:"ds-sec-head"},"验收清单",e("span",{className:"ds-hint"},Ct.total===0?"这张卡还没有清单":`${ve} / ${Ct.total} 已勾`)),e("div",{className:"ds-sec-body"},Ct.total===0?null:e("div",{className:"ds-check-progress"},e("div",{className:"ds-check-bar","data-full":ve===Ct.total?"1":"0"},e("span",{style:{width:`${Ct.total===0?0:Math.round(ve/Ct.total*100)}%`}}))),te===null&&Ct.total>0?e("div",{className:"ds-hint"},"载入清单…"):Q.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 ra(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?Ke(m.at):""}${m.note?` · ${m.note}`:""}`):null),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>void Ma(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"&&$a()}}),e("button",{className:"ds-btn",disabled:C||w.trim()==="",onClick:()=>void $a()},"+ 加一条")),e("div",{className:"ds-hint"},"清单就是「做完」的定义:AI 每完成一项要勾一项并附证据;人也可以直接勾。"))),e("div",{className:"ds-sec",style:Te("deliver")},e("div",{className:"ds-sec-head"},"交付物",e("span",{className:"ds-hint"},"文档、MR、用例、报告——交付要有东西,不只是一句「做完了」;登记后会写成飞书云盘需求文件夹里的一份文档"),Dr(d).length>0?e("span",{className:"ds-card-warn",title:"这些交付物还没写正文,点「正文」补上再同步"},`● ${Dr(d).length} 件缺正文`):null,(d.artifacts??[]).length>0?e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"把这张卡的交付物全部写进需求文件夹(已归档的会覆盖更新)",onClick:()=>void De()},"同步到云盘"):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":Pe(m)?"0":"1"},e(f,{className:"ds-chip","data-kind":m.kind},Xp[m.kind]??m.kind),e("div",{className:"ds-grow"},e("div",{className:"ds-art-title"},Pe(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} 字${Pe(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 rt(m)},we===m.id?"收起":"阅读"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"编辑正文",onClick:()=>void Je(m)},"正文"),m.doc?.url?e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"用最新正文覆盖云盘文档",onClick:()=>void et(m)},"更新"):e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"写进需求文件夹",onClick:()=>void et(m)},"归档"),e(x,{className:"ds-select",style:{width:92,height:22,fontSize:11},value:m.status,disabled:C,onChange:j=>void Ye(m,j.target.value)},nx.map(j=>e("option",{key:j,value:j},ox[j]))),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>void Mn(m)},"×")),we===m.id?e("div",{className:"ds-md-preview ds-reader"},ye[m.id]===void 0&&Pe(m)?e("span",{className:"ds-hint"},"读取中…"):Se(m).trim()===""?e("span",{className:"ds-hint"},"这条交付物还没有正文。"):s(Se(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=>G({...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:()=>G(null)},"取消"),e("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void ma({id:O.id})},"保存正文并同步"))),e("div",{className:"ds-row"},e(x,{className:"ds-select",style:{width:104},value:K.kind,onChange:m=>R({...K,kind:m.target.value})},ax.map(m=>e("option",{key:m,value:m},Xp[m]))),e(u,{className:"ds-input",style:{flex:1},value:K.title,placeholder:"交付物名称,例如 登录模块技术方案",onChange:m=>R({...K,title:m.target.value})}),e(u,{className:"ds-input",style:{flex:1},value:K.ref,placeholder:"路径 / 链接 / MR 号",onChange:m=>R({...K,ref:m.target.value})})),e(b,{className:"ds-input",style:{width:"100%",marginTop:6},rows:5,value:K.content,placeholder:"交付物正文(Markdown)。这段会原样写成云盘文档的正文:做什么、怎么做、结论、风险。留空也能登记,但云盘里只有标题。",onChange:m=>R({...K,content:m.target.value})}),e("div",{className:"ds-row",style:{justifyContent:"flex-end",marginTop:6}},e("button",{className:"ds-btn",disabled:C||K.title.trim()==="",onClick:()=>void wt()},"登记并归档")))),e("div",{className:"ds-sec",style:Te("test")},e("div",{className:"ds-sec-head"},"测试用例",e("span",{className:"ds-hint"},st.total===0?"测试同学把用例登记在这里,逐条执行并回填结果":de),e("button",{className:"ds-btn ds-btn-ghost",disabled:Ee.busy,onClick:()=>void A()},Ee.busy?"生成中…":"✨ 按需求生成"),e("button",{className:"ds-btn ds-btn-ghost",disabled:ge.busy||pt.filter(m=>m.http!=null||m.shell!=null||m.db!=null).length===0,onClick:()=>void Ln(void 0)},ge.busy?"运行中…":"▶ 跑用例")),e("div",{className:"ds-sec-body","data-scroll":"1"},ge.note===""?null:e("div",{className:"ds-hint"},ge.note),Ee.note===""?null:e("div",{className:"ds-hint"},Ee.note),st.total===0?e("div",{className:"ds-empty"},"还没有用例。"):te===null?e("div",{className:"ds-hint"},"载入用例…"):pt.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 dn(m,j.target.value)},Zp.map(j=>e("option",{key:j,value:j},Ql[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"},Jp[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(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(re){I(re instanceof Error?re.message:String(re))}}},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:ge.busy,onClick:()=>void Ln(m.id)},"▶"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"标记为不稳定用例:失败时不自动开缺陷","data-flaky":m.flaky===!0?"1":"0",onClick:()=>void Fe(m)},m.flaky===!0?"不稳":"标不稳"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>void ue(m)},"×"))),e("div",{className:"ds-row"},e(u,{className:"ds-input",style:{flex:1},value:X.title,placeholder:"用例:做什么,例如 用错误密码连续登录 5 次",onChange:m=>ie({...X,title:m.target.value})}),e(u,{className:"ds-input",style:{flex:1},value:X.expected,placeholder:"期望结果,例如 第 5 次返回 429 并锁定 10 分钟",onChange:m=>ie({...X,expected:m.target.value})}),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"加一条 shell 用例:跑命令看退出码与输出(需要先在设置里打开 allowShell)",onClick:()=>void Fo()},"+ shell"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"加一条数据库用例:查库断言行数与某列值(需要先在设置里打开 allowDb)",onClick:()=>void Dn()},"+ 数据库"),e("button",{className:"ds-btn",disabled:C||X.title.trim()==="",onClick:()=>void On()},"+ 加用例")),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=>ie({...X,type:m.target.value})},sx.map(m=>e("option",{key:m,value:m},Jp[m]))),e(x,{className:"ds-select",style:{width:84},value:X.priority??"p2",onChange:m=>ie({...X,priority:m.target.value})},rx.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=>ie({...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=>oe({...X,steps:m.target.value})}),e("div",{className:"ds-hint"},"先登录取 token、再带 token 调业务接口时用;变量写成 {{data.token}} 放进 url 或 body。第一步失败后面不会跑。")))),e("div",{className:"ds-sec",style:Te("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(Be=>Be.id===d.project);if((d.service??"")==="")return"未指定(用项目默认目录)";const A=(m?.services??[]).find(Be=>Be.id===d.service);if(A===void 0)return`${d.service}(已失效)`;const se=(A.dependsOn??[]).map(Be=>(m.services??[]).find(Na=>Na.id===Be)).filter(Be=>Be!==void 0),Pe=se.length===0?"":` · 依赖 ${se.map(Be=>Be.name).join("、")}`;return`${A.name}${A.repoPath?` · ${A.repoPath}`:""}${Pe}`})()),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(Pe=>Pe.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:Te("discuss")},e("div",{className:"ds-sec-head"},`评论(${Ve})`,e("span",{className:"ds-hint"},"最新的在最上面")),Ve===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(aa=>aa.name===m.author)??A.find(aa=>m.author!==void 0&&m.author!==""&&(aa.name.includes(m.author)||m.author.includes(aa.name)))??A.find(aa=>m.author===(ja[aa.role]??"")),Pe=/产品|架构|研发|开发|测试|运维|专家/.test(String(m.author??"")),Be=m.kind==="human"?!0:m.kind==="agent"?!1:!(se!==void 0||Pe),Na=Be?m.author===void 0||m.author===""||m.author==="人"?"我":m.author:se?.name??(m.author===""||m.author===void 0?"AI":m.author),ft=s(m.body);return e("div",{className:"ds-cm",key:m.id,"data-kind":Be?"human":"agent","data-role":se?.role??""},e("div",{className:"ds-cm-avatar"},Be?e("span",{className:"ds-cm-initial"},Na.slice(0,1)):se?.emoji??"🤖"),e("div",{className:"ds-cm-main"},e("div",{className:"ds-cm-head"},e("span",{className:"ds-cm-name"},Na),e("span",{className:"ds-cm-kind"},Be?"我提出":"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"},ft.length===0?e("span",{className:"ds-hint"},"(这条评论没有正文)"):ft)))})))))),e("div",{className:"ds-dw-foot"},e("div",{className:"ds-mention-bar"},e("button",{className:"ds-btn",disabled:C,onClick:()=>{Aa(0),ca(m=>m===null||m.inline?{query:"",from:null,inline:!1}:null)}},Ct===null?`@ 提到谁(${Dt.length})`:"收起名单"),e("span",{className:"ds-hint"},"也可以在输入框里直接打「@」搜")),Ct!==null?e(k,{roster:Dt,query:Ct.query,active:Pn,onActive:Aa,onQuery:m=>{ca(A=>A===null?{query:m,from:null,inline:!1}:{...A,query:m}),Aa(0)},onPick:z,onClose:()=>ca(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(!(Ct===null||Ct.inline!==!0))if(m.key==="ArrowDown"||m.key==="ArrowUp"){if(m.preventDefault(),Ot.length===0)return;Aa(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(),ca(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 Xl(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:["专家",ja[n.role]??n.role??"",n.domain??""].filter(Boolean).join(" · "),search:[n.name,n.id,n.domain,n.description,ja[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"}],Zl=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:Zl.get("new-requirement"),label:"新建需求",hint:"需求 → 功能点 → 拆成卡",keys:"新建 需求 new requirement 提需求"},{id:"new-task",shortcut:Zl.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:Zl.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 Jl="dsh-studio:recent-actions",Nx=6;function Sx(){try{globalThis.localStorage?.removeItem(Jl)}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(),...Xl(e)]}function qo(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:"操作"},Vo={"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(Jl),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(Jl,JSON.stringify(G))}catch{}},g=t.useRef(null),d=t.useMemo(()=>Ex(n),[n]),h=t.useMemo(()=>Xl(n).filter(P=>P.kind==="task"),[n]),y=t.useMemo(()=>Xl(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(qo(d,l),l===""?x:[]):f.step==="expert"?qo(y,l):f.step==="column"?qo(S,l):qo(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"&&Vo[P.id]!==void 0){E(P.id);return}r(P),s()}},[i]),t.useEffect(()=>{p(0)},[l]);const E=P=>{v({action:P,step:Vo[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"&&Vo[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},Vo[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 ed=null;function Rx(e){ed=e}function vt(){if(ed===null)throw new Error("studio client context is not ready");return ed}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}=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(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}业务的产品经理。
|
|
19
|
+
3. 提交订单`,onChange:m=>ie({...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=>ie({...X,steps:m.target.value})}),e("div",{className:"ds-hint"},"先登录取 token、再带 token 调业务接口时用;变量写成 {{data.token}} 放进 url 或 body。第一步失败后面不会跑。")))),e("div",{className:"ds-sec",style:Te("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(Ie=>Ie.id===d.project);if((d.service??"")==="")return"未指定(用项目默认目录)";const j=(m?.services??[]).find(Ie=>Ie.id===d.service);if(j===void 0)return`${d.service}(已失效)`;const re=(j.dependsOn??[]).map(Ie=>(m.services??[]).find(ea=>ea.id===Ie)).filter(Ie=>Ie!==void 0),$e=re.length===0?"":` · 依赖 ${re.map(Ie=>Ie.name).join("、")}`;return`${j.name}${j.repoPath?` · ${j.repoPath}`:""}${$e}`})()),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}(判失败于 ${Ke(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(re=>re.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($e=>$e.id===m.status)?.label??m.status,re=m.note===void 0||m.note===""?"":`(${m.note})`;return`${j} · ${Ke(m.at)}${re}`}).join(" → ")||"无"))),e("div",{className:"ds-sec",style:Te("discuss")},e("div",{className:"ds-sec-head"},`评论(${We})`,e("span",{className:"ds-hint"},"最新的在最上面")),We===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 j=h.config?.experts??[],re=j.find(Kt=>Kt.name===m.author)??j.find(Kt=>m.author!==void 0&&m.author!==""&&(Kt.name.includes(m.author)||m.author.includes(Kt.name)))??j.find(Kt=>m.author===(za[Kt.role]??"")),$e=/产品|架构|研发|开发|测试|运维|专家/.test(String(m.author??"")),Ie=m.kind==="human"?!0:m.kind==="agent"?!1:!(re!==void 0||$e),ea=Ie?m.author===void 0||m.author===""||m.author==="人"?"我":m.author:re?.name??(m.author===""||m.author===void 0?"AI":m.author),at=s(m.body);return e("div",{className:"ds-cm",key:m.id,"data-kind":Ie?"human":"agent","data-role":re?.role??""},e("div",{className:"ds-cm-avatar"},Ie?e("span",{className:"ds-cm-initial"},ea.slice(0,1)):re?.emoji??"🤖"),e("div",{className:"ds-cm-main"},e("div",{className:"ds-cm-head"},e("span",{className:"ds-cm-name"},ea),e("span",{className:"ds-cm-kind"},Ie?"我提出":"AI 回复"),re!==void 0&&re.domain!==""?e(f,{className:"ds-chip","data-role":re.role},re.domain):null,e("span",{className:"ds-cm-meta"},Ke(m.at))),e("div",{className:"ds-cm-bubble ds-md"},at.length===0?e("span",{className:"ds-hint"},"(这条评论没有正文)"):at)))})))))),e("div",{className:"ds-dw-foot"},e("div",{className:"ds-mention-bar"},e("button",{className:"ds-btn",disabled:C,onClick:()=>{La(0),fa(m=>m===null||m.inline?{query:"",from:null,inline:!1}:null)}},Et===null?`@ 提到谁(${Lt.length})`:"收起名单"),e("span",{className:"ds-hint"},"也可以在输入框里直接打「@」搜")),Et!==null?e(k,{roster:Lt,query:Et.query,active:An,onActive:La,onQuery:m=>{fa(j=>j===null?{query:m,from:null,inline:!1}:{...j,query:m}),La(0)},onPick:Z,onClose:()=>fa(null)}):null,e("div",{className:"ds-composer"},e(p,{className:"ds-textarea",style:{minHeight:58},placeholder:"支持 Markdown:`# 标题`、`**粗体**`、`` `代码` ``、``` 代码块 ```、`- 列表`、`| 表格 |`;打「@」选专家派活。",value:D,onFocus:()=>Ge("discuss"),onChange:m=>{W(m.target.value),jn(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(),me();return}if(!(Et===null||Et.inline!==!0))if(m.key==="ArrowDown"||m.key==="ArrowUp"){if(m.preventDefault(),Mt.length===0)return;La(j=>(j+(m.key==="ArrowDown"?1:-1)+Mt.length)%Mt.length)}else m.key==="Enter"&&Mt.length>0?(m.preventDefault(),Z(Mt[Math.min(An,Mt.length-1)].name)):m.key==="Escape"&&(m.preventDefault(),fa(null))}}),e("div",{className:"ds-composer-bar"},e("span",{className:"ds-hint"},"Markdown 可用 · 打 @ 派活 · Ctrl/⌘+Enter 发送"),e("span",{className:"ds-composer-count"},D.trim()===""?"还没写":`${D.length} 字`),e("button",{className:"ds-btn ds-btn-primary",disabled:C||D.trim()==="",onClick:()=>void me()},C?"发送中…":"发表评论")),M!==null?e("span",{className:"ds-ok"},M):null,_!==null?e("span",{className:"ds-err"},_):null))))}return g}const of=(e,t)=>e.length>t?e.slice(0,t-1)+"…":e;function ad(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?Ke(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:["专家",za[n.role]??n.role??"",n.domain??""].filter(Boolean).join(" · "),search:[n.name,n.id,n.domain,n.description,za[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 xx=[{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:"数据与备份"}],lf=[{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"}],nd=new Map(lf.map(e=>[e.id,e.label]));function wx(e){if(e==null)return!1;const t=String(e.tagName??"").toUpperCase();return t==="INPUT"||t==="TEXTAREA"||t==="SELECT"?!0:e.isContentEditable===!0}function kx(e){return e==null||typeof e.getAttribute!="function"?!1:e.getAttribute("data-palette-input")==="1"}function Nx(e){if(e==null||!(e.ctrlKey===!0||e.metaKey===!0)||e.altKey!==!0||e.shiftKey!==!0||!kx(e.target)&&wx(e.target))return null;const t=/^Key([A-Z])$/.exec(String(e.code??"")),a=t===null?String(e.key??"").toLowerCase():t[1].toLowerCase(),n=lf.find(r=>r.key===a);return n===void 0?null:n.id}const Sx=[{id:"new-requirement",shortcut:nd.get("new-requirement"),label:"新建需求",hint:"需求 → 功能点 → 拆成卡",keys:"新建 需求 new requirement 提需求"},{id:"new-task",shortcut:nd.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:nd.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 重载 同步"},...xx.map(e=>({id:"settings:"+e.id,label:"打开设置:"+e.label,hint:"设置 → "+e.label,keys:"设置 settings 配置 "+e.label+" "+e.id}))];function Cx(){return Sx.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 Ex(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 sd="dsh-studio:recent-actions",$x=6;function Tx(){try{globalThis.localStorage?.removeItem(sd)}catch{}}function Px(e,t,a=$x){return[t,...(Array.isArray(e)?e:[]).filter(r=>r!==t)].slice(0,a)}function _x(e){return[...Cx(),...ad(e)]}function Ko(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 Ix={task:"卡片",requirement:"需求",release:"版本",expert:"专家",team:"专家团",project:"项目",skill:"技能",action:"操作"},Yo={"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 Rx(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 Ax(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=df(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=df(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 jx({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 jx({api:e,state:t,columnId:a,confirm:n}){const r=Rx(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 df(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 Dx({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(sd),H=P===null?[]:JSON.parse(P);return Array.isArray(H)?H.filter(J=>typeof J=="string"):[]}catch{return[]}}),k=P=>{if(P==null||P.kind!=="action")return;const H=Px(x,P.id);b(H);try{window.localStorage.setItem(sd,JSON.stringify(H))}catch{}},g=t.useRef(null),d=t.useMemo(()=>_x(n),[n]),h=t.useMemo(()=>ad(n).filter(P=>P.kind==="task"),[n]),y=t.useMemo(()=>ad(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(H=>H.status===P.id).length+" 张卡",search:String(P.label??"").toLowerCase()})),[n.statuses,n.tasks]),C=t.useMemo(()=>f===null?Ex(Ko(d,l),l===""?x:[]):f.step==="expert"?Ko(y,l):f.step==="column"?Ko(S,l):Ko(h,l),[f,d,h,S,y,l,x]);t.useEffect(()=>{g.current?.focus()},[]),t.useEffect(()=>{if(o==null)return;const P=d.find(H=>H.id===o);if(P!==void 0){if(P.kind==="action"&&Yo[P.id]!==void 0){E(P.id);return}r(P),s()}},[i]),t.useEffect(()=>{p(0)},[l]);const E=P=>{v({action:P,step:Yo[P].step}),c(""),p(0)},_=P=>{if(P!==void 0){if(f===null){if(P.id==="clear-recents"){Tx(),s();return}if(k(P),P.kind==="action"&&Yo[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)},D=P=>{if(P.key==="Escape"){P.preventDefault(),I();return}if(P.key==="ArrowDown"){P.preventDefault(),p(H=>Math.min(C.length-1,H+1));return}if(P.key==="ArrowUp"){P.preventDefault(),p(H=>Math.max(0,H-1));return}P.key==="Enter"&&(P.preventDefault(),_(C[u]))},W=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},Yo[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:W,value:l,onChange:P=>c(P.target.value),onKeyDown:D,"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,H)=>e("div",{key:P.key,className:"ds-palette-item","data-active":H===u?"1":"0",onMouseEnter:()=>p(H),onClick:()=>_(P)},e("span",{className:"ds-palette-kind","data-kind":P.kind},Ix[P.kind]??P.kind),e("span",{className:"ds-palette-label"},of(P.label,80)),P.hint===""?null:e("span",{className:"ds-palette-hint"},of((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 rd=null;function Ox(e){rd=e}function vt(){if(rd===null)throw new Error("studio client context is not ready");return rd}function Lx({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 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}=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(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(O){y(O instanceof Error?O.message:String(O))}finally{C(!1)}}},D=(R,O)=>d({...g,[R]:O}),[W,M]=n.useState(""),[P,H]=n.useState([]);n.useEffect(()=>{let R=!0;return s("/skills").then(O=>{R&&H(O.skills??[])}).catch(()=>{}),()=>{R=!1}},[]);const J=R=>{const O=g.skills??[];D("skills",O.includes(R)?O.filter(G=>G!==R):[...O,R])},[U,F]=n.useState(""),L=()=>{const R=U.trim();if(R===""||g===null)return;const O=g.skills??[];O.includes(R)||D("skills",[...O,R]),F("")},w=async()=>{const R=W.trim();if(R.length!==0){C(!0),y(null);try{const O=[{role:"product",name:"产品经理",emoji:"📋",prompt:`你是${R}业务的产品经理。
|
|
21
21
|
先读 docs/ 与本领域的历史工单,再动手。
|
|
22
22
|
需求写清:目标用户、主流程、异常路径、验收口径。`},{role:"architect",name:"架构师",emoji:"🏛️",prompt:`你是${R}业务的架构师。
|
|
23
23
|
方案必须给出:数据模型、接口契约、失败与回滚、性能与容量估算。
|
|
24
24
|
不确定就去代码里找证据。`},{role:"dev",name:"开发工程师",emoji:"🛠️",prompt:`你是${R}业务的开发工程师。
|
|
25
25
|
改动要小步可验证,跑测试,写清改动的文件与风险。`},{role:"qa",name:"测试工程师",emoji:"🧪",prompt:`你是${R}业务的测试工程师。
|
|
26
|
-
按边界值、异常流、并发与幂等设计用例,列出实际执行结果。`}];for(const
|
|
26
|
+
按边界值、异常流、并发与幂等设计用例,列出实际执行结果。`}];for(const G of O)await s("/experts/save",{expert:{name:`${R}${G.name}`,emoji:G.emoji,role:G.role,domain:R,description:`负责${R}业务线的${G.name}工作`,prompt:G.prompt,model:"",preset:"",enabled:!0}});M(""),await t()}catch(O){y(O instanceof Error?O.message:String(O))}finally{C(!1)}}},T=R=>{const O=String(R??"").trim();if(O==="")return"";const G=O.replace(/\s*\n\s*/g," / ");return G.length>96?`${G.slice(0,96)}…`:G},K=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:K,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:W,placeholder:"支付 / 风控 / 会员",onChange:R=>M(R.target.value)}),a("button",{className:"ds-btn",disabled:S||W.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=>D("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:()=>D("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=>D("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=>D("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=>D("role",R.target.value)},a("option",{value:""},"不限"),["product","architect","dev","qa"].map(R=>a("option",{key:R,value:R},za[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=>D("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 O=(g.skills??[]).includes(R.name),G=k.filter(we=>(we.skills??[]).includes(R.name)).length;return a("label",{key:R.name,className:"ds-skillopt","data-on":O?"1":"0",title:String(R.description??"")},a(v,{checked:O,onChange:()=>J(R.name)}),a("span",{className:"ds-skillname"},R.name),a("span",{className:"ds-skilldesc"},String(R.description??"").slice(0,46)),G>0?a("span",{className:"ds-skillusers"},`${G} 位在用`):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:U,placeholder:"技能库以外的技能名,例如 lark-doc、office-xlsx(回车或点「加上」)",onChange:R=>F(R.target.value),onKeyDown:R=>{R.key==="Enter"&&(R.preventDefault(),L())}}),a("button",{className:"ds-btn",onClick:()=>L()},"加上")),(g.skills??[]).filter(R=>!P.some(O=>O.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(O=>O.name===R)).map(R=>a(f,{key:R,className:"ds-chip","data-missing":"1"},R,a("button",{className:"ds-chip-x",title:"移除",onClick:()=>D("skills",(g.skills??[]).filter(O=>O!==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=>D("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=>D("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=>D("sandbox",R.target.value)},[["","跟随全局"],["read-only","只读"],["workspace-write","只写工作区"],["danger-full-access","无沙箱"]].map(([R,O])=>a("option",{key:R,value:R},O))),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: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}=vt(),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}=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)),[_,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"},"删除"))),We=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"},We,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","regression/finished"].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}=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),[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}=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),[_,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}=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([]),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}=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),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}=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)}}},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} · ${Hl[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(Hl).map(w=>a("option",{key:w,value:w},Hl[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} · ${Gl[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(Gl).map(w=>a("option",{key:w,value:w},Gl[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}=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(""),[_,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}=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]),_=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"🎯 "+(ja[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"},Bo(E,y).length===0?a("div",{className:"ds-mention-empty"},"没有匹配的专家或专家团"):Bo(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}=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(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}=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(""),[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}=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(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}=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??""),[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}=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),[_,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}),We=ye.overwritten===!0?"已覆盖":"已上传";S(`${We}技能「${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:`# 什么时候用
|
|
29
|
+
不确定的地方去代码或历史工单里找证据,禁止编造接口字段。`,onChange:R=>D("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=>D("enabled",R.target.checked)}),a("span",{},"启用这个专家")))))}function zx({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),[_,I]=n.useState({});n.useEffect(()=>{let U=!0;return s("/team/memory",{}).then(F=>{U&&I(F?.memory??{})}).catch(()=>{}),()=>{U=!1}},[e.teams]);const D=async U=>{if(await i("清空「"+U.name+"」的团队记忆?",{title:"清空团队记忆",danger:!0,okText:"清空"}))try{const F=await s("/team/memory/clear",{teamId:U.id});I(F?.memory??{}),o("已清空这个团的记忆")}catch(F){S(F instanceof Error?F.message:String(F))}},W=U=>{const F=g.find(L=>L.id===U);return F===void 0?U:`${F.emoji} ${F.name}`},M=async()=>{if(d!==null){E(!0),S(null);try{await s("/teams/save",{team:d}),h(null),await t()}catch(U){S(U instanceof Error?U.message:String(U))}finally{E(!1)}}},P=async U=>{if(await i(`删除专家团「${U.name}」?`,{title:"删除专家团",danger:!0,okText:"删除"})){E(!0),S(null);try{await s("/teams/delete",{id:U.id}),await t()}catch(F){S(F instanceof Error?F.message:String(F))}finally{E(!1)}}},H=(U,F)=>h({...d,[U]:F}),J=k.map(U=>a("div",{className:"ds-listrow",key:U.id},a("div",{className:"ds-listrow-main"},a("div",{},`👥 ${U.name}`),a("div",{className:"ds-hint"},`团长 ${W(U.lead)} · 成员 ${U.members.map(W).join("、")}`),a("div",{className:"ds-hint"},(_[U.id]??[]).length===0?"🧠 团队记忆:还没有(卡做完会自动记一条,派活时带进提示词)":`🧠 团队记忆 ${_[U.id].length} 条 · 最近:${_[U.id][0]?.outcome??""} ${_[U.id][0]?.title??""}`)),a("div",{className:"ds-listrow-actions"},l("清空这个团的记忆",a("button",{className:"ds-btn ds-btn-ghost",disabled:C||(_[U.id]??[]).length===0,onClick:()=>void D(U)},"清空记忆")),l("编辑这个专家团",a("button",{className:"ds-btn",disabled:C,onClick:()=>h({...U})},"编辑")),l("删除这个专家团",a("button",{className:"ds-btn",disabled:C,onClick:()=>void P(U),"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:U=>U,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:U=>H("name",U.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"这个团负责什么"),a(u,{className:"ds-input",value:d.description,placeholder:"从需求澄清一路做到验收",onChange:U=>H("description",U.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(U=>a("label",{className:"ds-row",key:U.id,style:{alignItems:"center",gap:6,cursor:"pointer"}},a(v,{checked:(d.members??[]).includes(U.id),onChange:F=>H("members",F.target.checked?[...d.members??[],U.id]:(d.members??[]).filter(L=>L!==U.id))}),a("span",{},`${U.emoji} ${U.name}`))))),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"团长(负责拆活和汇总)"),a(x,{className:"ds-input",value:d.lead??"",onChange:U=>H("lead",U.target.value)},a("option",{value:""},"自动(第一个成员)"),(d.members??[]).map(U=>a("option",{key:U,value:U},W(U)))))))}function Fx({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)),[_,I]=n.useState(!1),[D,W]=n.useState(null),[M,P]=n.useState(null),[H,J]=n.useState({allowShell:k.allowShell===!0,allowDb:k.allowDb===!0}),[U,F]=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(z){W(z instanceof Error?z.message:String(z))}finally{I(!1)}},K=async()=>{I(!0),P(null);try{await s("/config",{limits:U}),P("上限已保存"),o("上限已保存"),await t()}catch(ae){W(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){W(ae instanceof Error?ae.message:String(ae))}finally{I(!1)}},O=async ae=>{I(!0),W(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(z){W(z instanceof Error?z.message:String(z))}finally{I(!1)}},G=async()=>{if(d===null)return;const ae=String(d.name??"").trim(),z=String(d.baseUrl??"").trim();if(ae===""){W("环境名不能为空");return}const te={id:d.id??"",name:ae,baseUrl:z},xe=d.id===void 0||d.id===""?[...g,te]:g.map(X=>X.id===d.id?{...X,...te}:X);h(null),await O({envs:xe,defaultEnv:k.defaultEnv===""?"":k.defaultEnv})},we=async ae=>{if(!await i(`删除环境「${ae.name}」?`,{title:"删除环境",danger:!0,okText:"删除"}))return;const z=g.filter(te=>te.id!==ae.id);await O({envs:z,defaultEnv:k.defaultEnv===ae.id?z[0]?.id??"":k.defaultEnv})},fe=async()=>{const ae=y.split(/[,,\s]+/).map(te=>te.trim()).filter(te=>te!==""),z=Number(C);await O({allowHosts:ae,timeoutMs:Number.isFinite(z)&&z>0?z: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 O({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"},"删除"))),He=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 G()},"保存环境"))));return a("div",{className:"ds-pane-stack"},He,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:H.allowShell,disabled:_,onChange:ae=>void T({...H,allowShell:ae.target.checked})}),a("span",{className:"ds-check-text"},"允许 shell 用例(能在宿主机执行命令)")),a("label",{className:"ds-check",style:{marginTop:6}},a(v,{checked:H.allowDb,disabled:_,onChange:ae=>void T({...H,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(U.casesPerTask),onChange:ae=>F({...U,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(U.runKeys),onChange:ae=>F({...U,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(U.artifactsPerTask),onChange:ae=>F({...U,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 K()},"保存上限")))),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,z)=>a("div",{key:z,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,ie)=>ie===z?{...X,url:te.target.value}:X))}),a(v,{checked:ae.enabled!==!1,onChange:te=>w(xe=>xe.map((X,ie)=>ie===z?{...X,enabled:te.target.checked}:X))}),a("button",{className:"ds-btn ds-btn-ghost",disabled:_,onClick:()=>w(te=>te.filter((xe,X)=>X!==z))},"×")),a("div",{className:"ds-row",style:{gap:10,flexWrap:"wrap",marginTop:2}},["task/moved","case/failed","gate/blocked","agent/failed","regression/finished"].map(te=>a("label",{className:"ds-check",key:te},a(v,{checked:(ae.events??[]).includes(te),onChange:xe=>w(X=>X.map((ie,ge)=>ge===z?{...ie,events:xe.target.checked?Array.from(new Set([...ie.events??[],te])):(ie.events??[]).filter(V=>V!==te)}:ie))}),a("span",{className:"ds-check-text",style:{fontSize:12}},te))),(ae.events??[]).length===0?a("span",{className:"ds-hint",style:{fontSize:12}},"一个都没勾 = 订阅全部事件"):null))),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),D===null?null:a("div",{className:"ds-err"},D))))}function Bx({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),[I,D]=n.useState(null),W=async()=>{C(!0),_(null),D(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){D(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 W()},S?"保存中…":"保存升级设置")),E===null?null:a("div",{className:"ds-ok"},E),I===null?null:a("div",{className:"ds-err"},I)))}function Ux({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),[_,I]=n.useState(null),D=async J=>{I(null);try{await s("/config",{releaseRules:J}),I("发布准入已更新"),await t()}catch(U){I(U instanceof Error?U.message:String(U))}},W=()=>g(J=>J.length>=12?J:[...J,{id:"",name:"",kind:"other",note:""}]),M=(J,U)=>g(F=>F.map((L,w)=>w===J?{...L,...U}:L)),P=J=>g(U=>U.filter((F,L)=>L!==J)),H=async()=>{h(!0),S(null),E(null);try{const J=k.map(U=>({...U,name:String(U.name??"").trim()})).filter(U=>U.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,U)=>a("div",{key:`env-${U}`,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=>M(U,{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=>M(U,{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=>M(U,{note:F.target.value})})),a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>P(U),"data-danger":"1"},"删除"))),a("div",{className:"ds-row",style:{gap:8,marginTop:10}},a("button",{className:"ds-btn",onClick:W,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 H()},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 D({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 D({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 qx({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([]),I=e.localAuth??{},[D,W]=p.useState(""),[M,P]=p.useState(""),[H,J]=p.useState(!1),[U,F]=p.useState(null),[L,w]=p.useState(null),T=async()=>{J(!0),F(null),w(null);try{await r("/auth/password",{username:I.username,currentPassword:D,newPassword:M}),W(""),P(""),F("密码已更新"),t()}catch(G){w(G instanceof Error?G.message:String(G))}finally{J(!1)}},K=G=>x(we=>({...we,...G})),R=async()=>{d(!0),y(null),C(null),_([]);try{const G=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});_(G.steps??[]),y(G.message??"连接正常"),s(G.message??"连接正常",G.ok===!1?"error":"success")}catch(G){const we=G instanceof Error?G.message:String(G);C(we)}finally{d(!1)}},O=async()=>{k(!0),y(null),C(null);try{const G={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()!==""&&(G.ldap.bindPassword=v.bindPassword.trim()),await r("/config",G),K({bindPassword:""}),y(v.bindPassword.trim()===""?"已保存(服务账号密码没改)":"已保存,服务账号密码已写入密钥文件"),await t()}catch(G){C(G instanceof Error?G.message:String(G))}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:G=>K({enabled:G.target.checked})}),a("span",{className:"ds-check-text"},"启用 LDAP 登录")),a("label",{className:"ds-check",style:{marginTop:6}},a(c,{checked:v.requireLogin,onChange:G=>K({requireLogin:G.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:G=>K({url:G.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:G=>K({timeoutMs:G.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:G=>K({baseDN:G.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:G=>K({bindDN:G.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:G=>K({bindPassword:G.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:G=>K({userFilter:G.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:G=>K({nameAttr:G.target.value})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"邮箱属性"),a(l,{className:"ds-input",value:v.mailAttr,onChange:G=>K({mailAttr:G.target.value})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"部门属性"),a(l,{className:"ds-input",value:v.deptAttr,onChange:G=>K({deptAttr:G.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 O()},b?"保存中…":"保存")),E.length===0?null:a("div",{style:{marginTop:8}},E.map((G,we)=>a("div",{key:`ldap-step-${we}`,className:G.ok===!0?"ds-ok":"ds-error"},`${G.ok===!0?"✓":"✗"} ${G.name}:${G.message}${G.ms>0?`(${G.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:D,onChange:G=>W(G.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:G=>P(G.target.value)})),a("button",{className:"ds-btn",disabled:H||D===""||M.length<8,onClick:()=>void T()},H?"提交中…":"改密码")),U===null?null:a("div",{className:"ds-ok",style:{marginTop:6}},U),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(G=>a("div",{key:G.id,className:"ds-kv"},a("div",null,G.name),a("div",null,`${G.id} · ${G.dept===""?"(无部门)":G.dept} · 登录 ${G.loginCount} 次 · 最近 ${Ke(G.lastLoginAt)}`))))))}function Vx({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),I=async()=>{y(!0),C(null),_(null);try{const D=Number(v),W=Number(b),M=Number(g);if(!Number.isFinite(D)||D<=0)throw new Error("预算次数要是正整数");if(!Number.isFinite(W)||W<=0)throw new Error("预算小时要是正整数");await r("/config",{costs:{budgetRuns:Math.round(D),budgetHours:Math.round(W),warnAt:Number.isFinite(M)?Math.min(100,Math.max(10,Math.round(M))):80}}),C("已保存:预算"),await t()}catch(D){_(D instanceof Error?D.message:String(D))}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:D=>x(D.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"每月机上时长上限(小时)"),a(l,{className:"ds-input",value:b,onChange:D=>k(D.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"警告阈值(百分比)"),a(l,{className:"ds-input",value:g,onChange:D=>d(D.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 Wx({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)}}},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)}}},D=async w=>{if(C.name.trim()!==""){S(!0),g(null);try{await r("/projects/iteration",{project:w.id,name:C.name.trim(),start:jr(C.start),due:jr(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)}}},W=async(w,T)=>{S(!0),g(null);try{await r("/projects/iteration",{project:w.id,action:"remove",iteration:T.id}),await t()}catch(K){g(K instanceof Error?K.message:String(K))}finally{S(!1)}},M=(w,T)=>b({...x,[w]:T}),P=(w,T,K)=>b({...x,services:(x.services??[]).map((R,O)=>O===w?{...R,[T]:K}:R)}),H=()=>b({...x,services:[...x.services??[],{id:"",name:"",repoId:"",repoPath:"",baseBranch:x.baseBranch||"main",dependsOn:[]}]}),J=w=>b({...x,services:(x.services??[]).filter((T,K)=>K!==w)}),U=x===null?[]:x.services??[],F=(w,T)=>b({...x,services:(x.services??[]).map((K,R)=>{if(R!==w)return K;const O=Array.isArray(K.dependsOn)?K.dependsOn:[];return{...K,dependsOn:O.includes(T)?O.filter(G=>G!==T):[...O,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} · ${Xl[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((K,R)=>K+(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(Xl).map(w=>a("option",{key:w,value:w},Xl[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"},`服务(${U.length})· 一个服务一个 git 路径,卡片可以指定改哪个`),U.length===0?a("div",{className:"ds-empty"},"还没有分服务。只有一个仓库时留空即可,走上面的默认代码目录。"):U.map((w,T)=>{const K=U.filter((R,O)=>O!==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"},"删除")),K.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}},"(勾上的服务要先完成,本服务的卡才能收口)"),K.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:()=>F(T,R.id)},R.name||R.id))))}),a("div",{className:"ds-row",style:{gap:8}},a("button",{className:"ds-btn",type:"button",onClick:()=>H()},"+ 加一个服务"),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} · ${Zl[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 W(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(Zl).map(w=>a("option",{key:w,value:w},Zl[w])))),a("button",{className:"ds-btn",disabled:y||C.name.trim()==="",onClick:()=>void D(x)},"+ 加迭代")),a("div",{className:"ds-hint"},"迭代改完会立刻反映到看板的迭代筛选。"))))}function Hx({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(""),[_,I]=v.useState(!1),[D,W]=v.useState(""),M=async(w,T)=>{h(!0),S(null);try{await s(w,T),await a()}catch(K){{const R=K instanceof Error?K.message:String(K);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"}))},H=Array.from(new Set(b.map(w=>w.by))).sort(),J=D.trim().toLowerCase(),U=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=U.slice(0,120),L=()=>{const w=new URLSearchParams({by:C,q:D.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(`正在导出 ${U.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,`审计日志(显示 ${F.length} / 命中 ${U.length} / 共 ${b.length} 条)`),n("div",{className:"ds-row",style:{gap:8,marginLeft:"auto"}},n(c,{className:"ds-input",placeholder:"搜动作 / 人 / 详情",value:D,style:{width:170},onChange:w=>W(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__"},"所有人"),H.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:U.length===0,onClick:L,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"},Ke(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 Gx({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(()=>rf(v),[v]),_=F=>{const L=v.columns?.[F];return L==null?[]:Array.isArray(L.members)?L.members:L.kind==="none"?[]:[{kind:L.kind,id:L.id}]},I=F=>v.columns?.[F]?.strategy??"round_robin",D=F=>{if(F.kind==="role")return"🎯 "+(za[F.id]??F.id);if(F.kind==="team"){const w=(v.teams??[]).find(T=>T.id===F.id);return w===void 0?`👥 ${F.id}`:`${w.emoji??"👥"} ${w.name}`}const L=(v.experts??[]).find(w=>w.id===F.id);return L===void 0?F.id:`${L.emoji} ${L.name}`},W=Array.isArray(v.design?.columns)?v.design.columns:["dev"],M=async F=>{g(!0),b(null);try{await r("/config",{design:{...v.design??{},...F}}),await t()}catch(L){b(L instanceof Error?L.message:String(L))}finally{g(!1)}},P=F=>{const L=W.includes(F)?W.filter(w=>w!==F):[...W,F];M({columns:L})},H=async(F,L,w)=>{g(!0),b(null);try{await r("/columns/save",{status:F,members:L,strategy:w}),await t()}catch(T){b(T instanceof Error?T.message:String(T))}finally{g(!1)}},J=(F,L)=>{const w=L.key.startsWith("t:")?"team":L.key.startsWith("r:")?"role":"expert",T=L.key.slice(2),K=_(F);K.some(R=>R.kind===w&&R.id===T)||(S(""),H(F,[...K,{kind:w,id:T}],I(F)))},U=(F,L)=>void H(F,_(F).filter((w,T)=>T!==L),I(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 M({enabled:v.design?.enabled!==!0})},v.design?.enabled===!0?"设计闸门:已开启":"设计闸门:已关闭"),C.map(F=>a("button",{key:"gate-"+F.id,className:W.includes(F.id)?"ds-btn ds-btn-primary":"ds-btn",disabled:k,onClick:()=>P(F.id)},F.label??F.id))),C.map(F=>{const L=_(F.id),w=I(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),L.length===0?a("span",{className:"ds-hint"},"👤 等人认领(不自动派)"):L.map((T,K)=>a(c,{className:"ds-chip ds-chip-owner",key:`${T.kind}:${T.id}`},D(T),a("button",{className:"ds-chip-x",title:"从候选里去掉",disabled:k,onClick:()=>U(F.id,K)},"×"))),a("button",{className:"ds-btn",style:{marginLeft:"auto"},disabled:k,onClick:()=>{S(""),h(T=>T===F.id?null:F.id)}},d===F.id?"收起":"+ 加候选"),L.length>=2?a(p,{className:"ds-input",style:{width:240},value:w,disabled:k,onChange:T=>void H(F.id,L,T.target.value)},STRATEGIES.map(T=>a("option",{key:T.id,value:T.id},T.label))):null),d===F.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"},Ho(E,y).length===0?a("div",{className:"ds-mention-empty"},"没有匹配的专家或专家团"):Ho(E,y).map(T=>a("button",{key:T.key,className:"ds-mention-item",onClick:()=>J(F.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 Kx({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(D=>{x(D.storage??null),k(D.snapshots??[]),d(null)}).catch(D=>d(D instanceof Error?D.message:String(D)))},[]);f.useEffect(()=>{E()},[E,e.revision]);const _=async D=>{await i(`把看板回滚到快照 #${D}?当前的这一版会先另存一份,不会丢。`,{title:"回滚快照",okText:"回滚"})&&(C(!0),y(null),r("/snapshot/restore",{id:D}).then(()=>{y(`已回滚到快照 #${D}`),E(),t?.()}).catch(W=>d(W instanceof Error?W.message:String(W))).finally(()=>C(!1)))},I=D=>{const W=new Date(Number(D)||0);return`${W.getMonth()+1}-${String(W.getDate()).padStart(2,"0")} ${String(W.getHours()).padStart(2,"0")}:${String(W.getMinutes()).padStart(2,"0")}:${String(W.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(D=>a("div",{key:D.id,className:"ds-listrow"},a("div",{className:"ds-listrow-main"},a("div",null,`#${D.id} · rev ${D.revision}`),a("div",{className:"ds-hint"},`${I(D.at)} · ${(D.bytes/1024).toFixed(1)} KB`)),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn ds-btn-ghost",disabled:S,onClick:()=>_(D.id)},"回滚到这版")))))))}function Yx({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(""),[I,D]=v.useState(!1),W=E.trim().toLowerCase(),M=(y.log??[]).filter(w=>{const T=String(w?.line??"");return I&&!/失败|错误|异常|拦|拒绝/.test(T)?!1:W===""||T.toLowerCase().includes(W)}),P=M.slice(0,12),H=()=>{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(K=>`${K.name} +${K.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 K=T instanceof Error?T.message:String(T);d(K),o(K,"error")}}finally{k("")}},U=w=>{const T=Number(w)||0;if(T===0)return"—";const K=new Date(T);return`${K.getMonth()+1}-${String(K.getDate()).padStart(2,"0")} ${String(K.getHours()).padStart(2,"0")}:${String(K.getMinutes()).padStart(2,"0")}`},F={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=>D(w.target.checked)}),n("span",null,"只看失败")),n("button",{className:"ds-btn ds-btn-ghost",disabled:M.length===0,onClick:H,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",{},U(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"},`${U(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}},F[w.state])),n("div",{className:"ds-hint"},w.hint),n("div",{className:"ds-hint"},`最近一次:${U(w.at)} · 成功 ${U(w.lastOkAt)} · 失败 ${U(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 Qx({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(H){d(H instanceof Error?H.message:String(H))}finally{C(!1)}}},I=async P=>{C(!0),d(null),y(null);try{const H=await r("/repos/test",{id:P.id});y(`连通:${P.project}(示例 Issue ${H.sample} 条)`)}catch(H){d(H instanceof Error?H.message:String(H))}finally{C(!1)}},D=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(H){d(H instanceof Error?H.message:String(H))}finally{C(!1)}},W=(P,H)=>k({...b,[P]:H}),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 D(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=>W("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=>W("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=>W("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=>W("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=>W("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=>W("syncEnabled",P.target.checked)}),a("span",{},"每分钟自动把这个项目的新 Issue 拉成卡片")))))}const cf=[{key:"change",label:"卡片状态变化"},{key:"sla",label:"缺陷 SLA 超时"},{key:"bug",label:"自动开缺陷"},{key:"release",label:"版本发布"}],Xx=e=>{const t=e.events!==null&&typeof e.events=="object"?e.events:null;return t===null?e.notifyOnChange===!1?[]:["change","sla","bug","release"]:cf.filter(a=>t[a.key]!==!1).map(a=>a.label)};function Zx({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??""),[I,D]=v.useState(e.feishu?.autoSyncArtifacts!==!1),[W,M]=v.useState(!1),[P,H]=v.useState(null),J=async()=>{M(!0),H(null);try{await r("/config",{feishu:{driveFolder:E.trim(),autoSyncArtifacts:I}}),H("已保存"),await t()}catch(O){H(O instanceof Error?O.message:String(O))}finally{M(!1)}},U=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(G){d(G instanceof Error?G.message:String(G))}finally{C(!1)}}},L=async O=>{C(!0),d(null),y(null);try{const we=((await r("/feishu/test",{id:O.id})).results??[])[0];y(we!==void 0&&we.ok===!0?`「${O.name}」测试消息已发送`:`「${O.name}」发送失败:${we?.error??"检查 Webhook"}`)}catch(G){d(G instanceof Error?G.message:String(G))}finally{C(!1)}},w=(O,G)=>k({...b,[O]:G}),T=O=>{const G=b.events!==null&&typeof b.events=="object"?b.events:null;return G===null?O==="change"?b.notifyOnChange!==!1:!0:G[O]!==!1},K=(O,G)=>{const fe={...b.events!==null&&typeof b.events=="object"?b.events:{},[O]:G};k({...b,events:fe,notifyOnChange:fe.change!==!1})},R=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:""} · 收:${Xx(O).join(" / ")||"什么都不收"}`)),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn",disabled:S,onClick:()=>void L(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:R,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:I,onChange:O=>D(O.target.checked)}),a("span",{},"专家登记交付物时自动归档(关掉就只存平台里)")),a("div",{className:"ds-row",style:{gap:8}},a("button",{className:"ds-btn ds-btn-primary",disabled:W,onClick:()=>void J()},W?"保存中…":"保存"),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 U()},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"}},...cf.map(O=>a("label",{key:O.key,className:"ds-row",style:{alignItems:"center",gap:8,cursor:"pointer"}},a(u,{checked:T(O.key),onChange:G=>K(O.key,G.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 Jx({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),[_,I]=v.useState(!1),[D,W]=v.useState(!1),M=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(()=>{M()},[M]);const P=x?.skills??[],H=x?.onDisk??[],J=O=>(e.experts??[]).filter(G=>(G.skills??[]).includes(O)),U=(O,G)=>g({...k,[O]:G}),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 M(),await t()}catch(O){h(O instanceof Error?O.message:String(O))}finally{E(!1)}}},L=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 M(),await t()}catch(G){h(G instanceof Error?G.message:String(G))}finally{E(!1)}}},w=async()=>{E(!0),h(null),S(null);try{const O=await r("/skills/sync",{});S(`已重新写入 ${(O.written??[]).length} 条技能`),await M()}catch(O){h(O instanceof Error?O.message:String(O))}finally{E(!1)}},T=async O=>{if(O!=null){I(!0),h(null),S(null);try{const G=new Uint8Array(await O.arrayBuffer());let we="";const fe=32768;for(let ae=0;ae<G.length;ae+=fe)we+=String.fromCharCode.apply(null,G.subarray(ae,ae+fe));const ye=await r("/skills/upload",{fileName:O.name,dataBase64:window.btoa(we),overwrite:D}),He=ye.overwritten===!0?"已覆盖":"已上传";S(`${He}技能「${ye.skill.name}」${ye.file?`,写入 ${ye.file}`:""}`),g(null),await M(),await t()}catch(G){h(G instanceof Error?G.message:String(G))}finally{I(!1)}}},K=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(G=>a(c,{className:"ds-chip",key:G},G)),O.enabled===!1?a("span",{className:"ds-hint"}," (已停用)"):null,H.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(G=>`${G.emoji}${G.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 L(O),"data-danger":"1"},"删除")))),R=H.filter(O=>!P.some(G=>G.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:K,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:O=>O,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:O=>{const G=O.target.files===null?void 0:O.target.files[0];O.target.value="",T(G)}})),a("label",{className:"ds-hint",style:{display:"flex",alignItems:"center",gap:6,cursor:"pointer"}},a(u,{checked:D,onChange:O=>W(O.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 F()},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:O=>U("name",O.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:O=>U("description",O.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:O=>U("whenToUse",O.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:O=>U("tags",O.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=>oe({...X,steps:m.target.value})}),e("div",{
|
|
|
39
39
|
|
|
40
40
|
# 坑
|
|
41
41
|
|
|
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}=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,`最近回归 · ${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?` · 截止 ${Ha(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}=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),[_,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]),We=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((yt,ds)=>yt+(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,yt)=>et+(Number(yt[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)}},Ee=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")}},qe=fe.filter(V=>V.http&&V.result==="fail"),Va=()=>oe(F),Tn=()=>oe(qe);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__"},"全部需求"),We.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},Wl[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 Va()},_?"跑着…":`▶ 跑选中的 ${F.length} 条`),a("button",{className:"ds-btn",disabled:_||qe.length===0,title:"只补跑上次不通过、且有接口定义的用例",onClick:()=>void Tn()},`↻ 只跑上次失败的 ${qe.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 Ee()},"+ 存为套件")),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"},Wl[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}=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 Jx({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 td=800;function rf(e){const t=String(e??"").replace(/\r\n?/g,`
|
|
42
|
+
- `,onChange:O=>U("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=>U("enabled",O.target.checked)}),a("span",{},"启用(停用则不写入磁盘)")))))}function ew({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,`最近回归 · ${Ke(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?` · 截止 ${Xa(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"},`统计时间 ${Ke(l.at)},数字随看板变化实时算,不落库。`))}function tw({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),[_,I]=n.useState(!1),[D,W]=n.useState([]),[M,P]=n.useState({}),[H,J]=n.useState({}),[U,F]=n.useState(null),[L,w]=n.useState(""),[T,K]=n.useState([]),[R,O]=n.useState(null),G=n.useCallback(async()=>{try{const B=await r("/cases",{});v(Array.isArray(B.cases)?B.cases:[]),K(Array.isArray(B.regressions)?B.regressions:[]),W(Array.isArray(B.suites)?B.suites:[]),P(Object.fromEntries((B.counts??[]).map(he=>[he.id,he.count]))),J(Object.fromEntries((B.counts??[]).map(he=>[he.id,he.keys??[]]))),b(null)}catch(B){b(B instanceof Error?B.message:String(B)),v([])}},[]),we=(e.tasks??[]).reduce((B,he)=>{const je=he.caseSummary??{total:0,pass:0,fail:0};return B+je.total*7+je.pass*13+je.fail*17},0);n.useEffect(()=>{G()},[G,we]);const fe=n.useMemo(()=>{const B=k.trim().toLowerCase(),he=U===null?null:new Set(H[U]??[]);return(f??[]).filter(je=>he!==null&&!he.has(je.key)||d!=="__all__"&&je.requirementId!==d||y!=="__all__"&&je.result!==y?!1:B===""?!0:`${je.id} ${je.title} ${je.taskTitle} ${je.requirementTitle} ${je.pointId}`.toLowerCase().includes(B))},[f,k,d,y,U,H]),ye=n.useMemo(()=>{const B=fe.filter(Ue=>Ue.result==="pass").length,he=fe.filter(Ue=>Ue.result==="fail").length,je=fe.filter(Ue=>Ue.result==="skip").length;return{pass:B,fail:he,skip:je,rest:fe.length-B-he-je}},[fe]),He=e.requirements??[],ae=fe.filter(B=>B.runnable===!0),z=ae.filter(B=>C.has(B.key)),te=B=>E(he=>{const je=new Set(he);return je.has(B)?je.delete(B):je.add(B),je}),xe=()=>E(new Set(ae.map(B=>B.key))),X=()=>E(new Set),ie=async B=>{if(B.length===0){w("先勾几条带接口定义的用例再跑(手工用例没有 http,跑不了)");return}I(!0),w("");try{const je=(await r("/cases/run",{keys:B.map(st=>st.key),by:"回归"}))?.results??[],Ue=st=>je.reduce((Ct,pt)=>Ct+(Number(pt[st])||0),0),_t=je.filter(st=>st.ok===!1),Gt=[`跑了 ${je.length} 张卡 / ${Ue("total")} 条:通过 ${Ue("passed")},不通过 ${Ue("failed")}`];Ue("bugs")>0&&Gt.push(`自动开缺陷 ${Ue("bugs")} 张`),_t.length>0&&Gt.push(`${_t.length} 张卡报错:${_t[0].error??""}`),w(Gt.join(",")),E(new Set),await G()}catch(he){w(he instanceof Error?he.message:String(he))}finally{I(!1)}},ge=B=>{const he=B?.results??[],je=Gt=>he.reduce((st,Ct)=>st+(Number(Ct[Gt])||0),0),Ue=he.filter(Gt=>Gt.ok===!1),_t=[`跑了 ${he.length} 张卡 / ${je("total")} 条:通过 ${je("passed")},不通过 ${je("failed")}`];return je("bugs")>0&&_t.push(`自动开缺陷 ${je("bugs")} 张`),Ue.length>0&&_t.push(`${Ue.length} 张卡报错:${Ue[0].error??""}`),B?.truncated!==void 0&&_t.push(`套件共 ${B.truncated.total} 条,本次只跑了前 ${B.truncated.ran} 条`),_t.join(",")},V=async B=>{I(!0),w("");try{const he=await r("/suite/run",{id:B.id});w(ge(he)),await G()}catch(he){w(he instanceof Error?he.message:String(he))}finally{I(!1)}},Ee=async()=>{const B=await i("套件名字(跑的就是当前筛选里的用例)",{title:"新建回归套件",defaultValue:"默认回归"});if(!(B===null||String(B).trim()===""))try{await r("/suite/save",{suite:{name:String(B).trim().slice(0,40),rules:{requirementIds:d==="__all__"?[]:[d],httpOnly:!0},keys:[],isDefault:D.length===0},by:"人"}),s("已保存套件"),await G()}catch(he){s(he instanceof Error?he.message:String(he),"error")}},ke=async B=>{try{await r("/suite/save",{suite:{...B,isDefault:!0},by:"人"}),s(`夜间回归改跑「${B.name}」`),await G()}catch(he){s(he instanceof Error?he.message:String(he),"error")}},Ae=async B=>{if(await o(`删除套件「${B.name}」?用例本身不受影响。`,{title:"删除套件",danger:!0,okText:"删除"}))try{await r("/suite/delete",{id:B.id}),await G()}catch(he){s(he instanceof Error?he.message:String(he),"error")}},Ve=fe.filter(B=>B.runnable===!0&&B.result==="fail"),Ya=()=>ie(z),Rn=()=>ie(Ve);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 G()},"刷新")),a("div",{className:"ds-panel-body"},a("div",{className:"ds-row"},a(l,{className:"ds-input",style:{width:240},value:k,placeholder:"搜用例 / 卡片 / 需求 / 功能点",onChange:B=>g(B.target.value)}),a(c,{className:"ds-select",style:{width:220},value:d,onChange:B=>h(B.target.value)},a("option",{value:"__all__"},"全部需求"),He.map(B=>a("option",{key:B.id,value:B.id},`${B.code||B.id} ${B.title}`))),a(c,{className:"ds-select",style:{width:140},value:y,onChange:B=>S(B.target.value)},a("option",{value:"__all__"},"全部结果"),Zp.map(B=>a("option",{key:B,value:B},Ql[B])))),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:_||z.length===0,onClick:()=>void Ya()},_?"跑着…":`▶ 跑选中的 ${z.length} 条`),a("button",{className:"ds-btn",disabled:_||Ve.length===0,title:"只补跑上次不通过、且有接口定义的用例",onClick:()=>void Rn()},`↻ 只跑上次失败的 ${Ve.length} 条`),a("span",{className:"ds-hint"},"按卡串行跑,每张卡一轮;失败的照旧自动开缺陷(最多一次 60 条)")),a("div",{className:"ds-row",style:{marginTop:8,flexWrap:"wrap",gap:8}},a("span",{className:"ds-hint"},"回归套件:"),D.length===0?a("span",{className:"ds-hint"},"还没有套件。把当前筛选存成套件,夜间就自动跑它。"):D.map(B=>a("span",{key:B.id,className:"ds-suite","data-default":B.isDefault?"1":"0"},a("span",{style:{cursor:"pointer"},title:"点一下只看这个套件里的用例,再点一次取消",onClick:()=>F(he=>he===B.id?null:B.id)},`📦 ${B.name}${B.isDefault?" · 默认":""} · ${M[B.id]??0} 条${U===B.id?"(只看中)":""}`),a("button",{className:"ds-btn ds-btn-ghost",disabled:_||(M[B.id]??0)===0,onClick:()=>void V(B)},"▶ 跑"),B.isDefault?null:a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void ke(B)},"设为默认"),a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void Ae(B),"data-danger":"1"},"删除"))),a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void Ee()},"+ 存为套件")),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(B=>a("span",{key:String(B.at),className:"ds-reg-item","data-bad":(Number(B.failed)||0)+(Number(B.failedCards)||0)>0?"1":"0",title:`${new Date(B.at).toLocaleString("zh-CN")} · ${B.by||"人"}`},`${Ke(B.at)} ${B.by||""} · ${B.cards} 卡 / ${B.total} 条 · ✅${B.passed} ❌${B.failed}${B.bugs>0?` 🐞${B.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(B=>a("div",{key:B.key,className:"ds-case-lib-wrap"},a("div",{className:"ds-case-lib-row","data-result":B.result,title:"打开所属卡片",onClick:()=>t(B.taskId)},a("span",{className:"ds-case-lib-pick",onClick:he=>he.stopPropagation()},a(p,{checked:C.has(B.key),disabled:_||B.runnable!==!0,onChange:()=>te(B.key)})),a("span",{className:"ds-case-lib-result"},Ql[B.result]??B.result),a("span",{className:"ds-case-lib-title"},B.title),a("span",{className:"ds-case-lib-meta"},`${B.taskCode||B.taskId} · ${B.requirementTitle||"未挂需求"}${B.pointId?" · "+B.pointId:""}`),a("span",{className:"ds-case-lib-meta"},B.http?"接口":B.shell?"shell":B.db?"数据库":"手工"),a("span",{className:"ds-case-lib-pri"},B.priority),a("span",{className:"ds-case-lib-at"},B.lastRunAt>0?Ke(B.lastRunAt):"没跑过"),a("button",{className:"ds-btn ds-btn-ghost ds-case-lib-more",title:"看最近一次执行的明细",onClick:he=>{he.stopPropagation(),O(R===B.key?null:B.key)}},R===B.key?"收起":"明细")),R===B.key?a("div",{className:"ds-case-lib-detail"},a("div",null,`期望:${B.expected||"—"}`),a("div",null,`最近一次:${B.note||(B.lastRunAt>0?"只有结果,没有记录":"还没跑过")}`),B.lastError===""?null:a("div",{className:"ds-err"},`错误:${B.lastError}`),B.lastPreview===""?null:a("pre",{className:"ds-case-lib-preview"},B.lastPreview),a("div",{className:"ds-hint"},`用例编号 ${B.id} · 所属卡片 ${B.taskCode||B.taskId}`)):null))))))}function aw({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 nw({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 od=800;function uf(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: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,He)=>({id:`a${He+1}`,text:Le,done:!1}))},de=(U.points??[]).filter(Le=>Le.id!==z.id);await yt([...de,z])},Is=async Y=>{U!==null&&await u("删除这个功能点?挂在上面的卡会变成「未归功能点」。",{title:"删除功能点",danger:!0,okText:"删除"})&&await yt((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),[$e,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))}},[Ve,st]=o.useState(!1),[tt,Te]=o.useState(null),_t=async()=>{if(U!==null){st(!0),Te(null);try{const z=(await i("/requirement/split",{id:U.id})).created??[];Te(z.length===0?"没有可拆的功能点:要么都覆盖了,要么还没加功能点。":`已建 ${z.length} 张卡:${z.map(de=>de.code||de.id).join("、")}`),typeof a=="function"&&a()}catch(Y){Te(Y.message)}finally{st(!1)}}},Fe=()=>({kind:"prd",title:"",url:U?.links?.prd??"",version:"v1.0",content:"",status:"draft"}),xt=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,He=[...z.docs??[]].sort((_n,Do)=>(Number(Do.at)||0)-(Number(_n.at)||0)),Ke=He.find(_n=>_n.kind==="prd")??He[0]??null;if(de===null){Q(null),H("这条需求还没有基线,先挑一份文档「设为基线」");return}if(Ke===null){Q(null),H("这条需求还没有文档可以对比");return}const Ge=ew(de.content??"",Ke.content??"");Q({rows:Ge,summary:tw(Ge),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)}},Wa=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)}},Ct=async Y=>{try{await i("/requirement/doc",{id:U.id,action:"baseline",docId:Y,by:"人"}),B("这一版已生效,之后新建的卡都会记下它。")}catch(z){B(z.message)}},ca=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)}},Aa=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,He=Y.reduce((O,ue)=>{const Me=Yl(ue);return{done:O.done+Me.done,total:O.total+Me.total}},{done:0,total:0}),Ke=Y.reduce((O,ue)=>{const Me=Kl(ue);return{pass:O.pass+Me.pass,total:O.total+Me.total}},{pass:0,total:0}),Ge=Y.flatMap(O=>(O.artifacts??[]).map(ue=>({...ue,task:O}))),_n=Y.filter(O=>(O.gitlabMR?.iid??0)>0),Do=Ke.pass,nn=U.links??{},sn=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,...nn})},"编辑"),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",wt=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,wt?s("button",{className:"ds-btn ds-btn-primary",disabled:Se,onClick:()=>void nt("approve")},"评审通过"):null,wt?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),$e===null?null:s("div",{className:"ds-hint",style:{marginTop:8}},$e)))})(),cs("PRD",nn.prd)||cs("原型",nn.proto)||cs("验收标准",nn.acceptance)?s("div",{className:"ds-req-links"},cs("PRD 文档",nn.prd),cs("原型",nn.proto),cs("验收标准",nn.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,wt)=>s("div",{key:`${Me.at}-${wt}`,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(wt,ta,rt)=>{const Re=await p(ta,{title:wt,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 wt=await ue("影响面 Reach","影响多少用户或多少笔交易?估算依据写进正文",O.reach);if(wt===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:wt,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")}},wt=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 wt()},"+ 加问题")),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??[],wt=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=wt.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} · ${Ha(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:qe,onChange:O=>Va(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(wt=>wt!==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??{},wt=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,wt===null?s("div",{className:"ds-gate-sign"},s(v,{className:"ds-input",style:{flex:1,minWidth:220},placeholder:"验收结论:交付了什么、遗留什么",value:W,onChange:Rn=>Ee(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}},`✍ ${wt.by} 于 ${Qe(wt.at)} 签字:${wt.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"},sn.url?s("a",{className:"ds-link",href:sn.url,target:"_blank",rel:"noreferrer"},"打开文件夹"):null,s("button",{className:"ds-btn ds-btn-ghost",disabled:We,onClick:()=>void ge()},sn.url?"校验文件夹":"创建文件夹"),s("button",{className:"ds-btn",disabled:We||Ge.length===0,onClick:()=>void Wa()},We?"归档中…":`归档 ${Ge.length} 件交付物`))),s("div",{className:"ds-hint"},sn.url?`文件夹:${sn.name||sn.token} 已归档 ${Ge.filter(O=>O.doc?.url).length}/${Ge.length} 件交付物`:sn.error?`上次创建失败:${sn.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)},"+ 添加文档")),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 ca()},"取消基线")):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 Ct(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 xt(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 Aa()},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:Ve,onClick:()=>void _t()},Ve?"拆卡中…":"按未覆盖的功能点拆卡"),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 ka()},"保存功能点")))),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,`${He.done}/${He.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(Ge.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?` · 截止 ${Ha(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(Ge=>Ge.status==="done").length,He=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":He===100?"1":"0",style:{marginTop:2}},s("span",{style:{width:`${He}%`}})))})),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}=vt(),[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(Va=>Va.id===k)?k:ke[0]?.id??null);if(g(Ie),Ie===null){h(null);return}const qe=await r("/release/get",{id:Ie});h(qe),S({id:qe.release.id,version:qe.release.version,name:qe.release.name,project:qe.release.project,owner:qe.release.owner,status:qe.release.status,plannedAt:qe.release.plannedAt,tagName:qe.release.tagName??"",commitSha:qe.release.commitSha??""}),E(qe.release.notes??"")},[k]);n.useEffect(()=>{let W=!0;return fe().then(()=>{W&&I(null)}).catch(Ee=>{W&&I(Ee instanceof Error?Ee.message:String(Ee))}),()=>{W=!1}},[e.revision,fe]);async function ye(W){g(W),P(!0);try{const Ee=await r("/release/get",{id:W});h(Ee),S({id:Ee.release.id,version:Ee.release.version,name:Ee.release.name,project:Ee.release.project,owner:Ee.release.owner,status:Ee.release.status,plannedAt:Ee.release.plannedAt,tagName:Ee.release.tagName??"",commitSha:Ee.release.commitSha??""}),E(Ee.release.notes??""),H("")}catch(Ee){I(Ee instanceof Error?Ee.message:String(Ee))}finally{P(!1)}}function We(){g(null),h(null),S({id:"",version:"",name:"",project:"",owner:"",status:"draft",plannedAt:0,tagName:"",commitSha:""}),E(""),H("")}async function ae(W,Ee,ke){P(!0),I(null);try{const Ie=await r(W,Ee);H(ke??"已保存"),s(ke??"已保存"),s(ke??"已保存"),await fe(Ie.release?.id??k)}catch(Ie){const qe=Ie instanceof Error?Ie.message:String(Ie);I(qe),s(qe,"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:We},"+ 新建版本")),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?"新版本:先填版本号与名字,保存后可以把卡挂进来":`创建于 ${Ha(te.createdAt)}${te.releasedAt>0?` · 发布于 ${Ha(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,Ee)=>a("div",{key:`b${Ee}`,className:"ds-error"},`⛔ ${W}`)),(F?.warnings??[]).map((W,Ee)=>a("div",{key:`w${Ee}`,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} · ${Ha(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"},Ha(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}:${Ha(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:"已回滚"},Ee=[...(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 Ee.length===0?a("div",{className:"ds-empty"},"还没有部署或灰度记录。"):Ee.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"?"灰度":"部署"),`${Ha(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(Ee=>Ee.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}=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 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"},"还没写内容。"):Ee(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",We="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(We);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(We):window.localStorage.setItem(We,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=`
|
|
44
|
+
`);return a.length>0&&a[a.length-1]===""&&a.pop(),a}function sw(e,t){const a=uf(e),n=uf(t);if(a.length>od||n.length>od)return[{kind:"del",text:`(原基线 ${a.length} 行,超过 ${od} 行的对比上限)`},{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 rw(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 ow({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}=vt(),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:{}}),W(null)};o.useEffect(()=>{Number(n)>0&&E()},[n]),o.useEffect(()=>{r&&r.id&&C(r.id)},[r]);const[_,I]=o.useState(null),[D,W]=o.useState(null),[M,P]=o.useState(!1),[H,J]=o.useState(null),[U,F]=o.useState(null),[L,w]=o.useState(null),[T,K]=o.useState(null),[R,O]=o.useState(null),[G,we]=o.useState(!1),[fe,ye]=o.useState(null),[He,ae]=o.useState(!1),[z,te]=o.useState(null),[xe,X]=o.useState(null),[ie,ge]=o.useState(null),[V,Ee]=o.useState(""),[ke,Ae]=o.useState(null),[Ve,Ya]=o.useState("0"),[Rn,B]=o.useState([]),[he,je]=o.useState(null),[Ue,_t]=o.useState(null),[Gt,st]=o.useState(!1),Ct=async()=>{if(pt!==null){st(!0);try{const q=await i("/requirement/impact",{id:pt.id});_t({summary:q.summary,cards:q.cards??[],cases:q.cases??[]})}catch(q){je(q instanceof Error?q.message:String(q))}finally{st(!1)}}},pt=h.find(q=>q.id===S)??null;o.useEffect(()=>{Ya(String(pt?.order??0)),B(Array.isArray(pt?.dependsOn)?pt.dependsOn:[]),je(null)},[S,pt?.updatedAt]);const Ea=async()=>{if(pt!==null)try{await i("/requirement/save",{requirement:{id:pt.id,title:pt.title,description:pt.description??"",project:pt.project??"",iteration:pt.iteration??"",owner:pt.owner??"",priority:pt.priority??"normal",status:pt.status??"draft",links:pt.links??{},order:Number(Ve)||0,dependsOn:Rn}}),je("已保存:排序与依赖"),l("排序与依赖已保存"),a!==void 0&&a()}catch(q){je(q instanceof Error?q.message:String(q))}},hs=async q=>{if(Q===null)return;const ce=String(V??"").trim();if(q==="sign"&&ce===""){Ae("签字要写一句结论:交付了什么、遗留什么");return}try{await i("/requirement/signoff",{id:Q.id,action:q,note:ce,by:c()}),Ae(q==="sign"?"已签字":"已取消签字"),l(q==="sign"?"需求已签字":"已取消需求签字"),Ee(""),a!==void 0&&a()}catch(Le){Ae(Le.message)}},Y=o.useCallback(async q=>{if(q==null||q===""){te(null);return}try{const ce=await i("/requirement/matrix",{id:q});te(ce.matrix)}catch(ce){X(ce.message)}},[]),ne=async q=>{if(Q!==null)try{await i("/requirement/save",{requirement:{...Q,links:Q.links??{},points:q}}),await Y(Q.id),X("功能点已保存"),ge(null)}catch(ce){X(ce.message)}},ee=()=>({title:"",description:"",priority:"normal",status:"draft",acceptance:[]}),be=async()=>{if(ie===null||Q===null)return;if(String(ie.title??"").trim()===""){X("功能点要有标题");return}const q=String(ie.acceptanceText??"").split(`
|
|
45
|
+
`).map(At=>At.trim()).filter(At=>At!==""),ce={id:ie.id??`p${(Q.points??[]).length+1}`,title:ie.title,description:ie.description??"",priority:ie.priority??"normal",status:ie.status??"draft",acceptance:q.map((At,$a)=>({id:`a${$a+1}`,text:At,done:!1}))},Le=(Q.points??[]).filter(At=>At.id!==ce.id);await ne([...Le,ce])},se=async q=>{Q!==null&&await u("删除这个功能点?挂在上面的卡会变成「未归功能点」。",{title:"删除功能点",danger:!0,okText:"删除"})&&await ne((Q.points??[]).filter(ce=>ce.id!==q))},de=async(q,ce)=>{try{await i("/task/update",{id:q,pointId:ce}),Q!==null&&await Y(Q.id)}catch(Le){X(Le.message)}},Q=h.find(q=>q.id===S)??null,ve=q=>e.tasks.filter(ce=>ce.requirementId===q),Ce=q=>e.statuses.find(ce=>ce.id===q)?.label??q;o.useEffect(()=>{te(null),X(null),Q!==null&&Y(Q.id)},[Q===null?"":Q.id,Y]);const Se=async()=>{if(_!==null){if(String(_.title??"").trim()===""){W("需求标题不能为空");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),I(null),W(null),l(q.created===!0?"需求已创建":"需求已保存")}catch(q){W(q.message)}finally{P(!1)}}},Pe=async q=>{if(Q!==null)try{await i("/requirement/save",{requirement:{...Q,links:Q.links??{},status:q}}),l("需求状态已更新")}catch(ce){W(ce.message)}},dt=async q=>{if(await u("删除这条需求?它下面的卡会保留,只是不再挂需求。",{title:"删除需求",danger:!0,okText:"删除"}))try{await i("/requirement/delete",{id:q}),C(null)}catch(ce){W(ce.message)}},rt={pending:"待评审",approved:"评审通过",changes_requested:"评审打回"},[Je,We]=o.useState(!1),[tt,Ge]=o.useState(null),Te=async(q,ce)=>{if(Q!==null){We(!0),Ge(null);try{const Le=await i("/requirement/review",{id:Q.id,decision:q,note:ce??"",by:c(),operator:c()});Ge(`已${q==="approve"?"通过":q==="reject"?"打回":"提交"}评审:${rt[Le.review?.status]??""}`),typeof a=="function"&&a()}catch(Le){Ge(Le.message)}finally{We(!1)}}},It=async()=>{const q=await p("打回要给意见(会记在评审记录里):",{title:"评审打回",danger:!0,okText:"打回",placeholder:"写清楚哪里不满足,之后要据此改"});if(q!==null){if(String(q).trim()===""){Ge("打回必须写意见");return}Te("reject",String(q).trim().slice(0,600))}},[Be,yt]=o.useState(!1),[Rt,Ut]=o.useState(null),le=async()=>{if(Q!==null){yt(!0),Ut(null);try{const ce=(await i("/requirement/split",{id:Q.id})).created??[];Ut(ce.length===0?"没有可拆的功能点:要么都覆盖了,要么还没加功能点。":`已建 ${ce.length} 张卡:${ce.map(Le=>Le.code||Le.id).join("、")}`),typeof a=="function"&&a()}catch(q){Ut(q.message)}finally{yt(!1)}}},Ne=()=>({kind:"prd",title:"",url:Q?.links?.prd??"",version:"v1.0",content:"",status:"draft"}),me=async q=>{if(F(null),q===null){J(Ne());return}try{const Le=((await i("/requirement/get",{id:Q.id})).requirement?.docs??[]).find(At=>At.id===q);J(Le===void 0?Ne():{...Le})}catch(ce){W(ce.message)}},Qa=async q=>{if(L!==null&&L.id===q){w(null);return}w({id:q,content:"",busy:!0});try{const Le=((await i("/requirement/get",{id:Q.id})).requirement?.docs??[]).find(At=>At.id===q);w({id:q,content:String(Le?.content??""),busy:!1})}catch(ce){W(ce.message),w(null)}},Et=async()=>{if(T!==null){K(null);return}try{const ce=(await i("/requirement/get",{id:Q.id})).requirement??{},Le=ce.baseline??null,$a=[...ce.docs??[]].sort((Dn,Fo)=>(Number(Fo.at)||0)-(Number(Dn.at)||0)),ra=$a.find(Dn=>Dn.kind==="prd")??$a[0]??null;if(Le===null){K(null),W("这条需求还没有基线,先挑一份文档「设为基线」");return}if(ra===null){K(null),W("这条需求还没有文档可以对比");return}const Ma=sw(Le.content??"",ra.content??"");K({rows:Ma,summary:rw(Ma),version:Le.version,docTitle:ra.title})}catch(q){K(null),W(q instanceof Error?q.message:String(q))}},fa=async()=>{if(R!==null){O(null);return}try{const q=await i("/requirement/get",{id:Q.id}),ce={};for(const Le of q.requirement?.docs??[])ce[Le.id]=String(Le.content??"");O(ce)}catch(q){W(q.message)}},An=async()=>{if(H!==null){if(String(H.title??"").trim()===""){F("文档要有标题");return}we(!0);try{const q=await i("/requirement/doc",{id:Q.id,action:H.id===void 0?"add":"update",docId:H.id,doc:{kind:H.kind,title:H.title,url:H.url,version:H.version,content:H.content,status:H.status}});J(null),F(null)}catch(q){F(q.message)}finally{we(!1)}}},La=async()=>{ae(!0),ye(null);try{const q=await i("/requirement/folder",{id:Q.id});ye(q.ok?`云盘文件夹已就绪:${q.folder?.url??""}`:`创建失败:${q.error||q.folder?.error||"未知原因"}`)}catch(q){ye(q.message)}finally{ae(!1)}},Lt=async()=>{ae(!0),ye(null);try{const ce=(await i("/requirement/sync",{id:Q.id})).report??{},Le=Number(ce.failed??0);ye(`归档完成:共 ${ce.total??0} 件,成功 ${ce.written??0} 件${Le>0?`,失败 ${Le} 件(${ce.errors?.[0]??""})`:"。"}`)}catch(q){ye(q.message)}finally{ae(!1)}},Mt=async q=>{try{await i("/requirement/doc",{id:Q.id,action:"baseline",docId:q,by:"人"}),F("这一版已生效,之后新建的卡都会记下它。")}catch(ce){F(ce.message)}},jn=async()=>{try{await i("/requirement/doc",{id:Q.id,action:"clear-baseline"}),F("基线已取消,需求回到「评审中」。")}catch(q){F(q.message)}},Z=async q=>{if(await u("删除这份文档?",{title:"删除文档",danger:!0,okText:"删除"}))try{await i("/requirement/doc",{id:Q.id,action:"remove",docId:q})}catch(ce){F(ce.message)}},_e=async()=>{we(!0),F(null);try{const q=await i("/requirement/pull",{url:H?.url??""});if(q.ok===!0){const ce=String(q.text??"");J(Le=>({...Le,title:String(Le?.title??"").trim()===""?String(q.title??""):Le.title,content:ce})),F(`已拉取 ${ce.length} 字正文${q.title?`,标题取自文档「${q.title}」`:""}。`)}else F(q.error??"拉取失败")}catch(q){F(q.message)}finally{we(!1)}},xt=_===null?null:s("div",{className:"ds-panel ds-form-panel"},s("div",{className:"ds-panel-head"},_.id===void 0?"新建需求":`编辑 ${Q?.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=>I({..._,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=>I({..._,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=>I({..._,status:q.target.value})},ef.map(q=>s("option",{key:q,value:q},Ar[q])))),s("div",{className:"ds-field",style:{flex:1}},s("div",{className:"ds-label"},"业务负责人"),s(v,{className:"ds-input",value:_.owner,onChange:q=>I({..._,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=>I({..._,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=>I({..._,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=>I({..._,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=>I({..._,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=>I({..._,description:q.target.value})})),s("div",{className:"ds-row",style:{justifyContent:"flex-end",gap:8}},s("button",{className:"ds-btn",onClick:()=>{I(null),W(null)}},"取消"),s("button",{className:"ds-btn ds-btn-primary",disabled:M,onClick:()=>void Se()},M?"保存中…":"保存需求")))),ht=Q===null?s("div",{className:"ds-empty"},"左边选一条需求,或先新建一条。"):(()=>{const q=ve(Q.id),ce=q.filter(A=>A.status==="done").length,Le=q.filter(A=>A.blocked!==void 0&&A.blocked!==null).length,At=q.filter(A=>A.type==="bug"&&A.status!=="done").length,$a=q.reduce((A,ue)=>{const Fe=ed(ue);return{done:A.done+Fe.done,total:A.total+Fe.total}},{done:0,total:0}),ra=q.reduce((A,ue)=>{const Fe=Jl(ue);return{pass:A.pass+Fe.pass,total:A.total+Fe.total}},{pass:0,total:0}),Ma=q.flatMap(A=>(A.artifacts??[]).map(ue=>({...ue,task:A}))),Dn=q.filter(A=>(A.gitlabMR?.iid??0)>0),Fo=ra.pass,On=Q.links??{},dn=Q.folder??{},Ln=(A,ue)=>ue===""?null:s("a",{className:"ds-link",href:ue,target:"_blank",rel:"noreferrer"},A);return s("div",{className:"ds-req-body"},s("div",{className:"ds-req-headline"},s("div",null,s("div",{className:"ds-req-code"},Q.code||Q.id),s("div",{className:"ds-req-name"},Q.title)),s("div",{className:"ds-req-actions"},s(g,{className:"ds-select",value:Q.status,onChange:A=>void Pe(A.target.value)},ef.map(A=>s("option",{key:A,value:A},Ar[A]))),s("button",{className:"ds-btn",onClick:()=>I({...Q,...On})},"编辑"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void dt(Q.id),"data-danger":"1"},"删除"))),(()=>{const A=Q.review??null,ue=A===null?"还没提交评审":rt[A.status]??A.status,Fe=A===null||A.status==="changes_requested",wt=A!==null&&A.status==="pending";return s("div",{className:"ds-panel","data-review":A===null?"none":A.status,style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"需求评审"),s(b,{className:"ds-chip","data-on":A?.status==="approved"?"1":"0",style:{marginLeft:8}},ue),A===null||A.at===0?null:s("span",{className:"ds-hint",style:{marginLeft:"auto"}},`${Ke(A.at)}${A.by===""?"":` · ${A.by}`}`)),s("div",{className:"ds-panel-body"},A!==null&&String(A.note??"")!==""?s("div",{className:"ds-hint",style:{marginBottom:8}},`评审意见:${A.note}`):null,s("div",{className:"ds-row",style:{flexWrap:"wrap",gap:8}},Fe?s("button",{className:"ds-btn ds-btn-primary",disabled:Je,onClick:()=>void Te("submit")},Je?"提交中…":"提交评审"):null,wt?s("button",{className:"ds-btn ds-btn-primary",disabled:Je,onClick:()=>void Te("approve")},"评审通过"):null,wt?s("button",{className:"ds-btn ds-btn-ghost",disabled:Je,onClick:It,"data-danger":"1"},"打回"):null,A?.status==="approved"?s("span",{className:"ds-hint"},"评审已通过,可以拆卡和派活了。"):null),tt===null?null:s("div",{className:"ds-hint",style:{marginTop:8}},tt)))})(),Ln("PRD",On.prd)||Ln("原型",On.proto)||Ln("验收标准",On.acceptance)?s("div",{className:"ds-req-links"},Ln("PRD 文档",On.prd),Ln("原型",On.proto),Ln("验收标准",On.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 A=await p("想请产品补什么?",{title:"申请产品补 PRD",defaultValue:"需要产品输出 PRD 与原型"});if(A!==null)try{await i("/requirement/request-prd",{id:Q.id,by:c(),note:A}),l("已申请产品补 PRD"),a()}catch(ue){l(ue.message??String(ue),"error")}}},"让产品补 PRD")]),Q.description?s("div",{className:"ds-panel ds-req-desc-panel",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"需求明细"),Q.source==="business"?s("span",{className:"ds-hint","data-src":"business"},`业务提单 · ${Q.requester?.name||"未署名"}${Q.requester?.dept?"("+Q.requester.dept+")":""} · ${Ke(Q.requester?.at||Q.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(Q.description)))):s("div",{className:"ds-req-desc ds-hint"},"还没有写需求描述:产品背景、要解决的问题、验收口径都建议写在这里,点右侧「编辑」补上。"),(()=>{const A=(Q.history??[]).slice().reverse();if(A.length===0||(Q.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"}},`最近 ${A.length} 条`)),s("div",{className:"ds-panel-body"},s("div",{style:{display:"flex",flexDirection:"column",gap:6,maxHeight:260,overflowY:"auto"}},A.map((Fe,wt)=>s("div",{key:`${Fe.at}-${wt}`,style:{display:"flex",gap:8,alignItems:"baseline",fontSize:12}},s("span",{className:"ds-hint",style:{flex:"0 0 auto",fontVariantNumeric:"tabular-nums"}},Ke(Fe.at)),s("span",{style:{flex:"0 0 auto"}},Fe.by===""?"人":Fe.by),s("span",{className:"ds-chip",style:{flex:"0 0 auto"}},ue[Fe.field]??Fe.field),s("span",{className:"ds-hint",style:{minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}},`${Fe.from===""?"(空)":Fe.from} → ${Fe.to===""?"(空)":Fe.to}`))))))})(),(()=>{const A=Q.pool??{reach:0,impact:0,confidence:0,effort:0,score:0},ue=async(wt,ma,et)=>{const De=await p(ma,{title:wt,defaultValue:String(et??0)});if(De===null)return null;const Ye=Number(String(De).trim());return Number.isFinite(Ye)&&Ye>=0?Ye:null},Fe=async()=>{const wt=await ue("影响面 Reach","影响多少用户或多少笔交易?估算依据写进正文",A.reach);if(wt===null)return;const ma=await ue("影响度 Impact","3 显著 / 2 高 / 1 中 / 0.5 低",A.impact);if(ma===null)return;const et=await ue("置信度 Confidence","100 有数据 / 80 有访谈 / 50 只有猜测(百分数)",A.confidence);if(et===null)return;const De=await ue("成本 Effort","人日(研发+测试+联调)",A.effort);if(De!==null)try{await i("/requirement/pool",{id:Q.id,pool:{reach:wt,impact:ma,confidence:et,effort:De}}),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"}},A.score>0?`得分 ${A.score}`:"还没打分:不打分就没法和别的需求比优先级"),s("button",{className:"ds-btn ds-btn-ghost",style:{marginLeft:8},onClick:()=>void Fe()},A.score>0?"重新打分":"打分")),A.score>0?s("div",{className:"ds-panel-body"},s("div",{className:"ds-row",style:{flexWrap:"wrap",gap:8}},s("span",{className:"ds-chip"},`影响面 ${A.reach}`),s("span",{className:"ds-chip"},`影响度 ${A.impact}`),s("span",{className:"ds-chip"},`置信度 ${A.confidence}%`),s("span",{className:"ds-chip"},`成本 ${A.effort} 人日`),s("span",{className:"ds-chip","data-on":"1"},`得分 ${A.score}`))):null)})(),(()=>{const A=Q.questions??[],ue=A.filter(De=>De.status==="open").length,Fe=async(De,Ye)=>{try{await i("/requirement/questions",{id:Q.id,...De}),Ye&&l(Ye),await a()}catch(Mn){l(Mn instanceof Error?Mn.message:String(Mn),"error")}},wt=async()=>{const De=await p("还没确认清楚的问题是什么?",{title:"加一个待确认问题",placeholder:"例如:退款失败时是否允许人工补发?"});De===null||De.trim()===""||await Fe({action:"add",text:De},"已加入待确认清单")},ma=async De=>{const Ye=await p(De.text,{title:"回答这个问题",defaultValue:De.answer??"",placeholder:"写清结论与依据"});Ye===null||Ye.trim()===""||await Fe({action:"answer",questionId:De.id,answer:Ye},"已回答")},et=async De=>{await u("删掉这个问题?",{title:"删除待确认项",danger:!0,okText:"删除"})===!0&&await Fe({action:"delete",questionId:De.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} 个没回答,回答完才能拆卡`:A.length===0?"澄清阶段把不确定的先记在这里":"全部已回答"),s("button",{className:"ds-btn ds-btn-ghost",style:{marginLeft:8},onClick:()=>void wt()},"+ 加问题")),s("div",{className:"ds-panel-body"},A.length===0?s("div",{className:"ds-empty"},"还没有待确认的问题。产品澄清时把「需要业务拍板」的点写在这里,避免猜业务规则。"):s("div",{style:{display:"flex",flexDirection:"column",gap:8}},A.map(De=>s("div",{key:De.id,className:"ds-question-row","data-status":De.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":De.status==="answered"?"1":"0"},De.status==="answered"?"已回答":"待回答"),s("div",{style:{flex:"1 1 auto",minWidth:0}},s("div",{style:{fontSize:13}},De.text),De.answer===""||De.answer===void 0?null:s("div",{className:"ds-hint",style:{marginTop:4}},`答:${De.answer}`)),s("div",{style:{display:"flex",gap:6,flex:"0 0 auto"}},s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void ma(De)},De.status==="answered"?"改答案":"回答"),s("button",{className:"ds-btn ds-btn-ghost","data-danger":"1",onClick:()=>void et(De)},"删除")))))))})(),(()=>{const A=Q.change??null;if(A===null)return null;const ue=A.affected??[],Fe=A.affectedCases??[],wt=new Map(q.map(et=>[et.id,et])),ma=et=>e.statuses.find(De=>De.id===et)?.label??et;return s("div",{className:"ds-panel ds-change-panel","data-invalidated":A.invalidated?"1":"0",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,A.invalidated?"变更影响(签字已作废)":"变更影响"),s("span",{className:"ds-hint",style:{marginLeft:"auto"}},`${Ke(A.at)}${A.by===""?"":` · ${A.by}`}`)),s("div",{className:"ds-panel-body"},function(){const et=(Q.history??[]).slice().reverse();if(et.length===0)return null;const De={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}},`变更记录 · 最近 ${et.length} 条`),et.map((Ye,Mn)=>s("div",{key:`${Ye.at}-${Mn}`,style:{display:"flex",gap:8,alignItems:"baseline",fontSize:12}},s("span",{className:"ds-hint"},Ke(Ye.at)),s("span",null,Ye.by===""?"人":Ye.by),s("span",{className:"ds-chip"},De[Ye.field]??Ye.field),s("span",{className:"ds-hint"},`${Ye.from===""?"(空)":Ye.from} → ${Ye.to===""?"(空)":Ye.to}`))))}(),s("div",{className:"ds-hint"},`改了:${(A.parts??[]).join("、")}。${ue.length===0?"当时没有已产出的卡受影响,不用返工。":`${ue.length} 张卡已经产出过东西${Fe.length===0?"":`、${Fe.length} 条用例要重跑`},要按新版复核:`}`),ue.length===0?null:s("div",{className:"ds-row",style:{flexWrap:"wrap",gap:8,marginTop:8}},ue.map(et=>s("span",{key:et.id,className:"ds-chip","data-pt":"open",style:{cursor:"pointer"},title:et.title,onClick:()=>{const De=wt.get(et.id);De!==void 0&&typeof t=="function"&&t(De)}},`${et.code||et.id} ${ma(et.status)}`))),A.invalidated?s("div",{className:"ds-hint",style:{marginTop:8}},"验收签字已清空:这些卡是按旧版做的,复核完重新签一次。"):null))})(),(()=>{const A=Q.deploys??[];return A.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}},A.map(ue=>s("span",{key:ue.id,className:"ds-chip","data-env":ue.kind,title:`${ue.releaseName??""} · ${Ke(ue.at)} · ${ue.by}`},`${ue.name} · ${Xa(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:Ve,onChange:A=>Ya(A.target.value)}),s("span",{className:"ds-hint"},"被依赖的需求没交付,这条需求的准出会被拦")),s("div",{className:"ds-row",style:{flexWrap:"wrap",gap:10}},h.filter(A=>A.id!==Q.id).map(A=>s("label",{key:A.id,className:"ds-check-row"},s(k,{checked:Rn.includes(A.id),onChange:ue=>B(Fe=>ue.target.checked?[...Fe,A.id]:Fe.filter(wt=>wt!==A.id))}),s("span",{className:"ds-check-text"},`${A.code||A.id} ${A.title}(${Ar[A.status]??A.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 Ea()},"保存排序与依赖"),he===null?null:s("span",{className:"ds-hint"},he)))),(()=>{const A=Q.progress??null,ue=A?.gate??{ready:!1,blockers:["还没有加载出准出状态,稍后自动刷新"],warnings:[]},Fe=ue.stats??{},wt=Q.signoff??null,ma=A?.progress??(q.length===0?0:Math.round(ce/q.length*100)),et=Fe.coveredPoints??0,De=Fe.points??(Q.points??[]).length,Ye=Fe.pass??Fo,Mn=Fe.cases??ra.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":ma===100?"1":"0"},s("span",{style:{width:`${ma}%`}})),s("div",{className:"ds-hint"},`${ma}% · ${ce}/${q.length} 张卡完成 · 功能点覆盖 ${et}/${De} · 用例通过 ${Ye}/${Mn}`)),(ue.blockers??[]).map(zn=>s("div",{key:zn,className:"ds-gate-item","data-kind":"block"},`⛔ ${zn}`)),(ue.warnings??[]).map(zn=>s("div",{key:zn,className:"ds-gate-item","data-kind":"warn"},`⚠ ${zn}`)),ue.ready?s("div",{className:"ds-hint"},"门禁已通过:签完字这条需求就算交付。"):null,wt===null?s("div",{className:"ds-gate-sign"},s(v,{className:"ds-input",style:{flex:1,minWidth:220},placeholder:"验收结论:交付了什么、遗留什么",value:V,onChange:zn=>Ee(zn.target.value)}),s("button",{className:"ds-btn ds-btn-primary",onClick:()=>void hs("sign")},"需求验收签字")):s("div",{className:"ds-gate-sign"},s("div",{className:"ds-hint",style:{flex:1}},`✍ ${wt.by} 于 ${Ke(wt.at)} 签字:${wt.note}`),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void hs("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"},dn.url?s("a",{className:"ds-link",href:dn.url,target:"_blank",rel:"noreferrer"},"打开文件夹"):null,s("button",{className:"ds-btn ds-btn-ghost",disabled:He,onClick:()=>void La()},dn.url?"校验文件夹":"创建文件夹"),s("button",{className:"ds-btn",disabled:He||Ma.length===0,onClick:()=>void Lt()},He?"归档中…":`归档 ${Ma.length} 件交付物`))),s("div",{className:"ds-hint"},dn.url?`文件夹:${dn.name||dn.token} 已归档 ${Ma.filter(A=>A.doc?.url).length}/${Ma.length} 件交付物`:dn.error?`上次创建失败:${dn.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 me(null)},"+ 添加文档")),Q.baseline?s("div",{className:"ds-base-box"},s("div",{className:"ds-base-main"},s("b",null,`当前基线 ${Q.baseline.version}`),s("span",null,`${Q.baseline.title} · 生效于 ${Ke(Q.baseline.at)} · ${Q.baseline.by||"人"} · 正文 ${Q.baseline.contentLength??0} 字`)),s("button",{className:"ds-btn ds-btn-ghost",title:"把当前文档和这份基线逐行比一遍(只读)",onClick:()=>void Et()},T===null?"对比基线":"收起对比"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void jn()},"取消基线")):s("div",{className:"ds-base-box","data-empty":"1"},s("div",{className:"ds-base-main"},s("b",null,"还没有基线"),s("span",null,"PRD 评审通过后点「设为基线」,之后建的卡都会记下用的是哪一版。"))),Q.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((A,ue)=>s("div",{key:ue,className:"ds-diff-line","data-kind":A.kind},`${A.kind==="add"?"+":A.kind==="del"?"−":" "} ${A.text}`)),T.rows.length>400?s("div",{className:"ds-hint"},`(还有 ${T.rows.length-400} 行未显示)`):null)):null,(Q.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 fa()},R===null?"全部展开":"全部收起"),s("span",{className:"ds-hint"},`共 ${(Q.docs??[]).length} 篇,展开后可直接读 Markdown 正文`)),s("div",{className:"ds-doc-list"},(Q.docs??[]).map(A=>s("div",{key:A.id,className:"ds-doc-wrap"},s("div",{className:"ds-doc-row"},s(b,{className:"ds-chip","data-doc":A.kind},tf[A.kind]??A.kind),s("div",{className:"ds-doc-main"},s("div",{className:"ds-doc-title"},A.url===""?A.title:s("a",{className:"ds-link",href:A.url,target:"_blank",rel:"noreferrer"},A.title),s("span",{className:"ds-chip-code"},A.version),s(b,{className:"ds-chip","data-docstatus":A.status},cx[A.status]??A.status)),s("div",{className:"ds-doc-meta"},`正文 ${A.contentLength??0} 字 · ${A.by||"—"} · ${A.at>0?Ke(A.at):"—"}`)),s("div",{className:"ds-listrow-actions"},A.status==="baseline"?null:s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void Mt(A.id)},"设为基线"),s("button",{className:"ds-btn ds-btn-ghost",title:"直接读正文(Markdown 渲染)",onClick:()=>void Qa(A.id)},L!==null&&L.id===A.id?"收起":"阅读"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void me(A.id)},"编辑"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void Z(A.id),"data-danger":"1"},"删除"))),L!==null&&L.id===A.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[A.id]!==void 0?s("div",{className:"ds-md-preview ds-reader"},R[A.id].trim()===""?s("span",{className:"ds-hint"},"这条文档还没有正文。"):f(R[A.id])):null)))),U===null?null:s("div",{className:"ds-hint",style:{marginTop:6}},U),H===null?null:s("div",{className:"ds-panel ds-form-panel",style:{marginTop:10}},s("div",{className:"ds-panel-head"},H.id===void 0?"添加文档":`编辑 ${H.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:H.kind,onChange:A=>J({...H,kind:A.target.value})},dx.map(A=>s("option",{key:A,value:A},tf[A])))),s("div",{className:"ds-field",style:{flex:"1 1 220px"}},s("div",{className:"ds-label"},"标题"),s(v,{className:"ds-input",value:H.title,placeholder:"例如 会员积分抵扣 PRD",onChange:A=>J({...H,title:A.target.value})})),s("div",{className:"ds-field",style:{flex:"0 0 110px"}},s("div",{className:"ds-label"},"版本"),s(v,{className:"ds-input",value:H.version,placeholder:"v1.0",onChange:A=>J({...H,version:A.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:H.url,placeholder:"https://<租户>.feishu.cn/wiki/…",onChange:A=>J({...H,url:A.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:G,onClick:()=>void _e()},G?"拉取中…":"从链接拉正文"))),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"文档正文(拉不到就自己粘,研发和测试都读这一份)"),s(d,{className:"ds-textarea",rows:8,value:H.content,onChange:A=>J({...H,content:A.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:G,onClick:()=>void An()},"保存文档")))),s("div",{className:"ds-pane-head",style:{marginTop:16}},s("div",{className:"ds-pane-title"},"需求变更影响面"),s("div",{className:"ds-pane-desc"},"需求一改,下面这些卡和用例就要重看。点一下现算,不改任何数据。")),s("div",{className:"ds-row",style:{gap:8,alignItems:"center",marginBottom:6}},s("button",{className:"ds-btn",disabled:Gt||pt===null,onClick:()=>void Ct()},Gt?"计算中…":"算一下影响面"),Ue===null?s("span",{className:"ds-hint"},"还没算过"):s("span",{className:"ds-hint"},`卡 ${Ue.summary.cards} · 用例 ${Ue.summary.cases}(能自动跑 ${Ue.summary.runnable})· 失败 ${Ue.summary.failing}`)),Ue===null||Ue.cards.length===0?null:s("div",{className:"ds-sec-body",style:{maxHeight:160,overflow:"auto"}},Ue.cards.slice(0,12).map(A=>s("div",{key:A.id,className:"ds-art-row"},s("span",{className:"ds-art-title"},(A.code===""?"":A.code+" ")+A.title),s("span",{className:"ds-hint"},A.status))),Ue.cards.length>12?s("div",{className:"ds-hint"},`还有 ${Ue.cards.length-12} 张`):null),s("div",{className:"ds-pane-head",style:{marginTop:16}},s("div",{className:"ds-pane-title"},"功能点与可追溯矩阵"),s("div",{className:"ds-pane-desc"},"功能点是需求的骨架:一条功能点对若干张卡、若干条用例。卡和用例上都挂 pointId,这里就能看出哪条没人做、哪条没被验证。")),z===null?s("div",{className:"ds-hint",style:{padding:"6px 0"}},"还没有功能点。点「+ 加功能点」把需求拆成可交付、可验证的条目。"):s("div",{className:"ds-matrix"},s("div",{className:"ds-matrix-sum"},`功能点 ${z.summary.points} · 已覆盖 ${z.summary.coveredPoints}${z.summary.pointsWithoutCases>0?`(${z.summary.pointsWithoutCases} 条还没有用例,覆盖率 ${z.summary.coverageRate}%)`:""} · 卡 ${z.summary.cards}(未归点 ${z.summary.looseCards})· 用例 ${z.summary.cases}(通过 ${z.summary.pass}${z.summary.fail>0?`,失败 ${z.summary.fail}`:""})· 通过率 ${z.summary.passRate}%`),(z.points??[]).map(A=>s("div",{key:A.id,className:"ds-pt-row","data-covered":A.covered?"1":"0"},s("div",{className:"ds-pt-main"},s("div",{className:"ds-pt-title"},s("span",{className:"ds-chip-code"},A.id),s("b",null,A.title),s(b,{className:"ds-chip","data-pt":A.covered?"covered":"open"},A.covered?"已覆盖":"未覆盖")),String(A.description??"")===""?null:s("div",{className:"ds-req-desc ds-md"},f(A.description)),s("div",{className:"ds-pt-meta"},`卡 ${A.cards.length}${A.cards.length===0?"(还没人做)":":"+A.cards.map(ue=>ue.code||ue.id).join("、")}`,` · 用例 ${A.cases.total}(通过 ${A.cases.pass}${A.cases.fail>0?`,失败 ${A.cases.fail}`:""}${A.cases.pending>0?`,没跑 ${A.cases.pending}`:""})`,A.acceptance.length===0?"":` · 验收条件 ${A.acceptance.filter(ue=>ue.covered).length}/${A.acceptance.length}`)),s("div",{className:"ds-listrow-actions"},s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>ge({...A,acceptanceText:(A.acceptance??[]).map(ue=>ue.text).join(`
|
|
46
|
+
`)})},"编辑"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void se(A.id),"data-danger":"1"},"删除")))),(z.loose??[]).length===0?null:s("div",{className:"ds-pt-loose"},s("div",{className:"ds-hint",style:{marginBottom:6}},`还有 ${z.loose.length} 张卡没归到功能点,选一个挂上去,矩阵才算完整:`),z.loose.map(A=>s("div",{key:A.id,className:"ds-pt-loose-row"},s("span",{className:"ds-chip-code"},A.code||A.id),s("span",{className:"ds-pt-loose-title"},A.title),s(g,{className:"ds-select",style:{width:220},value:"",onChange:ue=>{ue.target.value!==""&&de(A.id,ue.target.value)}},s("option",{value:""},"挂到…"),(z.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:()=>ge(ee())},"+ 加功能点"),s("button",{className:"ds-btn ds-btn-primary",disabled:Be,onClick:()=>void le()},Be?"拆卡中…":"按未覆盖的功能点拆卡"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>{Q!==null&&Y(Q.id)}},"刷新矩阵"),Rt===null?null:s("span",{className:"ds-hint"},Rt),xe===null?null:s("span",{className:"ds-hint"},xe)),ie===null?null:s("div",{className:"ds-panel ds-form-panel",style:{marginTop:10}},s("div",{className:"ds-panel-head"},ie.id===void 0?"新增功能点":`编辑功能点 ${ie.id}`),s("div",{className:"ds-panel-body"},s("div",{className:"ds-field"},s("div",{className:"ds-label"},"功能点标题"),s(v,{className:"ds-input",value:ie.title,placeholder:"例如 结算页展示可用积分",onChange:A=>ge({...ie,title:A.target.value})})),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"说明"),s(d,{className:"ds-textarea",rows:3,value:ie.description??"",onChange:A=>ge({...ie,description:A.target.value})})),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"验收条件(一行一条,做成什么样算完成)"),s(x,{className:"ds-textarea",rows:4,value:ie.acceptanceText??"",onChange:A=>ge({...ie,acceptanceText:A.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:ie.priority,onChange:A=>ge({...ie,priority:A.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:ie.status,onChange:A=>ge({...ie,status:A.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:()=>ge(null)},"取消"),s("button",{className:"ds-btn ds-btn-primary",onClick:()=>void be()},"保存功能点")))),s("div",{className:"ds-req-stats"},s("div",{className:"ds-stat-box"},s("b",null,`${ce}/${q.length}`),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","data-warn":At>0?"1":"0"},s("b",null,String(At)),s("span",null,"未结缺陷")),s("div",{className:"ds-stat-box"},s("b",null,`${$a.done}/${$a.total}`),s("span",null,"验收清单")),s("div",{className:"ds-stat-box"},s("b",null,`${ra.pass}/${ra.total}`),s("span",null,"用例通过")),s("div",{className:"ds-stat-box"},s("b",null,String(Ma.length)),s("span",null,"交付物")),s("div",{className:"ds-stat-box"},s("b",null,String(Dn.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(A=>s("div",{key:A.id,className:"ds-listrow ds-req-task",onClick:()=>t(A.id)},s("div",{className:"ds-listrow-main"},s("div",{className:"ds-req-task-title"},A.code?s(b,{className:"ds-chip ds-chip-code"},A.code):null,s("span",null,A.title)),s("div",{className:"ds-hint"},`${Ce(A.status)}${(()=>{const ue=A.expert===""?"":(e.config.experts??[]).find(Fe=>Fe.id===A.expert)?.name??A.expert;return ue===""?"":` · ${ue}`})()}${A.dueAt>0?` · 截止 ${Xa(A.dueAt)}`:""}`)),s("div",{className:"ds-listrow-actions"},A.blocked!==void 0&&A.blocked!==null?s(b,{className:"ds-chip ds-chip-blocked"},"⛔"):null,A.type==="bug"?s(b,{className:"ds-chip ds-chip-bug","data-sev":A.severity??"p2"},"BUG"):null)))),Dn.length>0?s("div",null,s("div",{className:"ds-sec-head",style:{marginTop:14}},"关联 MR"),Dn.map(A=>s("div",{key:A.id,className:"ds-hint"},`${A.code||A.id} · !${A.gitlabMR.iid} ${A.gitlabMR.title??""}(${A.gitlabMR.state||"open"})`))):null)})();return s("div",{className:"ds-body"},D!==null?s("div",{className:"ds-err",style:{marginBottom:10}},D):null,xt,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,ce)=>(ce.pool?.score??0)-(q.pool?.score??0)):h).map(q=>{const ce=window.localStorage.getItem("dsh-studio:reqsrc")??"all";if(ce!=="all"&&(q.source==="business"?"business":"internal")!==ce)return null;const Le=ve(q.id),At=Le.filter(Ma=>Ma.status==="done").length,$a=q.progress?.progress??(Le.length===0?0:Math.round(At/Le.length*100)),ra=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},Ar[q.status]??q.status),s("span",{className:"ds-hint"},`${At}/${Le.length} 卡`),ra===null?null:s("span",{className:"ds-hint",style:{color:ra.ready?"#0f9d58":"#b26a00"}},ra.ready?"准出通过":`还差 ${ra.blockers.length} 项`)),s("div",{className:"ds-check-bar","data-full":$a===100?"1":"0",style:{marginTop:2}},s("span",{style:{width:`${$a}%`}})))})),s("div",{className:"ds-req-detail"},ht)))}function iw({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(""),[_,I]=n.useState(null),[D,W]=n.useState(""),[M,P]=n.useState(!1),[H,J]=n.useState(""),[U,F]=n.useState(""),[L,w]=n.useState(""),[T,K]=n.useState("10"),[R,O]=n.useState(""),[G,we]=n.useState(""),fe=n.useCallback(async V=>{const ke=(await r("/releases")).releases??[];b(ke);const Ae=V??(ke.some(Ya=>Ya.id===k)?k:ke[0]?.id??null);if(g(Ae),Ae===null){h(null);return}const Ve=await r("/release/get",{id:Ae});h(Ve),S({id:Ve.release.id,version:Ve.release.version,name:Ve.release.name,project:Ve.release.project,owner:Ve.release.owner,status:Ve.release.status,plannedAt:Ve.release.plannedAt,tagName:Ve.release.tagName??"",commitSha:Ve.release.commitSha??""}),E(Ve.release.notes??"")},[k]);n.useEffect(()=>{let V=!0;return fe().then(()=>{V&&I(null)}).catch(Ee=>{V&&I(Ee instanceof Error?Ee.message:String(Ee))}),()=>{V=!1}},[e.revision,fe]);async function ye(V){g(V),P(!0);try{const Ee=await r("/release/get",{id:V});h(Ee),S({id:Ee.release.id,version:Ee.release.version,name:Ee.release.name,project:Ee.release.project,owner:Ee.release.owner,status:Ee.release.status,plannedAt:Ee.release.plannedAt,tagName:Ee.release.tagName??"",commitSha:Ee.release.commitSha??""}),E(Ee.release.notes??""),W("")}catch(Ee){I(Ee instanceof Error?Ee.message:String(Ee))}finally{P(!1)}}function He(){g(null),h(null),S({id:"",version:"",name:"",project:"",owner:"",status:"draft",plannedAt:0,tagName:"",commitSha:""}),E(""),W("")}async function ae(V,Ee,ke){P(!0),I(null);try{const Ae=await r(V,Ee);W(ke??"已保存"),s(ke??"已保存"),s(ke??"已保存"),await fe(Ae.release?.id??k)}catch(Ae){const Ve=Ae instanceof Error?Ae.message:String(Ae);I(Ve),s(Ve,"error")}finally{P(!1)}}if(_!==null&&x.length===0)return a("div",{className:"ds-body"},a("div",{className:"ds-err"},_));const z=d?.gate,te=d?.release,xe=d?.tasks??[],X=e.tasks.filter(V=>V.releaseId===""||V.releaseId===void 0),ie=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(V=>a("div",{key:V.id,className:"ds-req-item","data-on":k===V.id?"1":"0",onClick:()=>void ye(V.id)},a("div",{className:"ds-req-item-title"},`${V.version||V.id} ${V.name}`.trim()),a("div",{className:"ds-req-item-meta"},a(u,{className:"ds-chip","data-kind":V.status},af[V.status]??V.status),a(u,{className:"ds-chip"},`${V.gate.stats.done}/${V.gate.stats.tasks} 卡`),V.gate.blockers.length===0?a(u,{className:"ds-chip",style:{color:"#0f9d58",borderColor:"#0f9d5855"}},"门禁通过"):a(u,{className:"ds-chip ds-chip-blocked"},`${V.gate.blockers.length} 项拦着`))))),ge=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(V=>a("span",{key:V.id,className:"ds-chip",title:V.title},`${V.code||V.id} ${V.title}(${Ar[V.derived]??V.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?"新版本:先填版本号与名字,保存后可以把卡挂进来":`创建于 ${Xa(te.createdAt)}${te.releasedAt>0?` · 发布于 ${Xa(te.releasedAt)}`:""}${te.approveBy!==""?` · 审批人 ${te.approveBy}`:""}`)),a("div",{className:"ds-req-actions"},a(f,{className:"ds-select",style:{width:108},value:y.status,onChange:V=>S({...y,status:V.target.value})},ux.map(V=>a("option",{key:V,value:V},af[V]))))),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:V=>S({...y,version:V.target.value})})),a("label",{className:"ds-field"},a("span",{},"版本名"),a(c,{className:"ds-input",value:y.name,placeholder:"积分抵扣首个版本",onChange:V=>S({...y,name:V.target.value})})),a("label",{className:"ds-field"},a("span",{},"业务项目"),a(f,{className:"ds-select",value:y.project,onChange:V=>S({...y,project:V.target.value})},a("option",{value:""},"不属于任何项目"),(e.config.projects??[]).map(V=>a("option",{key:V.id,value:V.id},V.name)))),a("label",{className:"ds-field"},a("span",{},"发布负责人"),a(c,{className:"ds-input",value:y.owner,onChange:V=>S({...y,owner:V.target.value})})),a("label",{className:"ds-field"},a("span",{},"计划发布时间"),a(c,{className:"ds-input",type:"date",value:nf(y.plannedAt),onChange:V=>S({...y,plannedAt:jr(V.target.value)})})),a("label",{className:"ds-field"},a("span",{},"发布标签(tag)"),a(c,{className:"ds-input",value:y.tagName??"",placeholder:"v1.0.0",onChange:V=>S({...y,tagName:V.target.value})})),a("label",{className:"ds-field"},a("span",{},"对应提交(sha,选填)"),a(c,{className:"ds-input",value:y.commitSha??"",placeholder:"a1b2c3d",onChange:V=>S({...y,commitSha:V.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(z?.stats.done??0)),a("span",{},"已完成卡")),a("div",{className:"ds-stat-box"},a("b",{"data-warn":(z?.stats.open??0)>0?"1":"0"},String(z?.stats.open??0)),a("span",{},"未完成")),a("div",{className:"ds-stat-box"},a("b",{"data-warn":(z?.stats.blocked??0)>0?"1":"0"},String(z?.stats.blocked??0)),a("span",{},"阻塞")),a("div",{className:"ds-stat-box"},a("b",{"data-warn":(z?.stats.bugs??0)>0?"1":"0"},String(z?.stats.bugs??0)),a("span",{},"未结缺陷")),a("div",{className:"ds-stat-box"},a("b",{"data-warn":(z?.stats.failing??0)>0?"1":"0"},String(z?.stats.failing??0)),a("span",{},"失败用例")),a("div",{className:"ds-stat-box"},a("b",{},String(z?.stats.artifacts??0)),a("span",{},"交付物"))),(z?.blockers??[]).map((V,Ee)=>a("div",{key:`b${Ee}`,className:"ds-error"},`⛔ ${V}`)),(z?.warnings??[]).map((V,Ee)=>a("div",{key:`w${Ee}`,className:"ds-hint"},`⚠ ${V}`)),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||!z?.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||!z?.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||!z?.ready||te.status==="released","data-force":"1",onClick:async()=>{const V=await i("强制发布的原因(会记进部署日志,便于复盘):",{title:"强制发布",okText:"强制发布",placeholder:"为什么不等预发部署 / 需求签字?"});if(V!==null){if(String(V).trim()===""){W("强制发布必须写原因");return}ae("/release/publish",{id:y.id,by:"人",force:!0,forceNote:String(V).trim()},"已强制发布(原因已记入部署日志)")}}},"强制发布")),te.status==="released"?a("button",{className:"ds-btn ds-btn-ghost",disabled:M,onClick:async()=>{const V=await i("回滚原因(要进复盘记录):",{title:"回滚这个版本",danger:!0,okText:"回滚"});V!==null&&V.trim()!==""&&ae("/release/rollback",{id:y.id,reason:V},"已回滚")}},"回滚"):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(V=>V.done).length}/${(te.smoke??[]).length} 项已过 · 发布前逐条点过,门禁才算过`)),a("div",{className:"ds-panel-body"},(te.smoke??[]).length===0?a("div",{className:"ds-empty"},"还没有冒烟项:把发布前必验的几条写在这里,比如「能登录」「下单支付成功」「首页不报错」。"):null,(te.smoke??[]).map(V=>a("div",{key:V.id,className:"ds-listrow"},a("label",{className:"ds-row",style:{gap:8,alignItems:"center",flex:1,cursor:"pointer"}},a(p,{checked:V.done===!0,onChange:()=>void ae("/release/smoke",{id:y.id,action:"toggle",itemId:V.id,done:V.done!==!0,by:"人"},V.done?"已取消":"冒烟项已过")}),a("span",{className:V.done?"ds-smoke-done":""},V.text)),V.done&&V.by!==""?a("span",{className:"ds-hint"},`${V.by} · ${Xa(V.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:V.id},"已删除")},"×")))),a("div",{className:"ds-row",style:{gap:8,marginTop:8}},a(c,{className:"ds-input",style:{flex:1},value:U,placeholder:"发布前必须验证什么?",onChange:V=>F(V.target.value)}),a("button",{className:"ds-btn",disabled:M||U.trim()==="",onClick:()=>{const V=U.trim();V!==""&&(F(""),ae("/release/smoke",{id:y.id,action:"add",text:V},"已加冒烟项"))}},"+ 加一条")))),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(V=>a("div",{key:V.id,className:"ds-listrow"},a("div",{className:"ds-listrow-main"},a("div",null,`${V.by} 审批通过`),a("div",{className:"ds-hint"},V.note||"(没写结论)")),a("span",{className:"ds-hint"},Xa(V.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(V=>a("div",{key:V.id,className:"ds-listrow"},a("div",{className:"ds-listrow-main"},a("div",null,`${V.name} · ${V.percent}%`),a("div",{className:"ds-hint"},`${{pending:"待开始",running:"灰度中",passed:"已通过",rolled_back:"已回滚"}[V.status]??V.status}${V.note===""?"":` · ${V.note}`}`)),a("div",{className:"ds-listrow-actions"},V.status==="pending"?a("button",{className:"ds-btn ds-btn-ghost",disabled:M,onClick:()=>void ae("/release/gray",{id:y.id,action:"start",batchId:V.id,by:"人"},"已开始灰度")},"开始"):null,V.status==="running"?a("button",{className:"ds-btn ds-btn-ghost",disabled:M,onClick:()=>void ae("/release/gray",{id:y.id,action:"advance",batchId:V.id,by:"人"},"这一批已通过")},"通过"):null,V.status==="passed"?a(u,{className:"ds-chip","data-on":"1"},"已通过"):null,V.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:V=>w(V.target.value)}),a(c,{className:"ds-input",style:{flex:"0 0 88px"},type:"number",min:1,max:100,value:T,onChange:V=>K(V.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(""),K("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(V=>a("span",{key:V.id,className:"ds-chip","data-env":V.kind,"data-on":V.at===0?"0":"1",title:V.at===0?`还没登记部署到「${V.name}」`:`${V.name}:${Xa(V.at)} ${V.action} · ${V.by}`},V.at===0?`${V.name} —`:`${V.name} ✓`))),a("div",{className:"ds-row",style:{gap:8,marginTop:8}},a(f,{className:"ds-input",style:{flex:"0 0 148px"},value:R,onChange:V=>O(V.target.value)},a("option",{value:""},"选环境…"),(e.config?.environments??[]).map(V=>a("option",{key:V.id,value:V.id},V.name))),a(c,{className:"ds-input",style:{flex:1},value:G,placeholder:"备注:谁发的、发了什么(可留空)",onChange:V=>we(V.target.value)}),a("button",{className:"ds-btn",disabled:M||R==="",onClick:async()=>{await ae("/release/deploy",{id:y.id,env:R,note:G,by:"人"},"已登记部署(没有触发任何部署)"),we("")}},"登记部署")),a("div",{className:"ds-hint",style:{marginTop:10}},"部署与灰度记录(最近 8 条)"),(()=>{const V={pending:"待开始",running:"灰度中",passed:"已通过",rolled_back:"已回滚"},Ee=[...(te.deployLog??[]).map(ke=>({at:ke.at,kind:"deploy",by:ke.by,text:`${ke.action}${ke.env===""?"":` · ${(e.config?.environments??[]).find(Ae=>Ae.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:V[ke.status]??ke.status}))].filter(ke=>ke.at).sort((ke,Ae)=>ke.at-Ae.at).slice(-8).reverse();return Ee.length===0?a("div",{className:"ds-empty"},"还没有部署或灰度记录。"):Ee.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"?"灰度":"部署"),`${Xa(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(V=>a("div",{key:V.id,className:"ds-listrow"},a("div",{className:"ds-listrow-main"},a("div",null,`${V.code?`${V.code} `:""}${V.title}`),a("div",{className:"ds-hint"},`${(e.statuses??[]).find(Ee=>Ee.id===V.status)?.label??V.status}${V.blocked!==null&&V.blocked!==void 0?" · 阻塞":""}${V.type==="bug"?" · 缺陷":""}`)),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>t(V.id)},"打开"),a("button",{className:"ds-btn ds-btn-ghost",disabled:M,onClick:()=>void ae("/release/link",{id:y.id,taskId:V.id,action:"remove"},"已从版本移除")},"移除")))),a("div",{className:"ds-row",style:{marginTop:8}},a(f,{className:"ds-select",style:{flex:1},value:H,onChange:V=>J(V.target.value)},a("option",{value:""},`挑一张卡挂进来(${X.length} 张可选)`),X.map(V=>a("option",{key:V.id,value:V.id},`${V.code?`${V.code} `:""}${V.title}`))),a("button",{className:"ds-btn",disabled:M||H==="",onClick:async()=>{await ae("/release/link",{id:y.id,taskId:H,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(()=>W("发布说明已复制"),()=>{})},"复制")),a("div",{className:"ds-panel-body"},a(v,{className:"ds-input",rows:12,value:C,placeholder:"点「生成发布说明」按类型自动汇总;之后可以在这里手动补充",onChange:V=>E(V.target.value),onBlur:()=>{C!==(te.notes??"")&&ae("/release/save",{release:{...y,notes:C}},"发布说明已保存")}}))),_===null?null:a("div",{className:"ds-error",style:{marginTop:8}},_),D===""?null:a("div",{className:"ds-hint",style:{marginTop:8}},D));return a("div",{className:"ds-body"},a("div",{className:"ds-req-grid"},ie,ge))}function lw({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 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 K=l===""?"":`&project=${encodeURIComponent(l)}`;return Promise.all([r("/workload"),r(`/burndown?days=14${K}`),r("/costs"),r("/quality")]).then(([R,O,G,we])=>{w&&(b(R.workload??null),g(O.burndown??null),h({...G.costs??{},budget:G.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,K,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"},K)),I=(u.cycle.buckets??[]).reduce((w,T)=>w+T.count,0),D=Math.max(1,...(u.throughput??[]).map(w=>w.count),...(u.cycle.buckets??[]).map(w=>w.count)),W=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),H=(x?.experts??[]).filter(w=>w.enabled),J=H.reduce((w,T)=>w+T.open,0),U=H.reduce((w,T)=>w+(T.overdue??0),0),F=k?.series??[],L=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"}},`${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/D*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(K=>K.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/W*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"},`${H.length} 位在岗,手上合计 ${J} 张${U>0?`,其中 ${U} 张逾期`:",没有逾期的"}`))),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(nw,{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(aw,{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 dw(e,t){const a="studio",n="/studio-api";let r=null;function s(Y){r=Y??null}function o(Y){return r===null?null:r[Y]??null}function i(Y,ne){if(ne==null)return ne;const ee=ne.props??{},be=ee.title!==void 0?ne:t(ne.type,{...ee,title:Y}),se=o("Tip");return se===null?be:t(se,{key:ne.key,label:Y},be)}const{TextField:l,TextAreaField:c,ChipField:u,CheckField:p,SelectField:f}=px({h:t,kit:o,React:e}),v=fx({h:t,kit:o}),x=Lx({h:t,React:e}),b=mx({h:t,ChipField:u}),k=gx({h:t,React:e,Card:b,TextField:l,SelectField:f,CheckField:p,toast:H});function g({rows:Y=6,value:ne,onChange:ee,placeholder:be,className:se,...de}){const[Q,ve]=e.useState(!1),Ce=String(ne??"");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(!Q)},Q?"回到编辑":"预览渲染")),Q?t("div",{className:"ds-md-preview ds-req-desc ds-md"},Ce.trim()===""?t("span",{className:"ds-hint"},"还没写内容。"):Ee(Ce)):t(c,{className:se??"ds-textarea",rows:Y,value:ne,onChange:ee,placeholder:be,...de}))}function d(Y,ne){const ee=t("div",{className:"ds-label",style:{cursor:"help"}},Y);return ne==null||ne===""?ee:i(ne,ee)}let h=null,y=null;function S(Y){h=Y,typeof y=="function"&&y(Y)}function C(Y,ne){const ee=ne??{};return o("DialogBox")===null?Promise.resolve(window.confirm(String(Y))):new Promise(se=>{S({kind:"confirm",title:ee.title??"确认操作",message:String(Y??""),danger:ee.danger===!0,okText:ee.okText??"确定",cancelText:ee.cancelText??"取消",resolve:se})})}function E(Y,ne){const ee=ne??{};return o("DialogBox")===null?Promise.resolve(window.prompt(String(Y),ee.defaultValue??"")):new Promise(se=>{S({kind:"prompt",title:ee.title??"需要填写",message:String(Y??""),value:String(ee.defaultValue??""),placeholder:ee.placeholder??"",okText:ee.okText??"确定",cancelText:"取消",resolve:se})})}function _(){const[Y,ne]=e.useState(null),[ee,be]=e.useState("");e.useEffect(()=>{const Q=ve=>{ne(ve),be(ve!==null&&ve.kind==="prompt"?ve.value:"")};return y=Q,h!==null&&Q(h),()=>{y===Q&&(y=null)}},[]);const se=o("DialogBox");if(Y===null||se===null)return null;const de=Q=>{const ve=Y.resolve;ne(null),h=null,ve(Q)};return t(se,{open:!0,title:Y.title,message:Y.message,danger:Y.danger===!0,okText:Y.okText,cancelText:Y.cancelText,input:Y.kind==="prompt",value:ee,placeholder:Y.placeholder,onChange:Q=>be(Q),onOk:()=>de(Y.kind==="prompt"?ee.trim():!0),onCancel:()=>de(Y.kind==="prompt"?null:!1)})}let I=0,D=[],W=[],M={text:"",at:0};function P(){const Y=D.slice();for(const ne of W.slice())ne(Y)}function H(Y,ne="success",ee=3200){const be=String(Y??"").trim();if(be==="")return null;const se=Date.now();if(M.text===be&&se-M.at<600)return null;M={text:be,at:se};const de=++I;return D=D.concat([{id:de,text:be,tone:ne}]),P(),window.setTimeout(()=>{J(de)},ee),de}function J(Y){const ne=D.filter(ee=>ee.id!==Y);ne.length!==D.length&&(D=ne,P())}const U={success:"✓",error:"!",info:"i"};function F(){const[Y,ne]=e.useState(()=>D.slice());return e.useEffect(()=>(W.push(ne),()=>{W=W.filter(ee=>ee!==ne)}),[]),Y.length===0?null:t("div",{className:"ds-toasts",role:"status","aria-live":"polite"},Y.map(ee=>t("div",{key:ee.id,className:"ds-toast","data-tone":ee.tone},t("span",{className:"ds-toast-icon","aria-hidden":"true"},U[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 Y=window.localStorage.getItem(L);if(typeof Y=="string"&&Y.trim()!=="")return Y.trim().slice(0,40)}catch{}return"人"}function T(Y){const ne=String(Y??"").trim().slice(0,40)||"人";try{window.localStorage.setItem(L,ne)}catch{}return ne}const K="dsh-studio:theme",R=[["light","☀ 明亮"],["dark","☾ 黑暗"],["system","跟随系统"]];function O(){return typeof window.matchMedia=="function"?window.matchMedia("(prefers-color-scheme: dark)"):null}function G(){try{const Y=window.getComputedStyle(document.body).backgroundColor,ne=/rgba?\(([^)]+)\)/.exec(String(Y??""));if(ne===null)return null;const ee=ne[1].split(",").map(ve=>Number(ve.trim())),[be,se,de,Q]=ee;return![be,se,de].every(ve=>Number.isFinite(ve))||Number.isFinite(Q)&&Q<.2?null:.2126*be+.7152*se+.0722*de<128?"dark":"light"}catch{return null}}function we(){try{const Y=window.localStorage.getItem(K);if(Y==="light"||Y==="dark"||Y==="system")return Y}catch{}return"system"}function fe(Y){const ne=Y==="light"||Y==="dark"?Y:"system";try{window.localStorage.setItem(K,ne)}catch{}return ne}const ye="dsh-studio:session",He="dsh-studio:auth-user";function ae(){try{const Y=window.localStorage.getItem(ye);if(typeof Y=="string"&&Y.trim()!=="")return Y.trim()}catch{}return""}function z(Y){try{Y===""||Y===null||Y===void 0?window.localStorage.removeItem(ye):window.localStorage.setItem(ye,String(Y))}catch{}}function te(){try{const Y=window.localStorage.getItem(He);if(typeof Y=="string"&&Y!==""){const ne=JSON.parse(Y);if(ne!==null&&typeof ne=="object")return ne}}catch{}return null}function xe(Y){try{Y==null?window.localStorage.removeItem(He):window.localStorage.setItem(He,JSON.stringify(Y))}catch{}return Y??null}async function X(Y,ne){const ee={"x-studio-user":encodeURIComponent(w())},be=ae();be!==""&&(ee["x-studio-session"]=be),ne!==void 0&&(ee["content-type"]="application/json");const se=ne===void 0?{method:"GET",headers:ee}:{method:"POST",headers:ee,body:JSON.stringify(ne)},de=await fetch(n+Y,se);let Q={};try{Q=await de.json()}catch{}if(!de.ok||Q.ok===!1)throw new Error(Q.error??`请求失败(HTTP ${de.status})`);return Q}const ie=`
|
|
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
|
+
`,ge=`
|
|
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 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 Ee=Xy(t),ke=px({h:t,TextField:l}),Ie=gx({h:t,React:e,api:X,kit:o,currentUser:w,renderMarkdown:Ee,tipOf:i,tipLabel:d,confirmDialog:C,promptDialog:E,TextField:l,TextAreaField:c,ChipField:u,CheckField:p,SelectField:f,MdField:g,MentionPicker:ke}),qe=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:Ee,SideDrawer:v,MentionPicker:ke,Card:b,TextField:l,TextAreaField:c,ChipField:u,CheckField:p,SelectField:f,MdField:g});function Va({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),[$e,at]=e.useState({name:"",spec:"",description:""}),[nt,ct]=e.useState(!1),[Ve,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 Te=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)}},xt=async()=>{if(!($e.name.trim()===""||$e.spec.trim()==="")){st(!0),ve(null);try{const ie=[...Z.config.market.items??[],{id:`m-${Math.random().toString(16).slice(2,10)}`,name:$e.name.trim(),spec:$e.spec.trim(),description:$e.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=Te.has(Ce)||Te.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:$e.name,placeholder:"代码评审助手",onChange:ie=>at({...$e,name:ie.target.value})})),t("div",{className:"ds-field"},t("div",{className:"ds-label"},"包名或路径"),t(l,{className:"ds-input",value:$e.spec,placeholder:"@company/dsh-reviewer 或 link:~/pkgs/reviewer",onChange:ie=>at({...$e,spec:ie.target.value})})),t("div",{className:"ds-field"},t("div",{className:"ds-label"},"一句话说明"),t(l,{className:"ds-input",value:$e.description,placeholder:"自动跑 GitLab MR 的评审清单",onChange:ie=>at({...$e,description:ie.target.value})}))),t("div",{style:{padding:"0 14px 14px"}},t("button",{className:"ds-btn ds-btn-primary",disabled:Ve||$e.name.trim()===""||$e.spec.trim()==="",onClick:()=>void xt()},Ve?"添加中…":"加入市场"))):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,$e]=e.useState(null),[at,nt]=e.useState(!1),ct=async()=>{nt(!0),$e(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){$e(ie instanceof Error?ie.message:String(ie))}finally{nt(!1)}},Ve=(ie,Ce,ge,Wa)=>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:Ct=>ce({...le,[ie]:Ct.target.value})})),st=Object.keys(le.roles),[tt,Te]=e.useState(ee??"experts");e.useEffect(()=>{typeof ee=="string"&&ee!==""&&Te(ee)},[ee]);const _t=ie=>{Te(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、飞书云盘、代码隔离四条外部通道最近一次是成功还是失败。以前这些失败只写进日志,现在会在这里亮出来,坏了能看见、能补一次。"]},xt=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"},Ve("boardTitle","看板标题","需求&任务工作空间"))),xt):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"},`${ja[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"}},"单个专家可以在「专家」里单独指定模型,优先级:专家模型 → 这里的角色模型 → 宿主默认。"),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: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:Wa=>ce({...le,agentsAuto:Wa.target.checked?[...le.agentsAuto,Ce]:le.agentsAuto.filter(Ct=>Ct!==Ce)})}),t("span",{},ge)))),t("div",{className:"ds-hint"},"勾选的列在卡片进入时自动派给该列对应的负责人;其余列只能手动「马上处理」。")),Ve("agentsMaxConcurrent","同时最多几个 agent","2"),Ve("agentsPreset","Agent 预设","standard"),Ve("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/<编号> 分支。")),Ve("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)))))),xt);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"),[$e,at]=e.useState("normal"),[nt,ct]=e.useState("p2"),[Ve,st]=e.useState(""),tt=Z?.requirements??[],[Te,_t]=e.useState(""),[Fe,xt]=e.useState(be.length===1?be[0].id:""),[jt,Qt]=e.useState(""),[ie,Ce]=e.useState(""),[ge,Wa]=e.useState(""),[Ct,ca]=e.useState(null),[Pn,Aa]=e.useState(!1),Dt=Se==="bug",Ot=be.find(z=>z.id===Fe)?.iterations??[],Y=async()=>{Aa(!0),ca(null);try{await X("/task/create",{title:ne,requirement:ce,type:Se,priority:$e,domain:Ve,severity:Dt?nt:"",role:Dt?"dev":"product",status:Dt?"dev_ready":"clarify",project:Fe,iteration:Fe===""?"":jt,owner:ie.trim(),dueAt:Pr(ge),requirementId:Te}),await ee(),U()}catch(z){ca(z instanceof Error?z.message:String(z))}finally{Aa(!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…
|
|
827
|
+
`;function V(){const[Y,ne]=e.useState(null),[ee,be]=e.useState(null),se=e.useRef(""),de=e.useCallback(async(Q=!1)=>{if(!(typeof document<"u"&&document.hidden===!0))try{const ve=await X("/state"),Ce={...ve.state??{},locked:ve.locked===!0},Se=[Ce.revision??"",(Ce.tasks??[]).length,(Ce.requirements??[]).length,(Ce.agents??[]).length,Ce.locked===!0?1:0].join("|");if(!Q&&Se===se.current){be(null);return}se.current=Se,ne(Ce),be(null)}catch(ve){be(ve instanceof Error?ve.message:String(ve))}},[]);return e.useEffect(()=>{let Q=!0;const ve=async()=>{Q&&await de()};ve();const Ce=setInterval(()=>{ve()},15e3),Se=()=>{document.hidden!==!0&&ve()};return document.addEventListener("visibilitychange",Se),()=>{Q=!1,clearInterval(Ce),document.removeEventListener("visibilitychange",Se)}},[de]),{state:Y,error:ee,reload:de}}const Ee=tx(t),ke=hx({h:t,TextField:l}),Ae=yx({h:t,React:e,api:X,kit:o,currentUser:w,renderMarkdown:Ee,tipOf:i,tipLabel:d,confirmDialog:C,promptDialog:E,TextField:l,TextAreaField:c,ChipField:u,CheckField:p,SelectField:f,MdField:g,MentionPicker:ke}),Ve=Dx({h:t,React:e});Ox({h:t,React:e,Editor:x,api:X,kit:o,toast:H,sessionToken:ae,currentUser:w,confirmDialog:C,promptDialog:E,tipOf:i,tipLabel:d,renderMarkdown:Ee,SideDrawer:v,MentionPicker:ke,Card:b,TextField:l,TextAreaField:c,ChipField:u,CheckField:p,SelectField:f,MdField:g});function Ya({state:Y,onChanged:ne}){const[ee,be]=e.useState(null),[se,de]=e.useState(null),[Q,ve]=e.useState(null),[Ce,Se]=e.useState(null),[Pe,dt]=e.useState({name:"",spec:"",description:""}),[rt,Je]=e.useState(!1),[We,tt]=e.useState(!1),Ge=e.useCallback(async()=>{try{be(await X("/market"))}catch(le){ve(le instanceof Error?le.message:String(le))}},[]);e.useEffect(()=>{Ge()},[Ge]);const Te=new Set(ee?.installed??[]),It=le=>le.replace(/^link:/,"").split("/").pop().replace(/^dsh-/,"dsh-"),Be=async(le,Ne)=>{de(le.id),ve(null),Se(null);try{const me=await X(`/market/${Ne}`,{id:le.id});if(me.ok===!1)throw new Error((me.result?.output??"").slice(-300)||"安装失败");Se(Ne==="install"?"已安装,重启工作空间后生效":"已移除,重启工作空间后生效"),await Ge()}catch(me){ve(me instanceof Error?me.message:String(me))}finally{de(null)}},yt=async()=>{if(!(Pe.name.trim()===""||Pe.spec.trim()==="")){tt(!0),ve(null);try{const le=[...Y.config.market.items??[],{id:`m-${Math.random().toString(16).slice(2,10)}`,name:Pe.name.trim(),spec:Pe.spec.trim(),description:Pe.description.trim()}];await X("/config",{market:{items:le}}),dt({name:"",spec:"",description:""}),Je(!1),await ne(),await Ge()}catch(le){ve(le instanceof Error?le.message:String(le))}finally{tt(!1)}}},Rt=async le=>{if(!await C(`从市场列表移除「${le.name}」?不会卸载已安装的插件。`,{title:"移除插件",danger:!0,okText:"移除"}))return;const Ne=(Y.config.market.items??[]).filter(me=>me.id!==le.id);await X("/config",{market:{items:Ne}}).catch(()=>{}),await ne(),await Ge()},Ut=ee?.items??Y.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??Y.config.market.title),t("span",{className:"ds-stat"},`${Ut.length} 个条目 · profile ${Y.profile??"—"}`),t("div",{className:"ds-grow"}),t("button",{className:"ds-btn",onClick:()=>Je(!rt)},rt?"收起":"+ 添加条目")),Q!==null?t("div",{className:"ds-err",style:{padding:"0 0 8px"}},Q):null,Ce!==null?t("div",{className:"ds-ok",style:{padding:"0 0 8px"}},Ce):null,Ut.length===0?t("div",{className:"ds-empty"},"还没有条目。把公司内部的插件包加进来,同事就能一键安装。"):t("div",{className:"ds-market-grid"},Ut.map(le=>{const Ne=It(le.spec),me=Te.has(Ne)||Te.has(le.name);return t("div",{key:le.id,className:"ds-market-card"},t("div",{className:"ds-mc-head"},t("span",{className:"ds-mc-name ds-grow"},le.name),t(u,{className:"ds-chip","data-on":me?"1":"0"},me?"已安装":"未安装")),le.description!==""?t("div",{className:"ds-mc-desc"},le.description):null,t("code",null,le.spec),t("div",{className:"ds-row",style:{marginTop:"auto"}},t("button",{className:me?"ds-btn":"ds-btn ds-btn-primary",disabled:se===le.id,onClick:async()=>{await C(me?`从 profile 移除「${Ne}」?`:`安装「${Ne}」到工作空间?`,{title:me?"移除插件":"安装插件",danger:me,okText:me?"移除":"安装"})&&Be(le,me?"uninstall":"install")}},se===le.id?"处理中…":me?"移除":"安装"),t("button",{className:"ds-btn",style:{marginLeft:"auto",opacity:.7},onClick:()=>void Rt(le)},"删条目")))})),rt?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:Pe.name,placeholder:"代码评审助手",onChange:le=>dt({...Pe,name:le.target.value})})),t("div",{className:"ds-field"},t("div",{className:"ds-label"},"包名或路径"),t(l,{className:"ds-input",value:Pe.spec,placeholder:"@company/dsh-reviewer 或 link:~/pkgs/reviewer",onChange:le=>dt({...Pe,spec:le.target.value})})),t("div",{className:"ds-field"},t("div",{className:"ds-label"},"一句话说明"),t(l,{className:"ds-input",value:Pe.description,placeholder:"自动跑 GitLab MR 的评审清单",onChange:le=>dt({...Pe,description:le.target.value})}))),t("div",{style:{padding:"0 14px 14px"}},t("button",{className:"ds-btn ds-btn-primary",disabled:We||Pe.name.trim()===""||Pe.spec.trim()==="",onClick:()=>void yt()},We?"添加中…":"加入市场"))):null)}function Rn({state:Y,onChanged:ne,initialSection:ee,onSection:be}){const se=Y.config,[de,Q]=e.useState({boardTitle:se.board.title,gitlabUrl:se.gitlab.url,gitlabGroup:se.gitlab.group,gitlabProject:se.gitlab.project,gitlabToken:"",feishuAppId:se.feishu.appId,feishuAppSecret:"",feishuChatId:se.feishu.chatId,feishuBaseToken:se.feishu.baseToken,feishuTableId:se.feishu.tableId,feishuWebhook:"",feishuNotify:se.feishu.notifyOnChange!==!1,gitlabSyncEnabled:se.gitlab.syncEnabled===!0,gitlabSyncLabel:se.gitlab.syncLabel??"",roles:JSON.parse(JSON.stringify(se.roles)),agentsEnabled:se.agents?.enabled===!0,agentsMaxConcurrent:String(se.agents?.maxConcurrent??2),agentsPreset:se.agents?.agentPreset??"standard",agentsWorkspace:se.agents?.workspaceDir??"",agentsSandbox:se.agents?.sandbox??"workspace-write",agentsIsolation:se.agents?.isolation??"none",agentsWorktreeRoot:se.agents?.worktreeRoot??"",agentsCleanup:se.agents?.cleanupWorktree??"manual",agentsAuto:Array.isArray(se.agents?.autoStatuses)?se.agents.autoStatuses:["design","dev_ready","test"]}),[ve,Ce]=e.useState(null),[Se,Pe]=e.useState(null),[dt,rt]=e.useState(!1),Je=async()=>{rt(!0),Pe(null),Ce(null);try{await X("/config",{board:{title:de.boardTitle},roles:de.roles,agents:{enabled:de.agentsEnabled,maxConcurrent:Number(de.agentsMaxConcurrent)||2,agentPreset:de.agentsPreset,workspaceDir:de.agentsWorkspace,sandbox:de.agentsSandbox,isolation:de.agentsIsolation,worktreeRoot:de.agentsWorktreeRoot,cleanupWorktree:de.agentsCleanup,autoStatuses:de.agentsAuto}}),Ce("已保存"),await ne()}catch(le){Pe(le instanceof Error?le.message:String(le))}finally{rt(!1)}},We=(le,Ne,me,Qa)=>t("div",{className:"ds-field",key:le},t("div",{className:"ds-label"},Ne),t(l,{className:"ds-input",type:"text",value:de[le],placeholder:me??"",onChange:Et=>Q({...de,[le]:Et.target.value})})),tt=Object.keys(de.roles),[Ge,Te]=e.useState(ee??"experts");e.useEffect(()=>{typeof ee=="string"&&ee!==""&&Te(ee)},[ee]);const It=le=>{Te(le),be?.(le)},Be={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:dt,onClick:()=>void Je()},dt?"保存中…":"保存"),ve!==null?t("span",{className:"ds-ok"},ve):null,Se!==null?t("span",{className:"ds-err"},Se):null),Rt=[{group:"团队"},{id:"projects",label:"项目与迭代",count:(se.projects??[]).length},{id:"experts",label:"专家",count:(se.experts??[]).length},{id:"teams",label:"专家团",count:(se.teams??[]).length},{id:"skills",label:"技能库"},{id:"columns",label:"列的负责人"},{group:"接入"},{id:"gitlab",label:"代码仓库",count:(se.gitlab.projects??[]).length},{id:"feishu",label:"飞书机器人",count:(se.feishu.bots??[]).length},{id:"health",label:"集成健康",count:Y.integrations?.broken??0},{group:"运行"},{id:"agents",label:"自动派单"},{id:"testing",label:"测试执行",count:(se.testing?.envs??[]).length},{id:"costs",label:"成本与预算"},{id:"environments",label:"部署环境",count:(se.environments??[]).length},{id:"board",label:"看板外观"},{group:"安全"},{id:"ldap",label:"统一登录(LDAP)",count:se.ldap?.enabled===!0?se.ldap?.requireLogin===!0?"必须":"开":0},{id:"access",label:"权限与审计",count:(se.access?.members??[]).length},{id:"storage",label:"数据与备份",count:Y.storage?.snapshots??0}],Ut=le=>le==="projects"?t(Wx,{config:se,onChanged:ne}):le==="experts"?t(Mx,{config:se,onChanged:ne}):le==="teams"?t(zx,{config:se,onChanged:ne}):le==="skills"?t(Jx,{config:se,onChanged:ne}):le==="columns"?t(Gx,{state:Y,onChanged:ne}):le==="testing"?t(Fx,{config:se,onChanged:ne}):le==="costs"?t(Vx,{config:se,onChanged:ne}):le==="environments"?t(Ux,{config:se,onChanged:ne}):le==="access"?t(Hx,{state:Y,config:se,onChanged:ne}):le==="ldap"?t(qx,{config:se,onChanged:ne}):le==="storage"?t(Kx,{state:Y,onChanged:ne}):le==="gitlab"?t(Qx,{config:se,onChanged:ne}):le==="feishu"?t("div",null,t(Zx,{config:se,onChanged:ne}),t(Bx,{config:se,onChanged:ne})):le==="health"?t(Yx,{state:Y,config:se,onChanged:ne}):le==="board"?t("div",null,t("div",{className:"ds-panel ds-form-panel"},t("div",{className:"ds-panel-head"},"看板"),t("div",{className:"ds-panel-body"},We("boardTitle","看板标题","需求&任务工作空间"))),yt):le==="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"},tt.map(Ne=>t("div",{className:"ds-field",key:Ne},t("div",{className:"ds-label"},`${za[Ne]??Ne}`),t(l,{className:"ds-input",value:de.roles[Ne].model,placeholder:"deepseek-v4.1-flash",onChange:me=>Q({...de,roles:{...de.roles,[Ne]:{...de.roles[Ne],model:me.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:de.agentsEnabled,onChange:Ne=>Q({...de,agentsEnabled:Ne.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(([Ne,me])=>t("label",{className:"ds-row",key:Ne,style:{alignItems:"center",gap:6,cursor:"pointer"}},t(p,{checked:de.agentsAuto.includes(Ne),onChange:Qa=>Q({...de,agentsAuto:Qa.target.checked?[...de.agentsAuto,Ne]:de.agentsAuto.filter(Et=>Et!==Ne)})}),t("span",{},me)))),t("div",{className:"ds-hint"},"勾选的列在卡片进入时自动派给该列对应的负责人;其余列只能手动「马上处理」。")),We("agentsMaxConcurrent","同时最多几个 agent","2"),We("agentsPreset","Agent 预设","standard"),We("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:de.agentsSandbox,onChange:Ne=>Q({...de,agentsSandbox:Ne.target.value})},[["read-only","只读:能看不能改"],["workspace-write","只写工作区(推荐):能改自己的目录,改不到系统别处"],["danger-full-access","无沙箱:可以写任何地方(危险)"]].map(([Ne,me])=>t("option",{key:Ne,value:Ne},me))),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:de.agentsIsolation,onChange:Ne=>Q({...de,agentsIsolation:Ne.target.value})},[["none","不隔离:所有卡共用一个工作区"],["worktree","一卡一个 git worktree(推荐给多卡并行)"]].map(([Ne,me])=>t("option",{key:Ne,value:Ne},me))),t("div",{className:"ds-hint"},"开启后,卡要挂在配了「本机代码目录」的项目上,派单时会为它切一条 task/<编号> 分支。")),We("agentsWorktreeRoot","worktree 根目录","留空 = 工作区同级的 dsh-worktrees"),t("div",{className:"ds-field",key:"agentsCleanup"},t("div",{className:"ds-label"},"卡完成时"),t(f,{className:"ds-input",value:de.agentsCleanup,onChange:Ne=>Q({...de,agentsCleanup:Ne.target.value})},[["manual","保留 worktree 和分支,等人看 diff"],["on_done","自动删掉 worktree 和分支"]].map(([Ne,me])=>t("option",{key:Ne,value:Ne},me)))))),yt);return t("div",{className:"ds-settings"},t("div",{className:"ds-settings-nav"},Rt.map((le,Ne)=>le.group!==void 0?t("div",{className:"ds-settings-nav-group",key:`group-${Ne}`},le.group):i((Be[le.id]??[le.label,""])[1]||le.label,t("button",{key:le.id,className:"ds-nav-item","data-active":Ge===le.id?"1":"0",onClick:()=>It(le.id)},t("span",{},le.label),le.count===void 0?null:t("span",{className:"ds-nav-count"},String(le.count)))))),t("div",{className:"ds-settings-pane"},t("div",{className:"ds-pane-head"},t("div",null,t("div",{className:"ds-pane-title"},(Be[Ge]??["设置"])[0]),t("div",{className:"ds-pane-desc"},(Be[Ge]??["",""])[1]))),Ut(Ge)))}function B({state:Y,onClose:ne,onCreated:ee}){const be=Y?.config?.projects??[],[se,de]=e.useState(""),[Q,ve]=e.useState(""),[Ce,Se]=e.useState("requirement"),[Pe,dt]=e.useState("normal"),[rt,Je]=e.useState("p2"),[We,tt]=e.useState(""),Ge=Y?.requirements??[],[Te,It]=e.useState(""),[Be,yt]=e.useState(be.length===1?be[0].id:""),[Rt,Ut]=e.useState(""),[le,Ne]=e.useState(""),[me,Qa]=e.useState(""),[Et,fa]=e.useState(null),[An,La]=e.useState(!1),Lt=Ce==="bug",Mt=be.find(Z=>Z.id===Be)?.iterations??[],jn=async()=>{La(!0),fa(null);try{await X("/task/create",{title:se,requirement:Q,type:Ce,priority:Pe,domain:We,severity:Lt?rt:"",role:Lt?"dev":"product",status:Lt?"dev_ready":"clarify",project:Be,iteration:Be===""?"":Rt,owner:le.trim(),dueAt:jr(me),requirementId:Te}),await ee(),ne()}catch(Z){fa(Z instanceof Error?Z.message:String(Z))}finally{La(!1)}};return t("div",{className:"ds-modal-wrap",onClick:Z=>{Z.target===Z.currentTarget&&ne()}},t("div",{className:"ds-modal"},t("h3",{},Lt?"登记缺陷":"新建任务"),t("div",{className:"ds-field"},t("div",{className:"ds-label"},"标题"),t(l,{className:"ds-input",autoFocus:!0,placeholder:Lt?"一句话说清什么坏了,例如「优惠券叠加后金额算错」":"一句话说清要做什么",value:se,onChange:Z=>de(Z.target.value),onKeyDown:Z=>{Z.key==="Enter"&&!Z.isComposing&&jn()}})),t("div",{className:"ds-field"},t("div",{className:"ds-label"},Lt?"复现步骤 / 现象":"需求 / 背景"),t(g,{className:"ds-textarea",rows:5,placeholder:Lt?`复现步骤:1… 2…
|
|
828
828
|
实际结果:
|
|
829
829
|
期望结果:
|
|
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(Fo).map(z=>t("option",{key:z,value:z},Fo[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(Vl).map(z=>t("option",{key:z,value:z},Vl[z])))):t("div",{className:"ds-field"},t("div",{className:"ds-label"},"优先级"),t(f,{className:"ds-select",value:$e,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:$e,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:Te,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:Ve,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=>{xt(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=>Wa(z.target.value)}))),Dt?t("div",{className:"ds-hint",style:{fontSize:11.5}},"缺陷卡会直接落到「待开发」,由研发先复现、定位根因再修,修完自动交给测试验证。"):null,t("div",{className:"ds-modal-foot"},Ct!==null?t("span",{className:"ds-err"},Ct):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,$e)=>t("div",{className:"ds-proj-card",key:$e},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($e)},"看这些卡")),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 yt(){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 Ve=[],st=[];for(const Te of ct)Te.isConnected!==!1&&(Pt(Te)?Ve.push(Te):st.push(Te));for(const Te of Ve)Z.add(Te),Vt(Te);let tt=!1;for(const Te of st)ne.has(Te)||(ne.add(Te),Te.isConnected!==!1&&(le.push(Te),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 $e=null;const at=new MutationObserver(()=>{$e===null&&($e=window.setTimeout(()=>{$e=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,$e]=e.useState(Se?"ldap":"local"),[at,nt]=e.useState(Se?"":ce),[ct,Ve]=e.useState(""),[st,tt]=e.useState(!1),[Te,_t]=e.useState(ee??""),Fe=ge=>{ge!==Ne&&($e(ge),_t(""),Ve(""),nt(ge==="local"?ce:""))},xt=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())),Ve(""),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"&&xt()}})),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=>Ve(ge.target.value),onKeyDown:ge=>{ge.key==="Enter"&&xt()}})),Te===""?null:t("div",{className:"ds-error"},Te),Te!==""&&/LDAP|域|目录|连不上/.test(Te)?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 xt()},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 ka(Z){const U=Z?.loginGate??ds,{state:ee,error:be,reload:ne}=W(),[le,ce]=e.useState("dashboard"),[ve,Se]=e.useState("experts"),[Ne,$e]=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&&$e(de.open)}const[Ve,st]=e.useState(!1),[tt,Te]=e.useState(0);e.useEffect(()=>{if(!Ve)return;const z=()=>st(!1);return document.addEventListener("click",z),()=>document.removeEventListener("click",z)},[Ve]);const[_t,Fe]=e.useState(we),[xt,jt]=e.useState(()=>K()??(D()?.matches?"dark":"light")),[Qt,ie]=e.useState(!1),[Ce,ge]=e.useState(!1),[Wa,Ct]=e.useState(null),[ca,Pn]=e.useState(0),[Aa,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(),Ct(null),ge(Ke=>!Ke);return}const He=yx(de);He!==null&&(de.preventDefault(),Ct(He),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(Ge=>Ge===Ke?Ge:Ke)};z();const de=D(),Le=()=>z();de!==null&&de.addEventListener("change",Le);const He=window.setInterval(z,1500);return()=>{de!==null&&de.removeEventListener("change",Le),window.clearInterval(He)}},[]);const Ot=_t==="system"?xt:_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(()=>yt(),[]),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,He])=>({id:Le,label:He}));return z!==null?t(z,{value:_t,onChange:Le=>Fe(fe(Le)),options:de}):t("div",{className:"ds-seg",title:"显示模式;「跟随系统」会先跟宿主界面的深浅色,宿主没给出信号时再跟操作系统"},R.map(([Le,He])=>t("button",{key:Le,className:"ds-seg-btn","data-on":_t===Le?"1":"0",onClick:()=>Fe(fe(Le))},He)))})(),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:()=>{
|
|
830
|
+
影响范围 / 环境(版本、账号、数据条件):`:"背景、期望结果、验收口径。专家会照这段去开工。",value:Q,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:Ce,onChange:Z=>Se(Z.target.value)},Object.keys(Wo).map(Z=>t("option",{key:Z,value:Z},Wo[Z])))),Lt?t("div",{className:"ds-field"},t("div",{className:"ds-label"},"严重级别"),t(f,{className:"ds-select",value:rt,onChange:Z=>Je(Z.target.value)},Object.keys(Yl).map(Z=>t("option",{key:Z,value:Z},Yl[Z])))):t("div",{className:"ds-field"},t("div",{className:"ds-label"},"优先级"),t(f,{className:"ds-select",value:Pe,onChange:Z=>dt(Z.target.value)},Object.keys(Ms).map(Z=>t("option",{key:Z,value:Z},Ms[Z])))),Lt?t("div",{className:"ds-field"},t("div",{className:"ds-label"},"优先级"),t(f,{className:"ds-select",value:Pe,onChange:Z=>dt(Z.target.value)},Object.keys(Ms).map(Z=>t("option",{key:Z,value:Z},Ms[Z])))):null,t("div",{className:"ds-field",style:{gridColumn:"1 / -1"}},t("div",{className:"ds-label"},"挂在哪个需求下"),Ge.length===0?t("div",{className:"ds-hint",style:{fontSize:11.5}},"还没有需求。到「需求」页先建一条,这张卡就能拿到 DEV-001 这样的编号。"):t(f,{className:"ds-select",value:Te,onChange:Z=>It(Z.target.value)},t("option",{value:""},"暂不挂需求(编号留空)"),Ge.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:We,onChange:Z=>tt(Z.target.value)})),be.length===0?null:t("div",{className:"ds-field"},t("div",{className:"ds-label"},"业务项目"),t(f,{className:"ds-select",value:Be,onChange:Z=>{yt(Z.target.value),Ut("")}},t("option",{value:""},"不属于任何项目"),be.map(Z=>t("option",{key:Z.id,value:Z.id},`${Z.key?`${Z.key} · `:""}${Z.name}`)))),be.length===0||Mt.length===0?null:t("div",{className:"ds-field"},t("div",{className:"ds-label"},"迭代"),t(f,{className:"ds-select",value:Rt,onChange:Z=>Ut(Z.target.value)},t("option",{value:""},"不指定迭代"),Mt.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:le,onChange:Z=>Ne(Z.target.value)})),t("div",{className:"ds-field"},t("div",{className:"ds-label"},"期望完成(选填)"),t(l,{className:"ds-input",type:"date",value:me,onChange:Z=>Qa(Z.target.value)}))),Lt?t("div",{className:"ds-hint",style:{fontSize:11.5}},"缺陷卡会直接落到「待开发」,由研发先复现、定位根因再修,修完自动交给测试验证。"):null,t("div",{className:"ds-modal-foot"},Et!==null?t("span",{className:"ds-err"},Et):null,t("div",{className:"ds-grow"}),t("button",{className:"ds-btn",onClick:ne},"取消"),t("button",{className:"ds-btn ds-btn-primary",disabled:An||se.trim()==="",onClick:()=>void jn()},An?"创建中…":Lt?"登记缺陷":"创建"))))}function he({state:Y,onOpenBoard:ne}){const[ee,be]=e.useState(null),[se,de]=e.useState(null);if(e.useEffect(()=>{let ve=!0;return X("/metrics").then(Ce=>{ve&&be(Ce.metrics)}).catch(Ce=>{ve&&de(Ce instanceof Error?Ce.message:String(Ce))}),()=>{ve=!1}},[Y.revision]),se!==null)return t("div",{className:"ds-body"},t("div",{className:"ds-err"},se));if(ee===null)return t("div",{className:"ds-loading"},"正在统计…");const Q=(ve,Ce,Se,Pe)=>t("div",{className:"ds-proj-card",key:Pe},t("div",{className:"ds-proj-head"},t("div",null,t("div",{className:"ds-proj-name"},ve),t("div",{className:"ds-hint"},Ce)),t("button",{className:"ds-btn",onClick:()=>ne(Pe)},"看这些卡")),t("div",{className:"ds-proj-stats"},t("div",null,t("b",{},Se.inProgress),t("span",{},"进行中")),t("div",null,t("b",{"data-warn":Se.blocked>0?"1":"0"},Se.blocked),t("span",{},"阻塞")),t("div",null,t("b",{"data-warn":Se.overdue>0?"1":"0"},Se.overdue),t("span",{},"逾期")),t("div",null,t("b",{},Se.done),t("span",{},"已完成")),t("div",null,t("b",{},`${Se.checklistRate}%`),t("span",{},"清单完成")),t("div",null,t("b",{},Se.artifacts),t("span",{},"交付物"))),t("div",{className:"ds-proj-bar"},t("div",{className:"ds-check-bar","data-full":Se.checklistRate===100?"1":"0"},t("span",{style:{width:`${Se.checklistRate}%`}}))),Se.cycleDays>0?t("div",{className:"ds-hint"},`平均周期 ${Se.cycleDays} 天 · 近 7 天完成 ${Se.throughput7d} 张`):t("div",{className:"ds-hint"},`近 7 天完成 ${Se.throughput7d} 张`));return t("div",{className:"ds-body"},t("div",{className:"ds-proj-grid"},(ee.projects??[]).map(ve=>Q(`${ve.key?`[${ve.key}] `:""}${ve.name}`,`${(ve.iterations??[]).length} 个迭代`,ve.metrics,ve.id)),ee.unassigned!==null&&ee.unassigned.total>0?Q("未归属项目","还没挂到项目上的卡",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},Ue='[data-on],[data-role],[role="button"],[tabindex],[class*="ds-"]';function _t(Y){if(Y===null||Y.nodeType!==1||je[Y.tagName]===1||Y.dataset.kb==="1"||typeof Y.className=="string"&&Y.className.indexOf("mask")>=0||Y.getAttribute("contenteditable")==="true")return!1;let ne="";try{ne=window.getComputedStyle(Y).cursor}catch{ne=""}return ne==="pointer"}function Gt(Y){Y.dataset.kb="1",Y.getAttribute("tabindex")===null&&Y.setAttribute("tabindex","0"),Y.getAttribute("role")===null&&Y.setAttribute("role","button");const ne=Y.getAttribute("data-on");if(ne!==null&&Y.setAttribute("aria-pressed",ne==="1"?"true":"false"),Y.getAttribute("aria-label")===null){const ee=String(Y.getAttribute("title")??Y.textContent??"").trim().replace(/\s+/g," ").slice(0,80);ee.length>0&&Y.setAttribute("aria-label",ee)}Y.addEventListener("keydown",ee=>{ee.key!=="Enter"&&ee.key!==" "||Y.getAttribute("aria-disabled")!=="true"&&(ee.preventDefault(),Y.click())})}function st(){if(typeof document>"u")return()=>{};const Y=ne=>{const ee=ne.target,be=ee instanceof Element?ee.closest(".ds-board"):null;be!==null&&(be.scrollWidth<=be.clientWidth+1||ne.shiftKey||Math.abs(ne.deltaY)<=Math.abs(ne.deltaX)||(be.scrollLeft+=ne.deltaY,ne.preventDefault()))};return document.addEventListener("wheel",Y,{passive:!1}),()=>document.removeEventListener("wheel",Y)}function Ct(){if(typeof document>"u")return()=>{};const Y=new WeakSet,ne=[];let ee=!1;const be=()=>typeof performance<"u"?performance.now():Date.now(),se=new WeakSet,de=[];let Q=null;const ve=()=>{ee=!1;const rt=be()+6,Je=[];for(;ne.length>0&&Je.length<60&&be()<rt;)Je.push(ne.pop());const We=[],tt=[];for(const Te of Je)Te.isConnected!==!1&&(_t(Te)?We.push(Te):tt.push(Te));for(const Te of We)Y.add(Te),Gt(Te);let Ge=!1;for(const Te of tt)se.has(Te)||(se.add(Te),Te.isConnected!==!1&&(de.push(Te),Ge=!0));Ge&&Q===null&&(Q=window.setTimeout(()=>{Q=null,ne.push(...de.splice(0)),Ce()},400)),ne.length>0&&Ce()},Ce=()=>{ee!==!0&&(ee=!0,typeof window.requestIdleCallback=="function"?window.requestIdleCallback(ve,{timeout:300}):window.setTimeout(ve,16))},Se=()=>{const rt=document.querySelector("[data-dsh-studio]");if(rt!==null){for(const Je of rt.querySelectorAll(Ue))Y.has(Je)||se.has(Je)||Je.dataset.kb==="1"||ne.push(Je);ne.length>0&&Ce()}};Se();let Pe=null;const dt=new MutationObserver(()=>{Pe===null&&(Pe=window.setTimeout(()=>{Pe=null,Se()},200))});return dt.observe(document.body,{childList:!0,subtree:!0}),()=>dt.disconnect()}function pt({config:Y,theme:ne,message:ee,onDone:be,onClose:se,overlay:de}){const Q=String(Y?.localAuth?.username??"admin"),ve=Y?.localAuth?.enabled!==!1,Ce=Y?.ldap?.enabled===!0,[Se,Pe]=e.useState(Ce?"ldap":"local"),[dt,rt]=e.useState(Ce?"":Q),[Je,We]=e.useState(""),[tt,Ge]=e.useState(!1),[Te,It]=e.useState(ee??""),Be=me=>{me!==Se&&(Pe(me),It(""),We(""),rt(me==="local"?Q:""))},yt=async()=>{if(!tt){if(dt.trim()===""||Je===""){It(Se==="local"?"本地账号和密码都要填":"域账号和密码都要填");return}Ge(!0),It("");try{const me=await X("/auth/login",{username:dt.trim(),password:Je,mode:Se});z(me.token),xe(me.user??null),T(String(me.user?.name??me.user?.id??dt.trim())),We(""),be()}catch(me){It(me instanceof Error?me.message:String(me))}finally{Ge(!1)}}},Rt=t("div",{className:"ds-seg",style:{alignSelf:"flex-start"}},t("button",{className:"ds-seg-btn",type:"button","data-on":Se==="ldap"?"1":"0",disabled:!Ce,title:Ce?"用公司目录(LDAP)的账号登录":"LDAP 还没启用,先在设置里配好再用",onClick:()=>Be("ldap")},"LDAP 账号"),t("button",{className:"ds-seg-btn",type:"button","data-on":Se==="local"?"1":"0",disabled:!ve,title:"用平台自带的超管账号登录",onClick:()=>Be("local")},"本地超管")),Ut=Se==="ldap"?t("div",{className:"ds-login-hint"},"用公司账号登录(LDAP)。登录后会记下你的名字,写操作和审计都挂在这个名字下。"):t("div",{className:"ds-login-hint"},`用平台自带的超管账号登录。默认账号 ${Q},默认口令 admin(改过之后就用新口令)。`),le=t("div",{className:"ds-login"},t("div",{className:"ds-login-brand"},"◈ ",Y?.board?.title??"工作空间"),Rt,Ut,t("label",{className:"ds-field"},t("span",null,Se==="local"?"超管账号":"域账号"),t("input",{value:dt,autoFocus:Se==="ldap",name:"studio-account",autoComplete:"off",spellCheck:!1,placeholder:Se==="local"?Q:"域账号",onChange:me=>rt(me.target.value),onKeyDown:me=>{me.key==="Enter"&&yt()}})),t("label",{className:"ds-field"},t("span",null,"密码"),t("input",{type:"password",value:Je,autoFocus:Se==="local",name:"studio-pass",autoComplete:"new-password",placeholder:Se==="local"?"默认口令 admin":"域密码",onChange:me=>We(me.target.value),onKeyDown:me=>{me.key==="Enter"&&yt()}})),Te===""?null:t("div",{className:"ds-error"},Te),Te!==""&&/LDAP|域|目录|连不上/.test(Te)?t("div",{className:"ds-login-note"},"连不上目录服务时,切到「本地超管」用平台账号进来;等网络打通再用域账号。"):null,t("div",{className:"ds-login-actions"},t("button",{className:"ds-btn ds-btn-primary",disabled:tt,onClick:()=>void yt()},tt?"登录中…":Se==="local"?"登录(本地超管)":"登录(LDAP)"),typeof se=="function"?t("button",{className:"ds-btn ds-btn-ghost",onClick:()=>se()},"先不登录"):null),t("div",{className:"ds-login-note"},Se==="ldap"?`${Y?.ldap?.url??"—"} · BASE:${Y?.ldap?.baseDN??"—"}`:"本地账号存在服务端密钥里(scrypt 哈希),改密码在「设置 → 统一登录(LDAP)」")),Ne=t("div",{className:"ds-login-wrap","data-overlay":de===!0?"1":"0"},le);return de===!0?Ne:t("div",{"data-dsh-studio":"","data-theme":ne},t("style",null,ge),Ne)}function Ea(Y){const ne=Y?.loginGate??pt,{state:ee,error:be,reload:se}=V(),[de,Q]=e.useState("dashboard"),[ve,Ce]=e.useState("experts"),[Se,Pe]=e.useState(null),[dt,rt]=e.useState(!1);async function Je(Z){const _e=await Ax(Z,{api:X,state:ee,confirm:C,prompt:E,notify:H});_e.refresh===!0&&await se(!0),_e.open!==void 0&&Pe(_e.open)}const[We,tt]=e.useState(!1),[Ge,Te]=e.useState(0);e.useEffect(()=>{if(!We)return;const Z=()=>tt(!1);return document.addEventListener("click",Z),()=>document.removeEventListener("click",Z)},[We]);const[It,Be]=e.useState(we),[yt,Rt]=e.useState(()=>G()??(O()?.matches?"dark":"light")),[Ut,le]=e.useState(!1),[Ne,me]=e.useState(!1),[Qa,Et]=e.useState(null),[fa,An]=e.useState(0),[La,Lt]=e.useState(null);e.useEffect(()=>{const Z=_e=>{const xt=String(_e.key).toLowerCase();if((_e.metaKey||_e.ctrlKey)&&!_e.shiftKey&&!_e.altKey&&xt==="k"){_e.preventDefault(),Et(null),me(q=>!q);return}const ht=Nx(_e);ht!==null&&(_e.preventDefault(),Et(ht),An(q=>q+1),me(!0))};return document.addEventListener("keydown",Z),()=>document.removeEventListener("keydown",Z)},[]),e.useEffect(()=>{const Z=()=>{const q=G()??(O()?.matches?"dark":"light");Rt(ce=>ce===q?ce:q)};Z();const _e=O(),xt=()=>Z();_e!==null&&_e.addEventListener("change",xt);const ht=window.setInterval(Z,1500);return()=>{_e!==null&&_e.removeEventListener("change",xt),window.clearInterval(ht)}},[]);const Mt=It==="system"?yt:It;if(e.useEffect(()=>{const Z=document.documentElement;Z.setAttribute("data-dsh-theme",Mt),Z.style.colorScheme=Mt;let _e=document.getElementById("dsh-studio-global-theme");return _e===null&&(_e=document.createElement("style"),_e.id="dsh-studio-global-theme",_e.textContent=ie,document.head.appendChild(_e)),()=>{Z.removeAttribute("data-dsh-theme"),Z.style.colorScheme=""}},[Mt]),e.useEffect(()=>Ct(),[]),e.useEffect(()=>st(),[]),ee===null)return t("div",{"data-dsh-studio":"","data-theme":Mt},t("style",null,ge),t("div",{className:"ds-loading"},be===null?"正在载入工作空间…":`载入失败:${be}`));if(ee.locked===!0)return t(ne,{config:ee.config,theme:Mt,message:"",onDone:()=>void se()});const jn=Se===null?null:ee.tasks.find(Z=>Z.id===Se)??null;return ee.tasks.reduce((Z,_e)=>(Z[_e.status]=(Z[_e.status]??0)+1,Z),{}),t("div",{"data-dsh-studio":"","data-theme":Mt},t("style",null,ge),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} · 更新于 ${Ke(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:()=>le(!0)},"登录"):i("退出当前账号(退出后回到超管身份)",t("button",{className:"ds-btn ds-btn-ghost",onClick:async()=>{try{await X("/auth/logout",{})}catch{}z(""),xe(null),le(!1),se()}},"退出登录")),(()=>{const Z=o("SegGroup"),_e=R.map(([xt,ht])=>({id:xt,label:ht}));return Z!==null?t(Z,{value:It,onChange:xt=>Be(fe(xt)),options:_e}):t("div",{className:"ds-seg",title:"显示模式;「跟随系统」会先跟宿主界面的深浅色,宿主没给出信号时再跟操作系统"},R.map(([xt,ht])=>t("button",{key:xt,className:"ds-seg-btn","data-on":It===xt?"1":"0",onClick:()=>Be(fe(xt))},ht)))})(),t("button",{className:"ds-btn",onClick:()=>void se()},"刷新"),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:()=>{Q("settings"),Ce("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":We?"true":"false",onClick:Z=>{Z.stopPropagation(),tt(_e=>!_e)}},"+ 新建"),We?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:()=>{tt(!1),Q("requirements"),Te(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:()=>{tt(!1),Q("board"),rt(!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"),_e=o("Tabs"),xt=o("TabsList"),ht=o("TabsTrigger"),q=[{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 _e!==null&&xt!==null&&ht!==null?t(_e,{value:de,onValueChange:ce=>Q(ce)},t(xt,{className:""},q.map(ce=>t(ht,{key:ce.id,value:ce.id,title:ce.hint,className:""},ce.label)))):Z!==null?t(Z,{items:q,value:de,onChange:ce=>Q(ce)}):t("div",{className:"ds-tabs"},q.map(ce=>t("button",{key:ce.id,className:"ds-tab","data-on":de===ce.id?"1":"0",onClick:()=>Q(ce.id)},ce.label)))})(),t("div",{className:"ds-grow"}),t("span",{className:"ds-stat"},de==="dashboard"?"今天该看什么:风险 · 流程 · 待办":de==="board"?`${(ee.config.experts??[]).filter(Z=>Z.enabled!==!1).length} 位专家 · ${(ee.config.teams??[]).length} 个专家团`:de==="requirements"?`${(ee.requirements??[]).length} 条需求 · ${ee.tasks.filter(Z=>(Z.requirementId??"")==="").length} 张卡未挂需求`:de==="releases"?`${(ee.releases??[]).length} 个版本 · ${ee.tasks.filter(Z=>(Z.releaseId??"")!=="").length} 张卡已挂版本`:de==="projects"?`${(ee.config.projects??[]).length} 个项目`:de==="cases"?`${(ee.tasks??[]).reduce((Z,_e)=>Z+(_e.caseSummary?.total??0),0)} 条用例 · 点一行跳回卡片`:de==="analytics"?"过程指标:通过率 · 返工 · 周期":de==="settings"?"改动即时生效,技能与专家保存在 ~/.dsh":"内部插件市场"))),be!==null?t("div",{className:"ds-err",style:{padding:"6px 18px"}},be):null,de==="board"?t(k,{state:ee,onWip:async(Z,_e)=>{const xt=await E("这一列的 WIP 上限(0 = 不限,最多 50)",{title:"WIP 上限",defaultValue:String(_e)});if(xt===null)return;const ht=Math.min(50,Math.max(0,Math.trunc(Number(String(xt).trim())||0)));try{await X("/columns/wip",{status:Z,wip:ht}),H(ht===0?"已取消 WIP 上限":`WIP 上限设为 ${ht}`),await se()}catch(q){H(q instanceof Error?q.message:String(q),"error")}},onMove:async(Z,_e)=>{await X("/task/update",{id:Z,status:_e}),await se()},onOpen:Pe}):de==="dashboard"?t(ew,{state:ee,onOpenTask:Pe,onOpenBoard:()=>Q("board"),onOpenCases:()=>Q("cases")}):de==="requirements"?t(ow,{state:ee,onOpenTask:Pe,onChanged:se,createSignal:Ge,focusReq:La}):de==="cases"?t(tw,{state:ee,onOpenTask:Pe}):de==="releases"?t(iw,{state:ee,onOpenTask:Pe}):de==="projects"?t(he,{state:ee,onOpenBoard:()=>Q("board")}):de==="analytics"?t(lw,{state:ee,onOpenTask:Pe}):de==="market"?t("div",{className:"ds-body"},t(Ya,{state:ee,onChanged:se})):t("div",{className:"ds-body"},t(Rn,{state:ee,onChanged:se,initialSection:ve,onSection:Ce})),Ne?t(Ve,{state:ee,initialAction:Qa,initialSeq:fa,onClose:()=>{me(!1),Et(null)},onPick:Z=>{if(Z.kind==="run"){Je(Z);return}if(Z.kind==="task"){Pe(Z.id);return}if(Z.kind==="requirement"){Q("requirements"),Lt({id:Z.id,at:Date.now()});return}if(Z.kind==="release"){Q("releases");return}if(Z.kind==="expert"){Q("settings"),Ce("experts");return}if(Z.kind==="team"){Q("settings"),Ce("teams");return}if(Z.kind==="project"){Q("projects");return}if(Z.kind==="skill"){Q("settings"),Ce("skills");return}if(Z.kind==="action"){if(Z.id==="new-requirement"){Q("requirements"),Te(_e=>_e+1);return}if(Z.id==="new-task"){Q("board"),rt(!0);return}if(Z.id.startsWith("tab:")){Q(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:")){Be(fe(Z.id.slice(6)));return}if(Z.id==="refresh"){se();return}Z.id.startsWith("settings:")&&(Q("settings"),Ce(Z.id.slice(9)))}}}):null,jn!==null?t(Ae,{task:jn,state:ee,onClose:()=>Pe(null),onChanged:se}):null,dt?t(B,{state:ee,onClose:()=>rt(!1),onCreated:se}):null,Ut&&ee.locked!==!0?t(ne,{config:ee.config,theme:Mt,message:"",overlay:!0,onDone:()=>{le(!1),se()},onClose:()=>le(!1)}):null)}function hs(Y){const ne=typeof Y.size=="number"?Y.size:16;return t("svg",{width:ne,height:ne,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(Y){const ne=[];ne.push(Y.slots.inject("main",()=>Y.slots.register({name:"main",key:a},Ea))),ne.push(Y.slots.inject("sidebar.panellist",()=>Y.slots.register({name:"sidebar.panellist",id:a,order:12,label:()=>"需求&任务工作空间"},hs)));const ee=()=>{for(const be of ne.splice(0).reverse())be()};return typeof Y.effect=="function"&&Y.effect(()=>ee),ee},StudioPage:Ea,StudioIcon:hs,useUIKit:s}}var pf={exports:{}},ha={},ff={exports:{}},mf={};/**
|
|
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(L,w){var T=L.length;L.push(w);e:for(;0<T;){var
|
|
839
|
+
*/(function(e){function t(L,w){var T=L.length;L.push(w);e:for(;0<T;){var K=T-1>>>1,R=L[K];if(0<r(R,w))L[K]=w,L[T]=R,T=K;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 K=0,R=L.length,O=R>>>1;K<O;){var G=2*(K+1)-1,we=L[G],fe=G+1,ye=L[fe];if(0>r(we,T))fe<R&&0>r(ye,we)?(L[K]=ye,L[fe]=T,K=fe):(L[K]=we,L[G]=T,K=G);else if(fe<R&&0>r(ye,T))L[K]=ye,L[fe]=T,K=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,U(S);else{var w=a(c);w!==null&&F(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&&!W());){var K=p.callback;if(typeof K=="function"){p.callback=null,f=p.priorityLevel;var R=K(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 O=!0;else{var G=a(c);G!==null&&F(y,G.startTime-w),O=!1}return O}finally{p=null,f=T,v=!1}}var C=!1,E=null,_=-1,I=5,D=-1;function W(){return!(e.unstable_now()-D<I)}function M(){if(E!==null){var L=e.unstable_now();D=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 H=new MessageChannel,J=H.port2;H.port1.onmessage=M,P=function(){J.postMessage(null)}}else P=function(){k(M,0)};function U(L){E=L,C||(C=!0,P())}function F(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,U(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 K=e.unstable_now();switch(typeof T=="object"&&T!==null?(T=T.delay,T=typeof T=="number"&&0<T?K+T:K):T=K,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>K?(L.sortIndex=T,t(c,L),a(l)===null&&L===a(c)&&(b?(g(_),_=-1):b=!0,F(y,T-K))):(L.sortIndex=R,t(l,L),x||v||(x=!0,U(S))),L},e.unstable_shouldYield=W,e.unstable_wrapCallback=function(L){var w=f;return function(){var T=f;f=w;try{return L.apply(this,arguments)}finally{f=T}}}})(mf),ff.exports=mf;var cw=ff.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
|
|
848
|
-
`+
|
|
847
|
+
*/var uw=N,va=cw;function oe(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 gf=new Set,Lr={};function vs(e,t){Fs(e,t),Fs(e+"Capture",t)}function Fs(e,t){for(Lr[e]=t,e=0;e<t.length;e++)gf.add(t[e])}var cn=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),id=Object.prototype.hasOwnProperty,pw=/^[: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]*$/,hf={},vf={};function fw(e){return id.call(vf,e)?!0:id.call(hf,e)?!1:pw.test(e)?vf[e]=!0:(hf[e]=!0,!1)}function mw(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 gw(e,t,a,n){if(t===null||typeof t>"u"||mw(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 aa(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 Vt={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Vt[e]=new aa(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Vt[t]=new aa(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){Vt[e]=new aa(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Vt[e]=new aa(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){Vt[e]=new aa(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){Vt[e]=new aa(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){Vt[e]=new aa(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){Vt[e]=new aa(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){Vt[e]=new aa(e,5,!1,e.toLowerCase(),null,!1,!1)});var ld=/[\-:]([a-z])/g;function dd(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(ld,dd);Vt[t]=new aa(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(ld,dd);Vt[t]=new aa(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(ld,dd);Vt[t]=new aa(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){Vt[e]=new aa(e,1,!1,e.toLowerCase(),null,!1,!1)}),Vt.xlinkHref=new aa("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){Vt[e]=new aa(e,1,!1,e.toLowerCase(),null,!0,!0)});function cd(e,t,a,n){var r=Vt.hasOwnProperty(t)?Vt[t]:null;(r!==null?r.type!==0:n||!(2<t.length)||t[0]!=="o"&&t[0]!=="O"||t[1]!=="n"&&t[1]!=="N")&&(gw(t,a,r,n)&&(a=null),n||r===null?fw(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 un=uw.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,Qo=Symbol.for("react.element"),Bs=Symbol.for("react.portal"),Us=Symbol.for("react.fragment"),ud=Symbol.for("react.strict_mode"),pd=Symbol.for("react.profiler"),bf=Symbol.for("react.provider"),yf=Symbol.for("react.context"),fd=Symbol.for("react.forward_ref"),md=Symbol.for("react.suspense"),gd=Symbol.for("react.suspense_list"),hd=Symbol.for("react.memo"),Bn=Symbol.for("react.lazy"),xf=Symbol.for("react.offscreen"),wf=Symbol.iterator;function Mr(e){return e===null||typeof e!="object"?null:(e=wf&&e[wf]||e["@@iterator"],typeof e=="function"?e:null)}var ft=Object.assign,vd;function zr(e){if(vd===void 0)try{throw Error()}catch(a){var t=a.stack.trim().match(/\n( *(at )?)/);vd=t&&t[1]||""}return`
|
|
848
|
+
`+vd+e}var bd=!1;function yd(e,t){if(!e||bd)return"";bd=!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{fd=!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=md(e.type,!1),e;case 11:return e=md(e.type.render,!1),e;case 1:return e=md(e.type,!0),e;default:return""}}function gd(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 id:return"Profiler";case od:return"StrictMode";case dd:return"Suspense";case cd: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 ld:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case ud:return t=e.displayName||null,t!==null?t:gd(e.type)||"Memo";case jn:t=e._payload,e=e._init;try{return gd(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 gd(t);case 8:return t===od?"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 Ho(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 Go(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 hd(e,t){var a=t.checked;return mt({},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&&rd(e,"checked",t,!1)}function vd(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")?bd(e,t.type,a):t.hasOwnProperty("defaultValue")&&bd(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 bd(e,t,a){(t!=="number"||Go(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 yd(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(re(91));return mt({},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 xd(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 Ko,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(Ko=Ko||document.createElement("div"),Ko.innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=Ko.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=mt({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 wd(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 kd(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 Nd=null;function Sd(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Cd=null,zs=null,Fs=null;function Pf(e){if(e=ro(e)){if(typeof Cd!="function")throw Error(re(280));var t=e.stateNode;t&&(t=vi(t),Cd(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 Ed=!1;function jf(e,t,a){if(Ed)return e(t,a);Ed=!0;try{return Rf(e,t,a)}finally{Ed=!1,(zs!==null||Fs!==null)&&(Af(),If())}}function Mr(e,t){var a=e.stateNode;if(a===null)return null;var n=vi(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 $d=!1;if(rn)try{var zr={};Object.defineProperty(zr,"passive",{get:function(){$d=!0}}),window.addEventListener("test",zr,zr),window.removeEventListener("test",zr,zr)}catch{$d=!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,Yo=null,Qo=!1,Td=null,bw={onError:function(e){Fr=!0,Yo=e}};function yw(e,t,a,n,r,s,o,i,l){Fr=!1,Yo=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=Yo;Fr=!1,Yo=null}else throw Error(re(198));Qo||(Qo=!0,Td=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=fa.unstable_scheduleCallback,Ff=fa.unstable_cancelCallback,kw=fa.unstable_shouldYield,Nw=fa.unstable_requestPaint,kt=fa.unstable_now,Sw=fa.unstable_getCurrentPriorityLevel,Pd=fa.unstable_ImmediatePriority,Bf=fa.unstable_UserBlockingPriority,Xo=fa.unstable_NormalPriority,Cw=fa.unstable_LowPriority,Uf=fa.unstable_IdlePriority,Zo=null,Ga=null;function Ew(e){if(Ga&&typeof Ga.onCommitFiberRoot=="function")try{Ga.onCommitFiberRoot(Zo,e,void 0,(e.current.flags&128)===128)}catch{}}var Da=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 Jo=64,ei=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 ti(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-Da(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-Da(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 _d(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?1073741824:0}function qf(){var e=Jo;return Jo<<=1,!(Jo&4194240)&&(Jo=64),e}function Id(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-Da(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-Da(a),s=1<<r;t[r]=0,n[r]=-1,e[r]=-1,a&=~s}}function Rd(e,t){var a=e.entangledLanes|=t;for(e=e.entanglements;a;){var n=31-Da(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,Ad,Hf,Gf,Kf,jd=!1,ai=[],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&&Ad(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 ni(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var a=Od(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(a===null){a=e.nativeEvent;var n=new a.constructor(a.type,a);Nd=n,a.target.dispatchEvent(n),Nd=null}else return t=ro(a),t!==null&&Ad(t),e.blockedOn=a,!1;t.shift()}return!0}function Xf(e,t,a){ni(e)&&a.delete(t)}function Dw(){jd=!1,On!==null&&ni(On)&&(On=null),Ln!==null&&ni(Ln)&&(Ln=null),Mn!==null&&ni(Mn)&&(Mn=null),qr.forEach(Xf),Vr.forEach(Xf)}function Hr(e,t){e.blockedOn===t&&(e.blockedOn=null,jd||(jd=!0,fa.unstable_scheduleCallback(fa.unstable_NormalPriority,Dw)))}function Gr(e){function t(r){return Hr(r,e)}if(0<ai.length){Hr(ai[0],e);for(var a=1;a<ai.length;a++){var n=ai[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,si=!0;function Ow(e,t,a,n){var r=Xe,s=Bs.transition;Bs.transition=null;try{Xe=1,Dd(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,Dd(e,t,a,n)}finally{Xe=r,Bs.transition=s}}function Dd(e,t,a,n){if(si){var r=Od(e,t,a,n);if(r===null)Jd(e,t,n,ri,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=Od(e,t,a,n),s===null&&Jd(e,t,n,ri,a),s===r)break;r=s}r!==null&&n.stopPropagation()}else Jd(e,t,n,null,a)}}var ri=null;function Od(e,t,a,n){if(ri=null,e=Sd(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 ri=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 Pd:return 1;case Bf:return 4;case Xo:case Cw:return 16;case Uf:return 536870912;default:return 16}default:return 16}}var Fn=null,Ld=null,oi=null;function Jf(){if(oi)return oi;var e,t=Ld,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 oi=r.slice(e,1<n?1-n:void 0)}function ii(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 li(){return!0}function em(){return!1}function ma(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)?li:em,this.isPropagationStopped=em,this}return mt(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=li)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():typeof a.cancelBubble!="unknown"&&(a.cancelBubble=!0),this.isPropagationStopped=li)},persist:function(){},isPersistent:li}),t}var Us={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},Md=ma(Us),Kr=mt({},Us,{view:0,detail:0}),Mw=ma(Kr),zd,Fd,Yr,di=mt({},Kr,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Ud,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"?(zd=e.screenX-Yr.screenX,Fd=e.screenY-Yr.screenY):Fd=zd=0,Yr=e),zd)},movementY:function(e){return"movementY"in e?e.movementY:Fd}}),tm=ma(di),zw=mt({},di,{dataTransfer:0}),Fw=ma(zw),Bw=mt({},Kr,{relatedTarget:0}),Bd=ma(Bw),Uw=mt({},Us,{animationName:0,elapsedTime:0,pseudoElement:0}),qw=ma(Uw),Vw=mt({},Us,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),Ww=ma(Vw),Hw=mt({},Us,{data:0}),am=ma(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 Ud(){return Qw}var Xw=mt({},Kr,{key:function(e){if(e.key){var t=Gw[e.key]||e.key;if(t!=="Unidentified")return t}return e.type==="keypress"?(e=ii(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:Ud,charCode:function(e){return e.type==="keypress"?ii(e):0},keyCode:function(e){return e.type==="keydown"||e.type==="keyup"?e.keyCode:0},which:function(e){return e.type==="keypress"?ii(e):e.type==="keydown"||e.type==="keyup"?e.keyCode:0}}),Zw=ma(Xw),Jw=mt({},di,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),nm=ma(Jw),e0=mt({},Kr,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Ud}),t0=ma(e0),a0=mt({},Us,{propertyName:0,elapsedTime:0,pseudoElement:0}),n0=ma(a0),s0=mt({},di,{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=ma(s0),o0=[9,13,27,32],qd=rn&&"CompositionEvent"in window,Qr=null;rn&&"documentMode"in document&&(Qr=document.documentMode);var i0=rn&&"TextEvent"in window&&!Qr,sm=rn&&(!qd||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"||!qd&&im(e,t)?(e=Jf(),oi=Ld=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=mi(t,"onChange"),0<t.length&&(a=new Md("onChange","change",null,a,n),e.push({event:a,listeners:t}))}var Xr=null,Zr=null;function u0(e){Tm(e,0)}function ci(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 Vd;if(rn){var Wd="oninput"in document;if(!Wd){var pm=document.createElement("div");pm.setAttribute("oninput","return;"),Wd=typeof pm.oninput=="function"}Vd=Wd}else Vd=!1;um=Vd&&(!document.documentMode||9<document.documentMode)}function fm(){Xr&&(Xr.detachEvent("onpropertychange",mm),Zr=Xr=null)}function mm(e){if(e.propertyName==="value"&&ci(Zr)){var t=[];cm(t,Zr,e,Sd(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 ci(Zr)}function g0(e,t){if(e==="click")return ci(t)}function h0(e,t){if(e==="input"||e==="change")return ci(t)}function v0(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var Oa=typeof Object.is=="function"?Object.is:v0;function Jr(e,t){if(Oa(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(!ad.call(t,r)||!Oa(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=Go();t instanceof e.HTMLIFrameElement;){try{var a=typeof t.contentWindow.location.href=="string"}catch{a=!1}if(a)e=t.contentWindow;else break;t=Go(e.document)}return t}function Hd(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&&Hd(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,Gd=null,eo=null,Kd=!1;function ym(e,t,a){var n=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;Kd||Vs==null||Vs!==Go(n)||(n=Vs,"selectionStart"in n&&Hd(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=mi(Gd,"onSelect"),0<n.length&&(t=new Md("onSelect","select",null,t,a),e.push({event:t,listeners:n}),t.target=Vs)))}function ui(e,t){var a={};return a[e.toLowerCase()]=t.toLowerCase(),a["Webkit"+e]="webkit"+t,a["Moz"+e]="moz"+t,a}var Ws={animationend:ui("Animation","AnimationEnd"),animationiteration:ui("Animation","AnimationIteration"),animationstart:ui("Animation","AnimationStart"),transitionend:ui("Transition","TransitionEnd")},Yd={},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 pi(e){if(Yd[e])return Yd[e];if(!Ws[e])return e;var t=Ws[e],a;for(a in t)if(t.hasOwnProperty(a)&&a in xm)return Yd[e]=t[a];return e}var wm=pi("animationend"),km=pi("animationiteration"),Nm=pi("animationstart"),Sm=pi("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 Qd=0;Qd<Em.length;Qd++){var Xd=Em[Qd],x0=Xd.toLowerCase(),w0=Xd[0].toUpperCase()+Xd.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(Qo)throw e=Td,Qo=!1,Td=null,e}function it(e,t){var a=t[rc];a===void 0&&(a=t[rc]=new Set);var n=e+"__bubble";a.has(n)||(Pm(t,e,2,!1),a.add(n))}function Zd(e,t,a){var n=0;t&&(n|=4),Pm(a,e,n,t)}var fi="_reactListening"+Math.random().toString(36).slice(2);function ao(e){if(!e[fi]){e[fi]=!0,cf.forEach(function(a){a!=="selectionchange"&&(k0.has(a)||Zd(a,!1,e),Zd(a,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[fi]||(t[fi]=!0,Zd("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=Dd}a=r.bind(null,t,a,e),r=void 0,!$d||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 Jd(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=Sd(a),p=[];e:{var f=Cm.get(e);if(f!==void 0){var v=Md,x=e;switch(e){case"keypress":if(ii(a)===0)break e;case"keydown":case"keyup":v=Zw;break;case"focusin":x="focus",v=Bd;break;case"focusout":x="blur",v=Bd;break;case"beforeblur":case"afterblur":v=Bd;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!==Nd&&(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"&&bd(f,"number",f.value)}switch(C=c?Ks(c):window,e){case"focusin":(dm(C)||C.contentEditable==="true")&&(Vs=C,Gd=c,eo=null);break;case"focusout":eo=Gd=Vs=null;break;case"mousedown":Kd=!0;break;case"contextmenu":case"mouseup":case"dragend":Kd=!1,ym(p,a,u);break;case"selectionchange":if(y0)break;case"keydown":case"keyup":ym(p,a,u)}var E;if(qd)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,Ld="value"in Fn?Fn.value:Fn.textContent,qs=!0)),C=mi(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=mi(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 mi(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 gi(e,t,a){if(t=Im(t),Im(e)!==t&&a)throw Error(re(425))}function hi(){}var ec=null,tc=null;function ac(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 nc=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)}:nc;function $0(e){setTimeout(function(){throw e})}function sc(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),Ka="__reactFiber$"+Gs,so="__reactProps$"+Gs,ln="__reactContainer$"+Gs,rc="__reactEvents$"+Gs,T0="__reactListeners$"+Gs,P0="__reactHandles$"+Gs;function fs(e){var t=e[Ka];if(t)return t;for(var a=e.parentNode;a;){if(t=a[ln]||a[Ka]){if(a=t.alternate,t.child!==null||a!==null&&a.child!==null)for(e=Am(e);e!==null;){if(a=e[Ka])return a;e=Am(e)}return t}e=a,a=e.parentNode}return null}function ro(e){return e=e[Ka]||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 vi(e){return e[so]||null}var oc=[],Ys=-1;function qn(e){return{current:e}}function lt(e){0>Ys||(e.current=oc[Ys],oc[Ys]=null,Ys--)}function ot(e,t){Ys++,oc[Ys]=e.current,e.current=t}var Vn={},Ht=qn(Vn),sa=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 ra(e){return e=e.childContextTypes,e!=null}function bi(){lt(sa),lt(Ht)}function jm(e,t,a){if(Ht.current!==Vn)throw Error(re(168));ot(Ht,t),ot(sa,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 mt({},a,n)}function yi(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Vn,ms=Ht.current,ot(Ht,e),ot(sa,sa.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(sa),lt(Ht),ot(Ht,e)):lt(sa),ot(sa,a)}var dn=null,xi=!1,ic=!1;function Lm(e){dn===null?dn=[e]:dn.push(e)}function _0(e){xi=!0,Lm(e)}function Wn(){if(!ic&&dn!==null){ic=!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,xi=!1}catch(r){throw dn!==null&&(dn=dn.slice(e+1)),zf(Pd,Wn),r}finally{Xe=t,ic=!1}}return null}var Xs=[],Zs=0,wi=null,ki=0,Sa=[],Ca=0,gs=null,cn=1,un="";function hs(e,t){Xs[Zs++]=ki,Xs[Zs++]=wi,wi=e,ki=t}function Mm(e,t,a){Sa[Ca++]=cn,Sa[Ca++]=un,Sa[Ca++]=gs,gs=e;var n=cn;e=un;var r=32-Da(n)-1;n&=~(1<<r),a+=1;var s=32-Da(t)+r;if(30<s){var o=r-r%5;s=(n&(1<<o)-1).toString(32),n>>=o,r-=o,cn=1<<32-Da(t)+r|a<<r|n,un=s+e}else cn=1<<s|a<<r|n,un=e}function lc(e){e.return!==null&&(hs(e,1),Mm(e,1,0))}function dc(e){for(;e===wi;)wi=Xs[--Zs],Xs[Zs]=null,ki=Xs[--Zs],Xs[Zs]=null;for(;e===gs;)gs=Sa[--Ca],Sa[Ca]=null,un=Sa[--Ca],Sa[Ca]=null,cn=Sa[--Ca],Sa[Ca]=null}var ga=null,ha=null,ut=!1,La=null;function zm(e,t){var a=Pa(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,ga=e,ha=Un(t.firstChild),!0):!1;case 6:return t=e.pendingProps===""||t.nodeType!==3?null:t,t!==null?(e.stateNode=t,ga=e,ha=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=Pa(18,null,null,0),a.stateNode=t,a.return=e,e.child=a,ga=e,ha=null,!0):!1;default:return!1}}function cc(e){return(e.mode&1)!==0&&(e.flags&128)===0}function uc(e){if(ut){var t=ha;if(t){var a=t;if(!Fm(e,t)){if(cc(e))throw Error(re(418));t=Un(a.nextSibling);var n=ga;t&&Fm(e,t)?zm(n,a):(e.flags=e.flags&-4097|2,ut=!1,ga=e)}}else{if(cc(e))throw Error(re(418));e.flags=e.flags&-4097|2,ut=!1,ga=e}}}function Bm(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13;)e=e.return;ga=e}function Ni(e){if(e!==ga)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"&&!ac(e.type,e.memoizedProps)),t&&(t=ha)){if(cc(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){ha=Un(e.nextSibling);break e}t--}else a!=="$"&&a!=="$!"&&a!=="$?"||t++}e=e.nextSibling}ha=null}}else ha=ga?Un(e.stateNode.nextSibling):null;return!0}function Um(){for(var e=ha;e;)e=Un(e.nextSibling)}function Js(){ha=ga=null,ut=!1}function pc(e){La===null?La=[e]:La.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 Si(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=nu(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=Ki(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=su(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=nu(""+d,g.mode,h),d.return=g,d;if(typeof d=="object"&&d!==null){switch(d.$$typeof){case Wo:return h=Ki(d.type,d.key,d.props,null,g.mode,h),h.ref=oo(g,null,d),h.return=g,h;case Os:return d=su(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;Si(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 Wo: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);Si(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 Wo: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);Si(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 Wo: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=Ki(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=su(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);Si(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=nu(h,g.mode,y),d.return=g,g=d),o(g)):a(g,d)}return k}var er=Vm(!0),Wm=Vm(!1),Ci=qn(null),Ei=null,tr=null,fc=null;function mc(){fc=tr=Ei=null}function gc(e){var t=Ci.current;lt(Ci),e._currentValue=t}function hc(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){Ei=e,fc=tr=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(oa=!0),e.firstContext=null)}function Ea(e){var t=e._currentValue;if(fc!==e)if(e={context:e,memoizedValue:t,next:null},tr===null){if(Ei===null)throw Error(re(308));tr=e,Ei.dependencies={lanes:0,firstContext:e}}else tr=tr.next=e;return t}var vs=null;function vc(e){vs===null?vs=[e]:vs.push(e)}function Hm(e,t,a,n){var r=t.interleaved;return r===null?(a.next=a,vc(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 bc(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,Ue&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,vc(n)):(t.next=r.next,r.next=t),n.interleaved=t,pn(e,a)}function $i(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,Rd(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 Ti(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=mt({},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={},Ya=qn(io),lo=qn(io),co=qn(io);function bs(e){if(e===io)throw Error(re(174));return e}function yc(e,t){switch(ot(co,t),ot(lo,e),ot(Ya,io),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:xd(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=xd(t,e)}lt(Ya),ot(Ya,t)}function nr(){lt(Ya),lt(lo),lt(co)}function Qm(e){bs(co.current);var t=bs(Ya.current),a=xd(t,e.type);t!==a&&(ot(lo,e),ot(Ya,a))}function xc(e){lo.current===e&&(lt(Ya),lt(lo))}var gt=qn(0);function Pi(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 wc=[];function kc(){for(var e=0;e<wc.length;e++)wc[e]._workInProgressVersionPrimary=null;wc.length=0}var _i=on.ReactCurrentDispatcher,Nc=on.ReactCurrentBatchConfig,ys=0,ht=null,It=null,Lt=null,Ii=!1,uo=!1,po=0,R0=0;function Gt(){throw Error(re(321))}function Sc(e,t){if(t===null)return!1;for(var a=0;a<t.length&&a<e.length;a++)if(!Oa(e[a],t[a]))return!1;return!0}function Cc(e,t,a,n,r,s){if(ys=s,ht=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,_i.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,_i.current=M0,e=a(n,r)}while(uo)}if(_i.current=ji,t=It!==null&&It.next!==null,ys=0,Lt=It=ht=null,Ii=!1,t)throw Error(re(300));return e}function Ec(){var e=po!==0;return po=0,e}function Qa(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return Lt===null?ht.memoizedState=Lt=e:Lt=Lt.next=e,Lt}function $a(){if(It===null){var e=ht.alternate;e=e!==null?e.memoizedState:null}else e=It.next;var t=Lt===null?ht.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?ht.memoizedState=Lt=e:Lt=Lt.next=e}return Lt}function fo(e,t){return typeof t=="function"?t(e):t}function $c(e){var t=$a(),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,ht.lanes|=u,xs|=u}c=c.next}while(c!==null&&c!==s);l===null?o=n:l.next=i,Oa(n,t.memoizedState)||(oa=!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,ht.lanes|=s,xs|=s,r=r.next;while(r!==e)}else r===null&&(a.lanes=0);return[t.memoizedState,a.dispatch]}function Tc(e){var t=$a(),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);Oa(s,t.memoizedState)||(oa=!0),t.memoizedState=s,t.baseQueue===null&&(t.baseState=s),a.lastRenderedState=s}return[s,n]}function Xm(){}function Zm(e,t){var a=ht,n=$a(),r=t(),s=!Oa(n.memoizedState,r);if(s&&(n.memoizedState=r,oa=!0),n=n.queue,Pc(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=ht.updateQueue,t===null?(t={lastEffect:null,stores:null},ht.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!Oa(e,a)}catch{return!0}}function ng(e){var t=pn(e,1);t!==null&&Ba(t,e,1,-1)}function sg(e){var t=Qa();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,ht,e),[t.memoizedState,e]}function mo(e,t,a,n){return e={tag:e,create:t,destroy:a,deps:n,next:null},t=ht.updateQueue,t===null?(t={lastEffect:null,stores:null},ht.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 $a().memoizedState}function Ri(e,t,a,n){var r=Qa();ht.flags|=e,r.memoizedState=mo(1|t,a,void 0,n===void 0?null:n)}function Ai(e,t,a,n){var r=$a();n=n===void 0?null:n;var s=void 0;if(It!==null){var o=It.memoizedState;if(s=o.destroy,n!==null&&Sc(n,o.deps)){r.memoizedState=mo(t,a,s,n);return}}ht.flags|=e,r.memoizedState=mo(1|t,a,s,n)}function og(e,t){return Ri(8390656,8,e,t)}function Pc(e,t){return Ai(2048,8,e,t)}function ig(e,t){return Ai(4,2,e,t)}function lg(e,t){return Ai(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,Ai(4,4,dg.bind(null,t,e),a)}function _c(){}function ug(e,t){var a=$a();t=t===void 0?null:t;var n=a.memoizedState;return n!==null&&t!==null&&Sc(t,n[1])?n[0]:(a.memoizedState=[e,t],e)}function pg(e,t){var a=$a();t=t===void 0?null:t;var n=a.memoizedState;return n!==null&&t!==null&&Sc(t,n[1])?n[0]:(e=e(),a.memoizedState=[e,t],e)}function fg(e,t,a){return ys&21?(Oa(a,t)||(a=qf(),ht.lanes|=a,xs|=a,e.baseState=!0),t):(e.baseState&&(e.baseState=!1,oa=!0),e.memoizedState=a)}function A0(e,t){var a=Xe;Xe=a!==0&&4>a?a:4,e(!0);var n=Nc.transition;Nc.transition={};try{e(!1),t()}finally{Xe=a,Nc.transition=n}}function mg(){return $a().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();Ba(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,Oa(i,o)){var l=t.interleaved;l===null?(r.next=r,vc(t)):(r.next=l.next,l.next=r),t.interleaved=r;return}}catch{}finally{}a=Hm(e,t,r,n),a!==null&&(r=ea(),Ba(a,e,n,r),vg(a,t,n))}}function gg(e){var t=e.alternate;return e===ht||t!==null&&t===ht}function hg(e,t){uo=Ii=!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,Rd(e,a)}}var ji={readContext:Ea,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:Ea,useCallback:function(e,t){return Qa().memoizedState=[e,t===void 0?null:t],e},useContext:Ea,useEffect:og,useImperativeHandle:function(e,t,a){return a=a!=null?a.concat([e]):null,Ri(4194308,4,dg.bind(null,t,e),a)},useLayoutEffect:function(e,t){return Ri(4194308,4,e,t)},useInsertionEffect:function(e,t){return Ri(4,2,e,t)},useMemo:function(e,t){var a=Qa();return t=t===void 0?null:t,e=e(),a.memoizedState=[e,t],e},useReducer:function(e,t,a){var n=Qa();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,ht,e),[n.memoizedState,e]},useRef:function(e){var t=Qa();return e={current:e},t.memoizedState=e},useState:sg,useDebugValue:_c,useDeferredValue:function(e){return Qa().memoizedState=e},useTransition:function(){var e=sg(!1),t=e[0];return e=A0.bind(null,e[1]),Qa().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,a){var n=ht,r=Qa();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=Qa(),t=Mt.identifierPrefix;if(ut){var a=un,n=cn;a=(n&~(1<<32-Da(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:Ea,useCallback:ug,useContext:Ea,useEffect:Pc,useImperativeHandle:cg,useInsertionEffect:ig,useLayoutEffect:lg,useMemo:pg,useReducer:$c,useRef:rg,useState:function(){return $c(fo)},useDebugValue:_c,useDeferredValue:function(e){var t=$a();return fg(t,It.memoizedState,e)},useTransition:function(){var e=$c(fo)[0],t=$a().memoizedState;return[e,t]},useMutableSource:Xm,useSyncExternalStore:Zm,useId:mg,unstable_isNewReconciler:!1},M0={readContext:Ea,useCallback:ug,useContext:Ea,useEffect:Pc,useImperativeHandle:cg,useInsertionEffect:ig,useLayoutEffect:lg,useMemo:pg,useReducer:Tc,useRef:rg,useState:function(){return Tc(fo)},useDebugValue:_c,useDeferredValue:function(e){var t=$a();return It===null?t.memoizedState=e:fg(t,It.memoizedState,e)},useTransition:function(){var e=Tc(fo)[0],t=$a().memoizedState;return[e,t]},useMutableSource:Xm,useSyncExternalStore:Zm,useId:mg,unstable_isNewReconciler:!1};function Ma(e,t){if(e&&e.defaultProps){t=mt({},t),e=e.defaultProps;for(var a in e)t[a]===void 0&&(t[a]=e[a]);return t}return t}function Ic(e,t,a,n){t=e.memoizedState,a=a(n,t),a=a==null?t:mt({},t,a),e.memoizedState=a,e.lanes===0&&(e.updateQueue.baseState=a)}var Di={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&&(Ba(t,e,r,n),$i(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&&(Ba(t,e,r,n),$i(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&&(Ba(t,e,n,a),$i(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=Ea(s):(r=ra(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=Di,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&&Di.enqueueReplaceState(t,t.state,null)}function Rc(e,t,a,n){var r=e.stateNode;r.props=a,r.state=e.memoizedState,r.refs={},bc(e);var s=t.contextType;typeof s=="object"&&s!==null?r.context=Ea(s):(s=ra(t)?ms:Ht.current,r.context=Qs(e,s)),r.state=e.memoizedState,s=t.getDerivedStateFromProps,typeof s=="function"&&(Ic(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&&Di.enqueueReplaceState(r,r.state,null),Ti(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=`
|
|
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{bd=!1,Error.prepareStackTrace=a}return(e=e?e.displayName||e.name:"")?zr(e):""}function hw(e){switch(e.tag){case 5:return zr(e.type);case 16:return zr("Lazy");case 13:return zr("Suspense");case 19:return zr("SuspenseList");case 0:case 2:case 15:return e=yd(e.type,!1),e;case 11:return e=yd(e.type.render,!1),e;case 1:return e=yd(e.type,!0),e;default:return""}}function xd(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 Us:return"Fragment";case Bs:return"Portal";case pd:return"Profiler";case ud:return"StrictMode";case md:return"Suspense";case gd:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case yf:return(e.displayName||"Context")+".Consumer";case bf:return(e._context.displayName||"Context")+".Provider";case fd:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case hd:return t=e.displayName||null,t!==null?t:xd(e.type)||"Memo";case Bn:t=e._payload,e=e._init;try{return xd(e(t))}catch{}}return null}function vw(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 xd(t);case 8:return t===ud?"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 Un(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function kf(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function bw(e){var t=kf(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 Xo(e){e._valueTracker||(e._valueTracker=bw(e))}function Nf(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var a=t.getValue(),n="";return e&&(n=kf(e)?e.checked?"true":"false":e.value),e=n,e!==a?(t.setValue(e),!0):!1}function Zo(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 wd(e,t){var a=t.checked;return ft({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:a??e._wrapperState.initialChecked})}function Sf(e,t){var a=t.defaultValue==null?"":t.defaultValue,n=t.checked!=null?t.checked:t.defaultChecked;a=Un(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 Cf(e,t){t=t.checked,t!=null&&cd(e,"checked",t,!1)}function kd(e,t){Cf(e,t);var a=Un(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")?Nd(e,t.type,a):t.hasOwnProperty("defaultValue")&&Nd(e,t.type,Un(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Ef(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 Nd(e,t,a){(t!=="number"||Zo(e.ownerDocument)!==e)&&(a==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+a&&(e.defaultValue=""+a))}var Fr=Array.isArray;function qs(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=""+Un(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 Sd(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(oe(91));return ft({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function $f(e,t){var a=t.value;if(a==null){if(a=t.children,t=t.defaultValue,a!=null){if(t!=null)throw Error(oe(92));if(Fr(a)){if(1<a.length)throw Error(oe(93));a=a[0]}t=a}t==null&&(t=""),a=t}e._wrapperState={initialValue:Un(a)}}function Tf(e,t){var a=Un(t.value),n=Un(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 Pf(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!==""&&t!==null&&(e.value=t)}function _f(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 Cd(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?_f(t):e==="http://www.w3.org/2000/svg"&&t==="foreignObject"?"http://www.w3.org/1999/xhtml":e}var Jo,If=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(Jo=Jo||document.createElement("div"),Jo.innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=Jo.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Br(e,t){if(t){var a=e.firstChild;if(a&&a===e.lastChild&&a.nodeType===3){a.nodeValue=t;return}}e.textContent=t}var Ur={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},yw=["Webkit","ms","Moz","O"];Object.keys(Ur).forEach(function(e){yw.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Ur[t]=Ur[e]})});function Rf(e,t,a){return t==null||typeof t=="boolean"||t===""?"":a||typeof t!="number"||t===0||Ur.hasOwnProperty(e)&&Ur[e]?(""+t).trim():t+"px"}function Af(e,t){e=e.style;for(var a in t)if(t.hasOwnProperty(a)){var n=a.indexOf("--")===0,r=Rf(a,t[a],n);a==="float"&&(a="cssFloat"),n?e.setProperty(a,r):e[a]=r}}var xw=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 Ed(e,t){if(t){if(xw[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(oe(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(oe(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(oe(61))}if(t.style!=null&&typeof t.style!="object")throw Error(oe(62))}}function $d(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 Td=null;function Pd(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var _d=null,Vs=null,Ws=null;function jf(e){if(e=uo(e)){if(typeof _d!="function")throw Error(oe(280));var t=e.stateNode;t&&(t=ki(t),_d(e.stateNode,e.type,t))}}function Df(e){Vs?Ws?Ws.push(e):Ws=[e]:Vs=e}function Of(){if(Vs){var e=Vs,t=Ws;if(Ws=Vs=null,jf(e),t)for(e=0;e<t.length;e++)jf(t[e])}}function Lf(e,t){return e(t)}function Mf(){}var Id=!1;function zf(e,t,a){if(Id)return e(t,a);Id=!0;try{return Lf(e,t,a)}finally{Id=!1,(Vs!==null||Ws!==null)&&(Mf(),Of())}}function qr(e,t){var a=e.stateNode;if(a===null)return null;var n=ki(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(oe(231,t,typeof a));return a}var Rd=!1;if(cn)try{var Vr={};Object.defineProperty(Vr,"passive",{get:function(){Rd=!0}}),window.addEventListener("test",Vr,Vr),window.removeEventListener("test",Vr,Vr)}catch{Rd=!1}function ww(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 Wr=!1,ei=null,ti=!1,Ad=null,kw={onError:function(e){Wr=!0,ei=e}};function Nw(e,t,a,n,r,s,o,i,l){Wr=!1,ei=null,ww.apply(kw,arguments)}function Sw(e,t,a,n,r,s,o,i,l){if(Nw.apply(this,arguments),Wr){if(Wr){var c=ei;Wr=!1,ei=null}else throw Error(oe(198));ti||(ti=!0,Ad=c)}}function bs(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 Ff(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 Bf(e){if(bs(e)!==e)throw Error(oe(188))}function Cw(e){var t=e.alternate;if(!t){if(t=bs(e),t===null)throw Error(oe(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 Bf(r),e;if(s===n)return Bf(r),t;s=s.sibling}throw Error(oe(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(oe(189))}}if(a.alternate!==n)throw Error(oe(190))}if(a.tag!==3)throw Error(oe(188));return a.stateNode.current===a?e:t}function Uf(e){return e=Cw(e),e!==null?qf(e):null}function qf(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;){var t=qf(e);if(t!==null)return t;e=e.sibling}return null}var Vf=va.unstable_scheduleCallback,Wf=va.unstable_cancelCallback,Ew=va.unstable_shouldYield,$w=va.unstable_requestPaint,kt=va.unstable_now,Tw=va.unstable_getCurrentPriorityLevel,jd=va.unstable_ImmediatePriority,Hf=va.unstable_UserBlockingPriority,ai=va.unstable_NormalPriority,Pw=va.unstable_LowPriority,Gf=va.unstable_IdlePriority,ni=null,Za=null;function _w(e){if(Za&&typeof Za.onCommitFiberRoot=="function")try{Za.onCommitFiberRoot(ni,e,void 0,(e.current.flags&128)===128)}catch{}}var Fa=Math.clz32?Math.clz32:Aw,Iw=Math.log,Rw=Math.LN2;function Aw(e){return e>>>=0,e===0?32:31-(Iw(e)/Rw|0)|0}var si=64,ri=4194304;function Hr(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 oi(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=Hr(i):(s&=o,s!==0&&(n=Hr(s)))}else o=a&~r,o!==0?n=Hr(o):s!==0&&(n=Hr(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-Fa(t),r=1<<a,n|=e[a],t&=~r;return n}function jw(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 Dw(e,t){for(var a=e.suspendedLanes,n=e.pingedLanes,r=e.expirationTimes,s=e.pendingLanes;0<s;){var o=31-Fa(s),i=1<<o,l=r[o];l===-1?(!(i&a)||i&n)&&(r[o]=jw(i,t)):l<=t&&(e.expiredLanes|=i),s&=~i}}function Dd(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?1073741824:0}function Kf(){var e=si;return si<<=1,!(si&4194240)&&(si=64),e}function Od(e){for(var t=[],a=0;31>a;a++)t.push(e);return t}function Gr(e,t,a){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Fa(t),e[t]=a}function Ow(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-Fa(a),s=1<<r;t[r]=0,n[r]=-1,e[r]=-1,a&=~s}}function Ld(e,t){var a=e.entangledLanes|=t;for(e=e.entanglements;a;){var n=31-Fa(a),r=1<<n;r&t|e[n]&t&&(e[n]|=t),a&=~r}}var Qe=0;function Yf(e){return e&=-e,1<e?4<e?e&268435455?16:536870912:4:1}var Qf,Md,Xf,Zf,Jf,zd=!1,ii=[],qn=null,Vn=null,Wn=null,Kr=new Map,Yr=new Map,Hn=[],Lw="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 em(e,t){switch(e){case"focusin":case"focusout":qn=null;break;case"dragenter":case"dragleave":Vn=null;break;case"mouseover":case"mouseout":Wn=null;break;case"pointerover":case"pointerout":Kr.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Yr.delete(t.pointerId)}}function Qr(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=uo(t),t!==null&&Md(t)),e):(e.eventSystemFlags|=n,t=e.targetContainers,r!==null&&t.indexOf(r)===-1&&t.push(r),e)}function Mw(e,t,a,n,r){switch(t){case"focusin":return qn=Qr(qn,e,t,a,n,r),!0;case"dragenter":return Vn=Qr(Vn,e,t,a,n,r),!0;case"mouseover":return Wn=Qr(Wn,e,t,a,n,r),!0;case"pointerover":var s=r.pointerId;return Kr.set(s,Qr(Kr.get(s)||null,e,t,a,n,r)),!0;case"gotpointercapture":return s=r.pointerId,Yr.set(s,Qr(Yr.get(s)||null,e,t,a,n,r)),!0}return!1}function tm(e){var t=ys(e.target);if(t!==null){var a=bs(t);if(a!==null){if(t=a.tag,t===13){if(t=Ff(a),t!==null){e.blockedOn=t,Jf(e.priority,function(){Xf(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 li(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var a=Bd(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(a===null){a=e.nativeEvent;var n=new a.constructor(a.type,a);Td=n,a.target.dispatchEvent(n),Td=null}else return t=uo(a),t!==null&&Md(t),e.blockedOn=a,!1;t.shift()}return!0}function am(e,t,a){li(e)&&a.delete(t)}function zw(){zd=!1,qn!==null&&li(qn)&&(qn=null),Vn!==null&&li(Vn)&&(Vn=null),Wn!==null&&li(Wn)&&(Wn=null),Kr.forEach(am),Yr.forEach(am)}function Xr(e,t){e.blockedOn===t&&(e.blockedOn=null,zd||(zd=!0,va.unstable_scheduleCallback(va.unstable_NormalPriority,zw)))}function Zr(e){function t(r){return Xr(r,e)}if(0<ii.length){Xr(ii[0],e);for(var a=1;a<ii.length;a++){var n=ii[a];n.blockedOn===e&&(n.blockedOn=null)}}for(qn!==null&&Xr(qn,e),Vn!==null&&Xr(Vn,e),Wn!==null&&Xr(Wn,e),Kr.forEach(t),Yr.forEach(t),a=0;a<Hn.length;a++)n=Hn[a],n.blockedOn===e&&(n.blockedOn=null);for(;0<Hn.length&&(a=Hn[0],a.blockedOn===null);)tm(a),a.blockedOn===null&&Hn.shift()}var Hs=un.ReactCurrentBatchConfig,di=!0;function Fw(e,t,a,n){var r=Qe,s=Hs.transition;Hs.transition=null;try{Qe=1,Fd(e,t,a,n)}finally{Qe=r,Hs.transition=s}}function Bw(e,t,a,n){var r=Qe,s=Hs.transition;Hs.transition=null;try{Qe=4,Fd(e,t,a,n)}finally{Qe=r,Hs.transition=s}}function Fd(e,t,a,n){if(di){var r=Bd(e,t,a,n);if(r===null)sc(e,t,n,ci,a),em(e,n);else if(Mw(r,e,t,a,n))n.stopPropagation();else if(em(e,n),t&4&&-1<Lw.indexOf(e)){for(;r!==null;){var s=uo(r);if(s!==null&&Qf(s),s=Bd(e,t,a,n),s===null&&sc(e,t,n,ci,a),s===r)break;r=s}r!==null&&n.stopPropagation()}else sc(e,t,n,null,a)}}var ci=null;function Bd(e,t,a,n){if(ci=null,e=Pd(n),e=ys(e),e!==null)if(t=bs(e),t===null)e=null;else if(a=t.tag,a===13){if(e=Ff(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 ci=e,null}function nm(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(Tw()){case jd:return 1;case Hf:return 4;case ai:case Pw:return 16;case Gf:return 536870912;default:return 16}default:return 16}}var Gn=null,Ud=null,ui=null;function sm(){if(ui)return ui;var e,t=Ud,a=t.length,n,r="value"in Gn?Gn.value:Gn.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 ui=r.slice(e,1<n?1-n:void 0)}function pi(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 fi(){return!0}function rm(){return!1}function ba(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)?fi:rm,this.isPropagationStopped=rm,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=fi)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():typeof a.cancelBubble!="unknown"&&(a.cancelBubble=!0),this.isPropagationStopped=fi)},persist:function(){},isPersistent:fi}),t}var Gs={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},qd=ba(Gs),Jr=ft({},Gs,{view:0,detail:0}),Uw=ba(Jr),Vd,Wd,eo,mi=ft({},Jr,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Gd,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!==eo&&(eo&&e.type==="mousemove"?(Vd=e.screenX-eo.screenX,Wd=e.screenY-eo.screenY):Wd=Vd=0,eo=e),Vd)},movementY:function(e){return"movementY"in e?e.movementY:Wd}}),om=ba(mi),qw=ft({},mi,{dataTransfer:0}),Vw=ba(qw),Ww=ft({},Jr,{relatedTarget:0}),Hd=ba(Ww),Hw=ft({},Gs,{animationName:0,elapsedTime:0,pseudoElement:0}),Gw=ba(Hw),Kw=ft({},Gs,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),Yw=ba(Kw),Qw=ft({},Gs,{data:0}),im=ba(Qw),Xw={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},Zw={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"},Jw={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function e0(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):(e=Jw[e])?!!t[e]:!1}function Gd(){return e0}var t0=ft({},Jr,{key:function(e){if(e.key){var t=Xw[e.key]||e.key;if(t!=="Unidentified")return t}return e.type==="keypress"?(e=pi(e),e===13?"Enter":String.fromCharCode(e)):e.type==="keydown"||e.type==="keyup"?Zw[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Gd,charCode:function(e){return e.type==="keypress"?pi(e):0},keyCode:function(e){return e.type==="keydown"||e.type==="keyup"?e.keyCode:0},which:function(e){return e.type==="keypress"?pi(e):e.type==="keydown"||e.type==="keyup"?e.keyCode:0}}),a0=ba(t0),n0=ft({},mi,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),lm=ba(n0),s0=ft({},Jr,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Gd}),r0=ba(s0),o0=ft({},Gs,{propertyName:0,elapsedTime:0,pseudoElement:0}),i0=ba(o0),l0=ft({},mi,{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}),d0=ba(l0),c0=[9,13,27,32],Kd=cn&&"CompositionEvent"in window,to=null;cn&&"documentMode"in document&&(to=document.documentMode);var u0=cn&&"TextEvent"in window&&!to,dm=cn&&(!Kd||to&&8<to&&11>=to),cm=" ",um=!1;function pm(e,t){switch(e){case"keyup":return c0.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function fm(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Ks=!1;function p0(e,t){switch(e){case"compositionend":return fm(t);case"keypress":return t.which!==32?null:(um=!0,cm);case"textInput":return e=t.data,e===cm&&um?null:e;default:return null}}function f0(e,t){if(Ks)return e==="compositionend"||!Kd&&pm(e,t)?(e=sm(),ui=Ud=Gn=null,Ks=!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 dm&&t.locale!=="ko"?null:t.data;default:return null}}var m0={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 mm(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t==="input"?!!m0[e.type]:t==="textarea"}function gm(e,t,a,n){Df(n),t=yi(t,"onChange"),0<t.length&&(a=new qd("onChange","change",null,a,n),e.push({event:a,listeners:t}))}var ao=null,no=null;function g0(e){Am(e,0)}function gi(e){var t=Js(e);if(Nf(t))return e}function h0(e,t){if(e==="change")return t}var hm=!1;if(cn){var Yd;if(cn){var Qd="oninput"in document;if(!Qd){var vm=document.createElement("div");vm.setAttribute("oninput","return;"),Qd=typeof vm.oninput=="function"}Yd=Qd}else Yd=!1;hm=Yd&&(!document.documentMode||9<document.documentMode)}function bm(){ao&&(ao.detachEvent("onpropertychange",ym),no=ao=null)}function ym(e){if(e.propertyName==="value"&&gi(no)){var t=[];gm(t,no,e,Pd(e)),zf(g0,t)}}function v0(e,t,a){e==="focusin"?(bm(),ao=t,no=a,ao.attachEvent("onpropertychange",ym)):e==="focusout"&&bm()}function b0(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")return gi(no)}function y0(e,t){if(e==="click")return gi(t)}function x0(e,t){if(e==="input"||e==="change")return gi(t)}function w0(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var Ba=typeof Object.is=="function"?Object.is:w0;function so(e,t){if(Ba(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(!id.call(t,r)||!Ba(e[r],t[r]))return!1}return!0}function xm(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function wm(e,t){var a=xm(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=xm(a)}}function km(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?km(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Nm(){for(var e=window,t=Zo();t instanceof e.HTMLIFrameElement;){try{var a=typeof t.contentWindow.location.href=="string"}catch{a=!1}if(a)e=t.contentWindow;else break;t=Zo(e.document)}return t}function Xd(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 k0(e){var t=Nm(),a=e.focusedElem,n=e.selectionRange;if(t!==a&&a&&a.ownerDocument&&km(a.ownerDocument.documentElement,a)){if(n!==null&&Xd(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=wm(a,s);var o=wm(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 N0=cn&&"documentMode"in document&&11>=document.documentMode,Ys=null,Zd=null,ro=null,Jd=!1;function Sm(e,t,a){var n=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;Jd||Ys==null||Ys!==Zo(n)||(n=Ys,"selectionStart"in n&&Xd(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}),ro&&so(ro,n)||(ro=n,n=yi(Zd,"onSelect"),0<n.length&&(t=new qd("onSelect","select",null,t,a),e.push({event:t,listeners:n}),t.target=Ys)))}function hi(e,t){var a={};return a[e.toLowerCase()]=t.toLowerCase(),a["Webkit"+e]="webkit"+t,a["Moz"+e]="moz"+t,a}var Qs={animationend:hi("Animation","AnimationEnd"),animationiteration:hi("Animation","AnimationIteration"),animationstart:hi("Animation","AnimationStart"),transitionend:hi("Transition","TransitionEnd")},ec={},Cm={};cn&&(Cm=document.createElement("div").style,"AnimationEvent"in window||(delete Qs.animationend.animation,delete Qs.animationiteration.animation,delete Qs.animationstart.animation),"TransitionEvent"in window||delete Qs.transitionend.transition);function vi(e){if(ec[e])return ec[e];if(!Qs[e])return e;var t=Qs[e],a;for(a in t)if(t.hasOwnProperty(a)&&a in Cm)return ec[e]=t[a];return e}var Em=vi("animationend"),$m=vi("animationiteration"),Tm=vi("animationstart"),Pm=vi("transitionend"),_m=new Map,Im="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 Kn(e,t){_m.set(e,t),vs(t,[e])}for(var tc=0;tc<Im.length;tc++){var ac=Im[tc],S0=ac.toLowerCase(),C0=ac[0].toUpperCase()+ac.slice(1);Kn(S0,"on"+C0)}Kn(Em,"onAnimationEnd"),Kn($m,"onAnimationIteration"),Kn(Tm,"onAnimationStart"),Kn("dblclick","onDoubleClick"),Kn("focusin","onFocus"),Kn("focusout","onBlur"),Kn(Pm,"onTransitionEnd"),Fs("onMouseEnter",["mouseout","mouseover"]),Fs("onMouseLeave",["mouseout","mouseover"]),Fs("onPointerEnter",["pointerout","pointerover"]),Fs("onPointerLeave",["pointerout","pointerover"]),vs("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),vs("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),vs("onBeforeInput",["compositionend","keypress","textInput","paste"]),vs("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),vs("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),vs("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var oo="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(" "),E0=new Set("cancel close invalid load scroll toggle".split(" ").concat(oo));function Rm(e,t,a){var n=e.type||"unknown-event";e.currentTarget=a,Sw(n,t,void 0,e),e.currentTarget=null}function Am(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;Rm(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;Rm(r,i,c),s=l}}}if(ti)throw e=Ad,ti=!1,Ad=null,e}function ot(e,t){var a=t[cc];a===void 0&&(a=t[cc]=new Set);var n=e+"__bubble";a.has(n)||(jm(t,e,2,!1),a.add(n))}function nc(e,t,a){var n=0;t&&(n|=4),jm(a,e,n,t)}var bi="_reactListening"+Math.random().toString(36).slice(2);function io(e){if(!e[bi]){e[bi]=!0,gf.forEach(function(a){a!=="selectionchange"&&(E0.has(a)||nc(a,!1,e),nc(a,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[bi]||(t[bi]=!0,nc("selectionchange",!1,t))}}function jm(e,t,a,n){switch(nm(t)){case 1:var r=Fw;break;case 4:r=Bw;break;default:r=Fd}a=r.bind(null,t,a,e),r=void 0,!Rd||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 sc(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=ys(i),o===null)return;if(l=o.tag,l===5||l===6){n=s=o;continue e}i=i.parentNode}}n=n.return}zf(function(){var c=s,u=Pd(a),p=[];e:{var f=_m.get(e);if(f!==void 0){var v=qd,x=e;switch(e){case"keypress":if(pi(a)===0)break e;case"keydown":case"keyup":v=a0;break;case"focusin":x="focus",v=Hd;break;case"focusout":x="blur",v=Hd;break;case"beforeblur":case"afterblur":v=Hd;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=om;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":v=Vw;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":v=r0;break;case Em:case $m:case Tm:v=Gw;break;case Pm:v=i0;break;case"scroll":v=Uw;break;case"wheel":v=d0;break;case"copy":case"cut":case"paste":v=Yw;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":v=lm}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=qr(d,g),y!=null&&b.push(lo(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!==Td&&(x=a.relatedTarget||a.fromElement)&&(ys(x)||x[pn]))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?ys(x):null,x!==null&&(k=bs(x),x!==k||x.tag!==5&&x.tag!==6)&&(x=null)):(v=null,x=c),v!==x)){if(b=om,y="onMouseLeave",g="onMouseEnter",d="mouse",(e==="pointerout"||e==="pointerover")&&(b=lm,y="onPointerLeave",g="onPointerEnter",d="pointer"),k=v==null?f:Js(v),h=x==null?f:Js(x),f=new b(y,d+"leave",v,a,u),f.target=k,f.relatedTarget=h,y=null,ys(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=Xs(h))d++;for(h=0,y=g;y;y=Xs(y))h++;for(;0<d-h;)b=Xs(b),d--;for(;0<h-d;)g=Xs(g),h--;for(;d--;){if(b===g||g!==null&&b===g.alternate)break t;b=Xs(b),g=Xs(g)}b=null}else b=null;v!==null&&Dm(p,f,v,b,!1),x!==null&&k!==null&&Dm(p,k,x,b,!0)}}e:{if(f=c?Js(c):window,v=f.nodeName&&f.nodeName.toLowerCase(),v==="select"||v==="input"&&f.type==="file")var S=h0;else if(mm(f))if(hm)S=x0;else{S=b0;var C=v0}else(v=f.nodeName)&&v.toLowerCase()==="input"&&(f.type==="checkbox"||f.type==="radio")&&(S=y0);if(S&&(S=S(e,c))){gm(p,S,a,u);break e}C&&C(e,f,c),e==="focusout"&&(C=f._wrapperState)&&C.controlled&&f.type==="number"&&Nd(f,"number",f.value)}switch(C=c?Js(c):window,e){case"focusin":(mm(C)||C.contentEditable==="true")&&(Ys=C,Zd=c,ro=null);break;case"focusout":ro=Zd=Ys=null;break;case"mousedown":Jd=!0;break;case"contextmenu":case"mouseup":case"dragend":Jd=!1,Sm(p,a,u);break;case"selectionchange":if(N0)break;case"keydown":case"keyup":Sm(p,a,u)}var E;if(Kd)e:{switch(e){case"compositionstart":var _="onCompositionStart";break e;case"compositionend":_="onCompositionEnd";break e;case"compositionupdate":_="onCompositionUpdate";break e}_=void 0}else Ks?pm(e,a)&&(_="onCompositionEnd"):e==="keydown"&&a.keyCode===229&&(_="onCompositionStart");_&&(dm&&a.locale!=="ko"&&(Ks||_!=="onCompositionStart"?_==="onCompositionEnd"&&Ks&&(E=sm()):(Gn=u,Ud="value"in Gn?Gn.value:Gn.textContent,Ks=!0)),C=yi(c,_),0<C.length&&(_=new im(_,e,null,a,u),p.push({event:_,listeners:C}),E?_.data=E:(E=fm(a),E!==null&&(_.data=E)))),(E=u0?p0(e,a):f0(e,a))&&(c=yi(c,"onBeforeInput"),0<c.length&&(u=new im("onBeforeInput","beforeinput",null,a,u),p.push({event:u,listeners:c}),u.data=E))}Am(p,t)})}function lo(e,t,a){return{instance:e,listener:t,currentTarget:a}}function yi(e,t){for(var a=t+"Capture",n=[];e!==null;){var r=e,s=r.stateNode;r.tag===5&&s!==null&&(r=s,s=qr(e,a),s!=null&&n.unshift(lo(e,s,r)),s=qr(e,t),s!=null&&n.push(lo(e,s,r))),e=e.return}return n}function Xs(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5);return e||null}function Dm(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=qr(a,s),l!=null&&o.unshift(lo(a,l,i))):r||(l=qr(a,s),l!=null&&o.push(lo(a,l,i)))),a=a.return}o.length!==0&&e.push({event:t,listeners:o})}var $0=/\r\n?/g,T0=/\u0000|\uFFFD/g;function Om(e){return(typeof e=="string"?e:""+e).replace($0,`
|
|
852
|
+
`).replace(T0,"")}function xi(e,t,a){if(t=Om(t),Om(e)!==t&&a)throw Error(oe(425))}function wi(){}var rc=null,oc=null;function ic(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 lc=typeof setTimeout=="function"?setTimeout:void 0,P0=typeof clearTimeout=="function"?clearTimeout:void 0,Lm=typeof Promise=="function"?Promise:void 0,_0=typeof queueMicrotask=="function"?queueMicrotask:typeof Lm<"u"?function(e){return Lm.resolve(null).then(e).catch(I0)}:lc;function I0(e){setTimeout(function(){throw e})}function dc(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),Zr(t);return}n--}else a!=="$"&&a!=="$?"&&a!=="$!"||n++;a=r}while(a);Zr(t)}function Yn(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 Mm(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 Zs=Math.random().toString(36).slice(2),Ja="__reactFiber$"+Zs,co="__reactProps$"+Zs,pn="__reactContainer$"+Zs,cc="__reactEvents$"+Zs,R0="__reactListeners$"+Zs,A0="__reactHandles$"+Zs;function ys(e){var t=e[Ja];if(t)return t;for(var a=e.parentNode;a;){if(t=a[pn]||a[Ja]){if(a=t.alternate,t.child!==null||a!==null&&a.child!==null)for(e=Mm(e);e!==null;){if(a=e[Ja])return a;e=Mm(e)}return t}e=a,a=e.parentNode}return null}function uo(e){return e=e[Ja]||e[pn],!e||e.tag!==5&&e.tag!==6&&e.tag!==13&&e.tag!==3?null:e}function Js(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(oe(33))}function ki(e){return e[co]||null}var uc=[],er=-1;function Qn(e){return{current:e}}function it(e){0>er||(e.current=uc[er],uc[er]=null,er--)}function nt(e,t){er++,uc[er]=e.current,e.current=t}var Xn={},Qt=Qn(Xn),ia=Qn(!1),xs=Xn;function tr(e,t){var a=e.type.contextTypes;if(!a)return Xn;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 la(e){return e=e.childContextTypes,e!=null}function Ni(){it(ia),it(Qt)}function zm(e,t,a){if(Qt.current!==Xn)throw Error(oe(168));nt(Qt,t),nt(ia,a)}function Fm(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(oe(108,vw(e)||"Unknown",r));return ft({},a,n)}function Si(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Xn,xs=Qt.current,nt(Qt,e),nt(ia,ia.current),!0}function Bm(e,t,a){var n=e.stateNode;if(!n)throw Error(oe(169));a?(e=Fm(e,t,xs),n.__reactInternalMemoizedMergedChildContext=e,it(ia),it(Qt),nt(Qt,e)):it(ia),nt(ia,a)}var fn=null,Ci=!1,pc=!1;function Um(e){fn===null?fn=[e]:fn.push(e)}function j0(e){Ci=!0,Um(e)}function Zn(){if(!pc&&fn!==null){pc=!0;var e=0,t=Qe;try{var a=fn;for(Qe=1;e<a.length;e++){var n=a[e];do n=n(!0);while(n!==null)}fn=null,Ci=!1}catch(r){throw fn!==null&&(fn=fn.slice(e+1)),Vf(jd,Zn),r}finally{Qe=t,pc=!1}}return null}var ar=[],nr=0,Ei=null,$i=0,Ta=[],Pa=0,ws=null,mn=1,gn="";function ks(e,t){ar[nr++]=$i,ar[nr++]=Ei,Ei=e,$i=t}function qm(e,t,a){Ta[Pa++]=mn,Ta[Pa++]=gn,Ta[Pa++]=ws,ws=e;var n=mn;e=gn;var r=32-Fa(n)-1;n&=~(1<<r),a+=1;var s=32-Fa(t)+r;if(30<s){var o=r-r%5;s=(n&(1<<o)-1).toString(32),n>>=o,r-=o,mn=1<<32-Fa(t)+r|a<<r|n,gn=s+e}else mn=1<<s|a<<r|n,gn=e}function fc(e){e.return!==null&&(ks(e,1),qm(e,1,0))}function mc(e){for(;e===Ei;)Ei=ar[--nr],ar[nr]=null,$i=ar[--nr],ar[nr]=null;for(;e===ws;)ws=Ta[--Pa],Ta[Pa]=null,gn=Ta[--Pa],Ta[Pa]=null,mn=Ta[--Pa],Ta[Pa]=null}var ya=null,xa=null,ct=!1,Ua=null;function Vm(e,t){var a=Aa(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 Wm(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,ya=e,xa=Yn(t.firstChild),!0):!1;case 6:return t=e.pendingProps===""||t.nodeType!==3?null:t,t!==null?(e.stateNode=t,ya=e,xa=null,!0):!1;case 13:return t=t.nodeType!==8?null:t,t!==null?(a=ws!==null?{id:mn,overflow:gn}:null,e.memoizedState={dehydrated:t,treeContext:a,retryLane:1073741824},a=Aa(18,null,null,0),a.stateNode=t,a.return=e,e.child=a,ya=e,xa=null,!0):!1;default:return!1}}function gc(e){return(e.mode&1)!==0&&(e.flags&128)===0}function hc(e){if(ct){var t=xa;if(t){var a=t;if(!Wm(e,t)){if(gc(e))throw Error(oe(418));t=Yn(a.nextSibling);var n=ya;t&&Wm(e,t)?Vm(n,a):(e.flags=e.flags&-4097|2,ct=!1,ya=e)}}else{if(gc(e))throw Error(oe(418));e.flags=e.flags&-4097|2,ct=!1,ya=e}}}function Hm(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13;)e=e.return;ya=e}function Ti(e){if(e!==ya)return!1;if(!ct)return Hm(e),ct=!0,!1;var t;if((t=e.tag!==3)&&!(t=e.tag!==5)&&(t=e.type,t=t!=="head"&&t!=="body"&&!ic(e.type,e.memoizedProps)),t&&(t=xa)){if(gc(e))throw Gm(),Error(oe(418));for(;t;)Vm(e,t),t=Yn(t.nextSibling)}if(Hm(e),e.tag===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(oe(317));e:{for(e=e.nextSibling,t=0;e;){if(e.nodeType===8){var a=e.data;if(a==="/$"){if(t===0){xa=Yn(e.nextSibling);break e}t--}else a!=="$"&&a!=="$!"&&a!=="$?"||t++}e=e.nextSibling}xa=null}}else xa=ya?Yn(e.stateNode.nextSibling):null;return!0}function Gm(){for(var e=xa;e;)e=Yn(e.nextSibling)}function sr(){xa=ya=null,ct=!1}function vc(e){Ua===null?Ua=[e]:Ua.push(e)}var D0=un.ReactCurrentBatchConfig;function po(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(oe(309));var n=a.stateNode}if(!n)throw Error(oe(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(oe(284));if(!a._owner)throw Error(oe(290,e))}return e}function Pi(e,t){throw e=Object.prototype.toString.call(t),Error(oe(31,e==="[object Object]"?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function Km(e){var t=e._init;return t(e._payload)}function Ym(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=os(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=lu(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===Us?u(g,d,h.props.children,y,h.key):d!==null&&(d.elementType===S||typeof S=="object"&&S!==null&&S.$$typeof===Bn&&Km(S)===d.type)?(y=r(d,h.props),y.ref=po(g,d,h),y.return=g,y):(y=Ji(h.type,h.key,h.props,null,g.mode,y),y.ref=po(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=du(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=_s(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=lu(""+d,g.mode,h),d.return=g,d;if(typeof d=="object"&&d!==null){switch(d.$$typeof){case Qo:return h=Ji(d.type,d.key,d.props,null,g.mode,h),h.ref=po(g,null,d),h.return=g,h;case Bs:return d=du(d,g.mode,h),d.return=g,d;case Bn:var y=d._init;return p(g,y(d._payload),h)}if(Fr(d)||Mr(d))return d=_s(d,g.mode,h,null),d.return=g,d;Pi(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 Qo:return h.key===S?l(g,d,h,y):null;case Bs:return h.key===S?c(g,d,h,y):null;case Bn:return S=h._init,f(g,d,S(h._payload),y)}if(Fr(h)||Mr(h))return S!==null?null:u(g,d,h,y,null);Pi(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 Qo:return g=g.get(y.key===null?h:y.key)||null,l(d,g,y,S);case Bs:return g=g.get(y.key===null?h:y.key)||null,c(d,g,y,S);case Bn:var C=y._init;return v(g,d,h,C(y._payload),S)}if(Fr(y)||Mr(y))return g=g.get(h)||null,u(d,g,y,S,null);Pi(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 D=f(g,E,h[_],y);if(D===null){E===null&&(E=I);break}e&&E&&D.alternate===null&&t(g,E),d=s(D,d,_),C===null?S=D:C.sibling=D,C=D,E=I}if(_===h.length)return a(g,E),ct&&ks(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 ct&&ks(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(W){return t(g,W)}),ct&&ks(g,_),S}function b(g,d,h,y){var S=Mr(h);if(typeof S!="function")throw Error(oe(150));if(h=S.call(h),h==null)throw Error(oe(151));for(var C=S=null,E=d,_=d=0,I=null,D=h.next();E!==null&&!D.done;_++,D=h.next()){E.index>_?(I=E,E=null):I=E.sibling;var W=f(g,E,D.value,y);if(W===null){E===null&&(E=I);break}e&&E&&W.alternate===null&&t(g,E),d=s(W,d,_),C===null?S=W:C.sibling=W,C=W,E=I}if(D.done)return a(g,E),ct&&ks(g,_),S;if(E===null){for(;!D.done;_++,D=h.next())D=p(g,D.value,y),D!==null&&(d=s(D,d,_),C===null?S=D:C.sibling=D,C=D);return ct&&ks(g,_),S}for(E=n(g,E);!D.done;_++,D=h.next())D=v(E,g,_,D.value,y),D!==null&&(e&&D.alternate!==null&&E.delete(D.key===null?_:D.key),d=s(D,d,_),C===null?S=D:C.sibling=D,C=D);return e&&E.forEach(function(M){return t(g,M)}),ct&&ks(g,_),S}function k(g,d,h,y){if(typeof h=="object"&&h!==null&&h.type===Us&&h.key===null&&(h=h.props.children),typeof h=="object"&&h!==null){switch(h.$$typeof){case Qo:e:{for(var S=h.key,C=d;C!==null;){if(C.key===S){if(S=h.type,S===Us){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===Bn&&Km(S)===C.type){a(g,C.sibling),d=r(C,h.props),d.ref=po(g,C,h),d.return=g,g=d;break e}a(g,C);break}else t(g,C);C=C.sibling}h.type===Us?(d=_s(h.props.children,g.mode,y,h.key),d.return=g,g=d):(y=Ji(h.type,h.key,h.props,null,g.mode,y),y.ref=po(g,d,h),y.return=g,g=y)}return o(g);case Bs: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=du(h,g.mode,y),d.return=g,g=d}return o(g);case Bn:return C=h._init,k(g,d,C(h._payload),y)}if(Fr(h))return x(g,d,h,y);if(Mr(h))return b(g,d,h,y);Pi(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=lu(h,g.mode,y),d.return=g,g=d),o(g)):a(g,d)}return k}var rr=Ym(!0),Qm=Ym(!1),_i=Qn(null),Ii=null,or=null,bc=null;function yc(){bc=or=Ii=null}function xc(e){var t=_i.current;it(_i),e._currentValue=t}function wc(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 ir(e,t){Ii=e,bc=or=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(da=!0),e.firstContext=null)}function _a(e){var t=e._currentValue;if(bc!==e)if(e={context:e,memoizedValue:t,next:null},or===null){if(Ii===null)throw Error(oe(308));or=e,Ii.dependencies={lanes:0,firstContext:e}}else or=or.next=e;return t}var Ns=null;function kc(e){Ns===null?Ns=[e]:Ns.push(e)}function Xm(e,t,a,n){var r=t.interleaved;return r===null?(a.next=a,kc(t)):(a.next=r.next,r.next=a),t.interleaved=a,hn(e,n)}function hn(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 Jn=!1;function Nc(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Zm(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 vn(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function es(e,t,a){var n=e.updateQueue;if(n===null)return null;if(n=n.shared,qe&2){var r=n.pending;return r===null?t.next=t:(t.next=r.next,r.next=t),n.pending=t,hn(e,a)}return r=n.interleaved,r===null?(t.next=t,kc(n)):(t.next=r.next,r.next=t),n.interleaved=t,hn(e,a)}function Ri(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,Ld(e,a)}}function Jm(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 Ai(e,t,a,n){var r=e.updateQueue;Jn=!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:Jn=!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);Es|=o,e.lanes=o,e.memoizedState=p}}function eg(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(oe(191,r));r.call(n)}}}var fo={},en=Qn(fo),mo=Qn(fo),go=Qn(fo);function Ss(e){if(e===fo)throw Error(oe(174));return e}function Sc(e,t){switch(nt(go,t),nt(mo,e),nt(en,fo),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:Cd(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=Cd(t,e)}it(en),nt(en,t)}function lr(){it(en),it(mo),it(go)}function tg(e){Ss(go.current);var t=Ss(en.current),a=Cd(t,e.type);t!==a&&(nt(mo,e),nt(en,a))}function Cc(e){mo.current===e&&(it(en),it(mo))}var mt=Qn(0);function ji(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 Ec=[];function $c(){for(var e=0;e<Ec.length;e++)Ec[e]._workInProgressVersionPrimary=null;Ec.length=0}var Di=un.ReactCurrentDispatcher,Tc=un.ReactCurrentBatchConfig,Cs=0,gt=null,jt=null,zt=null,Oi=!1,ho=!1,vo=0,O0=0;function Xt(){throw Error(oe(321))}function Pc(e,t){if(t===null)return!1;for(var a=0;a<t.length&&a<e.length;a++)if(!Ba(e[a],t[a]))return!1;return!0}function _c(e,t,a,n,r,s){if(Cs=s,gt=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Di.current=e===null||e.memoizedState===null?F0:B0,e=a(n,r),ho){s=0;do{if(ho=!1,vo=0,25<=s)throw Error(oe(301));s+=1,zt=jt=null,t.updateQueue=null,Di.current=U0,e=a(n,r)}while(ho)}if(Di.current=zi,t=jt!==null&&jt.next!==null,Cs=0,zt=jt=gt=null,Oi=!1,t)throw Error(oe(300));return e}function Ic(){var e=vo!==0;return vo=0,e}function tn(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return zt===null?gt.memoizedState=zt=e:zt=zt.next=e,zt}function Ia(){if(jt===null){var e=gt.alternate;e=e!==null?e.memoizedState:null}else e=jt.next;var t=zt===null?gt.memoizedState:zt.next;if(t!==null)zt=t,jt=e;else{if(e===null)throw Error(oe(310));jt=e,e={memoizedState:jt.memoizedState,baseState:jt.baseState,baseQueue:jt.baseQueue,queue:jt.queue,next:null},zt===null?gt.memoizedState=zt=e:zt=zt.next=e}return zt}function bo(e,t){return typeof t=="function"?t(e):t}function Rc(e){var t=Ia(),a=t.queue;if(a===null)throw Error(oe(311));a.lastRenderedReducer=e;var n=jt,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((Cs&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,Es|=u}c=c.next}while(c!==null&&c!==s);l===null?o=n:l.next=i,Ba(n,t.memoizedState)||(da=!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,Es|=s,r=r.next;while(r!==e)}else r===null&&(a.lanes=0);return[t.memoizedState,a.dispatch]}function Ac(e){var t=Ia(),a=t.queue;if(a===null)throw Error(oe(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);Ba(s,t.memoizedState)||(da=!0),t.memoizedState=s,t.baseQueue===null&&(t.baseState=s),a.lastRenderedState=s}return[s,n]}function ag(){}function ng(e,t){var a=gt,n=Ia(),r=t(),s=!Ba(n.memoizedState,r);if(s&&(n.memoizedState=r,da=!0),n=n.queue,jc(og.bind(null,a,n,e),[e]),n.getSnapshot!==t||s||zt!==null&&zt.memoizedState.tag&1){if(a.flags|=2048,yo(9,rg.bind(null,a,n,r,t),void 0,null),Ft===null)throw Error(oe(349));Cs&30||sg(a,t,r)}return r}function sg(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 rg(e,t,a,n){t.value=a,t.getSnapshot=n,ig(t)&&lg(e)}function og(e,t,a){return a(function(){ig(t)&&lg(e)})}function ig(e){var t=e.getSnapshot;e=e.value;try{var a=t();return!Ba(e,a)}catch{return!0}}function lg(e){var t=hn(e,1);t!==null&&Ha(t,e,1,-1)}function dg(e){var t=tn();return typeof e=="function"&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:bo,lastRenderedState:e},t.queue=e,e=e.dispatch=z0.bind(null,gt,e),[t.memoizedState,e]}function yo(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 cg(){return Ia().memoizedState}function Li(e,t,a,n){var r=tn();gt.flags|=e,r.memoizedState=yo(1|t,a,void 0,n===void 0?null:n)}function Mi(e,t,a,n){var r=Ia();n=n===void 0?null:n;var s=void 0;if(jt!==null){var o=jt.memoizedState;if(s=o.destroy,n!==null&&Pc(n,o.deps)){r.memoizedState=yo(t,a,s,n);return}}gt.flags|=e,r.memoizedState=yo(1|t,a,s,n)}function ug(e,t){return Li(8390656,8,e,t)}function jc(e,t){return Mi(2048,8,e,t)}function pg(e,t){return Mi(4,2,e,t)}function fg(e,t){return Mi(4,4,e,t)}function mg(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 gg(e,t,a){return a=a!=null?a.concat([e]):null,Mi(4,4,mg.bind(null,t,e),a)}function Dc(){}function hg(e,t){var a=Ia();t=t===void 0?null:t;var n=a.memoizedState;return n!==null&&t!==null&&Pc(t,n[1])?n[0]:(a.memoizedState=[e,t],e)}function vg(e,t){var a=Ia();t=t===void 0?null:t;var n=a.memoizedState;return n!==null&&t!==null&&Pc(t,n[1])?n[0]:(e=e(),a.memoizedState=[e,t],e)}function bg(e,t,a){return Cs&21?(Ba(a,t)||(a=Kf(),gt.lanes|=a,Es|=a,e.baseState=!0),t):(e.baseState&&(e.baseState=!1,da=!0),e.memoizedState=a)}function L0(e,t){var a=Qe;Qe=a!==0&&4>a?a:4,e(!0);var n=Tc.transition;Tc.transition={};try{e(!1),t()}finally{Qe=a,Tc.transition=n}}function yg(){return Ia().memoizedState}function M0(e,t,a){var n=ss(e);if(a={lane:n,action:a,hasEagerState:!1,eagerState:null,next:null},xg(e))wg(t,a);else if(a=Xm(e,t,a,n),a!==null){var r=sa();Ha(a,e,n,r),kg(a,t,n)}}function z0(e,t,a){var n=ss(e),r={lane:n,action:a,hasEagerState:!1,eagerState:null,next:null};if(xg(e))wg(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,Ba(i,o)){var l=t.interleaved;l===null?(r.next=r,kc(t)):(r.next=l.next,l.next=r),t.interleaved=r;return}}catch{}finally{}a=Xm(e,t,r,n),a!==null&&(r=sa(),Ha(a,e,n,r),kg(a,t,n))}}function xg(e){var t=e.alternate;return e===gt||t!==null&&t===gt}function wg(e,t){ho=Oi=!0;var a=e.pending;a===null?t.next=t:(t.next=a.next,a.next=t),e.pending=t}function kg(e,t,a){if(a&4194240){var n=t.lanes;n&=e.pendingLanes,a|=n,t.lanes=a,Ld(e,a)}}var zi={readContext:_a,useCallback:Xt,useContext:Xt,useEffect:Xt,useImperativeHandle:Xt,useInsertionEffect:Xt,useLayoutEffect:Xt,useMemo:Xt,useReducer:Xt,useRef:Xt,useState:Xt,useDebugValue:Xt,useDeferredValue:Xt,useTransition:Xt,useMutableSource:Xt,useSyncExternalStore:Xt,useId:Xt,unstable_isNewReconciler:!1},F0={readContext:_a,useCallback:function(e,t){return tn().memoizedState=[e,t===void 0?null:t],e},useContext:_a,useEffect:ug,useImperativeHandle:function(e,t,a){return a=a!=null?a.concat([e]):null,Li(4194308,4,mg.bind(null,t,e),a)},useLayoutEffect:function(e,t){return Li(4194308,4,e,t)},useInsertionEffect:function(e,t){return Li(4,2,e,t)},useMemo:function(e,t){var a=tn();return t=t===void 0?null:t,e=e(),a.memoizedState=[e,t],e},useReducer:function(e,t,a){var n=tn();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=M0.bind(null,gt,e),[n.memoizedState,e]},useRef:function(e){var t=tn();return e={current:e},t.memoizedState=e},useState:dg,useDebugValue:Dc,useDeferredValue:function(e){return tn().memoizedState=e},useTransition:function(){var e=dg(!1),t=e[0];return e=L0.bind(null,e[1]),tn().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,a){var n=gt,r=tn();if(ct){if(a===void 0)throw Error(oe(407));a=a()}else{if(a=t(),Ft===null)throw Error(oe(349));Cs&30||sg(n,t,a)}r.memoizedState=a;var s={value:a,getSnapshot:t};return r.queue=s,ug(og.bind(null,n,s,e),[e]),n.flags|=2048,yo(9,rg.bind(null,n,s,a,t),void 0,null),a},useId:function(){var e=tn(),t=Ft.identifierPrefix;if(ct){var a=gn,n=mn;a=(n&~(1<<32-Fa(n)-1)).toString(32)+a,t=":"+t+"R"+a,a=vo++,0<a&&(t+="H"+a.toString(32)),t+=":"}else a=O0++,t=":"+t+"r"+a.toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},B0={readContext:_a,useCallback:hg,useContext:_a,useEffect:jc,useImperativeHandle:gg,useInsertionEffect:pg,useLayoutEffect:fg,useMemo:vg,useReducer:Rc,useRef:cg,useState:function(){return Rc(bo)},useDebugValue:Dc,useDeferredValue:function(e){var t=Ia();return bg(t,jt.memoizedState,e)},useTransition:function(){var e=Rc(bo)[0],t=Ia().memoizedState;return[e,t]},useMutableSource:ag,useSyncExternalStore:ng,useId:yg,unstable_isNewReconciler:!1},U0={readContext:_a,useCallback:hg,useContext:_a,useEffect:jc,useImperativeHandle:gg,useInsertionEffect:pg,useLayoutEffect:fg,useMemo:vg,useReducer:Ac,useRef:cg,useState:function(){return Ac(bo)},useDebugValue:Dc,useDeferredValue:function(e){var t=Ia();return jt===null?t.memoizedState=e:bg(t,jt.memoizedState,e)},useTransition:function(){var e=Ac(bo)[0],t=Ia().memoizedState;return[e,t]},useMutableSource:ag,useSyncExternalStore:ng,useId:yg,unstable_isNewReconciler:!1};function qa(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 Oc(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 Fi={isMounted:function(e){return(e=e._reactInternals)?bs(e)===e:!1},enqueueSetState:function(e,t,a){e=e._reactInternals;var n=sa(),r=ss(e),s=vn(n,r);s.payload=t,a!=null&&(s.callback=a),t=es(e,s,r),t!==null&&(Ha(t,e,r,n),Ri(t,e,r))},enqueueReplaceState:function(e,t,a){e=e._reactInternals;var n=sa(),r=ss(e),s=vn(n,r);s.tag=1,s.payload=t,a!=null&&(s.callback=a),t=es(e,s,r),t!==null&&(Ha(t,e,r,n),Ri(t,e,r))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var a=sa(),n=ss(e),r=vn(a,n);r.tag=2,t!=null&&(r.callback=t),t=es(e,r,n),t!==null&&(Ha(t,e,n,a),Ri(t,e,n))}};function Ng(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?!so(a,n)||!so(r,s):!0}function Sg(e,t,a){var n=!1,r=Xn,s=t.contextType;return typeof s=="object"&&s!==null?s=_a(s):(r=la(t)?xs:Qt.current,n=t.contextTypes,s=(n=n!=null)?tr(e,r):Xn),t=new t(a,s),e.memoizedState=t.state!==null&&t.state!==void 0?t.state:null,t.updater=Fi,e.stateNode=t,t._reactInternals=e,n&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=r,e.__reactInternalMemoizedMaskedChildContext=s),t}function Cg(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&&Fi.enqueueReplaceState(t,t.state,null)}function Lc(e,t,a,n){var r=e.stateNode;r.props=a,r.state=e.memoizedState,r.refs={},Nc(e);var s=t.contextType;typeof s=="object"&&s!==null?r.context=_a(s):(s=la(t)?xs:Qt.current,r.context=tr(e,s)),r.state=e.memoizedState,s=t.getDerivedStateFromProps,typeof s=="function"&&(Oc(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&&Fi.enqueueReplaceState(r,r.state,null),Ai(e,a,r,n),r.state=e.memoizedState),typeof r.componentDidMount=="function"&&(e.flags|=4194308)}function dr(e,t){try{var a="",n=t;do a+=hw(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 Ac(e,t,a){return{value:e,source:null,stack:a??null,digest:t??null}}function jc(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(){Ui||(Ui=!0,Yc=n),jc(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(){jc(e,t)}}var s=e.stateNode;return s!==null&&typeof s.componentDidCatch=="function"&&(a.callback=function(){jc(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,oa=!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=Cc(e,t,a,n,s,r),a=Ec(),e!==null&&!oa?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~r,mn(e,t,r)):(ut&&a&&lc(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"&&!au(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=Ki(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(oa=!1,t.pendingProps=n=s,(e.lanes&r)!==0)e.flags&131072&&(oa=!0);else return t.lanes=e.lanes,mn(e,t,r)}return Dc(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,va),va|=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,va),va|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},n=s!==null?s.baseLanes:a,ot(or,va),va|=n}else s!==null?(n=s.baseLanes|a,t.memoizedState=null):n=a,ot(or,va),va|=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 Dc(e,t,a,n,r){var s=ra(a)?ms:Ht.current;return s=Qs(t,s),ar(t,r),a=Cc(e,t,a,n,s,r),n=Ec(),e!==null&&!oa?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~r,mn(e,t,r)):(ut&&n&&lc(t),t.flags|=1,Jt(e,t,a,r),t.child)}function Ig(e,t,a,n,r){if(ra(a)){var s=!0;yi(t)}else s=!1;if(ar(t,r),t.stateNode===null)Li(e,t),yg(t,a,n),Rc(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=Ea(c):(c=ra(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,Ti(t,n,o,r),l=t.memoizedState,i!==n||f!==l||sa.current||Hn?(typeof u=="function"&&(Ic(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:Ma(t.type,i),o.props=c,p=t.pendingProps,f=o.context,l=a.contextType,typeof l=="object"&&l!==null?l=Ea(l):(l=ra(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,Ti(t,n,o,r);var x=t.memoizedState;i!==p||f!==x||sa.current||Hn?(typeof v=="function"&&(Ic(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 Oc(e,t,a,n,s,r)}function Oc(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),yc(e,t.containerInfo)}function Ag(e,t,a,n,r){return Js(),pc(r),t.flags|=256,Jt(e,t,a,n),t.child}var Lc={dehydrated:null,treeContext:null,retryLane:0};function Mc(e){return{baseLanes:e,cachePool:null,transitions:null}}function jg(e,t,a){var n=t.pendingProps,r=gt.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(gt,r&1),e===null)return uc(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=Yi(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=Mc(a),t.memoizedState=Lc,e):zc(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?Mc(a):{baseLanes:o.baseLanes|a,cachePool:null,transitions:o.transitions},s.memoizedState=o,s.childLanes=e.childLanes&~a,t.memoizedState=Lc,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 zc(e,t){return t=Yi({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function Oi(e,t,a,n){return n!==null&&pc(n),er(t,e.child,null,a),e=zc(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=Ac(Error(re(422))),Oi(e,t,o,n)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(s=n.fallback,r=t.mode,n=Yi({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=Mc(o),t.memoizedState=Lc,s);if(!(t.mode&1))return Oi(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=Ac(s,n,void 0),Oi(e,t,o,n)}if(i=(o&e.childLanes)!==0,oa||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),Ba(n,e,r,-1))}return tu(),n=Ac(Error(re(421))),Oi(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,ha=Un(r.nextSibling),ga=t,ut=!0,La=null,e!==null&&(Sa[Ca++]=cn,Sa[Ca++]=un,Sa[Ca++]=gs,cn=e.id,un=e.overflow,gs=t),t=zc(t,n.children),t.flags|=4096,t)}function Dg(e,t,a){e.lanes|=t;var n=e.alternate;n!==null&&(n.lanes|=t),hc(e.return,t,a)}function Fc(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=gt.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(gt,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&&Pi(e)===null&&(r=a),a=a.sibling;a=r,a===null?(r=t.child,t.child=null):(r=a.sibling,a.sibling=null),Fc(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&&Pi(e)===null){t.child=r;break}e=r.sibling,r.sibling=a,a=r,r=e}Fc(t,!0,a,null,s);break;case"together":Fc(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Li(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:ra(t.type)&&yi(t);break;case 4:yc(t,t.stateNode.containerInfo);break;case 10:var n=t.type._context,r=t.memoizedProps.value;ot(Ci,n._currentValue),n._currentValue=r;break;case 13:if(n=t.memoizedState,n!==null)return n.dehydrated!==null?(ot(gt,gt.current&1),t.flags|=128,null):a&t.child.childLanes?jg(e,t,a):(ot(gt,gt.current&1),e=mn(e,t,a),e!==null?e.sibling:null);ot(gt,gt.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(gt,gt.current),n)break;return null;case 22:case 23:return t.lanes=0,Pg(e,t,a)}return mn(e,t,a)}var Lg,Bc,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}},Bc=function(){},Mg=function(e,t,a,n){var r=e.memoizedProps;if(r!==n){e=t.stateNode,bs(Ya.current);var s=null;switch(a){case"input":r=hd(e,r),n=hd(e,n),s=[];break;case"select":r=mt({},r,{value:void 0}),n=mt({},n,{value:void 0}),s=[];break;case"textarea":r=yd(e,r),n=yd(e,n),s=[];break;default:typeof r.onClick!="function"&&typeof n.onClick=="function"&&(e.onclick=hi)}wd(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(dc(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 ra(t.type)&&bi(),Kt(t),null;case 3:return n=t.stateNode,nr(),lt(sa),lt(Ht),kc(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),(e===null||e.child===null)&&(Ni(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&!(t.flags&256)||(t.flags|=1024,La!==null&&(Zc(La),La=null))),Bc(e,t),Kt(t),null;case 5:xc(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(Ya.current),Ni(t)){n=t.stateNode,a=t.type;var s=t.memoizedProps;switch(n[Ka]=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)}wd(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&&gi(n.textContent,i,e),r=["children",i]):typeof i=="number"&&n.textContent!==""+i&&(s.suppressHydrationWarning!==!0&&gi(n.textContent,i,e),r=["children",""+i]):Rr.hasOwnProperty(o)&&i!=null&&o==="onScroll"&&it("scroll",n)}switch(a){case"input":Ho(n),wf(n,s,!0);break;case"textarea":Ho(n),Sf(n);break;case"select":case"option":break;default:typeof s.onClick=="function"&&(n.onclick=hi)}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[Ka]=t,e[so]=n,Lg(e,t,!1,!1),t.stateNode=e;e:{switch(o=kd(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=hd(e,n),it("invalid",e);break;case"option":r=n;break;case"select":e._wrapperState={wasMultiple:!!n.multiple},r=mt({},n,{value:void 0}),it("invalid",e);break;case"textarea":kf(e,n),r=yd(e,n),it("invalid",e);break;default:r=n}wd(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&&rd(e,s,l,o))}switch(a){case"input":Ho(e),wf(e,n,!1);break;case"textarea":Ho(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=hi)}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(Ya.current),Ni(t)){if(n=t.stateNode,a=t.memoizedProps,n[Ka]=t,(s=n.nodeValue!==a)&&(e=ga,e!==null))switch(e.tag){case 3:gi(n.nodeValue,a,(e.mode&1)!==0);break;case 5:e.memoizedProps.suppressHydrationWarning!==!0&&gi(n.nodeValue,a,(e.mode&1)!==0)}s&&(t.flags|=4)}else n=(a.nodeType===9?a:a.ownerDocument).createTextNode(n),n[Ka]=t,t.stateNode=n}return Kt(t),null;case 13:if(lt(gt),n=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(ut&&ha!==null&&t.mode&1&&!(t.flags&128))Um(),Js(),t.flags|=98560,s=!1;else if(s=Ni(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[Ka]=t}else Js(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Kt(t),s=!1}else La!==null&&(Zc(La),La=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||gt.current&1?Rt===0&&(Rt=3):tu())),t.updateQueue!==null&&(t.flags|=4),Kt(t),null);case 4:return nr(),Bc(e,t),e===null&&ao(t.stateNode.containerInfo),Kt(t),null;case 10:return gc(t.type._context),Kt(t),null;case 17:return ra(t.type)&&bi(),Kt(t),null;case 19:if(lt(gt),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=Pi(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(gt,gt.current&1|2),t.child}e=e.sibling}s.tail!==null&&kt()>ir&&(t.flags|=128,n=!0,go(s,!1),t.lanes=4194304)}else{if(!n)if(e=Pi(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*kt()-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=kt(),t.sibling=null,a=gt.current,ot(gt,n?a&1|2:a&1),t):(Kt(t),null);case 22:case 23:return eu(),n=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==n&&(t.flags|=8192),n&&t.mode&1?va&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(dc(t),t.tag){case 1:return ra(t.type)&&bi(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return nr(),lt(sa),lt(Ht),kc(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return xc(t),null;case 13:if(lt(gt),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(gt),null;case 4:return nr(),null;case 10:return gc(t.type._context),null;case 22:case 23:return eu(),null;case 24:return null;default:return null}}var Mi=!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){bt(e,t,n)}else a.current=null}function Uc(e,t,a){try{a()}catch(n){bt(e,t,n)}}var Fg=!1;function H0(e,t){if(ec=si,e=bm(),Hd(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(tc={focusedElem:e,selectionRange:a},si=!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:Ma(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){bt(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&&Uc(t,a,s)}r=r.next}while(r!==n)}}function zi(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 qc(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[Ka],delete t[so],delete t[rc],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 Vc(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=hi));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}function Wc(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(Wc(e,t,a),e=e.sibling;e!==null;)Wc(e,t,a),e=e.sibling}var Ut=null,za=!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(Ga&&typeof Ga.onCommitFiberUnmount=="function")try{Ga.onCommitFiberUnmount(Zo,a)}catch{}switch(a.tag){case 5:Yt||rr(a,t);case 6:var n=Ut,r=za;Ut=null,Kn(e,t,a),Ut=n,za=r,Ut!==null&&(za?(e=Ut,a=a.stateNode,e.nodeType===8?e.parentNode.removeChild(a):e.removeChild(a)):Ut.removeChild(a.stateNode));break;case 18:Ut!==null&&(za?(e=Ut,a=a.stateNode,e.nodeType===8?sc(e.parentNode,a):e.nodeType===1&&sc(e,a),Gr(e)):sc(Ut,a.stateNode));break;case 4:n=Ut,r=za,Ut=a.stateNode.containerInfo,za=!0,Kn(e,t,a),Ut=n,za=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)&&Uc(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){bt(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 Fa(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,za=!1;break e;case 3:Ut=i.stateNode.containerInfo,za=!0;break e;case 4:Ut=i.stateNode.containerInfo,za=!0;break e}i=i.return}if(Ut===null)throw Error(re(160));Vg(s,o,r),Ut=null,za=!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(Fa(t,e),Xa(e),n&4){try{ho(3,e,e.return),zi(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:Fa(t,e),Xa(e),n&512&&a!==null&&rr(a,a.return);break;case 5:if(Fa(t,e),Xa(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),kd(i,o);var c=kd(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):rd(r,u,p,c)}switch(i){case"input":vd(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(Fa(t,e),Xa(e),n&4){if(e.stateNode===null)throw Error(re(162));r=e.stateNode,s=e.memoizedProps;try{r.nodeValue=s}catch(b){bt(e,e.return,b)}}break;case 3:if(Fa(t,e),Xa(e),n&4&&a!==null&&a.memoizedState.isDehydrated)try{Gr(t.containerInfo)}catch(b){bt(e,e.return,b)}break;case 4:Fa(t,e),Xa(e);break;case 13:Fa(t,e),Xa(e),r=e.child,r.flags&8192&&(s=r.memoizedState!==null,r.stateNode.isHidden=s,!s||r.alternate!==null&&r.alternate.memoizedState!==null||(Kc=kt())),n&4&&Wg(e);break;case 22:if(u=a!==null&&a.memoizedState!==null,e.mode&1?(Yt=(c=Yt)||u,Fa(t,e),Yt=c):Fa(t,e),Xa(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){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,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){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:Fa(t,e),Xa(e),n&4&&Wg(e);break;case 21:break;default:Fa(t,e),Xa(e)}}function Xa(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);Wc(e,s,r);break;case 3:case 4:var o=n.stateNode.containerInfo,i=qg(e);Vc(e,i,o);break;default:throw Error(re(161))}}catch(l){bt(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||Mi;if(!o){var i=r.alternate,l=i!==null&&i.memoizedState!==null||Yt;i=Mi;var c=Yt;if(Mi=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,Mi=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||zi(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:Ma(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&&qc(t)}catch(f){bt(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{zi(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{qc(t)}catch(l){bt(t,s,l)}break;case 5:var o=t.return;try{qc(t)}catch(l){bt(t,o,l)}}}catch(l){bt(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,Fi=on.ReactCurrentDispatcher,Hc=on.ReactCurrentOwner,Ta=on.ReactCurrentBatchConfig,Ue=0,Mt=null,Et=null,qt=0,va=0,or=qn(0),Rt=0,vo=null,xs=0,Bi=0,Gc=0,bo=null,ia=null,Kc=0,ir=1/0,gn=null,Ui=!1,Yc=null,Yn=null,qi=!1,Qn=null,Vi=0,yo=0,Qc=null,Wi=-1,Hi=0;function ea(){return Ue&6?kt():Wi!==-1?Wi:Wi=kt()}function Xn(e){return e.mode&1?Ue&2&&qt!==0?qt&-qt:I0.transition!==null?(Hi===0&&(Hi=qf()),Hi):(e=Xe,e!==0||(e=window.event,e=e===void 0?16:Zf(e.type)),e):1}function Ba(e,t,a,n){if(50<yo)throw yo=0,Qc=null,Error(re(185));Ur(e,a,n),(!(Ue&2)||e!==Mt)&&(e===Mt&&(!(Ue&2)&&(Bi|=a),Rt===4&&Zn(e,qt)),la(e,n),a===1&&Ue===0&&!(t.mode&1)&&(ir=kt()+500,xi&&Wn()))}function la(e,t){var a=e.callbackNode;Iw(e,t);var n=ti(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(){!(Ue&6)&&Wn()}),a=null;else{switch(Vf(n)){case 1:a=Pd;break;case 4:a=Bf;break;case 16:a=Xo;break;case 536870912:a=Uf;break;default:a=Xo}a=oh(a,Xg.bind(null,e))}e.callbackPriority=t,e.callbackNode=a}}function Xg(e,t){if(Wi=-1,Hi=0,Ue&6)throw Error(re(327));var a=e.callbackNode;if(lr()&&e.callbackNode!==a)return null;var n=ti(e,e===Mt?qt:0);if(n===0)return null;if(n&30||n&e.expiredLanes||t)t=Gi(e,n);else{t=n;var r=Ue;Ue|=2;var s=eh();(Mt!==e||qt!==t)&&(gn=null,ir=kt()+500,ks(e,t));do try{X0();break}catch(i){Jg(e,i)}while(!0);mc(),Fi.current=s,Ue=r,Et!==null?t=0:(Mt=null,qt=0,t=Rt)}if(t!==0){if(t===2&&(r=_d(e),r!==0&&(n=r,t=Xc(e,r))),t===1)throw a=vo,ks(e,0),Zn(e,n),la(e,kt()),a;if(t===6)Zn(e,n);else{if(r=e.current.alternate,!(n&30)&&!Y0(r)&&(t=Gi(e,n),t===2&&(s=_d(e),s!==0&&(n=s,t=Xc(e,s))),t===1))throw a=vo,ks(e,0),Zn(e,n),la(e,kt()),a;switch(e.finishedWork=r,e.finishedLanes=n,t){case 0:case 1:throw Error(re(345));case 2:Ns(e,ia,gn);break;case 3:if(Zn(e,n),(n&130023424)===n&&(t=Kc+500-kt(),10<t)){if(ti(e,0)!==0)break;if(r=e.suspendedLanes,(r&n)!==n){ea(),e.pingedLanes|=e.suspendedLanes&r;break}e.timeoutHandle=nc(Ns.bind(null,e,ia,gn),t);break}Ns(e,ia,gn);break;case 4:if(Zn(e,n),(n&4194240)===n)break;for(t=e.eventTimes,r=-1;0<n;){var o=31-Da(n);s=1<<o,o=t[o],o>r&&(r=o),n&=~s}if(n=r,n=kt()-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=nc(Ns.bind(null,e,ia,gn),n);break}Ns(e,ia,gn);break;case 5:Ns(e,ia,gn);break;default:throw Error(re(329))}}}return la(e,kt()),e.callbackNode===a?Xg.bind(null,e):null}function Xc(e,t){var a=bo;return e.current.memoizedState.isDehydrated&&(ks(e,t).flags|=256),e=Gi(e,t),e!==2&&(t=ia,ia=a,t!==null&&Zc(t)),e}function Zc(e){ia===null?ia=e:ia.push.apply(ia,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(!Oa(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&=~Gc,t&=~Bi,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var a=31-Da(t),n=1<<a;e[a]=-1,t&=~n}}function Zg(e){if(Ue&6)throw Error(re(327));lr();var t=ti(e,0);if(!(t&1))return la(e,kt()),null;var a=Gi(e,t);if(e.tag!==0&&a===2){var n=_d(e);n!==0&&(t=n,a=Xc(e,n))}if(a===1)throw a=vo,ks(e,0),Zn(e,t),la(e,kt()),a;if(a===6)throw Error(re(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,Ns(e,ia,gn),la(e,kt()),null}function Jc(e,t){var a=Ue;Ue|=1;try{return e(t)}finally{Ue=a,Ue===0&&(ir=kt()+500,xi&&Wn())}}function ws(e){Qn!==null&&Qn.tag===0&&!(Ue&6)&&lr();var t=Ue;Ue|=1;var a=Ta.transition,n=Xe;try{if(Ta.transition=null,Xe=1,e)return e()}finally{Xe=n,Ta.transition=a,Ue=t,!(Ue&6)&&Wn()}}function eu(){va=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(dc(n),n.tag){case 1:n=n.type.childContextTypes,n!=null&&bi();break;case 3:nr(),lt(sa),lt(Ht),kc();break;case 5:xc(n);break;case 4:nr();break;case 13:lt(gt);break;case 19:lt(gt);break;case 10:gc(n.type._context);break;case 22:case 23:eu()}a=a.return}if(Mt=e,Et=e=Jn(e.current,null),qt=va=t,Rt=0,vo=null,Gc=Bi=xs=0,ia=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(mc(),_i.current=ji,Ii){for(var n=ht.memoizedState;n!==null;){var r=n.queue;r!==null&&(r.pending=null),n=n.next}Ii=!1}if(ys=0,Lt=It=ht=null,uo=!1,po=0,Hc.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),tu();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),pc(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=Fi.current;return Fi.current=ji,e===null?ji:e}function tu(){(Rt===0||Rt===3||Rt===2)&&(Rt=4),Mt===null||!(xs&268435455)&&!(Bi&268435455)||Zn(Mt,qt)}function Gi(e,t){var a=Ue;Ue|=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(mc(),Ue=a,Fi.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,va);e.memoizedProps=e.pendingProps,t===null?ah(e):Et=t,Hc.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,va),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=Ta.transition;try{Ta.transition=null,Xe=1,Z0(e,t,a,n)}finally{Ta.transition=r,Xe=n}return null}function Z0(e,t,a,n){do lr();while(Qn!==null);if(Ue&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)||qi||(qi=!0,oh(Xo,function(){return lr(),null})),s=(a.flags&15990)!==0,a.subtreeFlags&15990||s){s=Ta.transition,Ta.transition=null;var o=Xe;Xe=1;var i=Ue;Ue|=4,Hc.current=null,H0(e,a),Hg(a,e),b0(tc),si=!!ec,tc=ec=null,e.current=a,G0(a),Nw(),Ue=i,Xe=o,Ta.transition=s}else e.current=a;if(qi&&(qi=!1,Qn=e,Vi=r),s=e.pendingLanes,s===0&&(Yn=null),Ew(a.stateNode),la(e,kt()),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(Ui)throw Ui=!1,e=Yc,Yc=null,e;return Vi&1&&e.tag!==0&&lr(),s=e.pendingLanes,s&1?e===Qc?yo++:(yo=0,Qc=e):yo=0,Wn(),null}function lr(){if(Qn!==null){var e=Vf(Vi),t=Ta.transition,a=Xe;try{if(Ta.transition=null,Xe=16>e?16:e,Qn===null)var n=!1;else{if(e=Qn,Qn=null,Vi=0,Ue&6)throw Error(re(331));var r=Ue;for(Ue|=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:zi(9,i)}}catch(S){bt(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(Ue=r,Wn(),Ga&&typeof Ga.onPostCommitFiberRoot=="function")try{Ga.onPostCommitFiberRoot(Zo,e)}catch{}n=!0}return n}finally{Xe=a,Ta.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),la(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"&&(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),la(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>kt()-Kc?ks(e,0):Gc|=a),la(e,t)}function sh(e,t){t===0&&(e.mode&1?(t=ei,ei<<=1,!(ei&130023424)&&(ei=4194304)):t=1);var a=ea();e=pn(e,t),e!==null&&(Ur(e,t,a),la(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||sa.current)oa=!0;else{if(!(e.lanes&a)&&!(t.flags&128))return oa=!1,U0(e,t,a);oa=!!(e.flags&131072)}else oa=!1,ut&&t.flags&1048576&&Mm(t,ki,t.index);switch(t.lanes=0,t.tag){case 2:var n=t.type;Li(e,t),e=t.pendingProps;var r=Qs(t,Ht.current);ar(t,a),r=Cc(null,t,n,e,r,a);var s=Ec();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,ra(n)?(s=!0,yi(t)):s=!1,t.memoizedState=r.state!==null&&r.state!==void 0?r.state:null,bc(t),r.updater=Di,t.stateNode=r,r._reactInternals=t,Rc(t,n,e,a),t=Oc(null,t,n,!0,s,a)):(t.tag=0,ut&&s&&lc(t),Jt(null,t,r,a),t=t.child),t;case 16:n=t.elementType;e:{switch(Li(e,t),e=t.pendingProps,r=n._init,n=r(n._payload),t.type=n,r=t.tag=n1(n),e=Ma(n,e),r){case 0:t=Dc(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,Ma(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:Ma(n,r),Dc(e,t,n,r,a);case 1:return n=t.type,r=t.pendingProps,r=t.elementType===n?r:Ma(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),Ti(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(ha=Un(t.stateNode.containerInfo.firstChild),ga=t,ut=!0,La=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&&uc(t),n=t.type,r=t.pendingProps,s=e!==null?e.memoizedProps:null,o=r.children,ac(n,r)?o=null:s!==null&&ac(n,s)&&(t.flags|=32),_g(e,t),Jt(e,t,o,a),t.child;case 6:return e===null&&uc(t),null;case 13:return jg(e,t,a);case 4:return yc(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:Ma(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(Ci,n._currentValue),n._currentValue=o,s!==null)if(Oa(s.value,o)){if(s.children===r.children&&!sa.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),hc(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),hc(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=Ea(r),n=n(r),t.flags|=1,Jt(e,t,n,a),t.child;case 14:return n=t.type,r=Ma(n,t.pendingProps),r=Ma(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:Ma(n,r),Li(e,t),t.tag=1,ra(n)?(e=!0,yi(t)):e=!1,ar(t,a),yg(t,n,r),Rc(t,n,r,a),Oc(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 Pa(e,t,a,n){return new a1(e,t,a,n)}function au(e){return e=e.prototype,!(!e||!e.isReactComponent)}function n1(e){if(typeof e=="function")return au(e)?1:0;if(e!=null){if(e=e.$$typeof,e===ld)return 11;if(e===ud)return 14}return 2}function Jn(e,t){var a=e.alternate;return a===null?(a=Pa(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 Ki(e,t,a,n,r,s){var o=2;if(n=e,typeof e=="function")au(e)&&(o=1);else if(typeof e=="string")o=5;else e:switch(e){case Ls:return Ss(a.children,r,s,t);case od:o=8,r|=8;break;case id:return e=Pa(12,a,t,r|2),e.elementType=id,e.lanes=s,e;case dd:return e=Pa(13,a,t,r),e.elementType=dd,e.lanes=s,e;case cd:return e=Pa(19,a,t,r),e.elementType=cd,e.lanes=s,e;case gf:return Yi(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 ld:o=11;break e;case ud:o=14;break e;case jn:o=16,n=null;break e}throw Error(re(130,e==null?e:typeof e,""))}return t=Pa(o,a,t,r),t.elementType=e,t.type=n,t.lanes=s,t}function Ss(e,t,a,n){return e=Pa(7,e,n,t),e.lanes=a,e}function Yi(e,t,a,n){return e=Pa(22,e,n,t),e.elementType=gf,e.lanes=a,e.stateNode={isHidden:!1},e}function nu(e,t,a){return e=Pa(6,e,null,t),e.lanes=a,e}function su(e,t,a){return t=Pa(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=Id(0),this.expirationTimes=Id(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Id(0),this.identifierPrefix=n,this.onRecoverableError=r,this.mutableSourceEagerHydrationData=null}function ru(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=Pa(3,null,null,t),e.current=s,s.stateNode=e,s.memoizedState={element:n,isDehydrated:a,cache:null,transitions:null,pendingSuspenseBoundaries:null},bc(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(ra(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(ra(a))return Dm(e,a,t)}return t}function lh(e,t,a,n,r,s,o,i,l){return e=ru(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),la(e,n),e}function Qi(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&&(Ba(e,r,o,s),$i(e,r,o)),o}function Xi(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 ou(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 iu(e){this._internalRoot=e}Zi.prototype.render=iu.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(re(409));Qi(e,t,null,null)},Zi.prototype.unmount=iu.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;ws(function(){Qi(null,e,null,null)}),t[ln]=null}};function Zi(e){this._internalRoot=e}Zi.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 lu(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function Ji(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=Xi(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=Xi(l);i.call(c)}}var l=ru(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(){Qi(t,l,a,n)}),l}function el(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=Xi(o);i.call(l)}}Qi(t,o,e,r)}else o=i1(a,t,e,r,n);return Xi(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&&(Rd(t,a|1),la(t,kt()),!(Ue&6)&&(ir=kt()+500,Wn()))}break;case 13:ws(function(){var n=pn(e,1);if(n!==null){var r=ea();Ba(n,e,1,r)}}),ou(e,1)}},Ad=function(e){if(e.tag===13){var t=pn(e,134217728);if(t!==null){var a=ea();Ba(t,e,134217728,a)}ou(e,134217728)}},Hf=function(e){if(e.tag===13){var t=Xn(e),a=pn(e,t);if(a!==null){var n=ea();Ba(a,e,t,n)}ou(e,t)}},Gf=function(){return Xe},Kf=function(e,t){var a=Xe;try{return Xe=e,t()}finally{Xe=a}},Cd=function(e,t,a){switch(t){case"input":if(vd(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=vi(n);if(!r)throw Error(re(90));bf(n),vd(n,r)}}}break;case"textarea":Nf(e,a);break;case"select":t=a.value,t!=null&&Ms(e,!!a.multiple,t,!1)}},Rf=Jc,Af=ws;var l1={usingClientEntryPoint:!1,Events:[ro,Ks,vi,_f,If,Jc]},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 tl=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!tl.isDisabled&&tl.supportsFiber)try{Zo=tl.inject(d1),Ga=tl}catch{}}pa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=l1,pa.createPortal=function(e,t){var a=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!lu(t))throw Error(re(200));return r1(e,t,null,a)},pa.createRoot=function(e,t){if(!lu(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=ru(e,1,!1,null,null,a,!1,n,r),e[ln]=t.current,ao(e.nodeType===8?e.parentNode:e),new iu(t)},pa.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},pa.flushSync=function(e){return ws(e)},pa.hydrate=function(e,t,a){if(!Ji(t))throw Error(re(200));return el(null,e,t,!0,a)},pa.hydrateRoot=function(e,t,a){if(!lu(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 Zi(t)},pa.render=function(e,t,a){if(!Ji(t))throw Error(re(200));return el(null,e,t,!1,a)},pa.unmountComponentAtNode=function(e){if(!Ji(e))throw Error(re(40));return e._reactRootContainer?(ws(function(){el(null,null,e,!1,function(){e._reactRootContainer=null,e[ln]=null})}),!0):!1},pa.unstable_batchedUpdates=Jc,pa.unstable_renderSubtreeIntoContainer=function(e,t,a,n){if(!Ji(a))throw Error(re(200));if(e==null||e._reactInternals===void 0)throw Error(re(38));return el(e,t,a,!1,n)},pa.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=pa;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
|
|
854
|
+
`+s.stack}return{value:e,source:t,stack:r,digest:null}}function Mc(e,t,a){return{value:e,source:null,stack:a??null,digest:t??null}}function zc(e,t){try{console.error(t.value)}catch(a){setTimeout(function(){throw a})}}var q0=typeof WeakMap=="function"?WeakMap:Map;function Eg(e,t,a){a=vn(-1,a),a.tag=3,a.payload={element:null};var n=t.value;return a.callback=function(){Gi||(Gi=!0,eu=n),zc(e,t)},a}function $g(e,t,a){a=vn(-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(){zc(e,t)}}var s=e.stateNode;return s!==null&&typeof s.componentDidCatch=="function"&&(a.callback=function(){zc(e,t),typeof n!="function"&&(as===null?as=new Set([this]):as.add(this));var o=t.stack;this.componentDidCatch(t.value,{componentStack:o!==null?o:""})}),a}function Tg(e,t,a){var n=e.pingCache;if(n===null){n=e.pingCache=new q0;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=n1.bind(null,e,t,a),t.then(e,e))}function Pg(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 _g(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=vn(-1,1),t.tag=2,es(a,t,1))),a.lanes|=1),e)}var V0=un.ReactCurrentOwner,da=!1;function na(e,t,a,n){t.child=e===null?Qm(t,null,a,n):rr(t,e.child,a,n)}function Ig(e,t,a,n,r){a=a.render;var s=t.ref;return ir(t,r),n=_c(e,t,a,n,s,r),a=Ic(),e!==null&&!da?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~r,bn(e,t,r)):(ct&&a&&fc(t),t.flags|=1,na(e,t,n,r),t.child)}function Rg(e,t,a,n,r){if(e===null){var s=a.type;return typeof s=="function"&&!iu(s)&&s.defaultProps===void 0&&a.compare===null&&a.defaultProps===void 0?(t.tag=15,t.type=s,Ag(e,t,s,n,r)):(e=Ji(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:so,a(o,n)&&e.ref===t.ref)return bn(e,t,r)}return t.flags|=1,e=os(s,n),e.ref=t.ref,e.return=t,t.child=e}function Ag(e,t,a,n,r){if(e!==null){var s=e.memoizedProps;if(so(s,n)&&e.ref===t.ref)if(da=!1,t.pendingProps=n=s,(e.lanes&r)!==0)e.flags&131072&&(da=!0);else return t.lanes=e.lanes,bn(e,t,r)}return Fc(e,t,a,n,r)}function jg(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},nt(ur,wa),wa|=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,nt(ur,wa),wa|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},n=s!==null?s.baseLanes:a,nt(ur,wa),wa|=n}else s!==null?(n=s.baseLanes|a,t.memoizedState=null):n=a,nt(ur,wa),wa|=n;return na(e,t,r,a),t.child}function Dg(e,t){var a=t.ref;(e===null&&a!==null||e!==null&&e.ref!==a)&&(t.flags|=512,t.flags|=2097152)}function Fc(e,t,a,n,r){var s=la(a)?xs:Qt.current;return s=tr(t,s),ir(t,r),a=_c(e,t,a,n,s,r),n=Ic(),e!==null&&!da?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~r,bn(e,t,r)):(ct&&n&&fc(t),t.flags|=1,na(e,t,a,r),t.child)}function Og(e,t,a,n,r){if(la(a)){var s=!0;Si(t)}else s=!1;if(ir(t,r),t.stateNode===null)Ui(e,t),Sg(t,a,n),Lc(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=_a(c):(c=la(a)?xs:Qt.current,c=tr(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)&&Cg(t,o,n,c),Jn=!1;var f=t.memoizedState;o.state=f,Ai(t,n,o,r),l=t.memoizedState,i!==n||f!==l||ia.current||Jn?(typeof u=="function"&&(Oc(t,a,u,n),l=t.memoizedState),(i=Jn||Ng(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,Zm(e,t),i=t.memoizedProps,c=t.type===t.elementType?i:qa(t.type,i),o.props=c,p=t.pendingProps,f=o.context,l=a.contextType,typeof l=="object"&&l!==null?l=_a(l):(l=la(a)?xs:Qt.current,l=tr(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)&&Cg(t,o,n,l),Jn=!1,f=t.memoizedState,o.state=f,Ai(t,n,o,r);var x=t.memoizedState;i!==p||f!==x||ia.current||Jn?(typeof v=="function"&&(Oc(t,a,v,n),x=t.memoizedState),(c=Jn||Ng(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 Bc(e,t,a,n,s,r)}function Bc(e,t,a,n,r,s){Dg(e,t);var o=(t.flags&128)!==0;if(!n&&!o)return r&&Bm(t,a,!1),bn(e,t,s);n=t.stateNode,V0.current=t;var i=o&&typeof a.getDerivedStateFromError!="function"?null:n.render();return t.flags|=1,e!==null&&o?(t.child=rr(t,e.child,null,s),t.child=rr(t,null,i,s)):na(e,t,i,s),t.memoizedState=n.state,r&&Bm(t,a,!0),t.child}function Lg(e){var t=e.stateNode;t.pendingContext?zm(e,t.pendingContext,t.pendingContext!==t.context):t.context&&zm(e,t.context,!1),Sc(e,t.containerInfo)}function Mg(e,t,a,n,r){return sr(),vc(r),t.flags|=256,na(e,t,a,n),t.child}var Uc={dehydrated:null,treeContext:null,retryLane:0};function qc(e){return{baseLanes:e,cachePool:null,transitions:null}}function zg(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),nt(mt,r&1),e===null)return hc(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=el(o,n,0,null),e=_s(e,n,a,null),s.return=t,e.return=t,s.sibling=e,t.child=s,t.child.memoizedState=qc(a),t.memoizedState=Uc,e):Vc(t,o));if(r=e.memoizedState,r!==null&&(i=r.dehydrated,i!==null))return W0(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=os(r,l),n.subtreeFlags=r.subtreeFlags&14680064),i!==null?s=os(i,s):(s=_s(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?qc(a):{baseLanes:o.baseLanes|a,cachePool:null,transitions:o.transitions},s.memoizedState=o,s.childLanes=e.childLanes&~a,t.memoizedState=Uc,n}return s=e.child,e=s.sibling,n=os(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 Vc(e,t){return t=el({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function Bi(e,t,a,n){return n!==null&&vc(n),rr(t,e.child,null,a),e=Vc(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function W0(e,t,a,n,r,s,o){if(a)return t.flags&256?(t.flags&=-257,n=Mc(Error(oe(422))),Bi(e,t,o,n)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(s=n.fallback,r=t.mode,n=el({mode:"visible",children:n.children},r,0,null),s=_s(s,r,o,null),s.flags|=2,n.return=t,s.return=t,n.sibling=s,t.child=n,t.mode&1&&rr(t,e.child,null,o),t.child.memoizedState=qc(o),t.memoizedState=Uc,s);if(!(t.mode&1))return Bi(e,t,o,null);if(r.data==="$!"){if(n=r.nextSibling&&r.nextSibling.dataset,n)var i=n.dgst;return n=i,s=Error(oe(419)),n=Mc(s,n,void 0),Bi(e,t,o,n)}if(i=(o&e.childLanes)!==0,da||i){if(n=Ft,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,hn(e,r),Ha(n,e,r,-1))}return ou(),n=Mc(Error(oe(421))),Bi(e,t,o,n)}return r.data==="$?"?(t.flags|=128,t.child=e.child,t=s1.bind(null,e),r._reactRetry=t,null):(e=s.treeContext,xa=Yn(r.nextSibling),ya=t,ct=!0,Ua=null,e!==null&&(Ta[Pa++]=mn,Ta[Pa++]=gn,Ta[Pa++]=ws,mn=e.id,gn=e.overflow,ws=t),t=Vc(t,n.children),t.flags|=4096,t)}function Fg(e,t,a){e.lanes|=t;var n=e.alternate;n!==null&&(n.lanes|=t),wc(e.return,t,a)}function Wc(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 Bg(e,t,a){var n=t.pendingProps,r=n.revealOrder,s=n.tail;if(na(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&&Fg(e,a,t);else if(e.tag===19)Fg(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(nt(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&&ji(e)===null&&(r=a),a=a.sibling;a=r,a===null?(r=t.child,t.child=null):(r=a.sibling,a.sibling=null),Wc(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&&ji(e)===null){t.child=r;break}e=r.sibling,r.sibling=a,a=r,r=e}Wc(t,!0,a,null,s);break;case"together":Wc(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Ui(e,t){!(t.mode&1)&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function bn(e,t,a){if(e!==null&&(t.dependencies=e.dependencies),Es|=t.lanes,!(a&t.childLanes))return null;if(e!==null&&t.child!==e.child)throw Error(oe(153));if(t.child!==null){for(e=t.child,a=os(e,e.pendingProps),t.child=a,a.return=t;e.sibling!==null;)e=e.sibling,a=a.sibling=os(e,e.pendingProps),a.return=t;a.sibling=null}return t.child}function H0(e,t,a){switch(t.tag){case 3:Lg(t),sr();break;case 5:tg(t);break;case 1:la(t.type)&&Si(t);break;case 4:Sc(t,t.stateNode.containerInfo);break;case 10:var n=t.type._context,r=t.memoizedProps.value;nt(_i,n._currentValue),n._currentValue=r;break;case 13:if(n=t.memoizedState,n!==null)return n.dehydrated!==null?(nt(mt,mt.current&1),t.flags|=128,null):a&t.child.childLanes?zg(e,t,a):(nt(mt,mt.current&1),e=bn(e,t,a),e!==null?e.sibling:null);nt(mt,mt.current&1);break;case 19:if(n=(a&t.childLanes)!==0,e.flags&128){if(n)return Bg(e,t,a);t.flags|=128}if(r=t.memoizedState,r!==null&&(r.rendering=null,r.tail=null,r.lastEffect=null),nt(mt,mt.current),n)break;return null;case 22:case 23:return t.lanes=0,jg(e,t,a)}return bn(e,t,a)}var Ug,Hc,qg,Vg;Ug=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}},Hc=function(){},qg=function(e,t,a,n){var r=e.memoizedProps;if(r!==n){e=t.stateNode,Ss(en.current);var s=null;switch(a){case"input":r=wd(e,r),n=wd(e,n),s=[];break;case"select":r=ft({},r,{value:void 0}),n=ft({},n,{value:void 0}),s=[];break;case"textarea":r=Sd(e,r),n=Sd(e,n),s=[];break;default:typeof r.onClick!="function"&&typeof n.onClick=="function"&&(e.onclick=wi)}Ed(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"&&(Lr.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"&&(Lr.hasOwnProperty(c)?(l!=null&&c==="onScroll"&&ot("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)}},Vg=function(e,t,a,n){a!==n&&(t.flags|=4)};function xo(e,t){if(!ct)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 Zt(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 G0(e,t,a){var n=t.pendingProps;switch(mc(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Zt(t),null;case 1:return la(t.type)&&Ni(),Zt(t),null;case 3:return n=t.stateNode,lr(),it(ia),it(Qt),$c(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),(e===null||e.child===null)&&(Ti(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&!(t.flags&256)||(t.flags|=1024,Ua!==null&&(nu(Ua),Ua=null))),Hc(e,t),Zt(t),null;case 5:Cc(t);var r=Ss(go.current);if(a=t.type,e!==null&&t.stateNode!=null)qg(e,t,a,n,r),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!n){if(t.stateNode===null)throw Error(oe(166));return Zt(t),null}if(e=Ss(en.current),Ti(t)){n=t.stateNode,a=t.type;var s=t.memoizedProps;switch(n[Ja]=t,n[co]=s,e=(t.mode&1)!==0,a){case"dialog":ot("cancel",n),ot("close",n);break;case"iframe":case"object":case"embed":ot("load",n);break;case"video":case"audio":for(r=0;r<oo.length;r++)ot(oo[r],n);break;case"source":ot("error",n);break;case"img":case"image":case"link":ot("error",n),ot("load",n);break;case"details":ot("toggle",n);break;case"input":Sf(n,s),ot("invalid",n);break;case"select":n._wrapperState={wasMultiple:!!s.multiple},ot("invalid",n);break;case"textarea":$f(n,s),ot("invalid",n)}Ed(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&&xi(n.textContent,i,e),r=["children",i]):typeof i=="number"&&n.textContent!==""+i&&(s.suppressHydrationWarning!==!0&&xi(n.textContent,i,e),r=["children",""+i]):Lr.hasOwnProperty(o)&&i!=null&&o==="onScroll"&&ot("scroll",n)}switch(a){case"input":Xo(n),Ef(n,s,!0);break;case"textarea":Xo(n),Pf(n);break;case"select":case"option":break;default:typeof s.onClick=="function"&&(n.onclick=wi)}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=_f(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[Ja]=t,e[co]=n,Ug(e,t,!1,!1),t.stateNode=e;e:{switch(o=$d(a,n),a){case"dialog":ot("cancel",e),ot("close",e),r=n;break;case"iframe":case"object":case"embed":ot("load",e),r=n;break;case"video":case"audio":for(r=0;r<oo.length;r++)ot(oo[r],e);r=n;break;case"source":ot("error",e),r=n;break;case"img":case"image":case"link":ot("error",e),ot("load",e),r=n;break;case"details":ot("toggle",e),r=n;break;case"input":Sf(e,n),r=wd(e,n),ot("invalid",e);break;case"option":r=n;break;case"select":e._wrapperState={wasMultiple:!!n.multiple},r=ft({},n,{value:void 0}),ot("invalid",e);break;case"textarea":$f(e,n),r=Sd(e,n),ot("invalid",e);break;default:r=n}Ed(a,r),i=r;for(s in i)if(i.hasOwnProperty(s)){var l=i[s];s==="style"?Af(e,l):s==="dangerouslySetInnerHTML"?(l=l?l.__html:void 0,l!=null&&If(e,l)):s==="children"?typeof l=="string"?(a!=="textarea"||l!=="")&&Br(e,l):typeof l=="number"&&Br(e,""+l):s!=="suppressContentEditableWarning"&&s!=="suppressHydrationWarning"&&s!=="autoFocus"&&(Lr.hasOwnProperty(s)?l!=null&&s==="onScroll"&&ot("scroll",e):l!=null&&cd(e,s,l,o))}switch(a){case"input":Xo(e),Ef(e,n,!1);break;case"textarea":Xo(e),Pf(e);break;case"option":n.value!=null&&e.setAttribute("value",""+Un(n.value));break;case"select":e.multiple=!!n.multiple,s=n.value,s!=null?qs(e,!!n.multiple,s,!1):n.defaultValue!=null&&qs(e,!!n.multiple,n.defaultValue,!0);break;default:typeof r.onClick=="function"&&(e.onclick=wi)}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 Zt(t),null;case 6:if(e&&t.stateNode!=null)Vg(e,t,e.memoizedProps,n);else{if(typeof n!="string"&&t.stateNode===null)throw Error(oe(166));if(a=Ss(go.current),Ss(en.current),Ti(t)){if(n=t.stateNode,a=t.memoizedProps,n[Ja]=t,(s=n.nodeValue!==a)&&(e=ya,e!==null))switch(e.tag){case 3:xi(n.nodeValue,a,(e.mode&1)!==0);break;case 5:e.memoizedProps.suppressHydrationWarning!==!0&&xi(n.nodeValue,a,(e.mode&1)!==0)}s&&(t.flags|=4)}else n=(a.nodeType===9?a:a.ownerDocument).createTextNode(n),n[Ja]=t,t.stateNode=n}return Zt(t),null;case 13:if(it(mt),n=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(ct&&xa!==null&&t.mode&1&&!(t.flags&128))Gm(),sr(),t.flags|=98560,s=!1;else if(s=Ti(t),n!==null&&n.dehydrated!==null){if(e===null){if(!s)throw Error(oe(318));if(s=t.memoizedState,s=s!==null?s.dehydrated:null,!s)throw Error(oe(317));s[Ja]=t}else sr(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Zt(t),s=!1}else Ua!==null&&(nu(Ua),Ua=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?Dt===0&&(Dt=3):ou())),t.updateQueue!==null&&(t.flags|=4),Zt(t),null);case 4:return lr(),Hc(e,t),e===null&&io(t.stateNode.containerInfo),Zt(t),null;case 10:return xc(t.type._context),Zt(t),null;case 17:return la(t.type)&&Ni(),Zt(t),null;case 19:if(it(mt),s=t.memoizedState,s===null)return Zt(t),null;if(n=(t.flags&128)!==0,o=s.rendering,o===null)if(n)xo(s,!1);else{if(Dt!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=ji(e),o!==null){for(t.flags|=128,xo(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 nt(mt,mt.current&1|2),t.child}e=e.sibling}s.tail!==null&&kt()>pr&&(t.flags|=128,n=!0,xo(s,!1),t.lanes=4194304)}else{if(!n)if(e=ji(o),e!==null){if(t.flags|=128,n=!0,a=e.updateQueue,a!==null&&(t.updateQueue=a,t.flags|=4),xo(s,!0),s.tail===null&&s.tailMode==="hidden"&&!o.alternate&&!ct)return Zt(t),null}else 2*kt()-s.renderingStartTime>pr&&a!==1073741824&&(t.flags|=128,n=!0,xo(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=kt(),t.sibling=null,a=mt.current,nt(mt,n?a&1|2:a&1),t):(Zt(t),null);case 22:case 23:return ru(),n=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==n&&(t.flags|=8192),n&&t.mode&1?wa&1073741824&&(Zt(t),t.subtreeFlags&6&&(t.flags|=8192)):Zt(t),null;case 24:return null;case 25:return null}throw Error(oe(156,t.tag))}function K0(e,t){switch(mc(t),t.tag){case 1:return la(t.type)&&Ni(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return lr(),it(ia),it(Qt),$c(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return Cc(t),null;case 13:if(it(mt),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(oe(340));sr()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return it(mt),null;case 4:return lr(),null;case 10:return xc(t.type._context),null;case 22:case 23:return ru(),null;case 24:return null;default:return null}}var qi=!1,Jt=!1,Y0=typeof WeakSet=="function"?WeakSet:Set,pe=null;function cr(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 Gc(e,t,a){try{a()}catch(n){bt(e,t,n)}}var Wg=!1;function Q0(e,t){if(rc=di,e=Nm(),Xd(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(oc={focusedElem:e,selectionRange:a},di=!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:qa(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(oe(163))}}catch(y){bt(t,t.return,y)}if(e=t.sibling,e!==null){e.return=t.return,pe=e;break}pe=t.return}return x=Wg,Wg=!1,x}function wo(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&&Gc(t,a,s)}r=r.next}while(r!==n)}}function Vi(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 Kc(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 Hg(e){var t=e.alternate;t!==null&&(e.alternate=null,Hg(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Ja],delete t[co],delete t[cc],delete t[R0],delete t[A0])),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 Gg(e){return e.tag===5||e.tag===3||e.tag===4}function Kg(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Gg(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 Yc(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=wi));else if(n!==4&&(e=e.child,e!==null))for(Yc(e,t,a),e=e.sibling;e!==null;)Yc(e,t,a),e=e.sibling}function Qc(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(Qc(e,t,a),e=e.sibling;e!==null;)Qc(e,t,a),e=e.sibling}var Wt=null,Va=!1;function ts(e,t,a){for(a=a.child;a!==null;)Yg(e,t,a),a=a.sibling}function Yg(e,t,a){if(Za&&typeof Za.onCommitFiberUnmount=="function")try{Za.onCommitFiberUnmount(ni,a)}catch{}switch(a.tag){case 5:Jt||cr(a,t);case 6:var n=Wt,r=Va;Wt=null,ts(e,t,a),Wt=n,Va=r,Wt!==null&&(Va?(e=Wt,a=a.stateNode,e.nodeType===8?e.parentNode.removeChild(a):e.removeChild(a)):Wt.removeChild(a.stateNode));break;case 18:Wt!==null&&(Va?(e=Wt,a=a.stateNode,e.nodeType===8?dc(e.parentNode,a):e.nodeType===1&&dc(e,a),Zr(e)):dc(Wt,a.stateNode));break;case 4:n=Wt,r=Va,Wt=a.stateNode.containerInfo,Va=!0,ts(e,t,a),Wt=n,Va=r;break;case 0:case 11:case 14:case 15:if(!Jt&&(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)&&Gc(a,t,o),r=r.next}while(r!==n)}ts(e,t,a);break;case 1:if(!Jt&&(cr(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)}ts(e,t,a);break;case 21:ts(e,t,a);break;case 22:a.mode&1?(Jt=(n=Jt)||a.memoizedState!==null,ts(e,t,a),Jt=n):ts(e,t,a);break;default:ts(e,t,a)}}function Qg(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var a=e.stateNode;a===null&&(a=e.stateNode=new Y0),t.forEach(function(n){var r=r1.bind(null,e,n);a.has(n)||(a.add(n),n.then(r,r))})}}function Wa(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:Wt=i.stateNode,Va=!1;break e;case 3:Wt=i.stateNode.containerInfo,Va=!0;break e;case 4:Wt=i.stateNode.containerInfo,Va=!0;break e}i=i.return}if(Wt===null)throw Error(oe(160));Yg(s,o,r),Wt=null,Va=!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;)Xg(t,e),t=t.sibling}function Xg(e,t){var a=e.alternate,n=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(Wa(t,e),an(e),n&4){try{wo(3,e,e.return),Vi(3,e)}catch(b){bt(e,e.return,b)}try{wo(5,e,e.return)}catch(b){bt(e,e.return,b)}}break;case 1:Wa(t,e),an(e),n&512&&a!==null&&cr(a,a.return);break;case 5:if(Wa(t,e),an(e),n&512&&a!==null&&cr(a,a.return),e.flags&32){var r=e.stateNode;try{Br(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&&Cf(r,s),$d(i,o);var c=$d(i,s);for(o=0;o<l.length;o+=2){var u=l[o],p=l[o+1];u==="style"?Af(r,p):u==="dangerouslySetInnerHTML"?If(r,p):u==="children"?Br(r,p):cd(r,u,p,c)}switch(i){case"input":kd(r,s);break;case"textarea":Tf(r,s);break;case"select":var f=r._wrapperState.wasMultiple;r._wrapperState.wasMultiple=!!s.multiple;var v=s.value;v!=null?qs(r,!!s.multiple,v,!1):f!==!!s.multiple&&(s.defaultValue!=null?qs(r,!!s.multiple,s.defaultValue,!0):qs(r,!!s.multiple,s.multiple?[]:"",!1))}r[co]=s}catch(b){bt(e,e.return,b)}}break;case 6:if(Wa(t,e),an(e),n&4){if(e.stateNode===null)throw Error(oe(162));r=e.stateNode,s=e.memoizedProps;try{r.nodeValue=s}catch(b){bt(e,e.return,b)}}break;case 3:if(Wa(t,e),an(e),n&4&&a!==null&&a.memoizedState.isDehydrated)try{Zr(t.containerInfo)}catch(b){bt(e,e.return,b)}break;case 4:Wa(t,e),an(e);break;case 13:Wa(t,e),an(e),r=e.child,r.flags&8192&&(s=r.memoizedState!==null,r.stateNode.isHidden=s,!s||r.alternate!==null&&r.alternate.memoizedState!==null||(Jc=kt())),n&4&&Qg(e);break;case 22:if(u=a!==null&&a.memoizedState!==null,e.mode&1?(Jt=(c=Jt)||u,Wa(t,e),Jt=c):Wa(t,e),an(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:wo(4,f,f.return);break;case 1:cr(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:cr(f,f.return);break;case 22:if(f.memoizedState!==null){eh(p);continue}}v!==null?(v.return=f,pe=v):eh(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=Rf("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:Wa(t,e),an(e),n&4&&Qg(e);break;case 21:break;default:Wa(t,e),an(e)}}function an(e){var t=e.flags;if(t&2){try{e:{for(var a=e.return;a!==null;){if(Gg(a)){var n=a;break e}a=a.return}throw Error(oe(160))}switch(n.tag){case 5:var r=n.stateNode;n.flags&32&&(Br(r,""),n.flags&=-33);var s=Kg(e);Qc(e,s,r);break;case 3:case 4:var o=n.stateNode.containerInfo,i=Kg(e);Yc(e,i,o);break;default:throw Error(oe(161))}}catch(l){bt(e,e.return,l)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function X0(e,t,a){pe=e,Zg(e)}function Zg(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||qi;if(!o){var i=r.alternate,l=i!==null&&i.memoizedState!==null||Jt;i=qi;var c=Jt;if(qi=o,(Jt=l)&&!c)for(pe=r;pe!==null;)o=pe,l=o.child,o.tag===22&&o.memoizedState!==null?th(r):l!==null?(l.return=o,pe=l):th(r);for(;s!==null;)pe=s,Zg(s),s=s.sibling;pe=r,qi=i,Jt=c}Jg(e)}else r.subtreeFlags&8772&&s!==null?(s.return=r,pe=s):Jg(e)}}function Jg(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:Jt||Vi(5,t);break;case 1:var n=t.stateNode;if(t.flags&4&&!Jt)if(a===null)n.componentDidMount();else{var r=t.elementType===t.type?a.memoizedProps:qa(t.type,a.memoizedProps);n.componentDidUpdate(r,a.memoizedState,n.__reactInternalSnapshotBeforeUpdate)}var s=t.updateQueue;s!==null&&eg(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}eg(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&&Zr(p)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;default:throw Error(oe(163))}Jt||t.flags&512&&Kc(t)}catch(f){bt(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 eh(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 th(e){for(;pe!==null;){var t=pe;try{switch(t.tag){case 0:case 11:case 15:var a=t.return;try{Vi(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{Kc(t)}catch(l){bt(t,s,l)}break;case 5:var o=t.return;try{Kc(t)}catch(l){bt(t,o,l)}}}catch(l){bt(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 Z0=Math.ceil,Wi=un.ReactCurrentDispatcher,Xc=un.ReactCurrentOwner,Ra=un.ReactCurrentBatchConfig,qe=0,Ft=null,$t=null,Ht=0,wa=0,ur=Qn(0),Dt=0,ko=null,Es=0,Hi=0,Zc=0,No=null,ca=null,Jc=0,pr=1/0,yn=null,Gi=!1,eu=null,as=null,Ki=!1,ns=null,Yi=0,So=0,tu=null,Qi=-1,Xi=0;function sa(){return qe&6?kt():Qi!==-1?Qi:Qi=kt()}function ss(e){return e.mode&1?qe&2&&Ht!==0?Ht&-Ht:D0.transition!==null?(Xi===0&&(Xi=Kf()),Xi):(e=Qe,e!==0||(e=window.event,e=e===void 0?16:nm(e.type)),e):1}function Ha(e,t,a,n){if(50<So)throw So=0,tu=null,Error(oe(185));Gr(e,a,n),(!(qe&2)||e!==Ft)&&(e===Ft&&(!(qe&2)&&(Hi|=a),Dt===4&&rs(e,Ht)),ua(e,n),a===1&&qe===0&&!(t.mode&1)&&(pr=kt()+500,Ci&&Zn()))}function ua(e,t){var a=e.callbackNode;Dw(e,t);var n=oi(e,e===Ft?Ht:0);if(n===0)a!==null&&Wf(a),e.callbackNode=null,e.callbackPriority=0;else if(t=n&-n,e.callbackPriority!==t){if(a!=null&&Wf(a),t===1)e.tag===0?j0(nh.bind(null,e)):Um(nh.bind(null,e)),_0(function(){!(qe&6)&&Zn()}),a=null;else{switch(Yf(n)){case 1:a=jd;break;case 4:a=Hf;break;case 16:a=ai;break;case 536870912:a=Gf;break;default:a=ai}a=uh(a,ah.bind(null,e))}e.callbackPriority=t,e.callbackNode=a}}function ah(e,t){if(Qi=-1,Xi=0,qe&6)throw Error(oe(327));var a=e.callbackNode;if(fr()&&e.callbackNode!==a)return null;var n=oi(e,e===Ft?Ht:0);if(n===0)return null;if(n&30||n&e.expiredLanes||t)t=Zi(e,n);else{t=n;var r=qe;qe|=2;var s=rh();(Ft!==e||Ht!==t)&&(yn=null,pr=kt()+500,Ts(e,t));do try{t1();break}catch(i){sh(e,i)}while(!0);yc(),Wi.current=s,qe=r,$t!==null?t=0:(Ft=null,Ht=0,t=Dt)}if(t!==0){if(t===2&&(r=Dd(e),r!==0&&(n=r,t=au(e,r))),t===1)throw a=ko,Ts(e,0),rs(e,n),ua(e,kt()),a;if(t===6)rs(e,n);else{if(r=e.current.alternate,!(n&30)&&!J0(r)&&(t=Zi(e,n),t===2&&(s=Dd(e),s!==0&&(n=s,t=au(e,s))),t===1))throw a=ko,Ts(e,0),rs(e,n),ua(e,kt()),a;switch(e.finishedWork=r,e.finishedLanes=n,t){case 0:case 1:throw Error(oe(345));case 2:Ps(e,ca,yn);break;case 3:if(rs(e,n),(n&130023424)===n&&(t=Jc+500-kt(),10<t)){if(oi(e,0)!==0)break;if(r=e.suspendedLanes,(r&n)!==n){sa(),e.pingedLanes|=e.suspendedLanes&r;break}e.timeoutHandle=lc(Ps.bind(null,e,ca,yn),t);break}Ps(e,ca,yn);break;case 4:if(rs(e,n),(n&4194240)===n)break;for(t=e.eventTimes,r=-1;0<n;){var o=31-Fa(n);s=1<<o,o=t[o],o>r&&(r=o),n&=~s}if(n=r,n=kt()-n,n=(120>n?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*Z0(n/1960))-n,10<n){e.timeoutHandle=lc(Ps.bind(null,e,ca,yn),n);break}Ps(e,ca,yn);break;case 5:Ps(e,ca,yn);break;default:throw Error(oe(329))}}}return ua(e,kt()),e.callbackNode===a?ah.bind(null,e):null}function au(e,t){var a=No;return e.current.memoizedState.isDehydrated&&(Ts(e,t).flags|=256),e=Zi(e,t),e!==2&&(t=ca,ca=a,t!==null&&nu(t)),e}function nu(e){ca===null?ca=e:ca.push.apply(ca,e)}function J0(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(!Ba(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 rs(e,t){for(t&=~Zc,t&=~Hi,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var a=31-Fa(t),n=1<<a;e[a]=-1,t&=~n}}function nh(e){if(qe&6)throw Error(oe(327));fr();var t=oi(e,0);if(!(t&1))return ua(e,kt()),null;var a=Zi(e,t);if(e.tag!==0&&a===2){var n=Dd(e);n!==0&&(t=n,a=au(e,n))}if(a===1)throw a=ko,Ts(e,0),rs(e,t),ua(e,kt()),a;if(a===6)throw Error(oe(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,Ps(e,ca,yn),ua(e,kt()),null}function su(e,t){var a=qe;qe|=1;try{return e(t)}finally{qe=a,qe===0&&(pr=kt()+500,Ci&&Zn())}}function $s(e){ns!==null&&ns.tag===0&&!(qe&6)&&fr();var t=qe;qe|=1;var a=Ra.transition,n=Qe;try{if(Ra.transition=null,Qe=1,e)return e()}finally{Qe=n,Ra.transition=a,qe=t,!(qe&6)&&Zn()}}function ru(){wa=ur.current,it(ur)}function Ts(e,t){e.finishedWork=null,e.finishedLanes=0;var a=e.timeoutHandle;if(a!==-1&&(e.timeoutHandle=-1,P0(a)),$t!==null)for(a=$t.return;a!==null;){var n=a;switch(mc(n),n.tag){case 1:n=n.type.childContextTypes,n!=null&&Ni();break;case 3:lr(),it(ia),it(Qt),$c();break;case 5:Cc(n);break;case 4:lr();break;case 13:it(mt);break;case 19:it(mt);break;case 10:xc(n.type._context);break;case 22:case 23:ru()}a=a.return}if(Ft=e,$t=e=os(e.current,null),Ht=wa=t,Dt=0,ko=null,Zc=Hi=Es=0,ca=No=null,Ns!==null){for(t=0;t<Ns.length;t++)if(a=Ns[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}Ns=null}return e}function sh(e,t){do{var a=$t;try{if(yc(),Di.current=zi,Oi){for(var n=gt.memoizedState;n!==null;){var r=n.queue;r!==null&&(r.pending=null),n=n.next}Oi=!1}if(Cs=0,zt=jt=gt=null,ho=!1,vo=0,Xc.current=null,a===null||a.return===null){Dt=1,ko=t,$t=null;break}e:{var s=e,o=a.return,i=a,l=t;if(t=Ht,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=Pg(o);if(v!==null){v.flags&=-257,_g(v,o,i,s,t),v.mode&1&&Tg(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)){Tg(s,c,t),ou();break e}l=Error(oe(426))}}else if(ct&&i.mode&1){var k=Pg(o);if(k!==null){!(k.flags&65536)&&(k.flags|=256),_g(k,o,i,s,t),vc(dr(l,i));break e}}s=l=dr(l,i),Dt!==4&&(Dt=2),No===null?No=[s]:No.push(s),s=o;do{switch(s.tag){case 3:s.flags|=65536,t&=-t,s.lanes|=t;var g=Eg(s,l,t);Jm(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"&&(as===null||!as.has(h)))){s.flags|=65536,t&=-t,s.lanes|=t;var y=$g(s,i,t);Jm(s,y);break e}}s=s.return}while(s!==null)}ih(a)}catch(S){t=S,$t===a&&a!==null&&($t=a=a.return);continue}break}while(!0)}function rh(){var e=Wi.current;return Wi.current=zi,e===null?zi:e}function ou(){(Dt===0||Dt===3||Dt===2)&&(Dt=4),Ft===null||!(Es&268435455)&&!(Hi&268435455)||rs(Ft,Ht)}function Zi(e,t){var a=qe;qe|=2;var n=rh();(Ft!==e||Ht!==t)&&(yn=null,Ts(e,t));do try{e1();break}catch(r){sh(e,r)}while(!0);if(yc(),qe=a,Wi.current=n,$t!==null)throw Error(oe(261));return Ft=null,Ht=0,Dt}function e1(){for(;$t!==null;)oh($t)}function t1(){for(;$t!==null&&!Ew();)oh($t)}function oh(e){var t=ch(e.alternate,e,wa);e.memoizedProps=e.pendingProps,t===null?ih(e):$t=t,Xc.current=null}function ih(e){var t=e;do{var a=t.alternate;if(e=t.return,t.flags&32768){if(a=K0(a,t),a!==null){a.flags&=32767,$t=a;return}if(e!==null)e.flags|=32768,e.subtreeFlags=0,e.deletions=null;else{Dt=6,$t=null;return}}else if(a=G0(a,t,wa),a!==null){$t=a;return}if(t=t.sibling,t!==null){$t=t;return}$t=t=e}while(t!==null);Dt===0&&(Dt=5)}function Ps(e,t,a){var n=Qe,r=Ra.transition;try{Ra.transition=null,Qe=1,a1(e,t,a,n)}finally{Ra.transition=r,Qe=n}return null}function a1(e,t,a,n){do fr();while(ns!==null);if(qe&6)throw Error(oe(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(oe(177));e.callbackNode=null,e.callbackPriority=0;var s=a.lanes|a.childLanes;if(Ow(e,s),e===Ft&&($t=Ft=null,Ht=0),!(a.subtreeFlags&2064)&&!(a.flags&2064)||Ki||(Ki=!0,uh(ai,function(){return fr(),null})),s=(a.flags&15990)!==0,a.subtreeFlags&15990||s){s=Ra.transition,Ra.transition=null;var o=Qe;Qe=1;var i=qe;qe|=4,Xc.current=null,Q0(e,a),Xg(a,e),k0(oc),di=!!rc,oc=rc=null,e.current=a,X0(a),$w(),qe=i,Qe=o,Ra.transition=s}else e.current=a;if(Ki&&(Ki=!1,ns=e,Yi=r),s=e.pendingLanes,s===0&&(as=null),_w(a.stateNode),ua(e,kt()),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(Gi)throw Gi=!1,e=eu,eu=null,e;return Yi&1&&e.tag!==0&&fr(),s=e.pendingLanes,s&1?e===tu?So++:(So=0,tu=e):So=0,Zn(),null}function fr(){if(ns!==null){var e=Yf(Yi),t=Ra.transition,a=Qe;try{if(Ra.transition=null,Qe=16>e?16:e,ns===null)var n=!1;else{if(e=ns,ns=null,Yi=0,qe&6)throw Error(oe(331));var r=qe;for(qe|=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:wo(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(Hg(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:wo(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:Vi(9,i)}}catch(S){bt(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(qe=r,Zn(),Za&&typeof Za.onPostCommitFiberRoot=="function")try{Za.onPostCommitFiberRoot(ni,e)}catch{}n=!0}return n}finally{Qe=a,Ra.transition=t}}return!1}function lh(e,t,a){t=dr(a,t),t=Eg(e,t,1),e=es(e,t,1),t=sa(),e!==null&&(Gr(e,1,t),ua(e,t))}function bt(e,t,a){if(e.tag===3)lh(e,e,a);else for(;t!==null;){if(t.tag===3){lh(t,e,a);break}else if(t.tag===1){var n=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof n.componentDidCatch=="function"&&(as===null||!as.has(n))){e=dr(a,e),e=$g(t,e,1),t=es(t,e,1),e=sa(),t!==null&&(Gr(t,1,e),ua(t,e));break}}t=t.return}}function n1(e,t,a){var n=e.pingCache;n!==null&&n.delete(t),t=sa(),e.pingedLanes|=e.suspendedLanes&a,Ft===e&&(Ht&a)===a&&(Dt===4||Dt===3&&(Ht&130023424)===Ht&&500>kt()-Jc?Ts(e,0):Zc|=a),ua(e,t)}function dh(e,t){t===0&&(e.mode&1?(t=ri,ri<<=1,!(ri&130023424)&&(ri=4194304)):t=1);var a=sa();e=hn(e,t),e!==null&&(Gr(e,t,a),ua(e,a))}function s1(e){var t=e.memoizedState,a=0;t!==null&&(a=t.retryLane),dh(e,a)}function r1(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(oe(314))}n!==null&&n.delete(t),dh(e,a)}var ch;ch=function(e,t,a){if(e!==null)if(e.memoizedProps!==t.pendingProps||ia.current)da=!0;else{if(!(e.lanes&a)&&!(t.flags&128))return da=!1,H0(e,t,a);da=!!(e.flags&131072)}else da=!1,ct&&t.flags&1048576&&qm(t,$i,t.index);switch(t.lanes=0,t.tag){case 2:var n=t.type;Ui(e,t),e=t.pendingProps;var r=tr(t,Qt.current);ir(t,a),r=_c(null,t,n,e,r,a);var s=Ic();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,la(n)?(s=!0,Si(t)):s=!1,t.memoizedState=r.state!==null&&r.state!==void 0?r.state:null,Nc(t),r.updater=Fi,t.stateNode=r,r._reactInternals=t,Lc(t,n,e,a),t=Bc(null,t,n,!0,s,a)):(t.tag=0,ct&&s&&fc(t),na(null,t,r,a),t=t.child),t;case 16:n=t.elementType;e:{switch(Ui(e,t),e=t.pendingProps,r=n._init,n=r(n._payload),t.type=n,r=t.tag=i1(n),e=qa(n,e),r){case 0:t=Fc(null,t,n,e,a);break e;case 1:t=Og(null,t,n,e,a);break e;case 11:t=Ig(null,t,n,e,a);break e;case 14:t=Rg(null,t,n,qa(n.type,e),a);break e}throw Error(oe(306,n,""))}return t;case 0:return n=t.type,r=t.pendingProps,r=t.elementType===n?r:qa(n,r),Fc(e,t,n,r,a);case 1:return n=t.type,r=t.pendingProps,r=t.elementType===n?r:qa(n,r),Og(e,t,n,r,a);case 3:e:{if(Lg(t),e===null)throw Error(oe(387));n=t.pendingProps,s=t.memoizedState,r=s.element,Zm(e,t),Ai(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=dr(Error(oe(423)),t),t=Mg(e,t,n,a,r);break e}else if(n!==r){r=dr(Error(oe(424)),t),t=Mg(e,t,n,a,r);break e}else for(xa=Yn(t.stateNode.containerInfo.firstChild),ya=t,ct=!0,Ua=null,a=Qm(t,null,n,a),t.child=a;a;)a.flags=a.flags&-3|4096,a=a.sibling;else{if(sr(),n===r){t=bn(e,t,a);break e}na(e,t,n,a)}t=t.child}return t;case 5:return tg(t),e===null&&hc(t),n=t.type,r=t.pendingProps,s=e!==null?e.memoizedProps:null,o=r.children,ic(n,r)?o=null:s!==null&&ic(n,s)&&(t.flags|=32),Dg(e,t),na(e,t,o,a),t.child;case 6:return e===null&&hc(t),null;case 13:return zg(e,t,a);case 4:return Sc(t,t.stateNode.containerInfo),n=t.pendingProps,e===null?t.child=rr(t,null,n,a):na(e,t,n,a),t.child;case 11:return n=t.type,r=t.pendingProps,r=t.elementType===n?r:qa(n,r),Ig(e,t,n,r,a);case 7:return na(e,t,t.pendingProps,a),t.child;case 8:return na(e,t,t.pendingProps.children,a),t.child;case 12:return na(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,nt(_i,n._currentValue),n._currentValue=o,s!==null)if(Ba(s.value,o)){if(s.children===r.children&&!ia.current){t=bn(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=vn(-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),wc(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(oe(341));o.lanes|=a,i=o.alternate,i!==null&&(i.lanes|=a),wc(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}na(e,t,r.children,a),t=t.child}return t;case 9:return r=t.type,n=t.pendingProps.children,ir(t,a),r=_a(r),n=n(r),t.flags|=1,na(e,t,n,a),t.child;case 14:return n=t.type,r=qa(n,t.pendingProps),r=qa(n.type,r),Rg(e,t,n,r,a);case 15:return Ag(e,t,t.type,t.pendingProps,a);case 17:return n=t.type,r=t.pendingProps,r=t.elementType===n?r:qa(n,r),Ui(e,t),t.tag=1,la(n)?(e=!0,Si(t)):e=!1,ir(t,a),Sg(t,n,r),Lc(t,n,r,a),Bc(null,t,n,!0,e,a);case 19:return Bg(e,t,a);case 22:return jg(e,t,a)}throw Error(oe(156,t.tag))};function uh(e,t){return Vf(e,t)}function o1(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 Aa(e,t,a,n){return new o1(e,t,a,n)}function iu(e){return e=e.prototype,!(!e||!e.isReactComponent)}function i1(e){if(typeof e=="function")return iu(e)?1:0;if(e!=null){if(e=e.$$typeof,e===fd)return 11;if(e===hd)return 14}return 2}function os(e,t){var a=e.alternate;return a===null?(a=Aa(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 Ji(e,t,a,n,r,s){var o=2;if(n=e,typeof e=="function")iu(e)&&(o=1);else if(typeof e=="string")o=5;else e:switch(e){case Us:return _s(a.children,r,s,t);case ud:o=8,r|=8;break;case pd:return e=Aa(12,a,t,r|2),e.elementType=pd,e.lanes=s,e;case md:return e=Aa(13,a,t,r),e.elementType=md,e.lanes=s,e;case gd:return e=Aa(19,a,t,r),e.elementType=gd,e.lanes=s,e;case xf:return el(a,r,s,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case bf:o=10;break e;case yf:o=9;break e;case fd:o=11;break e;case hd:o=14;break e;case Bn:o=16,n=null;break e}throw Error(oe(130,e==null?e:typeof e,""))}return t=Aa(o,a,t,r),t.elementType=e,t.type=n,t.lanes=s,t}function _s(e,t,a,n){return e=Aa(7,e,n,t),e.lanes=a,e}function el(e,t,a,n){return e=Aa(22,e,n,t),e.elementType=xf,e.lanes=a,e.stateNode={isHidden:!1},e}function lu(e,t,a){return e=Aa(6,e,null,t),e.lanes=a,e}function du(e,t,a){return t=Aa(4,e.children!==null?e.children:[],e.key,t),t.lanes=a,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function l1(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=Od(0),this.expirationTimes=Od(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Od(0),this.identifierPrefix=n,this.onRecoverableError=r,this.mutableSourceEagerHydrationData=null}function cu(e,t,a,n,r,s,o,i,l){return e=new l1(e,t,a,i,l),t===1?(t=1,s===!0&&(t|=8)):t=0,s=Aa(3,null,null,t),e.current=s,s.stateNode=e,s.memoizedState={element:n,isDehydrated:a,cache:null,transitions:null,pendingSuspenseBoundaries:null},Nc(s),e}function d1(e,t,a){var n=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:Bs,key:n==null?null:""+n,children:e,containerInfo:t,implementation:a}}function ph(e){if(!e)return Xn;e=e._reactInternals;e:{if(bs(e)!==e||e.tag!==1)throw Error(oe(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(la(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(t!==null);throw Error(oe(171))}if(e.tag===1){var a=e.type;if(la(a))return Fm(e,a,t)}return t}function fh(e,t,a,n,r,s,o,i,l){return e=cu(a,n,!0,e,r,s,o,i,l),e.context=ph(null),a=e.current,n=sa(),r=ss(a),s=vn(n,r),s.callback=t??null,es(a,s,r),e.current.lanes=r,Gr(e,r,n),ua(e,n),e}function tl(e,t,a,n){var r=t.current,s=sa(),o=ss(r);return a=ph(a),t.context===null?t.context=a:t.pendingContext=a,t=vn(s,o),t.payload={element:e},n=n===void 0?null:n,n!==null&&(t.callback=n),e=es(r,t,o),e!==null&&(Ha(e,r,o,s),Ri(e,r,o)),o}function al(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 mh(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var a=e.retryLane;e.retryLane=a!==0&&a<t?a:t}}function uu(e,t){mh(e,t),(e=e.alternate)&&mh(e,t)}function c1(){return null}var gh=typeof reportError=="function"?reportError:function(e){console.error(e)};function pu(e){this._internalRoot=e}nl.prototype.render=pu.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(oe(409));tl(e,t,null,null)},nl.prototype.unmount=pu.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;$s(function(){tl(null,e,null,null)}),t[pn]=null}};function nl(e){this._internalRoot=e}nl.prototype.unstable_scheduleHydration=function(e){if(e){var t=Zf();e={blockedOn:null,target:e,priority:t};for(var a=0;a<Hn.length&&t!==0&&t<Hn[a].priority;a++);Hn.splice(a,0,e),a===0&&tm(e)}};function fu(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function sl(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11&&(e.nodeType!==8||e.nodeValue!==" react-mount-point-unstable "))}function hh(){}function u1(e,t,a,n,r){if(r){if(typeof n=="function"){var s=n;n=function(){var c=al(o);s.call(c)}}var o=fh(t,n,e,0,null,!1,!1,"",hh);return e._reactRootContainer=o,e[pn]=o.current,io(e.nodeType===8?e.parentNode:e),$s(),o}for(;r=e.lastChild;)e.removeChild(r);if(typeof n=="function"){var i=n;n=function(){var c=al(l);i.call(c)}}var l=cu(e,0,!1,null,null,!1,!1,"",hh);return e._reactRootContainer=l,e[pn]=l.current,io(e.nodeType===8?e.parentNode:e),$s(function(){tl(t,l,a,n)}),l}function rl(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=al(o);i.call(l)}}tl(t,o,e,r)}else o=u1(a,t,e,r,n);return al(o)}Qf=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var a=Hr(t.pendingLanes);a!==0&&(Ld(t,a|1),ua(t,kt()),!(qe&6)&&(pr=kt()+500,Zn()))}break;case 13:$s(function(){var n=hn(e,1);if(n!==null){var r=sa();Ha(n,e,1,r)}}),uu(e,1)}},Md=function(e){if(e.tag===13){var t=hn(e,134217728);if(t!==null){var a=sa();Ha(t,e,134217728,a)}uu(e,134217728)}},Xf=function(e){if(e.tag===13){var t=ss(e),a=hn(e,t);if(a!==null){var n=sa();Ha(a,e,t,n)}uu(e,t)}},Zf=function(){return Qe},Jf=function(e,t){var a=Qe;try{return Qe=e,t()}finally{Qe=a}},_d=function(e,t,a){switch(t){case"input":if(kd(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=ki(n);if(!r)throw Error(oe(90));Nf(n),kd(n,r)}}}break;case"textarea":Tf(e,a);break;case"select":t=a.value,t!=null&&qs(e,!!a.multiple,t,!1)}},Lf=su,Mf=$s;var p1={usingClientEntryPoint:!1,Events:[uo,Js,ki,Df,Of,su]},Co={findFiberByHostInstance:ys,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},f1={bundleType:Co.bundleType,version:Co.version,rendererPackageName:Co.rendererPackageName,rendererConfig:Co.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:un.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return e=Uf(e),e===null?null:e.stateNode},findFiberByHostInstance:Co.findFiberByHostInstance||c1,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 ol=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!ol.isDisabled&&ol.supportsFiber)try{ni=ol.inject(f1),Za=ol}catch{}}ha.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=p1,ha.createPortal=function(e,t){var a=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!fu(t))throw Error(oe(200));return d1(e,t,null,a)},ha.createRoot=function(e,t){if(!fu(e))throw Error(oe(299));var a=!1,n="",r=gh;return t!=null&&(t.unstable_strictMode===!0&&(a=!0),t.identifierPrefix!==void 0&&(n=t.identifierPrefix),t.onRecoverableError!==void 0&&(r=t.onRecoverableError)),t=cu(e,1,!1,null,null,a,!1,n,r),e[pn]=t.current,io(e.nodeType===8?e.parentNode:e),new pu(t)},ha.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(oe(188)):(e=Object.keys(e).join(","),Error(oe(268,e)));return e=Uf(t),e=e===null?null:e.stateNode,e},ha.flushSync=function(e){return $s(e)},ha.hydrate=function(e,t,a){if(!sl(t))throw Error(oe(200));return rl(null,e,t,!0,a)},ha.hydrateRoot=function(e,t,a){if(!fu(e))throw Error(oe(405));var n=a!=null&&a.hydratedSources||null,r=!1,s="",o=gh;if(a!=null&&(a.unstable_strictMode===!0&&(r=!0),a.identifierPrefix!==void 0&&(s=a.identifierPrefix),a.onRecoverableError!==void 0&&(o=a.onRecoverableError)),t=fh(t,null,e,1,a??null,r,!1,s,o),e[pn]=t.current,io(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 nl(t)},ha.render=function(e,t,a){if(!sl(t))throw Error(oe(200));return rl(null,e,t,!1,a)},ha.unmountComponentAtNode=function(e){if(!sl(e))throw Error(oe(40));return e._reactRootContainer?($s(function(){rl(null,null,e,!1,function(){e._reactRootContainer=null,e[pn]=null})}),!0):!1},ha.unstable_batchedUpdates=su,ha.unstable_renderSubtreeIntoContainer=function(e,t,a,n){if(!sl(a))throw Error(oe(200));if(e==null||e._reactInternals===void 0)throw Error(oe(38));return rl(e,t,a,!1,n)},ha.version="18.3.1-next-f1338f8080-20240426";function vh(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(vh)}catch(e){console.error(e)}}vh(),pf.exports=ha;var mr=pf.exports,bh,yh=mr;bh=yh.createRoot,yh.hydrateRoot;class m1 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 g1(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=bh(this.container),this.root.render(N.createElement(m1,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 xh={exports:{}},il={};/**
|
|
856
856
|
* @license React
|
|
857
857
|
* react-jsx-runtime.production.min.js
|
|
858
858
|
*
|
|
@@ -860,57 +860,57 @@ 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 h1=N,v1=Symbol.for("react.element"),b1=Symbol.for("react.fragment"),y1=Object.prototype.hasOwnProperty,x1=h1.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,w1={key:!0,ref:!0,__self:!0,__source:!0};function wh(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)y1.call(t,n)&&!w1.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:v1,type:e,key:s,ref:o,props:r,_owner:x1.current}}il.Fragment=b1,il.jsx=wh,il.jsxs=wh,xh.exports=il;var $=xh.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 k1=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),kh=(...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 N1={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 S1=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,...N1,width:t,height:t,stroke:e,strokeWidth:n?Number(a)*24/Number(t):a,className:kh("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
|
|
883
|
+
*/const Eo=(e,t)=>{const a=N.forwardRef(({className:n,...r},s)=>N.createElement(S1,{ref:s,iconNode:t,className:kh(`lucide-${k1(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.
|
|
887
887
|
* See the LICENSE file in the root directory of this source tree.
|
|
888
|
-
*/const
|
|
888
|
+
*/const Nh=Eo("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);/**
|
|
889
889
|
* @license lucide-react v0.475.0 - ISC
|
|
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 C1=Eo("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 E1=Eo("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 $1=Eo("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 S1=Object.defineProperty,du=(e,t)=>S1(e,"name",{value:t,configurable:!0});function cu(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}du(cu,"setRef");function xh(...e){return t=>{let a=!1;const n=e.map(r=>{const s=cu(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():cu(e[r],null)}}}}du(xh,"composeRefs");function Ze(...e){return N.useCallback(xh(...e),e)}du(Ze,"useComposedRefs");var C1=Object.defineProperty,ba=(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(;uu(x)&&typeof nl=="function";)x=nl(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}ba(hn,"createSlot");var E1=hn("Slot"),wh=Symbol.for("radix.slottable");function kh(e){const t=ba(a=>"child"in a?a.children(a.child):a.children,"Slottable");return t.displayName=`${e}.Slottable`,t.__radixId=wh,t}ba(kh,"createSlottable");var $1=ba((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}}ba(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)}ba(Sh,"getElementRef");function Ch(e){return N.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===wh}ba(Ch,"isSlottable");var T1=Symbol.for("react.lazy");function uu(e){return e!=null&&typeof e=="object"&&"$$typeof"in e&&e.$$typeof===T1&&"_payload"in e&&Eh(e._payload)}ba(uu,"isLazyComponent");function Eh(e){return typeof e=="object"&&e!==null&&"then"in e}ba(Eh,"isPromiseLike");function $h(e){let t=e;for(;uu(t)&&typeof nl=="function";)t=nl(t._payload);return t}ba($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}ba(Th,"concatAriaDescribedby");var P1=ba(e=>`${e} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,"createSlotError"),_1=ba(e=>`${e} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,"createSlottableError"),nl=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 pu(e){if(!Ph)throw new Error("Cannot access document outside of the DOM");return e?.ownerDocument??document}cr(pu,"getOwnerDocument");function _h(e,t=!1){const{activeElement:a}=pu(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=pu(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,_a=(e,t)=>A1(e,"name",{value:t,configurable:!0});function j1(e,t){const a=N.createContext(t);a.displayName=e+"Context";const n=_a(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 _a(r,"useContext"),[n,r]}_a(j1,"createContext");function ya(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=_a(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 _a(u,"useContext"),[c,u]}_a(n,"createContext");const r=_a(()=>{const s=a.map(o=>N.createContext(o));return _a(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)]}_a(ya,"createContextScope");function Rh(...e){const t=e[0];if(e.length===1)return t;const a=_a(()=>{const n=e.map(r=>({useScope:r(),scopeName:r.scopeName}));return _a(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}_a(Rh,"composeContextScopes");var Nt=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 Nt(()=>{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}):Nt(()=>{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()]||Nt;function Ia({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(Ia,"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 Ua(e){const t=N.useRef(e);return typeof Fh=="function"?Fh(()=>{t.current=e}):Nt(()=>{t.current=e}),N.useMemo(()=>(...a)=>t.current?.(...a),[])}K1(Ua,"useCallbackRef");var Y1=Object.defineProperty,zt=(e,t)=>Y1(e,"name",{value:t,configurable:!0}),fu="dismissableLayer.update",Q1="dismissableLayer.pointerDownOutside",X1="dismissableLayer.focusOutside",Bh,Uh=N.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set,dismissableSurfaces:new Set}),mu=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=Ua(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),gu(),()=>{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),gu())},[f,p]),N.useEffect(()=>{const M=zt(()=>b({}),"handleUpdate");return document.addEventListener(fu,M),()=>document.removeEventListener(fu,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=Ua(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||hu(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=Ua(e),n=N.useRef(!1);return N.useEffect(()=>{const r=zt(s=>{s.target&&!n.current&&hu(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 gu(){const e=new CustomEvent(fu);document.dispatchEvent(e)}zt(gu,"dispatchUpdate");function hu(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(hu,"handleAndDispatchCustomEvent");var J1=Object.defineProperty,$t=(e,t)=>J1(e,"name",{value:t,configurable:!0}),vu="focusScope.autoFocusOnMount",bu="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=Ua(o),f=Ua(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(vu,Hh);c.addEventListener(vu,p),c.dispatchEvent(S),S.defaultPrevented||(Zh(sv(yu(c)),{select:!0}),document.activeElement===h&&bn(c))}return()=>{c.removeEventListener(vu,p);const S=c.ownerDocument,C=CustomEvent;setTimeout(()=>{const E=new C(bu,Hh);c.addEventListener(bu,f),c.dispatchEvent(E),E.defaultPrevented||bn(h??S.body,{select:!0}),c.removeEventListener(bu,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=yu(e),a=xu(t,e),n=xu(t.reverse(),e);return[a,n]}$t(Jh,"getTabbableEdges");function yu(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(yu,"getTabbableCandidates");function xu(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(xu,"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=wu(e,t),e.unshift(t)},remove(t){e=wu(e,t),e[0]?.resume()}}}$t(nv,"createFocusScopesStack");function wu(e,t){const a=[...e],n=a.indexOf(t);return n!==-1&&a.splice(n,1),a}$t(wu,"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}),ku=N.forwardRef(tk(function(t,a){const{container:n,...r}=t,[s,o]=N.useState(!1);Nt(()=>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]),Nt(()=>{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]),Nt(()=>{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 Nu(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}yn(Nu,"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=Nu(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():Nu(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,Su=(e,t)=>nk(e,"name",{value:t,configurable:!0}),sl=0,pr=null;function sk(e){return rl(),e.children}Su(sk,"FocusGuards");function rl(){N.useEffect(()=>{pr||(pr={start:Cu(),end:Cu()});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),sl++,()=>{sl===1&&(pr?.start.remove(),pr?.end.remove(),pr=null),sl=Math.max(0,sl-1)}},[])}Su(rl,"useFocusGuards");function Cu(){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}Su(Cu,"createFocusGuard");var Za=function(){return Za=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},Za.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 ol="right-scroll-bar-position",il="width-before-scroll-bar",ok="with-scroll-bars-hidden",ik="--removed-body-scroll-bar-size";function Eu(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 Eu(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)||Eu(i,null)}),s.forEach(function(i){r.has(i)||Eu(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=Za({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,Za({},a))};uv.isSideCarExport=!0;function mk(e,t){return e.useMedium(t),uv}var pv=fk(),$u=function(){},ll=N.forwardRef(function(e,t){var a=N.useRef(null),n=N.useState({onScrollCapture:$u,onWheelCapture:$u,onTouchMoveCapture:$u}),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=Za(Za({},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),Za(Za({},E),{ref:C})):N.createElement(d,Za({},E,{className:l,ref:C}),i))});ll.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1},ll.classNames={fullWidth:il,zeroRight:ol};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},Tu=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[Tu(a),Tu(n),Tu(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(
|
|
908
|
+
*/const Sh=Eo("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);var T1=Object.defineProperty,mu=(e,t)=>T1(e,"name",{value:t,configurable:!0});function gu(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}mu(gu,"setRef");function Ch(...e){return t=>{let a=!1;const n=e.map(r=>{const s=gu(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():gu(e[r],null)}}}}mu(Ch,"composeRefs");function Xe(...e){return N.useCallback(Ch(...e),e)}mu(Xe,"useComposedRefs");var P1=Object.defineProperty,ka=(e,t)=>P1(e,"name",{value:t,configurable:!0});function xn(e){const t=N.forwardRef((a,n)=>{let{children:r,...s}=a,o=null,i=!1;const l=[];r=Rh(r),N.Children.forEach(r,f=>{if(_h(f)){i=!0;const v=f;let x="child"in v.props?v.props.child:v.props.children;for(;hu(x)&&typeof ll=="function";)x=ll(x._payload);o=I1(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?Ph(o):void 0,u=Xe(n,c);if(!o){if(r||r===0)throw new Error(i?j1(e):A1(e));return r}const p=Th(s,o.props??{});return o.type!==N.Fragment&&(p.ref=n?u:c),N.cloneElement(o,p)});return t.displayName=`${e}.Slot`,t}ka(xn,"createSlot");var _1=xn("Slot"),Eh=Symbol.for("radix.slottable");function $h(e){const t=ka(a=>"child"in a?a.children(a.child):a.children,"Slottable");return t.displayName=`${e}.Slottable`,t.__radixId=Eh,t}ka($h,"createSlottable");var I1=ka((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 Th(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]=Ah(s,r))}return{...e,...a}}ka(Th,"mergeProps");function Ph(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)}ka(Ph,"getElementRef");function _h(e){return N.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===Eh}ka(_h,"isSlottable");var R1=Symbol.for("react.lazy");function hu(e){return e!=null&&typeof e=="object"&&"$$typeof"in e&&e.$$typeof===R1&&"_payload"in e&&Ih(e._payload)}ka(hu,"isLazyComponent");function Ih(e){return typeof e=="object"&&e!==null&&"then"in e}ka(Ih,"isPromiseLike");function Rh(e){let t=e;for(;hu(t)&&typeof ll=="function";)t=ll(t._payload);return t}ka(Rh,"useUnwrappedLazy");function Ah(...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}ka(Ah,"concatAriaDescribedby");var A1=ka(e=>`${e} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,"createSlotError"),j1=ka(e=>`${e} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,"createSlottableError"),ll=Fn[" use ".trim().toString()],D1=Object.defineProperty,gr=(e,t)=>D1(e,"name",{value:t,configurable:!0}),jh=!!(typeof window<"u"&&window.document&&window.document.createElement);function Re(e,t,{checkForDefaultPrevented:a=!0}={}){return gr(function(r){if(e?.(r),a===!1||!r||!r.defaultPrevented)return t?.(r)},"handleEvent")}gr(Re,"composeEventHandlers");function O1(e){if(!jh)throw new Error("Cannot access window outside of the DOM");return e?.ownerDocument?.defaultView??window}gr(O1,"getOwnerWindow");function vu(e){if(!jh)throw new Error("Cannot access document outside of the DOM");return e?.ownerDocument??document}gr(vu,"getOwnerDocument");function Dh(e,t=!1){const{activeElement:a}=vu(e);if(!a?.nodeName)return null;if(Oh(a)&&a.contentDocument)return Dh(a.contentDocument.body,t);if(t){const n=a.getAttribute("aria-activedescendant");if(n){const r=vu(a).getElementById(n);if(r)return r}}return a}gr(Dh,"getActiveElement");function Oh(e){return e.tagName==="IFRAME"}gr(Oh,"isFrame");var L1=Object.defineProperty,ja=(e,t)=>L1(e,"name",{value:t,configurable:!0});function M1(e,t){const a=N.createContext(t);a.displayName=e+"Context";const n=ja(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 ja(r,"useContext"),[n,r]}ja(M1,"createContext");function Na(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=ja(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 ja(u,"useContext"),[c,u]}ja(n,"createContext");const r=ja(()=>{const s=a.map(o=>N.createContext(o));return ja(function(i){const l=i?.[e]||s;return N.useMemo(()=>({[`__scope${e}`]:{...i,[e]:l}}),[i,l])},"useScope")},"createScope");return r.scopeName=e,[n,Lh(r,...t)]}ja(Na,"createContextScope");function Lh(...e){const t=e[0];if(e.length===1)return t;const a=ja(()=>{const n=e.map(r=>({useScope:r(),scopeName:r.scopeName}));return ja(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}ja(Lh,"composeContextScopes");var Nt=globalThis?.document?N.useLayoutEffect:()=>{},z1=Object.defineProperty,F1=(e,t)=>z1(e,"name",{value:t,configurable:!0}),B1=Fn[" useId ".trim().toString()]||(()=>{}),U1=0;function wn(e){const[t,a]=N.useState(B1());return Nt(()=>{e||a(n=>n??String(U1++))},[e]),e||(t?`radix-${t}`:"")}F1(wn,"useId");var q1=Object.defineProperty,V1=(e,t)=>q1(e,"name",{value:t,configurable:!0}),Mh=Fn[" useEffectEvent ".trim().toString()],zh=Fn[" useInsertionEffect ".trim().toString()];function Fh(e){if(typeof Mh=="function")return Mh(e);const t=N.useRef(()=>{throw new Error("Cannot call an event handler while rendering.")});return typeof zh=="function"?zh(()=>{t.current=e}):Nt(()=>{t.current=e}),N.useMemo(()=>(...a)=>t.current?.(...a),[])}V1(Fh,"useEffectEvent");var W1=Object.defineProperty,$o=(e,t)=>W1(e,"name",{value:t,configurable:!0}),H1=Fn[" useInsertionEffect ".trim().toString()]||Nt;function Da({prop:e,defaultProp:t,onChange:a=$o(()=>{},"onChange"),caller:n}){const[r,s,o]=Bh({defaultProp:t,onChange:a}),i=e!==void 0,l=i?e:r,c=N.useCallback(u=>{if(i){const p=Uh(u)?u(e):u;p!==e&&o.current?.(p)}else s(u)},[i,e,s,o]);return[l,c]}$o(Da,"useControllableState");function Bh({defaultProp:e,onChange:t}){const[a,n]=N.useState(e),r=N.useRef(a),s=N.useRef(t);return H1(()=>{s.current=t},[t]),N.useEffect(()=>{r.current!==a&&(s.current?.(a),r.current=a)},[a,r]),[a,n,s]}$o(Bh,"useUncontrolledState");function Uh(e){return typeof e=="function"}$o(Uh,"isFunction");var qh=Symbol("RADIX:SYNC_STATE");function G1(e,t,a,n){const{prop:r,defaultProp:s,onChange:o,caller:i}=t,l=r!==void 0,c=Fh(o),u=[{...a,state:s}];n&&u.push(n);const[p,f]=N.useReducer((k,g)=>{if(g.type===qh)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:qh,state:r})},[r,p.state,l]),[b,f]}$o(G1,"useControllableStateReducer");var K1=Object.defineProperty,Y1=(e,t)=>K1(e,"name",{value:t,configurable:!0}),Q1=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],ze=Q1.reduce((e,t)=>{const a=xn(`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 Vh(e,t){e&&mr.flushSync(()=>e.dispatchEvent(t))}Y1(Vh,"dispatchDiscreteCustomEvent");var X1=Object.defineProperty,Z1=(e,t)=>X1(e,"name",{value:t,configurable:!0}),Wh=Fn[" useInsertionEffect ".trim().toString()];function Ga(e){const t=N.useRef(e);return typeof Wh=="function"?Wh(()=>{t.current=e}):Nt(()=>{t.current=e}),N.useMemo(()=>(...a)=>t.current?.(...a),[])}Z1(Ga,"useCallbackRef");var J1=Object.defineProperty,Bt=(e,t)=>J1(e,"name",{value:t,configurable:!0}),bu="dismissableLayer.update",ek="dismissableLayer.pointerDownOutside",tk="dismissableLayer.focusOutside",Hh,Gh=N.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set,dismissableSurfaces:new Set}),yu=N.forwardRef(Bt(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(Gh),[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),_=Yh(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(H=>H.contains(M));return C&&!P},[p.branches,C])}),I=Qh(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),D=f?y===g.length-1:!1,W=Ga(M=>{M.key==="Escape"&&(s?.(M),!M.defaultPrevented&&c&&(M.preventDefault(),c()))});return N.useEffect(()=>{if(D)return x.addEventListener("keydown",W,{capture:!0}),()=>x.removeEventListener("keydown",W,{capture:!0})},[x,D,W]),N.useEffect(()=>{if(f)return n&&(p.layersWithOutsidePointerEventsDisabled.size===0&&(Hh=x.body.style.pointerEvents,x.body.style.pointerEvents="none"),p.layersWithOutsidePointerEventsDisabled.add(f)),p.layers.add(f),xu(),()=>{n&&(p.layersWithOutsidePointerEventsDisabled.delete(f),p.layersWithOutsidePointerEventsDisabled.size===0&&(x.body.style.pointerEvents=Hh))}},[f,x,n,p]),N.useEffect(()=>()=>{f&&(p.layers.delete(f),p.layersWithOutsidePointerEventsDisabled.delete(f),xu())},[f,p]),N.useEffect(()=>{const M=Bt(()=>b({}),"handleUpdate");return document.addEventListener(bu,M),()=>document.removeEventListener(bu,M)},[]),$.jsx(ze.div,{...u,ref:k,style:{pointerEvents:S?C?"auto":"none":void 0,...t.style},onFocusCapture:Re(t.onFocusCapture,I.onFocusCapture),onBlurCapture:Re(t.onBlurCapture,I.onBlurCapture),onPointerDownCapture:Re(t.onPointerDownCapture,_.onPointerDownCapture)})},"DismissableLayer"));function Kh(){const e=N.useContext(Gh),[t,a]=N.useState(null);return N.useEffect(()=>{if(t)return e.dismissableSurfaces.add(t),()=>{e.dismissableSurfaces.delete(t)}},[t,e.dismissableSurfaces]),a}Bt(Kh,"useDismissableLayerSurface");var ak=Bt(()=>!0,"IS_TRUE");function Yh(e,t){const{ownerDocument:a=globalThis?.document,deferPointerDownOutside:n=!1,isDeferredPointerDownOutsideRef:r,dismissableSurfaces:s,shouldHandlePointerDownOutside:o=ak}=t,i=Ga(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()}Bt(f,"resetOutsideInteraction");function v(){return Array.from(u.current.values()).some(Boolean)}Bt(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)}Bt(x,"handleInteractionCapture");function b(h){c.current&&u.current.set(h.type,!1)}Bt(b,"handleInteractionBubble");const k=Bt(h=>{if(h.target&&!l.current){let y=function(){a.removeEventListener("click",p.current);const C=v();f(),C||wu(ek,i,S,{discrete:!0})};if(Bt(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:Bt(()=>l.current=!0,"onPointerDownCapture")}}Bt(Yh,"usePointerDownOutside");function Qh(e,t=globalThis?.document){const a=Ga(e),n=N.useRef(!1);return N.useEffect(()=>{const r=Bt(s=>{s.target&&!n.current&&wu(tk,a,{originalEvent:s},{discrete:!1})},"handleFocus");return t.addEventListener("focusin",r),()=>t.removeEventListener("focusin",r)},[t,a]),{onFocusCapture:Bt(()=>n.current=!0,"onFocusCapture"),onBlurCapture:Bt(()=>n.current=!1,"onBlurCapture")}}Bt(Qh,"useFocusOutside");function xu(){const e=new CustomEvent(bu);document.dispatchEvent(e)}Bt(xu,"dispatchUpdate");function wu(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?Vh(r,s):r.dispatchEvent(s)}Bt(wu,"handleAndDispatchCustomEvent");var nk=Object.defineProperty,Tt=(e,t)=>nk(e,"name",{value:t,configurable:!0}),ku="focusScope.autoFocusOnMount",Nu="focusScope.autoFocusOnUnmount",Xh={bubbles:!1,cancelable:!0},Zh=N.forwardRef(Tt(function(t,a){const{loop:n=!1,trapped:r=!1,branches:s,onMountAutoFocus:o,onUnmountAutoFocus:i,...l}=t,[c,u]=N.useState(null),p=Ga(o),f=Ga(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=_:kn(v.current,{select:!0})},y=function(E){if(g.paused||!c)return;const _=E.relatedTarget;_!==null&&(k(_)||kn(v.current,{select:!0}))},S=function(E){if(document.activeElement===document.body)for(const I of E)I.removedNodes.length>0&&kn(c)};Tt(h,"handleFocusIn"),Tt(y,"handleFocusOut"),Tt(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){iv.add(g);const h=document.activeElement;if(!c.contains(h)){const S=new CustomEvent(ku,Xh);c.addEventListener(ku,p),c.dispatchEvent(S),S.defaultPrevented||(nv(dv(Su(c)),{select:!0}),document.activeElement===h&&kn(c))}return()=>{c.removeEventListener(ku,p);const S=c.ownerDocument,C=CustomEvent;setTimeout(()=>{const E=new C(Nu,Xh);c.addEventListener(Nu,f),c.dispatchEvent(E),E.defaultPrevented||kn(h??S.body,{select:!0}),c.removeEventListener(Nu,f),iv.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,_]=sv(C);E&&_?!h.shiftKey&&S===_?(h.preventDefault(),n&&kn(E,{select:!0})):h.shiftKey&&S===E&&(h.preventDefault(),n&&kn(_,{select:!0})):S===C&&h.preventDefault()}},[n,r,g.paused]);return $.jsx(ze.div,{tabIndex:-1,...l,ref:x,onKeyDown:d})},"FocusScope")),Jh=N.createContext(null);function ev({registry:e,children:t}){return e?$.jsx(Jh.Provider,{value:e,children:t}):t}Tt(ev,"FocusScopeBranchProvider");function tv(){const[e,t]=N.useState([]),a=N.useMemo(()=>({add:Tt(n=>t(r=>r.includes(n)?r:[...r,n]),"add"),remove:Tt(n=>t(r=>r.filter(s=>s!==n)),"remove")}),[]);return{nodes:e,registry:a}}Tt(tv,"useFocusScopeBranchRegistry");function av(e){const t=N.useContext(Jh);N.useEffect(()=>{if(!(!e||!t))return t.add(e),()=>t.remove(e)},[e,t])}Tt(av,"useFocusScopeBranch");function nv(e,{select:t=!1}={}){const a=document.activeElement;for(const n of e)if(kn(n,{select:t}),document.activeElement!==a)return}Tt(nv,"focusFirst");function sv(e){const t=Su(e),a=Cu(t,e),n=Cu(t.reverse(),e);return[a,n]}Tt(sv,"getTabbableEdges");function Su(e){const t=[],n=e.ownerDocument.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:Tt(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}Tt(Su,"getTabbableCandidates");function Cu(e,t){const a=typeof t.checkVisibility=="function"&&t.checkVisibility({checkVisibilityCSS:!0});for(const n of e)if(!(a?!n.checkVisibility({checkVisibilityCSS:!0}):rv(n,{upTo:t})))return n}Tt(Cu,"findVisible");function rv(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}Tt(rv,"isHidden");function ov(e){return e.tagName==="INPUT"&&typeof e.select=="function"}Tt(ov,"isSelectableInput");function kn(e,{select:t=!1}={}){if(e&&e.focus){const n=(e.ownerDocument??document).activeElement;e.focus({preventScroll:!0}),e!==n&&ov(e)&&t&&e.select()}}Tt(kn,"focus");var iv=lv();function lv(){let e=[];return{add(t){const a=e[0];t!==a&&a?.pause(),e=Eu(e,t),e.unshift(t)},remove(t){e=Eu(e,t),e[0]?.resume()}}}Tt(lv,"createFocusScopesStack");function Eu(e,t){const a=[...e],n=a.indexOf(t);return n!==-1&&a.splice(n,1),a}Tt(Eu,"arrayRemove");function dv(e){return e.filter(t=>t.tagName!=="A")}Tt(dv,"removeLinks");var sk=Object.defineProperty,rk=(e,t)=>sk(e,"name",{value:t,configurable:!0}),$u=N.forwardRef(rk(function(t,a){const{container:n,...r}=t,[s,o]=N.useState(!1);Nt(()=>o(!0),[]);const i=n||s&&globalThis?.document?.body;return i?mr.createPortal($.jsx(ze.div,{...r,ref:a}),i):null},"Portal")),ok=Object.defineProperty,Nn=(e,t)=>ok(e,"name",{value:t,configurable:!0});function cv(e,t){return N.useReducer((a,n)=>t[a][n]??a,e)}Nn(cv,"useStateMachine");var is=Nn(e=>{const{present:t,children:a}=e,n=uv(t),r=typeof a=="function"?a({present:n.isPresent}):N.Children.only(a),s=pv(n.ref,fv(r));return typeof a=="function"||n.isPresent?N.cloneElement(r,{ref:s}):null},"Presence");function uv(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]=cv(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??hr(n.current),o.current=void 0):s.current="none"},[l]),Nt(()=>{const u=n.current,p=r.current;if(p!==e){const v=s.current,x=hr(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]),Nt(()=>{if(t){let u;const p=t.ownerDocument.defaultView??window,f=Nn(x=>{const k=hr(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=Nn(x=>{x.target===t&&(s.current=hr(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=hr(p)}else n.current=null;a(u)},[])}}Nn(uv,"usePresence");function Tu(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}Nn(Tu,"setRef");function pv(...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=Tu(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():Tu(n[o],null)}}},[])}Nn(pv,"useStableComposedRefs");function hr(e){return e?.animationName||"none"}Nn(hr,"getAnimationName");function fv(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)}Nn(fv,"getElementRef");var ik=Object.defineProperty,Pu=(e,t)=>ik(e,"name",{value:t,configurable:!0}),dl=0,vr=null;function lk(e){return cl(),e.children}Pu(lk,"FocusGuards");function cl(){N.useEffect(()=>{vr||(vr={start:_u(),end:_u()});const{start:e,end:t}=vr;return document.body.firstElementChild!==e&&document.body.insertAdjacentElement("afterbegin",e),document.body.lastElementChild!==t&&document.body.insertAdjacentElement("beforeend",t),dl++,()=>{dl===1&&(vr?.start.remove(),vr?.end.remove(),vr=null),dl=Math.max(0,dl-1)}},[])}Pu(cl,"useFocusGuards");function _u(){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}Pu(_u,"createFocusGuard");var nn=function(){return nn=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},nn.apply(this,arguments)};function mv(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 dk(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 ul="right-scroll-bar-position",pl="width-before-scroll-bar",ck="with-scroll-bars-hidden",uk="--removed-body-scroll-bar-size";function Iu(e,t){return typeof e=="function"?e(t):e&&(e.current=t),e}function pk(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 fk=typeof window<"u"?N.useLayoutEffect:N.useEffect,gv=new WeakMap;function mk(e,t){var a=pk(null,function(n){return e.forEach(function(r){return Iu(r,n)})});return fk(function(){var n=gv.get(a);if(n){var r=new Set(n),s=new Set(e),o=a.current;r.forEach(function(i){s.has(i)||Iu(i,null)}),s.forEach(function(i){r.has(i)||Iu(i,o)})}gv.set(a,e)},[e]),a}function gk(e){return e}function hk(e,t){t===void 0&&(t=gk);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 vk(e){e===void 0&&(e={});var t=hk(null);return t.options=nn({async:!0,ssr:!1},e),t}var hv=function(e){var t=e.sideCar,a=mv(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,nn({},a))};hv.isSideCarExport=!0;function bk(e,t){return e.useMedium(t),hv}var vv=vk(),Ru=function(){},fl=N.forwardRef(function(e,t){var a=N.useRef(null),n=N.useState({onScrollCapture:Ru,onWheelCapture:Ru,onTouchMoveCapture:Ru}),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=mv(e,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noRelative","noIsolation","inert","allowPinchZoom","as","gapMode"]),S=f,C=mk([a,t]),E=nn(nn({},y),r);return N.createElement(N.Fragment,null,u&&N.createElement(S,{sideCar:vv,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),nn(nn({},E),{ref:C})):N.createElement(d,nn({},E,{className:l,ref:C}),i))});fl.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1},fl.classNames={fullWidth:pl,zeroRight:ul};var yk=function(){if(typeof __webpack_nonce__<"u")return __webpack_nonce__};function xk(){if(!document)return null;var e=document.createElement("style");e.type="text/css";var t=yk();return t&&e.setAttribute("nonce",t),e}function wk(e,t){e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t))}function kk(e){var t=document.head||document.getElementsByTagName("head")[0];t.appendChild(e)}var Nk=function(){var e=0,t=null;return{add:function(a){e==0&&(t=xk())&&(wk(t,a),kk(t)),e++},remove:function(){e--,!e&&t&&(t.parentNode&&t.parentNode.removeChild(t),t=null)}}},Sk=function(){var e=Nk();return function(t,a){N.useEffect(function(){return e.add(t),function(){e.remove()}},[t&&a])}},bv=function(){var e=Sk(),t=function(a){var n=a.styles,r=a.dynamic;return e(n,r),null};return t},Ck={left:0,top:0,right:0,gap:0},Au=function(e){return parseInt(e||"",10)||0},Ek=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[Au(a),Au(n),Au(r)]},$k=function(e){if(e===void 0&&(e="margin"),typeof window>"u")return Ck;var t=Ek(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])}},Tk=bv(),br="data-scroll-locked",Pk=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(ck,` {
|
|
910
910
|
overflow: hidden `).concat(n,`;
|
|
911
911
|
padding-right: `).concat(i,"px ").concat(n,`;
|
|
912
912
|
}
|
|
913
|
-
body[`).concat(
|
|
913
|
+
body[`).concat(br,`] {
|
|
914
914
|
overflow: hidden `).concat(n,`;
|
|
915
915
|
overscroll-behavior: contain;
|
|
916
916
|
`).concat([t&&"position: relative ".concat(n,";"),a==="margin"&&`
|
|
@@ -923,31 +923,31 @@ Error generating stack: `+s.message+`
|
|
|
923
923
|
`),a==="padding"&&"padding-right: ".concat(i,"px ").concat(n,";")].filter(Boolean).join(""),`
|
|
924
924
|
}
|
|
925
925
|
|
|
926
|
-
.`).concat(
|
|
926
|
+
.`).concat(ul,` {
|
|
927
927
|
right: `).concat(i,"px ").concat(n,`;
|
|
928
928
|
}
|
|
929
929
|
|
|
930
|
-
.`).concat(
|
|
930
|
+
.`).concat(pl,` {
|
|
931
931
|
margin-right: `).concat(i,"px ").concat(n,`;
|
|
932
932
|
}
|
|
933
933
|
|
|
934
|
-
.`).concat(
|
|
934
|
+
.`).concat(ul," .").concat(ul,` {
|
|
935
935
|
right: 0 `).concat(n,`;
|
|
936
936
|
}
|
|
937
937
|
|
|
938
|
-
.`).concat(
|
|
938
|
+
.`).concat(pl," .").concat(pl,` {
|
|
939
939
|
margin-right: 0 `).concat(n,`;
|
|
940
940
|
}
|
|
941
941
|
|
|
942
|
-
body[`).concat(
|
|
943
|
-
`).concat(
|
|
942
|
+
body[`).concat(br,`] {
|
|
943
|
+
`).concat(uk,": ").concat(i,`px;
|
|
944
944
|
}
|
|
945
|
-
`)},
|
|
945
|
+
`)},yv=function(){var e=parseInt(document.body.getAttribute(br)||"0",10);return isFinite(e)?e:0},_k=function(){N.useEffect(function(){return document.body.setAttribute(br,(yv()+1).toString()),function(){var e=yv()-1;e<=0?document.body.removeAttribute(br):document.body.setAttribute(br,e.toString())}},[])},Ik=function(e){var t=e.noRelative,a=e.noImportant,n=e.gapMode,r=n===void 0?"margin":n;_k();var s=N.useMemo(function(){return $k(r)},[r]);return N.createElement(Tk,{styles:Pk(s,!t,r,a?"":"!important")})},ju=!1;if(typeof window<"u")try{var ml=Object.defineProperty({},"passive",{get:function(){return ju=!0,!0}});window.addEventListener("test",ml,ml),window.removeEventListener("test",ml,ml)}catch{ju=!1}var yr=ju?{passive:!1}:!1,Rk=function(e){return e.tagName==="TEXTAREA"},xv=function(e,t){if(!(e instanceof Element))return!1;var a=window.getComputedStyle(e);return a[t]!=="hidden"&&!(a.overflowY===a.overflowX&&!Rk(e)&&a[t]==="visible")},Ak=function(e){return xv(e,"overflowY")},jk=function(e){return xv(e,"overflowX")},wv=function(e,t){var a=t.ownerDocument,n=t;do{typeof ShadowRoot<"u"&&n instanceof ShadowRoot&&(n=n.host);var r=kv(e,n);if(r){var s=Nv(e,n),o=s[1],i=s[2];if(o>i)return!0}n=n.parentNode}while(n&&n!==a.body);return!1},Dk=function(e){var t=e.scrollTop,a=e.scrollHeight,n=e.clientHeight;return[t,a,n]},Ok=function(e){var t=e.scrollLeft,a=e.scrollWidth,n=e.clientWidth;return[t,a,n]},kv=function(e,t){return e==="v"?Ak(t):jk(t)},Nv=function(e,t){return e==="v"?Dk(t):Ok(t)},Lk=function(e,t){return e==="h"&&t==="rtl"?-1:1},Mk=function(e,t,a,n,r){var s=Lk(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=Nv(e,i),x=v[0],b=v[1],k=v[2],g=b-k-s*x;(x||g)&&kv(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},gl=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},Sv=function(e){return[e.deltaX,e.deltaY]},Cv=function(e){return e&&"current"in e?e.current:e},zk=function(e,t){return e[0]===t[0]&&e[1]===t[1]},Fk=function(e){return`
|
|
946
946
|
.block-interactivity-`.concat(e,` {pointer-events: none;}
|
|
947
947
|
.allow-interactivity-`).concat(e,` {pointer-events: all;}
|
|
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=cl(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):cl(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=cl(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,cl(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 _u=N.forwardRef(function(e,t){return N.createElement(ll,Za({},e,{ref:t,sideCar:Fk}))});_u.classNames=ll.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,ul=new WeakMap,pl={},Iu=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]);pl[a]||(pl[a]=new WeakMap);var s=pl[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&&ul.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(),Iu++,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||(ul.has(p)||p.removeAttribute(n),ul.delete(p)),v||p.removeAttribute(a)}),Iu--,Iu||(hr=new WeakMap,hr=new WeakMap,ul=new WeakMap,pl={})}},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,xa=(e,t)=>Vk(e,"name",{value:t,configurable:!0}),Ru="Dialog",[Nv,YE]=ya(Ru),[Wk,Ja]=Nv(Ru),Sv=xa(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]=Ia({prop:n,defaultProp:r??!1,onChange:s,caller:Ru}),[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}),Au=xa(e=>{const{__scopeDialog:t,forceMount:a,children:n,container:r}=e,s=Ja(Cv,t);return $.jsx(Hk,{scope:t,forceMount:a,children:N.Children.map(n,o=>$.jsx(es,{present:a||s.open,children:$.jsx(ku,{asChild:!0,container:r,children:o})}))})},"DialogPortal"),ju="DialogOverlay",Du=N.forwardRef(xa(function(t,a){const n=Ev(ju,t.__scopeDialog),{forceMount:r=n.forceMount,...s}=t,o=Ja(ju,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(xa(function(t,a){const{__scopeDialog:n,...r}=t,s=Ja(ju,n),o=qh(),i=Ze(a,o);return $.jsx(_u,{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":Mu(s.open),...r,ref:i,style:{pointerEvents:"auto",...r.style}})})},"DialogOverlayImpl")),No="DialogContent",Ou=N.forwardRef(xa(function(t,a){const n=Ev(No,t.__scopeDialog),{forceMount:r=n.forceMount,...s}=t,o=Ja(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(xa(function(t,a){const n=Ja(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(xa(function(t,a){const n=Ja(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(xa(function(t,a){const{__scopeDialog:n,trapFocus:r,onOpenAutoFocus:s,onCloseAutoFocus:o,"aria-describedby":i,children:l,...c}=t,u=Ja(No,n);return rl(),$.jsx(Yh,{registry:u.branchRegistry,children:$.jsx(Gh,{asChild:!0,loop:!0,trapped:r,branches:u.branchNodes,onMountAutoFocus:s,onUnmountAutoFocus:o,children:$.jsx(mu,{role:"dialog",id:u.contentId,"aria-labelledby":u.titlePresent?u.titleId:void 0,"aria-describedby":u.descriptionPresent?_v(i,u.descriptionId):i,"data-state":Mu(u.open),...c,ref:a,deferPointerDownOutside:!0,onDismiss:()=>u.onOpenChange(!1),children:l})})})},"DialogContentImpl")),Lu=N.forwardRef(xa(function(t,a){const{__scopeDialog:n,...r}=t,s=Ja("DialogTitle",n),{setTitleCount:o}=s;return Nt(()=>(o(i=>i+1),()=>o(i=>i-1)),[o]),$.jsx(Oe.h2,{id:s.titleId,...r,ref:a})},"DialogTitle")),Tv=N.forwardRef(xa(function(t,a){const{__scopeDialog:n,...r}=t,s=Ja("DialogDescription",n),{setDescriptionCount:o}=s;return Nt(()=>(o(i=>i+1),()=>o(i=>i-1)),[o]),$.jsx(Oe.p,{id:s.descriptionId,...r,ref:a})},"DialogDescription")),Xk="DialogClose",Pv=N.forwardRef(xa(function(t,a){const{__scopeDialog:n,...r}=t,s=Ja(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}xa(_v,"concatAriaDescribedby");function Mu(e){return e?"open":"closed"}xa(Mu,"getState");var Zk=Object.defineProperty,At=(e,t)=>Zk(e,"name",{value:t,configurable:!0});function zu(e){const t=e+"CollectionProvider",[a,n]=ya(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(zu,"createCollection");var Iv=new WeakMap,fl=(wa=class extends Map{constructor(a){super(a);jy(this,St);jp(this,St,[...super.keys()]),Iv.set(this,!0)}set(a,n){return Iv.get(this)&&!this.has(a)&&Wt(this,St).push(a),super.set(a,n),this}insert(a,n,r){const s=this.has(n),o=s?this.size:this.size+1,i=Fu(a),l=i>=0?Math.min(i,o-1):Math.max(o+i,0);if(s?Wt(this,St).indexOf(n)===l:l===this.size)return this.set(n,r),this;const c=Wt(this,St).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 wa(this);return s.insert(a,n,r),s}before(a){const n=Wt(this,St).indexOf(a)-1;if(!(n<0))return this.entryAt(n)}setBefore(a,n,r){const s=Wt(this,St).indexOf(a);if(s===-1)return this;const o=Wt(this,St).indexOf(n),i=o!==-1&&o<s?s-1:s;return this.insert(i,n,r)}after(a){let n=Wt(this,St).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,St).indexOf(a);if(s===-1)return this;const o=Wt(this,St).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,St,[]),super.clear()}delete(a){const n=super.delete(a);return n&&Wt(this,St).splice(Wt(this,St).indexOf(a),1),n}deleteAt(a){const n=this.keyAt(a);return n!==void 0?this.delete(n):!1}at(a){const n=ml(Wt(this,St),a);if(n!==void 0)return this.get(n)}entryAt(a){const n=ml(Wt(this,St),a);if(n!==void 0)return[n,this.get(n)]}indexOf(a){return Wt(this,St).indexOf(a)}keyAt(a){return ml(Wt(this,St),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 wa(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 wa(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 wa(n)}toReversed(){const a=new wa;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 wa(n)}slice(a,n){const r=new wa;for(const s of Wt(this,St).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}},St=new WeakMap,At(wa,"OrderedDict"),wa);function ml(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(ml,"at");function Rv(e,t){const a=e.length,n=Fu(t),r=n>=0?n:a+n;return r<0||r>=a?-1:r}At(Rv,"toSafeIndex");function Fu(e){return e!==e||e===0?0:Math.trunc(e)}At(Fu,"toSafeInteger");function Jk(e){const t=e+"CollectionProvider",[a,n]=ya(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 fl),B=N.useCallback(()=>{const L=q.current;return Dv(L)||L.sort(gl),L},[]);return N.useEffect(()=>{if(!H)return;const L=Ov(()=>{J(w=>{const T=w.toSorted(gl);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);Nt(()=>{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 fl(R);return Q&&Q.element!==T&&D.delete(Q.element),T&&D.set(T,{...q,element:T}),D.sort(gl)}))}),N.useEffect(()=>()=>{const T=w.current;w.current=null,T&&P(Q=>{if(!Q.has(T.element))return Q;const R=new fl(Q);return R.delete(T.element),R})},[P]),$.jsx(k,{[b]:"",ref:L,children:I})});g.displayName=x;function d(){return N.useState(new fl)}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 gl(e,t){return!e[1].element||!t[1].element?0:jv(e[1].element,t[1].element)?-1:1}At(gl,"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,Bu=(e,t)=>sN(e,"name",{value:t,configurable:!0}),Uu=!1;function Lv(){const[e,t]=N.useState(Uu);return N.useEffect(()=>{Uu||(Uu=!0,t(!0))},[]),e}Bu(Lv,"useIsHydrated");var Mv=An[" useSyncExternalStore ".trim().toString()];function zv(){return()=>{}}Bu(zv,"subscribe");function Fv(){return Mv(zv,()=>!0,()=>!1)}Bu(Fv,"useIsHydratedModern");var rN=typeof Mv=="function"?Fv:Lv,oN=Object.defineProperty,Cs=(e,t)=>oN(e,"name",{value:t,configurable:!0}),qu="rovingFocusGroup.onEntryFocus",iN={bubbles:!1,cancelable:!0},hl="RovingFocusGroup",[Vu,Bv,lN]=zu(hl),[dN,vl]=ya(hl,[lN]),Uv={Vertical:"vertical",Horizontal:"horizontal"},cN={RTL:"rtl"},[uN,pN]=dN(hl),qv=N.forwardRef(Cs(function(t,a){return $.jsx(Vu.Provider,{scope:t.__scopeRovingFocusGroup,children:$.jsx(Vu.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]=Ia({prop:i,defaultProp:l??null,onChange:c,caller:hl}),[d,h]=N.useState(!1),y=Ua(u),S=Bv(n),C=N.useRef(!1),[E,_]=N.useState(0);return N.useEffect(()=>{const I=v.current;if(I)return I.addEventListener(qu,y),()=>I.removeEventListener(qu,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(qu,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);Wu(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 Nt(()=>{if(!(!g||!r))return x(),()=>b()},[g,r,x,b]),N.useEffect(()=>{if(!(g||!r))return x(),()=>b()},[g,r,x,b]),$.jsx(Vu.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(()=>Wu(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 Wu(e,t=!1){const a=document.activeElement;for(const n of e)if(n===a||(n.focus({preventScroll:t}),document.activeElement!==a))return}Cs(Wu,"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"},Hu="Tabs",[vN,QE]=ya(Hu,[vl]),Yv=vl(),[bN,Gu]=vN(Hu),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]=Ia({prop:r,onChange:s,defaultProp:o??"",caller:Hu});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=Gu(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=Gu(kN,n),l=Yv(n),c=Ku(i.baseId,r),u=Yu(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=Gu(SN,n),c=Ku(l.baseId,r),u=Yu(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 Ku(e,t){return`${e}-trigger-${t}`}vr(Ku,"makeTriggerId");function Yu(e,t){return`${e}-content-${t}`}vr(Yu,"makeContentId");var EN=Object.defineProperty,$N=(e,t)=>EN(e,"name",{value:t,configurable:!0});function bl(e){const[t,a]=N.useState(void 0);return Nt(()=>{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(bl,"useSize");var TN=Object.defineProperty,ts=(e,t)=>TN(e,"name",{value:t,configurable:!0}),Qu="Switch",[PN,XE]=ya(Qu),[_N,Xu]=PN(Qu);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]=Ia({prop:a,defaultProp:r??!1,onChange:l,caller:Qu}),[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}=Xu(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":Zu(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=Xu(AN,n);return $.jsx(Oe.span,{"data-state":Zu(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}=Xu(jN,t),k=Ze(r,b),g=bl(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 Zu(e){return e?"checked":"unchecked"}ts(Zu,"getState");var ON=Object.defineProperty,xn=(e,t)=>ON(e,"name",{value:t,configurable:!0}),Ju="Checkbox",[LN,ZE]=ya(Ju),[MN,ep]=LN(Ju);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]=Ia({prop:a,defaultProp:r??!1,onChange:l,caller:Ju}),[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:Ra(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}=ep(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":Ra(c)?"mixed":c,"aria-required":u,"data-state":tp(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:Ra(c)?!0:!c,hasConsumerStoppedPropagation:h}),f(y=>Ra(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=ep(UN,n);return $.jsx(es,{present:r||Ra(o.checked)||o.checked===!0,children:$.jsx(Oe.span,{"data-state":tp(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}=ep(VN,t),k=Ze(r,b),g=bl(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=Ra(i),j.call(E,Ra(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=Ra(i),j.call(E,Ra(i)?!1:i),E.dispatchEvent(new Event("click",{bubbles:!(G&&P.hasConsumerStoppedPropagation)})),d.current=!1}},[x,i,o]);const C=N.useRef(Ra(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 Ra(e){return e==="indeterminate"}xn(Ra,"isIndeterminate");function tp(e){return Ra(e)?"indeterminate":e?"checked":"unchecked"}xn(tp,"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)},ap="-",YN=e=>{const t=XN(e),{conflictingClassGroups:a,conflictingClassGroupModifiers:n}=e;return{getClassGroupId:o=>{const i=o.split(ap);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(ap);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])=>{np(o,n,s,t)}),n},np=(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)){np(r(n),t,a,n);return}t.validators.push({validator:r,classGroupId:a});return}Object.entries(r).forEach(([s,o])=>{np(o,db(t,s),a,n)})})},db=(e,t)=>{let a=e;return t.split(ap).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)),sp=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",sp]}],"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,sp]}],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,sp]}],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 yl=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}));yl.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 xl=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}));xl.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}),rp=yN,wl=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}));wl.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(Au,{container:xr(),...e}),hb=N.forwardRef(({className:e,...t},a)=>$.jsx(Du,{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(Ou,{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(Lu,{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 op(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});op(FS,P.token),op(BS,JSON.stringify(P.user??null)),op(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(rp,{value:c,onValueChange:E,children:$.jsxs(wl,{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(xl,{htmlFor:"studio-account",className:"text-[12px] text-muted-foreground",children:c==="local"?"超管账号":"域账号"}),$.jsx(yl,{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(xl,{htmlFor:"studio-pass",className:"text-[12px] text-muted-foreground",children:"密码"}),$.jsxs("div",{className:"relative min-w-0",children:[$.jsx(yl,{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]=Ia({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$]=ya(kr,[vl]),bb=vl(),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]=Ia({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]=Ia({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")),ip="ToggleGroupItem",tC=N.forwardRef(ss(function(t,a){const n=xb(ip,t.__scopeToggleGroup),r=eC(ip,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(ip,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 lp(e,[t,a]){return Math.min(a,Math.max(t,e))}nC(lp,"clamp");const sC=["top","right","bottom","left"],rs=Math.min,kn=Math.max,kl=Math.round,Nl=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 dp(e){return e==="x"?"y":"x"}function cp(e){return e==="y"?"height":"width"}function en(e){const t=e[0];return t==="t"||t==="b"?"y":"x"}function up(e){return dp(en(e))}function oC(e,t,a){a===void 0&&(a=!1);const n=Nr(e),r=up(e),s=cp(r);let o=r==="x"?n===(a?"end":"start")?"right":"left":n==="start"?"bottom":"top";return t.reference[s]>t.floating[s]&&(o=Sl(o)),[o,Sl(o)]}function iC(e){const t=Sl(e);return[pp(e),t,pp(t)]}function pp(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(pp)))),s}function Sl(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 Cl(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=en(t),o=up(t),i=cp(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=Cl(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=Cl(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=up(r),x=cp(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=en(i),h=os(i)===i,y=await(l.isRTL==null?void 0:l.isRTL(c.floating)),S=f||(h||!b?[Sl(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!==en(J):!1)||j.every(L=>en(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=en(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=en(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=en(r),v=dp(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=en(o),x=dp(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=en(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 El(){return typeof window<"u"}function Sr(e){return Ib(e)?(e.nodeName||"").toLowerCase():"#document"}function da(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 El()?e instanceof Node||e instanceof da(e).Node:!1}function tn(e){return El()?e instanceof Element||e instanceof da(e).Element:!1}function is(e){return El()?e instanceof HTMLElement||e instanceof da(e).HTMLElement:!1}function Rb(e){return!El()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof da(e).ShadowRoot}function $l(e){const{overflow:t,overflowX:a,overflowY:n,display:r}=an(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 Tl(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 fp;function mp(e){const t=tn(e)?an(e):e;return Es(t.transform)||Es(t.translate)||Es(t.scale)||Es(t.rotate)||Es(t.perspective)||!gp()&&(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(mp(t))return t;if(Tl(t))return null;t=$s(t)}return null}function gp(){return fp==null&&(fp=typeof CSS<"u"&&CSS.supports&&CSS.supports("-webkit-backdrop-filter","none")),fp}function Po(e){return/^(html|body|#document)$/.test(Sr(e))}function an(e){return da(e).getComputedStyle(e)}function Pl(e){return tn(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)&&$l(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=da(r);if(s){const i=hp(o);return t.concat(o,o.visualViewport||[],$l(r)?r:[],i&&a?_o(i):[])}else return t.concat(r,_o(r,[],a))}function hp(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function jb(e){const t=an(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=kl(a)!==s||kl(n)!==o;return i&&(a=s,n=o),{width:a,height:n,$:i}}function vp(e){return tn(e)?e:e.contextElement}function Cr(e){const t=vp(e);if(!is(t))return Nn(1);const a=t.getBoundingClientRect(),{width:n,height:r,$:s}=jb(t);let o=(s?kl(a.width):a.width)/n,i=(s?kl(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=da(e);return!gp()||!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===da(e)}function Ts(e,t,a,n){t===void 0&&(t=!1),a===void 0&&(a=!1);const r=e.getBoundingClientRect(),s=vp(e);let o=Nn(1);t&&(n?tn(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=da(s),v=tn(n)?da(n):n;let x=f,b=hp(x);for(;b&&v!==x;){const k=Cr(b),g=b.getBoundingClientRect(),d=an(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=da(b),b=hp(x)}}return Cl({width:u,height:p,x:l,y:c})}function _l(e,t){const a=Pl(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-_l(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?Tl(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"||$l(o))&&(l=Pl(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=Pl(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+_l(e);const o=-t.scrollTop;return an(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=da(e),s=Cn(e),o=r.visualViewport;let i=s.clientWidth,l=s.clientHeight,c=0,u=0;if(o){const f=!gp()||t==="fixed";n?f||(c=-o.offsetLeft,u=-o.offsetTop):(i=o.width,l=o.height,f&&(c=o.offsetLeft,u=o.offsetTop))}if(_l(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(tn(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 Cl(n)}function OC(e,t){const a=t.get(e);if(a)return a;let n=_o(e,[],!1).filter(i=>tn(i)&&Sr(i)!=="body"),r=null;const s=an(e).position==="fixed";let o=s?$s(e):e;for(;tn(o)&&!Po(o);){const i=an(o),l=mp(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"?Tl(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"||$l(r))&&(i=Pl(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=_l(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 bp(e){return an(e).position==="static"}function Mb(e,t){if(!is(e)||an(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=da(e);if(Tl(e))return a;if(!is(e)){let r=$s(e);for(;r&&!Po(r);){if(tn(r)&&!bp(r))return r;r=$s(r)}return a}let n=Mb(e,t);for(;n&&SC(n)&&bp(n);)n=Mb(n,t);return n&&Po(n)&&bp(n)&&!mp(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 an(e).direction==="rtl"}const UC={convertOffsetParentRelativeRectToViewportRelativeRect:_C,getDocumentElement:Cn,getClippingRect:LC,getOffsetParent:zb,getElementRects:FC,getClientRects:IC,getDimensions:MC,getScale:Cr,isElement:tn,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=Nl(x),d=Nl(s.clientWidth-(v+b)),h=Nl(s.clientHeight-(x+k)),y=Nl(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=da(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=vp(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(){},Il=ZC?N.useLayoutEffect:JC;function Rl(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(!Rl(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)&&!Rl(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 yp(e){const t=N.useRef(e);return Il(()=>{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);Rl(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=yp(l),H=yp(r),M=yp(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&&!Rl(_.current,T)&&(_.current=T,dr.flushSync(()=>{p(T)}))})},[f,t,a,H,M]);Il(()=>{c===!1&&_.current.isPositioned&&(_.current.isPositioned=!1,p(L=>({...L,isPositioned:!1})))},[c]);const G=N.useRef(!1);Il(()=>(G.current=!0,()=>{G.current=!1}),[]),Il(()=>{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,Al]=ya(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&&jl(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=bl(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;Nt(()=>(T(B),()=>{T(void 0)}),[B,T]);const[Q,R]=jl(B),D=Ua(b);Nt(()=>{L&&D?.()},[L,D]);const K=w.arrow?.x,we=w.arrow?.y,fe=w.arrow?.centerOffset!==0,[ye,We]=N.useState();return Nt(()=>{d&&We(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]=jl(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 jl(e){const[t,a="center"]=e.split("-");return[t,a]}En(jl,"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",[Dl,xp,T2]=zu(Er),[Ps,t$]=ya(Er,[T2,Al]),wp=Al(),[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=wp(t),[g,d]=N.useState(null),[h,y]=N.useState(null),[S,C]=N.useState(!1),E=So(c),[_,I]=Ia({prop:n,defaultProp:r??!1,onChange:s,caller:Er}),[j,H]=Ia({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 We=new Set(ye);return We.delete(fe),We})},[]),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(Dl.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=wp(n),i=ls(A2,n),l=i.disabled||r,c=Ze(a,i.onTriggerChange),u=xp(n),p=N.useRef("touch"),[f,v,x]=Np(k=>{const g=u().filter(y=>!y.disabled),d=g.find(y=>y.value===i.value),h=Sp(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);Nt(()=>{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(ku,{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 Nt(()=>{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(Dl.Slot,{scope:n,children:$.jsx("div",{ref:a,children:r})})}),s):null},"SelectContentFragment")),qa=10,[ny,Ol]=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=xp(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]),rl();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]=Np(F=>{const te=P().filter(oe=>!oe.disabled),xe=te.find(oe=>oe.ref.current===document.activeElement),X=Sp(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]),We=r===ty.Popper?sy:H2,ae=We===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(_u,{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(mu,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:o,onPointerDownOutside:i,onFocusOutside:F=>F.preventDefault(),onDismiss:()=>h.onOpenChange(!1),children:$.jsx(We,{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=Ol(_s,n),[l,c]=N.useState(null),[u,p]=N.useState(null),f=Ze(a,p),v=xp(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),Ee=window.innerWidth-qa,ke=lp(X,[qa,Math.max(qa,Ee-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),Ee=window.innerWidth-qa,ke=lp(X,[qa,Math.max(qa,Ee-W)]);l.style.minWidth=me+"px",l.style.right=ke+"px"}const M=v(),P=window.innerHeight-qa*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-qa,fe=P-we,ye=g.offsetHeight/2,We=g.offsetTop+ye,ae=q+B+We,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=`${qa}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]);Nt(()=>y(),[y]);const[S,C]=N.useState();Nt(()=>{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=qa,...o}=t,i=wp(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=Ol(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(Dl.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-qa*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),kp="SelectItem",[X2,oy]=Ps(kp),Z2=N.forwardRef(Je(function(t,a){const{__scopeSelect:n,value:r,disabled:s=!1,textValue:o,...i}=t,l=ls(kp,n),c=Ol(kp,n),u=l.value===r,[p,f]=N.useState(o??""),[v,x]=N.useState(!1),b=Ua(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(Dl.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")),Ll="SelectItemText",J2=N.forwardRef(Je(function(t,a){const{__scopeSelect:n,className:r,style:s,...o}=t,i=ls(Ll,n),l=Ol(Ll,n),c=oy(Ll,n),u=I2(Ll,n),[p,f]=N.useState(null),v=Ua(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 Nt(()=>(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 Np(e){const t=Ua(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(Np,"useTypeaheadSearch");function Sp(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(Sp,"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}),[Cp,s$]=ya("Tooltip",[Al]),Ml=Al(),rE="TooltipProvider",oE=700,Ep="tooltip.open",[iE,$p]=Cp(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"),Tp="Tooltip",[dE,Ro]=Cp(Tp),dy=Tt(e=>{const{__scopeTooltip:t,children:a,open:n,defaultOpen:r,onOpenChange:s,disableHoverableContent:o,delayDuration:i}=e,l=$p(Tp,e.__scopeTooltip),c=Ml(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]=Ia({prop:n,defaultProp:r??!1,onChange:Tt(j=>{j?(l.onOpen(),document.dispatchEvent(new CustomEvent(Ep))):l.onClose(),s?.(j)},"onChange"),caller:Tp}),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=$p(cy,n),l=Ml(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]=Cp(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(ku,{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=$p(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=Ml(n),{onClose:f}=u,[v,x]=N.useState(null),b=Ze(a,x);Xh(v),N.useEffect(()=>(document.addEventListener(Ep,f),()=>document.removeEventListener(Ep,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 Nt(()=>(k(o),()=>{k(void 0)}),[o,k]),$.jsx(mu,{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=Ml(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",Pp=100,[hE,r$]=ya(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)&&!Ip(s)&&console.error(Cy(`${s}`,"Progress"));const l=Ip(s)?s:Pp;r!==null&&!Rp(r,l)&&console.error(Ey(`${r}`,"Progress"));const c=Rp(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":_p(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":_p(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 _p(e,t){return e==null?"indeterminate":e===t?"complete":"loading"}$n(_p,"getProgressState");function jo(e){return typeof e=="number"}$n(jo,"isNumber");function Ip(e){return jo(e)&&!isNaN(e)&&e>0}$n(Ip,"isValidMaxNumber");function Rp(e,t){return jo(e)&&!isNaN(e)&&e<=t&&e>=0}$n(Rp,"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 \`${Pp}\`.`}$n(Cy,"getInvalidMaxError");function Ey(e,t){return`Invalid prop \`value\` of value \`${e}\` supplied to \`${t}\`. The \`value\` prop must be:
|
|
948
|
+
`)},Bk=0,xr=[];function Uk(e){var t=N.useRef([]),a=N.useRef([0,0]),n=N.useRef(),r=N.useState(Bk++)[0],s=N.useState(bv)[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=dk([e.lockRef.current],(e.shards||[]).map(Cv),!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=gl(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,D=I?I===C||I.contains(C):!1;if(D)return!1;var W=wv(E,C);if(!W)return!0;if(W?S=E:(S=E==="v"?"h":"v",W=wv(E,C)),!W)return!1;if(!n.current&&"changedTouches"in b&&(h||y)&&(n.current=S),!S)return!0;var M=n.current||S;return Mk(M,k,b,M==="h"?h:y)},[]),l=N.useCallback(function(b){var k=b;if(!(!xr.length||xr[xr.length-1]!==s)){var g="deltaY"in k?Sv(k):gl(k),d=t.current.filter(function(S){return S.name===k.type&&(S.target===k.target||k.target===S.shadowParent)&&zk(S.delta,g)})[0];if(d&&d.should){k.cancelable&&k.preventDefault();return}if(!d){var h=(o.current.shards||[]).map(Cv).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:qk(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=gl(b),n.current=void 0},[]),p=N.useCallback(function(b){c(b.type,Sv(b),b.target,i(b,e.lockRef.current))},[]),f=N.useCallback(function(b){c(b.type,gl(b),b.target,i(b,e.lockRef.current))},[]);N.useEffect(function(){return xr.push(s),e.setCallbacks({onScrollCapture:p,onWheelCapture:p,onTouchMoveCapture:f}),document.addEventListener("wheel",l,yr),document.addEventListener("touchmove",l,yr),document.addEventListener("touchstart",u,yr),function(){xr=xr.filter(function(b){return b!==s}),document.removeEventListener("wheel",l,yr),document.removeEventListener("touchmove",l,yr),document.removeEventListener("touchstart",u,yr)}},[]);var v=e.removeScrollBar,x=e.inert;return N.createElement(N.Fragment,null,x?N.createElement(s,{styles:Fk(r)}):null,v?N.createElement(Ik,{noRelative:e.noRelative,gapMode:e.gapMode}):null)}function qk(e){for(var t=null;e!==null;)e instanceof ShadowRoot&&(t=e.host,e=e.host),e=e.parentNode;return t}const Vk=bk(vv,Uk);var Du=N.forwardRef(function(e,t){return N.createElement(fl,nn({},e,{ref:t,sideCar:Vk}))});Du.classNames=fl.classNames;var Wk=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},wr=new WeakMap,hl=new WeakMap,vl={},Ou=0,Ev=function(e){return e&&(e.host||Ev(e.parentNode))},Hk=function(e,t){return t.map(function(a){if(e.contains(a))return a;var n=Ev(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})},Gk=function(e,t,a,n){var r=Hk(t,Array.isArray(e)?e:[e]);vl[a]||(vl[a]=new WeakMap);var s=vl[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=(wr.get(f)||0)+1,k=(s.get(f)||0)+1;wr.set(f,b),s.set(f,k),o.push(f),b===1&&x&&hl.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(),Ou++,function(){o.forEach(function(p){var f=wr.get(p)-1,v=s.get(p)-1;wr.set(p,f),s.set(p,v),f||(hl.has(p)||p.removeAttribute(n),hl.delete(p)),v||p.removeAttribute(a)}),Ou--,Ou||(wr=new WeakMap,wr=new WeakMap,hl=new WeakMap,vl={})}},$v=function(e,t,a){a===void 0&&(a="data-aria-hidden");var n=Array.from(Array.isArray(e)?e:[e]),r=Wk(e);return r?(n.push.apply(n,Array.from(r.querySelectorAll("[aria-live], script"))),Gk(n,r,a,"aria-hidden")):function(){return null}},Kk=Object.defineProperty,Sa=(e,t)=>Kk(e,"name",{value:t,configurable:!0}),Lu="Dialog",[Tv,YE]=Na(Lu),[Yk,sn]=Tv(Lu),Pv=Sa(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}=tv(),[p,f]=Da({prop:n,defaultProp:r??!1,onChange:s,caller:Lu}),[v,x]=N.useState(0),[b,k]=N.useState(0);return $.jsx(Yk,{scope:t,triggerRef:i,contentRef:l,contentId:wn(),titleId:wn(),descriptionId:wn(),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"),_v="DialogPortal",[Qk,Iv]=Tv(_v,{forceMount:void 0}),Mu=Sa(e=>{const{__scopeDialog:t,forceMount:a,children:n,container:r}=e,s=sn(_v,t);return $.jsx(Qk,{scope:t,forceMount:a,children:N.Children.map(n,o=>$.jsx(is,{present:a||s.open,children:$.jsx($u,{asChild:!0,container:r,children:o})}))})},"DialogPortal"),zu="DialogOverlay",Fu=N.forwardRef(Sa(function(t,a){const n=Iv(zu,t.__scopeDialog),{forceMount:r=n.forceMount,...s}=t,o=sn(zu,t.__scopeDialog);return o.modal?$.jsx(is,{present:r||o.open,children:$.jsx(Zk,{...s,ref:a})}):null},"DialogOverlay")),Xk=xn("DialogOverlay.RemoveScroll"),Zk=N.forwardRef(Sa(function(t,a){const{__scopeDialog:n,...r}=t,s=sn(zu,n),o=Kh(),i=Xe(a,o);return $.jsx(Du,{as:Xk,allowPinchZoom:!0,shards:N.useMemo(()=>[s.contentRef,...s.branchNodes.map(l=>({current:l}))],[s.contentRef,s.branchNodes]),children:$.jsx(ze.div,{"data-state":qu(s.open),...r,ref:i,style:{pointerEvents:"auto",...r.style}})})},"DialogOverlayImpl")),To="DialogContent",Bu=N.forwardRef(Sa(function(t,a){const n=Iv(To,t.__scopeDialog),{forceMount:r=n.forceMount,...s}=t,o=sn(To,t.__scopeDialog);return $.jsx(is,{present:r||o.open,children:o.modal?$.jsx(Jk,{...s,ref:a}):$.jsx(eN,{...s,ref:a})})},"DialogContent")),Jk=N.forwardRef(Sa(function(t,a){const n=sn(To,t.__scopeDialog),r=N.useRef(null),s=Xe(a,n.contentRef,r);return N.useEffect(()=>{const o=r.current;if(o)return $v(o)},[]),$.jsx(Rv,{...t,ref:s,trapFocus:n.open,disableOutsidePointerEvents:n.open,onCloseAutoFocus:Re(t.onCloseAutoFocus,o=>{o.preventDefault(),n.triggerRef.current?.focus()}),onPointerDownOutside:Re(t.onPointerDownOutside,o=>{const i=o.detail.originalEvent,l=i.button===0&&i.ctrlKey===!0;(i.button===2||l)&&o.preventDefault()}),onFocusOutside:Re(t.onFocusOutside,o=>o.preventDefault())})},"DialogContentModal")),eN=N.forwardRef(Sa(function(t,a){const n=sn(To,t.__scopeDialog),r=N.useRef(!1),s=N.useRef(!1);return $.jsx(Rv,{...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")),Rv=N.forwardRef(Sa(function(t,a){const{__scopeDialog:n,trapFocus:r,onOpenAutoFocus:s,onCloseAutoFocus:o,"aria-describedby":i,children:l,...c}=t,u=sn(To,n);return cl(),$.jsx(ev,{registry:u.branchRegistry,children:$.jsx(Zh,{asChild:!0,loop:!0,trapped:r,branches:u.branchNodes,onMountAutoFocus:s,onUnmountAutoFocus:o,children:$.jsx(yu,{role:"dialog",id:u.contentId,"aria-labelledby":u.titlePresent?u.titleId:void 0,"aria-describedby":u.descriptionPresent?Dv(i,u.descriptionId):i,"data-state":qu(u.open),...c,ref:a,deferPointerDownOutside:!0,onDismiss:()=>u.onOpenChange(!1),children:l})})})},"DialogContentImpl")),Uu=N.forwardRef(Sa(function(t,a){const{__scopeDialog:n,...r}=t,s=sn("DialogTitle",n),{setTitleCount:o}=s;return Nt(()=>(o(i=>i+1),()=>o(i=>i-1)),[o]),$.jsx(ze.h2,{id:s.titleId,...r,ref:a})},"DialogTitle")),Av=N.forwardRef(Sa(function(t,a){const{__scopeDialog:n,...r}=t,s=sn("DialogDescription",n),{setDescriptionCount:o}=s;return Nt(()=>(o(i=>i+1),()=>o(i=>i-1)),[o]),$.jsx(ze.p,{id:s.descriptionId,...r,ref:a})},"DialogDescription")),tN="DialogClose",jv=N.forwardRef(Sa(function(t,a){const{__scopeDialog:n,...r}=t,s=sn(tN,n);return $.jsx(ze.button,{type:"button",...r,ref:a,onClick:Re(t.onClick,()=>s.onOpenChange(!1))})},"DialogClose"));function Dv(...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}Sa(Dv,"concatAriaDescribedby");function qu(e){return e?"open":"closed"}Sa(qu,"getState");var aN=Object.defineProperty,Ot=(e,t)=>aN(e,"name",{value:t,configurable:!0});function Vu(e){const t=e+"CollectionProvider",[a,n]=Na(t),[r,s]=a(t,{collectionRef:{current:null},itemMap:new Map}),o=Ot(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=xn(i),c=N.forwardRef((b,k)=>{const{scope:g,children:d}=b,h=s(i,g),y=Xe(k,h.collectionRef);return $.jsx(l,{ref:y,children:d})});c.displayName=i;const u=e+"CollectionItemSlot",p="data-radix-collection-item",f=xn(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))),$.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 Ot(x,"useCollection"),[{Provider:o,Slot:c,ItemSlot:v},x,n]}Ot(Vu,"createCollection");var Ov=new WeakMap,bl=(Ca=class extends Map{constructor(a){super(a);My(this,St);zp(this,St,[...super.keys()]),Ov.set(this,!0)}set(a,n){return Ov.get(this)&&!this.has(a)&&Yt(this,St).push(a),super.set(a,n),this}insert(a,n,r){const s=this.has(n),o=s?this.size:this.size+1,i=Wu(a),l=i>=0?Math.min(i,o-1):Math.max(o+i,0);if(s?Yt(this,St).indexOf(n)===l:l===this.size)return this.set(n,r),this;const c=Yt(this,St).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 Ca(this);return s.insert(a,n,r),s}before(a){const n=Yt(this,St).indexOf(a)-1;if(!(n<0))return this.entryAt(n)}setBefore(a,n,r){const s=Yt(this,St).indexOf(a);if(s===-1)return this;const o=Yt(this,St).indexOf(n),i=o!==-1&&o<s?s-1:s;return this.insert(i,n,r)}after(a){let n=Yt(this,St).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=Yt(this,St).indexOf(a);if(s===-1)return this;const o=Yt(this,St).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 zp(this,St,[]),super.clear()}delete(a){const n=super.delete(a);return n&&Yt(this,St).splice(Yt(this,St).indexOf(a),1),n}deleteAt(a){const n=this.keyAt(a);return n!==void 0?this.delete(n):!1}at(a){const n=yl(Yt(this,St),a);if(n!==void 0)return this.get(n)}entryAt(a){const n=yl(Yt(this,St),a);if(n!==void 0)return[n,this.get(n)]}indexOf(a){return Yt(this,St).indexOf(a)}keyAt(a){return yl(Yt(this,St),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 Ca(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 Ca(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 Ca(n)}toReversed(){const a=new Ca;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 Ca(n)}slice(a,n){const r=new Ca;for(const s of Yt(this,St).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}},St=new WeakMap,Ot(Ca,"OrderedDict"),Ca);function yl(e,t){if("at"in Array.prototype)return Array.prototype.at.call(e,t);const a=Lv(e,t);return a===-1?void 0:e[a]}Ot(yl,"at");function Lv(e,t){const a=e.length,n=Wu(t),r=n>=0?n:a+n;return r<0||r>=a?-1:r}Ot(Lv,"toSafeIndex");function Wu(e){return e!==e||e===0?0:Math.trunc(e)}Ot(Wu,"toSafeInteger");function nN(e){const t=e+"CollectionProvider",[a,n]=Na(t),[r,s]=a(t);r.displayName=e+"CollectionStableContextProvider";const[o,i]=a(t);o.displayName=e+"CollectionStatefulContextProvider";const l=Ot(({state:C,...E})=>C?$.jsx(u,{...E,state:C}):$.jsx(c,{...E}),"CollectionProvider");l.displayName=t;const c=Ot(C=>{const E=d();return $.jsx(u,{...C,state:E})},"CollectionInit");c.displayName=e+"CollectionInit";const u=Ot(C=>{const{scope:E,children:_,state:I}=C,D=N.useRef(null),[W,M]=N.useState(null),P=Xe(D,M),[H,J]=I,U=N.useRef(new bl),F=N.useCallback(()=>{const L=U.current;return Fv(L)||L.sort(xl),L},[]);return N.useEffect(()=>{if(!W)return;const L=Bv(()=>{J(w=>{const T=w.toSorted(xl);return T.some(([R],O)=>w.keyAt(O)!==R)?T:w})});return L.observe(W,{childList:!0,subtree:!0}),()=>{L.disconnect()}},[W,J]),$.jsx(r,{scope:E,collectionElementRef:P,collectionElementRefObject:D,getCollection:F,setCollection:J,registryRef:U,children:$.jsx(o,{scope:E,collectionElement:W,collection:H,children:_})})},"CollectionProviderImpl");u.displayName=e+"CollectionProviderImpl";const p=e+"CollectionSlot",f=xn(p),v=N.forwardRef((C,E)=>{const{scope:_,children:I}=C,D=s(p,_),W=Xe(E,D.collectionElementRef);return $.jsx(f,{ref:W,children:I})});v.displayName=p;const x=e+"CollectionItemSlot",b="data-radix-collection-item",k=xn(x),g=N.forwardRef((C,E)=>{const{scope:_,children:I,...D}=C,W=N.useRef(null),M=s(x,_),{setCollection:P,registryRef:H}=M,J=N.useRef(D);Mv(J.current,D)||(J.current=D);const U=J.current,F=N.useCallback(T=>{const K=H.current;T?K.set(T,{...J.current,element:T}):W.current&&K.delete(W.current)},[H]),L=Xe(E,F,W);Nt(()=>{const T=W.current,K=H.current;T&&K.has(T)&&K.set(T,{...U,element:T})},[U,H]);const w=N.useRef(null);return N.useEffect(()=>{const T=W.current,K=w.current;(K?.element??null)===T&&(!T||K?.itemData===U)||(w.current=T?{element:T,itemData:U}:null,P(R=>{const O=new bl(R);return K&&K.element!==T&&O.delete(K.element),T&&O.set(T,{...U,element:T}),O.sort(xl)}))}),N.useEffect(()=>()=>{const T=w.current;w.current=null,T&&P(K=>{if(!K.has(T.element))return K;const R=new bl(K);return R.delete(T.element),R})},[P]),$.jsx(k,{[b]:"",ref:L,children:I})});g.displayName=x;function d(){return N.useState(new bl)}Ot(d,"useInitCollection");function h(C){const{collection:E}=i(e+"CollectionConsumer",C);return E}Ot(h,"useCollection");function y(C){const{getCollection:E}=s(e+"CollectionConsumer",C);return E}return Ot(y,"useGetCollection"),[{Provider:l,Slot:v,ItemSlot:g},{createCollectionScope:n,useCollection:h,useGetCollection:y,useInitCollection:d}]}Ot(nN,"createCollection");function Mv(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}Ot(Mv,"shallowEqual");function zv(e,t){return!!(t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_PRECEDING)}Ot(zv,"isElementPreceding");function Fv(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}Ot(Fv,"isInDocumentOrder");function xl(e,t){return!e[1].element||!t[1].element?0:zv(e[1].element,t[1].element)?-1:1}Ot(xl,"sortByDocumentPosition");function Bv(e){return new MutationObserver(a=>{for(const n of a)if(n.type==="childList"){e();return}})}Ot(Bv,"getChildListObserver");var sN=Object.defineProperty,rN=(e,t)=>sN(e,"name",{value:t,configurable:!0}),oN={LTR:"ltr"},iN=N.createContext(void 0);function Po(e){const t=N.useContext(iN);return e||t||oN.LTR}rN(Po,"useDirection");var lN=Object.defineProperty,Hu=(e,t)=>lN(e,"name",{value:t,configurable:!0}),Gu=!1;function Uv(){const[e,t]=N.useState(Gu);return N.useEffect(()=>{Gu||(Gu=!0,t(!0))},[]),e}Hu(Uv,"useIsHydrated");var qv=Fn[" useSyncExternalStore ".trim().toString()];function Vv(){return()=>{}}Hu(Vv,"subscribe");function Wv(){return qv(Vv,()=>!0,()=>!1)}Hu(Wv,"useIsHydratedModern");var dN=typeof qv=="function"?Wv:Uv,cN=Object.defineProperty,Is=(e,t)=>cN(e,"name",{value:t,configurable:!0}),Ku="rovingFocusGroup.onEntryFocus",uN={bubbles:!1,cancelable:!0},wl="RovingFocusGroup",[Yu,Hv,pN]=Vu(wl),[fN,kl]=Na(wl,[pN]),Gv={Vertical:"vertical",Horizontal:"horizontal"},mN={RTL:"rtl"},[gN,hN]=fN(wl),Kv=N.forwardRef(Is(function(t,a){return $.jsx(Yu.Provider,{scope:t.__scopeRovingFocusGroup,children:$.jsx(Yu.Slot,{scope:t.__scopeRovingFocusGroup,children:$.jsx(vN,{...t,ref:a})})})},"RovingFocusGroup")),vN=N.forwardRef(Is(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=Po(o),[k,g]=Da({prop:i,defaultProp:l??null,onChange:c,caller:wl}),[d,h]=N.useState(!1),y=Ga(u),S=Hv(n),C=N.useRef(!1),[E,_]=N.useState(0);return N.useEffect(()=>{const I=v.current;if(I)return I.addEventListener(Ku,y),()=>I.removeEventListener(Ku,y)},[y]),$.jsx(gN,{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(ze.div,{tabIndex:d||E===0?-1:0,"data-orientation":r,...f,ref:x,style:{outline:"none",...t.style},onMouseDown:Re(t.onMouseDown,()=>{C.current=!0}),onFocus:Re(t.onFocus,I=>{const D=!C.current;if(I.target===I.currentTarget&&D&&!d){const W=new CustomEvent(Ku,uN);if(I.currentTarget.dispatchEvent(W),!W.defaultPrevented){const M=S().filter(F=>F.focusable),P=M.find(F=>F.active),H=M.find(F=>F.id===k),U=[P,H,...M].filter(Boolean).map(F=>F.ref.current);Qu(U,p)}}C.current=!1}),onBlur:Re(t.onBlur,()=>h(!1))})})},"RovingFocusGroupImpl")),bN="RovingFocusGroupItem",Yv=N.forwardRef(Is(function(t,a){const{__scopeRovingFocusGroup:n,focusable:r=!0,active:s=!1,tabStopId:o,children:i,...l}=t,c=wn(),u=o||c,p=hN(bN,n),f=p.currentTabStopId===u,v=Hv(n),{onFocusableItemAdd:x,onFocusableItemRemove:b,currentTabStopId:k}=p,g=dN();return Nt(()=>{if(!(!g||!r))return x(),()=>b()},[g,r,x,b]),N.useEffect(()=>{if(!(g||!r))return x(),()=>b()},[g,r,x,b]),$.jsx(Yu.ItemSlot,{scope:n,id:u,focusable:r,active:s,children:$.jsx(ze.span,{tabIndex:f?0:-1,"data-orientation":p.orientation,...l,ref:a,onMouseDown:Re(t.onMouseDown,d=>{r?p.onItemFocus(u):d.preventDefault()}),onFocus:Re(t.onFocus,()=>p.onItemFocus(u)),onKeyDown:Re(t.onKeyDown,d=>{if(d.key==="Tab"&&d.shiftKey){p.onItemShiftTab();return}if(d.target!==d.currentTarget)return;const h=Xv(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?Zv(S,C+1):S.slice(C+1)}setTimeout(()=>Qu(S))}}),children:typeof i=="function"?i({isCurrentTabStop:f,hasTabStop:k!=null}):i})})},"RovingFocusGroupItem")),yN={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function Qv(e,t){return t!==mN.RTL?e:e==="ArrowLeft"?"ArrowRight":e==="ArrowRight"?"ArrowLeft":e}Is(Qv,"getDirectionAwareKey");function Xv(e,t,a){const n=Qv(e.key,a);if(!(t===Gv.Vertical&&["ArrowLeft","ArrowRight"].includes(n))&&!(t===Gv.Horizontal&&["ArrowUp","ArrowDown"].includes(n)))return yN[n]}Is(Xv,"getFocusIntent");function Qu(e,t=!1){const a=document.activeElement;for(const n of e)if(n===a||(n.focus({preventScroll:t}),document.activeElement!==a))return}Is(Qu,"focusFirst");function Zv(e,t){return e.map((a,n)=>e[(t+n)%e.length])}Is(Zv,"wrapArray");var xN=Object.defineProperty,kr=(e,t)=>xN(e,"name",{value:t,configurable:!0}),Jv={Automatic:"automatic",Manual:"manual"},Xu="Tabs",[wN,QE]=Na(Xu,[kl]),eb=kl(),[kN,Zu]=wN(Xu),NN=N.forwardRef(kr(function(t,a){const{__scopeTabs:n,value:r,onValueChange:s,defaultValue:o,orientation:i="horizontal",dir:l,activationMode:c=Jv.Automatic,...u}=t,p=Po(l),[f,v]=Da({prop:r,onChange:s,defaultProp:o??"",caller:Xu});return $.jsx(kN,{scope:n,baseId:wn(),value:f,onValueChange:v,orientation:i,dir:p,activationMode:c,children:$.jsx(ze.div,{dir:p,"data-orientation":i,...u,ref:a})})},"Tabs")),SN="TabsList",CN=N.forwardRef(kr(function(t,a){const{__scopeTabs:n,loop:r=!0,...s}=t,o=Zu(SN,n),i=eb(n);return $.jsx(Kv,{asChild:!0,...i,orientation:o.orientation,dir:o.dir,loop:r,children:$.jsx(ze.div,{role:"tablist","aria-orientation":o.orientation,...s,ref:a})})},"TabsList")),EN="TabsTrigger",$N=N.forwardRef(kr(function(t,a){const{__scopeTabs:n,value:r,disabled:s=!1,...o}=t,i=Zu(EN,n),l=eb(n),c=Ju(i.baseId,r),u=ep(i.baseId,r),p=r===i.value;return $.jsx(Yv,{asChild:!0,...l,focusable:!s,active:p,children:$.jsx(ze.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:Re(t.onMouseDown,f=>{!s&&f.button===0&&f.ctrlKey===!1?(f.currentTarget.focus(),i.onValueChange(r)):f.preventDefault()}),onKeyDown:Re(t.onKeyDown,f=>{s||f.target!==f.currentTarget||[" ","Enter"].includes(f.key)&&i.onValueChange(r)}),onFocus:Re(t.onFocus,()=>{const f=i.activationMode!==Jv.Manual;!p&&!s&&f&&i.onValueChange(r)})})})},"TabsTrigger")),TN="TabsContent",PN=N.forwardRef(kr(function(t,a){const{__scopeTabs:n,value:r,forceMount:s,children:o,...i}=t,l=Zu(TN,n),c=Ju(l.baseId,r),u=ep(l.baseId,r),p=r===l.value,f=N.useRef(p);return N.useEffect(()=>{const v=requestAnimationFrame(()=>f.current=!1);return()=>cancelAnimationFrame(v)},[]),$.jsx(is,{present:s||p,children:({present:v})=>$.jsx(ze.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 Ju(e,t){return`${e}-trigger-${t}`}kr(Ju,"makeTriggerId");function ep(e,t){return`${e}-content-${t}`}kr(ep,"makeContentId");var _N=Object.defineProperty,IN=(e,t)=>_N(e,"name",{value:t,configurable:!0});function Nl(e){const[t,a]=N.useState(void 0);return Nt(()=>{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}IN(Nl,"useSize");var RN=Object.defineProperty,ls=(e,t)=>RN(e,"name",{value:t,configurable:!0}),tp="Switch",[AN,XE]=Na(tp),[jN,ap]=AN(tp);function tb(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]=Da({prop:a,defaultProp:r??!1,onChange:l,caller:tp}),[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(jN,{scope:t,...S,children:sb(p)?p(S):n})}ls(tb,"SwitchProvider");var DN="SwitchTrigger",ON=N.forwardRef(ls(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}=ap(DN,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=ls(()=>f(g.current),"reset");return d.addEventListener("reset",h),()=>d.removeEventListener("reset",h)}},[s,o,f]),$.jsx(ze.button,{type:"button",role:"switch","aria-checked":c,"aria-required":u,"data-state":np(c),"data-disabled":l?"":void 0,disabled:l,value:i,...n,ref:k,onClick:Re(a,d=>{const h=d.isPropagationStopped();v({requestedChecked:!c,hasConsumerStoppedPropagation:h}),f(y=>!y),b&&x&&(h||d.stopPropagation())})})},"SwitchTrigger")),ab=N.forwardRef(ls(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(tb,{__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(ON,{...f,ref:a,__scopeSwitch:n}),v&&$.jsx(zN,{__scopeSwitch:n})]})})},"Switch")),LN="SwitchThumb",nb=N.forwardRef(ls(function(t,a){const{__scopeSwitch:n,...r}=t,s=ap(LN,n);return $.jsx(ze.span,{"data-state":np(s.checked),"data-disabled":s.disabled?"":void 0,...r,ref:a})},"SwitchThumb")),MN="SwitchBubbleInput",zN=N.forwardRef(ls(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}=ap(MN,t),k=Xe(r,b),g=Nl(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,D=Object.getOwnPropertyDescriptor(_,"checked").set;if(!D)return;const W=h.current!==i;h.current=i;const M=o!==null&&o!==y.current;if(y.current=o,M)S.current=W?null:o,W&&D.call(E,i),E.dispatchEvent(new Event("click",{bubbles:!o.hasConsumerStoppedPropagation}));else if(W){const P=S.current;S.current=null;const H=P?.requestedChecked===i;d.current=!0,D.call(E,i),E.dispatchEvent(new Event("click",{bubbles:!(H&&P.hasConsumerStoppedPropagation)})),d.current=!1}},[x,i,o]);const C=N.useRef(i);return $.jsx(ze.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:Re(a,E=>{d.current&&E.stopPropagation()}),style:{...n.style,...g,position:"absolute",pointerEvents:"none",opacity:0,margin:0,transform:"translateX(-100%)"}})},"SwitchBubbleInput"));function sb(e){return typeof e=="function"}ls(sb,"isFunction");function np(e){return e?"checked":"unchecked"}ls(np,"getState");var FN=Object.defineProperty,Sn=(e,t)=>FN(e,"name",{value:t,configurable:!0}),sp="Checkbox",[BN,ZE]=Na(sp),[UN,rp]=BN(sp);function rb(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]=Da({prop:a,defaultProp:r??!1,onChange:l,caller:sp}),[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:Oa(r)?!1:r,isFormControl:y,bubbleInput:k,setBubbleInput:g};return $.jsx(UN,{scope:t,...S,children:ob(p)?p(S):n})}Sn(rb,"CheckboxProvider");var qN="CheckboxTrigger",VN=N.forwardRef(Sn(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}=rp(qN,t),k=Xe(s,p),g=N.useRef(c);return N.useEffect(()=>{const d=o?.form;if(d){const h=Sn(()=>f(g.current),"reset");return d.addEventListener("reset",h),()=>d.removeEventListener("reset",h)}},[o,f]),$.jsx(ze.button,{type:"button",role:"checkbox","aria-checked":Oa(c)?"mixed":c,"aria-required":u,"data-state":op(c),"data-disabled":l?"":void 0,disabled:l,value:i,...r,ref:k,onKeyDown:Re(a,d=>{d.key==="Enter"&&d.preventDefault()}),onClick:Re(n,d=>{const h=d.isPropagationStopped();v({requestedChecked:Oa(c)?!0:!c,hasConsumerStoppedPropagation:h}),f(y=>Oa(y)?!0:!y),b&&x&&(h||d.stopPropagation())})})},"CheckboxTrigger")),WN=N.forwardRef(Sn(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(rb,{__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(VN,{...f,ref:a,__scopeCheckbox:n}),v&&$.jsx(YN,{__scopeCheckbox:n})]})})},"Checkbox")),HN="CheckboxIndicator",GN=N.forwardRef(Sn(function(t,a){const{__scopeCheckbox:n,forceMount:r,...s}=t,o=rp(HN,n);return $.jsx(is,{present:r||Oa(o.checked)||o.checked===!0,children:$.jsx(ze.span,{"data-state":op(o.checked),"data-disabled":o.disabled?"":void 0,...s,ref:a,style:{pointerEvents:"none",...t.style}})})},"CheckboxIndicator")),KN="CheckboxBubbleInput",YN=N.forwardRef(Sn(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}=rp(KN,t),k=Xe(r,b),g=Nl(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,D=Object.getOwnPropertyDescriptor(_,"checked").set;if(!D)return;const W=h.current!==i;h.current=i;const M=o!==null&&o!==y.current;if(y.current=o,M)S.current=W?null:o,W&&(E.indeterminate=Oa(i),D.call(E,Oa(i)?!1:i)),E.dispatchEvent(new Event("click",{bubbles:!o.hasConsumerStoppedPropagation}));else if(W){const P=S.current;S.current=null;const H=P?.requestedChecked===i;d.current=!0,E.indeterminate=Oa(i),D.call(E,Oa(i)?!1:i),E.dispatchEvent(new Event("click",{bubbles:!(H&&P.hasConsumerStoppedPropagation)})),d.current=!1}},[x,i,o]);const C=N.useRef(Oa(i)?!1:i);return $.jsx(ze.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:Re(a,E=>{d.current&&E.stopPropagation()}),style:{...n.style,...g,position:"absolute",pointerEvents:"none",opacity:0,margin:0,transform:"translateX(-100%)"}})},"CheckboxBubbleInput"));function ob(e){return typeof e=="function"}Sn(ob,"isFunction");function Oa(e){return e==="indeterminate"}Sn(Oa,"isIndeterminate");function op(e){return Oa(e)?"indeterminate":e?"checked":"unchecked"}Sn(op,"getState");var QN=Object.defineProperty,XN=(e,t)=>QN(e,"name",{value:t,configurable:!0}),ZN=N.forwardRef(XN(function(t,a){return $.jsx(ze.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 ib(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=ib(e[t]))&&(n&&(n+=" "),n+=a)}else for(a in e)e[a]&&(n&&(n+=" "),n+=a);return n}function lb(){for(var e,t,a=0,n="",r=arguments.length;a<r;a++)(e=arguments[a])&&(t=ib(e))&&(n&&(n+=" "),n+=t);return n}const db=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,cb=lb,ub=(e,t)=>a=>{var n;if(t?.variants==null)return cb(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=db(u)||db(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 cb(e,o,l,a?.class,a?.className)},ip="-",JN=e=>{const t=tS(e),{conflictingClassGroups:a,conflictingClassGroupModifiers:n}=e;return{getClassGroupId:o=>{const i=o.split(ip);return i[0]===""&&i.length!==1&&i.shift(),pb(i,t)||eS(o)},getConflictingClassGroupIds:(o,i)=>{const l=a[o]||[];return i&&n[o]?[...l,...n[o]]:l}}},pb=(e,t)=>{if(e.length===0)return t.classGroupId;const a=e[0],n=t.nextPart.get(a),r=n?pb(e.slice(1),n):void 0;if(r)return r;if(t.validators.length===0)return;const s=e.join(ip);return t.validators.find(({validator:o})=>o(s))?.classGroupId},fb=/^\[(.+)\]$/,eS=e=>{if(fb.test(e)){const t=fb.exec(e)[1],a=t?.substring(0,t.indexOf(":"));if(a)return"arbitrary.."+a}},tS=e=>{const{theme:t,prefix:a}=e,n={nextPart:new Map,validators:[]};return nS(Object.entries(e.classGroups),a).forEach(([s,o])=>{lp(o,n,s,t)}),n},lp=(e,t,a,n)=>{e.forEach(r=>{if(typeof r=="string"){const s=r===""?t:mb(t,r);s.classGroupId=a;return}if(typeof r=="function"){if(aS(r)){lp(r(n),t,a,n);return}t.validators.push({validator:r,classGroupId:a});return}Object.entries(r).forEach(([s,o])=>{lp(o,mb(t,s),a,n)})})},mb=(e,t)=>{let a=e;return t.split(ip).forEach(n=>{a.nextPart.has(n)||a.nextPart.set(n,{nextPart:new Map,validators:[]}),a=a.nextPart.get(n)}),a},aS=e=>e.isThemeGetter,nS=(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,sS=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)}}},gb="!",rS=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(gb),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},oS=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},iS=e=>({cache:sS(e.cacheSize),parseClassName:rS(e),...JN(e)}),lS=/\s+/,dS=(e,t)=>{const{parseClassName:a,getClassGroupId:n,getConflictingClassGroupIds:r}=t,s=[],o=e.trim().split(lS);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=oS(u).join(":"),g=p?k+gb: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 cS(){let e=0,t,a,n="";for(;e<arguments.length;)(t=arguments[e++])&&(a=hb(t))&&(n&&(n+=" "),n+=a);return n}const hb=e=>{if(typeof e=="string")return e;let t,a="";for(let n=0;n<e.length;n++)e[n]&&(t=hb(e[n]))&&(a&&(a+=" "),a+=t);return a};function uS(e,...t){let a,n,r,s=o;function o(l){const c=t.reduce((u,p)=>p(u),e());return a=iS(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=dS(l,a);return r(l,u),u}return function(){return s(cS.apply(null,arguments))}}const lt=e=>{const t=a=>a[e]||[];return t.isThemeGetter=!0,t},vb=/^\[(?:([a-z-]+):)?(.+)\]$/i,pS=/^\d+\/\d+$/,fS=new Set(["px","full","screen"]),mS=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,gS=/\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$/,hS=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,vS=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,bS=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,Cn=e=>Nr(e)||fS.has(e)||pS.test(e),ds=e=>Sr(e,"length",ES),Nr=e=>!!e&&!Number.isNaN(Number(e)),dp=e=>Sr(e,"number",Nr),_o=e=>!!e&&Number.isInteger(Number(e)),yS=e=>e.endsWith("%")&&Nr(e.slice(0,-1)),Oe=e=>vb.test(e),cs=e=>mS.test(e),xS=new Set(["length","size","percentage"]),wS=e=>Sr(e,xS,bb),kS=e=>Sr(e,"position",bb),NS=new Set(["image","url"]),SS=e=>Sr(e,NS,TS),CS=e=>Sr(e,"",$S),Io=()=>!0,Sr=(e,t,a)=>{const n=vb.exec(e);return n?n[1]?typeof t=="string"?n[1]===t:t.has(n[1]):a(n[2]):!1},ES=e=>gS.test(e)&&!hS.test(e),bb=()=>!1,$S=e=>vS.test(e),TS=e=>bS.test(e),PS=uS(()=>{const e=lt("colors"),t=lt("spacing"),a=lt("blur"),n=lt("brightness"),r=lt("borderColor"),s=lt("borderRadius"),o=lt("borderSpacing"),i=lt("borderWidth"),l=lt("contrast"),c=lt("grayscale"),u=lt("hueRotate"),p=lt("invert"),f=lt("gap"),v=lt("gradientColorStops"),x=lt("gradientColorStopPositions"),b=lt("inset"),k=lt("margin"),g=lt("opacity"),d=lt("padding"),h=lt("saturate"),y=lt("scale"),S=lt("sepia"),C=lt("skew"),E=lt("space"),_=lt("translate"),I=()=>["auto","contain","none"],D=()=>["auto","hidden","clip","visible","scroll"],W=()=>["auto",Oe,t],M=()=>[Oe,t],P=()=>["",Cn,ds],H=()=>["auto",Nr,Oe],J=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],U=()=>["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"],L=()=>["start","end","center","between","around","evenly","stretch"],w=()=>["","0",Oe],T=()=>["auto","avoid","all","avoid-page","page","left","right","column"],K=()=>[Nr,Oe];return{cacheSize:500,separator:":",theme:{colors:[Io],spacing:[Cn,ds],blur:["none","",cs,Oe],brightness:K(),borderColor:[e],borderRadius:["none","","full",cs,Oe],borderSpacing:M(),borderWidth:P(),contrast:K(),grayscale:w(),hueRotate:K(),invert:w(),gap:M(),gradientColorStops:[e],gradientColorStopPositions:[yS,ds],inset:W(),margin:W(),opacity:K(),padding:M(),saturate:K(),scale:K(),sepia:w(),skew:K(),space:M(),translate:M()},classGroups:{aspect:[{aspect:["auto","square","video",Oe]}],container:["container"],columns:[{columns:[cs]}],"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(),Oe]}],overflow:[{overflow:D()}],"overflow-x":[{"overflow-x":D()}],"overflow-y":[{"overflow-y":D()}],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",_o,Oe]}],basis:[{basis:W()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",Oe]}],grow:[{grow:w()}],shrink:[{shrink:w()}],order:[{order:["first","last","none",_o,Oe]}],"grid-cols":[{"grid-cols":[Io]}],"col-start-end":[{col:["auto",{span:["full",_o,Oe]},Oe]}],"col-start":[{"col-start":H()}],"col-end":[{"col-end":H()}],"grid-rows":[{"grid-rows":[Io]}],"row-start-end":[{row:["auto",{span:[_o,Oe]},Oe]}],"row-start":[{"row-start":H()}],"row-end":[{"row-end":H()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",Oe]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",Oe]}],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",Oe,t]}],"min-w":[{"min-w":[Oe,t,"min","max","fit"]}],"max-w":[{"max-w":[Oe,t,"none","full","min","max","fit","prose",{screen:[cs]},cs]}],h:[{h:[Oe,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[Oe,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[Oe,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[Oe,t,"auto","min","max","fit"]}],"font-size":[{text:["base",cs,ds]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",dp]}],"font-family":[{font:[Io]}],"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",Oe]}],"line-clamp":[{"line-clamp":["none",Nr,dp]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",Cn,Oe]}],"list-image":[{"list-image":["none",Oe]}],"list-style-type":[{list:["none","disc","decimal",Oe]}],"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:[...U(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",Cn,ds]}],"underline-offset":[{"underline-offset":["auto",Cn,Oe]}],"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",Oe]}],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",Oe]}],"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(),kS]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",wS]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},SS]}],"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:[...U(),"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:U()}],"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:["",...U()]}],"outline-offset":[{"outline-offset":[Cn,Oe]}],"outline-w":[{outline:[Cn,ds]}],"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":[Cn,ds]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",cs,CS]}],"shadow-color":[{shadow:[Io]}],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",cs,Oe]}],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",Oe]}],duration:[{duration:K()}],ease:[{ease:["linear","in","out","in-out",Oe]}],delay:[{delay:K()}],animate:[{animate:["none","spin","ping","pulse","bounce",Oe]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[y]}],"scale-x":[{"scale-x":[y]}],"scale-y":[{"scale-y":[y]}],rotate:[{rotate:[_o,Oe]}],"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",Oe]}],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",Oe]}],"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",Oe]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[Cn,ds,dp]}],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 ut(...e){return PS(lb(e))}function Cr(){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 _S=ub("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"}}),Er=N.forwardRef(({className:e,variant:t,size:a,asChild:n=!1,...r},s)=>{const o=n?_1:"button";return $.jsx(o,{className:ut(_S({variant:t,size:a,className:e})),ref:s,...r})});Er.displayName="Button";const Sl=N.forwardRef(({className:e,type:t,...a},n)=>$.jsx("input",{type:t,className:ut("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}));Sl.displayName="Input";const yb=N.forwardRef(({className:e,...t},a)=>$.jsx("textarea",{className:ut("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}));yb.displayName="Textarea";const Cl=N.forwardRef(({className:e,...t},a)=>$.jsx(ZN,{ref:a,className:ut("flex items-center gap-2 text-sm leading-none font-medium select-none",e),...t}));Cl.displayName="Label";const xb=N.forwardRef(({className:e,...t},a)=>$.jsx("div",{ref:a,className:ut("flex flex-col gap-6 rounded-xl border border-border bg-card py-6 text-card-foreground shadow-sm",e),...t}));xb.displayName="Card";const IS=({className:e,...t})=>$.jsx("div",{className:ut("grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6",e),...t}),RS=({className:e,...t})=>$.jsx("div",{className:ut("leading-none font-semibold",e),...t}),AS=({className:e,...t})=>$.jsx("div",{className:ut("px-6",e),...t}),jS=({className:e,...t})=>$.jsx("div",{className:ut("flex items-center px-6 [.border-t]:pt-6",e),...t}),DS=ub("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"}}),OS=({className:e,variant:t,...a})=>$.jsx("div",{className:ut(DS({variant:t}),e),...a}),cp=NN,El=N.forwardRef(({className:e,...t},a)=>$.jsx(CN,{ref:a,className:ut("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}));El.displayName="TabsList";const Ro=N.forwardRef(({className:e,...t},a)=>$.jsx($N,{ref:a,className:ut("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}));Ro.displayName="TabsTrigger";const LS=N.forwardRef(({className:e,...t},a)=>$.jsx(PN,{ref:a,className:ut("mt-3 focus-visible:outline-none",e),...t}));LS.displayName="TabsContent";const MS=({...e})=>$.jsx(Mu,{container:Cr(),...e}),wb=N.forwardRef(({className:e,...t},a)=>$.jsx(Fu,{ref:a,className:ut("fixed inset-0 z-[95] bg-black/50",e),...t}));wb.displayName="DialogOverlay";const zS=N.forwardRef(({className:e,children:t,...a},n)=>$.jsxs(MS,{children:[$.jsx(wb,{}),$.jsxs(Bu,{ref:n,className:ut("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(jv,{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(Sh,{className:"h-4 w-4"}),$.jsx("span",{className:"sr-only",children:"关闭"})]})]})]}));zS.displayName="DialogContent";const FS=N.forwardRef(({className:e,...t},a)=>$.jsx(Uu,{ref:a,className:ut("text-base font-semibold leading-none tracking-tight",e),...t}));FS.displayName="DialogTitle";const BS=N.forwardRef(({className:e,...t},a)=>$.jsx(Av,{ref:a,className:ut("text-sm text-muted-foreground",e),...t}));BS.displayName="DialogDescription";const US=N.forwardRef(({className:e,...t},a)=>$.jsx(ab,{className:ut("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(nb,{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"})}));US.displayName="Switch";const qS=N.forwardRef(({className:e,...t},a)=>$.jsx(WN,{ref:a,className:ut("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(GN,{className:ut("flex items-center justify-center text-current"),children:$.jsx(Nh,{className:"h-3.5 w-3.5"})})}));qS.displayName="Checkbox";const VS="dsh-studio:session",WS="dsh-studio:auth-user",HS="dsh-studio:user";function up(e,t){try{t==null||t===""?window.localStorage.removeItem(e):window.localStorage.setItem(e,t)}catch{}}async function GS(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 KS({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 GS({username:p.trim().normalize("NFKC"),password:v.normalize("NFKC"),mode:c});up(VS,P.token),up(WS,JSON.stringify(P.user??null)),up(HS,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??"工作空间"),D=/LDAP|域|目录|连不上/.test(g),W=$.jsxs(xb,{className:"w-[380px] shrink-0 py-0 shadow-md",children:[$.jsx(IS,{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(RS,{className:"truncate text-[15px] leading-tight",children:I}),$.jsx("div",{className:"text-[11px] leading-tight text-muted-foreground",children:"需求与任务工作空间"})]})]})}),$.jsxs(AS,{className:"px-5 pb-0",children:[$.jsx(cp,{value:c,onValueChange:E,children:$.jsxs(El,{className:"w-full",children:[$.jsx(Ro,{value:"ldap",disabled:!l,className:"flex-1 text-[13px]",children:"LDAP 账号"}),$.jsx(Ro,{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(Cl,{htmlFor:"studio-account",className:"text-[12px] text-muted-foreground",children:c==="local"?"超管账号":"域账号"}),$.jsx(Sl,{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(Cl,{htmlFor:"studio-pass",className:"text-[12px] text-muted-foreground",children:"密码"}),$.jsxs("div",{className:"relative min-w-0",children:[$.jsx(Sl,{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(E1,{size:14}):$.jsx($1,{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})]}),D?$.jsx("div",{className:"text-[11px] leading-relaxed text-muted-foreground",children:"连不上目录服务时,切到「本地超管」用平台账号进来;网络打通后再用域账号。"}):null,$.jsx(Er,{type:"submit",disabled:b,className:"h-9 w-full text-[13px]",children:b?"登录中…":c==="local"?"登录(本地超管)":"登录(LDAP)"})]})]}),$.jsxs(jS,{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(Er,{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:W}):$.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:W})})}var YS=Object.defineProperty,QS=(e,t)=>YS(e,"name",{value:t,configurable:!0}),XS="Toggle",ZS=N.forwardRef(QS(function(t,a){const{pressed:n,defaultPressed:r,onPressedChange:s,...o}=t,[i,l]=Da({prop:n,onChange:s,defaultProp:r??!1,caller:XS});return $.jsx(ze.button,{type:"button","aria-pressed":i,"data-state":i?"on":"off","data-disabled":t.disabled?"":void 0,...o,ref:a,onClick:Re(t.onClick,()=>{t.disabled||l(!i)})})},"Toggle")),JS=Object.defineProperty,us=(e,t)=>JS(e,"name",{value:t,configurable:!0}),$r="ToggleGroup",Ao={Single:"single",Multiple:"multiple"},[kb,e$]=Na($r,[kl]),Nb=kl(),eC=N.forwardRef(us(function(t,a){const{type:n,...r}=t;if(n===Ao.Single){const s=r;return $.jsx(tC,{role:"radiogroup",...s,ref:a})}if(n===Ao.Multiple){const s=r;return $.jsx(aC,{role:"toolbar",...s,ref:a})}throw new Error(`Missing prop \`type\` expected on \`${$r}\``)},"ToggleGroup")),[Sb,Cb]=kb($r),tC=N.forwardRef(us(function(t,a){const{value:n,defaultValue:r,onValueChange:s=us(()=>{},"onValueChange"),...o}=t,[i,l]=Da({prop:n,defaultProp:r??"",onChange:s,caller:$r});return $.jsx(Sb,{scope:t.__scopeToggleGroup,type:Ao.Single,value:N.useMemo(()=>i?[i]:[],[i]),onItemActivate:l,onItemDeactivate:N.useCallback(()=>l(""),[l]),children:$.jsx(Eb,{...o,ref:a})})},"ToggleGroupImplSingle")),aC=N.forwardRef(us(function(t,a){const{value:n,defaultValue:r,onValueChange:s=us(()=>{},"onValueChange"),...o}=t,[i,l]=Da({prop:n,defaultProp:r??[],onChange:s,caller:$r}),c=N.useCallback(p=>l((f=[])=>[...f,p]),[l]),u=N.useCallback(p=>l((f=[])=>f.filter(v=>v!==p)),[l]);return $.jsx(Sb,{scope:t.__scopeToggleGroup,type:Ao.Multiple,value:i,onItemActivate:c,onItemDeactivate:u,children:$.jsx(Eb,{...o,ref:a})})},"ToggleGroupImplMultiple")),[nC,sC]=kb($r),Eb=N.forwardRef(us(function(t,a){const{__scopeToggleGroup:n,disabled:r=!1,rovingFocus:s=!0,orientation:o,dir:i,loop:l=!0,...c}=t,u=Nb(n),p=Po(i),f={dir:p,...c};return $.jsx(nC,{scope:n,rovingFocus:s,disabled:r,children:s?$.jsx(Kv,{asChild:!0,...u,orientation:o,dir:p,loop:l,children:$.jsx(ze.div,{...f,ref:a})}):$.jsx(ze.div,{...f,ref:a})})},"ToggleGroupImpl")),pp="ToggleGroupItem",rC=N.forwardRef(us(function(t,a){const n=Cb(pp,t.__scopeToggleGroup),r=sC(pp,t.__scopeToggleGroup),s=Nb(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(Yv,{asChild:!0,...s,focusable:!i,active:o,ref:c,children:$.jsx($b,{...l,ref:a})}):$.jsx($b,{...l,ref:a})},"ToggleGroupItem")),$b=N.forwardRef(us(function(t,a){const{__scopeToggleGroup:n,value:r,...s}=t,o=Cb(pp,n),i={role:"radio","aria-checked":t.pressed,"aria-pressed":void 0},l=o.type===Ao.Single?i:void 0;return $.jsx(ZS,{...l,...s,ref:a,onPressedChange:c=>{c?o.onItemActivate(r):o.onItemDeactivate(r)}})},"ToggleGroupItemImpl")),oC=Object.defineProperty,iC=(e,t)=>oC(e,"name",{value:t,configurable:!0});function fp(e,[t,a]){return Math.min(a,Math.max(t,e))}iC(fp,"clamp");const lC=["top","right","bottom","left"],ps=Math.min,En=Math.max,$l=Math.round,Tl=Math.floor,$n=e=>({x:e,y:e}),dC={left:"right",right:"left",bottom:"top",top:"bottom"};function Tb(e,t,a){return En(e,ps(t,a))}function Tn(e,t){return typeof e=="function"?e(t):e}function fs(e){return e.split("-")[0]}function Tr(e){return e.split("-")[1]}function mp(e){return e==="x"?"y":"x"}function gp(e){return e==="y"?"height":"width"}function rn(e){const t=e[0];return t==="t"||t==="b"?"y":"x"}function hp(e){return mp(rn(e))}function cC(e,t,a){a===void 0&&(a=!1);const n=Tr(e),r=hp(e),s=gp(r);let o=r==="x"?n===(a?"end":"start")?"right":"left":n==="start"?"bottom":"top";return t.reference[s]>t.floating[s]&&(o=Pl(o)),[o,Pl(o)]}function uC(e){const t=Pl(e);return[vp(e),t,vp(t)]}function vp(e){return e.includes("start")?e.replace("start","end"):e.replace("end","start")}const Pb=["left","right"],_b=["right","left"],pC=["top","bottom"],fC=["bottom","top"];function mC(e,t,a){switch(e){case"top":case"bottom":return a?t?_b:Pb:t?Pb:_b;case"left":case"right":return t?pC:fC;default:return[]}}function gC(e,t,a,n){const r=Tr(e);let s=mC(fs(e),a==="start",n);return r&&(s=s.map(o=>o+"-"+r),t&&(s=s.concat(s.map(vp)))),s}function Pl(e){const t=fs(e);return dC[t]+e.slice(t.length)}function hC(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 Ib(e){return typeof e!="number"?hC(e):{top:e,right:e,bottom:e,left:e}}function _l(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 Rb(e,t,a){let{reference:n,floating:r}=e;const s=rn(t),o=hp(t),i=gp(o),l=fs(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=Tr(t);return x&&(v[o]+=f*(x==="end"?1:-1)*(a&&c?-1:1)),v}async function vC(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}=Tn(t,e),x=Ib(v),k=i[f?p==="floating"?"reference":"floating":p],g=_l(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=_l(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 bC=50,yC=async(e,t,a)=>{const{placement:n="bottom",strategy:r="absolute",middleware:s=[],platform:o}=a,i=o.detectOverflow?o:{...o,detectOverflow:vC},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}=Rb(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<bC&&(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}=Rb(c,f,l)),b=-1)}return{x:u,y:p,placement:f,strategy:r,middlewareData:x}},xC=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}=Tn(e,t)||{};if(c==null)return{};const p=Ib(u),f={x:a,y:n},v=hp(r),x=gp(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,D=ps(p[g],I),W=ps(p[d],I),M=E-b[x]-W,P=E/2-b[x]/2+_,H=Tb(D,P,M),J=!l.arrow&&Tr(r)!=null&&P!==H&&s.reference[x]/2-(P<D?D:W)-b[x]/2<0,U=J?P<D?P-D:P-M:0;return{[v]:f[v]+U,data:{[v]:H,centerOffset:P-H-U,...J&&{alignmentOffset:U}},reset:J}}}),wC=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}=Tn(e,t);if((a=s.arrow)!=null&&a.alignmentOffset)return{};const g=fs(r),d=rn(i),h=fs(i)===i,y=await(l.isRTL==null?void 0:l.isRTL(c.floating)),S=f||(h||!b?[Pl(i)]:uC(i)),C=x!=="none";!f&&C&&S.push(...gC(i,b,x,y));const E=[i,...S],_=await l.detectOverflow(t,k),I=[];let D=((n=s.flip)==null?void 0:n.overflows)||[];if(u&&I.push(_[g]),p){const H=cC(r,o,y);I.push(_[H[0]],_[H[1]])}if(D=[...D,{placement:r,overflows:I}],!I.every(H=>H<=0)){var W,M;const H=(((W=s.flip)==null?void 0:W.index)||0)+1,J=E[H];if(J&&(!(p==="alignment"?d!==rn(J):!1)||D.every(L=>rn(L.placement)===d?L.overflows[0]>0:!0)))return{data:{index:H,overflows:D},reset:{placement:J}};let U=(M=D.filter(F=>F.overflows[0]<=0).sort((F,L)=>F.overflows[1]-L.overflows[1])[0])==null?void 0:M.placement;if(!U)switch(v){case"bestFit":{var P;const F=(P=D.filter(L=>{if(C){const w=rn(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];F&&(U=F);break}case"initialPlacement":U=i;break}if(r!==U)return{reset:{placement:U}}}return{}}}};function Ab(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function jb(e){return lC.some(t=>e[t]>=0)}const kC=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){const{rects:a,platform:n}=t,{strategy:r="referenceHidden",...s}=Tn(e,t);switch(r){case"referenceHidden":{const o=await n.detectOverflow(t,{...s,elementContext:"reference"}),i=Ab(o,a.reference);return{data:{referenceHiddenOffsets:i,referenceHidden:jb(i)}}}case"escaped":{const o=await n.detectOverflow(t,{...s,altBoundary:!0}),i=Ab(o,a.floating);return{data:{escapedOffsets:i,escaped:jb(i)}}}default:return{}}}}},Db=new Set(["left","top"]);async function NC(e,t){const{placement:a,platform:n,elements:r}=e,s=await(n.isRTL==null?void 0:n.isRTL(r.floating)),o=fs(a),i=Tr(a),l=rn(a)==="y",c=Db.has(o)?-1:1,u=s&&l?-1:1,p=Tn(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 SC=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 NC(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}}}}},CC=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}=Tn(e,t),u={x:a,y:n},p=await s.detectOverflow(t,c),f=rn(r),v=mp(f);let x=u[v],b=u[f];const k=(d,h)=>Tb(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}}}}}},EC=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}=Tn(e,t),f={x:r,y:s},v=rn(o),x=mp(v);let b=f[x],k=f[v];const g=Tn(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=Db.has(fs(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}}}},$C=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}=Tn(e,t),l=await r.detectOverflow(t,i),c=fs(a),u=Tr(a),p=rn(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=ps(v-l[x],k),h=ps(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*En(l.left,l.right):C=v-2*En(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 Il(){return typeof window<"u"}function Pr(e){return Ob(e)?(e.nodeName||"").toLowerCase():"#document"}function pa(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function Pn(e){var t;return(t=(Ob(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function Ob(e){return Il()?e instanceof Node||e instanceof pa(e).Node:!1}function on(e){return Il()?e instanceof Element||e instanceof pa(e).Element:!1}function ms(e){return Il()?e instanceof HTMLElement||e instanceof pa(e).HTMLElement:!1}function Lb(e){return!Il()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof pa(e).ShadowRoot}function Rl(e){const{overflow:t,overflowX:a,overflowY:n,display:r}=ln(e);return/auto|scroll|overlay|hidden|clip/.test(t+n+a)&&r!=="inline"&&r!=="contents"}function TC(e){return/^(table|td|th)$/.test(Pr(e))}function Al(e){try{if(e.matches(":popover-open"))return!0}catch{}try{return e.matches(":modal")}catch{return!1}}const PC=/transform|translate|scale|rotate|perspective|filter/,_C=/paint|layout|strict|content/,Rs=e=>!!e&&e!=="none";let bp;function yp(e){const t=on(e)?ln(e):e;return Rs(t.transform)||Rs(t.translate)||Rs(t.scale)||Rs(t.rotate)||Rs(t.perspective)||!xp()&&(Rs(t.backdropFilter)||Rs(t.filter))||PC.test(t.willChange||"")||_C.test(t.contain||"")}function IC(e){let t=As(e);for(;ms(t)&&!jo(t);){if(yp(t))return t;if(Al(t))return null;t=As(t)}return null}function xp(){return bp==null&&(bp=typeof CSS<"u"&&CSS.supports&&CSS.supports("-webkit-backdrop-filter","none")),bp}function jo(e){return/^(html|body|#document)$/.test(Pr(e))}function ln(e){return pa(e).getComputedStyle(e)}function jl(e){return on(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function As(e){if(Pr(e)==="html")return e;const t=e.assignedSlot||e.parentNode||Lb(e)&&e.host||Pn(e);return Lb(t)?t.host:t}function Mb(e){const t=As(e);return jo(t)?(e.ownerDocument||e).body:ms(t)&&Rl(t)?t:Mb(t)}function Do(e,t,a){var n;t===void 0&&(t=[]),a===void 0&&(a=!0);const r=Mb(e),s=r===((n=e.ownerDocument)==null?void 0:n.body),o=pa(r);if(s){const i=wp(o);return t.concat(o,o.visualViewport||[],Rl(r)?r:[],i&&a?Do(i):[])}else return t.concat(r,Do(r,[],a))}function wp(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function zb(e){const t=ln(e);let a=parseFloat(t.width)||0,n=parseFloat(t.height)||0;const r=ms(e),s=r?e.offsetWidth:a,o=r?e.offsetHeight:n,i=$l(a)!==s||$l(n)!==o;return i&&(a=s,n=o),{width:a,height:n,$:i}}function kp(e){return on(e)?e:e.contextElement}function _r(e){const t=kp(e);if(!ms(t))return $n(1);const a=t.getBoundingClientRect(),{width:n,height:r,$:s}=zb(t);let o=(s?$l(a.width):a.width)/n,i=(s?$l(a.height):a.height)/r;return(!o||!Number.isFinite(o))&&(o=1),(!i||!Number.isFinite(i))&&(i=1),{x:o,y:i}}const RC=$n(0);function Fb(e){const t=pa(e);return!xp()||!t.visualViewport?RC:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function AC(e,t,a){return t===void 0&&(t=!1),!!a&&t&&a===pa(e)}function js(e,t,a,n){t===void 0&&(t=!1),a===void 0&&(a=!1);const r=e.getBoundingClientRect(),s=kp(e);let o=$n(1);t&&(n?on(n)&&(o=_r(n)):o=_r(e));const i=AC(s,a,n)?Fb(s):$n(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=pa(s),v=on(n)?pa(n):n;let x=f,b=wp(x);for(;b&&v!==x;){const k=_r(b),g=b.getBoundingClientRect(),d=ln(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=pa(b),b=wp(x)}}return _l({width:u,height:p,x:l,y:c})}function Dl(e,t){const a=jl(e).scrollLeft;return t?t.left+a:js(Pn(e)).left+a}function Bb(e,t){const a=e.getBoundingClientRect(),n=a.left+t.scrollLeft-Dl(e,a),r=a.top+t.scrollTop;return{x:n,y:r}}function jC(e){let{elements:t,rect:a,offsetParent:n,strategy:r}=e;const s=r==="fixed",o=Pn(n),i=t?Al(t.floating):!1;if(n===o||i&&s)return a;let l={scrollLeft:0,scrollTop:0},c=$n(1);const u=$n(0),p=ms(n);if((p||!s)&&((Pr(n)!=="body"||Rl(o))&&(l=jl(n)),p)){const v=js(n);c=_r(n),u.x=v.x+n.clientLeft,u.y=v.y+n.clientTop}const f=o&&!p&&!s?Bb(o,l):$n(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 DC(e){return e.getClientRects?Array.from(e.getClientRects()):[]}function OC(e){const t=jl(e),a=e.ownerDocument.body,n=En(e.scrollWidth,e.clientWidth,a.scrollWidth,a.clientWidth),r=En(e.scrollHeight,e.clientHeight,a.scrollHeight,a.clientHeight);let s=-t.scrollLeft+Dl(e);const o=-t.scrollTop;return ln(a).direction==="rtl"&&(s+=En(e.clientWidth,a.clientWidth)-n),{width:n,height:r,x:s,y:o}}const LC=25;function MC(e,t,a){a===void 0&&(a="viewport");const n=a==="layoutViewport",r=pa(e),s=Pn(e),o=r.visualViewport;let i=s.clientWidth,l=s.clientHeight,c=0,u=0;if(o){const f=!xp()||t==="fixed";n?f||(c=-o.offsetLeft,u=-o.offsetTop):(i=o.width,l=o.height,f&&(c=o.offsetLeft,u=o.offsetTop))}if(Dl(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<=LC&&(i-=g)}return{width:i,height:l,x:c,y:u}}function zC(e,t){const a=js(e,!0,t==="fixed"),n=a.top+e.clientTop,r=a.left+e.clientLeft,s=_r(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 Ub(e,t,a){let n;if(t==="viewport"||t==="layoutViewport")n=MC(e,a,t);else if(t==="document")n=OC(Pn(e));else if(on(t))n=zC(t,a);else{const r=Fb(e);n={x:t.x-r.x,y:t.y-r.y,width:t.width,height:t.height}}return _l(n)}function FC(e,t){const a=t.get(e);if(a)return a;let n=Do(e,[],!1).filter(i=>on(i)&&Pr(i)!=="body"),r=null;const s=ln(e).position==="fixed";let o=s?As(e):e;for(;on(o)&&!jo(o);){const i=ln(o),l=yp(o),c=r?r.position:s?"fixed":"";!l&&(c==="fixed"||c==="absolute"&&i.position==="static")?n=n.filter(p=>p!==o):r=i,o=As(o)}return t.set(e,n),n}function BC(e){let{element:t,boundary:a,rootBoundary:n,strategy:r}=e;const o=[...a==="clippingAncestors"?Al(t)?[]:FC(t,this._c):[].concat(a),n],i=Ub(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=Ub(t,o[f],r);l=En(v.top,l),c=ps(v.right,c),u=ps(v.bottom,u),p=En(v.left,p)}return{width:c-p,height:u-l,x:p,y:l}}function UC(e){const{width:t,height:a}=zb(e);return{width:t,height:a}}function qC(e,t,a){const n=ms(t),r=Pn(t),s=a==="fixed",o=js(e,!0,s,t);let i={scrollLeft:0,scrollTop:0};const l=$n(0);if((n||!s)&&((Pr(t)!=="body"||Rl(r))&&(i=jl(t)),n)){const f=js(t,!0,s,t);l.x=f.x+t.clientLeft,l.y=f.y+t.clientTop}!n&&r&&(l.x=Dl(r));const c=r&&!n&&!s?Bb(r,i):$n(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 Np(e){return ln(e).position==="static"}function qb(e,t){if(!ms(e)||ln(e).position==="fixed")return null;if(t)return t(e);let a=e.offsetParent;return Pn(e)===a&&(a=a.ownerDocument.body),a}function Vb(e,t){const a=pa(e);if(Al(e))return a;if(!ms(e)){let r=As(e);for(;r&&!jo(r);){if(on(r)&&!Np(r))return r;r=As(r)}return a}let n=qb(e,t);for(;n&&TC(n)&&Np(n);)n=qb(n,t);return n&&jo(n)&&Np(n)&&!yp(n)?a:n||IC(e)||a}const VC=async function(e){const t=this.getOffsetParent||Vb,a=this.getDimensions,n=await a(e.floating);return{reference:qC(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,width:n.width,height:n.height}}};function WC(e){return ln(e).direction==="rtl"}const HC={convertOffsetParentRelativeRectToViewportRelativeRect:jC,getDocumentElement:Pn,getClippingRect:BC,getOffsetParent:Vb,getElementRects:VC,getClientRects:DC,getDimensions:UC,getScale:_r,isElement:on,isRTL:WC};function Wb(e,t){return e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function GC(e,t,a){let n=null,r;const s=Pn(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=Tl(x),d=Tl(s.clientWidth-(v+b)),h=Tl(s.clientHeight-(x+k)),y=Tl(v),C={rootMargin:-g+"px "+-d+"px "+-h+"px "+-y+"px",threshold:En(0,ps(1,p))||1};let E=!0;function _(I){const D=I[0].intersectionRatio;if(!Wb(f,e.getBoundingClientRect()))return i();if(D!==p){if(!E)return i();D?i(!1,D):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=pa(e),c=()=>i(a);return l.addEventListener("resize",c),i(!0),()=>{l.removeEventListener("resize",c),o()}}function KC(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=kp(e),u=r||s?[...c?Do(c):[],...t?Do(t):[]]:[];u.forEach(g=>{r&&g.addEventListener("scroll",a),s&&g.addEventListener("resize",a)});const p=c&&i?GC(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?js(e):null;l&&k();function k(){const g=js(e);b&&!Wb(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 YC=SC,QC=CC,XC=wC,ZC=$C,JC=kC,Hb=xC,e2=EC,t2=(e,t,a)=>{const n=new Map,r=a??{},s={...HC,...r.platform,_c:n};return yC(e,t,{...r,platform:s})};var a2=typeof document<"u",n2=function(){},Ol=a2?N.useLayoutEffect:n2;function Ll(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(!Ll(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)&&!Ll(e[s],t[s]))return!1}return!0}return e!==e&&t!==t}function Gb(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function Kb(e,t){const a=Gb(e);return Math.round(t*a)/a}function Sp(e){const t=N.useRef(e);return Ol(()=>{t.current=e}),t}function s2(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);Ll(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,D=Sp(l),W=Sp(r),M=Sp(c),P=N.useCallback(()=>{if(!C.current||!E.current)return;const L={placement:t,strategy:a,middleware:f};W.current&&(L.platform=W.current),t2(C.current,E.current,L).then(w=>{const T={...w,isPositioned:M.current!==!1};H.current&&!Ll(_.current,T)&&(_.current=T,mr.flushSync(()=>{p(T)}))})},[f,t,a,W,M]);Ol(()=>{c===!1&&_.current.isPositioned&&(_.current.isPositioned=!1,p(L=>({...L,isPositioned:!1})))},[c]);const H=N.useRef(!1);Ol(()=>(H.current=!0,()=>{H.current=!1}),[]),Ol(()=>{if(y&&(C.current=y),S&&(E.current=S),y&&S){if(D.current)return D.current(y,S,P);P()}},[y,S,P,D,I]);const J=N.useMemo(()=>({reference:C,floating:E,setReference:d,setFloating:h}),[d,h]),U=N.useMemo(()=>({reference:y,floating:S}),[y,S]),F=N.useMemo(()=>{const L={position:a,left:0,top:0};if(!U.floating)return L;const w=Kb(U.floating,u.x),T=Kb(U.floating,u.y);return i?{...L,transform:"translate("+w+"px, "+T+"px)",...Gb(U.floating)>=1.5&&{willChange:"transform"}}:{position:a,left:w,top:T}},[a,i,U.floating,u.x,u.y]);return N.useMemo(()=>({...u,update:P,refs:J,elements:U,floatingStyles:F}),[u,P,J,U,F])}const r2=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?Hb({element:n.current,padding:r}).fn(a):{}:n?Hb({element:n,padding:r}).fn(a):{}}}},o2=(e,t)=>{const a=YC(e);return{name:a.name,fn:a.fn,options:[e,t]}},i2=(e,t)=>{const a=QC(e);return{name:a.name,fn:a.fn,options:[e,t]}},l2=(e,t)=>({fn:e2(e).fn,options:[e,t]}),d2=(e,t)=>{const a=XC(e);return{name:a.name,fn:a.fn,options:[e,t]}},c2=(e,t)=>{const a=ZC(e);return{name:a.name,fn:a.fn,options:[e,t]}},u2=(e,t)=>{const a=JC(e);return{name:a.name,fn:a.fn,options:[e,t]}},p2=(e,t)=>{const a=r2(e);return{name:a.name,fn:a.fn,options:[e,t]}};var f2=Object.defineProperty,m2=(e,t)=>f2(e,"name",{value:t,configurable:!0}),g2=N.forwardRef(m2(function(t,a){const{children:n,width:r=10,height:s=5,...o}=t;return $.jsx(ze.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")),h2=Object.defineProperty,_n=(e,t)=>h2(e,"name",{value:t,configurable:!0}),Yb={Partial:"partial"},Qb={Optimized:"optimized",Always:"always"},Xb="Popper",[Zb,Ml]=Na(Xb),[v2,Jb]=Zb(Xb),ey=_n(e=>{const{__scopePopper:t,children:a}=e,[n,r]=N.useState(null),[s,o]=N.useState(void 0);return $.jsx(v2,{scope:t,anchor:n,onAnchorChange:r,placementState:s,setPlacementState:o,children:a})},"Popper"),b2="PopperAnchor",ty=N.forwardRef(_n(function(t,a){const{__scopePopper:n,virtualRef:r,...s}=t,o=Jb(b2,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&&zl(o.placementState),v=f?.[0],x=f?.[1];return r?null:$.jsx(ze.div,{"data-radix-popper-side":v,"data-radix-popper-align":x,...s,ref:u})},"PopperAnchor")),ay="PopperContent",[y2,x2]=Zb(ay),ny=N.forwardRef(_n(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=Yb.Partial,hideWhenDetached:v=!1,updatePositionStrategy:x=Qb.Optimized,onPlaced:b,...k}=t,g=Jb(ay,n),[d,h]=N.useState(null),y=Xe(a,h),[S,C]=N.useState(null),E=Nl(S),_=E?.width??0,I=E?.height??0,D=r+(o!=="center"?"-"+o:""),W=typeof p=="number"?p:{top:0,right:0,bottom:0,left:0,...p},M=Array.isArray(u)?u:[u],P=M.length>0,H={padding:W,boundary:M.filter(sy),altBoundary:P},{refs:J,floatingStyles:U,placement:F,isPositioned:L,middlewareData:w}=s2({strategy:"fixed",placement:D,whileElementsMounted:_n((...ae)=>KC(...ae,{animationFrame:x===Qb.Always}),"whileElementsMounted"),elements:{reference:g.anchor},middleware:[o2({mainAxis:s+I,alignmentAxis:i}),c&&i2({mainAxis:!0,crossAxis:!1,...f===Yb.Partial?{limiter:l2()}:{},...H}),c&&d2({...H}),c2({...H,apply:_n(({elements:ae,rects:z,availableWidth:te,availableHeight:xe})=>{const{width:X,height:ie}=z.reference,ge=ae.floating.style;ge.setProperty("--radix-popper-available-width",`${te}px`),ge.setProperty("--radix-popper-available-height",`${xe}px`),ge.setProperty("--radix-popper-anchor-width",`${X}px`),ge.setProperty("--radix-popper-anchor-height",`${ie}px`)},"apply")}),S&&p2({element:S,padding:l}),S2({arrowWidth:_,arrowHeight:I}),v&&u2(P?{strategy:"referenceHidden",...H}:{strategy:"referenceHidden",padding:H.padding,altBoundary:H.altBoundary})]}),T=g.setPlacementState;Nt(()=>(T(F),()=>{T(void 0)}),[F,T]);const[K,R]=zl(F),O=Ga(b);Nt(()=>{L&&O?.()},[L,O]);const G=w.arrow?.x,we=w.arrow?.y,fe=w.arrow?.centerOffset!==0,[ye,He]=N.useState();return Nt(()=>{d&&He(window.getComputedStyle(d).zIndex)},[d]),$.jsx("div",{ref:J.setFloating,"data-radix-popper-content-wrapper":"",style:{...U,transform:L?U.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(y2,{scope:n,placedSide:K,placedAlign:R,onArrowChange:C,arrowX:G,arrowY:we,shouldHideArrow:fe,children:$.jsx(ze.div,{"data-side":K,"data-align":R,...k,ref:y,style:{...k.style,animation:L?k.style?.animation:"none"}})})})},"PopperContent")),w2="PopperArrow",k2={top:"bottom",right:"left",bottom:"top",left:"right"},N2=N.forwardRef(_n(function(t,a){const{__scopePopper:n,...r}=t,s=x2(w2,n),o=k2[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(g2,{...r,ref:a,style:{...r.style,display:"block"}})})},"PopperArrow"));function sy(e){return e!==null}_n(sy,"isNotNull");var S2=_n(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]=zl(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 zl(e){const[t,a="center"]=e.split("-");return[t,a]}_n(zl,"getSideAndAlignFromPlacement");var C2=Object.defineProperty,E2=(e,t)=>C2(e,"name",{value:t,configurable:!0}),ry=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"}),$2=N.forwardRef(E2(function(t,a){return $.jsx(ze.span,{...t,ref:a,style:{...ry,...t.style}})},"VisuallyHidden")),T2=Object.defineProperty,Ze=(e,t)=>T2(e,"name",{value:t,configurable:!0}),oy={ItemAligned:"item-aligned",Popper:"popper"},P2={RTL:"rtl"},_2=[" ","Enter","ArrowUp","ArrowDown"],I2=[" ","Enter"],Ir="Select",[Fl,Cp,R2]=Vu(Ir),[Ds,t$]=Na(Ir,[R2,Ml]),Ep=Ml(),[A2,gs]=Ds(Ir),[j2,D2]=Ds(Ir);function iy(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=Ep(t),[g,d]=N.useState(null),[h,y]=N.useState(null),[S,C]=N.useState(!1),E=Po(c),[_,I]=Da({prop:n,defaultProp:r??!1,onChange:s,caller:Ir}),[D,W]=Da({prop:o,defaultProp:i,onChange:l,caller:Ir}),M=N.useRef(null),P=N.useRef(!1),[H,J]=N.useState(null),U=Ze(fe=>{J({value:fe,hasConsumerStoppedPropagation:P.current}),W(fe)},"handleUserSelect"),F=N.useRef(D);N.useEffect(()=>{const fe=x?g?.ownerDocument.getElementById(x):g?.form;if(fe instanceof HTMLFormElement){const ye=Ze(()=>W(F.current),"reset");return fe.addEventListener("reset",ye),()=>fe.removeEventListener("reset",ye)}},[x,g,W]);const L=g?!!x||!!g.closest("form"):!0,[w,T]=N.useState(new Set),K=wn(),R=Array.from(w).map(fe=>fe.props.value).join(";"),O=N.useCallback(fe=>{T(ye=>new Set(ye).add(fe))},[]),G=N.useCallback(fe=>{T(ye=>{const He=new Set(ye);return He.delete(fe),He})},[]),we={required:v,trigger:g,onTriggerChange:d,valueNode:h,onValueNodeChange:y,valueNodeHasChildren:S,onValueNodeHasChildrenChange:C,contentId:K,value:D,onValueChange:W,hasConsumerStoppedPropagationRef:P,userSelection:H,onUserSelect:U,open:_,onOpenChange:I,dir:E,triggerPointerDownPosRef:M,disabled:f,name:u,autoComplete:p,form:x,nativeOptions:w,nativeSelectKey:R,isFormControl:L};return $.jsx(ey,{...k,children:$.jsx(A2,{scope:t,...we,children:$.jsx(Fl.Provider,{scope:t,children:$.jsx(j2,{scope:t,onNativeOptionAdd:O,onNativeOptionRemove:G,children:py(b)?b(we):a})})})})}Ze(iy,"SelectProvider");var O2=Ze(e=>{const{__scopeSelect:t,children:a,...n}=e;return $.jsx(iy,{__scopeSelect:t,...n,internal_do_not_use_render:({isFormControl:r})=>$.jsxs($.Fragment,{children:[a,r?$.jsx(iE,{__scopeSelect:t}):null]})})},"Select"),L2="SelectTrigger",M2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,disabled:r=!1,...s}=t,o=Ep(n),i=gs(L2,n),l=i.disabled||r,c=Xe(a,i.onTriggerChange),u=Cp(n),p=N.useRef("touch"),[f,v,x]=Tp(k=>{const g=u().filter(y=>!y.disabled),d=g.find(y=>y.value===i.value),h=Pp(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 $.jsx(ty,{asChild:!0,...o,children:$.jsx(ze.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":Oo(i.value)?"":void 0,...s,ref:c,onClick:Re(s.onClick,k=>{k.currentTarget.focus(),p.current!=="mouse"&&b(k)}),onPointerDown:Re(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:Re(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===" ")&&_2.includes(k.key)&&(b(),k.preventDefault())})})})},"SelectTrigger")),z2="SelectValue",F2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,className:r,style:s,children:o,placeholder:i="",...l}=t,c=gs(z2,n),{onValueNodeHasChildrenChange:u}=c,p=o!==void 0,f=Xe(a,c.onValueNodeChange);Nt(()=>{u(p)},[u,p]);const v=Oo(c.value);return $.jsx(ze.span,{...l,asChild:v?!1:l.asChild,ref:f,style:{pointerEvents:"none"},children:$.jsx(N.Fragment,{children:v?i:o},v?"placeholder":"value")})},"SelectValue")),B2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,children:r,...s}=t;return $.jsx(ze.span,{"aria-hidden":!0,...s,ref:a,children:r||"▼"})},"SelectIcon")),U2="SelectPortal",[q2,V2]=Ds(U2,{forceMount:void 0}),W2=Ze(e=>{const{__scopeSelect:t,forceMount:a,...n}=e;return $.jsx(q2,{scope:e.__scopeSelect,forceMount:a,children:$.jsx($u,{asChild:!0,...n})})},"SelectPortal"),Os="SelectContent",H2=N.forwardRef(Ze(function(t,a){const n=V2(Os,t.__scopeSelect),{forceMount:r=n.forceMount,...s}=t,o=gs(Os,t.__scopeSelect),[i,l]=N.useState();return Nt(()=>{l(new DocumentFragment)},[]),$.jsx(is,{present:r||o.open,children:({present:c})=>c?$.jsx(Y2,{...s,ref:a}):$.jsx(G2,{...s,fragment:i})})},"SelectContent")),G2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,children:r,fragment:s}=t;return s?mr.createPortal($.jsx(ly,{scope:n,children:$.jsx(Fl.Slot,{scope:n,children:$.jsx("div",{ref:a,children:r})})}),s):null},"SelectContentFragment")),Ka=10,[ly,Bl]=Ds(Os),K2=xn("SelectContent.RemoveScroll"),Y2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n}=t,{position:r=oy.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=gs(Os,n),[y,S]=N.useState(null),[C,E]=N.useState(null),_=Xe(a,S),[I,D]=N.useState(null),[W,M]=N.useState(null),P=Cp(n),[H,J]=N.useState(!1),U=N.useRef(!1),F=N.useRef(!1),L=N.useRef(!1);N.useEffect(()=>{if(y)return $v(y)},[y]),cl();const w=N.useCallback(z=>{const[te,...xe]=P().map(ge=>ge.ref.current),[X]=xe.slice(-1),ie=document.activeElement;for(const ge of z)if(ge===ie||(ge?.scrollIntoView({block:"nearest"}),ge===te&&C&&(C.scrollTop=0),ge===X&&C&&(C.scrollTop=C.scrollHeight),ge?.focus(),document.activeElement!==ie))return},[P,C]),T=N.useCallback(()=>w([I,y]),[w,I,y]);N.useEffect(()=>{H&&T()},[H,T]);const{onOpenChange:K,triggerPointerDownPosRef:R}=h;N.useEffect(()=>{if(y){let z={x:0,y:0};const te=Ze(X=>{z={x:Math.abs(Math.round(X.pageX)-(R.current?.x??0)),y:Math.abs(Math.round(X.pageY)-(R.current?.y??0))}},"handlePointerMove"),xe=Ze(X=>{z.x<=10&&z.y<=10?X.preventDefault():X.composedPath().includes(y)||K(!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,K,R]),N.useEffect(()=>{const z=Ze(()=>K(!1),"close");return window.addEventListener("blur",z),window.addEventListener("resize",z),()=>{window.removeEventListener("blur",z),window.removeEventListener("resize",z)}},[K]);const[O,G]=Tp(z=>{const te=P().filter(ie=>!ie.disabled),xe=te.find(ie=>ie.ref.current===document.activeElement),X=Pp(te,z,xe);X&&setTimeout(()=>X.ref.current?.focus())}),we=N.useCallback((z,te,xe)=>{const X=!F.current;X&&(F.current=!0);const ie=!U.current&&!xe;h.value!==void 0&&h.value===te||ie?(D(z),ie&&(U.current=!0)):X&&D(z)},[h.value]),fe=N.useCallback(()=>y?.focus(),[y]),ye=N.useCallback((z,te,xe)=>{if(!z)return;const X=!L.current;X&&(L.current=!0);const ie=!U.current&&!xe;(h.value!==void 0&&h.value===te||ie||X)&&M(z)},[h.value]),He=r===oy.Popper?dy:Q2,ae=He===dy?{side:l,sideOffset:c,align:u,alignOffset:p,arrowPadding:f,collisionBoundary:v,collisionPadding:x,sticky:b,hideWhenDetached:k,avoidCollisions:g}:{};return $.jsx(ly,{scope:n,content:y,viewport:C,onViewportChange:E,itemRefCallback:we,selectedItem:I,onItemLeave:fe,itemTextRefCallback:ye,focusSelectedItem:T,selectedItemText:W,position:r,isPositioned:H,searchRef:O,children:$.jsx(Du,{as:K2,allowPinchZoom:!0,children:$.jsx(Zh,{asChild:!0,trapped:h.open,onMountAutoFocus:z=>{z.preventDefault()},onUnmountAutoFocus:Re(s,z=>{h.trigger?.focus({preventScroll:!0}),z.preventDefault()}),children:$.jsx(yu,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:o,onPointerDownOutside:i,onFocusOutside:z=>z.preventDefault(),onDismiss:()=>h.onOpenChange(!1),children:$.jsx(He,{role:"listbox",id:h.contentId,"data-state":h.open?"open":"closed",dir:h.dir,onContextMenu:z=>z.preventDefault(),...d,...ae,onPlaced:()=>J(!0),ref:_,style:{display:"flex",flexDirection:"column",outline:"none",...d.style},onKeyDown:Re(d.onKeyDown,z=>{const te=z.ctrlKey||z.altKey||z.metaKey;if(z.key==="Tab"&&z.preventDefault(),!te&&z.key.length===1&&G(z.key),["ArrowUp","ArrowDown","Home","End"].includes(z.key)){let X=P().filter(ie=>!ie.disabled).map(ie=>ie.ref.current);if(["ArrowUp","End"].includes(z.key)&&(X=X.slice().reverse()),["ArrowUp","ArrowDown"].includes(z.key)){const ie=z.target,ge=X.indexOf(ie);X=X.slice(ge+1)}setTimeout(()=>w(X)),z.preventDefault()}})})})})})})},"SelectContentImpl")),Q2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,onPlaced:r,...s}=t,o=gs(Os,n),i=Bl(Os,n),[l,c]=N.useState(null),[u,p]=N.useState(null),f=Xe(a,p),v=Cp(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(),D=o.valueNode.getBoundingClientRect(),W=d.getBoundingClientRect();if(o.dir!==P2.RTL){const xe=W.left-I.left,X=D.left-xe,ie=_.left-X,ge=_.width+ie,V=Math.max(ge,I.width),Ee=window.innerWidth-Ka,ke=fp(X,[Ka,Math.max(Ka,Ee-V)]);l.style.minWidth=ge+"px",l.style.left=ke+"px"}else{const xe=I.right-W.right,X=window.innerWidth-D.right-xe,ie=window.innerWidth-_.right-X,ge=_.width+ie,V=Math.max(ge,I.width),Ee=window.innerWidth-Ka,ke=fp(X,[Ka,Math.max(Ka,Ee-V)]);l.style.minWidth=ge+"px",l.style.right=ke+"px"}const M=v(),P=window.innerHeight-Ka*2,H=k.scrollHeight,J=window.getComputedStyle(u),U=parseInt(J.borderTopWidth,10),F=parseInt(J.paddingTop,10),L=parseInt(J.borderBottomWidth,10),w=parseInt(J.paddingBottom,10),T=U+F+H+w+L,K=Math.min(g.offsetHeight*5,T),R=window.getComputedStyle(k),O=parseInt(R.paddingTop,10),G=parseInt(R.paddingBottom,10),we=_.top+_.height/2-Ka,fe=P-we,ye=g.offsetHeight/2,He=g.offsetTop+ye,ae=U+F+He,z=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,ie=Math.max(fe,ye+(xe?G:0)+X+L),ge=ae+ie;l.style.height=ge+"px"}else{const xe=M.length>0&&g===M[0].ref.current;l.style.top="0px";const ie=Math.max(we,U+k.offsetTop+(xe?O:0)+ye)+z;l.style.height=ie+"px",k.scrollTop=ae-we+k.offsetTop}l.style.margin=`${Ka}px 0`,l.style.minHeight=K+"px",l.style.maxHeight=P+"px",r?.(),requestAnimationFrame(()=>x.current=!0)}},[v,o.trigger,o.valueNode,l,u,k,g,d,o.dir,r]);Nt(()=>y(),[y]);const[S,C]=N.useState();Nt(()=>{u&&C(window.getComputedStyle(u).zIndex)},[u]);const E=N.useCallback(_=>{_&&b.current===!0&&(y(),h?.(),b.current=!1)},[y,h]);return $.jsx(X2,{scope:n,contentWrapper:l,shouldExpandOnScrollRef:x,onScrollButtonChange:E,children:$.jsx("div",{ref:c,style:{display:"flex",flexDirection:"column",position:"fixed",zIndex:S},children:$.jsx(ze.div,{...s,ref:f,style:{boxSizing:"border-box",maxHeight:"100%",...s.style}})})})},"SelectItemAlignedPosition")),dy=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,align:r="start",collisionPadding:s=Ka,...o}=t,i=Ep(n);return $.jsx(ny,{...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")),[X2,Z2]=Ds(Os,{}),cy="SelectViewport",J2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,nonce:r,...s}=t,o=Bl(cy,n),i=Z2(cy,n),l=Xe(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(Fl.Slot,{scope:n,children:$.jsx(ze.div,{"data-radix-select-viewport":"",role:"presentation",...s,ref:l,style:{position:"relative",flex:1,overflow:"hidden auto",...s.style},onScroll:Re(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-Ka*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")),eE="SelectGroup",[a$,n$]=Ds(eE),$p="SelectItem",[tE,uy]=Ds($p),aE=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,value:r,disabled:s=!1,textValue:o,...i}=t,l=gs($p,n),c=Bl($p,n),u=l.value===r,[p,f]=N.useState(o??""),[v,x]=N.useState(!1),b=Ga(y=>c.itemRefCallback?.(y,r,s)),k=Xe(a,b),g=wn(),d=N.useRef("touch");function h(y){l.hasConsumerStoppedPropagationRef.current=y.isPropagationStopped(),l.onUserSelect(r),l.onOpenChange(!1)}return Ze(h,"handleSelect"),$.jsx(tE,{scope:n,value:r,disabled:s,textId:g,isSelected:u,onItemTextChange:N.useCallback(y=>{f(S=>S||(y?.textContent??"").trim())},[]),children:$.jsx(Fl.ItemSlot,{scope:n,value:r,disabled:s,textValue:p,children:$.jsx(ze.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:Re(i.onFocus,()=>x(!0)),onBlur:Re(i.onBlur,()=>x(!1)),onClick:Re(i.onClick,y=>{s||d.current!=="mouse"&&h(y)}),onPointerUp:Re(i.onPointerUp,y=>{s||d.current==="mouse"&&h(y)}),onPointerDown:Re(i.onPointerDown,y=>{d.current=y.pointerType}),onPointerMove:Re(i.onPointerMove,y=>{d.current=y.pointerType,s?c.onItemLeave?.():d.current==="mouse"&&y.currentTarget.focus({preventScroll:!0})}),onPointerLeave:Re(i.onPointerLeave,y=>{y.currentTarget===document.activeElement&&c.onItemLeave?.()}),onKeyDown:Re(i.onKeyDown,y=>{s||y.target!==y.currentTarget||c.searchRef?.current!==""&&y.key===" "||(I2.includes(y.key)&&h(y),y.key===" "&&y.preventDefault())})})})})},"SelectItem")),Ul="SelectItemText",nE=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,className:r,style:s,...o}=t,i=gs(Ul,n),l=Bl(Ul,n),c=uy(Ul,n),u=D2(Ul,n),[p,f]=N.useState(null),v=Ga(h=>l.itemTextRefCallback?.(h,c.value,c.disabled)),x=Xe(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 Nt(()=>(g(k),()=>d(k)),[g,d,k]),$.jsxs($.Fragment,{children:[$.jsx(ze.span,{id:c.textId,...o,ref:x}),c.isSelected&&i.valueNode&&!i.valueNodeHasChildren&&!Oo(i.value)?mr.createPortal(o.children,i.valueNode):null]})},"SelectItemText")),sE="SelectItemIndicator",rE=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,...r}=t;return uy(sE,n).isSelected?$.jsx(ze.span,{"aria-hidden":!0,...r,ref:a}):null},"SelectItemIndicator")),oE="SelectBubbleInput",iE=N.forwardRef(Ze(function({__scopeSelect:t,...a},n){const r=gs(oE,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,I=Object.getOwnPropertyDescriptor(E,"value").set,D=f!==null&&f!==h.current;h.current=f;const W=d.current!==g;d.current=g;const M=D&&W;if(D&&!W&&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(W&&I){const H=new Event("change",{bubbles:P});I.call(C,g),C.dispatchEvent(H)}},[g,f]),$.jsxs(ze.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:{...ry,...a.style},ref:k,defaultValue:g,children:[Oo(s)&&!S?$.jsx("option",{value:""}):null,Array.from(v)]},x)},"SelectBubbleInput"));function py(e){return typeof e=="function"}Ze(py,"isFunction");function Oo(e){return e===""||e===void 0}Ze(Oo,"shouldShowPlaceholder");function Tp(e){const t=Ga(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(Tp,"useTypeaheadSearch");function Pp(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=fy(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(Pp,"findNextItem");function fy(e,t){return e.map((a,n)=>e[(t+n)%e.length])}Ze(fy,"wrapArray");var lE=Object.defineProperty,Pt=(e,t)=>lE(e,"name",{value:t,configurable:!0}),[_p,s$]=Na("Tooltip",[Ml]),ql=Ml(),dE="TooltipProvider",cE=700,Ip="tooltip.open",[uE,Rp]=_p(dE),pE=Pt(e=>{const{__scopeTooltip:t,delayDuration:a=cE,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(uE,{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"),Ap="Tooltip",[fE,Lo]=_p(Ap),my=Pt(e=>{const{__scopeTooltip:t,children:a,open:n,defaultOpen:r,onOpenChange:s,disableHoverableContent:o,delayDuration:i}=e,l=Rp(Ap,e.__scopeTooltip),c=ql(t),[u,p]=N.useState(null),[f,v]=N.useState(void 0),x=wn(),b=N.useRef(0),k=o??l.disableHoverableContent,g=i??l.delayDuration,d=N.useRef(!1),[h,y]=Da({prop:n,defaultProp:r??!1,onChange:Pt(D=>{D?(l.onOpen(),document.dispatchEvent(new CustomEvent(Ip))):l.onClose(),s?.(D)},"onChange"),caller:Ap}),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(ey,{...c,children:$.jsx(fE,{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"),gy="TooltipTrigger",hy=N.forwardRef(Pt(function(t,a){const{__scopeTooltip:n,"aria-describedby":r,...s}=t,o=Lo(gy,n),i=Rp(gy,n),l=ql(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]),$.jsx(ty,{asChild:!0,...l,children:$.jsx(ze.button,{"aria-describedby":o.open?$y(r,o.contentId):r,"data-state":o.stateAttribute,...s,ref:u,onPointerMove:Re(t.onPointerMove,x=>{x.pointerType!=="touch"&&!f.current&&!i.isPointerInTransitRef.current&&(o.onTriggerEnter(),f.current=!0)}),onPointerLeave:Re(t.onPointerLeave,()=>{o.onTriggerLeave(),f.current=!1}),onPointerDown:Re(t.onPointerDown,()=>{o.open&&o.onClose(),p.current=!0,document.addEventListener("pointerup",v,{once:!0})}),onFocus:Re(t.onFocus,()=>{p.current||o.onOpen()}),onBlur:Re(t.onBlur,o.onClose),onClick:Re(t.onClick,o.onClose)})})},"TooltipTrigger")),vy="TooltipPortal",[mE,gE]=_p(vy,{forceMount:void 0}),by=Pt(e=>{const{__scopeTooltip:t,forceMount:a,children:n,container:r}=e,s=Lo(vy,t);return $.jsx(mE,{scope:t,forceMount:a,children:$.jsx(is,{present:a||s.open,children:$.jsx($u,{asChild:!0,container:r,children:n})})})},"TooltipPortal"),Mo="TooltipContent",yy=N.forwardRef(Pt(function(t,a){const n=gE(Mo,t.__scopeTooltip),{forceMount:r=n.forceMount,side:s="top",...o}=t,i=Lo(Mo,t.__scopeTooltip);return $.jsx(is,{present:r||i.open,children:i.disableHoverableContent?$.jsx(xy,{side:s,...o,ref:a}):$.jsx(hE,{side:s,...o,ref:a})})},"TooltipContent")),hE=N.forwardRef(Pt(function(t,a){const n=Lo(Mo,t.__scopeTooltip),r=Rp(Mo,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=wy(d,g.getBoundingClientRect()),y=ky(d,h),S=Ny(k.getBoundingClientRect()),C=Cy([...y,...S]);l(C),f(!0)},[f]);return N.useEffect(()=>()=>v(),[v]),N.useEffect(()=>{if(c&&p){const b=Pt(g=>x(g,p),"handleTriggerLeave"),k=Pt(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=Pt(k=>{const g=k.target,d={x:k.clientX,y:k.clientY},h=c?.contains(g)||p?.contains(g),y=!Sy(d,i);h?v():y&&(v(),u())},"handleTrackPointerGrace");return document.addEventListener("pointermove",b),()=>document.removeEventListener("pointermove",b)}},[c,p,i,u,v]),$.jsx(xy,{...t,ref:o})},"TooltipContentHoverable")),vE=$h("TooltipContent"),xy=N.forwardRef(Pt(function(t,a){const{__scopeTooltip:n,children:r,"aria-label":s,id:o,onEscapeKeyDown:i,onPointerDownOutside:l,...c}=t,u=Lo(Mo,n),p=ql(n),{onClose:f}=u,[v,x]=N.useState(null),b=Xe(a,x);av(v),N.useEffect(()=>(document.addEventListener(Ip,f),()=>document.removeEventListener(Ip,f)),[f]),N.useEffect(()=>{if(u.trigger){const g=Pt(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 Nt(()=>(k(o),()=>{k(void 0)}),[o,k]),$.jsx(yu,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:i,onPointerDownOutside:l,onFocusOutside:g=>g.preventDefault(),onDismiss:f,children:$.jsxs(ny,{"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(vE,{children:r}),s?$.jsx($2,{id:u.contentId,role:"tooltip",children:s}):null]})})},"TooltipContentImpl")),bE=N.forwardRef(Pt(function(t,a){const{__scopeTooltip:n,...r}=t,s=ql(n);return $.jsx(N2,{...s,...r,ref:a})},"TooltipArrow"));function wy(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")}}Pt(wy,"getExitSideFromRect");function ky(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}Pt(ky,"getPaddedExitPoints");function Ny(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}]}Pt(Ny,"getPointsFromRect");function Sy(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}Pt(Sy,"isPointInPolygon");function Cy(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),Ey(t)}Pt(Cy,"getHull");function Ey(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)}Pt(Ey,"getHullPresorted");function $y(...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}Pt($y,"concatAriaDescribedby");var yE=Object.defineProperty,In=(e,t)=>yE(e,"name",{value:t,configurable:!0}),Ty="Progress",jp=100,[xE,r$]=Na(Ty),[wE,kE]=xE(Ty),NE=N.forwardRef(In(function(t,a){const{__scopeProgress:n,value:r=null,max:s,getValueLabel:o=Py,...i}=t;(s||s===0)&&!Op(s)&&console.error(_y(`${s}`,"Progress"));const l=Op(s)?s:jp;r!==null&&!Lp(r,l)&&console.error(Iy(`${r}`,"Progress"));const c=Lp(r,l)?r:null,u=zo(c)?o(c,l):void 0;return $.jsx(wE,{scope:n,value:c,max:l,children:$.jsx(ze.div,{"aria-valuemax":l,"aria-valuemin":0,"aria-valuenow":zo(c)?c:void 0,"aria-valuetext":u,role:"progressbar","data-state":Dp(c,l),"data-value":c??void 0,"data-max":l,...i,ref:a})})},"Progress")),SE="ProgressIndicator",CE=N.forwardRef(In(function(t,a){const{__scopeProgress:n,...r}=t,s=kE(SE,n);return $.jsx(ze.div,{"data-state":Dp(s.value,s.max),"data-value":s.value??void 0,"data-max":s.max,...r,ref:a})},"ProgressIndicator"));function Py(e,t){return`${Math.round(e/t*100)}%`}In(Py,"defaultGetValueLabel");function Dp(e,t){return e==null?"indeterminate":e===t?"complete":"loading"}In(Dp,"getProgressState");function zo(e){return typeof e=="number"}In(zo,"isNumber");function Op(e){return zo(e)&&!isNaN(e)&&e>0}In(Op,"isValidMaxNumber");function Lp(e,t){return zo(e)&&!isNaN(e)&&e<=t&&e>=0}In(Lp,"isValidValueNumber");function _y(e,t){return`Invalid prop \`max\` of value \`${e}\` supplied to \`${t}\`. Only numbers greater than 0 are valid max values. Defaulting to \`${jp}\`.`}In(_y,"getInvalidMaxError");function Iy(e,t){return`Invalid prop \`value\` of value \`${e}\` supplied to \`${t}\`. The \`value\` prop must be:
|
|
949
949
|
- a positive number
|
|
950
|
-
- less than the value passed to \`max\` (or ${
|
|
950
|
+
- less than the value passed to \`max\` (or ${jp} if no \`max\` prop is set)
|
|
951
951
|
- \`null\` or \`undefined\` if the progress is indeterminate.
|
|
952
952
|
|
|
953
|
-
Defaulting to \`null\`.`}
|
|
953
|
+
Defaulting to \`null\`.`}In(Iy,"getInvalidValueError");const Ry=pE;function EE({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(Pv,{open:!0,onOpenChange:s=>{s||a()},children:$.jsxs(Mu,{container:Cr(),children:[$.jsx(Fu,{className:"fixed inset-0 z-[95] bg-black/45 backdrop-blur-[1px] data-[state=open]:animate-in data-[state=open]:fade-in-0"}),$.jsxs(Bu,{"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(Uu,{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(jv,{asChild:!0,children:$.jsxs(Er,{variant:"ghost",size:"sm",className:"h-7 shrink-0 px-2 text-[12px]",children:[$.jsx(Sh,{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 $E({label:e,children:t}){return e==null||e===""?t:$.jsx(Ry,{delayDuration:260,children:$.jsxs(my,{children:[$.jsx(hy,{asChild:!0,children:t}),$.jsx(by,{container:Cr(),children:$.jsx(yy,{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 TE({items:e,value:t,onChange:a,className:n}){return $.jsx(cp,{value:t,onValueChange:a,className:ut("min-w-0",n),children:$.jsx(El,{children:e.map(r=>$.jsx($E,{label:r.hint,children:$.jsxs(Ro,{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 PE({value:e,onChange:t,options:a,className:n}){return $.jsx(eC,{type:"single",value:e,onValueChange:r=>r&&t(r),className:ut("inline-flex items-center gap-0.5 rounded-lg border border-border bg-muted p-0.5",n),children:a.map(r=>$.jsx(rC,{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 _E({value:e,onChange:t,options:a,placeholder:n="请选择",id:r,disabled:s,className:o,style:i}){return $.jsxs(O2,{value:e===""||e===void 0?void 0:String(e),onValueChange:t,disabled:s,children:[$.jsxs(M2,{id:r,style:i,className:ut("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(F2,{placeholder:n}),$.jsx(B2,{asChild:!0,children:$.jsx(C1,{className:"h-3.5 w-3.5 opacity-60"})})]}),$.jsx(W2,{container:Cr(),children:$.jsx(H2,{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(J2,{className:"p-1",children:a.map(l=>$.jsxs(aE,{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(rE,{className:"absolute left-1.5 flex items-center",children:$.jsx(Nh,{className:"h-3.5 w-3.5"})}),$.jsx(nE,{children:l.label})]},String(l.value)))})})})]})}function IE({checked:e,onChange:t,label:a,hint:n,disabled:r,bare:s=!1}){const o=$.jsx(ab,{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(nb,{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 RE({label:e,children:t}){return e?$.jsx(Ry,{delayDuration:250,children:$.jsxs(my,{children:[$.jsx(hy,{asChild:!0,children:t}),$.jsx(by,{container:Cr(),children:$.jsxs(yy,{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(bE,{className:"fill-primary"})]})})]})}):t}function AE({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(NE,{className:ut("relative h-2 w-full overflow-hidden rounded-full bg-muted",a),value:n,children:$.jsx(CE,{className:"h-full w-full transition-transform "+r,style:{transform:`translateX(-${100-n}%)`}})})}function jE({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(Pv,{open:e===!0,onOpenChange:f=>{f||p()},children:$.jsxs(Mu,{container:Cr(),children:[$.jsx(Fu,{className:"fixed inset-0 z-[95] bg-black/55 backdrop-blur-[2px]"}),$.jsxs(Bu,{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(Uu,{className:"text-[13px] font-semibold leading-snug",children:t}),a?$.jsx(Av,{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(Er,{variant:"outline",size:"sm",onClick:p,children:s}),$.jsx(Er,{variant:n?"destructive":"default",size:"sm",onClick:u,children:r})]})]})]})})}const Ay="dsh-studio-tw";function DE(){if(typeof document>"u"||document.getElementById(Ay))return;const e=document.createElement("style");e.id=Ay,e.textContent=ex,(document.body??document.head).appendChild(e)}window.__ModuleLoader__.load({id:"dsh-studio",factory(e){DE();const t=e("react"),a=dw(Fn,N.createElement),n={SegGroup:PE,Tabs:cp,TabsList:El,TabsTrigger:Ro,SheetDrawer:EE,TabsBar:TE,SelectBox:_E,SwitchBox:IE,Tip:RE,ProgressBar:AE,DialogBox:jE,Badge:OS,Input:Sl,Textarea:yb,Label:Cl};typeof a.useUIKit=="function"&&a.useUIKit(n);const r=g1(a,t,{pageProps:{loginGate:KS,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}}})})();
|