@marsken/dsh-studio 0.1.20 → 0.1.22
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 +10 -2
- package/README.md +2 -2
- package/client.js +46 -46
- package/dist/client.js +46 -46
- package/docs/compatibility.md +1 -1
- package/docs/publish.md +2 -0
- package/index.js +3 -2
- package/package.json +1 -1
- package/src/host/bugs.js +20 -0
- package/src/host/executor.js +34 -0
package/dist/client.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var Oy=
|
|
1
|
+
var Oy=Vt=>{throw TypeError(Vt)};var Ly=(Vt,la,ha)=>la.has(Vt)||Oy("Cannot "+ha);var Qt=(Vt,la,ha)=>(Ly(Vt,la,"read from private field"),ha?ha.call(Vt):la.get(Vt)),My=(Vt,la,ha)=>la.has(Vt)?Oy("Cannot add the same private member more than once"):la instanceof WeakSet?la.add(Vt):la.set(Vt,ha),zp=(Vt,la,ha,ze)=>(Ly(Vt,la,"write to private field"),ze?ze.call(Vt,ha):la.set(Vt,ha),ha);(function(){"use strict";var Ct,Ea;function Vt(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 la(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var ha={exports:{}},ze={};/**
|
|
2
2
|
* @license React
|
|
3
3
|
* react.production.min.js
|
|
4
4
|
*
|
|
@@ -6,32 +6,32 @@ var Oy=qt=>{throw TypeError(qt)};var Ly=(qt,oa,ga)=>oa.has(qt)||Oy("Cannot "+ga)
|
|
|
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 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,`
|
|
9
|
+
*/var Ar=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 Ms(e,t,a){this.props=e,this.context=t,this.refs=qp,this.updater=a||Bp}Ms.prototype.isReactComponent={},Ms.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")},Ms.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Vp(){}Vp.prototype=Ms.prototype;function Wl(e,t,a){this.props=e,this.context=t,this.refs=qp,this.updater=a||Bp}var Hl=Wl.prototype=new Vp;Hl.constructor=Wl,Up(Hl,Ms.prototype),Hl.isPureReactComponent=!0;var Wp=Array.isArray,Hp=Object.prototype.hasOwnProperty,Gl={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:Ar,type:e,key:s,ref:o,props:r,_owner:Gl.current}}function Qy(e,t){return{$$typeof:Ar,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}function Kl(e){return typeof e=="object"&&e!==null&&e.$$typeof===Ar}function Xy(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(a){return t[a]})}var Yp=/\/+/g;function Yl(e,t){return typeof e=="object"&&e!==null&&e.key!=null?Xy(""+e.key):t.toString(36)}function qo(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 Ar:case zy:o=!0}}if(o)return o=e,r=r(o),e=n===""?"."+Yl(o,0):n,Wp(r)?(a="",e!=null&&(a=e.replace(Yp,"$&/")+"/"),qo(r,t,a,"",function(c){return c})):r!=null&&(Kl(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+Yl(s,i);o+=qo(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+Yl(s,i++),o+=qo(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 Vo(e,t,a){if(e==null)return e;var n=[],r=0;return qo(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 aa={current:null},Wo={transition:null},Jy={ReactCurrentDispatcher:aa,ReactCurrentBatchConfig:Wo,ReactCurrentOwner:Gl};function Qp(){throw Error("act(...) is not supported in production builds of React.")}ze.Children={map:Vo,forEach:function(e,t,a){Vo(e,function(){t.apply(this,arguments)},a)},count:function(e){var t=0;return Vo(e,function(){t++}),t},toArray:function(e){return Vo(e,function(t){return t})||[]},only:function(e){if(!Kl(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},ze.Component=Ms,ze.Fragment=Fy,ze.Profiler=Uy,ze.PureComponent=Wl,ze.StrictMode=By,ze.Suspense=Hy,ze.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Jy,ze.act=Qp,ze.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=Gl.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:Ar,type:e.type,key:r,ref:s,props:n,_owner:o}},ze.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},ze.createElement=Kp,ze.createFactory=function(e){var t=Kp.bind(null,e);return t.type=e,t},ze.createRef=function(){return{current:null}},ze.forwardRef=function(e){return{$$typeof:Wy,render:e}},ze.isValidElement=Kl,ze.lazy=function(e){return{$$typeof:Ky,_payload:{_status:-1,_result:e},_init:Zy}},ze.memo=function(e,t){return{$$typeof:Gy,type:e,compare:t===void 0?null:t}},ze.startTransition=function(e){var t=Wo.transition;Wo.transition={};try{e()}finally{Wo.transition=t}},ze.unstable_act=Qp,ze.useCallback=function(e,t){return aa.current.useCallback(e,t)},ze.useContext=function(e){return aa.current.useContext(e)},ze.useDebugValue=function(){},ze.useDeferredValue=function(e){return aa.current.useDeferredValue(e)},ze.useEffect=function(e,t){return aa.current.useEffect(e,t)},ze.useId=function(){return aa.current.useId()},ze.useImperativeHandle=function(e,t,a){return aa.current.useImperativeHandle(e,t,a)},ze.useInsertionEffect=function(e,t){return aa.current.useInsertionEffect(e,t)},ze.useLayoutEffect=function(e,t){return aa.current.useLayoutEffect(e,t)},ze.useMemo=function(e,t){return aa.current.useMemo(e,t)},ze.useReducer=function(e,t,a){return aa.current.useReducer(e,t,a)},ze.useRef=function(e){return aa.current.useRef(e)},ze.useState=function(e){return aa.current.useState(e)},ze.useSyncExternalStore=function(e,t,a){return aa.current.useSyncExternalStore(e,t,a)},ze.useTransition=function(){return aa.current.useTransition()},ze.version="18.3.1",ha.exports=ze;var N=ha.exports;const Fn=Vt({__proto__:null,default:la(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((b,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 w=/^\s*\d+[.)]\s+(.*)$/;if(w.test(u)){const k=[];for(;o<r.length&&w.test(r[o]);)k.push(e("li",{key:o},t(w.exec(r[o])[1],`${i(p)}n${o}`))),o+=1;s.push(e("ol",{key:i(p)},k));continue}const y=[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;y.push(k),o+=1}s.push(e("p",{key:i(p)},t(y.join(`
|
|
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,w=String(c??"").split(/\s+/).filter(y=>y!==""&&y!=="ds-input").join(" ");return e(p,{...v,style:f,className:`h-9 w-full min-w-0 text-sm${w===""?"":" "+w}`})}function r({className:c,...u}){const p=t("Textarea");if(p===null)return e("textarea",{className:c,...u});const{style:f,...v}=u,w=Number(v.rows)>0?Number(v.rows):4,y=String(c??"").split(/\s+/).filter(k=>k!==""&&k!=="ds-input"&&k!=="ds-textarea").join(" ");return e(p,{...v,style:{minHeight:`${Math.max(96,w*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${y===""?"":" "+y}`})}function s({className:c,variant:u,...p}){const f=t("Badge");if(f===null)return e("span",{className:c,...p});const v=String(c??""),w=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:w,className:c})}function o({className:c,checked:u,onChange:p,disabled:f,...v}){const w=t("SwitchBox");return w===null?e("input",{className:c,type:"checkbox",checked:u===!0,disabled:f,onChange:p,...v}):e(w,{bare:!0,checked:u===!0,disabled:f===!0,onChange:y=>{typeof p=="function"&&p({target:{checked:y===!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,...w}){const y=t("SelectBox");if(y===null)return e("select",{className:c,value:p,onChange:f,disabled:v,...w},u);const k=i(u),g=k.some(b=>b.value===""),d=k.map(b=>g&&b.value===""?{...b,value:"__empty__"}:b);d.length===0&&d.push({value:g?"__empty__":"",label:"—"});const h=p==null?"":String(p);return e(y,{...w,value:g&&h===""?"__empty__":h,options:d,disabled:v,onChange:b=>{typeof f=="function"&&f({target:{value:b==="__empty__"?"":b}})}})}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),w=(f?.services??[]).find(S=>S.id===n.service),y=(o??[]).find(S=>S.id===n.requirementId),k=ed(n),g=Jl(n),d=(n.artifacts??[]).length,h=Dr(n).length,b=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,y!==void 0?e(t,{className:"ds-chip","data-req":"1",title:`需求 ${y.code||y.id}|${y.title}${i===void 0?"":"(点一下只看这条需求)"}`,onClick:S=>{i!==void 0&&(S.stopPropagation(),i(y.id))}},`📄 ${y.code||y.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,w!==void 0?e(t,{className:"ds-chip","data-svc":"1",title:`服务 ${w.name}${w.repoPath?`|${w.repoPath}`:""}(worktree 从这里切)`},`📦 ${w.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":b?"1":"0",style:b?{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),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:w,MdField:y,MentionPicker:k}){function g({task:d,state:h,onClose:b,onChanged:S}){const[C,E]=t.useState(!1),[_,I]=t.useState(null),[
|
|
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(D){I(D instanceof Error?D.message:String(D))}finally{E(!1)}}},dn=async(m,D)=>{E(!0),I(null),$(null);try{const re=await a("/task/case",{id:d.id,action:"update",caseId:m.id,result:D}),$e=re?.bug??null;if(D==="fail"&&$e!==null){const Ie=String($e.code??"")!==""?$e.code:$e.id;$(`用例判失败,已自动登记缺陷 ${Ie}(挂在同一条需求下,父任务指向本卡)。`)}else re?.error&&$(`用例已更新,但自动建缺陷失败:${re.error}`);await S()}catch(re){I(re instanceof Error?re.message:String(re))}finally{E(!1)}},Ln=async m=>{W({busy:!0,note:""}),I(null);try{const D=await a("/task/case/run",{id:d.id,caseId:m,by:"我在界面里跑的"}),re=D?.run??{},$e=(D?.bugs??[]).filter(ea=>ea.created===!0).length,Ie=[`跑了 ${re.total??0} 条:通过 ${re.passed??0},不通过 ${re.failed??0}`];$e>0&&Ie.push(`自动开缺陷 ${$e} 张`),W({busy:!1,note:Ie.join(",")}),await S()}catch(D){W({busy:!1,note:D instanceof Error?D.message:String(D)})}},j=async()=>{ke({busy:!0,note:""}),I(null);try{const m=await a("/task/cases/generate",{id:d.id}),D=m?.added>0?`已生成 ${m.added} 条用例,这张卡现在共 ${m.total} 条`:`没生成用例:${m?.reason??"没有可用的验收条件"}`;ke({busy:!1,note:D}),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(D){I(D instanceof Error?D.message:String(D))}finally{E(!1)}},Fe=async m=>{E(!0),I(null),$(null);try{await a("/task/case",{id:d.id,action:"update",caseId:m.id,flaky:m.flaky!==!0}),$(m.flaky===!0?"已取消不稳定标记":"已标记为不稳定用例:以后失败不会自动开缺陷"),await S()}catch(D){I(D instanceof Error?D.message:String(D))}finally{E(!1)}},kt=async()=>{const m=K.title.trim();if(m!==""){E(!0),I(null),$(null);try{const D=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:""}),$("已登记,正在归档到飞书云盘…"),await S();try{const $e=((await a("/task/artifact/sync",{id:d.id}))?.written??[])[0];$($e?.doc?.url?`已归档到飞书云盘:${$e.doc.url}`:"归档失败,稍后可点「同步到云盘」重试。"),await S()}catch{$("登记成功,但归档失败:可点「同步到云盘」重试。")}}catch(D){I(D instanceof Error?D.message:String(D))}finally{E(!1)}}},ma=async m=>{if(O!==null){E(!0),I(null),$(null);try{const D=O.content;await a("/task/artifact",{id:d.id,action:"update",artifactId:m.id,artifact:{content:D}}),G(null),He(re=>({...re,[m.id]:D})),await S();try{const $e=((await a("/task/artifact/sync",{id:d.id,artifactId:m.id}))?.written??[])[0]?.doc;$($e?.url?`正文已更新并同步:${$e.url}`:"正文已保存,归档失败可再点「更新」。"),await S()}catch{$("正文已保存,归档失败可再点「更新」。")}}catch(D){I(D instanceof Error?D.message:String(D))}finally{E(!1)}}},et=async m=>{E(!0),I(null),$(null);try{const D=await a("/task/artifact/sync",{id:d.id,artifactId:m.id}),re=(D?.written??[])[0]?.doc,$e=(D?.errors??[])[0];$(re?.url?`已归档:${re.url}`:`归档失败:${$e?.error??"未知原因"}`),await S()}catch(D){I(D instanceof Error?D.message:String(D))}finally{E(!1)}},De=async()=>{E(!0),I(null),$(null);try{const m=await a("/task/artifact/sync",{id:d.id}),D=(m?.written??[]).length,re=(m?.errors??[]).length;$(`已归档 ${D} 件${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,D)=>{E(!0),I(null);try{await a("/task/artifact",{id:d.id,action:"update",artifactId:m.id,artifact:{status:D}}),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(D){I(D instanceof Error?D.message:String(D))}finally{E(!1)}},zn=()=>Ve({agent:U?.agent??"",model:U?.model??"",branch:U?.branch??"",context:U?.context??"",total:String(U?.unitTests?.total??0),passed:String(U?.unitTests?.passed??0)}),Mp=async m=>{if(!(m==="remove"&&!await l("回收 worktree 会删掉这个目录和分支,未合并的改动会丢,确定?",{title:"回收 worktree",danger:!0,okText:"回收"}))){E(!0),I(null),Ue("");try{const D=await a("/task/worktree",{id:d.id,action:m});m==="list"?Ue(String(D.output??"").replace(/\s+/g," ").slice(0,400)||"(没有 worktree)"):D.ok===!0?Ue(m==="create"?"已建好 worktree":"已回收"):Ue(D.skipped||D.result?.error||"没成功"),m!=="list"&&await S()}catch(D){Ue(D instanceof Error?D.message:String(D))}finally{E(!1)}}},OE=async()=>{if(Ae===null)return;const m=Math.max(0,Number(Ae.total)||0),D=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:D}}}),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(D){I(D instanceof Error?D.message:String(D))}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}),D=m.report??{};D.skipped!==void 0?Gt({busy:!1,line:String(D.skipped),ok:!1}):Gt({busy:!1,line:String(m.line??""),ok:D.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 D=await c("状态:pending 待评审 / changes_requested 要改 / approved 通过",{title:"设计评审",defaultValue:d.design?.status??"pending"});if(D===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),$(null);try{const Ie={link:m,status:D,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});$("设计已保存:"+String(Kt?.design?.status??D)),await S()}catch(Ie){I(Ie instanceof Error?Ie.message:String(Ie))}finally{E(!1)}}},FE=async()=>{E(!0),I(null),$(null);try{const D=(await a("/coding/gitlab",{id:d.id}))?.facts??null;$(D===null?"核对完成,但没有拿到结果":`GitLab 核对:文件 ${D.files.declared}→${D.files.actual} · 提交 ${D.commits.declared}→${D.commits.actual}${D.pipeline?` · 流水线 ${D.pipeline}`:""}${(D.mismatches??[]).length>0?` · ⚠ ${D.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&&b()}},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:b},"关闭"),(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:Rt.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"},Rt.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:q,"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(w,{className:"ds-select",style:{height:20,fontSize:11,padding:"0 4px"},value:d.severity||"p2",title:"严重级别",onChange:m=>void At({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&&At({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,D=m.findIndex(at=>at.id===d.status),re=m[D+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)>D),ea=$e.filter(at=>m.findIndex(Kt=>Kt.id===at.id)<D);return[re===null?null:e("button",{key:"next",className:"ds-btn ds-btn-primary",disabled:C,title:"推进到下一列,下一列的 AI 会接手",onClick:()=>void At({status:re.id,role:re.role})},`推进到「${re.label}」`),$e.length===0?null:e(w,{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&&At({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 V()},"⛔ 标记阻塞"))):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(w,{className:"ds-select",style:{width:190},value:B,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||B==="",onClick:()=>void ce("assign",B)},"改派给他"),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(w,{className:"ds-select",value:B,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 wt()},"马上处理"),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=>xt({...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(y,{className:"ds-textarea",rows:String(Be.requirement??"").trim()===""?4:8,value:Be.requirement,placeholder:"这张卡要解决什么、背景是什么、做到什么算完成——AI 接手前最好写清楚。",onChange:m=>xt({...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 D=m.points??[];return D.length===0?e("div",{className:"ds-hint"},`需求 ${m.code||m.id} 还没拆功能点,去需求页「功能点与可追溯矩阵」加几条。`):e(w,{className:"ds-select",value:Be.pointId??"",onChange:re=>xt({...Be,pointId:re.target.value})},e("option",{value:""},"不归到具体功能点"),D.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=>xt({...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=>xt({...Be,gitlabMR:m.target.value})}))),e("div",{className:"ds-row"},e("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void At((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(w,{className:"ds-select",value:L.project,onChange:m=>A({...L,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(w,{className:"ds-select",value:L.iteration,onChange:m=>A({...L,iteration:m.target.value})},e("option",{value:""},"不指定迭代"),((h.config?.projects??[]).find(m=>m.id===L.project)?.iterations??[]).map(m=>e("option",{key:m.id,value:m.id},m.name))))),((h.config?.projects??[]).find(m=>m.id===L.project)?.services??[]).length===0?null:e("div",{className:"ds-field"},e("div",{className:"ds-label"},"服务(决定用哪个 git 路径切 worktree)"),e(w,{className:"ds-select",value:L.service??"",onChange:m=>A({...L,service:m.target.value})},e("option",{value:""},"用项目级默认目录"),((h.config?.projects??[]).find(m=>m.id===L.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:L.owner,placeholder:"提需求的人,例如 张伟",onChange:m=>A({...L,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:L.due,onChange:m=>A({...L,due:m.target.value})}))),e("div",{className:"ds-row"},e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"所属版本"),e(w,{className:"ds-select",value:L.releaseId,onChange:m=>A({...L,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 vt()},"保存计划"),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"},U===null?"改代码要留记录:谁、什么模型、改了什么":"研发 agent 登记,人也可以补录或评审")),e("div",{className:"ds-sec-body"},U===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":U.review.status},ix[U.review.status]??U.review.status),e("div",{className:"ds-grow"},e("div",{className:"ds-code-line"},[U.agent||"未登记 agent",U.model,U.branch].filter(Boolean).join(" · ")),U.context===""?null:e("div",{className:"ds-hint"},U.context)),e("span",{className:"ds-hint"},U.unitTests.total>0?`单测 ${U.unitTests.passed}/${U.unitTests.total}`:"无单测"),he===null?null:o("拿 worktree 里的 git 记录,比执行记录里自报的提交 / 文件 / 分支",e("button",{className:"ds-btn ds-btn-ghost",disabled:C||It.busy,onClick:()=>void ME()},It.busy?"核对中…":It.line===""?"核对代码事实":"再核对一次")),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"拉 MR 的改动与流水线,和自报的文件数/提交数比一遍",onClick:()=>void FE()},"从 GitLab 核对")),It.line===""?U.verified===null||U.verified===void 0?null:e("div",{className:"ds-hint","data-verify":U.verified.ok?"ok":"bad",style:{marginTop:6}},`${U.verified.ok?"✅":"⚠"} 上次核对 ${Ke(U.verified.at)}:分支 ${U.verified.branch} · 提交 ${U.verified.commitCount.actual} 个 · 改动 ${U.verified.fileCount.actual} 个文件${U.verified.missingCommits.length+U.verified.missingFiles.length===0?"":` · ${U.verified.missingCommits.length+U.verified.missingFiles.length} 项对不上`}`):e("div",{className:"ds-hint","data-verify":It.ok===!0?"ok":"bad",style:{marginTop:6}},`${It.ok===!0?"✅":"⚠"} ${It.line}`),U.gitlab===null||U.gitlab===void 0?null:e("div",{className:"ds-hint","data-gitlab-facts":U.gitlab.state},"上次 GitLab 核对 "+Ke(U.gitlab.at)+":文件 "+U.gitlab.files.declared+"→"+U.gitlab.files.actual+" · 提交 "+U.gitlab.commits.declared+"→"+U.gitlab.commits.actual+(U.gitlab.pipeline===null?"":" · 流水线 "+U.gitlab.pipeline)+((U.gitlab.mismatches??[]).length===0?" · 一致":" · "+U.gitlab.mismatches.join(";"))),(U.commits??[]).length===0?null:e("div",{className:"ds-code-list"},U.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} 文件`))),U.commits.length>6?e("div",{className:"ds-hint"},`还有 ${U.commits.length-6} 次提交`):null),(U.files??[]).length===0?null:e("div",{className:"ds-code-files"},U.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}`:""}`)),U.files.length>12?e("span",{className:"ds-hint"},`还有 ${U.files.length-12} 个`):null),U.review.note===""?null:e("div",{className:"ds-code-note"},`评审意见:${U.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")},"要求修改"),U.mergedAt>0?e("span",{className:"ds-hint"},`已合并 · ${U.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},U===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"},Et.total===0?"这张卡还没有清单":`${ve} / ${Et.total} 已勾`)),e("div",{className:"ds-sec-body"},Et.total===0?null:e("div",{className:"ds-check-progress"},e("div",{className:"ds-check-bar","data-full":ve===Et.total?"1":"0"},e("span",{style:{width:`${Et.total===0?0:Math.round(ve/Et.total*100)}%`}}))),te===null&&Et.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:x,placeholder:"再加一条验收条目,回车提交",onChange:m=>P(m.target.value),onKeyDown:m=>{m.key==="Enter"&&$a()}}),e("button",{className:"ds-btn",disabled:C||x.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(w,{className:"ds-select",style:{width:92,height:22,fontSize:11},value:m.status,disabled:C,onChange:D=>void Ye(m,D.target.value)},nx.map(D=>e("option",{key:D,value:D},ox[D]))),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(y,{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(w,{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(y,{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 kt()},"登记并归档")))),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 j()},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(w,{className:"ds-select",style:{width:84,height:22,fontSize:11},value:m.result,disabled:C,onChange:D=>void dn(m,D.target.value)},Zp.map(D=>e("option",{key:D,value:D},Ql[D]))),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(D=>`${D.ok?"✅":"❌"} ${D.method} ${D.url}${D.status===0?"":` → ${D.status}`}`).join(";")}`),(m.http?.steps??[]).length===0?null:e(f,{className:"ds-chip ds-chip-soft"},`多步 ${m.http.steps.length}`),((h.requirements??[]).find(D=>D.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(w,{className:"ds-select",style:{width:190,height:26},value:m.pointId??"",onChange:async D=>{try{await a("/task/case",{id:d.id,action:"update",caseId:m.id,pointId:D.target.value}),await S()}catch(re){I(re instanceof Error?re.message:String(re))}}},e("option",{value:""},"不归功能点"),((h.requirements??[]).find(D=>D.id===d.requirementId)?.points??[]).map(D=>e("option",{key:D.id,value:D.id},`${D.id} ${D.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(w,{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(w,{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. 打开积分抵扣页
|
|
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 en(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 Fa={product:"产品",architect:"架构",dev:"研发",qa:"测试"},zs={urgent:"紧急",normal:"普通",relaxed:"宽松"},Ho={requirement:"需求",bug:"缺陷",design:"设计",dev:"开发",test:"测试",ops:"运维"},Ql={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"],Xl={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:"要求修改"},Zl={active:"进行中",paused:"暂停",archived:"已归档"},Jl={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"],jr={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 Dr(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`🎯 ${Fa[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?Fa[t.id]??String(t.id??""):`${a.emoji} ${a.name}`}function Fs(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:"角色 · "+(Fa[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} · ${Fa[a.role]??a.role}`:Fa[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 Go(e,t){const a=String(t??"").trim().toLowerCase();return a===""?e:e.filter(n=>`${n.name} ${n.hint}`.toLowerCase().includes(a))}function Ko(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=Fs(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=>Fs(t,o)).join("、")}(${s})`,expert:void 0}}if(r!==void 0&&r.kind!=="none"){const s=Fs(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 ed(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 td(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 ad(e){return typeof e?.commentCount=="number"?e.commentCount:Array.isArray(e?.comments)?e.comments.length:0}function Or(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,w=String(c??"").split(/\s+/).filter(y=>y!==""&&y!=="ds-input").join(" ");return e(p,{...v,style:f,className:`h-9 w-full min-w-0 text-sm${w===""?"":" "+w}`})}function r({className:c,...u}){const p=t("Textarea");if(p===null)return e("textarea",{className:c,...u});const{style:f,...v}=u,w=Number(v.rows)>0?Number(v.rows):4,y=String(c??"").split(/\s+/).filter(k=>k!==""&&k!=="ds-input"&&k!=="ds-textarea").join(" ");return e(p,{...v,style:{minHeight:`${Math.max(96,w*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${y===""?"":" "+y}`})}function s({className:c,variant:u,...p}){const f=t("Badge");if(f===null)return e("span",{className:c,...p});const v=String(c??""),w=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:w,className:c})}function o({className:c,checked:u,onChange:p,disabled:f,...v}){const w=t("SwitchBox");return w===null?e("input",{className:c,type:"checkbox",checked:u===!0,disabled:f,onChange:p,...v}):e(w,{bare:!0,checked:u===!0,disabled:f===!0,onChange:y=>{typeof p=="function"&&p({target:{checked:y===!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,...w}){const y=t("SelectBox");if(y===null)return e("select",{className:c,value:p,onChange:f,disabled:v,...w},u);const k=i(u),g=k.some(b=>b.value===""),d=k.map(b=>g&&b.value===""?{...b,value:"__empty__"}:b);d.length===0&&d.push({value:g?"__empty__":"",label:"—"});const h=p==null?"":String(p);return e(y,{...w,value:g&&h===""?"__empty__":h,options:d,disabled:v,onChange:b=>{typeof f=="function"&&f({target:{value:b==="__empty__"?"":b}})}})}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=Ko(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),w=(f?.services??[]).find(S=>S.id===n.service),y=(o??[]).find(S=>S.id===n.requirementId),k=td(n),g=ed(n),d=(n.artifacts??[]).length,h=Or(n).length,b=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:zs[n.priority]}),n.code?e(t,{className:"ds-chip ds-chip-code",title:"需求下的编号"},n.code):null,y!==void 0?e(t,{className:"ds-chip","data-req":"1",title:`需求 ${y.code||y.id}|${y.title}${i===void 0?"":"(点一下只看这条需求)"}`,onClick:S=>{i!==void 0&&(S.stopPropagation(),i(y.id))}},`📄 ${y.code||y.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,w!==void 0?e(t,{className:"ds-chip","data-svc":"1",title:`服务 ${w.name}${w.repoPath?`|${w.repoPath}`:""}(worktree 从这里切)`},`📦 ${w.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":b?"1":"0",style:b?{color:"#e5484d",fontWeight:600}:null},`· ${en(n.dueAt)}${b?" 逾期":""}`):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,ad(n)>0?e("span",{},`· ${ad(n)} 评论`):null,e("span",{style:{marginLeft:"auto"}},Ke(n.updatedAt))))}return a}const Lr=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??[],[w,y]=t.useState(""),[k,g]=t.useState(""),[d,h]=t.useState(""),[b,S]=t.useState(""),[C,E]=t.useState(""),[_,I]=t.useState(""),[F,W]=t.useState(""),[L,$]=t.useState(!1),[B,ee]=t.useState(!1),[M,O]=t.useState(!1),[A,x]=t.useState({}),P=f.projects??[],G=P.find(R=>R.id===b),te=t.useMemo(()=>{const R=w.trim().toLowerCase(),ne=new Map;for(const Z of l.statuses)ne.set(Z.id,[]);for(const Z of l.tasks)B&&(Z.blocked??null)===null||M&&Or(Z).length===0||d!==""&&(Z.type??"requirement")!==d||b!==""&&Z.project!==b||C!==""&&Z.iteration!==C||_!==""&&(Z.service??"")!==_||F!==""&&(Z.requirementId??"")!==F||k!==""&&Z.expert!==k&&Z.dispatch?.expert!==k||R!==""&&!`${Z.title} ${Z.requirement} ${Z.domain} ${Z.id}`.toLowerCase().includes(R)||(ne.has(Z.status)||ne.set(Z.status,[]),ne.get(Z.status).push(Z));const we={urgent:0,normal:1,relaxed:2};for(const Z of ne.values())Z.sort((le,he)=>(we[le.priority]??1)-(we[he.priority]??1)||he.updatedAt-le.updatedAt);return ne},[l,w,k,d,b,C,_,F,B,M]),q=[...te.values()].reduce((R,ne)=>R+ne.length,0),K=[...te.values()].reduce((R,ne)=>R+ne.filter(we=>we.type==="bug").length,0),ke=l.tasks.filter(R=>R.design!==null&&R.design!==void 0&&R.design.status!=="approved").length,pe=l.tasks.filter(R=>(R.blocked??null)!==null).length,xe=l.tasks.filter(R=>Or(R).length>0).length,Y=l.statuses.filter(R=>!L||(te.get(R.id)??[]).length>0),H=w!==""||k!==""||d!==""||B||M||b!==""||C!==""||_!==""||F!=="";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:w,placeholder:"搜标题 / 需求 / 领域 / 编号",onChange:R=>y(R.target.value)})),P.length>0?e(r,{className:"ds-select",style:{width:150,fontSize:12},value:b,onChange:R=>{S(R.target.value),E(""),I("")}},e("option",{value:""},`全部项目(${P.filter(R=>R.status!=="archived").length})`),P.map(R=>e("option",{key:R.id,value:R.id},`${R.key?`${R.key} · `:""}${R.name}`))):null,G!==void 0&&(G.iterations??[]).length>0?e(r,{className:"ds-select",style:{width:132,fontSize:12},value:C,onChange:R=>E(R.target.value)},e("option",{value:""},"全部迭代"),G.iterations.map(R=>e("option",{key:R.id,value:R.id},R.name))):null,G!==void 0&&(G.services??[]).length>0?e(r,{className:"ds-select",style:{width:150,fontSize:12},value:_,onChange:R=>I(R.target.value)},e("option",{value:""},`全部服务(${(G.services??[]).length})`),G.services.map(R=>e("option",{key:R.id,value:R.id},R.name||R.id))):null,(l.requirements??[]).length>0?e(r,{className:"ds-select",style:{width:190,fontSize:12},value:F,title:"只看某条需求下的卡(需求是整条链路的锚点)",onChange:R=>W(R.target.value)},e("option",{value:""},`全部需求(${(l.requirements??[]).length})`),(l.requirements??[]).map(R=>e("option",{key:R.id,value:R.id},`${R.code||R.id} ${R.title}`))):null,e(r,{className:"ds-select",style:{width:108,fontSize:12},value:d,onChange:R=>h(R.target.value)},e("option",{value:""},"全部类型"),["requirement","bug","design","dev","test","ops"].map(R=>e("option",{key:R,value:R},Ho[R]??R))),e(r,{className:"ds-select",style:{width:158,fontSize:12},value:k,onChange:R=>g(R.target.value)},e("option",{value:""},"全部专家"),v.filter(R=>R.enabled!==!1).map(R=>e("option",{key:R.id,value:R.id},`${R.emoji} ${R.name}`))),e("label",{className:"ds-row",style:{gap:5,fontSize:12,cursor:"pointer",opacity:.8}},e(s,{checked:L,onChange:R=>$(R.target.checked)}),e("span",{},"隐藏空列")),pe>0?e("label",{className:"ds-row",style:{gap:5,fontSize:12,cursor:"pointer",color:"#c0392b"},title:"只看被标记为阻塞的卡(它们停在原列,等人决定怎么继续)"},e(s,{checked:B,onChange:R=>ee(R.target.checked)}),e("span",{},`只看阻塞 ${pe}`)):null,xe>0?e("label",{className:"ds-row",style:{gap:5,fontSize:12,cursor:"pointer",color:"#e5484d"},title:"只看有交付物但没写正文的卡(云盘文档里只有标题,等于没交付)"},e(s,{checked:M,onChange:R=>O(R.target.checked)}),e("span",{},`只看缺正文 ${xe}`)):null,H?e("button",{className:"ds-btn",style:{padding:"4px 10px"},onClick:()=>{y(""),g(""),h(""),ee(!1),O(!1),S(""),E(""),I(""),W("")}},"清除筛选"):null,e("span",{className:"ds-stat",style:{marginLeft:"auto"}},`${q} 张卡 · ${ke>0?`${ke} 个设计待评审 · `:""}${K>0?`${K} 个缺陷`:`${Y.length} 列`}`)),e("div",{className:"ds-board",tabIndex:0,"aria-label":"看板列,左右滚动或用方向键"},Y.map(R=>{const ne=te.get(R.id)??[],we=Fs(f,f.columns?.[R.id]);return e("div",{className:"ds-col",key:R.id,"data-col":R.id,"data-role":R.role,onDragOver:Z=>{Z.preventDefault(),Z.dataTransfer!==null&&(Z.dataTransfer.dropEffect="move"),Z.currentTarget.setAttribute("data-drag-over","1")},onDragLeave:Z=>Z.currentTarget.removeAttribute("data-drag-over"),onDrop:Z=>{Z.preventDefault(),Z.currentTarget.removeAttribute("data-drag-over");const le=Z.dataTransfer===null?"":Z.dataTransfer.getData("text/plain");if(le===""||le===void 0)return;const he=Number(f.columns?.[R.id]?.wip)||0,V=(te.get(R.id)??[]).length;if(he>0&&V>=he){o(`「${R.label}」已到 WIP 上限 ${he},先把列里的卡往前推`,"error");return}u(le,R.id)}},e("div",{className:"ds-col-head"},e("div",{className:"ds-col-title"},e("span",{className:"ds-col-name"},R.label),(()=>{const Z=Number(f.columns?.[R.id]?.wip)||0,le=Z>0&&ne.length>Z;return e("span",{className:"ds-count","data-zero":ne.length===0?"1":"0","data-over":le?"1":"0",onClick:he=>{he.stopPropagation(),typeof p=="function"&&p(R.id,Z)},title:Z>0?`WIP 上限 ${Z} 张,当前 ${ne.length} 张${le?"(已超出,先消化再加)":""}`:"这一列没有设 WIP 上限"},Z>0?`${ne.length}/${Z}`:String(ne.length))})()),e("div",{className:"ds-col-owner","data-empty":we.length===0?"1":"0",title:"这一列的默认负责人:卡推进到本列后由它接手"},e("span",{className:"ds-col-owner-label"},"负责人"),we.length===0?e("span",{className:"ds-col-owner-name"},"未配置"):e("span",{className:"ds-col-owner-name"},we))),e("div",{className:"ds-col-body"},ne.length===0?e("div",{className:"ds-empty"},w!==""||k!==""?"没有匹配的卡":"暂无任务"):ne.slice(0,A[R.id]??Lr).map(Z=>e(a,{key:Z.id,task:Z,onOpen:c,config:f,requirements:l.requirements??[],onPickRequirement:le=>W(he=>he===le?"":le),onPickProject:le=>{S(he=>he===le?"":le),E("")}})),ne.length>(A[R.id]??Lr)?e("button",{className:"ds-btn ds-btn-ghost",style:{width:"100%",marginTop:6,fontSize:12},onClick:()=>x(Z=>({...Z,[R.id]:(Z[R.id]??Lr)+Lr}))},`显示更多(还有 ${ne.length-(A[R.id]??Lr)} 张)`):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=Go(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,w)=>[w===0||u[w-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":w===s?"1":"0",onMouseEnter:()=>i(w),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:w,MdField:y,MentionPicker:k}){function g({task:d,state:h,onClose:b,onChanged:S}){const[C,E]=t.useState(!1),[_,I]=t.useState(null),[F,W]=t.useState(""),[L,$]=t.useState(null),[B,ee]=t.useState(""),M=t.useRef(null);t.useEffect(()=>{const m=D=>{D.key==="Escape"&&b()};return window.addEventListener("keydown",m),()=>window.removeEventListener("keydown",m)},[b]);const[O,A]=t.useState({project:d.project??"",iteration:d.iteration??"",service:d.service??"",owner:d.owner??"",due:nf(d.dueAt),releaseId:d.releaseId??""}),[x,P]=t.useState(""),[G,te]=t.useState({kind:"doc",title:"",ref:"",content:""}),[q,K]=t.useState(null),[ke,pe]=t.useState(null),[xe,Y]=t.useState({}),[H,R]=t.useState(null),[ne,we]=t.useState(null);t.useEffect(()=>{Y({}),pe(null),K(null)},[d.id]);const[Z,le]=t.useState({title:"",expected:"",steps:"",stepsText:"",type:"functional",priority:"p2",preconditions:""}),[he,V]=t.useState({busy:!1,note:""}),[$e,Ne]=t.useState({busy:!1,note:""}),[je,We]=t.useState(null),[Qa,jn]=t.useState(""),U=d.coding??null,ve=d.worktree??null,[De,qe]=t.useState(""),[It,Kt]=t.useState({busy:!1,line:"",ok:null}),st=ed(d),Et=td(d),pt=ne!==null&&Array.isArray(ne.cases)?ne.cases:Array.isArray(d.cases)?d.cases:[],[$a,hs]=t.useState(null),[Q,se]=t.useState(""),ae=st.pass,ye=st.fail,re=Math.max(0,st.total-ae-ye),ce=st.total===0?"":`${st.total} 条 · ✅ 通过 ${ae} · ❌ 不通过 ${ye}${re>0?` · ⬜ 没跑 ${re}`:""}`,X=ne!==null&&Array.isArray(ne.checklist)?ne.checklist:Array.isArray(d.checklist)?d.checklist:[],be=Et.done,Ee=d.artifacts??[],Ce=m=>xe[m.id]!==void 0?xe[m.id]:String(m.content??""),_e=m=>typeof m.contentLength=="number"?m.contentLength>0:String(m.content??"").trim()!=="",dt=async m=>{const D=xe[m.id];if(D!==void 0)return D;const oe=await a("/task/artifact",{id:d.id,action:"get",artifactId:m.id}),Te=String(oe?.artifact?.content??"");return Y(Re=>({...Re,[m.id]:Te})),Te},rt=async m=>{if(ke===m.id){pe(null);return}if(pe(m.id),xe[m.id]===void 0)try{await dt(m)}catch(D){I(D instanceof Error?D.message:String(D)),pe(null)}},Je=async m=>{if(q!==null&&q.id===m.id){K(null);return}try{K({id:m.id,content:await dt(m)})}catch(D){I(D instanceof Error?D.message:String(D))}},He=ad(d);H??(Array.isArray(d.comments)&&d.comments),t.useEffect(()=>{if(He===0){R([]);return}let m=!0;return a("/task/comments",{id:d.id}).then(D=>{m&&R(Array.isArray(D?.comments)?D.comments:[])}).catch(()=>{m&&R([])}),()=>{m=!1}},[d.id,He]),t.useEffect(()=>{if(st.total===0&&Et.total===0){we({cases:[],checklist:[]});return}let m=!0;return a("/task/parts",{id:d.id}).then(D=>{m&&we({cases:Array.isArray(D?.cases)?D.cases:[],checklist:Array.isArray(D?.checklist)?D.checklist:[]})}).catch(()=>{m&&we({cases:[],checklist:[]})}),()=>{m=!1}},[d.id,st.total,st.pass,st.fail,Et.total,Et.done]);const[et,Ge]=t.useState("overview");t.useEffect(()=>{Ge("overview")},[d.id]),t.useEffect(()=>{const m=M.current;m!==null&&(m.scrollTop=0)},[et,d.id]);const Pe=m=>et===m?void 0:{display:"none"},Rt=[{id:"overview",label:"概览",hint:"标题、状态、负责人、阻塞原因与关键时间"},{id:"content",label:"内容",hint:"需求正文与验收标准,支持 Markdown"},{id:"plan",label:"计划",hint:"项目、迭代、服务、挂哪条需求、优先级"},{id:"deliver",label:"交付物",count:Ee.length>0?Ee.length:"",hint:"文档 / MR / 用例 / 报告;空的交付物会被准出拦下"},{id:"test",label:"测试",count:st.total>0?`${ae}/${st.total}`:Et.total>0?`☑${be}/${Et.total}`:"",hint:"验收清单、用例执行记录;失败的用例会自动开缺陷"},{id:"coding",label:"执行记录",count:U===null?"":U.review?.status==="approved"?"✓ 已评审":"",hint:"AI 的分支、提交、改动文件;可以「核对代码事实」"},{id:"discuss",label:"讨论",count:He>0?He:"",hint:"评论;在评论里 @ 专家或专家团即派单"}],[Ue,xt]=t.useState({title:d.title,requirement:d.requirement,gitlabIssue:d.gitlabIssue,gitlabMR:d.gitlabMR?.url??"",pointId:d.pointId??""}),At=async m=>{E(!0),I(null);try{await a("/task/update",{id:d.id,patch:m}),await S()}catch(D){I(D instanceof Error?D.message:String(D))}finally{E(!1)}},Ut=async()=>{E(!0),I(null),$(null);try{await a("/task/agent/retry",{id:d.id,by:r()}),$("已清掉失败计数,下一轮派单会重新接手"),await S()}catch(m){I(m instanceof Error?m.message:String(m))}finally{E(!1)}},de=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)}},Se=async m=>{E(!0),I(null);try{const D=await a("/task/signoff",{id:d.id,action:m,note:Q,by:r()});se(""),hs(D.gate??null),await S()}catch(D){I(D instanceof Error?D.message:String(D))}finally{E(!1)}},ge=async()=>{if(F.trim().length!==0){E(!0),I(null);try{const D=((await a("/task/comment",{id:d.id,body:F,author:"人",kind:"human"})).mentions??[]).map(oe=>oe.label??oe.id);W(""),D.length>0&&I(null),$(D.length>0?`已通知 ${D.join("、")}`:null),await S()}catch(m){I(m instanceof Error?m.message:String(m))}finally{E(!1)}}},Xa=m=>W(D=>D.replace(/\s*$/,D.length===0?"":" ")+`@${m} `),[$t,ga]=t.useState(null),[Dn,La]=t.useState(0),Lt=t.useMemo(()=>rf(h.config),[h.config]),Mt=$t===null?[]:Go(Lt,$t.query),On=(m,D)=>{const oe=m.slice(0,D),Te=/@([^\s@]{0,24})$/.exec(oe);if(Te===null){ga(Re=>Re!==null&&Re.inline?null:Re);return}ga({query:Te[1],from:D-Te[0].length,inline:!0}),La(0)},J=m=>{const D=$t;if(D!==null&&D.inline&&D.from!==null){const oe=D.from;W(Te=>Te.slice(0,oe)+`@${m} `)}else Xa(m);ga(null)},Ie=async()=>{if(await l(`删除任务「${d.title}」?`,{title:"删除任务",danger:!0,okText:"删除"})){E(!0);try{await a("/task/delete",{id:d.id}),b(),await S()}catch(m){I(m instanceof Error?m.message:String(m))}finally{E(!1)}}},wt=async()=>{E(!0),I(null);try{await a("/agents/run",{id:d.id,expert:B}),await S()}catch(m){I(m instanceof Error?m.message:String(m))}finally{E(!1)}},vt=d.blocked??null,qt=async()=>{const m=await c("卡在哪了?(写清楚,之后要据此决定怎么继续)",{title:"标记阻塞",defaultValue:vt?.reason??"",placeholder:"比如:等支付网关联调账号"});if(m!==null){if(m.trim()===""){I("阻塞原因至少写一句话");return}E(!0),I(null),$(null);try{await a("/task/block",{id:d.id,reason:m.trim()}),await S()}catch(D){I(D instanceof Error?D.message:String(D))}finally{E(!1)}}},z=async(m,D)=>{if(!(m==="advance"&&!await l("解除阻塞并把卡推到下一列?下一列的 AI 会立刻接手。",{title:"解除阻塞",okText:"解除并推进"}))){E(!0),I(null),$(null);try{await a("/task/unblock",{id:d.id,action:m,expert:D}),$(m==="advance"?"已解除阻塞,推进到下一列":m==="assign"?"已解除阻塞,已交给指定专家":m==="clear"?"已解除阻塞(暂不派单)":"已解除阻塞,已交回本列负责人"),await S()}catch(oe){I(oe instanceof Error?oe.message:String(oe))}finally{E(!1)}}},me=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)}},Me=async()=>{await At({project:O.project,iteration:O.project===""?"":O.iteration,service:O.project===""?"":O.service??"",owner:O.owner,dueAt:Dr(O.due),releaseId:O.releaseId??""})},ft=async()=>{const m=x.trim();if(m!==""){E(!0),I(null);try{await a("/task/checklist",{id:d.id,action:"add",text:m}),P(""),await S()}catch(D){I(D instanceof Error?D.message:String(D))}finally{E(!1)}}},Ma=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(D){I(D instanceof Error?D.message:String(D))}finally{E(!1)}},oa=async m=>{E(!0),I(null);try{await a("/task/checklist",{id:d.id,action:"remove",itemId:m.id}),await S()}catch(D){I(D instanceof Error?D.message:String(D))}finally{E(!1)}},za=async()=>{const m=await c("SQLite 库文件路径",{title:"加一条数据库用例",defaultValue:""});if(m===null||String(m).trim()==="")return;const D=await c("SQL 语句(返回的行用来断言)",{title:"加一条数据库用例",defaultValue:"select 1 as n"});if(D===null||String(D).trim()==="")return;const oe=await c("断言首行的哪一列(留空就只看能不能执行)",{title:"加一条数据库用例",defaultValue:"n"});if(oe===null)return;const Te=await c("这一列的期望值(可留空)",{title:"加一条数据库用例",defaultValue:""});if(Te!==null){E(!0),I(null);try{const Re={file:String(m).trim(),sql:String(D).trim()},ta=String(Te??"").trim(),at=String(oe??"").trim();ta!==""&&at!==""&&(Re.expectColumn=at,Re.expectValue=ta);const Yt=("db: "+Re.sql).slice(0,60),Uo=String(oe??"n").trim()||"n";await a("/task/case",{id:d.id,action:"add",cases:[{title:Yt,expected:ta===""?"能执行":Uo+" = "+ta,db:Re}]}),await S()}catch(Re){I(Re instanceof Error?Re.message:String(Re))}finally{E(!1)}}},Ln=async()=>{const m=await c("shell 命令(断言退出码 0)",{title:"加一条 shell 用例",defaultValue:""});if(m===null||String(m).trim()==="")return;const D=await c("期望输出里包含什么(可留空)",{title:"加一条 shell 用例",defaultValue:""});if(D!==null){E(!0),I(null);try{const oe=String(D??"").trim(),Te={title:("shell: "+String(m).trim()).slice(0,60),expected:oe===""?"退出码 0":"退出码 0 且输出包含 "+oe,shell:{command:String(m).trim(),expectExit:0,expectContains:oe}};await a("/task/case",{id:d.id,action:"add",cases:[Te]}),await S()}catch(oe){I(oe instanceof Error?oe.message:String(oe))}finally{E(!1)}}},Bo=async()=>{const m=Z.title.trim();if(m!==""){E(!0),I(null);try{const D=vx(Z.steps),oe={title:m,expected:Z.expected.trim()};D.length>0&&(oe.http={steps:D}),Z.type!==void 0&&Z.type!=="functional"&&(oe.type=Z.type),Z.priority!==void 0&&Z.priority!=="p2"&&(oe.priority=Z.priority),String(Z.preconditions??"").trim()!==""&&(oe.preconditions=String(Z.preconditions).trim()),String(Z.stepsText??"").trim()!==""&&(oe.steps=String(Z.stepsText).split(`
|
|
17
|
+
`).map(Te=>Te.trim()).filter(Te=>Te!=="")),await a("/task/case",{id:d.id,action:"add",cases:[oe]}),le({title:"",expected:"",steps:"",stepsText:"",type:"functional",priority:"p2",preconditions:""}),await S()}catch(D){I(D instanceof Error?D.message:String(D))}finally{E(!1)}}},Mn=async(m,D)=>{E(!0),I(null),$(null);try{const oe=await a("/task/case",{id:d.id,action:"update",caseId:m.id,result:D}),Te=oe?.bug??null;if(D==="fail"&&Te!==null){const Re=String(Te.code??"")!==""?Te.code:Te.id;$(`用例判失败,已自动登记缺陷 ${Re}(挂在同一条需求下,父任务指向本卡)。`)}else oe?.error&&$(`用例已更新,但自动建缺陷失败:${oe.error}`);await S()}catch(oe){I(oe instanceof Error?oe.message:String(oe))}finally{E(!1)}},Za=async m=>{V({busy:!0,note:""}),I(null);try{const D=await a("/task/case/run",{id:d.id,caseId:m,by:"我在界面里跑的"}),oe=D?.run??{},Te=(D?.bugs??[]).filter(ta=>ta.created===!0).length,Re=[`跑了 ${oe.total??0} 条:通过 ${oe.passed??0},不通过 ${oe.failed??0}`];Te>0&&Re.push(`自动开缺陷 ${Te} 张`),V({busy:!1,note:Re.join(",")}),await S()}catch(D){V({busy:!1,note:D instanceof Error?D.message:String(D)})}},vs=async()=>{Ne({busy:!0,note:""}),I(null);try{const m=await a("/task/cases/generate",{id:d.id}),D=m?.added>0?`已生成 ${m.added} 条用例,这张卡现在共 ${m.total} 条`:`没生成用例:${m?.reason??"没有可用的验收条件"}`;Ne({busy:!1,note:D}),await S()}catch(m){Ne({busy:!1,note:m instanceof Error?m.message:String(m)})}},j=async m=>{E(!0),I(null);try{await a("/task/case",{id:d.id,action:"remove",caseId:m.id}),await S()}catch(D){I(D instanceof Error?D.message:String(D))}finally{E(!1)}},ue=async m=>{E(!0),I(null),$(null);try{await a("/task/case",{id:d.id,action:"update",caseId:m.id,flaky:m.flaky!==!0}),$(m.flaky===!0?"已取消不稳定标记":"已标记为不稳定用例:以后失败不会自动开缺陷"),await S()}catch(D){I(D instanceof Error?D.message:String(D))}finally{E(!1)}},Be=async()=>{const m=G.title.trim();if(m!==""){E(!0),I(null),$(null);try{const D=await a("/task/artifact",{id:d.id,action:"add",artifact:{kind:G.kind,title:m,ref:G.ref.trim(),content:G.content,status:"delivered"}});te({kind:G.kind,title:"",ref:"",content:""}),$("已登记,正在归档到飞书云盘…"),await S();try{const Te=((await a("/task/artifact/sync",{id:d.id}))?.written??[])[0];$(Te?.doc?.url?`已归档到飞书云盘:${Te.doc.url}`:"归档失败,稍后可点「同步到云盘」重试。"),await S()}catch{$("登记成功,但归档失败:可点「同步到云盘」重试。")}}catch(D){I(D instanceof Error?D.message:String(D))}finally{E(!1)}}},kt=async m=>{if(q!==null){E(!0),I(null),$(null);try{const D=q.content;await a("/task/artifact",{id:d.id,action:"update",artifactId:m.id,artifact:{content:D}}),K(null),Y(oe=>({...oe,[m.id]:D})),await S();try{const Te=((await a("/task/artifact/sync",{id:d.id,artifactId:m.id}))?.written??[])[0]?.doc;$(Te?.url?`正文已更新并同步:${Te.url}`:"正文已保存,归档失败可再点「更新」。"),await S()}catch{$("正文已保存,归档失败可再点「更新」。")}}catch(D){I(D instanceof Error?D.message:String(D))}finally{E(!1)}}},ia=async m=>{E(!0),I(null),$(null);try{const D=await a("/task/artifact/sync",{id:d.id,artifactId:m.id}),oe=(D?.written??[])[0]?.doc,Te=(D?.errors??[])[0];$(oe?.url?`已归档:${oe.url}`:`归档失败:${Te?.error??"未知原因"}`),await S()}catch(D){I(D instanceof Error?D.message:String(D))}finally{E(!1)}},tt=async()=>{E(!0),I(null),$(null);try{const m=await a("/task/artifact/sync",{id:d.id}),D=(m?.written??[]).length,oe=(m?.errors??[]).length;$(`已归档 ${D} 件${oe>0?`,${oe} 件失败:${m.errors[0]?.error??""}`:"。"}`),await S()}catch(m){I(m instanceof Error?m.message:String(m))}finally{E(!1)}},Oe=async(m,D)=>{E(!0),I(null);try{await a("/task/artifact",{id:d.id,action:"update",artifactId:m.id,artifact:{status:D}}),await S()}catch(oe){I(oe instanceof Error?oe.message:String(oe))}finally{E(!1)}},Ye=async m=>{E(!0),I(null);try{await a("/task/artifact",{id:d.id,action:"remove",artifactId:m.id}),await S()}catch(D){I(D instanceof Error?D.message:String(D))}finally{E(!1)}},zn=()=>We({agent:U?.agent??"",model:U?.model??"",branch:U?.branch??"",context:U?.context??"",total:String(U?.unitTests?.total??0),passed:String(U?.unitTests?.passed??0)}),Ja=async m=>{if(!(m==="remove"&&!await l("回收 worktree 会删掉这个目录和分支,未合并的改动会丢,确定?",{title:"回收 worktree",danger:!0,okText:"回收"}))){E(!0),I(null),qe("");try{const D=await a("/task/worktree",{id:d.id,action:m});m==="list"?qe(String(D.output??"").replace(/\s+/g," ").slice(0,400)||"(没有 worktree)"):D.ok===!0?qe(m==="create"?"已建好 worktree":"已回收"):qe(D.skipped||D.result?.error||"没成功"),m!=="list"&&await S()}catch(D){qe(D instanceof Error?D.message:String(D))}finally{E(!1)}}},OE=async()=>{if(je===null)return;const m=Math.max(0,Number(je.total)||0),D=Math.min(m,Math.max(0,Number(je.passed)||0));E(!0),I(null);try{await a("/task/coding",{id:d.id,action:"update",coding:{agent:je.agent.trim(),model:je.model.trim(),branch:je.branch.trim(),context:je.context,unitTests:{total:m,passed:D}}}),We(null),await S()}catch(oe){I(oe instanceof Error?oe.message:String(oe))}finally{E(!1)}},jy=async m=>{E(!0),I(null);try{await a("/task/coding",{id:d.id,action:"review",status:m,note:Qa.trim()}),jn(""),await S()}catch(D){I(D instanceof Error?D.message:String(D))}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()=>{Kt({busy:!0,line:"",ok:null});try{const m=await a("/task/coding/verify",{id:d.id}),D=m.report??{};D.skipped!==void 0?Kt({busy:!1,line:String(D.skipped),ok:!1}):Kt({busy:!1,line:String(m.line??""),ok:D.ok===!0}),await S()}catch(m){Kt({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 D=await c("状态:pending 待评审 / changes_requested 要改 / approved 通过",{title:"设计评审",defaultValue:d.design?.status??"pending"});if(D===null)return;const oe=await c("还原度差异百分比(design-diff 输出,留空跳过)",{title:"设计还原度",defaultValue:d.design?.diff==null?"":String(d.design.diff.percent)});if(oe===null)return;const Te=await c("规范体检野值数(design-audit 输出,留空跳过)",{title:"设计规范体检",defaultValue:d.design?.spec==null?"":String(d.design.spec.violations)});if(Te!==null){E(!0),I(null),$(null);try{const Re={link:m,status:D,note:d.design?.note??""},ta=Number(String(oe).trim());String(oe).trim()!==""&&Number.isFinite(ta)&&(Re.diff={percent:ta,url:String(d.design?.diff?.url??"")});const at=Number(String(Te).trim());String(Te).trim()!==""&&Number.isFinite(at)&&(Re.spec={checked:d.design?.spec?.checked??0,violations:at,top:d.design?.spec?.top??[]});const Yt=await a("/task/design",{id:d.id,design:Re});$("设计已保存:"+String(Yt?.design?.status??D)),await S()}catch(Re){I(Re instanceof Error?Re.message:String(Re))}finally{E(!1)}}},FE=async()=>{E(!0),I(null),$(null);try{const D=(await a("/coding/gitlab",{id:d.id}))?.facts??null;$(D===null?"核对完成,但没有拿到结果":`GitLab 核对:文件 ${D.files.declared}→${D.files.actual} · 提交 ${D.commits.declared}→${D.commits.actual}${D.pipeline?` · 流水线 ${D.pipeline}`:""}${(D.mismatches??[]).length>0?` · ⚠ ${D.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?Fs(h.config??{},{kind:"expert",id:d.dispatch.expert}):"";return e("div",{className:"ds-drawer-wrap",onClick:m=>{m.target===m.currentTarget&&b()}},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:b},"关闭"),(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:Rt.map(m=>({id:m.id,label:m.label,count:m.count})),value:et,onChange:m=>Ge(m),className:"ds-dw-shadcn-tabs"}):e("div",{className:"ds-dw-tabs"},Rt.map(m=>e("button",{key:m.id,className:"ds-dw-tab","data-on":et===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:M,"data-pane":et},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"},Ho[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":Ko(d,h.config??{}).label==="未指派"?"1":"0",title:Ko(d,h.config??{}).note},`负责:${Ko(d,h.config??{}).label}`),d.type==="bug"?e(w,{className:"ds-select",style:{height:20,fontSize:11,padding:"0 4px"},value:d.severity||"p2",title:"严重级别",onChange:m=>void At({severity:m.target.value})},["p0","p1","p2","p3"].map(m=>e("option",{key:m,value:m},Ql[m]))):null,e(f,{className:"ds-chip"},zs[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&&At({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:Pe("overview")},e("div",{className:"ds-sec-head"},"推进到",e("span",{className:"ds-hint"},"点一下就会移动卡片,并触发对应列的 AI")),e("div",{className:"ds-listrow-actions"},(()=>{const m=h.statuses,D=m.findIndex(at=>at.id===d.status),oe=m[D+1]??null,Te=m.filter(at=>at.id!==d.status&&(oe===null||at.id!==oe.id)),Re=Te.filter(at=>m.findIndex(Yt=>Yt.id===at.id)>D),ta=Te.filter(at=>m.findIndex(Yt=>Yt.id===at.id)<D);return[oe===null?null:e("button",{key:"next",className:"ds-btn ds-btn-primary",disabled:C,title:"推进到下一列,下一列的 AI 会接手",onClick:()=>void At({status:oe.id,role:oe.role})},`推进到「${oe.label}」`),Te.length===0?null:e(w,{key:"other",className:"ds-select",value:"",disabled:C,onChange:at=>{const Yt=at.target.value;if(Yt==="")return;const Uo=m.find(UE=>UE.id===Yt);Uo!==void 0&&At({status:Uo.id,role:Uo.role})}},e("option",{value:""},`其他状态(${Te.length})`),...Re.map(at=>e("option",{key:at.id,value:at.id},`→ ${at.label}`)),...ta.map(at=>e("option",{key:at.id,value:at.id},`← ${at.label}(退回,AI 会重跑)`)))].filter(Boolean)})())),e("div",{className:"ds-sec",style:Pe("overview")},e("div",{className:"ds-sec-head"},"准出检查",e("span",{className:"ds-hint"},"进「已完成」之前必须过这一关:清单全勾、没有失败用例、不在阻塞、有人签字")),e("div",{className:"ds-sec-body"},$a===null?e("div",{className:"ds-row",style:{gap:8,alignItems:"center"}},e("button",{className:"ds-btn",onClick:()=>void de()},"检查一下"),e("span",{className:"ds-hint"},"点一下看这张卡还差什么才能收口")):e("div",{className:"ds-gate","data-ready":$a.ready?"1":"0"},e("div",{className:"ds-gate-head"},e("b",null,$a.ready?"✅ 可以进「已完成」":`⛔ 还差 ${$a.blockers.length} 项`),e("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void de()},"重新检查")),($a.blockers??[]).map(m=>e("div",{key:m,className:"ds-gate-item","data-kind":"block"},`⛔ ${m}`)),($a.warnings??[]).map(m=>e("div",{key:m,className:"ds-gate-item","data-kind":"warn"},`⚠ ${m}`)),($a.blockers??[]).length===0&&($a.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:Q,placeholder:"验收签字:验了什么、遗留什么",onChange:m=>se(m.target.value)}),e("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void Se("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 Se("clear")},"取消签字")))),e("div",{className:"ds-sec",style:Pe("overview")},e("div",{className:"ds-sec-head"},"阻塞",e("span",{className:"ds-hint"},"卡住了打个标,卡留在本列停住,不会被自动往下派;怎么继续由人定")),vt===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 qt()},"⛔ 标记阻塞"))):e("div",{className:"ds-sec-body"},e("div",{className:"ds-blocked-box"},e("div",{style:{fontWeight:600}},`⛔ ${vt.reason||"未填写原因"}`),e("div",{className:"ds-hint"},`${vt.by||"人"} · ${Ke(vt.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 z("resume")},"继续,交本列负责人"),e("button",{className:"ds-btn",disabled:C,onClick:()=>void z("advance")},"推进到下一列"),e(w,{className:"ds-select",style:{width:190},value:B,disabled:C,onChange:m=>ee(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||B==="",onClick:()=>void z("assign",B)},"改派给他"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>void z("clear")},"只解除,先不派")))),e("div",{className:"ds-sec",style:Pe("overview")},e("div",{className:"ds-sec-head"},"AI 处理",e("span",{className:"ds-hint"},"默认用本列负责人;也可以临时换人")),e("div",{className:"ds-sec-body"},e("div",{className:"ds-hint"},d.dispatch?.state==="running"?`${Fs(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(w,{className:"ds-select",value:B,disabled:C,onChange:m=>ee(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 wt()},"马上处理"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C||d.dispatch?.state!=="running",onClick:()=>void me()},"停止")))),e("div",{className:"ds-sec",style:Pe("content")},e("div",{className:"ds-sec-head"},"内容"),e("div",{className:"ds-field"},e("div",{className:"ds-label"},"标题"),e(u,{className:"ds-input",value:Ue.title,onChange:m=>xt({...Ue,title:m.target.value})})),e("div",{className:"ds-field"},e("div",{className:"ds-label"},"需求 / 背景 / 验收标准"),String(Ue.requirement??"").trim()===""?null:e("div",{className:"ds-md-preview ds-reader","data-task-md":"1",style:{maxHeight:220}},s(Ue.requirement)),e(y,{className:"ds-textarea",rows:String(Ue.requirement??"").trim()===""?4:8,value:Ue.requirement,placeholder:"这张卡要解决什么、背景是什么、做到什么算完成——AI 接手前最好写清楚。",onChange:m=>xt({...Ue,requirement:m.target.value})}),String(Ue.requirement??"").trim()===""?e("div",{className:"ds-hint"},"这张卡还没有需求描述:专家只能按标题猜。补完点下面的「保存改动」。"):null),e("div",{className:"ds-field"},e("div",{className:"ds-label"},"对应功能点"),(()=>{const m=(h.requirements??[]).find(oe=>oe.id===d.requirementId);if(m===void 0)return e("div",{className:"ds-hint"},"这张卡还没挂需求,先在「计划」里挂到某个需求,才能选功能点。");const D=m.points??[];return D.length===0?e("div",{className:"ds-hint"},`需求 ${m.code||m.id} 还没拆功能点,去需求页「功能点与可追溯矩阵」加几条。`):e(w,{className:"ds-select",value:Ue.pointId??"",onChange:oe=>xt({...Ue,pointId:oe.target.value})},e("option",{value:""},"不归到具体功能点"),D.map(oe=>e("option",{key:oe.id,value:oe.id},`${oe.id} ${oe.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:Ue.gitlabIssue,onChange:m=>xt({...Ue,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:Ue.gitlabMR,onChange:m=>xt({...Ue,gitlabMR:m.target.value})}))),e("div",{className:"ds-row"},e("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void At((d.gitlabMR?.iid??0)>0?{...Ue,gitlabMR:void 0}:Ue)},"保存改动"),e("button",{className:"ds-btn",disabled:C,onClick:Ie},"只删卡"))),e("div",{className:"ds-sec",style:Pe("plan")},e("div",{className:"ds-sec-head"},"计划",e("span",{className:"ds-hint"},"这张卡属于哪个项目/迭代、谁提的、什么时候要")),e("div",{className:"ds-sec-body"},e("div",{className:"ds-row"},e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"业务项目"),e(w,{className:"ds-select",value:O.project,onChange:m=>A({...O,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(w,{className:"ds-select",value:O.iteration,onChange:m=>A({...O,iteration:m.target.value})},e("option",{value:""},"不指定迭代"),((h.config?.projects??[]).find(m=>m.id===O.project)?.iterations??[]).map(m=>e("option",{key:m.id,value:m.id},m.name))))),((h.config?.projects??[]).find(m=>m.id===O.project)?.services??[]).length===0?null:e("div",{className:"ds-field"},e("div",{className:"ds-label"},"服务(决定用哪个 git 路径切 worktree)"),e(w,{className:"ds-select",value:O.service??"",onChange:m=>A({...O,service:m.target.value})},e("option",{value:""},"用项目级默认目录"),((h.config?.projects??[]).find(m=>m.id===O.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:O.owner,placeholder:"提需求的人,例如 张伟",onChange:m=>A({...O,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:O.due,onChange:m=>A({...O,due:m.target.value})}))),e("div",{className:"ds-row"},e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"所属版本"),e(w,{className:"ds-select",value:O.releaseId,onChange:m=>A({...O,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 Me()},"保存计划"),d.dueAt>0&&d.dueAt<Date.now()&&d.status!=="done"?e("span",{className:"ds-err"},"已逾期"):null))),e("div",{className:"ds-sec",style:Pe("plan")},e("div",{className:"ds-sec-head"},"代码隔离(git worktree)",e("span",{className:"ds-hint"},ve===null?"这张卡还没有独立工作目录":"这张卡自己的分支与目录")),e("div",{className:"ds-sec-body"},ve===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 Ja("create")},"建 worktree"))):e("div",{className:"ds-field"},e("div",{className:"ds-code-line"},`${ve.branch} · 基线 ${ve.base}`),e("div",{className:"ds-code-line"},ve.path),e("div",{className:"ds-hint"},`仓库 ${ve.repo}${De?` · ${De}`:""}`),e("div",{className:"ds-listrow-actions"},e("button",{className:"ds-btn",disabled:C,onClick:()=>void Ja("list")},"看 git worktree 列表"),e("button",{className:"ds-btn",disabled:C,onClick:()=>void Ja("remove")},"回收 worktree"))),De&&ve===null?e("div",{className:"ds-hint"},De):null)),e("div",{className:"ds-sec",style:Pe("coding")},e("div",{className:"ds-sec-head"},"AI Coding 执行记录",e("span",{className:"ds-hint"},U===null?"改代码要留记录:谁、什么模型、改了什么":"研发 agent 登记,人也可以补录或评审")),e("div",{className:"ds-sec-body"},U===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":U.review.status},ix[U.review.status]??U.review.status),e("div",{className:"ds-grow"},e("div",{className:"ds-code-line"},[U.agent||"未登记 agent",U.model,U.branch].filter(Boolean).join(" · ")),U.context===""?null:e("div",{className:"ds-hint"},U.context)),e("span",{className:"ds-hint"},U.unitTests.total>0?`单测 ${U.unitTests.passed}/${U.unitTests.total}`:"无单测"),ve===null?null:o("拿 worktree 里的 git 记录,比执行记录里自报的提交 / 文件 / 分支",e("button",{className:"ds-btn ds-btn-ghost",disabled:C||It.busy,onClick:()=>void ME()},It.busy?"核对中…":It.line===""?"核对代码事实":"再核对一次")),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"拉 MR 的改动与流水线,和自报的文件数/提交数比一遍",onClick:()=>void FE()},"从 GitLab 核对")),It.line===""?U.verified===null||U.verified===void 0?null:e("div",{className:"ds-hint","data-verify":U.verified.ok?"ok":"bad",style:{marginTop:6}},`${U.verified.ok?"✅":"⚠"} 上次核对 ${Ke(U.verified.at)}:分支 ${U.verified.branch} · 提交 ${U.verified.commitCount.actual} 个 · 改动 ${U.verified.fileCount.actual} 个文件${U.verified.missingCommits.length+U.verified.missingFiles.length===0?"":` · ${U.verified.missingCommits.length+U.verified.missingFiles.length} 项对不上`}`):e("div",{className:"ds-hint","data-verify":It.ok===!0?"ok":"bad",style:{marginTop:6}},`${It.ok===!0?"✅":"⚠"} ${It.line}`),U.gitlab===null||U.gitlab===void 0?null:e("div",{className:"ds-hint","data-gitlab-facts":U.gitlab.state},"上次 GitLab 核对 "+Ke(U.gitlab.at)+":文件 "+U.gitlab.files.declared+"→"+U.gitlab.files.actual+" · 提交 "+U.gitlab.commits.declared+"→"+U.gitlab.commits.actual+(U.gitlab.pipeline===null?"":" · 流水线 "+U.gitlab.pipeline)+((U.gitlab.mismatches??[]).length===0?" · 一致":" · "+U.gitlab.mismatches.join(";"))),(U.commits??[]).length===0?null:e("div",{className:"ds-code-list"},U.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} 文件`))),U.commits.length>6?e("div",{className:"ds-hint"},`还有 ${U.commits.length-6} 次提交`):null),(U.files??[]).length===0?null:e("div",{className:"ds-code-files"},U.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}`:""}`)),U.files.length>12?e("span",{className:"ds-hint"},`还有 ${U.files.length-12} 个`):null),U.review.note===""?null:e("div",{className:"ds-code-note"},`评审意见:${U.review.note}`),e("div",{className:"ds-row"},e(u,{className:"ds-input",style:{flex:1},value:Qa,placeholder:"评审意见(可选,写清文件/行为什么/怎么改)",onChange:m=>jn(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")},"要求修改"),U.mergedAt>0?e("span",{className:"ds-hint"},`已合并 · ${U.mergedBy||"—"}`):e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>void LE()},"标记已合并"))),je===null?e("div",{className:"ds-row"},e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:zn},U===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:je.agent,placeholder:"claude-code / codex / 自研",onChange:m=>We({...je,agent:m.target.value})})),e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"模型"),e(u,{className:"ds-input",value:je.model,placeholder:"deepseek-v4.1-flash",onChange:m=>We({...je,model:m.target.value})})),e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"分支"),e(u,{className:"ds-input",value:je.branch,placeholder:"feature/xxx",onChange:m=>We({...je,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:je.total,onChange:m=>We({...je,total:m.target.value})})),e("div",{className:"ds-field",style:{flex:"0 0 110px"}},i("通过数","通过的条数;少于总数时卡片过不了准出"),e(u,{className:"ds-input",value:je.passed,onChange:m=>We({...je,passed:m.target.value})})),e("div",{className:"ds-field",style:{flex:1}},e("div",{className:"ds-label"},"这次依据的上下文"),e(u,{className:"ds-input",value:je.context,placeholder:"例如 PRD v1.2 + 架构方案 v1",onChange:m=>We({...je,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:()=>We(null)},"取消")))))),e("div",{className:"ds-dw-col"},e("div",{className:"ds-sec",style:Pe("test")},e("div",{className:"ds-sec-head"},"验收清单",e("span",{className:"ds-hint"},Et.total===0?"这张卡还没有清单":`${be} / ${Et.total} 已勾`)),e("div",{className:"ds-sec-body"},Et.total===0?null:e("div",{className:"ds-check-progress"},e("div",{className:"ds-check-bar","data-full":be===Et.total?"1":"0"},e("span",{style:{width:`${Et.total===0?0:Math.round(be/Et.total*100)}%`}}))),ne===null&&Et.total>0?e("div",{className:"ds-hint"},"载入清单…"):X.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 Ma(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 oa(m)},"×"))),e("div",{className:"ds-row"},e(u,{className:"ds-input",style:{flex:1},value:x,placeholder:"再加一条验收条目,回车提交",onChange:m=>P(m.target.value),onKeyDown:m=>{m.key==="Enter"&&ft()}}),e("button",{className:"ds-btn",disabled:C||x.trim()==="",onClick:()=>void ft()},"+ 加一条")),e("div",{className:"ds-hint"},"清单就是「做完」的定义:AI 每完成一项要勾一项并附证据;人也可以直接勾。"))),e("div",{className:"ds-sec",style:Pe("deliver")},e("div",{className:"ds-sec-head"},"交付物",e("span",{className:"ds-hint"},"文档、MR、用例、报告——交付要有东西,不只是一句「做完了」;登记后会写成飞书云盘需求文件夹里的一份文档"),Or(d).length>0?e("span",{className:"ds-card-warn",title:"这些交付物还没写正文,点「正文」补上再同步"},`● ${Or(d).length} 件缺正文`):null,(d.artifacts??[]).length>0?e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"把这张卡的交付物全部写进需求文件夹(已归档的会覆盖更新)",onClick:()=>void tt()},"同步到云盘"):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},Xp[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 rt(m)},ke===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 ia(m)},"更新"):e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"写进需求文件夹",onClick:()=>void ia(m)},"归档"),e(w,{className:"ds-select",style:{width:92,height:22,fontSize:11},value:m.status,disabled:C,onChange:D=>void Oe(m,D.target.value)},nx.map(D=>e("option",{key:D,value:D},ox[D]))),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>void Ye(m)},"×")),ke===m.id?e("div",{className:"ds-md-preview ds-reader"},xe[m.id]===void 0&&_e(m)?e("span",{className:"ds-hint"},"读取中…"):Ce(m).trim()===""?e("span",{className:"ds-hint"},"这条交付物还没有正文。"):s(Ce(m))):null)),q===null?null:e("div",{style:{marginTop:8}},e(y,{className:"ds-input",style:{width:"100%"},rows:8,value:q.content,placeholder:"写清楚做了什么、结论、风险。这段会原样写进云盘文档正文。",onChange:m=>K({...q,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 kt({id:q.id})},"保存正文并同步"))),e("div",{className:"ds-row"},e(w,{className:"ds-select",style:{width:104},value:G.kind,onChange:m=>te({...G,kind:m.target.value})},ax.map(m=>e("option",{key:m,value:m},Xp[m]))),e(u,{className:"ds-input",style:{flex:1},value:G.title,placeholder:"交付物名称,例如 登录模块技术方案",onChange:m=>te({...G,title:m.target.value})}),e(u,{className:"ds-input",style:{flex:1},value:G.ref,placeholder:"路径 / 链接 / MR 号",onChange:m=>te({...G,ref:m.target.value})})),e(y,{className:"ds-input",style:{width:"100%",marginTop:6},rows:5,value:G.content,placeholder:"交付物正文(Markdown)。这段会原样写成云盘文档的正文:做什么、怎么做、结论、风险。留空也能登记,但云盘里只有标题。",onChange:m=>te({...G,content:m.target.value})}),e("div",{className:"ds-row",style:{justifyContent:"flex-end",marginTop:6}},e("button",{className:"ds-btn",disabled:C||G.title.trim()==="",onClick:()=>void Be()},"登记并归档")))),e("div",{className:"ds-sec",style:Pe("test")},e("div",{className:"ds-sec-head"},"测试用例",e("span",{className:"ds-hint"},st.total===0?"测试同学把用例登记在这里,逐条执行并回填结果":ce),e("button",{className:"ds-btn ds-btn-ghost",disabled:$e.busy,onClick:()=>void vs()},$e.busy?"生成中…":"✨ 按需求生成"),e("button",{className:"ds-btn ds-btn-ghost",disabled:he.busy||pt.filter(m=>m.http!=null||m.shell!=null||m.db!=null).length===0,onClick:()=>void Za(void 0)},he.busy?"运行中…":"▶ 跑用例")),e("div",{className:"ds-sec-body","data-scroll":"1"},he.note===""?null:e("div",{className:"ds-hint"},he.note),$e.note===""?null:e("div",{className:"ds-hint"},$e.note),st.total===0?e("div",{className:"ds-empty"},"还没有用例。"):ne===null?e("div",{className:"ds-hint"},"载入用例…"):pt.map(m=>e("div",{key:m.id,className:"ds-art-row","data-result":m.result},e(w,{className:"ds-select",style:{width:84,height:22,fontSize:11},value:m.result,disabled:C,onChange:D=>void Mn(m,D.target.value)},Zp.map(D=>e("option",{key:D,value:D},Xl[D]))),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(D=>`${D.ok?"✅":"❌"} ${D.method} ${D.url}${D.status===0?"":` → ${D.status}`}`).join(";")}`),(m.http?.steps??[]).length===0?null:e(f,{className:"ds-chip ds-chip-soft"},`多步 ${m.http.steps.length}`),((h.requirements??[]).find(D=>D.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(w,{className:"ds-select",style:{width:190,height:26},value:m.pointId??"",onChange:async D=>{try{await a("/task/case",{id:d.id,action:"update",caseId:m.id,pointId:D.target.value}),await S()}catch(oe){I(oe instanceof Error?oe.message:String(oe))}}},e("option",{value:""},"不归功能点"),((h.requirements??[]).find(D=>D.id===d.requirementId)?.points??[]).map(D=>e("option",{key:D.id,value:D.id},`${D.id} ${D.title}`)))),m.note===""?null:e("div",{className:"ds-art-ref"},`记录:${m.note}${m.by?` — ${m.by}`:""}`)),m.http==null?null:e("button",{className:"ds-btn ds-btn-ghost",disabled:he.busy,onClick:()=>void Za(m.id)},"▶"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"标记为不稳定用例:失败时不自动开缺陷","data-flaky":m.flaky===!0?"1":"0",onClick:()=>void ue(m)},m.flaky===!0?"不稳":"标不稳"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,onClick:()=>void j(m)},"×"))),e("div",{className:"ds-row"},e(u,{className:"ds-input",style:{flex:1},value:Z.title,placeholder:"用例:做什么,例如 用错误密码连续登录 5 次",onChange:m=>le({...Z,title:m.target.value})}),e(u,{className:"ds-input",style:{flex:1},value:Z.expected,placeholder:"期望结果,例如 第 5 次返回 429 并锁定 10 分钟",onChange:m=>le({...Z,expected:m.target.value})}),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"加一条 shell 用例:跑命令看退出码与输出(需要先在设置里打开 allowShell)",onClick:()=>void Ln()},"+ shell"),e("button",{className:"ds-btn ds-btn-ghost",disabled:C,title:"加一条数据库用例:查库断言行数与某列值(需要先在设置里打开 allowDb)",onClick:()=>void za()},"+ 数据库"),e("button",{className:"ds-btn",disabled:C||Z.title.trim()==="",onClick:()=>void Bo()},"+ 加用例")),e("div",{className:"ds-row",style:{gap:8,flexWrap:"wrap",marginTop:6}},e(w,{className:"ds-select",style:{width:96},value:Z.type??"functional",onChange:m=>le({...Z,type:m.target.value})},sx.map(m=>e("option",{key:m,value:m},Jp[m]))),e(w,{className:"ds-select",style:{width:84},value:Z.priority??"p2",onChange:m=>le({...Z,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:Z.preconditions??"",placeholder:"前置条件,例如 会员等级≥银卡、账户余额充足",onChange:m=>le({...Z,preconditions:m.target.value})})),e("div",{className:"ds-field"},e("label",{},"测试步骤(可选,一行一步)"),e(p,{className:"ds-input",rows:2,value:Z.stepsText??"",placeholder:`1. 打开积分抵扣页
|
|
18
18
|
2. 选择「抵扣 10 元」
|
|
19
|
-
3. 提交订单`,onChange:m=>
|
|
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(D=>D.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 D=(m?.services??[]).find(Ie=>Ie.id===d.service);if(D===void 0)return`${d.service}(已失效)`;const re=(D.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`${D.name}${D.repoPath?` · ${D.repoPath}`:""}${$e}`})()),e("dt",{},"父任务"),e("dd",{},(()=>{if(d.parent===""||d.parent===void 0)return"无";const m=(h.tasks??[]).find(D=>D.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(D=>D.bugSource!=null&&D.bugSource.taskId===d.id);return m.length===0?"无":m.map(D=>`${D.code||D.id}(${(h.statuses??[]).find(re=>re.id===D.status)?.label??D.status})`).join("、")})()),e("dt",{},"飞书会话"),e("dd",{},d.feishuThread===""||d.feishuThread===void 0?"未关联":d.feishuThread),e("dt",{},"状态历史"),e("dd",{},d.history.map(m=>{const D=(h.statuses??[]).find($e=>$e.id===m.status)?.label??m.status,re=m.note===void 0||m.note===""?"":`(${m.note})`;return`${D} · ${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 D=h.config?.experts??[],re=D.find(Kt=>Kt.name===m.author)??D.find(Kt=>m.author!==void 0&&m.author!==""&&(Kt.name.includes(m.author)||m.author.includes(Kt.name)))??D.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)}},$t===null?`@ 提到谁(${Lt.length})`:"收起名单"),e("span",{className:"ds-hint"},"也可以在输入框里直接打「@」搜")),$t!==null?e(k,{roster:Lt,query:$t.query,active:An,onActive:La,onQuery:m=>{fa(D=>D===null?{query:m,from:null,inline:!1}:{...D,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:z,onFocus:()=>Ge("discuss"),onChange:m=>{H(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(!($t===null||$t.inline!==!0))if(m.key==="ArrowDown"||m.key==="ArrowUp"){if(m.preventDefault(),Mt.length===0)return;La(D=>(D+(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"},z.trim()===""?"还没写":`${z.length} 字`),e("button",{className:"ds-btn ds-btn-primary",disabled:C||z.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),[w,y]=t.useState(()=>{try{const $=window.localStorage.getItem(sd),B=$===null?[]:JSON.parse($);return Array.isArray(B)?B.filter(J=>typeof J=="string"):[]}catch{return[]}}),k=$=>{if($==null||$.kind!=="action")return;const B=Px(w,$.id);y(B);try{window.localStorage.setItem(sd,JSON.stringify(B))}catch{}},g=t.useRef(null),d=t.useMemo(()=>_x(n),[n]),h=t.useMemo(()=>ad(n).filter($=>$.kind==="task"),[n]),b=t.useMemo(()=>ad(n).filter($=>$.kind==="expert"),[n]),S=t.useMemo(()=>(n.statuses??[]).map($=>({key:"column:"+$.id,kind:"column",id:$.id,label:$.label,hint:(n.tasks??[]).filter(B=>B.status===$.id).length+" 张卡",search:String($.label??"").toLowerCase()})),[n.statuses,n.tasks]),C=t.useMemo(()=>f===null?Ex(Ko(d,l),l===""?w:[]):f.step==="expert"?Ko(b,l):f.step==="column"?Ko(S,l):Ko(h,l),[f,d,h,S,b,l,w]);t.useEffect(()=>{g.current?.focus()},[]),t.useEffect(()=>{if(o==null)return;const $=d.find(B=>B.id===o);if($!==void 0){if($.kind==="action"&&Yo[$.id]!==void 0){E($.id);return}r($),s()}},[i]),t.useEffect(()=>{p(0)},[l]);const E=$=>{v({action:$,step:Yo[$].step}),c(""),p(0)},_=$=>{if($!==void 0){if(f===null){if($.id==="clear-recents"){Tx(),s();return}if(k($),$.kind==="action"&&Yo[$.id]!==void 0){E($.id);return}r($),s();return}if(f.step==="column"){r({kind:"run",action:f.action,columnId:$.id}),s();return}if(f.step==="card"){if(f.action==="card-dispatch"){v({action:f.action,cardId:$.id,step:"expert"}),c(""),p(0);return}r({kind:"run",action:f.action,cardId:$.id}),s();return}r({kind:"run",action:f.action,cardId:f.cardId,expertId:$.id}),s()}},I=()=>{if(f===null){s();return}v(f.step==="expert"?{action:f.action,step:"card"}:null),c(""),p(0)},z=$=>{if($.key==="Escape"){$.preventDefault(),I();return}if($.key==="ArrowDown"){$.preventDefault(),p(B=>Math.min(C.length-1,B+1));return}if($.key==="ArrowUp"){$.preventDefault(),p(B=>Math.max(0,B-1));return}$.key==="Enter"&&($.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},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:$=>$.stopPropagation()},M,e("input",{ref:g,className:"ds-palette-input",placeholder:H,value:l,onChange:$=>c($.target.value),onKeyDown:z,"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(($,B)=>e("div",{key:$.key,className:"ds-palette-item","data-active":B===u?"1":"0",onMouseEnter:()=>p(B),onClick:()=>_($)},e("span",{className:"ds-palette-kind","data-kind":$.kind},Ix[$.kind]??$.kind),e("span",{className:"ds-palette-label"},of($.label,80)),$.hint===""?null:e("span",{className:"ds-palette-hint"},of(($.kind==="action"&&l===""&&w.includes($.id)?"最近用过 · ":"")+$.hint,40)),$.shortcut===void 0||$.shortcut===null?null:e("span",{className:"ds-palette-key",title:"全局快捷键"},$.shortcut))))))}}let rd=null;function Ox(e){rd=e}function bt(){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:w,SideDrawer:y}=bt(),k=e.experts??[],[g,d]=n.useState(null),[h,b]=n.useState(null),[S,C]=n.useState(!1),E=["🧩","📋","🏛️","🛠️","🧪","🔍","🛡️","⚙️","📦","💰","💳","📊","📈","🧠","🤖","🧭","🎯","🚀","🧱","🔧","🧰","🧮","📝","📚","🗂️","🔐","🌐","☁️","🗄️","🧬","🩺","⚖️"],_=async()=>{if(g!==null){C(!0),b(null);try{await s("/experts/save",{expert:g}),d(null),await t()}catch(R){b(R instanceof Error?R.message:String(R))}finally{C(!1)}}},I=async R=>{if(await i(`删除专家「${R.name}」?已用它派的单会保留历史评论。`,{title:"删除专家",danger:!0,okText:"删除"})){C(!0),b(null);try{await s("/experts/delete",{id:R.id}),await t()}catch(O){b(O instanceof Error?O.message:String(O))}finally{C(!1)}}},z=(R,O)=>d({...g,[R]:O}),[H,M]=n.useState(""),[$,B]=n.useState([]);n.useEffect(()=>{let R=!0;return s("/skills").then(O=>{R&&B(O.skills??[])}).catch(()=>{}),()=>{R=!1}},[]);const J=R=>{const O=g.skills??[];z("skills",O.includes(R)?O.filter(G=>G!==R):[...O,R])},[q,L]=n.useState(""),A=()=>{const R=q.trim();if(R===""||g===null)return;const O=g.skills??[];O.includes(R)||z("skills",[...O,R]),L("")},x=async()=>{const R=H.trim();if(R.length!==0){C(!0),b(null);try{const O=[{role:"product",name:"产品经理",emoji:"📋",prompt:`你是${R}业务的产品经理。
|
|
19
|
+
3. 提交订单`,onChange:m=>le({...Z,stepsText:m.target.value})})),e("div",{className:"ds-field"},e("label",{},"多步接口(可选,一行一步:METHOD url | 期望状态码 | 提取变量)"),e(p,{className:"ds-input",rows:3,value:Z.steps,placeholder:`POST /api/auth/login | 200 | data.token
|
|
20
|
+
GET /api/points | 200 |`,onChange:m=>le({...Z,steps:m.target.value})}),e("div",{className:"ds-hint"},"先登录取 token、再带 token 调业务接口时用;变量写成 {{data.token}} 放进 url 或 body。第一步失败后面不会跑。")))),e("div",{className:"ds-sec",style:Pe("overview")},e("div",{className:"ds-sec-head"},"其它信息"),e("dl",{className:"ds-kv"},e("dt",{},"编号"),e("dd",{},d.code===void 0||d.code===""?"未挂需求(无编号)":d.code),e("dt",{},"所属需求"),e("dd",{},(()=>{const m=(h.requirements??[]).find(D=>D.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(Re=>Re.id===d.project);if((d.service??"")==="")return"未指定(用项目默认目录)";const D=(m?.services??[]).find(Re=>Re.id===d.service);if(D===void 0)return`${d.service}(已失效)`;const oe=(D.dependsOn??[]).map(Re=>(m.services??[]).find(ta=>ta.id===Re)).filter(Re=>Re!==void 0),Te=oe.length===0?"":` · 依赖 ${oe.map(Re=>Re.name).join("、")}`;return`${D.name}${D.repoPath?` · ${D.repoPath}`:""}${Te}`})()),e("dt",{},"父任务"),e("dd",{},(()=>{if(d.parent===""||d.parent===void 0)return"无";const m=(h.tasks??[]).find(D=>D.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(D=>D.bugSource!=null&&D.bugSource.taskId===d.id);return m.length===0?"无":m.map(D=>`${D.code||D.id}(${(h.statuses??[]).find(oe=>oe.id===D.status)?.label??D.status})`).join("、")})()),e("dt",{},"飞书会话"),e("dd",{},d.feishuThread===""||d.feishuThread===void 0?"未关联":d.feishuThread),e("dt",{},"状态历史"),e("dd",{},d.history.map(m=>{const D=(h.statuses??[]).find(Te=>Te.id===m.status)?.label??m.status,oe=m.note===void 0||m.note===""?"":`(${m.note})`;return`${D} · ${Ke(m.at)}${oe}`}).join(" → ")||"无"))),e("div",{className:"ds-sec",style:Pe("discuss")},e("div",{className:"ds-sec-head"},`评论(${He})`,e("span",{className:"ds-hint"},"最新的在最上面")),He===0?e("div",{className:"ds-empty"},"还没有评论。在下面输入,或用 @专家名 直接点名派活。"):H===null?e("div",{className:"ds-hint",style:{padding:"8px 2px"}},"载入评论…"):e("div",{className:"ds-comments"},H.slice().reverse().map(m=>{const D=h.config?.experts??[],oe=D.find(Yt=>Yt.name===m.author)??D.find(Yt=>m.author!==void 0&&m.author!==""&&(Yt.name.includes(m.author)||m.author.includes(Yt.name)))??D.find(Yt=>m.author===(Fa[Yt.role]??"")),Te=/产品|架构|研发|开发|测试|运维|专家/.test(String(m.author??"")),Re=m.kind==="human"?!0:m.kind==="agent"?!1:!(oe!==void 0||Te),ta=Re?m.author===void 0||m.author===""||m.author==="人"?"我":m.author:oe?.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":Re?"human":"agent","data-role":oe?.role??""},e("div",{className:"ds-cm-avatar"},Re?e("span",{className:"ds-cm-initial"},ta.slice(0,1)):oe?.emoji??"🤖"),e("div",{className:"ds-cm-main"},e("div",{className:"ds-cm-head"},e("span",{className:"ds-cm-name"},ta),e("span",{className:"ds-cm-kind"},Re?"我提出":"AI 回复"),oe!==void 0&&oe.domain!==""?e(f,{className:"ds-chip","data-role":oe.role},oe.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),ga(m=>m===null||m.inline?{query:"",from:null,inline:!1}:null)}},$t===null?`@ 提到谁(${Lt.length})`:"收起名单"),e("span",{className:"ds-hint"},"也可以在输入框里直接打「@」搜")),$t!==null?e(k,{roster:Lt,query:$t.query,active:Dn,onActive:La,onQuery:m=>{ga(D=>D===null?{query:m,from:null,inline:!1}:{...D,query:m}),La(0)},onPick:J,onClose:()=>ga(null)}):null,e("div",{className:"ds-composer"},e(p,{className:"ds-textarea",style:{minHeight:58},placeholder:"支持 Markdown:`# 标题`、`**粗体**`、`` `代码` ``、``` 代码块 ```、`- 列表`、`| 表格 |`;打「@」选专家派活。",value:F,onFocus:()=>Ge("discuss"),onChange:m=>{W(m.target.value),On(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(!($t===null||$t.inline!==!0))if(m.key==="ArrowDown"||m.key==="ArrowUp"){if(m.preventDefault(),Mt.length===0)return;La(D=>(D+(m.key==="ArrowDown"?1:-1)+Mt.length)%Mt.length)}else m.key==="Enter"&&Mt.length>0?(m.preventDefault(),J(Mt[Math.min(Dn,Mt.length-1)].name)):m.key==="Escape"&&(m.preventDefault(),ga(null))}}),e("div",{className:"ds-composer-bar"},e("span",{className:"ds-hint"},"Markdown 可用 · 打 @ 派活 · Ctrl/⌘+Enter 发送"),e("span",{className:"ds-composer-count"},F.trim()===""?"还没写":`${F.length} 字`),e("button",{className:"ds-btn ds-btn-primary",disabled:C||F.trim()==="",onClick:()=>void ge()},C?"发送中…":"发表评论")),L!==null?e("span",{className:"ds-ok"},L):null,_!==null?e("span",{className:"ds-err"},_):null))))}return g}const of=(e,t)=>e.length>t?e.slice(0,t-1)+"…":e;function nd(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:["专家",Fa[n.role]??n.role??"",n.domain??""].filter(Boolean).join(" · "),search:[n.name,n.id,n.domain,n.description,Fa[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"}],sd=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:sd.get("new-requirement"),label:"新建需求",hint:"需求 → 功能点 → 拆成卡",keys:"新建 需求 new requirement 提需求"},{id:"new-task",shortcut:sd.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:sd.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 rd="dsh-studio:recent-actions",$x=6;function Tx(){try{globalThis.localStorage?.removeItem(rd)}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(),...nd(e)]}function Yo(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:"操作"},Qo={"card-advance":{step:"card",title:"推进到下一列"},"card-advance-note":{step:"card",title:"推进并留言"},"card-dispatch":{step:"card",title:"派给专家"},"card-comment":{step:"card",title:"给卡片留言"},"column-advance":{step:"column",title:"整列推进"}};function 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),[w,y]=t.useState(()=>{try{const $=window.localStorage.getItem(rd),B=$===null?[]:JSON.parse($);return Array.isArray(B)?B.filter(ee=>typeof ee=="string"):[]}catch{return[]}}),k=$=>{if($==null||$.kind!=="action")return;const B=Px(w,$.id);y(B);try{window.localStorage.setItem(rd,JSON.stringify(B))}catch{}},g=t.useRef(null),d=t.useMemo(()=>_x(n),[n]),h=t.useMemo(()=>nd(n).filter($=>$.kind==="task"),[n]),b=t.useMemo(()=>nd(n).filter($=>$.kind==="expert"),[n]),S=t.useMemo(()=>(n.statuses??[]).map($=>({key:"column:"+$.id,kind:"column",id:$.id,label:$.label,hint:(n.tasks??[]).filter(B=>B.status===$.id).length+" 张卡",search:String($.label??"").toLowerCase()})),[n.statuses,n.tasks]),C=t.useMemo(()=>f===null?Ex(Yo(d,l),l===""?w:[]):f.step==="expert"?Yo(b,l):f.step==="column"?Yo(S,l):Yo(h,l),[f,d,h,S,b,l,w]);t.useEffect(()=>{g.current?.focus()},[]),t.useEffect(()=>{if(o==null)return;const $=d.find(B=>B.id===o);if($!==void 0){if($.kind==="action"&&Qo[$.id]!==void 0){E($.id);return}r($),s()}},[i]),t.useEffect(()=>{p(0)},[l]);const E=$=>{v({action:$,step:Qo[$].step}),c(""),p(0)},_=$=>{if($!==void 0){if(f===null){if($.id==="clear-recents"){Tx(),s();return}if(k($),$.kind==="action"&&Qo[$.id]!==void 0){E($.id);return}r($),s();return}if(f.step==="column"){r({kind:"run",action:f.action,columnId:$.id}),s();return}if(f.step==="card"){if(f.action==="card-dispatch"){v({action:f.action,cardId:$.id,step:"expert"}),c(""),p(0);return}r({kind:"run",action:f.action,cardId:$.id}),s();return}r({kind:"run",action:f.action,cardId:f.cardId,expertId:$.id}),s()}},I=()=>{if(f===null){s();return}v(f.step==="expert"?{action:f.action,step:"card"}:null),c(""),p(0)},F=$=>{if($.key==="Escape"){$.preventDefault(),I();return}if($.key==="ArrowDown"){$.preventDefault(),p(B=>Math.min(C.length-1,B+1));return}if($.key==="ArrowUp"){$.preventDefault(),p(B=>Math.max(0,B-1));return}$.key==="Enter"&&($.preventDefault(),_(C[u]))},W=f===null?"搜索卡片 / 需求 / 版本 / 专家 / 技能,或输入「新建」「导出」「推进」(↑↓ 选择,回车执行,Esc 关闭)":f.step==="expert"?"选一位专家(输入过滤,Esc 返回)":f.step==="column"?"选一列(输入过滤,Esc 返回)":"选一张卡片(输入过滤,Esc 返回)",L=f===null?null:e("div",{className:"ds-palette-flow","data-flow":f.step},Qo[f.action].title+(f.step==="expert"?" → 选一位专家":f.step==="column"?" → 选一列":" → 选一张卡片"));return e("div",{className:"ds-palette-veil",onClick:s},e("div",{className:"ds-palette",role:"dialog","aria-label":"全局搜索","data-palette":"1",onClick:$=>$.stopPropagation()},L,e("input",{ref:g,className:"ds-palette-input",placeholder:W,value:l,onChange:$=>c($.target.value),onKeyDown:F,"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(($,B)=>e("div",{key:$.key,className:"ds-palette-item","data-active":B===u?"1":"0",onMouseEnter:()=>p(B),onClick:()=>_($)},e("span",{className:"ds-palette-kind","data-kind":$.kind},Ix[$.kind]??$.kind),e("span",{className:"ds-palette-label"},of($.label,80)),$.hint===""?null:e("span",{className:"ds-palette-hint"},of(($.kind==="action"&&l===""&&w.includes($.id)?"最近用过 · ":"")+$.hint,40)),$.shortcut===void 0||$.shortcut===null?null:e("span",{className:"ds-palette-key",title:"全局快捷键"},$.shortcut))))))}}let od=null;function Ox(e){od=e}function bt(){if(od===null)throw new Error("studio client context is not ready");return od}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:w,SideDrawer:y}=bt(),k=e.experts??[],[g,d]=n.useState(null),[h,b]=n.useState(null),[S,C]=n.useState(!1),E=["🧩","📋","🏛️","🛠️","🧪","🔍","🛡️","⚙️","📦","💰","💳","📊","📈","🧠","🤖","🧭","🎯","🚀","🧱","🔧","🧰","🧮","📝","📚","🗂️","🔐","🌐","☁️","🗄️","🧬","🩺","⚖️"],_=["product","architect","dev","qa"],[I,F]=n.useState(()=>{const Y=e.roles??{},H={};for(const R of _)H[R]={label:String(Y[R]?.label??""),model:String(Y[R]?.model??""),prompt:String(Y[R]?.prompt??"")};return H}),[W,L]=n.useState(null),$=async()=>{C(!0),b(null),L(null);try{await s("/config",{roles:I}),L("角色模板已保存"),o("角色模板已保存"),await t()}catch(Y){b(Y instanceof Error?Y.message:String(Y))}finally{C(!1)}},B=async()=>{if(g!==null){C(!0),b(null);try{await s("/experts/save",{expert:g}),d(null),await t()}catch(Y){b(Y instanceof Error?Y.message:String(Y))}finally{C(!1)}}},ee=async Y=>{if(await i(`删除专家「${Y.name}」?已用它派的单会保留历史评论。`,{title:"删除专家",danger:!0,okText:"删除"})){C(!0),b(null);try{await s("/experts/delete",{id:Y.id}),await t()}catch(H){b(H instanceof Error?H.message:String(H))}finally{C(!1)}}},M=(Y,H)=>d({...g,[Y]:H}),[O,A]=n.useState(""),[x,P]=n.useState([]);n.useEffect(()=>{let Y=!0;return s("/skills").then(H=>{Y&&P(H.skills??[])}).catch(()=>{}),()=>{Y=!1}},[]);const G=Y=>{const H=g.skills??[];M("skills",H.includes(Y)?H.filter(R=>R!==Y):[...H,Y])},[te,q]=n.useState(""),K=()=>{const Y=te.trim();if(Y===""||g===null)return;const H=g.skills??[];H.includes(Y)||M("skills",[...H,Y]),q("")},ke=async()=>{const Y=O.trim();if(Y.length!==0){C(!0),b(null);try{const H=[{role:"product",name:"产品经理",emoji:"📋",prompt:`你是${Y}业务的产品经理。
|
|
21
21
|
先读 docs/ 与本领域的历史工单,再动手。
|
|
22
|
-
需求写清:目标用户、主流程、异常路径、验收口径。`},{role:"architect",name:"架构师",emoji:"🏛️",prompt:`你是${
|
|
22
|
+
需求写清:目标用户、主流程、异常路径、验收口径。`},{role:"architect",name:"架构师",emoji:"🏛️",prompt:`你是${Y}业务的架构师。
|
|
23
23
|
方案必须给出:数据模型、接口契约、失败与回滚、性能与容量估算。
|
|
24
|
-
不确定就去代码里找证据。`},{role:"dev",name:"开发工程师",emoji:"🛠️",prompt:`你是${
|
|
25
|
-
改动要小步可验证,跑测试,写清改动的文件与风险。`},{role:"qa",name:"测试工程师",emoji:"🧪",prompt:`你是${
|
|
26
|
-
按边界值、异常流、并发与幂等设计用例,列出实际执行结果。`}];for(const
|
|
24
|
+
不确定就去代码里找证据。`},{role:"dev",name:"开发工程师",emoji:"🛠️",prompt:`你是${Y}业务的开发工程师。
|
|
25
|
+
改动要小步可验证,跑测试,写清改动的文件与风险。`},{role:"qa",name:"测试工程师",emoji:"🧪",prompt:`你是${Y}业务的测试工程师。
|
|
26
|
+
按边界值、异常流、并发与幂等设计用例,列出实际执行结果。`}];for(const R of H)await s("/experts/save",{expert:{name:`${Y}${R.name}`,emoji:R.emoji,role:R.role,domain:Y,description:`负责${Y}业务线的${R.name}工作`,prompt:R.prompt,model:"",preset:"",enabled:!0}});A(""),await t()}catch(H){b(H instanceof Error?H.message:String(H))}finally{C(!1)}}},pe=Y=>{const H=String(Y??"").trim();if(H==="")return"";const R=H.replace(/\s*\n\s*/g," / ");return R.length>96?`${R.slice(0,96)}…`:R},xe=k.map(Y=>a("div",{className:"ds-listrow",key:Y.id},a("div",{className:"ds-listrow-main"},a("div",{},`${Y.emoji} ${Y.name}`,Y.domain?a(f,{className:"ds-chip"},Y.domain):null,Y.enabled===!1?a("span",{className:"ds-hint"}," (已停用)"):null),a("div",{className:"ds-hint"},`${Y.model||"跟随默认模型"}${Y.description?" · "+Y.description:""}`),pe(Y.prompt)===""?a("div",{className:"ds-hint","data-empty":"1"},"提示词:还没有写,会退回内置角色说明(点「编辑」补上)"):a("div",{className:"ds-hint","data-prompt":"1",title:String(Y.prompt??""),style:{cursor:"pointer"},onClick:()=>d({...Y})},`提示词:${pe(Y.prompt)}`),(Y.skills??[]).length>0?a("div",{className:"ds-hint"},`技能:${Y.skills.join("、")}`):null),a("div",{className:"ds-listrow-actions"},l("编辑这位专家",a("button",{className:"ds-btn",disabled:S,onClick:()=>d({...Y})},"编辑")),l("删除这位专家",a("button",{className:"ds-btn",disabled:S,onClick:()=>void ee(Y),"data-danger":"1"},"删除")))));return a("div",{className:"ds-pane-stack"},a("div",{className:"ds-panel",style:{marginBottom:12}},a("div",{className:"ds-panel-head"},"角色模板",a("span",{className:"ds-hint",style:{marginLeft:"auto"}},"新建专家时套用;改这里不影响已有专家")),a("div",{className:"ds-panel-body"},_.map(Y=>a("div",{key:Y,className:"ds-field"},a("div",{className:"ds-row",style:{gap:8,alignItems:"center"}},a(u,{className:"ds-input",style:{width:120},placeholder:"角色名",value:I[Y].label,onChange:H=>F({...I,[Y]:{...I[Y],label:H.target.value}})}),a(u,{className:"ds-input",style:{flex:1},placeholder:"模型 id,如 deepseek-v4.1-flash",value:I[Y].model,onChange:H=>F({...I,[Y]:{...I[Y],model:H.target.value}})})),a(p,{className:"ds-input",rows:2,placeholder:"角色提示词(留空退回内置说明)",value:I[Y].prompt,onChange:H=>F({...I,[Y]:{...I[Y],prompt:H.target.value}})}))),a("div",{className:"ds-row",style:{justifyContent:"flex-end"}},a("button",{className:"ds-btn ds-btn-primary",disabled:S,onClick:()=>void $()},"保存角色模板")),W===null?null:a("div",{className:"ds-ok"},W))),a(r,{title:"专家(可在评论里 @ 他们)",hint:"每个专家有名字、业务领域、角色提示词和技能;评论里 @名字 就会把这条工作派给他。",rows:xe,onAdd:()=>d({id:"",name:"",emoji:"🧩",role:"",domain:"",description:"",prompt:"",skills:[],model:"",preset:"",sandbox:"",enabled:!0}),addLabel:"新增专家",render:Y=>Y,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:O,placeholder:"支付 / 风控 / 会员",onChange:Y=>A(Y.target.value)}),a("button",{className:"ds-btn",disabled:S||O.trim().length===0,onClick:()=>void ke()},"生成产品/架构/研发/测试"),h!==null?a("span",{className:"ds-error"},h):null),g===null?null:a(y,{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 B()},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:Y=>M("name",Y.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(Y=>a("button",{key:Y,type:"button",className:"ds-emoji","data-on":g.emoji===Y?"1":"0",title:Y,onClick:()=>M("emoji",Y)},Y))),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:Y=>M("emoji",Y.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:Y=>M("description",Y.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(w,{className:"ds-select",value:g.role??"",onChange:Y=>M("role",Y.target.value)},a("option",{value:""},"不限"),["product","architect","dev","qa"].map(Y=>a("option",{key:Y,value:Y},Fa[Y]??Y))),a("div",{className:"ds-hint"},"决定默认接哪一列")),a("div",{className:"ds-field",style:{flex:1}},c("业务领域","「按专长匹配」看这里:领域相同的卡优先派给它"),a(u,{className:"ds-input",value:g.domain??"",placeholder:"支付 / 风控 / 会员(选填)",onChange:Y=>M("domain",Y.target.value)}),a("div",{className:"ds-hint"},"同一张卡会优先派给同领域的专家"))),a("div",{className:"ds-field"},a("div",{className:"ds-label"},`技能(从技能库勾选 · 已选 ${(g.skills??[]).length} 项)`),x.length>0?a("div",{className:"ds-skillbox"},x.map(Y=>{const H=(g.skills??[]).includes(Y.name),R=k.filter(ne=>(ne.skills??[]).includes(Y.name)).length;return a("label",{key:Y.name,className:"ds-skillopt","data-on":H?"1":"0",title:String(Y.description??"")},a(v,{checked:H,onChange:()=>G(Y.name)}),a("span",{className:"ds-skillname"},Y.name),a("span",{className:"ds-skilldesc"},String(Y.description??"").slice(0,46)),R>0?a("span",{className:"ds-skillusers"},`${R} 位在用`):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:te,placeholder:"技能库以外的技能名,例如 lark-doc、office-xlsx(回车或点「加上」)",onChange:Y=>q(Y.target.value),onKeyDown:Y=>{Y.key==="Enter"&&(Y.preventDefault(),K())}}),a("button",{className:"ds-btn",onClick:()=>K()},"加上")),(g.skills??[]).filter(Y=>!x.some(H=>H.name===Y)).length>0?a("div",{className:"ds-row",style:{flexWrap:"wrap",gap:6,marginTop:6,alignItems:"center"}},a("span",{className:"ds-hint"},"不在技能库(仍会写进提示词):"),(g.skills??[]).filter(Y=>!x.some(H=>H.name===Y)).map(Y=>a(f,{key:Y,className:"ds-chip","data-missing":"1"},Y,a("button",{className:"ds-chip-x",title:"移除",onClick:()=>M("skills",(g.skills??[]).filter(H=>H!==Y))},"×")))):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:Y=>M("model",Y.target.value)})),a("div",{className:"ds-field",style:{flex:1}},c("Agent 预设","预设决定这个专家能用哪些工具、以什么身份干活(如 standard、架构师)"),a(u,{className:"ds-input",value:g.preset,placeholder:"standard",onChange:Y=>M("preset",Y.target.value)})),a("div",{className:"ds-field",style:{flex:1}},c("沙箱档位","read-only 只能看;workspace-write 能改工作区;danger-full-access 不做限制"),a(w,{className:"ds-input",value:g.sandbox??"",onChange:Y=>M("sandbox",Y.target.value)},[["","跟随全局"],["read-only","只读"],["workspace-write","只写工作区"],["danger-full-access","无沙箱"]].map(([Y,H])=>a("option",{key:Y,value:Y},H))),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=>z("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=>z("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:w,SideDrawer:y}=bt(),k=e.teams??[],g=e.experts??[],[d,h]=n.useState(null),[b,S]=n.useState(null),[C,E]=n.useState(!1),[_,I]=n.useState({});n.useEffect(()=>{let q=!0;return s("/team/memory",{}).then(L=>{q&&I(L?.memory??{})}).catch(()=>{}),()=>{q=!1}},[e.teams]);const z=async q=>{if(await i("清空「"+q.name+"」的团队记忆?",{title:"清空团队记忆",danger:!0,okText:"清空"}))try{const L=await s("/team/memory/clear",{teamId:q.id});I(L?.memory??{}),o("已清空这个团的记忆")}catch(L){S(L instanceof Error?L.message:String(L))}},H=q=>{const L=g.find(A=>A.id===q);return L===void 0?q:`${L.emoji} ${L.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)}}},$=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(L){S(L instanceof Error?L.message:String(L))}finally{E(!1)}}},B=(q,L)=>h({...d,[q]:L}),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 z(q)},"清空记忆")),l("编辑这个专家团",a("button",{className:"ds-btn",disabled:C,onClick:()=>h({...q})},"编辑")),l("删除这个专家团",a("button",{className:"ds-btn",disabled:C,onClick:()=>void $(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(y,{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)},"取消"),b!==null?a("span",{key:"error",className:"ds-error ds-side-note"},b):null]},a("div",{className:"ds-field"},a("div",{className:"ds-label"},"团名(@ 用这个名字)"),a(u,{className:"ds-input",value:d.name,placeholder:"需求交付组",onChange:q=>B("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=>B("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:L=>B("members",L.target.checked?[...d.members??[],q.id]:(d.members??[]).filter(A=>A!==q.id))}),a("span",{},`${q.emoji} ${q.name}`))))),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"团长(负责拆活和汇总)"),a(w,{className:"ds-input",value:d.lead??"",onChange:q=>B("lead",q.target.value)},a("option",{value:""},"自动(第一个成员)"),(d.members??[]).map(q=>a("option",{key:q,value:q},H(q)))))))}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:w,SideDrawer:y}=bt(),k=e.testing??{},g=Array.isArray(k.envs)?k.envs:[],[d,h]=n.useState(null),[b,S]=n.useState((Array.isArray(k.allowHosts)?k.allowHosts:[]).join(", ")),[C,E]=n.useState(String(k.timeoutMs??15e3)),[_,I]=n.useState(!1),[z,H]=n.useState(null),[M,$]=n.useState(null),[B,J]=n.useState({allowShell:k.allowShell===!0,allowDb:k.allowDb===!0}),[q,L]=n.useState({casesPerTask:e.limits?.casesPerTask??60,runKeys:e.limits?.runKeys??60,artifactsPerTask:e.limits?.artifactsPerTask??40}),[A,x]=n.useState(()=>(Array.isArray(e.webhooks)?e.webhooks:[]).map(ae=>({...ae}))),P=async ae=>{J(ae),I(!0),$(null);try{await s("/config",{testing:{...k,allowShell:ae.allowShell,allowDb:ae.allowDb}}),$("已保存"),await t()}catch(F){H(F instanceof Error?F.message:String(F))}finally{I(!1)}},K=async()=>{I(!0),$(null);try{await s("/config",{limits:q}),$("上限已保存"),o("上限已保存"),await t()}catch(ae){H(ae instanceof Error?ae.message:String(ae))}finally{I(!1)}},R=async()=>{I(!0),$(null);try{await s("/config",{webhooks:A.filter(ae=>String(ae.url??"").trim()!=="")}),$("webhook 已保存"),o("webhook 已保存"),await t()}catch(ae){H(ae instanceof Error?ae.message:String(ae))}finally{I(!1)}},O=async ae=>{I(!0),H(null),$(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}}),$("已保存"),o("已保存"),await t()}catch(F){H(F instanceof Error?F.message:String(F))}finally{I(!1)}},G=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 O({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 O({envs:F,defaultEnv:k.defaultEnv===ae.id?F[0]?.id??"":k.defaultEnv})},fe=async()=>{const ae=b.split(/[,,\s]+/).map(te=>te.trim()).filter(te=>te!==""),F=Number(C);await O({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 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:B.allowShell,disabled:_,onChange:ae=>void P({...B,allowShell:ae.target.checked})}),a("span",{className:"ds-check-text"},"允许 shell 用例(能在宿主机执行命令)")),a("label",{className:"ds-check",style:{marginTop:6}},a(v,{checked:B.allowDb,disabled:_,onChange:ae=>void P({...B,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=>L({...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=>L({...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=>L({...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 K()},"保存上限")))),a("div",{className:"ds-panel"},a("div",{className:"ds-panel-head"},"出站 webhook",a("button",{className:"ds-btn ds-btn-ghost",disabled:_,onClick:()=>x(ae=>[...ae,{url:"",events:["task/moved"],enabled:!0}])},"+ 加一个")),a("div",{className:"ds-panel-body"},A.length===0?a("div",{className:"ds-empty"},"还没有 webhook。配一个就能把卡片流转、用例失败、门禁拦截推给 CI / IM / 工单系统。"):A.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=>x(xe=>xe.map((X,ie)=>ie===F?{...X,url:te.target.value}:X))}),a(v,{checked:ae.enabled!==!1,onChange:te=>x(xe=>xe.map((X,ie)=>ie===F?{...X,enabled:te.target.checked}:X))}),a("button",{className:"ds-btn ds-btn-ghost",disabled:_,onClick:()=>x(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=>x(X=>X.map((ie,ge)=>ge===F?{...ie,events:xe.target.checked?Array.from(new Set([...ie.events??[],te])):(ie.events??[]).filter(W=>W!==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))),A.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:b,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),z===null?null:a("div",{className:"ds-err"},z))))}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:w,SideDrawer:y}=bt(),k=e.feishu??{},[g,d]=n.useState(""),[h,b]=n.useState(String(k.escalateAfter??3)),[S,C]=n.useState(!1),[E,_]=n.useState(null),[I,z]=n.useState(null),H=async()=>{C(!0),_(null),z(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){z(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=>b(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 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:w,SideDrawer:y}=bt(),[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),[b,S]=n.useState(null),[C,E]=n.useState(null),[_,I]=n.useState(null),z=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(L=>L.map((A,x)=>x===J?{...A,...q}:A)),$=J=>g(q=>q.filter((L,A)=>A!==J)),B=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:L=>M(q,{name:L.target.value})})),a("div",{className:"ds-field",style:{flex:"0 0 120px"}},a("div",{className:"ds-label"},"类型"),a(w,{className:"ds-input",value:J.kind,onChange:L=>M(q,{kind:L.target.value})},["dev","staging","prod","other"].map(L=>a("option",{key:L,value:L},L)))),a("div",{className:"ds-field",style:{flex:2}},a("div",{className:"ds-label"},"说明"),a(u,{className:"ds-input",value:J.note,placeholder:"例如 上线前最后一关",onChange:L=>M(q,{note:L.target.value})})),a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>$(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 B()},d?"保存中…":"保存环境")),b===null?null:a("div",{className:"ds-ok"},b),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 z({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 z({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}=bt(),f=e.ldap??{},[v,w]=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)}),[y,k]=p.useState(!1),[g,d]=p.useState(!1),[h,b]=p.useState(null),[S,C]=p.useState(null),[E,_]=p.useState([]),I=e.localAuth??{},[z,H]=p.useState(""),[M,$]=p.useState(""),[B,J]=p.useState(!1),[q,L]=p.useState(null),[A,x]=p.useState(null),P=async()=>{J(!0),L(null),x(null);try{await r("/auth/password",{username:I.username,currentPassword:z,newPassword:M}),H(""),$(""),L("密码已更新"),t()}catch(G){x(G instanceof Error?G.message:String(G))}finally{J(!1)}},K=G=>w(we=>({...we,...G})),R=async()=>{d(!0),b(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??[]),b(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),b(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:""}),b(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:y,onClick:()=>void O()},y?"保存中…":"保存")),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:z,onChange:G=>H(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=>$(G.target.value)})),a("button",{className:"ds-btn",disabled:B||z===""||M.length<8,onClick:()=>void P()},B?"提交中…":"改密码")),q===null?null:a("div",{className:"ds-ok",style:{marginTop:6}},q),A===null?null:a("div",{className:"ds-error",style:{marginTop:6}},A)),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}=bt(),f=e.costs??{},[v,w]=p.useState(String(f.budgetRuns??500)),[y,k]=p.useState(String(f.budgetHours??80)),[g,d]=p.useState(String(f.warnAt??80)),[h,b]=p.useState(()=>Array.isArray(f.prices)?f.prices.map($=>({...$})):[]),S=async()=>{E(!0),I(null),H(null);try{const $=h.filter(B=>String(B.model??"").trim()!=="").map(B=>({model:String(B.model).trim(),input:Number(B.input)||0,output:Number(B.output)||0,cacheRead:Number(B.cacheRead)||0,cacheWrite:Number(B.cacheWrite)||0}));await r("/config",{costs:{budgetRuns:Number(f.budgetRuns??500),budgetHours:Number(f.budgetHours??80),warnAt:Number(f.warnAt??80),prices:$}}),b($),I("已保存:价目表 "+$.length+" 行"),await t()}catch($){H($ instanceof Error?$.message:String($))}finally{E(!1)}},[C,E]=p.useState(!1),[_,I]=p.useState(null),[z,H]=p.useState(null),M=async()=>{E(!0),I(null),H(null);try{const $=Number(v),B=Number(y),J=Number(g);if(!Number.isFinite($)||$<=0)throw new Error("预算次数要是正整数");if(!Number.isFinite(B)||B<=0)throw new Error("预算小时要是正整数");await r("/config",{costs:{budgetRuns:Math.round($),budgetHours:Math.round(B),warnAt:Number.isFinite(J)?Math.min(100,Math.max(10,Math.round(J))):80,prices:h}}),I("已保存:预算"),await t()}catch($){H($ instanceof Error?$.message:String($))}finally{E(!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:$=>w($.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"每月机上时长上限(小时)"),a(l,{className:"ds-input",value:y,onChange:$=>k($.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"警告阈值(百分比)"),a(l,{className:"ds-input",value:g,onChange:$=>d($.target.value)})),a("div",{className:"ds-field ds-span"},a("div",{className:"ds-hint"},'效能页的「AI 执行成本」会显示真实 token 用量(读 studio-* 会话日志)。要显示钱就在 config.costs.prices 里配价目表:[{ "model": "deepseek-v4.1-flash", "input": 2, "output": 8, "cacheRead": 0.2 }],单位是元 / 百万 token;没配价目的调用记「未知」,不按 0 算。')),a("div",{className:"ds-field ds-span"},a("div",{className:"ds-label"},"价目表(元 / 百万 token)"),h.length===0?a("div",{className:"ds-hint"},"还是空的:只统计 token,不算钱。点「+ 加一行」把常见模型的价格填进来。"):h.map(($,B)=>a("div",{className:"ds-row",key:B,style:{gap:6,alignItems:"center",marginTop:6,flexWrap:"wrap"}},a(l,{className:"ds-input",style:{flex:"2 1 180px"},placeholder:"模型 id,如 deepseek-v4.1-flash",value:$.model??"",onChange:J=>b(q=>q.map((L,A)=>A===B?{...L,model:J.target.value}:L))}),a(l,{className:"ds-input",style:{flex:"1 1 70px"},placeholder:"输入",value:String($.input??""),onChange:J=>b(q=>q.map((L,A)=>A===B?{...L,input:Number(J.target.value)||0}:L))}),a(l,{className:"ds-input",style:{flex:"1 1 70px"},placeholder:"输出",value:String($.output??""),onChange:J=>b(q=>q.map((L,A)=>A===B?{...L,output:Number(J.target.value)||0}:L))}),a(l,{className:"ds-input",style:{flex:"1 1 70px"},placeholder:"缓存读",value:String($.cacheRead??""),onChange:J=>b(q=>q.map((L,A)=>A===B?{...L,cacheRead:Number(J.target.value)||0}:L))}),a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>b(J=>J.filter((q,L)=>L!==B))},"×"))),a("div",{className:"ds-row",style:{gap:8,marginTop:8,justifyContent:"flex-end"}},a("button",{className:"ds-btn",disabled:C,onClick:()=>b($=>[...$,{model:"",input:0,output:0,cacheRead:0,cacheWrite:0}])},"+ 加一行"),a("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void S()},C?"保存中…":"保存价目表"))),a("div",{className:"ds-row",style:{justifyContent:"flex-end"}},a("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void M()},C?"保存中…":"保存预算")),_===null?null:a("div",{className:"ds-ok"},_),z===null?null:a("div",{className:"ds-err"},z)))}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}=bt(),f=e.projects??[],v=e.gitlab?.projects??[],[w,y]=p.useState(null),[k,g]=p.useState(null),[d,h]=p.useState(null),[b,S]=p.useState(!1),[C,E]=p.useState({name:"",start:"",due:"",status:"planned"}),_=async()=>{if(w!==null){S(!0),g(null),h(null);try{await r("/projects/save",{project:{...w,iterations:w.iterations??[]}}),h("已保存"),s("已保存"),await t()}catch(x){g(x instanceof Error?x.message:String(x))}finally{S(!1)}}},I=async x=>{if(await o(`删除项目「${x.name}」?卡片会保留,但不再归属任何项目。`,{title:"删除项目",danger:!0,okText:"删除"})){S(!0),g(null);try{await r("/projects/delete",{id:x.id}),y(null),await t()}catch(P){g(P instanceof Error?P.message:String(P))}finally{S(!1)}}},z=async x=>{if(C.name.trim()!==""){S(!0),g(null);try{await r("/projects/iteration",{project:x.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(P){g(P instanceof Error?P.message:String(P))}finally{S(!1)}}},H=async(x,P)=>{S(!0),g(null);try{await r("/projects/iteration",{project:x.id,action:"remove",iteration:P.id}),await t()}catch(K){g(K instanceof Error?K.message:String(K))}finally{S(!1)}},M=(x,P)=>y({...w,[x]:P}),$=(x,P,K)=>y({...w,services:(w.services??[]).map((R,O)=>O===x?{...R,[P]:K}:R)}),B=()=>y({...w,services:[...w.services??[],{id:"",name:"",repoId:"",repoPath:"",baseBranch:w.baseBranch||"main",dependsOn:[]}]}),J=x=>y({...w,services:(w.services??[]).filter((P,K)=>K!==x)}),q=w===null?[]:w.services??[],L=(x,P)=>y({...w,services:(w.services??[]).map((K,R)=>{if(R!==x)return K;const O=Array.isArray(K.dependsOn)?K.dependsOn:[];return{...K,dependsOn:O.includes(P)?O.filter(G=>G!==P):[...O,P]}})}),A=f.map(x=>a("div",{className:"ds-listrow",key:x.id},a("div",{className:"ds-listrow-main"},a("div",{},`${x.key?`[${x.key}] `:""}${x.name} · ${Xl[x.status]??x.status}${x.lead?` · 负责人 ${x.lead}`:""}`),a("div",{className:"ds-hint"},`${(e.projects??[]).find(P=>P.id===x.id)?.iterations?.length??0} 个迭代 · ${(x.services??[]).length} 个服务${(()=>{const P=(x.services??[]).reduce((K,R)=>K+(R.dependsOn??[]).length,0);return P>0?` · ${P} 条依赖`:""})()}${x.description?` · ${x.description}`:""}`)),a("div",{className:"ds-listrow-actions"},i("改项目信息、加迭代",a("button",{className:"ds-btn",disabled:b,onClick:()=>y({...x})},"编辑 / 迭代")),i("删除这个项目(卡不会删)",a("button",{className:"ds-btn",disabled:b,onClick:()=>void I(x),"data-danger":"1"},"删除")))));return a("div",{className:"ds-pane-stack"},a(n,{title:"业务项目(一个项目可以挂很多张卡和很多个迭代)",hint:"项目是看板的第一层分组:卡片挂项目,项目下面划迭代,看板可按项目和迭代筛选,项目页签看每个项目的体检数据。",rows:A,onAdd:()=>y({id:"",name:"",key:"",description:"",lead:"",status:"active",repos:[],services:[],iterations:[]}),addLabel:"新增项目",render:x=>x,empty:"还没有项目。团队只跑一个产品也可以先不建,直接在看板上干活。"}),d!==null?a("div",{className:"ds-ok",style:{marginBottom:8}},d):null,w===null?null:a("div",{className:"ds-panel ds-form-panel"},a("div",{className:"ds-panel-head"},w.id?`编辑项目:${w.name||w.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:w.key??"",placeholder:"ORD",onChange:x=>M("key",x.target.value)})),a("div",{className:"ds-field",style:{flex:2}},a("div",{className:"ds-label"},"项目名"),a(l,{className:"ds-input",value:w.name??"",placeholder:"订单中心",onChange:x=>M("name",x.target.value)})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"状态"),a(u,{className:"ds-select",value:w.status??"active",onChange:x=>M("status",x.target.value)},Object.keys(Xl).map(x=>a("option",{key:x,value:x},Xl[x])))),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"业务负责人"),a(l,{className:"ds-input",value:w.lead??"",placeholder:"张伟",onChange:x=>M("lead",x.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:w.repoPath??"",placeholder:"~/repos/order-center",onChange:x=>M("repoPath",x.target.value)})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"基线分支"),a(l,{className:"ds-input",value:w.baseBranch??"",placeholder:"main",onChange:x=>M("baseBranch",x.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((x,P)=>{const K=q.filter((R,O)=>O!==P&&String(R.id??"").trim()!=="");return a("div",{key:`${x.id}-${P}`,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:x.name??"",placeholder:"order-service",onChange:R=>$(P,"name",R.target.value)})),a("div",{className:"ds-field",style:{flex:3}},a("div",{className:"ds-label"},"本机 git 路径"),a(l,{className:"ds-input",value:x.repoPath??"",placeholder:"~/repos/order-service",onChange:R=>$(P,"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:x.baseBranch??"",placeholder:"main",onChange:R=>$(P,"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:x.repoId??"",onChange:R=>$(P,"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(P),"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":(x.dependsOn??[]).includes(R.id)?"1":"0",title:`依赖 ${R.name||R.id}`,onClick:()=>L(P,R.id)},R.name||R.id))))}),a("div",{className:"ds-row",style:{gap:8}},a("button",{className:"ds-btn",type:"button",onClick:()=>B()},"+ 加一个服务"),a("span",{className:"ds-hint"},"服务名会被写进任务详情;worktree 从该服务的 git 路径切 task/<编号> 分支。"))),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"项目说明"),a(l,{className:"ds-input",value:w.description??"",placeholder:"这个项目做什么、给谁用",onChange:x=>M("description",x.target.value)})),a("div",{className:"ds-row",style:{gap:8}},a("button",{className:"ds-btn ds-btn-primary",disabled:b,onClick:()=>void _()},b?"保存中…":"保存项目"),a("button",{className:"ds-btn",disabled:b,onClick:()=>y(null)},"取消")))),w===null||w.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"},(w.iterations??[]).length===0?a("div",{className:"ds-empty"},"还没有迭代。可以先加一个「2026-11 迭代」。"):(w.iterations??[]).map(x=>a("div",{className:"ds-listrow",key:x.id},a("div",{className:"ds-listrow-main"},a("div",{},`${x.name} · ${Zl[x.status]??x.status}`),a("div",{className:"ds-hint"},`${x.start?new Date(x.start).toISOString().slice(0,10):"未定开始"} → ${x.due?new Date(x.due).toISOString().slice(0,10):"未定结束"}`)),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn ds-btn-ghost",disabled:b,onClick:()=>void H(w,x)},"×")))),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:x=>E({...C,name:x.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:x=>E({...C,start:x.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:x=>E({...C,due:x.target.value})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"状态"),a(u,{className:"ds-select",value:C.status,onChange:x=>E({...C,status:x.target.value})},Object.keys(Zl).map(x=>a("option",{key:x,value:x},Zl[x])))),a("button",{className:"ds-btn",disabled:b||C.name.trim()==="",onClick:()=>void z(w)},"+ 加迭代")),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}=bt(),w=t.access??{enabled:!1,members:[]},y=e.audit??[],[k,g]=v.useState({name:"",role:"member"}),[d,h]=v.useState(!1),[b,S]=v.useState(null),[C,E]=v.useState(""),[_,I]=v.useState(!1),[z,H]=v.useState(""),M=async(x,P)=>{h(!0),S(null);try{await s(x,P),await a()}catch(K){{const R=K instanceof Error?K.message:String(K);S(R),o(R,"error")}}finally{h(!1)}},$=async()=>{const x=k.name.trim();x!==""&&(await M("/access/save",{member:{name:x,role:k.role}}),g({name:"",role:"member"}))},B=Array.from(new Set(y.map(x=>x.by))).sort(),J=z.trim().toLowerCase(),q=y.filter(x=>(C===""||x.by===C)&&(_===!1||x.ok===!1)&&(J===""||`${ROUTE_LABEL[x.route]??x.route} ${x.by} ${x.summary}`.toLowerCase().includes(J))),L=q.slice(0,120),A=()=>{const x=new URLSearchParams({by:C,q:z.trim(),failed:_?"1":"0",token:r()??""}),P=document.createElement("a");P.href=`${API}/audit/export.csv?${x.toString()}`,P.rel="noopener",document.body.appendChild(P),P.click(),document.body.removeChild(P),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:w.enabled===!0,disabled:d,onChange:x=>void M("/access/save",{enabled:x.target.checked})}),n("span",null,"启用成员权限")),n("span",{className:"ds-hint"},w.enabled===!0?"已启用:写操作要认人,删除/配置/发布要管理员。":"未启用:任何人都是管理员(单机用法)。")),w.enabled===!0&&(w.members??[]).length===0?n("div",{className:"ds-error"},"已启用但名单是空的:除了名单里的人,其他人都动不了。先把你自己加进去。"):null,w.enabled===!0?n("label",{className:"ds-check"},n(p,{checked:(w.agents??"inherit")==="inherit",disabled:d,onChange:x=>void M("/access/save",{agents:x.target.checked?"inherit":"bypass"})}),n("span",null,"AI 专家也受这份名单约束")):null,w.enabled===!0?n("div",{className:"ds-hint"},(w.agents??"inherit")==="inherit"?"专家调工具时按同一张名单判权限:只读专家只能看,成员能干活,管理员才能改配置。名单里没有的专家会被拦下,记得在下面加进去。":"已豁免:专家调用工具不受名单限制,但仍记审计。适合「全交给 AI」的团队。"):null,(w.members??[]).map(x=>n("div",{key:x.name,className:"ds-listrow"},n("div",{className:"ds-listrow-main"},n("div",null,x.name,x.name===i()?n(u,{className:"ds-chip ds-chip-soft"},"我"):null),n("div",{className:"ds-hint"},(ACCESS_ROLE_OPTIONS.find(P=>P.id===x.role)??ACCESS_ROLE_OPTIONS[1]).hint)),n("div",{className:"ds-listrow-actions"},n(f,{className:"ds-select",value:x.role,disabled:d,onChange:P=>void M("/access/save",{member:{name:x.name,role:P.target.value}})},ACCESS_ROLE_OPTIONS.map(P=>n("option",{key:P.id,value:P.id},P.label))),n("button",{className:"ds-btn ds-btn-ghost",disabled:d,onClick:()=>void M("/access/delete",{name:x.name})},"移除")))),(w.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:x=>g({...k,name:x.target.value})}),n(f,{className:"ds-select",value:k.role,style:{flex:"0 0 130px"},onChange:x=>g({...k,role:x.target.value})},ACCESS_ROLE_OPTIONS.map(x=>n("option",{key:x.id,value:x.id},x.label))),n("button",{className:"ds-btn ds-btn-primary",disabled:d||k.name.trim()==="",onClick:()=>void $()},"加成员")),b!==null?n("div",{className:"ds-error"},b):null)),n("div",{className:"ds-panel"},n("div",{className:"ds-panel-head"},n("span",null,`审计日志(显示 ${L.length} / 命中 ${q.length} / 共 ${y.length} 条)`),n("div",{className:"ds-row",style:{gap:8,marginLeft:"auto"}},n(c,{className:"ds-input",placeholder:"搜动作 / 人 / 详情",value:z,style:{width:170},onChange:x=>H(x.target.value)}),n(f,{className:"ds-select",value:C===""?"__all__":C,style:{minWidth:150},onChange:x=>E(x.target.value==="__all__"?"":x.target.value)},n("option",{value:"__all__"},"所有人"),B.map(x=>n("option",{key:x,value:x},x))),n("label",{className:"ds-check"},n(p,{checked:_,onChange:x=>I(x.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:A,title:"把当前筛选结果导出为 CSV(Excel 可直接打开)"},"导出 CSV"))),n("div",{className:"ds-panel-body"},L.length===0?n("div",{className:"ds-empty"},y.length===0?"还没有记录。做一次写操作就会出现在这里。":"没有符合筛选条件的记录。把关键字清空或换个人试试。"):L.map(x=>n("div",{key:x.id,className:"ds-audit-row","data-ok":x.ok?"1":"0"},n("span",{className:"ds-audit-time"},Ke(x.at)),n("span",{className:"ds-audit-by"},x.by),n("span",{className:"ds-audit-what"},ROUTE_LABEL[x.route]??x.route),n("span",{className:"ds-audit-detail"},x.summary),n("span",{className:"ds-audit-status","data-ok":x.ok?"1":"0"},x.ok?"成功":`失败 ${x.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}=bt(),v=e.config,[w,y]=f.useState(null),[k,g]=f.useState(!1),[d,h]=f.useState(null),[b,S]=f.useState(""),C=e.statuses??[],E=f.useMemo(()=>rf(v),[v]),_=L=>{const A=v.columns?.[L];return A==null?[]:Array.isArray(A.members)?A.members:A.kind==="none"?[]:[{kind:A.kind,id:A.id}]},I=L=>v.columns?.[L]?.strategy??"round_robin",z=L=>{if(L.kind==="role")return"🎯 "+(za[L.id]??L.id);if(L.kind==="team"){const x=(v.teams??[]).find(P=>P.id===L.id);return x===void 0?`👥 ${L.id}`:`${x.emoji??"👥"} ${x.name}`}const A=(v.experts??[]).find(x=>x.id===L.id);return A===void 0?L.id:`${A.emoji} ${A.name}`},H=Array.isArray(v.design?.columns)?v.design.columns:["dev"],M=async L=>{g(!0),y(null);try{await r("/config",{design:{...v.design??{},...L}}),await t()}catch(A){y(A instanceof Error?A.message:String(A))}finally{g(!1)}},$=L=>{const A=H.includes(L)?H.filter(x=>x!==L):[...H,L];M({columns:A})},B=async(L,A,x)=>{g(!0),y(null);try{await r("/columns/save",{status:L,members:A,strategy:x}),await t()}catch(P){y(P instanceof Error?P.message:String(P))}finally{g(!1)}},J=(L,A)=>{const x=A.key.startsWith("t:")?"team":A.key.startsWith("r:")?"role":"expert",P=A.key.slice(2),K=_(L);K.some(R=>R.kind===x&&R.id===P)||(S(""),B(L,[...K,{kind:x,id:P}],I(L)))},q=(L,A)=>void B(L,_(L).filter((x,P)=>P!==A),I(L));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(L=>a("button",{key:"gate-"+L.id,className:H.includes(L.id)?"ds-btn ds-btn-primary":"ds-btn",disabled:k,onClick:()=>$(L.id)},L.label??L.id))),C.map(L=>{const A=_(L.id),x=I(L.id);return a("div",{className:"ds-colrow",key:L.id},a("div",{className:"ds-colrow-head"},a("span",{className:"ds-colrow-name"},L.label??L.id),A.length===0?a("span",{className:"ds-hint"},"👤 等人认领(不自动派)"):A.map((P,K)=>a(c,{className:"ds-chip ds-chip-owner",key:`${P.kind}:${P.id}`},z(P),a("button",{className:"ds-chip-x",title:"从候选里去掉",disabled:k,onClick:()=>q(L.id,K)},"×"))),a("button",{className:"ds-btn",style:{marginLeft:"auto"},disabled:k,onClick:()=>{S(""),h(P=>P===L.id?null:L.id)}},d===L.id?"收起":"+ 加候选"),A.length>=2?a(p,{className:"ds-input",style:{width:240},value:x,disabled:k,onChange:P=>void B(L.id,A,P.target.value)},STRATEGIES.map(P=>a("option",{key:P.id,value:P.id},P.label))):null),d===L.id?a("div",{className:"ds-colpick"},a(l,{className:"ds-mention-search",autoFocus:!0,value:b,placeholder:"搜专家或专家团,点一下加进候选",onChange:P=>S(P.target.value)}),a("div",{className:"ds-colpick-list"},Ho(E,b).length===0?a("div",{className:"ds-mention-empty"},"没有匹配的专家或专家团"):Ho(E,b).map(P=>a("button",{key:P.key,className:"ds-mention-item",onClick:()=>J(L.id,P)},a("span",null,P.emoji),a("span",null,P.name),a("span",{className:"ds-hint"},P.hint))))):null)}),w!==null?a("div",{className:"ds-error"},w):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}=bt(),[v,w]=f.useState(e.storage??null),[y,k]=f.useState([]),[g,d]=f.useState(null),[h,b]=f.useState(null),[S,C]=f.useState(!1),E=f.useCallback(()=>{r("/snapshots").then(z=>{w(z.storage??null),k(z.snapshots??[]),d(null)}).catch(z=>d(z instanceof Error?z.message:String(z)))},[]);f.useEffect(()=>{E()},[E,e.revision]);const _=async z=>{await i(`把看板回滚到快照 #${z}?当前的这一版会先另存一份,不会丢。`,{title:"回滚快照",okText:"回滚"})&&(C(!0),b(null),r("/snapshot/restore",{id:z}).then(()=>{b(`已回滚到快照 #${z}`),E(),t?.()}).catch(H=>d(H instanceof Error?H.message:String(H))).finally(()=>C(!1)))},I=z=>{const H=new Date(Number(z)||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,y.length===0?a("div",{className:"ds-hint"},v?.engine==="sqlite"?"还没有快照。":"单文件模式没有快照(这台机器的 node 不支持 node:sqlite 时会退回单文件)。"):y.map(z=>a("div",{key:z.id,className:"ds-listrow"},a("div",{className:"ds-listrow-main"},a("div",null,`#${z.id} · rev ${z.revision}`),a("div",{className:"ds-hint"},`${I(z.at)} · ${(z.bytes/1024).toFixed(1)} KB`)),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn ds-btn-ghost",disabled:S,onClick:()=>_(z.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}=bt(),w=e.integrations??{channels:[],broken:0},[y,k]=v.useState(""),[g,d]=v.useState(null),h=(e.requirements??[]).find(x=>(x.folder?.token??"")!==""),b=e.agents??{},S=b.lock??null,C=S===null?0:Math.max(0,Date.now()-(Number(S.at)||0)),[E,_]=v.useState(""),[I,z]=v.useState(!1),H=E.trim().toLowerCase(),M=(b.log??[]).filter(x=>{const P=String(x?.line??"");return I&&!/失败|错误|异常|拦|拒绝/.test(P)?!1:H===""||P.toLowerCase().includes(H)}),$=M.slice(0,12),B=()=>{const x=new URLSearchParams({q:E.trim(),failed:I?"1":"0",token:r()??""}),P=document.createElement("a");P.href=`${API}/export/dispatch.csv?${x.toString()}`,P.rel="noopener",document.body.appendChild(P),P.click(),document.body.removeChild(P),o(`正在导出 ${M.length} 条派单日志`)},J=async x=>{k(x),d(null);try{if(x==="gitlab"){const P=await s("/gitlab/sync",{});d(P.report===void 0?"已触发 GitLab 同步":`已同步:${(P.report.projects??[]).map(K=>`${K.name} +${K.created}`).join(",")||"无新卡"}`)}else if(x==="drive")if(h===void 0)d("还没有带云盘文件夹的需求,先建一条需求并归档一次。");else{const P=await s("/requirement/sync",{id:h.id});d(`已归档 ${P.report?.written??0} / ${P.report?.total??0} 件`),o(`已归档 ${P.report?.written??0} / ${P.report?.total??0} 件`)}else if(x==="feishu"){const P=await s("/feishu/test",{});d(P.ok===!0?"测试消息已发出":`发送失败:${P.result?.error??"没配置机器人"}`)}else d("代码隔离没有独立的重试入口,下一张卡派单时会自动重试。");await a()}catch(P){{const K=P instanceof Error?P.message:String(P);d(K),o(K,"error")}}finally{k("")}},q=x=>{const P=Number(x)||0;if(P===0)return"—";const K=new Date(P);return`${K.getMonth()+1}-${String(K.getDate()).padStart(2,"0")} ${String(K.getHours()).padStart(2,"0")}:${String(K.getMinutes()).padStart(2,"0")}`},L={ok:"正常",error:"异常",idle:"还没用过"},A={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":b.enabled===!0?"1":"0"},b.enabled===!0?"运行中":"已停用"),n("div",{className:"ds-row",style:{gap:8,marginLeft:"auto"}},n(c,{className:"ds-input",placeholder:"搜派单日志",value:E,style:{width:150},onChange:x=>_(x.target.value)}),n("label",{className:"ds-check"},n(p,{checked:I,onChange:x=>z(x.target.checked)}),n("span",null,"只看失败")),n("button",{className:"ds-btn ds-btn-ghost",disabled:M.length===0,onClick:B,title:"把当前筛选结果导出为 CSV"},"导出 CSV"))),n("div",{className:"ds-panel-body"},n("div",{className:"ds-kv"},n("dt",{},"实例"),n("dd",{},String(b.instance??"—")),n("dt",{},"派单锁"),n("dd",{},S===null?"还没抢到过(可能是内存模式)":`${S.mine===!0?"本进程持有":"其他实例持有"} · ${Math.round(C/1e3)} 秒前续租`),n("dt",{},"并发占用"),n("dd",{},`${(b.running??[]).length} / ${b.maxConcurrent??"—"}`),n("dt",{},"最近一轮"),n("dd",{},q(b.lastTickAt)),n("dt",{},"最近错误"),n("dd",{},String(b.lastError??"")===""?"无":String(b.lastError))),(b.log??[]).length===0?n("div",{className:"ds-empty"},"还没有派单日志。卡进入自动列后,这里会出现派单、空闲、失败记录。"):$.length===0?n("div",{className:"ds-empty"},"没有符合筛选条件的派单日志。"):n("div",{className:"ds-log"},$.map((x,P)=>n("div",{key:String(P),className:"ds-log-line"},`${q(x.at)} · ${String(x.line??"")}`))),(b.log??[]).length>0&&M.length>$.length?n("div",{className:"ds-hint"},`只显示最近 ${$.length} / 命中 ${M.length} 条,导出可看全量`):null)),n("div",{className:"ds-panel"},n("div",{className:"ds-panel-head"},"集成状态",n(u,{className:"ds-chip","data-on":w.broken===0?"1":"0"},w.broken===0?"全部正常":`${w.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,w.channels.length===0?n("div",{className:"ds-empty"},"还没有调用过任何外部集成。配好 GitLab / 飞书机器人 / 云盘文件夹后,第一次成功或失败就会出现在这里。"):w.channels.map(x=>n("div",{key:x.channel,className:"ds-listrow"},n("div",{className:"ds-listrow-main"},n("div",null,n("span",{style:{color:A[x.state],fontWeight:700}},"● "),x.label,n(u,{className:"ds-chip ds-chip-soft",style:{marginLeft:6}},L[x.state])),n("div",{className:"ds-hint"},x.hint),n("div",{className:"ds-hint"},`最近一次:${q(x.at)} · 成功 ${q(x.lastOkAt)} · 失败 ${q(x.lastErrorAt)}${x.attempts>0?` · 试着调了 ${x.attempts} 次,连挂 ${x.failures} 次`:""}`),x.lastError===""?null:n("div",{className:"ds-error"},x.lastError)),n("div",{className:"ds-listrow-actions"},n("button",{className:"ds-btn ds-btn-ghost",disabled:y!=="",onClick:()=>void J(x.channel)},y===x.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}=bt(),w=e.gitlab?.projects??[],[y,k]=v.useState(null),[g,d]=v.useState(null),[h,b]=v.useState(null),[S,C]=v.useState(!1),E=async()=>{if(y!==null){C(!0),d(null),b(null);try{await r("/repos/save",{project:y}),k(null),b("已保存"),s("已保存"),await t()}catch($){d($ instanceof Error?$.message:String($))}finally{C(!1)}}},_=async $=>{if(await o(`删除 GitLab 项目「${$.name}」?已同步的卡片会保留。`,{title:"删除 GitLab 项目",danger:!0,okText:"删除"})){C(!0),d(null);try{await r("/repos/delete",{id:$.id}),await t()}catch(B){d(B instanceof Error?B.message:String(B))}finally{C(!1)}}},I=async $=>{C(!0),d(null),b(null);try{const B=await r("/repos/test",{id:$.id});b(`连通:${$.project}(示例 Issue ${B.sample} 条)`)}catch(B){d(B instanceof Error?B.message:String(B))}finally{C(!1)}},z=async $=>{C(!0),d(null),b(null);try{const J=((await r("/gitlab/sync",{project:$.id})).summary?.projects??[])[0];b(J===void 0?"没有可同步的项目":`${J.name}:拉取 ${J.fetched},新建 ${J.created}${J.error?",错误 "+J.error:""}`),await t()}catch(B){d(B instanceof Error?B.message:String(B))}finally{C(!1)}},H=($,B)=>k({...y,[$]:B}),M=w.map($=>a("div",{className:"ds-listrow",key:$.id},a("div",{className:"ds-listrow-main"},a("div",{},`${$.name||$.project}${$.syncEnabled?" · 自动同步":""}${$.tokenSet?"":" · 缺令牌"}`),a("div",{className:"ds-hint"},`${$.url||e.gitlab.url||"(未填地址)"} / ${$.project}${$.lastSyncAt?" · 上次 "+new Date($.lastSyncAt).toLocaleString():""}`),$.lastSyncError?a("div",{className:"ds-error"},$.lastSyncError):null),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn",disabled:S,onClick:()=>void z($)},"同步"),a("button",{className:"ds-btn",disabled:S,onClick:()=>void I($)},"测试"),a("button",{className:"ds-btn",disabled:S,onClick:()=>k({...$,token:""})},"编辑"),i("删除这个项目(卡不会删)",a("button",{className:"ds-btn",disabled:S,onClick:()=>void _($),"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:$=>$,empty:"还没有项目,点「新增项目」。"}),h!==null?a("div",{className:"ds-ok",style:{marginBottom:8}},h):null,y===null?null:a(f,{title:y.id?`编辑仓库:${y.name||y.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:y.name,placeholder:"订单服务",onChange:$=>H("name",$.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"GitLab 地址"),a(l,{className:"ds-input",value:y.url,placeholder:"https://gitlab.example.com",onChange:$=>H("url",$.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"项目路径(含 namespace)"),a(l,{className:"ds-input",value:y.project,placeholder:"backend/order-service",onChange:$=>H("project",$.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},y.tokenSet?"Access Token(已设置,留空则不修改)":"Access Token"),a(l,{className:"ds-input",type:"password",value:y.token,placeholder:y.tokenSet?"••••••••":"glpat-…",onChange:$=>H("token",$.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:y.syncLabel,placeholder:"留空则同步全部 open Issue",onChange:$=>H("syncLabel",$.target.value)})),a("div",{className:"ds-field"},a("label",{className:"ds-row",style:{alignItems:"center",gap:8,cursor:"pointer"}},a(u,{checked:y.syncEnabled===!0,onChange:$=>H("syncEnabled",$.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}=bt(),w=e.feishu?.bots??[],[y,k]=v.useState(null),[g,d]=v.useState(null),[h,b]=v.useState(null),[S,C]=v.useState(!1),[E,_]=v.useState(e.feishu?.driveFolder??""),[I,z]=v.useState(e.feishu?.autoSyncArtifacts!==!1),[H,M]=v.useState(!1),[$,B]=v.useState(null),J=async()=>{M(!0),B(null);try{await r("/config",{feishu:{driveFolder:E.trim(),autoSyncArtifacts:I}}),B("已保存"),await t()}catch(O){B(O instanceof Error?O.message:String(O))}finally{M(!1)}},q=async()=>{if(y!==null){C(!0),d(null),b(null);try{await r("/bots/save",{bot:y}),k(null),b("已保存"),s("已保存"),await t()}catch(O){d(O instanceof Error?O.message:String(O))}finally{C(!1)}}},L=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)}}},A=async O=>{C(!0),d(null),b(null);try{const we=((await r("/feishu/test",{id:O.id})).results??[])[0];b(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)}},x=(O,G)=>k({...y,[O]:G}),P=O=>{const G=y.events!==null&&typeof y.events=="object"?y.events:null;return G===null?O==="change"?y.notifyOnChange!==!1:!0:G[O]!==!1},K=(O,G)=>{const fe={...y.events!==null&&typeof y.events=="object"?y.events:{},[O]:G};k({...y,events:fe,notifyOnChange:fe.change!==!1})},R=w.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 A(O)},"测试"),a("button",{className:"ds-btn",disabled:S,onClick:()=>k({...O,webhook:""})},"编辑"),a("button",{className:"ds-btn",disabled:S,onClick:()=>void L(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=>z(O.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?"保存中…":"保存"),$!==null?a("div",{className:"ds-hint"},$):null))),y===null?null:a(f,{title:y.id?`编辑机器人:${y.name||y.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:y.name,placeholder:"研发群通知",onChange:O=>x("name",O.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},y.webhookSet?"Webhook(已设置,留空则不修改)":"Webhook"),a(l,{className:"ds-input",type:"password",value:y.webhook,placeholder:"https://open.feishu.cn/open-apis/bot/v2/hook/…",onChange:O=>x("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:y.chatId,placeholder:"oc_…",onChange:O=>x("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:P(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:y.enabled!==!1,onChange:O=>x("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}=bt(),[w,y]=v.useState(null),[k,g]=v.useState(null),[d,h]=v.useState(null),[b,S]=v.useState(null),[C,E]=v.useState(!1),[_,I]=v.useState(!1),[z,H]=v.useState(!1),M=v.useCallback(async()=>{try{const O=await r("/skills");y({root:O.root,skills:O.skills??[],onDisk:O.onDisk??[]})}catch(O){h(O instanceof Error?O.message:String(O))}},[]);v.useEffect(()=>{M()},[M]);const $=w?.skills??[],B=w?.onDisk??[],J=O=>(e.experts??[]).filter(G=>(G.skills??[]).includes(O)),q=(O,G)=>g({...k,[O]:G}),L=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)}}},A=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)}}},x=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)}},P=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:z}),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=$.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,B.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 A(O),"data-danger":"1"},"删除")))),R=B.filter(O=>!$.some(G=>G.name===O));return a("div",{className:"ds-pane-stack"},a(n,{title:"技能库(skills-manager)",hint:w===null?"读取中…":`保存在 ${w.root}/<名字>/SKILL.md,所有专家都能用 skill 工具加载;专家也可以自己用 studio_skill_save 往这里加技能。支持上传 SKILL.md 或包含 SKILL.md 的 .zip 技能包。`,rows:K,addLabel:"新建技能",onAdd:()=>{S(null),g({name:"",description:"",whenToUse:"",tags:"",content:`# 什么时候用
|
|
29
|
+
不确定的地方去代码或历史工单里找证据,禁止编造接口字段。`,onChange:Y=>M("prompt",Y.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:Y=>M("enabled",Y.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:w,SideDrawer:y}=bt(),k=e.teams??[],g=e.experts??[],[d,h]=n.useState(null),[b,S]=n.useState(null),[C,E]=n.useState(!1),[_,I]=n.useState({});n.useEffect(()=>{let M=!0;return s("/team/memory",{}).then(O=>{M&&I(O?.memory??{})}).catch(()=>{}),()=>{M=!1}},[e.teams]);const F=async M=>{if(await i("清空「"+M.name+"」的团队记忆?",{title:"清空团队记忆",danger:!0,okText:"清空"}))try{const O=await s("/team/memory/clear",{teamId:M.id});I(O?.memory??{}),o("已清空这个团的记忆")}catch(O){S(O instanceof Error?O.message:String(O))}},W=M=>{const O=g.find(A=>A.id===M);return O===void 0?M:`${O.emoji} ${O.name}`},L=async()=>{if(d!==null){E(!0),S(null);try{await s("/teams/save",{team:d}),h(null),await t()}catch(M){S(M instanceof Error?M.message:String(M))}finally{E(!1)}}},$=async M=>{if(await i(`删除专家团「${M.name}」?`,{title:"删除专家团",danger:!0,okText:"删除"})){E(!0),S(null);try{await s("/teams/delete",{id:M.id}),await t()}catch(O){S(O instanceof Error?O.message:String(O))}finally{E(!1)}}},B=(M,O)=>h({...d,[M]:O}),ee=k.map(M=>a("div",{className:"ds-listrow",key:M.id},a("div",{className:"ds-listrow-main"},a("div",{},`👥 ${M.name}`),a("div",{className:"ds-hint"},`团长 ${W(M.lead)} · 成员 ${M.members.map(W).join("、")}`),a("div",{className:"ds-hint"},(_[M.id]??[]).length===0?"🧠 团队记忆:还没有(卡做完会自动记一条,派活时带进提示词)":`🧠 团队记忆 ${_[M.id].length} 条 · 最近:${_[M.id][0]?.outcome??""} ${_[M.id][0]?.title??""}`)),a("div",{className:"ds-listrow-actions"},l("清空这个团的记忆",a("button",{className:"ds-btn ds-btn-ghost",disabled:C||(_[M.id]??[]).length===0,onClick:()=>void F(M)},"清空记忆")),l("编辑这个专家团",a("button",{className:"ds-btn",disabled:C,onClick:()=>h({...M})},"编辑")),l("删除这个专家团",a("button",{className:"ds-btn",disabled:C,onClick:()=>void $(M),"data-danger":"1"},"删除")))));return a("div",{className:"ds-pane-stack"},a(r,{title:"专家团(一起干活)",hint:"专家团有团长和成员。评论里 @团名,团长会拆活、给成员派活并汇总结论;成员之间可以继续 @ 接棒。",rows:ee,onAdd:()=>h({id:"",name:"",description:"",members:[],lead:"",enabled:!0}),addLabel:"新增专家团",render:M=>M,empty:"还没有专家团。"}),d===null?null:a(y,{title:d.id?`编辑专家团:${d.name||d.id}`:"新增专家团",hint:"团长负责拆活,成员之间在评论里用 @名字 接棒;改完点右下角「保存」。",onClose:()=>h(null),footer:[a("button",{key:"save",className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void L()},C?"保存中…":"保存"),a("button",{key:"cancel",className:"ds-btn",disabled:C,onClick:()=>h(null)},"取消"),b!==null?a("span",{key:"error",className:"ds-error ds-side-note"},b):null]},a("div",{className:"ds-field"},a("div",{className:"ds-label"},"团名(@ 用这个名字)"),a(u,{className:"ds-input",value:d.name,placeholder:"需求交付组",onChange:M=>B("name",M.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"这个团负责什么"),a(u,{className:"ds-input",value:d.description,placeholder:"从需求澄清一路做到验收",onChange:M=>B("description",M.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(M=>a("label",{className:"ds-row",key:M.id,style:{alignItems:"center",gap:6,cursor:"pointer"}},a(v,{checked:(d.members??[]).includes(M.id),onChange:O=>B("members",O.target.checked?[...d.members??[],M.id]:(d.members??[]).filter(A=>A!==M.id))}),a("span",{},`${M.emoji} ${M.name}`))))),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"团长(负责拆活和汇总)"),a(w,{className:"ds-input",value:d.lead??"",onChange:M=>B("lead",M.target.value)},a("option",{value:""},"自动(第一个成员)"),(d.members??[]).map(M=>a("option",{key:M,value:M},W(M)))))))}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:w,SideDrawer:y}=bt(),k=e.testing??{},g=Array.isArray(k.envs)?k.envs:[],[d,h]=n.useState(null),[b,S]=n.useState((Array.isArray(k.allowHosts)?k.allowHosts:[]).join(", ")),[C,E]=n.useState(String(k.timeoutMs??15e3)),[_,I]=n.useState(!1),[F,W]=n.useState(null),[L,$]=n.useState(null),[B,ee]=n.useState({allowShell:k.allowShell===!0,allowDb:k.allowDb===!0}),[M,O]=n.useState({casesPerTask:e.limits?.casesPerTask??60,runKeys:e.limits?.runKeys??60,artifactsPerTask:e.limits?.artifactsPerTask??40}),[A,x]=n.useState(()=>(Array.isArray(e.webhooks)?e.webhooks:[]).map(H=>({...H}))),P=async H=>{ee(H),I(!0),$(null);try{await s("/config",{testing:{...k,allowShell:H.allowShell,allowDb:H.allowDb}}),$("已保存"),await t()}catch(R){W(R instanceof Error?R.message:String(R))}finally{I(!1)}},G=async()=>{I(!0),$(null);try{await s("/config",{limits:M}),$("上限已保存"),o("上限已保存"),await t()}catch(H){W(H instanceof Error?H.message:String(H))}finally{I(!1)}},te=async()=>{I(!0),$(null);try{await s("/config",{webhooks:A.filter(H=>String(H.url??"").trim()!=="")}),$("webhook 已保存"),o("webhook 已保存"),await t()}catch(H){W(H instanceof Error?H.message:String(H))}finally{I(!1)}},q=async H=>{I(!0),W(null),$(null);try{await s("/config",{testing:{envs:H.envs??g,defaultEnv:H.defaultEnv!==void 0?H.defaultEnv:k.defaultEnv??"",timeoutMs:H.timeoutMs!==void 0?H.timeoutMs:k.timeoutMs??15e3,allowHosts:H.allowHosts!==void 0?H.allowHosts:Array.isArray(k.allowHosts)?k.allowHosts:[],concurrency:k.concurrency??4}}),$("已保存"),o("已保存"),await t()}catch(R){W(R instanceof Error?R.message:String(R))}finally{I(!1)}},K=async()=>{if(d===null)return;const H=String(d.name??"").trim(),R=String(d.baseUrl??"").trim();if(H===""){W("环境名不能为空");return}const ne={id:d.id??"",name:H,baseUrl:R},we=d.id===void 0||d.id===""?[...g,ne]:g.map(Z=>Z.id===d.id?{...Z,...ne}:Z);h(null),await q({envs:we,defaultEnv:k.defaultEnv===""?"":k.defaultEnv})},ke=async H=>{if(!await i(`删除环境「${H.name}」?`,{title:"删除环境",danger:!0,okText:"删除"}))return;const R=g.filter(ne=>ne.id!==H.id);await q({envs:R,defaultEnv:k.defaultEnv===H.id?R[0]?.id??"":k.defaultEnv})},pe=async()=>{const H=b.split(/[,,\s]+/).map(ne=>ne.trim()).filter(ne=>ne!==""),R=Number(C);await q({allowHosts:H,timeoutMs:Number.isFinite(R)&&R>0?R:15e3})},xe=H=>a("div",{key:H.id,className:"ds-listrow"},a("div",{className:"ds-listrow-main"},a("div",null,`${H.name}${k.defaultEnv===H.id?" · 默认":""}`),a("div",{className:"ds-hint"},H.baseUrl===""?"相对地址会因为没有 baseUrl 而失败":H.baseUrl)),a("div",{className:"ds-listrow-actions"},k.defaultEnv===H.id?null:a("button",{className:"ds-btn ds-btn-ghost",disabled:_,onClick:()=>void q({defaultEnv:H.id})},"设为默认"),a("button",{className:"ds-btn ds-btn-ghost",disabled:_,onClick:()=>h({...H})},"编辑"),a("button",{className:"ds-btn ds-btn-ghost",disabled:_,onClick:()=>void ke(H),"data-danger":"1"},"删除"))),Y=d===null?null:a("div",{className:"ds-panel ds-form-panel"},a("div",{className:"ds-panel-head"},d.id===void 0||d.id===""?"新增环境":`编辑环境:${d.name}`),a("div",{className:"ds-panel-body"},a("div",{className:"ds-field"},a("div",{className:"ds-label"},"环境名"),a(u,{className:"ds-input",value:d.name??"",placeholder:"例如 测试环境 / 预发环境",onChange:H=>h({...d,name:H.target.value})})),a("div",{className:"ds-field"},c("baseUrl","接口测试的根地址,用例里的 /path 会拼在它后面"),a(u,{className:"ds-input",value:d.baseUrl??"",placeholder:"https://test.example.com",onChange:H=>h({...d,baseUrl:H.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"},Y,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:B.allowShell,disabled:_,onChange:H=>void P({...B,allowShell:H.target.checked})}),a("span",{className:"ds-check-text"},"允许 shell 用例(能在宿主机执行命令)")),a("label",{className:"ds-check",style:{marginTop:6}},a(v,{checked:B.allowDb,disabled:_,onChange:H=>void P({...B,allowDb:H.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(M.casesPerTask),onChange:H=>O({...M,casesPerTask:Number(H.target.value)})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"一次批量跑上限"),a(u,{className:"ds-input",type:"number",value:String(M.runKeys),onChange:H=>O({...M,runKeys:Number(H.target.value)})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"交付物上限"),a(u,{className:"ds-input",type:"number",value:String(M.artifactsPerTask),onChange:H=>O({...M,artifactsPerTask:Number(H.target.value)})}))),a("div",{className:"ds-row",style:{justifyContent:"flex-end",marginTop:6}},a("button",{className:"ds-btn ds-btn-primary",disabled:_,onClick:()=>void G()},"保存上限")))),a("div",{className:"ds-panel"},a("div",{className:"ds-panel-head"},"出站 webhook",a("button",{className:"ds-btn ds-btn-ghost",disabled:_,onClick:()=>x(H=>[...H,{url:"",events:["task/moved"],enabled:!0}])},"+ 加一个")),a("div",{className:"ds-panel-body"},A.length===0?a("div",{className:"ds-empty"},"还没有 webhook。配一个就能把卡片流转、用例失败、门禁拦截推给 CI / IM / 工单系统。"):A.map((H,R)=>a("div",{key:R,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:H.url??"",onChange:ne=>x(we=>we.map((Z,le)=>le===R?{...Z,url:ne.target.value}:Z))}),a(v,{checked:H.enabled!==!1,onChange:ne=>x(we=>we.map((Z,le)=>le===R?{...Z,enabled:ne.target.checked}:Z))}),a("button",{className:"ds-btn ds-btn-ghost",disabled:_,onClick:()=>x(ne=>ne.filter((we,Z)=>Z!==R))},"×")),a("div",{className:"ds-row",style:{gap:10,flexWrap:"wrap",marginTop:2}},["task/moved","case/failed","gate/blocked","agent/failed","regression/finished"].map(ne=>a("label",{className:"ds-check",key:ne},a(v,{checked:(H.events??[]).includes(ne),onChange:we=>x(Z=>Z.map((le,he)=>he===R?{...le,events:we.target.checked?Array.from(new Set([...le.events??[],ne])):(le.events??[]).filter(V=>V!==ne)}:le))}),a("span",{className:"ds-check-text",style:{fontSize:12}},ne))),(H.events??[]).length===0?a("span",{className:"ds-hint",style:{fontSize:12}},"一个都没勾 = 订阅全部事件"):null))),A.length===0?null:a("div",{className:"ds-row",style:{justifyContent:"flex-end"}},a("button",{className:"ds-btn ds-btn-primary",disabled:_,onClick:()=>void te()},"保存 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(xe))),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:b,placeholder:"127.0.0.1, localhost, test.example.com",onChange:H=>S(H.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"单条用例超时(毫秒)"),a(u,{className:"ds-input",value:C,onChange:H=>E(H.target.value)})),a("div",{className:"ds-row",style:{justifyContent:"flex-end"}},a("button",{className:"ds-btn ds-btn-primary",disabled:_,onClick:()=>void pe()},_?"保存中…":"保存约束")),L===null?null:a("div",{className:"ds-ok"},L),F===null?null:a("div",{className:"ds-err"},F))))}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:w,SideDrawer:y}=bt(),k=e.feishu??{},[g,d]=n.useState(""),[h,b]=n.useState(String(k.escalateAfter??3)),[S,C]=n.useState(!1),[E,_]=n.useState(null),[I,F]=n.useState(null),W=async()=>{C(!0),_(null),F(null);try{const L={};String(g??"").trim()!==""&&(L.escalateWebhook=String(g).trim()),L.escalateAfter=Number(h)||3,await s("/config",{feishu:L}),d(""),_("已保存:连续失败 "+(Number(h)||3)+" 次后往升级群发一条"),await t()}catch(L){F(L instanceof Error?L.message:String(L))}finally{C(!1)}};return a("div",{className:"ds-panel ds-form-panel",style:{marginTop:14}},a("div",{className:"ds-panel-head"},"通知升级"),a("div",{className:"ds-panel-body"},a("div",{className:"ds-field"},a("div",{className:"ds-label"},"升级群 Webhook"),a(u,{className:"ds-input",value:g,placeholder:k.escalateWebhookSet===!0?"已设置(留空表示不修改)":"https://open.feishu.cn/open-apis/bot/v2/hook/…",onChange:L=>d(L.target.value)})),a("div",{className:"ds-field"},c("连续失败几次后升级","同一通道连续失败到这个次数,就给升级群发消息"),a(u,{className:"ds-input",style:{width:90},value:h,onChange:L=>b(L.target.value)})),a("div",{className:"ds-hint"},"飞书通知、GitLab、云盘归档、代码隔离任一通道连续失败达到阈值时,只在跨过阈值那一次往升级群发一条,包含通道、失败次数与最近错误。"),a("div",{className:"ds-row",style:{justifyContent:"flex-end"}},a("button",{className:"ds-btn ds-btn-primary",disabled:S,onClick:()=>void 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:w,SideDrawer:y}=bt(),[k,g]=n.useState(()=>(e.environments??[]).map(ee=>({id:ee.id,name:ee.name,kind:ee.kind,note:ee.note}))),[d,h]=n.useState(!1),[b,S]=n.useState(null),[C,E]=n.useState(null),[_,I]=n.useState(null),F=async ee=>{I(null);try{await s("/config",{releaseRules:ee}),I("发布准入已更新"),await t()}catch(M){I(M instanceof Error?M.message:String(M))}},W=()=>g(ee=>ee.length>=12?ee:[...ee,{id:"",name:"",kind:"other",note:""}]),L=(ee,M)=>g(O=>O.map((A,x)=>x===ee?{...A,...M}:A)),$=ee=>g(M=>M.filter((O,A)=>A!==ee)),B=async()=>{h(!0),S(null),E(null);try{const ee=k.map(M=>({...M,name:String(M.name??"").trim()})).filter(M=>M.name!=="");if(ee.length===0)throw new Error("至少留一个环境,否则部署记录没处挂");await s("/config",{environments:ee}),S(`已保存 ${ee.length} 个环境`),o(`已保存 ${ee.length} 个环境`),await t()}catch(ee){E(ee instanceof Error?ee.message:String(ee))}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((ee,M)=>a("div",{key:`env-${M}`,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:ee.name,placeholder:"例如 预发",onChange:O=>L(M,{name:O.target.value})})),a("div",{className:"ds-field",style:{flex:"0 0 120px"}},a("div",{className:"ds-label"},"类型"),a(w,{className:"ds-input",value:ee.kind,onChange:O=>L(M,{kind:O.target.value})},["dev","staging","prod","other"].map(O=>a("option",{key:O,value:O},O)))),a("div",{className:"ds-field",style:{flex:2}},a("div",{className:"ds-label"},"说明"),a(u,{className:"ds-input",value:ee.note,placeholder:"例如 上线前最后一关",onChange:O=>L(M,{note:O.target.value})})),a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>$(M),"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 B()},d?"保存中…":"保存环境")),b===null?null:a("div",{className:"ds-ok"},b),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:ee=>void F({requireStaging:ee.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:ee=>void F({requireRequirementSignoff:ee.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}=bt(),f=e.ldap??{},[v,w]=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)}),[y,k]=p.useState(!1),[g,d]=p.useState(!1),[h,b]=p.useState(null),[S,C]=p.useState(null),[E,_]=p.useState([]),I=e.localAuth??{},[F,W]=p.useState(""),[L,$]=p.useState(""),[B,ee]=p.useState(!1),[M,O]=p.useState(null),[A,x]=p.useState(null),P=async()=>{ee(!0),O(null),x(null);try{await r("/auth/password",{username:I.username,currentPassword:F,newPassword:L}),W(""),$(""),O("密码已更新"),t()}catch(K){x(K instanceof Error?K.message:String(K))}finally{ee(!1)}},G=K=>w(ke=>({...ke,...K})),te=async()=>{d(!0),b(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??[]),b(K.message??"连接正常"),s(K.message??"连接正常",K.ok===!1?"error":"success")}catch(K){const ke=K instanceof Error?K.message:String(K);C(ke)}finally{d(!1)}},q=async()=>{k(!0),b(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),G({bindPassword:""}),b(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=>G({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=>G({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=>G({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=>G({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=>G({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=>G({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=>G({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=>G({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=>G({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=>G({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=>G({deptAttr:K.target.value})}))),a("div",{className:"ds-row",style:{gap:8,marginTop:10}},a("button",{className:"ds-btn",disabled:g,onClick:()=>void te()},g?"测试中…":"测试连接"),a("button",{className:"ds-btn ds-btn-primary",disabled:y,onClick:()=>void q()},y?"保存中…":"保存")),E.length===0?null:a("div",{style:{marginTop:8}},E.map((K,ke)=>a("div",{key:`ldap-step-${ke}`,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:F,onChange:K=>W(K.target.value)})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"新密码(至少 8 位)"),a(l,{className:"ds-input",type:"password",value:L,onChange:K=>$(K.target.value)})),a("button",{className:"ds-btn",disabled:B||F===""||L.length<8,onClick:()=>void P()},B?"提交中…":"改密码")),M===null?null:a("div",{className:"ds-ok",style:{marginTop:6}},M),A===null?null:a("div",{className:"ds-error",style:{marginTop:6}},A)),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} 次 · 最近 ${Ke(K.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}=bt(),f=e.costs??{},[v,w]=p.useState(String(f.budgetRuns??500)),[y,k]=p.useState(String(f.budgetHours??80)),[g,d]=p.useState(String(f.warnAt??80)),[h,b]=p.useState(()=>Array.isArray(f.prices)?f.prices.map($=>({...$})):[]),S=async()=>{E(!0),I(null),W(null);try{const $=h.filter(B=>String(B.model??"").trim()!=="").map(B=>({model:String(B.model).trim(),input:Number(B.input)||0,output:Number(B.output)||0,cacheRead:Number(B.cacheRead)||0,cacheWrite:Number(B.cacheWrite)||0}));await r("/config",{costs:{budgetRuns:Number(f.budgetRuns??500),budgetHours:Number(f.budgetHours??80),warnAt:Number(f.warnAt??80),prices:$}}),b($),I("已保存:价目表 "+$.length+" 行"),await t()}catch($){W($ instanceof Error?$.message:String($))}finally{E(!1)}},[C,E]=p.useState(!1),[_,I]=p.useState(null),[F,W]=p.useState(null),L=async()=>{E(!0),I(null),W(null);try{const $=Number(v),B=Number(y),ee=Number(g);if(!Number.isFinite($)||$<=0)throw new Error("预算次数要是正整数");if(!Number.isFinite(B)||B<=0)throw new Error("预算小时要是正整数");await r("/config",{costs:{budgetRuns:Math.round($),budgetHours:Math.round(B),warnAt:Number.isFinite(ee)?Math.min(100,Math.max(10,Math.round(ee))):80,prices:h}}),I("已保存:预算"),await t()}catch($){W($ instanceof Error?$.message:String($))}finally{E(!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:$=>w($.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"每月机上时长上限(小时)"),a(l,{className:"ds-input",value:y,onChange:$=>k($.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"警告阈值(百分比)"),a(l,{className:"ds-input",value:g,onChange:$=>d($.target.value)})),a("div",{className:"ds-field ds-span"},a("div",{className:"ds-hint"},'效能页的「AI 执行成本」会显示真实 token 用量(读 studio-* 会话日志)。要显示钱就在 config.costs.prices 里配价目表:[{ "model": "deepseek-v4.1-flash", "input": 2, "output": 8, "cacheRead": 0.2 }],单位是元 / 百万 token;没配价目的调用记「未知」,不按 0 算。')),a("div",{className:"ds-field ds-span"},a("div",{className:"ds-label"},"价目表(元 / 百万 token)"),h.length===0?a("div",{className:"ds-hint"},"还是空的:只统计 token,不算钱。点「+ 加一行」把常见模型的价格填进来。"):h.map(($,B)=>a("div",{className:"ds-row",key:B,style:{gap:6,alignItems:"center",marginTop:6,flexWrap:"wrap"}},a(l,{className:"ds-input",style:{flex:"2 1 180px"},placeholder:"模型 id,如 deepseek-v4.1-flash",value:$.model??"",onChange:ee=>b(M=>M.map((O,A)=>A===B?{...O,model:ee.target.value}:O))}),a(l,{className:"ds-input",style:{flex:"1 1 70px"},placeholder:"输入",value:String($.input??""),onChange:ee=>b(M=>M.map((O,A)=>A===B?{...O,input:Number(ee.target.value)||0}:O))}),a(l,{className:"ds-input",style:{flex:"1 1 70px"},placeholder:"输出",value:String($.output??""),onChange:ee=>b(M=>M.map((O,A)=>A===B?{...O,output:Number(ee.target.value)||0}:O))}),a(l,{className:"ds-input",style:{flex:"1 1 70px"},placeholder:"缓存读",value:String($.cacheRead??""),onChange:ee=>b(M=>M.map((O,A)=>A===B?{...O,cacheRead:Number(ee.target.value)||0}:O))}),a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>b(ee=>ee.filter((M,O)=>O!==B))},"×"))),a("div",{className:"ds-row",style:{gap:8,marginTop:8,justifyContent:"flex-end"}},a("button",{className:"ds-btn",disabled:C,onClick:()=>b($=>[...$,{model:"",input:0,output:0,cacheRead:0,cacheWrite:0}])},"+ 加一行"),a("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void S()},C?"保存中…":"保存价目表"))),a("div",{className:"ds-row",style:{justifyContent:"flex-end"}},a("button",{className:"ds-btn ds-btn-primary",disabled:C,onClick:()=>void L()},C?"保存中…":"保存预算")),_===null?null:a("div",{className:"ds-ok"},_),F===null?null:a("div",{className:"ds-err"},F)))}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}=bt(),f=e.projects??[],v=e.gitlab?.projects??[],[w,y]=p.useState(null),[k,g]=p.useState(null),[d,h]=p.useState(null),[b,S]=p.useState(!1),[C,E]=p.useState({name:"",start:"",due:"",status:"planned"}),_=async()=>{if(w!==null){S(!0),g(null),h(null);try{await r("/projects/save",{project:{...w,iterations:w.iterations??[]}}),h("已保存"),s("已保存"),await t()}catch(x){g(x instanceof Error?x.message:String(x))}finally{S(!1)}}},I=async x=>{if(await o(`删除项目「${x.name}」?卡片会保留,但不再归属任何项目。`,{title:"删除项目",danger:!0,okText:"删除"})){S(!0),g(null);try{await r("/projects/delete",{id:x.id}),y(null),await t()}catch(P){g(P instanceof Error?P.message:String(P))}finally{S(!1)}}},F=async x=>{if(C.name.trim()!==""){S(!0),g(null);try{await r("/projects/iteration",{project:x.id,name:C.name.trim(),start:Dr(C.start),due:Dr(C.due),status:C.status}),E({name:"",start:"",due:"",status:"planned"}),await t()}catch(P){g(P instanceof Error?P.message:String(P))}finally{S(!1)}}},W=async(x,P)=>{S(!0),g(null);try{await r("/projects/iteration",{project:x.id,action:"remove",iteration:P.id}),await t()}catch(G){g(G instanceof Error?G.message:String(G))}finally{S(!1)}},L=(x,P)=>y({...w,[x]:P}),$=(x,P,G)=>y({...w,services:(w.services??[]).map((te,q)=>q===x?{...te,[P]:G}:te)}),B=()=>y({...w,services:[...w.services??[],{id:"",name:"",repoId:"",repoPath:"",baseBranch:w.baseBranch||"main",dependsOn:[]}]}),ee=x=>y({...w,services:(w.services??[]).filter((P,G)=>G!==x)}),M=w===null?[]:w.services??[],O=(x,P)=>y({...w,services:(w.services??[]).map((G,te)=>{if(te!==x)return G;const q=Array.isArray(G.dependsOn)?G.dependsOn:[];return{...G,dependsOn:q.includes(P)?q.filter(K=>K!==P):[...q,P]}})}),A=f.map(x=>a("div",{className:"ds-listrow",key:x.id},a("div",{className:"ds-listrow-main"},a("div",{},`${x.key?`[${x.key}] `:""}${x.name} · ${Zl[x.status]??x.status}${x.lead?` · 负责人 ${x.lead}`:""}`),a("div",{className:"ds-hint"},`${(e.projects??[]).find(P=>P.id===x.id)?.iterations?.length??0} 个迭代 · ${(x.services??[]).length} 个服务${(()=>{const P=(x.services??[]).reduce((G,te)=>G+(te.dependsOn??[]).length,0);return P>0?` · ${P} 条依赖`:""})()}${x.description?` · ${x.description}`:""}`)),a("div",{className:"ds-listrow-actions"},i("改项目信息、加迭代",a("button",{className:"ds-btn",disabled:b,onClick:()=>y({...x})},"编辑 / 迭代")),i("删除这个项目(卡不会删)",a("button",{className:"ds-btn",disabled:b,onClick:()=>void I(x),"data-danger":"1"},"删除")))));return a("div",{className:"ds-pane-stack"},a(n,{title:"业务项目(一个项目可以挂很多张卡和很多个迭代)",hint:"项目是看板的第一层分组:卡片挂项目,项目下面划迭代,看板可按项目和迭代筛选,项目页签看每个项目的体检数据。",rows:A,onAdd:()=>y({id:"",name:"",key:"",description:"",lead:"",status:"active",repos:[],services:[],iterations:[]}),addLabel:"新增项目",render:x=>x,empty:"还没有项目。团队只跑一个产品也可以先不建,直接在看板上干活。"}),d!==null?a("div",{className:"ds-ok",style:{marginBottom:8}},d):null,w===null?null:a("div",{className:"ds-panel ds-form-panel"},a("div",{className:"ds-panel-head"},w.id?`编辑项目:${w.name||w.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:w.key??"",placeholder:"ORD",onChange:x=>L("key",x.target.value)})),a("div",{className:"ds-field",style:{flex:2}},a("div",{className:"ds-label"},"项目名"),a(l,{className:"ds-input",value:w.name??"",placeholder:"订单中心",onChange:x=>L("name",x.target.value)})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"状态"),a(u,{className:"ds-select",value:w.status??"active",onChange:x=>L("status",x.target.value)},Object.keys(Zl).map(x=>a("option",{key:x,value:x},Zl[x])))),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"业务负责人"),a(l,{className:"ds-input",value:w.lead??"",placeholder:"张伟",onChange:x=>L("lead",x.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:w.repoPath??"",placeholder:"~/repos/order-center",onChange:x=>L("repoPath",x.target.value)})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"基线分支"),a(l,{className:"ds-input",value:w.baseBranch??"",placeholder:"main",onChange:x=>L("baseBranch",x.target.value)}))),a("div",{className:"ds-hint",style:{margin:"-6px 0 4px"}},"配了代码目录且「代码隔离」选 worktree 时,每张卡会切一条 task/<编号> 分支,互不干扰。项目里有多个服务时,用下面的服务列表分开配。"),a("div",{className:"ds-field"},a("div",{className:"ds-label"},`服务(${M.length})· 一个服务一个 git 路径,卡片可以指定改哪个`),M.length===0?a("div",{className:"ds-empty"},"还没有分服务。只有一个仓库时留空即可,走上面的默认代码目录。"):M.map((x,P)=>{const G=M.filter((te,q)=>q!==P&&String(te.id??"").trim()!=="");return a("div",{key:`${x.id}-${P}`,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:x.name??"",placeholder:"order-service",onChange:te=>$(P,"name",te.target.value)})),a("div",{className:"ds-field",style:{flex:3}},a("div",{className:"ds-label"},"本机 git 路径"),a(l,{className:"ds-input",value:x.repoPath??"",placeholder:"~/repos/order-service",onChange:te=>$(P,"repoPath",te.target.value)})),a("div",{className:"ds-field",style:{flex:"0 0 110px"}},a("div",{className:"ds-label"},"基线分支"),a(l,{className:"ds-input",value:x.baseBranch??"",placeholder:"main",onChange:te=>$(P,"baseBranch",te.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:x.repoId??"",onChange:te=>$(P,"repoId",te.target.value)},a("option",{value:""},"不关联"),v.map(te=>a("option",{key:te.id,value:te.id},te.name||te.project)))),a("button",{className:"ds-btn",type:"button",onClick:()=>ee(P),"data-danger":"1"},"删除")),G.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}},"(勾上的服务要先完成,本服务的卡才能收口)"),G.map(te=>a("span",{key:te.id,className:"ds-chip","data-on":(x.dependsOn??[]).includes(te.id)?"1":"0",title:`依赖 ${te.name||te.id}`,onClick:()=>O(P,te.id)},te.name||te.id))))}),a("div",{className:"ds-row",style:{gap:8}},a("button",{className:"ds-btn",type:"button",onClick:()=>B()},"+ 加一个服务"),a("span",{className:"ds-hint"},"服务名会被写进任务详情;worktree 从该服务的 git 路径切 task/<编号> 分支。"))),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"项目说明"),a(l,{className:"ds-input",value:w.description??"",placeholder:"这个项目做什么、给谁用",onChange:x=>L("description",x.target.value)})),a("div",{className:"ds-row",style:{gap:8}},a("button",{className:"ds-btn ds-btn-primary",disabled:b,onClick:()=>void _()},b?"保存中…":"保存项目"),a("button",{className:"ds-btn",disabled:b,onClick:()=>y(null)},"取消")))),w===null||w.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"},(w.iterations??[]).length===0?a("div",{className:"ds-empty"},"还没有迭代。可以先加一个「2026-11 迭代」。"):(w.iterations??[]).map(x=>a("div",{className:"ds-listrow",key:x.id},a("div",{className:"ds-listrow-main"},a("div",{},`${x.name} · ${Jl[x.status]??x.status}`),a("div",{className:"ds-hint"},`${x.start?new Date(x.start).toISOString().slice(0,10):"未定开始"} → ${x.due?new Date(x.due).toISOString().slice(0,10):"未定结束"}`)),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn ds-btn-ghost",disabled:b,onClick:()=>void W(w,x)},"×")))),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:x=>E({...C,name:x.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:x=>E({...C,start:x.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:x=>E({...C,due:x.target.value})})),a("div",{className:"ds-field",style:{flex:1}},a("div",{className:"ds-label"},"状态"),a(u,{className:"ds-select",value:C.status,onChange:x=>E({...C,status:x.target.value})},Object.keys(Jl).map(x=>a("option",{key:x,value:x},Jl[x])))),a("button",{className:"ds-btn",disabled:b||C.name.trim()==="",onClick:()=>void F(w)},"+ 加迭代")),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}=bt(),w=t.access??{enabled:!1,members:[]},y=e.audit??[],[k,g]=v.useState({name:"",role:"member"}),[d,h]=v.useState(!1),[b,S]=v.useState(null),[C,E]=v.useState(""),[_,I]=v.useState(!1),[F,W]=v.useState(""),L=async(x,P)=>{h(!0),S(null);try{await s(x,P),await a()}catch(G){{const te=G instanceof Error?G.message:String(G);S(te),o(te,"error")}}finally{h(!1)}},$=async()=>{const x=k.name.trim();x!==""&&(await L("/access/save",{member:{name:x,role:k.role}}),g({name:"",role:"member"}))},B=Array.from(new Set(y.map(x=>x.by))).sort(),ee=F.trim().toLowerCase(),M=y.filter(x=>(C===""||x.by===C)&&(_===!1||x.ok===!1)&&(ee===""||`${ROUTE_LABEL[x.route]??x.route} ${x.by} ${x.summary}`.toLowerCase().includes(ee))),O=M.slice(0,120),A=()=>{const x=new URLSearchParams({by:C,q:F.trim(),failed:_?"1":"0",token:r()??""}),P=document.createElement("a");P.href=`${API}/audit/export.csv?${x.toString()}`,P.rel="noopener",document.body.appendChild(P),P.click(),document.body.removeChild(P),o(`正在导出 ${M.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:w.enabled===!0,disabled:d,onChange:x=>void L("/access/save",{enabled:x.target.checked})}),n("span",null,"启用成员权限")),n("span",{className:"ds-hint"},w.enabled===!0?"已启用:写操作要认人,删除/配置/发布要管理员。":"未启用:任何人都是管理员(单机用法)。")),w.enabled===!0&&(w.members??[]).length===0?n("div",{className:"ds-error"},"已启用但名单是空的:除了名单里的人,其他人都动不了。先把你自己加进去。"):null,w.enabled===!0?n("label",{className:"ds-check"},n(p,{checked:(w.agents??"inherit")==="inherit",disabled:d,onChange:x=>void L("/access/save",{agents:x.target.checked?"inherit":"bypass"})}),n("span",null,"AI 专家也受这份名单约束")):null,w.enabled===!0?n("div",{className:"ds-hint"},(w.agents??"inherit")==="inherit"?"专家调工具时按同一张名单判权限:只读专家只能看,成员能干活,管理员才能改配置。名单里没有的专家会被拦下,记得在下面加进去。":"已豁免:专家调用工具不受名单限制,但仍记审计。适合「全交给 AI」的团队。"):null,(w.members??[]).map(x=>n("div",{key:x.name,className:"ds-listrow"},n("div",{className:"ds-listrow-main"},n("div",null,x.name,x.name===i()?n(u,{className:"ds-chip ds-chip-soft"},"我"):null),n("div",{className:"ds-hint"},(ACCESS_ROLE_OPTIONS.find(P=>P.id===x.role)??ACCESS_ROLE_OPTIONS[1]).hint)),n("div",{className:"ds-listrow-actions"},n(f,{className:"ds-select",value:x.role,disabled:d,onChange:P=>void L("/access/save",{member:{name:x.name,role:P.target.value}})},ACCESS_ROLE_OPTIONS.map(P=>n("option",{key:P.id,value:P.id},P.label))),n("button",{className:"ds-btn ds-btn-ghost",disabled:d,onClick:()=>void L("/access/delete",{name:x.name})},"移除")))),(w.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:x=>g({...k,name:x.target.value})}),n(f,{className:"ds-select",value:k.role,style:{flex:"0 0 130px"},onChange:x=>g({...k,role:x.target.value})},ACCESS_ROLE_OPTIONS.map(x=>n("option",{key:x.id,value:x.id},x.label))),n("button",{className:"ds-btn ds-btn-primary",disabled:d||k.name.trim()==="",onClick:()=>void $()},"加成员")),b!==null?n("div",{className:"ds-error"},b):null)),n("div",{className:"ds-panel"},n("div",{className:"ds-panel-head"},n("span",null,`审计日志(显示 ${O.length} / 命中 ${M.length} / 共 ${y.length} 条)`),n("div",{className:"ds-row",style:{gap:8,marginLeft:"auto"}},n(c,{className:"ds-input",placeholder:"搜动作 / 人 / 详情",value:F,style:{width:170},onChange:x=>W(x.target.value)}),n(f,{className:"ds-select",value:C===""?"__all__":C,style:{minWidth:150},onChange:x=>E(x.target.value==="__all__"?"":x.target.value)},n("option",{value:"__all__"},"所有人"),B.map(x=>n("option",{key:x,value:x},x))),n("label",{className:"ds-check"},n(p,{checked:_,onChange:x=>I(x.target.checked)}),n("span",null,"只看失败")),n("button",{className:"ds-btn ds-btn-ghost",disabled:d,onClick:async()=>{await l("清空审计日志?清掉之后所有操作记录都没了。",{title:"清空审计日志",danger:!0,okText:"清空"})&&L("/audit/clear",{})}},"清空"),n("button",{className:"ds-btn ds-btn-ghost",disabled:M.length===0,onClick:A,title:"把当前筛选结果导出为 CSV(Excel 可直接打开)"},"导出 CSV"))),n("div",{className:"ds-panel-body"},O.length===0?n("div",{className:"ds-empty"},y.length===0?"还没有记录。做一次写操作就会出现在这里。":"没有符合筛选条件的记录。把关键字清空或换个人试试。"):O.map(x=>n("div",{key:x.id,className:"ds-audit-row","data-ok":x.ok?"1":"0"},n("span",{className:"ds-audit-time"},Ke(x.at)),n("span",{className:"ds-audit-by"},x.by),n("span",{className:"ds-audit-what"},ROUTE_LABEL[x.route]??x.route),n("span",{className:"ds-audit-detail"},x.summary),n("span",{className:"ds-audit-status","data-ok":x.ok?"1":"0"},x.ok?"成功":`失败 ${x.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}=bt(),v=e.config,[w,y]=f.useState(null),[k,g]=f.useState(!1),[d,h]=f.useState(null),[b,S]=f.useState(""),C=e.statuses??[],E=f.useMemo(()=>rf(v),[v]),_=O=>{const A=v.columns?.[O];return A==null?[]:Array.isArray(A.members)?A.members:A.kind==="none"?[]:[{kind:A.kind,id:A.id}]},I=O=>v.columns?.[O]?.strategy??"round_robin",F=O=>{if(O.kind==="role")return"🎯 "+(Fa[O.id]??O.id);if(O.kind==="team"){const x=(v.teams??[]).find(P=>P.id===O.id);return x===void 0?`👥 ${O.id}`:`${x.emoji??"👥"} ${x.name}`}const A=(v.experts??[]).find(x=>x.id===O.id);return A===void 0?O.id:`${A.emoji} ${A.name}`},W=Array.isArray(v.design?.columns)?v.design.columns:["dev"],L=async O=>{g(!0),y(null);try{await r("/config",{design:{...v.design??{},...O}}),await t()}catch(A){y(A instanceof Error?A.message:String(A))}finally{g(!1)}},$=O=>{const A=W.includes(O)?W.filter(x=>x!==O):[...W,O];L({columns:A})},B=async(O,A,x)=>{g(!0),y(null);try{await r("/columns/save",{status:O,members:A,strategy:x}),await t()}catch(P){y(P instanceof Error?P.message:String(P))}finally{g(!1)}},ee=(O,A)=>{const x=A.key.startsWith("t:")?"team":A.key.startsWith("r:")?"role":"expert",P=A.key.slice(2),G=_(O);G.some(te=>te.kind===x&&te.id===P)||(S(""),B(O,[...G,{kind:x,id:P}],I(O)))},M=(O,A)=>void B(O,_(O).filter((x,P)=>P!==A),I(O));return a("div",{className:"ds-panel"},a("div",{className:"ds-panel-head"},"每一列由谁负责"),a("div",{className:"ds-panel-body"},a("div",{className:"ds-hint"},"推荐挂「角色位」:澄清/验收挂产品经理、开发挂研发工程师、测试挂测试工程师——派单时会按卡片的业务领域自动挑对应领域专家(如支付产品经理);也可以直接指定某位专家或专家团。一列可挂多人(候选池),一个都不挂就只把卡停在原地等人认领。"),a("div",{className:"ds-hint",style:{marginTop:14}},"设计闸门:打开后,卡片进下面选中的列之前设计必须评审通过(验收时可 override 强推)。"),a("div",{className:"ds-row",style:{gap:8,flexWrap:"wrap",marginTop:6}},a("button",{className:v.design?.enabled===!0?"ds-btn ds-btn-primary":"ds-btn",disabled:k,"data-design-gate":v.design?.enabled===!0?"on":"off",onClick:()=>void L({enabled:v.design?.enabled!==!0})},v.design?.enabled===!0?"设计闸门:已开启":"设计闸门:已关闭"),C.map(O=>a("button",{key:"gate-"+O.id,className:W.includes(O.id)?"ds-btn ds-btn-primary":"ds-btn",disabled:k,onClick:()=>$(O.id)},O.label??O.id))),C.map(O=>{const A=_(O.id),x=I(O.id);return a("div",{className:"ds-colrow",key:O.id},a("div",{className:"ds-colrow-head"},a("span",{className:"ds-colrow-name"},O.label??O.id),A.length===0?a("span",{className:"ds-hint"},"👤 等人认领(不自动派)"):A.map((P,G)=>a(c,{className:"ds-chip ds-chip-owner",key:`${P.kind}:${P.id}`},F(P),a("button",{className:"ds-chip-x",title:"从候选里去掉",disabled:k,onClick:()=>M(O.id,G)},"×"))),a("button",{className:"ds-btn",style:{marginLeft:"auto"},disabled:k,onClick:()=>{S(""),h(P=>P===O.id?null:O.id)}},d===O.id?"收起":"+ 加候选"),A.length>=2?a(p,{className:"ds-input",style:{width:240},value:x,disabled:k,onChange:P=>void B(O.id,A,P.target.value)},STRATEGIES.map(P=>a("option",{key:P.id,value:P.id},P.label))):null),d===O.id?a("div",{className:"ds-colpick"},a(l,{className:"ds-mention-search",autoFocus:!0,value:b,placeholder:"搜专家或专家团,点一下加进候选",onChange:P=>S(P.target.value)}),a("div",{className:"ds-colpick-list"},Go(E,b).length===0?a("div",{className:"ds-mention-empty"},"没有匹配的专家或专家团"):Go(E,b).map(P=>a("button",{key:P.key,className:"ds-mention-item",onClick:()=>ee(O.id,P)},a("span",null,P.emoji),a("span",null,P.name),a("span",{className:"ds-hint"},P.hint))))):null)}),w!==null?a("div",{className:"ds-error"},w):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}=bt(),[v,w]=f.useState(e.storage??null),[y,k]=f.useState([]),[g,d]=f.useState(null),[h,b]=f.useState(null),[S,C]=f.useState(!1),E=f.useCallback(()=>{r("/snapshots").then(F=>{w(F.storage??null),k(F.snapshots??[]),d(null)}).catch(F=>d(F instanceof Error?F.message:String(F)))},[]);f.useEffect(()=>{E()},[E,e.revision]);const _=async F=>{await i(`把看板回滚到快照 #${F}?当前的这一版会先另存一份,不会丢。`,{title:"回滚快照",okText:"回滚"})&&(C(!0),b(null),r("/snapshot/restore",{id:F}).then(()=>{b(`已回滚到快照 #${F}`),E(),t?.()}).catch(W=>d(W instanceof Error?W.message:String(W))).finally(()=>C(!1)))},I=F=>{const W=new Date(Number(F)||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,y.length===0?a("div",{className:"ds-hint"},v?.engine==="sqlite"?"还没有快照。":"单文件模式没有快照(这台机器的 node 不支持 node:sqlite 时会退回单文件)。"):y.map(F=>a("div",{key:F.id,className:"ds-listrow"},a("div",{className:"ds-listrow-main"},a("div",null,`#${F.id} · rev ${F.revision}`),a("div",{className:"ds-hint"},`${I(F.at)} · ${(F.bytes/1024).toFixed(1)} KB`)),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn ds-btn-ghost",disabled:S,onClick:()=>_(F.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}=bt(),w=e.integrations??{channels:[],broken:0},[y,k]=v.useState(""),[g,d]=v.useState(null),h=(e.requirements??[]).find(x=>(x.folder?.token??"")!==""),b=e.agents??{},S=b.lock??null,C=S===null?0:Math.max(0,Date.now()-(Number(S.at)||0)),[E,_]=v.useState(""),[I,F]=v.useState(!1),W=E.trim().toLowerCase(),L=(b.log??[]).filter(x=>{const P=String(x?.line??"");return I&&!/失败|错误|异常|拦|拒绝/.test(P)?!1:W===""||P.toLowerCase().includes(W)}),$=L.slice(0,12),B=()=>{const x=new URLSearchParams({q:E.trim(),failed:I?"1":"0",token:r()??""}),P=document.createElement("a");P.href=`${API}/export/dispatch.csv?${x.toString()}`,P.rel="noopener",document.body.appendChild(P),P.click(),document.body.removeChild(P),o(`正在导出 ${L.length} 条派单日志`)},ee=async x=>{k(x),d(null);try{if(x==="gitlab"){const P=await s("/gitlab/sync",{});d(P.report===void 0?"已触发 GitLab 同步":`已同步:${(P.report.projects??[]).map(G=>`${G.name} +${G.created}`).join(",")||"无新卡"}`)}else if(x==="drive")if(h===void 0)d("还没有带云盘文件夹的需求,先建一条需求并归档一次。");else{const P=await s("/requirement/sync",{id:h.id});d(`已归档 ${P.report?.written??0} / ${P.report?.total??0} 件`),o(`已归档 ${P.report?.written??0} / ${P.report?.total??0} 件`)}else if(x==="feishu"){const P=await s("/feishu/test",{});d(P.ok===!0?"测试消息已发出":`发送失败:${P.result?.error??"没配置机器人"}`)}else d("代码隔离没有独立的重试入口,下一张卡派单时会自动重试。");await a()}catch(P){{const G=P instanceof Error?P.message:String(P);d(G),o(G,"error")}}finally{k("")}},M=x=>{const P=Number(x)||0;if(P===0)return"—";const G=new Date(P);return`${G.getMonth()+1}-${String(G.getDate()).padStart(2,"0")} ${String(G.getHours()).padStart(2,"0")}:${String(G.getMinutes()).padStart(2,"0")}`},O={ok:"正常",error:"异常",idle:"还没用过"},A={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":b.enabled===!0?"1":"0"},b.enabled===!0?"运行中":"已停用"),n("div",{className:"ds-row",style:{gap:8,marginLeft:"auto"}},n(c,{className:"ds-input",placeholder:"搜派单日志",value:E,style:{width:150},onChange:x=>_(x.target.value)}),n("label",{className:"ds-check"},n(p,{checked:I,onChange:x=>F(x.target.checked)}),n("span",null,"只看失败")),n("button",{className:"ds-btn ds-btn-ghost",disabled:L.length===0,onClick:B,title:"把当前筛选结果导出为 CSV"},"导出 CSV"))),n("div",{className:"ds-panel-body"},n("div",{className:"ds-kv"},n("dt",{},"实例"),n("dd",{},String(b.instance??"—")),n("dt",{},"派单锁"),n("dd",{},S===null?"还没抢到过(可能是内存模式)":`${S.mine===!0?"本进程持有":"其他实例持有"} · ${Math.round(C/1e3)} 秒前续租`),n("dt",{},"并发占用"),n("dd",{},`${(b.running??[]).length} / ${b.maxConcurrent??"—"}`),n("dt",{},"最近一轮"),n("dd",{},M(b.lastTickAt)),n("dt",{},"最近错误"),n("dd",{},String(b.lastError??"")===""?"无":String(b.lastError))),(b.log??[]).length===0?n("div",{className:"ds-empty"},"还没有派单日志。卡进入自动列后,这里会出现派单、空闲、失败记录。"):$.length===0?n("div",{className:"ds-empty"},"没有符合筛选条件的派单日志。"):n("div",{className:"ds-log"},$.map((x,P)=>n("div",{key:String(P),className:"ds-log-line"},`${M(x.at)} · ${String(x.line??"")}`))),(b.log??[]).length>0&&L.length>$.length?n("div",{className:"ds-hint"},`只显示最近 ${$.length} / 命中 ${L.length} 条,导出可看全量`):null)),n("div",{className:"ds-panel"},n("div",{className:"ds-panel-head"},"集成状态",n(u,{className:"ds-chip","data-on":w.broken===0?"1":"0"},w.broken===0?"全部正常":`${w.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,w.channels.length===0?n("div",{className:"ds-empty"},"还没有调用过任何外部集成。配好 GitLab / 飞书机器人 / 云盘文件夹后,第一次成功或失败就会出现在这里。"):w.channels.map(x=>n("div",{key:x.channel,className:"ds-listrow"},n("div",{className:"ds-listrow-main"},n("div",null,n("span",{style:{color:A[x.state],fontWeight:700}},"● "),x.label,n(u,{className:"ds-chip ds-chip-soft",style:{marginLeft:6}},O[x.state])),n("div",{className:"ds-hint"},x.hint),n("div",{className:"ds-hint"},`最近一次:${M(x.at)} · 成功 ${M(x.lastOkAt)} · 失败 ${M(x.lastErrorAt)}${x.attempts>0?` · 试着调了 ${x.attempts} 次,连挂 ${x.failures} 次`:""}`),x.lastError===""?null:n("div",{className:"ds-error"},x.lastError)),n("div",{className:"ds-listrow-actions"},n("button",{className:"ds-btn ds-btn-ghost",disabled:y!=="",onClick:()=>void ee(x.channel)},y===x.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}=bt(),w=e.gitlab?.projects??[],[y,k]=v.useState(null),[g,d]=v.useState(null),[h,b]=v.useState(null),[S,C]=v.useState(!1),E=async()=>{if(y!==null){C(!0),d(null),b(null);try{await r("/repos/save",{project:y}),k(null),b("已保存"),s("已保存"),await t()}catch($){d($ instanceof Error?$.message:String($))}finally{C(!1)}}},_=async $=>{if(await o(`删除 GitLab 项目「${$.name}」?已同步的卡片会保留。`,{title:"删除 GitLab 项目",danger:!0,okText:"删除"})){C(!0),d(null);try{await r("/repos/delete",{id:$.id}),await t()}catch(B){d(B instanceof Error?B.message:String(B))}finally{C(!1)}}},I=async $=>{C(!0),d(null),b(null);try{const B=await r("/repos/test",{id:$.id});b(`连通:${$.project}(示例 Issue ${B.sample} 条)`)}catch(B){d(B instanceof Error?B.message:String(B))}finally{C(!1)}},F=async $=>{C(!0),d(null),b(null);try{const ee=((await r("/gitlab/sync",{project:$.id})).summary?.projects??[])[0];b(ee===void 0?"没有可同步的项目":`${ee.name}:拉取 ${ee.fetched},新建 ${ee.created}${ee.error?",错误 "+ee.error:""}`),await t()}catch(B){d(B instanceof Error?B.message:String(B))}finally{C(!1)}},W=($,B)=>k({...y,[$]:B}),L=w.map($=>a("div",{className:"ds-listrow",key:$.id},a("div",{className:"ds-listrow-main"},a("div",{},`${$.name||$.project}${$.syncEnabled?" · 自动同步":""}${$.tokenSet?"":" · 缺令牌"}`),a("div",{className:"ds-hint"},`${$.url||e.gitlab.url||"(未填地址)"} / ${$.project}${$.lastSyncAt?" · 上次 "+new Date($.lastSyncAt).toLocaleString():""}`),$.lastSyncError?a("div",{className:"ds-error"},$.lastSyncError):null),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn",disabled:S,onClick:()=>void F($)},"同步"),a("button",{className:"ds-btn",disabled:S,onClick:()=>void I($)},"测试"),a("button",{className:"ds-btn",disabled:S,onClick:()=>k({...$,token:""})},"编辑"),i("删除这个项目(卡不会删)",a("button",{className:"ds-btn",disabled:S,onClick:()=>void _($),"data-danger":"1"},"删除")))));return a("div",{className:"ds-pane-stack"},a(n,{title:"代码仓库(GitLab,可以有多个)",hint:"每个项目单独填地址、项目路径和令牌;同步时按项目分开去重,两个仓库都有 #12 也不会串。",rows:L,onAdd:()=>k({id:"",name:"",url:e.gitlab?.url??"",project:"",token:"",syncEnabled:!1,syncLabel:""}),addLabel:"新增项目",render:$=>$,empty:"还没有项目,点「新增项目」。"}),h!==null?a("div",{className:"ds-ok",style:{marginBottom:8}},h):null,y===null?null:a(f,{title:y.id?`编辑仓库:${y.name||y.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:y.name,placeholder:"订单服务",onChange:$=>W("name",$.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"GitLab 地址"),a(l,{className:"ds-input",value:y.url,placeholder:"https://gitlab.example.com",onChange:$=>W("url",$.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"项目路径(含 namespace)"),a(l,{className:"ds-input",value:y.project,placeholder:"backend/order-service",onChange:$=>W("project",$.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},y.tokenSet?"Access Token(已设置,留空则不修改)":"Access Token"),a(l,{className:"ds-input",type:"password",value:y.token,placeholder:y.tokenSet?"••••••••":"glpat-…",onChange:$=>W("token",$.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:y.syncLabel,placeholder:"留空则同步全部 open Issue",onChange:$=>W("syncLabel",$.target.value)})),a("div",{className:"ds-field"},a("label",{className:"ds-row",style:{alignItems:"center",gap:8,cursor:"pointer"}},a(u,{checked:y.syncEnabled===!0,onChange:$=>W("syncEnabled",$.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}=bt(),w=e.feishu?.bots??[],[y,k]=v.useState(null),[g,d]=v.useState(null),[h,b]=v.useState(null),[S,C]=v.useState(!1),[E,_]=v.useState(e.feishu?.driveFolder??""),[I,F]=v.useState(e.feishu?.autoSyncArtifacts!==!1),[W,L]=v.useState(!1),[$,B]=v.useState(null),ee=async()=>{L(!0),B(null);try{await r("/config",{feishu:{driveFolder:E.trim(),autoSyncArtifacts:I}}),B("已保存"),await t()}catch(q){B(q instanceof Error?q.message:String(q))}finally{L(!1)}},M=async()=>{if(y!==null){C(!0),d(null),b(null);try{await r("/bots/save",{bot:y}),k(null),b("已保存"),s("已保存"),await t()}catch(q){d(q instanceof Error?q.message:String(q))}finally{C(!1)}}},O=async q=>{if(await o(`删除飞书机器人「${q.name}」?`,{title:"删除机器人",danger:!0,okText:"删除"})){C(!0),d(null);try{await r("/bots/delete",{id:q.id}),await t()}catch(K){d(K instanceof Error?K.message:String(K))}finally{C(!1)}}},A=async q=>{C(!0),d(null),b(null);try{const ke=((await r("/feishu/test",{id:q.id})).results??[])[0];b(ke!==void 0&&ke.ok===!0?`「${q.name}」测试消息已发送`:`「${q.name}」发送失败:${ke?.error??"检查 Webhook"}`)}catch(K){d(K instanceof Error?K.message:String(K))}finally{C(!1)}},x=(q,K)=>k({...y,[q]:K}),P=q=>{const K=y.events!==null&&typeof y.events=="object"?y.events:null;return K===null?q==="change"?y.notifyOnChange!==!1:!0:K[q]!==!1},G=(q,K)=>{const pe={...y.events!==null&&typeof y.events=="object"?y.events:{},[q]:K};k({...y,events:pe,notifyOnChange:pe.change!==!1})},te=w.map(q=>a("div",{className:"ds-listrow",key:q.id},a("div",{className:"ds-listrow-main"},a("div",{},`${q.name}${q.enabled===!1?" (已停用)":""}${q.webhookSet?"":" · 缺 Webhook"}`),a("div",{className:"ds-hint"},`Webhook ${q.webhookHint||"(未设置)"}${q.chatId?" · 群 "+q.chatId:""} · 收:${Xx(q).join(" / ")||"什么都不收"}`)),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn",disabled:S,onClick:()=>void A(q)},"测试"),a("button",{className:"ds-btn",disabled:S,onClick:()=>k({...q,webhook:""})},"编辑"),a("button",{className:"ds-btn",disabled:S,onClick:()=>void O(q),"data-danger":"1"},"删除"))));return a("div",{className:"ds-pane-stack"},a(n,{title:"飞书机器人(可以有多个)",hint:"一个群建一个机器人,并在下面勾选它要收哪些事件;研发群只勾缺陷相关,产品群只勾版本发布。",rows:te,onAdd:()=>k({id:"",name:"",webhook:"",chatId:"",notifyOnChange:!0,events:{change:!0,sla:!0,bug:!0,release:!0},enabled:!0}),addLabel:"新增机器人",render:q=>q,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:q=>_(q.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:q=>F(q.target.checked)}),a("span",{},"专家登记交付物时自动归档(关掉就只存平台里)")),a("div",{className:"ds-row",style:{gap:8}},a("button",{className:"ds-btn ds-btn-primary",disabled:W,onClick:()=>void ee()},W?"保存中…":"保存"),$!==null?a("div",{className:"ds-hint"},$):null))),y===null?null:a(f,{title:y.id?`编辑机器人:${y.name||y.id}`:"新增机器人",hint:"Webhook 只写盘不回显,留空表示不修改;一个群建一个机器人即可。",onClose:()=>k(null),footer:[a("button",{key:"save",className:"ds-btn ds-btn-primary",disabled:S,onClick:()=>void M()},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:y.name,placeholder:"研发群通知",onChange:q=>x("name",q.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},y.webhookSet?"Webhook(已设置,留空则不修改)":"Webhook"),a(l,{className:"ds-input",type:"password",value:y.webhook,placeholder:"https://open.feishu.cn/open-apis/bot/v2/hook/…",onChange:q=>x("webhook",q.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:y.chatId,placeholder:"oc_…",onChange:q=>x("chatId",q.target.value)})),a("div",{className:"ds-field"},a("div",{className:"ds-label"},"收哪些事件"),a("div",{className:"ds-row",style:{gap:16,flexWrap:"wrap"}},...cf.map(q=>a("label",{key:q.key,className:"ds-row",style:{alignItems:"center",gap:8,cursor:"pointer"}},a(u,{checked:P(q.key),onChange:K=>G(q.key,K.target.checked)}),a("span",{},q.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:y.enabled!==!1,onChange:q=>x("enabled",q.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}=bt(),[w,y]=v.useState(null),[k,g]=v.useState(null),[d,h]=v.useState(null),[b,S]=v.useState(null),[C,E]=v.useState(!1),[_,I]=v.useState(!1),[F,W]=v.useState(!1),L=v.useCallback(async()=>{try{const q=await r("/skills");y({root:q.root,skills:q.skills??[],onDisk:q.onDisk??[]})}catch(q){h(q instanceof Error?q.message:String(q))}},[]);v.useEffect(()=>{L()},[L]);const $=w?.skills??[],B=w?.onDisk??[],ee=q=>(e.experts??[]).filter(K=>(K.skills??[]).includes(q)),M=(q,K)=>g({...k,[q]:K}),O=async()=>{if(k!==null){E(!0),h(null),S(null);try{const q=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(q.warning??(q.file?`已写入 ${q.file}`:"已保存")),await L(),await t()}catch(q){h(q instanceof Error?q.message:String(q))}finally{E(!1)}}},A=async q=>{if(await o(`删除技能「${q.name}」?磁盘上的 SKILL.md 也会一起删掉。`,{title:"删除技能",danger:!0,okText:"删除"})){E(!0),h(null),S(null);try{await r("/skills/delete",{name:q.name}),await L(),await t()}catch(K){h(K instanceof Error?K.message:String(K))}finally{E(!1)}}},x=async()=>{E(!0),h(null),S(null);try{const q=await r("/skills/sync",{});S(`已重新写入 ${(q.written??[]).length} 条技能`),await L()}catch(q){h(q instanceof Error?q.message:String(q))}finally{E(!1)}},P=async q=>{if(q!=null){I(!0),h(null),S(null);try{const K=new Uint8Array(await q.arrayBuffer());let ke="";const pe=32768;for(let H=0;H<K.length;H+=pe)ke+=String.fromCharCode.apply(null,K.subarray(H,H+pe));const xe=await r("/skills/upload",{fileName:q.name,dataBase64:window.btoa(ke),overwrite:F}),Y=xe.overwritten===!0?"已覆盖":"已上传";S(`${Y}技能「${xe.skill.name}」${xe.file?`,写入 ${xe.file}`:""}`),g(null),await L(),await t()}catch(K){h(K instanceof Error?K.message:String(K))}finally{I(!1)}}},G=$.map(q=>a("div",{className:"ds-listrow",key:q.name},a("div",{className:"ds-listrow-main"},a("div",{},a("code",{},q.name),(q.tags??[]).map(K=>a(c,{className:"ds-chip",key:K},K)),q.enabled===!1?a("span",{className:"ds-hint"}," (已停用)"):null,B.includes(q.name)?null:a("span",{className:"ds-err"}," 未落盘")),a("div",{className:"ds-hint"},q.description),q.whenToUse?a("div",{className:"ds-hint"},`何时用:${q.whenToUse}`):null,ee(q.name).length>0?a("div",{className:"ds-hint"},`使用中的专家:${ee(q.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({...q,editing:!0,tags:(q.tags??[]).join(", ")})}},"编辑"),a("button",{className:"ds-btn",disabled:C,onClick:()=>void A(q),"data-danger":"1"},"删除")))),te=B.filter(q=>!$.some(K=>K.name===q));return a("div",{className:"ds-pane-stack"},a(n,{title:"技能库(skills-manager)",hint:w===null?"读取中…":`保存在 ${w.root}/<名字>/SKILL.md,所有专家都能用 skill 工具加载;专家也可以自己用 studio_skill_save 往这里加技能。支持上传 SKILL.md 或包含 SKILL.md 的 .zip 技能包。`,rows:G,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:q=>q,empty:"还没有技能。把一次摸索出来的做法写成第一条,下次就不用重新摸索。"}),te.length>0?a("div",{className:"ds-hint"},`磁盘上还有 ${te.length} 个不归这里管的技能目录:${te.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:q=>{const K=q.target.files===null?void 0:q.target.files[0];q.target.value="",P(K)}})),a("label",{className:"ds-hint",style:{display:"flex",alignItems:"center",gap:6,cursor:"pointer"}},a(u,{checked:F,onChange:q=>W(q.target.checked)}),"覆盖同名技能"),a("button",{className:"ds-btn",disabled:C||$.length===0,onClick:()=>void x()},"重新写入磁盘"),b!==null?a("span",{className:"ds-ok"},b):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 O()},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:q=>M("name",q.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:q=>M("description",q.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:q=>M("whenToUse",q.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:q=>M("tags",q.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=>ie({...X,steps:m.target.value})}),e("div",{
|
|
|
39
39
|
|
|
40
40
|
# 坑
|
|
41
41
|
|
|
42
|
-
- `,onChange:O=>q("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=>q("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}=bt(),[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 w=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()},"看用例"))})(),y=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)},"打开"))),b=(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"},w,r("div",{className:"ds-kpi-grid"},d("在办卡",l.scope.open,`共 ${l.scope.tasks} 张`),d("逾期",y.overdue,"过了期望完成时间还没完成",y.overdue>0),d("阻塞",y.blocked,"挂着阻塞标记等人决策",y.blocked>0),d("缺陷超时",y.slaOverdue,"按 P0-P3 时限算",y.slaOverdue>0),d("准出被拦",y.gateFailed,"待测试/待验收里过不了准出",y.gateFailed>0),d("流水线失败",y.pipelineFailed,"最近一次 CI 没通过",y.pipelineFailed>0),d("集成异常",y.integrationsBroken,"飞书/GitLab/云盘/隔离",y.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(y.requirementBlocked??0))),r("div",{className:"ds-field"},r("div",{className:"ds-label"},"版本卡住"),r("div",null,String(y.releaseBlocked??0))),r("div",{className:"ds-field"},r("div",{className:"ds-label"},""),r("button",{className:"ds-btn ds-btn-ghost",onClick:()=>a()},"去看板")))),b("逾期",(l.list?.overdue??[]).map(h),"没有逾期的卡。"),b("阻塞",(l.list?.blocked??[]).map(h),"没有卡在等人决策。"),b("缺陷超时",(l.list?.slaOverdue??[]).map(h),"缺陷都在时限内。"),b("准出被拦",(l.list?.gateFailed??[]).map(h),"没有卡被准出规则拦住。","清单没勾完 / 用例不通过 / 已签过字但被打回"),b("流水线失败",(l.list?.pipelineFailed??[]).map(h),"没有 CI 失败的卡。"),b("需求与版本卡住",[...(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}=bt(),[f,v]=n.useState(null),[w,y]=n.useState(null),[k,g]=n.useState(""),[d,h]=n.useState("__all__"),[b,S]=n.useState("__all__"),[C,E]=n.useState(()=>new Set),[_,I]=n.useState(!1),[z,H]=n.useState([]),[M,$]=n.useState({}),[B,J]=n.useState({}),[q,L]=n.useState(null),[A,x]=n.useState(""),[P,K]=n.useState([]),[R,O]=n.useState(null),G=n.useCallback(async()=>{try{const U=await r("/cases",{});v(Array.isArray(U.cases)?U.cases:[]),K(Array.isArray(U.regressions)?U.regressions:[]),H(Array.isArray(U.suites)?U.suites:[]),$(Object.fromEntries((U.counts??[]).map(he=>[he.id,he.count]))),J(Object.fromEntries((U.counts??[]).map(he=>[he.id,he.keys??[]]))),y(null)}catch(U){y(U instanceof Error?U.message:String(U)),v([])}},[]),we=(e.tasks??[]).reduce((U,he)=>{const je=he.caseSummary??{total:0,pass:0,fail:0};return U+je.total*7+je.pass*13+je.fail*17},0);n.useEffect(()=>{G()},[G,we]);const fe=n.useMemo(()=>{const U=k.trim().toLowerCase(),he=q===null?null:new Set(B[q]??[]);return(f??[]).filter(je=>he!==null&&!he.has(je.key)||d!=="__all__"&&je.requirementId!==d||b!=="__all__"&&je.result!==b?!1:U===""?!0:`${je.id} ${je.title} ${je.taskTitle} ${je.requirementTitle} ${je.pointId}`.toLowerCase().includes(U))},[f,k,d,b,q,B]),ye=n.useMemo(()=>{const U=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:U,fail:he,skip:je,rest:fe.length-U-he-je}},[fe]),He=e.requirements??[],ae=fe.filter(U=>U.runnable===!0),F=ae.filter(U=>C.has(U.key)),te=U=>E(he=>{const je=new Set(he);return je.has(U)?je.delete(U):je.add(U),je}),xe=()=>E(new Set(ae.map(U=>U.key))),X=()=>E(new Set),ie=async U=>{if(U.length===0){x("先勾几条带接口定义的用例再跑(手工用例没有 http,跑不了)");return}I(!0),x("");try{const je=(await r("/cases/run",{keys:U.map(st=>st.key),by:"回归"}))?.results??[],Ue=st=>je.reduce((Et,pt)=>Et+(Number(pt[st])||0),0),It=je.filter(st=>st.ok===!1),Gt=[`跑了 ${je.length} 张卡 / ${Ue("total")} 条:通过 ${Ue("passed")},不通过 ${Ue("failed")}`];Ue("bugs")>0&&Gt.push(`自动开缺陷 ${Ue("bugs")} 张`),It.length>0&&Gt.push(`${It.length} 张卡报错:${It[0].error??""}`),x(Gt.join(",")),E(new Set),await G()}catch(he){x(he instanceof Error?he.message:String(he))}finally{I(!1)}},ge=U=>{const he=U?.results??[],je=Gt=>he.reduce((st,Et)=>st+(Number(Et[Gt])||0),0),Ue=he.filter(Gt=>Gt.ok===!1),It=[`跑了 ${he.length} 张卡 / ${je("total")} 条:通过 ${je("passed")},不通过 ${je("failed")}`];return je("bugs")>0&&It.push(`自动开缺陷 ${je("bugs")} 张`),Ue.length>0&&It.push(`${Ue.length} 张卡报错:${Ue[0].error??""}`),U?.truncated!==void 0&&It.push(`套件共 ${U.truncated.total} 条,本次只跑了前 ${U.truncated.ran} 条`),It.join(",")},W=async U=>{I(!0),x("");try{const he=await r("/suite/run",{id:U.id});x(ge(he)),await G()}catch(he){x(he instanceof Error?he.message:String(he))}finally{I(!1)}},Ee=async()=>{const U=await i("套件名字(跑的就是当前筛选里的用例)",{title:"新建回归套件",defaultValue:"默认回归"});if(!(U===null||String(U).trim()===""))try{await r("/suite/save",{suite:{name:String(U).trim().slice(0,40),rules:{requirementIds:d==="__all__"?[]:[d],httpOnly:!0},keys:[],isDefault:z.length===0},by:"人"}),s("已保存套件"),await G()}catch(he){s(he instanceof Error?he.message:String(he),"error")}},ke=async U=>{try{await r("/suite/save",{suite:{...U,isDefault:!0},by:"人"}),s(`夜间回归改跑「${U.name}」`),await G()}catch(he){s(he instanceof Error?he.message:String(he),"error")}},Ae=async U=>{if(await o(`删除套件「${U.name}」?用例本身不受影响。`,{title:"删除套件",danger:!0,okText:"删除"}))try{await r("/suite/delete",{id:U.id}),await G()}catch(he){s(he instanceof Error?he.message:String(he),"error")}},Ve=fe.filter(U=>U.runnable===!0&&U.result==="fail"),Ya=()=>ie(F),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:U=>g(U.target.value)}),a(c,{className:"ds-select",style:{width:220},value:d,onChange:U=>h(U.target.value)},a("option",{value:"__all__"},"全部需求"),He.map(U=>a("option",{key:U.id,value:U.id},`${U.code||U.id} ${U.title}`))),a(c,{className:"ds-select",style:{width:140},value:b,onChange:U=>S(U.target.value)},a("option",{value:"__all__"},"全部结果"),Zp.map(U=>a("option",{key:U,value:U},Ql[U])))),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 Ya()},_?"跑着…":`▶ 跑选中的 ${F.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"},"回归套件:"),z.length===0?a("span",{className:"ds-hint"},"还没有套件。把当前筛选存成套件,夜间就自动跑它。"):z.map(U=>a("span",{key:U.id,className:"ds-suite","data-default":U.isDefault?"1":"0"},a("span",{style:{cursor:"pointer"},title:"点一下只看这个套件里的用例,再点一次取消",onClick:()=>L(he=>he===U.id?null:U.id)},`📦 ${U.name}${U.isDefault?" · 默认":""} · ${M[U.id]??0} 条${q===U.id?"(只看中)":""}`),a("button",{className:"ds-btn ds-btn-ghost",disabled:_||(M[U.id]??0)===0,onClick:()=>void W(U)},"▶ 跑"),U.isDefault?null:a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void ke(U)},"设为默认"),a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void Ae(U),"data-danger":"1"},"删除"))),a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void Ee()},"+ 存为套件")),A===""?null:a("div",{className:"ds-hint",style:{marginTop:6}},A),P.length===0?null:a("div",{className:"ds-reg-list"},a("span",{className:"ds-hint"},"最近回归:"),P.slice(0,4).map(U=>a("span",{key:String(U.at),className:"ds-reg-item","data-bad":(Number(U.failed)||0)+(Number(U.failedCards)||0)>0?"1":"0",title:`${new Date(U.at).toLocaleString("zh-CN")} · ${U.by||"人"}`},`${Ke(U.at)} ${U.by||""} · ${U.cards} 卡 / ${U.total} 条 · ✅${U.passed} ❌${U.failed}${U.bugs>0?` 🐞${U.bugs}`:""}`))),w!==null?a("div",{className:"ds-err"},w):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(U=>a("div",{key:U.key,className:"ds-case-lib-wrap"},a("div",{className:"ds-case-lib-row","data-result":U.result,title:"打开所属卡片",onClick:()=>t(U.taskId)},a("span",{className:"ds-case-lib-pick",onClick:he=>he.stopPropagation()},a(p,{checked:C.has(U.key),disabled:_||U.runnable!==!0,onChange:()=>te(U.key)})),a("span",{className:"ds-case-lib-result"},Ql[U.result]??U.result),a("span",{className:"ds-case-lib-title"},U.title),a("span",{className:"ds-case-lib-meta"},`${U.taskCode||U.taskId} · ${U.requirementTitle||"未挂需求"}${U.pointId?" · "+U.pointId:""}`),a("span",{className:"ds-case-lib-meta"},U.http?"接口":U.shell?"shell":U.db?"数据库":"手工"),a("span",{className:"ds-case-lib-pri"},U.priority),a("span",{className:"ds-case-lib-at"},U.lastRunAt>0?Ke(U.lastRunAt):"没跑过"),a("button",{className:"ds-btn ds-btn-ghost ds-case-lib-more",title:"看最近一次执行的明细",onClick:he=>{he.stopPropagation(),O(R===U.key?null:U.key)}},R===U.key?"收起":"明细")),R===U.key?a("div",{className:"ds-case-lib-detail"},a("div",null,`期望:${U.expected||"—"}`),a("div",null,`最近一次:${U.note||(U.lastRunAt>0?"只有结果,没有记录":"还没跑过")}`),U.lastError===""?null:a("div",{className:"ds-err"},`错误:${U.lastError}`),U.lastPreview===""?null:a("pre",{className:"ds-case-lib-preview"},U.lastPreview),a("div",{className:"ds-hint"},`用例编号 ${U.id} · 所属卡片 ${U.taskCode||U.taskId}`)):null))))))}function aw({value:e,tone:t}){const{h:a,kit:n}=bt(),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}=bt(),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,`
|
|
42
|
+
- `,onChange:q=>M("content",q.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:q=>M("enabled",q.target.checked)}),a("span",{},"启用(停用则不写入磁盘)")))))}function ew({state:e,onOpenTask:t,onOpenBoard:a,onOpenCases:n}){const{h:r,React:s,api:o,toast:i}=bt(),[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 w=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()},"看用例"))})(),y=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?` · 截止 ${en(S.dueAt)}`:""}${S.sla?.state==="overdue"?" · 缺陷超时":""}`)),r("div",{className:"ds-listrow-actions"},r("button",{className:"ds-btn ds-btn-ghost",onClick:()=>t(S.id)},"打开"))),b=(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"},w,r("div",{className:"ds-kpi-grid"},d("在办卡",l.scope.open,`共 ${l.scope.tasks} 张`),d("逾期",y.overdue,"过了期望完成时间还没完成",y.overdue>0),d("阻塞",y.blocked,"挂着阻塞标记等人决策",y.blocked>0),d("缺陷超时",y.slaOverdue,"按 P0-P3 时限算",y.slaOverdue>0),d("准出被拦",y.gateFailed,"待测试/待验收里过不了准出",y.gateFailed>0),d("流水线失败",y.pipelineFailed,"最近一次 CI 没通过",y.pipelineFailed>0),d("集成异常",y.integrationsBroken,"飞书/GitLab/云盘/隔离",y.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(y.requirementBlocked??0))),r("div",{className:"ds-field"},r("div",{className:"ds-label"},"版本卡住"),r("div",null,String(y.releaseBlocked??0))),r("div",{className:"ds-field"},r("div",{className:"ds-label"},""),r("button",{className:"ds-btn ds-btn-ghost",onClick:()=>a()},"去看板")))),b("逾期",(l.list?.overdue??[]).map(h),"没有逾期的卡。"),b("阻塞",(l.list?.blocked??[]).map(h),"没有卡在等人决策。"),b("缺陷超时",(l.list?.slaOverdue??[]).map(h),"缺陷都在时限内。"),b("准出被拦",(l.list?.gateFailed??[]).map(h),"没有卡被准出规则拦住。","清单没勾完 / 用例不通过 / 已签过字但被打回"),b("流水线失败",(l.list?.pipelineFailed??[]).map(h),"没有 CI 失败的卡。"),b("需求与版本卡住",[...(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}=bt(),[f,v]=n.useState(null),[w,y]=n.useState(null),[k,g]=n.useState(""),[d,h]=n.useState("__all__"),[b,S]=n.useState("__all__"),[C,E]=n.useState(()=>new Set),[_,I]=n.useState(!1),[F,W]=n.useState([]),[L,$]=n.useState({}),[B,ee]=n.useState({}),[M,O]=n.useState(null),[A,x]=n.useState(""),[P,G]=n.useState([]),[te,q]=n.useState(null),K=n.useCallback(async()=>{try{const U=await r("/cases",{});v(Array.isArray(U.cases)?U.cases:[]),G(Array.isArray(U.regressions)?U.regressions:[]),W(Array.isArray(U.suites)?U.suites:[]),$(Object.fromEntries((U.counts??[]).map(ve=>[ve.id,ve.count]))),ee(Object.fromEntries((U.counts??[]).map(ve=>[ve.id,ve.keys??[]]))),y(null)}catch(U){y(U instanceof Error?U.message:String(U)),v([])}},[]),ke=(e.tasks??[]).reduce((U,ve)=>{const De=ve.caseSummary??{total:0,pass:0,fail:0};return U+De.total*7+De.pass*13+De.fail*17},0);n.useEffect(()=>{K()},[K,ke]);const pe=n.useMemo(()=>{const U=k.trim().toLowerCase(),ve=M===null?null:new Set(B[M]??[]);return(f??[]).filter(De=>ve!==null&&!ve.has(De.key)||d!=="__all__"&&De.requirementId!==d||b!=="__all__"&&De.result!==b?!1:U===""?!0:`${De.id} ${De.title} ${De.taskTitle} ${De.requirementTitle} ${De.pointId}`.toLowerCase().includes(U))},[f,k,d,b,M,B]),xe=n.useMemo(()=>{const U=pe.filter(qe=>qe.result==="pass").length,ve=pe.filter(qe=>qe.result==="fail").length,De=pe.filter(qe=>qe.result==="skip").length;return{pass:U,fail:ve,skip:De,rest:pe.length-U-ve-De}},[pe]),Y=e.requirements??[],H=pe.filter(U=>U.runnable===!0),R=H.filter(U=>C.has(U.key)),ne=U=>E(ve=>{const De=new Set(ve);return De.has(U)?De.delete(U):De.add(U),De}),we=()=>E(new Set(H.map(U=>U.key))),Z=()=>E(new Set),le=async U=>{if(U.length===0){x("先勾几条带接口定义的用例再跑(手工用例没有 http,跑不了)");return}I(!0),x("");try{const De=(await r("/cases/run",{keys:U.map(st=>st.key),by:"回归"}))?.results??[],qe=st=>De.reduce((Et,pt)=>Et+(Number(pt[st])||0),0),It=De.filter(st=>st.ok===!1),Kt=[`跑了 ${De.length} 张卡 / ${qe("total")} 条:通过 ${qe("passed")},不通过 ${qe("failed")}`];qe("bugs")>0&&Kt.push(`自动开缺陷 ${qe("bugs")} 张`),It.length>0&&Kt.push(`${It.length} 张卡报错:${It[0].error??""}`),x(Kt.join(",")),E(new Set),await K()}catch(ve){x(ve instanceof Error?ve.message:String(ve))}finally{I(!1)}},he=U=>{const ve=U?.results??[],De=Kt=>ve.reduce((st,Et)=>st+(Number(Et[Kt])||0),0),qe=ve.filter(Kt=>Kt.ok===!1),It=[`跑了 ${ve.length} 张卡 / ${De("total")} 条:通过 ${De("passed")},不通过 ${De("failed")}`];return De("bugs")>0&&It.push(`自动开缺陷 ${De("bugs")} 张`),qe.length>0&&It.push(`${qe.length} 张卡报错:${qe[0].error??""}`),U?.truncated!==void 0&&It.push(`套件共 ${U.truncated.total} 条,本次只跑了前 ${U.truncated.ran} 条`),It.join(",")},V=async U=>{I(!0),x("");try{const ve=await r("/suite/run",{id:U.id});x(he(ve)),await K()}catch(ve){x(ve instanceof Error?ve.message:String(ve))}finally{I(!1)}},$e=async()=>{const U=await i("套件名字(跑的就是当前筛选里的用例)",{title:"新建回归套件",defaultValue:"默认回归"});if(!(U===null||String(U).trim()===""))try{await r("/suite/save",{suite:{name:String(U).trim().slice(0,40),rules:{requirementIds:d==="__all__"?[]:[d],httpOnly:!0},keys:[],isDefault:F.length===0},by:"人"}),s("已保存套件"),await K()}catch(ve){s(ve instanceof Error?ve.message:String(ve),"error")}},Ne=async U=>{try{await r("/suite/save",{suite:{...U,isDefault:!0},by:"人"}),s(`夜间回归改跑「${U.name}」`),await K()}catch(ve){s(ve instanceof Error?ve.message:String(ve),"error")}},je=async U=>{if(await o(`删除套件「${U.name}」?用例本身不受影响。`,{title:"删除套件",danger:!0,okText:"删除"}))try{await r("/suite/delete",{id:U.id}),await K()}catch(ve){s(ve instanceof Error?ve.message:String(ve),"error")}},We=pe.filter(U=>U.runnable===!0&&U.result==="fail"),Qa=()=>le(R),jn=()=>le(We);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"}},`${pe.length} 条 · ✅ ${xe.pass} · ❌ ${xe.fail}${xe.skip>0?` · ⏭️ ${xe.skip}`:""}${xe.rest>0?` · ⬜ ${xe.rest}`:""}`),a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void K()},"刷新")),a("div",{className:"ds-panel-body"},a("div",{className:"ds-row"},a(l,{className:"ds-input",style:{width:240},value:k,placeholder:"搜用例 / 卡片 / 需求 / 功能点",onChange:U=>g(U.target.value)}),a(c,{className:"ds-select",style:{width:220},value:d,onChange:U=>h(U.target.value)},a("option",{value:"__all__"},"全部需求"),Y.map(U=>a("option",{key:U.id,value:U.id},`${U.code||U.id} ${U.title}`))),a(c,{className:"ds-select",style:{width:140},value:b,onChange:U=>S(U.target.value)},a("option",{value:"__all__"},"全部结果"),Zp.map(U=>a("option",{key:U,value:U},Xl[U])))),a("div",{className:"ds-row",style:{marginTop:8}},a("button",{className:"ds-btn ds-btn-ghost",disabled:_||H.length===0,onClick:we},`全选可跑的 ${H.length} 条`),a("button",{className:"ds-btn ds-btn-ghost",disabled:_||C.size===0,onClick:Z},"清空选择"),a("button",{className:"ds-btn ds-btn-primary",disabled:_||R.length===0,onClick:()=>void Qa()},_?"跑着…":`▶ 跑选中的 ${R.length} 条`),a("button",{className:"ds-btn",disabled:_||We.length===0,title:"只补跑上次不通过、且有接口定义的用例",onClick:()=>void jn()},`↻ 只跑上次失败的 ${We.length} 条`),a("span",{className:"ds-hint"},"按卡串行跑,每张卡一轮;失败的照旧自动开缺陷(最多一次 60 条)")),a("div",{className:"ds-row",style:{marginTop:8,flexWrap:"wrap",gap:8}},a("span",{className:"ds-hint"},"回归套件:"),F.length===0?a("span",{className:"ds-hint"},"还没有套件。把当前筛选存成套件,夜间就自动跑它。"):F.map(U=>a("span",{key:U.id,className:"ds-suite","data-default":U.isDefault?"1":"0"},a("span",{style:{cursor:"pointer"},title:"点一下只看这个套件里的用例,再点一次取消",onClick:()=>O(ve=>ve===U.id?null:U.id)},`📦 ${U.name}${U.isDefault?" · 默认":""} · ${L[U.id]??0} 条${M===U.id?"(只看中)":""}`),a("button",{className:"ds-btn ds-btn-ghost",disabled:_||(L[U.id]??0)===0,onClick:()=>void V(U)},"▶ 跑"),U.isDefault?null:a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void Ne(U)},"设为默认"),a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void je(U),"data-danger":"1"},"删除"))),a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void $e()},"+ 存为套件")),A===""?null:a("div",{className:"ds-hint",style:{marginTop:6}},A),P.length===0?null:a("div",{className:"ds-reg-list"},a("span",{className:"ds-hint"},"最近回归:"),P.slice(0,4).map(U=>a("span",{key:String(U.at),className:"ds-reg-item","data-bad":(Number(U.failed)||0)+(Number(U.failedCards)||0)>0?"1":"0",title:`${new Date(U.at).toLocaleString("zh-CN")} · ${U.by||"人"}`},`${Ke(U.at)} ${U.by||""} · ${U.cards} 卡 / ${U.total} 条 · ✅${U.passed} ❌${U.failed}${U.bugs>0?` 🐞${U.bugs}`:""}`))),w!==null?a("div",{className:"ds-err"},w):null,f===null?a("div",{className:"ds-hint",style:{padding:"10px 2px"}},"载入用例…"):pe.length===0?a("div",{className:"ds-empty"},"没有符合条件的用例。用例登记在卡片详情的「测试」里。"):a("div",{className:"ds-case-lib"},pe.map(U=>a("div",{key:U.key,className:"ds-case-lib-wrap"},a("div",{className:"ds-case-lib-row","data-result":U.result,title:"打开所属卡片",onClick:()=>t(U.taskId)},a("span",{className:"ds-case-lib-pick",onClick:ve=>ve.stopPropagation()},a(p,{checked:C.has(U.key),disabled:_||U.runnable!==!0,onChange:()=>ne(U.key)})),a("span",{className:"ds-case-lib-result"},Xl[U.result]??U.result),a("span",{className:"ds-case-lib-title"},U.title),a("span",{className:"ds-case-lib-meta"},`${U.taskCode||U.taskId} · ${U.requirementTitle||"未挂需求"}${U.pointId?" · "+U.pointId:""}`),a("span",{className:"ds-case-lib-meta"},U.http?"接口":U.shell?"shell":U.db?"数据库":"手工"),a("span",{className:"ds-case-lib-pri"},U.priority),a("span",{className:"ds-case-lib-at"},U.lastRunAt>0?Ke(U.lastRunAt):"没跑过"),a("button",{className:"ds-btn ds-btn-ghost ds-case-lib-more",title:"看最近一次执行的明细",onClick:ve=>{ve.stopPropagation(),q(te===U.key?null:U.key)}},te===U.key?"收起":"明细")),te===U.key?a("div",{className:"ds-case-lib-detail"},a("div",null,`期望:${U.expected||"—"}`),a("div",null,`最近一次:${U.note||(U.lastRunAt>0?"只有结果,没有记录":"还没跑过")}`),U.lastError===""?null:a("div",{className:"ds-err"},`错误:${U.lastError}`),U.lastPreview===""?null:a("pre",{className:"ds-case-lib-preview"},U.lastPreview),a("div",{className:"ds-hint"},`用例编号 ${U.id} · 所属卡片 ${U.taskCode||U.taskId}`)):null))))))}function aw({value:e,tone:t}){const{h:a,kit:n}=bt(),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}=bt(),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 id=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 sw(e,t){const a=uf(e),n=uf(t);if(a.length>
|
|
45
|
-
`).map(vt=>vt.trim()).filter(vt=>vt!==""),ce={id:ie.id??`p${(Q.points??[]).length+1}`,title:ie.title,description:ie.description??"",priority:ie.priority??"normal",status:ie.status??"draft",acceptance:V.map((vt,$a)=>({id:`a${$a+1}`,text:vt,done:!1}))},Le=(Q.points??[]).filter(vt=>vt.id!==ce.id);await ne([...Le,ce])},se=async V=>{Q!==null&&await u("删除这个功能点?挂在上面的卡会变成「未归功能点」。",{title:"删除功能点",danger:!0,okText:"删除"})&&await ne((Q.points??[]).filter(ce=>ce.id!==V))},de=async(V,ce)=>{try{await i("/task/update",{id:V,pointId:ce}),Q!==null&&await Y(Q.id)}catch(Le){X(Le.message)}},Q=h.find(V=>V.id===S)??null,ve=V=>e.tasks.filter(ce=>ce.requirementId===V),Ce=V=>e.statuses.find(ce=>ce.id===V)?.label??V;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()===""){H("需求标题不能为空");return}$(!0);try{const V=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},discovery:_.discovery??{server:"",auth:"",boundary:""}}});C(V.requirement.id),I(null),H(null),l(V.created===!0?"需求已创建":"需求已保存")}catch(V){H(V.message)}finally{$(!1)}}},Pe=async V=>{if(Q!==null)try{await i("/requirement/save",{requirement:{...Q,links:Q.links??{},status:V}}),l("需求状态已更新")}catch(ce){H(ce.message)}},dt=async V=>{if(await u("删除这条需求?它下面的卡会保留,只是不再挂需求。",{title:"删除需求",danger:!0,okText:"删除"}))try{await i("/requirement/delete",{id:V}),C(null)}catch(ce){H(ce.message)}},rt={pending:"待评审",approved:"评审通过",changes_requested:"评审打回"},[Je,We]=o.useState(!1),[tt,Ge]=o.useState(null),Te=async(V,ce)=>{if(Q!==null){We(!0),Ge(null);try{const Le=await i("/requirement/review",{id:Q.id,decision:V,note:ce??"",by:c(),operator:c()});Ge(`已${V==="approve"?"通过":V==="reject"?"打回":"提交"}评审:${rt[Le.review?.status]??""}`),typeof a=="function"&&a()}catch(Le){Ge(Le.message)}finally{We(!1)}}},Rt=async()=>{const V=await p("打回要给意见(会记在评审记录里):",{title:"评审打回",danger:!0,okText:"打回",placeholder:"写清楚哪里不满足,之后要据此改"});if(V!==null){if(String(V).trim()===""){Ge("打回必须写意见");return}Te("reject",String(V).trim().slice(0,600))}},[Be,xt]=o.useState(!1),[At,Ut]=o.useState(null),le=async()=>{if(Q!==null){xt(!0),Ut(null);try{const V=await i("/requirement/split",{id:Q.id}),ce=V.created??[],Le=Array.isArray(V.warnings)?V.warnings:[];Ut((ce.length===0?"没有可拆的功能点:要么都覆盖了,要么还没加功能点。":`已建 ${ce.length} 张卡:${ce.map(vt=>vt.code||vt.id).join("、")}`)+(Le.length===0?"":" ⚠ "+Le.join(";"))),typeof a=="function"&&a()}catch(V){Ut(V.message)}finally{xt(!1)}}},Ne=()=>({kind:"prd",title:"",url:Q?.links?.prd??"",version:"v1.0",content:"",status:"draft"}),me=async V=>{if(L(null),V===null){J(Ne());return}try{const Le=((await i("/requirement/get",{id:Q.id})).requirement?.docs??[]).find(vt=>vt.id===V);J(Le===void 0?Ne():{...Le})}catch(ce){H(ce.message)}},Qa=async V=>{if(A!==null&&A.id===V){x(null);return}x({id:V,content:"",busy:!0});try{const Le=((await i("/requirement/get",{id:Q.id})).requirement?.docs??[]).find(vt=>vt.id===V);x({id:V,content:String(Le?.content??""),busy:!1})}catch(ce){H(ce.message),x(null)}},$t=async()=>{if(P!==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),H("这条需求还没有基线,先挑一份文档「设为基线」");return}if(ra===null){K(null),H("这条需求还没有文档可以对比");return}const Ma=sw(Le.content??"",ra.content??"");K({rows:Ma,summary:rw(Ma),version:Le.version,docTitle:ra.title})}catch(V){K(null),H(V instanceof Error?V.message:String(V))}},fa=async()=>{if(R!==null){O(null);return}try{const V=await i("/requirement/get",{id:Q.id}),ce={};for(const Le of V.requirement?.docs??[])ce[Le.id]=String(Le.content??"");O(ce)}catch(V){H(V.message)}},An=async()=>{if(B!==null){if(String(B.title??"").trim()===""){L("文档要有标题");return}we(!0);try{const V=await i("/requirement/doc",{id:Q.id,action:B.id===void 0?"add":"update",docId:B.id,doc:{kind:B.kind,title:B.title,url:B.url,version:B.version,content:B.content,status:B.status}});J(null),L(null)}catch(V){L(V.message)}finally{we(!1)}}},La=async()=>{ae(!0),ye(null);try{const V=await i("/requirement/folder",{id:Q.id});ye(V.ok?`云盘文件夹已就绪:${V.folder?.url??""}`:`创建失败:${V.error||V.folder?.error||"未知原因"}`)}catch(V){ye(V.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(V){ye(V.message)}finally{ae(!1)}},Mt=async V=>{try{await i("/requirement/doc",{id:Q.id,action:"baseline",docId:V,by:"人"}),L("这一版已生效,之后新建的卡都会记下它。")}catch(ce){L(ce.message)}},jn=async()=>{try{await i("/requirement/doc",{id:Q.id,action:"clear-baseline"}),L("基线已取消,需求回到「评审中」。")}catch(V){L(V.message)}},Z=async V=>{if(await u("删除这份文档?",{title:"删除文档",danger:!0,okText:"删除"}))try{await i("/requirement/doc",{id:Q.id,action:"remove",docId:V})}catch(ce){L(ce.message)}},_e=async()=>{we(!0),L(null);try{const V=await i("/requirement/pull",{url:B?.url??""});if(V.ok===!0){const ce=String(V.text??"");J(Le=>({...Le,title:String(Le?.title??"").trim()===""?String(V.title??""):Le.title,content:ce})),L(`已拉取 ${ce.length} 字正文${V.title?`,标题取自文档「${V.title}」`:""}。`)}else L(V.error??"拉取失败")}catch(V){L(V.message)}finally{we(!1)}},wt=_===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:V=>I({..._,title:V.target.value})})),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"有没有服务端?数据存在哪、刷新会不会丢"),s(v,{className:"ds-input",placeholder:"例:有,node:sqlite;或「纯前端演示,刷新即还原」",value:_.discovery?.server??"",onChange:V=>I({..._,discovery:{..._.discovery??{},server:V.target.value}})})),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"鉴权谁做:前端隐藏按钮,还是服务端拒绝"),s(v,{className:"ds-input",placeholder:"例:服务端校验角色,viewer 调写接口直接 403",value:_.discovery?.auth??"",onChange:V=>I({..._,discovery:{..._.discovery??{},auth:V.target.value}})})),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"交付边界:只交付界面,还是点开就能用"),s(v,{className:"ds-input",placeholder:"例:前后端都交付,含测试;或「只做 UI,接口后续接」",value:_.discovery?.boundary??"",onChange:V=>I({..._,discovery:{..._.discovery??{},boundary:V.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:V=>I({..._,project:V.target.value})},s("option",{value:""},"不指定"),b.map(V=>s("option",{key:V.id,value:V.id},V.name)))),s("div",{className:"ds-field",style:{flex:1}},s("div",{className:"ds-label"},"状态"),s(g,{className:"ds-select",value:_.status,onChange:V=>I({..._,status:V.target.value})},ef.map(V=>s("option",{key:V,value:V},Ar[V])))),s("div",{className:"ds-field",style:{flex:1}},s("div",{className:"ds-label"},"业务负责人"),s(v,{className:"ds-input",value:_.owner,onChange:V=>I({..._,owner:V.target.value})})),s("div",{className:"ds-field",style:{flex:1}},s("div",{className:"ds-label"},"业务领域"),s(v,{className:"ds-input",placeholder:"支付 / 风控 / 会员(决定派给哪位领域专家)",value:_.domain??"",onChange:V=>I({..._,domain:V.target.value})}))),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"PRD 链接"),s(v,{className:"ds-input",placeholder:"https://…(飞书云文档)",value:_.prd,onChange:V=>I({..._,prd:V.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:V=>I({..._,proto:V.target.value})})),s("div",{className:"ds-field",style:{flex:1}},s("div",{className:"ds-label"},"验收标准链接"),s(v,{className:"ds-input",value:_.acceptance,onChange:V=>I({..._,acceptance:V.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:V=>I({..._,description:V.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 Se()},M?"保存中…":"保存需求")))),ht=Q===null?s("div",{className:"ds-empty"},"左边选一条需求,或先新建一条。"):(()=>{const V=ve(Q.id),ce=V.filter(j=>j.status==="done").length,Le=V.filter(j=>j.blocked!==void 0&&j.blocked!==null).length,vt=V.filter(j=>j.type==="bug"&&j.status!=="done").length,$a=V.reduce((j,ue)=>{const Fe=ed(ue);return{done:j.done+Fe.done,total:j.total+Fe.total}},{done:0,total:0}),ra=V.reduce((j,ue)=>{const Fe=Jl(ue);return{pass:j.pass+Fe.pass,total:j.total+Fe.total}},{pass:0,total:0}),Ma=V.flatMap(j=>(j.artifacts??[]).map(ue=>({...ue,task:j}))),Dn=V.filter(j=>(j.gitlabMR?.iid??0)>0),Fo=ra.pass,On=Q.links??{},dn=Q.folder??{},Ln=(j,ue)=>ue===""?null:s("a",{className:"ds-link",href:ue,target:"_blank",rel:"noreferrer"},j);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:j=>void Pe(j.target.value)},ef.map(j=>s("option",{key:j,value:j},Ar[j]))),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 j=Q.review??null,ue=j===null?"还没提交评审":rt[j.status]??j.status,Fe=j===null||j.status==="changes_requested",kt=j!==null&&j.status==="pending";return s("div",{className:"ds-panel","data-review":j===null?"none":j.status,style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"需求评审"),s(y,{className:"ds-chip","data-on":j?.status==="approved"?"1":"0",style:{marginLeft:8}},ue),j===null||j.at===0?null:s("span",{className:"ds-hint",style:{marginLeft:"auto"}},`${Ke(j.at)}${j.by===""?"":` · ${j.by}`}`)),s("div",{className:"ds-panel-body"},j!==null&&String(j.note??"")!==""?s("div",{className:"ds-hint",style:{marginBottom:8}},`评审意见:${j.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,kt?s("button",{className:"ds-btn ds-btn-primary",disabled:Je,onClick:()=>void Te("approve")},"评审通过"):null,kt?s("button",{className:"ds-btn ds-btn-ghost",disabled:Je,onClick:Rt,"data-danger":"1"},"打回"):null,j?.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 j=await p("想请产品补什么?",{title:"申请产品补 PRD",defaultValue:"需要产品输出 PRD 与原型"});if(j!==null)try{await i("/requirement/request-prd",{id:Q.id,by:c(),note:j}),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 j=(Q.history??[]).slice().reverse();if(j.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"}},`最近 ${j.length} 条`)),s("div",{className:"ds-panel-body"},s("div",{style:{display:"flex",flexDirection:"column",gap:6,maxHeight:260,overflowY:"auto"}},j.map((Fe,kt)=>s("div",{key:`${Fe.at}-${kt}`,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 j=Q.pool??{reach:0,impact:0,confidence:0,effort:0,score:0},ue=async(kt,ma,et)=>{const De=await p(ma,{title:kt,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 kt=await ue("影响面 Reach","影响多少用户或多少笔交易?估算依据写进正文",j.reach);if(kt===null)return;const ma=await ue("影响度 Impact","3 显著 / 2 高 / 1 中 / 0.5 低",j.impact);if(ma===null)return;const et=await ue("置信度 Confidence","100 有数据 / 80 有访谈 / 50 只有猜测(百分数)",j.confidence);if(et===null)return;const De=await ue("成本 Effort","人日(研发+测试+联调)",j.effort);if(De!==null)try{await i("/requirement/pool",{id:Q.id,pool:{reach:kt,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"}},j.score>0?`得分 ${j.score}`:"还没打分:不打分就没法和别的需求比优先级"),s("button",{className:"ds-btn ds-btn-ghost",style:{marginLeft:8},onClick:()=>void Fe()},j.score>0?"重新打分":"打分")),j.score>0?s("div",{className:"ds-panel-body"},s("div",{className:"ds-row",style:{flexWrap:"wrap",gap:8}},s("span",{className:"ds-chip"},`影响面 ${j.reach}`),s("span",{className:"ds-chip"},`影响度 ${j.impact}`),s("span",{className:"ds-chip"},`置信度 ${j.confidence}%`),s("span",{className:"ds-chip"},`成本 ${j.effort} 人日`),s("span",{className:"ds-chip","data-on":"1"},`得分 ${j.score}`))):null)})(),(()=>{const j=Q.questions??[],ue=j.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")}},kt=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} 个没回答,回答完才能拆卡`:j.length===0?"澄清阶段把不确定的先记在这里":"全部已回答"),s("button",{className:"ds-btn ds-btn-ghost",style:{marginLeft:8},onClick:()=>void kt()},"+ 加问题")),s("div",{className:"ds-panel-body"},j.length===0?s("div",{className:"ds-empty"},"还没有待确认的问题。产品澄清时把「需要业务拍板」的点写在这里,避免猜业务规则。"):s("div",{style:{display:"flex",flexDirection:"column",gap:8}},j.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 j=Q.change??null;if(j===null)return null;const ue=j.affected??[],Fe=j.affectedCases??[],kt=new Map(V.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":j.invalidated?"1":"0",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,j.invalidated?"变更影响(签字已作废)":"变更影响"),s("span",{className:"ds-hint",style:{marginLeft:"auto"}},`${Ke(j.at)}${j.by===""?"":` · ${j.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"},`改了:${(j.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=kt.get(et.id);De!==void 0&&typeof t=="function"&&t(De)}},`${et.code||et.id} ${ma(et.status)}`))),j.invalidated?s("div",{className:"ds-hint",style:{marginTop:8}},"验收签字已清空:这些卡是按旧版做的,复核完重新签一次。"):null))})(),(()=>{const j=Q.deploys??[];return j.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}},j.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:j=>Ya(j.target.value)}),s("span",{className:"ds-hint"},"被依赖的需求没交付,这条需求的准出会被拦")),s("div",{className:"ds-row",style:{flexWrap:"wrap",gap:10}},h.filter(j=>j.id!==Q.id).map(j=>s("label",{key:j.id,className:"ds-check-row"},s(k,{checked:Rn.includes(j.id),onChange:ue=>U(Fe=>ue.target.checked?[...Fe,j.id]:Fe.filter(kt=>kt!==j.id))}),s("span",{className:"ds-check-text"},`${j.code||j.id} ${j.title}(${Ar[j.status]??j.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 j=Q.progress??null,ue=j?.gate??{ready:!1,blockers:["还没有加载出准出状态,稍后自动刷新"],warnings:[]},Fe=ue.stats??{},kt=Q.signoff??null,ma=j?.progress??(V.length===0?0:Math.round(ce/V.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(y,{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}/${V.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,kt===null?s("div",{className:"ds-gate-sign"},s(v,{className:"ds-input",style:{flex:1,minWidth:220},placeholder:"验收结论:交付了什么、遗留什么",value:W,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}},`✍ ${kt.by} 于 ${Ke(kt.at)} 签字:${kt.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(j=>j.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 $t()},P===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&&P!==null?s("div",{className:"ds-diff"},s("div",{className:"ds-diff-head"},s("b",null,`基线 ${P.version} → 当前:${P.docTitle}`),s("span",{className:"ds-hint"},P.summary.added+P.summary.removed===0?"正文没有变化":`+${P.summary.added} 行 / −${P.summary.removed} 行`)),s("div",{className:"ds-diff-body"},P.rows.slice(0,400).map((j,ue)=>s("div",{key:ue,className:"ds-diff-line","data-kind":j.kind},`${j.kind==="add"?"+":j.kind==="del"?"−":" "} ${j.text}`)),P.rows.length>400?s("div",{className:"ds-hint"},`(还有 ${P.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(j=>s("div",{key:j.id,className:"ds-doc-wrap"},s("div",{className:"ds-doc-row"},s(y,{className:"ds-chip","data-doc":j.kind},tf[j.kind]??j.kind),s("div",{className:"ds-doc-main"},s("div",{className:"ds-doc-title"},j.url===""?j.title:s("a",{className:"ds-link",href:j.url,target:"_blank",rel:"noreferrer"},j.title),s("span",{className:"ds-chip-code"},j.version),s(y,{className:"ds-chip","data-docstatus":j.status},cx[j.status]??j.status)),s("div",{className:"ds-doc-meta"},`正文 ${j.contentLength??0} 字 · ${j.by||"—"} · ${j.at>0?Ke(j.at):"—"}`)),s("div",{className:"ds-listrow-actions"},j.status==="baseline"?null:s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void Mt(j.id)},"设为基线"),s("button",{className:"ds-btn ds-btn-ghost",title:"直接读正文(Markdown 渲染)",onClick:()=>void Qa(j.id)},A!==null&&A.id===j.id?"收起":"阅读"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void me(j.id)},"编辑"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void Z(j.id),"data-danger":"1"},"删除"))),A!==null&&A.id===j.id?s("div",{className:"ds-md-preview ds-reader"},A.busy?s("span",{className:"ds-hint"},"读取中…"):A.content.trim()===""?s("span",{className:"ds-hint"},"这条文档还没有正文。"):f(A.content)):R!==null&&R[j.id]!==void 0?s("div",{className:"ds-md-preview ds-reader"},R[j.id].trim()===""?s("span",{className:"ds-hint"},"这条文档还没有正文。"):f(R[j.id])):null)))),q===null?null:s("div",{className:"ds-hint",style:{marginTop:6}},q),B===null?null:s("div",{className:"ds-panel ds-form-panel",style:{marginTop:10}},s("div",{className:"ds-panel-head"},B.id===void 0?"添加文档":`编辑 ${B.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:B.kind,onChange:j=>J({...B,kind:j.target.value})},dx.map(j=>s("option",{key:j,value:j},tf[j])))),s("div",{className:"ds-field",style:{flex:"1 1 220px"}},s("div",{className:"ds-label"},"标题"),s(v,{className:"ds-input",value:B.title,placeholder:"例如 会员积分抵扣 PRD",onChange:j=>J({...B,title:j.target.value})})),s("div",{className:"ds-field",style:{flex:"0 0 110px"}},s("div",{className:"ds-label"},"版本"),s(v,{className:"ds-input",value:B.version,placeholder:"v1.0",onChange:j=>J({...B,version:j.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:B.url,placeholder:"https://<租户>.feishu.cn/wiki/…",onChange:j=>J({...B,url:j.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:B.content,onChange:j=>J({...B,content:j.target.value})})),s("div",{className:"ds-row",style:{justifyContent:"flex-end",gap:8}},s("button",{className:"ds-btn",onClick:()=>{J(null),L(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 Et()},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(j=>s("div",{key:j.id,className:"ds-art-row"},s("span",{className:"ds-art-title"},(j.code===""?"":j.code+" ")+j.title),s("span",{className:"ds-hint"},j.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,这里就能看出哪条没人做、哪条没被验证。")),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(j=>s("div",{key:j.id,className:"ds-pt-row","data-covered":j.covered?"1":"0"},s("div",{className:"ds-pt-main"},s("div",{className:"ds-pt-title"},s("span",{className:"ds-chip-code"},j.id),s("b",null,j.title),s(y,{className:"ds-chip","data-pt":j.covered?"covered":"open"},j.covered?"已覆盖":"未覆盖")),String(j.description??"")===""?null:s("div",{className:"ds-req-desc ds-md"},f(j.description)),s("div",{className:"ds-pt-meta"},`卡 ${j.cards.length}${j.cards.length===0?"(还没人做)":":"+j.cards.map(ue=>ue.code||ue.id).join("、")}`,` · 用例 ${j.cases.total}(通过 ${j.cases.pass}${j.cases.fail>0?`,失败 ${j.cases.fail}`:""}${j.cases.pending>0?`,没跑 ${j.cases.pending}`:""})`,j.acceptance.length===0?"":` · 验收条件 ${j.acceptance.filter(ue=>ue.covered).length}/${j.acceptance.length}`)),s("div",{className:"ds-listrow-actions"},s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>ge({...j,acceptanceText:(j.acceptance??[]).map(ue=>ue.text).join(`
|
|
46
|
-
`)})},"编辑"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void se(j.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(j=>s("div",{key:j.id,className:"ds-pt-loose-row"},s("span",{className:"ds-chip-code"},j.code||j.id),s("span",{className:"ds-pt-loose-title"},j.title),s(g,{className:"ds-select",style:{width:220},value:"",onChange:ue=>{ue.target.value!==""&&de(j.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:()=>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)}},"刷新矩阵"),At===null?null:s("span",{className:"ds-hint"},At),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:j=>ge({...ie,title:j.target.value})})),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"说明"),s(d,{className:"ds-textarea",rows:3,value:ie.description??"",onChange:j=>ge({...ie,description:j.target.value})})),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"验收条件(一行一条,做成什么样算完成)"),s(w,{className:"ds-textarea",rows:4,value:ie.acceptanceText??"",onChange:j=>ge({...ie,acceptanceText:j.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:j=>ge({...ie,priority:j.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:j=>ge({...ie,status:j.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}/${V.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":vt>0?"1":"0"},s("b",null,String(vt)),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}},`这张需求下的 ${V.length} 张卡`),V.length===0?s("div",{className:"ds-empty"},"还没有挂上来的卡。建卡时选择这条需求,编号会自动分配。"):s("div",{className:"ds-req-tasks"},V.map(j=>s("div",{key:j.id,className:"ds-listrow ds-req-task",onClick:()=>t(j.id)},s("div",{className:"ds-listrow-main"},s("div",{className:"ds-req-task-title"},j.code?s(y,{className:"ds-chip ds-chip-code"},j.code):null,s("span",null,j.title)),s("div",{className:"ds-hint"},`${Ce(j.status)}${(()=>{const ue=j.expert===""?"":(e.config.experts??[]).find(Fe=>Fe.id===j.expert)?.name??j.expert;return ue===""?"":` · ${ue}`})()}${j.dueAt>0?` · 截止 ${Xa(j.dueAt)}`:""}`)),s("div",{className:"ds-listrow-actions"},j.blocked!==void 0&&j.blocked!==null?s(y,{className:"ds-chip ds-chip-blocked"},"⛔"):null,j.type==="bug"?s(y,{className:"ds-chip ds-chip-bug","data-sev":j.severity??"p2"},"BUG"):null)))),Dn.length>0?s("div",null,s("div",{className:"ds-sec-head",style:{marginTop:14}},"关联 MR"),Dn.map(j=>s("div",{key:j.id,className:"ds-hint"},`${j.code||j.id} · !${j.gitlabMR.iid} ${j.gitlabMR.title??""}(${j.gitlabMR.state||"open"})`))):null)})();return s("div",{className:"ds-body"},z!==null?s("div",{className:"ds-err",style:{marginBottom:10}},z):null,wt,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 V=window.localStorage.getItem("dsh-studio:reqsrc")??"all";window.localStorage.setItem("dsh-studio:reqsrc",V==="all"?"business":V==="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((V,ce)=>(ce.pool?.score??0)-(V.pool?.score??0)):h).map(V=>{const ce=window.localStorage.getItem("dsh-studio:reqsrc")??"all";if(ce!=="all"&&(V.source==="business"?"business":"internal")!==ce)return null;const Le=ve(V.id),vt=Le.filter(Ma=>Ma.status==="done").length,$a=V.progress?.progress??(Le.length===0?0:Math.round(vt/Le.length*100)),ra=V.progress?.gate??null;return s("div",{key:V.id,className:"ds-req-item","data-on":V.id===S?"1":"0",onClick:()=>C(V.id)},s("div",{className:"ds-req-item-title"},V.title),s("div",{className:"ds-req-item-meta"},s(y,{className:"ds-chip ds-chip-code"},V.code||"未编号"),V.source==="business"?s(y,{className:"ds-chip","data-src":"business",title:[V.requester?.name,V.requester?.dept].filter(Boolean).join(" · ")||"业务提单"},"业务提单"):null,s(y,{className:"ds-chip","data-req":V.status},Ar[V.status]??V.status),s("span",{className:"ds-hint"},`${vt}/${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}=bt(),[w,y]=n.useState([]),[k,g]=n.useState(null),[d,h]=n.useState(null),[b,S]=n.useState(null),[C,E]=n.useState(""),[_,I]=n.useState(null),[z,H]=n.useState(""),[M,$]=n.useState(!1),[B,J]=n.useState(""),[q,L]=n.useState(""),[A,x]=n.useState(""),[P,K]=n.useState("10"),[R,O]=n.useState(""),[G,we]=n.useState(""),fe=n.useCallback(async W=>{const ke=(await r("/releases")).releases??[];y(ke);const Ae=W??(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 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),$(!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{$(!1)}}function He(){g(null),h(null),S({id:"",version:"",name:"",project:"",owner:"",status:"draft",plannedAt:0,tagName:"",commitSha:""}),E(""),H("")}async function ae(W,Ee,ke){$(!0),I(null);try{const Ae=await r(W,Ee);H(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{$(!1)}}if(_!==null&&w.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),ie=a("div",{className:"ds-req-list"},a("div",{className:"ds-row",style:{justifyContent:"space-between",marginBottom:6}},a("span",{className:"ds-hint"},`${w.length} 个版本`),a("button",{className:"ds-btn",onClick:He},"+ 新建版本")),w.length===0?a("div",{className:"ds-empty"},"还没有版本。先建一个版本,再把卡挂上来。"):w.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},af[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} 项拦着`))))),ge=b===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}(${Ar[W.derived]??W.derived})`))),a("div",{className:"ds-req-headline"},a("div",null,a("div",{className:"ds-req-name"},`${b.version||"未编号"} ${b.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:b.status,onChange:W=>S({...b,status:W.target.value})},ux.map(W=>a("option",{key:W,value:W},af[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:b.version,placeholder:"v1.3.0",disabled:te?.status==="released",onChange:W=>S({...b,version:W.target.value})})),a("label",{className:"ds-field"},a("span",{},"版本名"),a(c,{className:"ds-input",value:b.name,placeholder:"积分抵扣首个版本",onChange:W=>S({...b,name:W.target.value})})),a("label",{className:"ds-field"},a("span",{},"业务项目"),a(f,{className:"ds-select",value:b.project,onChange:W=>S({...b,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:b.owner,onChange:W=>S({...b,owner:W.target.value})})),a("label",{className:"ds-field"},a("span",{},"计划发布时间"),a(c,{className:"ds-input",type:"date",value:nf(b.plannedAt),onChange:W=>S({...b,plannedAt:jr(W.target.value)})})),a("label",{className:"ds-field"},a("span",{},"发布标签(tag)"),a(c,{className:"ds-input",value:b.tagName??"",placeholder:"v1.0.0",onChange:W=>S({...b,tagName:W.target.value})})),a("label",{className:"ds-field"},a("span",{},"对应提交(sha,选填)"),a(c,{className:"ds-input",value:b.commitSha??"",placeholder:"a1b2c3d",onChange:W=>S({...b,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:b},"版本已保存")},"保存"),b.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:b.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:b.id},"发布说明已生成")},"生成发布说明"),a("button",{className:"ds-btn",disabled:M||!F?.ready,onClick:()=>void ae("/release/approve",{id:b.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:b.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:b.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:b.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:b.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} · ${Xa(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:b.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=>L(W.target.value)}),a("button",{className:"ds-btn",disabled:M||q.trim()==="",onClick:()=>{const W=q.trim();W!==""&&(L(""),ae("/release/smoke",{id:b.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"},Xa(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:b.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:b.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:A,placeholder:"批次名,例如 内测用户",onChange:W=>x(W.target.value)}),a(c,{className:"ds-input",style:{flex:"0 0 88px"},type:"number",min:1,max:100,value:P,onChange:W=>K(W.target.value)}),a("button",{className:"ds-btn",disabled:M||Number(P)<=0,onClick:async()=>{await ae("/release/gray",{id:b.id,action:"add",name:A,percent:Number(P),by:"人"},"已加一批灰度"),x(""),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(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}:${Xa(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=>O(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:G,placeholder:"备注:谁发的、发了什么(可留空)",onChange:W=>we(W.target.value)}),a("button",{className:"ds-btn",disabled:M||R==="",onClick:async()=>{await ae("/release/deploy",{id:b.id,env:R,note:G,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(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:W[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(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:b.id,taskId:W.id,action:"remove"},"已从版本移除")},"移除")))),a("div",{className:"ds-row",style:{marginTop:8}},a(f,{className:"ds-select",style:{flex:1},value:B,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||B==="",onClick:async()=>{await ae("/release/link",{id:b.id,taskId:B,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:{...b,notes:C}},"发布说明已保存")}}))),_===null?null:a("div",{className:"ds-error",style:{marginTop:8}},_),z===""?null:a("div",{className:"ds-hint",style:{marginTop:8}},z));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}=bt(),[o,i]=n.useState(30),[l,c]=n.useState(""),[u,p]=n.useState(null),[f,v]=n.useState(null),[w,y]=n.useState(null),[k,g]=n.useState(null),[d,h]=n.useState(null),[b,S]=n.useState(null);if(n.useEffect(()=>{let x=!0;const P=`/analytics?days=${o}${l===""?"":`&project=${encodeURIComponent(l)}`}`;r(P).then(R=>{x&&(p(R.analytics),v(null))}).catch(R=>{x&&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])=>{x&&(y(R.workload??null),g(O.burndown??null),h({...G.costs??{},budget:G.budget??null,usage:G.usage??null}),S(we.quality??null))}).catch(()=>{}),()=>{x=!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=x=>`${Math.round((x??0)*100)}%`,E=x=>{const P=Number(x)||0;return P<=0?"0":P*1440<60?`${Math.max(1,Math.round(P*1440))} 分钟`:P<1?`${(P*24).toFixed(1)} 小时`:`${P.toFixed(1)} 天`},_=(x,P,K,R)=>a("div",{className:"ds-kpi","data-warn":R===!0?"1":"0"},a("div",{className:"ds-kpi-value"},P),a("div",{className:"ds-kpi-label"},x),a("div",{className:"ds-kpi-hint"},K)),I=(u.cycle.buckets??[]).reduce((x,P)=>x+P.count,0),z=Math.max(1,...(u.throughput??[]).map(x=>x.count),...(u.cycle.buckets??[]).map(x=>x.count)),H=Math.max(.001,...(u.columns??[]).map(x=>x.avgDays)),M=(u.columns??[]).reduce((x,P)=>x===null||P.avgDays>x.avgDays?P:x,null),$=(u.throughput??[]).reduce((x,P)=>x+P.count,0),B=(w?.experts??[]).filter(x=>x.enabled),J=B.reduce((x,P)=>x+P.open,0),q=B.reduce((x,P)=>x+(P.overdue??0),0),L=k?.series??[],A=L.length===0?null:L[L.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:x=>c(x.target.value)},a("option",{value:""},"全部项目"),(e.config.projects??[]).map(x=>a("option",{key:x.id,value:x.id},`${x.key?`[${x.key}] `:""}${x.name}`))),a(s,{className:"ds-select",value:String(o),style:{width:"auto",minWidth:96},onChange:x=>i(Number(x.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(x=>a("div",{key:x.id,className:"ds-an-row"},a("span",{className:"ds-an-name"},x.label),a("div",{className:"ds-an-track","data-empty":x.count===0?"1":"0"},a("div",{className:"ds-an-fill",style:{width:`${Math.round(x.count/z*100)}%`}})),a("span",{className:"ds-an-num"},`${x.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((x,P)=>a("div",{key:x.day,className:"ds-spark-col",title:`${x.day}:完成 ${x.count} 张`},a("div",{className:"ds-spark-bar",style:{height:`${Math.round(x.count/Math.max(1,Math.max(...u.throughput.map(K=>K.count)))*100)}%`}}),a("span",{className:"ds-spark-day"},P%2===0?x.day:"")))),a("div",{className:"ds-an-foot"},`近 14 天合计 ${$} 张 · 日均 ${($/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(x=>a("div",{key:x.status,className:"ds-an-row"},a("span",{className:"ds-an-name"},x.label),a("div",{className:"ds-an-track","data-empty":x.avgDays===0?"1":"0"},a("div",{className:"ds-an-fill ds-an-fill-warn",style:{width:`${Math.round(x.avgDays/H*100)}%`}})),a("span",{className:"ds-an-num"},E(x.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"},b===null?a("div",{className:"ds-hint"},"还没算出来"):(b.experts??[]).length===0?a("div",{className:"ds-hint"},"还没有派出过活"):a("div",null,(b.experts??[]).slice(0,8).map(x=>a("div",{className:"ds-an-kv",key:x.expert},a("span",{},`${x.label} · ${x.dispatched} 次`),a("b",{"data-warn":x.reworkRate!==null&&x.reworkRate>=40?"1":"0"},`${x.done}/${x.cards} 完成 · 一次过 ${x.firstPassRate===null?"—":x.firstPassRate+"%"}`))),a("div",{className:"ds-hint",style:{marginTop:6}},`合计:派单 ${b.totals.dispatched} 次 · 平均耗时 ${b.totals.avgMs>0?Math.round(b.totals.avgMs/1e3)+" 秒":"—"} · 返工率 ${b.totals.reworkRate===null?"—":b.totals.reworkRate+"%"} · AI 失败 ${b.totals.failures} 次 · 缺陷重开 ${b.totals.reopens} 次`),a("div",{className:"ds-hint"},b.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"}},`${w?.busy??0} 位在跑`)),a("div",{className:"ds-panel-body"},(w?.experts??[]).filter(x=>x.enabled).length===0?a("div",{className:"ds-empty"},"还没有启用的专家。"):(w?.experts??[]).filter(x=>x.enabled).map(x=>a("div",{key:x.id,className:"ds-an-row"},a("span",{className:"ds-an-name"},`${x.emoji} ${x.name}`),a("div",{className:"ds-an-track"},a("div",{className:"ds-an-fill",style:{width:`${Math.round(x.open/Math.max(1,...(w.experts??[]).map(P=>P.open))*100)}%`}})),a("span",{className:"ds-an-num"},`在办 ${x.open}${x.running>0?` · 跑 ${x.running}`:""}${x.overdue>0?` · 逾期 ${x.overdue}`:""}`))),a("div",{className:"ds-an-foot"},`${B.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(nw,{series:k?.series??[]}),a("div",{className:"ds-an-foot"},A===null?"还没有数据。":`累计建 ${A.created} · 累计完成 ${A.done} · 现在还剩 ${A.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"},d?.usage?.totals===null||d?.usage?.totals===void 0?null:a("div",{className:"ds-an-kv"},a("span",{},"token 用量"),a("b",{},(d.usage.totals.total/1e3).toFixed(1)+"k"),a("span",{className:"ds-hint",style:{marginLeft:8}},"入 "+(d.usage.totals.input/1e3).toFixed(1)+"k · 出 "+(d.usage.totals.output/1e3).toFixed(1)+"k · 缓存 "+(d.usage.totals.cacheRead/1e3).toFixed(1)+"k")),d?.usage?.totals===null||d?.usage?.totals===void 0?null:a("div",{className:"ds-an-kv"},a("span",{},"预估花费"),a("b",{},d.usage.totals.cost===null?"未知(价目表没配)":"¥"+Number(d.usage.totals.cost).toFixed(2)),(d.usage.totals.unknownCalls??0)>0?a("span",{className:"ds-hint",style:{marginLeft:8}},d.usage.totals.unknownCalls+" 次无价目"):null),a("div",{className:"ds-an-kv"},a("span",{},"平均执行时长"),a("b",{},`${Math.round((d?.avgMs??0)/1e3)} 秒`)),(d?.byModel??[]).slice(0,3).map(x=>a("div",{key:`m-${x.key}`,className:"ds-an-kv"},a("span",{},`模型 ${x.key}`),a("b",{},`${x.runs} 次`))),(d?.byPromptVersion??[]).slice(0,3).map(x=>a("div",{key:`p-${x.key}`,className:"ds-an-kv"},a("span",{},`提示词 ${x.key}`),a("b",{},`${x.runs} 次`))),(d?.usage?.unpricedModels??[]).length===0?null:a("div",{className:"ds-hint"},"未配价目的模型:"+d.usage.unpricedModels.map(x=>x.model+" ×"+x.calls).join("、")),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(x=>a("div",{key:x.id,className:"ds-listrow"},a("div",{className:"ds-listrow-main"},a("div",null,`${x.code===""?"":`${x.code} `}${x.title}`),a("div",{className:"ds-hint"},`倒退 ${x.backward} 次 · 现在在「${(e.statuses.find(P=>P.id===x.status)??{}).label??x.status}」`)),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>t(x.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}),w=Lx({h:t,React:e}),y=mx({h:t,ChipField:u}),k=gx({h:t,React:e,Card:y,TextField:l,SelectField:f,CheckField:p,toast:B});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,b=null;function S(Y){h=Y,typeof b=="function"&&b(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 b=Q,h!==null&&Q(h),()=>{b===Q&&(b=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,z=[],H=[],M={text:"",at:0};function $(){const Y=z.slice();for(const ne of H.slice())ne(Y)}function B(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 z=z.concat([{id:de,text:be,tone:ne}]),$(),window.setTimeout(()=>{J(de)},ee),de}function J(Y){const ne=z.filter(ee=>ee.id!==Y);ne.length!==z.length&&(z=ne,$())}const q={success:"✓",error:"!",info:"i"};function L(){const[Y,ne]=e.useState(()=>z.slice());return e.useEffect(()=>(H.push(ne),()=>{H=H.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"},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 A="dsh-studio:user";function x(){try{const Y=window.localStorage.getItem(A);if(typeof Y=="string"&&Y.trim()!=="")return Y.trim().slice(0,40)}catch{}return"人"}function P(Y){const ne=String(Y??"").trim().slice(0,40)||"人";try{window.localStorage.setItem(A,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 F(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(x())},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=`
|
|
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>id||n.length>id)return[{kind:"del",text:`(原基线 ${a.length} 行,超过 ${id} 行的对比上限)`},{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:w,ChipField:y,CheckField:k,SelectField:g,MdField:d}=bt(),h=e.requirements??[],b=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),[F,W]=o.useState(null),[L,$]=o.useState(!1),[B,ee]=o.useState(null),[M,O]=o.useState(null),[A,x]=o.useState(null),[P,G]=o.useState(null),[te,q]=o.useState(null),[K,ke]=o.useState(!1),[pe,xe]=o.useState(null),[Y,H]=o.useState(!1),[R,ne]=o.useState(null),[we,Z]=o.useState(null),[le,he]=o.useState(null),[V,$e]=o.useState(""),[Ne,je]=o.useState(null),[We,Qa]=o.useState("0"),[jn,U]=o.useState([]),[ve,De]=o.useState(null),[qe,It]=o.useState(null),[Kt,st]=o.useState(!1),Et=async()=>{if(pt!==null){st(!0);try{const z=await i("/requirement/impact",{id:pt.id});It({summary:z.summary,cards:z.cards??[],cases:z.cases??[]})}catch(z){De(z instanceof Error?z.message:String(z))}finally{st(!1)}}},pt=h.find(z=>z.id===S)??null;o.useEffect(()=>{Qa(String(pt?.order??0)),U(Array.isArray(pt?.dependsOn)?pt.dependsOn:[]),De(null)},[S,pt?.updatedAt]);const $a=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(We)||0,dependsOn:jn}}),De("已保存:排序与依赖"),l("排序与依赖已保存"),a!==void 0&&a()}catch(z){De(z instanceof Error?z.message:String(z))}},hs=async z=>{if(X===null)return;const me=String(V??"").trim();if(z==="sign"&&me===""){je("签字要写一句结论:交付了什么、遗留什么");return}try{await i("/requirement/signoff",{id:X.id,action:z,note:me,by:c()}),je(z==="sign"?"已签字":"已取消签字"),l(z==="sign"?"需求已签字":"已取消需求签字"),$e(""),a!==void 0&&a()}catch(Me){je(Me.message)}},Q=o.useCallback(async z=>{if(z==null||z===""){ne(null);return}try{const me=await i("/requirement/matrix",{id:z});ne(me.matrix)}catch(me){Z(me.message)}},[]),se=async z=>{if(X!==null)try{await i("/requirement/save",{requirement:{...X,links:X.links??{},points:z}}),await Q(X.id),Z("功能点已保存"),he(null)}catch(me){Z(me.message)}},ae=()=>({title:"",description:"",priority:"normal",status:"draft",acceptance:[]}),ye=async()=>{if(le===null||X===null)return;if(String(le.title??"").trim()===""){Z("功能点要有标题");return}const z=String(le.acceptanceText??"").split(`
|
|
45
|
+
`).map(ft=>ft.trim()).filter(ft=>ft!==""),me={id:le.id??`p${(X.points??[]).length+1}`,title:le.title,description:le.description??"",priority:le.priority??"normal",status:le.status??"draft",acceptance:z.map((ft,Ma)=>({id:`a${Ma+1}`,text:ft,done:!1}))},Me=(X.points??[]).filter(ft=>ft.id!==me.id);await se([...Me,me])},re=async z=>{X!==null&&await u("删除这个功能点?挂在上面的卡会变成「未归功能点」。",{title:"删除功能点",danger:!0,okText:"删除"})&&await se((X.points??[]).filter(me=>me.id!==z))},ce=async(z,me)=>{try{await i("/task/update",{id:z,pointId:me}),X!==null&&await Q(X.id)}catch(Me){Z(Me.message)}},X=h.find(z=>z.id===S)??null,be=z=>e.tasks.filter(me=>me.requirementId===z),Ee=z=>e.statuses.find(me=>me.id===z)?.label??z;o.useEffect(()=>{ne(null),Z(null),X!==null&&Q(X.id)},[X===null?"":X.id,Q]);const Ce=async()=>{if(_!==null){if(String(_.title??"").trim()===""){W("需求标题不能为空");return}$(!0);try{const z=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},discovery:_.discovery??{server:"",auth:"",boundary:""}}});C(z.requirement.id),I(null),W(null),l(z.created===!0?"需求已创建":"需求已保存")}catch(z){W(z.message)}finally{$(!1)}}},_e=async z=>{if(X!==null)try{await i("/requirement/save",{requirement:{...X,links:X.links??{},status:z}}),l("需求状态已更新")}catch(me){W(me.message)}},dt=async z=>{if(await u("删除这条需求?它下面的卡会保留,只是不再挂需求。",{title:"删除需求",danger:!0,okText:"删除"}))try{await i("/requirement/delete",{id:z}),C(null)}catch(me){W(me.message)}},rt={pending:"待评审",approved:"评审通过",changes_requested:"评审打回"},[Je,He]=o.useState(!1),[et,Ge]=o.useState(null),Pe=async(z,me)=>{if(X!==null){He(!0),Ge(null);try{const Me=await i("/requirement/review",{id:X.id,decision:z,note:me??"",by:c(),operator:c()});Ge(`已${z==="approve"?"通过":z==="reject"?"打回":"提交"}评审:${rt[Me.review?.status]??""}`),typeof a=="function"&&a()}catch(Me){Ge(Me.message)}finally{He(!1)}}},Rt=async()=>{const z=await p("打回要给意见(会记在评审记录里):",{title:"评审打回",danger:!0,okText:"打回",placeholder:"写清楚哪里不满足,之后要据此改"});if(z!==null){if(String(z).trim()===""){Ge("打回必须写意见");return}Pe("reject",String(z).trim().slice(0,600))}},[Ue,xt]=o.useState(!1),[At,Ut]=o.useState(null),de=async()=>{if(X!==null){xt(!0),Ut(null);try{const z=await i("/requirement/split",{id:X.id}),me=z.created??[],Me=Array.isArray(z.warnings)?z.warnings:[];Ut((me.length===0?"没有可拆的功能点:要么都覆盖了,要么还没加功能点。":`已建 ${me.length} 张卡:${me.map(ft=>ft.code||ft.id).join("、")}`)+(Me.length===0?"":" ⚠ "+Me.join(";"))),typeof a=="function"&&a()}catch(z){Ut(z.message)}finally{xt(!1)}}},Se=()=>({kind:"prd",title:"",url:X?.links?.prd??"",version:"v1.0",content:"",status:"draft"}),ge=async z=>{if(O(null),z===null){ee(Se());return}try{const Me=((await i("/requirement/get",{id:X.id})).requirement?.docs??[]).find(ft=>ft.id===z);ee(Me===void 0?Se():{...Me})}catch(me){W(me.message)}},Xa=async z=>{if(A!==null&&A.id===z){x(null);return}x({id:z,content:"",busy:!0});try{const Me=((await i("/requirement/get",{id:X.id})).requirement?.docs??[]).find(ft=>ft.id===z);x({id:z,content:String(Me?.content??""),busy:!1})}catch(me){W(me.message),x(null)}},$t=async()=>{if(P!==null){G(null);return}try{const me=(await i("/requirement/get",{id:X.id})).requirement??{},Me=me.baseline??null,Ma=[...me.docs??[]].sort((Ln,Bo)=>(Number(Bo.at)||0)-(Number(Ln.at)||0)),oa=Ma.find(Ln=>Ln.kind==="prd")??Ma[0]??null;if(Me===null){G(null),W("这条需求还没有基线,先挑一份文档「设为基线」");return}if(oa===null){G(null),W("这条需求还没有文档可以对比");return}const za=sw(Me.content??"",oa.content??"");G({rows:za,summary:rw(za),version:Me.version,docTitle:oa.title})}catch(z){G(null),W(z instanceof Error?z.message:String(z))}},ga=async()=>{if(te!==null){q(null);return}try{const z=await i("/requirement/get",{id:X.id}),me={};for(const Me of z.requirement?.docs??[])me[Me.id]=String(Me.content??"");q(me)}catch(z){W(z.message)}},Dn=async()=>{if(B!==null){if(String(B.title??"").trim()===""){O("文档要有标题");return}ke(!0);try{const z=await i("/requirement/doc",{id:X.id,action:B.id===void 0?"add":"update",docId:B.id,doc:{kind:B.kind,title:B.title,url:B.url,version:B.version,content:B.content,status:B.status}});ee(null),O(null)}catch(z){O(z.message)}finally{ke(!1)}}},La=async()=>{H(!0),xe(null);try{const z=await i("/requirement/folder",{id:X.id});xe(z.ok?`云盘文件夹已就绪:${z.folder?.url??""}`:`创建失败:${z.error||z.folder?.error||"未知原因"}`)}catch(z){xe(z.message)}finally{H(!1)}},Lt=async()=>{H(!0),xe(null);try{const me=(await i("/requirement/sync",{id:X.id})).report??{},Me=Number(me.failed??0);xe(`归档完成:共 ${me.total??0} 件,成功 ${me.written??0} 件${Me>0?`,失败 ${Me} 件(${me.errors?.[0]??""})`:"。"}`)}catch(z){xe(z.message)}finally{H(!1)}},Mt=async z=>{try{await i("/requirement/doc",{id:X.id,action:"baseline",docId:z,by:"人"}),O("这一版已生效,之后新建的卡都会记下它。")}catch(me){O(me.message)}},On=async()=>{const z=X?.baseline?.version??"";if(await u("把 PRD 正文恢复到基线 "+z+"?版本号会 +1,验收签字作废。",{title:"回滚到基线",okText:"回滚"}))try{await i("/requirement/doc",{id:X.id,action:"rollback",by:"人"}),G(null),O("已回滚到基线 "+z+":版本号 +1,签字作废。"),typeof a=="function"&&a()}catch(me){O(me.message)}},J=async()=>{try{await i("/requirement/doc",{id:X.id,action:"clear-baseline"}),O("基线已取消,需求回到「评审中」。")}catch(z){O(z.message)}},Ie=async z=>{if(await u("删除这份文档?",{title:"删除文档",danger:!0,okText:"删除"}))try{await i("/requirement/doc",{id:X.id,action:"remove",docId:z})}catch(me){O(me.message)}},wt=async()=>{ke(!0),O(null);try{const z=await i("/requirement/pull",{url:B?.url??""});if(z.ok===!0){const me=String(z.text??"");ee(Me=>({...Me,title:String(Me?.title??"").trim()===""?String(z.title??""):Me.title,content:me})),O(`已拉取 ${me.length} 字正文${z.title?`,标题取自文档「${z.title}」`:""}。`)}else O(z.error??"拉取失败")}catch(z){O(z.message)}finally{ke(!1)}},vt=_===null?null:s("div",{className:"ds-panel ds-form-panel"},s("div",{className:"ds-panel-head"},_.id===void 0?"新建需求":`编辑 ${X?.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:z=>I({..._,title:z.target.value})})),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"有没有服务端?数据存在哪、刷新会不会丢"),s(v,{className:"ds-input",placeholder:"例:有,node:sqlite;或「纯前端演示,刷新即还原」",value:_.discovery?.server??"",onChange:z=>I({..._,discovery:{..._.discovery??{},server:z.target.value}})})),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"鉴权谁做:前端隐藏按钮,还是服务端拒绝"),s(v,{className:"ds-input",placeholder:"例:服务端校验角色,viewer 调写接口直接 403",value:_.discovery?.auth??"",onChange:z=>I({..._,discovery:{..._.discovery??{},auth:z.target.value}})})),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"交付边界:只交付界面,还是点开就能用"),s(v,{className:"ds-input",placeholder:"例:前后端都交付,含测试;或「只做 UI,接口后续接」",value:_.discovery?.boundary??"",onChange:z=>I({..._,discovery:{..._.discovery??{},boundary:z.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:z=>I({..._,project:z.target.value})},s("option",{value:""},"不指定"),b.map(z=>s("option",{key:z.id,value:z.id},z.name)))),s("div",{className:"ds-field",style:{flex:1}},s("div",{className:"ds-label"},"状态"),s(g,{className:"ds-select",value:_.status,onChange:z=>I({..._,status:z.target.value})},ef.map(z=>s("option",{key:z,value:z},jr[z])))),s("div",{className:"ds-field",style:{flex:1}},s("div",{className:"ds-label"},"业务负责人"),s(v,{className:"ds-input",value:_.owner,onChange:z=>I({..._,owner:z.target.value})})),s("div",{className:"ds-field",style:{flex:1}},s("div",{className:"ds-label"},"业务领域"),s(v,{className:"ds-input",placeholder:"支付 / 风控 / 会员(决定派给哪位领域专家)",value:_.domain??"",onChange:z=>I({..._,domain:z.target.value})}))),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"PRD 链接"),s(v,{className:"ds-input",placeholder:"https://…(飞书云文档)",value:_.prd,onChange:z=>I({..._,prd:z.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:z=>I({..._,proto:z.target.value})})),s("div",{className:"ds-field",style:{flex:1}},s("div",{className:"ds-label"},"验收标准链接"),s(v,{className:"ds-input",value:_.acceptance,onChange:z=>I({..._,acceptance:z.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:z=>I({..._,description:z.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:L,onClick:()=>void Ce()},L?"保存中…":"保存需求")))),qt=X===null?s("div",{className:"ds-empty"},"左边选一条需求,或先新建一条。"):(()=>{const z=be(X.id),me=z.filter(j=>j.status==="done").length,Me=z.filter(j=>j.blocked!==void 0&&j.blocked!==null).length,ft=z.filter(j=>j.type==="bug"&&j.status!=="done").length,Ma=z.reduce((j,ue)=>{const Be=td(ue);return{done:j.done+Be.done,total:j.total+Be.total}},{done:0,total:0}),oa=z.reduce((j,ue)=>{const Be=ed(ue);return{pass:j.pass+Be.pass,total:j.total+Be.total}},{pass:0,total:0}),za=z.flatMap(j=>(j.artifacts??[]).map(ue=>({...ue,task:j}))),Ln=z.filter(j=>(j.gitlabMR?.iid??0)>0),Bo=oa.pass,Mn=X.links??{},Za=X.folder??{},vs=(j,ue)=>ue===""?null:s("a",{className:"ds-link",href:ue,target:"_blank",rel:"noreferrer"},j);return s("div",{className:"ds-req-body"},s("div",{className:"ds-req-headline"},s("div",null,s("div",{className:"ds-req-code"},X.code||X.id),s("div",{className:"ds-req-name"},X.title)),s("div",{className:"ds-req-actions"},s(g,{className:"ds-select",value:X.status,onChange:j=>void _e(j.target.value)},ef.map(j=>s("option",{key:j,value:j},jr[j]))),s("button",{className:"ds-btn",onClick:()=>I({...X,...Mn})},"编辑"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void dt(X.id),"data-danger":"1"},"删除"))),(()=>{const j=X.review??null,ue=j===null?"还没提交评审":rt[j.status]??j.status,Be=j===null||j.status==="changes_requested",kt=j!==null&&j.status==="pending";return s("div",{className:"ds-panel","data-review":j===null?"none":j.status,style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"需求评审"),s(y,{className:"ds-chip","data-on":j?.status==="approved"?"1":"0",style:{marginLeft:8}},ue),j===null||j.at===0?null:s("span",{className:"ds-hint",style:{marginLeft:"auto"}},`${Ke(j.at)}${j.by===""?"":` · ${j.by}`}`)),s("div",{className:"ds-panel-body"},j!==null&&String(j.note??"")!==""?s("div",{className:"ds-hint",style:{marginBottom:8}},`评审意见:${j.note}`):null,s("div",{className:"ds-row",style:{flexWrap:"wrap",gap:8}},Be?s("button",{className:"ds-btn ds-btn-primary",disabled:Je,onClick:()=>void Pe("submit")},Je?"提交中…":"提交评审"):null,kt?s("button",{className:"ds-btn ds-btn-primary",disabled:Je,onClick:()=>void Pe("approve")},"评审通过"):null,kt?s("button",{className:"ds-btn ds-btn-ghost",disabled:Je,onClick:Rt,"data-danger":"1"},"打回"):null,j?.status==="approved"?s("span",{className:"ds-hint"},"评审已通过,可以拆卡和派活了。"):null),et===null?null:s("div",{className:"ds-hint",style:{marginTop:8}},et)))})(),vs("PRD",Mn.prd)||vs("原型",Mn.proto)||vs("验收标准",Mn.acceptance)?s("div",{className:"ds-req-links"},vs("PRD 文档",Mn.prd),vs("原型",Mn.proto),vs("验收标准",Mn.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 j=await p("想请产品补什么?",{title:"申请产品补 PRD",defaultValue:"需要产品输出 PRD 与原型"});if(j!==null)try{await i("/requirement/request-prd",{id:X.id,by:c(),note:j}),l("已申请产品补 PRD"),a()}catch(ue){l(ue.message??String(ue),"error")}}},"让产品补 PRD")]),X.description?s("div",{className:"ds-panel ds-req-desc-panel",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"需求明细"),X.source==="business"?s("span",{className:"ds-hint","data-src":"business"},`业务提单 · ${X.requester?.name||"未署名"}${X.requester?.dept?"("+X.requester.dept+")":""} · ${Ke(X.requester?.at||X.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(X.description)))):s("div",{className:"ds-req-desc ds-hint"},"还没有写需求描述:产品背景、要解决的问题、验收口径都建议写在这里,点右侧「编辑」补上。"),(()=>{const j=(X.history??[]).slice().reverse();if(j.length===0||(X.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"}},`最近 ${j.length} 条`)),s("div",{className:"ds-panel-body"},s("div",{style:{display:"flex",flexDirection:"column",gap:6,maxHeight:260,overflowY:"auto"}},j.map((Be,kt)=>s("div",{key:`${Be.at}-${kt}`,style:{display:"flex",gap:8,alignItems:"baseline",fontSize:12}},s("span",{className:"ds-hint",style:{flex:"0 0 auto",fontVariantNumeric:"tabular-nums"}},Ke(Be.at)),s("span",{style:{flex:"0 0 auto"}},Be.by===""?"人":Be.by),s("span",{className:"ds-chip",style:{flex:"0 0 auto"}},ue[Be.field]??Be.field),s("span",{className:"ds-hint",style:{minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}},`${Be.from===""?"(空)":Be.from} → ${Be.to===""?"(空)":Be.to}`))))))})(),(()=>{const j=X.pool??{reach:0,impact:0,confidence:0,effort:0,score:0},ue=async(kt,ia,tt)=>{const Oe=await p(ia,{title:kt,defaultValue:String(tt??0)});if(Oe===null)return null;const Ye=Number(String(Oe).trim());return Number.isFinite(Ye)&&Ye>=0?Ye:null},Be=async()=>{const kt=await ue("影响面 Reach","影响多少用户或多少笔交易?估算依据写进正文",j.reach);if(kt===null)return;const ia=await ue("影响度 Impact","3 显著 / 2 高 / 1 中 / 0.5 低",j.impact);if(ia===null)return;const tt=await ue("置信度 Confidence","100 有数据 / 80 有访谈 / 50 只有猜测(百分数)",j.confidence);if(tt===null)return;const Oe=await ue("成本 Effort","人日(研发+测试+联调)",j.effort);if(Oe!==null)try{await i("/requirement/pool",{id:X.id,pool:{reach:kt,impact:ia,confidence:tt,effort:Oe}}),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"}},j.score>0?`得分 ${j.score}`:"还没打分:不打分就没法和别的需求比优先级"),s("button",{className:"ds-btn ds-btn-ghost",style:{marginLeft:8},onClick:()=>void Be()},j.score>0?"重新打分":"打分")),j.score>0?s("div",{className:"ds-panel-body"},s("div",{className:"ds-row",style:{flexWrap:"wrap",gap:8}},s("span",{className:"ds-chip"},`影响面 ${j.reach}`),s("span",{className:"ds-chip"},`影响度 ${j.impact}`),s("span",{className:"ds-chip"},`置信度 ${j.confidence}%`),s("span",{className:"ds-chip"},`成本 ${j.effort} 人日`),s("span",{className:"ds-chip","data-on":"1"},`得分 ${j.score}`))):null)})(),(()=>{const j=X.questions??[],ue=j.filter(Oe=>Oe.status==="open").length,Be=async(Oe,Ye)=>{try{await i("/requirement/questions",{id:X.id,...Oe}),Ye&&l(Ye),await a()}catch(zn){l(zn instanceof Error?zn.message:String(zn),"error")}},kt=async()=>{const Oe=await p("还没确认清楚的问题是什么?",{title:"加一个待确认问题",placeholder:"例如:退款失败时是否允许人工补发?"});Oe===null||Oe.trim()===""||await Be({action:"add",text:Oe},"已加入待确认清单")},ia=async Oe=>{const Ye=await p(Oe.text,{title:"回答这个问题",defaultValue:Oe.answer??"",placeholder:"写清结论与依据"});Ye===null||Ye.trim()===""||await Be({action:"answer",questionId:Oe.id,answer:Ye},"已回答")},tt=async Oe=>{await u("删掉这个问题?",{title:"删除待确认项",danger:!0,okText:"删除"})===!0&&await Be({action:"delete",questionId:Oe.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} 个没回答,回答完才能拆卡`:j.length===0?"澄清阶段把不确定的先记在这里":"全部已回答"),s("button",{className:"ds-btn ds-btn-ghost",style:{marginLeft:8},onClick:()=>void kt()},"+ 加问题")),s("div",{className:"ds-panel-body"},j.length===0?s("div",{className:"ds-empty"},"还没有待确认的问题。产品澄清时把「需要业务拍板」的点写在这里,避免猜业务规则。"):s("div",{style:{display:"flex",flexDirection:"column",gap:8}},j.map(Oe=>s("div",{key:Oe.id,className:"ds-question-row","data-status":Oe.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":Oe.status==="answered"?"1":"0"},Oe.status==="answered"?"已回答":"待回答"),s("div",{style:{flex:"1 1 auto",minWidth:0}},s("div",{style:{fontSize:13}},Oe.text),Oe.answer===""||Oe.answer===void 0?null:s("div",{className:"ds-hint",style:{marginTop:4}},`答:${Oe.answer}`)),s("div",{style:{display:"flex",gap:6,flex:"0 0 auto"}},s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void ia(Oe)},Oe.status==="answered"?"改答案":"回答"),s("button",{className:"ds-btn ds-btn-ghost","data-danger":"1",onClick:()=>void tt(Oe)},"删除")))))))})(),(()=>{const j=X.change??null;if(j===null)return null;const ue=j.affected??[],Be=j.affectedCases??[],kt=new Map(z.map(tt=>[tt.id,tt])),ia=tt=>e.statuses.find(Oe=>Oe.id===tt)?.label??tt;return s("div",{className:"ds-panel ds-change-panel","data-invalidated":j.invalidated?"1":"0",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,j.invalidated?"变更影响(签字已作废)":"变更影响"),s("span",{className:"ds-hint",style:{marginLeft:"auto"}},`${Ke(j.at)}${j.by===""?"":` · ${j.by}`}`)),s("div",{className:"ds-panel-body"},function(){const tt=(X.history??[]).slice().reverse();if(tt.length===0)return null;const Oe={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}},`变更记录 · 最近 ${tt.length} 条`),tt.map((Ye,zn)=>s("div",{key:`${Ye.at}-${zn}`,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"},Oe[Ye.field]??Ye.field),s("span",{className:"ds-hint"},`${Ye.from===""?"(空)":Ye.from} → ${Ye.to===""?"(空)":Ye.to}`))))}(),s("div",{className:"ds-hint"},`改了:${(j.parts??[]).join("、")}。${ue.length===0?"当时没有已产出的卡受影响,不用返工。":`${ue.length} 张卡已经产出过东西${Be.length===0?"":`、${Be.length} 条用例要重跑`},要按新版复核:`}`),ue.length===0?null:s("div",{className:"ds-row",style:{flexWrap:"wrap",gap:8,marginTop:8}},ue.map(tt=>s("span",{key:tt.id,className:"ds-chip","data-pt":"open",style:{cursor:"pointer"},title:tt.title,onClick:()=>{const Oe=kt.get(tt.id);Oe!==void 0&&typeof t=="function"&&t(Oe)}},`${tt.code||tt.id} ${ia(tt.status)}`))),j.invalidated?s("div",{className:"ds-hint",style:{marginTop:8}},"验收签字已清空:这些卡是按旧版做的,复核完重新签一次。"):null))})(),(()=>{const j=X.deploys??[];return j.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}},j.map(ue=>s("span",{key:ue.id,className:"ds-chip","data-env":ue.kind,title:`${ue.releaseName??""} · ${Ke(ue.at)} · ${ue.by}`},`${ue.name} · ${en(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:We,onChange:j=>Qa(j.target.value)}),s("span",{className:"ds-hint"},"被依赖的需求没交付,这条需求的准出会被拦")),s("div",{className:"ds-row",style:{flexWrap:"wrap",gap:10}},h.filter(j=>j.id!==X.id).map(j=>s("label",{key:j.id,className:"ds-check-row"},s(k,{checked:jn.includes(j.id),onChange:ue=>U(Be=>ue.target.checked?[...Be,j.id]:Be.filter(kt=>kt!==j.id))}),s("span",{className:"ds-check-text"},`${j.code||j.id} ${j.title}(${jr[j.status]??j.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 $a()},"保存排序与依赖"),ve===null?null:s("span",{className:"ds-hint"},ve)))),(()=>{const j=X.progress??null,ue=j?.gate??{ready:!1,blockers:["还没有加载出准出状态,稍后自动刷新"],warnings:[]},Be=ue.stats??{},kt=X.signoff??null,ia=j?.progress??(z.length===0?0:Math.round(me/z.length*100)),tt=Be.coveredPoints??0,Oe=Be.points??(X.points??[]).length,Ye=Be.pass??Bo,zn=Be.cases??oa.total;return s("div",{className:"ds-panel",style:{marginTop:14}},s("div",{className:"ds-panel-head"},s("span",null,"需求准出与验收签字"),s(y,{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":ia===100?"1":"0"},s("span",{style:{width:`${ia}%`}})),s("div",{className:"ds-hint"},`${ia}% · ${me}/${z.length} 张卡完成 · 功能点覆盖 ${tt}/${Oe} · 用例通过 ${Ye}/${zn}`)),(ue.blockers??[]).map(Ja=>s("div",{key:Ja,className:"ds-gate-item","data-kind":"block"},`⛔ ${Ja}`)),(ue.warnings??[]).map(Ja=>s("div",{key:Ja,className:"ds-gate-item","data-kind":"warn"},`⚠ ${Ja}`)),ue.ready?s("div",{className:"ds-hint"},"门禁已通过:签完字这条需求就算交付。"):null,kt===null?s("div",{className:"ds-gate-sign"},s(v,{className:"ds-input",style:{flex:1,minWidth:220},placeholder:"验收结论:交付了什么、遗留什么",value:V,onChange:Ja=>$e(Ja.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}},`✍ ${kt.by} 于 ${Ke(kt.at)} 签字:${kt.note}`),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void hs("clear")},"取消签字")),Ne===null?null:s("div",{className:"ds-hint"},Ne)))})(),s("div",{className:"ds-sec-head",style:{marginTop:16}},"交付物归档(飞书云盘)",s("div",{className:"ds-req-actions"},Za.url?s("a",{className:"ds-link",href:Za.url,target:"_blank",rel:"noreferrer"},"打开文件夹"):null,s("button",{className:"ds-btn ds-btn-ghost",disabled:Y,onClick:()=>void La()},Za.url?"校验文件夹":"创建文件夹"),s("button",{className:"ds-btn",disabled:Y||za.length===0,onClick:()=>void Lt()},Y?"归档中…":`归档 ${za.length} 件交付物`))),s("div",{className:"ds-hint"},Za.url?`文件夹:${Za.name||Za.token} 已归档 ${za.filter(j=>j.doc?.url).length}/${za.length} 件交付物`:Za.error?`上次创建失败:${Za.error}`:"还没有云盘文件夹;建好后,这条需求下每件交付物都会写成文件夹里的一份 Markdown 文档。"),pe?s("div",{className:"ds-hint"},pe):null,s("div",{className:"ds-sec-head",style:{marginTop:16}},"文档与基线",s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void ge(null)},"+ 添加文档")),X.baseline?s("div",{className:"ds-base-box"},s("div",{className:"ds-base-main"},s("b",null,`当前基线 ${X.baseline.version}`),s("span",null,`${X.baseline.title} · 生效于 ${Ke(X.baseline.at)} · ${X.baseline.by||"人"} · 正文 ${X.baseline.contentLength??0} 字`)),s("button",{className:"ds-btn ds-btn-ghost",title:"把当前文档和这份基线逐行比一遍(只读)",onClick:()=>void $t()},P===null?"对比基线":"收起对比"),s("button",{className:"ds-btn ds-btn-ghost",title:"把正文恢复到这一版基线;版本号 +1,签字作废",onClick:()=>void On()},"回滚到基线"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void J()},"取消基线")):s("div",{className:"ds-base-box","data-empty":"1"},s("div",{className:"ds-base-main"},s("b",null,"还没有基线"),s("span",null,"PRD 评审通过后点「设为基线」,之后建的卡都会记下用的是哪一版。"))),X.baseline!==null&&P!==null?s("div",{className:"ds-diff"},s("div",{className:"ds-diff-head"},s("b",null,`基线 ${P.version} → 当前:${P.docTitle}`),s("span",{className:"ds-hint"},P.summary.added+P.summary.removed===0?"正文没有变化":`+${P.summary.added} 行 / −${P.summary.removed} 行`)),s("div",{className:"ds-diff-body"},P.rows.slice(0,400).map((j,ue)=>s("div",{key:ue,className:"ds-diff-line","data-kind":j.kind},`${j.kind==="add"?"+":j.kind==="del"?"−":" "} ${j.text}`)),P.rows.length>400?s("div",{className:"ds-hint"},`(还有 ${P.rows.length-400} 行未显示)`):null)):null,(X.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 ga()},te===null?"全部展开":"全部收起"),s("span",{className:"ds-hint"},`共 ${(X.docs??[]).length} 篇,展开后可直接读 Markdown 正文`)),s("div",{className:"ds-doc-list"},(X.docs??[]).map(j=>s("div",{key:j.id,className:"ds-doc-wrap"},s("div",{className:"ds-doc-row"},s(y,{className:"ds-chip","data-doc":j.kind},tf[j.kind]??j.kind),s("div",{className:"ds-doc-main"},s("div",{className:"ds-doc-title"},j.url===""?j.title:s("a",{className:"ds-link",href:j.url,target:"_blank",rel:"noreferrer"},j.title),s("span",{className:"ds-chip-code"},j.version),s(y,{className:"ds-chip","data-docstatus":j.status},cx[j.status]??j.status)),s("div",{className:"ds-doc-meta"},`正文 ${j.contentLength??0} 字 · ${j.by||"—"} · ${j.at>0?Ke(j.at):"—"}`)),s("div",{className:"ds-listrow-actions"},j.status==="baseline"?null:s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void Mt(j.id)},"设为基线"),s("button",{className:"ds-btn ds-btn-ghost",title:"直接读正文(Markdown 渲染)",onClick:()=>void Xa(j.id)},A!==null&&A.id===j.id?"收起":"阅读"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void ge(j.id)},"编辑"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void Ie(j.id),"data-danger":"1"},"删除"))),A!==null&&A.id===j.id?s("div",{className:"ds-md-preview ds-reader"},A.busy?s("span",{className:"ds-hint"},"读取中…"):A.content.trim()===""?s("span",{className:"ds-hint"},"这条文档还没有正文。"):f(A.content)):te!==null&&te[j.id]!==void 0?s("div",{className:"ds-md-preview ds-reader"},te[j.id].trim()===""?s("span",{className:"ds-hint"},"这条文档还没有正文。"):f(te[j.id])):null)))),M===null?null:s("div",{className:"ds-hint",style:{marginTop:6}},M),B===null?null:s("div",{className:"ds-panel ds-form-panel",style:{marginTop:10}},s("div",{className:"ds-panel-head"},B.id===void 0?"添加文档":`编辑 ${B.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:B.kind,onChange:j=>ee({...B,kind:j.target.value})},dx.map(j=>s("option",{key:j,value:j},tf[j])))),s("div",{className:"ds-field",style:{flex:"1 1 220px"}},s("div",{className:"ds-label"},"标题"),s(v,{className:"ds-input",value:B.title,placeholder:"例如 会员积分抵扣 PRD",onChange:j=>ee({...B,title:j.target.value})})),s("div",{className:"ds-field",style:{flex:"0 0 110px"}},s("div",{className:"ds-label"},"版本"),s(v,{className:"ds-input",value:B.version,placeholder:"v1.0",onChange:j=>ee({...B,version:j.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:B.url,placeholder:"https://<租户>.feishu.cn/wiki/…",onChange:j=>ee({...B,url:j.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 wt()},K?"拉取中…":"从链接拉正文"))),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"文档正文(拉不到就自己粘,研发和测试都读这一份)"),s(d,{className:"ds-textarea",rows:8,value:B.content,onChange:j=>ee({...B,content:j.target.value})})),s("div",{className:"ds-row",style:{justifyContent:"flex-end",gap:8}},s("button",{className:"ds-btn",onClick:()=>{ee(null),O(null)}},"取消"),s("button",{className:"ds-btn ds-btn-primary",disabled:K,onClick:()=>void Dn()},"保存文档")))),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:Kt||pt===null,onClick:()=>void Et()},Kt?"计算中…":"算一下影响面"),qe===null?s("span",{className:"ds-hint"},"还没算过"):s("span",{className:"ds-hint"},`卡 ${qe.summary.cards} · 用例 ${qe.summary.cases}(能自动跑 ${qe.summary.runnable})· 失败 ${qe.summary.failing}`)),qe===null||qe.cards.length===0?null:s("div",{className:"ds-sec-body",style:{maxHeight:160,overflow:"auto"}},qe.cards.slice(0,12).map(j=>s("div",{key:j.id,className:"ds-art-row"},s("span",{className:"ds-art-title"},(j.code===""?"":j.code+" ")+j.title),s("span",{className:"ds-hint"},j.status))),qe.cards.length>12?s("div",{className:"ds-hint"},`还有 ${qe.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,这里就能看出哪条没人做、哪条没被验证。")),R===null?s("div",{className:"ds-hint",style:{padding:"6px 0"}},"还没有功能点。点「+ 加功能点」把需求拆成可交付、可验证的条目。"):s("div",{className:"ds-matrix"},s("div",{className:"ds-matrix-sum"},`功能点 ${R.summary.points} · 已覆盖 ${R.summary.coveredPoints}${R.summary.pointsWithoutCases>0?`(${R.summary.pointsWithoutCases} 条还没有用例,覆盖率 ${R.summary.coverageRate}%)`:""} · 卡 ${R.summary.cards}(未归点 ${R.summary.looseCards})· 用例 ${R.summary.cases}(通过 ${R.summary.pass}${R.summary.fail>0?`,失败 ${R.summary.fail}`:""})· 通过率 ${R.summary.passRate}%`),(R.points??[]).map(j=>s("div",{key:j.id,className:"ds-pt-row","data-covered":j.covered?"1":"0"},s("div",{className:"ds-pt-main"},s("div",{className:"ds-pt-title"},s("span",{className:"ds-chip-code"},j.id),s("b",null,j.title),s(y,{className:"ds-chip","data-pt":j.covered?"covered":"open"},j.covered?"已覆盖":"未覆盖")),String(j.description??"")===""?null:s("div",{className:"ds-req-desc ds-md"},f(j.description)),s("div",{className:"ds-pt-meta"},`卡 ${j.cards.length}${j.cards.length===0?"(还没人做)":":"+j.cards.map(ue=>ue.code||ue.id).join("、")}`,` · 用例 ${j.cases.total}(通过 ${j.cases.pass}${j.cases.fail>0?`,失败 ${j.cases.fail}`:""}${j.cases.pending>0?`,没跑 ${j.cases.pending}`:""})`,j.acceptance.length===0?"":` · 验收条件 ${j.acceptance.filter(ue=>ue.covered).length}/${j.acceptance.length}`)),s("div",{className:"ds-listrow-actions"},s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>he({...j,acceptanceText:(j.acceptance??[]).map(ue=>ue.text).join(`
|
|
46
|
+
`)})},"编辑"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>void re(j.id),"data-danger":"1"},"删除")))),(R.loose??[]).length===0?null:s("div",{className:"ds-pt-loose"},s("div",{className:"ds-hint",style:{marginBottom:6}},`还有 ${R.loose.length} 张卡没归到功能点,选一个挂上去,矩阵才算完整:`),R.loose.map(j=>s("div",{key:j.id,className:"ds-pt-loose-row"},s("span",{className:"ds-chip-code"},j.code||j.id),s("span",{className:"ds-pt-loose-title"},j.title),s(g,{className:"ds-select",style:{width:220},value:"",onChange:ue=>{ue.target.value!==""&&ce(j.id,ue.target.value)}},s("option",{value:""},"挂到…"),(R.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:()=>he(ae())},"+ 加功能点"),s("button",{className:"ds-btn ds-btn-primary",disabled:Ue,onClick:()=>void de()},Ue?"拆卡中…":"按未覆盖的功能点拆卡"),s("button",{className:"ds-btn ds-btn-ghost",onClick:()=>{X!==null&&Q(X.id)}},"刷新矩阵"),At===null?null:s("span",{className:"ds-hint"},At),we===null?null:s("span",{className:"ds-hint"},we)),le===null?null:s("div",{className:"ds-panel ds-form-panel",style:{marginTop:10}},s("div",{className:"ds-panel-head"},le.id===void 0?"新增功能点":`编辑功能点 ${le.id}`),s("div",{className:"ds-panel-body"},s("div",{className:"ds-field"},s("div",{className:"ds-label"},"功能点标题"),s(v,{className:"ds-input",value:le.title,placeholder:"例如 结算页展示可用积分",onChange:j=>he({...le,title:j.target.value})})),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"说明"),s(d,{className:"ds-textarea",rows:3,value:le.description??"",onChange:j=>he({...le,description:j.target.value})})),s("div",{className:"ds-field"},s("div",{className:"ds-label"},"验收条件(一行一条,做成什么样算完成)"),s(w,{className:"ds-textarea",rows:4,value:le.acceptanceText??"",onChange:j=>he({...le,acceptanceText:j.target.value})})),s("div",{className:"ds-row",style:{gap:10}},s("div",{className:"ds-field",style:{flex:"0 0 150px"}},s("div",{className:"ds-label"},"优先级"),s(g,{className:"ds-select",value:le.priority,onChange:j=>he({...le,priority:j.target.value})},s("option",{value:"urgent"},"紧急"),s("option",{value:"normal"},"普通"),s("option",{value:"relaxed"},"可缓"))),s("div",{className:"ds-field",style:{flex:"0 0 150px"}},s("div",{className:"ds-label"},"状态"),s(g,{className:"ds-select",value:le.status,onChange:j=>he({...le,status:j.target.value})},s("option",{value:"draft"},"草稿"),s("option",{value:"ready"},"就绪"),s("option",{value:"done"},"已完成")))),s("div",{className:"ds-row",style:{justifyContent:"flex-end",gap:8}},s("button",{className:"ds-btn",onClick:()=>he(null)},"取消"),s("button",{className:"ds-btn ds-btn-primary",onClick:()=>void ye()},"保存功能点")))),s("div",{className:"ds-req-stats"},s("div",{className:"ds-stat-box"},s("b",null,`${me}/${z.length}`),s("span",null,"卡已完成")),s("div",{className:"ds-stat-box","data-warn":Me>0?"1":"0"},s("b",null,String(Me)),s("span",null,"阻塞")),s("div",{className:"ds-stat-box","data-warn":ft>0?"1":"0"},s("b",null,String(ft)),s("span",null,"未结缺陷")),s("div",{className:"ds-stat-box"},s("b",null,`${Ma.done}/${Ma.total}`),s("span",null,"验收清单")),s("div",{className:"ds-stat-box"},s("b",null,`${oa.pass}/${oa.total}`),s("span",null,"用例通过")),s("div",{className:"ds-stat-box"},s("b",null,String(za.length)),s("span",null,"交付物")),s("div",{className:"ds-stat-box"},s("b",null,String(Ln.length)),s("span",null,"MR"))),s("div",{className:"ds-sec-head",style:{marginTop:14}},`这张需求下的 ${z.length} 张卡`),z.length===0?s("div",{className:"ds-empty"},"还没有挂上来的卡。建卡时选择这条需求,编号会自动分配。"):s("div",{className:"ds-req-tasks"},z.map(j=>s("div",{key:j.id,className:"ds-listrow ds-req-task",onClick:()=>t(j.id)},s("div",{className:"ds-listrow-main"},s("div",{className:"ds-req-task-title"},j.code?s(y,{className:"ds-chip ds-chip-code"},j.code):null,s("span",null,j.title)),s("div",{className:"ds-hint"},`${Ee(j.status)}${(()=>{const ue=j.expert===""?"":(e.config.experts??[]).find(Be=>Be.id===j.expert)?.name??j.expert;return ue===""?"":` · ${ue}`})()}${j.dueAt>0?` · 截止 ${en(j.dueAt)}`:""}`)),s("div",{className:"ds-listrow-actions"},j.blocked!==void 0&&j.blocked!==null?s(y,{className:"ds-chip ds-chip-blocked"},"⛔"):null,j.type==="bug"?s(y,{className:"ds-chip ds-chip-bug","data-sev":j.severity??"p2"},"BUG"):null)))),Ln.length>0?s("div",null,s("div",{className:"ds-sec-head",style:{marginTop:14}},"关联 MR"),Ln.map(j=>s("div",{key:j.id,className:"ds-hint"},`${j.code||j.id} · !${j.gitlabMR.iid} ${j.gitlabMR.title??""}(${j.gitlabMR.state||"open"})`))):null)})();return s("div",{className:"ds-body"},F!==null?s("div",{className:"ds-err",style:{marginBottom:10}},F):null,vt,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 z=window.localStorage.getItem("dsh-studio:reqsrc")??"all";window.localStorage.setItem("dsh-studio:reqsrc",z==="all"?"business":z==="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((z,me)=>(me.pool?.score??0)-(z.pool?.score??0)):h).map(z=>{const me=window.localStorage.getItem("dsh-studio:reqsrc")??"all";if(me!=="all"&&(z.source==="business"?"business":"internal")!==me)return null;const Me=be(z.id),ft=Me.filter(za=>za.status==="done").length,Ma=z.progress?.progress??(Me.length===0?0:Math.round(ft/Me.length*100)),oa=z.progress?.gate??null;return s("div",{key:z.id,className:"ds-req-item","data-on":z.id===S?"1":"0",onClick:()=>C(z.id)},s("div",{className:"ds-req-item-title"},z.title),s("div",{className:"ds-req-item-meta"},s(y,{className:"ds-chip ds-chip-code"},z.code||"未编号"),z.source==="business"?s(y,{className:"ds-chip","data-src":"business",title:[z.requester?.name,z.requester?.dept].filter(Boolean).join(" · ")||"业务提单"},"业务提单"):null,s(y,{className:"ds-chip","data-req":z.status},jr[z.status]??z.status),s("span",{className:"ds-hint"},`${ft}/${Me.length} 卡`),oa===null?null:s("span",{className:"ds-hint",style:{color:oa.ready?"#0f9d58":"#b26a00"}},oa.ready?"准出通过":`还差 ${oa.blockers.length} 项`)),s("div",{className:"ds-check-bar","data-full":Ma===100?"1":"0",style:{marginTop:2}},s("span",{style:{width:`${Ma}%`}})))})),s("div",{className:"ds-req-detail"},qt)))}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}=bt(),[w,y]=n.useState([]),[k,g]=n.useState(null),[d,h]=n.useState(null),[b,S]=n.useState(null),[C,E]=n.useState(""),[_,I]=n.useState(null),[F,W]=n.useState(""),[L,$]=n.useState(!1),[B,ee]=n.useState(""),[M,O]=n.useState(""),[A,x]=n.useState(""),[P,G]=n.useState("10"),[te,q]=n.useState(""),[K,ke]=n.useState(""),pe=n.useCallback(async V=>{const Ne=(await r("/releases")).releases??[];y(Ne);const je=V??(Ne.some(Qa=>Qa.id===k)?k:Ne[0]?.id??null);if(g(je),je===null){h(null);return}const We=await r("/release/get",{id:je});h(We),S({id:We.release.id,version:We.release.version,name:We.release.name,project:We.release.project,owner:We.release.owner,status:We.release.status,plannedAt:We.release.plannedAt,tagName:We.release.tagName??"",commitSha:We.release.commitSha??""}),E(We.release.notes??"")},[k]);n.useEffect(()=>{let V=!0;return pe().then(()=>{V&&I(null)}).catch($e=>{V&&I($e instanceof Error?$e.message:String($e))}),()=>{V=!1}},[e.revision,pe]);async function xe(V){g(V),$(!0);try{const $e=await r("/release/get",{id:V});h($e),S({id:$e.release.id,version:$e.release.version,name:$e.release.name,project:$e.release.project,owner:$e.release.owner,status:$e.release.status,plannedAt:$e.release.plannedAt,tagName:$e.release.tagName??"",commitSha:$e.release.commitSha??""}),E($e.release.notes??""),W("")}catch($e){I($e instanceof Error?$e.message:String($e))}finally{$(!1)}}function Y(){g(null),h(null),S({id:"",version:"",name:"",project:"",owner:"",status:"draft",plannedAt:0,tagName:"",commitSha:""}),E(""),W("")}async function H(V,$e,Ne){$(!0),I(null);try{const je=await r(V,$e);W(Ne??"已保存"),s(Ne??"已保存"),s(Ne??"已保存"),await pe(je.release?.id??k)}catch(je){const We=je instanceof Error?je.message:String(je);I(We),s(We,"error")}finally{$(!1)}}if(_!==null&&w.length===0)return a("div",{className:"ds-body"},a("div",{className:"ds-err"},_));const R=d?.gate,ne=d?.release,we=d?.tasks??[],Z=e.tasks.filter(V=>V.releaseId===""||V.releaseId===void 0),le=a("div",{className:"ds-req-list"},a("div",{className:"ds-row",style:{justifyContent:"space-between",marginBottom:6}},a("span",{className:"ds-hint"},`${w.length} 个版本`),a("button",{className:"ds-btn",onClick:Y},"+ 新建版本")),w.length===0?a("div",{className:"ds-empty"},"还没有版本。先建一个版本,再把卡挂上来。"):w.map(V=>a("div",{key:V.id,className:"ds-req-item","data-on":k===V.id?"1":"0",onClick:()=>void xe(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} 项拦着`))))),he=b===null?a("div",{className:"ds-hint"},"左边选一个版本,或者新建一个。"):a("div",{className:"ds-req-detail"},(ne?.requirements??[]).length===0?null:a("div",{className:"ds-row",style:{flexWrap:"wrap",gap:6,marginBottom:8}},a("span",{className:"ds-hint"},`这个版本涉及 ${ne.requirements.length} 条需求:`),ne.requirements.map(V=>a("span",{key:V.id,className:"ds-chip",title:V.title},`${V.code||V.id} ${V.title}(${jr[V.derived]??V.derived})`))),a("div",{className:"ds-req-headline"},a("div",null,a("div",{className:"ds-req-name"},`${b.version||"未编号"} ${b.name}`.trim()),a("div",{className:"ds-hint"},ne==null?"新版本:先填版本号与名字,保存后可以把卡挂进来":`创建于 ${en(ne.createdAt)}${ne.releasedAt>0?` · 发布于 ${en(ne.releasedAt)}`:""}${ne.approveBy!==""?` · 审批人 ${ne.approveBy}`:""}`)),a("div",{className:"ds-req-actions"},a(f,{className:"ds-select",style:{width:108},value:b.status,onChange:V=>S({...b,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:b.version,placeholder:"v1.3.0",disabled:ne?.status==="released",onChange:V=>S({...b,version:V.target.value})})),a("label",{className:"ds-field"},a("span",{},"版本名"),a(c,{className:"ds-input",value:b.name,placeholder:"积分抵扣首个版本",onChange:V=>S({...b,name:V.target.value})})),a("label",{className:"ds-field"},a("span",{},"业务项目"),a(f,{className:"ds-select",value:b.project,onChange:V=>S({...b,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:b.owner,onChange:V=>S({...b,owner:V.target.value})})),a("label",{className:"ds-field"},a("span",{},"计划发布时间"),a(c,{className:"ds-input",type:"date",value:nf(b.plannedAt),onChange:V=>S({...b,plannedAt:Dr(V.target.value)})})),a("label",{className:"ds-field"},a("span",{},"发布标签(tag)"),a(c,{className:"ds-input",value:b.tagName??"",placeholder:"v1.0.0",onChange:V=>S({...b,tagName:V.target.value})})),a("label",{className:"ds-field"},a("span",{},"对应提交(sha,选填)"),a(c,{className:"ds-input",value:b.commitSha??"",placeholder:"a1b2c3d",onChange:V=>S({...b,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:L,onClick:()=>void H("/release/save",{release:b},"版本已保存")},"保存"),b.id===""?null:a("button",{className:"ds-btn ds-btn-ghost",disabled:L,style:{color:"var(--destructive)"},onClick:async()=>{await o("删除这个版本?卡会保留,只是脱离版本。",{title:"删除版本",danger:!0,okText:"删除"})&&H("/release/delete",{id:b.id},"版本已删除")}},"删除")))),ne==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(R?.stats.done??0)),a("span",{},"已完成卡")),a("div",{className:"ds-stat-box"},a("b",{"data-warn":(R?.stats.open??0)>0?"1":"0"},String(R?.stats.open??0)),a("span",{},"未完成")),a("div",{className:"ds-stat-box"},a("b",{"data-warn":(R?.stats.blocked??0)>0?"1":"0"},String(R?.stats.blocked??0)),a("span",{},"阻塞")),a("div",{className:"ds-stat-box"},a("b",{"data-warn":(R?.stats.bugs??0)>0?"1":"0"},String(R?.stats.bugs??0)),a("span",{},"未结缺陷")),a("div",{className:"ds-stat-box"},a("b",{"data-warn":(R?.stats.failing??0)>0?"1":"0"},String(R?.stats.failing??0)),a("span",{},"失败用例")),a("div",{className:"ds-stat-box"},a("b",{},String(R?.stats.artifacts??0)),a("span",{},"交付物"))),(R?.blockers??[]).map((V,$e)=>a("div",{key:`b${$e}`,className:"ds-error"},`⛔ ${V}`)),(R?.warnings??[]).map((V,$e)=>a("div",{key:`w${$e}`,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:L,onClick:()=>void H("/release/notes",{id:b.id},"发布说明已生成")},"生成发布说明"),a("button",{className:"ds-btn",disabled:L||!R?.ready,onClick:()=>void H("/release/approve",{id:b.id,by:"人"},"已审批,可以发布了")},"审批通过")),a("div",{className:"ds-action-bar-right"},a("button",{className:"ds-btn ds-btn-primary",disabled:L||!R?.ready||ne.status==="released",onClick:()=>void H("/release/publish",{id:b.id,by:"人"},"已发布")},ne.status==="released"?"已发布":"发布"),l("发布准入(预发部署 / 需求签字)没过时也要发:必须写原因,会记进部署日志",a("button",{className:"ds-btn ds-btn-ghost",disabled:L||!R?.ready||ne.status==="released","data-force":"1",onClick:async()=>{const V=await i("强制发布的原因(会记进部署日志,便于复盘):",{title:"强制发布",okText:"强制发布",placeholder:"为什么不等预发部署 / 需求签字?"});if(V!==null){if(String(V).trim()===""){W("强制发布必须写原因");return}H("/release/publish",{id:b.id,by:"人",force:!0,forceNote:String(V).trim()},"已强制发布(原因已记入部署日志)")}}},"强制发布")),ne.status==="released"?a("button",{className:"ds-btn ds-btn-ghost",disabled:L,onClick:async()=>{const V=await i("回滚原因(要进复盘记录):",{title:"回滚这个版本",danger:!0,okText:"回滚"});V!==null&&V.trim()!==""&&H("/release/rollback",{id:b.id,reason:V},"已回滚")}},"回滚"):null)),ne.rollbackReason===""?null:a("div",{className:"ds-error"},`回滚原因:${ne.rollbackReason}`))),ne==null?null:a("div",{className:"ds-panel",style:{marginTop:12}},a("div",{className:"ds-panel-head"},"发布冒烟清单",a("span",{className:"ds-hint"},`${(ne.smoke??[]).filter(V=>V.done).length}/${(ne.smoke??[]).length} 项已过 · 发布前逐条点过,门禁才算过`)),a("div",{className:"ds-panel-body"},(ne.smoke??[]).length===0?a("div",{className:"ds-empty"},"还没有冒烟项:把发布前必验的几条写在这里,比如「能登录」「下单支付成功」「首页不报错」。"):null,(ne.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 H("/release/smoke",{id:b.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} · ${en(V.at)}`):null,a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn ds-btn-ghost",disabled:L,onClick:()=>void H("/release/smoke",{id:b.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:M,placeholder:"发布前必须验证什么?",onChange:V=>O(V.target.value)}),a("button",{className:"ds-btn",disabled:L||M.trim()==="",onClick:()=>{const V=M.trim();V!==""&&(O(""),H("/release/smoke",{id:b.id,action:"add",text:V},"已加冒烟项"))}},"+ 加一条")))),ne==null?null:a("div",{className:"ds-panel",style:{marginTop:12}},a("div",{className:"ds-panel-head"},"审批、灰度与部署记录",a("span",{className:"ds-hint"},`审批 ${(ne.approvals??[]).length} 条 · 灰度 ${(ne.grayBatches??[]).length} 批`)),a("div",{className:"ds-panel-body"},(ne.approvals??[]).length===0?a("div",{className:"ds-empty"},"还没有审批记录:点上面的「审批通过」,系统会把谁批的、什么结论记在这里。"):(ne.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"},en(V.at)))),a("div",{style:{borderTop:"1px solid var(--ds-line)",margin:"10px 0"}}),(ne.grayBatches??[]).length===0?a("div",{className:"ds-hint"},"没有灰度批次:发布就是一次性全量。先加一批 10% 跑一轮再全量,出事好收。"):(ne.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:L,onClick:()=>void H("/release/gray",{id:b.id,action:"start",batchId:V.id,by:"人"},"已开始灰度")},"开始"):null,V.status==="running"?a("button",{className:"ds-btn ds-btn-ghost",disabled:L,onClick:()=>void H("/release/gray",{id:b.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:A,placeholder:"批次名,例如 内测用户",onChange:V=>x(V.target.value)}),a(c,{className:"ds-input",style:{flex:"0 0 88px"},type:"number",min:1,max:100,value:P,onChange:V=>G(V.target.value)}),a("button",{className:"ds-btn",disabled:L||Number(P)<=0,onClick:async()=>{await H("/release/gray",{id:b.id,action:"add",name:A,percent:Number(P),by:"人"},"已加一批灰度"),x(""),G("10")}},"+ 加一批")),a("div",{style:{borderTop:"1px solid var(--ds-line)",margin:"10px 0"}}),a("div",{className:"ds-hint"},"上过哪些环境(只登记,不触发部署)"),(ne.deploys??[]).length===0?null:a("div",{className:"ds-row",style:{flexWrap:"wrap",gap:6,marginTop:6}},ne.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}:${en(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:te,onChange:V=>q(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:K,placeholder:"备注:谁发的、发了什么(可留空)",onChange:V=>ke(V.target.value)}),a("button",{className:"ds-btn",disabled:L||te==="",onClick:async()=>{await H("/release/deploy",{id:b.id,env:te,note:K,by:"人"},"已登记部署(没有触发任何部署)"),ke("")}},"登记部署")),a("div",{className:"ds-hint",style:{marginTop:10}},"部署与灰度记录(最近 8 条)"),(()=>{const V={pending:"待开始",running:"灰度中",passed:"已通过",rolled_back:"已回滚"},$e=[...(ne.deployLog??[]).map(Ne=>({at:Ne.at,kind:"deploy",by:Ne.by,text:`${Ne.action}${Ne.env===""?"":` · ${(e.config?.environments??[]).find(je=>je.id===Ne.env)?.name??Ne.env}`}`,note:Ne.note})),...(ne.grayBatches??[]).map(Ne=>({at:Ne.at??Ne.createdAt??0,kind:"gray",by:Ne.by??"人",text:`灰度 ${Ne.name} ${Ne.percent}%`,note:V[Ne.status]??Ne.status}))].filter(Ne=>Ne.at).sort((Ne,je)=>Ne.at-je.at).slice(-8).reverse();return $e.length===0?a("div",{className:"ds-empty"},"还没有部署或灰度记录。"):$e.map(Ne=>a("div",{key:`${Ne.at}-${Ne.kind}-${Ne.text}`,className:"ds-hint"},a("span",{className:"ds-chip",style:{marginRight:6}},Ne.kind==="gray"?"灰度":"部署"),`${en(Ne.at)} · ${Ne.text} · ${Ne.by}${Ne.note===""||Ne.note===void 0?"":`:${Ne.note}`}`))})())),ne==null?null:a("div",{className:"ds-panel",style:{marginTop:12}},a("div",{className:"ds-panel-head"},"这个版本里的卡",a("span",{className:"ds-hint"},`${we.length} 张`)),a("div",{className:"ds-panel-body"},we.length===0?a("div",{className:"ds-empty"},"还没有卡。从下面挑,或者在卡片详情里选「所属版本」。"):we.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($e=>$e.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:L,onClick:()=>void H("/release/link",{id:b.id,taskId:V.id,action:"remove"},"已从版本移除")},"移除")))),a("div",{className:"ds-row",style:{marginTop:8}},a(f,{className:"ds-select",style:{flex:1},value:B,onChange:V=>ee(V.target.value)},a("option",{value:""},`挑一张卡挂进来(${Z.length} 张可选)`),Z.map(V=>a("option",{key:V.id,value:V.id},`${V.code?`${V.code} `:""}${V.title}`))),a("button",{className:"ds-btn",disabled:L||B==="",onClick:async()=>{await H("/release/link",{id:b.id,taskId:B,action:"add"},"已挂到这个版本"),ee("")}},"挂进来")))),ne==null?null:a("div",{className:"ds-panel",style:{marginTop:12}},a("div",{className:"ds-panel-head"},"发布说明",a("button",{className:"ds-btn ds-btn-ghost",disabled:L,onClick:()=>void navigator.clipboard?.writeText(C).then(()=>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!==(ne.notes??"")&&H("/release/save",{release:{...b,notes:C}},"发布说明已保存")}}))),_===null?null:a("div",{className:"ds-error",style:{marginTop:8}},_),F===""?null:a("div",{className:"ds-hint",style:{marginTop:8}},F));return a("div",{className:"ds-body"},a("div",{className:"ds-req-grid"},le,he))}function lw({state:e,onOpenTask:t}){const{h:a,React:n,api:r,SelectField:s}=bt(),[o,i]=n.useState(30),[l,c]=n.useState(""),[u,p]=n.useState(null),[f,v]=n.useState(null),[w,y]=n.useState(null),[k,g]=n.useState(null),[d,h]=n.useState(null),[b,S]=n.useState(null);if(n.useEffect(()=>{let x=!0;const P=`/analytics?days=${o}${l===""?"":`&project=${encodeURIComponent(l)}`}`;r(P).then(te=>{x&&(p(te.analytics),v(null))}).catch(te=>{x&&v(te instanceof Error?te.message:String(te))});const G=l===""?"":`&project=${encodeURIComponent(l)}`;return Promise.all([r("/workload"),r(`/burndown?days=14${G}`),r("/costs"),r("/quality")]).then(([te,q,K,ke])=>{x&&(y(te.workload??null),g(q.burndown??null),h({...K.costs??{},budget:K.budget??null,usage:K.usage??null}),S(ke.quality??null))}).catch(()=>{}),()=>{x=!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=x=>`${Math.round((x??0)*100)}%`,E=x=>{const P=Number(x)||0;return P<=0?"0":P*1440<60?`${Math.max(1,Math.round(P*1440))} 分钟`:P<1?`${(P*24).toFixed(1)} 小时`:`${P.toFixed(1)} 天`},_=(x,P,G,te)=>a("div",{className:"ds-kpi","data-warn":te===!0?"1":"0"},a("div",{className:"ds-kpi-value"},P),a("div",{className:"ds-kpi-label"},x),a("div",{className:"ds-kpi-hint"},G)),I=(u.cycle.buckets??[]).reduce((x,P)=>x+P.count,0),F=Math.max(1,...(u.throughput??[]).map(x=>x.count),...(u.cycle.buckets??[]).map(x=>x.count)),W=Math.max(.001,...(u.columns??[]).map(x=>x.avgDays)),L=(u.columns??[]).reduce((x,P)=>x===null||P.avgDays>x.avgDays?P:x,null),$=(u.throughput??[]).reduce((x,P)=>x+P.count,0),B=(w?.experts??[]).filter(x=>x.enabled),ee=B.reduce((x,P)=>x+P.open,0),M=B.reduce((x,P)=>x+(P.overdue??0),0),O=k?.series??[],A=O.length===0?null:O[O.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:x=>c(x.target.value)},a("option",{value:""},"全部项目"),(e.config.projects??[]).map(x=>a("option",{key:x.id,value:x.id},`${x.key?`[${x.key}] `:""}${x.name}`))),a(s,{className:"ds-select",value:String(o),style:{width:"auto",minWidth:96},onChange:x=>i(Number(x.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(x=>a("div",{key:x.id,className:"ds-an-row"},a("span",{className:"ds-an-name"},x.label),a("div",{className:"ds-an-track","data-empty":x.count===0?"1":"0"},a("div",{className:"ds-an-fill",style:{width:`${Math.round(x.count/F*100)}%`}})),a("span",{className:"ds-an-num"},`${x.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((x,P)=>a("div",{key:x.day,className:"ds-spark-col",title:`${x.day}:完成 ${x.count} 张`},a("div",{className:"ds-spark-bar",style:{height:`${Math.round(x.count/Math.max(1,Math.max(...u.throughput.map(G=>G.count)))*100)}%`}}),a("span",{className:"ds-spark-day"},P%2===0?x.day:"")))),a("div",{className:"ds-an-foot"},`近 14 天合计 ${$} 张 · 日均 ${($/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(x=>a("div",{key:x.status,className:"ds-an-row"},a("span",{className:"ds-an-name"},x.label),a("div",{className:"ds-an-track","data-empty":x.avgDays===0?"1":"0"},a("div",{className:"ds-an-fill ds-an-fill-warn",style:{width:`${Math.round(x.avgDays/W*100)}%`}})),a("span",{className:"ds-an-num"},E(x.avgDays)))),a("div",{className:"ds-an-foot"},L===null?"还没有数据。":`最慢的是「${L.label}」:平均 ${E(L.avgDays)},时间主要压在这一列。`)))),a("div",{className:"ds-an-sec"},"交付、成本与返工",a("span",{className:"ds-hint"},"AI 交的东西被验收多少 · 谁手上压得最多 · 派单花了多少 · 哪些卡来回折腾")),a("div",{className:"ds-an-grid"},a("div",{className:"ds-panel ds-span-4"},a("div",{className:"ds-panel-head"},"按专家看质量",a("span",{className:"ds-hint"},"派单量来自运行日志(内存最近 300 条)")),a("div",{className:"ds-panel-body"},b===null?a("div",{className:"ds-hint"},"还没算出来"):(b.experts??[]).length===0?a("div",{className:"ds-hint"},"还没有派出过活"):a("div",null,(b.experts??[]).slice(0,8).map(x=>a("div",{className:"ds-an-kv",key:x.expert},a("span",{},`${x.label} · ${x.dispatched} 次`),a("b",{"data-warn":x.reworkRate!==null&&x.reworkRate>=40?"1":"0"},`${x.done}/${x.cards} 完成 · 一次过 ${x.firstPassRate===null?"—":x.firstPassRate+"%"}`))),a("div",{className:"ds-hint",style:{marginTop:6}},`合计:派单 ${b.totals.dispatched} 次 · 平均耗时 ${b.totals.avgMs>0?Math.round(b.totals.avgMs/1e3)+" 秒":"—"} · 返工率 ${b.totals.reworkRate===null?"—":b.totals.reworkRate+"%"} · AI 失败 ${b.totals.failures} 次 · 缺陷重开 ${b.totals.reopens} 次`),a("div",{className:"ds-hint"},b.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"}},`${w?.busy??0} 位在跑`)),a("div",{className:"ds-panel-body"},(w?.experts??[]).filter(x=>x.enabled).length===0?a("div",{className:"ds-empty"},"还没有启用的专家。"):(w?.experts??[]).filter(x=>x.enabled).map(x=>a("div",{key:x.id,className:"ds-an-row"},a("span",{className:"ds-an-name"},`${x.emoji} ${x.name}`),a("div",{className:"ds-an-track"},a("div",{className:"ds-an-fill",style:{width:`${Math.round(x.open/Math.max(1,...(w.experts??[]).map(P=>P.open))*100)}%`}})),a("span",{className:"ds-an-num"},`在办 ${x.open}${x.running>0?` · 跑 ${x.running}`:""}${x.overdue>0?` · 逾期 ${x.overdue}`:""}`))),a("div",{className:"ds-an-foot"},`${B.length} 位在岗,手上合计 ${ee} 张${M>0?`,其中 ${M} 张逾期`:",没有逾期的"}`))),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"},A===null?"还没有数据。":`累计建 ${A.created} · 累计完成 ${A.done} · 现在还剩 ${A.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"},d?.usage?.totals===null||d?.usage?.totals===void 0?null:a("div",{className:"ds-an-kv"},a("span",{},"token 用量"),a("b",{},(d.usage.totals.total/1e3).toFixed(1)+"k"),a("span",{className:"ds-hint",style:{marginLeft:8}},"入 "+(d.usage.totals.input/1e3).toFixed(1)+"k · 出 "+(d.usage.totals.output/1e3).toFixed(1)+"k · 缓存 "+(d.usage.totals.cacheRead/1e3).toFixed(1)+"k")),d?.usage?.totals===null||d?.usage?.totals===void 0?null:a("div",{className:"ds-an-kv"},a("span",{},"预估花费"),a("b",{},d.usage.totals.cost===null?"未知(价目表没配)":"¥"+Number(d.usage.totals.cost).toFixed(2)),(d.usage.totals.unknownCalls??0)>0?a("span",{className:"ds-hint",style:{marginLeft:8}},d.usage.totals.unknownCalls+" 次无价目"):null),a("div",{className:"ds-an-kv"},a("span",{},"平均执行时长"),a("b",{},`${Math.round((d?.avgMs??0)/1e3)} 秒`)),(d?.byModel??[]).slice(0,3).map(x=>a("div",{key:`m-${x.key}`,className:"ds-an-kv"},a("span",{},`模型 ${x.key}`),a("b",{},`${x.runs} 次`))),(d?.byPromptVersion??[]).slice(0,3).map(x=>a("div",{key:`p-${x.key}`,className:"ds-an-kv"},a("span",{},`提示词 ${x.key}`),a("b",{},`${x.runs} 次`))),(d?.usage?.unpricedModels??[]).length===0?null:a("div",{className:"ds-hint"},"未配价目的模型:"+d.usage.unpricedModels.map(x=>x.model+" ×"+x.calls).join("、")),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(x=>a("div",{key:x.id,className:"ds-listrow"},a("div",{className:"ds-listrow-main"},a("div",null,`${x.code===""?"":`${x.code} `}${x.title}`),a("div",{className:"ds-hint"},`倒退 ${x.backward} 次 · 现在在「${(e.statuses.find(P=>P.id===x.status)??{}).label??x.status}」`)),a("div",{className:"ds-listrow-actions"},a("button",{className:"ds-btn ds-btn-ghost",onClick:()=>t(x.id)},"打开"))))))))}function dw(e,t){const a="studio",n="/studio-api";let r=null;function s(Q){r=Q??null}function o(Q){return r===null?null:r[Q]??null}function i(Q,se){if(se==null)return se;const ae=se.props??{},ye=ae.title!==void 0?se:t(se.type,{...ae,title:Q}),re=o("Tip");return re===null?ye:t(re,{key:se.key,label:Q},ye)}const{TextField:l,TextAreaField:c,ChipField:u,CheckField:p,SelectField:f}=px({h:t,kit:o,React:e}),v=fx({h:t,kit:o}),w=Lx({h:t,React:e}),y=mx({h:t,ChipField:u}),k=gx({h:t,React:e,Card:y,TextField:l,SelectField:f,CheckField:p,toast:B});function g({rows:Q=6,value:se,onChange:ae,placeholder:ye,className:re,...ce}){const[X,be]=e.useState(!1),Ee=String(se??"");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:()=>be(!X)},X?"回到编辑":"预览渲染")),X?t("div",{className:"ds-md-preview ds-req-desc ds-md"},Ee.trim()===""?t("span",{className:"ds-hint"},"还没写内容。"):$e(Ee)):t(c,{className:re??"ds-textarea",rows:Q,value:se,onChange:ae,placeholder:ye,...ce}))}function d(Q,se){const ae=t("div",{className:"ds-label",style:{cursor:"help"}},Q);return se==null||se===""?ae:i(se,ae)}let h=null,b=null;function S(Q){h=Q,typeof b=="function"&&b(Q)}function C(Q,se){const ae=se??{};return o("DialogBox")===null?Promise.resolve(window.confirm(String(Q))):new Promise(re=>{S({kind:"confirm",title:ae.title??"确认操作",message:String(Q??""),danger:ae.danger===!0,okText:ae.okText??"确定",cancelText:ae.cancelText??"取消",resolve:re})})}function E(Q,se){const ae=se??{};return o("DialogBox")===null?Promise.resolve(window.prompt(String(Q),ae.defaultValue??"")):new Promise(re=>{S({kind:"prompt",title:ae.title??"需要填写",message:String(Q??""),value:String(ae.defaultValue??""),placeholder:ae.placeholder??"",okText:ae.okText??"确定",cancelText:"取消",resolve:re})})}function _(){const[Q,se]=e.useState(null),[ae,ye]=e.useState("");e.useEffect(()=>{const X=be=>{se(be),ye(be!==null&&be.kind==="prompt"?be.value:"")};return b=X,h!==null&&X(h),()=>{b===X&&(b=null)}},[]);const re=o("DialogBox");if(Q===null||re===null)return null;const ce=X=>{const be=Q.resolve;se(null),h=null,be(X)};return t(re,{open:!0,title:Q.title,message:Q.message,danger:Q.danger===!0,okText:Q.okText,cancelText:Q.cancelText,input:Q.kind==="prompt",value:ae,placeholder:Q.placeholder,onChange:X=>ye(X),onOk:()=>ce(Q.kind==="prompt"?ae.trim():!0),onCancel:()=>ce(Q.kind==="prompt"?null:!1)})}let I=0,F=[],W=[],L={text:"",at:0};function $(){const Q=F.slice();for(const se of W.slice())se(Q)}function B(Q,se="success",ae=3200){const ye=String(Q??"").trim();if(ye==="")return null;const re=Date.now();if(L.text===ye&&re-L.at<600)return null;L={text:ye,at:re};const ce=++I;return F=F.concat([{id:ce,text:ye,tone:se}]),$(),window.setTimeout(()=>{ee(ce)},ae),ce}function ee(Q){const se=F.filter(ae=>ae.id!==Q);se.length!==F.length&&(F=se,$())}const M={success:"✓",error:"!",info:"i"};function O(){const[Q,se]=e.useState(()=>F.slice());return e.useEffect(()=>(W.push(se),()=>{W=W.filter(ae=>ae!==se)}),[]),Q.length===0?null:t("div",{className:"ds-toasts",role:"status","aria-live":"polite"},Q.map(ae=>t("div",{key:ae.id,className:"ds-toast","data-tone":ae.tone},t("span",{className:"ds-toast-icon","aria-hidden":"true"},M[ae.tone]??"i"),t("span",{className:"ds-toast-text"},ae.text),t("button",{type:"button",className:"ds-toast-close","aria-label":"关闭提示",onClick:()=>ee(ae.id)},"×"))))}const A="dsh-studio:user";function x(){try{const Q=window.localStorage.getItem(A);if(typeof Q=="string"&&Q.trim()!=="")return Q.trim().slice(0,40)}catch{}return"人"}function P(Q){const se=String(Q??"").trim().slice(0,40)||"人";try{window.localStorage.setItem(A,se)}catch{}return se}const G="dsh-studio:theme",te=[["light","☀ 明亮"],["dark","☾ 黑暗"],["system","跟随系统"]];function q(){return typeof window.matchMedia=="function"?window.matchMedia("(prefers-color-scheme: dark)"):null}function K(){try{const Q=window.getComputedStyle(document.body).backgroundColor,se=/rgba?\(([^)]+)\)/.exec(String(Q??""));if(se===null)return null;const ae=se[1].split(",").map(be=>Number(be.trim())),[ye,re,ce,X]=ae;return![ye,re,ce].every(be=>Number.isFinite(be))||Number.isFinite(X)&&X<.2?null:.2126*ye+.7152*re+.0722*ce<128?"dark":"light"}catch{return null}}function ke(){try{const Q=window.localStorage.getItem(G);if(Q==="light"||Q==="dark"||Q==="system")return Q}catch{}return"system"}function pe(Q){const se=Q==="light"||Q==="dark"?Q:"system";try{window.localStorage.setItem(G,se)}catch{}return se}const xe="dsh-studio:session",Y="dsh-studio:auth-user";function H(){try{const Q=window.localStorage.getItem(xe);if(typeof Q=="string"&&Q.trim()!=="")return Q.trim()}catch{}return""}function R(Q){try{Q===""||Q===null||Q===void 0?window.localStorage.removeItem(xe):window.localStorage.setItem(xe,String(Q))}catch{}}function ne(){try{const Q=window.localStorage.getItem(Y);if(typeof Q=="string"&&Q!==""){const se=JSON.parse(Q);if(se!==null&&typeof se=="object")return se}}catch{}return null}function we(Q){try{Q==null?window.localStorage.removeItem(Y):window.localStorage.setItem(Y,JSON.stringify(Q))}catch{}return Q??null}async function Z(Q,se){const ae={"x-studio-user":encodeURIComponent(x())},ye=H();ye!==""&&(ae["x-studio-session"]=ye),se!==void 0&&(ae["content-type"]="application/json");const re=se===void 0?{method:"GET",headers:ae}:{method:"POST",headers:ae,body:JSON.stringify(se)},ce=await fetch(n+Q,re);let X={};try{X=await ce.json()}catch{}if(!ce.ok||X.ok===!1)throw new Error(X.error??`请求失败(HTTP ${ce.status})`);return X}const le=`
|
|
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
|
+
`,he=`
|
|
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[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:x,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:w,api:X,kit:o,toast:B,sessionToken:ae,currentUser:x,confirmDialog:C,promptDialog:E,tipOf:i,tipLabel:d,renderMarkdown:Ee,SideDrawer:v,MentionPicker:ke,Card:y,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??[]),Rt=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)}},xt=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)}}},At=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=Rt(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 At(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 xt()},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:$t=>Q({...de,[le]:$t.target.value})})),tt=Object.keys(de.roles),[Ge,Te]=e.useState(ee??"experts");e.useEffect(()=>{typeof ee=="string"&&ee!==""&&Te(ee)},[ee]);const Rt=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、飞书云盘、代码隔离四条外部通道最近一次是成功还是失败。以前这些失败只写进日志,现在会在这里亮出来,坏了能看见、能补一次。"]},xt=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),At=[{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","看板标题","需求&任务工作空间"))),xt):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"}},"单个专家可以在「专家」里单独指定模型,优先级:专家模型 → 这里的角色模型 → 宿主默认。"),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: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($t=>$t!==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)))))),xt);return t("div",{className:"ds-settings"},t("div",{className:"ds-settings-nav"},At.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:()=>Rt(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 U({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,Rt]=e.useState(""),[Be,xt]=e.useState(be.length===1?be[0].id:""),[At,Ut]=e.useState(""),[le,Ne]=e.useState(""),[me,Qa]=e.useState(""),[$t,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===""?"":At,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…
|
|
827
|
+
`;function V(){const[Q,se]=e.useState(null),[ae,ye]=e.useState(null),re=e.useRef(""),ce=e.useCallback(async(X=!1)=>{if(!(typeof document<"u"&&document.hidden===!0))try{const be=await Z("/state"),Ee={...be.state??{},locked:be.locked===!0},Ce=[Ee.revision??"",(Ee.tasks??[]).length,(Ee.requirements??[]).length,(Ee.agents??[]).length,Ee.locked===!0?1:0].join("|");if(!X&&Ce===re.current){ye(null);return}re.current=Ce,se(Ee),ye(null)}catch(be){ye(be instanceof Error?be.message:String(be))}},[]);return e.useEffect(()=>{let X=!0;const be=async()=>{X&&await ce()};be();const Ee=setInterval(()=>{be()},15e3),Ce=()=>{document.hidden!==!0&&be()};return document.addEventListener("visibilitychange",Ce),()=>{X=!1,clearInterval(Ee),document.removeEventListener("visibilitychange",Ce)}},[ce]),{state:Q,error:ae,reload:ce}}const $e=tx(t),Ne=hx({h:t,TextField:l}),je=yx({h:t,React:e,api:Z,kit:o,currentUser:x,renderMarkdown:$e,tipOf:i,tipLabel:d,confirmDialog:C,promptDialog:E,TextField:l,TextAreaField:c,ChipField:u,CheckField:p,SelectField:f,MdField:g,MentionPicker:Ne}),We=Dx({h:t,React:e});Ox({h:t,React:e,Editor:w,api:Z,kit:o,toast:B,sessionToken:H,currentUser:x,confirmDialog:C,promptDialog:E,tipOf:i,tipLabel:d,renderMarkdown:$e,SideDrawer:v,MentionPicker:Ne,Card:y,TextField:l,TextAreaField:c,ChipField:u,CheckField:p,SelectField:f,MdField:g});function Qa({state:Q,onChanged:se}){const[ae,ye]=e.useState(null),[re,ce]=e.useState(null),[X,be]=e.useState(null),[Ee,Ce]=e.useState(null),[_e,dt]=e.useState({name:"",spec:"",description:""}),[rt,Je]=e.useState(!1),[He,et]=e.useState(!1),Ge=e.useCallback(async()=>{try{ye(await Z("/market"))}catch(de){be(de instanceof Error?de.message:String(de))}},[]);e.useEffect(()=>{Ge()},[Ge]);const Pe=new Set(ae?.installed??[]),Rt=de=>de.replace(/^link:/,"").split("/").pop().replace(/^dsh-/,"dsh-"),Ue=async(de,Se)=>{ce(de.id),be(null),Ce(null);try{const ge=await Z(`/market/${Se}`,{id:de.id});if(ge.ok===!1)throw new Error((ge.result?.output??"").slice(-300)||"安装失败");Ce(Se==="install"?"已安装,重启工作空间后生效":"已移除,重启工作空间后生效"),await Ge()}catch(ge){be(ge instanceof Error?ge.message:String(ge))}finally{ce(null)}},xt=async()=>{if(!(_e.name.trim()===""||_e.spec.trim()==="")){et(!0),be(null);try{const de=[...Q.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 Z("/config",{market:{items:de}}),dt({name:"",spec:"",description:""}),Je(!1),await se(),await Ge()}catch(de){be(de instanceof Error?de.message:String(de))}finally{et(!1)}}},At=async de=>{if(!await C(`从市场列表移除「${de.name}」?不会卸载已安装的插件。`,{title:"移除插件",danger:!0,okText:"移除"}))return;const Se=(Q.config.market.items??[]).filter(ge=>ge.id!==de.id);await Z("/config",{market:{items:Se}}).catch(()=>{}),await se(),await Ge()},Ut=ae?.items??Q.config.market.items??[];return t("div",null,t("div",{className:"ds-row",style:{marginBottom:12}},t("div",{style:{fontSize:13.5,fontWeight:650}},ae?.title??Q.config.market.title),t("span",{className:"ds-stat"},`${Ut.length} 个条目 · profile ${Q.profile??"—"}`),t("div",{className:"ds-grow"}),t("button",{className:"ds-btn",onClick:()=>Je(!rt)},rt?"收起":"+ 添加条目")),X!==null?t("div",{className:"ds-err",style:{padding:"0 0 8px"}},X):null,Ee!==null?t("div",{className:"ds-ok",style:{padding:"0 0 8px"}},Ee):null,Ut.length===0?t("div",{className:"ds-empty"},"还没有条目。把公司内部的插件包加进来,同事就能一键安装。"):t("div",{className:"ds-market-grid"},Ut.map(de=>{const Se=Rt(de.spec),ge=Pe.has(Se)||Pe.has(de.name);return t("div",{key:de.id,className:"ds-market-card"},t("div",{className:"ds-mc-head"},t("span",{className:"ds-mc-name ds-grow"},de.name),t(u,{className:"ds-chip","data-on":ge?"1":"0"},ge?"已安装":"未安装")),de.description!==""?t("div",{className:"ds-mc-desc"},de.description):null,t("code",null,de.spec),t("div",{className:"ds-row",style:{marginTop:"auto"}},t("button",{className:ge?"ds-btn":"ds-btn ds-btn-primary",disabled:re===de.id,onClick:async()=>{await C(ge?`从 profile 移除「${Se}」?`:`安装「${Se}」到工作空间?`,{title:ge?"移除插件":"安装插件",danger:ge,okText:ge?"移除":"安装"})&&Ue(de,ge?"uninstall":"install")}},re===de.id?"处理中…":ge?"移除":"安装"),t("button",{className:"ds-btn",style:{marginLeft:"auto",opacity:.7},onClick:()=>void At(de)},"删条目")))})),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:_e.name,placeholder:"代码评审助手",onChange:de=>dt({..._e,name:de.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:de=>dt({..._e,spec:de.target.value})})),t("div",{className:"ds-field"},t("div",{className:"ds-label"},"一句话说明"),t(l,{className:"ds-input",value:_e.description,placeholder:"自动跑 GitLab MR 的评审清单",onChange:de=>dt({..._e,description:de.target.value})}))),t("div",{style:{padding:"0 14px 14px"}},t("button",{className:"ds-btn ds-btn-primary",disabled:He||_e.name.trim()===""||_e.spec.trim()==="",onClick:()=>void xt()},He?"添加中…":"加入市场"))):null)}function jn({state:Q,onChanged:se,initialSection:ae,onSection:ye}){const re=Q.config,[ce,X]=e.useState({boardTitle:re.board.title,gitlabUrl:re.gitlab.url,gitlabGroup:re.gitlab.group,gitlabProject:re.gitlab.project,gitlabToken:"",feishuAppId:re.feishu.appId,feishuAppSecret:"",feishuChatId:re.feishu.chatId,feishuBaseToken:re.feishu.baseToken,feishuTableId:re.feishu.tableId,feishuWebhook:"",feishuNotify:re.feishu.notifyOnChange!==!1,gitlabSyncEnabled:re.gitlab.syncEnabled===!0,gitlabSyncLabel:re.gitlab.syncLabel??"",roles:JSON.parse(JSON.stringify(re.roles)),agentsEnabled:re.agents?.enabled===!0,agentsMaxConcurrent:String(re.agents?.maxConcurrent??2),agentsPreset:re.agents?.agentPreset??"standard",agentsWorkspace:re.agents?.workspaceDir??"",agentsSandbox:re.agents?.sandbox??"workspace-write",agentsIsolation:re.agents?.isolation??"none",agentsWorktreeRoot:re.agents?.worktreeRoot??"",agentsCleanup:re.agents?.cleanupWorktree??"manual",agentsAuto:Array.isArray(re.agents?.autoStatuses)?re.agents.autoStatuses:["design","dev_ready","test"]}),[be,Ee]=e.useState(null),[Ce,_e]=e.useState(null),[dt,rt]=e.useState(!1),Je=async()=>{rt(!0),_e(null),Ee(null);try{await Z("/config",{board:{title:ce.boardTitle},roles:ce.roles,agents:{enabled:ce.agentsEnabled,maxConcurrent:Number(ce.agentsMaxConcurrent)||2,agentPreset:ce.agentsPreset,workspaceDir:ce.agentsWorkspace,sandbox:ce.agentsSandbox,isolation:ce.agentsIsolation,worktreeRoot:ce.agentsWorktreeRoot,cleanupWorktree:ce.agentsCleanup,autoStatuses:ce.agentsAuto}}),Ee("已保存"),await se()}catch(de){_e(de instanceof Error?de.message:String(de))}finally{rt(!1)}},He=(de,Se,ge,Xa)=>t("div",{className:"ds-field",key:de},t("div",{className:"ds-label"},Se),t(l,{className:"ds-input",type:"text",value:ce[de],placeholder:ge??"",onChange:$t=>X({...ce,[de]:$t.target.value})})),et=Object.keys(ce.roles),[Ge,Pe]=e.useState(ae??"experts");e.useEffect(()=>{typeof ae=="string"&&ae!==""&&Pe(ae)},[ae]);const Rt=de=>{Pe(de),ye?.(de)},Ue={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:dt,onClick:()=>void Je()},dt?"保存中…":"保存"),be!==null?t("span",{className:"ds-ok"},be):null,Ce!==null?t("span",{className:"ds-err"},Ce):null),At=[{group:"团队"},{id:"projects",label:"项目与迭代",count:(re.projects??[]).length},{id:"experts",label:"专家",count:(re.experts??[]).length},{id:"teams",label:"专家团",count:(re.teams??[]).length},{id:"skills",label:"技能库"},{id:"columns",label:"列的负责人"},{group:"接入"},{id:"gitlab",label:"代码仓库",count:(re.gitlab.projects??[]).length},{id:"feishu",label:"飞书机器人",count:(re.feishu.bots??[]).length},{id:"health",label:"集成健康",count:Q.integrations?.broken??0},{group:"运行"},{id:"agents",label:"自动派单"},{id:"testing",label:"测试执行",count:(re.testing?.envs??[]).length},{id:"costs",label:"成本与预算"},{id:"environments",label:"部署环境",count:(re.environments??[]).length},{id:"board",label:"看板外观"},{group:"安全"},{id:"ldap",label:"统一登录(LDAP)",count:re.ldap?.enabled===!0?re.ldap?.requireLogin===!0?"必须":"开":0},{id:"access",label:"权限与审计",count:(re.access?.members??[]).length},{id:"storage",label:"数据与备份",count:Q.storage?.snapshots??0}],Ut=de=>de==="projects"?t(Wx,{config:re,onChanged:se}):de==="experts"?t(Mx,{config:re,onChanged:se}):de==="teams"?t(zx,{config:re,onChanged:se}):de==="skills"?t(Jx,{config:re,onChanged:se}):de==="columns"?t(Gx,{state:Q,onChanged:se}):de==="testing"?t(Fx,{config:re,onChanged:se}):de==="costs"?t(Vx,{config:re,onChanged:se}):de==="environments"?t(Ux,{config:re,onChanged:se}):de==="access"?t(Hx,{state:Q,config:re,onChanged:se}):de==="ldap"?t(qx,{config:re,onChanged:se}):de==="storage"?t(Kx,{state:Q,onChanged:se}):de==="gitlab"?t(Qx,{config:re,onChanged:se}):de==="feishu"?t("div",null,t(Zx,{config:re,onChanged:se}),t(Bx,{config:re,onChanged:se})):de==="health"?t(Yx,{state:Q,config:re,onChanged:se}):de==="board"?t("div",null,t("div",{className:"ds-panel ds-form-panel"},t("div",{className:"ds-panel-head"},"看板"),t("div",{className:"ds-panel-body"},He("boardTitle","看板标题","需求&任务工作空间"))),xt):de==="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"},et.map(Se=>t("div",{className:"ds-field",key:Se},t("div",{className:"ds-label"},`${Fa[Se]??Se}`),t(l,{className:"ds-input",value:ce.roles[Se].model,placeholder:"deepseek-v4.1-flash",onChange:ge=>X({...ce,roles:{...ce.roles,[Se]:{...ce.roles[Se],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:ce.agentsEnabled,onChange:Se=>X({...ce,agentsEnabled:Se.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(([Se,ge])=>t("label",{className:"ds-row",key:Se,style:{alignItems:"center",gap:6,cursor:"pointer"}},t(p,{checked:ce.agentsAuto.includes(Se),onChange:Xa=>X({...ce,agentsAuto:Xa.target.checked?[...ce.agentsAuto,Se]:ce.agentsAuto.filter($t=>$t!==Se)})}),t("span",{},ge)))),t("div",{className:"ds-hint"},"勾选的列在卡片进入时自动派给该列对应的负责人;其余列只能手动「马上处理」。")),He("agentsMaxConcurrent","同时最多几个 agent","2"),He("agentsPreset","Agent 预设","standard"),He("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:ce.agentsSandbox,onChange:Se=>X({...ce,agentsSandbox:Se.target.value})},[["read-only","只读:能看不能改"],["workspace-write","只写工作区(推荐):能改自己的目录,改不到系统别处"],["danger-full-access","无沙箱:可以写任何地方(危险)"]].map(([Se,ge])=>t("option",{key:Se,value:Se},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:ce.agentsIsolation,onChange:Se=>X({...ce,agentsIsolation:Se.target.value})},[["none","不隔离:所有卡共用一个工作区"],["worktree","一卡一个 git worktree(推荐给多卡并行)"]].map(([Se,ge])=>t("option",{key:Se,value:Se},ge))),t("div",{className:"ds-hint"},"开启后,卡要挂在配了「本机代码目录」的项目上,派单时会为它切一条 task/<编号> 分支。")),He("agentsWorktreeRoot","worktree 根目录","留空 = 工作区同级的 dsh-worktrees"),t("div",{className:"ds-field",key:"agentsCleanup"},t("div",{className:"ds-label"},"卡完成时"),t(f,{className:"ds-input",value:ce.agentsCleanup,onChange:Se=>X({...ce,agentsCleanup:Se.target.value})},[["manual","保留 worktree 和分支,等人看 diff"],["on_done","自动删掉 worktree 和分支"]].map(([Se,ge])=>t("option",{key:Se,value:Se},ge)))))),xt);return t("div",{className:"ds-settings"},t("div",{className:"ds-settings-nav"},At.map((de,Se)=>de.group!==void 0?t("div",{className:"ds-settings-nav-group",key:`group-${Se}`},de.group):i((Ue[de.id]??[de.label,""])[1]||de.label,t("button",{key:de.id,className:"ds-nav-item","data-active":Ge===de.id?"1":"0",onClick:()=>Rt(de.id)},t("span",{},de.label),de.count===void 0?null:t("span",{className:"ds-nav-count"},String(de.count)))))),t("div",{className:"ds-settings-pane"},t("div",{className:"ds-pane-head"},t("div",null,t("div",{className:"ds-pane-title"},(Ue[Ge]??["设置"])[0]),t("div",{className:"ds-pane-desc"},(Ue[Ge]??["",""])[1]))),Ut(Ge)))}function U({state:Q,onClose:se,onCreated:ae}){const ye=Q?.config?.projects??[],[re,ce]=e.useState(""),[X,be]=e.useState(""),[Ee,Ce]=e.useState("requirement"),[_e,dt]=e.useState("normal"),[rt,Je]=e.useState("p2"),[He,et]=e.useState(""),Ge=Q?.requirements??[],[Pe,Rt]=e.useState(""),[Ue,xt]=e.useState(ye.length===1?ye[0].id:""),[At,Ut]=e.useState(""),[de,Se]=e.useState(""),[ge,Xa]=e.useState(""),[$t,ga]=e.useState(null),[Dn,La]=e.useState(!1),Lt=Ee==="bug",Mt=ye.find(J=>J.id===Ue)?.iterations??[],On=async()=>{La(!0),ga(null);try{await Z("/task/create",{title:re,requirement:X,type:Ee,priority:_e,domain:He,severity:Lt?rt:"",role:Lt?"dev":"product",status:Lt?"dev_ready":"clarify",project:Ue,iteration:Ue===""?"":At,owner:de.trim(),dueAt:Dr(ge),requirementId:Pe}),await ae(),se()}catch(J){ga(J instanceof Error?J.message:String(J))}finally{La(!1)}};return t("div",{className:"ds-modal-wrap",onClick:J=>{J.target===J.currentTarget&&se()}},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:re,onChange:J=>ce(J.target.value),onKeyDown:J=>{J.key==="Enter"&&!J.isComposing&&On()}})),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: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=>Rt(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=>{xt(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:At,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"},$t!==null?t("span",{className:"ds-err"},$t):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 It(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 Et(){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&&(It(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,Rt]=e.useState(ee??""),Be=me=>{me!==Se&&(Pe(me),Rt(""),We(""),rt(me==="local"?Q:""))},xt=async()=>{if(!tt){if(dt.trim()===""||Je===""){Rt(Se==="local"?"本地账号和密码都要填":"域账号和密码都要填");return}Ge(!0),Rt("");try{const me=await X("/auth/login",{username:dt.trim(),password:Je,mode:Se});F(me.token),xe(me.user??null),P(String(me.user?.name??me.user?.id??dt.trim())),We(""),be()}catch(me){Rt(me instanceof Error?me.message:String(me))}finally{Ge(!1)}}},At=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??"工作空间"),At,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"&&xt()}})),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"&&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:tt,onClick:()=>void xt()},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}=W(),[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:B});_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[Rt,Be]=e.useState(we),[xt,At]=e.useState(()=>G()??(O()?.matches?"dark":"light")),[Ut,le]=e.useState(!1),[Ne,me]=e.useState(!1),[Qa,$t]=e.useState(null),[fa,An]=e.useState(0),[La,Lt]=e.useState(null);e.useEffect(()=>{const Z=_e=>{const wt=String(_e.key).toLowerCase();if((_e.metaKey||_e.ctrlKey)&&!_e.shiftKey&&!_e.altKey&&wt==="k"){_e.preventDefault(),$t(null),me(V=>!V);return}const ht=Nx(_e);ht!==null&&(_e.preventDefault(),$t(ht),An(V=>V+1),me(!0))};return document.addEventListener("keydown",Z),()=>document.removeEventListener("keydown",Z)},[]),e.useEffect(()=>{const Z=()=>{const V=G()??(O()?.matches?"dark":"light");At(ce=>ce===V?ce:V)};Z();const _e=O(),wt=()=>Z();_e!==null&&_e.addEventListener("change",wt);const ht=window.setInterval(Z,1500);return()=>{_e!==null&&_e.removeEventListener("change",wt),window.clearInterval(ht)}},[]);const Mt=Rt==="system"?xt:Rt;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(()=>Et(),[]),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(L,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{}F(""),xe(null),le(!1),se()}},"退出登录")),(()=>{const Z=o("SegGroup"),_e=R.map(([wt,ht])=>({id:wt,label:ht}));return Z!==null?t(Z,{value:Rt,onChange:wt=>Be(fe(wt)),options:_e}):t("div",{className:"ds-seg",title:"显示模式;「跟随系统」会先跟宿主界面的深浅色,宿主没给出信号时再跟操作系统"},R.map(([wt,ht])=>t("button",{key:wt,className:"ds-seg-btn","data-on":Rt===wt?"1":"0",onClick:()=>Be(fe(wt))},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:()=>{
|
|
830
|
+
影响范围 / 环境(版本、账号、数据条件):`:"背景、期望结果、验收口径。专家会照这段去开工。",value:X,onChange:J=>be(J.target.value)})),t("div",{className:"ds-modal-grid"},t("div",{className:"ds-field"},t("div",{className:"ds-label"},"类型"),t(f,{className:"ds-select",value:Ee,onChange:J=>Ce(J.target.value)},Object.keys(Ho).map(J=>t("option",{key:J,value:J},Ho[J])))),Lt?t("div",{className:"ds-field"},t("div",{className:"ds-label"},"严重级别"),t(f,{className:"ds-select",value:rt,onChange:J=>Je(J.target.value)},Object.keys(Ql).map(J=>t("option",{key:J,value:J},Ql[J])))):t("div",{className:"ds-field"},t("div",{className:"ds-label"},"优先级"),t(f,{className:"ds-select",value:_e,onChange:J=>dt(J.target.value)},Object.keys(zs).map(J=>t("option",{key:J,value:J},zs[J])))),Lt?t("div",{className:"ds-field"},t("div",{className:"ds-label"},"优先级"),t(f,{className:"ds-select",value:_e,onChange:J=>dt(J.target.value)},Object.keys(zs).map(J=>t("option",{key:J,value:J},zs[J])))):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:Pe,onChange:J=>Rt(J.target.value)},t("option",{value:""},"暂不挂需求(编号留空)"),Ge.map(J=>t("option",{key:J.id,value:J.id},`${J.code||J.id} · ${J.title}`)))),t("div",{className:"ds-field",style:{gridColumn:"1 / -1"}},t("div",{className:"ds-label"},"业务领域(选填)"),t(l,{className:"ds-input",placeholder:"例如 支付 / 会员 / 履约,填了会自动派给同领域的专家",value:He,onChange:J=>et(J.target.value)})),ye.length===0?null:t("div",{className:"ds-field"},t("div",{className:"ds-label"},"业务项目"),t(f,{className:"ds-select",value:Ue,onChange:J=>{xt(J.target.value),Ut("")}},t("option",{value:""},"不属于任何项目"),ye.map(J=>t("option",{key:J.id,value:J.id},`${J.key?`${J.key} · `:""}${J.name}`)))),ye.length===0||Mt.length===0?null:t("div",{className:"ds-field"},t("div",{className:"ds-label"},"迭代"),t(f,{className:"ds-select",value:At,onChange:J=>Ut(J.target.value)},t("option",{value:""},"不指定迭代"),Mt.map(J=>t("option",{key:J.id,value:J.id},J.name)))),t("div",{className:"ds-field"},t("div",{className:"ds-label"},"业务负责人(选填)"),t(l,{className:"ds-input",placeholder:"提需求的人,例如 张伟",value:de,onChange:J=>Se(J.target.value)})),t("div",{className:"ds-field"},t("div",{className:"ds-label"},"期望完成(选填)"),t(l,{className:"ds-input",type:"date",value:ge,onChange:J=>Xa(J.target.value)}))),Lt?t("div",{className:"ds-hint",style:{fontSize:11.5}},"缺陷卡会直接落到「待开发」,由研发先复现、定位根因再修,修完自动交给测试验证。"):null,t("div",{className:"ds-modal-foot"},$t!==null?t("span",{className:"ds-err"},$t):null,t("div",{className:"ds-grow"}),t("button",{className:"ds-btn",onClick:se},"取消"),t("button",{className:"ds-btn ds-btn-primary",disabled:Dn||re.trim()==="",onClick:()=>void On()},Dn?"创建中…":Lt?"登记缺陷":"创建"))))}function ve({state:Q,onOpenBoard:se}){const[ae,ye]=e.useState(null),[re,ce]=e.useState(null);if(e.useEffect(()=>{let be=!0;return Z("/metrics").then(Ee=>{be&&ye(Ee.metrics)}).catch(Ee=>{be&&ce(Ee instanceof Error?Ee.message:String(Ee))}),()=>{be=!1}},[Q.revision]),re!==null)return t("div",{className:"ds-body"},t("div",{className:"ds-err"},re));if(ae===null)return t("div",{className:"ds-loading"},"正在统计…");const X=(be,Ee,Ce,_e)=>t("div",{className:"ds-proj-card",key:_e},t("div",{className:"ds-proj-head"},t("div",null,t("div",{className:"ds-proj-name"},be),t("div",{className:"ds-hint"},Ee)),t("button",{className:"ds-btn",onClick:()=>se(_e)},"看这些卡")),t("div",{className:"ds-proj-stats"},t("div",null,t("b",{},Ce.inProgress),t("span",{},"进行中")),t("div",null,t("b",{"data-warn":Ce.blocked>0?"1":"0"},Ce.blocked),t("span",{},"阻塞")),t("div",null,t("b",{"data-warn":Ce.overdue>0?"1":"0"},Ce.overdue),t("span",{},"逾期")),t("div",null,t("b",{},Ce.done),t("span",{},"已完成")),t("div",null,t("b",{},`${Ce.checklistRate}%`),t("span",{},"清单完成")),t("div",null,t("b",{},Ce.artifacts),t("span",{},"交付物"))),t("div",{className:"ds-proj-bar"},t("div",{className:"ds-check-bar","data-full":Ce.checklistRate===100?"1":"0"},t("span",{style:{width:`${Ce.checklistRate}%`}}))),Ce.cycleDays>0?t("div",{className:"ds-hint"},`平均周期 ${Ce.cycleDays} 天 · 近 7 天完成 ${Ce.throughput7d} 张`):t("div",{className:"ds-hint"},`近 7 天完成 ${Ce.throughput7d} 张`));return t("div",{className:"ds-body"},t("div",{className:"ds-proj-grid"},(ae.projects??[]).map(be=>X(`${be.key?`[${be.key}] `:""}${be.name}`,`${(be.iterations??[]).length} 个迭代`,be.metrics,be.id)),ae.unassigned!==null&&ae.unassigned.total>0?X("未归属项目","还没挂到项目上的卡",ae.unassigned,""):null),(ae.projects??[]).length===0&&(ae.unassigned===null||ae.unassigned.total===0)?t("div",{className:"ds-empty"},"还没有卡片。先去「设置 → 项目与迭代」建一个项目,再新建任务。"):null)}const De={INPUT:1,TEXTAREA:1,SELECT:1,BUTTON:1,A:1,OPTION:1},qe='[data-on],[data-role],[role="button"],[tabindex],[class*="ds-"]';function It(Q){if(Q===null||Q.nodeType!==1||De[Q.tagName]===1||Q.dataset.kb==="1"||typeof Q.className=="string"&&Q.className.indexOf("mask")>=0||Q.getAttribute("contenteditable")==="true")return!1;let se="";try{se=window.getComputedStyle(Q).cursor}catch{se=""}return se==="pointer"}function Kt(Q){Q.dataset.kb="1",Q.getAttribute("tabindex")===null&&Q.setAttribute("tabindex","0"),Q.getAttribute("role")===null&&Q.setAttribute("role","button");const se=Q.getAttribute("data-on");if(se!==null&&Q.setAttribute("aria-pressed",se==="1"?"true":"false"),Q.getAttribute("aria-label")===null){const ae=String(Q.getAttribute("title")??Q.textContent??"").trim().replace(/\s+/g," ").slice(0,80);ae.length>0&&Q.setAttribute("aria-label",ae)}Q.addEventListener("keydown",ae=>{ae.key!=="Enter"&&ae.key!==" "||Q.getAttribute("aria-disabled")!=="true"&&(ae.preventDefault(),Q.click())})}function st(){if(typeof document>"u")return()=>{};const Q=se=>{const ae=se.target,ye=ae instanceof Element?ae.closest(".ds-board"):null;ye!==null&&(ye.scrollWidth<=ye.clientWidth+1||se.shiftKey||Math.abs(se.deltaY)<=Math.abs(se.deltaX)||(ye.scrollLeft+=se.deltaY,se.preventDefault()))};return document.addEventListener("wheel",Q,{passive:!1}),()=>document.removeEventListener("wheel",Q)}function Et(){if(typeof document>"u")return()=>{};const Q=new WeakSet,se=[];let ae=!1;const ye=()=>typeof performance<"u"?performance.now():Date.now(),re=new WeakSet,ce=[];let X=null;const be=()=>{ae=!1;const rt=ye()+6,Je=[];for(;se.length>0&&Je.length<60&&ye()<rt;)Je.push(se.pop());const He=[],et=[];for(const Pe of Je)Pe.isConnected!==!1&&(It(Pe)?He.push(Pe):et.push(Pe));for(const Pe of He)Q.add(Pe),Kt(Pe);let Ge=!1;for(const Pe of et)re.has(Pe)||(re.add(Pe),Pe.isConnected!==!1&&(ce.push(Pe),Ge=!0));Ge&&X===null&&(X=window.setTimeout(()=>{X=null,se.push(...ce.splice(0)),Ee()},400)),se.length>0&&Ee()},Ee=()=>{ae!==!0&&(ae=!0,typeof window.requestIdleCallback=="function"?window.requestIdleCallback(be,{timeout:300}):window.setTimeout(be,16))},Ce=()=>{const rt=document.querySelector("[data-dsh-studio]");if(rt!==null){for(const Je of rt.querySelectorAll(qe))Q.has(Je)||re.has(Je)||Je.dataset.kb==="1"||se.push(Je);se.length>0&&Ee()}};Ce();let _e=null;const dt=new MutationObserver(()=>{_e===null&&(_e=window.setTimeout(()=>{_e=null,Ce()},200))});return dt.observe(document.body,{childList:!0,subtree:!0}),()=>dt.disconnect()}function pt({config:Q,theme:se,message:ae,onDone:ye,onClose:re,overlay:ce}){const X=String(Q?.localAuth?.username??"admin"),be=Q?.localAuth?.enabled!==!1,Ee=Q?.ldap?.enabled===!0,[Ce,_e]=e.useState(Ee?"ldap":"local"),[dt,rt]=e.useState(Ee?"":X),[Je,He]=e.useState(""),[et,Ge]=e.useState(!1),[Pe,Rt]=e.useState(ae??""),Ue=ge=>{ge!==Ce&&(_e(ge),Rt(""),He(""),rt(ge==="local"?X:""))},xt=async()=>{if(!et){if(dt.trim()===""||Je===""){Rt(Ce==="local"?"本地账号和密码都要填":"域账号和密码都要填");return}Ge(!0),Rt("");try{const ge=await Z("/auth/login",{username:dt.trim(),password:Je,mode:Ce});R(ge.token),we(ge.user??null),P(String(ge.user?.name??ge.user?.id??dt.trim())),He(""),ye()}catch(ge){Rt(ge instanceof Error?ge.message:String(ge))}finally{Ge(!1)}}},At=t("div",{className:"ds-seg",style:{alignSelf:"flex-start"}},t("button",{className:"ds-seg-btn",type:"button","data-on":Ce==="ldap"?"1":"0",disabled:!Ee,title:Ee?"用公司目录(LDAP)的账号登录":"LDAP 还没启用,先在设置里配好再用",onClick:()=>Ue("ldap")},"LDAP 账号"),t("button",{className:"ds-seg-btn",type:"button","data-on":Ce==="local"?"1":"0",disabled:!be,title:"用平台自带的超管账号登录",onClick:()=>Ue("local")},"本地超管")),Ut=Ce==="ldap"?t("div",{className:"ds-login-hint"},"用公司账号登录(LDAP)。登录后会记下你的名字,写操作和审计都挂在这个名字下。"):t("div",{className:"ds-login-hint"},`用平台自带的超管账号登录。默认账号 ${X},默认口令 admin(改过之后就用新口令)。`),de=t("div",{className:"ds-login"},t("div",{className:"ds-login-brand"},"◈ ",Q?.board?.title??"工作空间"),At,Ut,t("label",{className:"ds-field"},t("span",null,Ce==="local"?"超管账号":"域账号"),t("input",{value:dt,autoFocus:Ce==="ldap",name:"studio-account",autoComplete:"off",spellCheck:!1,placeholder:Ce==="local"?X:"域账号",onChange:ge=>rt(ge.target.value),onKeyDown:ge=>{ge.key==="Enter"&&xt()}})),t("label",{className:"ds-field"},t("span",null,"密码"),t("input",{type:"password",value:Je,autoFocus:Ce==="local",name:"studio-pass",autoComplete:"new-password",placeholder:Ce==="local"?"默认口令 admin":"域密码",onChange:ge=>He(ge.target.value),onKeyDown:ge=>{ge.key==="Enter"&&xt()}})),Pe===""?null:t("div",{className:"ds-error"},Pe),Pe!==""&&/LDAP|域|目录|连不上/.test(Pe)?t("div",{className:"ds-login-note"},"连不上目录服务时,切到「本地超管」用平台账号进来;等网络打通再用域账号。"):null,t("div",{className:"ds-login-actions"},t("button",{className:"ds-btn ds-btn-primary",disabled:et,onClick:()=>void xt()},et?"登录中…":Ce==="local"?"登录(本地超管)":"登录(LDAP)"),typeof re=="function"?t("button",{className:"ds-btn ds-btn-ghost",onClick:()=>re()},"先不登录"):null),t("div",{className:"ds-login-note"},Ce==="ldap"?`${Q?.ldap?.url??"—"} · BASE:${Q?.ldap?.baseDN??"—"}`:"本地账号存在服务端密钥里(scrypt 哈希),改密码在「设置 → 统一登录(LDAP)」")),Se=t("div",{className:"ds-login-wrap","data-overlay":ce===!0?"1":"0"},de);return ce===!0?Se:t("div",{"data-dsh-studio":"","data-theme":se},t("style",null,he),Se)}function $a(Q){const se=Q?.loginGate??pt,{state:ae,error:ye,reload:re}=V(),[ce,X]=e.useState("dashboard"),[be,Ee]=e.useState("experts"),[Ce,_e]=e.useState(null),[dt,rt]=e.useState(!1);async function Je(J){const Ie=await Ax(J,{api:Z,state:ae,confirm:C,prompt:E,notify:B});Ie.refresh===!0&&await re(!0),Ie.open!==void 0&&_e(Ie.open)}const[He,et]=e.useState(!1),[Ge,Pe]=e.useState(0);e.useEffect(()=>{if(!He)return;const J=()=>et(!1);return document.addEventListener("click",J),()=>document.removeEventListener("click",J)},[He]);const[Rt,Ue]=e.useState(ke),[xt,At]=e.useState(()=>K()??(q()?.matches?"dark":"light")),[Ut,de]=e.useState(!1),[Se,ge]=e.useState(!1),[Xa,$t]=e.useState(null),[ga,Dn]=e.useState(0),[La,Lt]=e.useState(null);e.useEffect(()=>{const J=Ie=>{const wt=String(Ie.key).toLowerCase();if((Ie.metaKey||Ie.ctrlKey)&&!Ie.shiftKey&&!Ie.altKey&&wt==="k"){Ie.preventDefault(),$t(null),ge(qt=>!qt);return}const vt=Nx(Ie);vt!==null&&(Ie.preventDefault(),$t(vt),Dn(qt=>qt+1),ge(!0))};return document.addEventListener("keydown",J),()=>document.removeEventListener("keydown",J)},[]),e.useEffect(()=>{const J=()=>{const qt=K()??(q()?.matches?"dark":"light");At(z=>z===qt?z:qt)};J();const Ie=q(),wt=()=>J();Ie!==null&&Ie.addEventListener("change",wt);const vt=window.setInterval(J,1500);return()=>{Ie!==null&&Ie.removeEventListener("change",wt),window.clearInterval(vt)}},[]);const Mt=Rt==="system"?xt:Rt;if(e.useEffect(()=>{const J=document.documentElement;J.setAttribute("data-dsh-theme",Mt),J.style.colorScheme=Mt;let Ie=document.getElementById("dsh-studio-global-theme");return Ie===null&&(Ie=document.createElement("style"),Ie.id="dsh-studio-global-theme",Ie.textContent=le,document.head.appendChild(Ie)),()=>{J.removeAttribute("data-dsh-theme"),J.style.colorScheme=""}},[Mt]),e.useEffect(()=>Et(),[]),e.useEffect(()=>st(),[]),ae===null)return t("div",{"data-dsh-studio":"","data-theme":Mt},t("style",null,he),t("div",{className:"ds-loading"},ye===null?"正在载入工作空间…":`载入失败:${ye}`));if(ae.locked===!0)return t(se,{config:ae.config,theme:Mt,message:"",onDone:()=>void re()});const On=Ce===null?null:ae.tasks.find(J=>J.id===Ce)??null;return ae.tasks.reduce((J,Ie)=>(J[Ie.status]=(J[Ie.status]??0)+1,J),{}),t("div",{"data-dsh-studio":"","data-theme":Mt},t("style",null,he),t(_,null),t(O,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"},ae.config.board.title),t("div",{className:"ds-sub"},`${ae.tasks.length} 个任务 · rev ${ae.revision} · 更新于 ${Ke(ae.updatedAt)}`))),t("div",{className:"ds-head-actions"},ne()===null?t(u,{className:"ds-chip","data-on":"1",title:"没配 LDAP 时平台默认以超管身份使用,不需要登录;写操作与审计都记在它名下"},`👤 超管 ${ae.config.localAuth?.username??"admin"}`):t(u,{className:"ds-chip",title:`已登录:${ne()?.id??""}`},`👤 ${ne()?.name??ne()?.id}`),ne()===null?t("button",{className:"ds-btn ds-btn-ghost",title:"用域账号或本地超管账号登录",onClick:()=>de(!0)},"登录"):i("退出当前账号(退出后回到超管身份)",t("button",{className:"ds-btn ds-btn-ghost",onClick:async()=>{try{await Z("/auth/logout",{})}catch{}R(""),we(null),de(!1),re()}},"退出登录")),(()=>{const J=o("SegGroup"),Ie=te.map(([wt,vt])=>({id:wt,label:vt}));return J!==null?t(J,{value:Rt,onChange:wt=>Ue(pe(wt)),options:Ie}):t("div",{className:"ds-seg",title:"显示模式;「跟随系统」会先跟宿主界面的深浅色,宿主没给出信号时再跟操作系统"},te.map(([wt,vt])=>t("button",{key:wt,className:"ds-seg-btn","data-on":Rt===wt?"1":"0",onClick:()=>Ue(pe(wt))},vt)))})(),t("button",{className:"ds-btn",onClick:()=>void re()},"刷新"),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"},"导出需求"),(ae.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:(ae.integrations.channels??[]).filter(J=>J.state==="error").map(J=>`${J.label}:${J.lastError}`).join(`
|
|
831
|
+
`),onClick:()=>{X("settings"),Ee("health")}},`⚠ 集成异常 ${ae.integrations.broken}`):null,t("div",{className:"ds-newmenu",style:{position:"relative"}},t("button",{className:"ds-btn ds-btn-primary","aria-haspopup":"menu","aria-expanded":He?"true":"false",onClick:J=>{J.stopPropagation(),et(Ie=>!Ie)}},"+ 新建"),He?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:J=>J.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:()=>{et(!1),X("requirements"),Pe(J=>J+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:()=>{et(!1),X("board"),rt(!0)}},t("div",{style:{fontWeight:600}},"新建任务"),t("div",{className:"ds-hint",style:{marginTop:2}},"直接在看板上建一张卡"))):null))),t("div",{className:"ds-head-tabs"},(()=>{const J=o("TabsBar"),Ie=o("Tabs"),wt=o("TabsList"),vt=o("TabsTrigger"),qt=[{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 Ie!==null&&wt!==null&&vt!==null?t(Ie,{value:ce,onValueChange:z=>X(z)},t(wt,{className:""},qt.map(z=>t(vt,{key:z.id,value:z.id,title:z.hint,className:""},z.label)))):J!==null?t(J,{items:qt,value:ce,onChange:z=>X(z)}):t("div",{className:"ds-tabs"},qt.map(z=>t("button",{key:z.id,className:"ds-tab","data-on":ce===z.id?"1":"0",onClick:()=>X(z.id)},z.label)))})(),t("div",{className:"ds-grow"}),t("span",{className:"ds-stat"},ce==="dashboard"?"今天该看什么:风险 · 流程 · 待办":ce==="board"?`${(ae.config.experts??[]).filter(J=>J.enabled!==!1).length} 位专家 · ${(ae.config.teams??[]).length} 个专家团`:ce==="requirements"?`${(ae.requirements??[]).length} 条需求 · ${ae.tasks.filter(J=>(J.requirementId??"")==="").length} 张卡未挂需求`:ce==="releases"?`${(ae.releases??[]).length} 个版本 · ${ae.tasks.filter(J=>(J.releaseId??"")!=="").length} 张卡已挂版本`:ce==="projects"?`${(ae.config.projects??[]).length} 个项目`:ce==="cases"?`${(ae.tasks??[]).reduce((J,Ie)=>J+(Ie.caseSummary?.total??0),0)} 条用例 · 点一行跳回卡片`:ce==="analytics"?"过程指标:通过率 · 返工 · 周期":ce==="settings"?"改动即时生效,技能与专家保存在 ~/.dsh":"内部插件市场"))),ye!==null?t("div",{className:"ds-err",style:{padding:"6px 18px"}},ye):null,ce==="board"?t(k,{state:ae,onWip:async(J,Ie)=>{const wt=await E("这一列的 WIP 上限(0 = 不限,最多 50)",{title:"WIP 上限",defaultValue:String(Ie)});if(wt===null)return;const vt=Math.min(50,Math.max(0,Math.trunc(Number(String(wt).trim())||0)));try{await Z("/columns/wip",{status:J,wip:vt}),B(vt===0?"已取消 WIP 上限":`WIP 上限设为 ${vt}`),await re()}catch(qt){B(qt instanceof Error?qt.message:String(qt),"error")}},onMove:async(J,Ie)=>{await Z("/task/update",{id:J,status:Ie}),await re()},onOpen:_e}):ce==="dashboard"?t(ew,{state:ae,onOpenTask:_e,onOpenBoard:()=>X("board"),onOpenCases:()=>X("cases")}):ce==="requirements"?t(ow,{state:ae,onOpenTask:_e,onChanged:re,createSignal:Ge,focusReq:La}):ce==="cases"?t(tw,{state:ae,onOpenTask:_e}):ce==="releases"?t(iw,{state:ae,onOpenTask:_e}):ce==="projects"?t(ve,{state:ae,onOpenBoard:()=>X("board")}):ce==="analytics"?t(lw,{state:ae,onOpenTask:_e}):ce==="market"?t("div",{className:"ds-body"},t(Qa,{state:ae,onChanged:re})):t("div",{className:"ds-body"},t(jn,{state:ae,onChanged:re,initialSection:be,onSection:Ee})),Se?t(We,{state:ae,initialAction:Xa,initialSeq:ga,onClose:()=>{ge(!1),$t(null)},onPick:J=>{if(J.kind==="run"){Je(J);return}if(J.kind==="task"){_e(J.id);return}if(J.kind==="requirement"){X("requirements"),Lt({id:J.id,at:Date.now()});return}if(J.kind==="release"){X("releases");return}if(J.kind==="expert"){X("settings"),Ee("experts");return}if(J.kind==="team"){X("settings"),Ee("teams");return}if(J.kind==="project"){X("projects");return}if(J.kind==="skill"){X("settings"),Ee("skills");return}if(J.kind==="action"){if(J.id==="new-requirement"){X("requirements"),Pe(Ie=>Ie+1);return}if(J.id==="new-task"){X("board"),rt(!0);return}if(J.id.startsWith("tab:")){X(J.id.slice(4));return}if(J.id==="export:tasks"){window.open("/studio-api/export/tasks.csv","_blank");return}if(J.id==="export:requirements"){window.open("/studio-api/export/requirements.csv","_blank");return}if(J.id.startsWith("theme:")){Ue(pe(J.id.slice(6)));return}if(J.id==="refresh"){re();return}J.id.startsWith("settings:")&&(X("settings"),Ee(J.id.slice(9)))}}}):null,On!==null?t(je,{task:On,state:ae,onClose:()=>_e(null),onChanged:re}):null,dt?t(U,{state:ae,onClose:()=>rt(!1),onCreated:re}):null,Ut&&ae.locked!==!0?t(se,{config:ae.config,theme:Mt,message:"",overlay:!0,onDone:()=>{de(!1),re()},onClose:()=>de(!1)}):null)}function hs(Q){const se=typeof Q.size=="number"?Q.size:16;return t("svg",{width:se,height:se,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(Q){const se=[];se.push(Q.slots.inject("main",()=>Q.slots.register({name:"main",key:a},$a))),se.push(Q.slots.inject("sidebar.panellist",()=>Q.slots.register({name:"sidebar.panellist",id:a,order:12,label:()=>"需求&任务工作空间"},hs)));const ae=()=>{for(const ye of se.splice(0).reverse())ye()};return typeof Q.effect=="function"&&Q.effect(()=>ae),ae},StudioPage:$a,StudioIcon:hs,useUIKit:s}}var pf={exports:{}},va={},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(A,x){var P=A.length;A.push(x);e:for(;0<P;){var
|
|
839
|
+
*/(function(e){function t(A,x){var P=A.length;A.push(x);e:for(;0<P;){var G=P-1>>>1,te=A[G];if(0<r(te,x))A[G]=x,A[P]=te,P=G;else break e}}function a(A){return A.length===0?null:A[0]}function n(A){if(A.length===0)return null;var x=A[0],P=A.pop();if(P!==x){A[0]=P;e:for(var G=0,te=A.length,q=te>>>1;G<q;){var K=2*(G+1)-1,ke=A[K],pe=K+1,xe=A[pe];if(0>r(ke,P))pe<te&&0>r(xe,ke)?(A[G]=xe,A[pe]=P,G=pe):(A[G]=ke,A[K]=P,G=K);else if(pe<te&&0>r(xe,P))A[G]=xe,A[pe]=P,G=pe;else break e}}return x}function r(A,x){var P=A.sortIndex-x.sortIndex;return P!==0?P:A.id-x.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,w=!1,y=!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(A){for(var x=a(c);x!==null;){if(x.callback===null)n(c);else if(x.startTime<=A)n(c),x.sortIndex=x.expirationTime,t(l,x);else break;x=a(c)}}function b(A){if(y=!1,h(A),!w)if(a(l)!==null)w=!0,M(S);else{var x=a(c);x!==null&&O(b,x.startTime-A)}}function S(A,x){w=!1,y&&(y=!1,g(_),_=-1),v=!0;var P=f;try{for(h(x),p=a(l);p!==null&&(!(p.expirationTime>x)||A&&!W());){var G=p.callback;if(typeof G=="function"){p.callback=null,f=p.priorityLevel;var te=G(p.expirationTime<=x);x=e.unstable_now(),typeof te=="function"?p.callback=te:p===a(l)&&n(l),h(x)}else n(l);p=a(l)}if(p!==null)var q=!0;else{var K=a(c);K!==null&&O(b,K.startTime-x),q=!1}return q}finally{p=null,f=P,v=!1}}var C=!1,E=null,_=-1,I=5,F=-1;function W(){return!(e.unstable_now()-F<I)}function L(){if(E!==null){var A=e.unstable_now();F=A;var x=!0;try{x=E(!0,A)}finally{x?$():(C=!1,E=null)}}else C=!1}var $;if(typeof d=="function")$=function(){d(L)};else if(typeof MessageChannel<"u"){var B=new MessageChannel,ee=B.port2;B.port1.onmessage=L,$=function(){ee.postMessage(null)}}else $=function(){k(L,0)};function M(A){E=A,C||(C=!0,$())}function O(A,x){_=k(function(){A(e.unstable_now())},x)}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(A){A.callback=null},e.unstable_continueExecution=function(){w||v||(w=!0,M(S))},e.unstable_forceFrameRate=function(A){0>A||125<A?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):I=0<A?Math.floor(1e3/A):5},e.unstable_getCurrentPriorityLevel=function(){return f},e.unstable_getFirstCallbackNode=function(){return a(l)},e.unstable_next=function(A){switch(f){case 1:case 2:case 3:var x=3;break;default:x=f}var P=f;f=x;try{return A()}finally{f=P}},e.unstable_pauseExecution=function(){},e.unstable_requestPaint=function(){},e.unstable_runWithPriority=function(A,x){switch(A){case 1:case 2:case 3:case 4:case 5:break;default:A=3}var P=f;f=A;try{return x()}finally{f=P}},e.unstable_scheduleCallback=function(A,x,P){var G=e.unstable_now();switch(typeof P=="object"&&P!==null?(P=P.delay,P=typeof P=="number"&&0<P?G+P:G):P=G,A){case 1:var te=-1;break;case 2:te=250;break;case 5:te=1073741823;break;case 4:te=1e4;break;default:te=5e3}return te=P+te,A={id:u++,callback:x,priorityLevel:A,startTime:P,expirationTime:te,sortIndex:-1},P>G?(A.sortIndex=P,t(c,A),a(l)===null&&A===a(c)&&(y?(g(_),_=-1):y=!0,O(b,P-G))):(A.sortIndex=te,t(l,A),w||v||(w=!0,M(S))),A},e.unstable_shouldYield=W,e.unstable_wrapCallback=function(A){var x=f;return function(){var P=f;f=x;try{return A.apply(this,arguments)}finally{f=P}}}})(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 uw=N,
|
|
848
|
-
`+
|
|
847
|
+
*/var uw=N,ba=cw;function ie(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,Mr={};function bs(e,t){Bs(e,t),Bs(e+"Capture",t)}function Bs(e,t){for(Mr[e]=t,e=0;e<t.length;e++)gf.add(t[e])}var pn=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),ld=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 ld.call(vf,e)?!0:ld.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 na(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 Wt={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Wt[e]=new na(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Wt[t]=new na(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){Wt[e]=new na(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Wt[e]=new na(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){Wt[e]=new na(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){Wt[e]=new na(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){Wt[e]=new na(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){Wt[e]=new na(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){Wt[e]=new na(e,5,!1,e.toLowerCase(),null,!1,!1)});var dd=/[\-:]([a-z])/g;function cd(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(dd,cd);Wt[t]=new na(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(dd,cd);Wt[t]=new na(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(dd,cd);Wt[t]=new na(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){Wt[e]=new na(e,1,!1,e.toLowerCase(),null,!1,!1)}),Wt.xlinkHref=new na("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){Wt[e]=new na(e,1,!1,e.toLowerCase(),null,!0,!0)});function ud(e,t,a,n){var r=Wt.hasOwnProperty(t)?Wt[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 fn=uw.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,Xo=Symbol.for("react.element"),Us=Symbol.for("react.portal"),qs=Symbol.for("react.fragment"),pd=Symbol.for("react.strict_mode"),fd=Symbol.for("react.profiler"),bf=Symbol.for("react.provider"),yf=Symbol.for("react.context"),md=Symbol.for("react.forward_ref"),gd=Symbol.for("react.suspense"),hd=Symbol.for("react.suspense_list"),vd=Symbol.for("react.memo"),Bn=Symbol.for("react.lazy"),xf=Symbol.for("react.offscreen"),wf=Symbol.iterator;function zr(e){return e===null||typeof e!="object"?null:(e=wf&&e[wf]||e["@@iterator"],typeof e=="function"?e:null)}var mt=Object.assign,bd;function Fr(e){if(bd===void 0)try{throw Error()}catch(a){var t=a.stack.trim().match(/\n( *(at )?)/);bd=t&&t[1]||""}return`
|
|
848
|
+
`+bd+e}var yd=!1;function xd(e,t){if(!e||yd)return"";yd=!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{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,Nt=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,w=e;switch(e){case"keypress":if(pi(a)===0)break e;case"keydown":case"keyup":v=a0;break;case"focusin":w="focus",v=Hd;break;case"focusout":w="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 y=(t&4)!==0,k=!y&&e==="scroll",g=y?f!==null?f+"Capture":null:f;y=[];for(var d=c,h;d!==null;){h=d;var b=h.stateNode;if(h.tag===5&&b!==null&&(h=b,g!==null&&(b=qr(d,g),b!=null&&y.push(lo(d,b,h)))),k)break;d=d.return}0<y.length&&(f=new v(f,w,null,a,u),p.push({event:f,listeners:y}))}}if(!(t&7)){e:{if(f=e==="mouseover"||e==="pointerover",v=e==="mouseout"||e==="pointerout",f&&a!==Td&&(w=a.relatedTarget||a.fromElement)&&(ys(w)||w[pn]))break e;if((v||f)&&(f=u.window===u?u:(f=u.ownerDocument)?f.defaultView||f.parentWindow:window,v?(w=a.relatedTarget||a.toElement,v=c,w=w?ys(w):null,w!==null&&(k=bs(w),w!==k||w.tag!==5&&w.tag!==6)&&(w=null)):(v=null,w=c),v!==w)){if(y=om,b="onMouseLeave",g="onMouseEnter",d="mouse",(e==="pointerout"||e==="pointerover")&&(y=lm,b="onPointerLeave",g="onPointerEnter",d="pointer"),k=v==null?f:Js(v),h=w==null?f:Js(w),f=new y(b,d+"leave",v,a,u),f.target=k,f.relatedTarget=h,b=null,ys(u)===c&&(y=new y(g,d+"enter",w,a,u),y.target=h,y.relatedTarget=k,b=y),k=b,v&&w)t:{for(y=v,g=w,d=0,h=y;h;h=Xs(h))d++;for(h=0,b=g;b;b=Xs(b))h++;for(;0<d-h;)y=Xs(y),d--;for(;0<h-d;)g=Xs(g),h--;for(;d--;){if(y===g||g!==null&&y===g.alternate)break t;y=Xs(y),g=Xs(g)}y=null}else y=null;v!==null&&Dm(p,f,v,y,!1),w!==null&&k!==null&&Dm(p,k,w,y,!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,b){return d===null||d.tag!==6?(d=lu(h,g.mode,b),d.return=g,d):(d=r(d,h),d.return=g,d)}function l(g,d,h,b){var S=h.type;return S===Us?u(g,d,h.props.children,b,h.key):d!==null&&(d.elementType===S||typeof S=="object"&&S!==null&&S.$$typeof===Bn&&Km(S)===d.type)?(b=r(d,h.props),b.ref=po(g,d,h),b.return=g,b):(b=Ji(h.type,h.key,h.props,null,g.mode,b),b.ref=po(g,d,h),b.return=g,b)}function c(g,d,h,b){return d===null||d.tag!==4||d.stateNode.containerInfo!==h.containerInfo||d.stateNode.implementation!==h.implementation?(d=du(h,g.mode,b),d.return=g,d):(d=r(d,h.children||[]),d.return=g,d)}function u(g,d,h,b,S){return d===null||d.tag!==7?(d=_s(h,g.mode,b,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 b=d._init;return p(g,b(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,b){var S=d!==null?d.key:null;if(typeof h=="string"&&h!==""||typeof h=="number")return S!==null?null:i(g,d,""+h,b);if(typeof h=="object"&&h!==null){switch(h.$$typeof){case Qo:return h.key===S?l(g,d,h,b):null;case Bs:return h.key===S?c(g,d,h,b):null;case Bn:return S=h._init,f(g,d,S(h._payload),b)}if(Fr(h)||Mr(h))return S!==null?null:u(g,d,h,b,null);Pi(g,h)}return null}function v(g,d,h,b,S){if(typeof b=="string"&&b!==""||typeof b=="number")return g=g.get(h)||null,i(d,g,""+b,S);if(typeof b=="object"&&b!==null){switch(b.$$typeof){case Qo:return g=g.get(b.key===null?h:b.key)||null,l(d,g,b,S);case Bs:return g=g.get(b.key===null?h:b.key)||null,c(d,g,b,S);case Bn:var C=b._init;return v(g,d,h,C(b._payload),S)}if(Fr(b)||Mr(b))return g=g.get(h)||null,u(d,g,b,S,null);Pi(d,b)}return null}function w(g,d,h,b){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 z=f(g,E,h[_],b);if(z===null){E===null&&(E=I);break}e&&E&&z.alternate===null&&t(g,E),d=s(z,d,_),C===null?S=z:C.sibling=z,C=z,E=I}if(_===h.length)return a(g,E),ct&&ks(g,_),S;if(E===null){for(;_<h.length;_++)E=p(g,h[_],b),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[_],b),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)}),ct&&ks(g,_),S}function y(g,d,h,b){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,z=h.next();E!==null&&!z.done;_++,z=h.next()){E.index>_?(I=E,E=null):I=E.sibling;var H=f(g,E,z.value,b);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(z.done)return a(g,E),ct&&ks(g,_),S;if(E===null){for(;!z.done;_++,z=h.next())z=p(g,z.value,b),z!==null&&(d=s(z,d,_),C===null?S=z:C.sibling=z,C=z);return ct&&ks(g,_),S}for(E=n(g,E);!z.done;_++,z=h.next())z=v(E,g,_,z.value,b),z!==null&&(e&&z.alternate!==null&&E.delete(z.key===null?_:z.key),d=s(z,d,_),C===null?S=z:C.sibling=z,C=z);return e&&E.forEach(function(M){return t(g,M)}),ct&&ks(g,_),S}function k(g,d,h,b){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,b,h.key),d.return=g,g=d):(b=Ji(h.type,h.key,h.props,null,g.mode,b),b.ref=po(g,d,h),b.return=g,g=b)}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,b),d.return=g,g=d}return o(g);case Bn:return C=h._init,k(g,d,C(h._payload),b)}if(Fr(h))return w(g,d,h,b);if(Mr(h))return y(g,d,h,b);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,b),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 w=e,y=i;switch(f=t,v=a,y.tag){case 1:if(w=y.payload,typeof w=="function"){p=w.call(v,p,f);break e}p=w;break e;case 3:w.flags=w.flags&-65537|128;case 0:if(w=y.payload,f=typeof w=="function"?w.call(v,p,f):w,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=`
|
|
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{yd=!1,Error.prepareStackTrace=a}return(e=e?e.displayName||e.name:"")?Fr(e):""}function hw(e){switch(e.tag){case 5:return Fr(e.type);case 16:return Fr("Lazy");case 13:return Fr("Suspense");case 19:return Fr("SuspenseList");case 0:case 2:case 15:return e=xd(e.type,!1),e;case 11:return e=xd(e.type.render,!1),e;case 1:return e=xd(e.type,!0),e;default:return""}}function wd(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 qs:return"Fragment";case Us:return"Portal";case fd:return"Profiler";case pd:return"StrictMode";case gd:return"Suspense";case hd: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 md:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case vd:return t=e.displayName||null,t!==null?t:wd(e.type)||"Memo";case Bn:t=e._payload,e=e._init;try{return wd(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 wd(t);case 8:return t===pd?"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 Zo(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 Jo(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 kd(e,t){var a=t.checked;return mt({},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&&ud(e,"checked",t,!1)}function Nd(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")?Sd(e,t.type,a):t.hasOwnProperty("defaultValue")&&Sd(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 Sd(e,t,a){(t!=="number"||Jo(e.ownerDocument)!==e)&&(a==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+a&&(e.defaultValue=""+a))}var Br=Array.isArray;function Vs(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 Cd(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(ie(91));return mt({},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(ie(92));if(Br(a)){if(1<a.length)throw Error(ie(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 Ed(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 ei,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(ei=ei||document.createElement("div"),ei.innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=ei.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Ur(e,t){if(t){var a=e.firstChild;if(a&&a===e.lastChild&&a.nodeType===3){a.nodeValue=t;return}}e.textContent=t}var qr={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(qr).forEach(function(e){yw.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),qr[t]=qr[e]})});function Rf(e,t,a){return t==null||typeof t=="boolean"||t===""?"":a||typeof t!="number"||t===0||qr.hasOwnProperty(e)&&qr[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=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 $d(e,t){if(t){if(xw[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(ie(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(ie(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(ie(61))}if(t.style!=null&&typeof t.style!="object")throw Error(ie(62))}}function Td(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 Pd=null;function _d(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Id=null,Ws=null,Hs=null;function jf(e){if(e=po(e)){if(typeof Id!="function")throw Error(ie(280));var t=e.stateNode;t&&(t=Ni(t),Id(e.stateNode,e.type,t))}}function Df(e){Ws?Hs?Hs.push(e):Hs=[e]:Ws=e}function Of(){if(Ws){var e=Ws,t=Hs;if(Hs=Ws=null,jf(e),t)for(e=0;e<t.length;e++)jf(t[e])}}function Lf(e,t){return e(t)}function Mf(){}var Rd=!1;function zf(e,t,a){if(Rd)return e(t,a);Rd=!0;try{return Lf(e,t,a)}finally{Rd=!1,(Ws!==null||Hs!==null)&&(Mf(),Of())}}function Vr(e,t){var a=e.stateNode;if(a===null)return null;var n=Ni(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(ie(231,t,typeof a));return a}var Ad=!1;if(pn)try{var Wr={};Object.defineProperty(Wr,"passive",{get:function(){Ad=!0}}),window.addEventListener("test",Wr,Wr),window.removeEventListener("test",Wr,Wr)}catch{Ad=!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 Hr=!1,ti=null,ai=!1,jd=null,kw={onError:function(e){Hr=!0,ti=e}};function Nw(e,t,a,n,r,s,o,i,l){Hr=!1,ti=null,ww.apply(kw,arguments)}function Sw(e,t,a,n,r,s,o,i,l){if(Nw.apply(this,arguments),Hr){if(Hr){var c=ti;Hr=!1,ti=null}else throw Error(ie(198));ai||(ai=!0,jd=c)}}function ys(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(ys(e)!==e)throw Error(ie(188))}function Cw(e){var t=e.alternate;if(!t){if(t=ys(e),t===null)throw Error(ie(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(ie(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(ie(189))}}if(a.alternate!==n)throw Error(ie(190))}if(a.tag!==3)throw Error(ie(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=ba.unstable_scheduleCallback,Wf=ba.unstable_cancelCallback,Ew=ba.unstable_shouldYield,$w=ba.unstable_requestPaint,Nt=ba.unstable_now,Tw=ba.unstable_getCurrentPriorityLevel,Dd=ba.unstable_ImmediatePriority,Hf=ba.unstable_UserBlockingPriority,ni=ba.unstable_NormalPriority,Pw=ba.unstable_LowPriority,Gf=ba.unstable_IdlePriority,si=null,tn=null;function _w(e){if(tn&&typeof tn.onCommitFiberRoot=="function")try{tn.onCommitFiberRoot(si,e,void 0,(e.current.flags&128)===128)}catch{}}var Ba=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 ri=64,oi=4194304;function Gr(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 ii(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=Gr(i):(s&=o,s!==0&&(n=Gr(s)))}else o=a&~r,o!==0?n=Gr(o):s!==0&&(n=Gr(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-Ba(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-Ba(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 Od(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?1073741824:0}function Kf(){var e=ri;return ri<<=1,!(ri&4194240)&&(ri=64),e}function Ld(e){for(var t=[],a=0;31>a;a++)t.push(e);return t}function Kr(e,t,a){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Ba(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-Ba(a),s=1<<r;t[r]=0,n[r]=-1,e[r]=-1,a&=~s}}function Md(e,t){var a=e.entangledLanes|=t;for(e=e.entanglements;a;){var n=31-Ba(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,zd,Xf,Zf,Jf,Fd=!1,li=[],qn=null,Vn=null,Wn=null,Yr=new Map,Qr=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":Yr.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Qr.delete(t.pointerId)}}function Xr(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=po(t),t!==null&&zd(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=Xr(qn,e,t,a,n,r),!0;case"dragenter":return Vn=Xr(Vn,e,t,a,n,r),!0;case"mouseover":return Wn=Xr(Wn,e,t,a,n,r),!0;case"pointerover":var s=r.pointerId;return Yr.set(s,Xr(Yr.get(s)||null,e,t,a,n,r)),!0;case"gotpointercapture":return s=r.pointerId,Qr.set(s,Xr(Qr.get(s)||null,e,t,a,n,r)),!0}return!1}function tm(e){var t=xs(e.target);if(t!==null){var a=ys(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 di(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var a=Ud(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(a===null){a=e.nativeEvent;var n=new a.constructor(a.type,a);Pd=n,a.target.dispatchEvent(n),Pd=null}else return t=po(a),t!==null&&zd(t),e.blockedOn=a,!1;t.shift()}return!0}function am(e,t,a){di(e)&&a.delete(t)}function zw(){Fd=!1,qn!==null&&di(qn)&&(qn=null),Vn!==null&&di(Vn)&&(Vn=null),Wn!==null&&di(Wn)&&(Wn=null),Yr.forEach(am),Qr.forEach(am)}function Zr(e,t){e.blockedOn===t&&(e.blockedOn=null,Fd||(Fd=!0,ba.unstable_scheduleCallback(ba.unstable_NormalPriority,zw)))}function Jr(e){function t(r){return Zr(r,e)}if(0<li.length){Zr(li[0],e);for(var a=1;a<li.length;a++){var n=li[a];n.blockedOn===e&&(n.blockedOn=null)}}for(qn!==null&&Zr(qn,e),Vn!==null&&Zr(Vn,e),Wn!==null&&Zr(Wn,e),Yr.forEach(t),Qr.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 Gs=fn.ReactCurrentBatchConfig,ci=!0;function Fw(e,t,a,n){var r=Qe,s=Gs.transition;Gs.transition=null;try{Qe=1,Bd(e,t,a,n)}finally{Qe=r,Gs.transition=s}}function Bw(e,t,a,n){var r=Qe,s=Gs.transition;Gs.transition=null;try{Qe=4,Bd(e,t,a,n)}finally{Qe=r,Gs.transition=s}}function Bd(e,t,a,n){if(ci){var r=Ud(e,t,a,n);if(r===null)rc(e,t,n,ui,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=po(r);if(s!==null&&Qf(s),s=Ud(e,t,a,n),s===null&&rc(e,t,n,ui,a),s===r)break;r=s}r!==null&&n.stopPropagation()}else rc(e,t,n,null,a)}}var ui=null;function Ud(e,t,a,n){if(ui=null,e=_d(n),e=xs(e),e!==null)if(t=ys(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 ui=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 Dd:return 1;case Hf:return 4;case ni:case Pw:return 16;case Gf:return 536870912;default:return 16}default:return 16}}var Gn=null,qd=null,pi=null;function sm(){if(pi)return pi;var e,t=qd,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 pi=r.slice(e,1<n?1-n:void 0)}function fi(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 mi(){return!0}function rm(){return!1}function ya(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)?mi:rm,this.isPropagationStopped=rm,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=mi)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():typeof a.cancelBubble!="unknown"&&(a.cancelBubble=!0),this.isPropagationStopped=mi)},persist:function(){},isPersistent:mi}),t}var Ks={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},Vd=ya(Ks),eo=mt({},Ks,{view:0,detail:0}),Uw=ya(eo),Wd,Hd,to,gi=mt({},eo,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Kd,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!==to&&(to&&e.type==="mousemove"?(Wd=e.screenX-to.screenX,Hd=e.screenY-to.screenY):Hd=Wd=0,to=e),Wd)},movementY:function(e){return"movementY"in e?e.movementY:Hd}}),om=ya(gi),qw=mt({},gi,{dataTransfer:0}),Vw=ya(qw),Ww=mt({},eo,{relatedTarget:0}),Gd=ya(Ww),Hw=mt({},Ks,{animationName:0,elapsedTime:0,pseudoElement:0}),Gw=ya(Hw),Kw=mt({},Ks,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),Yw=ya(Kw),Qw=mt({},Ks,{data:0}),im=ya(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 Kd(){return e0}var t0=mt({},eo,{key:function(e){if(e.key){var t=Xw[e.key]||e.key;if(t!=="Unidentified")return t}return e.type==="keypress"?(e=fi(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:Kd,charCode:function(e){return e.type==="keypress"?fi(e):0},keyCode:function(e){return e.type==="keydown"||e.type==="keyup"?e.keyCode:0},which:function(e){return e.type==="keypress"?fi(e):e.type==="keydown"||e.type==="keyup"?e.keyCode:0}}),a0=ya(t0),n0=mt({},gi,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),lm=ya(n0),s0=mt({},eo,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Kd}),r0=ya(s0),o0=mt({},Ks,{propertyName:0,elapsedTime:0,pseudoElement:0}),i0=ya(o0),l0=mt({},gi,{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=ya(l0),c0=[9,13,27,32],Yd=pn&&"CompositionEvent"in window,ao=null;pn&&"documentMode"in document&&(ao=document.documentMode);var u0=pn&&"TextEvent"in window&&!ao,dm=pn&&(!Yd||ao&&8<ao&&11>=ao),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 Ys=!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(Ys)return e==="compositionend"||!Yd&&pm(e,t)?(e=sm(),pi=qd=Gn=null,Ys=!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=xi(t,"onChange"),0<t.length&&(a=new Vd("onChange","change",null,a,n),e.push({event:a,listeners:t}))}var no=null,so=null;function g0(e){Am(e,0)}function hi(e){var t=er(e);if(Nf(t))return e}function h0(e,t){if(e==="change")return t}var hm=!1;if(pn){var Qd;if(pn){var Xd="oninput"in document;if(!Xd){var vm=document.createElement("div");vm.setAttribute("oninput","return;"),Xd=typeof vm.oninput=="function"}Qd=Xd}else Qd=!1;hm=Qd&&(!document.documentMode||9<document.documentMode)}function bm(){no&&(no.detachEvent("onpropertychange",ym),so=no=null)}function ym(e){if(e.propertyName==="value"&&hi(so)){var t=[];gm(t,so,e,_d(e)),zf(g0,t)}}function v0(e,t,a){e==="focusin"?(bm(),no=t,so=a,no.attachEvent("onpropertychange",ym)):e==="focusout"&&bm()}function b0(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")return hi(so)}function y0(e,t){if(e==="click")return hi(t)}function x0(e,t){if(e==="input"||e==="change")return hi(t)}function w0(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var Ua=typeof Object.is=="function"?Object.is:w0;function ro(e,t){if(Ua(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(!ld.call(t,r)||!Ua(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=Jo();t instanceof e.HTMLIFrameElement;){try{var a=typeof t.contentWindow.location.href=="string"}catch{a=!1}if(a)e=t.contentWindow;else break;t=Jo(e.document)}return t}function Zd(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&&Zd(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=pn&&"documentMode"in document&&11>=document.documentMode,Qs=null,Jd=null,oo=null,ec=!1;function Sm(e,t,a){var n=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;ec||Qs==null||Qs!==Jo(n)||(n=Qs,"selectionStart"in n&&Zd(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}),oo&&ro(oo,n)||(oo=n,n=xi(Jd,"onSelect"),0<n.length&&(t=new Vd("onSelect","select",null,t,a),e.push({event:t,listeners:n}),t.target=Qs)))}function vi(e,t){var a={};return a[e.toLowerCase()]=t.toLowerCase(),a["Webkit"+e]="webkit"+t,a["Moz"+e]="moz"+t,a}var Xs={animationend:vi("Animation","AnimationEnd"),animationiteration:vi("Animation","AnimationIteration"),animationstart:vi("Animation","AnimationStart"),transitionend:vi("Transition","TransitionEnd")},tc={},Cm={};pn&&(Cm=document.createElement("div").style,"AnimationEvent"in window||(delete Xs.animationend.animation,delete Xs.animationiteration.animation,delete Xs.animationstart.animation),"TransitionEvent"in window||delete Xs.transitionend.transition);function bi(e){if(tc[e])return tc[e];if(!Xs[e])return e;var t=Xs[e],a;for(a in t)if(t.hasOwnProperty(a)&&a in Cm)return tc[e]=t[a];return e}var Em=bi("animationend"),$m=bi("animationiteration"),Tm=bi("animationstart"),Pm=bi("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),bs(t,[e])}for(var ac=0;ac<Im.length;ac++){var nc=Im[ac],S0=nc.toLowerCase(),C0=nc[0].toUpperCase()+nc.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"),Bs("onMouseEnter",["mouseout","mouseover"]),Bs("onMouseLeave",["mouseout","mouseover"]),Bs("onPointerEnter",["pointerout","pointerover"]),Bs("onPointerLeave",["pointerout","pointerover"]),bs("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),bs("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),bs("onBeforeInput",["compositionend","keypress","textInput","paste"]),bs("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),bs("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),bs("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var io="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(io));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(ai)throw e=jd,ai=!1,jd=null,e}function ot(e,t){var a=t[uc];a===void 0&&(a=t[uc]=new Set);var n=e+"__bubble";a.has(n)||(jm(t,e,2,!1),a.add(n))}function sc(e,t,a){var n=0;t&&(n|=4),jm(a,e,n,t)}var yi="_reactListening"+Math.random().toString(36).slice(2);function lo(e){if(!e[yi]){e[yi]=!0,gf.forEach(function(a){a!=="selectionchange"&&(E0.has(a)||sc(a,!1,e),sc(a,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[yi]||(t[yi]=!0,sc("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=Bd}a=r.bind(null,t,a,e),r=void 0,!Ad||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 rc(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=xs(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=_d(a),p=[];e:{var f=_m.get(e);if(f!==void 0){var v=Vd,w=e;switch(e){case"keypress":if(fi(a)===0)break e;case"keydown":case"keyup":v=a0;break;case"focusin":w="focus",v=Gd;break;case"focusout":w="blur",v=Gd;break;case"beforeblur":case"afterblur":v=Gd;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 y=(t&4)!==0,k=!y&&e==="scroll",g=y?f!==null?f+"Capture":null:f;y=[];for(var d=c,h;d!==null;){h=d;var b=h.stateNode;if(h.tag===5&&b!==null&&(h=b,g!==null&&(b=Vr(d,g),b!=null&&y.push(co(d,b,h)))),k)break;d=d.return}0<y.length&&(f=new v(f,w,null,a,u),p.push({event:f,listeners:y}))}}if(!(t&7)){e:{if(f=e==="mouseover"||e==="pointerover",v=e==="mouseout"||e==="pointerout",f&&a!==Pd&&(w=a.relatedTarget||a.fromElement)&&(xs(w)||w[mn]))break e;if((v||f)&&(f=u.window===u?u:(f=u.ownerDocument)?f.defaultView||f.parentWindow:window,v?(w=a.relatedTarget||a.toElement,v=c,w=w?xs(w):null,w!==null&&(k=ys(w),w!==k||w.tag!==5&&w.tag!==6)&&(w=null)):(v=null,w=c),v!==w)){if(y=om,b="onMouseLeave",g="onMouseEnter",d="mouse",(e==="pointerout"||e==="pointerover")&&(y=lm,b="onPointerLeave",g="onPointerEnter",d="pointer"),k=v==null?f:er(v),h=w==null?f:er(w),f=new y(b,d+"leave",v,a,u),f.target=k,f.relatedTarget=h,b=null,xs(u)===c&&(y=new y(g,d+"enter",w,a,u),y.target=h,y.relatedTarget=k,b=y),k=b,v&&w)t:{for(y=v,g=w,d=0,h=y;h;h=Zs(h))d++;for(h=0,b=g;b;b=Zs(b))h++;for(;0<d-h;)y=Zs(y),d--;for(;0<h-d;)g=Zs(g),h--;for(;d--;){if(y===g||g!==null&&y===g.alternate)break t;y=Zs(y),g=Zs(g)}y=null}else y=null;v!==null&&Dm(p,f,v,y,!1),w!==null&&k!==null&&Dm(p,k,w,y,!0)}}e:{if(f=c?er(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"&&Sd(f,"number",f.value)}switch(C=c?er(c):window,e){case"focusin":(mm(C)||C.contentEditable==="true")&&(Qs=C,Jd=c,oo=null);break;case"focusout":oo=Jd=Qs=null;break;case"mousedown":ec=!0;break;case"contextmenu":case"mouseup":case"dragend":ec=!1,Sm(p,a,u);break;case"selectionchange":if(N0)break;case"keydown":case"keyup":Sm(p,a,u)}var E;if(Yd)e:{switch(e){case"compositionstart":var _="onCompositionStart";break e;case"compositionend":_="onCompositionEnd";break e;case"compositionupdate":_="onCompositionUpdate";break e}_=void 0}else Ys?pm(e,a)&&(_="onCompositionEnd"):e==="keydown"&&a.keyCode===229&&(_="onCompositionStart");_&&(dm&&a.locale!=="ko"&&(Ys||_!=="onCompositionStart"?_==="onCompositionEnd"&&Ys&&(E=sm()):(Gn=u,qd="value"in Gn?Gn.value:Gn.textContent,Ys=!0)),C=xi(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=xi(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 co(e,t,a){return{instance:e,listener:t,currentTarget:a}}function xi(e,t){for(var a=t+"Capture",n=[];e!==null;){var r=e,s=r.stateNode;r.tag===5&&s!==null&&(r=s,s=Vr(e,a),s!=null&&n.unshift(co(e,s,r)),s=Vr(e,t),s!=null&&n.push(co(e,s,r))),e=e.return}return n}function Zs(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=Vr(a,s),l!=null&&o.unshift(co(a,l,i))):r||(l=Vr(a,s),l!=null&&o.push(co(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 wi(e,t,a){if(t=Om(t),Om(e)!==t&&a)throw Error(ie(425))}function ki(){}var oc=null,ic=null;function lc(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 dc=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)}:dc;function I0(e){setTimeout(function(){throw e})}function cc(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),Jr(t);return}n--}else a!=="$"&&a!=="$?"&&a!=="$!"||n++;a=r}while(a);Jr(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 Js=Math.random().toString(36).slice(2),an="__reactFiber$"+Js,uo="__reactProps$"+Js,mn="__reactContainer$"+Js,uc="__reactEvents$"+Js,R0="__reactListeners$"+Js,A0="__reactHandles$"+Js;function xs(e){var t=e[an];if(t)return t;for(var a=e.parentNode;a;){if(t=a[mn]||a[an]){if(a=t.alternate,t.child!==null||a!==null&&a.child!==null)for(e=Mm(e);e!==null;){if(a=e[an])return a;e=Mm(e)}return t}e=a,a=e.parentNode}return null}function po(e){return e=e[an]||e[mn],!e||e.tag!==5&&e.tag!==6&&e.tag!==13&&e.tag!==3?null:e}function er(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(ie(33))}function Ni(e){return e[uo]||null}var pc=[],tr=-1;function Qn(e){return{current:e}}function it(e){0>tr||(e.current=pc[tr],pc[tr]=null,tr--)}function nt(e,t){tr++,pc[tr]=e.current,e.current=t}var Xn={},Xt=Qn(Xn),da=Qn(!1),ws=Xn;function ar(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 ca(e){return e=e.childContextTypes,e!=null}function Si(){it(da),it(Xt)}function zm(e,t,a){if(Xt.current!==Xn)throw Error(ie(168));nt(Xt,t),nt(da,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(ie(108,vw(e)||"Unknown",r));return mt({},a,n)}function Ci(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Xn,ws=Xt.current,nt(Xt,e),nt(da,da.current),!0}function Bm(e,t,a){var n=e.stateNode;if(!n)throw Error(ie(169));a?(e=Fm(e,t,ws),n.__reactInternalMemoizedMergedChildContext=e,it(da),it(Xt),nt(Xt,e)):it(da),nt(da,a)}var gn=null,Ei=!1,fc=!1;function Um(e){gn===null?gn=[e]:gn.push(e)}function j0(e){Ei=!0,Um(e)}function Zn(){if(!fc&&gn!==null){fc=!0;var e=0,t=Qe;try{var a=gn;for(Qe=1;e<a.length;e++){var n=a[e];do n=n(!0);while(n!==null)}gn=null,Ei=!1}catch(r){throw gn!==null&&(gn=gn.slice(e+1)),Vf(Dd,Zn),r}finally{Qe=t,fc=!1}}return null}var nr=[],sr=0,$i=null,Ti=0,Ta=[],Pa=0,ks=null,hn=1,vn="";function Ns(e,t){nr[sr++]=Ti,nr[sr++]=$i,$i=e,Ti=t}function qm(e,t,a){Ta[Pa++]=hn,Ta[Pa++]=vn,Ta[Pa++]=ks,ks=e;var n=hn;e=vn;var r=32-Ba(n)-1;n&=~(1<<r),a+=1;var s=32-Ba(t)+r;if(30<s){var o=r-r%5;s=(n&(1<<o)-1).toString(32),n>>=o,r-=o,hn=1<<32-Ba(t)+r|a<<r|n,vn=s+e}else hn=1<<s|a<<r|n,vn=e}function mc(e){e.return!==null&&(Ns(e,1),qm(e,1,0))}function gc(e){for(;e===$i;)$i=nr[--sr],nr[sr]=null,Ti=nr[--sr],nr[sr]=null;for(;e===ks;)ks=Ta[--Pa],Ta[Pa]=null,vn=Ta[--Pa],Ta[Pa]=null,hn=Ta[--Pa],Ta[Pa]=null}var xa=null,wa=null,ct=!1,qa=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,xa=e,wa=Yn(t.firstChild),!0):!1;case 6:return t=e.pendingProps===""||t.nodeType!==3?null:t,t!==null?(e.stateNode=t,xa=e,wa=null,!0):!1;case 13:return t=t.nodeType!==8?null:t,t!==null?(a=ks!==null?{id:hn,overflow:vn}:null,e.memoizedState={dehydrated:t,treeContext:a,retryLane:1073741824},a=Aa(18,null,null,0),a.stateNode=t,a.return=e,e.child=a,xa=e,wa=null,!0):!1;default:return!1}}function hc(e){return(e.mode&1)!==0&&(e.flags&128)===0}function vc(e){if(ct){var t=wa;if(t){var a=t;if(!Wm(e,t)){if(hc(e))throw Error(ie(418));t=Yn(a.nextSibling);var n=xa;t&&Wm(e,t)?Vm(n,a):(e.flags=e.flags&-4097|2,ct=!1,xa=e)}}else{if(hc(e))throw Error(ie(418));e.flags=e.flags&-4097|2,ct=!1,xa=e}}}function Hm(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13;)e=e.return;xa=e}function Pi(e){if(e!==xa)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"&&!lc(e.type,e.memoizedProps)),t&&(t=wa)){if(hc(e))throw Gm(),Error(ie(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(ie(317));e:{for(e=e.nextSibling,t=0;e;){if(e.nodeType===8){var a=e.data;if(a==="/$"){if(t===0){wa=Yn(e.nextSibling);break e}t--}else a!=="$"&&a!=="$!"&&a!=="$?"||t++}e=e.nextSibling}wa=null}}else wa=xa?Yn(e.stateNode.nextSibling):null;return!0}function Gm(){for(var e=wa;e;)e=Yn(e.nextSibling)}function rr(){wa=xa=null,ct=!1}function bc(e){qa===null?qa=[e]:qa.push(e)}var D0=fn.ReactCurrentBatchConfig;function fo(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(ie(309));var n=a.stateNode}if(!n)throw Error(ie(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(ie(284));if(!a._owner)throw Error(ie(290,e))}return e}function _i(e,t){throw e=Object.prototype.toString.call(t),Error(ie(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,b){return d===null||d.tag!==6?(d=du(h,g.mode,b),d.return=g,d):(d=r(d,h),d.return=g,d)}function l(g,d,h,b){var S=h.type;return S===qs?u(g,d,h.props.children,b,h.key):d!==null&&(d.elementType===S||typeof S=="object"&&S!==null&&S.$$typeof===Bn&&Km(S)===d.type)?(b=r(d,h.props),b.ref=fo(g,d,h),b.return=g,b):(b=el(h.type,h.key,h.props,null,g.mode,b),b.ref=fo(g,d,h),b.return=g,b)}function c(g,d,h,b){return d===null||d.tag!==4||d.stateNode.containerInfo!==h.containerInfo||d.stateNode.implementation!==h.implementation?(d=cu(h,g.mode,b),d.return=g,d):(d=r(d,h.children||[]),d.return=g,d)}function u(g,d,h,b,S){return d===null||d.tag!==7?(d=Is(h,g.mode,b,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=du(""+d,g.mode,h),d.return=g,d;if(typeof d=="object"&&d!==null){switch(d.$$typeof){case Xo:return h=el(d.type,d.key,d.props,null,g.mode,h),h.ref=fo(g,null,d),h.return=g,h;case Us:return d=cu(d,g.mode,h),d.return=g,d;case Bn:var b=d._init;return p(g,b(d._payload),h)}if(Br(d)||zr(d))return d=Is(d,g.mode,h,null),d.return=g,d;_i(g,d)}return null}function f(g,d,h,b){var S=d!==null?d.key:null;if(typeof h=="string"&&h!==""||typeof h=="number")return S!==null?null:i(g,d,""+h,b);if(typeof h=="object"&&h!==null){switch(h.$$typeof){case Xo:return h.key===S?l(g,d,h,b):null;case Us:return h.key===S?c(g,d,h,b):null;case Bn:return S=h._init,f(g,d,S(h._payload),b)}if(Br(h)||zr(h))return S!==null?null:u(g,d,h,b,null);_i(g,h)}return null}function v(g,d,h,b,S){if(typeof b=="string"&&b!==""||typeof b=="number")return g=g.get(h)||null,i(d,g,""+b,S);if(typeof b=="object"&&b!==null){switch(b.$$typeof){case Xo:return g=g.get(b.key===null?h:b.key)||null,l(d,g,b,S);case Us:return g=g.get(b.key===null?h:b.key)||null,c(d,g,b,S);case Bn:var C=b._init;return v(g,d,h,C(b._payload),S)}if(Br(b)||zr(b))return g=g.get(h)||null,u(d,g,b,S,null);_i(d,b)}return null}function w(g,d,h,b){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 F=f(g,E,h[_],b);if(F===null){E===null&&(E=I);break}e&&E&&F.alternate===null&&t(g,E),d=s(F,d,_),C===null?S=F:C.sibling=F,C=F,E=I}if(_===h.length)return a(g,E),ct&&Ns(g,_),S;if(E===null){for(;_<h.length;_++)E=p(g,h[_],b),E!==null&&(d=s(E,d,_),C===null?S=E:C.sibling=E,C=E);return ct&&Ns(g,_),S}for(E=n(g,E);_<h.length;_++)I=v(E,g,_,h[_],b),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&&Ns(g,_),S}function y(g,d,h,b){var S=zr(h);if(typeof S!="function")throw Error(ie(150));if(h=S.call(h),h==null)throw Error(ie(151));for(var C=S=null,E=d,_=d=0,I=null,F=h.next();E!==null&&!F.done;_++,F=h.next()){E.index>_?(I=E,E=null):I=E.sibling;var W=f(g,E,F.value,b);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(F.done)return a(g,E),ct&&Ns(g,_),S;if(E===null){for(;!F.done;_++,F=h.next())F=p(g,F.value,b),F!==null&&(d=s(F,d,_),C===null?S=F:C.sibling=F,C=F);return ct&&Ns(g,_),S}for(E=n(g,E);!F.done;_++,F=h.next())F=v(E,g,_,F.value,b),F!==null&&(e&&F.alternate!==null&&E.delete(F.key===null?_:F.key),d=s(F,d,_),C===null?S=F:C.sibling=F,C=F);return e&&E.forEach(function(L){return t(g,L)}),ct&&Ns(g,_),S}function k(g,d,h,b){if(typeof h=="object"&&h!==null&&h.type===qs&&h.key===null&&(h=h.props.children),typeof h=="object"&&h!==null){switch(h.$$typeof){case Xo:e:{for(var S=h.key,C=d;C!==null;){if(C.key===S){if(S=h.type,S===qs){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=fo(g,C,h),d.return=g,g=d;break e}a(g,C);break}else t(g,C);C=C.sibling}h.type===qs?(d=Is(h.props.children,g.mode,b,h.key),d.return=g,g=d):(b=el(h.type,h.key,h.props,null,g.mode,b),b.ref=fo(g,d,h),b.return=g,g=b)}return o(g);case Us: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=cu(h,g.mode,b),d.return=g,g=d}return o(g);case Bn:return C=h._init,k(g,d,C(h._payload),b)}if(Br(h))return w(g,d,h,b);if(zr(h))return y(g,d,h,b);_i(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=du(h,g.mode,b),d.return=g,g=d),o(g)):a(g,d)}return k}var or=Ym(!0),Qm=Ym(!1),Ii=Qn(null),Ri=null,ir=null,yc=null;function xc(){yc=ir=Ri=null}function wc(e){var t=Ii.current;it(Ii),e._currentValue=t}function kc(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 lr(e,t){Ri=e,yc=ir=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(ua=!0),e.firstContext=null)}function _a(e){var t=e._currentValue;if(yc!==e)if(e={context:e,memoizedValue:t,next:null},ir===null){if(Ri===null)throw Error(ie(308));ir=e,Ri.dependencies={lanes:0,firstContext:e}}else ir=ir.next=e;return t}var Ss=null;function Nc(e){Ss===null?Ss=[e]:Ss.push(e)}function Xm(e,t,a,n){var r=t.interleaved;return r===null?(a.next=a,Nc(t)):(a.next=r.next,r.next=a),t.interleaved=a,bn(e,n)}function bn(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 Sc(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 yn(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,Ve&2){var r=n.pending;return r===null?t.next=t:(t.next=r.next,r.next=t),n.pending=t,bn(e,a)}return r=n.interleaved,r===null?(t.next=t,Nc(n)):(t.next=r.next,r.next=t),n.interleaved=t,bn(e,a)}function Ai(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,Md(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 ji(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 w=e,y=i;switch(f=t,v=a,y.tag){case 1:if(w=y.payload,typeof w=="function"){p=w.call(v,p,f);break e}p=w;break e;case 3:w.flags=w.flags&-65537|128;case 0:if(w=y.payload,f=typeof w=="function"?w.call(v,p,f):w,f==null)break e;p=mt({},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);$s|=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(ie(191,r));r.call(n)}}}var mo={},nn=Qn(mo),go=Qn(mo),ho=Qn(mo);function Cs(e){if(e===mo)throw Error(ie(174));return e}function Cc(e,t){switch(nt(ho,t),nt(go,e),nt(nn,mo),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:Ed(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=Ed(t,e)}it(nn),nt(nn,t)}function dr(){it(nn),it(go),it(ho)}function tg(e){Cs(ho.current);var t=Cs(nn.current),a=Ed(t,e.type);t!==a&&(nt(go,e),nt(nn,a))}function Ec(e){go.current===e&&(it(nn),it(go))}var gt=Qn(0);function Di(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 $c=[];function Tc(){for(var e=0;e<$c.length;e++)$c[e]._workInProgressVersionPrimary=null;$c.length=0}var Oi=fn.ReactCurrentDispatcher,Pc=fn.ReactCurrentBatchConfig,Es=0,ht=null,jt=null,zt=null,Li=!1,vo=!1,bo=0,O0=0;function Zt(){throw Error(ie(321))}function _c(e,t){if(t===null)return!1;for(var a=0;a<t.length&&a<e.length;a++)if(!Ua(e[a],t[a]))return!1;return!0}function Ic(e,t,a,n,r,s){if(Es=s,ht=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Oi.current=e===null||e.memoizedState===null?F0:B0,e=a(n,r),vo){s=0;do{if(vo=!1,bo=0,25<=s)throw Error(ie(301));s+=1,zt=jt=null,t.updateQueue=null,Oi.current=U0,e=a(n,r)}while(vo)}if(Oi.current=Fi,t=jt!==null&&jt.next!==null,Es=0,zt=jt=ht=null,Li=!1,t)throw Error(ie(300));return e}function Rc(){var e=bo!==0;return bo=0,e}function sn(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return zt===null?ht.memoizedState=zt=e:zt=zt.next=e,zt}function Ia(){if(jt===null){var e=ht.alternate;e=e!==null?e.memoizedState:null}else e=jt.next;var t=zt===null?ht.memoizedState:zt.next;if(t!==null)zt=t,jt=e;else{if(e===null)throw Error(ie(310));jt=e,e={memoizedState:jt.memoizedState,baseState:jt.baseState,baseQueue:jt.baseQueue,queue:jt.queue,next:null},zt===null?ht.memoizedState=zt=e:zt=zt.next=e}return zt}function yo(e,t){return typeof t=="function"?t(e):t}function Ac(e){var t=Ia(),a=t.queue;if(a===null)throw Error(ie(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((Es&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,$s|=u}c=c.next}while(c!==null&&c!==s);l===null?o=n:l.next=i,Ua(n,t.memoizedState)||(ua=!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,$s|=s,r=r.next;while(r!==e)}else r===null&&(a.lanes=0);return[t.memoizedState,a.dispatch]}function jc(e){var t=Ia(),a=t.queue;if(a===null)throw Error(ie(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);Ua(s,t.memoizedState)||(ua=!0),t.memoizedState=s,t.baseQueue===null&&(t.baseState=s),a.lastRenderedState=s}return[s,n]}function ag(){}function ng(e,t){var a=ht,n=Ia(),r=t(),s=!Ua(n.memoizedState,r);if(s&&(n.memoizedState=r,ua=!0),n=n.queue,Dc(og.bind(null,a,n,e),[e]),n.getSnapshot!==t||s||zt!==null&&zt.memoizedState.tag&1){if(a.flags|=2048,xo(9,rg.bind(null,a,n,r,t),void 0,null),Ft===null)throw Error(ie(349));Es&30||sg(a,t,r)}return r}function sg(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 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!Ua(e,a)}catch{return!0}}function lg(e){var t=bn(e,1);t!==null&&Ga(t,e,1,-1)}function dg(e){var t=sn();return typeof e=="function"&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:yo,lastRenderedState:e},t.queue=e,e=e.dispatch=z0.bind(null,ht,e),[t.memoizedState,e]}function xo(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 cg(){return Ia().memoizedState}function Mi(e,t,a,n){var r=sn();ht.flags|=e,r.memoizedState=xo(1|t,a,void 0,n===void 0?null:n)}function zi(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&&_c(n,o.deps)){r.memoizedState=xo(t,a,s,n);return}}ht.flags|=e,r.memoizedState=xo(1|t,a,s,n)}function ug(e,t){return Mi(8390656,8,e,t)}function Dc(e,t){return zi(2048,8,e,t)}function pg(e,t){return zi(4,2,e,t)}function fg(e,t){return zi(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,zi(4,4,mg.bind(null,t,e),a)}function Oc(){}function hg(e,t){var a=Ia();t=t===void 0?null:t;var n=a.memoizedState;return n!==null&&t!==null&&_c(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&&_c(t,n[1])?n[0]:(e=e(),a.memoizedState=[e,t],e)}function bg(e,t,a){return Es&21?(Ua(a,t)||(a=Kf(),ht.lanes|=a,$s|=a,e.baseState=!0),t):(e.baseState&&(e.baseState=!1,ua=!0),e.memoizedState=a)}function L0(e,t){var a=Qe;Qe=a!==0&&4>a?a:4,e(!0);var n=Pc.transition;Pc.transition={};try{e(!1),t()}finally{Qe=a,Pc.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=ra();Ga(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,Ua(i,o)){var l=t.interleaved;l===null?(r.next=r,Nc(t)):(r.next=l.next,l.next=r),t.interleaved=r;return}}catch{}finally{}a=Xm(e,t,r,n),a!==null&&(r=ra(),Ga(a,e,n,r),kg(a,t,n))}}function xg(e){var t=e.alternate;return e===ht||t!==null&&t===ht}function wg(e,t){vo=Li=!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,Md(e,a)}}var Fi={readContext:_a,useCallback:Zt,useContext:Zt,useEffect:Zt,useImperativeHandle:Zt,useInsertionEffect:Zt,useLayoutEffect:Zt,useMemo:Zt,useReducer:Zt,useRef:Zt,useState:Zt,useDebugValue:Zt,useDeferredValue:Zt,useTransition:Zt,useMutableSource:Zt,useSyncExternalStore:Zt,useId:Zt,unstable_isNewReconciler:!1},F0={readContext:_a,useCallback:function(e,t){return sn().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,Mi(4194308,4,mg.bind(null,t,e),a)},useLayoutEffect:function(e,t){return Mi(4194308,4,e,t)},useInsertionEffect:function(e,t){return Mi(4,2,e,t)},useMemo:function(e,t){var a=sn();return t=t===void 0?null:t,e=e(),a.memoizedState=[e,t],e},useReducer:function(e,t,a){var n=sn();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,ht,e),[n.memoizedState,e]},useRef:function(e){var t=sn();return e={current:e},t.memoizedState=e},useState:dg,useDebugValue:Oc,useDeferredValue:function(e){return sn().memoizedState=e},useTransition:function(){var e=dg(!1),t=e[0];return e=L0.bind(null,e[1]),sn().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,a){var n=ht,r=sn();if(ct){if(a===void 0)throw Error(ie(407));a=a()}else{if(a=t(),Ft===null)throw Error(ie(349));Es&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,xo(9,rg.bind(null,n,s,a,t),void 0,null),a},useId:function(){var e=sn(),t=Ft.identifierPrefix;if(ct){var a=vn,n=hn;a=(n&~(1<<32-Ba(n)-1)).toString(32)+a,t=":"+t+"R"+a,a=bo++,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:Dc,useImperativeHandle:gg,useInsertionEffect:pg,useLayoutEffect:fg,useMemo:vg,useReducer:Ac,useRef:cg,useState:function(){return Ac(yo)},useDebugValue:Oc,useDeferredValue:function(e){var t=Ia();return bg(t,jt.memoizedState,e)},useTransition:function(){var e=Ac(yo)[0],t=Ia().memoizedState;return[e,t]},useMutableSource:ag,useSyncExternalStore:ng,useId:yg,unstable_isNewReconciler:!1},U0={readContext:_a,useCallback:hg,useContext:_a,useEffect:Dc,useImperativeHandle:gg,useInsertionEffect:pg,useLayoutEffect:fg,useMemo:vg,useReducer:jc,useRef:cg,useState:function(){return jc(yo)},useDebugValue:Oc,useDeferredValue:function(e){var t=Ia();return jt===null?t.memoizedState=e:bg(t,jt.memoizedState,e)},useTransition:function(){var e=jc(yo)[0],t=Ia().memoizedState;return[e,t]},useMutableSource:ag,useSyncExternalStore:ng,useId:yg,unstable_isNewReconciler:!1};function Va(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 Lc(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 Bi={isMounted:function(e){return(e=e._reactInternals)?ys(e)===e:!1},enqueueSetState:function(e,t,a){e=e._reactInternals;var n=ra(),r=ss(e),s=yn(n,r);s.payload=t,a!=null&&(s.callback=a),t=es(e,s,r),t!==null&&(Ga(t,e,r,n),Ai(t,e,r))},enqueueReplaceState:function(e,t,a){e=e._reactInternals;var n=ra(),r=ss(e),s=yn(n,r);s.tag=1,s.payload=t,a!=null&&(s.callback=a),t=es(e,s,r),t!==null&&(Ga(t,e,r,n),Ai(t,e,r))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var a=ra(),n=ss(e),r=yn(a,n);r.tag=2,t!=null&&(r.callback=t),t=es(e,r,n),t!==null&&(Ga(t,e,n,a),Ai(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?!ro(a,n)||!ro(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=ca(t)?ws:Xt.current,n=t.contextTypes,s=(n=n!=null)?ar(e,r):Xn),t=new t(a,s),e.memoizedState=t.state!==null&&t.state!==void 0?t.state:null,t.updater=Bi,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&&Bi.enqueueReplaceState(t,t.state,null)}function Mc(e,t,a,n){var r=e.stateNode;r.props=a,r.state=e.memoizedState,r.refs={},Sc(e);var s=t.contextType;typeof s=="object"&&s!==null?r.context=_a(s):(s=ca(t)?ws:Xt.current,r.context=ar(e,s)),r.state=e.memoizedState,s=t.getDerivedStateFromProps,typeof s=="function"&&(Lc(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&&Bi.enqueueReplaceState(r,r.state,null),ji(e,a,r,n),r.state=e.memoizedState),typeof r.componentDidMount=="function"&&(e.flags|=4194308)}function cr(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 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 w=t.memoizedState;i!==p||f!==w||ia.current||Jn?(typeof v=="function"&&(Oc(t,a,v,n),w=t.memoizedState),(c=Jn||Ng(t,a,c,n,f,w,l)||!1)?(u||typeof o.UNSAFE_componentWillUpdate!="function"&&typeof o.componentWillUpdate!="function"||(typeof o.componentWillUpdate=="function"&&o.componentWillUpdate(n,w,l),typeof o.UNSAFE_componentWillUpdate=="function"&&o.UNSAFE_componentWillUpdate(n,w,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=w),o.props=n,o.state=w,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&&Nt()>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*Nt()-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=Nt(),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){yt(e,t,n)}else a.current=null}function Gc(e,t,a){try{a()}catch(n){yt(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 w=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(w!==null){var y=w.memoizedProps,k=w.memoizedState,g=t.stateNode,d=g.getSnapshotBeforeUpdate(t.elementType===t.type?y:qa(t.type,y),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(b){yt(t,t.return,b)}if(e=t.sibling,e!==null){e.return=t.return,pe=e;break}pe=t.return}return w=Wg,Wg=!1,w}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){yt(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){yt(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(y){yt(e,e.return,y)}try{wo(5,e,e.return)}catch(y){yt(e,e.return,y)}}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(y){yt(e,e.return,y)}}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(y){yt(e,e.return,y)}}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(y){yt(e,e.return,y)}}break;case 3:if(Wa(t,e),an(e),n&4&&a!==null&&a.memoizedState.isDehydrated)try{Zr(t.containerInfo)}catch(y){yt(e,e.return,y)}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=Nt())),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 w=f.stateNode;if(typeof w.componentWillUnmount=="function"){n=f,a=f.return;try{t=n,w.props=t.memoizedProps,w.state=t.memoizedState,w.componentWillUnmount()}catch(y){yt(n,a,y)}}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(y){yt(e,e.return,y)}}}else if(p.tag===6){if(u===null)try{p.stateNode.nodeValue=c?"":p.memoizedProps}catch(y){yt(e,e.return,y)}}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){yt(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){yt(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){yt(t,a,l)}break;case 1:var n=t.stateNode;if(typeof n.componentDidMount=="function"){var r=t.return;try{n.componentDidMount()}catch(l){yt(t,r,l)}}var s=t.return;try{Kc(t)}catch(l){yt(t,s,l)}break;case 5:var o=t.return;try{Kc(t)}catch(l){yt(t,o,l)}}}catch(l){yt(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,Tt=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?Nt():Qi!==-1?Qi:Qi=Nt()}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=Nt()+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=Nt()+500,Ts(e,t));do try{t1();break}catch(i){sh(e,i)}while(!0);yc(),Wi.current=s,qe=r,Tt!==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,Nt()),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,Nt()),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-Nt(),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=Nt()-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,Nt()),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,Nt()),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,Nt()),a;if(a===6)throw Error(oe(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,Ps(e,ca,yn),ua(e,Nt()),null}function su(e,t){var a=qe;qe|=1;try{return e(t)}finally{qe=a,qe===0&&(pr=Nt()+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)),Tt!==null)for(a=Tt.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,Tt=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=Tt;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,Tt=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 w=t.updateQueue;if(w===null){var y=new Set;y.add(l),t.updateQueue=y}else w.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 b=$g(s,i,t);Jm(s,b);break e}}s=s.return}while(s!==null)}ih(a)}catch(S){t=S,Tt===a&&a!==null&&(Tt=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,Tt!==null)throw Error(oe(261));return Ft=null,Ht=0,Dt}function e1(){for(;Tt!==null;)oh(Tt)}function t1(){for(;Tt!==null&&!Ew();)oh(Tt)}function oh(e){var t=ch(e.alternate,e,wa);e.memoizedProps=e.pendingProps,t===null?ih(e):Tt=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,Tt=a;return}if(e!==null)e.flags|=32768,e.subtreeFlags=0,e.deletions=null;else{Dt=6,Tt=null;return}}else if(a=G0(a,t,wa),a!==null){Tt=a;return}if(t=t.sibling,t!==null){Tt=t;return}Tt=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&&(Tt=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,Nt()),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 w=s.alternate;if(w!==null){var y=w.child;if(y!==null){w.child=null;do{var k=y.sibling;y.sibling=null,y=k}while(y!==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){yt(i,i.return,S)}if(i===o){pe=null;break e}var b=i.sibling;if(b!==null){b.return=i.return,pe=b;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 yt(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>Nt()-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,Nt()),!(qe&6)&&(pr=Nt()+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:{}},
|
|
854
|
+
`+s.stack}return{value:e,source:t,stack:r,digest:null}}function zc(e,t,a){return{value:e,source:null,stack:a??null,digest:t??null}}function Fc(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=yn(-1,a),a.tag=3,a.payload={element:null};var n=t.value;return a.callback=function(){Ki||(Ki=!0,tu=n),Fc(e,t)},a}function $g(e,t,a){a=yn(-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(){Fc(e,t)}}var s=e.stateNode;return s!==null&&typeof s.componentDidCatch=="function"&&(a.callback=function(){Fc(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=yn(-1,1),t.tag=2,es(a,t,1))),a.lanes|=1),e)}var V0=fn.ReactCurrentOwner,ua=!1;function sa(e,t,a,n){t.child=e===null?Qm(t,null,a,n):or(t,e.child,a,n)}function Ig(e,t,a,n,r){a=a.render;var s=t.ref;return lr(t,r),n=Ic(e,t,a,n,s,r),a=Rc(),e!==null&&!ua?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~r,xn(e,t,r)):(ct&&a&&mc(t),t.flags|=1,sa(e,t,n,r),t.child)}function Rg(e,t,a,n,r){if(e===null){var s=a.type;return typeof s=="function"&&!lu(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=el(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:ro,a(o,n)&&e.ref===t.ref)return xn(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(ro(s,n)&&e.ref===t.ref)if(ua=!1,t.pendingProps=n=s,(e.lanes&r)!==0)e.flags&131072&&(ua=!0);else return t.lanes=e.lanes,xn(e,t,r)}return Bc(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(pr,ka),ka|=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(pr,ka),ka|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},n=s!==null?s.baseLanes:a,nt(pr,ka),ka|=n}else s!==null?(n=s.baseLanes|a,t.memoizedState=null):n=a,nt(pr,ka),ka|=n;return sa(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 Bc(e,t,a,n,r){var s=ca(a)?ws:Xt.current;return s=ar(t,s),lr(t,r),a=Ic(e,t,a,n,s,r),n=Rc(),e!==null&&!ua?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~r,xn(e,t,r)):(ct&&n&&mc(t),t.flags|=1,sa(e,t,a,r),t.child)}function Og(e,t,a,n,r){if(ca(a)){var s=!0;Ci(t)}else s=!1;if(lr(t,r),t.stateNode===null)qi(e,t),Sg(t,a,n),Mc(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=ca(a)?ws:Xt.current,c=ar(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,ji(t,n,o,r),l=t.memoizedState,i!==n||f!==l||da.current||Jn?(typeof u=="function"&&(Lc(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:Va(t.type,i),o.props=c,p=t.pendingProps,f=o.context,l=a.contextType,typeof l=="object"&&l!==null?l=_a(l):(l=ca(a)?ws:Xt.current,l=ar(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,ji(t,n,o,r);var w=t.memoizedState;i!==p||f!==w||da.current||Jn?(typeof v=="function"&&(Lc(t,a,v,n),w=t.memoizedState),(c=Jn||Ng(t,a,c,n,f,w,l)||!1)?(u||typeof o.UNSAFE_componentWillUpdate!="function"&&typeof o.componentWillUpdate!="function"||(typeof o.componentWillUpdate=="function"&&o.componentWillUpdate(n,w,l),typeof o.UNSAFE_componentWillUpdate=="function"&&o.UNSAFE_componentWillUpdate(n,w,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=w),o.props=n,o.state=w,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 Uc(e,t,a,n,s,r)}function Uc(e,t,a,n,r,s){Dg(e,t);var o=(t.flags&128)!==0;if(!n&&!o)return r&&Bm(t,a,!1),xn(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=or(t,e.child,null,s),t.child=or(t,null,i,s)):sa(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),Cc(e,t.containerInfo)}function Mg(e,t,a,n,r){return rr(),bc(r),t.flags|=256,sa(e,t,a,n),t.child}var qc={dehydrated:null,treeContext:null,retryLane:0};function Vc(e){return{baseLanes:e,cachePool:null,transitions:null}}function zg(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),nt(gt,r&1),e===null)return vc(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=tl(o,n,0,null),e=Is(e,n,a,null),s.return=t,e.return=t,s.sibling=e,t.child=s,t.child.memoizedState=Vc(a),t.memoizedState=qc,e):Wc(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=Is(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?Vc(a):{baseLanes:o.baseLanes|a,cachePool:null,transitions:o.transitions},s.memoizedState=o,s.childLanes=e.childLanes&~a,t.memoizedState=qc,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 Wc(e,t){return t=tl({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function Ui(e,t,a,n){return n!==null&&bc(n),or(t,e.child,null,a),e=Wc(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=zc(Error(ie(422))),Ui(e,t,o,n)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(s=n.fallback,r=t.mode,n=tl({mode:"visible",children:n.children},r,0,null),s=Is(s,r,o,null),s.flags|=2,n.return=t,s.return=t,n.sibling=s,t.child=n,t.mode&1&&or(t,e.child,null,o),t.child.memoizedState=Vc(o),t.memoizedState=qc,s);if(!(t.mode&1))return Ui(e,t,o,null);if(r.data==="$!"){if(n=r.nextSibling&&r.nextSibling.dataset,n)var i=n.dgst;return n=i,s=Error(ie(419)),n=zc(s,n,void 0),Ui(e,t,o,n)}if(i=(o&e.childLanes)!==0,ua||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,bn(e,r),Ga(n,e,r,-1))}return iu(),n=zc(Error(ie(421))),Ui(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,wa=Yn(r.nextSibling),xa=t,ct=!0,qa=null,e!==null&&(Ta[Pa++]=hn,Ta[Pa++]=vn,Ta[Pa++]=ks,hn=e.id,vn=e.overflow,ks=t),t=Wc(t,n.children),t.flags|=4096,t)}function Fg(e,t,a){e.lanes|=t;var n=e.alternate;n!==null&&(n.lanes|=t),kc(e.return,t,a)}function Hc(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(sa(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&&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(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&&Di(e)===null&&(r=a),a=a.sibling;a=r,a===null?(r=t.child,t.child=null):(r=a.sibling,a.sibling=null),Hc(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&&Di(e)===null){t.child=r;break}e=r.sibling,r.sibling=a,a=r,r=e}Hc(t,!0,a,null,s);break;case"together":Hc(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function qi(e,t){!(t.mode&1)&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function xn(e,t,a){if(e!==null&&(t.dependencies=e.dependencies),$s|=t.lanes,!(a&t.childLanes))return null;if(e!==null&&t.child!==e.child)throw Error(ie(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),rr();break;case 5:tg(t);break;case 1:ca(t.type)&&Ci(t);break;case 4:Cc(t,t.stateNode.containerInfo);break;case 10:var n=t.type._context,r=t.memoizedProps.value;nt(Ii,n._currentValue),n._currentValue=r;break;case 13:if(n=t.memoizedState,n!==null)return n.dehydrated!==null?(nt(gt,gt.current&1),t.flags|=128,null):a&t.child.childLanes?zg(e,t,a):(nt(gt,gt.current&1),e=xn(e,t,a),e!==null?e.sibling:null);nt(gt,gt.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(gt,gt.current),n)break;return null;case 22:case 23:return t.lanes=0,jg(e,t,a)}return xn(e,t,a)}var Ug,Gc,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}},Gc=function(){},qg=function(e,t,a,n){var r=e.memoizedProps;if(r!==n){e=t.stateNode,Cs(nn.current);var s=null;switch(a){case"input":r=kd(e,r),n=kd(e,n),s=[];break;case"select":r=mt({},r,{value:void 0}),n=mt({},n,{value:void 0}),s=[];break;case"textarea":r=Cd(e,r),n=Cd(e,n),s=[];break;default:typeof r.onClick!="function"&&typeof n.onClick=="function"&&(e.onclick=ki)}$d(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"&&(Mr.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"&&(Mr.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 wo(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 Jt(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(gc(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Jt(t),null;case 1:return ca(t.type)&&Si(),Jt(t),null;case 3:return n=t.stateNode,dr(),it(da),it(Xt),Tc(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),(e===null||e.child===null)&&(Pi(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&!(t.flags&256)||(t.flags|=1024,qa!==null&&(su(qa),qa=null))),Gc(e,t),Jt(t),null;case 5:Ec(t);var r=Cs(ho.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(ie(166));return Jt(t),null}if(e=Cs(nn.current),Pi(t)){n=t.stateNode,a=t.type;var s=t.memoizedProps;switch(n[an]=t,n[uo]=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<io.length;r++)ot(io[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)}$d(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&&wi(n.textContent,i,e),r=["children",i]):typeof i=="number"&&n.textContent!==""+i&&(s.suppressHydrationWarning!==!0&&wi(n.textContent,i,e),r=["children",""+i]):Mr.hasOwnProperty(o)&&i!=null&&o==="onScroll"&&ot("scroll",n)}switch(a){case"input":Zo(n),Ef(n,s,!0);break;case"textarea":Zo(n),Pf(n);break;case"select":case"option":break;default:typeof s.onClick=="function"&&(n.onclick=ki)}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[an]=t,e[uo]=n,Ug(e,t,!1,!1),t.stateNode=e;e:{switch(o=Td(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<io.length;r++)ot(io[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=kd(e,n),ot("invalid",e);break;case"option":r=n;break;case"select":e._wrapperState={wasMultiple:!!n.multiple},r=mt({},n,{value:void 0}),ot("invalid",e);break;case"textarea":$f(e,n),r=Cd(e,n),ot("invalid",e);break;default:r=n}$d(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!=="")&&Ur(e,l):typeof l=="number"&&Ur(e,""+l):s!=="suppressContentEditableWarning"&&s!=="suppressHydrationWarning"&&s!=="autoFocus"&&(Mr.hasOwnProperty(s)?l!=null&&s==="onScroll"&&ot("scroll",e):l!=null&&ud(e,s,l,o))}switch(a){case"input":Zo(e),Ef(e,n,!1);break;case"textarea":Zo(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?Vs(e,!!n.multiple,s,!1):n.defaultValue!=null&&Vs(e,!!n.multiple,n.defaultValue,!0);break;default:typeof r.onClick=="function"&&(e.onclick=ki)}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 Jt(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(ie(166));if(a=Cs(ho.current),Cs(nn.current),Pi(t)){if(n=t.stateNode,a=t.memoizedProps,n[an]=t,(s=n.nodeValue!==a)&&(e=xa,e!==null))switch(e.tag){case 3:wi(n.nodeValue,a,(e.mode&1)!==0);break;case 5:e.memoizedProps.suppressHydrationWarning!==!0&&wi(n.nodeValue,a,(e.mode&1)!==0)}s&&(t.flags|=4)}else n=(a.nodeType===9?a:a.ownerDocument).createTextNode(n),n[an]=t,t.stateNode=n}return Jt(t),null;case 13:if(it(gt),n=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(ct&&wa!==null&&t.mode&1&&!(t.flags&128))Gm(),rr(),t.flags|=98560,s=!1;else if(s=Pi(t),n!==null&&n.dehydrated!==null){if(e===null){if(!s)throw Error(ie(318));if(s=t.memoizedState,s=s!==null?s.dehydrated:null,!s)throw Error(ie(317));s[an]=t}else rr(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Jt(t),s=!1}else qa!==null&&(su(qa),qa=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?Dt===0&&(Dt=3):iu())),t.updateQueue!==null&&(t.flags|=4),Jt(t),null);case 4:return dr(),Gc(e,t),e===null&&lo(t.stateNode.containerInfo),Jt(t),null;case 10:return wc(t.type._context),Jt(t),null;case 17:return ca(t.type)&&Si(),Jt(t),null;case 19:if(it(gt),s=t.memoizedState,s===null)return Jt(t),null;if(n=(t.flags&128)!==0,o=s.rendering,o===null)if(n)wo(s,!1);else{if(Dt!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=Di(e),o!==null){for(t.flags|=128,wo(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(gt,gt.current&1|2),t.child}e=e.sibling}s.tail!==null&&Nt()>fr&&(t.flags|=128,n=!0,wo(s,!1),t.lanes=4194304)}else{if(!n)if(e=Di(o),e!==null){if(t.flags|=128,n=!0,a=e.updateQueue,a!==null&&(t.updateQueue=a,t.flags|=4),wo(s,!0),s.tail===null&&s.tailMode==="hidden"&&!o.alternate&&!ct)return Jt(t),null}else 2*Nt()-s.renderingStartTime>fr&&a!==1073741824&&(t.flags|=128,n=!0,wo(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=Nt(),t.sibling=null,a=gt.current,nt(gt,n?a&1|2:a&1),t):(Jt(t),null);case 22:case 23:return ou(),n=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==n&&(t.flags|=8192),n&&t.mode&1?ka&1073741824&&(Jt(t),t.subtreeFlags&6&&(t.flags|=8192)):Jt(t),null;case 24:return null;case 25:return null}throw Error(ie(156,t.tag))}function K0(e,t){switch(gc(t),t.tag){case 1:return ca(t.type)&&Si(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return dr(),it(da),it(Xt),Tc(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return Ec(t),null;case 13:if(it(gt),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(ie(340));rr()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return it(gt),null;case 4:return dr(),null;case 10:return wc(t.type._context),null;case 22:case 23:return ou(),null;case 24:return null;default:return null}}var Vi=!1,ea=!1,Y0=typeof WeakSet=="function"?WeakSet:Set,fe=null;function ur(e,t){var a=e.ref;if(a!==null)if(typeof a=="function")try{a(null)}catch(n){yt(e,t,n)}else a.current=null}function Kc(e,t,a){try{a()}catch(n){yt(e,t,n)}}var Wg=!1;function Q0(e,t){if(oc=ci,e=Nm(),Zd(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(ic={focusedElem:e,selectionRange:a},ci=!1,fe=t;fe!==null;)if(t=fe,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,fe=e;else for(;fe!==null;){t=fe;try{var w=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(w!==null){var y=w.memoizedProps,k=w.memoizedState,g=t.stateNode,d=g.getSnapshotBeforeUpdate(t.elementType===t.type?y:Va(t.type,y),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(ie(163))}}catch(b){yt(t,t.return,b)}if(e=t.sibling,e!==null){e.return=t.return,fe=e;break}fe=t.return}return w=Wg,Wg=!1,w}function ko(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&&Kc(t,a,s)}r=r.next}while(r!==n)}}function Wi(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 Yc(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[an],delete t[uo],delete t[uc],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 Qc(e,t,a){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?a.nodeType===8?a.parentNode.insertBefore(e,t):a.insertBefore(e,t):(a.nodeType===8?(t=a.parentNode,t.insertBefore(e,a)):(t=a,t.appendChild(e)),a=a._reactRootContainer,a!=null||t.onclick!==null||(t.onclick=ki));else if(n!==4&&(e=e.child,e!==null))for(Qc(e,t,a),e=e.sibling;e!==null;)Qc(e,t,a),e=e.sibling}function Xc(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(Xc(e,t,a),e=e.sibling;e!==null;)Xc(e,t,a),e=e.sibling}var Ht=null,Wa=!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(tn&&typeof tn.onCommitFiberUnmount=="function")try{tn.onCommitFiberUnmount(si,a)}catch{}switch(a.tag){case 5:ea||ur(a,t);case 6:var n=Ht,r=Wa;Ht=null,ts(e,t,a),Ht=n,Wa=r,Ht!==null&&(Wa?(e=Ht,a=a.stateNode,e.nodeType===8?e.parentNode.removeChild(a):e.removeChild(a)):Ht.removeChild(a.stateNode));break;case 18:Ht!==null&&(Wa?(e=Ht,a=a.stateNode,e.nodeType===8?cc(e.parentNode,a):e.nodeType===1&&cc(e,a),Jr(e)):cc(Ht,a.stateNode));break;case 4:n=Ht,r=Wa,Ht=a.stateNode.containerInfo,Wa=!0,ts(e,t,a),Ht=n,Wa=r;break;case 0:case 11:case 14:case 15:if(!ea&&(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)&&Kc(a,t,o),r=r.next}while(r!==n)}ts(e,t,a);break;case 1:if(!ea&&(ur(a,t),n=a.stateNode,typeof n.componentWillUnmount=="function"))try{n.props=a.memoizedProps,n.state=a.memoizedState,n.componentWillUnmount()}catch(i){yt(a,t,i)}ts(e,t,a);break;case 21:ts(e,t,a);break;case 22:a.mode&1?(ea=(n=ea)||a.memoizedState!==null,ts(e,t,a),ea=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 Ha(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:Ht=i.stateNode,Wa=!1;break e;case 3:Ht=i.stateNode.containerInfo,Wa=!0;break e;case 4:Ht=i.stateNode.containerInfo,Wa=!0;break e}i=i.return}if(Ht===null)throw Error(ie(160));Yg(s,o,r),Ht=null,Wa=!1;var l=r.alternate;l!==null&&(l.return=null),r.return=null}catch(c){yt(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(Ha(t,e),rn(e),n&4){try{ko(3,e,e.return),Wi(3,e)}catch(y){yt(e,e.return,y)}try{ko(5,e,e.return)}catch(y){yt(e,e.return,y)}}break;case 1:Ha(t,e),rn(e),n&512&&a!==null&&ur(a,a.return);break;case 5:if(Ha(t,e),rn(e),n&512&&a!==null&&ur(a,a.return),e.flags&32){var r=e.stateNode;try{Ur(r,"")}catch(y){yt(e,e.return,y)}}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),Td(i,o);var c=Td(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"?Ur(r,p):ud(r,u,p,c)}switch(i){case"input":Nd(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?Vs(r,!!s.multiple,v,!1):f!==!!s.multiple&&(s.defaultValue!=null?Vs(r,!!s.multiple,s.defaultValue,!0):Vs(r,!!s.multiple,s.multiple?[]:"",!1))}r[uo]=s}catch(y){yt(e,e.return,y)}}break;case 6:if(Ha(t,e),rn(e),n&4){if(e.stateNode===null)throw Error(ie(162));r=e.stateNode,s=e.memoizedProps;try{r.nodeValue=s}catch(y){yt(e,e.return,y)}}break;case 3:if(Ha(t,e),rn(e),n&4&&a!==null&&a.memoizedState.isDehydrated)try{Jr(t.containerInfo)}catch(y){yt(e,e.return,y)}break;case 4:Ha(t,e),rn(e);break;case 13:Ha(t,e),rn(e),r=e.child,r.flags&8192&&(s=r.memoizedState!==null,r.stateNode.isHidden=s,!s||r.alternate!==null&&r.alternate.memoizedState!==null||(eu=Nt())),n&4&&Qg(e);break;case 22:if(u=a!==null&&a.memoizedState!==null,e.mode&1?(ea=(c=ea)||u,Ha(t,e),ea=c):Ha(t,e),rn(e),n&8192){if(c=e.memoizedState!==null,(e.stateNode.isHidden=c)&&!u&&e.mode&1)for(fe=e,u=e.child;u!==null;){for(p=fe=u;fe!==null;){switch(f=fe,v=f.child,f.tag){case 0:case 11:case 14:case 15:ko(4,f,f.return);break;case 1:ur(f,f.return);var w=f.stateNode;if(typeof w.componentWillUnmount=="function"){n=f,a=f.return;try{t=n,w.props=t.memoizedProps,w.state=t.memoizedState,w.componentWillUnmount()}catch(y){yt(n,a,y)}}break;case 5:ur(f,f.return);break;case 22:if(f.memoizedState!==null){eh(p);continue}}v!==null?(v.return=f,fe=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(y){yt(e,e.return,y)}}}else if(p.tag===6){if(u===null)try{p.stateNode.nodeValue=c?"":p.memoizedProps}catch(y){yt(e,e.return,y)}}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:Ha(t,e),rn(e),n&4&&Qg(e);break;case 21:break;default:Ha(t,e),rn(e)}}function rn(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(ie(160))}switch(n.tag){case 5:var r=n.stateNode;n.flags&32&&(Ur(r,""),n.flags&=-33);var s=Kg(e);Xc(e,s,r);break;case 3:case 4:var o=n.stateNode.containerInfo,i=Kg(e);Qc(e,i,o);break;default:throw Error(ie(161))}}catch(l){yt(e,e.return,l)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function X0(e,t,a){fe=e,Zg(e)}function Zg(e,t,a){for(var n=(e.mode&1)!==0;fe!==null;){var r=fe,s=r.child;if(r.tag===22&&n){var o=r.memoizedState!==null||Vi;if(!o){var i=r.alternate,l=i!==null&&i.memoizedState!==null||ea;i=Vi;var c=ea;if(Vi=o,(ea=l)&&!c)for(fe=r;fe!==null;)o=fe,l=o.child,o.tag===22&&o.memoizedState!==null?th(r):l!==null?(l.return=o,fe=l):th(r);for(;s!==null;)fe=s,Zg(s),s=s.sibling;fe=r,Vi=i,ea=c}Jg(e)}else r.subtreeFlags&8772&&s!==null?(s.return=r,fe=s):Jg(e)}}function Jg(e){for(;fe!==null;){var t=fe;if(t.flags&8772){var a=t.alternate;try{if(t.flags&8772)switch(t.tag){case 0:case 11:case 15:ea||Wi(5,t);break;case 1:var n=t.stateNode;if(t.flags&4&&!ea)if(a===null)n.componentDidMount();else{var r=t.elementType===t.type?a.memoizedProps:Va(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&&Jr(p)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;default:throw Error(ie(163))}ea||t.flags&512&&Yc(t)}catch(f){yt(t,t.return,f)}}if(t===e){fe=null;break}if(a=t.sibling,a!==null){a.return=t.return,fe=a;break}fe=t.return}}function eh(e){for(;fe!==null;){var t=fe;if(t===e){fe=null;break}var a=t.sibling;if(a!==null){a.return=t.return,fe=a;break}fe=t.return}}function th(e){for(;fe!==null;){var t=fe;try{switch(t.tag){case 0:case 11:case 15:var a=t.return;try{Wi(4,t)}catch(l){yt(t,a,l)}break;case 1:var n=t.stateNode;if(typeof n.componentDidMount=="function"){var r=t.return;try{n.componentDidMount()}catch(l){yt(t,r,l)}}var s=t.return;try{Yc(t)}catch(l){yt(t,s,l)}break;case 5:var o=t.return;try{Yc(t)}catch(l){yt(t,o,l)}}}catch(l){yt(t,t.return,l)}if(t===e){fe=null;break}var i=t.sibling;if(i!==null){i.return=t.return,fe=i;break}fe=t.return}}var Z0=Math.ceil,Hi=fn.ReactCurrentDispatcher,Zc=fn.ReactCurrentOwner,Ra=fn.ReactCurrentBatchConfig,Ve=0,Ft=null,Tt=null,Gt=0,ka=0,pr=Qn(0),Dt=0,No=null,$s=0,Gi=0,Jc=0,So=null,pa=null,eu=0,fr=1/0,wn=null,Ki=!1,tu=null,as=null,Yi=!1,ns=null,Qi=0,Co=0,au=null,Xi=-1,Zi=0;function ra(){return Ve&6?Nt():Xi!==-1?Xi:Xi=Nt()}function ss(e){return e.mode&1?Ve&2&&Gt!==0?Gt&-Gt:D0.transition!==null?(Zi===0&&(Zi=Kf()),Zi):(e=Qe,e!==0||(e=window.event,e=e===void 0?16:nm(e.type)),e):1}function Ga(e,t,a,n){if(50<Co)throw Co=0,au=null,Error(ie(185));Kr(e,a,n),(!(Ve&2)||e!==Ft)&&(e===Ft&&(!(Ve&2)&&(Gi|=a),Dt===4&&rs(e,Gt)),fa(e,n),a===1&&Ve===0&&!(t.mode&1)&&(fr=Nt()+500,Ei&&Zn()))}function fa(e,t){var a=e.callbackNode;Dw(e,t);var n=ii(e,e===Ft?Gt: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(){!(Ve&6)&&Zn()}),a=null;else{switch(Yf(n)){case 1:a=Dd;break;case 4:a=Hf;break;case 16:a=ni;break;case 536870912:a=Gf;break;default:a=ni}a=uh(a,ah.bind(null,e))}e.callbackPriority=t,e.callbackNode=a}}function ah(e,t){if(Xi=-1,Zi=0,Ve&6)throw Error(ie(327));var a=e.callbackNode;if(mr()&&e.callbackNode!==a)return null;var n=ii(e,e===Ft?Gt:0);if(n===0)return null;if(n&30||n&e.expiredLanes||t)t=Ji(e,n);else{t=n;var r=Ve;Ve|=2;var s=rh();(Ft!==e||Gt!==t)&&(wn=null,fr=Nt()+500,Ps(e,t));do try{t1();break}catch(i){sh(e,i)}while(!0);xc(),Hi.current=s,Ve=r,Tt!==null?t=0:(Ft=null,Gt=0,t=Dt)}if(t!==0){if(t===2&&(r=Od(e),r!==0&&(n=r,t=nu(e,r))),t===1)throw a=No,Ps(e,0),rs(e,n),fa(e,Nt()),a;if(t===6)rs(e,n);else{if(r=e.current.alternate,!(n&30)&&!J0(r)&&(t=Ji(e,n),t===2&&(s=Od(e),s!==0&&(n=s,t=nu(e,s))),t===1))throw a=No,Ps(e,0),rs(e,n),fa(e,Nt()),a;switch(e.finishedWork=r,e.finishedLanes=n,t){case 0:case 1:throw Error(ie(345));case 2:_s(e,pa,wn);break;case 3:if(rs(e,n),(n&130023424)===n&&(t=eu+500-Nt(),10<t)){if(ii(e,0)!==0)break;if(r=e.suspendedLanes,(r&n)!==n){ra(),e.pingedLanes|=e.suspendedLanes&r;break}e.timeoutHandle=dc(_s.bind(null,e,pa,wn),t);break}_s(e,pa,wn);break;case 4:if(rs(e,n),(n&4194240)===n)break;for(t=e.eventTimes,r=-1;0<n;){var o=31-Ba(n);s=1<<o,o=t[o],o>r&&(r=o),n&=~s}if(n=r,n=Nt()-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=dc(_s.bind(null,e,pa,wn),n);break}_s(e,pa,wn);break;case 5:_s(e,pa,wn);break;default:throw Error(ie(329))}}}return fa(e,Nt()),e.callbackNode===a?ah.bind(null,e):null}function nu(e,t){var a=So;return e.current.memoizedState.isDehydrated&&(Ps(e,t).flags|=256),e=Ji(e,t),e!==2&&(t=pa,pa=a,t!==null&&su(t)),e}function su(e){pa===null?pa=e:pa.push.apply(pa,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(!Ua(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&=~Jc,t&=~Gi,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var a=31-Ba(t),n=1<<a;e[a]=-1,t&=~n}}function nh(e){if(Ve&6)throw Error(ie(327));mr();var t=ii(e,0);if(!(t&1))return fa(e,Nt()),null;var a=Ji(e,t);if(e.tag!==0&&a===2){var n=Od(e);n!==0&&(t=n,a=nu(e,n))}if(a===1)throw a=No,Ps(e,0),rs(e,t),fa(e,Nt()),a;if(a===6)throw Error(ie(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,_s(e,pa,wn),fa(e,Nt()),null}function ru(e,t){var a=Ve;Ve|=1;try{return e(t)}finally{Ve=a,Ve===0&&(fr=Nt()+500,Ei&&Zn())}}function Ts(e){ns!==null&&ns.tag===0&&!(Ve&6)&&mr();var t=Ve;Ve|=1;var a=Ra.transition,n=Qe;try{if(Ra.transition=null,Qe=1,e)return e()}finally{Qe=n,Ra.transition=a,Ve=t,!(Ve&6)&&Zn()}}function ou(){ka=pr.current,it(pr)}function Ps(e,t){e.finishedWork=null,e.finishedLanes=0;var a=e.timeoutHandle;if(a!==-1&&(e.timeoutHandle=-1,P0(a)),Tt!==null)for(a=Tt.return;a!==null;){var n=a;switch(gc(n),n.tag){case 1:n=n.type.childContextTypes,n!=null&&Si();break;case 3:dr(),it(da),it(Xt),Tc();break;case 5:Ec(n);break;case 4:dr();break;case 13:it(gt);break;case 19:it(gt);break;case 10:wc(n.type._context);break;case 22:case 23:ou()}a=a.return}if(Ft=e,Tt=e=os(e.current,null),Gt=ka=t,Dt=0,No=null,Jc=Gi=$s=0,pa=So=null,Ss!==null){for(t=0;t<Ss.length;t++)if(a=Ss[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}Ss=null}return e}function sh(e,t){do{var a=Tt;try{if(xc(),Oi.current=Fi,Li){for(var n=ht.memoizedState;n!==null;){var r=n.queue;r!==null&&(r.pending=null),n=n.next}Li=!1}if(Es=0,zt=jt=ht=null,vo=!1,bo=0,Zc.current=null,a===null||a.return===null){Dt=1,No=t,Tt=null;break}e:{var s=e,o=a.return,i=a,l=t;if(t=Gt,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 w=t.updateQueue;if(w===null){var y=new Set;y.add(l),t.updateQueue=y}else w.add(l);break e}else{if(!(t&1)){Tg(s,c,t),iu();break e}l=Error(ie(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),bc(cr(l,i));break e}}s=l=cr(l,i),Dt!==4&&(Dt=2),So===null?So=[s]:So.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 b=$g(s,i,t);Jm(s,b);break e}}s=s.return}while(s!==null)}ih(a)}catch(S){t=S,Tt===a&&a!==null&&(Tt=a=a.return);continue}break}while(!0)}function rh(){var e=Hi.current;return Hi.current=Fi,e===null?Fi:e}function iu(){(Dt===0||Dt===3||Dt===2)&&(Dt=4),Ft===null||!($s&268435455)&&!(Gi&268435455)||rs(Ft,Gt)}function Ji(e,t){var a=Ve;Ve|=2;var n=rh();(Ft!==e||Gt!==t)&&(wn=null,Ps(e,t));do try{e1();break}catch(r){sh(e,r)}while(!0);if(xc(),Ve=a,Hi.current=n,Tt!==null)throw Error(ie(261));return Ft=null,Gt=0,Dt}function e1(){for(;Tt!==null;)oh(Tt)}function t1(){for(;Tt!==null&&!Ew();)oh(Tt)}function oh(e){var t=ch(e.alternate,e,ka);e.memoizedProps=e.pendingProps,t===null?ih(e):Tt=t,Zc.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,Tt=a;return}if(e!==null)e.flags|=32768,e.subtreeFlags=0,e.deletions=null;else{Dt=6,Tt=null;return}}else if(a=G0(a,t,ka),a!==null){Tt=a;return}if(t=t.sibling,t!==null){Tt=t;return}Tt=t=e}while(t!==null);Dt===0&&(Dt=5)}function _s(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 mr();while(ns!==null);if(Ve&6)throw Error(ie(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(ie(177));e.callbackNode=null,e.callbackPriority=0;var s=a.lanes|a.childLanes;if(Ow(e,s),e===Ft&&(Tt=Ft=null,Gt=0),!(a.subtreeFlags&2064)&&!(a.flags&2064)||Yi||(Yi=!0,uh(ni,function(){return mr(),null})),s=(a.flags&15990)!==0,a.subtreeFlags&15990||s){s=Ra.transition,Ra.transition=null;var o=Qe;Qe=1;var i=Ve;Ve|=4,Zc.current=null,Q0(e,a),Xg(a,e),k0(ic),ci=!!oc,ic=oc=null,e.current=a,X0(a),$w(),Ve=i,Qe=o,Ra.transition=s}else e.current=a;if(Yi&&(Yi=!1,ns=e,Qi=r),s=e.pendingLanes,s===0&&(as=null),_w(a.stateNode),fa(e,Nt()),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(Ki)throw Ki=!1,e=tu,tu=null,e;return Qi&1&&e.tag!==0&&mr(),s=e.pendingLanes,s&1?e===au?Co++:(Co=0,au=e):Co=0,Zn(),null}function mr(){if(ns!==null){var e=Yf(Qi),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,Qi=0,Ve&6)throw Error(ie(331));var r=Ve;for(Ve|=4,fe=e.current;fe!==null;){var s=fe,o=s.child;if(fe.flags&16){var i=s.deletions;if(i!==null){for(var l=0;l<i.length;l++){var c=i[l];for(fe=c;fe!==null;){var u=fe;switch(u.tag){case 0:case 11:case 15:ko(8,u,s)}var p=u.child;if(p!==null)p.return=u,fe=p;else for(;fe!==null;){u=fe;var f=u.sibling,v=u.return;if(Hg(u),u===c){fe=null;break}if(f!==null){f.return=v,fe=f;break}fe=v}}}var w=s.alternate;if(w!==null){var y=w.child;if(y!==null){w.child=null;do{var k=y.sibling;y.sibling=null,y=k}while(y!==null)}}fe=s}}if(s.subtreeFlags&2064&&o!==null)o.return=s,fe=o;else e:for(;fe!==null;){if(s=fe,s.flags&2048)switch(s.tag){case 0:case 11:case 15:ko(9,s,s.return)}var g=s.sibling;if(g!==null){g.return=s.return,fe=g;break e}fe=s.return}}var d=e.current;for(fe=d;fe!==null;){o=fe;var h=o.child;if(o.subtreeFlags&2064&&h!==null)h.return=o,fe=h;else e:for(o=d;fe!==null;){if(i=fe,i.flags&2048)try{switch(i.tag){case 0:case 11:case 15:Wi(9,i)}}catch(S){yt(i,i.return,S)}if(i===o){fe=null;break e}var b=i.sibling;if(b!==null){b.return=i.return,fe=b;break e}fe=i.return}}if(Ve=r,Zn(),tn&&typeof tn.onPostCommitFiberRoot=="function")try{tn.onPostCommitFiberRoot(si,e)}catch{}n=!0}return n}finally{Qe=a,Ra.transition=t}}return!1}function lh(e,t,a){t=cr(a,t),t=Eg(e,t,1),e=es(e,t,1),t=ra(),e!==null&&(Kr(e,1,t),fa(e,t))}function yt(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=cr(a,e),e=$g(t,e,1),t=es(t,e,1),e=ra(),t!==null&&(Kr(t,1,e),fa(t,e));break}}t=t.return}}function n1(e,t,a){var n=e.pingCache;n!==null&&n.delete(t),t=ra(),e.pingedLanes|=e.suspendedLanes&a,Ft===e&&(Gt&a)===a&&(Dt===4||Dt===3&&(Gt&130023424)===Gt&&500>Nt()-eu?Ps(e,0):Jc|=a),fa(e,t)}function dh(e,t){t===0&&(e.mode&1?(t=oi,oi<<=1,!(oi&130023424)&&(oi=4194304)):t=1);var a=ra();e=bn(e,t),e!==null&&(Kr(e,t,a),fa(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(ie(314))}n!==null&&n.delete(t),dh(e,a)}var ch;ch=function(e,t,a){if(e!==null)if(e.memoizedProps!==t.pendingProps||da.current)ua=!0;else{if(!(e.lanes&a)&&!(t.flags&128))return ua=!1,H0(e,t,a);ua=!!(e.flags&131072)}else ua=!1,ct&&t.flags&1048576&&qm(t,Ti,t.index);switch(t.lanes=0,t.tag){case 2:var n=t.type;qi(e,t),e=t.pendingProps;var r=ar(t,Xt.current);lr(t,a),r=Ic(null,t,n,e,r,a);var s=Rc();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,ca(n)?(s=!0,Ci(t)):s=!1,t.memoizedState=r.state!==null&&r.state!==void 0?r.state:null,Sc(t),r.updater=Bi,t.stateNode=r,r._reactInternals=t,Mc(t,n,e,a),t=Uc(null,t,n,!0,s,a)):(t.tag=0,ct&&s&&mc(t),sa(null,t,r,a),t=t.child),t;case 16:n=t.elementType;e:{switch(qi(e,t),e=t.pendingProps,r=n._init,n=r(n._payload),t.type=n,r=t.tag=i1(n),e=Va(n,e),r){case 0:t=Bc(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,Va(n.type,e),a);break e}throw Error(ie(306,n,""))}return t;case 0:return n=t.type,r=t.pendingProps,r=t.elementType===n?r:Va(n,r),Bc(e,t,n,r,a);case 1:return n=t.type,r=t.pendingProps,r=t.elementType===n?r:Va(n,r),Og(e,t,n,r,a);case 3:e:{if(Lg(t),e===null)throw Error(ie(387));n=t.pendingProps,s=t.memoizedState,r=s.element,Zm(e,t),ji(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=cr(Error(ie(423)),t),t=Mg(e,t,n,a,r);break e}else if(n!==r){r=cr(Error(ie(424)),t),t=Mg(e,t,n,a,r);break e}else for(wa=Yn(t.stateNode.containerInfo.firstChild),xa=t,ct=!0,qa=null,a=Qm(t,null,n,a),t.child=a;a;)a.flags=a.flags&-3|4096,a=a.sibling;else{if(rr(),n===r){t=xn(e,t,a);break e}sa(e,t,n,a)}t=t.child}return t;case 5:return tg(t),e===null&&vc(t),n=t.type,r=t.pendingProps,s=e!==null?e.memoizedProps:null,o=r.children,lc(n,r)?o=null:s!==null&&lc(n,s)&&(t.flags|=32),Dg(e,t),sa(e,t,o,a),t.child;case 6:return e===null&&vc(t),null;case 13:return zg(e,t,a);case 4:return Cc(t,t.stateNode.containerInfo),n=t.pendingProps,e===null?t.child=or(t,null,n,a):sa(e,t,n,a),t.child;case 11:return n=t.type,r=t.pendingProps,r=t.elementType===n?r:Va(n,r),Ig(e,t,n,r,a);case 7:return sa(e,t,t.pendingProps,a),t.child;case 8:return sa(e,t,t.pendingProps.children,a),t.child;case 12:return sa(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(Ii,n._currentValue),n._currentValue=o,s!==null)if(Ua(s.value,o)){if(s.children===r.children&&!da.current){t=xn(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=yn(-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),kc(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(ie(341));o.lanes|=a,i=o.alternate,i!==null&&(i.lanes|=a),kc(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}sa(e,t,r.children,a),t=t.child}return t;case 9:return r=t.type,n=t.pendingProps.children,lr(t,a),r=_a(r),n=n(r),t.flags|=1,sa(e,t,n,a),t.child;case 14:return n=t.type,r=Va(n,t.pendingProps),r=Va(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:Va(n,r),qi(e,t),t.tag=1,ca(n)?(e=!0,Ci(t)):e=!1,lr(t,a),Sg(t,n,r),Mc(t,n,r,a),Uc(null,t,n,!0,e,a);case 19:return Bg(e,t,a);case 22:return jg(e,t,a)}throw Error(ie(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 lu(e){return e=e.prototype,!(!e||!e.isReactComponent)}function i1(e){if(typeof e=="function")return lu(e)?1:0;if(e!=null){if(e=e.$$typeof,e===md)return 11;if(e===vd)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 el(e,t,a,n,r,s){var o=2;if(n=e,typeof e=="function")lu(e)&&(o=1);else if(typeof e=="string")o=5;else e:switch(e){case qs:return Is(a.children,r,s,t);case pd:o=8,r|=8;break;case fd:return e=Aa(12,a,t,r|2),e.elementType=fd,e.lanes=s,e;case gd:return e=Aa(13,a,t,r),e.elementType=gd,e.lanes=s,e;case hd:return e=Aa(19,a,t,r),e.elementType=hd,e.lanes=s,e;case xf:return tl(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 md:o=11;break e;case vd:o=14;break e;case Bn:o=16,n=null;break e}throw Error(ie(130,e==null?e:typeof e,""))}return t=Aa(o,a,t,r),t.elementType=e,t.type=n,t.lanes=s,t}function Is(e,t,a,n){return e=Aa(7,e,n,t),e.lanes=a,e}function tl(e,t,a,n){return e=Aa(22,e,n,t),e.elementType=xf,e.lanes=a,e.stateNode={isHidden:!1},e}function du(e,t,a){return e=Aa(6,e,null,t),e.lanes=a,e}function cu(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=Ld(0),this.expirationTimes=Ld(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Ld(0),this.identifierPrefix=n,this.onRecoverableError=r,this.mutableSourceEagerHydrationData=null}function uu(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},Sc(s),e}function d1(e,t,a){var n=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:Us,key:n==null?null:""+n,children:e,containerInfo:t,implementation:a}}function ph(e){if(!e)return Xn;e=e._reactInternals;e:{if(ys(e)!==e||e.tag!==1)throw Error(ie(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(ca(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(t!==null);throw Error(ie(171))}if(e.tag===1){var a=e.type;if(ca(a))return Fm(e,a,t)}return t}function fh(e,t,a,n,r,s,o,i,l){return e=uu(a,n,!0,e,r,s,o,i,l),e.context=ph(null),a=e.current,n=ra(),r=ss(a),s=yn(n,r),s.callback=t??null,es(a,s,r),e.current.lanes=r,Kr(e,r,n),fa(e,n),e}function al(e,t,a,n){var r=t.current,s=ra(),o=ss(r);return a=ph(a),t.context===null?t.context=a:t.pendingContext=a,t=yn(s,o),t.payload={element:e},n=n===void 0?null:n,n!==null&&(t.callback=n),e=es(r,t,o),e!==null&&(Ga(e,r,o,s),Ai(e,r,o)),o}function nl(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 pu(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 fu(e){this._internalRoot=e}sl.prototype.render=fu.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(ie(409));al(e,t,null,null)},sl.prototype.unmount=fu.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;Ts(function(){al(null,e,null,null)}),t[mn]=null}};function sl(e){this._internalRoot=e}sl.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 mu(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function rl(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=nl(o);s.call(c)}}var o=fh(t,n,e,0,null,!1,!1,"",hh);return e._reactRootContainer=o,e[mn]=o.current,lo(e.nodeType===8?e.parentNode:e),Ts(),o}for(;r=e.lastChild;)e.removeChild(r);if(typeof n=="function"){var i=n;n=function(){var c=nl(l);i.call(c)}}var l=uu(e,0,!1,null,null,!1,!1,"",hh);return e._reactRootContainer=l,e[mn]=l.current,lo(e.nodeType===8?e.parentNode:e),Ts(function(){al(t,l,a,n)}),l}function ol(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=nl(o);i.call(l)}}al(t,o,e,r)}else o=u1(a,t,e,r,n);return nl(o)}Qf=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var a=Gr(t.pendingLanes);a!==0&&(Md(t,a|1),fa(t,Nt()),!(Ve&6)&&(fr=Nt()+500,Zn()))}break;case 13:Ts(function(){var n=bn(e,1);if(n!==null){var r=ra();Ga(n,e,1,r)}}),pu(e,1)}},zd=function(e){if(e.tag===13){var t=bn(e,134217728);if(t!==null){var a=ra();Ga(t,e,134217728,a)}pu(e,134217728)}},Xf=function(e){if(e.tag===13){var t=ss(e),a=bn(e,t);if(a!==null){var n=ra();Ga(a,e,t,n)}pu(e,t)}},Zf=function(){return Qe},Jf=function(e,t){var a=Qe;try{return Qe=e,t()}finally{Qe=a}},Id=function(e,t,a){switch(t){case"input":if(Nd(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=Ni(n);if(!r)throw Error(ie(90));Nf(n),Nd(n,r)}}}break;case"textarea":Tf(e,a);break;case"select":t=a.value,t!=null&&Vs(e,!!a.multiple,t,!1)}},Lf=ru,Mf=Ts;var p1={usingClientEntryPoint:!1,Events:[po,er,Ni,Df,Of,ru]},Eo={findFiberByHostInstance:xs,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},f1={bundleType:Eo.bundleType,version:Eo.version,rendererPackageName:Eo.rendererPackageName,rendererConfig:Eo.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:fn.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return e=Uf(e),e===null?null:e.stateNode},findFiberByHostInstance:Eo.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 il=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!il.isDisabled&&il.supportsFiber)try{si=il.inject(f1),tn=il}catch{}}va.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=p1,va.createPortal=function(e,t){var a=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!mu(t))throw Error(ie(200));return d1(e,t,null,a)},va.createRoot=function(e,t){if(!mu(e))throw Error(ie(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=uu(e,1,!1,null,null,a,!1,n,r),e[mn]=t.current,lo(e.nodeType===8?e.parentNode:e),new fu(t)},va.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(ie(188)):(e=Object.keys(e).join(","),Error(ie(268,e)));return e=Uf(t),e=e===null?null:e.stateNode,e},va.flushSync=function(e){return Ts(e)},va.hydrate=function(e,t,a){if(!rl(t))throw Error(ie(200));return ol(null,e,t,!0,a)},va.hydrateRoot=function(e,t,a){if(!mu(e))throw Error(ie(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[mn]=t.current,lo(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 sl(t)},va.render=function(e,t,a){if(!rl(t))throw Error(ie(200));return ol(null,e,t,!1,a)},va.unmountComponentAtNode=function(e){if(!rl(e))throw Error(ie(40));return e._reactRootContainer?(Ts(function(){ol(null,null,e,!1,function(){e._reactRootContainer=null,e[mn]=null})}),!0):!1},va.unstable_batchedUpdates=ru,va.unstable_renderSubtreeIntoContainer=function(e,t,a,n){if(!rl(a))throw Error(ie(200));if(e==null||e._reactInternals===void 0)throw Error(ie(38));return ol(e,t,a,!1,n)},va.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=va;var gr=pf.exports,bh,yh=gr;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:{}},ll={};/**
|
|
856
856
|
* @license React
|
|
857
857
|
* react-jsx-runtime.production.min.js
|
|
858
858
|
*
|
|
@@ -860,7 +860,7 @@ 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 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}}
|
|
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}}ll.Fragment=b1,ll.jsx=wh,ll.jsxs=wh,xh.exports=ll;var T=xh.exports;/**
|
|
864
864
|
* @license lucide-react v0.475.0 - ISC
|
|
865
865
|
*
|
|
866
866
|
* This source code is licensed under the ISC license.
|
|
@@ -880,37 +880,37 @@ Error generating stack: `+s.message+`
|
|
|
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 $o=(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 Nh
|
|
888
|
+
*/const Nh=$o("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 C1
|
|
893
|
+
*/const C1=$o("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 E1
|
|
898
|
+
*/const E1=$o("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 $1
|
|
903
|
+
*/const $1=$o("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 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 w="child"in v.props?v.props.child:v.props.children;for(;hu(w)&&typeof ll=="function";)w=ll(w._payload);o=I1(v,w),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 T.jsx(a.Provider,{value:l,children:o})},"Provider");n.displayName=e+"Provider";function r(s,o={}){const{optional:i=!1}=o,l=N.useContext(a);if(l)return l;if(t!==void 0)return t;if(!i)throw new Error(`\`${s}\` must be used within \`${e}\``)}return 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,...w}=p,y=f?.[e]?.[l]||i,k=N.useMemo(()=>w,Object.values(w));return T.jsx(y.Provider,{value:k,children:v})},"Provider");c.displayName=s+"Provider";function u(p,f,v={}){const{optional:w=!1}=v,y=f?.[e]?.[l]||i,k=N.useContext(y);if(k)return k;if(o!==void 0)return o;if(!w)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 St=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 St(()=>{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}):St(()=>{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()]||St;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,w=N.useRef(v);N.useEffect(()=>{w.current!==v&&(w.current=v,l||c(v))},[v,w,l]);const y=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]),[y,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),T.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}):St(()=>{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),w=f?.ownerDocument??globalThis?.document,[,y]=N.useState({}),k=Xe(a,v),g=Array.from(p.layers),[d]=[...p.layersWithOutsidePointerEventsDisabled].slice(-1),h=d?g.indexOf(d):-1,b=f?g.indexOf(f):-1,S=p.layersWithOutsidePointerEventsDisabled.size>0,C=b>=h,E=N.useRef(!1),_=Yh(M=>{o?.(M),l?.(M),M.defaultPrevented||c?.()},{ownerDocument:w,deferPointerDownOutside:r,isDeferredPointerDownOutsideRef:E,dismissableSurfaces:p.dismissableSurfaces,shouldHandlePointerDownOutside:N.useCallback(M=>{if(!(M instanceof Node))return!1;const $=[...p.branches].some(B=>B.contains(M));return C&&!$},[p.branches,C])}),I=Qh(M=>{if(r&&E.current)return;const $=M.target;[...p.branches].some(J=>J.contains($))||(i?.(M),l?.(M),M.defaultPrevented||c?.())},w),z=f?b===g.length-1:!1,H=Ga(M=>{M.key==="Escape"&&(s?.(M),!M.defaultPrevented&&c&&(M.preventDefault(),c()))});return N.useEffect(()=>{if(z)return w.addEventListener("keydown",H,{capture:!0}),()=>w.removeEventListener("keydown",H,{capture:!0})},[w,z,H]),N.useEffect(()=>{if(f)return n&&(p.layersWithOutsidePointerEventsDisabled.size===0&&(Hh=w.body.style.pointerEvents,w.body.style.pointerEvents="none"),p.layersWithOutsidePointerEventsDisabled.add(f)),p.layers.add(f),xu(),()=>{n&&(p.layersWithOutsidePointerEventsDisabled.delete(f),p.layersWithOutsidePointerEventsDisabled.size===0&&(w.body.style.pointerEvents=Hh))}},[f,w,n,p]),N.useEffect(()=>()=>{f&&(p.layers.delete(f),p.layersWithOutsidePointerEventsDisabled.delete(f),xu())},[f,p]),N.useEffect(()=>{const M=Bt(()=>y({}),"handleUpdate");return document.addEventListener(bu,M),()=>document.removeEventListener(bu,M)},[]),T.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 w(h){if(!c.current)return;const b=h.target;b instanceof Node&&[...s].some(C=>C.contains(b))||u.current.set(h.type,!0),h.type==="click"&&window.setTimeout(()=>{c.current&&p.current()},0)}Bt(w,"handleInteractionCapture");function y(h){c.current&&u.current.set(h.type,!1)}Bt(y,"handleInteractionBubble");const k=Bt(h=>{if(h.target&&!l.current){let b=function(){a.removeEventListener("click",p.current);const C=v();f(),C||wu(ek,i,S,{discrete:!0})};if(Bt(b,"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?b():(a.removeEventListener("click",p.current),p.current=b,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,w,!0),a.addEventListener(h,y);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,w,!0),a.removeEventListener(h,y)}},[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,Pt=(e,t)=>nk(e,"name",{value:t,configurable:!0}),ku="focusScope.autoFocusOnMount",Nu="focusScope.autoFocusOnUnmount",Xh={bubbles:!1,cancelable:!0},Zh=N.forwardRef(Pt(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),w=Xe(a,u),y=N.useRef(s);N.useEffect(()=>{y.current=s});const k=N.useCallback(h=>h?c?.contains(h)?!0:!!y.current?.some(b=>b.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})},b=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)};Pt(h,"handleFocusIn"),Pt(b,"handleFocusOut"),Pt(S,"handleMutations"),document.addEventListener("focusin",h),document.addEventListener("focusout",b);const C=new MutationObserver(S);return c&&C.observe(c,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",h),document.removeEventListener("focusout",b),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 b=h.key==="Tab"&&!h.altKey&&!h.ctrlKey&&!h.metaKey,S=document.activeElement;if(b&&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 T.jsx(ze.div,{tabIndex:-1,...l,ref:w,onKeyDown:d})},"FocusScope")),Jh=N.createContext(null);function ev({registry:e,children:t}){return e?T.jsx(Jh.Provider,{value:e,children:t}):t}Pt(ev,"FocusScopeBranchProvider");function tv(){const[e,t]=N.useState([]),a=N.useMemo(()=>({add:Pt(n=>t(r=>r.includes(n)?r:[...r,n]),"add"),remove:Pt(n=>t(r=>r.filter(s=>s!==n)),"remove")}),[]);return{nodes:e,registry:a}}Pt(tv,"useFocusScopeBranchRegistry");function av(e){const t=N.useContext(Jh);N.useEffect(()=>{if(!(!e||!t))return t.add(e),()=>t.remove(e)},[e,t])}Pt(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}Pt(nv,"focusFirst");function sv(e){const t=Su(e),a=Cu(t,e),n=Cu(t.reverse(),e);return[a,n]}Pt(sv,"getTabbableEdges");function Su(e){const t=[],n=e.ownerDocument.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:Pt(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}Pt(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}Pt(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}Pt(rv,"isHidden");function ov(e){return e.tagName==="INPUT"&&typeof e.select=="function"}Pt(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()}}Pt(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()}}}Pt(lv,"createFocusScopesStack");function Eu(e,t){const a=[...e],n=a.indexOf(t);return n!==-1&&a.splice(n,1),a}Pt(Eu,"arrayRemove");function dv(e){return e.filter(t=>t.tagName!=="A")}Pt(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);St(()=>o(!0),[]);const i=n||s&&globalThis?.document?.body;return i?mr.createPortal(T.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]),St(()=>{const u=n.current,p=r.current;if(p!==e){const v=s.current,w=hr(u);e?(o.current=w,c("MOUNT")):w==="none"||u?.display==="none"?c("UNMOUNT"):c(p&&v!==w?"ANIMATION_OUT":"UNMOUNT"),r.current=e}},[e,c]),St(()=>{if(t){let u;const p=t.ownerDocument.defaultView??window,f=Nn(w=>{const k=hr(n.current).includes(CSS.escape(w.animationName));if(w.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(w=>{w.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,w=e.noIsolation,y=e.inert,k=e.allowPinchZoom,g=e.as,d=g===void 0?"div":g,h=e.gapMode,b=mv(e,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noRelative","noIsolation","inert","allowPinchZoom","as","gapMode"]),S=f,C=mk([a,t]),E=nn(nn({},b),r);return N.createElement(N.Fragment,null,u&&N.createElement(S,{sideCar:vv,removeScrollBar:c,shards:p,noRelative:v,noIsolation:w,inert:y,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"),`
|
|
908
|
+
*/const Sh=$o("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);var T1=Object.defineProperty,gu=(e,t)=>T1(e,"name",{value:t,configurable:!0});function hu(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}gu(hu,"setRef");function Ch(...e){return t=>{let a=!1;const n=e.map(r=>{const s=hu(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():hu(e[r],null)}}}}gu(Ch,"composeRefs");function Xe(...e){return N.useCallback(Ch(...e),e)}gu(Xe,"useComposedRefs");var P1=Object.defineProperty,Na=(e,t)=>P1(e,"name",{value:t,configurable:!0});function kn(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 w="child"in v.props?v.props.child:v.props.children;for(;vu(w)&&typeof dl=="function";)w=dl(w._payload);o=I1(v,w),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}Na(kn,"createSlot");var _1=kn("Slot"),Eh=Symbol.for("radix.slottable");function $h(e){const t=Na(a=>"child"in a?a.children(a.child):a.children,"Slottable");return t.displayName=`${e}.Slottable`,t.__radixId=Eh,t}Na($h,"createSlottable");var I1=Na((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}}Na(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)}Na(Ph,"getElementRef");function _h(e){return N.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===Eh}Na(_h,"isSlottable");var R1=Symbol.for("react.lazy");function vu(e){return e!=null&&typeof e=="object"&&"$$typeof"in e&&e.$$typeof===R1&&"_payload"in e&&Ih(e._payload)}Na(vu,"isLazyComponent");function Ih(e){return typeof e=="object"&&e!==null&&"then"in e}Na(Ih,"isPromiseLike");function Rh(e){let t=e;for(;vu(t)&&typeof dl=="function";)t=dl(t._payload);return t}Na(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}Na(Ah,"concatAriaDescribedby");var A1=Na(e=>`${e} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,"createSlotError"),j1=Na(e=>`${e} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,"createSlottableError"),dl=Fn[" use ".trim().toString()],D1=Object.defineProperty,hr=(e,t)=>D1(e,"name",{value:t,configurable:!0}),jh=!!(typeof window<"u"&&window.document&&window.document.createElement);function Ae(e,t,{checkForDefaultPrevented:a=!0}={}){return hr(function(r){if(e?.(r),a===!1||!r||!r.defaultPrevented)return t?.(r)},"handleEvent")}hr(Ae,"composeEventHandlers");function O1(e){if(!jh)throw new Error("Cannot access window outside of the DOM");return e?.ownerDocument?.defaultView??window}hr(O1,"getOwnerWindow");function bu(e){if(!jh)throw new Error("Cannot access document outside of the DOM");return e?.ownerDocument??document}hr(bu,"getOwnerDocument");function Dh(e,t=!1){const{activeElement:a}=bu(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=bu(a).getElementById(n);if(r)return r}}return a}hr(Dh,"getActiveElement");function Oh(e){return e.tagName==="IFRAME"}hr(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 T.jsx(a.Provider,{value:l,children:o})},"Provider");n.displayName=e+"Provider";function r(s,o={}){const{optional:i=!1}=o,l=N.useContext(a);if(l)return l;if(t!==void 0)return t;if(!i)throw new Error(`\`${s}\` must be used within \`${e}\``)}return ja(r,"useContext"),[n,r]}ja(M1,"createContext");function Sa(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,...w}=p,y=f?.[e]?.[l]||i,k=N.useMemo(()=>w,Object.values(w));return T.jsx(y.Provider,{value:k,children:v})},"Provider");c.displayName=s+"Provider";function u(p,f,v={}){const{optional:w=!1}=v,y=f?.[e]?.[l]||i,k=N.useContext(y);if(k)return k;if(o!==void 0)return o;if(!w)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(Sa,"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 St=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 Nn(e){const[t,a]=N.useState(B1());return St(()=>{e||a(n=>n??String(U1++))},[e]),e||(t?`radix-${t}`:"")}F1(Nn,"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}):St(()=>{t.current=e}),N.useMemo(()=>(...a)=>t.current?.(...a),[])}V1(Fh,"useEffectEvent");var W1=Object.defineProperty,To=(e,t)=>W1(e,"name",{value:t,configurable:!0}),H1=Fn[" useInsertionEffect ".trim().toString()]||St;function Da({prop:e,defaultProp:t,onChange:a=To(()=>{},"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]}To(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]}To(Bh,"useUncontrolledState");function Uh(e){return typeof e=="function"}To(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,w=N.useRef(v);N.useEffect(()=>{w.current!==v&&(w.current=v,l||c(v))},[v,w,l]);const y=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]),[y,f]}To(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"],Fe=Q1.reduce((e,t)=>{const a=kn(`Primitive.${t}`),n=N.forwardRef((r,s)=>{const{asChild:o,...i}=r,l=o?a:t;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),T.jsx(l,{...i,ref:s})});return n.displayName=`Primitive.${t}`,{...e,[t]:n}},{});function Vh(e,t){e&&gr.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 Ka(e){const t=N.useRef(e);return typeof Wh=="function"?Wh(()=>{t.current=e}):St(()=>{t.current=e}),N.useMemo(()=>(...a)=>t.current?.(...a),[])}Z1(Ka,"useCallbackRef");var J1=Object.defineProperty,Bt=(e,t)=>J1(e,"name",{value:t,configurable:!0}),yu="dismissableLayer.update",ek="dismissableLayer.pointerDownOutside",tk="dismissableLayer.focusOutside",Hh,Gh=N.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set,dismissableSurfaces:new Set}),xu=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),w=f?.ownerDocument??globalThis?.document,[,y]=N.useState({}),k=Xe(a,v),g=Array.from(p.layers),[d]=[...p.layersWithOutsidePointerEventsDisabled].slice(-1),h=d?g.indexOf(d):-1,b=f?g.indexOf(f):-1,S=p.layersWithOutsidePointerEventsDisabled.size>0,C=b>=h,E=N.useRef(!1),_=Yh(L=>{o?.(L),l?.(L),L.defaultPrevented||c?.()},{ownerDocument:w,deferPointerDownOutside:r,isDeferredPointerDownOutsideRef:E,dismissableSurfaces:p.dismissableSurfaces,shouldHandlePointerDownOutside:N.useCallback(L=>{if(!(L instanceof Node))return!1;const $=[...p.branches].some(B=>B.contains(L));return C&&!$},[p.branches,C])}),I=Qh(L=>{if(r&&E.current)return;const $=L.target;[...p.branches].some(ee=>ee.contains($))||(i?.(L),l?.(L),L.defaultPrevented||c?.())},w),F=f?b===g.length-1:!1,W=Ka(L=>{L.key==="Escape"&&(s?.(L),!L.defaultPrevented&&c&&(L.preventDefault(),c()))});return N.useEffect(()=>{if(F)return w.addEventListener("keydown",W,{capture:!0}),()=>w.removeEventListener("keydown",W,{capture:!0})},[w,F,W]),N.useEffect(()=>{if(f)return n&&(p.layersWithOutsidePointerEventsDisabled.size===0&&(Hh=w.body.style.pointerEvents,w.body.style.pointerEvents="none"),p.layersWithOutsidePointerEventsDisabled.add(f)),p.layers.add(f),wu(),()=>{n&&(p.layersWithOutsidePointerEventsDisabled.delete(f),p.layersWithOutsidePointerEventsDisabled.size===0&&(w.body.style.pointerEvents=Hh))}},[f,w,n,p]),N.useEffect(()=>()=>{f&&(p.layers.delete(f),p.layersWithOutsidePointerEventsDisabled.delete(f),wu())},[f,p]),N.useEffect(()=>{const L=Bt(()=>y({}),"handleUpdate");return document.addEventListener(yu,L),()=>document.removeEventListener(yu,L)},[]),T.jsx(Fe.div,{...u,ref:k,style:{pointerEvents:S?C?"auto":"none":void 0,...t.style},onFocusCapture:Ae(t.onFocusCapture,I.onFocusCapture),onBlurCapture:Ae(t.onBlurCapture,I.onBlurCapture),onPointerDownCapture:Ae(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=Ka(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 w(h){if(!c.current)return;const b=h.target;b instanceof Node&&[...s].some(C=>C.contains(b))||u.current.set(h.type,!0),h.type==="click"&&window.setTimeout(()=>{c.current&&p.current()},0)}Bt(w,"handleInteractionCapture");function y(h){c.current&&u.current.set(h.type,!1)}Bt(y,"handleInteractionBubble");const k=Bt(h=>{if(h.target&&!l.current){let b=function(){a.removeEventListener("click",p.current);const C=v();f(),C||ku(ek,i,S,{discrete:!0})};if(Bt(b,"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?b():(a.removeEventListener("click",p.current),p.current=b,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,w,!0),a.addEventListener(h,y);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,w,!0),a.removeEventListener(h,y)}},[a,i,n,r,s,o]),{onPointerDownCapture:Bt(()=>l.current=!0,"onPointerDownCapture")}}Bt(Yh,"usePointerDownOutside");function Qh(e,t=globalThis?.document){const a=Ka(e),n=N.useRef(!1);return N.useEffect(()=>{const r=Bt(s=>{s.target&&!n.current&&ku(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 wu(){const e=new CustomEvent(yu);document.dispatchEvent(e)}Bt(wu,"dispatchUpdate");function ku(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(ku,"handleAndDispatchCustomEvent");var nk=Object.defineProperty,Pt=(e,t)=>nk(e,"name",{value:t,configurable:!0}),Nu="focusScope.autoFocusOnMount",Su="focusScope.autoFocusOnUnmount",Xh={bubbles:!1,cancelable:!0},Zh=N.forwardRef(Pt(function(t,a){const{loop:n=!1,trapped:r=!1,branches:s,onMountAutoFocus:o,onUnmountAutoFocus:i,...l}=t,[c,u]=N.useState(null),p=Ka(o),f=Ka(i),v=N.useRef(null),w=Xe(a,u),y=N.useRef(s);N.useEffect(()=>{y.current=s});const k=N.useCallback(h=>h?c?.contains(h)?!0:!!y.current?.some(b=>b.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=_:Sn(v.current,{select:!0})},b=function(E){if(g.paused||!c)return;const _=E.relatedTarget;_!==null&&(k(_)||Sn(v.current,{select:!0}))},S=function(E){if(document.activeElement===document.body)for(const I of E)I.removedNodes.length>0&&Sn(c)};Pt(h,"handleFocusIn"),Pt(b,"handleFocusOut"),Pt(S,"handleMutations"),document.addEventListener("focusin",h),document.addEventListener("focusout",b);const C=new MutationObserver(S);return c&&C.observe(c,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",h),document.removeEventListener("focusout",b),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(Nu,Xh);c.addEventListener(Nu,p),c.dispatchEvent(S),S.defaultPrevented||(nv(dv(Cu(c)),{select:!0}),document.activeElement===h&&Sn(c))}return()=>{c.removeEventListener(Nu,p);const S=c.ownerDocument,C=CustomEvent;setTimeout(()=>{const E=new C(Su,Xh);c.addEventListener(Su,f),c.dispatchEvent(E),E.defaultPrevented||Sn(h??S.body,{select:!0}),c.removeEventListener(Su,f),iv.remove(g)},0)}}},[c,p,f,g]);const d=N.useCallback(h=>{if(!n&&!r||g.paused)return;const b=h.key==="Tab"&&!h.altKey&&!h.ctrlKey&&!h.metaKey,S=document.activeElement;if(b&&S){const C=h.currentTarget,[E,_]=sv(C);E&&_?!h.shiftKey&&S===_?(h.preventDefault(),n&&Sn(E,{select:!0})):h.shiftKey&&S===E&&(h.preventDefault(),n&&Sn(_,{select:!0})):S===C&&h.preventDefault()}},[n,r,g.paused]);return T.jsx(Fe.div,{tabIndex:-1,...l,ref:w,onKeyDown:d})},"FocusScope")),Jh=N.createContext(null);function ev({registry:e,children:t}){return e?T.jsx(Jh.Provider,{value:e,children:t}):t}Pt(ev,"FocusScopeBranchProvider");function tv(){const[e,t]=N.useState([]),a=N.useMemo(()=>({add:Pt(n=>t(r=>r.includes(n)?r:[...r,n]),"add"),remove:Pt(n=>t(r=>r.filter(s=>s!==n)),"remove")}),[]);return{nodes:e,registry:a}}Pt(tv,"useFocusScopeBranchRegistry");function av(e){const t=N.useContext(Jh);N.useEffect(()=>{if(!(!e||!t))return t.add(e),()=>t.remove(e)},[e,t])}Pt(av,"useFocusScopeBranch");function nv(e,{select:t=!1}={}){const a=document.activeElement;for(const n of e)if(Sn(n,{select:t}),document.activeElement!==a)return}Pt(nv,"focusFirst");function sv(e){const t=Cu(e),a=Eu(t,e),n=Eu(t.reverse(),e);return[a,n]}Pt(sv,"getTabbableEdges");function Cu(e){const t=[],n=e.ownerDocument.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:Pt(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}Pt(Cu,"getTabbableCandidates");function Eu(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}Pt(Eu,"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}Pt(rv,"isHidden");function ov(e){return e.tagName==="INPUT"&&typeof e.select=="function"}Pt(ov,"isSelectableInput");function Sn(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()}}Pt(Sn,"focus");var iv=lv();function lv(){let e=[];return{add(t){const a=e[0];t!==a&&a?.pause(),e=$u(e,t),e.unshift(t)},remove(t){e=$u(e,t),e[0]?.resume()}}}Pt(lv,"createFocusScopesStack");function $u(e,t){const a=[...e],n=a.indexOf(t);return n!==-1&&a.splice(n,1),a}Pt($u,"arrayRemove");function dv(e){return e.filter(t=>t.tagName!=="A")}Pt(dv,"removeLinks");var sk=Object.defineProperty,rk=(e,t)=>sk(e,"name",{value:t,configurable:!0}),Tu=N.forwardRef(rk(function(t,a){const{container:n,...r}=t,[s,o]=N.useState(!1);St(()=>o(!0),[]);const i=n||s&&globalThis?.document?.body;return i?gr.createPortal(T.jsx(Fe.div,{...r,ref:a}),i):null},"Portal")),ok=Object.defineProperty,Cn=(e,t)=>ok(e,"name",{value:t,configurable:!0});function cv(e,t){return N.useReducer((a,n)=>t[a][n]??a,e)}Cn(cv,"useStateMachine");var is=Cn(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??vr(n.current),o.current=void 0):s.current="none"},[l]),St(()=>{const u=n.current,p=r.current;if(p!==e){const v=s.current,w=vr(u);e?(o.current=w,c("MOUNT")):w==="none"||u?.display==="none"?c("UNMOUNT"):c(p&&v!==w?"ANIMATION_OUT":"UNMOUNT"),r.current=e}},[e,c]),St(()=>{if(t){let u;const p=t.ownerDocument.defaultView??window,f=Cn(w=>{const k=vr(n.current).includes(CSS.escape(w.animationName));if(w.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=Cn(w=>{w.target===t&&(s.current=vr(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=vr(p)}else n.current=null;a(u)},[])}}Cn(uv,"usePresence");function Pu(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}Cn(Pu,"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=Pu(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():Pu(n[o],null)}}},[])}Cn(pv,"useStableComposedRefs");function vr(e){return e?.animationName||"none"}Cn(vr,"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)}Cn(fv,"getElementRef");var ik=Object.defineProperty,_u=(e,t)=>ik(e,"name",{value:t,configurable:!0}),cl=0,br=null;function lk(e){return ul(),e.children}_u(lk,"FocusGuards");function ul(){N.useEffect(()=>{br||(br={start:Iu(),end:Iu()});const{start:e,end:t}=br;return document.body.firstElementChild!==e&&document.body.insertAdjacentElement("afterbegin",e),document.body.lastElementChild!==t&&document.body.insertAdjacentElement("beforeend",t),cl++,()=>{cl===1&&(br?.start.remove(),br?.end.remove(),br=null),cl=Math.max(0,cl-1)}},[])}_u(ul,"useFocusGuards");function Iu(){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}_u(Iu,"createFocusGuard");var on=function(){return on=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},on.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 pl="right-scroll-bar-position",fl="width-before-scroll-bar",ck="with-scroll-bars-hidden",uk="--removed-body-scroll-bar-size";function Ru(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 Ru(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)||Ru(i,null)}),s.forEach(function(i){r.has(i)||Ru(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=on({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,on({},a))};hv.isSideCarExport=!0;function bk(e,t){return e.useMedium(t),hv}var vv=vk(),Au=function(){},ml=N.forwardRef(function(e,t){var a=N.useRef(null),n=N.useState({onScrollCapture:Au,onWheelCapture:Au,onTouchMoveCapture:Au}),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,w=e.noIsolation,y=e.inert,k=e.allowPinchZoom,g=e.as,d=g===void 0?"div":g,h=e.gapMode,b=mv(e,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noRelative","noIsolation","inert","allowPinchZoom","as","gapMode"]),S=f,C=mk([a,t]),E=on(on({},b),r);return N.createElement(N.Fragment,null,u&&N.createElement(S,{sideCar:vv,removeScrollBar:c,shards:p,noRelative:v,noIsolation:w,inert:y,setCallbacks:s,allowPinchZoom:!!k,lockRef:a,gapMode:h}),o?N.cloneElement(N.Children.only(i),on(on({},E),{ref:C})):N.createElement(d,on({},E,{className:l,ref:C}),i))});ml.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1},ml.classNames={fullWidth:fl,zeroRight:pl};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},ju=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[ju(a),ju(n),ju(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(),yr="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
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(yr,`] {
|
|
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(pl,` {
|
|
927
927
|
right: `).concat(i,"px ").concat(n,`;
|
|
928
928
|
}
|
|
929
929
|
|
|
930
|
-
.`).concat(
|
|
930
|
+
.`).concat(fl,` {
|
|
931
931
|
margin-right: `).concat(i,"px ").concat(n,`;
|
|
932
932
|
}
|
|
933
933
|
|
|
934
|
-
.`).concat(
|
|
934
|
+
.`).concat(pl," .").concat(pl,` {
|
|
935
935
|
right: 0 `).concat(n,`;
|
|
936
936
|
}
|
|
937
937
|
|
|
938
|
-
.`).concat(
|
|
938
|
+
.`).concat(fl," .").concat(fl,` {
|
|
939
939
|
margin-right: 0 `).concat(n,`;
|
|
940
940
|
}
|
|
941
941
|
|
|
942
|
-
body[`).concat(
|
|
942
|
+
body[`).concat(yr,`] {
|
|
943
943
|
`).concat(uk,": ").concat(i,`px;
|
|
944
944
|
}
|
|
945
|
-
`)},yv=function(){var e=parseInt(document.body.getAttribute(
|
|
945
|
+
`)},yv=function(){var e=parseInt(document.body.getAttribute(yr)||"0",10);return isFinite(e)?e:0},_k=function(){N.useEffect(function(){return document.body.setAttribute(yr,(yv()+1).toString()),function(){var e=yv()-1;e<=0?document.body.removeAttribute(yr):document.body.setAttribute(yr,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")})},Du=!1;if(typeof window<"u")try{var gl=Object.defineProperty({},"passive",{get:function(){return Du=!0,!0}});window.addEventListener("test",gl,gl),window.removeEventListener("test",gl,gl)}catch{Du=!1}var xr=Du?{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),w=v[0],y=v[1],k=v[2],g=y-k-s*w;(w||g)&&kv(e,i)&&(p+=g,f+=w);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},hl=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
|
-
`)},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 y=dk([e.lockRef.current],(e.shards||[]).map(Cv),!0).filter(Boolean);return y.forEach(function(k){return k.classList.add("allow-interactivity-".concat(r))}),function(){document.body.classList.remove("block-interactivity-".concat(r)),y.forEach(function(k){return k.classList.remove("allow-interactivity-".concat(r))})}}},[e.inert,e.lockRef.current,e.shards]);var i=N.useCallback(function(y,k){if("touches"in y&&y.touches.length===2||y.type==="wheel"&&y.ctrlKey)return!o.current.allowPinchZoom;var g=gl(y),d=a.current,h="deltaX"in y?y.deltaX:d[0]-g[0],b="deltaY"in y?y.deltaY:d[1]-g[1],S,C=y.target,E=Math.abs(h)>Math.abs(b)?"h":"v";if("touches"in y&&E==="h"&&C.type==="range")return!1;var _=window.getSelection(),I=_&&_.anchorNode,z=I?I===C||I.contains(C):!1;if(z)return!1;var H=wv(E,C);if(!H)return!0;if(H?S=E:(S=E==="v"?"h":"v",H=wv(E,C)),!H)return!1;if(!n.current&&"changedTouches"in y&&(h||b)&&(n.current=S),!S)return!0;var M=n.current||S;return Mk(M,k,y,M==="h"?h:b)},[]),l=N.useCallback(function(y){var k=y;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)}),b=h.length>0?i(k,h[0]):!o.current.noIsolation;b&&k.cancelable&&k.preventDefault()}}},[]),c=N.useCallback(function(y,k,g,d){var h={name:y,delta:k,target:g,should:d,shadowParent:qk(g)};t.current.push(h),setTimeout(function(){t.current=t.current.filter(function(b){return b!==h})},1)},[]),u=N.useCallback(function(y){a.current=gl(y),n.current=void 0},[]),p=N.useCallback(function(y){c(y.type,Sv(y),y.target,i(y,e.lockRef.current))},[]),f=N.useCallback(function(y){c(y.type,gl(y),y.target,i(y,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(y){return y!==s}),document.removeEventListener("wheel",l,yr),document.removeEventListener("touchmove",l,yr),document.removeEventListener("touchstart",u,yr)}},[]);var v=e.removeScrollBar,w=e.inert;return N.createElement(N.Fragment,null,w?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),w=v!==null&&v!=="false",y=(wr.get(f)||0)+1,k=(s.get(f)||0)+1;wr.set(f,y),s.set(f,k),o.push(f),y===1&&w&&hl.set(f,!0),k===1&&f.setAttribute(a,"true"),w||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,w]=N.useState(0),[y,k]=N.useState(0);return T.jsx(Yk,{scope:t,triggerRef:i,contentRef:l,contentId:wn(),titleId:wn(),descriptionId:wn(),titlePresent:v>0,descriptionPresent:y>0,setTitleCount:w,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 T.jsx(Qk,{scope:t,forceMount:a,children:N.Children.map(n,o=>T.jsx(is,{present:a||s.open,children:T.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?T.jsx(is,{present:r||o.open,children:T.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 T.jsx(Du,{as:Xk,allowPinchZoom:!0,shards:N.useMemo(()=>[s.contentRef,...s.branchNodes.map(l=>({current:l}))],[s.contentRef,s.branchNodes]),children:T.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 T.jsx(is,{present:r||o.open,children:o.modal?T.jsx(Jk,{...s,ref:a}):T.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)},[]),T.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 T.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(),T.jsx(ev,{registry:u.branchRegistry,children:T.jsx(Zh,{asChild:!0,loop:!0,trapped:r,branches:u.branchNodes,onMountAutoFocus:s,onUnmountAutoFocus:o,children:T.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 St(()=>(o(i=>i+1),()=>o(i=>i-1)),[o]),T.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 St(()=>(o(i=>i+1),()=>o(i=>i-1)),[o]),T.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 T.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(y=>{const{scope:k,children:g}=y,d=N.useRef(null),h=N.useRef(new Map).current;return T.jsx(r,{scope:k,itemMap:h,collectionRef:d,children:g})},"CollectionProvider");o.displayName=t;const i=e+"CollectionSlot",l=xn(i),c=N.forwardRef((y,k)=>{const{scope:g,children:d}=y,h=s(i,g),b=Xe(k,h.collectionRef);return T.jsx(l,{ref:b,children:d})});c.displayName=i;const u=e+"CollectionItemSlot",p="data-radix-collection-item",f=xn(u),v=N.forwardRef((y,k)=>{const{scope:g,children:d,...h}=y,b=N.useRef(null),S=Xe(k,b),C=s(u,g);return N.useEffect(()=>(C.itemMap.set(b,{ref:b,...h}),()=>void C.itemMap.delete(b))),T.jsx(f,{[p]:"",ref:S,children:d})});v.displayName=u;function w(y){const k=s(e+"CollectionConsumer",y);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(w,"useCollection"),[{Provider:o,Slot:c,ItemSlot:v},w,n]}Ot(Vu,"createCollection");var Ov=new WeakMap,bl=(Ca=class extends Map{constructor(a){super(a);My(this,Ct);zp(this,Ct,[...super.keys()]),Ov.set(this,!0)}set(a,n){return Ov.get(this)&&!this.has(a)&&Yt(this,Ct).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,Ct).indexOf(n)===l:l===this.size)return this.set(n,r),this;const c=Yt(this,Ct).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,Ct).indexOf(a)-1;if(!(n<0))return this.entryAt(n)}setBefore(a,n,r){const s=Yt(this,Ct).indexOf(a);if(s===-1)return this;const o=Yt(this,Ct).indexOf(n),i=o!==-1&&o<s?s-1:s;return this.insert(i,n,r)}after(a){let n=Yt(this,Ct).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,Ct).indexOf(a);if(s===-1)return this;const o=Yt(this,Ct).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,Ct,[]),super.clear()}delete(a){const n=super.delete(a);return n&&Yt(this,Ct).splice(Yt(this,Ct).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,Ct),a);if(n!==void 0)return this.get(n)}entryAt(a){const n=yl(Yt(this,Ct),a);if(n!==void 0)return[n,this.get(n)]}indexOf(a){return Yt(this,Ct).indexOf(a)}keyAt(a){return yl(Yt(this,Ct),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,Ct).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}},Ct=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?T.jsx(u,{...E,state:C}):T.jsx(c,{...E}),"CollectionProvider");l.displayName=t;const c=Ot(C=>{const E=d();return T.jsx(u,{...C,state:E})},"CollectionInit");c.displayName=e+"CollectionInit";const u=Ot(C=>{const{scope:E,children:_,state:I}=C,z=N.useRef(null),[H,M]=N.useState(null),$=Xe(z,M),[B,J]=I,q=N.useRef(new bl),L=N.useCallback(()=>{const A=q.current;return Fv(A)||A.sort(xl),A},[]);return N.useEffect(()=>{if(!H)return;const A=Bv(()=>{J(x=>{const P=x.toSorted(xl);return P.some(([R],O)=>x.keyAt(O)!==R)?P:x})});return A.observe(H,{childList:!0,subtree:!0}),()=>{A.disconnect()}},[H,J]),T.jsx(r,{scope:E,collectionElementRef:$,collectionElementRefObject:z,getCollection:L,setCollection:J,registryRef:q,children:T.jsx(o,{scope:E,collectionElement:H,collection:B,children:_})})},"CollectionProviderImpl");u.displayName=e+"CollectionProviderImpl";const p=e+"CollectionSlot",f=xn(p),v=N.forwardRef((C,E)=>{const{scope:_,children:I}=C,z=s(p,_),H=Xe(E,z.collectionElementRef);return T.jsx(f,{ref:H,children:I})});v.displayName=p;const w=e+"CollectionItemSlot",y="data-radix-collection-item",k=xn(w),g=N.forwardRef((C,E)=>{const{scope:_,children:I,...z}=C,H=N.useRef(null),M=s(w,_),{setCollection:$,registryRef:B}=M,J=N.useRef(z);Mv(J.current,z)||(J.current=z);const q=J.current,L=N.useCallback(P=>{const K=B.current;P?K.set(P,{...J.current,element:P}):H.current&&K.delete(H.current)},[B]),A=Xe(E,L,H);St(()=>{const P=H.current,K=B.current;P&&K.has(P)&&K.set(P,{...q,element:P})},[q,B]);const x=N.useRef(null);return N.useEffect(()=>{const P=H.current,K=x.current;(K?.element??null)===P&&(!P||K?.itemData===q)||(x.current=P?{element:P,itemData:q}:null,$(R=>{const O=new bl(R);return K&&K.element!==P&&O.delete(K.element),P&&O.set(P,{...q,element:P}),O.sort(xl)}))}),N.useEffect(()=>()=>{const P=x.current;x.current=null,P&&$(K=>{if(!K.has(P.element))return K;const R=new bl(K);return R.delete(P.element),R})},[$]),T.jsx(k,{[y]:"",ref:A,children:I})});g.displayName=w;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 b(C){const{getCollection:E}=s(e+"CollectionConsumer",C);return E}return Ot(b,"useGetCollection"),[{Provider:l,Slot:v,ItemSlot:g},{createCollectionScope:n,useCollection:h,useGetCollection:b,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 T.jsx(Yu.Provider,{scope:t.__scopeRovingFocusGroup,children:T.jsx(Yu.Slot,{scope:t.__scopeRovingFocusGroup,children:T.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),w=Xe(a,v),y=Po(o),[k,g]=Da({prop:i,defaultProp:l??null,onChange:c,caller:wl}),[d,h]=N.useState(!1),b=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,b),()=>I.removeEventListener(Ku,b)},[b]),T.jsx(gN,{scope:n,orientation:r,dir:y,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:T.jsx(ze.div,{tabIndex:d||E===0?-1:0,"data-orientation":r,...f,ref:w,style:{outline:"none",...t.style},onMouseDown:Re(t.onMouseDown,()=>{C.current=!0}),onFocus:Re(t.onFocus,I=>{const z=!C.current;if(I.target===I.currentTarget&&z&&!d){const H=new CustomEvent(Ku,uN);if(I.currentTarget.dispatchEvent(H),!H.defaultPrevented){const M=S().filter(L=>L.focusable),$=M.find(L=>L.active),B=M.find(L=>L.id===k),q=[$,B,...M].filter(Boolean).map(L=>L.ref.current);Qu(q,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:w,onFocusableItemRemove:y,currentTabStopId:k}=p,g=dN();return St(()=>{if(!(!g||!r))return w(),()=>y()},[g,r,w,y]),N.useEffect(()=>{if(!(g||!r))return w(),()=>y()},[g,r,w,y]),T.jsx(Yu.ItemSlot,{scope:n,id:u,focusable:r,active:s,children:T.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 T.jsx(kN,{scope:n,baseId:wn(),value:f,onValueChange:v,orientation:i,dir:p,activationMode:c,children:T.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 T.jsx(Kv,{asChild:!0,...i,orientation:o.orientation,dir:o.dir,loop:r,children:T.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 T.jsx(Yv,{asChild:!0,...l,focusable:!s,active:p,children:T.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)},[]),T.jsx(is,{present:s||p,children:({present:v})=>T.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 St(()=>{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}),[w,y]=N.useState(null),[k,g]=N.useState(null),[d,h]=N.useState(null),b=w?!!o||!!w.closest("form"):!0,S={checked:f,setChecked:v,disabled:s,control:w,setControl:y,name:i,form:o,value:u,userClick:d,onUserClick:h,required:c,defaultChecked:r,isFormControl:b,bubbleInput:k,setBubbleInput:g};return T.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:w,bubbleInput:y}=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]),T.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(b=>!b),y&&w&&(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 T.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})=>T.jsxs(T.Fragment,{children:[T.jsx(ON,{...f,ref:a,__scopeSwitch:n}),v&&T.jsx(zN,{__scopeSwitch:n})]})})},"Switch")),LN="SwitchThumb",nb=N.forwardRef(ls(function(t,a){const{__scopeSwitch:n,...r}=t,s=ap(LN,n);return T.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:w,setBubbleInput:y}=ap(MN,t),k=Xe(r,y),g=Nl(s),d=N.useRef(!1),h=N.useRef(i),b=N.useRef(o),S=N.useRef(null);N.useEffect(()=>{const E=w;if(!E)return;const _=window.HTMLInputElement.prototype,z=Object.getOwnPropertyDescriptor(_,"checked").set;if(!z)return;const H=h.current!==i;h.current=i;const M=o!==null&&o!==b.current;if(b.current=o,M)S.current=H?null:o,H&&z.call(E,i),E.dispatchEvent(new Event("click",{bubbles:!o.hasConsumerStoppedPropagation}));else if(H){const $=S.current;S.current=null;const B=$?.requestedChecked===i;d.current=!0,z.call(E,i),E.dispatchEvent(new Event("click",{bubbles:!(B&&$.hasConsumerStoppedPropagation)})),d.current=!1}},[w,i,o]);const C=N.useRef(i);return T.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}),[w,y]=N.useState(null),[k,g]=N.useState(null),[d,h]=N.useState(null),b=w?!!o||!!w.closest("form"):!0,S={checked:f,disabled:s,setChecked:v,control:w,setControl:y,name:i,form:o,value:u,userClick:d,onUserClick:h,required:c,defaultChecked:Oa(r)?!1:r,isFormControl:b,bubbleInput:k,setBubbleInput:g};return T.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:w,bubbleInput:y}=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]),T.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(b=>Oa(b)?!0:!b),y&&w&&(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 T.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})=>T.jsxs(T.Fragment,{children:[T.jsx(VN,{...f,ref:a,__scopeCheckbox:n}),v&&T.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 T.jsx(is,{present:r||Oa(o.checked)||o.checked===!0,children:T.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:w,setBubbleInput:y}=rp(KN,t),k=Xe(r,y),g=Nl(s),d=N.useRef(!1),h=N.useRef(i),b=N.useRef(o),S=N.useRef(null);N.useEffect(()=>{const E=w;if(!E)return;const _=window.HTMLInputElement.prototype,z=Object.getOwnPropertyDescriptor(_,"checked").set;if(!z)return;const H=h.current!==i;h.current=i;const M=o!==null&&o!==b.current;if(b.current=o,M)S.current=H?null:o,H&&(E.indeterminate=Oa(i),z.call(E,Oa(i)?!1:i)),E.dispatchEvent(new Event("click",{bubbles:!o.hasConsumerStoppedPropagation}));else if(H){const $=S.current;S.current=null;const B=$?.requestedChecked===i;d.current=!0,E.indeterminate=Oa(i),z.call(E,Oa(i)?!1:i),E.dispatchEvent(new Event("click",{bubbles:!(B&&$.hasConsumerStoppedPropagation)})),d.current=!1}},[w,i,o]);const C=N.useRef(Oa(i)?!1:i);return T.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 T.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(w=>{let[y,k]=w;return Array.isArray(k)?k.includes({...s,...i}[y]):{...s,...i}[y]===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),w=v?f.substring(1):f,y=p&&p>u?p-u:void 0;return{modifiers:l,hasImportantModifier:v,baseClassName:w,maybePostfixModifierPosition:y}};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 w=!!v,y=n(w?f.substring(0,v):f);if(!y){if(!w){i=c+(i.length>0?" "+i:i);continue}if(y=n(f),!y){i=c+(i.length>0?" "+i:i);continue}w=!1}const k=oS(u).join(":"),g=p?k+gb:k,d=g+y;if(s.includes(d))continue;s.push(d);const h=r(y,w);for(let b=0;b<h.length;++b){const S=h[b];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"),w=lt("gradientColorStopPositions"),y=lt("inset"),k=lt("margin"),g=lt("opacity"),d=lt("padding"),h=lt("saturate"),b=lt("scale"),S=lt("sepia"),C=lt("skew"),E=lt("space"),_=lt("translate"),I=()=>["auto","contain","none"],z=()=>["auto","hidden","clip","visible","scroll"],H=()=>["auto",Oe,t],M=()=>[Oe,t],$=()=>["",Cn,ds],B=()=>["auto",Nr,Oe],J=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],q=()=>["solid","dashed","dotted","double","none"],L=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],A=()=>["start","end","center","between","around","evenly","stretch"],x=()=>["","0",Oe],P=()=>["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:$(),contrast:K(),grayscale:x(),hueRotate:K(),invert:x(),gap:M(),gradientColorStops:[e],gradientColorStopPositions:[yS,ds],inset:H(),margin:H(),opacity:K(),padding:M(),saturate:K(),scale:K(),sepia:x(),skew:K(),space:M(),translate:M()},classGroups:{aspect:[{aspect:["auto","square","video",Oe]}],container:["container"],columns:[{columns:[cs]}],"break-after":[{"break-after":P()}],"break-before":[{"break-before":P()}],"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:z()}],"overflow-x":[{"overflow-x":z()}],"overflow-y":[{"overflow-y":z()}],overscroll:[{overscroll:I()}],"overscroll-x":[{"overscroll-x":I()}],"overscroll-y":[{"overscroll-y":I()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[y]}],"inset-x":[{"inset-x":[y]}],"inset-y":[{"inset-y":[y]}],start:[{start:[y]}],end:[{end:[y]}],top:[{top:[y]}],right:[{right:[y]}],bottom:[{bottom:[y]}],left:[{left:[y]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",_o,Oe]}],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",Oe]}],grow:[{grow:x()}],shrink:[{shrink:x()}],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":B()}],"col-end":[{"col-end":B()}],"grid-rows":[{"grid-rows":[Io]}],"row-start-end":[{row:["auto",{span:[_o,Oe]},Oe]}],"row-start":[{"row-start":B()}],"row-end":[{"row-end":B()}],"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",...A()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...A(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...A(),"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:[...q(),"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:[w]}],"gradient-via-pos":[{via:[w]}],"gradient-to-pos":[{to:[w]}],"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":[Cn,Oe]}],"outline-w":[{outline:[Cn,ds]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:$()}],"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":[...L(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":L()}],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:[b]}],"scale-x":[{"scale-x":[b]}],"scale-y":[{"scale-y":[b]}],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 T.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)=>T.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)=>T.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)=>T.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)=>T.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})=>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})=>T.jsx("div",{className:ut("leading-none font-semibold",e),...t}),AS=({className:e,...t})=>T.jsx("div",{className:ut("px-6",e),...t}),jS=({className:e,...t})=>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})=>T.jsx("div",{className:ut(DS({variant:t}),e),...a}),cp=NN,El=N.forwardRef(({className:e,...t},a)=>T.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)=>T.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)=>T.jsx(PN,{ref:a,className:ut("mt-3 focus-visible:outline-none",e),...t}));LS.displayName="TabsContent";const MS=({...e})=>T.jsx(Mu,{container:Cr(),...e}),wb=N.forwardRef(({className:e,...t},a)=>T.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)=>T.jsxs(MS,{children:[T.jsx(wb,{}),T.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,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:[T.jsx(Sh,{className:"h-4 w-4"}),T.jsx("span",{className:"sr-only",children:"关闭"})]})]})]}));zS.displayName="DialogContent";const FS=N.forwardRef(({className:e,...t},a)=>T.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)=>T.jsx(Av,{ref:a,className:ut("text-sm text-muted-foreground",e),...t}));BS.displayName="DialogDescription";const US=N.forwardRef(({className:e,...t},a)=>T.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:T.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)=>T.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:T.jsx(GN,{className:ut("flex items-center justify-center text-current"),children:T.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,w]=N.useState(""),[y,k]=N.useState(!1),[g,d]=N.useState(String(a??"")),[h,b]=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(""),w(""),f(M==="local"?o:""))},_=async M=>{if(M&&M.preventDefault(),!y){if(p.trim()===""||v===""){d(c==="local"?"本地账号和密码都要填":"域账号和密码都要填");return}k(!0),d("");try{const $=await GS({username:p.trim().normalize("NFKC"),password:v.normalize("NFKC"),mode:c});up(VS,$.token),up(WS,JSON.stringify($.user??null)),up(HS,String($.user?.name??$.user?.id??p.trim())),w(""),n()}catch($){d($ instanceof Error?$.message:String($))}finally{k(!1)}}},I=String(e?.board?.title??"工作空间"),z=/LDAP|域|目录|连不上/.test(g),H=T.jsxs(xb,{className:"w-[380px] shrink-0 py-0 shadow-md",children:[T.jsx(IS,{className:"gap-2 px-5 pb-4 pt-5",children:T.jsxs("div",{className:"flex items-center gap-2",children:[T.jsx("span",{className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-lg bg-primary text-[13px] leading-none text-primary-foreground","aria-hidden":!0,children:"◈"}),T.jsxs("div",{className:"min-w-0",children:[T.jsx(RS,{className:"truncate text-[15px] leading-tight",children:I}),T.jsx("div",{className:"text-[11px] leading-tight text-muted-foreground",children:"需求与任务工作空间"})]})]})}),T.jsxs(AS,{className:"px-5 pb-0",children:[T.jsx(cp,{value:c,onValueChange:E,children:T.jsxs(El,{className:"w-full",children:[T.jsx(Ro,{value:"ldap",disabled:!l,className:"flex-1 text-[13px]",children:"LDAP 账号"}),T.jsx(Ro,{value:"local",disabled:!i,className:"flex-1 text-[13px]",children:"本地超管"})]})}),T.jsx("p",{className:"mb-3 mt-3 text-[12px] leading-relaxed text-muted-foreground",children:c==="ldap"?"用公司目录账号登录,登录后写操作与审计都记在这个名字下。":`用平台自带的超管账号登录。默认 ${o} / admin,改过之后用新口令。`}),T.jsxs("form",{className:"grid w-full max-w-full gap-3",onSubmit:_,children:[T.jsxs("div",{className:"grid min-w-0 gap-1.5",children:[T.jsx(Cl,{htmlFor:"studio-account",className:"text-[12px] text-muted-foreground",children:c==="local"?"超管账号":"域账号"}),T.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)})]}),T.jsxs("div",{className:"grid min-w-0 gap-1.5",children:[T.jsx(Cl,{htmlFor:"studio-pass",className:"text-[12px] text-muted-foreground",children:"密码"}),T.jsxs("div",{className:"relative min-w-0",children:[T.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=>w(M.target.value)}),T.jsx("button",{type:"button","aria-label":h?"隐藏密码":"显示密码",title:h?"隐藏密码":"显示密码(看清是不是被输入法打成了全角)",onClick:()=>b(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?T.jsx(E1,{size:14}):T.jsx($1,{size:14})})]})]}),g===""?null:T.jsxs("div",{className:"flex items-start gap-1.5 rounded-md border border-destructive/35 bg-destructive/5 px-2.5 py-2 text-[12px] leading-relaxed text-destructive",children:[T.jsx("span",{"aria-hidden":!0,children:"!"}),T.jsx("span",{className:"min-w-0 break-words",children:g})]}),z?T.jsx("div",{className:"text-[11px] leading-relaxed text-muted-foreground",children:"连不上目录服务时,切到「本地超管」用平台账号进来;网络打通后再用域账号。"}):null,T.jsx(Er,{type:"submit",disabled:y,className:"h-9 w-full text-[13px]",children:y?"登录中…":c==="local"?"登录(本地超管)":"登录(LDAP)"})]})]}),T.jsxs(jS,{className:"mt-4 flex flex-col items-stretch gap-2 border-t border-border px-5 py-3",children:[T.jsx("div",{className:"truncate text-[11px] leading-relaxed text-muted-foreground",title:c==="ldap"?`${e?.ldap?.url??"—"} · BASE ${e?.ldap?.baseDN??"—"}`:"",children:c==="ldap"?`${e?.ldap?.url??"—"} · BASE ${e?.ldap?.baseDN??"—"}`:"口令以 scrypt 哈希存在服务端,改密码在「设置 → 统一登录(LDAP)」"}),T.jsxs("div",{className:"flex items-center justify-between",children:[T.jsx("span",{className:"text-[11px] text-muted-foreground",children:c==="local"?"回车即登录":"账号是域账号,不是邮箱"}),typeof r=="function"?T.jsx(Er,{type:"button",variant:"ghost",size:"sm",className:"h-7 px-2 text-[12px]",onClick:()=>r(),children:"先不登录"}):null]})]})]});return s===!0?T.jsx("div",{className:"fixed inset-0 z-[90] flex items-center justify-center bg-background/70 p-4 backdrop-blur-sm",children:H}):T.jsx("div",{"data-dsh-studio":"","data-theme":t,className:"dsh-studio-fill",children:T.jsx("div",{className:"flex min-h-full w-full items-center justify-center px-6 py-10",children:H})})}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 T.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 T.jsx(tC,{role:"radiogroup",...s,ref:a})}if(n===Ao.Multiple){const s=r;return T.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 T.jsx(Sb,{scope:t.__scopeToggleGroup,type:Ao.Single,value:N.useMemo(()=>i?[i]:[],[i]),onItemActivate:l,onItemDeactivate:N.useCallback(()=>l(""),[l]),children:T.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 T.jsx(Sb,{scope:t.__scopeToggleGroup,type:Ao.Multiple,value:i,onItemActivate:c,onItemDeactivate:u,children:T.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 T.jsx(nC,{scope:n,rovingFocus:s,disabled:r,children:s?T.jsx(Kv,{asChild:!0,...u,orientation:o,dir:p,loop:l,children:T.jsx(ze.div,{...f,ref:a})}):T.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?T.jsx(Yv,{asChild:!0,...s,focusable:!i,active:o,ref:c,children:T.jsx($b,{...l,ref:a})}):T.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 T.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 w=Tr(t);return w&&(v[o]+=f*(w==="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),w=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)),b=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+w.top)/b.y,bottom:(S.bottom-g.bottom+w.bottom)/b.y,left:(g.left-S.left+w.left)/b.x,right:(S.right-g.right+w.right)/b.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 w={};for(let y=0;y<s.length;y++){const k=s[y];if(!k)continue;const{name:g,fn:d}=k,{x:h,y:b,data:S,reset:C}=await d({x:u,y:p,initialPlacement:n,placement:f,strategy:r,middlewareData:w,rects:c,platform:i,elements:{reference:e,floating:t}});u=h??u,p=b??p,w[g]={...w[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)),y=-1)}return{x:u,y:p,placement:f,strategy:r,middlewareData:w}},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),w=gp(v),y=await o.getDimensions(c),k=v==="y",g=k?"top":"left",d=k?"bottom":"right",h=k?"clientHeight":"clientWidth",b=s.reference[w]+s.reference[v]-f[v]-s.floating[w],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[w]);const _=b/2-S/2,I=E/2-y[w]/2-1,z=ps(p[g],I),H=ps(p[d],I),M=E-y[w]-H,$=E/2-y[w]/2+_,B=Tb(z,$,M),J=!l.arrow&&Tr(r)!=null&&$!==B&&s.reference[w]/2-($<z?z:H)-y[w]/2<0,q=J?$<z?$-z:$-M:0;return{[v]:f[v]+q,data:{[v]:B,centerOffset:$-B-q,...J&&{alignmentOffset:q}},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:w="none",flipAlignment:y=!0,...k}=Tn(e,t);if((a=s.arrow)!=null&&a.alignmentOffset)return{};const g=fs(r),d=rn(i),h=fs(i)===i,b=await(l.isRTL==null?void 0:l.isRTL(c.floating)),S=f||(h||!y?[Pl(i)]:uC(i)),C=w!=="none";!f&&C&&S.push(...gC(i,y,w,b));const E=[i,...S],_=await l.detectOverflow(t,k),I=[];let z=((n=s.flip)==null?void 0:n.overflows)||[];if(u&&I.push(_[g]),p){const B=cC(r,o,b);I.push(_[B[0]],_[B[1]])}if(z=[...z,{placement:r,overflows:I}],!I.every(B=>B<=0)){var H,M;const B=(((H=s.flip)==null?void 0:H.index)||0)+1,J=E[B];if(J&&(!(p==="alignment"?d!==rn(J):!1)||z.every(A=>rn(A.placement)===d?A.overflows[0]>0:!0)))return{data:{index:B,overflows:z},reset:{placement:J}};let q=(M=z.filter(L=>L.overflows[0]<=0).sort((L,A)=>L.overflows[1]-A.overflows[1])[0])==null?void 0:M.placement;if(!q)switch(v){case"bestFit":{var $;const L=($=z.filter(A=>{if(C){const x=rn(A.placement);return x===d||x==="y"}return!0}).map(A=>[A.placement,A.overflows.filter(x=>x>0).reduce((x,P)=>x+P,0)]).sort((A,x)=>A[1]-x[1])[0])==null?void 0:$[0];L&&(q=L);break}case"initialPlacement":q=i;break}if(r!==q)return{reset:{placement:q}}}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:w}=typeof p=="number"?{mainAxis:p,crossAxis:0,alignmentAxis:null}:{mainAxis:p.mainAxis||0,crossAxis:p.crossAxis||0,alignmentAxis:p.alignmentAxis};return i&&typeof w=="number"&&(v=i==="end"?w*-1:w),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:b}=d;return{x:h,y:b}}},...c}=Tn(e,t),u={x:a,y:n},p=await s.detectOverflow(t,c),f=rn(r),v=mp(f);let w=u[v],y=u[f];const k=(d,h)=>Tb(h+p[d==="y"?"top":"left"],h,h-p[d==="y"?"bottom":"right"]);o&&(w=k(v,w)),i&&(y=k(f,y));const g=l.fn({...t,[v]:w,[f]:y});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),w=mp(v);let y=f[w],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=w==="y"?"height":"width",C=i.reference[w]-i.floating[S]+d.mainAxis,E=i.reference[w]+i.reference[S]-d.mainAxis;y<C?y=C:y>E&&(y=E)}if(p){var h,b;const S=w==="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:((b=l.offset)==null?void 0:b[v])||0)-(C?d.crossAxis:0);k<E?k=E:k>_&&(k=_)}return{[w]:y,[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 w,y;c==="top"||c==="bottom"?(w=c,y=u===(await(r.isRTL==null?void 0:r.isRTL(s.floating))?"start":"end")?"left":"right"):(y=c,w=u==="end"?"top":"bottom");const k=v-l.top-l.bottom,g=f-l.left-l.right,d=ps(v-l[w],k),h=ps(f-l[y],g),b=t.middlewareData.shift,S=!b;let C=d,E=h;b!=null&&b.enabled.x&&(E=g),b!=null&&b.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 w=f,y=wp(w);for(;y&&v!==w;){const k=_r(y),g=y.getBoundingClientRect(),d=ln(y),h=g.left+(y.clientLeft+parseFloat(d.paddingLeft))*k.x,b=g.top+(y.clientTop+parseFloat(d.paddingTop))*k.y;l*=k.x,c*=k.y,u*=k.x,p*=k.y,l+=h,c+=b,w=pa(y),y=wp(w)}}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,w=getComputedStyle(v),y=f.compatMode==="CSS1Compat"&&parseFloat(w.marginLeft)+parseFloat(w.marginRight)||0,k=Math.abs(s.clientWidth-v.clientWidth-y),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:w,width:y,height:k}=f;if(u||t(),!y||!k)return;const g=Tl(w),d=Tl(s.clientWidth-(v+y)),h=Tl(s.clientHeight-(w+k)),b=Tl(v),C={rootMargin:-g+"px "+-d+"px "+-h+"px "+-b+"px",threshold:En(0,ps(1,p))||1};let E=!0;function _(I){const z=I[0].intersectionRatio;if(!Wb(f,e.getBoundingClientRect()))return i();if(z!==p){if(!E)return i();z?i(!1,z):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 w,y=l?js(e):null;l&&k();function k(){const g=js(e);y&&!Wb(y,g)&&a(),y=g,w=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(w)}}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[w,y]=N.useState(null),[k,g]=N.useState(null),d=N.useCallback(A=>{A!==C.current&&(C.current=A,y(A))},[]),h=N.useCallback(A=>{A!==E.current&&(E.current=A,g(A))},[]),b=s||w,S=o||k,C=N.useRef(null),E=N.useRef(null),_=N.useRef(u),I=l!=null,z=Sp(l),H=Sp(r),M=Sp(c),$=N.useCallback(()=>{if(!C.current||!E.current)return;const A={placement:t,strategy:a,middleware:f};H.current&&(A.platform=H.current),t2(C.current,E.current,A).then(x=>{const P={...x,isPositioned:M.current!==!1};B.current&&!Ll(_.current,P)&&(_.current=P,mr.flushSync(()=>{p(P)}))})},[f,t,a,H,M]);Ol(()=>{c===!1&&_.current.isPositioned&&(_.current.isPositioned=!1,p(A=>({...A,isPositioned:!1})))},[c]);const B=N.useRef(!1);Ol(()=>(B.current=!0,()=>{B.current=!1}),[]),Ol(()=>{if(b&&(C.current=b),S&&(E.current=S),b&&S){if(z.current)return z.current(b,S,$);$()}},[b,S,$,z,I]);const J=N.useMemo(()=>({reference:C,floating:E,setReference:d,setFloating:h}),[d,h]),q=N.useMemo(()=>({reference:b,floating:S}),[b,S]),L=N.useMemo(()=>{const A={position:a,left:0,top:0};if(!q.floating)return A;const x=Kb(q.floating,u.x),P=Kb(q.floating,u.y);return i?{...A,transform:"translate("+x+"px, "+P+"px)",...Gb(q.floating)>=1.5&&{willChange:"transform"}}:{position:a,left:x,top:P}},[a,i,q.floating,u.x,u.y]);return N.useMemo(()=>({...u,update:$,refs:J,elements:q,floatingStyles:L}),[u,$,J,q,L])}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 T.jsx(ze.svg,{...o,ref:a,width:r,height:s,viewBox:"0 0 30 10",preserveAspectRatio:"none",children:t.asChild?n:T.jsx("polygon",{points:"0,0 30,0 15,10"})})},"Arrow")),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 T.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(y=>{i.current=y,y&&l(y)},[l]),u=Xe(a,c),p=N.useRef(null);N.useEffect(()=>{if(!r)return;const y=p.current;p.current=r.current,y!==p.current&&l(p.current)});const f=o.placementState&&zl(o.placementState),v=f?.[0],w=f?.[1];return r?null:T.jsx(ze.div,{"data-radix-popper-side":v,"data-radix-popper-align":w,...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:w=Qb.Optimized,onPlaced:y,...k}=t,g=Jb(ay,n),[d,h]=N.useState(null),b=Xe(a,h),[S,C]=N.useState(null),E=Nl(S),_=E?.width??0,I=E?.height??0,z=r+(o!=="center"?"-"+o:""),H=typeof p=="number"?p:{top:0,right:0,bottom:0,left:0,...p},M=Array.isArray(u)?u:[u],$=M.length>0,B={padding:H,boundary:M.filter(sy),altBoundary:$},{refs:J,floatingStyles:q,placement:L,isPositioned:A,middlewareData:x}=s2({strategy:"fixed",placement:z,whileElementsMounted:_n((...ae)=>KC(...ae,{animationFrame:w===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()}:{},...B}),c&&d2({...B}),c2({...B,apply:_n(({elements:ae,rects:F,availableWidth:te,availableHeight:xe})=>{const{width:X,height:ie}=F.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($?{strategy:"referenceHidden",...B}:{strategy:"referenceHidden",padding:B.padding,altBoundary:B.altBoundary})]}),P=g.setPlacementState;St(()=>(P(L),()=>{P(void 0)}),[L,P]);const[K,R]=zl(L),O=Ga(y);St(()=>{A&&O?.()},[A,O]);const G=x.arrow?.x,we=x.arrow?.y,fe=x.arrow?.centerOffset!==0,[ye,He]=N.useState();return St(()=>{d&&He(window.getComputedStyle(d).zIndex)},[d]),T.jsx("div",{ref:J.setFloating,"data-radix-popper-content-wrapper":"",style:{...q,transform:A?q.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:ye,"--radix-popper-transform-origin":[x.transformOrigin?.x,x.transformOrigin?.y].join(" "),...x.hide?.referenceHidden&&{visibility:"hidden",pointerEvents:"none"}},dir:t.dir,children:T.jsx(y2,{scope:n,placedSide:K,placedAlign:R,onArrowChange:C,arrowX:G,arrowY:we,shouldHideArrow:fe,children:T.jsx(ze.div,{"data-side":K,"data-align":R,...k,ref:b,style:{...k.style,animation:A?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 T.jsx("span",{ref:s.onArrowChange,style:{position:"absolute",left:s.arrowX,top:s.arrowY,[o]:0,transformOrigin:{top:"",right:"0 0",bottom:"center 0",left:"100% 0"}[s.placedSide],transform:{top:"translateY(100%)",right:"translateY(50%) rotate(90deg) translateX(-50%)",bottom:"rotate(180deg)",left:"translateY(50%) rotate(-90deg) translateX(50%)"}[s.placedSide],visibility:s.shouldHideArrow?"hidden":void 0},children:T.jsx(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 w="",y="";return c==="bottom"?(w=o?p:`${f}px`,y=`${-l}px`):c==="top"?(w=o?p:`${f}px`,y=`${n.floating.height+l}px`):c==="right"?(w=`${-l}px`,y=o?p:`${v}px`):c==="left"&&(w=`${n.floating.width+l}px`,y=o?p:`${v}px`),{data:{x:w,y}}}}),"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 T.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:w,internal_do_not_use_render:y}=e,k=Ep(t),[g,d]=N.useState(null),[h,b]=N.useState(null),[S,C]=N.useState(!1),E=Po(c),[_,I]=Da({prop:n,defaultProp:r??!1,onChange:s,caller:Ir}),[z,H]=Da({prop:o,defaultProp:i,onChange:l,caller:Ir}),M=N.useRef(null),$=N.useRef(!1),[B,J]=N.useState(null),q=Ze(fe=>{J({value:fe,hasConsumerStoppedPropagation:$.current}),H(fe)},"handleUserSelect"),L=N.useRef(z);N.useEffect(()=>{const fe=w?g?.ownerDocument.getElementById(w):g?.form;if(fe instanceof HTMLFormElement){const ye=Ze(()=>H(L.current),"reset");return fe.addEventListener("reset",ye),()=>fe.removeEventListener("reset",ye)}},[w,g,H]);const A=g?!!w||!!g.closest("form"):!0,[x,P]=N.useState(new Set),K=wn(),R=Array.from(x).map(fe=>fe.props.value).join(";"),O=N.useCallback(fe=>{P(ye=>new Set(ye).add(fe))},[]),G=N.useCallback(fe=>{P(ye=>{const He=new Set(ye);return He.delete(fe),He})},[]),we={required:v,trigger:g,onTriggerChange:d,valueNode:h,onValueNodeChange:b,valueNodeHasChildren:S,onValueNodeHasChildrenChange:C,contentId:K,value:z,onValueChange:H,hasConsumerStoppedPropagationRef:$,userSelection:B,onUserSelect:q,open:_,onOpenChange:I,dir:E,triggerPointerDownPosRef:M,disabled:f,name:u,autoComplete:p,form:w,nativeOptions:x,nativeSelectKey:R,isFormControl:A};return T.jsx(ey,{...k,children:T.jsx(A2,{scope:t,...we,children:T.jsx(Fl.Provider,{scope:t,children:T.jsx(j2,{scope:t,onNativeOptionAdd:O,onNativeOptionRemove:G,children:py(y)?y(we):a})})})})}Ze(iy,"SelectProvider");var O2=Ze(e=>{const{__scopeSelect:t,children:a,...n}=e;return T.jsx(iy,{__scopeSelect:t,...n,internal_do_not_use_render:({isFormControl:r})=>T.jsxs(T.Fragment,{children:[a,r?T.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,w]=Tp(k=>{const g=u().filter(b=>!b.disabled),d=g.find(b=>b.value===i.value),h=Pp(g,k,d);h!==void 0&&i.onUserSelect(h.value)}),y=Ze(k=>{l||(i.onOpenChange(!0),w()),k&&(i.triggerPointerDownPosRef.current={x:Math.round(k.pageX),y:Math.round(k.pageY)})},"handleOpen");return T.jsx(ty,{asChild:!0,...o,children:T.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"&&y(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"&&(y(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)&&(y(),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);St(()=>{u(p)},[u,p]);const v=Oo(c.value);return T.jsx(ze.span,{...l,asChild:v?!1:l.asChild,ref:f,style:{pointerEvents:"none"},children:T.jsx(N.Fragment,{children:v?i:o},v?"placeholder":"value")})},"SelectValue")),B2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,children:r,...s}=t;return T.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 T.jsx(q2,{scope:e.__scopeSelect,forceMount:a,children:T.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 St(()=>{l(new DocumentFragment)},[]),T.jsx(is,{present:r||o.open,children:({present:c})=>c?T.jsx(Y2,{...s,ref:a}):T.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(T.jsx(ly,{scope:n,children:T.jsx(Fl.Slot,{scope:n,children:T.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:w,sticky:y,hideWhenDetached:k,avoidCollisions:g,...d}=t,h=gs(Os,n),[b,S]=N.useState(null),[C,E]=N.useState(null),_=Xe(a,S),[I,z]=N.useState(null),[H,M]=N.useState(null),$=Cp(n),[B,J]=N.useState(!1),q=N.useRef(!1),L=N.useRef(!1),A=N.useRef(!1);N.useEffect(()=>{if(b)return $v(b)},[b]),cl();const x=N.useCallback(F=>{const[te,...xe]=$().map(ge=>ge.ref.current),[X]=xe.slice(-1),ie=document.activeElement;for(const ge of F)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},[$,C]),P=N.useCallback(()=>x([I,b]),[x,I,b]);N.useEffect(()=>{B&&P()},[B,P]);const{onOpenChange:K,triggerPointerDownPosRef:R}=h;N.useEffect(()=>{if(b){let F={x:0,y:0};const te=Ze(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=Ze(X=>{F.x<=10&&F.y<=10?X.preventDefault():X.composedPath().includes(b)||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})}}},[b,K,R]),N.useEffect(()=>{const F=Ze(()=>K(!1),"close");return window.addEventListener("blur",F),window.addEventListener("resize",F),()=>{window.removeEventListener("blur",F),window.removeEventListener("resize",F)}},[K]);const[O,G]=Tp(F=>{const te=$().filter(ie=>!ie.disabled),xe=te.find(ie=>ie.ref.current===document.activeElement),X=Pp(te,F,xe);X&&setTimeout(()=>X.ref.current?.focus())}),we=N.useCallback((F,te,xe)=>{const X=!L.current;X&&(L.current=!0);const ie=!q.current&&!xe;h.value!==void 0&&h.value===te||ie?(z(F),ie&&(q.current=!0)):X&&z(F)},[h.value]),fe=N.useCallback(()=>b?.focus(),[b]),ye=N.useCallback((F,te,xe)=>{if(!F)return;const X=!A.current;X&&(A.current=!0);const ie=!q.current&&!xe;(h.value!==void 0&&h.value===te||ie||X)&&M(F)},[h.value]),He=r===oy.Popper?dy:Q2,ae=He===dy?{side:l,sideOffset:c,align:u,alignOffset:p,arrowPadding:f,collisionBoundary:v,collisionPadding:w,sticky:y,hideWhenDetached:k,avoidCollisions:g}:{};return T.jsx(ly,{scope:n,content:b,viewport:C,onViewportChange:E,itemRefCallback:we,selectedItem:I,onItemLeave:fe,itemTextRefCallback:ye,focusSelectedItem:P,selectedItemText:H,position:r,isPositioned:B,searchRef:O,children:T.jsx(Du,{as:K2,allowPinchZoom:!0,children:T.jsx(Zh,{asChild:!0,trapped:h.open,onMountAutoFocus:F=>{F.preventDefault()},onUnmountAutoFocus:Re(s,F=>{h.trigger?.focus({preventScroll:!0}),F.preventDefault()}),children:T.jsx(yu,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:o,onPointerDownOutside:i,onFocusOutside:F=>F.preventDefault(),onDismiss:()=>h.onOpenChange(!1),children:T.jsx(He,{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:Re(d.onKeyDown,F=>{const te=F.ctrlKey||F.altKey||F.metaKey;if(F.key==="Tab"&&F.preventDefault(),!te&&F.key.length===1&&G(F.key),["ArrowUp","ArrowDown","Home","End"].includes(F.key)){let X=$().filter(ie=>!ie.disabled).map(ie=>ie.ref.current);if(["ArrowUp","End"].includes(F.key)&&(X=X.slice().reverse()),["ArrowUp","ArrowDown"].includes(F.key)){const ie=F.target,ge=X.indexOf(ie);X=X.slice(ge+1)}setTimeout(()=>x(X)),F.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),w=N.useRef(!1),y=N.useRef(!0),{viewport:k,selectedItem:g,selectedItemText:d,focusSelectedItem:h}=i,b=N.useCallback(()=>{if(o.trigger&&o.valueNode&&l&&u&&k&&g&&d){const _=o.trigger.getBoundingClientRect(),I=u.getBoundingClientRect(),z=o.valueNode.getBoundingClientRect(),H=d.getBoundingClientRect();if(o.dir!==P2.RTL){const xe=H.left-I.left,X=z.left-xe,ie=_.left-X,ge=_.width+ie,W=Math.max(ge,I.width),Ee=window.innerWidth-Ka,ke=fp(X,[Ka,Math.max(Ka,Ee-W)]);l.style.minWidth=ge+"px",l.style.left=ke+"px"}else{const xe=I.right-H.right,X=window.innerWidth-z.right-xe,ie=window.innerWidth-_.right-X,ge=_.width+ie,W=Math.max(ge,I.width),Ee=window.innerWidth-Ka,ke=fp(X,[Ka,Math.max(Ka,Ee-W)]);l.style.minWidth=ge+"px",l.style.right=ke+"px"}const M=v(),$=window.innerHeight-Ka*2,B=k.scrollHeight,J=window.getComputedStyle(u),q=parseInt(J.borderTopWidth,10),L=parseInt(J.paddingTop,10),A=parseInt(J.borderBottomWidth,10),x=parseInt(J.paddingBottom,10),P=q+L+B+x+A,K=Math.min(g.offsetHeight*5,P),R=window.getComputedStyle(k),O=parseInt(R.paddingTop,10),G=parseInt(R.paddingBottom,10),we=_.top+_.height/2-Ka,fe=$-we,ye=g.offsetHeight/2,He=g.offsetTop+ye,ae=q+L+He,F=P-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+A),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,q+k.offsetTop+(xe?O:0)+ye)+F;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=$+"px",r?.(),requestAnimationFrame(()=>w.current=!0)}},[v,o.trigger,o.valueNode,l,u,k,g,d,o.dir,r]);St(()=>b(),[b]);const[S,C]=N.useState();St(()=>{u&&C(window.getComputedStyle(u).zIndex)},[u]);const E=N.useCallback(_=>{_&&y.current===!0&&(b(),h?.(),y.current=!1)},[b,h]);return T.jsx(X2,{scope:n,contentWrapper:l,shouldExpandOnScrollRef:w,onScrollButtonChange:E,children:T.jsx("div",{ref:c,style:{display:"flex",flexDirection:"column",position:"fixed",zIndex:S},children:T.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 T.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 T.jsxs(T.Fragment,{children:[T.jsx("style",{dangerouslySetInnerHTML:{__html:"[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}"},nonce:r}),T.jsx(Fl.Slot,{scope:n,children:T.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 w=Math.abs(c.current-p.scrollTop);if(w>0){const y=window.innerHeight-Ka*2,k=parseFloat(f.style.minHeight),g=parseFloat(f.style.height),d=Math.max(k,g);if(d<y){const h=d+w,b=Math.min(y,h),S=h-b;f.style.height=b+"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,w]=N.useState(!1),y=Ga(b=>c.itemRefCallback?.(b,r,s)),k=Xe(a,y),g=wn(),d=N.useRef("touch");function h(b){l.hasConsumerStoppedPropagationRef.current=b.isPropagationStopped(),l.onUserSelect(r),l.onOpenChange(!1)}return Ze(h,"handleSelect"),T.jsx(tE,{scope:n,value:r,disabled:s,textId:g,isSelected:u,onItemTextChange:N.useCallback(b=>{f(S=>S||(b?.textContent??"").trim())},[]),children:T.jsx(Fl.ItemSlot,{scope:n,value:r,disabled:s,textValue:p,children:T.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,()=>w(!0)),onBlur:Re(i.onBlur,()=>w(!1)),onClick:Re(i.onClick,b=>{s||d.current!=="mouse"&&h(b)}),onPointerUp:Re(i.onPointerUp,b=>{s||d.current==="mouse"&&h(b)}),onPointerDown:Re(i.onPointerDown,b=>{d.current=b.pointerType}),onPointerMove:Re(i.onPointerMove,b=>{d.current=b.pointerType,s?c.onItemLeave?.():d.current==="mouse"&&b.currentTarget.focus({preventScroll:!0})}),onPointerLeave:Re(i.onPointerLeave,b=>{b.currentTarget===document.activeElement&&c.onItemLeave?.()}),onKeyDown:Re(i.onKeyDown,b=>{s||b.target!==b.currentTarget||c.searchRef?.current!==""&&b.key===" "||(I2.includes(b.key)&&h(b),b.key===" "&&b.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)),w=Xe(a,f,c.onItemTextChange,v),y=p?.textContent,k=N.useMemo(()=>T.jsx("option",{value:c.value,disabled:c.disabled,children:y},c.value),[c.disabled,c.value,y]),{onNativeOptionAdd:g,onNativeOptionRemove:d}=u;return St(()=>(g(k),()=>d(k)),[g,d,k]),T.jsxs(T.Fragment,{children:[T.jsx(ze.span,{id:c.textId,...o,ref:w}),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?T.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:w}=r,y=N.useRef(null),k=Xe(n,y),g=s??"",d=N.useRef(g),h=N.useRef(f),b=N.useRef(!1),S=Array.from(v).some(C=>(C.props.value??"")==="");return N.useEffect(()=>{const C=y.current;if(!C)return;const E=window.HTMLSelectElement.prototype,I=Object.getOwnPropertyDescriptor(E,"value").set,z=f!==null&&f!==h.current;h.current=f;const H=d.current!==g;d.current=g;const M=z&&H;if(z&&!H&&f.value!==g&&!f.hasConsumerStoppedPropagation&&I){b.current=!0;try{I.call(C,f.value),C.dispatchEvent(new Event("change",{bubbles:!0}))}finally{b.current=!1,I.call(C,g)}return}const $=M&&!f.hasConsumerStoppedPropagation;if(H&&I){const B=new Event("change",{bubbles:$});I.call(C,g),C.dispatchEvent(B)}},[g,f]),T.jsxs(ze.select,{"aria-hidden":!0,required:i,tabIndex:-1,name:c,autoComplete:u,disabled:l,form:p,onChange:C=>{b.current||o(C.target.value)},...a,style:{...ry,...a.style},ref:k,defaultValue:g,children:[Oo(s)&&!S?T.jsx("option",{value:""}):null,Array.from(v)]},w)},"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,_t=(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=_t(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)},[]),T.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=_t(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),w=wn(),y=N.useRef(0),k=o??l.disableHoverableContent,g=i??l.delayDuration,d=N.useRef(!1),[h,b]=Da({prop:n,defaultProp:r??!1,onChange:_t(z=>{z?(l.onOpen(),document.dispatchEvent(new CustomEvent(Ip))):l.onClose(),s?.(z)},"onChange"),caller:Ap}),S=N.useMemo(()=>h?d.current?"delayed-open":"instant-open":"closed",[h]),C=N.useCallback(()=>{window.clearTimeout(y.current),y.current=0,d.current=!1,b(!0)},[b]),E=N.useCallback(()=>{window.clearTimeout(y.current),y.current=0,b(!1)},[b]),_=N.useCallback(()=>{window.clearTimeout(y.current),y.current=window.setTimeout(()=>{d.current=!0,b(!0),y.current=0},g)},[g,b]);N.useEffect(()=>()=>{y.current&&(window.clearTimeout(y.current),y.current=0)},[]);const I=f??w;return T.jsx(ey,{...c,children:T.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(y.current),y.current=0)},[E,k]),onOpen:C,onClose:E,disableHoverableContent:k,children:a})})},"Tooltip"),gy="TooltipTrigger",hy=N.forwardRef(_t(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]),T.jsx(ty,{asChild:!0,...l,children:T.jsx(ze.button,{"aria-describedby":o.open?$y(r,o.contentId):r,"data-state":o.stateAttribute,...s,ref:u,onPointerMove:Re(t.onPointerMove,w=>{w.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=_t(e=>{const{__scopeTooltip:t,forceMount:a,children:n,container:r}=e,s=Lo(vy,t);return T.jsx(mE,{scope:t,forceMount:a,children:T.jsx(is,{present:a||s.open,children:T.jsx($u,{asChild:!0,container:r,children:n})})})},"TooltipPortal"),Mo="TooltipContent",yy=N.forwardRef(_t(function(t,a){const n=gE(Mo,t.__scopeTooltip),{forceMount:r=n.forceMount,side:s="top",...o}=t,i=Lo(Mo,t.__scopeTooltip);return T.jsx(is,{present:r||i.open,children:i.disableHoverableContent?T.jsx(xy,{side:s,...o,ref:a}):T.jsx(hE,{side:s,...o,ref:a})})},"TooltipContent")),hE=N.forwardRef(_t(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]),w=N.useCallback((y,k)=>{const g=y.currentTarget,d={x:y.clientX,y:y.clientY},h=wy(d,g.getBoundingClientRect()),b=ky(d,h),S=Ny(k.getBoundingClientRect()),C=Cy([...b,...S]);l(C),f(!0)},[f]);return N.useEffect(()=>()=>v(),[v]),N.useEffect(()=>{if(c&&p){const y=_t(g=>w(g,p),"handleTriggerLeave"),k=_t(g=>w(g,c),"handleContentLeave");return c.addEventListener("pointerleave",y),p.addEventListener("pointerleave",k),()=>{c.removeEventListener("pointerleave",y),p.removeEventListener("pointerleave",k)}}},[c,p,w,v]),N.useEffect(()=>{if(i){const y=_t(k=>{const g=k.target,d={x:k.clientX,y:k.clientY},h=c?.contains(g)||p?.contains(g),b=!Sy(d,i);h?v():b&&(v(),u())},"handleTrackPointerGrace");return document.addEventListener("pointermove",y),()=>document.removeEventListener("pointermove",y)}},[c,p,i,u,v]),T.jsx(xy,{...t,ref:o})},"TooltipContentHoverable")),vE=$h("TooltipContent"),xy=N.forwardRef(_t(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,w]=N.useState(null),y=Xe(a,w);av(v),N.useEffect(()=>(document.addEventListener(Ip,f),()=>document.removeEventListener(Ip,f)),[f]),N.useEffect(()=>{if(u.trigger){const g=_t(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 St(()=>(k(o),()=>{k(void 0)}),[o,k]),T.jsx(yu,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:i,onPointerDownOutside:l,onFocusOutside:g=>g.preventDefault(),onDismiss:f,children:T.jsxs(ny,{"data-state":u.stateAttribute,role:s?void 0:"tooltip",id:s?void 0:u.contentId,...p,...c,ref:y,style:{...c.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"},children:[T.jsx(vE,{children:r}),s?T.jsx($2,{id:u.contentId,role:"tooltip",children:s}):null]})})},"TooltipContentImpl")),bE=N.forwardRef(_t(function(t,a){const{__scopeTooltip:n,...r}=t,s=ql(n);return T.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")}}_t(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}_t(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}]}_t(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}_t(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)}_t(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)}_t(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}_t($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 T.jsx(wE,{scope:n,value:c,max:l,children:T.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 T.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:
|
|
948
|
+
`)},Bk=0,wr=[];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 y=dk([e.lockRef.current],(e.shards||[]).map(Cv),!0).filter(Boolean);return y.forEach(function(k){return k.classList.add("allow-interactivity-".concat(r))}),function(){document.body.classList.remove("block-interactivity-".concat(r)),y.forEach(function(k){return k.classList.remove("allow-interactivity-".concat(r))})}}},[e.inert,e.lockRef.current,e.shards]);var i=N.useCallback(function(y,k){if("touches"in y&&y.touches.length===2||y.type==="wheel"&&y.ctrlKey)return!o.current.allowPinchZoom;var g=hl(y),d=a.current,h="deltaX"in y?y.deltaX:d[0]-g[0],b="deltaY"in y?y.deltaY:d[1]-g[1],S,C=y.target,E=Math.abs(h)>Math.abs(b)?"h":"v";if("touches"in y&&E==="h"&&C.type==="range")return!1;var _=window.getSelection(),I=_&&_.anchorNode,F=I?I===C||I.contains(C):!1;if(F)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 y&&(h||b)&&(n.current=S),!S)return!0;var L=n.current||S;return Mk(L,k,y,L==="h"?h:b)},[]),l=N.useCallback(function(y){var k=y;if(!(!wr.length||wr[wr.length-1]!==s)){var g="deltaY"in k?Sv(k):hl(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)}),b=h.length>0?i(k,h[0]):!o.current.noIsolation;b&&k.cancelable&&k.preventDefault()}}},[]),c=N.useCallback(function(y,k,g,d){var h={name:y,delta:k,target:g,should:d,shadowParent:qk(g)};t.current.push(h),setTimeout(function(){t.current=t.current.filter(function(b){return b!==h})},1)},[]),u=N.useCallback(function(y){a.current=hl(y),n.current=void 0},[]),p=N.useCallback(function(y){c(y.type,Sv(y),y.target,i(y,e.lockRef.current))},[]),f=N.useCallback(function(y){c(y.type,hl(y),y.target,i(y,e.lockRef.current))},[]);N.useEffect(function(){return wr.push(s),e.setCallbacks({onScrollCapture:p,onWheelCapture:p,onTouchMoveCapture:f}),document.addEventListener("wheel",l,xr),document.addEventListener("touchmove",l,xr),document.addEventListener("touchstart",u,xr),function(){wr=wr.filter(function(y){return y!==s}),document.removeEventListener("wheel",l,xr),document.removeEventListener("touchmove",l,xr),document.removeEventListener("touchstart",u,xr)}},[]);var v=e.removeScrollBar,w=e.inert;return N.createElement(N.Fragment,null,w?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 Ou=N.forwardRef(function(e,t){return N.createElement(ml,on({},e,{ref:t,sideCar:Vk}))});Ou.classNames=ml.classNames;var Wk=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},kr=new WeakMap,vl=new WeakMap,bl={},Lu=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]);bl[a]||(bl[a]=new WeakMap);var s=bl[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),w=v!==null&&v!=="false",y=(kr.get(f)||0)+1,k=(s.get(f)||0)+1;kr.set(f,y),s.set(f,k),o.push(f),y===1&&w&&vl.set(f,!0),k===1&&f.setAttribute(a,"true"),w||f.setAttribute(n,"true")}catch(g){console.error("aria-hidden: cannot operate on ",f,g)}})};return u(t),i.clear(),Lu++,function(){o.forEach(function(p){var f=kr.get(p)-1,v=s.get(p)-1;kr.set(p,f),s.set(p,v),f||(vl.has(p)||p.removeAttribute(n),vl.delete(p)),v||p.removeAttribute(a)}),Lu--,Lu||(kr=new WeakMap,kr=new WeakMap,vl=new WeakMap,bl={})}},$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,Ca=(e,t)=>Kk(e,"name",{value:t,configurable:!0}),Mu="Dialog",[Tv,YE]=Sa(Mu),[Yk,ln]=Tv(Mu),Pv=Ca(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:Mu}),[v,w]=N.useState(0),[y,k]=N.useState(0);return T.jsx(Yk,{scope:t,triggerRef:i,contentRef:l,contentId:Nn(),titleId:Nn(),descriptionId:Nn(),titlePresent:v>0,descriptionPresent:y>0,setTitleCount:w,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}),zu=Ca(e=>{const{__scopeDialog:t,forceMount:a,children:n,container:r}=e,s=ln(_v,t);return T.jsx(Qk,{scope:t,forceMount:a,children:N.Children.map(n,o=>T.jsx(is,{present:a||s.open,children:T.jsx(Tu,{asChild:!0,container:r,children:o})}))})},"DialogPortal"),Fu="DialogOverlay",Bu=N.forwardRef(Ca(function(t,a){const n=Iv(Fu,t.__scopeDialog),{forceMount:r=n.forceMount,...s}=t,o=ln(Fu,t.__scopeDialog);return o.modal?T.jsx(is,{present:r||o.open,children:T.jsx(Zk,{...s,ref:a})}):null},"DialogOverlay")),Xk=kn("DialogOverlay.RemoveScroll"),Zk=N.forwardRef(Ca(function(t,a){const{__scopeDialog:n,...r}=t,s=ln(Fu,n),o=Kh(),i=Xe(a,o);return T.jsx(Ou,{as:Xk,allowPinchZoom:!0,shards:N.useMemo(()=>[s.contentRef,...s.branchNodes.map(l=>({current:l}))],[s.contentRef,s.branchNodes]),children:T.jsx(Fe.div,{"data-state":Vu(s.open),...r,ref:i,style:{pointerEvents:"auto",...r.style}})})},"DialogOverlayImpl")),Po="DialogContent",Uu=N.forwardRef(Ca(function(t,a){const n=Iv(Po,t.__scopeDialog),{forceMount:r=n.forceMount,...s}=t,o=ln(Po,t.__scopeDialog);return T.jsx(is,{present:r||o.open,children:o.modal?T.jsx(Jk,{...s,ref:a}):T.jsx(eN,{...s,ref:a})})},"DialogContent")),Jk=N.forwardRef(Ca(function(t,a){const n=ln(Po,t.__scopeDialog),r=N.useRef(null),s=Xe(a,n.contentRef,r);return N.useEffect(()=>{const o=r.current;if(o)return $v(o)},[]),T.jsx(Rv,{...t,ref:s,trapFocus:n.open,disableOutsidePointerEvents:n.open,onCloseAutoFocus:Ae(t.onCloseAutoFocus,o=>{o.preventDefault(),n.triggerRef.current?.focus()}),onPointerDownOutside:Ae(t.onPointerDownOutside,o=>{const i=o.detail.originalEvent,l=i.button===0&&i.ctrlKey===!0;(i.button===2||l)&&o.preventDefault()}),onFocusOutside:Ae(t.onFocusOutside,o=>o.preventDefault())})},"DialogContentModal")),eN=N.forwardRef(Ca(function(t,a){const n=ln(Po,t.__scopeDialog),r=N.useRef(!1),s=N.useRef(!1);return T.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(Ca(function(t,a){const{__scopeDialog:n,trapFocus:r,onOpenAutoFocus:s,onCloseAutoFocus:o,"aria-describedby":i,children:l,...c}=t,u=ln(Po,n);return ul(),T.jsx(ev,{registry:u.branchRegistry,children:T.jsx(Zh,{asChild:!0,loop:!0,trapped:r,branches:u.branchNodes,onMountAutoFocus:s,onUnmountAutoFocus:o,children:T.jsx(xu,{role:"dialog",id:u.contentId,"aria-labelledby":u.titlePresent?u.titleId:void 0,"aria-describedby":u.descriptionPresent?Dv(i,u.descriptionId):i,"data-state":Vu(u.open),...c,ref:a,deferPointerDownOutside:!0,onDismiss:()=>u.onOpenChange(!1),children:l})})})},"DialogContentImpl")),qu=N.forwardRef(Ca(function(t,a){const{__scopeDialog:n,...r}=t,s=ln("DialogTitle",n),{setTitleCount:o}=s;return St(()=>(o(i=>i+1),()=>o(i=>i-1)),[o]),T.jsx(Fe.h2,{id:s.titleId,...r,ref:a})},"DialogTitle")),Av=N.forwardRef(Ca(function(t,a){const{__scopeDialog:n,...r}=t,s=ln("DialogDescription",n),{setDescriptionCount:o}=s;return St(()=>(o(i=>i+1),()=>o(i=>i-1)),[o]),T.jsx(Fe.p,{id:s.descriptionId,...r,ref:a})},"DialogDescription")),tN="DialogClose",jv=N.forwardRef(Ca(function(t,a){const{__scopeDialog:n,...r}=t,s=ln(tN,n);return T.jsx(Fe.button,{type:"button",...r,ref:a,onClick:Ae(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}Ca(Dv,"concatAriaDescribedby");function Vu(e){return e?"open":"closed"}Ca(Vu,"getState");var aN=Object.defineProperty,Ot=(e,t)=>aN(e,"name",{value:t,configurable:!0});function Wu(e){const t=e+"CollectionProvider",[a,n]=Sa(t),[r,s]=a(t,{collectionRef:{current:null},itemMap:new Map}),o=Ot(y=>{const{scope:k,children:g}=y,d=N.useRef(null),h=N.useRef(new Map).current;return T.jsx(r,{scope:k,itemMap:h,collectionRef:d,children:g})},"CollectionProvider");o.displayName=t;const i=e+"CollectionSlot",l=kn(i),c=N.forwardRef((y,k)=>{const{scope:g,children:d}=y,h=s(i,g),b=Xe(k,h.collectionRef);return T.jsx(l,{ref:b,children:d})});c.displayName=i;const u=e+"CollectionItemSlot",p="data-radix-collection-item",f=kn(u),v=N.forwardRef((y,k)=>{const{scope:g,children:d,...h}=y,b=N.useRef(null),S=Xe(k,b),C=s(u,g);return N.useEffect(()=>(C.itemMap.set(b,{ref:b,...h}),()=>void C.itemMap.delete(b))),T.jsx(f,{[p]:"",ref:S,children:d})});v.displayName=u;function w(y){const k=s(e+"CollectionConsumer",y);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(w,"useCollection"),[{Provider:o,Slot:c,ItemSlot:v},w,n]}Ot(Wu,"createCollection");var Ov=new WeakMap,yl=(Ea=class extends Map{constructor(a){super(a);My(this,Ct);zp(this,Ct,[...super.keys()]),Ov.set(this,!0)}set(a,n){return Ov.get(this)&&!this.has(a)&&Qt(this,Ct).push(a),super.set(a,n),this}insert(a,n,r){const s=this.has(n),o=s?this.size:this.size+1,i=Hu(a),l=i>=0?Math.min(i,o-1):Math.max(o+i,0);if(s?Qt(this,Ct).indexOf(n)===l:l===this.size)return this.set(n,r),this;const c=Qt(this,Ct).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 Ea(this);return s.insert(a,n,r),s}before(a){const n=Qt(this,Ct).indexOf(a)-1;if(!(n<0))return this.entryAt(n)}setBefore(a,n,r){const s=Qt(this,Ct).indexOf(a);if(s===-1)return this;const o=Qt(this,Ct).indexOf(n),i=o!==-1&&o<s?s-1:s;return this.insert(i,n,r)}after(a){let n=Qt(this,Ct).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=Qt(this,Ct).indexOf(a);if(s===-1)return this;const o=Qt(this,Ct).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,Ct,[]),super.clear()}delete(a){const n=super.delete(a);return n&&Qt(this,Ct).splice(Qt(this,Ct).indexOf(a),1),n}deleteAt(a){const n=this.keyAt(a);return n!==void 0?this.delete(n):!1}at(a){const n=xl(Qt(this,Ct),a);if(n!==void 0)return this.get(n)}entryAt(a){const n=xl(Qt(this,Ct),a);if(n!==void 0)return[n,this.get(n)]}indexOf(a){return Qt(this,Ct).indexOf(a)}keyAt(a){return xl(Qt(this,Ct),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 Ea(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 Ea(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 Ea(n)}toReversed(){const a=new Ea;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 Ea(n)}slice(a,n){const r=new Ea;for(const s of Qt(this,Ct).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}},Ct=new WeakMap,Ot(Ea,"OrderedDict"),Ea);function xl(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(xl,"at");function Lv(e,t){const a=e.length,n=Hu(t),r=n>=0?n:a+n;return r<0||r>=a?-1:r}Ot(Lv,"toSafeIndex");function Hu(e){return e!==e||e===0?0:Math.trunc(e)}Ot(Hu,"toSafeInteger");function nN(e){const t=e+"CollectionProvider",[a,n]=Sa(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?T.jsx(u,{...E,state:C}):T.jsx(c,{...E}),"CollectionProvider");l.displayName=t;const c=Ot(C=>{const E=d();return T.jsx(u,{...C,state:E})},"CollectionInit");c.displayName=e+"CollectionInit";const u=Ot(C=>{const{scope:E,children:_,state:I}=C,F=N.useRef(null),[W,L]=N.useState(null),$=Xe(F,L),[B,ee]=I,M=N.useRef(new yl),O=N.useCallback(()=>{const A=M.current;return Fv(A)||A.sort(wl),A},[]);return N.useEffect(()=>{if(!W)return;const A=Bv(()=>{ee(x=>{const P=x.toSorted(wl);return P.some(([te],q)=>x.keyAt(q)!==te)?P:x})});return A.observe(W,{childList:!0,subtree:!0}),()=>{A.disconnect()}},[W,ee]),T.jsx(r,{scope:E,collectionElementRef:$,collectionElementRefObject:F,getCollection:O,setCollection:ee,registryRef:M,children:T.jsx(o,{scope:E,collectionElement:W,collection:B,children:_})})},"CollectionProviderImpl");u.displayName=e+"CollectionProviderImpl";const p=e+"CollectionSlot",f=kn(p),v=N.forwardRef((C,E)=>{const{scope:_,children:I}=C,F=s(p,_),W=Xe(E,F.collectionElementRef);return T.jsx(f,{ref:W,children:I})});v.displayName=p;const w=e+"CollectionItemSlot",y="data-radix-collection-item",k=kn(w),g=N.forwardRef((C,E)=>{const{scope:_,children:I,...F}=C,W=N.useRef(null),L=s(w,_),{setCollection:$,registryRef:B}=L,ee=N.useRef(F);Mv(ee.current,F)||(ee.current=F);const M=ee.current,O=N.useCallback(P=>{const G=B.current;P?G.set(P,{...ee.current,element:P}):W.current&&G.delete(W.current)},[B]),A=Xe(E,O,W);St(()=>{const P=W.current,G=B.current;P&&G.has(P)&&G.set(P,{...M,element:P})},[M,B]);const x=N.useRef(null);return N.useEffect(()=>{const P=W.current,G=x.current;(G?.element??null)===P&&(!P||G?.itemData===M)||(x.current=P?{element:P,itemData:M}:null,$(te=>{const q=new yl(te);return G&&G.element!==P&&q.delete(G.element),P&&q.set(P,{...M,element:P}),q.sort(wl)}))}),N.useEffect(()=>()=>{const P=x.current;x.current=null,P&&$(G=>{if(!G.has(P.element))return G;const te=new yl(G);return te.delete(P.element),te})},[$]),T.jsx(k,{[y]:"",ref:A,children:I})});g.displayName=w;function d(){return N.useState(new yl)}Ot(d,"useInitCollection");function h(C){const{collection:E}=i(e+"CollectionConsumer",C);return E}Ot(h,"useCollection");function b(C){const{getCollection:E}=s(e+"CollectionConsumer",C);return E}return Ot(b,"useGetCollection"),[{Provider:l,Slot:v,ItemSlot:g},{createCollectionScope:n,useCollection:h,useGetCollection:b,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 wl(e,t){return!e[1].element||!t[1].element?0:zv(e[1].element,t[1].element)?-1:1}Ot(wl,"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 _o(e){const t=N.useContext(iN);return e||t||oN.LTR}rN(_o,"useDirection");var lN=Object.defineProperty,Gu=(e,t)=>lN(e,"name",{value:t,configurable:!0}),Ku=!1;function Uv(){const[e,t]=N.useState(Ku);return N.useEffect(()=>{Ku||(Ku=!0,t(!0))},[]),e}Gu(Uv,"useIsHydrated");var qv=Fn[" useSyncExternalStore ".trim().toString()];function Vv(){return()=>{}}Gu(Vv,"subscribe");function Wv(){return qv(Vv,()=>!0,()=>!1)}Gu(Wv,"useIsHydratedModern");var dN=typeof qv=="function"?Wv:Uv,cN=Object.defineProperty,Rs=(e,t)=>cN(e,"name",{value:t,configurable:!0}),Yu="rovingFocusGroup.onEntryFocus",uN={bubbles:!1,cancelable:!0},kl="RovingFocusGroup",[Qu,Hv,pN]=Wu(kl),[fN,Nl]=Sa(kl,[pN]),Gv={Vertical:"vertical",Horizontal:"horizontal"},mN={RTL:"rtl"},[gN,hN]=fN(kl),Kv=N.forwardRef(Rs(function(t,a){return T.jsx(Qu.Provider,{scope:t.__scopeRovingFocusGroup,children:T.jsx(Qu.Slot,{scope:t.__scopeRovingFocusGroup,children:T.jsx(vN,{...t,ref:a})})})},"RovingFocusGroup")),vN=N.forwardRef(Rs(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),w=Xe(a,v),y=_o(o),[k,g]=Da({prop:i,defaultProp:l??null,onChange:c,caller:kl}),[d,h]=N.useState(!1),b=Ka(u),S=Hv(n),C=N.useRef(!1),[E,_]=N.useState(0);return N.useEffect(()=>{const I=v.current;if(I)return I.addEventListener(Yu,b),()=>I.removeEventListener(Yu,b)},[b]),T.jsx(gN,{scope:n,orientation:r,dir:y,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:T.jsx(Fe.div,{tabIndex:d||E===0?-1:0,"data-orientation":r,...f,ref:w,style:{outline:"none",...t.style},onMouseDown:Ae(t.onMouseDown,()=>{C.current=!0}),onFocus:Ae(t.onFocus,I=>{const F=!C.current;if(I.target===I.currentTarget&&F&&!d){const W=new CustomEvent(Yu,uN);if(I.currentTarget.dispatchEvent(W),!W.defaultPrevented){const L=S().filter(O=>O.focusable),$=L.find(O=>O.active),B=L.find(O=>O.id===k),M=[$,B,...L].filter(Boolean).map(O=>O.ref.current);Xu(M,p)}}C.current=!1}),onBlur:Ae(t.onBlur,()=>h(!1))})})},"RovingFocusGroupImpl")),bN="RovingFocusGroupItem",Yv=N.forwardRef(Rs(function(t,a){const{__scopeRovingFocusGroup:n,focusable:r=!0,active:s=!1,tabStopId:o,children:i,...l}=t,c=Nn(),u=o||c,p=hN(bN,n),f=p.currentTabStopId===u,v=Hv(n),{onFocusableItemAdd:w,onFocusableItemRemove:y,currentTabStopId:k}=p,g=dN();return St(()=>{if(!(!g||!r))return w(),()=>y()},[g,r,w,y]),N.useEffect(()=>{if(!(g||!r))return w(),()=>y()},[g,r,w,y]),T.jsx(Qu.ItemSlot,{scope:n,id:u,focusable:r,active:s,children:T.jsx(Fe.span,{tabIndex:f?0:-1,"data-orientation":p.orientation,...l,ref:a,onMouseDown:Ae(t.onMouseDown,d=>{r?p.onItemFocus(u):d.preventDefault()}),onFocus:Ae(t.onFocus,()=>p.onItemFocus(u)),onKeyDown:Ae(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(()=>Xu(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}Rs(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]}Rs(Xv,"getFocusIntent");function Xu(e,t=!1){const a=document.activeElement;for(const n of e)if(n===a||(n.focus({preventScroll:t}),document.activeElement!==a))return}Rs(Xu,"focusFirst");function Zv(e,t){return e.map((a,n)=>e[(t+n)%e.length])}Rs(Zv,"wrapArray");var xN=Object.defineProperty,Nr=(e,t)=>xN(e,"name",{value:t,configurable:!0}),Jv={Automatic:"automatic",Manual:"manual"},Zu="Tabs",[wN,QE]=Sa(Zu,[Nl]),eb=Nl(),[kN,Ju]=wN(Zu),NN=N.forwardRef(Nr(function(t,a){const{__scopeTabs:n,value:r,onValueChange:s,defaultValue:o,orientation:i="horizontal",dir:l,activationMode:c=Jv.Automatic,...u}=t,p=_o(l),[f,v]=Da({prop:r,onChange:s,defaultProp:o??"",caller:Zu});return T.jsx(kN,{scope:n,baseId:Nn(),value:f,onValueChange:v,orientation:i,dir:p,activationMode:c,children:T.jsx(Fe.div,{dir:p,"data-orientation":i,...u,ref:a})})},"Tabs")),SN="TabsList",CN=N.forwardRef(Nr(function(t,a){const{__scopeTabs:n,loop:r=!0,...s}=t,o=Ju(SN,n),i=eb(n);return T.jsx(Kv,{asChild:!0,...i,orientation:o.orientation,dir:o.dir,loop:r,children:T.jsx(Fe.div,{role:"tablist","aria-orientation":o.orientation,...s,ref:a})})},"TabsList")),EN="TabsTrigger",$N=N.forwardRef(Nr(function(t,a){const{__scopeTabs:n,value:r,disabled:s=!1,...o}=t,i=Ju(EN,n),l=eb(n),c=ep(i.baseId,r),u=tp(i.baseId,r),p=r===i.value;return T.jsx(Yv,{asChild:!0,...l,focusable:!s,active:p,children:T.jsx(Fe.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:Ae(t.onMouseDown,f=>{!s&&f.button===0&&f.ctrlKey===!1?(f.currentTarget.focus(),i.onValueChange(r)):f.preventDefault()}),onKeyDown:Ae(t.onKeyDown,f=>{s||f.target!==f.currentTarget||[" ","Enter"].includes(f.key)&&i.onValueChange(r)}),onFocus:Ae(t.onFocus,()=>{const f=i.activationMode!==Jv.Manual;!p&&!s&&f&&i.onValueChange(r)})})})},"TabsTrigger")),TN="TabsContent",PN=N.forwardRef(Nr(function(t,a){const{__scopeTabs:n,value:r,forceMount:s,children:o,...i}=t,l=Ju(TN,n),c=ep(l.baseId,r),u=tp(l.baseId,r),p=r===l.value,f=N.useRef(p);return N.useEffect(()=>{const v=requestAnimationFrame(()=>f.current=!1);return()=>cancelAnimationFrame(v)},[]),T.jsx(is,{present:s||p,children:({present:v})=>T.jsx(Fe.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 ep(e,t){return`${e}-trigger-${t}`}Nr(ep,"makeTriggerId");function tp(e,t){return`${e}-content-${t}`}Nr(tp,"makeContentId");var _N=Object.defineProperty,IN=(e,t)=>_N(e,"name",{value:t,configurable:!0});function Sl(e){const[t,a]=N.useState(void 0);return St(()=>{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(Sl,"useSize");var RN=Object.defineProperty,ls=(e,t)=>RN(e,"name",{value:t,configurable:!0}),ap="Switch",[AN,XE]=Sa(ap),[jN,np]=AN(ap);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:ap}),[w,y]=N.useState(null),[k,g]=N.useState(null),[d,h]=N.useState(null),b=w?!!o||!!w.closest("form"):!0,S={checked:f,setChecked:v,disabled:s,control:w,setControl:y,name:i,form:o,value:u,userClick:d,onUserClick:h,required:c,defaultChecked:r,isFormControl:b,bubbleInput:k,setBubbleInput:g};return T.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:w,bubbleInput:y}=np(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]),T.jsx(Fe.button,{type:"button",role:"switch","aria-checked":c,"aria-required":u,"data-state":sp(c),"data-disabled":l?"":void 0,disabled:l,value:i,...n,ref:k,onClick:Ae(a,d=>{const h=d.isPropagationStopped();v({requestedChecked:!c,hasConsumerStoppedPropagation:h}),f(b=>!b),y&&w&&(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 T.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})=>T.jsxs(T.Fragment,{children:[T.jsx(ON,{...f,ref:a,__scopeSwitch:n}),v&&T.jsx(zN,{__scopeSwitch:n})]})})},"Switch")),LN="SwitchThumb",nb=N.forwardRef(ls(function(t,a){const{__scopeSwitch:n,...r}=t,s=np(LN,n);return T.jsx(Fe.span,{"data-state":sp(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:w,setBubbleInput:y}=np(MN,t),k=Xe(r,y),g=Sl(s),d=N.useRef(!1),h=N.useRef(i),b=N.useRef(o),S=N.useRef(null);N.useEffect(()=>{const E=w;if(!E)return;const _=window.HTMLInputElement.prototype,F=Object.getOwnPropertyDescriptor(_,"checked").set;if(!F)return;const W=h.current!==i;h.current=i;const L=o!==null&&o!==b.current;if(b.current=o,L)S.current=W?null:o,W&&F.call(E,i),E.dispatchEvent(new Event("click",{bubbles:!o.hasConsumerStoppedPropagation}));else if(W){const $=S.current;S.current=null;const B=$?.requestedChecked===i;d.current=!0,F.call(E,i),E.dispatchEvent(new Event("click",{bubbles:!(B&&$.hasConsumerStoppedPropagation)})),d.current=!1}},[w,i,o]);const C=N.useRef(i);return T.jsx(Fe.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:Ae(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 sp(e){return e?"checked":"unchecked"}ls(sp,"getState");var FN=Object.defineProperty,En=(e,t)=>FN(e,"name",{value:t,configurable:!0}),rp="Checkbox",[BN,ZE]=Sa(rp),[UN,op]=BN(rp);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:rp}),[w,y]=N.useState(null),[k,g]=N.useState(null),[d,h]=N.useState(null),b=w?!!o||!!w.closest("form"):!0,S={checked:f,disabled:s,setChecked:v,control:w,setControl:y,name:i,form:o,value:u,userClick:d,onUserClick:h,required:c,defaultChecked:Oa(r)?!1:r,isFormControl:b,bubbleInput:k,setBubbleInput:g};return T.jsx(UN,{scope:t,...S,children:ob(p)?p(S):n})}En(rb,"CheckboxProvider");var qN="CheckboxTrigger",VN=N.forwardRef(En(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:w,bubbleInput:y}=op(qN,t),k=Xe(s,p),g=N.useRef(c);return N.useEffect(()=>{const d=o?.form;if(d){const h=En(()=>f(g.current),"reset");return d.addEventListener("reset",h),()=>d.removeEventListener("reset",h)}},[o,f]),T.jsx(Fe.button,{type:"button",role:"checkbox","aria-checked":Oa(c)?"mixed":c,"aria-required":u,"data-state":ip(c),"data-disabled":l?"":void 0,disabled:l,value:i,...r,ref:k,onKeyDown:Ae(a,d=>{d.key==="Enter"&&d.preventDefault()}),onClick:Ae(n,d=>{const h=d.isPropagationStopped();v({requestedChecked:Oa(c)?!0:!c,hasConsumerStoppedPropagation:h}),f(b=>Oa(b)?!0:!b),y&&w&&(h||d.stopPropagation())})})},"CheckboxTrigger")),WN=N.forwardRef(En(function(t,a){const{__scopeCheckbox:n,name:r,checked:s,defaultChecked:o,required:i,disabled:l,value:c,onCheckedChange:u,form:p,...f}=t;return T.jsx(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})=>T.jsxs(T.Fragment,{children:[T.jsx(VN,{...f,ref:a,__scopeCheckbox:n}),v&&T.jsx(YN,{__scopeCheckbox:n})]})})},"Checkbox")),HN="CheckboxIndicator",GN=N.forwardRef(En(function(t,a){const{__scopeCheckbox:n,forceMount:r,...s}=t,o=op(HN,n);return T.jsx(is,{present:r||Oa(o.checked)||o.checked===!0,children:T.jsx(Fe.span,{"data-state":ip(o.checked),"data-disabled":o.disabled?"":void 0,...s,ref:a,style:{pointerEvents:"none",...t.style}})})},"CheckboxIndicator")),KN="CheckboxBubbleInput",YN=N.forwardRef(En(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:w,setBubbleInput:y}=op(KN,t),k=Xe(r,y),g=Sl(s),d=N.useRef(!1),h=N.useRef(i),b=N.useRef(o),S=N.useRef(null);N.useEffect(()=>{const E=w;if(!E)return;const _=window.HTMLInputElement.prototype,F=Object.getOwnPropertyDescriptor(_,"checked").set;if(!F)return;const W=h.current!==i;h.current=i;const L=o!==null&&o!==b.current;if(b.current=o,L)S.current=W?null:o,W&&(E.indeterminate=Oa(i),F.call(E,Oa(i)?!1:i)),E.dispatchEvent(new Event("click",{bubbles:!o.hasConsumerStoppedPropagation}));else if(W){const $=S.current;S.current=null;const B=$?.requestedChecked===i;d.current=!0,E.indeterminate=Oa(i),F.call(E,Oa(i)?!1:i),E.dispatchEvent(new Event("click",{bubbles:!(B&&$.hasConsumerStoppedPropagation)})),d.current=!1}},[w,i,o]);const C=N.useRef(Oa(i)?!1:i);return T.jsx(Fe.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:Ae(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"}En(ob,"isFunction");function Oa(e){return e==="indeterminate"}En(Oa,"isIndeterminate");function ip(e){return Oa(e)?"indeterminate":e?"checked":"unchecked"}En(ip,"getState");var QN=Object.defineProperty,XN=(e,t)=>QN(e,"name",{value:t,configurable:!0}),ZN=N.forwardRef(XN(function(t,a){return T.jsx(Fe.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(w=>{let[y,k]=w;return Array.isArray(k)?k.includes({...s,...i}[y]):{...s,...i}[y]===k})?[...c,p,f]:c},[]);return cb(e,o,l,a?.class,a?.className)},lp="-",JN=e=>{const t=tS(e),{conflictingClassGroups:a,conflictingClassGroupModifiers:n}=e;return{getClassGroupId:o=>{const i=o.split(lp);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(lp);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])=>{dp(o,n,s,t)}),n},dp=(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)){dp(r(n),t,a,n);return}t.validators.push({validator:r,classGroupId:a});return}Object.entries(r).forEach(([s,o])=>{dp(o,mb(t,s),a,n)})})},mb=(e,t)=>{let a=e;return t.split(lp).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),w=v?f.substring(1):f,y=p&&p>u?p-u:void 0;return{modifiers:l,hasImportantModifier:v,baseClassName:w,maybePostfixModifierPosition:y}};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 w=!!v,y=n(w?f.substring(0,v):f);if(!y){if(!w){i=c+(i.length>0?" "+i:i);continue}if(y=n(f),!y){i=c+(i.length>0?" "+i:i);continue}w=!1}const k=oS(u).join(":"),g=p?k+gb:k,d=g+y;if(s.includes(d))continue;s.push(d);const h=r(y,w);for(let b=0;b<h.length;++b){const S=h[b];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)\(.+\)$/,$n=e=>Sr(e)||fS.has(e)||pS.test(e),ds=e=>Cr(e,"length",ES),Sr=e=>!!e&&!Number.isNaN(Number(e)),cp=e=>Cr(e,"number",Sr),Io=e=>!!e&&Number.isInteger(Number(e)),yS=e=>e.endsWith("%")&&Sr(e.slice(0,-1)),Le=e=>vb.test(e),cs=e=>mS.test(e),xS=new Set(["length","size","percentage"]),wS=e=>Cr(e,xS,bb),kS=e=>Cr(e,"position",bb),NS=new Set(["image","url"]),SS=e=>Cr(e,NS,TS),CS=e=>Cr(e,"",$S),Ro=()=>!0,Cr=(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"),w=lt("gradientColorStopPositions"),y=lt("inset"),k=lt("margin"),g=lt("opacity"),d=lt("padding"),h=lt("saturate"),b=lt("scale"),S=lt("sepia"),C=lt("skew"),E=lt("space"),_=lt("translate"),I=()=>["auto","contain","none"],F=()=>["auto","hidden","clip","visible","scroll"],W=()=>["auto",Le,t],L=()=>[Le,t],$=()=>["",$n,ds],B=()=>["auto",Sr,Le],ee=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],M=()=>["solid","dashed","dotted","double","none"],O=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],A=()=>["start","end","center","between","around","evenly","stretch"],x=()=>["","0",Le],P=()=>["auto","avoid","all","avoid-page","page","left","right","column"],G=()=>[Sr,Le];return{cacheSize:500,separator:":",theme:{colors:[Ro],spacing:[$n,ds],blur:["none","",cs,Le],brightness:G(),borderColor:[e],borderRadius:["none","","full",cs,Le],borderSpacing:L(),borderWidth:$(),contrast:G(),grayscale:x(),hueRotate:G(),invert:x(),gap:L(),gradientColorStops:[e],gradientColorStopPositions:[yS,ds],inset:W(),margin:W(),opacity:G(),padding:L(),saturate:G(),scale:G(),sepia:x(),skew:G(),space:L(),translate:L()},classGroups:{aspect:[{aspect:["auto","square","video",Le]}],container:["container"],columns:[{columns:[cs]}],"break-after":[{"break-after":P()}],"break-before":[{"break-before":P()}],"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:[...ee(),Le]}],overflow:[{overflow:F()}],"overflow-x":[{"overflow-x":F()}],"overflow-y":[{"overflow-y":F()}],overscroll:[{overscroll:I()}],"overscroll-x":[{"overscroll-x":I()}],"overscroll-y":[{"overscroll-y":I()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[y]}],"inset-x":[{"inset-x":[y]}],"inset-y":[{"inset-y":[y]}],start:[{start:[y]}],end:[{end:[y]}],top:[{top:[y]}],right:[{right:[y]}],bottom:[{bottom:[y]}],left:[{left:[y]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",Io,Le]}],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",Le]}],grow:[{grow:x()}],shrink:[{shrink:x()}],order:[{order:["first","last","none",Io,Le]}],"grid-cols":[{"grid-cols":[Ro]}],"col-start-end":[{col:["auto",{span:["full",Io,Le]},Le]}],"col-start":[{"col-start":B()}],"col-end":[{"col-end":B()}],"grid-rows":[{"grid-rows":[Ro]}],"row-start-end":[{row:["auto",{span:[Io,Le]},Le]}],"row-start":[{"row-start":B()}],"row-end":[{"row-end":B()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",Le]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",Le]}],gap:[{gap:[f]}],"gap-x":[{"gap-x":[f]}],"gap-y":[{"gap-y":[f]}],"justify-content":[{justify:["normal",...A()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...A(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...A(),"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",Le,t]}],"min-w":[{"min-w":[Le,t,"min","max","fit"]}],"max-w":[{"max-w":[Le,t,"none","full","min","max","fit","prose",{screen:[cs]},cs]}],h:[{h:[Le,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[Le,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[Le,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[Le,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",cp]}],"font-family":[{font:[Ro]}],"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",Le]}],"line-clamp":[{"line-clamp":["none",Sr,cp]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",$n,Le]}],"list-image":[{"list-image":["none",Le]}],"list-style-type":[{list:["none","disc","decimal",Le]}],"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:[...M(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",$n,ds]}],"underline-offset":[{"underline-offset":["auto",$n,Le]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:L()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",Le]}],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",Le]}],"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:[...ee(),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:[w]}],"gradient-via-pos":[{via:[w]}],"gradient-to-pos":[{to:[w]}],"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:[...M(),"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:M()}],"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:["",...M()]}],"outline-offset":[{"outline-offset":[$n,Le]}],"outline-w":[{outline:[$n,ds]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:$()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[g]}],"ring-offset-w":[{"ring-offset":[$n,ds]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",cs,CS]}],"shadow-color":[{shadow:[Ro]}],opacity:[{opacity:[g]}],"mix-blend":[{"mix-blend":[...O(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":O()}],filter:[{filter:["","none"]}],blur:[{blur:[a]}],brightness:[{brightness:[n]}],contrast:[{contrast:[l]}],"drop-shadow":[{"drop-shadow":["","none",cs,Le]}],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",Le]}],duration:[{duration:G()}],ease:[{ease:["linear","in","out","in-out",Le]}],delay:[{delay:G()}],animate:[{animate:["none","spin","ping","pulse","bounce",Le]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[b]}],"scale-x":[{"scale-x":[b]}],"scale-y":[{"scale-y":[b]}],rotate:[{rotate:[Io,Le]}],"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",Le]}],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",Le]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":L()}],"scroll-mx":[{"scroll-mx":L()}],"scroll-my":[{"scroll-my":L()}],"scroll-ms":[{"scroll-ms":L()}],"scroll-me":[{"scroll-me":L()}],"scroll-mt":[{"scroll-mt":L()}],"scroll-mr":[{"scroll-mr":L()}],"scroll-mb":[{"scroll-mb":L()}],"scroll-ml":[{"scroll-ml":L()}],"scroll-p":[{"scroll-p":L()}],"scroll-px":[{"scroll-px":L()}],"scroll-py":[{"scroll-py":L()}],"scroll-ps":[{"scroll-ps":L()}],"scroll-pe":[{"scroll-pe":L()}],"scroll-pt":[{"scroll-pt":L()}],"scroll-pr":[{"scroll-pr":L()}],"scroll-pb":[{"scroll-pb":L()}],"scroll-pl":[{"scroll-pl":L()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",Le]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[$n,ds,cp]}],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 Er(){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"}}),$r=N.forwardRef(({className:e,variant:t,size:a,asChild:n=!1,...r},s)=>{const o=n?_1:"button";return T.jsx(o,{className:ut(_S({variant:t,size:a,className:e})),ref:s,...r})});$r.displayName="Button";const Cl=N.forwardRef(({className:e,type:t,...a},n)=>T.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}));Cl.displayName="Input";const yb=N.forwardRef(({className:e,...t},a)=>T.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 El=N.forwardRef(({className:e,...t},a)=>T.jsx(ZN,{ref:a,className:ut("flex items-center gap-2 text-sm leading-none font-medium select-none",e),...t}));El.displayName="Label";const xb=N.forwardRef(({className:e,...t},a)=>T.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})=>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})=>T.jsx("div",{className:ut("leading-none font-semibold",e),...t}),AS=({className:e,...t})=>T.jsx("div",{className:ut("px-6",e),...t}),jS=({className:e,...t})=>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})=>T.jsx("div",{className:ut(DS({variant:t}),e),...a}),up=NN,$l=N.forwardRef(({className:e,...t},a)=>T.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}));$l.displayName="TabsList";const Ao=N.forwardRef(({className:e,...t},a)=>T.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}));Ao.displayName="TabsTrigger";const LS=N.forwardRef(({className:e,...t},a)=>T.jsx(PN,{ref:a,className:ut("mt-3 focus-visible:outline-none",e),...t}));LS.displayName="TabsContent";const MS=({...e})=>T.jsx(zu,{container:Er(),...e}),wb=N.forwardRef(({className:e,...t},a)=>T.jsx(Bu,{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)=>T.jsxs(MS,{children:[T.jsx(wb,{}),T.jsxs(Uu,{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,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:[T.jsx(Sh,{className:"h-4 w-4"}),T.jsx("span",{className:"sr-only",children:"关闭"})]})]})]}));zS.displayName="DialogContent";const FS=N.forwardRef(({className:e,...t},a)=>T.jsx(qu,{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)=>T.jsx(Av,{ref:a,className:ut("text-sm text-muted-foreground",e),...t}));BS.displayName="DialogDescription";const US=N.forwardRef(({className:e,...t},a)=>T.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:T.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)=>T.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:T.jsx(GN,{className:ut("flex items-center justify-center text-current"),children:T.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 pp(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,w]=N.useState(""),[y,k]=N.useState(!1),[g,d]=N.useState(String(a??"")),[h,b]=N.useState(!1),S=N.useRef(null),C=N.useRef(null);N.useEffect(()=>{const L=window.setTimeout(()=>{c==="local"?S.current?.focus():C.current?.focus()},30);return()=>window.clearTimeout(L)},[c]);const E=L=>{L!==c&&(u(L),d(""),w(""),f(L==="local"?o:""))},_=async L=>{if(L&&L.preventDefault(),!y){if(p.trim()===""||v===""){d(c==="local"?"本地账号和密码都要填":"域账号和密码都要填");return}k(!0),d("");try{const $=await GS({username:p.trim().normalize("NFKC"),password:v.normalize("NFKC"),mode:c});pp(VS,$.token),pp(WS,JSON.stringify($.user??null)),pp(HS,String($.user?.name??$.user?.id??p.trim())),w(""),n()}catch($){d($ instanceof Error?$.message:String($))}finally{k(!1)}}},I=String(e?.board?.title??"工作空间"),F=/LDAP|域|目录|连不上/.test(g),W=T.jsxs(xb,{className:"w-[380px] shrink-0 py-0 shadow-md",children:[T.jsx(IS,{className:"gap-2 px-5 pb-4 pt-5",children:T.jsxs("div",{className:"flex items-center gap-2",children:[T.jsx("span",{className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-lg bg-primary text-[13px] leading-none text-primary-foreground","aria-hidden":!0,children:"◈"}),T.jsxs("div",{className:"min-w-0",children:[T.jsx(RS,{className:"truncate text-[15px] leading-tight",children:I}),T.jsx("div",{className:"text-[11px] leading-tight text-muted-foreground",children:"需求与任务工作空间"})]})]})}),T.jsxs(AS,{className:"px-5 pb-0",children:[T.jsx(up,{value:c,onValueChange:E,children:T.jsxs($l,{className:"w-full",children:[T.jsx(Ao,{value:"ldap",disabled:!l,className:"flex-1 text-[13px]",children:"LDAP 账号"}),T.jsx(Ao,{value:"local",disabled:!i,className:"flex-1 text-[13px]",children:"本地超管"})]})}),T.jsx("p",{className:"mb-3 mt-3 text-[12px] leading-relaxed text-muted-foreground",children:c==="ldap"?"用公司目录账号登录,登录后写操作与审计都记在这个名字下。":`用平台自带的超管账号登录。默认 ${o} / admin,改过之后用新口令。`}),T.jsxs("form",{className:"grid w-full max-w-full gap-3",onSubmit:_,children:[T.jsxs("div",{className:"grid min-w-0 gap-1.5",children:[T.jsx(El,{htmlFor:"studio-account",className:"text-[12px] text-muted-foreground",children:c==="local"?"超管账号":"域账号"}),T.jsx(Cl,{id:"studio-account",ref:C,name:"studio-account",autoComplete:"off",spellCheck:!1,className:"box-border h-9 w-full min-w-0 text-[13px]",value:p,placeholder:c==="local"?o:"域账号",onChange:L=>f(L.target.value)})]}),T.jsxs("div",{className:"grid min-w-0 gap-1.5",children:[T.jsx(El,{htmlFor:"studio-pass",className:"text-[12px] text-muted-foreground",children:"密码"}),T.jsxs("div",{className:"relative min-w-0",children:[T.jsx(Cl,{id:"studio-pass",ref:S,type:h?"text":"password",name:"studio-pass",autoComplete:"new-password",className:"box-border h-9 w-full min-w-0 pr-9 text-[13px]",value:v,placeholder:c==="local"?"默认口令 admin":"域密码",onChange:L=>w(L.target.value)}),T.jsx("button",{type:"button","aria-label":h?"隐藏密码":"显示密码",title:h?"隐藏密码":"显示密码(看清是不是被输入法打成了全角)",onClick:()=>b(L=>!L),className:"absolute right-1 top-1 flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground hover:bg-muted hover:text-foreground",children:h?T.jsx(E1,{size:14}):T.jsx($1,{size:14})})]})]}),g===""?null:T.jsxs("div",{className:"flex items-start gap-1.5 rounded-md border border-destructive/35 bg-destructive/5 px-2.5 py-2 text-[12px] leading-relaxed text-destructive",children:[T.jsx("span",{"aria-hidden":!0,children:"!"}),T.jsx("span",{className:"min-w-0 break-words",children:g})]}),F?T.jsx("div",{className:"text-[11px] leading-relaxed text-muted-foreground",children:"连不上目录服务时,切到「本地超管」用平台账号进来;网络打通后再用域账号。"}):null,T.jsx($r,{type:"submit",disabled:y,className:"h-9 w-full text-[13px]",children:y?"登录中…":c==="local"?"登录(本地超管)":"登录(LDAP)"})]})]}),T.jsxs(jS,{className:"mt-4 flex flex-col items-stretch gap-2 border-t border-border px-5 py-3",children:[T.jsx("div",{className:"truncate text-[11px] leading-relaxed text-muted-foreground",title:c==="ldap"?`${e?.ldap?.url??"—"} · BASE ${e?.ldap?.baseDN??"—"}`:"",children:c==="ldap"?`${e?.ldap?.url??"—"} · BASE ${e?.ldap?.baseDN??"—"}`:"口令以 scrypt 哈希存在服务端,改密码在「设置 → 统一登录(LDAP)」"}),T.jsxs("div",{className:"flex items-center justify-between",children:[T.jsx("span",{className:"text-[11px] text-muted-foreground",children:c==="local"?"回车即登录":"账号是域账号,不是邮箱"}),typeof r=="function"?T.jsx($r,{type:"button",variant:"ghost",size:"sm",className:"h-7 px-2 text-[12px]",onClick:()=>r(),children:"先不登录"}):null]})]})]});return s===!0?T.jsx("div",{className:"fixed inset-0 z-[90] flex items-center justify-center bg-background/70 p-4 backdrop-blur-sm",children:W}):T.jsx("div",{"data-dsh-studio":"","data-theme":t,className:"dsh-studio-fill",children:T.jsx("div",{className:"flex min-h-full w-full items-center justify-center px-6 py-10",children: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 T.jsx(Fe.button,{type:"button","aria-pressed":i,"data-state":i?"on":"off","data-disabled":t.disabled?"":void 0,...o,ref:a,onClick:Ae(t.onClick,()=>{t.disabled||l(!i)})})},"Toggle")),JS=Object.defineProperty,us=(e,t)=>JS(e,"name",{value:t,configurable:!0}),Tr="ToggleGroup",jo={Single:"single",Multiple:"multiple"},[kb,e$]=Sa(Tr,[Nl]),Nb=Nl(),eC=N.forwardRef(us(function(t,a){const{type:n,...r}=t;if(n===jo.Single){const s=r;return T.jsx(tC,{role:"radiogroup",...s,ref:a})}if(n===jo.Multiple){const s=r;return T.jsx(aC,{role:"toolbar",...s,ref:a})}throw new Error(`Missing prop \`type\` expected on \`${Tr}\``)},"ToggleGroup")),[Sb,Cb]=kb(Tr),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:Tr});return T.jsx(Sb,{scope:t.__scopeToggleGroup,type:jo.Single,value:N.useMemo(()=>i?[i]:[],[i]),onItemActivate:l,onItemDeactivate:N.useCallback(()=>l(""),[l]),children:T.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:Tr}),c=N.useCallback(p=>l((f=[])=>[...f,p]),[l]),u=N.useCallback(p=>l((f=[])=>f.filter(v=>v!==p)),[l]);return T.jsx(Sb,{scope:t.__scopeToggleGroup,type:jo.Multiple,value:i,onItemActivate:c,onItemDeactivate:u,children:T.jsx(Eb,{...o,ref:a})})},"ToggleGroupImplMultiple")),[nC,sC]=kb(Tr),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=_o(i),f={dir:p,...c};return T.jsx(nC,{scope:n,rovingFocus:s,disabled:r,children:s?T.jsx(Kv,{asChild:!0,...u,orientation:o,dir:p,loop:l,children:T.jsx(Fe.div,{...f,ref:a})}):T.jsx(Fe.div,{...f,ref:a})})},"ToggleGroupImpl")),fp="ToggleGroupItem",rC=N.forwardRef(us(function(t,a){const n=Cb(fp,t.__scopeToggleGroup),r=sC(fp,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?T.jsx(Yv,{asChild:!0,...s,focusable:!i,active:o,ref:c,children:T.jsx($b,{...l,ref:a})}):T.jsx($b,{...l,ref:a})},"ToggleGroupItem")),$b=N.forwardRef(us(function(t,a){const{__scopeToggleGroup:n,value:r,...s}=t,o=Cb(fp,n),i={role:"radio","aria-checked":t.pressed,"aria-pressed":void 0},l=o.type===jo.Single?i:void 0;return T.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 mp(e,[t,a]){return Math.min(a,Math.max(t,e))}iC(mp,"clamp");const lC=["top","right","bottom","left"],ps=Math.min,Tn=Math.max,Tl=Math.round,Pl=Math.floor,Pn=e=>({x:e,y:e}),dC={left:"right",right:"left",bottom:"top",top:"bottom"};function Tb(e,t,a){return Tn(e,ps(t,a))}function _n(e,t){return typeof e=="function"?e(t):e}function fs(e){return e.split("-")[0]}function Pr(e){return e.split("-")[1]}function gp(e){return e==="x"?"y":"x"}function hp(e){return e==="y"?"height":"width"}function dn(e){const t=e[0];return t==="t"||t==="b"?"y":"x"}function vp(e){return gp(dn(e))}function cC(e,t,a){a===void 0&&(a=!1);const n=Pr(e),r=vp(e),s=hp(r);let o=r==="x"?n===(a?"end":"start")?"right":"left":n==="start"?"bottom":"top";return t.reference[s]>t.floating[s]&&(o=_l(o)),[o,_l(o)]}function uC(e){const t=_l(e);return[bp(e),t,bp(t)]}function bp(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=Pr(e);let s=mC(fs(e),a==="start",n);return r&&(s=s.map(o=>o+"-"+r),t&&(s=s.concat(s.map(bp)))),s}function _l(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 Il(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=dn(t),o=vp(t),i=hp(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 w=Pr(t);return w&&(v[o]+=f*(w==="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}=_n(t,e),w=Ib(v),k=i[f?p==="floating"?"reference":"floating":p],g=Il(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)),b=await(s.isElement==null?void 0:s.isElement(h))&&await(s.getScale==null?void 0:s.getScale(h))||{x:1,y:1},S=Il(s.convertOffsetParentRelativeRectToViewportRelativeRect?await s.convertOffsetParentRelativeRectToViewportRelativeRect({elements:i,rect:d,offsetParent:h,strategy:l}):d);return{top:(g.top-S.top+w.top)/b.y,bottom:(S.bottom-g.bottom+w.bottom)/b.y,left:(g.left-S.left+w.left)/b.x,right:(S.right-g.right+w.right)/b.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 w={};for(let y=0;y<s.length;y++){const k=s[y];if(!k)continue;const{name:g,fn:d}=k,{x:h,y:b,data:S,reset:C}=await d({x:u,y:p,initialPlacement:n,placement:f,strategy:r,middlewareData:w,rects:c,platform:i,elements:{reference:e,floating:t}});u=h??u,p=b??p,w[g]={...w[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)),y=-1)}return{x:u,y:p,placement:f,strategy:r,middlewareData:w}},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}=_n(e,t)||{};if(c==null)return{};const p=Ib(u),f={x:a,y:n},v=vp(r),w=hp(v),y=await o.getDimensions(c),k=v==="y",g=k?"top":"left",d=k?"bottom":"right",h=k?"clientHeight":"clientWidth",b=s.reference[w]+s.reference[v]-f[v]-s.floating[w],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[w]);const _=b/2-S/2,I=E/2-y[w]/2-1,F=ps(p[g],I),W=ps(p[d],I),L=E-y[w]-W,$=E/2-y[w]/2+_,B=Tb(F,$,L),ee=!l.arrow&&Pr(r)!=null&&$!==B&&s.reference[w]/2-($<F?F:W)-y[w]/2<0,M=ee?$<F?$-F:$-L:0;return{[v]:f[v]+M,data:{[v]:B,centerOffset:$-B-M,...ee&&{alignmentOffset:M}},reset:ee}}}),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:w="none",flipAlignment:y=!0,...k}=_n(e,t);if((a=s.arrow)!=null&&a.alignmentOffset)return{};const g=fs(r),d=dn(i),h=fs(i)===i,b=await(l.isRTL==null?void 0:l.isRTL(c.floating)),S=f||(h||!y?[_l(i)]:uC(i)),C=w!=="none";!f&&C&&S.push(...gC(i,y,w,b));const E=[i,...S],_=await l.detectOverflow(t,k),I=[];let F=((n=s.flip)==null?void 0:n.overflows)||[];if(u&&I.push(_[g]),p){const B=cC(r,o,b);I.push(_[B[0]],_[B[1]])}if(F=[...F,{placement:r,overflows:I}],!I.every(B=>B<=0)){var W,L;const B=(((W=s.flip)==null?void 0:W.index)||0)+1,ee=E[B];if(ee&&(!(p==="alignment"?d!==dn(ee):!1)||F.every(A=>dn(A.placement)===d?A.overflows[0]>0:!0)))return{data:{index:B,overflows:F},reset:{placement:ee}};let M=(L=F.filter(O=>O.overflows[0]<=0).sort((O,A)=>O.overflows[1]-A.overflows[1])[0])==null?void 0:L.placement;if(!M)switch(v){case"bestFit":{var $;const O=($=F.filter(A=>{if(C){const x=dn(A.placement);return x===d||x==="y"}return!0}).map(A=>[A.placement,A.overflows.filter(x=>x>0).reduce((x,P)=>x+P,0)]).sort((A,x)=>A[1]-x[1])[0])==null?void 0:$[0];O&&(M=O);break}case"initialPlacement":M=i;break}if(r!==M)return{reset:{placement:M}}}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}=_n(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=Pr(a),l=dn(a)==="y",c=Db.has(o)?-1:1,u=s&&l?-1:1,p=_n(t,e);let{mainAxis:f,crossAxis:v,alignmentAxis:w}=typeof p=="number"?{mainAxis:p,crossAxis:0,alignmentAxis:null}:{mainAxis:p.mainAxis||0,crossAxis:p.crossAxis||0,alignmentAxis:p.alignmentAxis};return i&&typeof w=="number"&&(v=i==="end"?w*-1:w),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:b}=d;return{x:h,y:b}}},...c}=_n(e,t),u={x:a,y:n},p=await s.detectOverflow(t,c),f=dn(r),v=gp(f);let w=u[v],y=u[f];const k=(d,h)=>Tb(h+p[d==="y"?"top":"left"],h,h-p[d==="y"?"bottom":"right"]);o&&(w=k(v,w)),i&&(y=k(f,y));const g=l.fn({...t,[v]:w,[f]:y});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}=_n(e,t),f={x:r,y:s},v=dn(o),w=gp(v);let y=f[w],k=f[v];const g=_n(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=w==="y"?"height":"width",C=i.reference[w]-i.floating[S]+d.mainAxis,E=i.reference[w]+i.reference[S]-d.mainAxis;y<C?y=C:y>E&&(y=E)}if(p){var h,b;const S=w==="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:((b=l.offset)==null?void 0:b[v])||0)-(C?d.crossAxis:0);k<E?k=E:k>_&&(k=_)}return{[w]:y,[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}=_n(e,t),l=await r.detectOverflow(t,i),c=fs(a),u=Pr(a),p=dn(a)==="y",{width:f,height:v}=n.floating;let w,y;c==="top"||c==="bottom"?(w=c,y=u===(await(r.isRTL==null?void 0:r.isRTL(s.floating))?"start":"end")?"left":"right"):(y=c,w=u==="end"?"top":"bottom");const k=v-l.top-l.bottom,g=f-l.left-l.right,d=ps(v-l[w],k),h=ps(f-l[y],g),b=t.middlewareData.shift,S=!b;let C=d,E=h;b!=null&&b.enabled.x&&(E=g),b!=null&&b.enabled.y&&(C=k),S&&!u&&(p?E=f-2*Tn(l.left,l.right):C=v-2*Tn(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 Rl(){return typeof window<"u"}function _r(e){return Ob(e)?(e.nodeName||"").toLowerCase():"#document"}function ma(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function In(e){var t;return(t=(Ob(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function Ob(e){return Rl()?e instanceof Node||e instanceof ma(e).Node:!1}function cn(e){return Rl()?e instanceof Element||e instanceof ma(e).Element:!1}function ms(e){return Rl()?e instanceof HTMLElement||e instanceof ma(e).HTMLElement:!1}function Lb(e){return!Rl()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof ma(e).ShadowRoot}function Al(e){const{overflow:t,overflowX:a,overflowY:n,display:r}=un(e);return/auto|scroll|overlay|hidden|clip/.test(t+n+a)&&r!=="inline"&&r!=="contents"}function TC(e){return/^(table|td|th)$/.test(_r(e))}function jl(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/,As=e=>!!e&&e!=="none";let yp;function xp(e){const t=cn(e)?un(e):e;return As(t.transform)||As(t.translate)||As(t.scale)||As(t.rotate)||As(t.perspective)||!wp()&&(As(t.backdropFilter)||As(t.filter))||PC.test(t.willChange||"")||_C.test(t.contain||"")}function IC(e){let t=js(e);for(;ms(t)&&!Do(t);){if(xp(t))return t;if(jl(t))return null;t=js(t)}return null}function wp(){return yp==null&&(yp=typeof CSS<"u"&&CSS.supports&&CSS.supports("-webkit-backdrop-filter","none")),yp}function Do(e){return/^(html|body|#document)$/.test(_r(e))}function un(e){return ma(e).getComputedStyle(e)}function Dl(e){return cn(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function js(e){if(_r(e)==="html")return e;const t=e.assignedSlot||e.parentNode||Lb(e)&&e.host||In(e);return Lb(t)?t.host:t}function Mb(e){const t=js(e);return Do(t)?(e.ownerDocument||e).body:ms(t)&&Al(t)?t:Mb(t)}function Oo(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=ma(r);if(s){const i=kp(o);return t.concat(o,o.visualViewport||[],Al(r)?r:[],i&&a?Oo(i):[])}else return t.concat(r,Oo(r,[],a))}function kp(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function zb(e){const t=un(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=Tl(a)!==s||Tl(n)!==o;return i&&(a=s,n=o),{width:a,height:n,$:i}}function Np(e){return cn(e)?e:e.contextElement}function Ir(e){const t=Np(e);if(!ms(t))return Pn(1);const a=t.getBoundingClientRect(),{width:n,height:r,$:s}=zb(t);let o=(s?Tl(a.width):a.width)/n,i=(s?Tl(a.height):a.height)/r;return(!o||!Number.isFinite(o))&&(o=1),(!i||!Number.isFinite(i))&&(i=1),{x:o,y:i}}const RC=Pn(0);function Fb(e){const t=ma(e);return!wp()||!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===ma(e)}function Ds(e,t,a,n){t===void 0&&(t=!1),a===void 0&&(a=!1);const r=e.getBoundingClientRect(),s=Np(e);let o=Pn(1);t&&(n?cn(n)&&(o=Ir(n)):o=Ir(e));const i=AC(s,a,n)?Fb(s):Pn(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=ma(s),v=cn(n)?ma(n):n;let w=f,y=kp(w);for(;y&&v!==w;){const k=Ir(y),g=y.getBoundingClientRect(),d=un(y),h=g.left+(y.clientLeft+parseFloat(d.paddingLeft))*k.x,b=g.top+(y.clientTop+parseFloat(d.paddingTop))*k.y;l*=k.x,c*=k.y,u*=k.x,p*=k.y,l+=h,c+=b,w=ma(y),y=kp(w)}}return Il({width:u,height:p,x:l,y:c})}function Ol(e,t){const a=Dl(e).scrollLeft;return t?t.left+a:Ds(In(e)).left+a}function Bb(e,t){const a=e.getBoundingClientRect(),n=a.left+t.scrollLeft-Ol(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=In(n),i=t?jl(t.floating):!1;if(n===o||i&&s)return a;let l={scrollLeft:0,scrollTop:0},c=Pn(1);const u=Pn(0),p=ms(n);if((p||!s)&&((_r(n)!=="body"||Al(o))&&(l=Dl(n)),p)){const v=Ds(n);c=Ir(n),u.x=v.x+n.clientLeft,u.y=v.y+n.clientTop}const f=o&&!p&&!s?Bb(o,l):Pn(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=Dl(e),a=e.ownerDocument.body,n=Tn(e.scrollWidth,e.clientWidth,a.scrollWidth,a.clientWidth),r=Tn(e.scrollHeight,e.clientHeight,a.scrollHeight,a.clientHeight);let s=-t.scrollLeft+Ol(e);const o=-t.scrollTop;return un(a).direction==="rtl"&&(s+=Tn(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=ma(e),s=In(e),o=r.visualViewport;let i=s.clientWidth,l=s.clientHeight,c=0,u=0;if(o){const f=!wp()||t==="fixed";n?f||(c=-o.offsetLeft,u=-o.offsetTop):(i=o.width,l=o.height,f&&(c=o.offsetLeft,u=o.offsetTop))}if(Ol(s)<=0){const f=s.ownerDocument,v=f.body,w=getComputedStyle(v),y=f.compatMode==="CSS1Compat"&&parseFloat(w.marginLeft)+parseFloat(w.marginRight)||0,k=Math.abs(s.clientWidth-v.clientWidth-y),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=Ds(e,!0,t==="fixed"),n=a.top+e.clientTop,r=a.left+e.clientLeft,s=Ir(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(In(e));else if(cn(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 Il(n)}function FC(e,t){const a=t.get(e);if(a)return a;let n=Oo(e,[],!1).filter(i=>cn(i)&&_r(i)!=="body"),r=null;const s=un(e).position==="fixed";let o=s?js(e):e;for(;cn(o)&&!Do(o);){const i=un(o),l=xp(o),c=r?r.position:s?"fixed":"";!l&&(c==="fixed"||c==="absolute"&&i.position==="static")?n=n.filter(p=>p!==o):r=i,o=js(o)}return t.set(e,n),n}function BC(e){let{element:t,boundary:a,rootBoundary:n,strategy:r}=e;const o=[...a==="clippingAncestors"?jl(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=Tn(v.top,l),c=ps(v.right,c),u=ps(v.bottom,u),p=Tn(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=In(t),s=a==="fixed",o=Ds(e,!0,s,t);let i={scrollLeft:0,scrollTop:0};const l=Pn(0);if((n||!s)&&((_r(t)!=="body"||Al(r))&&(i=Dl(t)),n)){const f=Ds(t,!0,s,t);l.x=f.x+t.clientLeft,l.y=f.y+t.clientTop}!n&&r&&(l.x=Ol(r));const c=r&&!n&&!s?Bb(r,i):Pn(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 Sp(e){return un(e).position==="static"}function qb(e,t){if(!ms(e)||un(e).position==="fixed")return null;if(t)return t(e);let a=e.offsetParent;return In(e)===a&&(a=a.ownerDocument.body),a}function Vb(e,t){const a=ma(e);if(jl(e))return a;if(!ms(e)){let r=js(e);for(;r&&!Do(r);){if(cn(r)&&!Sp(r))return r;r=js(r)}return a}let n=qb(e,t);for(;n&&TC(n)&&Sp(n);)n=qb(n,t);return n&&Do(n)&&Sp(n)&&!xp(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 un(e).direction==="rtl"}const HC={convertOffsetParentRelativeRectToViewportRelativeRect:jC,getDocumentElement:In,getClippingRect:BC,getOffsetParent:Vb,getElementRects:VC,getClientRects:DC,getDimensions:UC,getScale:Ir,isElement:cn,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=In(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:w,width:y,height:k}=f;if(u||t(),!y||!k)return;const g=Pl(w),d=Pl(s.clientWidth-(v+y)),h=Pl(s.clientHeight-(w+k)),b=Pl(v),C={rootMargin:-g+"px "+-d+"px "+-h+"px "+-b+"px",threshold:Tn(0,ps(1,p))||1};let E=!0;function _(I){const F=I[0].intersectionRatio;if(!Wb(f,e.getBoundingClientRect()))return i();if(F!==p){if(!E)return i();F?i(!1,F):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=ma(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=Np(e),u=r||s?[...c?Oo(c):[],...t?Oo(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 w,y=l?Ds(e):null;l&&k();function k(){const g=Ds(e);y&&!Wb(y,g)&&a(),y=g,w=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(w)}}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(){},Ll=a2?N.useLayoutEffect:n2;function Ml(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(!Ml(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)&&!Ml(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 Cp(e){const t=N.useRef(e);return Ll(()=>{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);Ml(f,n)||v(n);const[w,y]=N.useState(null),[k,g]=N.useState(null),d=N.useCallback(A=>{A!==C.current&&(C.current=A,y(A))},[]),h=N.useCallback(A=>{A!==E.current&&(E.current=A,g(A))},[]),b=s||w,S=o||k,C=N.useRef(null),E=N.useRef(null),_=N.useRef(u),I=l!=null,F=Cp(l),W=Cp(r),L=Cp(c),$=N.useCallback(()=>{if(!C.current||!E.current)return;const A={placement:t,strategy:a,middleware:f};W.current&&(A.platform=W.current),t2(C.current,E.current,A).then(x=>{const P={...x,isPositioned:L.current!==!1};B.current&&!Ml(_.current,P)&&(_.current=P,gr.flushSync(()=>{p(P)}))})},[f,t,a,W,L]);Ll(()=>{c===!1&&_.current.isPositioned&&(_.current.isPositioned=!1,p(A=>({...A,isPositioned:!1})))},[c]);const B=N.useRef(!1);Ll(()=>(B.current=!0,()=>{B.current=!1}),[]),Ll(()=>{if(b&&(C.current=b),S&&(E.current=S),b&&S){if(F.current)return F.current(b,S,$);$()}},[b,S,$,F,I]);const ee=N.useMemo(()=>({reference:C,floating:E,setReference:d,setFloating:h}),[d,h]),M=N.useMemo(()=>({reference:b,floating:S}),[b,S]),O=N.useMemo(()=>{const A={position:a,left:0,top:0};if(!M.floating)return A;const x=Kb(M.floating,u.x),P=Kb(M.floating,u.y);return i?{...A,transform:"translate("+x+"px, "+P+"px)",...Gb(M.floating)>=1.5&&{willChange:"transform"}}:{position:a,left:x,top:P}},[a,i,M.floating,u.x,u.y]);return N.useMemo(()=>({...u,update:$,refs:ee,elements:M,floatingStyles:O}),[u,$,ee,M,O])}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 T.jsx(Fe.svg,{...o,ref:a,width:r,height:s,viewBox:"0 0 30 10",preserveAspectRatio:"none",children:t.asChild?n:T.jsx("polygon",{points:"0,0 30,0 15,10"})})},"Arrow")),h2=Object.defineProperty,Rn=(e,t)=>h2(e,"name",{value:t,configurable:!0}),Yb={Partial:"partial"},Qb={Optimized:"optimized",Always:"always"},Xb="Popper",[Zb,zl]=Sa(Xb),[v2,Jb]=Zb(Xb),ey=Rn(e=>{const{__scopePopper:t,children:a}=e,[n,r]=N.useState(null),[s,o]=N.useState(void 0);return T.jsx(v2,{scope:t,anchor:n,onAnchorChange:r,placementState:s,setPlacementState:o,children:a})},"Popper"),b2="PopperAnchor",ty=N.forwardRef(Rn(function(t,a){const{__scopePopper:n,virtualRef:r,...s}=t,o=Jb(b2,n),i=N.useRef(null),l=o.onAnchorChange,c=N.useCallback(y=>{i.current=y,y&&l(y)},[l]),u=Xe(a,c),p=N.useRef(null);N.useEffect(()=>{if(!r)return;const y=p.current;p.current=r.current,y!==p.current&&l(p.current)});const f=o.placementState&&Fl(o.placementState),v=f?.[0],w=f?.[1];return r?null:T.jsx(Fe.div,{"data-radix-popper-side":v,"data-radix-popper-align":w,...s,ref:u})},"PopperAnchor")),ay="PopperContent",[y2,x2]=Zb(ay),ny=N.forwardRef(Rn(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:w=Qb.Optimized,onPlaced:y,...k}=t,g=Jb(ay,n),[d,h]=N.useState(null),b=Xe(a,h),[S,C]=N.useState(null),E=Sl(S),_=E?.width??0,I=E?.height??0,F=r+(o!=="center"?"-"+o:""),W=typeof p=="number"?p:{top:0,right:0,bottom:0,left:0,...p},L=Array.isArray(u)?u:[u],$=L.length>0,B={padding:W,boundary:L.filter(sy),altBoundary:$},{refs:ee,floatingStyles:M,placement:O,isPositioned:A,middlewareData:x}=s2({strategy:"fixed",placement:F,whileElementsMounted:Rn((...H)=>KC(...H,{animationFrame:w===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()}:{},...B}),c&&d2({...B}),c2({...B,apply:Rn(({elements:H,rects:R,availableWidth:ne,availableHeight:we})=>{const{width:Z,height:le}=R.reference,he=H.floating.style;he.setProperty("--radix-popper-available-width",`${ne}px`),he.setProperty("--radix-popper-available-height",`${we}px`),he.setProperty("--radix-popper-anchor-width",`${Z}px`),he.setProperty("--radix-popper-anchor-height",`${le}px`)},"apply")}),S&&p2({element:S,padding:l}),S2({arrowWidth:_,arrowHeight:I}),v&&u2($?{strategy:"referenceHidden",...B}:{strategy:"referenceHidden",padding:B.padding,altBoundary:B.altBoundary})]}),P=g.setPlacementState;St(()=>(P(O),()=>{P(void 0)}),[O,P]);const[G,te]=Fl(O),q=Ka(y);St(()=>{A&&q?.()},[A,q]);const K=x.arrow?.x,ke=x.arrow?.y,pe=x.arrow?.centerOffset!==0,[xe,Y]=N.useState();return St(()=>{d&&Y(window.getComputedStyle(d).zIndex)},[d]),T.jsx("div",{ref:ee.setFloating,"data-radix-popper-content-wrapper":"",style:{...M,transform:A?M.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:xe,"--radix-popper-transform-origin":[x.transformOrigin?.x,x.transformOrigin?.y].join(" "),...x.hide?.referenceHidden&&{visibility:"hidden",pointerEvents:"none"}},dir:t.dir,children:T.jsx(y2,{scope:n,placedSide:G,placedAlign:te,onArrowChange:C,arrowX:K,arrowY:ke,shouldHideArrow:pe,children:T.jsx(Fe.div,{"data-side":G,"data-align":te,...k,ref:b,style:{...k.style,animation:A?k.style?.animation:"none"}})})})},"PopperContent")),w2="PopperArrow",k2={top:"bottom",right:"left",bottom:"top",left:"right"},N2=N.forwardRef(Rn(function(t,a){const{__scopePopper:n,...r}=t,s=x2(w2,n),o=k2[s.placedSide];return T.jsx("span",{ref:s.onArrowChange,style:{position:"absolute",left:s.arrowX,top:s.arrowY,[o]:0,transformOrigin:{top:"",right:"0 0",bottom:"center 0",left:"100% 0"}[s.placedSide],transform:{top:"translateY(100%)",right:"translateY(50%) rotate(90deg) translateX(-50%)",bottom:"rotate(180deg)",left:"translateY(50%) rotate(-90deg) translateX(50%)"}[s.placedSide],visibility:s.shouldHideArrow?"hidden":void 0},children:T.jsx(g2,{...r,ref:a,style:{...r.style,display:"block"}})})},"PopperArrow"));function sy(e){return e!==null}Rn(sy,"isNotNull");var S2=Rn(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]=Fl(a),p={start:"0%",center:"50%",end:"100%"}[u],f=(r.arrow?.x??0)+i/2,v=(r.arrow?.y??0)+l/2;let w="",y="";return c==="bottom"?(w=o?p:`${f}px`,y=`${-l}px`):c==="top"?(w=o?p:`${f}px`,y=`${n.floating.height+l}px`):c==="right"?(w=`${-l}px`,y=o?p:`${v}px`):c==="left"&&(w=`${n.floating.width+l}px`,y=o?p:`${v}px`),{data:{x:w,y}}}}),"transformOrigin");function Fl(e){const[t,a="center"]=e.split("-");return[t,a]}Rn(Fl,"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 T.jsx(Fe.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"],Rr="Select",[Bl,Ep,R2]=Wu(Rr),[Os,t$]=Sa(Rr,[R2,zl]),$p=zl(),[A2,gs]=Os(Rr),[j2,D2]=Os(Rr);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:w,internal_do_not_use_render:y}=e,k=$p(t),[g,d]=N.useState(null),[h,b]=N.useState(null),[S,C]=N.useState(!1),E=_o(c),[_,I]=Da({prop:n,defaultProp:r??!1,onChange:s,caller:Rr}),[F,W]=Da({prop:o,defaultProp:i,onChange:l,caller:Rr}),L=N.useRef(null),$=N.useRef(!1),[B,ee]=N.useState(null),M=Ze(pe=>{ee({value:pe,hasConsumerStoppedPropagation:$.current}),W(pe)},"handleUserSelect"),O=N.useRef(F);N.useEffect(()=>{const pe=w?g?.ownerDocument.getElementById(w):g?.form;if(pe instanceof HTMLFormElement){const xe=Ze(()=>W(O.current),"reset");return pe.addEventListener("reset",xe),()=>pe.removeEventListener("reset",xe)}},[w,g,W]);const A=g?!!w||!!g.closest("form"):!0,[x,P]=N.useState(new Set),G=Nn(),te=Array.from(x).map(pe=>pe.props.value).join(";"),q=N.useCallback(pe=>{P(xe=>new Set(xe).add(pe))},[]),K=N.useCallback(pe=>{P(xe=>{const Y=new Set(xe);return Y.delete(pe),Y})},[]),ke={required:v,trigger:g,onTriggerChange:d,valueNode:h,onValueNodeChange:b,valueNodeHasChildren:S,onValueNodeHasChildrenChange:C,contentId:G,value:F,onValueChange:W,hasConsumerStoppedPropagationRef:$,userSelection:B,onUserSelect:M,open:_,onOpenChange:I,dir:E,triggerPointerDownPosRef:L,disabled:f,name:u,autoComplete:p,form:w,nativeOptions:x,nativeSelectKey:te,isFormControl:A};return T.jsx(ey,{...k,children:T.jsx(A2,{scope:t,...ke,children:T.jsx(Bl.Provider,{scope:t,children:T.jsx(j2,{scope:t,onNativeOptionAdd:q,onNativeOptionRemove:K,children:py(y)?y(ke):a})})})})}Ze(iy,"SelectProvider");var O2=Ze(e=>{const{__scopeSelect:t,children:a,...n}=e;return T.jsx(iy,{__scopeSelect:t,...n,internal_do_not_use_render:({isFormControl:r})=>T.jsxs(T.Fragment,{children:[a,r?T.jsx(iE,{__scopeSelect:t}):null]})})},"Select"),L2="SelectTrigger",M2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,disabled:r=!1,...s}=t,o=$p(n),i=gs(L2,n),l=i.disabled||r,c=Xe(a,i.onTriggerChange),u=Ep(n),p=N.useRef("touch"),[f,v,w]=Pp(k=>{const g=u().filter(b=>!b.disabled),d=g.find(b=>b.value===i.value),h=_p(g,k,d);h!==void 0&&i.onUserSelect(h.value)}),y=Ze(k=>{l||(i.onOpenChange(!0),w()),k&&(i.triggerPointerDownPosRef.current={x:Math.round(k.pageX),y:Math.round(k.pageY)})},"handleOpen");return T.jsx(ty,{asChild:!0,...o,children:T.jsx(Fe.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":Lo(i.value)?"":void 0,...s,ref:c,onClick:Ae(s.onClick,k=>{k.currentTarget.focus(),p.current!=="mouse"&&y(k)}),onPointerDown:Ae(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"&&(y(k),k.preventDefault())}),onKeyDown:Ae(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)&&(y(),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);St(()=>{u(p)},[u,p]);const v=Lo(c.value);return T.jsx(Fe.span,{...l,asChild:v?!1:l.asChild,ref:f,style:{pointerEvents:"none"},children:T.jsx(N.Fragment,{children:v?i:o},v?"placeholder":"value")})},"SelectValue")),B2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,children:r,...s}=t;return T.jsx(Fe.span,{"aria-hidden":!0,...s,ref:a,children:r||"▼"})},"SelectIcon")),U2="SelectPortal",[q2,V2]=Os(U2,{forceMount:void 0}),W2=Ze(e=>{const{__scopeSelect:t,forceMount:a,...n}=e;return T.jsx(q2,{scope:e.__scopeSelect,forceMount:a,children:T.jsx(Tu,{asChild:!0,...n})})},"SelectPortal"),Ls="SelectContent",H2=N.forwardRef(Ze(function(t,a){const n=V2(Ls,t.__scopeSelect),{forceMount:r=n.forceMount,...s}=t,o=gs(Ls,t.__scopeSelect),[i,l]=N.useState();return St(()=>{l(new DocumentFragment)},[]),T.jsx(is,{present:r||o.open,children:({present:c})=>c?T.jsx(Y2,{...s,ref:a}):T.jsx(G2,{...s,fragment:i})})},"SelectContent")),G2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,children:r,fragment:s}=t;return s?gr.createPortal(T.jsx(ly,{scope:n,children:T.jsx(Bl.Slot,{scope:n,children:T.jsx("div",{ref:a,children:r})})}),s):null},"SelectContentFragment")),Ya=10,[ly,Ul]=Os(Ls),K2=kn("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:w,sticky:y,hideWhenDetached:k,avoidCollisions:g,...d}=t,h=gs(Ls,n),[b,S]=N.useState(null),[C,E]=N.useState(null),_=Xe(a,S),[I,F]=N.useState(null),[W,L]=N.useState(null),$=Ep(n),[B,ee]=N.useState(!1),M=N.useRef(!1),O=N.useRef(!1),A=N.useRef(!1);N.useEffect(()=>{if(b)return $v(b)},[b]),ul();const x=N.useCallback(R=>{const[ne,...we]=$().map(he=>he.ref.current),[Z]=we.slice(-1),le=document.activeElement;for(const he of R)if(he===le||(he?.scrollIntoView({block:"nearest"}),he===ne&&C&&(C.scrollTop=0),he===Z&&C&&(C.scrollTop=C.scrollHeight),he?.focus(),document.activeElement!==le))return},[$,C]),P=N.useCallback(()=>x([I,b]),[x,I,b]);N.useEffect(()=>{B&&P()},[B,P]);const{onOpenChange:G,triggerPointerDownPosRef:te}=h;N.useEffect(()=>{if(b){let R={x:0,y:0};const ne=Ze(Z=>{R={x:Math.abs(Math.round(Z.pageX)-(te.current?.x??0)),y:Math.abs(Math.round(Z.pageY)-(te.current?.y??0))}},"handlePointerMove"),we=Ze(Z=>{R.x<=10&&R.y<=10?Z.preventDefault():Z.composedPath().includes(b)||G(!1),document.removeEventListener("pointermove",ne),te.current=null},"handlePointerUp");return te.current!==null&&(document.addEventListener("pointermove",ne),document.addEventListener("pointerup",we,{capture:!0,once:!0})),()=>{document.removeEventListener("pointermove",ne),document.removeEventListener("pointerup",we,{capture:!0})}}},[b,G,te]),N.useEffect(()=>{const R=Ze(()=>G(!1),"close");return window.addEventListener("blur",R),window.addEventListener("resize",R),()=>{window.removeEventListener("blur",R),window.removeEventListener("resize",R)}},[G]);const[q,K]=Pp(R=>{const ne=$().filter(le=>!le.disabled),we=ne.find(le=>le.ref.current===document.activeElement),Z=_p(ne,R,we);Z&&setTimeout(()=>Z.ref.current?.focus())}),ke=N.useCallback((R,ne,we)=>{const Z=!O.current;Z&&(O.current=!0);const le=!M.current&&!we;h.value!==void 0&&h.value===ne||le?(F(R),le&&(M.current=!0)):Z&&F(R)},[h.value]),pe=N.useCallback(()=>b?.focus(),[b]),xe=N.useCallback((R,ne,we)=>{if(!R)return;const Z=!A.current;Z&&(A.current=!0);const le=!M.current&&!we;(h.value!==void 0&&h.value===ne||le||Z)&&L(R)},[h.value]),Y=r===oy.Popper?dy:Q2,H=Y===dy?{side:l,sideOffset:c,align:u,alignOffset:p,arrowPadding:f,collisionBoundary:v,collisionPadding:w,sticky:y,hideWhenDetached:k,avoidCollisions:g}:{};return T.jsx(ly,{scope:n,content:b,viewport:C,onViewportChange:E,itemRefCallback:ke,selectedItem:I,onItemLeave:pe,itemTextRefCallback:xe,focusSelectedItem:P,selectedItemText:W,position:r,isPositioned:B,searchRef:q,children:T.jsx(Ou,{as:K2,allowPinchZoom:!0,children:T.jsx(Zh,{asChild:!0,trapped:h.open,onMountAutoFocus:R=>{R.preventDefault()},onUnmountAutoFocus:Ae(s,R=>{h.trigger?.focus({preventScroll:!0}),R.preventDefault()}),children:T.jsx(xu,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:o,onPointerDownOutside:i,onFocusOutside:R=>R.preventDefault(),onDismiss:()=>h.onOpenChange(!1),children:T.jsx(Y,{role:"listbox",id:h.contentId,"data-state":h.open?"open":"closed",dir:h.dir,onContextMenu:R=>R.preventDefault(),...d,...H,onPlaced:()=>ee(!0),ref:_,style:{display:"flex",flexDirection:"column",outline:"none",...d.style},onKeyDown:Ae(d.onKeyDown,R=>{const ne=R.ctrlKey||R.altKey||R.metaKey;if(R.key==="Tab"&&R.preventDefault(),!ne&&R.key.length===1&&K(R.key),["ArrowUp","ArrowDown","Home","End"].includes(R.key)){let Z=$().filter(le=>!le.disabled).map(le=>le.ref.current);if(["ArrowUp","End"].includes(R.key)&&(Z=Z.slice().reverse()),["ArrowUp","ArrowDown"].includes(R.key)){const le=R.target,he=Z.indexOf(le);Z=Z.slice(he+1)}setTimeout(()=>x(Z)),R.preventDefault()}})})})})})})},"SelectContentImpl")),Q2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,onPlaced:r,...s}=t,o=gs(Ls,n),i=Ul(Ls,n),[l,c]=N.useState(null),[u,p]=N.useState(null),f=Xe(a,p),v=Ep(n),w=N.useRef(!1),y=N.useRef(!0),{viewport:k,selectedItem:g,selectedItemText:d,focusSelectedItem:h}=i,b=N.useCallback(()=>{if(o.trigger&&o.valueNode&&l&&u&&k&&g&&d){const _=o.trigger.getBoundingClientRect(),I=u.getBoundingClientRect(),F=o.valueNode.getBoundingClientRect(),W=d.getBoundingClientRect();if(o.dir!==P2.RTL){const we=W.left-I.left,Z=F.left-we,le=_.left-Z,he=_.width+le,V=Math.max(he,I.width),$e=window.innerWidth-Ya,Ne=mp(Z,[Ya,Math.max(Ya,$e-V)]);l.style.minWidth=he+"px",l.style.left=Ne+"px"}else{const we=I.right-W.right,Z=window.innerWidth-F.right-we,le=window.innerWidth-_.right-Z,he=_.width+le,V=Math.max(he,I.width),$e=window.innerWidth-Ya,Ne=mp(Z,[Ya,Math.max(Ya,$e-V)]);l.style.minWidth=he+"px",l.style.right=Ne+"px"}const L=v(),$=window.innerHeight-Ya*2,B=k.scrollHeight,ee=window.getComputedStyle(u),M=parseInt(ee.borderTopWidth,10),O=parseInt(ee.paddingTop,10),A=parseInt(ee.borderBottomWidth,10),x=parseInt(ee.paddingBottom,10),P=M+O+B+x+A,G=Math.min(g.offsetHeight*5,P),te=window.getComputedStyle(k),q=parseInt(te.paddingTop,10),K=parseInt(te.paddingBottom,10),ke=_.top+_.height/2-Ya,pe=$-ke,xe=g.offsetHeight/2,Y=g.offsetTop+xe,H=M+O+Y,R=P-H;if(H<=ke){const we=L.length>0&&g===L[L.length-1].ref.current;l.style.bottom="0px";const Z=u.clientHeight-k.offsetTop-k.offsetHeight,le=Math.max(pe,xe+(we?K:0)+Z+A),he=H+le;l.style.height=he+"px"}else{const we=L.length>0&&g===L[0].ref.current;l.style.top="0px";const le=Math.max(ke,M+k.offsetTop+(we?q:0)+xe)+R;l.style.height=le+"px",k.scrollTop=H-ke+k.offsetTop}l.style.margin=`${Ya}px 0`,l.style.minHeight=G+"px",l.style.maxHeight=$+"px",r?.(),requestAnimationFrame(()=>w.current=!0)}},[v,o.trigger,o.valueNode,l,u,k,g,d,o.dir,r]);St(()=>b(),[b]);const[S,C]=N.useState();St(()=>{u&&C(window.getComputedStyle(u).zIndex)},[u]);const E=N.useCallback(_=>{_&&y.current===!0&&(b(),h?.(),y.current=!1)},[b,h]);return T.jsx(X2,{scope:n,contentWrapper:l,shouldExpandOnScrollRef:w,onScrollButtonChange:E,children:T.jsx("div",{ref:c,style:{display:"flex",flexDirection:"column",position:"fixed",zIndex:S},children:T.jsx(Fe.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=Ya,...o}=t,i=$p(n);return T.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]=Os(Ls,{}),cy="SelectViewport",J2=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,nonce:r,...s}=t,o=Ul(cy,n),i=Z2(cy,n),l=Xe(a,o.onViewportChange),c=N.useRef(0);return T.jsxs(T.Fragment,{children:[T.jsx("style",{dangerouslySetInnerHTML:{__html:"[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}"},nonce:r}),T.jsx(Bl.Slot,{scope:n,children:T.jsx(Fe.div,{"data-radix-select-viewport":"",role:"presentation",...s,ref:l,style:{position:"relative",flex:1,overflow:"hidden auto",...s.style},onScroll:Ae(s.onScroll,u=>{const p=u.currentTarget,{contentWrapper:f,shouldExpandOnScrollRef:v}=i;if(v?.current&&f){const w=Math.abs(c.current-p.scrollTop);if(w>0){const y=window.innerHeight-Ya*2,k=parseFloat(f.style.minHeight),g=parseFloat(f.style.height),d=Math.max(k,g);if(d<y){const h=d+w,b=Math.min(y,h),S=h-b;f.style.height=b+"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$]=Os(eE),Tp="SelectItem",[tE,uy]=Os(Tp),aE=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,value:r,disabled:s=!1,textValue:o,...i}=t,l=gs(Tp,n),c=Ul(Tp,n),u=l.value===r,[p,f]=N.useState(o??""),[v,w]=N.useState(!1),y=Ka(b=>c.itemRefCallback?.(b,r,s)),k=Xe(a,y),g=Nn(),d=N.useRef("touch");function h(b){l.hasConsumerStoppedPropagationRef.current=b.isPropagationStopped(),l.onUserSelect(r),l.onOpenChange(!1)}return Ze(h,"handleSelect"),T.jsx(tE,{scope:n,value:r,disabled:s,textId:g,isSelected:u,onItemTextChange:N.useCallback(b=>{f(S=>S||(b?.textContent??"").trim())},[]),children:T.jsx(Bl.ItemSlot,{scope:n,value:r,disabled:s,textValue:p,children:T.jsx(Fe.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:Ae(i.onFocus,()=>w(!0)),onBlur:Ae(i.onBlur,()=>w(!1)),onClick:Ae(i.onClick,b=>{s||d.current!=="mouse"&&h(b)}),onPointerUp:Ae(i.onPointerUp,b=>{s||d.current==="mouse"&&h(b)}),onPointerDown:Ae(i.onPointerDown,b=>{d.current=b.pointerType}),onPointerMove:Ae(i.onPointerMove,b=>{d.current=b.pointerType,s?c.onItemLeave?.():d.current==="mouse"&&b.currentTarget.focus({preventScroll:!0})}),onPointerLeave:Ae(i.onPointerLeave,b=>{b.currentTarget===document.activeElement&&c.onItemLeave?.()}),onKeyDown:Ae(i.onKeyDown,b=>{s||b.target!==b.currentTarget||c.searchRef?.current!==""&&b.key===" "||(I2.includes(b.key)&&h(b),b.key===" "&&b.preventDefault())})})})})},"SelectItem")),ql="SelectItemText",nE=N.forwardRef(Ze(function(t,a){const{__scopeSelect:n,className:r,style:s,...o}=t,i=gs(ql,n),l=Ul(ql,n),c=uy(ql,n),u=D2(ql,n),[p,f]=N.useState(null),v=Ka(h=>l.itemTextRefCallback?.(h,c.value,c.disabled)),w=Xe(a,f,c.onItemTextChange,v),y=p?.textContent,k=N.useMemo(()=>T.jsx("option",{value:c.value,disabled:c.disabled,children:y},c.value),[c.disabled,c.value,y]),{onNativeOptionAdd:g,onNativeOptionRemove:d}=u;return St(()=>(g(k),()=>d(k)),[g,d,k]),T.jsxs(T.Fragment,{children:[T.jsx(Fe.span,{id:c.textId,...o,ref:w}),c.isSelected&&i.valueNode&&!i.valueNodeHasChildren&&!Lo(i.value)?gr.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?T.jsx(Fe.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:w}=r,y=N.useRef(null),k=Xe(n,y),g=s??"",d=N.useRef(g),h=N.useRef(f),b=N.useRef(!1),S=Array.from(v).some(C=>(C.props.value??"")==="");return N.useEffect(()=>{const C=y.current;if(!C)return;const E=window.HTMLSelectElement.prototype,I=Object.getOwnPropertyDescriptor(E,"value").set,F=f!==null&&f!==h.current;h.current=f;const W=d.current!==g;d.current=g;const L=F&&W;if(F&&!W&&f.value!==g&&!f.hasConsumerStoppedPropagation&&I){b.current=!0;try{I.call(C,f.value),C.dispatchEvent(new Event("change",{bubbles:!0}))}finally{b.current=!1,I.call(C,g)}return}const $=L&&!f.hasConsumerStoppedPropagation;if(W&&I){const B=new Event("change",{bubbles:$});I.call(C,g),C.dispatchEvent(B)}},[g,f]),T.jsxs(Fe.select,{"aria-hidden":!0,required:i,tabIndex:-1,name:c,autoComplete:u,disabled:l,form:p,onChange:C=>{b.current||o(C.target.value)},...a,style:{...ry,...a.style},ref:k,defaultValue:g,children:[Lo(s)&&!S?T.jsx("option",{value:""}):null,Array.from(v)]},w)},"SelectBubbleInput"));function py(e){return typeof e=="function"}Ze(py,"isFunction");function Lo(e){return e===""||e===void 0}Ze(Lo,"shouldShowPlaceholder");function Pp(e){const t=Ka(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(Pp,"useTypeaheadSearch");function _p(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(_p,"findNextItem");function fy(e,t){return e.map((a,n)=>e[(t+n)%e.length])}Ze(fy,"wrapArray");var lE=Object.defineProperty,_t=(e,t)=>lE(e,"name",{value:t,configurable:!0}),[Ip,s$]=Sa("Tooltip",[zl]),Vl=zl(),dE="TooltipProvider",cE=700,Rp="tooltip.open",[uE,Ap]=Ip(dE),pE=_t(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)},[]),T.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"),jp="Tooltip",[fE,Mo]=Ip(jp),my=_t(e=>{const{__scopeTooltip:t,children:a,open:n,defaultOpen:r,onOpenChange:s,disableHoverableContent:o,delayDuration:i}=e,l=Ap(jp,e.__scopeTooltip),c=Vl(t),[u,p]=N.useState(null),[f,v]=N.useState(void 0),w=Nn(),y=N.useRef(0),k=o??l.disableHoverableContent,g=i??l.delayDuration,d=N.useRef(!1),[h,b]=Da({prop:n,defaultProp:r??!1,onChange:_t(F=>{F?(l.onOpen(),document.dispatchEvent(new CustomEvent(Rp))):l.onClose(),s?.(F)},"onChange"),caller:jp}),S=N.useMemo(()=>h?d.current?"delayed-open":"instant-open":"closed",[h]),C=N.useCallback(()=>{window.clearTimeout(y.current),y.current=0,d.current=!1,b(!0)},[b]),E=N.useCallback(()=>{window.clearTimeout(y.current),y.current=0,b(!1)},[b]),_=N.useCallback(()=>{window.clearTimeout(y.current),y.current=window.setTimeout(()=>{d.current=!0,b(!0),y.current=0},g)},[g,b]);N.useEffect(()=>()=>{y.current&&(window.clearTimeout(y.current),y.current=0)},[]);const I=f??w;return T.jsx(ey,{...c,children:T.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(y.current),y.current=0)},[E,k]),onOpen:C,onClose:E,disableHoverableContent:k,children:a})})},"Tooltip"),gy="TooltipTrigger",hy=N.forwardRef(_t(function(t,a){const{__scopeTooltip:n,"aria-describedby":r,...s}=t,o=Mo(gy,n),i=Ap(gy,n),l=Vl(n),c=N.useRef(null),u=Xe(a,c,o.onTriggerChange),p=N.useRef(!1),f=N.useRef(!1),v=N.useCallback(()=>p.current=!1,[]);return N.useEffect(()=>()=>document.removeEventListener("pointerup",v),[v]),T.jsx(ty,{asChild:!0,...l,children:T.jsx(Fe.button,{"aria-describedby":o.open?$y(r,o.contentId):r,"data-state":o.stateAttribute,...s,ref:u,onPointerMove:Ae(t.onPointerMove,w=>{w.pointerType!=="touch"&&!f.current&&!i.isPointerInTransitRef.current&&(o.onTriggerEnter(),f.current=!0)}),onPointerLeave:Ae(t.onPointerLeave,()=>{o.onTriggerLeave(),f.current=!1}),onPointerDown:Ae(t.onPointerDown,()=>{o.open&&o.onClose(),p.current=!0,document.addEventListener("pointerup",v,{once:!0})}),onFocus:Ae(t.onFocus,()=>{p.current||o.onOpen()}),onBlur:Ae(t.onBlur,o.onClose),onClick:Ae(t.onClick,o.onClose)})})},"TooltipTrigger")),vy="TooltipPortal",[mE,gE]=Ip(vy,{forceMount:void 0}),by=_t(e=>{const{__scopeTooltip:t,forceMount:a,children:n,container:r}=e,s=Mo(vy,t);return T.jsx(mE,{scope:t,forceMount:a,children:T.jsx(is,{present:a||s.open,children:T.jsx(Tu,{asChild:!0,container:r,children:n})})})},"TooltipPortal"),zo="TooltipContent",yy=N.forwardRef(_t(function(t,a){const n=gE(zo,t.__scopeTooltip),{forceMount:r=n.forceMount,side:s="top",...o}=t,i=Mo(zo,t.__scopeTooltip);return T.jsx(is,{present:r||i.open,children:i.disableHoverableContent?T.jsx(xy,{side:s,...o,ref:a}):T.jsx(hE,{side:s,...o,ref:a})})},"TooltipContent")),hE=N.forwardRef(_t(function(t,a){const n=Mo(zo,t.__scopeTooltip),r=Ap(zo,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]),w=N.useCallback((y,k)=>{const g=y.currentTarget,d={x:y.clientX,y:y.clientY},h=wy(d,g.getBoundingClientRect()),b=ky(d,h),S=Ny(k.getBoundingClientRect()),C=Cy([...b,...S]);l(C),f(!0)},[f]);return N.useEffect(()=>()=>v(),[v]),N.useEffect(()=>{if(c&&p){const y=_t(g=>w(g,p),"handleTriggerLeave"),k=_t(g=>w(g,c),"handleContentLeave");return c.addEventListener("pointerleave",y),p.addEventListener("pointerleave",k),()=>{c.removeEventListener("pointerleave",y),p.removeEventListener("pointerleave",k)}}},[c,p,w,v]),N.useEffect(()=>{if(i){const y=_t(k=>{const g=k.target,d={x:k.clientX,y:k.clientY},h=c?.contains(g)||p?.contains(g),b=!Sy(d,i);h?v():b&&(v(),u())},"handleTrackPointerGrace");return document.addEventListener("pointermove",y),()=>document.removeEventListener("pointermove",y)}},[c,p,i,u,v]),T.jsx(xy,{...t,ref:o})},"TooltipContentHoverable")),vE=$h("TooltipContent"),xy=N.forwardRef(_t(function(t,a){const{__scopeTooltip:n,children:r,"aria-label":s,id:o,onEscapeKeyDown:i,onPointerDownOutside:l,...c}=t,u=Mo(zo,n),p=Vl(n),{onClose:f}=u,[v,w]=N.useState(null),y=Xe(a,w);av(v),N.useEffect(()=>(document.addEventListener(Rp,f),()=>document.removeEventListener(Rp,f)),[f]),N.useEffect(()=>{if(u.trigger){const g=_t(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 St(()=>(k(o),()=>{k(void 0)}),[o,k]),T.jsx(xu,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:i,onPointerDownOutside:l,onFocusOutside:g=>g.preventDefault(),onDismiss:f,children:T.jsxs(ny,{"data-state":u.stateAttribute,role:s?void 0:"tooltip",id:s?void 0:u.contentId,...p,...c,ref:y,style:{...c.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"},children:[T.jsx(vE,{children:r}),s?T.jsx($2,{id:u.contentId,role:"tooltip",children:s}):null]})})},"TooltipContentImpl")),bE=N.forwardRef(_t(function(t,a){const{__scopeTooltip:n,...r}=t,s=Vl(n);return T.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")}}_t(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}_t(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}]}_t(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}_t(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)}_t(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)}_t(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}_t($y,"concatAriaDescribedby");var yE=Object.defineProperty,An=(e,t)=>yE(e,"name",{value:t,configurable:!0}),Ty="Progress",Dp=100,[xE,r$]=Sa(Ty),[wE,kE]=xE(Ty),NE=N.forwardRef(An(function(t,a){const{__scopeProgress:n,value:r=null,max:s,getValueLabel:o=Py,...i}=t;(s||s===0)&&!Lp(s)&&console.error(_y(`${s}`,"Progress"));const l=Lp(s)?s:Dp;r!==null&&!Mp(r,l)&&console.error(Iy(`${r}`,"Progress"));const c=Mp(r,l)?r:null,u=Fo(c)?o(c,l):void 0;return T.jsx(wE,{scope:n,value:c,max:l,children:T.jsx(Fe.div,{"aria-valuemax":l,"aria-valuemin":0,"aria-valuenow":Fo(c)?c:void 0,"aria-valuetext":u,role:"progressbar","data-state":Op(c,l),"data-value":c??void 0,"data-max":l,...i,ref:a})})},"Progress")),SE="ProgressIndicator",CE=N.forwardRef(An(function(t,a){const{__scopeProgress:n,...r}=t,s=kE(SE,n);return T.jsx(Fe.div,{"data-state":Op(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)}%`}An(Py,"defaultGetValueLabel");function Op(e,t){return e==null?"indeterminate":e===t?"complete":"loading"}An(Op,"getProgressState");function Fo(e){return typeof e=="number"}An(Fo,"isNumber");function Lp(e){return Fo(e)&&!isNaN(e)&&e>0}An(Lp,"isValidMaxNumber");function Mp(e,t){return Fo(e)&&!isNaN(e)&&e<=t&&e>=0}An(Mp,"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 \`${Dp}\`.`}An(_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 ${Dp} 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\`.`}An(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]),T.jsx(Pv,{open:!0,onOpenChange:s=>{s||a()},children:T.jsxs(zu,{container:Er(),children:[T.jsx(Bu,{className:"fixed inset-0 z-[95] bg-black/45 backdrop-blur-[1px] data-[state=open]:animate-in data-[state=open]:fade-in-0"}),T.jsxs(Uu,{"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:[T.jsxs("div",{className:"flex shrink-0 items-start justify-between gap-4 border-b border-border px-5 py-3.5",children:[T.jsxs("div",{className:"min-w-0",children:[T.jsx(qu,{className:"truncate text-[15px] font-semibold leading-tight",children:e}),t?T.jsx("div",{className:"mt-1 text-[11.5px] leading-relaxed text-muted-foreground",children:t}):null]}),T.jsx(jv,{asChild:!0,children:T.jsxs($r,{variant:"ghost",size:"sm",className:"h-7 shrink-0 px-2 text-[12px]",children:[T.jsx(Sh,{className:"mr-1 h-3.5 w-3.5"}),"关闭"]})})]}),T.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto px-5 py-4",children:r}),n?T.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:T.jsx(Ry,{delayDuration:260,children:T.jsxs(my,{children:[T.jsx(hy,{asChild:!0,children:t}),T.jsx(by,{container:Er(),children:T.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 T.jsx(up,{value:t,onValueChange:a,className:ut("min-w-0",n),children:T.jsx($l,{children:e.map(r=>T.jsx($E,{label:r.hint,children:T.jsxs(Ao,{value:r.id,children:[r.label,r.count===void 0||r.count===null||r.count===""?null:T.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 T.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=>T.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 T.jsxs(O2,{value:e===""||e===void 0?void 0:String(e),onValueChange:t,disabled:s,children:[T.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:[T.jsx(F2,{placeholder:n}),T.jsx(B2,{asChild:!0,children:T.jsx(C1,{className:"h-3.5 w-3.5 opacity-60"})})]}),T.jsx(W2,{container:Er(),children:T.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:T.jsx(J2,{className:"p-1",children:a.map(l=>T.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:[T.jsx(rE,{className:"absolute left-1.5 flex items-center",children:T.jsx(Nh,{className:"h-3.5 w-3.5"})}),T.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=T.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:T.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:T.jsxs("div",{className:"flex items-start justify-between gap-4 py-1.5",children:[T.jsxs("div",{className:"min-w-0",children:[T.jsx("div",{className:"text-[12.5px] leading-snug",children:a}),n?T.jsx("div",{className:"mt-0.5 text-[11px] leading-relaxed text-muted-foreground",children:n}):null]}),T.jsx("div",{className:"mt-0.5",children:o})]})}function RE({label:e,children:t}){return e?T.jsx(Ry,{delayDuration:250,children:T.jsxs(my,{children:[T.jsx(hy,{asChild:!0,children:t}),T.jsx(by,{container:Er(),children:T.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,T.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 T.jsx(NE,{className:ut("relative h-2 w-full overflow-hidden rounded-full bg-muted",a),value:n,children:T.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 T.jsx(Pv,{open:e===!0,onOpenChange:f=>{f||p()},children:T.jsxs(zu,{container:Er(),children:[T.jsx(Bu,{className:"fixed inset-0 z-[95] bg-black/55 backdrop-blur-[2px]"}),T.jsxs(Uu,{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:[T.jsx(qu,{className:"text-[13px] font-semibold leading-snug",children:t}),a?T.jsx(Av,{className:"mt-1.5 whitespace-pre-wrap text-[12px] leading-relaxed text-muted-foreground",children:a}):null,o?T.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,T.jsxs("div",{className:"mt-4 flex items-center justify-end gap-2",children:[T.jsx($r,{variant:"outline",size:"sm",onClick:p,children:s}),T.jsx($r,{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:up,TabsList:$l,TabsTrigger:Ao,SheetDrawer:EE,TabsBar:TE,SelectBox:_E,SwitchBox:IE,Tip:RE,ProgressBar:AE,DialogBox:jE,Badge:OS,Input:Cl,Textarea:yb,Label:El};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}}})})();
|