diff --git a/eval_protocol/pytest/default_pydantic_ai_rollout_processor.py b/eval_protocol/pytest/default_pydantic_ai_rollout_processor.py index 7b295f1a..31092443 100644 --- a/eval_protocol/pytest/default_pydantic_ai_rollout_processor.py +++ b/eval_protocol/pytest/default_pydantic_ai_rollout_processor.py @@ -1,6 +1,6 @@ -import os import asyncio import logging +import types from typing import List from openai.types.chat.chat_completion_assistant_message_param import ChatCompletionAssistantMessageParam @@ -23,7 +23,6 @@ UserPromptPart, ) from pydantic_ai.providers.openai import OpenAIProvider -from pydantic_ai.providers.fireworks import FireworksProvider logger = logging.getLogger(__name__) @@ -45,20 +44,40 @@ def __call__(self, rows: List[EvaluationRow], config: RolloutProcessorConfig) -> # validate that the "agent" field is present with a valid Pydantic AI Agent instance in the completion_params dict if "agent" not in config.kwargs: raise ValueError("kwargs must contain an 'agent' field with a valid Pydantic AI Agent instance") - if not isinstance(config.kwargs["agent"], Agent): - raise ValueError("kwargs['agent'] must be a valid Pydantic AI Agent instance") - - agent: Agent = config.kwargs["agent"] + if not isinstance(config.kwargs["agent"], Agent) and not isinstance( + config.kwargs["agent"], types.FunctionType + ): + raise ValueError( + "kwargs['agent'] must be a valid Pydantic AI Agent instance or a function that returns an Agent" + ) - model = OpenAIModel( - config.completion_params["model"], - provider=config.completion_params["provider"], - ) + if isinstance(config.kwargs["agent"], types.FunctionType): + setup_agent = config.kwargs["agent"] + if not isinstance(config.completion_params["model"], dict): + raise ValueError( + "completion_params['model'] must be a dict mapping agent argument names to model config dicts (with 'model' and 'provider' keys)" + ) + kwargs = {} + for model_name, model_config in config.completion_params["model"].items(): + kwargs[model_name] = OpenAIModel( + model_config["model"], + provider=model_config["provider"], + ) + agent = setup_agent(**kwargs) + model = None + else: + agent = config.kwargs["agent"] + model = OpenAIModel( + config.completion_params["model"], + provider=config.completion_params["provider"], + ) async def process_row(row: EvaluationRow) -> EvaluationRow: """Process a single row with agent rollout.""" model_messages = [self.convert_ep_message_to_pyd_message(m, row) for m in row.messages] - response = await agent.run(message_history=model_messages, model=model) + response = await agent.run( + message_history=model_messages, model=model, usage_limits=config.kwargs.get("usage_limits") + ) row.messages = await self.convert_pyd_message_to_ep_message(response.all_messages()) return row diff --git a/tests/pytest/test_pydantic_multi_agent.py b/tests/pytest/test_pydantic_multi_agent.py new file mode 100644 index 00000000..56338a63 --- /dev/null +++ b/tests/pytest/test_pydantic_multi_agent.py @@ -0,0 +1,74 @@ +""" +Copied and modified for eval-protocol from https://ai.pydantic.dev/multi-agent-applications/#agent-delegation + +To test your Pydantic AI multi-agent application, you can pass a function that +sets up the agents and their tools. The function should accept parameters that +map a model to each agent. In completion_params, you can provide mappings of +model to agent based on key. +""" + +import pytest + +from eval_protocol.models import EvaluationRow, Message +from eval_protocol.pytest import evaluation_test +from pydantic_ai import Agent + +from eval_protocol.pytest.default_pydantic_ai_rollout_processor import PydanticAgentRolloutProcessor +from pydantic_ai import RunContext +from pydantic_ai.models import Model +from pydantic_ai.usage import UsageLimits + + +def setup_agent(joke_generation_model: Model, joke_selection_model: Model) -> Agent: + """ + This is an extra step that most applications will probably need to do to + parameterize the model that their agents use. But we believe that this is a + necessary step for multi-agent applications if developers want to solve the + model selection problem. + """ + joke_selection_agent = Agent( + model=joke_selection_model, + system_prompt=( + "Use the `joke_factory` to generate some jokes, then choose the best. You must return just a single joke." + ), + ) + joke_generation_agent = Agent(joke_generation_model, output_type=list[str]) + + @joke_selection_agent.tool + async def joke_factory(ctx: RunContext[None], count: int) -> list[str]: + r = await joke_generation_agent.run( + f"Please generate {count} jokes.", + usage=ctx.usage, + ) + return r.output + + return joke_selection_agent + + +@pytest.mark.asyncio +@evaluation_test( + input_messages=[Message(role="user", content="Tell me a joke.")], + completion_params=[ + { + "model": { + "joke_generation_model": { + "model": "accounts/fireworks/models/kimi-k2-instruct", + "provider": "fireworks", + }, + "joke_selection_model": {"model": "accounts/fireworks/models/deepseek-v3p1", "provider": "fireworks"}, + } + }, + ], + rollout_processor=PydanticAgentRolloutProcessor(), + rollout_processor_kwargs={ + "agent": setup_agent, + # PydanticAgentRolloutProcessor will pass usage_limits into the "run" call + "usage_limits": UsageLimits(request_limit=5, total_tokens_limit=1000), + }, + mode="pointwise", +) +async def test_pydantic_multi_agent(row: EvaluationRow) -> EvaluationRow: + """ + Super simple hello world test for Pydantic AI. + """ + return row diff --git a/vite-app/dist/assets/index-Bw6MHHaR.js b/vite-app/dist/assets/index-Bw6MHHaR.js new file mode 100644 index 00000000..826011f1 --- /dev/null +++ b/vite-app/dist/assets/index-Bw6MHHaR.js @@ -0,0 +1,136 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const o of s.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&n(o)}).observe(document,{childList:!0,subtree:!0});function A(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function n(i){if(i.ep)return;i.ep=!0;const s=A(i);fetch(i.href,s)}})();function Dm(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Up={exports:{}},Bl={};/** + * @license React + * react-jsx-runtime.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var uy;function SH(){if(uy)return Bl;uy=1;var e=Symbol.for("react.transitional.element"),t=Symbol.for("react.fragment");function A(n,i,s){var o=null;if(s!==void 0&&(o=""+s),i.key!==void 0&&(o=""+i.key),"key"in i){s={};for(var c in i)c!=="key"&&(s[c]=i[c])}else s=i;return i=s.ref,{$$typeof:e,type:n,key:o,ref:i!==void 0?i:null,props:s}}return Bl.Fragment=t,Bl.jsx=A,Bl.jsxs=A,Bl}var fy;function HH(){return fy||(fy=1,Up.exports=SH()),Up.exports}var U=HH(),Ep={exports:{}},Ut={};/** + * @license React + * react.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var hy;function OH(){if(hy)return Ut;hy=1;var e=Symbol.for("react.transitional.element"),t=Symbol.for("react.portal"),A=Symbol.for("react.fragment"),n=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.consumer"),o=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),h=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),p=Symbol.iterator;function m(T){return T===null||typeof T!="object"?null:(T=p&&T[p]||T["@@iterator"],typeof T=="function"?T:null)}var v={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},w=Object.assign,b={};function _(T,j,et){this.props=T,this.context=j,this.refs=b,this.updater=et||v}_.prototype.isReactComponent={},_.prototype.setState=function(T,j){if(typeof T!="object"&&typeof T!="function"&&T!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,T,j,"setState")},_.prototype.forceUpdate=function(T){this.updater.enqueueForceUpdate(this,T,"forceUpdate")};function C(){}C.prototype=_.prototype;function Q(T,j,et){this.props=T,this.context=j,this.refs=b,this.updater=et||v}var E=Q.prototype=new C;E.constructor=Q,w(E,_.prototype),E.isPureReactComponent=!0;var H=Array.isArray,F={H:null,A:null,T:null,S:null,V:null},D=Object.prototype.hasOwnProperty;function L(T,j,et,tt,Y,ct){return et=ct.ref,{$$typeof:e,type:T,key:j,ref:et!==void 0?et:null,props:ct}}function z(T,j){return L(T.type,j,void 0,void 0,void 0,T.props)}function N(T){return typeof T=="object"&&T!==null&&T.$$typeof===e}function J(T){var j={"=":"=0",":":"=2"};return"$"+T.replace(/[=:]/g,function(et){return j[et]})}var At=/\/+/g;function nt(T,j){return typeof T=="object"&&T!==null&&T.key!=null?J(""+T.key):j.toString(36)}function lt(){}function ut(T){switch(T.status){case"fulfilled":return T.value;case"rejected":throw T.reason;default:switch(typeof T.status=="string"?T.then(lt,lt):(T.status="pending",T.then(function(j){T.status==="pending"&&(T.status="fulfilled",T.value=j)},function(j){T.status==="pending"&&(T.status="rejected",T.reason=j)})),T.status){case"fulfilled":return T.value;case"rejected":throw T.reason}}throw T}function rt(T,j,et,tt,Y){var ct=typeof T;(ct==="undefined"||ct==="boolean")&&(T=null);var at=!1;if(T===null)at=!0;else switch(ct){case"bigint":case"string":case"number":at=!0;break;case"object":switch(T.$$typeof){case e:case t:at=!0;break;case d:return at=T._init,rt(at(T._payload),j,et,tt,Y)}}if(at)return Y=Y(T),at=tt===""?"."+nt(T,0):tt,H(Y)?(et="",at!=null&&(et=at.replace(At,"$&/")+"/"),rt(Y,j,et,"",function(Yt){return Yt})):Y!=null&&(N(Y)&&(Y=z(Y,et+(Y.key==null||T&&T.key===Y.key?"":(""+Y.key).replace(At,"$&/")+"/")+at)),j.push(Y)),1;at=0;var he=tt===""?".":tt+":";if(H(T))for(var Kt=0;Kt>>1,T=R[ot];if(0>>1;oti(tt,q))Yi(ct,tt)?(R[ot]=ct,R[Y]=q,ot=Y):(R[ot]=tt,R[et]=q,ot=et);else if(Yi(ct,q))R[ot]=ct,R[Y]=q,ot=Y;else break t}}return G}function i(R,G){var q=R.sortIndex-G.sortIndex;return q!==0?q:R.id-G.id}if(e.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var s=performance;e.unstable_now=function(){return s.now()}}else{var o=Date,c=o.now();e.unstable_now=function(){return o.now()-c}}var u=[],h=[],d=1,p=null,m=3,v=!1,w=!1,b=!1,_=!1,C=typeof setTimeout=="function"?setTimeout:null,Q=typeof clearTimeout=="function"?clearTimeout:null,E=typeof setImmediate<"u"?setImmediate:null;function H(R){for(var G=A(h);G!==null;){if(G.callback===null)n(h);else if(G.startTime<=R)n(h),G.sortIndex=G.expirationTime,t(u,G);else break;G=A(h)}}function F(R){if(b=!1,H(R),!w)if(A(u)!==null)w=!0,D||(D=!0,nt());else{var G=A(h);G!==null&&rt(F,G.startTime-R)}}var D=!1,L=-1,z=5,N=-1;function J(){return _?!0:!(e.unstable_now()-NR&&J());){var ot=p.callback;if(typeof ot=="function"){p.callback=null,m=p.priorityLevel;var T=ot(p.expirationTime<=R);if(R=e.unstable_now(),typeof T=="function"){p.callback=T,H(R),G=!0;break e}p===A(u)&&n(u),H(R)}else n(u);p=A(u)}if(p!==null)G=!0;else{var j=A(h);j!==null&&rt(F,j.startTime-R),G=!1}}break t}finally{p=null,m=q,v=!1}G=void 0}}finally{G?nt():D=!1}}}var nt;if(typeof E=="function")nt=function(){E(At)};else if(typeof MessageChannel<"u"){var lt=new MessageChannel,ut=lt.port2;lt.port1.onmessage=At,nt=function(){ut.postMessage(null)}}else nt=function(){C(At,0)};function rt(R,G){L=C(function(){R(e.unstable_now())},G)}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(R){R.callback=null},e.unstable_forceFrameRate=function(R){0>R||125ot?(R.sortIndex=q,t(h,R),A(u)===null&&R===A(h)&&(b?(Q(L),L=-1):b=!0,rt(F,q-ot))):(R.sortIndex=T,t(u,R),w||v||(w=!0,D||(D=!0,nt()))),R},e.unstable_shouldYield=J,e.unstable_wrapCallback=function(R){var G=m;return function(){var q=m;m=G;try{return R.apply(this,arguments)}finally{m=q}}}}(Hp)),Hp}var py;function DH(){return py||(py=1,Sp.exports=TH()),Sp.exports}var Op={exports:{}},fA={};/** + * @license React + * react-dom.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var By;function MH(){if(By)return fA;By=1;var e=Lh();function t(u){var h="https://react.dev/errors/"+u;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}return e(),Op.exports=MH(),Op.exports}/** + * @license React + * react-dom-client.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var vy;function LH(){if(vy)return ml;vy=1;var e=DH(),t=Lh(),A=BQ();function n(r){var a="https://react.dev/errors/"+r;if(1T||(r.current=ot[T],ot[T]=null,T--)}function tt(r,a){T++,ot[T]=r.current,r.current=a}var Y=j(null),ct=j(null),at=j(null),he=j(null);function Kt(r,a){switch(tt(at,a),tt(ct,r),tt(Y,null),a.nodeType){case 9:case 11:r=(r=a.documentElement)&&(r=r.namespaceURI)?Nb(r):0;break;default:if(r=a.tagName,a=a.namespaceURI)a=Nb(a),r=kb(a,r);else switch(r){case"svg":r=1;break;case"math":r=2;break;default:r=0}}et(Y),tt(Y,r)}function Yt(){et(Y),et(ct),et(at)}function An(r){r.memoizedState!==null&&tt(he,r);var a=Y.current,l=kb(a,r.type);a!==l&&(tt(ct,r),tt(Y,l))}function Pe(r){ct.current===r&&(et(Y),et(ct)),he.current===r&&(et(he),fl._currentValue=q)}var tA=Object.prototype.hasOwnProperty,EA=e.unstable_scheduleCallback,FA=e.unstable_cancelCallback,ea=e.unstable_shouldYield,bA=e.unstable_requestPaint,yA=e.unstable_now,pi=e.unstable_getCurrentPriorityLevel,Pn=e.unstable_ImmediatePriority,re=e.unstable_UserBlockingPriority,jn=e.unstable_NormalPriority,es=e.unstable_LowPriority,Ar=e.unstable_IdlePriority,As=e.log,Aa=e.unstable_setDisableYieldValue,nn=null,_e=null;function SA(r){if(typeof As=="function"&&Aa(r),_e&&typeof _e.setStrictMode=="function")try{_e.setStrictMode(nn,r)}catch{}}var Fe=Math.clz32?Math.clz32:ir,nr=Math.log,yo=Math.LN2;function ir(r){return r>>>=0,r===0?32:31-(nr(r)/yo|0)|0}var rn=256,aA=4194304;function Wt(r){var a=r&42;if(a!==0)return a;switch(r&-r){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:return 64;case 128:return 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 r&4194048;case 4194304:case 8388608:case 16777216:case 33554432:return r&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return r}}function Bi(r,a,l){var f=r.pendingLanes;if(f===0)return 0;var g=0,B=r.suspendedLanes,y=r.pingedLanes;r=r.warmLanes;var x=f&134217727;return x!==0?(f=x&~B,f!==0?g=Wt(f):(y&=x,y!==0?g=Wt(y):l||(l=x&~r,l!==0&&(g=Wt(l))))):(x=f&~B,x!==0?g=Wt(x):y!==0?g=Wt(y):l||(l=f&~r,l!==0&&(g=Wt(l)))),g===0?0:a!==0&&a!==g&&(a&B)===0&&(B=g&-g,l=a&-a,B>=l||B===32&&(l&4194048)!==0)?a:g}function En(r,a){return(r.pendingLanes&~(r.suspendedLanes&~r.pingedLanes)&a)===0}function rr(r,a){switch(r){case 1:case 2:case 4:case 8:case 64:return a+250;case 16:case 32: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 a+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function sr(){var r=rn;return rn<<=1,(rn&4194048)===0&&(rn=256),r}function mi(){var r=aA;return aA<<=1,(aA&62914560)===0&&(aA=4194304),r}function Gn(r){for(var a=[],l=0;31>l;l++)a.push(r);return a}function sn(r,a){r.pendingLanes|=a,a!==268435456&&(r.suspendedLanes=0,r.pingedLanes=0,r.warmLanes=0)}function ns(r,a,l,f,g,B){var y=r.pendingLanes;r.pendingLanes=l,r.suspendedLanes=0,r.pingedLanes=0,r.warmLanes=0,r.expiredLanes&=l,r.entangledLanes&=l,r.errorRecoveryDisabledLanes&=l,r.shellSuspendCounter=0;var x=r.entanglements,O=r.expirationTimes,K=r.hiddenUpdates;for(l=y&~l;0)":-1g||O[f]!==K[g]){var X=` +`+O[f].replace(" at new "," at ");return r.displayName&&X.includes("")&&(X=X.replace("",r.displayName)),X}while(1<=f&&0<=g);break}}}finally{yd=!1,Error.prepareStackTrace=l}return(l=r?r.displayName||r.name:"")?ra(l):""}function _S(r){switch(r.tag){case 26:case 27:case 5:return ra(r.type);case 16:return ra("Lazy");case 13:return ra("Suspense");case 19:return ra("SuspenseList");case 0:case 15:return Cd(r.type,!1);case 11:return Cd(r.type.render,!1);case 1:return Cd(r.type,!0);case 31:return ra("Activity");default:return""}}function Tv(r){try{var a="";do a+=_S(r),r=r.return;while(r);return a}catch(l){return` +Error generating stack: `+l.message+` +`+l.stack}}function ln(r){switch(typeof r){case"bigint":case"boolean":case"number":case"string":case"undefined":return r;case"object":return r;default:return""}}function Dv(r){var a=r.type;return(r=r.nodeName)&&r.toLowerCase()==="input"&&(a==="checkbox"||a==="radio")}function xS(r){var a=Dv(r)?"checked":"value",l=Object.getOwnPropertyDescriptor(r.constructor.prototype,a),f=""+r[a];if(!r.hasOwnProperty(a)&&typeof l<"u"&&typeof l.get=="function"&&typeof l.set=="function"){var g=l.get,B=l.set;return Object.defineProperty(r,a,{configurable:!0,get:function(){return g.call(this)},set:function(y){f=""+y,B.call(this,y)}}),Object.defineProperty(r,a,{enumerable:l.enumerable}),{getValue:function(){return f},setValue:function(y){f=""+y},stopTracking:function(){r._valueTracker=null,delete r[a]}}}}function Dc(r){r._valueTracker||(r._valueTracker=xS(r))}function Mv(r){if(!r)return!1;var a=r._valueTracker;if(!a)return!0;var l=a.getValue(),f="";return r&&(f=Dv(r)?r.checked?"true":"false":r.value),r=f,r!==l?(a.setValue(r),!0):!1}function Mc(r){if(r=r||(typeof document<"u"?document:void 0),typeof r>"u")return null;try{return r.activeElement||r.body}catch{return r.body}}var QS=/[\n"\\]/g;function cn(r){return r.replace(QS,function(a){return"\\"+a.charCodeAt(0).toString(16)+" "})}function _d(r,a,l,f,g,B,y,x){r.name="",y!=null&&typeof y!="function"&&typeof y!="symbol"&&typeof y!="boolean"?r.type=y:r.removeAttribute("type"),a!=null?y==="number"?(a===0&&r.value===""||r.value!=a)&&(r.value=""+ln(a)):r.value!==""+ln(a)&&(r.value=""+ln(a)):y!=="submit"&&y!=="reset"||r.removeAttribute("value"),a!=null?xd(r,y,ln(a)):l!=null?xd(r,y,ln(l)):f!=null&&r.removeAttribute("value"),g==null&&B!=null&&(r.defaultChecked=!!B),g!=null&&(r.checked=g&&typeof g!="function"&&typeof g!="symbol"),x!=null&&typeof x!="function"&&typeof x!="symbol"&&typeof x!="boolean"?r.name=""+ln(x):r.removeAttribute("name")}function Lv(r,a,l,f,g,B,y,x){if(B!=null&&typeof B!="function"&&typeof B!="symbol"&&typeof B!="boolean"&&(r.type=B),a!=null||l!=null){if(!(B!=="submit"&&B!=="reset"||a!=null))return;l=l!=null?""+ln(l):"",a=a!=null?""+ln(a):l,x||a===r.value||(r.value=a),r.defaultValue=a}f=f??g,f=typeof f!="function"&&typeof f!="symbol"&&!!f,r.checked=x?r.checked:!!f,r.defaultChecked=!!f,y!=null&&typeof y!="function"&&typeof y!="symbol"&&typeof y!="boolean"&&(r.name=y)}function xd(r,a,l){a==="number"&&Mc(r.ownerDocument)===r||r.defaultValue===""+l||(r.defaultValue=""+l)}function sa(r,a,l,f){if(r=r.options,a){a={};for(var g=0;g"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Sd=!1;if(bi)try{var Qo={};Object.defineProperty(Qo,"passive",{get:function(){Sd=!0}}),window.addEventListener("test",Qo,Qo),window.removeEventListener("test",Qo,Qo)}catch{Sd=!1}var lr=null,Hd=null,Rc=null;function Vv(){if(Rc)return Rc;var r,a=Hd,l=a.length,f,g="value"in lr?lr.value:lr.textContent,B=g.length;for(r=0;r=Fo),Yv=" ",Wv=!1;function $v(r,a){switch(r){case"keyup":return t1.indexOf(a.keyCode)!==-1;case"keydown":return a.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Jv(r){return r=r.detail,typeof r=="object"&&"data"in r?r.data:null}var ca=!1;function A1(r,a){switch(r){case"compositionend":return Jv(a);case"keypress":return a.which!==32?null:(Wv=!0,Yv);case"textInput":return r=a.data,r===Yv&&Wv?null:r;default:return null}}function n1(r,a){if(ca)return r==="compositionend"||!Ld&&$v(r,a)?(r=Vv(),Rc=Hd=lr=null,ca=!1,r):null;switch(r){case"paste":return null;case"keypress":if(!(a.ctrlKey||a.altKey||a.metaKey)||a.ctrlKey&&a.altKey){if(a.char&&1=a)return{node:l,offset:a-r};r=f}t:{for(;l;){if(l.nextSibling){l=l.nextSibling;break t}l=l.parentNode}l=void 0}l=s0(l)}}function o0(r,a){return r&&a?r===a?!0:r&&r.nodeType===3?!1:a&&a.nodeType===3?o0(r,a.parentNode):"contains"in r?r.contains(a):r.compareDocumentPosition?!!(r.compareDocumentPosition(a)&16):!1:!1}function l0(r){r=r!=null&&r.ownerDocument!=null&&r.ownerDocument.defaultView!=null?r.ownerDocument.defaultView:window;for(var a=Mc(r.document);a instanceof r.HTMLIFrameElement;){try{var l=typeof a.contentWindow.location.href=="string"}catch{l=!1}if(l)r=a.contentWindow;else break;a=Mc(r.document)}return a}function Nd(r){var a=r&&r.nodeName&&r.nodeName.toLowerCase();return a&&(a==="input"&&(r.type==="text"||r.type==="search"||r.type==="tel"||r.type==="url"||r.type==="password")||a==="textarea"||r.contentEditable==="true")}var u1=bi&&"documentMode"in document&&11>=document.documentMode,ua=null,kd=null,To=null,Kd=!1;function c0(r,a,l){var f=l.window===l?l.document:l.nodeType===9?l:l.ownerDocument;Kd||ua==null||ua!==Mc(f)||(f=ua,"selectionStart"in f&&Nd(f)?f={start:f.selectionStart,end:f.selectionEnd}:(f=(f.ownerDocument&&f.ownerDocument.defaultView||window).getSelection(),f={anchorNode:f.anchorNode,anchorOffset:f.anchorOffset,focusNode:f.focusNode,focusOffset:f.focusOffset}),To&&Oo(To,f)||(To=f,f=Uu(kd,"onSelect"),0>=y,g-=y,Ci=1<<32-Fe(a)+g|l<B?B:8;var y=R.T,x={};R.T=x,Qg(r,!1,a,l);try{var O=g(),K=R.S;if(K!==null&&K(x,O),O!==null&&typeof O=="object"&&typeof O.then=="function"){var X=w1(O,f);Zo(r,a,X,XA(r))}else Zo(r,a,f,XA(r))}catch($){Zo(r,a,{then:function(){},status:"rejected",reason:$},XA())}finally{G.p=B,R.T=y}}function x1(){}function _g(r,a,l,f){if(r.tag!==5)throw Error(n(476));var g=uw(r).queue;cw(r,g,a,q,l===null?x1:function(){return fw(r),l(f)})}function uw(r){var a=r.memoizedState;if(a!==null)return a;a={memoizedState:q,baseState:q,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ui,lastRenderedState:q},next:null};var l={};return a.next={memoizedState:l,baseState:l,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ui,lastRenderedState:l},next:null},r.memoizedState=a,r=r.alternate,r!==null&&(r.memoizedState=a),a}function fw(r){var a=uw(r).next.queue;Zo(r,a,{},XA())}function xg(){return uA(fl)}function hw(){return Ne().memoizedState}function dw(){return Ne().memoizedState}function Q1(r){for(var a=r.return;a!==null;){switch(a.tag){case 24:case 3:var l=XA();r=fr(l);var f=hr(a,r,l);f!==null&&(ZA(f,a,l),zo(f,a,l)),a={cache:eg()},r.payload=a;return}a=a.return}}function U1(r,a,l){var f=XA();l={lane:f,revertLane:0,action:l,hasEagerState:!1,eagerState:null,next:null},au(r)?pw(a,l):(l=jd(r,a,l,f),l!==null&&(ZA(l,r,f),Bw(l,a,f)))}function gw(r,a,l){var f=XA();Zo(r,a,l,f)}function Zo(r,a,l,f){var g={lane:f,revertLane:0,action:l,hasEagerState:!1,eagerState:null,next:null};if(au(r))pw(a,g);else{var B=r.alternate;if(r.lanes===0&&(B===null||B.lanes===0)&&(B=a.lastRenderedReducer,B!==null))try{var y=a.lastRenderedState,x=B(y,l);if(g.hasEagerState=!0,g.eagerState=x,zA(x,y))return Pc(r,a,g,0),se===null&&Vc(),!1}catch{}finally{}if(l=jd(r,a,g,f),l!==null)return ZA(l,r,f),Bw(l,a,f),!0}return!1}function Qg(r,a,l,f){if(f={lane:2,revertLane:ip(),action:f,hasEagerState:!1,eagerState:null,next:null},au(r)){if(a)throw Error(n(479))}else a=jd(r,l,f,2),a!==null&&ZA(a,r,2)}function au(r){var a=r.alternate;return r===Et||a!==null&&a===Et}function pw(r,a){ba=eu=!0;var l=r.pending;l===null?a.next=a:(a.next=l.next,l.next=a),r.pending=a}function Bw(r,a,l){if((l&4194048)!==0){var f=a.lanes;f&=r.pendingLanes,l|=f,a.lanes=l,Se(r,l)}}var ou={readContext:uA,use:nu,useCallback:Te,useContext:Te,useEffect:Te,useImperativeHandle:Te,useLayoutEffect:Te,useInsertionEffect:Te,useMemo:Te,useReducer:Te,useRef:Te,useState:Te,useDebugValue:Te,useDeferredValue:Te,useTransition:Te,useSyncExternalStore:Te,useId:Te,useHostTransitionStatus:Te,useFormState:Te,useActionState:Te,useOptimistic:Te,useMemoCache:Te,useCacheRefresh:Te},mw={readContext:uA,use:nu,useCallback:function(r,a){return OA().memoizedState=[r,a===void 0?null:a],r},useContext:uA,useEffect:ew,useImperativeHandle:function(r,a,l){l=l!=null?l.concat([r]):null,su(4194308,4,rw.bind(null,a,r),l)},useLayoutEffect:function(r,a){return su(4194308,4,r,a)},useInsertionEffect:function(r,a){su(4,2,r,a)},useMemo:function(r,a){var l=OA();a=a===void 0?null:a;var f=r();if(ms){SA(!0);try{r()}finally{SA(!1)}}return l.memoizedState=[f,a],f},useReducer:function(r,a,l){var f=OA();if(l!==void 0){var g=l(a);if(ms){SA(!0);try{l(a)}finally{SA(!1)}}}else g=a;return f.memoizedState=f.baseState=g,r={pending:null,lanes:0,dispatch:null,lastRenderedReducer:r,lastRenderedState:g},f.queue=r,r=r.dispatch=U1.bind(null,Et,r),[f.memoizedState,r]},useRef:function(r){var a=OA();return r={current:r},a.memoizedState=r},useState:function(r){r=wg(r);var a=r.queue,l=gw.bind(null,Et,a);return a.dispatch=l,[r.memoizedState,l]},useDebugValue:yg,useDeferredValue:function(r,a){var l=OA();return Cg(l,r,a)},useTransition:function(){var r=wg(!1);return r=cw.bind(null,Et,r.queue,!0,!1),OA().memoizedState=r,[!1,r]},useSyncExternalStore:function(r,a,l){var f=Et,g=OA();if(Pt){if(l===void 0)throw Error(n(407));l=l()}else{if(l=a(),se===null)throw Error(n(349));(Lt&124)!==0||N0(f,a,l)}g.memoizedState=l;var B={value:l,getSnapshot:a};return g.queue=B,ew(K0.bind(null,f,B,r),[r]),f.flags|=2048,Ca(9,ru(),k0.bind(null,f,B,l,a),null),l},useId:function(){var r=OA(),a=se.identifierPrefix;if(Pt){var l=_i,f=Ci;l=(f&~(1<<32-Fe(f)-1)).toString(32)+l,a="«"+a+"R"+l,l=Au++,0Ct?(Ze=vt,vt=null):Ze=vt.sibling;var It=V(I,vt,k[Ct],W);if(It===null){vt===null&&(vt=Ze);break}r&&vt&&It.alternate===null&&a(I,vt),M=B(It,M,Ct),Ft===null?gt=It:Ft.sibling=It,Ft=It,vt=Ze}if(Ct===k.length)return l(I,vt),Pt&&fs(I,Ct),gt;if(vt===null){for(;CtCt?(Ze=vt,vt=null):Ze=vt.sibling;var Sr=V(I,vt,It.value,W);if(Sr===null){vt===null&&(vt=Ze);break}r&&vt&&Sr.alternate===null&&a(I,vt),M=B(Sr,M,Ct),Ft===null?gt=Sr:Ft.sibling=Sr,Ft=Sr,vt=Ze}if(It.done)return l(I,vt),Pt&&fs(I,Ct),gt;if(vt===null){for(;!It.done;Ct++,It=k.next())It=$(I,It.value,W),It!==null&&(M=B(It,M,Ct),Ft===null?gt=It:Ft.sibling=It,Ft=It);return Pt&&fs(I,Ct),gt}for(vt=f(vt);!It.done;Ct++,It=k.next())It=P(vt,I,Ct,It.value,W),It!==null&&(r&&It.alternate!==null&&vt.delete(It.key===null?Ct:It.key),M=B(It,M,Ct),Ft===null?gt=It:Ft.sibling=It,Ft=It);return r&&vt.forEach(function(FH){return a(I,FH)}),Pt&&fs(I,Ct),gt}function qt(I,M,k,W){if(typeof k=="object"&&k!==null&&k.type===w&&k.key===null&&(k=k.props.children),typeof k=="object"&&k!==null){switch(k.$$typeof){case m:t:{for(var gt=k.key;M!==null;){if(M.key===gt){if(gt=k.type,gt===w){if(M.tag===7){l(I,M.sibling),W=g(M,k.props.children),W.return=I,I=W;break t}}else if(M.elementType===gt||typeof gt=="object"&>!==null&>.$$typeof===z&&ww(gt)===M.type){l(I,M.sibling),W=g(M,k.props),Wo(W,k),W.return=I,I=W;break t}l(I,M);break}else a(I,M);M=M.sibling}k.type===w?(W=cs(k.props.children,I.mode,W,k.key),W.return=I,I=W):(W=Gc(k.type,k.key,k.props,null,I.mode,W),Wo(W,k),W.return=I,I=W)}return y(I);case v:t:{for(gt=k.key;M!==null;){if(M.key===gt)if(M.tag===4&&M.stateNode.containerInfo===k.containerInfo&&M.stateNode.implementation===k.implementation){l(I,M.sibling),W=g(M,k.children||[]),W.return=I,I=W;break t}else{l(I,M);break}else a(I,M);M=M.sibling}W=Zd(k,I.mode,W),W.return=I,I=W}return y(I);case z:return gt=k._init,k=gt(k._payload),qt(I,M,k,W)}if(rt(k))return _t(I,M,k,W);if(nt(k)){if(gt=nt(k),typeof gt!="function")throw Error(n(150));return k=gt.call(k),bt(I,M,k,W)}if(typeof k.then=="function")return qt(I,M,lu(k),W);if(k.$$typeof===E)return qt(I,M,Wc(I,k),W);cu(I,k)}return typeof k=="string"&&k!==""||typeof k=="number"||typeof k=="bigint"?(k=""+k,M!==null&&M.tag===6?(l(I,M.sibling),W=g(M,k),W.return=I,I=W):(l(I,M),W=Xd(k,I.mode,W),W.return=I,I=W),y(I)):l(I,M)}return function(I,M,k,W){try{Yo=0;var gt=qt(I,M,k,W);return _a=null,gt}catch(vt){if(vt===ko||vt===Jc)throw vt;var Ft=VA(29,vt,null,I.mode);return Ft.lanes=W,Ft.return=I,Ft}finally{}}}var xa=bw(!0),yw=bw(!1),gn=j(null),Yn=null;function gr(r){var a=r.alternate;tt(Ke,Ke.current&1),tt(gn,r),Yn===null&&(a===null||wa.current!==null||a.memoizedState!==null)&&(Yn=r)}function Cw(r){if(r.tag===22){if(tt(Ke,Ke.current),tt(gn,r),Yn===null){var a=r.alternate;a!==null&&a.memoizedState!==null&&(Yn=r)}}else pr()}function pr(){tt(Ke,Ke.current),tt(gn,gn.current)}function Ei(r){et(gn),Yn===r&&(Yn=null),et(Ke)}var Ke=j(0);function uu(r){for(var a=r;a!==null;){if(a.tag===13){var l=a.memoizedState;if(l!==null&&(l=l.dehydrated,l===null||l.data==="$?"||pp(l)))return a}else if(a.tag===19&&a.memoizedProps.revealOrder!==void 0){if((a.flags&128)!==0)return a}else if(a.child!==null){a.child.return=a,a=a.child;continue}if(a===r)break;for(;a.sibling===null;){if(a.return===null||a.return===r)return null;a=a.return}a.sibling.return=a.return,a=a.sibling}return null}function Ug(r,a,l,f){a=r.memoizedState,l=l(f,a),l=l==null?a:d({},a,l),r.memoizedState=l,r.lanes===0&&(r.updateQueue.baseState=l)}var Eg={enqueueSetState:function(r,a,l){r=r._reactInternals;var f=XA(),g=fr(f);g.payload=a,l!=null&&(g.callback=l),a=hr(r,g,f),a!==null&&(ZA(a,r,f),zo(a,r,f))},enqueueReplaceState:function(r,a,l){r=r._reactInternals;var f=XA(),g=fr(f);g.tag=1,g.payload=a,l!=null&&(g.callback=l),a=hr(r,g,f),a!==null&&(ZA(a,r,f),zo(a,r,f))},enqueueForceUpdate:function(r,a){r=r._reactInternals;var l=XA(),f=fr(l);f.tag=2,a!=null&&(f.callback=a),a=hr(r,f,l),a!==null&&(ZA(a,r,l),zo(a,r,l))}};function _w(r,a,l,f,g,B,y){return r=r.stateNode,typeof r.shouldComponentUpdate=="function"?r.shouldComponentUpdate(f,B,y):a.prototype&&a.prototype.isPureReactComponent?!Oo(l,f)||!Oo(g,B):!0}function xw(r,a,l,f){r=a.state,typeof a.componentWillReceiveProps=="function"&&a.componentWillReceiveProps(l,f),typeof a.UNSAFE_componentWillReceiveProps=="function"&&a.UNSAFE_componentWillReceiveProps(l,f),a.state!==r&&Eg.enqueueReplaceState(a,a.state,null)}function vs(r,a){var l=a;if("ref"in a){l={};for(var f in a)f!=="ref"&&(l[f]=a[f])}if(r=r.defaultProps){l===a&&(l=d({},l));for(var g in r)l[g]===void 0&&(l[g]=r[g])}return l}var fu=typeof reportError=="function"?reportError:function(r){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var a=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof r=="object"&&r!==null&&typeof r.message=="string"?String(r.message):String(r),error:r});if(!window.dispatchEvent(a))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",r);return}console.error(r)};function Qw(r){fu(r)}function Uw(r){console.error(r)}function Ew(r){fu(r)}function hu(r,a){try{var l=r.onUncaughtError;l(a.value,{componentStack:a.stack})}catch(f){setTimeout(function(){throw f})}}function Fw(r,a,l){try{var f=r.onCaughtError;f(l.value,{componentStack:l.stack,errorBoundary:a.tag===1?a.stateNode:null})}catch(g){setTimeout(function(){throw g})}}function Fg(r,a,l){return l=fr(l),l.tag=3,l.payload={element:null},l.callback=function(){hu(r,a)},l}function Sw(r){return r=fr(r),r.tag=3,r}function Hw(r,a,l,f){var g=l.type.getDerivedStateFromError;if(typeof g=="function"){var B=f.value;r.payload=function(){return g(B)},r.callback=function(){Fw(a,l,f)}}var y=l.stateNode;y!==null&&typeof y.componentDidCatch=="function"&&(r.callback=function(){Fw(a,l,f),typeof g!="function"&&(yr===null?yr=new Set([this]):yr.add(this));var x=f.stack;this.componentDidCatch(f.value,{componentStack:x!==null?x:""})})}function F1(r,a,l,f,g){if(l.flags|=32768,f!==null&&typeof f=="object"&&typeof f.then=="function"){if(a=l.alternate,a!==null&&Ro(a,l,g,!0),l=gn.current,l!==null){switch(l.tag){case 13:return Yn===null?qg():l.alternate===null&&Qe===0&&(Qe=3),l.flags&=-257,l.flags|=65536,l.lanes=g,f===ig?l.flags|=16384:(a=l.updateQueue,a===null?l.updateQueue=new Set([f]):a.add(f),ep(r,f,g)),!1;case 22:return l.flags|=65536,f===ig?l.flags|=16384:(a=l.updateQueue,a===null?(a={transitions:null,markerInstances:null,retryQueue:new Set([f])},l.updateQueue=a):(l=a.retryQueue,l===null?a.retryQueue=new Set([f]):l.add(f)),ep(r,f,g)),!1}throw Error(n(435,l.tag))}return ep(r,f,g),qg(),!1}if(Pt)return a=gn.current,a!==null?((a.flags&65536)===0&&(a.flags|=256),a.flags|=65536,a.lanes=g,f!==$d&&(r=Error(n(422),{cause:f}),Lo(un(r,l)))):(f!==$d&&(a=Error(n(423),{cause:f}),Lo(un(a,l))),r=r.current.alternate,r.flags|=65536,g&=-g,r.lanes|=g,f=un(f,l),g=Fg(r.stateNode,f,g),ag(r,g),Qe!==4&&(Qe=2)),!1;var B=Error(n(520),{cause:f});if(B=un(B,l),nl===null?nl=[B]:nl.push(B),Qe!==4&&(Qe=2),a===null)return!0;f=un(f,l),l=a;do{switch(l.tag){case 3:return l.flags|=65536,r=g&-g,l.lanes|=r,r=Fg(l.stateNode,f,r),ag(l,r),!1;case 1:if(a=l.type,B=l.stateNode,(l.flags&128)===0&&(typeof a.getDerivedStateFromError=="function"||B!==null&&typeof B.componentDidCatch=="function"&&(yr===null||!yr.has(B))))return l.flags|=65536,g&=-g,l.lanes|=g,g=Sw(g),Hw(g,r,l,f),ag(l,g),!1}l=l.return}while(l!==null);return!1}var Ow=Error(n(461)),Ge=!1;function eA(r,a,l,f){a.child=r===null?yw(a,null,l,f):xa(a,r.child,l,f)}function Tw(r,a,l,f,g){l=l.render;var B=a.ref;if("ref"in f){var y={};for(var x in f)x!=="ref"&&(y[x]=f[x])}else y=f;return ps(a),f=fg(r,a,l,y,B,g),x=hg(),r!==null&&!Ge?(dg(r,a,g),Fi(r,a,g)):(Pt&&x&&Yd(a),a.flags|=1,eA(r,a,f,g),a.child)}function Dw(r,a,l,f,g){if(r===null){var B=l.type;return typeof B=="function"&&!Gd(B)&&B.defaultProps===void 0&&l.compare===null?(a.tag=15,a.type=B,Mw(r,a,B,f,g)):(r=Gc(l.type,null,f,a,a.mode,g),r.ref=a.ref,r.return=a,a.child=r)}if(B=r.child,!Rg(r,g)){var y=B.memoizedProps;if(l=l.compare,l=l!==null?l:Oo,l(y,f)&&r.ref===a.ref)return Fi(r,a,g)}return a.flags|=1,r=yi(B,f),r.ref=a.ref,r.return=a,a.child=r}function Mw(r,a,l,f,g){if(r!==null){var B=r.memoizedProps;if(Oo(B,f)&&r.ref===a.ref)if(Ge=!1,a.pendingProps=f=B,Rg(r,g))(r.flags&131072)!==0&&(Ge=!0);else return a.lanes=r.lanes,Fi(r,a,g)}return Sg(r,a,l,f,g)}function Lw(r,a,l){var f=a.pendingProps,g=f.children,B=r!==null?r.memoizedState:null;if(f.mode==="hidden"){if((a.flags&128)!==0){if(f=B!==null?B.baseLanes|l:l,r!==null){for(g=a.child=r.child,B=0;g!==null;)B=B|g.lanes|g.childLanes,g=g.sibling;a.childLanes=B&~f}else a.childLanes=0,a.child=null;return Rw(r,a,f,l)}if((l&536870912)!==0)a.memoizedState={baseLanes:0,cachePool:null},r!==null&&$c(a,B!==null?B.cachePool:null),B!==null?M0(a,B):lg(),Cw(a);else return a.lanes=a.childLanes=536870912,Rw(r,a,B!==null?B.baseLanes|l:l,l)}else B!==null?($c(a,B.cachePool),M0(a,B),pr(),a.memoizedState=null):(r!==null&&$c(a,null),lg(),pr());return eA(r,a,g,l),a.child}function Rw(r,a,l,f){var g=ng();return g=g===null?null:{parent:ke._currentValue,pool:g},a.memoizedState={baseLanes:l,cachePool:g},r!==null&&$c(a,null),lg(),Cw(a),r!==null&&Ro(r,a,f,!0),null}function du(r,a){var l=a.ref;if(l===null)r!==null&&r.ref!==null&&(a.flags|=4194816);else{if(typeof l!="function"&&typeof l!="object")throw Error(n(284));(r===null||r.ref!==l)&&(a.flags|=4194816)}}function Sg(r,a,l,f,g){return ps(a),l=fg(r,a,l,f,void 0,g),f=hg(),r!==null&&!Ge?(dg(r,a,g),Fi(r,a,g)):(Pt&&f&&Yd(a),a.flags|=1,eA(r,a,l,g),a.child)}function Iw(r,a,l,f,g,B){return ps(a),a.updateQueue=null,l=R0(a,f,l,g),L0(r),f=hg(),r!==null&&!Ge?(dg(r,a,B),Fi(r,a,B)):(Pt&&f&&Yd(a),a.flags|=1,eA(r,a,l,B),a.child)}function Nw(r,a,l,f,g){if(ps(a),a.stateNode===null){var B=ga,y=l.contextType;typeof y=="object"&&y!==null&&(B=uA(y)),B=new l(f,B),a.memoizedState=B.state!==null&&B.state!==void 0?B.state:null,B.updater=Eg,a.stateNode=B,B._reactInternals=a,B=a.stateNode,B.props=f,B.state=a.memoizedState,B.refs={},rg(a),y=l.contextType,B.context=typeof y=="object"&&y!==null?uA(y):ga,B.state=a.memoizedState,y=l.getDerivedStateFromProps,typeof y=="function"&&(Ug(a,l,y,f),B.state=a.memoizedState),typeof l.getDerivedStateFromProps=="function"||typeof B.getSnapshotBeforeUpdate=="function"||typeof B.UNSAFE_componentWillMount!="function"&&typeof B.componentWillMount!="function"||(y=B.state,typeof B.componentWillMount=="function"&&B.componentWillMount(),typeof B.UNSAFE_componentWillMount=="function"&&B.UNSAFE_componentWillMount(),y!==B.state&&Eg.enqueueReplaceState(B,B.state,null),Po(a,f,B,g),Vo(),B.state=a.memoizedState),typeof B.componentDidMount=="function"&&(a.flags|=4194308),f=!0}else if(r===null){B=a.stateNode;var x=a.memoizedProps,O=vs(l,x);B.props=O;var K=B.context,X=l.contextType;y=ga,typeof X=="object"&&X!==null&&(y=uA(X));var $=l.getDerivedStateFromProps;X=typeof $=="function"||typeof B.getSnapshotBeforeUpdate=="function",x=a.pendingProps!==x,X||typeof B.UNSAFE_componentWillReceiveProps!="function"&&typeof B.componentWillReceiveProps!="function"||(x||K!==y)&&xw(a,B,f,y),ur=!1;var V=a.memoizedState;B.state=V,Po(a,f,B,g),Vo(),K=a.memoizedState,x||V!==K||ur?(typeof $=="function"&&(Ug(a,l,$,f),K=a.memoizedState),(O=ur||_w(a,l,O,f,V,K,y))?(X||typeof B.UNSAFE_componentWillMount!="function"&&typeof B.componentWillMount!="function"||(typeof B.componentWillMount=="function"&&B.componentWillMount(),typeof B.UNSAFE_componentWillMount=="function"&&B.UNSAFE_componentWillMount()),typeof B.componentDidMount=="function"&&(a.flags|=4194308)):(typeof B.componentDidMount=="function"&&(a.flags|=4194308),a.memoizedProps=f,a.memoizedState=K),B.props=f,B.state=K,B.context=y,f=O):(typeof B.componentDidMount=="function"&&(a.flags|=4194308),f=!1)}else{B=a.stateNode,sg(r,a),y=a.memoizedProps,X=vs(l,y),B.props=X,$=a.pendingProps,V=B.context,K=l.contextType,O=ga,typeof K=="object"&&K!==null&&(O=uA(K)),x=l.getDerivedStateFromProps,(K=typeof x=="function"||typeof B.getSnapshotBeforeUpdate=="function")||typeof B.UNSAFE_componentWillReceiveProps!="function"&&typeof B.componentWillReceiveProps!="function"||(y!==$||V!==O)&&xw(a,B,f,O),ur=!1,V=a.memoizedState,B.state=V,Po(a,f,B,g),Vo();var P=a.memoizedState;y!==$||V!==P||ur||r!==null&&r.dependencies!==null&&Yc(r.dependencies)?(typeof x=="function"&&(Ug(a,l,x,f),P=a.memoizedState),(X=ur||_w(a,l,X,f,V,P,O)||r!==null&&r.dependencies!==null&&Yc(r.dependencies))?(K||typeof B.UNSAFE_componentWillUpdate!="function"&&typeof B.componentWillUpdate!="function"||(typeof B.componentWillUpdate=="function"&&B.componentWillUpdate(f,P,O),typeof B.UNSAFE_componentWillUpdate=="function"&&B.UNSAFE_componentWillUpdate(f,P,O)),typeof B.componentDidUpdate=="function"&&(a.flags|=4),typeof B.getSnapshotBeforeUpdate=="function"&&(a.flags|=1024)):(typeof B.componentDidUpdate!="function"||y===r.memoizedProps&&V===r.memoizedState||(a.flags|=4),typeof B.getSnapshotBeforeUpdate!="function"||y===r.memoizedProps&&V===r.memoizedState||(a.flags|=1024),a.memoizedProps=f,a.memoizedState=P),B.props=f,B.state=P,B.context=O,f=X):(typeof B.componentDidUpdate!="function"||y===r.memoizedProps&&V===r.memoizedState||(a.flags|=4),typeof B.getSnapshotBeforeUpdate!="function"||y===r.memoizedProps&&V===r.memoizedState||(a.flags|=1024),f=!1)}return B=f,du(r,a),f=(a.flags&128)!==0,B||f?(B=a.stateNode,l=f&&typeof l.getDerivedStateFromError!="function"?null:B.render(),a.flags|=1,r!==null&&f?(a.child=xa(a,r.child,null,g),a.child=xa(a,null,l,g)):eA(r,a,l,g),a.memoizedState=B.state,r=a.child):r=Fi(r,a,g),r}function kw(r,a,l,f){return Mo(),a.flags|=256,eA(r,a,l,f),a.child}var Hg={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function Og(r){return{baseLanes:r,cachePool:U0()}}function Tg(r,a,l){return r=r!==null?r.childLanes&~l:0,a&&(r|=pn),r}function Kw(r,a,l){var f=a.pendingProps,g=!1,B=(a.flags&128)!==0,y;if((y=B)||(y=r!==null&&r.memoizedState===null?!1:(Ke.current&2)!==0),y&&(g=!0,a.flags&=-129),y=(a.flags&32)!==0,a.flags&=-33,r===null){if(Pt){if(g?gr(a):pr(),Pt){var x=xe,O;if(O=x){t:{for(O=x,x=Zn;O.nodeType!==8;){if(!x){x=null;break t}if(O=Hn(O.nextSibling),O===null){x=null;break t}}x=O}x!==null?(a.memoizedState={dehydrated:x,treeContext:us!==null?{id:Ci,overflow:_i}:null,retryLane:536870912,hydrationErrors:null},O=VA(18,null,null,0),O.stateNode=x,O.return=a,a.child=O,_A=a,xe=null,O=!0):O=!1}O||ds(a)}if(x=a.memoizedState,x!==null&&(x=x.dehydrated,x!==null))return pp(x)?a.lanes=32:a.lanes=536870912,null;Ei(a)}return x=f.children,f=f.fallback,g?(pr(),g=a.mode,x=gu({mode:"hidden",children:x},g),f=cs(f,g,l,null),x.return=a,f.return=a,x.sibling=f,a.child=x,g=a.child,g.memoizedState=Og(l),g.childLanes=Tg(r,y,l),a.memoizedState=Hg,f):(gr(a),Dg(a,x))}if(O=r.memoizedState,O!==null&&(x=O.dehydrated,x!==null)){if(B)a.flags&256?(gr(a),a.flags&=-257,a=Mg(r,a,l)):a.memoizedState!==null?(pr(),a.child=r.child,a.flags|=128,a=null):(pr(),g=f.fallback,x=a.mode,f=gu({mode:"visible",children:f.children},x),g=cs(g,x,l,null),g.flags|=2,f.return=a,g.return=a,f.sibling=g,a.child=f,xa(a,r.child,null,l),f=a.child,f.memoizedState=Og(l),f.childLanes=Tg(r,y,l),a.memoizedState=Hg,a=g);else if(gr(a),pp(x)){if(y=x.nextSibling&&x.nextSibling.dataset,y)var K=y.dgst;y=K,f=Error(n(419)),f.stack="",f.digest=y,Lo({value:f,source:null,stack:null}),a=Mg(r,a,l)}else if(Ge||Ro(r,a,l,!1),y=(l&r.childLanes)!==0,Ge||y){if(y=se,y!==null&&(f=l&-l,f=(f&42)!==0?1:oA(f),f=(f&(y.suspendedLanes|l))!==0?0:f,f!==0&&f!==O.retryLane))throw O.retryLane=f,da(r,f),ZA(y,r,f),Ow;x.data==="$?"||qg(),a=Mg(r,a,l)}else x.data==="$?"?(a.flags|=192,a.child=r.child,a=null):(r=O.treeContext,xe=Hn(x.nextSibling),_A=a,Pt=!0,hs=null,Zn=!1,r!==null&&(hn[dn++]=Ci,hn[dn++]=_i,hn[dn++]=us,Ci=r.id,_i=r.overflow,us=a),a=Dg(a,f.children),a.flags|=4096);return a}return g?(pr(),g=f.fallback,x=a.mode,O=r.child,K=O.sibling,f=yi(O,{mode:"hidden",children:f.children}),f.subtreeFlags=O.subtreeFlags&65011712,K!==null?g=yi(K,g):(g=cs(g,x,l,null),g.flags|=2),g.return=a,f.return=a,f.sibling=g,a.child=f,f=g,g=a.child,x=r.child.memoizedState,x===null?x=Og(l):(O=x.cachePool,O!==null?(K=ke._currentValue,O=O.parent!==K?{parent:K,pool:K}:O):O=U0(),x={baseLanes:x.baseLanes|l,cachePool:O}),g.memoizedState=x,g.childLanes=Tg(r,y,l),a.memoizedState=Hg,f):(gr(a),l=r.child,r=l.sibling,l=yi(l,{mode:"visible",children:f.children}),l.return=a,l.sibling=null,r!==null&&(y=a.deletions,y===null?(a.deletions=[r],a.flags|=16):y.push(r)),a.child=l,a.memoizedState=null,l)}function Dg(r,a){return a=gu({mode:"visible",children:a},r.mode),a.return=r,r.child=a}function gu(r,a){return r=VA(22,r,null,a),r.lanes=0,r.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null},r}function Mg(r,a,l){return xa(a,r.child,null,l),r=Dg(a,a.pendingProps.children),r.flags|=2,a.memoizedState=null,r}function zw(r,a,l){r.lanes|=a;var f=r.alternate;f!==null&&(f.lanes|=a),qd(r.return,a,l)}function Lg(r,a,l,f,g){var B=r.memoizedState;B===null?r.memoizedState={isBackwards:a,rendering:null,renderingStartTime:0,last:f,tail:l,tailMode:g}:(B.isBackwards=a,B.rendering=null,B.renderingStartTime=0,B.last=f,B.tail=l,B.tailMode=g)}function Vw(r,a,l){var f=a.pendingProps,g=f.revealOrder,B=f.tail;if(eA(r,a,f.children,l),f=Ke.current,(f&2)!==0)f=f&1|2,a.flags|=128;else{if(r!==null&&(r.flags&128)!==0)t:for(r=a.child;r!==null;){if(r.tag===13)r.memoizedState!==null&&zw(r,l,a);else if(r.tag===19)zw(r,l,a);else if(r.child!==null){r.child.return=r,r=r.child;continue}if(r===a)break t;for(;r.sibling===null;){if(r.return===null||r.return===a)break t;r=r.return}r.sibling.return=r.return,r=r.sibling}f&=1}switch(tt(Ke,f),g){case"forwards":for(l=a.child,g=null;l!==null;)r=l.alternate,r!==null&&uu(r)===null&&(g=l),l=l.sibling;l=g,l===null?(g=a.child,a.child=null):(g=l.sibling,l.sibling=null),Lg(a,!1,g,l,B);break;case"backwards":for(l=null,g=a.child,a.child=null;g!==null;){if(r=g.alternate,r!==null&&uu(r)===null){a.child=g;break}r=g.sibling,g.sibling=l,l=g,g=r}Lg(a,!0,l,null,B);break;case"together":Lg(a,!1,null,null,void 0);break;default:a.memoizedState=null}return a.child}function Fi(r,a,l){if(r!==null&&(a.dependencies=r.dependencies),br|=a.lanes,(l&a.childLanes)===0)if(r!==null){if(Ro(r,a,l,!1),(l&a.childLanes)===0)return null}else return null;if(r!==null&&a.child!==r.child)throw Error(n(153));if(a.child!==null){for(r=a.child,l=yi(r,r.pendingProps),a.child=l,l.return=a;r.sibling!==null;)r=r.sibling,l=l.sibling=yi(r,r.pendingProps),l.return=a;l.sibling=null}return a.child}function Rg(r,a){return(r.lanes&a)!==0?!0:(r=r.dependencies,!!(r!==null&&Yc(r)))}function S1(r,a,l){switch(a.tag){case 3:Kt(a,a.stateNode.containerInfo),cr(a,ke,r.memoizedState.cache),Mo();break;case 27:case 5:An(a);break;case 4:Kt(a,a.stateNode.containerInfo);break;case 10:cr(a,a.type,a.memoizedProps.value);break;case 13:var f=a.memoizedState;if(f!==null)return f.dehydrated!==null?(gr(a),a.flags|=128,null):(l&a.child.childLanes)!==0?Kw(r,a,l):(gr(a),r=Fi(r,a,l),r!==null?r.sibling:null);gr(a);break;case 19:var g=(r.flags&128)!==0;if(f=(l&a.childLanes)!==0,f||(Ro(r,a,l,!1),f=(l&a.childLanes)!==0),g){if(f)return Vw(r,a,l);a.flags|=128}if(g=a.memoizedState,g!==null&&(g.rendering=null,g.tail=null,g.lastEffect=null),tt(Ke,Ke.current),f)break;return null;case 22:case 23:return a.lanes=0,Lw(r,a,l);case 24:cr(a,ke,r.memoizedState.cache)}return Fi(r,a,l)}function Pw(r,a,l){if(r!==null)if(r.memoizedProps!==a.pendingProps)Ge=!0;else{if(!Rg(r,l)&&(a.flags&128)===0)return Ge=!1,S1(r,a,l);Ge=(r.flags&131072)!==0}else Ge=!1,Pt&&(a.flags&1048576)!==0&&w0(a,Zc,a.index);switch(a.lanes=0,a.tag){case 16:t:{r=a.pendingProps;var f=a.elementType,g=f._init;if(f=g(f._payload),a.type=f,typeof f=="function")Gd(f)?(r=vs(f,r),a.tag=1,a=Nw(null,a,f,r,l)):(a.tag=0,a=Sg(null,a,f,r,l));else{if(f!=null){if(g=f.$$typeof,g===H){a.tag=11,a=Tw(null,a,f,r,l);break t}else if(g===L){a.tag=14,a=Dw(null,a,f,r,l);break t}}throw a=ut(f)||f,Error(n(306,a,""))}}return a;case 0:return Sg(r,a,a.type,a.pendingProps,l);case 1:return f=a.type,g=vs(f,a.pendingProps),Nw(r,a,f,g,l);case 3:t:{if(Kt(a,a.stateNode.containerInfo),r===null)throw Error(n(387));f=a.pendingProps;var B=a.memoizedState;g=B.element,sg(r,a),Po(a,f,null,l);var y=a.memoizedState;if(f=y.cache,cr(a,ke,f),f!==B.cache&&tg(a,[ke],l,!0),Vo(),f=y.element,B.isDehydrated)if(B={element:f,isDehydrated:!1,cache:y.cache},a.updateQueue.baseState=B,a.memoizedState=B,a.flags&256){a=kw(r,a,f,l);break t}else if(f!==g){g=un(Error(n(424)),a),Lo(g),a=kw(r,a,f,l);break t}else{switch(r=a.stateNode.containerInfo,r.nodeType){case 9:r=r.body;break;default:r=r.nodeName==="HTML"?r.ownerDocument.body:r}for(xe=Hn(r.firstChild),_A=a,Pt=!0,hs=null,Zn=!0,l=yw(a,null,f,l),a.child=l;l;)l.flags=l.flags&-3|4096,l=l.sibling}else{if(Mo(),f===g){a=Fi(r,a,l);break t}eA(r,a,f,l)}a=a.child}return a;case 26:return du(r,a),r===null?(l=Zb(a.type,null,a.pendingProps,null))?a.memoizedState=l:Pt||(l=a.type,r=a.pendingProps,f=Fu(at.current).createElement(l),f[it]=a,f[pt]=r,nA(f,l,r),Oe(f),a.stateNode=f):a.memoizedState=Zb(a.type,r.memoizedProps,a.pendingProps,r.memoizedState),null;case 27:return An(a),r===null&&Pt&&(f=a.stateNode=jb(a.type,a.pendingProps,at.current),_A=a,Zn=!0,g=xe,xr(a.type)?(Bp=g,xe=Hn(f.firstChild)):xe=g),eA(r,a,a.pendingProps.children,l),du(r,a),r===null&&(a.flags|=4194304),a.child;case 5:return r===null&&Pt&&((g=f=xe)&&(f=iH(f,a.type,a.pendingProps,Zn),f!==null?(a.stateNode=f,_A=a,xe=Hn(f.firstChild),Zn=!1,g=!0):g=!1),g||ds(a)),An(a),g=a.type,B=a.pendingProps,y=r!==null?r.memoizedProps:null,f=B.children,hp(g,B)?f=null:y!==null&&hp(g,y)&&(a.flags|=32),a.memoizedState!==null&&(g=fg(r,a,y1,null,null,l),fl._currentValue=g),du(r,a),eA(r,a,f,l),a.child;case 6:return r===null&&Pt&&((r=l=xe)&&(l=rH(l,a.pendingProps,Zn),l!==null?(a.stateNode=l,_A=a,xe=null,r=!0):r=!1),r||ds(a)),null;case 13:return Kw(r,a,l);case 4:return Kt(a,a.stateNode.containerInfo),f=a.pendingProps,r===null?a.child=xa(a,null,f,l):eA(r,a,f,l),a.child;case 11:return Tw(r,a,a.type,a.pendingProps,l);case 7:return eA(r,a,a.pendingProps,l),a.child;case 8:return eA(r,a,a.pendingProps.children,l),a.child;case 12:return eA(r,a,a.pendingProps.children,l),a.child;case 10:return f=a.pendingProps,cr(a,a.type,f.value),eA(r,a,f.children,l),a.child;case 9:return g=a.type._context,f=a.pendingProps.children,ps(a),g=uA(g),f=f(g),a.flags|=1,eA(r,a,f,l),a.child;case 14:return Dw(r,a,a.type,a.pendingProps,l);case 15:return Mw(r,a,a.type,a.pendingProps,l);case 19:return Vw(r,a,l);case 31:return f=a.pendingProps,l=a.mode,f={mode:f.mode,children:f.children},r===null?(l=gu(f,l),l.ref=a.ref,a.child=l,l.return=a,a=l):(l=yi(r.child,f),l.ref=a.ref,a.child=l,l.return=a,a=l),a;case 22:return Lw(r,a,l);case 24:return ps(a),f=uA(ke),r===null?(g=ng(),g===null&&(g=se,B=eg(),g.pooledCache=B,B.refCount++,B!==null&&(g.pooledCacheLanes|=l),g=B),a.memoizedState={parent:f,cache:g},rg(a),cr(a,ke,g)):((r.lanes&l)!==0&&(sg(r,a),Po(a,null,null,l),Vo()),g=r.memoizedState,B=a.memoizedState,g.parent!==f?(g={parent:f,cache:f},a.memoizedState=g,a.lanes===0&&(a.memoizedState=a.updateQueue.baseState=g),cr(a,ke,f)):(f=B.cache,cr(a,ke,f),f!==g.cache&&tg(a,[ke],l,!0))),eA(r,a,a.pendingProps.children,l),a.child;case 29:throw a.pendingProps}throw Error(n(156,a.tag))}function Si(r){r.flags|=4}function jw(r,a){if(a.type!=="stylesheet"||(a.state.loading&4)!==0)r.flags&=-16777217;else if(r.flags|=16777216,!qb(a)){if(a=gn.current,a!==null&&((Lt&4194048)===Lt?Yn!==null:(Lt&62914560)!==Lt&&(Lt&536870912)===0||a!==Yn))throw Ko=ig,E0;r.flags|=8192}}function pu(r,a){a!==null&&(r.flags|=4),r.flags&16384&&(a=r.tag!==22?mi():536870912,r.lanes|=a,Fa|=a)}function $o(r,a){if(!Pt)switch(r.tailMode){case"hidden":a=r.tail;for(var l=null;a!==null;)a.alternate!==null&&(l=a),a=a.sibling;l===null?r.tail=null:l.sibling=null;break;case"collapsed":l=r.tail;for(var f=null;l!==null;)l.alternate!==null&&(f=l),l=l.sibling;f===null?a||r.tail===null?r.tail=null:r.tail.sibling=null:f.sibling=null}}function ye(r){var a=r.alternate!==null&&r.alternate.child===r.child,l=0,f=0;if(a)for(var g=r.child;g!==null;)l|=g.lanes|g.childLanes,f|=g.subtreeFlags&65011712,f|=g.flags&65011712,g.return=r,g=g.sibling;else for(g=r.child;g!==null;)l|=g.lanes|g.childLanes,f|=g.subtreeFlags,f|=g.flags,g.return=r,g=g.sibling;return r.subtreeFlags|=f,r.childLanes=l,a}function H1(r,a,l){var f=a.pendingProps;switch(Wd(a),a.tag){case 31:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return ye(a),null;case 1:return ye(a),null;case 3:return l=a.stateNode,f=null,r!==null&&(f=r.memoizedState.cache),a.memoizedState.cache!==f&&(a.flags|=2048),Qi(ke),Yt(),l.pendingContext&&(l.context=l.pendingContext,l.pendingContext=null),(r===null||r.child===null)&&(Do(a)?Si(a):r===null||r.memoizedState.isDehydrated&&(a.flags&256)===0||(a.flags|=1024,C0())),ye(a),null;case 26:return l=a.memoizedState,r===null?(Si(a),l!==null?(ye(a),jw(a,l)):(ye(a),a.flags&=-16777217)):l?l!==r.memoizedState?(Si(a),ye(a),jw(a,l)):(ye(a),a.flags&=-16777217):(r.memoizedProps!==f&&Si(a),ye(a),a.flags&=-16777217),null;case 27:Pe(a),l=at.current;var g=a.type;if(r!==null&&a.stateNode!=null)r.memoizedProps!==f&&Si(a);else{if(!f){if(a.stateNode===null)throw Error(n(166));return ye(a),null}r=Y.current,Do(a)?b0(a):(r=jb(g,f,l),a.stateNode=r,Si(a))}return ye(a),null;case 5:if(Pe(a),l=a.type,r!==null&&a.stateNode!=null)r.memoizedProps!==f&&Si(a);else{if(!f){if(a.stateNode===null)throw Error(n(166));return ye(a),null}if(r=Y.current,Do(a))b0(a);else{switch(g=Fu(at.current),r){case 1:r=g.createElementNS("http://www.w3.org/2000/svg",l);break;case 2:r=g.createElementNS("http://www.w3.org/1998/Math/MathML",l);break;default:switch(l){case"svg":r=g.createElementNS("http://www.w3.org/2000/svg",l);break;case"math":r=g.createElementNS("http://www.w3.org/1998/Math/MathML",l);break;case"script":r=g.createElement("div"),r.innerHTML=" - + +
diff --git a/vite-app/package.json b/vite-app/package.json index bdb187e5..4e370c16 100644 --- a/vite-app/package.json +++ b/vite-app/package.json @@ -21,6 +21,7 @@ "react-chartjs-2": "^5.3.0", "react-dom": "^19.1.0", "react-router-dom": "^7.7.1", + "react-tooltip": "^5.29.1", "zod": "^4.0.14" }, "devDependencies": { diff --git a/vite-app/pnpm-lock.yaml b/vite-app/pnpm-lock.yaml index 0ec51189..673d6610 100644 --- a/vite-app/pnpm-lock.yaml +++ b/vite-app/pnpm-lock.yaml @@ -32,6 +32,9 @@ importers: react-router-dom: specifier: ^7.7.1 version: 7.7.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react-tooltip: + specifier: ^5.29.1 + version: 5.29.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) zod: specifier: ^4.0.14 version: 4.0.14 @@ -372,6 +375,15 @@ packages: resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -859,6 +871,9 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1442,6 +1457,12 @@ packages: react-dom: optional: true + react-tooltip@5.29.1: + resolution: {integrity: sha512-rmJmEb/p99xWhwmVT7F7riLG08wwKykjHiMGbDPloNJk3tdI73oHsVOwzZ4SRjqMdd5/xwb/4nmz0RcoMfY7Bw==} + peerDependencies: + react: '>=16.14.0' + react-dom: '>=16.14.0' + react@19.1.1: resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} engines: {node: '>=0.10.0'} @@ -1967,6 +1988,17 @@ snapshots: '@eslint/core': 0.15.1 levn: 0.4.1 + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.4': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/utils@0.2.10': {} + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -2452,6 +2484,8 @@ snapshots: chownr@3.0.0: {} + classnames@2.5.1: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -2984,6 +3018,13 @@ snapshots: optionalDependencies: react-dom: 19.1.1(react@19.1.1) + react-tooltip@5.29.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@floating-ui/dom': 1.7.4 + classnames: 2.5.1 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + react@19.1.1: {} resolve-from@4.0.0: {} diff --git a/vite-app/src/components/EvaluationRow.tsx b/vite-app/src/components/EvaluationRow.tsx index f5ed1462..346f57d9 100644 --- a/vite-app/src/components/EvaluationRow.tsx +++ b/vite-app/src/components/EvaluationRow.tsx @@ -11,6 +11,7 @@ import { TableCell, TableRowInteractive } from "./TableContainer"; import { useState } from "react"; import type { FilterGroup, FilterConfig } from "../types/filters"; import { Tooltip } from "./Tooltip"; +import { JSONTooltip } from "./JSONTooltip"; // Add filter button component const AddFilterButton = observer( @@ -190,9 +191,29 @@ const InvocationId = observer(({ invocationId }: { invocationId?: string }) => { ); }); -const RowModel = observer(({ model }: { model: string | undefined }) => ( - {model || "N/A"} -)); +const RowModel = observer( + ({ model }: { model: string | object | undefined }) => { + const displayValue = model + ? typeof model === "string" + ? model + : JSON.stringify(model) + : "N/A"; + + // For strings, show full value without tooltip + if (typeof model === "string" || !model) { + return {displayValue}; + } + + // For objects, use JSONTooltip with truncation + return ( + + + {displayValue} + + + ); + } +); const RowScore = observer(({ score }: { score: number | undefined }) => { const scoreClass = score diff --git a/vite-app/src/components/JSONTooltip.tsx b/vite-app/src/components/JSONTooltip.tsx new file mode 100644 index 00000000..6ec92380 --- /dev/null +++ b/vite-app/src/components/JSONTooltip.tsx @@ -0,0 +1,63 @@ +import React from "react"; +import { Tooltip } from "react-tooltip"; + +interface JSONTooltipProps { + children: React.ReactNode; + data: any; + position?: "top" | "bottom" | "left" | "right"; + className?: string; +} + +export const JSONTooltip: React.FC = ({ + children, + data, + position = "top", + className = "", +}) => { + const tooltipId = `json-tooltip-${Math.random().toString(36).substr(2, 9)}`; + const formattedJSON = JSON.stringify(data, null, 2); + + return ( + <> +
+ {children} +
+ ( +
 e.stopPropagation()}
