weifuwu 0.75.0 → 0.76.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -13
- package/dist/ai/types.d.ts +2 -0
- package/dist/components/AiChat/AiChat.d.ts +5 -1
- package/dist/components/ApprovalCard/ApprovalCard.d.ts +5 -2
- package/dist/components/CitationCard/CitationCard.d.ts +38 -0
- package/dist/components/Command/Command.d.ts +1 -1
- package/dist/components/JsonSchemaForm/JsonSchemaForm.d.ts +48 -0
- package/dist/components/ReasoningBlock/ReasoningBlock.d.ts +25 -0
- package/dist/components/Select/Select.d.ts +11 -1
- package/dist/components/SessionList/SessionList.d.ts +42 -0
- package/dist/components/TreeSelect/TreeSelect.d.ts +3 -2
- package/dist/components/index.d.ts +10 -2
- package/dist/components/index.js +14 -14
- package/dist/components/style.css +608 -20
- package/dist/index.js +140 -311
- package/dist/layout/weifuwu-layout.css +9 -0
- package/dist/test/client/setup.d.ts +12 -0
- package/dist/ui/index.d.ts +2 -2
- package/dist/ui-dom/Confirm.d.ts +5 -41
- package/dist/ui-dom/Notification.d.ts +8 -70
- package/dist/ui-dom/Toast.d.ts +8 -43
- package/dist/ui-dom/hooks/chat.d.ts +11 -0
- package/dist/ui-dom/hooks/events.d.ts +30 -0
- package/dist/ui-dom/hooks/external.d.ts +20 -0
- package/dist/ui-dom/hooks/index.d.ts +31 -0
- package/dist/ui-dom/hooks/input.d.ts +33 -0
- package/dist/ui-dom/hooks/media.d.ts +17 -0
- package/dist/ui-dom/hooks/popup.d.ts +37 -0
- package/dist/ui-dom/hooks/stable.d.ts +39 -0
- package/dist/ui-dom/hooks/test/hooks.test.d.ts +1 -0
- package/dist/ui-dom/hooks/types.d.ts +78 -0
- package/dist/ui-dom/index.d.ts +19 -17
- package/dist/ui-dom/index.js +11 -11
- package/dist/ui-dom/jsx-runtime.js +1 -1
- package/dist/ui-dom/store.d.ts +24 -0
- package/dist/ui-dom/testing.d.ts +74 -0
- package/dist/ui-dom/testing.js +1 -0
- package/dist/ui-dom/testing.test.d.ts +1 -0
- package/dist/ui-dom/types.d.ts +28 -11
- package/dist/ui-dom/use-chat.d.ts +19 -14
- package/dist/ui-dom/vdom/build.d.ts +34 -0
- package/dist/ui-dom/vdom/diff.d.ts +34 -0
- package/dist/ui-dom/vdom/hydration.d.ts +17 -0
- package/dist/ui-dom/vdom/index.d.ts +23 -0
- package/dist/ui-dom/vdom/mount.d.ts +49 -0
- package/dist/ui-dom/vdom/registry.d.ts +27 -0
- package/dist/ui-dom/vdom/render.d.ts +13 -0
- package/dist/ui-dom/vdom/scheduler.d.ts +13 -0
- package/dist/ui-dom/vdom/serve.d.ts +30 -0
- package/dist/ui-dom/vdom/ssr.d.ts +44 -0
- package/dist/ui-dom/vnode.d.ts +9 -26
- package/docs/components-map.md +18 -1
- package/docs/components.md +9 -4
- package/docs/custom-components.md +14 -8
- package/docs/frontend.md +2 -2
- package/docs/layout.md +2 -2
- package/package.json +5 -1
- package/dist/ui/ssr.d.ts +0 -35
- package/dist/ui-dom/diff.d.ts +0 -28
- package/dist/ui-dom/hydration.d.ts +0 -13
- package/dist/ui-dom/reactive.d.ts +0 -6
- package/dist/ui-dom/registry.d.ts +0 -27
- package/dist/ui-dom/render.d.ts +0 -46
- package/dist/ui-dom/serve.d.ts +0 -28
- package/dist/ui-dom/ssr.d.ts +0 -57
- package/dist/ui-dom/ui.d.ts +0 -78
package/dist/ui-dom/index.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
function Rn(e){let n=[],t=(e||"/").replace(/:(\w+)/g,(o,r)=>(n.push(r),"([^/]+)")).replace(/\*/g,".*");return{re:new RegExp(`^${t}$`),keys:n}}var Le=class{_routes=[];_middlewares=[];_injections=[];_injected=!1;_mode;_notFound;constructor(n={}){this._mode=n.mode??"history"}get mode(){return this._mode}use(n,t){if(typeof n=="string"&&t){let o=this,r=n,c=async(i,s,u)=>{let a=s.__routePath??o.getPath(),d=null;return a===r?d="/":(r==="/"?a!=="/"&&a.startsWith("/"):a.startsWith(r+"/"))&&(d=a.slice(r.length)),d===null?u:async(m,w)=>{let C=await t._handle(d,m,w);return C===null?u(m,w):C}};return this._middlewares.push(c),this}return n.length<=1?(this._injections.push(n),this):(this._middlewares.push(n),this)}async _ensureInjected(n){if(!this._injected){this._injected=!0;for(let t of this._injections){let o=await t(n);o&&o!==n&&Object.assign(n,o)}}}get(n,t,o){return this._routes.push({path:n,handler:t,title:o?.title}),this}notFound(n){return this._notFound=n,this}getPath(){return this._getPath(void 0)}_getPath(n){let t=n?.location??(typeof window<"u"?window.location:null);return this._mode==="hash"?(t?.hash??"").replace(/^#/,"")||"/":t?.pathname??"/"}match(n){let t=null;for(let o of this._routes){let{re:r,keys:c}=Rn(o.path),i=n.match(r);if(!i)continue;let s={};for(let u=0;u<c.length;u++)s[c[u]]=decodeURIComponent(i[u+1]);t={handler:o.handler,params:s,title:o.title};break}return t||(t={handler:this._notFound??(()=>null),params:{}}),t}async _handle(n,t,o){await this._ensureInjected(o);let r=this.match(n);r.title&&typeof document<"u"&&(document.title=r.title),o.params=r.params,o.route&&(o.route.params=r.params);let i=r.handler,s=o.__routePath;o.__routePath=n;try{for(let u=this._middlewares.length-1;u>=0;u--){let a=this._middlewares[u],d=i;i=await a(t,o,d)??d}return await i(t,o)}finally{o.__routePath=s}}async execute(n,t,o){await this._ensureInjected(t);let r=this.match(o);r.title&&typeof document<"u"&&(document.title=r.title),t.params=r.params,t.route&&(t.route.params=r.params);let i=r.handler;for(let s=this._middlewares.length-1;s>=0;s--){let u=this._middlewares[s],a=i;i=await u(n,t,a)??a}return await i(n,t)}};function ie(){return{idCounter:0,idRegistry:new Map,unmountHooks:[]}}function j(e){return e?.__registry??ie()}function me(e){return`_wf_${e.idCounter++}`}function ye(e,n){return e.unmountHooks.push(n),()=>{let t=e.unmountHooks.indexOf(n);t>=0&&e.unmountHooks.splice(t,1)}}function Ve(e,n,t,o){try{e(n)}catch(r){console.error(`[weifuwu] ref ${t} error in <${o??"anonymous"}>`,r)}}function Mn(e,n){let t=e._child;if(t!=null)if(Array.isArray(t))for(let o of t)o&&typeof o=="object"&&O(o,n);else typeof t=="object"&&O(t,n)}function O(e,n){if(e==null||typeof e!="object")return;let t=e;if(t._id){if(t._customId&&n.idRegistry.delete(t._customId),n.idRegistry.delete(t._id),n.unmountHooks.length>0){let o=[...n.unmountHooks];for(let r of o)r(t._id);if(t._customId)for(let r of o)r(t._customId)}t._id=void 0,t._customId=void 0,t._render=void 0,t._parentNode=void 0,t._refNode=void 0}if(t._child!=null){if(Array.isArray(t._child))for(let o of t._child)o&&typeof o=="object"&&O(o,n);else O(t._child,n);t._child=void 0}if(t.props?.children&&typeof t.type=="string"){let o=Array.isArray(t.props.children)?t.props.children:[t.props.children];for(let r of o)r&&typeof r=="object"&&O(r,n)}typeof t.props?.ref=="function"&&Ve(t.props.ref,null,"cleanup"),t._remoteEl&&(Mn(t,n),t._remoteEl.remove(),t._remoteEl=void 0)}function W(){return{activeElement:()=>typeof document<"u"?document.activeElement:null,byId:e=>typeof document<"u"?document.getElementById(e):null,query:e=>typeof document<"u"?document.querySelector(e):null,queryAll:e=>typeof document<"u"?document.querySelectorAll(e):null,createElement:e=>typeof document<"u"?document.createElement(e):null,createElementNS:(e,n)=>typeof document<"u"?document.createElementNS(e,n):null,createDocumentFragment:()=>typeof document<"u"?document.createDocumentFragment():null,createComment:e=>typeof document<"u"?document.createComment(e):null,createTextNode:e=>typeof document<"u"?document.createTextNode(e):null,addEventListener:(e,n,t)=>{typeof window<"u"&&window.addEventListener(e,n,t)},removeEventListener:(e,n,t)=>{typeof window<"u"&&window.removeEventListener(e,n,t)},scrollTo:e=>{typeof window<"u"&&window.scrollTo(0,e)},matchMedia:e=>typeof window<"u"&&typeof window.matchMedia=="function"?window.matchMedia(e):null,visualViewport:()=>(typeof window<"u"?window:null)?.visualViewport??null,scrollingElement:()=>typeof document<"u"?document.scrollingElement:null,bodyElement:()=>typeof document<"u"?document.body:null,bodyAppend:e=>{typeof document<"u"&&document.body.appendChild(e)},bodyRemove:e=>{typeof document<"u"&&e.parentNode&&document.body.removeChild(e)},clearBody:()=>{typeof document<"u"&&(document.body.innerHTML="")},event:(e,n)=>{let t=typeof window<"u"?window:null,o=n&&(n.key||n.code)?"KeyboardEvent":n&&(n.clientX!==void 0||n.clientY!==void 0||n.pointerId!==void 0)?"PointerEvent":"Event";try{return new t[o](e,n)}catch{return new t.Event(e,n)}},dispatchEvent:(e,n)=>typeof e<"u"?e.dispatchEvent(n):!1,navigate:e=>{typeof window>"u"||(window.history.pushState(null,"",e),window.dispatchEvent(new PopStateEvent("popstate",{state:null})))},copyText:async e=>{let n=typeof window<"u"?window:null;if(n?.navigator?.clipboard?.writeText)try{return await n.navigator.clipboard.writeText(e),!0}catch{}try{if(typeof document>"u")return!1;let t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.select();let o=document.execCommand("copy");return document.body.removeChild(t),o}catch{return!1}},execCommand:(e,n)=>typeof document<"u"?document.execCommand(e,!1,n):!1,queryCommandState:e=>typeof document<"u"?document.queryCommandState(e):!1,queryCommandValue:e=>typeof document<"u"?document.queryCommandValue(e):"",selectionText:()=>typeof window<"u"?window.getSelection?.()?.toString()??null:null,getSelection:()=>typeof window<"u"?window.getSelection():null,viewportHeight:()=>typeof window<"u"?window.innerHeight:0,viewportWidth:()=>typeof window<"u"?window.innerWidth:0,pathname:()=>typeof window<"u"?window.location.pathname:"",createTreeWalker:(e,n)=>typeof document<"u"?document.createTreeWalker(e,n??NodeFilter.SHOW_ALL):null,scrollTop:()=>{let e=typeof document<"u"?document:null,n=typeof window<"u"?window:null;return e?.scrollingElement?.scrollTop??n?.scrollY??0},hash:()=>typeof window<"u"?window.location?.hash??"":"",setHash:e=>{typeof window<"u"&&(window.location.hash=e)},timeout:(e,n)=>typeof window<"u"?window.setTimeout(e,n):0,rootElement:()=>typeof document<"u"?document.documentElement:null,storageGet:e=>{try{return typeof window<"u"?window.localStorage?.getItem(e)??null:null}catch{return null}},storageSet:(e,n)=>{try{typeof window<"u"&&window.localStorage?.setItem(e,n)}catch{}}}}var ze=W();function Xe(e,n="bottom",t=6,o=!0){switch(n){case"bottom":return{top:e.bottom+t,left:o?e.left+e.width/2:e.left};case"top":return{top:e.top-t,left:o?e.left+e.width/2:e.left};case"left":return{top:o?e.top+e.height/2:e.top,left:e.left-t};case"right":return{top:o?e.top+e.height/2:e.top,left:e.right+t}}}function ge(e,n,t=8){if(!n)return e;let o=n.getBoundingClientRect();if(o.width===0&&o.height===0)return e;let r=Number.parseFloat(n.style.top)||o.top,c=Number.parseFloat(n.style.left)||o.left,i=e.top-r,s=e.left-c,u={top:o.top+i,bottom:o.bottom+i,left:o.left+s,right:o.right+s},a=ze.viewportWidth(),d=ze.viewportHeight(),m=e.top,w=e.left;return u.bottom>d-t&&(m=Math.max(t,m-(u.bottom-(d-t)))),u.top<t&&(m=Math.max(t,m+(t-u.top))),u.right>a-t&&(w=Math.max(t,w-(u.right-(a-t)))),u.left<t&&(w=Math.max(t,w+(t-u.left))),{top:m,left:w,width:e.width}}var te=W();function Qe(e){let n=new Map,t=new Map,o=!1,r=0;function c(){r||(r=requestAnimationFrame(()=>{r=0;let d=[];for(let[m,w]of n){if(!w.isOpen())continue;let C=w.getEl();if(!C)continue;let h=C.getBoundingClientRect();if(h.width===0&&h.height===0)continue;let g=w.compute(h);Object.assign(w.pos,ge(g,w.panel?.(),w.margin)),d.push(m)}for(let[m,w]of t){let C=w.getScroller(),h=C instanceof Window?te.scrollingElement()?.scrollTop??te.scrollTop():C.scrollTop??0;h!==w.handle.y&&(w.handle.y=h,d.push(m))}d.length>0&&e(d)}))}function i(){o||(o=!0,te.addEventListener("scroll",c,{capture:!0,passive:!0}),te.addEventListener("resize",c))}function s(){o&&(te.removeEventListener("scroll",c,{capture:!0}),te.removeEventListener("resize",c),o=!1)}function u(d){for(let m of[...n.keys()])(m.startsWith(`popup:${d}:`)||m===`popup:${d}`)&&n.delete(m);t.delete(d)}function a(){s(),r&&(cancelAnimationFrame(r),r=0),n.clear(),t.clear()}return{popupTrackers:n,scrollTrackers:t,schedulePopupRecompute:c,ensurePopupListeners:i,destroyPopupListeners:s,cleanupTrackers:u,destroy:a}}var he=W(),le=0,Ze="",en="",nn="",tn="",ve=0;function on(){return typeof window<"u"&&typeof document<"u"}function rn(){if(le++,le>1||!on())return;ve=he.scrollTop();let e=he.bodyElement();Ze=e.style.overflow,en=e.style.position,nn=e.style.top,tn=e.style.width,e.style.overflow="hidden",(/iPhone|iPad|iPod/.test(navigator.platform)||/Mac/.test(navigator.platform)&&"ontouchend"in document)&&(e.style.position="fixed",e.style.top=`-${ve}px`,e.style.width="100%")}function sn(){if(le===0||(le--,le>0)||!on())return;let e=he.bodyElement();e.style.overflow=Ze,e.style.position=en,e.style.top=nn,e.style.width=tn,ve>0&&he.scrollTo(ve)}var Ln='a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])',Ie=W();function Ae(e){let n=e.querySelectorAll(Ln);if(n.length===0)return()=>{};let t=n[0],o=n[n.length-1],r=i=>{i.key==="Tab"&&(i.shiftKey&&Ie.activeElement()===t?(i.preventDefault(),o.focus()):!i.shiftKey&&Ie.activeElement()===o&&(i.preventDefault(),t.focus()))},c=Ie.activeElement();return queueMicrotask(()=>{t.focus()}),e.addEventListener("keydown",r),()=>{e.removeEventListener("keydown",r),c?.focus()}}var we=null;function q(){return we!==null||(we=typeof process<"u"&&process.env?.UI_DEBUG==="1"||globalThis.__UI_DEBUG===!0||typeof localStorage<"u"&&localStorage.getItem("__UI_DEBUG")==="1"),we}var Ue=0;function an(){return++Ue}function be(){return--Ue}var ln=new Map;function D(e,n,t){if(!q())return;let o=(ln.get(e)??0)+1;ln.set(e,o);let r=10,c=t?.throttle??100;if(o>r&&o%c!==0)return;let i=t?.depth!==void 0?t.depth:Ue,s=" ".repeat(Math.min(i,30));console.log(`[ui-debug] ${s}${e}#${o} ${n}`)}function Q(e){let n=new Map,t=(s,u)=>{let a=(n.get(s)??0)+1;n.set(s,a),(a<=5||a%100===0)&&D(u,s+" count="+a,{throttle:100})},o=new WeakMap,r=new Set,c=s=>{if(s===null||typeof s!="object")return s;if(s instanceof Set||s instanceof Map){if(o.has(s))return o.get(s);let a=s instanceof Set?new Set(["add","delete","clear"]):new Set(["set","delete","clear"]),d=new Proxy(s,{get(m,w){let C=Reflect.get(m,w);return typeof C=="function"?a.has(String(w))?(...h)=>{let g=C.apply(m,h);e();for(let v of r)v();return g}:C.bind(m):C},set(m,w,C){Reflect.set(m,w,C),t(String(w),"set"),e();for(let h of r)h();return!0}});return o.set(s,d),d}if(s instanceof Date||s instanceof RegExp)return s;if(o.has(s))return o.get(s);let u=new Proxy(s,{set(a,d,m){if(Reflect.get(a,d)===m)return!0;Reflect.set(a,d,m),e();for(let C of r)C();return!0},get(a,d){let m=Reflect.get(a,d);return typeof m=="object"&&m!==null?c(m):m},deleteProperty(a,d){if(Reflect.has(a,d)){Reflect.deleteProperty(a,d),e();for(let m of r)m()}return!0}});return o.set(s,u),u},i=c({});return Object.defineProperty(i,"__watch",{value:s=>(r.add(s),()=>{r.delete(s)}),writable:!1,enumerable:!1}),i}function un(e,n,t){let o=new AbortController,r=t?.signal;r&&(r.aborted?o.abort():r.addEventListener("abort",()=>o.abort(),{once:!0}));let c=t?.traceId??Hn(),i=t?.record!==!1,s=[],u=(async()=>{let a;try{a=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json","X-Trace-Id":c,Accept:"text/event-stream",...t?.headers},body:JSON.stringify(n),signal:o.signal})}catch(d){if(o.signal.aborted)return;t?.onError?.({code:"provider_error",message:d instanceof Error?d.message:String(d)});return}if(!a.ok){t?.onError?.({code:Un(a.status),message:`HTTP ${a.status} ${a.statusText}`});return}try{for await(let{name:d,data:m}of In(a.body)){if(o.signal.aborted)return;An(s,{name:d,data:m},i),Vn(d,m,t??{})}}catch(d){if(o.signal.aborted)return;t?.onError?.({code:"provider_error",message:d instanceof Error?d.message:String(d)})}})();return{abort:()=>o.abort(),done:u,traceId:c,events:s}}function Vn(e,n,t){switch(e){case"wf:token":return t.onToken?.(n.text);case"wf:tool_call":return t.onToolCall?.(n);case"wf:tool_result":return t.onToolResult?.(n);case"wf:tool_progress":return t.onToolProgress?.(n);case"wf:step":return t.onStep?.(n);case"wf:approval_request":return t.onApproval?.(n);case"wf:usage":return t.onUsage?.(n);case"wf:done":return t.onDone?.(n);case"wf:error":return t.onError?.(n);default:return t.onEvent?.(e,n)}}async function*In(e){let n=e.getReader(),t=new TextDecoder,o="";try{for(;;){let{done:r,value:c}=await n.read();if(r)break;o+=t.decode(c,{stream:!0});let i=o.split(`
|
|
1
|
+
function mn(e){let t=[],n=(e||"/").replace(/:(\w+)/g,(r,o)=>(t.push(o),"([^/]+)")).replace(/\*/g,".*");return{re:new RegExp(`^${n}$`),keys:t}}var me=class{_routes=[];_middlewares=[];_injections=[];_injected=!1;_mode;_notFound;constructor(t={}){this._mode=t.mode??"history"}get mode(){return this._mode}use(t,n){if(typeof t=="string"&&n){let r=this,o=t,s=async(a,d,l)=>{let u=d.__routePath??r.getPath(),i=null;return u===o?i="/":(o==="/"?u!=="/"&&u.startsWith("/"):u.startsWith(o+"/"))&&(i=u.slice(o.length)),i===null?l:async(c,y)=>{let w=await n._handle(i,c,y);return w===null?l(c,y):w}};return this._middlewares.push(s),this}return t.length<=1?(this._injections.push(t),this):(this._middlewares.push(t),this)}async _ensureInjected(t){if(!this._injected){this._injected=!0;for(let n of this._injections){let r=await n(t);r&&r!==t&&Object.assign(t,r)}}}get(t,n,r){return this._routes.push({path:t,handler:n,title:r?.title}),this}notFound(t){return this._notFound=t,this}getPath(){return this._getPath(void 0)}_getPath(t){let n=t?.location??(typeof window<"u"?window.location:null);return this._mode==="hash"?(n?.hash??"").replace(/^#/,"")||"/":n?.pathname??"/"}match(t){let n=null;for(let r of this._routes){let{re:o,keys:s}=mn(r.path),a=t.match(o);if(!a)continue;let d={};for(let l=0;l<s.length;l++)d[s[l]]=decodeURIComponent(a[l+1]);n={handler:r.handler,params:d,title:r.title};break}return n||(n={handler:this._notFound??(()=>null),params:{}}),n}async _handle(t,n,r){await this._ensureInjected(r);let o=this.match(t);o.title&&typeof document<"u"&&(document.title=o.title),r.params=o.params,r.route&&(r.route.params=o.params);let a=o.handler,d=r.__routePath;r.__routePath=t;try{for(let l=this._middlewares.length-1;l>=0;l--){let u=this._middlewares[l],i=a;a=await u(n,r,i)??i}return await a(n,r)}finally{r.__routePath=d}}async execute(t,n,r){await this._ensureInjected(n);let o=this.match(r);o.title&&typeof document<"u"&&(document.title=o.title),n.params=o.params,n.route&&(n.route.params=o.params);let a=o.handler;for(let d=this._middlewares.length-1;d>=0;d--){let l=this._middlewares[d],u=a;a=await l(t,n,u)??u}return await a(t,n)}};var L=Symbol("Fragment"),H=Symbol("Portal");function ye(e,t,n){return{type:e,props:Ke(t),key:n??void 0}}var yn=ye;function gn(e,t,n){return ye(e,t,n)}function W(e,t,...n){let r=Ke(t??{});return n.length>0&&(r.children=n.length===1?n[0]:n),{type:e,props:r,key:t?.key??void 0}}function Ke(e){if(!e)return{};let t={};for(let n of Object.keys(e))n!=="key"&&(t[n]=e[n]);return t}function Z(e,t){return{type:H,props:{children:e,portalKey:t},key:t??void 0,_placement:"remote"}}function P(){return{activeElement:()=>typeof document<"u"?document.activeElement:null,byId:e=>typeof document<"u"?document.getElementById(e):null,query:e=>typeof document<"u"?document.querySelector(e):null,queryAll:e=>typeof document<"u"?document.querySelectorAll(e):null,createElement:e=>typeof document<"u"?document.createElement(e):null,createElementNS:(e,t)=>typeof document<"u"?document.createElementNS(e,t):null,createDocumentFragment:()=>typeof document<"u"?document.createDocumentFragment():null,createComment:e=>typeof document<"u"?document.createComment(e):null,createTextNode:e=>typeof document<"u"?document.createTextNode(e):null,addEventListener:(e,t,n)=>{typeof window<"u"&&window.addEventListener(e,t,n)},removeEventListener:(e,t,n)=>{typeof window<"u"&&window.removeEventListener(e,t,n)},scrollTo:e=>{typeof window<"u"&&window.scrollTo(0,e)},matchMedia:e=>typeof window<"u"&&typeof window.matchMedia=="function"?window.matchMedia(e):null,visualViewport:()=>(typeof window<"u"?window:null)?.visualViewport??null,scrollingElement:()=>typeof document<"u"?document.scrollingElement:null,bodyElement:()=>typeof document<"u"?document.body:null,bodyAppend:e=>{typeof document<"u"&&document.body.appendChild(e)},bodyRemove:e=>{typeof document<"u"&&e.parentNode&&document.body.removeChild(e)},clearBody:()=>{typeof document<"u"&&(document.body.innerHTML="")},event:(e,t)=>{let n=typeof window<"u"?window:null,r=t&&(t.key||t.code)?"KeyboardEvent":t&&(t.clientX!==void 0||t.clientY!==void 0||t.pointerId!==void 0)?"PointerEvent":"Event";try{return new n[r](e,t)}catch{return new n.Event(e,t)}},dispatchEvent:(e,t)=>typeof e<"u"?e.dispatchEvent(t):!1,navigate:e=>{typeof window>"u"||(window.history.pushState(null,"",e),window.dispatchEvent(new PopStateEvent("popstate",{state:null})))},copyText:async e=>{let t=typeof window<"u"?window:null;if(t?.navigator?.clipboard?.writeText)try{return await t.navigator.clipboard.writeText(e),!0}catch{}try{if(typeof document>"u")return!1;let n=document.createElement("textarea");n.value=e,n.style.position="fixed",n.style.opacity="0",document.body.appendChild(n),n.select();let r=document.execCommand("copy");return document.body.removeChild(n),r}catch{return!1}},execCommand:(e,t)=>typeof document<"u"?document.execCommand(e,!1,t):!1,queryCommandState:e=>typeof document<"u"?document.queryCommandState(e):!1,queryCommandValue:e=>typeof document<"u"?document.queryCommandValue(e):"",selectionText:()=>typeof window<"u"?window.getSelection?.()?.toString()??null:null,getSelection:()=>typeof window<"u"?window.getSelection():null,viewportHeight:()=>typeof window<"u"?window.innerHeight:0,viewportWidth:()=>typeof window<"u"?window.innerWidth:0,pathname:()=>typeof window<"u"?window.location.pathname:"",createTreeWalker:(e,t)=>typeof document<"u"?document.createTreeWalker(e,t??NodeFilter.SHOW_ALL):null,scrollTop:()=>{let e=typeof document<"u"?document:null,t=typeof window<"u"?window:null;return e?.scrollingElement?.scrollTop??t?.scrollY??0},hash:()=>typeof window<"u"?window.location?.hash??"":"",setHash:e=>{typeof window<"u"&&(window.location.hash=e)},timeout:(e,t)=>typeof window<"u"?window.setTimeout(e,t):0,rootElement:()=>typeof document<"u"?document.documentElement:null,storageGet:e=>{try{return typeof window<"u"?window.localStorage?.getItem(e)??null:null}catch{return null}},storageSet:(e,t)=>{try{typeof window<"u"&&window.localStorage?.setItem(e,t)}catch{}}}}function hn(e,t,n=400){let r=!1,o=()=>{r||(r=!0,e.removeEventListener("animationend",o),clearTimeout(s),t())};e.addEventListener("animationend",o);let s=setTimeout(o,n)}function $(e,t){return Object.assign(Object.create(e),t)}function wn(e){let t={baseURL:e?.baseURL??"",headers:{"Content-Type":"application/json",...e?.headers}},n=e?.onRequest,r=e?.onResponse,o=e?.timeout??0;async function s(a,d,l,u){let i=t.baseURL+d,c={method:a,headers:{...t.headers,...u?.headers}},y=e?.token?.();y&&!c.headers.Authorization&&(c.headers.Authorization=`Bearer ${y}`);let w=o>0,h=!!u?.signal,m=null,p=null;(w||h)&&(m=new AbortController,c.signal=m.signal,w&&(p=setTimeout(()=>m.abort(new Error("Request timed out")),o)),h&&u.signal.addEventListener("abort",()=>m.abort())),l!==void 0&&a!=="GET"&&a!=="HEAD"&&(c.body=JSON.stringify(l));let f={url:i,init:c};n&&(f=n(f));try{let g=await fetch(f.url,f.init);if(r)return r(g);if(!g.ok){let C=await g.text().catch(()=>"");throw new ge(g.status,C||g.statusText)}let v=g.headers.get("content-length");if(g.status===204||v==="0")return;let E=(g.headers.get("content-type")||"").toLowerCase();return E.includes("application/json")||E.includes("json")?g.json():g.text()}finally{p&&clearTimeout(p)}}return a=>$(a,{api:{get:(l,u)=>s("GET",l,void 0,u),post:(l,u,i)=>s("POST",l,u,i),put:(l,u,i)=>s("PUT",l,u,i),patch:(l,u,i)=>s("PATCH",l,u,i),delete:(l,u)=>s("DELETE",l,void 0,u)}})}var ge=class extends Error{status;body;constructor(t,n){super(`API Error ${t}: ${n}`),this.name="ApiError",this.status=t,this.body=n}};function vn(e){try{let t=e.split(".");if(t.length!==3)return null;let n=t[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(atob(n))}catch{return null}}function bn(e){let t=vn(e);return t?.exp?t.exp*1e3-3e4<Date.now():!0}function Cn(e){let t=e?.storage??localStorage,n=e?.tokenKey??"weifuwu_token",r=e?.userKey??"weifuwu_user",o=e?.refreshTokenKey??"weifuwu_refresh",s=e?.refreshEndpoint??"/api/auth/refresh";return a=>{let d=t.getItem(n),l=t.getItem(r),u={token:d,user:l?JSON.parse(l):null,get isLoggedIn(){return this.token!==null},login(i,c,y){u.token=i,u.user=c,t.setItem(n,i),t.setItem(r,JSON.stringify(c)),y&&t.setItem(o,y)},logout(){u.token=null,u.user=null,t.removeItem(n),t.removeItem(r),t.removeItem(o)},setUser(i){u.user=i,t.setItem(r,JSON.stringify(i))},async refresh(){let i=t.getItem(o);if(!i)return!1;try{let c=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:i})});if(!c.ok)return u.logout(),!1;let y=await c.json();return u.token=y.token,t.setItem(n,y.token),y.refreshToken&&t.setItem(o,y.refreshToken),!0}catch{return!1}}};return d&&bn(d)&&u.refresh().catch(()=>{}),$(a,{auth:u})}}function En(e={}){let t=e.url??"/ws",n=e.reconnectInterval??3e3,r=e.maxReconnect??10,o=e.pingInterval??3e4,s=e.pingTimeout??1e4;return a=>{let d=new Set,l=null,u=0,i=null,c=null,y=null,w=!1,h={isConnected:!1,onMessage:v=>(d.add(v),()=>{d.delete(v)}),send:v=>{l?.readyState===WebSocket.OPEN&&l.send(JSON.stringify(v))},_connect:m,close:()=>{w=!0,g(),l?.close(),l=null,h.isConnected=!1}};async function m(){if(!w)try{l=new WebSocket(t),l.onopen=()=>{h.isConnected=!0,u=0,p()},l.onmessage=v=>{try{let E=JSON.parse(v.data);for(let C of d)C(E)}catch{}f()},l.onclose=()=>{h.isConnected=!1,g(),!w&&u<r&&(u++,i=setTimeout(m,n*Math.min(u,5)))},l.onerror=()=>{l?.close()}}catch{w||(i=setTimeout(m,n))}}function p(){o<=0||(c=setInterval(()=>{l?.readyState===WebSocket.OPEN&&l.send(JSON.stringify({type:"ping"})),y=setTimeout(()=>{l?.close()},s)},o))}function f(){clearTimeout(y)}function g(){clearInterval(c),clearTimeout(y),clearTimeout(i)}return m(),$(a,{ws:h})}}function he(e,t){if(e===t)return!0;let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let o of n)if(e[o]!==t[o])return!1;return!0}async function ze(e,t,n,r){e._id||(r?.reuse?._id?e._id=r.reuse._id:e._id=n.nextId(),n.idRegistry.set(e._id,e)),r?.reuse&&(r.reuse._parentNode&&(e._parentNode=r.reuse._parentNode),r.reuse._refNode&&(e._refNode=r.reuse._refNode));let o=Object.create(t);o.ui=Object.create(t.ui);let s=o.ui;if(s._selfId=e._id,s._selfVNode=e,s.render=function(a){return a==null&&e._id?t.ui.render([e._id]):t.ui.render(a)},typeof e._render!="function"&&typeof r?.reuse?._render=="function"&&(e._render=r.reuse._render),typeof e._render!="function"){t.ui?.setMounting?.(!0);let a;try{a=await e.type(e.props??{},o)}finally{t.ui?.endMounting?.()}if(typeof a!="function")throw new Error(`Component ${e.type.name||"anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`);e._render=a}return{renderFn:e._render,childCtx:o}}async function _(e,t,n,r,o){if(e==null||typeof e=="boolean"||typeof e=="string"||typeof e=="number")return e;if(Array.isArray(e)){let l=Array.isArray(n)?n:[];return await Promise.all(e.map((u,i)=>_(u,t,l[i],r,o))),e}let s=e,a=r??t.__registry,d=n!=null&&typeof n=="object"&&!Array.isArray(n)&&n.type===s.type?n:null;if(typeof s.type=="function"){let{childCtx:l}=await ze(s,t,a,{reuse:d??void 0}),u=he(d?.props??{},s.props??{});if(o?.force||!u||d?._child==null){let i=await _(s._render(s.props),l,d?._child,a);s._child=i??null}else s._child=d._child;return s}if(s.type===L){let l=await _(s.props?.children??null,t,d?._child??d?.props?.children,a);return s._child=l??null,s}if(typeof s.type=="string"||typeof s.type=="symbol"){let l=await _(s.props?.children??null,t,d?.props?.children,a);return s._child=l??null,s}return s}var we=new Set(["svg","path","circle","rect","line","polyline","polygon","g","text","defs","use","clipPath"]),xn=/^on[A-Z]/,Tn=new Set(["zIndex","opacity","lineHeight","fontWeight","fontSizeAdjust","flex","flexGrow","flexShrink","order","zoom","aspectRatio","gridRow","gridColumn","scale","rotate","animationIterationCount","columnCount","fillOpacity","strokeOpacity","stopOpacity","floodOpacity"]);function G(e,t,n){if(n==null||n===!1)return;let r=e.ownerDocument?.defaultView;if(t==="class"||t==="className"){if(typeof n=="object")for(let[o,s]of Object.entries(n))s&&e.classList.add(o);else e.setAttribute("class",String(n));return}if(t==="style"){if(typeof n=="string")e.setAttribute("style",n);else{let o=e.style;for(let[s,a]of Object.entries(n))a==null?o[s]="":s.startsWith("--")?o.setProperty(s,String(a)):typeof a=="number"&&!Tn.has(s)?o[s]=`${a}px`:o[s]=String(a)}return}if(t==="ref"){if(typeof n=="function")try{n(e)}catch(o){console.error("[weifuwu] ref error",o)}return}if(xn.test(t)){let o=t.slice(2).toLowerCase();e.addEventListener(o,n);return}if(t==="value"){e.value=n;return}if(t==="indeterminate"){e.indeterminate=!!n;return}if(t==="innerHTML"){e.innerHTML=String(n??"");return}if(t==="draggable"||t==="contenteditable"||t==="spellcheck"){e.setAttribute(t,n?"true":"false");return}if(t.startsWith("aria-")&&typeof n=="boolean"){e.setAttribute(t,n?"true":"false");return}if(n===!0){e.setAttribute(t,"");return}try{e[t]=n,e.getAttribute(t)!==String(n)&&e.setAttribute(t,String(n))}catch{e.setAttribute(t,String(n))}}function k(e,t,n){let r=t?.browser??n;if(!r)throw new Error("[vdom] renderValue requires browser env (ctx.browser)");if(e==null||typeof e=="boolean")return null;if(typeof e=="string"||typeof e=="number")return r.createTextNode(String(e));if(Array.isArray(e)){let l=r.createDocumentFragment();if(!l)return null;for(let u of e){let i=k(u,t,r);i!=null&&l.appendChild(i)}return l}let o=e;if(o.type===H){let l=r.bodyElement();if(!l)return null;let u=l.querySelector("#__wf_portal");u||(u=r.createElement("div"),u&&(u.id="__wf_portal",l.appendChild(u)));let i=r.createElement("div");if(i){i.setAttribute("data-portal",String(o.props?.portalKey??"wf"));let c=k(o.props?.children??null,t,r);c!=null&&i.appendChild(c),u&&u.appendChild(i),o._remoteEl=i}return null}if(o.type===L){let l=r.createDocumentFragment();if(!l)return null;let u=(Array.isArray(o.props?.children)?o.props.children:[o.props?.children]).flat(1/0);for(let i of u){let c=k(i,t,r);c!=null&&l.appendChild(c)}return o._childNodes=Array.from(l.childNodes),l}if(typeof o.type=="function"){if(typeof o._render!="function")throw new Error(`[vdom] component ${o.type.name||"anonymous"} not built (missing _render) \u2014 buildVNode must run before renderValue`);let l=o._child!==void 0?o._child:o._render(o.props);if(l==null)return o._child=null,null;let u=(Array.isArray(l)||typeof l=="object"&&typeof l.type=="function",l);o._child=u,typeof u=="object"&&!Array.isArray(u)&&(u._parentVNode=o);let i=k(u,t,r);return i&&(o._refNode=i),i}let s=o.type,a=we.has(s)?r.createElementNS("http://www.w3.org/2000/svg",s):r.createElement(s);if(!a)return null;o.el=a;let d;for(let[l,u]of Object.entries(o.props??{}))if(!(l==="children"||l==="key")){if(l==="value"&&a instanceof HTMLSelectElement){d=u;continue}G(a,l,u)}if(!("innerHTML"in(o.props??{}))){let l=(Array.isArray(o.props?.children)?o.props.children:[o.props?.children]).flat(1/0);for(let u of l){let i=k(u,t,r);if(i!=null&&(a.appendChild(i),u&&typeof u=="object"&&!Array.isArray(u)&&typeof u.type=="function")){let c=u;c._parentNode||(c._parentNode=a,c._refNode=i)}}}return d!==void 0&&(a.value=String(d)),a}var Pn=0;function ve(){return{idRegistry:new Map,unmountHooks:[],nextId:()=>`_wf_${Pn++}`}}function be(e,t){return e.unmountHooks.push(t),()=>{let n=e.unmountHooks.indexOf(t);n>=0&&e.unmountHooks.splice(n,1)}}function ee(e,t){for(let n of[...e.unmountHooks])n(t);e.idRegistry.delete(t),e.idRegistry.delete(`custom:${t}`)}function kn(e,t,n,r){try{e(t)}catch(o){console.error(`[weifuwu] ref ${n} error in <${r??"anonymous"}>`,o)}}function N(e,t){if(e==null||typeof e!="object")return;let n=e;if(n._id){if(n._customId&&t.idRegistry.delete(n._customId),t.idRegistry.delete(n._id),t.unmountHooks.length>0){let r=[...t.unmountHooks];for(let o of r)o(n._id);if(n._customId)for(let o of r)o(n._customId)}n._id=void 0,n._customId=void 0,n._render=void 0,n._parentNode=void 0,n._refNode=void 0}if(n._child!=null){if(Array.isArray(n._child))for(let r of n._child)r&&typeof r=="object"&&N(r,t);else N(n._child,t);n._child=void 0}if(n.props?.children&&typeof n.type=="string"){let r=Array.isArray(n.props.children)?n.props.children:[n.props.children];for(let o of r)o&&typeof o=="object"&&N(o,t)}if(typeof n.props?.ref=="function"&&kn(n.props.ref,null,"cleanup"),n._remoteEl){let r=n._child;if(r!=null)if(Array.isArray(r))for(let o of r)o&&typeof o=="object"&&N(o,t);else typeof r=="object"&&N(r,t);n._remoteEl.remove(),n._remoteEl=void 0}}function te(e,t){if(t&&typeof e.type=="function"&&e._id){try{N(e,t)}catch(n){console.error("[weifuwu] ref cleanup error",n)}ee(t,e._id)}}function Ge(e){if(e==null||typeof e=="boolean")return[];let t=[],n=Array.isArray(e)?[...e]:[e];for(;n.length>0;){let r=n.shift();Array.isArray(r)?n.unshift(...r):t.push(r)}return t}function F(e){if(e==null||typeof e!="object"||Array.isArray(e))return;let t=e;return t._placement==="remote"?t.props?.portalKey:t.key}function O(e,t,n,r,o){if(typeof r=="string"||typeof r=="number"){if(typeof n=="string"||typeof n=="number"){if(String(n)!==String(r)){let c=e.ownerDocument.createTextNode(String(r));return t?.parentNode?t.parentNode.replaceChild(c,t):e.appendChild(c),c}return t}let i=e.ownerDocument.createTextNode(String(r));return t?.parentNode?t.parentNode.replaceChild(i,t):e.appendChild(i),i}if(r==null||typeof r=="boolean"){if(n&&typeof n=="object"&&!Array.isArray(n)&&n.type===H){let i=n._remoteEl;try{N(n.props?.children,o.registry)}catch(c){console.error("[weifuwu] portal ref cleanup error",c)}return i?.parentNode?.removeChild(i),null}if(n&&typeof n=="object"&&!Array.isArray(n))if(typeof n.type=="function")te(n,o.registry);else try{N(n,o.registry)}catch(i){console.error("[weifuwu] ref cleanup error",i)}return t?.parentNode&&t.parentNode.removeChild(t),null}if(Array.isArray(r)){let i=e.ownerDocument.createDocumentFragment(),c=ne(e,n,r,o,t?[t]:void 0);for(let y of c)y&&i.appendChild(y);return t?.parentNode?i.contains(t)?e.appendChild(i):t.parentNode.replaceChild(i,t):e.appendChild(i),i}let s=r;if(s.type===H){let i=n&&typeof n=="object"&&!Array.isArray(n)?n:null;if(i?.type===H){let c=i._remoteEl;if(c){let y=i.props?.children??null,w=s.props?.children??null;ne(c,y,w,o)}return s._remoteEl=i._remoteEl,null}return k(s,o,o.browser??P()),null}if(s.type===L){let c=(n&&typeof n=="object"&&!Array.isArray(n)?n:null)?._childNodes,y=ne(e,n,s.props?.children??null,o,c);return s._childNodes=y.filter(Boolean),t?.parentNode&&t.nodeType===8&&t.parentNode.removeChild(t),t&&t.nodeType===1?t:y[0]??null}if(typeof s.type=="function"){if(typeof s._render!="function")throw new Error(`[vdom] component ${s.type.name||"anonymous"} not built in diff \u2014 buildVNode must run before patchValue`);let i=n&&typeof n=="object"&&!Array.isArray(n)?n:null;i?.type===s.type&&i._id&&(s._id=i._id,o.registry.idRegistry.set(s._id,s)),s._parentNode=e,t&&(s._refNode=t);let c=i?.type===s.type,y=he(i?.props??{},s.props??{}),w=o.getCtxVersion?o.getCtxVersion(s._id??""):void 0,h=w===void 0||(o.ctxVersion??0)===w;if(i&&c&&y&&h&&i._child!==void 0)return s._child=i._child,t;let m;s._child!==void 0?m=s._child:(m=s._render(s.props),s._child=m);let p=O(e,t,i?._child,m,o);return p&&(s._refNode=p),p}let a=n&&typeof n=="object"&&!Array.isArray(n)?n:null,d=a?.type??null,l=s.type;if(t&&t.nodeType===1&&d===l){let i=t;return s.el=i,Nn(i,a?.props??{},s.props??{}),ne(i,a?.props?.children??null,s.props?.children??null,o),i}let u=k(s,o,o.browser??P());if(u==null)return null;if(t?.parentNode)if(n!=null&&typeof n!="boolean"){if(typeof n=="object"&&!Array.isArray(n))try{N(n,o.registry)}catch(i){console.error("[weifuwu] ref cleanup error",i)}t.parentNode.replaceChild(u,t)}else t.parentNode.insertBefore(u,t);else e.appendChild(u);return u}function Nn(e,t,n){let r=new Set([...Object.keys(t),...Object.keys(n)]);for(let o of r){if(o==="children"||o==="key")continue;let s=t[o],a=n[o];if(s!==a){if(o.startsWith("on")){typeof s=="function"&&e.removeEventListener(o.slice(2).toLowerCase(),s),a!=null&&a!==!1&&e.addEventListener(o.slice(2).toLowerCase(),a);continue}if(a==null||a===!1){if(o==="class"||o==="className")e.removeAttribute("class");else if(o.startsWith("on"))e.removeEventListener(o.slice(2).toLowerCase(),s);else if(o==="ref"){if(typeof s=="function")try{s(null)}catch(d){console.error("[weifuwu] ref cleanup error",d)}}else if(o==="value")e.value="";else if(o==="indeterminate")e.indeterminate=!1;else{e.removeAttribute(o);try{delete e[o]}catch{}}continue}G(e,o,a)}}}function ne(e,t,n,r,o){let s=Ge(t),a=Ge(n),d=o??Array.from(e.childNodes);if(a.some(m=>F(m)!==void 0)){for(let m=0;m<a.length;m++){let p=a[m];p&&typeof p=="object"&&!Array.isArray(p)&&F(p)===void 0&&(p.key=`pos:${m}`)}for(let m=0;m<s.length;m++){let p=s[m];p&&typeof p=="object"&&!Array.isArray(p)&&F(p)===void 0&&(p.key=`pos:${m}`)}}let u=s.map((m,p)=>{if(m==null||typeof m!="object"||Array.isArray(m))return d[p]??null;let f=m;return f._placement==="remote"?f._remoteEl??null:f.type===L?f._childNodes?.[0]??null:f._refNode??f.el??null});if(!a.some(m=>{if(m==null||typeof m!="object"||Array.isArray(m))return!1;let p=m;return p._placement!=="remote"&&p.key!==void 0})){let m=Math.max(s.length,a.length),p=[];for(let f=0;f<m;f++){let g=f<s.length?s[f]:null,v=f<a.length?a[f]:null;if(v==null||typeof v=="boolean"){if(g&&typeof g=="object"&&!Array.isArray(g))if(typeof g.type=="function")te(g,r.registry);else try{N(g,r.registry)}catch(x){console.error("[weifuwu] ref cleanup error",x)}let C=u[f];C?.parentNode&&C.parentNode.removeChild(C),p.push(null);continue}if(g==null||typeof g=="boolean"){let C=k(v,r,r.browser??P());if(C==null){p.push(null);continue}let x=null;for(let S=f+1;S<u.length;S++){let R=u[S];if(R&&R.parentNode===e){x=R;break}}x&&x.parentNode===e?e.insertBefore(C,x):e.appendChild(C),p.push(C);continue}let E=O(e,u[f],g,v,r);p.push(E)}return p}let c=new Map;s.forEach((m,p)=>{let f=F(m);f!==void 0&&m&&typeof m=="object"&&!Array.isArray(m)&&c.set(f,{vnode:m,nodes:[u[p]??null].filter(Boolean),index:p})});let y=[],w=new Set,h=null;return a.forEach((m,p)=>{let f=F(m),g=m;if(f!==void 0&&c.has(f)){let v=c.get(f),E=v.nodes[0]??null;w.add(f);let C=O(e,E,v.vnode,g,r);C&&C.parentNode===e&&h&&C.previousSibling!==h&&e.insertBefore(C,h.nextSibling),y.push(C),C&&(h=C)}else if(g?._placement==="remote"){let v=s[p]??null,E=O(e,u[p]??null,v,g,r);y.push(E),E&&(h=E)}else{let v=k(g,r,r.browser??P());y.push(v),v!=null&&(e.appendChild(v),h&&v.previousSibling!==h&&e.insertBefore(v,h.nextSibling),h=v)}}),s.forEach((m,p)=>{let f=F(m),g=m&&typeof m=="object"&&!Array.isArray(m)&&typeof m.type=="function";if(f!==void 0&&!w.has(f)){if(m&&typeof m=="object"&&!Array.isArray(m))if(g)te(m,r.registry);else try{N(m,r.registry)}catch(E){console.error("[weifuwu] ref cleanup error",E)}let v=u[p];v?.parentNode&&v.parentNode.removeChild(v)}else if(f===void 0){if(m&&typeof m=="object"&&!Array.isArray(m))if(g)te(m,r.registry);else try{N(m,r.registry)}catch(E){console.error("[weifuwu] ref cleanup error",E)}let v=u[p];v?.parentNode&&v.parentNode.removeChild(v)}}),y}function Ce(e){let t=Promise.resolve();async function n(s){let a=e.registry.idRegistry.get(s);if(!(!a||typeof a._render!="function"))try{let d={browser:e.ctx.browser,registry:e.registry,ctxVersion:e.getCtxVersion?.(s)??0,getCtxVersion:e.getCtxVersion},l=a._render(a.props),u=await _(l,e.ctx,a._child,e.registry)??null,i=a._child;a._child=u;let c=a._parentNode??a._refNode?.parentNode??e.rootEl??null;if(c){let y=O(c,a._refNode??null,i,u,d);y?a._refNode=y:a._refNode=null}}catch(d){e.onError?e.onError(d):console.error("[weifuwu] render error:",d?.stack??d)}}function r(s){let a=e.registry.idRegistry.get(s);if(!a||typeof a._render!="function")return Promise.resolve();let d=t.then(()=>n(s));return t=d.catch(()=>{}),d}function o(s){if(s==null){let a=e.ctx.ui?._selfId;return a?r(a):Promise.resolve()}return Promise.all(s.map(a=>r(a))).then(()=>{})}return{render:o}}var Ye=P();function Xe(e,t="bottom",n=6,r=!0){switch(t){case"bottom":return{top:e.bottom+n,left:r?e.left+e.width/2:e.left};case"top":return{top:e.top-n,left:r?e.left+e.width/2:e.left};case"left":return{top:r?e.top+e.height/2:e.top,left:e.left-n};case"right":return{top:r?e.top+e.height/2:e.top,left:e.right+n}}}function oe(e,t,n=8){if(!t)return e;let r=t.getBoundingClientRect();if(r.width===0&&r.height===0)return e;let o=Number.parseFloat(t.style.top)||r.top,s=Number.parseFloat(t.style.left)||r.left,a=e.top-o,d=e.left-s,l={top:r.top+a,bottom:r.bottom+a,left:r.left+d,right:r.right+d},u=Ye.viewportWidth(),i=Ye.viewportHeight(),c=e.top,y=e.left;return l.bottom>i-n&&(c=Math.max(n,c-(l.bottom-(i-n)))),l.top<n&&(c=Math.max(n,c+(n-l.top))),l.right>u-n&&(y=Math.max(n,y-(l.right-(u-n)))),l.left<n&&(y=Math.max(n,y+(n-l.left))),{top:c,left:y,width:e.width}}var B=P();function Je(e){let t=new Map,n=new Map,r=!1,o=0;function s(){o||(o=requestAnimationFrame(()=>{o=0;let i=[];for(let[c,y]of t){if(!y.isOpen())continue;let w=y.getEl();if(!w)continue;let h=w.getBoundingClientRect();if(h.width===0&&h.height===0)continue;let m=y.compute(h);Object.assign(y.pos,oe(m,y.panel?.(),y.margin)),i.push(c)}for(let[c,y]of n){let w=y.getScroller(),h=w instanceof Window?B.scrollingElement()?.scrollTop??B.scrollTop():w.scrollTop??0;h!==y.handle.y&&(y.handle.y=h,i.push(c))}i.length>0&&e(i)}))}function a(){r||(r=!0,B.addEventListener("scroll",s,{capture:!0,passive:!0}),B.addEventListener("resize",s))}function d(){r&&(B.removeEventListener("scroll",s,{capture:!0}),B.removeEventListener("resize",s),r=!1)}function l(i){for(let c of[...t.keys()])(c.startsWith(`popup:${i}:`)||c===`popup:${i}`||c===i)&&t.delete(c);n.delete(i)}function u(){d(),o&&(cancelAnimationFrame(o),o=0),t.clear(),n.clear()}return{popupTrackers:t,scrollTrackers:n,schedulePopupRecompute:s,ensurePopupListeners:a,destroyPopupListeners:d,cleanupTrackers:l,destroy:u}}function Ee(e,t,n){return o=>{o?t(o):n?.()}}function Y(e){return typeof window<"u"&&!!window.matchMedia?.("(hover: hover)").matches}function re(e){return typeof window<"u"&&!!window.matchMedia?.("(prefers-reduced-motion: reduce)").matches}function xe(e,t,n){let r=null,o=()=>{t(),n?.once&&r&&r.removeEventListener("animationend",o)};return a=>{a?(r=a,a.addEventListener("animationend",o)):r&&(r.removeEventListener("animationend",o),r=null)}}function Te(e,t){let{onLongPress:n,duration:r=500}=t,o,s=0,a=0,d=null,l=()=>{clearTimeout(o),o=void 0},u=e.selfId();if(u){let i=e.onUnmount(c=>{c===u&&(l(),i())})}return{onPointerDown:i=>{s=i.clientX??0,a=i.clientY??0,d=i,l(),o=setTimeout(()=>{o=void 0,d&&n(d)},r)},onPointerUp:l,onPointerLeave:l,onPointerMove:i=>{let c=Math.abs((i.clientX??0)-s),y=Math.abs((i.clientY??0)-a);(c>10||y>10)&&l()},onContextMenu:i=>{i.preventDefault(),n(i)}}}function X(e,t){let n=e.selfId(),r="closed",o,s=()=>{r="closed",n?e.render([n]):e.render()};return{get phase(){return r},ref:d=>{d?o||(o=()=>{r==="exit"&&s()},d.addEventListener("animationend",o)):o=void 0},sync:d=>(d?r="open":r==="open"&&(r="exit"),r)}}function Pe(e,t,n){let r=e.selfId(),o=re(e),s=n?.duration??400,a=n?.ease==="linear"?y=>y:y=>1-Math.pow(1-y,3),d,l=t,u={value:o?t:0,reset:()=>{}},i=()=>{r?e.render([r]):e.render()},c=y=>{if(l=y,o){u.value=y,i();return}if(y===u.value)return;d&&cancelAnimationFrame(d);let w=u.value,h=performance.now(),m=p=>{let f=Math.min(1,(p-h)/s);u.value=Math.round(w+(y-w)*a(f)),f<1?(d=requestAnimationFrame(m),i()):(d=void 0,i())};d=requestAnimationFrame(m)};if(u.reset=y=>{y===l&&d||c(y)},r){let y=e.onUnmount(w=>{w===r&&(d&&(cancelAnimationFrame(d),d=void 0),y())})}return queueMicrotask(()=>c(t)),u}function ke(e,t,n){let r=e.selfId(),o=e.browser,s=`media:${r}:${t}`;if(!e.mediaRegistry.has(s)){let a=o.matchMedia(t);n(a.matches);let d=u=>n(u.matches);a.addEventListener("change",d),e.mediaRegistry.set(s,{mql:a,handler:d});let l=e.onUnmount(u=>{if(u!==r)return;let i=e.mediaRegistry.get(s);if(i?.mql&&i.handler)try{i.mql.removeEventListener("change",i.handler)}catch{}e.mediaRegistry.delete(s),l()})}}function Ne(e,t,n){let r=e.browser,o=typeof t=="function"?{mobile:"(max-width: 639px)",tablet:"(min-width: 640px) and (max-width: 1023px)",desktop:"(min-width: 1024px)"}:t,s=typeof t=="function"?t:n,a=e.selfId(),d=`bp:${a}`;function l(){for(let[u,i]of Object.entries(o))if(r.matchMedia(i).matches)return u;return Object.keys(o)[0]??""}if(!e.mediaRegistry.has(d)){s(l());let u=[];for(let c of Object.values(o)){let y=r.matchMedia(c),w=()=>s(l());y.addEventListener("change",w),u.push({mql:y,handler:w})}e.mediaRegistry.set(d,{mqls:u});let i=e.onUnmount(c=>{if(c!==a)return;let y=e.mediaRegistry.get(d);if(y?.mqls)for(let w of y.mqls)try{w.mql.removeEventListener("change",w.handler)}catch{}e.mediaRegistry.delete(d),i()})}}function Ve(e){let t=e.selfId(),n=e.browser,r={height:n.viewportHeight(),offsetTop:0,keyboardOpen:!1},o=()=>{t?e.render([t]):e.render()},s=()=>{let d=n.visualViewport();r.height=d?.height??n.viewportHeight(),r.offsetTop=d?.offsetTop??0,r.keyboardOpen=r.height<n.viewportHeight()*.9,o()},a=n.visualViewport();if(a?.addEventListener?(a.addEventListener("resize",s),a.addEventListener("scroll",s)):n.addEventListener("resize",s),t){let d=e.onUnmount(l=>{l===t&&(a?.removeEventListener?(a.removeEventListener("resize",s),a.removeEventListener("scroll",s)):n.removeEventListener("resize",s),d())})}return r}function _e(e,t){let n=e.selfId(),r={isIn:!1,ready:!1,observe:l,refresh:u,disconnect:i},o=null,s=null,a=()=>{n?e.render([n]):e.render()};function d(){if(s?.disconnect(),s=null,!o)return;let c=typeof t.rootMargin=="function"?t.rootMargin():t.rootMargin,y=typeof t.threshold=="function"?t.threshold():t.threshold;s=new IntersectionObserver(w=>{let h=w[w.length-1];if(!h)return;let m=h.isIntersecting,p=m!==r.isIn,f=!r.ready;r.isIn=m,r.ready=!0,t.onChange?.(h,m),(p||f)&&a()},{root:t.root?t.root():null,rootMargin:c??"0px",threshold:y??0}),s.observe(o)}function l(c){o=c,c?d():(s?.disconnect(),s=null,r.isIn=!1)}function u(){d()}function i(){s?.disconnect(),s=null}if(n){let c=e.onUnmount(y=>{y===n&&(i(),c())})}return r}function Se(e,t){let n=e.selfId(),r=e.browser,o={y:0,refresh(){let d=s.getScroller();o.y=d instanceof Window?r.scrollingElement()?.scrollTop??r.scrollTop():d.scrollTop??0}},s={handle:o,getScroller:t.getScroller??(()=>window)};if(!n)return o.refresh(),o;e.scrollTrackers.set(n,s),e.ensurePopupListeners(),o.refresh();let a=e.onUnmount(d=>{d===n&&(e.scrollTrackers.delete(n),a())});return o}function se(e,t){let n=e.selfId(),r=t.value!==void 0;if(r&&!t.onChange&&t.name&&(e.warned.has(t.name)||(e.warned.add(t.name),console.warn(`[weifuwu/${t.name}] \u53D7\u63A7\u6A21\u5F0F\uFF08value \u5DF2\u4F20\uFF09\u4F46\u672A\u63D0\u4F9B onChange\uFF0C\u4EA4\u4E92\u65E0\u6CD5\u751F\u6548\u3002
|
|
2
|
+
\u975E\u53D7\u63A7\uFF1A\u53BB\u6389 value\uFF1B\u53D7\u63A7\uFF1A\u4F20\u5165 onChange={(v) => setValue(v)}`))),!r&&n&&!e.uncontrolledValues.has(n)){e.uncontrolledValues.set(n,t.value);let s=e.onUnmount(a=>{a===n&&(e.uncontrolledValues.delete(n),s())})}let o=s=>{if(r){t.onChange?.(s);return}n&&e.uncontrolledValues.set(n,s),n?e.render([n]):e.render()};return{value:r?t.value:n?e.uncontrolledValues.get(n):t.value,setValue:o,controlled:r}}function Re(e,t){let n=e.selfId(),r=se(e,{value:t.value,onChange:t.onChange,name:t.name});if(n&&!e.inputStates.has(n)){e.inputStates.set(n,{keyword:"",selectedLabel:""});let a=e.onUnmount(d=>{d===n&&(e.inputStates.delete(n),a())})}let o=n?e.inputStates.get(n):{keyword:"",selectedLabel:""},s=()=>{n?e.render([n]):e.render()};return{...r,get keyword(){return o.keyword},setKeyword(a){o.keyword=a,s()},get selectedLabel(){return o.selectedLabel},setSelectedLabel(a){o.selectedLabel=a,s()}}}function Me(e,t){let n=e.selfId(),r=!1;if(n){let l=e.onUnmount(u=>{u===n&&(r=!0,l())})}let o=()=>{r||(n?e.render([n]):e.render())},s={data:void 0,loading:!1,error:void 0},a=0,d=()=>{let l=++a;s.loading=!0,s.error=null,o(),Promise.resolve().then(()=>t()).then(u=>{a===l&&(s.data=u,s.loading=!1,o())}).catch(u=>{a===l&&(s.error=u,s.loading=!1,o())})};return d(),s.reload=d,s}function Ae(e,t){let n=e.selfId(),r=e.browser;if(typeof window>"u")return()=>{};if(r.addEventListener("keydown",t),n){let o=e.onUnmount(s=>{s===n&&(r.removeEventListener("keydown",t),o())})}return()=>r.removeEventListener("keydown",t)}function Le(e,t){let n=e.browser,r=0,o=0,s=!1,a=i=>{s&&t.onMove(i,{x:i.clientX-r,y:i.clientY-o})},d=i=>{s&&(s=!1,n.removeEventListener("pointermove",a),n.removeEventListener("pointerup",d),t.onEnd?.(i))},l=i=>{s||(i.preventDefault(),s=!0,r=i.clientX,o=i.clientY,n.addEventListener("pointermove",a),n.addEventListener("pointerup",d),t.onStart?.(i))},u=e.selfId();if(u){let i=e.onUnmount(c=>{c===u&&(s&&(n.removeEventListener("pointermove",a),n.removeEventListener("pointerup",d),s=!1),i())})}return{onPointerDown:l}}function He(e,t){let n={};t.onDrop&&(n.onDrop=o=>{o.preventDefault(),t.onDrop(o)}),t.onDragOver&&(n.onDragOver=o=>{o.preventDefault(),t.onDragOver(o)}),t.onDragLeave&&(n.onDragLeave=o=>t.onDragLeave(o));let r={draggable:!0};if(t.onDragStart){let o=t.onDragStart;r.onDragStart=s=>{typeof document<"u"&&document.body.classList.add("wf-dragging"),o(s)}}if(t.onDragEnd){let o=t.onDragEnd;r.onDragEnd=s=>{typeof document<"u"&&document.body.classList.remove("wf-dragging"),o(s)}}return{dropProps:n,dragProps:r}}var ie=P(),J=0,Qe="",Ze="",en="",nn="",ae=0;function tn(){return typeof window<"u"&&typeof document<"u"}function on(){if(J++,J>1||!tn())return;ae=ie.scrollTop();let e=ie.bodyElement();Qe=e.style.overflow,Ze=e.style.position,en=e.style.top,nn=e.style.width,e.style.overflow="hidden",(/iPhone|iPad|iPod/.test(navigator.platform)||/Mac/.test(navigator.platform)&&"ontouchend"in document)&&(e.style.position="fixed",e.style.top=`-${ae}px`,e.style.width="100%")}function rn(){if(J===0||(J--,J>0)||!tn())return;let e=ie.bodyElement();e.style.overflow=Qe,e.style.position=Ze,e.style.top=en,e.style.width=nn,ae>0&&ie.scrollTo(ae)}var Vn='a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])',Ie=P();function Oe(e){let t=e.querySelectorAll(Vn);if(t.length===0)return()=>{};let n=t[0],r=t[t.length-1],o=a=>{a.key==="Tab"&&(a.shiftKey&&Ie.activeElement()===n?(a.preventDefault(),r.focus()):!a.shiftKey&&Ie.activeElement()===r&&(a.preventDefault(),n.focus()))},s=Ie.activeElement();return queueMicrotask(()=>{n.focus()}),e.addEventListener("keydown",o),()=>{e.removeEventListener("keydown",o),s?.focus()}}function le(e,t){let n=e.selfId(),r={top:0,left:0,refresh:()=>{}};if(!n)return r;let o={pos:r,getEl:t.el,isOpen:t.isOpen,compute:t.compute,panel:t.panel,margin:t.margin??8};e.popupTrackers.set(n,o),e.ensurePopupListeners();let s=e.onUnmount(a=>{a===n&&(e.popupTrackers.delete(n),s())});return r.refresh=()=>{let a=o.getEl();if(!a)return;let d=a.getBoundingClientRect();if(d.width===0&&d.height===0)return;let l=o.compute(d);Object.assign(r,oe(l,o.panel?.(),o.margin))},r}function Ue(e,t){let n=e.selfId(),r=e.browser,o=Y(e),s=()=>typeof t.trigger=="function"?t.trigger():t.trigger,a=t.open!==void 0,d=()=>!!t.disabled?.(),l=()=>a?typeof t.open=="function"?!!t.open():!!t.open:t.isOpen(),u=b=>{d()||(a?t.onOpenChange?.(b):t.setOpen(b))},i=()=>{let b=t.placement;return typeof b=="function"?b():b??"bottom"},c=null,y=!1,w=le(e,{el:t.el,isOpen:()=>l(),compute:b=>{if(t.position){let T=t.position();return{top:T.y,left:T.x}}return Xe(b,i(),t.gap??6,t.center!==!1)},panel:()=>c,margin:t.margin??8}),h=b=>{if(t.closeOnOutside===!1||t.mask||!l())return;let T=b.target;if(!(T instanceof Node))return;let I=t.el();I&&I.contains(T)||c&&c.contains(T)||u(!1)},m=b=>{t.closeOnEscape!==!1&&(b.key!=="Escape"||!l()||u(!1))};if(r.addEventListener("mousedown",h),r.addEventListener("keydown",m),n){let b=e.onUnmount(T=>{T===n&&(r.removeEventListener("mousedown",h),r.removeEventListener("keydown",m),b())})}let p={},f=b=>typeof b=="function"?b():b??0,g=()=>f(t.openDelay),v=()=>f(t.closeDelay),E,C,x=()=>{clearTimeout(E),clearTimeout(C),E=void 0,C=void 0},S=b=>{if(d())return;let T=b.currentTarget,I=b.relatedTarget;T.contains(I)||(clearTimeout(C),C=void 0,E=setTimeout(()=>{E=void 0,u(!0)},g()))},R=b=>{if(d())return;let T=b.currentTarget,I=b.relatedTarget;T.contains(I)||(clearTimeout(E),E=void 0,C=setTimeout(()=>{C=void 0,u(!1)},v()))},j=()=>{d()||(clearTimeout(C),C=void 0,E=setTimeout(()=>{E=void 0,u(!0)},g()))},U=()=>{d()||(clearTimeout(E),E=void 0,C=setTimeout(()=>{C=void 0,u(!1)},v()))},A=()=>s()==="hover";if(p.onMouseOver=b=>{A()&&S(b)},p.onMouseOut=b=>{A()&&R(b)},p.onClick=()=>{A()?o||u(!l()):s()==="click"&&u(!0)},p.onFocus=()=>{A()&&j()},p.onBlur=()=>{A()&&U()},s()==="longpress"){let b,T=0,I=0,D=()=>{clearTimeout(b),b=void 0};p.onPointerDown=V=>{d()||(T=V.clientX??0,I=V.clientY??0,D(),b=setTimeout(()=>{b=void 0,t.onTrigger?.({clientX:T,clientY:I}),u(!0)},t.longPressDuration??500))},p.onPointerUp=D,p.onPointerLeave=D,p.onPointerMove=V=>{let fe=Math.abs((V.clientX??0)-T),pe=Math.abs((V.clientY??0)-I);(fe>10||pe>10)&&D()},p.onContextMenu=V=>{V.preventDefault(),t.onTrigger?.({clientX:V.clientX??0,clientY:V.clientY??0}),u(!0)}}if(p.onKeyDown=b=>{b.key==="Escape"&&t.closeOnEscape!==!1&&u(!1)},n){let b=e.onUnmount(T=>{T===n&&(x(),b())})}let M=b=>{if(b){c=b;let T=()=>w.refresh();b.addEventListener("animationend",T,{once:!0})}else c=null},z=null,ce=null,Be=b=>{M(b),ce&&ce(b)};return{get open(){return l()},setOpen:u,wrapProps:p,portal:(b,T="popover")=>{if(d())return null;if(!l())return y=!1,z=null,null;let D=t.el();(!y||D!==z)&&(D?w.refresh():queueMicrotask(()=>{l()&&w.refresh()}),y=!0,z=D);let V=b.props??{};ce=V.ref??null;let fe=["wf-popup",V.class].filter(Boolean).join(" "),pe={...V.style??{},position:"fixed",top:`${w.top}px`,left:`${w.left}px`,maxWidth:t.width!==void 0?`min(${t.width}px, calc(100vw - 32px))`:"calc(100vw - 32px)"},q={...b,props:{...V,class:fe,style:pe,ref:Be}};if(t.mask){let dn=W("div",{class:"wf-popup-mask","data-portal-mask":T,onClick:t.maskClosable===!1?void 0:()=>u(!1)}),cn=t.maskCentered?W("div",{class:"wf-cover",style:{"--wf-z":"var(--wf-z-popover)",pointerEvents:"none"}},{...q,props:{...q.props,style:{...V.style??{},pointerEvents:"auto"},ref:Be}}):null,fn=t.maskCentered?void 0:{...q.props?.style??{},zIndex:"var(--wf-z-popover)"},pn=t.maskCentered?cn:{...q,props:{...q.props,style:fn}};return Z([dn,pn],T)}return Z(q,T)},refresh:()=>w.refresh()}}function De(e,t){let n=e.selfId();if(n&&!e.openStates.has(n)){e.openStates.set(n,!1);let d=e.onUnmount(l=>{l===n&&(e.openStates.delete(n),d())})}let r=t.open!==void 0;r&&!t.onOpenChange&&t.name&&!e.warned.has(t.name)&&(e.warned.add(t.name),console.warn(`[weifuwu/${t.name}] \u53D7\u63A7\u6A21\u5F0F\uFF08open \u5DF2\u4F20\uFF09\u4F46\u672A\u63D0\u4F9B onOpenChange\uFF0C\u4EA4\u4E92\u65E0\u6CD5\u751F\u6548\u3002
|
|
3
|
+
\u975E\u53D7\u63A7\uFF1A\u53BB\u6389 open\uFF1B\u53D7\u63A7\uFF1A\u4F20\u5165 onOpenChange={(o) => setOpen(o)}`));let o=()=>r?!!t.open:n?e.openStates.get(n)??!1:!1,s=()=>{n?e.render([n]):e.render()},a=d=>{if(r){t.onOpenChange?.(d);return}n&&e.openStates.set(n,d),s()};return{get open(){return o()},setOpen:a,triggerProps:{onClick:()=>a(!0),onFocus:()=>{t.openOnFocus&&a(!0)}}}}function We(e,t){let n=e.selfId(),r,o=null,s=X(e,t);return{get phase(){return s.phase},rootRef:l=>{l?(on(),o&&(r=Oe(o)),s.ref(l)):(rn(),r?.(),s.ref(null))},panelRef:l=>{o=l,l&&!r&&(r=Oe(l))},sync:l=>s.sync(l)}}function _n(e){return e.map(t=>{let n={role:t.role,content:t.content};return t.reasoning&&(n.reasoning_content=t.reasoning),n})}function je(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`msg-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function sn(e,t,n,r){n.initialMessages?e.messages=structuredClone(n.initialMessages):e.messages===void 0&&(e.messages=[]),e.input===void 0&&(e.input=""),e.streaming===void 0&&(e.streaming=!1),e.error===void 0&&(e.error=null),e.usage===void 0&&(e.usage=null),e.step===void 0&&(e.step=null);let o=null;function s(){if(!e.streaming)return;let h=e.messages[e.messages.length-1];return h&&h.role==="assistant"&&h.status==="streaming"?h:void 0}function a(h,m,p){let f=s();switch(h){case"wf:token":f&&(f.content+=m.text);break;case"wf:tool_call":{f&&(f.toolCalls||(f.toolCalls=[]),f.toolCalls.push({call:m,status:"running"}));break}case"wf:tool_progress":{let g=m,v=f?.toolCalls?.find(E=>E.call.id===g.toolCallId);v&&(v.progress=g);break}case"wf:tool_result":{let g=m,v=f?.toolCalls?.find(E=>E.call.id===g.id);v&&(v.result=g,v.status=g.ok?"ok":"error");break}case"wf:approval_request":f&&(f.approval=m);break;case"wf:usage":f&&(f.usage=m);break;case"wf:step":e.step=m;break;case"wf:done":if(f){f.status="done",f.approval=void 0;let g=m;g.reasoning&&(f.reasoning=g.reasoning)}e.streaming=!1,e.step=null;break;case"wf:error":f&&(f.status="error",f.error=m,f.approval=void 0),e.error=m,e.streaming=!1,e.step=null;break;default:p?.(h,m);break}r?.()}function d(){let h=n.body?n.body(e.messages):{messages:_n(e.messages)};o=t(n.url,h,{onToken:p=>a("wf:token",{text:p}),onToolCall:p=>a("wf:tool_call",p),onToolProgress:p=>a("wf:tool_progress",p),onToolResult:p=>a("wf:tool_result",p),onApproval:p=>a("wf:approval_request",p),onUsage:p=>a("wf:usage",p),onStep:p=>a("wf:step",p),onDone:p=>a("wf:done",p),onError:p=>a("wf:error",p),onEvent:(p,f)=>a(p,f,n.onEvent)},{signal:n.signal,headers:n.headers}),e.streaming=!0;let m=s();m&&o?.traceId&&(m.id=o.traceId)}function l(){if(e.streaming)return;let h=String(e.input??"").trim();h&&(e.input="",e.error=null,e.usage=null,e.step=null,e.messages.push({id:je(),role:"user",content:h,status:"done"},{id:je(),role:"assistant",content:"",status:"streaming",toolCalls:[]}),d(),r?.())}function u(){o?.abort(),e.streaming=!1,e.step=null;let h=e.messages[e.messages.length-1];h&&h.role==="assistant"&&h.status==="streaming"&&(!h.content&&(!h.toolCalls||h.toolCalls.length===0)?e.messages.pop():h.status="done"),r?.()}function i(){if(e.streaming)return;let h=-1;for(let m=e.messages.length-1;m>=0;m--)if(e.messages[m].role==="user"){h=m;break}h!==-1&&(e.messages.splice(h+1),e.error=null,e.usage=null,e.step=null,e.messages.push({id:je(),role:"assistant",content:"",status:"streaming",toolCalls:[]}),d(),r?.())}function c(){o?.abort(),e.messages=[],e.input="",e.streaming=!1,e.error=null,e.usage=null,e.step=null,r?.()}async function y(h,m,p){let f=e.messages[e.messages.length-1],g=f?.role==="assistant"?f.approval:void 0;if(g&&(f.approval=void 0,r?.(),!!n.approveUrl))try{await fetch(n.approveUrl,{method:"POST",headers:{"Content-Type":"application/json",...n.headers},body:JSON.stringify(p?{id:g.id,decision:h,note:m,modifiedArgs:p}:{id:g.id,decision:h,note:m}),signal:n.signal})}catch(v){if(n.signal?.aborted)return;e.error={code:"provider_error",message:v instanceof Error?v.message:String(v)},r?.()}}function w(){o?.abort(),o=null}return{send:l,stop:u,retry:i,clear:c,approve:y,dispose:w}}function an(e,t,n){let r=new AbortController,o=n?.signal;o&&(o.aborted?r.abort():o.addEventListener("abort",()=>r.abort(),{once:!0}));let s=n?.traceId??Ln(),a=n?.record!==!1,d=[],l=(async()=>{let u;try{u=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json","X-Trace-Id":s,Accept:"text/event-stream",...n?.headers},body:JSON.stringify(t),signal:r.signal})}catch(i){if(r.signal.aborted)return;n?.onError?.({code:"provider_error",message:i instanceof Error?i.message:String(i)});return}if(!u.ok){n?.onError?.({code:An(u.status),message:`HTTP ${u.status} ${u.statusText}`});return}try{for await(let{name:i,data:c}of Rn(u.body)){if(r.signal.aborted)return;Mn(d,{name:i,data:c},a),Sn(i,c,n??{})}}catch(i){if(r.signal.aborted)return;n?.onError?.({code:"provider_error",message:i instanceof Error?i.message:String(i)})}})();return{abort:()=>r.abort(),done:l,traceId:s,events:d}}function Sn(e,t,n){switch(e){case"wf:token":return n.onToken?.(t.text);case"wf:tool_call":return n.onToolCall?.(t);case"wf:tool_result":return n.onToolResult?.(t);case"wf:tool_progress":return n.onToolProgress?.(t);case"wf:step":return n.onStep?.(t);case"wf:approval_request":return n.onApproval?.(t);case"wf:usage":return n.onUsage?.(t);case"wf:done":return n.onDone?.(t);case"wf:error":return n.onError?.(t);default:return n.onEvent?.(e,t)}}async function*Rn(e){let t=e.getReader(),n=new TextDecoder,r="";try{for(;;){let{done:o,value:s}=await t.read();if(o)break;r+=n.decode(s,{stream:!0});let a=r.split(`
|
|
2
4
|
|
|
3
|
-
`);
|
|
4
|
-
`))d.startsWith("event: ")?u=d.slice(7):d.startsWith("data: ")&&(a+=d.slice(6));if(a)try{yield{name:u,data:JSON.parse(a)}}catch{}}}}finally{n.releaseLock()}}function An(e,n,t){t&&(e.length>=1e3&&e.shift(),e.push(n))}function Un(e){return e===401||e===403?"auth_failed":e===429?"rate_limited":e>=500?"provider_error":"invalid_request"}function Hn(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`trace-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function On(e){return e.map(n=>({role:n.role,content:n.content}))}function He(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`msg-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function dn(e,n,t){t.initialMessages?e.messages=structuredClone(t.initialMessages):e.messages===void 0&&(e.messages=[]),e.input===void 0&&(e.input=""),e.streaming===void 0&&(e.streaming=!1),e.error===void 0&&(e.error=null),e.usage===void 0&&(e.usage=null),e.step===void 0&&(e.step=null);let o=null;function r(){if(!e.streaming)return;let C=e.messages[e.messages.length-1];return C&&C.role==="assistant"&&C.status==="streaming"?C:void 0}function c(C,h,g){let v=r();switch(C){case"wf:token":v&&(v.content+=h.text);break;case"wf:tool_call":{v&&(v.toolCalls||(v.toolCalls=[]),v.toolCalls.push({call:h,status:"running"}));break}case"wf:tool_progress":{let x=h,S=v?.toolCalls?.find(l=>l.call.id===x.toolCallId);S&&(S.progress=x);break}case"wf:tool_result":{let x=h,S=v?.toolCalls?.find(l=>l.call.id===x.id);S&&(S.result=x,S.status=x.ok?"ok":"error");break}case"wf:approval_request":v&&(v.approval=h);break;case"wf:usage":v&&(v.usage=h);break;case"wf:step":e.step=h;break;case"wf:done":v&&(v.status="done",v.approval=void 0),e.streaming=!1,e.step=null;break;case"wf:error":v&&(v.status="error",v.error=h,v.approval=void 0),e.error=h,e.streaming=!1,e.step=null;break;default:g?.(C,h);break}}function i(){let C=t.body?t.body(e.messages):{messages:On(e.messages)};o=n(t.url,C,{onToken:g=>c("wf:token",{text:g}),onToolCall:g=>c("wf:tool_call",g),onToolProgress:g=>c("wf:tool_progress",g),onToolResult:g=>c("wf:tool_result",g),onApproval:g=>c("wf:approval_request",g),onUsage:g=>c("wf:usage",g),onStep:g=>c("wf:step",g),onDone:g=>c("wf:done",g),onError:g=>c("wf:error",g),onEvent:(g,v)=>c(g,v,t.onEvent)},{signal:t.signal,headers:t.headers}),e.streaming=!0;let h=r();h&&o?.traceId&&(h.id=o.traceId)}function s(){if(e.streaming)return;let C=String(e.input??"").trim();C&&(e.input="",e.error=null,e.usage=null,e.step=null,e.messages.push({id:He(),role:"user",content:C,status:"done"},{id:He(),role:"assistant",content:"",status:"streaming",toolCalls:[]}),i())}function u(){o?.abort(),e.streaming=!1,e.step=null;let C=e.messages[e.messages.length-1];C&&C.role==="assistant"&&C.status==="streaming"&&(!C.content&&(!C.toolCalls||C.toolCalls.length===0)?e.messages.pop():C.status="done")}function a(){if(e.streaming)return;let C=-1;for(let h=e.messages.length-1;h>=0;h--)if(e.messages[h].role==="user"){C=h;break}C!==-1&&(e.messages.splice(C+1),e.error=null,e.usage=null,e.step=null,e.messages.push({id:He(),role:"assistant",content:"",status:"streaming",toolCalls:[]}),i())}function d(){o?.abort(),e.messages=[],e.input="",e.streaming=!1,e.error=null,e.usage=null,e.step=null}async function m(C,h){let g=e.messages[e.messages.length-1],v=g?.role==="assistant"?g.approval:void 0;if(v&&(g.approval=void 0,!!t.approveUrl))try{await fetch(t.approveUrl,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify({id:v.id,decision:C,note:h}),signal:t.signal})}catch(x){if(t.signal?.aborted)return;e.error={code:"provider_error",message:x instanceof Error?x.message:String(x)}}}function w(){o?.abort(),o=null}return{send:s,stop:u,retry:a,clear:d,approve:m,dispose:w}}var G=Symbol("Fragment"),B=Symbol("Portal"),Ce=(e,n)=>{let t=n._suspense;return()=>t?.fallback??null},Oe=(e,n)=>t=>t.children;function De(e,n,t){return{type:e,props:cn(n),key:t??void 0}}var Dn=De;function Wn(e,n,t){return De(e,n,t)}function Te(e,n,...t){let o=cn(n??{});return t.length>0&&(o.children=t.length===1?t[0]:t),{type:e,props:o,key:n?.key??void 0}}function cn(e){if(!e)return{};let n={};for(let t of Object.keys(e))t!=="key"&&(n[t]=e[t]);return n}function We(e,n){return{type:B,props:{children:e,portalKey:n},key:n??void 0,_placement:"remote"}}var Ee=new Set,ae=new Map,xe=new Map,ue=new Map;function fn(e){let{ctx:n,renderByIds:t,getSelfId:o,dirtyBatch:r,dirtySet:c,mediaRegistry:i,popupTrackers:s,scrollTrackers:u,schedulePopupRecompute:a,ensurePopupListeners:d,isRendering:m,isMounting:w,setMounting:C,endMounting:h}=e,g=n.browser??W(),v=e.registry??j(n),x=l=>ye(v,l);return{_selfId:"_wf_root",_ctxVersion:0,_dirtySet:c,setMounting:C,endMounting:h,bumpCtxVersion:function(){this._ctxVersion++},render:function(l){if(m()){if(w())return;this._pendingRender||(this._pendingRender=!0,queueMicrotask(()=>{this._pendingRender=!1,this.render(l)}));return}if(!l||l.length===0){let f=o(this);if(f)l=[f];else return}t(l)},dirty:function(l){let f=this._selfId??"",p=this._debugDirty=(this._debugDirty??0)+1;if(D("dirty","self="+String(f).slice(0,20)+" ids="+JSON.stringify(l)+" n="+p+" mounting="+w()+" rendering="+m(),{throttle:200}),p<=3&&q()&&console.trace("[ui-debug]","dirty-trace",String(f).slice(0,20)),!w()){if(m()){this._pendingDirty||(this._pendingDirty=!0,queueMicrotask(()=>{this._pendingDirty=!1,this.dirty(l)}));return}if(!l||l.length===0){let y=o(this);if(y)l=[y];else return}for(let y of l)y&&(r.add(y),c.add(y));this._dirtyScheduled||(this._dirtyScheduled=!0,queueMicrotask(()=>{this._dirtyScheduled=!1;let y=[...r];r.clear(),y.length>0&&t(y)}))}},$:function(){let l=this;if(!Object.prototype.hasOwnProperty.call(l,"_$cache")){let f=Q(()=>{let p=l._selfVNode?._id??o(l);p&&n.ui.dirty([p])});l._$cache=f}return l._$cache},useChat:function(l){let f=this.$(),p=dn(f,un,l);Object.assign(f,{send:p.send,stop:p.stop,retry:p.retry,clear:p.clear,approve:p.approve,dispose:p.dispose});let y=o(this);if(y){let b=x(T=>{T===y&&(p.dispose(),b())})}return f},useMedia:function(l,f){let y=`media:${o(this)}:${l}`;if(!i.has(y)){let b=g.matchMedia(l);f(b.matches);let T=_=>f(_.matches);b.addEventListener("change",T),i.set(y,{mql:b,handler:T})}},useBreakpoint:function(l,f){let p=typeof l=="function"?{mobile:"(max-width: 639px)",tablet:"(min-width: 640px) and (max-width: 1023px)",desktop:"(min-width: 1024px)"}:l,y=typeof l=="function"?l:f,T=`bp:${o(this)}`;function _(){for(let[P,M]of Object.entries(p))if(g.matchMedia(M).matches)return P;return Object.keys(p)[0]??""}if(!i.has(T)){y(_());let P=[];for(let M of Object.values(p)){let H=g.matchMedia(M),U=()=>y(_());H.addEventListener("change",U),P.push({mql:H,handler:U})}i.set(T,{mqls:P})}},usePopupPosition:function(l){let f=o(this),p={top:0,left:0,refresh:()=>{}};if(!f)return p;let y={pos:p,getEl:l.el,isOpen:l.isOpen,compute:l.compute,panel:l.panel,margin:l.margin??8};return s.set(f,y),d(),p.refresh=()=>{let b=y.getEl();if(!b)return;let T=b.getBoundingClientRect();if(T.width===0&&T.height===0)return;let _=y.compute(T);Object.assign(p,ge(_,y.panel?.(),y.margin))},p},useHoverCapable:function(){return typeof window<"u"&&!!window.matchMedia?.("(hover: hover)").matches},useStableRef:function(l,f){return y=>{y?l(y):f?.()}},useVisualViewport:function(){let l=o(this),f={height:g.viewportHeight(),offsetTop:0,keyboardOpen:!1},p=()=>{n.ui&&n.ui.dirty(l?[l]:void 0)},y=()=>{let T=g.visualViewport();f.height=T?.height??g.viewportHeight(),f.offsetTop=T?.offsetTop??0,f.keyboardOpen=f.height<g.viewportHeight()*.9,p()},b=g.visualViewport();if(b?.addEventListener?(b.addEventListener("resize",y),b.addEventListener("scroll",y)):g.addEventListener("resize",y),l){let T=x(_=>{_===l&&(b?.removeEventListener?(b.removeEventListener("resize",y),b.removeEventListener("scroll",y)):g.removeEventListener("resize",y),T())})}return f},usePopup:function(l){let f=o(this),p=this.useHoverCapable(),y=()=>typeof l.trigger=="function"?l.trigger():l.trigger,b=l.open!==void 0,T=()=>!!l.disabled?.(),_=()=>b?typeof l.open=="function"?!!l.open():!!l.open:l.isOpen(),P=N=>{T()||(b?l.onOpenChange?.(N):l.setOpen(N))},M=()=>{let N=l.placement;return typeof N=="function"?N():N??"bottom"},H=null,U=!1,L=n.ui.usePopupPosition({el:l.el,isOpen:()=>_(),compute:N=>{if(l.position){let V=l.position();return{top:V.y,left:V.x}}return Xe(N,M(),l.gap??6,l.center!==!1)},panel:()=>H,margin:l.margin??8}),k=N=>{if(l.closeOnOutside===!1||!_())return;let V=N.target;if(!(V instanceof Node))return;let K=l.el();K&&K.contains(V)||H&&H.contains(V)||P(!1)},R=N=>{l.closeOnEscape!==!1&&(N.key!=="Escape"||!_()||P(!1))};if(g.addEventListener("mousedown",k),g.addEventListener("keydown",R),f){let N=x(V=>{V===f&&(g.removeEventListener("mousedown",k),g.removeEventListener("keydown",R),N())})}let E={},I=N=>typeof N=="function"?N():N??0,A=()=>I(l.openDelay),J=()=>I(l.closeDelay),Y,z,Tn=()=>{clearTimeout(Y),clearTimeout(z),Y=void 0,z=void 0},En=N=>{if(T())return;let V=N.currentTarget,K=N.relatedTarget;V.contains(K)||(clearTimeout(z),z=void 0,Y=setTimeout(()=>{Y=void 0,P(!0)},A()))},xn=N=>{if(T())return;let V=N.currentTarget,K=N.relatedTarget;V.contains(K)||(clearTimeout(Y),Y=void 0,z=setTimeout(()=>{z=void 0,P(!1)},J()))},_n=()=>{T()||(clearTimeout(z),z=void 0,Y=setTimeout(()=>{Y=void 0,P(!0)},A()))},Pn=()=>{T()||(clearTimeout(Y),Y=void 0,z=setTimeout(()=>{z=void 0,P(!1)},J()))},se=()=>y()==="hover";if(E.onMouseOver=N=>{se()&&En(N)},E.onMouseOut=N=>{se()&&xn(N)},E.onClick=()=>{se()?p||P(!_()):y()==="click"&&P(!0)},E.onFocus=()=>{se()&&_n()},E.onBlur=()=>{se()&&Pn()},y()==="longpress"){let N,V=0,K=0,X=()=>{clearTimeout(N),N=void 0};E.onPointerDown=F=>{T()||(V=F.clientX??0,K=F.clientY??0,X(),N=setTimeout(()=>{N=void 0,l.onTrigger?.({clientX:V,clientY:K}),P(!0)},l.longPressDuration??500))},E.onPointerUp=X,E.onPointerLeave=X,E.onPointerMove=F=>{let Re=Math.abs((F.clientX??0)-V),Me=Math.abs((F.clientY??0)-K);(Re>10||Me>10)&&X()},E.onContextMenu=F=>{F.preventDefault(),l.onTrigger?.({clientX:F.clientX??0,clientY:F.clientY??0}),P(!0)}}if(E.onKeyDown=N=>{N.key==="Escape"&&l.closeOnEscape!==!1&&P(!1)},f){let N=x(V=>{V===f&&(Tn(),N())})}let Nn=N=>{if(N){H=N;let V=()=>L.refresh();N.addEventListener("animationend",V,{once:!0})}else H=null},ke=null,Se=null,kn=N=>{Nn(N),Se&&Se(N)};return{get open(){return _()},setOpen:P,wrapProps:E,portal:(N,V="popover")=>{if(T())return null;if(!_())return U=!1,ke=null,null;let X=l.el();(!U||X!==ke)&&(X?L.refresh():queueMicrotask(()=>{_()&&L.refresh()}),U=!0,ke=X);let F=N.props??{};Se=F.ref??null;let Re=["wf-popup",F.class].filter(Boolean).join(" "),Me={...F.style??{},position:"fixed",top:`${L.top}px`,left:`${L.left}px`,maxWidth:l.width!==void 0?`min(${l.width}px, calc(100vw - 32px))`:"calc(100vw - 32px)"},Sn={...N,props:{...F,class:Re,style:Me,ref:kn}};return We(Sn,V)},refresh:()=>L.refresh()}},useLongPress:function(l){let{onLongPress:f,duration:p=500}=l,y,b=0,T=0,_=null,P=()=>{clearTimeout(y),y=void 0};return{onPointerDown:M=>{b=M.clientX??0,T=M.clientY??0,_=M,P(),y=setTimeout(()=>{y=void 0,_&&f(_)},p)},onPointerUp:P,onPointerLeave:P,onPointerMove:M=>{let H=Math.abs((M.clientX??0)-b),U=Math.abs((M.clientY??0)-T);(H>10||U>10)&&P()},onContextMenu:M=>{M.preventDefault(),f(M)}}},useInView:function(l){let f=o(this),p={isIn:!1,ready:!1,observe:P,refresh:M,disconnect:H},y=null,b=null,T=()=>{n.ui&&n.ui.dirty(f?[f]:void 0)};function _(){if(b?.disconnect(),b=null,!y)return;let U=typeof l.rootMargin=="function"?l.rootMargin():l.rootMargin,L=typeof l.threshold=="function"?l.threshold():l.threshold;b=new IntersectionObserver(k=>{let R=k[k.length-1];if(!R)return;let E=R.isIntersecting,I=E!==p.isIn,A=!p.ready;p.isIn=E,p.ready=!0,l.onChange?.(R,E),(I||A)&&T()},{root:l.root?l.root():null,rootMargin:U??"0px",threshold:L??0}),b.observe(y)}function P(U){y=U,U?_():(b?.disconnect(),b=null,p.isIn=!1)}function M(){_()}function H(){b?.disconnect(),b=null}return p},useScrollPosition:function(l){let f=o(this),p={y:0,refresh(){let b=y.getScroller();p.y=b instanceof Window?g.scrollingElement()?.scrollTop??g.scrollTop():b.scrollTop??0}},y={handle:p,getScroller:l.getScroller??(()=>window)};return f?(u.set(f,y),d(),p.refresh(),p):(p.refresh(),p)},useAsync:function(l){let f=o(this),p=Q(()=>{n.ui&&n.ui.dirty(f?[f]:void 0)});p.loading=!0;let y=0,b=()=>{let T=++y;p.loading=!0,p.error=null,Promise.resolve().then(()=>l()).then(_=>{y===T&&(p.data=_,p.loading=!1)}).catch(_=>{y===T&&(p.error=_,p.loading=!1)})};return b(),p.reload=b,p},useControlled:function(l){let f=o(this),p=l.value!==void 0;if(p&&!l.onChange&&l.name&&(Ee.has(l.name)||(Ee.add(l.name),console.warn(`[weifuwu/${l.name}] \u53D7\u63A7\u6A21\u5F0F\uFF08value \u5DF2\u4F20\uFF09\u4F46\u672A\u63D0\u4F9B onChange\uFF0C\u4EA4\u4E92\u65E0\u6CD5\u751F\u6548\u3002
|
|
5
|
-
\u975E\u53D7\u63A7\uFF1A\u53BB\u6389 value\uFF1B\u53D7\u63A7\uFF1A\u4F20\u5165 onChange={(v) => setValue(v)}`))),!p&&f&&!ae.has(f)){ae.set(f,l.value);let b=x(T=>{T===f&&(ae.delete(f),b())})}let y=b=>{if(p){l.onChange?.(b);return}f&&ae.set(f,b),n.ui&&(f?n.ui.dirty([f]):n.ui.render())};return{value:p?l.value:f?ae.get(f):l.value,setValue:y,controlled:p}},useControlledInput:function(l){let f=o(this),p=this.useControlled({value:l.value,onChange:l.onChange,name:l.name});if(f&&!xe.has(f)){xe.set(f,{keyword:"",selectedLabel:""});let T=x(_=>{_===f&&(xe.delete(f),T())})}let y=f?xe.get(f):{keyword:"",selectedLabel:""},b=()=>{f?n.ui?.dirty([f]):n.ui?.render()};return{...p,get keyword(){return y.keyword},setKeyword(T){y.keyword=T,b()},get selectedLabel(){return y.selectedLabel},setSelectedLabel(T){y.selectedLabel=T,b()}}},useOpen:function(l){let f=o(this);if(f&&!ue.has(f)){ue.set(f,!1);let _=x(P=>{P===f&&(ue.delete(f),_())})}let p=l.open!==void 0;p&&!l.onOpenChange&&l.name&&!Ee.has(l.name)&&(Ee.add(l.name),console.warn(`[weifuwu/${l.name}] \u53D7\u63A7\u6A21\u5F0F\uFF08open \u5DF2\u4F20\uFF09\u4F46\u672A\u63D0\u4F9B onOpenChange\uFF0C\u4EA4\u4E92\u65E0\u6CD5\u751F\u6548\u3002
|
|
6
|
-
\u975E\u53D7\u63A7\uFF1A\u53BB\u6389 open\uFF1B\u53D7\u63A7\uFF1A\u4F20\u5165 onOpenChange={(o) => setOpen(o)}`));let y=()=>p?!!l.open:f?ue.get(f)??!1:!1,b=()=>{f?n.ui?.dirty([f]):n.ui?.render()},T=_=>{if(p){l.onOpenChange?.(_);return}f&&ue.set(f,_),b()};return{get open(){return y()},setOpen:T,triggerProps:{onClick:()=>T(!0),onFocus:()=>{l.openOnFocus&&T(!0)}}}},usePresence:function(l){let f=o(this),p="closed",y,b=()=>{p="closed",n.ui&&(f?n.ui.dirty([f]):n.ui.render())};return{get phase(){return p},ref:_=>{_?y||(y=()=>{p==="exit"&&b()},_.addEventListener("animationend",y)):y=void 0},sync:_=>(_?p="open":p==="open"&&(p="exit"),p)}},useDialog:function(l){let f=o(this),p,y=null,b=this.usePresence(l);return{get phase(){return b.phase},rootRef:P=>{P?(rn(),y&&(p=Ae(y)),b.ref(P)):(sn(),p?.(),b.ref(null))},panelRef:P=>{y=P,P&&!p&&(p=Ae(P))},sync:P=>b.sync(P)}},useGlobalKey:function(l){let f=o(this);if(typeof window>"u")return()=>{};if(g.addEventListener("keydown",l),f){let p=x(y=>{y===f&&(g.removeEventListener("keydown",l),p())})}return()=>g.removeEventListener("keydown",l)},useDrag:function(l){let f=0,p=0,y=!1,b=P=>{y&&l.onMove(P,{x:P.clientX-f,y:P.clientY-p})},T=P=>{y&&(y=!1,g.removeEventListener("pointermove",b),g.removeEventListener("pointerup",T),l.onEnd?.(P))};return{onPointerDown:P=>{y||(P.preventDefault(),y=!0,f=P.clientX,p=P.clientY,g.addEventListener("pointermove",b),g.addEventListener("pointerup",T),l.onStart?.(P))}}},useDragDrop:function(l){let f={};l.onDrop&&(f.onDrop=y=>{y.preventDefault(),l.onDrop(y)}),l.onDragOver&&(f.onDragOver=y=>{y.preventDefault(),l.onDragOver(y)}),l.onDragLeave&&(f.onDragLeave=y=>l.onDragLeave(y));let p={draggable:!0};if(l.onDragStart){let y=l.onDragStart;p.onDragStart=b=>{typeof document<"u"&&document.body.classList.add("wf-dragging"),y(b)}}if(l.onDragEnd){let y=l.onDragEnd;p.onDragEnd=b=>{typeof document<"u"&&document.body.classList.remove("wf-dragging"),y(b)}}return{dropProps:f,dragProps:p}},useReducedMotion:function(){return typeof window<"u"&&!!window.matchMedia?.("(prefers-reduced-motion: reduce)").matches},useAnimationEnd:function(l,f){let p=null,y=()=>{l(),f?.once&&p&&p.removeEventListener("animationend",y)};return T=>{T?(p=T,T.addEventListener("animationend",y)):p&&(p.removeEventListener("animationend",y),p=null)}},useTween:function(l,f){let p=o(this),y=this.useReducedMotion(),b=f?.duration??400,T=f?.ease==="linear"?L=>L:L=>1-Math.pow(1-L,3),_,P=l,M={value:y?l:0,reset:()=>{}},H=()=>{n.ui&&(p?n.ui.dirty([p]):n.ui.render())},U=L=>{if(P=L,y){M.value=L,H();return}if(L===M.value)return;_&&cancelAnimationFrame(_);let k=M.value,R=performance.now(),E=I=>{let A=Math.min(1,(I-R)/b);M.value=Math.round(k+(L-k)*T(A)),A<1?(_=requestAnimationFrame(E),H()):(_=void 0,H())};_=requestAnimationFrame(E)};return M.reset=L=>{L===P&&_||U(L)},queueMicrotask(()=>U(l)),M},selfId:function(l){if(typeof l!="string"||!l)throw new Error(`[weifuwu] selfId requires a non-empty string, got ${typeof l}`);if(v.idRegistry.has(l))throw new Error(`[weifuwu] Duplicate component ID: "${l}". Each component must have a unique custom ID.`);let f=this._selfVNode;f&&(f._customId=l,v.idRegistry.set(l,f))}}}var pn=new WeakMap;function jn(e){let n=pn.get(e)??{count:0,warned:!1};n.count++,n.count>=3&&!n.warned&&(n.warned=!0,console.warn("[weifuwu] ref \u51FD\u6570\u6BCF\u6B21\u6E32\u67D3\u90FD\u53D8\u5316\uFF08\u5185\u8054 ref\uFF09\u2014\u2014ref \u56DE\u8C03\u5728\u6BCF\u6B21\u6E32\u67D3\u540E\u91CD\u65B0\u6267\u884C\uFF08\u6027\u80FD\u635F\u8017\uFF09\u3002\u628A ref \u5B9A\u4E49\u5230 mount \u4F5C\u7528\u57DF\uFF08\u7A33\u5B9A\u5F15\u7528\uFF09\uFF1Aconst listRef = (el) => {...}; return h('div', { ref: listRef })")),pn.set(e,n)}function Z(e,n,t,o,r){if(q()){let a=t!=null&&typeof t=="object"?t.type?.name??String(t.type).slice(0,20):typeof t,d=o!=null&&typeof o=="object"?o.type?.name??String(o.type).slice(0,20):typeof o;D("patchValue","old="+a+" new="+d)}if(t==null){if(o==null)return null;let a=$(o,r);return a==null?null:(n&&n.parentNode?n.parentNode.insertBefore(a,n):e.appendChild(a),a)}if(o==null)return n?(O(t,j(r)),n.remove()):O(t,j(r)),null;let c=yn(t),i=yn(o);if(c!==i){O(t,j(r));let a=$(o,r);return a==null?null:(n?.parentNode?n.parentNode.replaceChild(a,n):a.parentNode||e.appendChild(a),a)}if(i==="text")return n&&n.textContent!==String(o)&&(n.textContent=String(o)),n;let s=o,u=t;if(typeof s.type=="function"){let a=s.type;u.type===s.type&&(u._render||u._asyncDef)&&(u._render&&(s._render=u._render),s._id=u._id,s._id&&j(r).idRegistry.set(s._id,s)),u.type===s.type&&u._asyncDef&&(s._asyncDef=u._asyncDef),s._parentNode=e,n&&(s._refNode=n);let d=Object.create(r);d.ui=Object.create(r.ui);let m=d.ui;m._selfId=s._id,m._selfVNode=s,s._ctxVersion=u._ctxVersion??m._ctxVersion??0;let w=u._render&&u.type===s.type,C=Fn(u.props,s.props),h=!m._dirtySet?.has(u._id),g=s._ctxVersion===m._ctxVersion,v=a?.name??"anon";if(q()){let f=a?.name??"anon";D("tri-state-skip",f+" type="+w+" props="+C+" dirty="+h+" ver="+g)}if(w&&C&&h&&g)return s._child=u._child,n;m._dirtySet?.delete(u._id);let x;try{typeof s._render=="function"?x=s._render(s.props):x=$e(a,s.props,s,d)}catch(f){let p=r.ui?._errorHandler;p?(p(f),x=null):(console.error(`[weifuwu] Component render error in <${a?.name||"anonymous"}> (id: ${u._id??"?"}, phase: update)`,f),x=null)}let S=u._child;s._child=x;let l=Z(e,n,S,x,d);return l?s._refNode=l:s._refNode=null,l}if(s.type===G){let a=u._childNodes,d=hn(e,u,s,r,a);return s._childNodes=d,n}if(typeof s.type=="string"){if(n&&n.nodeType===1){let a=u.props?.ref,d=s.props?.ref;a!==d&&(typeof d=="function"&&d(n),typeof a=="function"&&typeof d=="function"&&jn(n)),qe(n,u.props,s.props),hn(n,u,s,r)}else if(n){O(t,j(r));let a=$(o,r);return a==null?null:(n.parentNode?.replaceChild(a,n),a)}else{let a=t.el??t._refNode;O(t,j(r)),a&&a.parentNode&&a.remove();let d=$(o,r);return d==null?null:(e.appendChild(d),d)}return n}if(s.type===B)return fe(u,s,r),null;if(Array.isArray(o)){let a=Array.isArray(t)?t:[];_e(a,o);let d=Array.from(e.childNodes),m=n?d.indexOf(n):-1,w=m>=0?de(d.slice(m),a):de(d,a);return Pe(e,a,o,r,w,n),n}return n}var mn=new Map;function qn(e){let n=mn.get(e);return n||(n=`fn:${e.name||"anon"}`,mn.set(e,n)),n}function yn(e){if(e==null||typeof e=="boolean")return"null";if(typeof e=="string"||typeof e=="number")return"text";if(Array.isArray(e))return"array";let n=e;return typeof n.type=="function"?qn(n.type):n.type===G?"fragment":n.type===B?"portal":typeof n.type=="string"?"tag:"+n.type:"unknown"}function qe(e,n,t){q()&&D("patchProps","oldKeys="+(n?Object.keys(n).length:0)+" newKeys="+Object.keys(t).length);let o=n?Object.keys(n).filter(i=>i!=="children"&&i!=="key"&&i!=="innerHTML"):[],r=t?Object.keys(t).filter(i=>i!=="children"&&i!=="key"&&i!=="innerHTML"):[],c=new Set(r);for(let i of o){if(!n)break;if(!c.has(i)){if(i==="ref")continue;i.startsWith("on")&&typeof n[i]=="function"?e.removeEventListener(i.slice(2).toLowerCase(),n[i]):i==="value"&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)?e.value="":e.removeAttribute(i==="className"?"class":i)}}for(let i of r){if(i==="ref")continue;let s=n?.[i],u=t?.[i];if(i==="innerHTML")u!==s&&(e.innerHTML=String(u??""));else if(u!==s)if(i==="class"||i==="className")e instanceof SVGElement?e.setAttribute("class",gn(u)):e.className=gn(u);else if(i==="style"&&typeof u=="object"&&u!==null){let a=e.style,d=u;for(let m of Object.keys(d)){let w=d[m];w==null?m.startsWith("--")?a.removeProperty(m):a[m]="":m.startsWith("--")?a.setProperty(m,String(w)):a[m]=typeof w=="number"?w+"px":String(w)}}else if(i.startsWith("on")&&typeof u=="function"){let a=i.slice(2).toLowerCase();typeof s=="function"&&e.removeEventListener(a,s),e.addEventListener(a,u)}else i==="draggable"?e.setAttribute("draggable",u?"true":"false"):i==="value"&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)?e.value=String(u??""):u===!0?e.setAttribute(i,""):u!=null&&u!==!1?e.setAttribute(i,String(u)):i==="value"&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)?e.value="":e.removeAttribute(i)}}function gn(e){return typeof e=="string"?e:Array.isArray(e)?e.filter(Boolean).join(" "):e&&typeof e=="object"?Object.entries(e).filter(([,n])=>n).map(([n])=>n).join(" "):""}function je(e){if(!(e==null||typeof e!="object"))return Array.isArray(e)?void 0:e.key}function _e(e,n){if(!n.some(o=>o&&typeof o=="object"&&!Array.isArray(o)&&o.key!==void 0)){for(let o=0;o<n.length;o++){let r=n[o];r&&typeof r=="object"&&!Array.isArray(r)&&(r.key=String(o))}for(let o=0;o<e.length;o++){let r=e[o];r&&typeof r=="object"&&!Array.isArray(r)&&(r.key=String(o))}}}function de(e,n){let t=[],o=0;for(let r of n){if(r==null||typeof r=="boolean"){t.push(null);continue}let c=r;if(c.type===B){t.push(null);continue}if(c.type===G){let i=c._childNodes;Array.isArray(i)&&i.length>0?(t.push(i.slice()),o+=i.length):(t.push(e[o]?[e[o]]:null),o+=1)}else if(typeof c.type=="function")if(c._render){let i=c._childNodes??c._refNode;i==null?t.push(null):Array.isArray(i)?(t.push(i.slice()),o+=i.length):(t.push([i]),o+=1)}else t.push(e[o]?[e[o]]:null),o+=1;else typeof process<"u"&&process.env.DBG&&console.error("[map] idx=",o,"type=",c.type,"sourceLen=",e.length,"hit=",!!e[o]),t.push(e[o]?[e[o]]:null),o+=1}return t}function hn(e,n,t,o,r){q()&&D("patchChildren","old="+n.props?.children?.length+" new="+t.props?.children?.length);let c=ce(n.props?.children),i=ce(t.props?.children);_e(c,i);let s=r??Array.from(e.childNodes),u=de(s,c),a=Pe(e,c,i,o,u,r?.[0]??null),d=[];for(let m of a)m&&m.length>0&&d.push(...m);return d}function ce(e){if(e==null)return[];if(!Array.isArray(e))return[e];let n=[];for(let t of e)Array.isArray(t)?n.push(...t):n.push(t);return n}function vn(e){return e==null?[]:e instanceof DocumentFragment?Array.from(e.childNodes):[e]}function Pe(e,n,t,o,r=[],c=null){if(q()&&D("patchKeyedChildren","old="+n.length+" new="+t.length),!t.some(h=>h&&typeof h=="object"&&!Array.isArray(h)&&h.key!==void 0&&h._placement!=="remote")){let h=Math.max(n.length,t.length);for(let g=0;g<h;g++){let v=g<n.length?n[g]:null,x=g<t.length?t[g]:null;if(x==null){if(v!=null){O(v,j(o));for(let S of r[g]??[])S.remove()}}else if(v==null){let S=$(x,o);if(S!=null){let l=null;for(let f=g+1;f<r.length;f++){let p=r[f]?.[0];if(p&&p.parentNode===e){l=p;break}}l?e.insertBefore(S,l):e.appendChild(S)}}else{let S=r[g]?.[0]??null;Z(e,S,v,x,o)}}return[]}for(let h=0;h<n.length;h++){let g=n[h];if(!(g==null||typeof g=="boolean")&&je(g)===void 0)for(let v of r[h]??[])v.remove()}let s=new Map,u=0;for(let h=0;h<n.length;h++){let g=je(n[h]);g!==void 0&&s.set(g,{vnode:n[h],nodes:r[h]??[],index:u++})}let a=t.map(h=>je(h)),d=new Set(a);for(let h of[...s.keys()])if(!d.has(h)){let g=s.get(h);O(g.vnode,j(o));for(let v of g.nodes)v?.remove();s.delete(h)}let m=new Array(t.length).fill(null),w=-1,C=c&&c.parentNode===e?c:e.firstChild;for(let h=0;h<t.length;h++){let g=a[h],v=t[h],x=g!==void 0?s.get(g):void 0,S=v&&typeof v=="object"&&v._placement==="remote";if(x)if(x.nodes.length>0){if(x.index<w)for(let f of x.nodes)e.insertBefore(f,C);w=Math.max(w,x.index),Z(e,x.nodes[0],x.vnode,v,o),m[h]=v._childNodes??x.nodes.filter(f=>f.parentNode===e),C=m[h][m[h].length-1]?.nextSibling??null}else if(S)fe(x.vnode,v,o),m[h]=[];else{let l=Z(e,null,x.vnode,v,o);m[h]=vn(l);for(let p of m[h])e.insertBefore(p,C);C=m[h][m[h].length-1]?.nextSibling??null}else if(S)oe(v,o),m[h]=[];else{let l=$(v,o);m[h]=vn(l);for(let p of m[h])e.insertBefore(p,C);C=m[h][m[h].length-1]?.nextSibling??null}}return m}function $n(e,n){if(e===n)return!0;if(Array.isArray(e)&&Array.isArray(n)){if(e.length!==n.length)return!1;for(let t=0;t<e.length;t++)if(e[t]!==n[t])return!1;return!0}return e===n}function Fn(e,n){if(e===n)return!0;if(!e||!n)return!1;let t=new Set([...Object.keys(e),...Object.keys(n)]);for(let o of t)if(o!=="key"){if(o==="children"){if(!$n(e[o],n[o]))return!1}else if(e[o]!==n[o])return!1}return!0}var ee=W(),Fe="http://www.w3.org/2000/svg",Be=new Set(["svg","path","circle","line","rect","text","g","polyline","polygon","ellipse","defs","use","clipPath","mask","linearGradient","radialGradient","stop","tspan"]);function $(e,n){let t=n.browser??ee;if(q()){let s=e!=null&&typeof e=="object"?e.type?.name??String(e.type).slice(0,20):typeof e;D("renderValue","type="+s,{depth:an()})}if(e==null||typeof e=="boolean")return q()&&be(),null;if(typeof e=="string"||typeof e=="number")return q()&&be(),t.createTextNode(String(e));if(Array.isArray(e)){let s=Gn(e,n);return q()&&be(),s}let o=e;if(o.type===B)return oe(o,n),null;if(o.type===G){let s=t.createDocumentFragment(),u=o.props?.children==null?[]:Array.isArray(o.props.children)?o.props.children:[o.props.children];for(let a of u){let d=$(a,n);d!=null&&s.appendChild(d)}return o._childNodes=Array.from(s.childNodes),s}if(typeof o.type=="function")return Kn(o.type,o.props,o,n);let r=o.type,c=Be.has(r)?t.createElementNS(Fe,r):t.createElement(r);if(!c)return null;o.el=c;let i;for(let[s,u]of Object.entries(o.props??{}))s==="children"||s==="key"||s==="value"||s==="innerHTML"||wn(c,s,u);if("value"in(o.props??{})&&c instanceof HTMLSelectElement?i=o.props.value:"value"in(o.props??{})&&wn(c,"value",o.props.value),"innerHTML"in(o.props??{}))c.innerHTML=String(o.props.innerHTML??"");else{let s=Ke(o.props?.children);for(let u of s){let a=$(u,n);if(a!=null&&(c.appendChild(a),u&&typeof u=="object"&&typeof u.type=="function")){let d=u;d._parentNode||(d._parentNode=c,d._refNode=a)}}}return i!==void 0&&(c.value=String(i)),typeof o.props?.ref=="function"&&Ve(o.props.ref,c,"mount",r),c}function Bn(e){let n=e.__scheduleRender;if(typeof n=="function"){n();return}let t=e.ui;t&&typeof t.render=="function"&&t.render(["_wf_root"])}function $e(e,n,t,o){if(q()){let a=e?.name??(typeof e=="function"?"fn":typeof e);D("mountComponent",a+" id="+String(t.id??"").slice(0,10))}let r=globalThis;if(r.__wf_mountCount===void 0&&(r.__wf_mountCount=0),++r.__wf_mountCount>500)throw r.__wf_mountCount=0,new Error("[wf-render] mountComponent \u8D85\u8FC7 500 \u6B21\u2014\u2014\u6E32\u67D3\u6B7B\u5FAA\u73AF\uFF08\u65E0\u9650\u6302\u8F7D\uFF09");let c=o.browser??ee,i=t._asyncDef;if(i instanceof Promise)return Te(Ce,{});if(typeof i=="function")return t._render=i,i(n);o.ui?.setMounting?.(!0);let s;try{s=e(n,o)}finally{o.ui?.endMounting?.()}if(s instanceof Promise){let a=s;return t._asyncDef=a,a.then(d=>{if(typeof d!="function")throw new Error(`Component ${e.name||"anonymous"} async factory must return a render function. (props) => VNode pattern.`);t._asyncDef=d,Bn(o)},()=>{}),Te(Ce,{})}if(typeof s!="function")throw new Error(`Component ${e.name||"anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`);let u=s;return t._render=u,u(n)}function Kn(e,n,t,o){let r=o.browser??ee;if(!t._id){let a=j(o);t._id=me(a),a.idRegistry.set(t._id,t)}let c=Object.create(o);t.type===Oe&&(c._suspense={fallback:t.props?.fallback}),c.ui=Object.create(o.ui);let i=c.ui;i._selfId=t._id,i._selfVNode=t,t._ctxVersion=i._ctxVersion??0;let s;try{s=$e(e,n,t,c)}catch(a){let d=o.ui?._errorHandler;d?(d(a),s=null):(console.error(`[weifuwu] Component render error in <${e.name||"anonymous"}> (id: ${t._id??"?"}, phase: mount)`,a),s=null)}if(s==null){if(t._child=null,c.ui?._errorHandler){let d=r.createComment("wf-empty");return t._refNode=d,d}return null}t._child=s;let u=$(s,c);return t._refNode||(t._refNode=u),u}function Gn(e,n){let o=(n.browser??ee).createDocumentFragment();for(let r of e){let c=$(r,n);c!=null&&o.appendChild(c)}return o}function Jn(){let e=ee,n=e.byId("__wf_portal");if(!n){if(n=e.createElement("div"),!n)throw new Error("[ui-dom] portal container creation failed");n.id="__wf_portal",n.style.cssText="position:fixed;inset:0;pointer-events:none;z-index:9999",e.bodyAppend(n)}return n}function oe(e,n){let t=n.browser??ee,o=Jn(),r=t.createElement("div");r.style.pointerEvents="auto",o.appendChild(r),e._remoteEl=r;let c=ce(e.props?.children);e._child=c;for(let i of c){let s=$(i,n);s!=null&&r.appendChild(s)}}function fe(e,n,t){let o=t.browser??ee,r=e?._remoteEl;if(n._remoteEl=r,!r){oe(n,t);return}let c=ce(n.props?.children),i=e._child||[];n._child=c,_e(i,c);let s=de(Array.from(r.childNodes),i);Pe(r,i,c,t,s,s[0]?.[0]??null)}function Ke(e){if(e==null)return[];if(!Array.isArray(e))return[e];let n=[];for(let t of e)Array.isArray(t)?n.push(...t):n.push(t);return n}function wn(e,n,t){if(n!=="ref")if(n==="class"||n==="className")e instanceof SVGElement?e.setAttribute("class",String(t??"")):e.className=String(t??"");else if(n==="style"&&typeof t=="object"&&t!==null){let o=e.style;for(let r of Object.keys(t)){let c=t[r];c!=null&&(r.startsWith("--")?o.setProperty(r,String(c)):o[r]=typeof c=="number"?c+"px":String(c))}}else n.startsWith("on")&&typeof t=="function"?e.addEventListener(n.slice(2).toLowerCase(),t):n==="draggable"?e.setAttribute("draggable",t?"true":"false"):n==="value"&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)?e.value=String(t??""):t===!0?e.setAttribute(n,""):t!=null&&t!==!1&&e.setAttribute(n,String(t))}function Yn(e,n,t){e.innerHTML="";let o=$(n,t);o instanceof Node&&e.appendChild(o)}function zn(e){O(e,ie())}function Ge(e){e.node=e.node?e.node.nextSibling:null}function Xn(e,n){e.node&&e.node.parentNode?e.node.parentNode.insertBefore(n,e.node):e.parent.appendChild(n)}function Qn(e,n){e.node&&e.node.parentNode?(e.node.parentNode.replaceChild(n,e.node),Ge(e)):e.parent.appendChild(n)}async function pe(e,n,t){let o=n.browser??W();if(e==null||typeof e=="boolean")return null;if(typeof e=="string"||typeof e=="number"){let u=String(e);if(t.node&&t.node.nodeType===3)return t.node.textContent!==u&&(t.node.textContent=u),Ge(t),t.node;let a=o.createTextNode(u);return Xn(t,a),a}if(Array.isArray(e)){let u=null;for(let a of e){let d=await pe(a,n,t);d!=null&&!u&&(u=d)}return u}let r=e;if(r.type===B||r.type===G){let u=r.props?.children,a=u==null?[]:Array.isArray(u)?u:[u],d=null;for(let m of a){let w=await pe(m,n,t);w!=null&&!d&&(d=w)}return d}if(typeof r.type=="function")return Zn(r,n,t);let c=r.type,i=r.props??{},s;if(t.node&&t.node.nodeType===1&&t.node.tagName.toLowerCase()===c.toLowerCase()?(s=t.node,Ge(t)):(s=Be.has(c)?o.createElementNS(Fe,c):o.createElement(c),Qn(t,s)),r.el=s,qe(s,null,i),!("innerHTML"in i)){let u={parent:s,node:s.firstChild},a=Ke(i.children);for(let d of a){let m=await pe(d,n,u);if(m!=null&&m.parentNode!==s&&s.appendChild(m),d&&typeof d=="object"&&typeof d.type=="function"){let w=d;w._parentNode||(w._parentNode=s,w._refNode=m)}}for(;u.node;){let d=u.node;u.node=d.nextSibling,d.parentNode?.removeChild(d)}}return"value"in i&&s instanceof HTMLSelectElement&&(s.value=String(i.value??"")),typeof i.ref=="function"&&i.ref(s),s}async function Zn(e,n,t){if(!e._id){let u=j(n);e._id=me(u),u.idRegistry.set(e._id,e)}let o=Object.create(n);o.ui=Object.create(n.ui);let r=o.ui;r._selfId=e._id,r._selfVNode=e,e._ctxVersion=r._ctxVersion??0;let c=e.type,i;try{let u=c(e.props??{},o);if(u instanceof Promise&&(u=await u),typeof u!="function")throw new Error(`Component ${c.name||"anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`);e._render=u,i=u(e.props??{})}catch(u){let a=n.ui?._errorHandler;a?(a(u),i=null):(console.error(`[weifuwu] Component hydration error in <${c.name||"anonymous"}> (id: ${e._id??"?"})`,u),i=null)}if(i==null)return e._child=null,null;e._child=i;let s=await pe(i,o,t);return e._refNode||(e._refNode=s),s}async function Je(e,n,t){let o={parent:e,node:e.firstChild};for(await pe(n,t,o);o.node;){let r=o.node;o.node=r.nextSibling,r.parentNode?.removeChild(r)}}function et(e,n){let t=W(),o=typeof n.root=="string"?t.query(n.root):n.root;if(!o)throw new Error(`uiServe: root not found: ${n.root}`);let r=o,c=!!n.hydrate;c||(r.innerHTML="");let i=ie(),s=new Set,u=0,a=new Set,d=new Map,m=!1,w=!1,C=[];function h(k){C.push(w),w=k}function g(){w=C.pop()??!1}let v={params:{},query:{}};v.__scheduleRender=M;let x=new Map,S=globalThis.__DATA__??window.__DATA__;if(S&&typeof S=="object")for(let[k,R]of Object.entries(S))x.set(k,{value:R});v.data={async get(k,R){let E=x.get(k);if(E&&"value"in E)return E.value;if(E?.promise)return E.promise;if(!R)return;let I=Promise.resolve().then(()=>R()).then(A=>(x.set(k,{value:A}),A));return x.set(k,{promise:I}),I},set(k,R){x.set(k,{value:R})},has(k){return x.has(k)}};let l=!1;function f(){s.size>0&&!l&&(l=!0,queueMicrotask(()=>{l=!1;let k=[...s];s.clear(),k.length>0&&(D("flushDirty","ids="+JSON.stringify(k)),p(k))}))}function p(k){if(!m){m=!0;for(let R of k){let E=i.idRegistry.get(R);if(!E||!E._render)continue;D("renderByIds-start",R+" render="+String(E._render.name).slice(0,30)),v.ui._dirtySet?.delete(R);let I=E._child,A=E._render(E.props);if(E._child=A,I&&I._placement==="remote"||A&&A._placement==="remote"){I&&A?fe(I,A,v):A?oe(A,v):I&&O(I,i);continue}if(!E._parentNode&&E._refNode){let J=E._refNode.parentNode;J&&(E._parentNode=J)}if(E._parentNode){let J=Z(E._parentNode,E._refNode??null,I,A,v);J&&J!==E._refNode?E._refNode=J:J||(E._refNode=null)}D("renderByIds-done",R)}m=!1,f()}}let y=null;function b(){return y||(y=Qe(k=>v.ui.render(k))),y}v.browser=t,v.__registry=i,v.ui=fn({ctx:v,renderByIds:p,getSelfId:k=>k?._selfId??v.ui?._selfId,dirtyBatch:s,dirtySet:a,mediaRegistry:d,popupTrackers:b().popupTrackers,scrollTrackers:b().scrollTrackers,schedulePopupRecompute:b().schedulePopupRecompute,ensurePopupListeners:b().ensurePopupListeners,destroyPopupListeners:b().destroyPopupListeners,isRendering:()=>m,isMounting:()=>w,setMounting:h,endMounting:g,registry:i}),ye(i,k=>{for(let R of[...d.keys()])if(R.startsWith(`media:${k}:`)||R===`bp:${k}`){let E=d.get(R);E?.mql&&E.handler&&E.mql.removeEventListener("change",E.handler),E?.mqls?.forEach(({mql:I,handler:A})=>I.removeEventListener("change",A)),d.delete(R)}b().cleanupTrackers(k)}),v.__rerender=()=>M(),v.app={navigate:k=>{e.mode==="hash"?t.setHash("#"+k):t.navigate(k),M()}};let T=null,_=!1,P=!1;function M(){P||(P=!0,queueMicrotask(()=>{P=!1,H()}))}async function H(){if(!_){D("doRender","path="+e.getPath()),_=!0;try{let k=e.getPath();if(v.route={path:k,params:v.params,query:v.query},!v.__state){let E=Q(()=>{_||M()});v.__state=E;let I=v.ui.$;v.ui.$=function(){return this&&this._selfVNode?I.call(this):E}}let R=await e.execute(window.location,v,k);if(T==null){if(R){let E=c&&r.firstElementChild?(Je(r,R,v),r.firstChild):$(R,v);E&&E.parentNode!==r&&r.appendChild(E)}}else{let E=Z(r,r.firstChild,T,R,v);E&&E.parentNode!==r&&r.appendChild(E)}T=R}catch(k){if(console.error("[ui-dom] render error:",k),T==null){let R=t.createElement("div");R.className="ui-dom-error",R.textContent=`\u6E32\u67D3\u9519\u8BEF: ${k?.message??String(k)}`,r.appendChild(R)}}finally{_=!1}}}let U=()=>M();t.addEventListener("popstate",U);let L=()=>M();return e.mode==="hash"&&t.addEventListener("hashchange",L),M(),{get ctx(){return v},close(){t.removeEventListener("popstate",U),e.mode==="hash"&&t.removeEventListener("hashchange",L),T&&O(T,i),b().destroy(),i.idRegistry.clear(),r.innerHTML="",T=null}}}function nt(e,n,t=400){let o=!1,r=()=>{o||(o=!0,e.removeEventListener("animationend",r),clearTimeout(c),n())};e.addEventListener("animationend",r);let c=setTimeout(r,t)}function re(e,n){return Object.assign(Object.create(e),n)}function tt(e){let n={baseURL:e?.baseURL??"",headers:{"Content-Type":"application/json",...e?.headers}},t=e?.onRequest,o=e?.onResponse,r=e?.timeout??0;async function c(i,s,u,a){let d=n.baseURL+s,m={method:i,headers:{...n.headers,...a?.headers}},w=e?.token?.();w&&!m.headers.Authorization&&(m.headers.Authorization=`Bearer ${w}`);let C=r>0,h=!!a?.signal,g=null,v=null;(C||h)&&(g=new AbortController,m.signal=g.signal,C&&(v=setTimeout(()=>g.abort(new Error("Request timed out")),r)),h&&a.signal.addEventListener("abort",()=>g.abort())),u!==void 0&&i!=="GET"&&i!=="HEAD"&&(m.body=JSON.stringify(u));let x={url:d,init:m};t&&(x=t(x));try{let S=await fetch(x.url,x.init);if(o)return o(S);if(!S.ok){let p=await S.text().catch(()=>"");throw new Ye(S.status,p||S.statusText)}let l=S.headers.get("content-length");if(S.status===204||l==="0")return;let f=(S.headers.get("content-type")||"").toLowerCase();return f.includes("application/json")||f.includes("json")?S.json():S.text()}finally{v&&clearTimeout(v)}}return i=>re(i,{api:{get:(u,a)=>c("GET",u,void 0,a),post:(u,a,d)=>c("POST",u,a,d),put:(u,a,d)=>c("PUT",u,a,d),patch:(u,a,d)=>c("PATCH",u,a,d),delete:(u,a)=>c("DELETE",u,void 0,a)}})}var Ye=class extends Error{status;body;constructor(n,t){super(`API Error ${n}: ${t}`),this.name="ApiError",this.status=n,this.body=t}};function ot(e){try{let n=e.split(".");if(n.length!==3)return null;let t=n[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(atob(t))}catch{return null}}function rt(e){let n=ot(e);return n?.exp?n.exp*1e3-3e4<Date.now():!0}function st(e){let n=e?.storage??localStorage,t=e?.tokenKey??"weifuwu_token",o=e?.userKey??"weifuwu_user",r=e?.refreshTokenKey??"weifuwu_refresh",c=e?.refreshEndpoint??"/api/auth/refresh";return i=>{let s=n.getItem(t),u=n.getItem(o),a={token:s,user:u?JSON.parse(u):null,get isLoggedIn(){return this.token!==null},login(d,m,w){a.token=d,a.user=m,n.setItem(t,d),n.setItem(o,JSON.stringify(m)),w&&n.setItem(r,w)},logout(){a.token=null,a.user=null,n.removeItem(t),n.removeItem(o),n.removeItem(r)},setUser(d){a.user=d,n.setItem(o,JSON.stringify(d))},async refresh(){let d=n.getItem(r);if(!d)return!1;try{let m=await fetch(c,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:d})});if(!m.ok)return a.logout(),!1;let w=await m.json();return a.token=w.token,n.setItem(t,w.token),w.refreshToken&&n.setItem(r,w.refreshToken),!0}catch{return!1}}};return s&&rt(s)&&a.refresh().catch(()=>{}),re(i,{auth:a})}}function it(e={}){let n=e.url??"/ws",t=e.reconnectInterval??3e3,o=e.maxReconnect??10,r=e.pingInterval??3e4,c=e.pingTimeout??1e4;return i=>{let s=new Set,u=null,a=0,d=null,m=null,w=null,C=!1,h={isConnected:!1,onMessage:l=>(s.add(l),()=>{s.delete(l)}),send:l=>{u?.readyState===WebSocket.OPEN&&u.send(JSON.stringify(l))},_connect:g,close:()=>{C=!0,S(),u?.close(),u=null,h.isConnected=!1}};async function g(){if(!C)try{u=new WebSocket(n),u.onopen=()=>{h.isConnected=!0,a=0,v()},u.onmessage=l=>{try{let f=JSON.parse(l.data);for(let p of s)p(f)}catch{}x()},u.onclose=()=>{h.isConnected=!1,S(),!C&&a<o&&(a++,d=setTimeout(g,t*Math.min(a,5)))},u.onerror=()=>{u?.close()}}catch{C||(d=setTimeout(g,t))}}function v(){r<=0||(m=setInterval(()=>{u?.readyState===WebSocket.OPEN&&u.send(JSON.stringify({type:"ping"})),w=setTimeout(()=>{u?.close()},c)},r))}function x(){clearTimeout(w)}function S(){clearInterval(m),clearTimeout(w),clearTimeout(d)}return g(),re(i,{ws:h})}}function Ne(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}var lt=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]);function at(e){return typeof e=="string"?e:Array.isArray(e)?e.filter(Boolean).join(" "):e&&typeof e=="object"?Object.entries(e).filter(([,n])=>n).map(([n])=>n).join(" "):""}function ut(e){return typeof e=="string"?e:e&&typeof e=="object"?Object.entries(e).filter(([,n])=>n!=null).map(([n,t])=>`${n}:${typeof t=="number"?t+"px":String(t)}`).join(";"):""}function bn(e,n){let t=new Set,o={$:()=>Q(()=>{}),dirty:()=>{},render:()=>{},selfId:i=>{if(t.has(i))throw new Error(`[weifuwu] Duplicate component ID: "${i}"`);t.add(i)},useMedia:()=>{},useBreakpoint:()=>{},usePopupPosition:()=>({top:0,left:0,refresh:()=>{}}),useHoverCapable:()=>!1,useVisualViewport:()=>({height:0,offsetTop:0,keyboardOpen:!1}),useLongPress:()=>({}),useInView:()=>({isIn:!1,ready:!1,observe:()=>{},refresh:()=>{},disconnect:()=>{}}),useScrollPosition:()=>({y:0,refresh:()=>{}}),useStableRef:i=>s=>{s&&i?.(s)},useGlobalKey:()=>()=>{},useReducedMotion:()=>!1,useAnimationEnd:()=>()=>{},useTween:i=>{let s={value:i,reset:u=>{s.value=u}};return s},useDrag:()=>({onPointerDown:()=>{}}),useDragDrop:()=>({dropProps:{},dragProps:{}}),useControlled:i=>({value:i.value,setValue:s=>{i.onChange?.(s)},controlled:i.value!==void 0}),useControlledInput:i=>({value:i.value,setValue:s=>{i.onChange?.(s)},controlled:i.value!==void 0,keyword:"",setKeyword:()=>{},selectedLabel:"",setSelectedLabel:()=>{}}),useOpen:i=>({get open(){return!!i.open},setOpen:s=>{i.onOpenChange?.(s)},triggerProps:{}}),useAsync:()=>({data:void 0,loading:!0,error:void 0,reload:()=>{}}),usePopup:()=>({open:!1,setOpen:()=>{},wrapProps:{},portal:()=>null,refresh:()=>{}}),usePresence:()=>({phase:"closed",ref:()=>{},sync:i=>i?"open":"closed"}),useDialog:()=>({phase:"closed",rootRef:()=>{},panelRef:()=>{},sync:i=>i?"open":"closed"}),useChat:()=>({messages:[],input:"",streaming:!1,error:null,usage:null,step:null,send:()=>{},stop:()=>{},retry:()=>{},clear:()=>{},approve:async()=>{},dispose:()=>{}})},r={activeElement:()=>null,byId:()=>null,query:()=>null,queryAll:()=>null,createElement:()=>null,createElementNS:()=>null,createDocumentFragment:()=>null,createComment:()=>null,createTextNode:()=>null,addEventListener:()=>{},removeEventListener:()=>{},scrollTo:()=>{},matchMedia:()=>null,visualViewport:()=>null,scrollingElement:()=>null,bodyElement:()=>null,bodyAppend:()=>{},bodyRemove:()=>{},clearBody:()=>{},event:()=>new Event("wf-ssr"),dispatchEvent:()=>!1,navigate:()=>{},createTreeWalker:()=>null,copyText:async()=>!1,execCommand:()=>!1,selectionText:()=>null,getSelection:()=>null,queryCommandState:()=>!1,queryCommandValue:()=>"",viewportHeight:()=>0,viewportWidth:()=>0,pathname:()=>"",scrollTop:()=>0,hash:()=>"",setHash:()=>{},timeout:()=>0,rootElement:()=>null,storageGet:()=>null,storageSet:()=>{}},c=Object.create(e??{});return c.ui=o,c.browser=r,c.data={async get(i,s){if(n.has(i))return n.get(i);if(!s)return;let u=await s();return n.set(i,u),u},set(i,s){n.set(i,s)},has(i){return n.has(i)}},c}async function ne(e,n){if(e==null||typeof e=="boolean")return"";if(typeof e=="string"||typeof e=="number")return Ne(String(e));if(Array.isArray(e)){let a="";for(let d of e)a+=await ne(d,n);return a}let t=e;if(t.type===B||t.type===G)return ne(t.props?.children,n);if(typeof t.type=="function"){let a=Object.create(n),d;try{d=t.type(t.props??{},a)}catch(m){throw m}if(d instanceof Promise&&(d=await d),typeof d!="function")throw new Error(`Component ${t.type.name||"anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`);return ne(d(t.props??{}),a)}let o=t.type,r=t.props??{},c=[],i;for(let[a,d]of Object.entries(r))if(!(a==="children"||a==="key")&&a!=="ref"&&!(a.startsWith("on")&&typeof d=="function")){if(a==="innerHTML"){i=String(d??"");continue}if(a==="class"||a==="className"){let m=at(d);m&&c.push(` class="${Ne(m)}"`);continue}if(a==="style"&&d&&typeof d=="object"){c.push(` style="${Ne(ut(d))}"`);continue}if(d===!0){c.push(` ${a}`);continue}d===!1||d==null||c.push(` ${a}="${Ne(String(d))}"`)}let s=c.join("");if(lt.has(o))return`<${o}${s}>`;if(i!==void 0)return`<${o}${s}>${i}</${o}>`;let u=await ne(r.children,n);return`<${o}${s}>${u}</${o}>`}async function dt(e,n,t,o={}){let r=o.data??new Map,c=bn(t,r);return await ne({type:e,props:n??{},key:void 0},c)}function Cn(e){return`<script>window.__DATA__=${JSON.stringify(Object.fromEntries(e)).replace(/</g,"\\u003c")};<\/script>`}async function ct(e,n){let t=new Map,r=bn({params:{},query:{}},t),c=n.url.split("?")[0].split("#")[0],i=e.match(c);r.params=i.params,r.query=Object.fromEntries(new URLSearchParams(n.url.split("?")[1]??""));let s=new URL(n.url.startsWith("http")?n.url:`http://localhost${n.url.startsWith("/")?n.url:"/"+n.url}`),u=await e.execute(s,r,c),a=await ne(u,r),d=Cn(t),m=i.title??n.title??"",w=n.rootId??"root",C=(n.styles??[]).map(g=>` <link rel="stylesheet" href="${g}">`).join(`
|
|
5
|
+
`);r=a.pop()??"";for(let d of a){let l="message",u="";for(let i of d.split(`
|
|
6
|
+
`))i.startsWith("event: ")?l=i.slice(7):i.startsWith("data: ")&&(u+=i.slice(6));if(u)try{yield{name:l,data:JSON.parse(u)}}catch{}}}}finally{t.releaseLock()}}function Mn(e,t,n){n&&(e.length>=1e3&&e.shift(),e.push(t))}function An(e){return e===401||e===403?"auth_failed":e===429?"rate_limited":e>=500?"provider_error":"invalid_request"}function Ln(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`trace-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function qe(e,t){let n={messages:[],input:"",streaming:!1,error:null,usage:null,step:null},r=new Set,s=sn(n,an,t,()=>{for(let d of[...r])d()});Object.assign(n,s),n.subscribe=d=>(r.add(d),()=>{r.delete(d)});let a=e.selfId();if(a){let d=e.onUnmount(l=>{l===a&&(s.dispose(),d())})}return n}function $e(e,t){let n=e.selfId(),r;return n&&(r=t.subscribe(()=>e.render([n])),e.onUnmount(()=>r?.())),t}function ue(e){let t=e.registry??ve(),n={_selfId:"_wf_root",_mounting:!1,_rendering:!1,_ctxVersion:0},r={browser:e.browser,__registry:t},o=e.scheduler??Ce({registry:t,ctx:r,rootEl:e.root});n.render=function(f){if(f==null){let g=this._selfId??"_wf_root";return g?o.render([g]):Promise.resolve()}return o.render(f)},n.setMounting=f=>{n._mounting=f},n.endMounting=()=>{n._mounting=!1},r.ui=n;let s=Je(f=>{for(let g of f)o.render([g])}),{mediaRegistry:a,popupTrackers:d,scrollTrackers:l,ensurePopupListeners:u,destroyPopupListeners:i,cleanupTrackers:c}=s;be(t,f=>{c(f),d.has(f)&&d.delete(f)});let y=new Set,w=new Map,h=new Map,m=new Map,p=f=>({selfId:()=>{let g=f?._selfVNode?._id??f?._selfId;return typeof g=="string"?g:void 0},render:g=>o.render(g),browser:e.browser,onUnmount:g=>be(t,g),registry:t,mediaRegistry:a,popupTrackers:d,scrollTrackers:l,isMounting:()=>n._mounting===!0,isRendering:()=>n._rendering===!0,warned:y,uncontrolledValues:w,inputStates:h,openStates:m,ensurePopupListeners:u});return n.bumpCtxVersion=()=>{n._ctxVersion=(n._ctxVersion??0)+1},n.selfId=function(f){if(typeof f!="string"||!f)throw new Error(`[weifuwu] selfId requires a non-empty string, got ${typeof f}`);if(t.idRegistry.has(f))throw new Error(`[weifuwu] Duplicate component ID: "${f}". Each component must have a unique custom ID.`);let g=this._selfVNode;g&&(g._customId=f,t.idRegistry.set(f,g))},n.useChat=function(f){return qe(p(this),f)},n.useMedia=function(f,g){return ke(p(this),f,g)},n.useBreakpoint=function(f,g){return Ne(p(this),f,g)},n.usePopupPosition=function(f){return le(p(this),f)},n.useHoverCapable=function(){return Y(p(this))},n.useStableRef=function(f,g){return Ee(p(this),f,g)},n.useVisualViewport=function(){return Ve(p(this))},n.usePopup=function(f){return Ue(p(this),f)},n.useLongPress=function(f){return Te(p(this),f)},n.useInView=function(f){return _e(p(this),f)},n.useScrollPosition=function(f){return Se(p(this),f)},n.useAsync=function(f){return Me(p(this),f)},n.useControlled=function(f){return se(p(this),f)},n.useControlledInput=function(f){return Re(p(this),f)},n.useOpen=function(f){return De(p(this),f)},n.usePresence=function(f){return X(p(this),f)},n.useDialog=function(f){return We(p(this),f)},n.useGlobalKey=function(f){return Ae(p(this),f)},n.useDrag=function(f){return Le(p(this),f)},n.useDragDrop=function(f){return He(p(this),f)},n.useExternal=function(f){return $e(p(this),f)},n.useReducedMotion=function(){return re(p(this))},n.useAnimationEnd=function(f,g){return xe(p(this),f,g)},n.useTween=function(f,g){return Pe(p(this),f,g)},n.destroyPopupListeners=i,{ctx:r,registry:t,scheduler:o,rootUi:n,destroyPopupListeners:i}}function Hn(e){let{ctx:t,registry:n,scheduler:r,rootUi:o,destroyPopupListeners:s}=ue(e),a=null,d=null;return{ctx:t,registry:n,scheduler:r,async mount(u){a=u;let i=await _(u,t,void 0,n);e.root.innerHTML="";let c=k(i,t,e.browser);c!=null&&e.root.appendChild(c),d=i?._child??i},async rerender(){if(a==null)return;let u=await _(a,t,a,n,{force:!0}),i=a,c=d,y=i._child,w=e.root.firstChild;O(e.root,w,c,y,{browser:e.browser,registry:n}),d=y},unmount(){for(let[,u]of n.idRegistry)try{N(u,n)}catch(i){console.error("[weifuwu] unmount ref error",i)}e.root.innerHTML="",n.idRegistry.clear(),s()}}}function In(e){return e.__registry??(e.__registry=ve())}function On(e,t,n,r){let o=In(n),s=n.browser??P();return _(t,n,void 0,o).then(()=>{let a=k(t,n,s);if(a!=null&&e.appendChild(a),t._id&&o){let d=o.idRegistry.get(t._id);d&&(d._parentNode=e)}r?.onMounted?.()}).catch(a=>console.error("[weifuwu] command mount error",a)),{id:t._id??""}}function Un(e,t,n){let r=n.__registry;t&&r&&(N(t,r),t._id&&ee(r,t._id)),e.remove()}function Dn(){let e=P(),t=e.createElement("div");return t?(e.bodyAppend(t),t):null}function Wn(e,t){let n=P(),r=typeof t.root=="string"?n.query(t.root):t.root;if(!r)throw new Error(`uiServe: root not found: ${t.root}`);let o=r;!t.hydrate&&!t.loading&&(o.innerHTML="");let{ctx:a,registry:d,scheduler:l,rootUi:u,destroyPopupListeners:i}=ue({browser:n,root:o}),c=new Map,y=globalThis.__DATA__??window.__DATA__;if(y&&typeof y=="object")for(let[x,S]of Object.entries(y))c.set(x,{value:S});a.data={async get(x,S){let R=c.get(x);if(R&&"value"in R)return R.value;if(R?.promise)return R.promise;if(!S)return;let j=Promise.resolve().then(()=>S()).then(U=>(c.set(x,{value:U}),U));return c.set(x,{promise:j}),j},set(x,S){c.set(x,{value:S})},has(x){return c.has(x)}},a.route={params:{},query:{},path:""};let w=null,h="",m=0,p,f=new Promise(x=>{p=x}),g=!1;async function v(x,S){let R=++m,j={pathname:x,search:""};a.route.path=x;let U;try{U=await e.execute(j,a,x)}catch(M){U=W("div",{class:"ui-dom-error"},`\u9875\u9762\u6E32\u67D3\u5931\u8D25: ${M?.message??String(M)}`)}if(g||R!==m)return;let A;try{A=await _(U,a,w,d)}catch(M){A=W("div",{class:"ui-dom-error"},`\u7EC4\u4EF6\u6E32\u67D3\u5931\u8D25: ${M?.message??String(M)}`)}if(!(g||R!==m)){if(S){o.innerHTML="";let M=k(A,a,n);M!=null&&o.appendChild(M)}else if(w!==void 0){let M=w;w=A;let z=M?.el??M?._refNode??null;O(o,z,M,A,{browser:n,registry:d,ctxVersion:0})}w=A,h=x}}let E=n.pathname();v(E,!0).finally(()=>{g||p()});let C=()=>{let x=n.pathname();x!==h&&v(x,!1)};return n.addEventListener("popstate",C),{close(){g=!0,n.removeEventListener("popstate",C),i(),d.idRegistry.clear()},ready:f,ctx:a}}function Fe(e){e.node=e.node?e.node.nextSibling:null}function jn(e,t){e.node&&e.node.parentNode?e.node.parentNode.insertBefore(t,e.node):e.parent.appendChild(t)}function qn(e,t){e.node&&e.node.parentNode?(e.node.parentNode.replaceChild(t,e.node),Fe(e)):e.parent.appendChild(t)}function $n(e,t){for(let[n,r]of Object.entries(t))n==="children"||n==="key"||n==="innerHTML"||G(e,n,r)}function Q(e,t,n){let r=t.browser??P();if(e==null||typeof e=="boolean")return null;if(typeof e=="string"||typeof e=="number"){let l=String(e);if(n.node&&n.node.nodeType===3)return n.node.textContent!==l&&(n.node.textContent=l),Fe(n),n.node;let u=r.createTextNode(l);return jn(n,u),u}if(Array.isArray(e)){let l=null;for(let u of e){let i=Q(u,t,n);i!=null&&!l&&(l=i)}return l}let o=e;if(o.type===H||o.type===L){let l=o.props?.children,u=l==null?[]:Array.isArray(l)?l:[l],i=null;for(let c of u){let y=Q(c,t,n);y!=null&&!i&&(i=y)}return i}if(typeof o.type=="function"){let l=o._child;if(l==null){if(typeof o._render!="function"&&!(o._asyncDef||typeof o._render=="function"))throw new Error(`[vdom] component ${o.type.name||"anonymous"} not built before hydration`);return o._child=null,null}let u=Q(l,t,n);return o._refNode||(o._refNode=u),u}let s=o.type,a=o.props??{},d;if(n.node&&n.node.nodeType===1&&n.node.tagName.toLowerCase()===s.toLowerCase()?(d=n.node,Fe(n)):(d=we.has(s)?r.createElementNS("http://www.w3.org/2000/svg",s):r.createElement(s),qn(n,d)),o.el=d,$n(d,a),!("innerHTML"in a)){let l={parent:d,node:d.firstChild},u=(Array.isArray(a.children)?a.children:[a.children]).flat(1/0);for(let i of u){let c=Q(i,t,l);if(c!=null&&c.parentNode!==d&&d.appendChild(c),i&&typeof i=="object"&&!Array.isArray(i)&&typeof i.type=="function"){let y=i;y._parentNode||(y._parentNode=d,y._refNode=c)}}for(;l.node;){let i=l.node;l.node=i.nextSibling,i.parentNode?.removeChild(i)}}return"value"in a&&d instanceof HTMLSelectElement&&(d.value=String(a.value??"")),d}async function Fn(e,t,n){let r=n.__registry;await _(t,n,void 0,r);let o={parent:e,node:e.firstChild};for(Q(t,n,o);o.node;){let s=o.node;o.node=s.nextSibling,s.parentNode?.removeChild(s)}}var Bn=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),Kn=new Set(["svg","path","circle","rect","line","polyline","polygon","g","text","defs","use","clipPath"]);function de(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function zn(e){return typeof e=="string"?e:Array.isArray(e)?e.filter(Boolean).join(" "):e&&typeof e=="object"?Object.entries(e).filter(([,t])=>t).map(([t])=>t).join(" "):""}function Gn(e){return Object.entries(e).filter(([,t])=>t!=null).map(([t,n])=>{let r=t.replace(/[A-Z]/g,s=>"-"+s.toLowerCase()),o=typeof n=="number"&&n!==0?`${n}px`:String(n);return`${r}:${o}`}).join(";")}async function K(e,t){if(e==null||typeof e=="boolean")return"";if(typeof e=="string"||typeof e=="number")return de(String(e));if(Array.isArray(e)){let i="";for(let c of e)i+=await K(c,t);return i}let n=e;if(n.type===H||n.type===L)return K(n.props?.children,t);if(typeof n.type=="function"){let i=Object.create(t),c=await n.type(n.props??{},i);if(typeof c!="function")throw new Error(`Component ${n.type.name||"anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`);return K(c(n.props??{}),i)}let r=n.type,o=n.props??{},s=[],a;for(let[i,c]of Object.entries(o))if(!(i==="children"||i==="key")&&i!=="ref"&&!(i.startsWith("on")&&typeof c=="function")){if(i==="innerHTML"){a=String(c??"");continue}if(i==="class"||i==="className"){let y=zn(c);y&&s.push(` class="${de(y)}"`);continue}if(i==="style"&&c&&typeof c=="object"){s.push(` style="${de(Gn(c))}"`);continue}if(i==="draggable"||i==="contenteditable"||i==="spellcheck"){s.push(` ${i}="${c?"true":"false"}"`);continue}if(c===!0){s.push(` ${i}`);continue}c===!1||c==null||s.push(` ${i}="${de(String(c))}"`)}let d=s.join(""),l=Kn.has(r);if(Bn.has(r))return`<${r}${d}>`;if(a!==void 0)return`<${r}${d}>${a}</${r}>`;let u=await K(o.children,t);return l?`<${r}${d}>${u}</${r}>`:`<${r}${d}>${u}</${r}>`}function Yn(){let e=()=>()=>{},t=()=>({});return{_selfId:"_wf_root",render:()=>{},dirty:()=>{},$:()=>({}),selfId:()=>{},bumpCtxVersion:()=>{},setMounting:()=>{},endMounting:()=>{},useChat:()=>({messages:[],input:"",streaming:!1,error:null,usage:null,step:null,send:()=>{},stop:()=>{},retry:()=>{},clear:()=>{},approve:()=>{},subscribe:()=>()=>{}}),useExternal:n=>n,useMedia:e,useBreakpoint:e,usePopupPosition:()=>({top:0,left:0,refresh:()=>{}}),useHoverCapable:()=>!1,useStableRef:n=>r=>{r&&n?.(r)},useVisualViewport:()=>({height:0,offsetTop:0,keyboardOpen:!1}),usePopup:()=>({open:!1,setOpen:()=>{},wrapProps:{},portal:()=>null,refresh:()=>{}}),useLongPress:t,useInView:()=>({isIn:!1,ready:!1,observe:()=>{},refresh:()=>{},disconnect:()=>{}}),useScrollPosition:()=>({y:0,refresh:()=>{}}),useAsync:()=>({data:void 0,loading:!0,error:void 0,reload:()=>{}}),useControlled:()=>({value:void 0,setValue:()=>{},controlled:!1}),useControlledInput:()=>({value:void 0,setValue:()=>{},keyword:"",setKeyword:()=>{},selectedLabel:"",setSelectedLabel:()=>{},controlled:!1}),useOpen:()=>({open:!1,setOpen:()=>{},triggerProps:{}}),usePresence:()=>({phase:"closed",ref:()=>{},sync:()=>"closed"}),useDialog:()=>({phase:"closed",rootRef:()=>{},panelRef:()=>{},sync:n=>n?"open":"closed"}),useGlobalKey:()=>()=>{},useDrag:t,useDragDrop:()=>({dropProps:{},dragProps:{}}),useReducedMotion:()=>!0,useAnimationEnd:()=>()=>{},useTween:n=>{let r=n;return{get value(){return r},set value(o){r=o},reset:o=>(o!==void 0&&(r=o),r)}}}}function ln(e,t){let n={...e,ui:Yn(),browser:void 0},r=new Map;return n.data={async get(o,s){let a=r.get(o);if(a&&"value"in a)return a.value;if(a?.promise)return a.promise;if(!s)return;let d=Promise.resolve().then(()=>s()).then(l=>(r.set(o,{value:l}),t.set(o,l),l));return r.set(o,{promise:d}),d},set(o,s){r.set(o,{value:s}),t.set(o,s)},has(o){return r.has(o)}},n}function un(e){return`<script>window.__DATA__=${JSON.stringify(Object.fromEntries(e)).replace(/</g,"\\u003c")};<\/script>`}async function Xn(e,t){let n=new Map,o=ln({params:{},query:{}},n),s=t.url.split("?")[0].split("#")[0],a=e.match(s);o.params=a.params,o.query=Object.fromEntries(new URLSearchParams(t.url.split("?")[1]??""));let d=new URL(t.url.startsWith("http")?t.url:`http://localhost${t.url.startsWith("/")?t.url:"/"+t.url}`),l=await e.execute(d,o,s),u=await K(l,o),i=un(n),c=a.title??t.title??"",y=t.rootId??"root",w=(t.styles??[]).map(m=>` <link rel="stylesheet" href="${m}">`).join(`
|
|
7
7
|
`),h=`<!DOCTYPE html>
|
|
8
|
-
<html lang="${
|
|
8
|
+
<html lang="${t.lang??"zh-CN"}">
|
|
9
9
|
<head>
|
|
10
10
|
<meta charset="UTF-8">
|
|
11
11
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
12
|
-
${
|
|
13
|
-
${
|
|
12
|
+
${c?`<title>${c}</title>`:""}
|
|
13
|
+
${w}
|
|
14
14
|
</head>
|
|
15
15
|
<body>
|
|
16
|
-
<div id="${
|
|
17
|
-
${
|
|
16
|
+
<div id="${y}">${u}</div>
|
|
17
|
+
${i}
|
|
18
18
|
<script src="/app.js"><\/script>
|
|
19
19
|
</body>
|
|
20
|
-
</html>`;return{html:
|
|
20
|
+
</html>`;return{html:u,dataScript:i,page:h}}async function Jn(e,t,n,r={}){let o=r.data??new Map,s=ln(n,o);return K({type:e,props:t??{},key:void 0},s)}function Qn(e){let t={...e},n=new Set,r=()=>{for(let o of[...n])o()};return{state:t,subscribe(o){return n.add(o),()=>{n.delete(o)}},set(o){Object.assign(t,o),r()},update(o){o(t),r()},notify:r}}export{L as Fragment,H as Portal,me as UIRouter,hn as animateOut,wn as api,Cn as auth,_ as buildVNode,P as createClientBrowser,Dn as createCommandContainer,Z as createPortal,Ce as createScheduler,Qn as createStore,ue as createVdomContext,W as h,Fn as hydrateVNode,ye as jsx,gn as jsxDEV,yn as jsxs,On as mountCommand,Hn as mountRoot,O as patchValue,k as renderValue,un as serializeData,Xn as ssrPage,Jn as ssrToString,Wn as uiServe,Un as unmountCommand,En as ws};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var r=Symbol("Fragment");function o(e,t,n){return{type:e,props:
|
|
1
|
+
var r=Symbol("Fragment");function o(e,t,n){return{type:e,props:l(t),key:n??void 0}}var i=o;function d(e,t,n){return o(e,t,n)}function l(e){if(!e)return{};let t={};for(let n of Object.keys(e))n!=="key"&&(t[n]=e[n]);return t}export{r as Fragment,o as jsx,d as jsxDEV,i as jsxs};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* createStore — 共享状态工厂(render-only 方案,见 design/render-only-plan.md)
|
|
3
|
+
*
|
|
4
|
+
* state 是**普通对象(非 Proxy)**——渲染是显式 render(),状态只是数据,
|
|
5
|
+
* 无响应式引擎(无深度代理/Set/Map 绑定/isMounting 保护——§6.4 整节不需要)。
|
|
6
|
+
*
|
|
7
|
+
* 订阅:任何状态变化 → notify() → 所有订阅者(useExternal 注册的组件)重渲染。
|
|
8
|
+
* 作用域由创建位置决定:模块级(全局共享)/ 组件工厂(局部共享)/ ctx 注入(请求级)。
|
|
9
|
+
*/
|
|
10
|
+
/** 可订阅状态契约(结构化类型——任何带 state+subscribe 的对象都可被 useExternal 订阅) */
|
|
11
|
+
export interface ExternalStore<T = unknown> {
|
|
12
|
+
/** 渲染期读最新值(普通对象,读什么就是什么) */
|
|
13
|
+
state: T;
|
|
14
|
+
/** 订阅状态变化(返回退订) */
|
|
15
|
+
subscribe(cb: () => void): () => void;
|
|
16
|
+
/** 合并赋值(自动通知订阅者)——推荐写路径 */
|
|
17
|
+
set(partial: Partial<T>): void;
|
|
18
|
+
/** 函数式变更(自动通知订阅者)——推荐写路径(如 push) */
|
|
19
|
+
update(fn: (s: T) => void): void;
|
|
20
|
+
/** 手动通知(逃生口:直接改 state 后调用) */
|
|
21
|
+
notify(): void;
|
|
22
|
+
}
|
|
23
|
+
/** 创建共享状态(state 普通对象 + 订阅表 + 写路径) */
|
|
24
|
+
export declare function createStore<T extends object>(init: T): ExternalStore<T>;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* weifuwu/ui-dom/testing — 组件测试原语(vue/test-utils 模式)
|
|
3
|
+
*
|
|
4
|
+
* 收敛组件测试脚手架的官方工具:94 个测试文件曾手抄 renderVNode(3 种变体)、
|
|
5
|
+
* 114 个手抄 mockCtx、20 个手抄 VNode 树遍历、25 个手抄同实例 mount 模式。
|
|
6
|
+
*
|
|
7
|
+
* 用法(node --test 直跑,零依赖):
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { renderVNode, mountComponent, findByClass, createTestCtx, createPopupMock } from '../../ui-dom/testing.ts'
|
|
10
|
+
* // 或 npm 用户:import { ... } from 'weifuwu/ui-dom/testing'
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* 纪律(AGENTS.md 测试节):
|
|
14
|
+
* - `renderVNode`:两阶段组件渲染到 VNode 层(**只一层**——子组件保留函数引用,断言 type 而非 DOM)
|
|
15
|
+
* - `mountComponent`:**同实例 re-render**(内部 `let` 状态流转测试)——`renderVNode` 每次是新 mount,状态会丢
|
|
16
|
+
* - `findByClass`:class token 精确匹配(`split(' ')`——`includes` 会误匹配 `wf-a` ⊃ `wf-a-b`)
|
|
17
|
+
* - `walkVNode`:处理嵌套数组 children(渲染器不展开嵌套数组——Select optgroup 教训)
|
|
18
|
+
*/
|
|
19
|
+
import type { VNode } from './vnode.ts';
|
|
20
|
+
import type { WfuiContext } from './types.ts';
|
|
21
|
+
/**
|
|
22
|
+
* 组件 DOM 级测试辅助(vdom 引擎):
|
|
23
|
+
* - mountToDom:buildVNode(await 工厂)→ renderValue → append(等挂载完成)
|
|
24
|
+
* - patchToDom:同树 patch(patchValue 兼容签名——第 5 参 ctx)
|
|
25
|
+
* - buildToDom:buildVNode 预构建(vdom 签名:reg 参数可省略)
|
|
26
|
+
*/
|
|
27
|
+
export declare function mountToDom(container: Element, vnode: VNode, ctx: any): Promise<void>;
|
|
28
|
+
export declare function patchToDom(container: Element, node: Node | null, prev: any, next: any, ctx: any): Promise<any>;
|
|
29
|
+
export declare function buildToDom(vnode: VNode, ctx: any): Promise<any>;
|
|
30
|
+
/**
|
|
31
|
+
* 渲染两阶段异步组件到 VNode 层:await 工厂(mount)+ render 一次(内层)。
|
|
32
|
+
* **只渲染一层**——子组件 VNode 的 type 是组件函数(断言 === Comp),不展开 DOM。
|
|
33
|
+
* 统一 async 签名(weifuwu 只支持 async 两阶段组件)——总是返回 Promise<VNode>。
|
|
34
|
+
* 注意:每次调用是**新 mount**——内部 `let` 状态不保留;测状态流转用 `mountComponent`。
|
|
35
|
+
*/
|
|
36
|
+
export declare function renderVNode(Comp: any, props: Record<string, any>, ctx: WfuiContext): Promise<VNode | null>;
|
|
37
|
+
/**
|
|
38
|
+
* 同实例渲染器:await 工厂(mount 一次),之后每次调用重跑内层 render(保留内部 `let` 状态)。
|
|
39
|
+
* 交互测试(点击/输入后状态流转)必须用这个——`renderVNode` 每次是新 mount 会丢状态。
|
|
40
|
+
*/
|
|
41
|
+
export declare function mountComponent(Comp: any, props: Record<string, any>, ctx: WfuiContext): Promise<() => VNode | null>;
|
|
42
|
+
/**
|
|
43
|
+
* 深度遍历 VNode 树(含嵌套数组 children——渲染器不展开嵌套数组,
|
|
44
|
+
* 测试遍历必须处理:`[[div, div]]` 一层层深入)。
|
|
45
|
+
* visitor 对每个节点调用(含根)。
|
|
46
|
+
*/
|
|
47
|
+
export declare function walkVNode(vnode: unknown, visit: (n: any) => void): void;
|
|
48
|
+
/** 按谓词查询第一个匹配节点(深度优先) */
|
|
49
|
+
export declare function findVNode(vnode: unknown, pred: (n: any) => boolean): any;
|
|
50
|
+
/** 收集所有 class token 精确匹配的节点(split(' ')——includes 会误匹配前缀) */
|
|
51
|
+
export declare function findByClass(vnode: unknown, cls: string): any[];
|
|
52
|
+
/**
|
|
53
|
+
* 标准测试 ctx:`{ ui: { render, ready: true } }` + 覆盖。
|
|
54
|
+
* overrides.ui 部分覆盖(可注入 usePopup/useScrollPosition 等任意原语 mock)。
|
|
55
|
+
*/
|
|
56
|
+
export declare function createTestCtx(overrides?: {
|
|
57
|
+
ui?: Partial<WfuiContext['ui']>;
|
|
58
|
+
browser?: WfuiContext['browser'];
|
|
59
|
+
}): WfuiContext;
|
|
60
|
+
/**
|
|
61
|
+
* usePopup 标准 mock:`get open()`(渲染期读最新)+ setOpen(默认 no-op;
|
|
62
|
+
* 传第二个参数可转发到组件传入的 setOpen——Escape/外部点击关闭测试需要真实写 $)+ refresh + portal
|
|
63
|
+
* (按 isOpen 条件渲染——closed 返回 null,模拟真实 popup 不挂载面板)。
|
|
64
|
+
* ```ts
|
|
65
|
+
* const ctx = createTestCtx({ ui: { usePopup: (opts: any) => createPopupMock(() => opts.isOpen(), opts.setOpen) } })
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
export declare function createPopupMock(isOpen?: () => boolean, setOpen?: (v: boolean) => void): {
|
|
69
|
+
readonly open: boolean;
|
|
70
|
+
setOpen: (v: boolean) => void;
|
|
71
|
+
refresh: () => void;
|
|
72
|
+
portal: (content: any, _key?: string) => any;
|
|
73
|
+
wrapProps: {};
|
|
74
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var A=Symbol("Fragment"),S=Symbol("Portal");function W(e,n){if(e===n)return!0;let t=Object.keys(e),r=Object.keys(n);if(t.length!==r.length)return!1;for(let o of t)if(e[o]!==n[o])return!1;return!0}async function q(e,n,t,r){e._id||(r?.reuse?._id?e._id=r.reuse._id:e._id=t.nextId(),t.idRegistry.set(e._id,e)),r?.reuse&&(r.reuse._parentNode&&(e._parentNode=r.reuse._parentNode),r.reuse._refNode&&(e._refNode=r.reuse._refNode));let o=Object.create(n);o.ui=Object.create(n.ui);let i=o.ui;if(i._selfId=e._id,i._selfVNode=e,i.render=function(u){return u==null&&e._id?n.ui.render([e._id]):n.ui.render(u)},typeof e._render!="function"&&typeof r?.reuse?._render=="function"&&(e._render=r.reuse._render),typeof e._render!="function"){n.ui?.setMounting?.(!0);let u;try{u=await e.type(e.props??{},o)}finally{n.ui?.endMounting?.()}if(typeof u!="function")throw new Error(`Component ${e.type.name||"anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`);e._render=u}return{renderFn:e._render,childCtx:o}}async function C(e,n,t,r,o){if(e==null||typeof e=="boolean"||typeof e=="string"||typeof e=="number")return e;if(Array.isArray(e)){let a=Array.isArray(t)?t:[];return await Promise.all(e.map((l,s)=>C(l,n,a[s],r,o))),e}let i=e,u=r??n.__registry,m=t!=null&&typeof t=="object"&&!Array.isArray(t)&&t.type===i.type?t:null;if(typeof i.type=="function"){let{childCtx:a}=await q(i,n,u,{reuse:m??void 0}),l=W(m?.props??{},i.props??{});if(o?.force||!l||m?._child==null){let s=await C(i._render(i.props),a,m?._child,u);i._child=s??null}else i._child=m._child;return i}if(i.type===A){let a=await C(i.props?.children??null,n,m?._child??m?.props?.children,u);return i._child=a??null,i}if(typeof i.type=="string"||typeof i.type=="symbol"){let a=await C(i.props?.children??null,n,m?.props?.children,u);return i._child=a??null,i}return i}var U=new Set(["svg","path","circle","rect","line","polyline","polygon","g","text","defs","use","clipPath"]),$=/^on[A-Z]/,K=new Set(["zIndex","opacity","lineHeight","fontWeight","fontSizeAdjust","flex","flexGrow","flexShrink","order","zoom","aspectRatio","gridRow","gridColumn","scale","rotate","animationIterationCount","columnCount","fillOpacity","strokeOpacity","stopOpacity","floodOpacity"]);function D(e,n,t){if(t==null||t===!1)return;let r=e.ownerDocument?.defaultView;if(n==="class"||n==="className"){if(typeof t=="object")for(let[o,i]of Object.entries(t))i&&e.classList.add(o);else e.setAttribute("class",String(t));return}if(n==="style"){if(typeof t=="string")e.setAttribute("style",t);else{let o=e.style;for(let[i,u]of Object.entries(t))u==null?o[i]="":i.startsWith("--")?o.setProperty(i,String(u)):typeof u=="number"&&!K.has(i)?o[i]=`${u}px`:o[i]=String(u)}return}if(n==="ref"){if(typeof t=="function")try{t(e)}catch(o){console.error("[weifuwu] ref error",o)}return}if($.test(n)){let o=n.slice(2).toLowerCase();e.addEventListener(o,t);return}if(n==="value"){e.value=t;return}if(n==="indeterminate"){e.indeterminate=!!t;return}if(n==="innerHTML"){e.innerHTML=String(t??"");return}if(n==="draggable"||n==="contenteditable"||n==="spellcheck"){e.setAttribute(n,t?"true":"false");return}if(n.startsWith("aria-")&&typeof t=="boolean"){e.setAttribute(n,t?"true":"false");return}if(t===!0){e.setAttribute(n,"");return}try{e[n]=t,e.getAttribute(n)!==String(t)&&e.setAttribute(n,String(t))}catch{e.setAttribute(n,String(t))}}function V(e,n,t){let r=n?.browser??t;if(!r)throw new Error("[vdom] renderValue requires browser env (ctx.browser)");if(e==null||typeof e=="boolean")return null;if(typeof e=="string"||typeof e=="number")return r.createTextNode(String(e));if(Array.isArray(e)){let a=r.createDocumentFragment();if(!a)return null;for(let l of e){let s=V(l,n,r);s!=null&&a.appendChild(s)}return a}let o=e;if(o.type===S){let a=r.bodyElement();if(!a)return null;let l=a.querySelector("#__wf_portal");l||(l=r.createElement("div"),l&&(l.id="__wf_portal",a.appendChild(l)));let s=r.createElement("div");if(s){s.setAttribute("data-portal",String(o.props?.portalKey??"wf"));let c=V(o.props?.children??null,n,r);c!=null&&s.appendChild(c),l&&l.appendChild(s),o._remoteEl=s}return null}if(o.type===A){let a=r.createDocumentFragment();if(!a)return null;let l=(Array.isArray(o.props?.children)?o.props.children:[o.props?.children]).flat(1/0);for(let s of l){let c=V(s,n,r);c!=null&&a.appendChild(c)}return o._childNodes=Array.from(a.childNodes),a}if(typeof o.type=="function"){if(typeof o._render!="function")throw new Error(`[vdom] component ${o.type.name||"anonymous"} not built (missing _render) \u2014 buildVNode must run before renderValue`);let a=o._child!==void 0?o._child:o._render(o.props);if(a==null)return o._child=null,null;let l=(Array.isArray(a)||typeof a=="object"&&typeof a.type=="function",a);o._child=l,typeof l=="object"&&!Array.isArray(l)&&(l._parentVNode=o);let s=V(l,n,r);return s&&(o._refNode=s),s}let i=o.type,u=U.has(i)?r.createElementNS("http://www.w3.org/2000/svg",i):r.createElement(i);if(!u)return null;o.el=u;let m;for(let[a,l]of Object.entries(o.props??{}))if(!(a==="children"||a==="key")){if(a==="value"&&u instanceof HTMLSelectElement){m=l;continue}D(u,a,l)}if(!("innerHTML"in(o.props??{}))){let a=(Array.isArray(o.props?.children)?o.props.children:[o.props?.children]).flat(1/0);for(let l of a){let s=V(l,n,r);if(s!=null&&(u.appendChild(s),l&&typeof l=="object"&&!Array.isArray(l)&&typeof l.type=="function")){let c=l;c._parentNode||(c._parentNode=u,c._refNode=s)}}}return m!==void 0&&(u.value=String(m)),u}function x(){return{activeElement:()=>typeof document<"u"?document.activeElement:null,byId:e=>typeof document<"u"?document.getElementById(e):null,query:e=>typeof document<"u"?document.querySelector(e):null,queryAll:e=>typeof document<"u"?document.querySelectorAll(e):null,createElement:e=>typeof document<"u"?document.createElement(e):null,createElementNS:(e,n)=>typeof document<"u"?document.createElementNS(e,n):null,createDocumentFragment:()=>typeof document<"u"?document.createDocumentFragment():null,createComment:e=>typeof document<"u"?document.createComment(e):null,createTextNode:e=>typeof document<"u"?document.createTextNode(e):null,addEventListener:(e,n,t)=>{typeof window<"u"&&window.addEventListener(e,n,t)},removeEventListener:(e,n,t)=>{typeof window<"u"&&window.removeEventListener(e,n,t)},scrollTo:e=>{typeof window<"u"&&window.scrollTo(0,e)},matchMedia:e=>typeof window<"u"&&typeof window.matchMedia=="function"?window.matchMedia(e):null,visualViewport:()=>(typeof window<"u"?window:null)?.visualViewport??null,scrollingElement:()=>typeof document<"u"?document.scrollingElement:null,bodyElement:()=>typeof document<"u"?document.body:null,bodyAppend:e=>{typeof document<"u"&&document.body.appendChild(e)},bodyRemove:e=>{typeof document<"u"&&e.parentNode&&document.body.removeChild(e)},clearBody:()=>{typeof document<"u"&&(document.body.innerHTML="")},event:(e,n)=>{let t=typeof window<"u"?window:null,r=n&&(n.key||n.code)?"KeyboardEvent":n&&(n.clientX!==void 0||n.clientY!==void 0||n.pointerId!==void 0)?"PointerEvent":"Event";try{return new t[r](e,n)}catch{return new t.Event(e,n)}},dispatchEvent:(e,n)=>typeof e<"u"?e.dispatchEvent(n):!1,navigate:e=>{typeof window>"u"||(window.history.pushState(null,"",e),window.dispatchEvent(new PopStateEvent("popstate",{state:null})))},copyText:async e=>{let n=typeof window<"u"?window:null;if(n?.navigator?.clipboard?.writeText)try{return await n.navigator.clipboard.writeText(e),!0}catch{}try{if(typeof document>"u")return!1;let t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.select();let r=document.execCommand("copy");return document.body.removeChild(t),r}catch{return!1}},execCommand:(e,n)=>typeof document<"u"?document.execCommand(e,!1,n):!1,queryCommandState:e=>typeof document<"u"?document.queryCommandState(e):!1,queryCommandValue:e=>typeof document<"u"?document.queryCommandValue(e):"",selectionText:()=>typeof window<"u"?window.getSelection?.()?.toString()??null:null,getSelection:()=>typeof window<"u"?window.getSelection():null,viewportHeight:()=>typeof window<"u"?window.innerHeight:0,viewportWidth:()=>typeof window<"u"?window.innerWidth:0,pathname:()=>typeof window<"u"?window.location.pathname:"",createTreeWalker:(e,n)=>typeof document<"u"?document.createTreeWalker(e,n??NodeFilter.SHOW_ALL):null,scrollTop:()=>{let e=typeof document<"u"?document:null,n=typeof window<"u"?window:null;return e?.scrollingElement?.scrollTop??n?.scrollY??0},hash:()=>typeof window<"u"?window.location?.hash??"":"",setHash:e=>{typeof window<"u"&&(window.location.hash=e)},timeout:(e,n)=>typeof window<"u"?window.setTimeout(e,n):0,rootElement:()=>typeof document<"u"?document.documentElement:null,storageGet:e=>{try{return typeof window<"u"?window.localStorage?.getItem(e)??null:null}catch{return null}},storageSet:(e,n)=>{try{typeof window<"u"&&window.localStorage?.setItem(e,n)}catch{}}}}var G=0;function T(){return{idRegistry:new Map,unmountHooks:[],nextId:()=>`_wf_${G++}`}}function F(e,n){for(let t of[...e.unmountHooks])t(n);e.idRegistry.delete(n),e.idRegistry.delete(`custom:${n}`)}function z(e,n,t,r){try{e(n)}catch(o){console.error(`[weifuwu] ref ${t} error in <${r??"anonymous"}>`,o)}}function N(e,n){if(e==null||typeof e!="object")return;let t=e;if(t._id){if(t._customId&&n.idRegistry.delete(t._customId),n.idRegistry.delete(t._id),n.unmountHooks.length>0){let r=[...n.unmountHooks];for(let o of r)o(t._id);if(t._customId)for(let o of r)o(t._customId)}t._id=void 0,t._customId=void 0,t._render=void 0,t._parentNode=void 0,t._refNode=void 0}if(t._child!=null){if(Array.isArray(t._child))for(let r of t._child)r&&typeof r=="object"&&N(r,n);else N(t._child,n);t._child=void 0}if(t.props?.children&&typeof t.type=="string"){let r=Array.isArray(t.props.children)?t.props.children:[t.props.children];for(let o of r)o&&typeof o=="object"&&N(o,n)}if(typeof t.props?.ref=="function"&&z(t.props.ref,null,"cleanup"),t._remoteEl){let r=t._child;if(r!=null)if(Array.isArray(r))for(let o of r)o&&typeof o=="object"&&N(o,n);else typeof r=="object"&&N(r,n);t._remoteEl.remove(),t._remoteEl=void 0}}function M(e,n){if(n&&typeof e.type=="function"&&e._id){try{N(e,n)}catch(t){console.error("[weifuwu] ref cleanup error",t)}F(n,e._id)}}function B(e){if(e==null||typeof e=="boolean")return[];let n=[],t=Array.isArray(e)?[...e]:[e];for(;t.length>0;){let r=t.shift();Array.isArray(r)?t.unshift(...r):n.push(r)}return n}function v(e){if(e==null||typeof e!="object"||Array.isArray(e))return;let n=e;return n._placement==="remote"?n.props?.portalKey:n.key}function P(e,n,t,r,o){if(typeof r=="string"||typeof r=="number"){if(typeof t=="string"||typeof t=="number"){if(String(t)!==String(r)){let c=e.ownerDocument.createTextNode(String(r));return n?.parentNode?n.parentNode.replaceChild(c,n):e.appendChild(c),c}return n}let s=e.ownerDocument.createTextNode(String(r));return n?.parentNode?n.parentNode.replaceChild(s,n):e.appendChild(s),s}if(r==null||typeof r=="boolean"){if(t&&typeof t=="object"&&!Array.isArray(t)&&t.type===S){let s=t._remoteEl;try{N(t.props?.children,o.registry)}catch(c){console.error("[weifuwu] portal ref cleanup error",c)}return s?.parentNode?.removeChild(s),null}if(t&&typeof t=="object"&&!Array.isArray(t))if(typeof t.type=="function")M(t,o.registry);else try{N(t,o.registry)}catch(s){console.error("[weifuwu] ref cleanup error",s)}return n?.parentNode&&n.parentNode.removeChild(n),null}if(Array.isArray(r)){let s=e.ownerDocument.createDocumentFragment(),c=k(e,t,r,o,n?[n]:void 0);for(let w of c)w&&s.appendChild(w);return n?.parentNode?s.contains(n)?e.appendChild(s):n.parentNode.replaceChild(s,n):e.appendChild(s),s}let i=r;if(i.type===S){let s=t&&typeof t=="object"&&!Array.isArray(t)?t:null;if(s?.type===S){let c=s._remoteEl;if(c){let w=s.props?.children??null,E=i.props?.children??null;k(c,w,E,o)}return i._remoteEl=s._remoteEl,null}return V(i,o,o.browser??x()),null}if(i.type===A){let c=(t&&typeof t=="object"&&!Array.isArray(t)?t:null)?._childNodes,w=k(e,t,i.props?.children??null,o,c);return i._childNodes=w.filter(Boolean),n?.parentNode&&n.nodeType===8&&n.parentNode.removeChild(n),n&&n.nodeType===1?n:w[0]??null}if(typeof i.type=="function"){if(typeof i._render!="function")throw new Error(`[vdom] component ${i.type.name||"anonymous"} not built in diff \u2014 buildVNode must run before patchValue`);let s=t&&typeof t=="object"&&!Array.isArray(t)?t:null;s?.type===i.type&&s._id&&(i._id=s._id,o.registry.idRegistry.set(i._id,i)),i._parentNode=e,n&&(i._refNode=n);let c=s?.type===i.type,w=W(s?.props??{},i.props??{}),E=o.getCtxVersion?o.getCtxVersion(i._id??""):void 0,_=E===void 0||(o.ctxVersion??0)===E;if(s&&c&&w&&_&&s._child!==void 0)return i._child=s._child,n;let d;i._child!==void 0?d=i._child:(d=i._render(i.props),i._child=d);let f=P(e,n,s?._child,d,o);return f&&(i._refNode=f),f}let u=t&&typeof t=="object"&&!Array.isArray(t)?t:null,m=u?.type??null,a=i.type;if(n&&n.nodeType===1&&m===a){let s=n;return i.el=s,X(s,u?.props??{},i.props??{}),k(s,u?.props?.children??null,i.props?.children??null,o),s}let l=V(i,o,o.browser??x());if(l==null)return null;if(n?.parentNode)if(t!=null&&typeof t!="boolean"){if(typeof t=="object"&&!Array.isArray(t))try{N(t,o.registry)}catch(s){console.error("[weifuwu] ref cleanup error",s)}n.parentNode.replaceChild(l,n)}else n.parentNode.insertBefore(l,n);else e.appendChild(l);return l}function X(e,n,t){let r=new Set([...Object.keys(n),...Object.keys(t)]);for(let o of r){if(o==="children"||o==="key")continue;let i=n[o],u=t[o];if(i!==u){if(o.startsWith("on")){typeof i=="function"&&e.removeEventListener(o.slice(2).toLowerCase(),i),u!=null&&u!==!1&&e.addEventListener(o.slice(2).toLowerCase(),u);continue}if(u==null||u===!1){if(o==="class"||o==="className")e.removeAttribute("class");else if(o.startsWith("on"))e.removeEventListener(o.slice(2).toLowerCase(),i);else if(o==="ref"){if(typeof i=="function")try{i(null)}catch(m){console.error("[weifuwu] ref cleanup error",m)}}else if(o==="value")e.value="";else if(o==="indeterminate")e.indeterminate=!1;else{e.removeAttribute(o);try{delete e[o]}catch{}}continue}D(e,o,u)}}}function k(e,n,t,r,o){let i=B(n),u=B(t),m=o??Array.from(e.childNodes);if(u.some(d=>v(d)!==void 0)){for(let d=0;d<u.length;d++){let f=u[d];f&&typeof f=="object"&&!Array.isArray(f)&&v(f)===void 0&&(f.key=`pos:${d}`)}for(let d=0;d<i.length;d++){let f=i[d];f&&typeof f=="object"&&!Array.isArray(f)&&v(f)===void 0&&(f.key=`pos:${d}`)}}let l=i.map((d,f)=>{if(d==null||typeof d!="object"||Array.isArray(d))return m[f]??null;let y=d;return y._placement==="remote"?y._remoteEl??null:y.type===A?y._childNodes?.[0]??null:y._refNode??y.el??null});if(!u.some(d=>{if(d==null||typeof d!="object"||Array.isArray(d))return!1;let f=d;return f._placement!=="remote"&&f.key!==void 0})){let d=Math.max(i.length,u.length),f=[];for(let y=0;y<d;y++){let h=y<i.length?i[y]:null,p=y<u.length?u[y]:null;if(p==null||typeof p=="boolean"){if(h&&typeof h=="object"&&!Array.isArray(h))if(typeof h.type=="function")M(h,r.registry);else try{N(h,r.registry)}catch(R){console.error("[weifuwu] ref cleanup error",R)}let g=l[y];g?.parentNode&&g.parentNode.removeChild(g),f.push(null);continue}if(h==null||typeof h=="boolean"){let g=V(p,r,r.browser??x());if(g==null){f.push(null);continue}let R=null;for(let j=y+1;j<l.length;j++){let H=l[j];if(H&&H.parentNode===e){R=H;break}}R&&R.parentNode===e?e.insertBefore(g,R):e.appendChild(g),f.push(g);continue}let b=P(e,l[y],h,p,r);f.push(b)}return f}let c=new Map;i.forEach((d,f)=>{let y=v(d);y!==void 0&&d&&typeof d=="object"&&!Array.isArray(d)&&c.set(y,{vnode:d,nodes:[l[f]??null].filter(Boolean),index:f})});let w=[],E=new Set,_=null;return u.forEach((d,f)=>{let y=v(d),h=d;if(y!==void 0&&c.has(y)){let p=c.get(y),b=p.nodes[0]??null;E.add(y);let g=P(e,b,p.vnode,h,r);g&&g.parentNode===e&&_&&g.previousSibling!==_&&e.insertBefore(g,_.nextSibling),w.push(g),g&&(_=g)}else if(h?._placement==="remote"){let p=i[f]??null,b=P(e,l[f]??null,p,h,r);w.push(b),b&&(_=b)}else{let p=V(h,r,r.browser??x());w.push(p),p!=null&&(e.appendChild(p),_&&p.previousSibling!==_&&e.insertBefore(p,_.nextSibling),_=p)}}),i.forEach((d,f)=>{let y=v(d),h=d&&typeof d=="object"&&!Array.isArray(d)&&typeof d.type=="function";if(y!==void 0&&!E.has(y)){if(d&&typeof d=="object"&&!Array.isArray(d))if(h)M(d,r.registry);else try{N(d,r.registry)}catch(b){console.error("[weifuwu] ref cleanup error",b)}let p=l[f];p?.parentNode&&p.parentNode.removeChild(p)}else if(y===void 0){if(d&&typeof d=="object"&&!Array.isArray(d))if(h)M(d,r.registry);else try{N(d,r.registry)}catch(b){console.error("[weifuwu] ref cleanup error",b)}let p=l[f];p?.parentNode&&p.parentNode.removeChild(p)}}),w}function Y(e){return e.__registry??(e.__registry=T())}function O(e,n,t,r){let o=Y(t),i=t.browser??x();return C(n,t,void 0,o).then(()=>{let u=V(n,t,i);if(u!=null&&e.appendChild(u),n._id&&o){let m=o.idRegistry.get(n._id);m&&(m._parentNode=e)}r?.onMounted?.()}).catch(u=>console.error("[weifuwu] command mount error",u)),{id:n._id??""}}function Ve(e,n,t){return new Promise(r=>{O(e,n,t,{onMounted:r})})}async function _e(e,n,t,r,o){return await C(r,o,t,o.__registry),P(e,n,t,r,{browser:o.browser??o.__browser,registry:o.__registry})}function be(e,n){let t=n.__registry??(n.__registry=T());return C(e,n,void 0,t)}async function Ce(e,n,t){let r=await e(n,t);return typeof r=="function"?r(n):r}async function Ee(e,n,t){let r=await e(n,t);return()=>typeof r=="function"?r(n):r}function L(e,n){if(e==null||typeof e!="object")return;if(Array.isArray(e)){for(let r of e)L(r,n);return}n(e);let t=e?.props?.children;t!=null&&L(t,n)}function Ae(e,n){let t;return L(e,r=>{!t&&n(r)&&(t=r)}),t}function xe(e,n){let t=[];return L(e,r=>{typeof r?.props?.class=="string"&&r.props.class.split(" ").includes(n)&&t.push(r)}),t}function Re(e){let n={ui:{render:()=>{},ready:!0,useExternal:()=>{}}};return e?{ui:{...n.ui,...e.ui??{}},...e.browser?{browser:e.browser}:{}}:n}function Se(e=()=>!1,n){return{get open(){return e()},setOpen:n??(t=>{}),refresh:()=>{},portal:(t,r)=>e()?t:null,wrapProps:{}}}export{be as buildToDom,Se as createPopupMock,Re as createTestCtx,xe as findByClass,Ae as findVNode,Ee as mountComponent,Ve as mountToDom,_e as patchToDom,Ce as renderVNode,L as walkVNode};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/ui-dom/types.d.ts
CHANGED
|
@@ -22,12 +22,6 @@ export interface PopupPositionOptions {
|
|
|
22
22
|
/** 视口边缘安全边距(px,默认 8) */
|
|
23
23
|
margin?: number;
|
|
24
24
|
}
|
|
25
|
-
/** 响应式状态容器(createReactiveState 返回值)——深度 Proxy:任意层级赋值触发 dirty */
|
|
26
|
-
export interface ReactiveState {
|
|
27
|
-
/** 订阅状态变更(任意层级赋值/删除触发);返回退订函数 */
|
|
28
|
-
__watch: (cb: () => void) => () => void;
|
|
29
|
-
[key: string]: any;
|
|
30
|
-
}
|
|
31
25
|
/** 异步取数工具返回值 — ctx.ui.useAsync()(data/loading/error 响应式,reload 重跑) */
|
|
32
26
|
export interface UseAsyncHandle<T = any> {
|
|
33
27
|
data?: T;
|
|
@@ -78,6 +72,16 @@ export interface UsePopupOptions {
|
|
|
78
72
|
closeOnOutside?: boolean;
|
|
79
73
|
/** Escape 关闭(默认 true) */
|
|
80
74
|
closeOnEscape?: boolean;
|
|
75
|
+
/** 遮罩(默认 false):渲染全屏 overlay(--wf-overlay,点击遮罩关闭,
|
|
76
|
+
* 模态语义阻断页面交互)。false = 无遮罩 document 外部点击(§5.4 默认)。
|
|
77
|
+
* 遮罩层 z-index = --wf-z-overlay(80) < 面板 --wf-z-popover(120)。
|
|
78
|
+
* 配合 maskClosable 控制遮罩点击是否关闭。 */
|
|
79
|
+
mask?: boolean;
|
|
80
|
+
/** 遮罩点击关闭(默认 true;mask:true 时生效——危险确认 maskClosable=false 防误触) */
|
|
81
|
+
maskClosable?: boolean;
|
|
82
|
+
/** 遮罩面板居中(默认 false;mask:true 时生效):面板覆盖全屏 flex 居中
|
|
83
|
+
* (预览图/全屏浮层场景——忽略 trigger 定位,替代 dropdown 的 bottom 定位) */
|
|
84
|
+
maskCentered?: boolean;
|
|
81
85
|
/** 长按触发时长(ms,仅 trigger='longpress',默认 500) */
|
|
82
86
|
longPressDuration?: number;
|
|
83
87
|
/** 打开触发回调(longpress 计时到/右键兼容时调用,携带光标坐标——右键菜单定位用) */
|
|
@@ -256,11 +260,7 @@ export interface WfuiContext {
|
|
|
256
260
|
/** UI 框架能力(由 createApp.mount 注入) */
|
|
257
261
|
ui: {
|
|
258
262
|
/** 触发组件重渲染(同步,无参 = 当前组件) */
|
|
259
|
-
render: (ids?: string[]) => void
|
|
260
|
-
/** 异步触发组件重渲染(微任务批处理,无参 = 当前组件) */
|
|
261
|
-
dirty: (ids?: string[]) => void;
|
|
262
|
-
/** 创建响应式状态容器:$.x = val 自动触发 dirty() */
|
|
263
|
-
$: () => Record<string, any>;
|
|
263
|
+
render: (ids?: string[]) => Promise<void>;
|
|
264
264
|
/**
|
|
265
265
|
* AI 对话会话:$ 超集(会话语义 + 工具调用内嵌 + HITL 审批)
|
|
266
266
|
*
|
|
@@ -359,6 +359,23 @@ export interface WfuiContext {
|
|
|
359
359
|
dropProps: Record<string, any>;
|
|
360
360
|
dragProps: Record<string, any>;
|
|
361
361
|
};
|
|
362
|
+
/**
|
|
363
|
+
* 订阅共享状态(render-only 共享原语——design/render-only-plan.md):
|
|
364
|
+
* mount 注册订阅(任何变化 → 自身重渲染),unmount 自动退订;返回 store 本身(活引用)。
|
|
365
|
+
* 参数契约:任何 { subscribe(cb): unsub } 的可订阅对象(createStore 产物 / useChat handle)。
|
|
366
|
+
*
|
|
367
|
+
* ```tsx
|
|
368
|
+
* const store = createStore({ count: 0 })
|
|
369
|
+
* const Comp = (_init, ctx) => {
|
|
370
|
+
* ctx.ui.useExternal(store)
|
|
371
|
+
* return () => h('div', {}, store.state.count)
|
|
372
|
+
* }
|
|
373
|
+
* ```
|
|
374
|
+
*/
|
|
375
|
+
useExternal: (store: {
|
|
376
|
+
subscribe(cb: () => void): () => void;
|
|
377
|
+
[key: string]: any;
|
|
378
|
+
}) => any;
|
|
362
379
|
/**
|
|
363
380
|
* 可视视口跟踪(visualViewport):键盘弹起/缩放时自动更新 + dirty。
|
|
364
381
|
* 无 visualViewport(桌面)降级 innerHeight。fixed 底部栏防键盘遮挡用。
|