+            onClick={(e) => e.stopPropagation()}
+            onDoubleClick={(e) => e.stopPropagation()}
+            onContextMenu={(e) => e.stopPropagation()}
+          >
+            {formattedJSON}
+          
+ )} + /> + + ); +}; diff --git a/vite-app/src/components/Tooltip.tsx b/vite-app/src/components/Tooltip.tsx index 96bbfc53..526048d1 100644 --- a/vite-app/src/components/Tooltip.tsx +++ b/vite-app/src/components/Tooltip.tsx @@ -1,4 +1,5 @@ import React from "react"; +import { Tooltip as ReactTooltip } from "react-tooltip"; interface TooltipProps { children: React.ReactNode; @@ -13,29 +14,35 @@ export const Tooltip: React.FC = ({ position = "top", className = "", }) => { - const getPositionClasses = () => { - switch (position) { - case "top": - return "bottom-full left-1/2 transform -translate-x-1/2 mb-2"; - case "bottom": - return "top-full left-1/2 transform -translate-x-1/2 mt-2"; - case "left": - return "right-full top-1/2 transform -translate-y-1/2 mr-2"; - case "right": - return "left-full top-1/2 transform -translate-y-1/2 ml-2"; - default: - return "bottom-full left-1/2 transform -translate-x-1/2 mb-2"; - } - }; + const tooltipId = `tooltip-${Math.random().toString(36).substr(2, 9)}`; return ( -
- {children} + <>
- {content} + {children}
-
+ + {content} + + ); };