weifuwu 0.73.1 → 0.74.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 CHANGED
@@ -126,16 +126,15 @@ npm install weifuwu # 一个依赖,完整应用栈
126
126
 
127
127
  ```tsx
128
128
  // routes.tsx —— 页面声明(前后端共用 UIRouter)
129
- import { UIRouter, asyncComponent } from 'weifuwu/ui-dom'
129
+ import { UIRouter } from 'weifuwu/ui-dom'
130
130
 
131
131
  const app = new UIRouter()
132
132
 
133
- // async 工厂组件:await 数据 → 返回视图(两阶段:外层初始化,内层渲染)
134
- const Home = asyncComponent(async (ctx) => {
133
+ // async 组件(原生):await 数据 → 返回视图(外层初始化,内层渲染)
134
+ const Home = async (_init, ctx) => {
135
135
  const msg = await ctx.data.get('/api/hello') // 数据管道:一个 API 三场景
136
- return (_init, ctx) =>
137
- (props) => <h1>{msg.msg}</h1>
138
- })
136
+ return (props) => <h1>{msg.msg}</h1>
137
+ }
139
138
 
140
139
  app.get('/', async () => <Home />) // handler = 异步组件
141
140
 
@@ -351,7 +350,7 @@ cd apps/agent-platform && npm run seed && npm run dev
351
350
  | Router 方法 | **app.graphql()** | GraphQL 端点(支持 GraphiQL),Router 实例方法(无需单独 import) | Router |
352
351
  | `weifuwu/ui-dom` | **UIRouter** | 纯路由 + ctx 注入链(`use` 中间件累积类型,对齐后端 `app.use`);handler=异步组件 | — |
353
352
  | `weifuwu/ui-dom` | **uiServe** | 渲染运行时:监听 location → 执行路由 → VDOM diff/patch;`hydrate: true` 收养 SSR HTML | UIRouter |
354
- | `weifuwu/ui-dom` | **asyncComponent** | async 工厂组件:工厂层声明数据,mount/render 同步(三条纪律见[核心概念](#核心概念)) | — |
353
+ | `weifuwu/ui-dom` | **async 组件** | async 函数即组件(与同步同签名);数据走 ctx.data 三场景(三条纪律见[核心概念](#核心概念)) | — |
355
354
  | `weifuwu/ui-dom` | **ctx.data** | 数据管道:SSR 预取 / hydration 命中 / SPA fetch(`ctx.data.get`) | uiServe |
356
355
  | `weifuwu/ui-dom` | **api / auth / ws** | HTTP 客户端 / 认证 / WebSocket 中间件 | — |
357
356
  | `weifuwu/ui-dom` | **i18n** | 国际化中间件(运行时切换语言) | — |
@@ -373,7 +372,7 @@ cd apps/agent-platform && npm run seed && npm run dev
373
372
  | 渲染页面(SPA / SSR+hydrate) | `ui()` + `ssrPage(router)`;`uiServe(router, { root, hydrate })` | [docs/frontend-ui-dom.md](docs/frontend-ui-dom.md) · [docs/frontend.md](docs/frontend.md) |
374
373
  | 数据持久化 | `postgres()` → `` ctx.sql`SELECT *` `` · `redis()` → `ctx.redis` · **`sql.query`**(Query Language AST 双后端) | [docs/data.md](docs/data.md) |
375
374
  | 零数据库开发/测试 | `createMemorySql()` / `MemoryRedis`——契约同真库、替换成本为零 | [docs/data.md](docs/data.md) |
376
- | 数据管道(SSR 预取/hydration/SPA) | `ctx.data.get(key)` + `asyncComponent` | [docs/frontend.md](docs/frontend.md) |
375
+ | 数据管道(SSR 预取/hydration/SPA) | `ctx.data.get(key)` + async 组件 | [docs/frontend.md](docs/frontend.md) |
377
376
  | 用户注册/登录/会话/多租户 | `userSystem()` → `ctx.auth` + `/api/auth/*` | [docs/saas.md](docs/saas.md) |
378
377
  | 限流防爆破 | `rateLimit()` + `ctx.limit()` | [docs/saas.md](docs/saas.md) |
379
378
  | 发邮件 | `email()` → `ctx.email`(Resend/SMTP) | [docs/saas.md](docs/saas.md) |
@@ -417,7 +416,7 @@ const Counter = (_init, ctx) => {
417
416
  ```
418
417
 
419
418
  > 为什么不是单层函数(React 风格)?单层函数每次渲染都执行整个函数体,需要 hooks 记忆机制来区分"初始化"和"渲染";两阶段用**位置即语义**——外层天生只跑一次,没有 hooks 规则、没有依赖数组、没有闭包陷阱。
420
- > 异步数据用 `asyncComponent` 工厂(见下文):`async (ctx) => await ctx.data.get(...)` → 返回两阶段组件,数据经闭包注入。
419
+ > 异步数据用原生 async 组件(见下文):`async (initProps, ctx) => await ctx.data.get(...)` → 返回 renderFn,数据经闭包注入。
421
420
 
422
421
  ### 中间件模式(前后端一致)
423
422
 
@@ -447,20 +446,18 @@ const Counter = (_init, ctx) => {
447
446
 
448
447
  ### async 组件(三条纪律)
449
448
 
450
- `asyncComponent` "拿数据渲染页面"像写同步代码——三层结构:**工厂**(async,只执行一次,声明数据)→ **mount**(初始化 `$`)→ **render**(输出视图)。异步只在工厂边界:
449
+ async 组件让"拿数据渲染页面"像写同步代码——签名与同步组件一致,唯一差别是 `async` 关键字(**无需 asyncComponent 包装**):`async (initProps, ctx) => renderFn`。异步只在工厂边界:
451
450
 
452
451
  ```tsx
453
- const UserProfile = asyncComponent(async (ctx) => {
454
- const user = await ctx.data.get(`/api/user/${ctx.params.id}`) // ① 工厂层:声明数据
455
- return (_init, ctx) => {
456
- const $ = ctx.ui.$()
457
- $.liked = false // ② mount:客户端状态
458
- return (props) =>
459
- h('div', {},
460
- h('p', {}, user.name), // 服务端状态(闭包,SSR HTML)
461
- h('button', { onClick: () => $.liked = !$.liked }, $.liked ? '❤️' : '🤍'))
462
- }
463
- })
452
+ const UserProfile = async (_init, ctx) => {
453
+ const user = await ctx.data.get(`/api/user/${ctx.params.id}`) // ① 工厂层:声明数据(三场景自动)
454
+ const $ = ctx.ui.$()
455
+ $.liked = false // ② mount:客户端状态
456
+ return (props) =>
457
+ h('div', {},
458
+ h('p', {}, user.name), // 服务端状态(闭包,SSR 进 HTML)
459
+ h('button', { onClick: () => $.liked = !$.liked }, $.liked ? '❤️' : '🤍'))
460
+ }
464
461
  ```
465
462
 
466
463
  **三条纪律**(不遵守就是隐性 bug):
package/dist/index.js CHANGED
@@ -3963,22 +3963,34 @@ async function renderSsr(input, ctx) {
3963
3963
  if (vnode.type === Portal) return renderSsr(vnode.props?.children, ctx);
3964
3964
  if (vnode.type === Fragment) return renderSsr(vnode.props?.children, ctx);
3965
3965
  if (typeof vnode.type === "function") {
3966
- let def;
3966
+ const Comp = vnode.type;
3967
3967
  if (isAsyncComponent(vnode.type)) {
3968
- def = await vnode.type(ctx);
3968
+ const def = await vnode.type({}, ctx);
3969
3969
  if (typeof def !== "function") {
3970
3970
  throw new Error(
3971
3971
  `asyncComponent factory <${vnode.type.name || "anonymous"}> must return a Component (initProps, ctx) => (props) => VNode.`
3972
3972
  );
3973
3973
  }
3974
- } else {
3975
- def = vnode.type;
3974
+ const childCtx2 = Object.create(ctx);
3975
+ const renderFn2 = def(vnode.props ?? {}, childCtx2);
3976
+ if (typeof renderFn2 !== "function") {
3977
+ throw new Error(
3978
+ `Component ${Comp.name || "anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`
3979
+ );
3980
+ }
3981
+ return renderSsr(renderFn2(vnode.props ?? {}), childCtx2);
3976
3982
  }
3977
3983
  const childCtx = Object.create(ctx);
3978
- const renderFn = def(vnode.props ?? {}, childCtx);
3984
+ let renderFn;
3985
+ try {
3986
+ renderFn = Comp(vnode.props ?? {}, childCtx);
3987
+ } catch (e) {
3988
+ throw e;
3989
+ }
3990
+ if (renderFn instanceof Promise) renderFn = await renderFn;
3979
3991
  if (typeof renderFn !== "function") {
3980
3992
  throw new Error(
3981
- `Component ${vnode.type.name || "anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`
3993
+ `Component ${Comp.name || "anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`
3982
3994
  );
3983
3995
  }
3984
3996
  return renderSsr(renderFn(vnode.props ?? {}), childCtx);
@@ -13,7 +13,7 @@ export { UIRouter } from './router.ts';
13
13
  export type { UIRouterOptions, RouteMatch } from './router.ts';
14
14
  export { uiServe } from './serve.ts';
15
15
  export type { UIServeOptions, UIServeHandle } from './serve.ts';
16
- export { h, jsx, jsxs, jsxDEV, Fragment, Portal, createPortal } from './vnode.ts';
16
+ export { h, jsx, jsxs, jsxDEV, Fragment, Portal, createPortal, Placeholder, Suspense } from './vnode.ts';
17
17
  export type { VNode, VNodeChild, VNodeType, Component } from './vnode.ts';
18
18
  export { createReactiveState } from './reactive.ts';
19
19
  export { createClientBrowser } from './browser.ts';
@@ -1,18 +1,18 @@
1
- function Ln(e){let n=[],t=(e||"/").replace(/:(\w+)/g,(o,r)=>(n.push(r),"([^/]+)")).replace(/\*/g,".*");return{re:new RegExp(`^${t}$`),keys:n}}var Re=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 l=s.__routePath??o.getPath(),d=null;return l===r?d="/":(r==="/"?l!=="/"&&l.startsWith("/"):l.startsWith(r+"/"))&&(d=l.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}=Ln(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 l=this._middlewares[u],d=i;i=await l(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],l=i;i=await u(n,t,l)??l}return await i(n,t)}};function ae(){return{idCounter:0,idRegistry:new Map,unmountHooks:[],asyncFactoryCache:new WeakMap}}function D(e){return e?.__registry??ae()}function ye(e){return`_wf_${e.idCounter++}`}function ge(e,n){return e.unmountHooks.push(n),()=>{let t=e.unmountHooks.indexOf(n);t>=0&&e.unmountHooks.splice(t,1)}}function Le(e,n,t){let o=e.asyncFactoryCache.get(n);if(o)return o;let r={promise:null};return r.promise=Promise.resolve().then(()=>n(t)).then(c=>{if(typeof c!="function")throw new Error(`asyncComponent factory <${n.name||"anonymous"}> must return a Component (initProps, ctx) => (props) => VNode.`);return r.resolved=c,c}),e.asyncFactoryCache.set(n,r),r}async function Je(e,n,t){return Le(e,n,t).promise}function ze(e,n){return e.asyncFactoryCache.get(n)?.resolved}function Ae(e,n,t,o){try{e(n)}catch(r){console.error(`[weifuwu] ref ${t} error in <${o??"anonymous"}>`,r)}}function An(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"&&Ae(t.props.ref,null,"cleanup"),t._remoteEl&&(An(t,n),t._remoteEl.remove(),t._remoteEl=void 0)}function j(){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 Xe=j();function Qe(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 he(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},l=Xe.viewportWidth(),d=Xe.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>l-t&&(w=Math.max(t,w-(u.right-(l-t)))),u.left<t&&(w=Math.max(t,w+(t-u.left))),{top:m,left:w,width:e.width}}var oe=j();function Ze(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,he(g,w.panel?.(),w.margin)),d.push(m)}for(let[m,w]of t){let C=w.getScroller(),h=C instanceof Window?oe.scrollingElement()?.scrollTop??oe.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,oe.addEventListener("scroll",c,{capture:!0,passive:!0}),oe.addEventListener("resize",c))}function s(){o&&(oe.removeEventListener("scroll",c,{capture:!0}),oe.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 l(){s(),r&&(cancelAnimationFrame(r),r=0),n.clear(),t.clear()}return{popupTrackers:n,scrollTrackers:t,schedulePopupRecompute:c,ensurePopupListeners:i,destroyPopupListeners:s,cleanupTrackers:u,destroy:l}}var ve=j(),le=0,en="",nn="",tn="",on="",we=0;function rn(){return typeof window<"u"&&typeof document<"u"}function sn(){if(le++,le>1||!rn())return;we=ve.scrollTop();let e=ve.bodyElement();en=e.style.overflow,nn=e.style.position,tn=e.style.top,on=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=`-${we}px`,e.style.width="100%")}function an(){if(le===0||(le--,le>0)||!rn())return;let e=ve.bodyElement();e.style.overflow=en,e.style.position=nn,e.style.top=tn,e.style.width=on,we>0&&ve.scrollTo(we)}var Vn='a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])',Ve=j();function Ie(e){let n=e.querySelectorAll(Vn);if(n.length===0)return()=>{};let t=n[0],o=n[n.length-1],r=i=>{i.key==="Tab"&&(i.shiftKey&&Ve.activeElement()===t?(i.preventDefault(),o.focus()):!i.shiftKey&&Ve.activeElement()===o&&(i.preventDefault(),t.focus()))},c=Ve.activeElement();return queueMicrotask(()=>{t.focus()}),e.addEventListener("keydown",r),()=>{e.removeEventListener("keydown",r),c?.focus()}}var be=null;function q(){return be!==null||(be=typeof process<"u"&&process.env?.UI_DEBUG==="1"||globalThis.__UI_DEBUG===!0||typeof localStorage<"u"&&localStorage.getItem("__UI_DEBUG")==="1"),be}var Ue=0;function un(){return++Ue}function Ce(){return--Ue}var ln=new Map;function W(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 l=(n.get(s)??0)+1;n.set(s,l),(l<=5||l%100===0)&&W(u,s+" count="+l,{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 l=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"?l.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(l,d,m){if(Reflect.get(l,d)===m)return!0;Reflect.set(l,d,m),e();for(let C of r)C();return!0},get(l,d){let m=Reflect.get(l,d);return typeof m=="object"&&m!==null?c(m):m},deleteProperty(l,d){if(Reflect.has(l,d)){Reflect.deleteProperty(l,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 dn(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??Dn(),i=t?.record!==!1,s=[],u=(async()=>{let l;try{l=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(!l.ok){t?.onError?.({code:On(l.status),message:`HTTP ${l.status} ${l.statusText}`});return}try{for await(let{name:d,data:m}of Un(l.body)){if(o.signal.aborted)return;Hn(s,{name:d,data:m},i),In(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 In(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*Un(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 Un(e){let n=[],t=(e||"/").replace(/:(\w+)/g,(o,r)=>(n.push(r),"([^/]+)")).replace(/\*/g,".*");return{re:new RegExp(`^${t}$`),keys:n}}var Ae=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,l)=>{let u=s.__routePath??o.getPath(),d=null;return u===r?d="/":(r==="/"?u!=="/"&&u.startsWith("/"):u.startsWith(r+"/"))&&(d=u.slice(r.length)),d===null?l:async(p,v)=>{let b=await t._handle(d,p,v);return b===null?l(p,v):b}};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}=Un(o.path),i=n.match(r);if(!i)continue;let s={};for(let l=0;l<c.length;l++)s[c[l]]=decodeURIComponent(i[l+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 l=this._middlewares.length-1;l>=0;l--){let u=this._middlewares[l],d=i;i=await u(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 l=this._middlewares[s],u=i;i=await l(n,t,u)??u}return await i(n,t)}};function ae(){return{idCounter:0,idRegistry:new Map,unmountHooks:[],asyncFactoryCache:new WeakMap}}function D(e){return e?.__registry??ae()}function he(e){return`_wf_${e.idCounter++}`}function ve(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){let o=e.asyncFactoryCache.get(n);if(o)return o;let r={promise:null};return r.promise=Promise.resolve().then(()=>n(void 0,t)).then(c=>{if(typeof c!="function")throw new Error(`asyncComponent factory <${n.name||"anonymous"}> must return a Component (initProps, ctx) => (props) => VNode.`);return r.resolved=c,c}),e.asyncFactoryCache.set(n,r),r}async function Qe(e,n,t){return Ve(e,n,t).promise}function Ze(e,n){return e.asyncFactoryCache.get(n)?.resolved}function Ie(e,n,t,o){try{e(n)}catch(r){console.error(`[weifuwu] ref ${t} error in <${o??"anonymous"}>`,r)}}function Hn(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"&&Ie(t.props.ref,null,"cleanup"),t._remoteEl&&(Hn(t,n),t._remoteEl.remove(),t._remoteEl=void 0)}function j(){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 en=j();function nn(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 we(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,l={top:o.top+i,bottom:o.bottom+i,left:o.left+s,right:o.right+s},u=en.viewportWidth(),d=en.viewportHeight(),p=e.top,v=e.left;return l.bottom>d-t&&(p=Math.max(t,p-(l.bottom-(d-t)))),l.top<t&&(p=Math.max(t,p+(t-l.top))),l.right>u-t&&(v=Math.max(t,v-(l.right-(u-t)))),l.left<t&&(v=Math.max(t,v+(t-l.left))),{top:p,left:v,width:e.width}}var oe=j();function tn(e){let n=new Map,t=new Map,o=!1,r=0;function c(){r||(r=requestAnimationFrame(()=>{r=0;let d=[];for(let[p,v]of n){if(!v.isOpen())continue;let b=v.getEl();if(!b)continue;let g=b.getBoundingClientRect();if(g.width===0&&g.height===0)continue;let h=v.compute(g);Object.assign(v.pos,we(h,v.panel?.(),v.margin)),d.push(p)}for(let[p,v]of t){let b=v.getScroller(),g=b instanceof Window?oe.scrollingElement()?.scrollTop??oe.scrollTop():b.scrollTop??0;g!==v.handle.y&&(v.handle.y=g,d.push(p))}d.length>0&&e(d)}))}function i(){o||(o=!0,oe.addEventListener("scroll",c,{capture:!0,passive:!0}),oe.addEventListener("resize",c))}function s(){o&&(oe.removeEventListener("scroll",c,{capture:!0}),oe.removeEventListener("resize",c),o=!1)}function l(d){for(let p of[...n.keys()])(p.startsWith(`popup:${d}:`)||p===`popup:${d}`)&&n.delete(p);t.delete(d)}function u(){s(),r&&(cancelAnimationFrame(r),r=0),n.clear(),t.clear()}return{popupTrackers:n,scrollTrackers:t,schedulePopupRecompute:c,ensurePopupListeners:i,destroyPopupListeners:s,cleanupTrackers:l,destroy:u}}var be=j(),le=0,on="",rn="",sn="",an="",Ce=0;function ln(){return typeof window<"u"&&typeof document<"u"}function un(){if(le++,le>1||!ln())return;Ce=be.scrollTop();let e=be.bodyElement();on=e.style.overflow,rn=e.style.position,sn=e.style.top,an=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=`-${Ce}px`,e.style.width="100%")}function dn(){if(le===0||(le--,le>0)||!ln())return;let e=be.bodyElement();e.style.overflow=on,e.style.position=rn,e.style.top=sn,e.style.width=an,Ce>0&&be.scrollTo(Ce)}var On='a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])',Ue=j();function He(e){let n=e.querySelectorAll(On);if(n.length===0)return()=>{};let t=n[0],o=n[n.length-1],r=i=>{i.key==="Tab"&&(i.shiftKey&&Ue.activeElement()===t?(i.preventDefault(),o.focus()):!i.shiftKey&&Ue.activeElement()===o&&(i.preventDefault(),t.focus()))},c=Ue.activeElement();return queueMicrotask(()=>{t.focus()}),e.addEventListener("keydown",r),()=>{e.removeEventListener("keydown",r),c?.focus()}}var Te=null;function q(){return Te!==null||(Te=typeof process<"u"&&process.env?.UI_DEBUG==="1"||globalThis.__UI_DEBUG===!0||typeof localStorage<"u"&&localStorage.getItem("__UI_DEBUG")==="1"),Te}var Oe=0;function fn(){return++Oe}function Ee(){return--Oe}var cn=new Map;function W(e,n,t){if(!q())return;let o=(cn.get(e)??0)+1;cn.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:Oe,s=" ".repeat(Math.min(i,30));console.log(`[ui-debug] ${s}${e}#${o} ${n}`)}function Q(e){let n=new Map,t=(s,l)=>{let u=(n.get(s)??0)+1;n.set(s,u),(u<=5||u%100===0)&&W(l,s+" count="+u,{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 u=s instanceof Set?new Set(["add","delete","clear"]):new Set(["set","delete","clear"]),d=new Proxy(s,{get(p,v){let b=Reflect.get(p,v);return typeof b=="function"?u.has(String(v))?(...g)=>{let h=b.apply(p,g);e();for(let w of r)w();return h}:b.bind(p):b},set(p,v,b){Reflect.set(p,v,b),t(String(v),"set"),e();for(let g of r)g();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 l=new Proxy(s,{set(u,d,p){if(Reflect.get(u,d)===p)return!0;Reflect.set(u,d,p),e();for(let b of r)b();return!0},get(u,d){let p=Reflect.get(u,d);return typeof p=="object"&&p!==null?c(p):p},deleteProperty(u,d){if(Reflect.has(u,d)){Reflect.deleteProperty(u,d),e();for(let p of r)p()}return!0}});return o.set(s,l),l},i=c({});return Object.defineProperty(i,"__watch",{value:s=>(r.add(s),()=>{r.delete(s)}),writable:!1,enumerable:!1}),i}function pn(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??Fn(),i=t?.record!==!1,s=[],l=(async()=>{let u;try{u=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(!u.ok){t?.onError?.({code:qn(u.status),message:`HTTP ${u.status} ${u.statusText}`});return}try{for await(let{name:d,data:p}of Wn(u.body)){if(o.signal.aborted)return;jn(s,{name:d,data:p},i),Dn(d,p,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:l,traceId:c,events:s}}function Dn(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*Wn(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(`
2
2
 
3
- `);o=i.pop()??"";for(let s of i){let u="message",l="";for(let d of s.split(`
4
- `))d.startsWith("event: ")?u=d.slice(7):d.startsWith("data: ")&&(l+=d.slice(6));if(l)try{yield{name:u,data:JSON.parse(l)}}catch{}}}}finally{n.releaseLock()}}function Hn(e,n,t){t&&(e.length>=1e3&&e.shift(),e.push(n))}function On(e){return e===401||e===403?"auth_failed":e===429?"rate_limited":e>=500?"provider_error":"invalid_request"}function Dn(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`trace-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function Wn(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 cn(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(a=>a.call.id===x.toolCallId);S&&(S.progress=x);break}case"wf:tool_result":{let x=h,S=v?.toolCalls?.find(a=>a.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:Wn(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 l(){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:l,clear:d,approve:m,dispose:w}}var fn="__wfAsyncComponent";function jn(e){let n=e;return n[fn]=!0,n}function ee(e){return typeof e=="function"&&e?.[fn]===!0}var G=Symbol("Fragment"),B=Symbol("Portal");function Oe(e,n,t){return{type:e,props:pn(n),key:t??void 0}}var qn=Oe;function Fn(e,n,t){return Oe(e,n,t)}function $n(e,n,...t){let o=pn(n??{});return t.length>0&&(o.children=t.length===1?t[0]:t),{type:e,props:o,key:n?.key??void 0}}function pn(e){if(!e)return{};let n={};for(let t of Object.keys(e))t!=="key"&&(n[t]=e[t]);return n}function De(e,n){return{type:B,props:{children:e,portalKey:n},key:n??void 0,_placement:"remote"}}var Te=new Set,ue=new Map,Ee=new Map,de=new Map;function mn(e){let{ctx:n,renderByIds:t,getSelfId:o,dirtyBatch:r,dirtySet:c,mediaRegistry:i,popupTrackers:s,scrollTrackers:u,schedulePopupRecompute:l,ensurePopupListeners:d,isRendering:m,isMounting:w,setMounting:C,endMounting:h}=e,g=n.browser??j(),v=e.registry??D(n),x=a=>ge(v,a);return{_selfId:"_wf_root",_ctxVersion:0,_dirtySet:c,setMounting:C,endMounting:h,bumpCtxVersion:function(){this._ctxVersion++},render:function(a){if(m()){if(w())return;this._pendingRender||(this._pendingRender=!0,queueMicrotask(()=>{this._pendingRender=!1,this.render(a)}));return}if(!a||a.length===0){let f=o(this);if(f)a=[f];else return}t(a)},dirty:function(a){let f=this._selfId??"",p=this._debugDirty=(this._debugDirty??0)+1;if(W("dirty","self="+String(f).slice(0,20)+" ids="+JSON.stringify(a)+" 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(a)}));return}if(!a||a.length===0){let y=o(this);if(y)a=[y];else return}for(let y of a)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 a=this;if(!Object.prototype.hasOwnProperty.call(a,"_$cache")){let f=Q(()=>{let p=a._selfVNode?._id??o(a);p&&n.ui.dirty([p])});a._$cache=f}return a._$cache},useChat:function(a){let f=this.$(),p=cn(f,dn,a);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(a,f){let y=`media:${o(this)}:${a}`;if(!i.has(y)){let b=g.matchMedia(a);f(b.matches);let T=_=>f(_.matches);b.addEventListener("change",T),i.set(y,{mql:b,handler:T})}},useBreakpoint:function(a,f){let p=typeof a=="function"?{mobile:"(max-width: 639px)",tablet:"(min-width: 640px) and (max-width: 1023px)",desktop:"(min-width: 1024px)"}:a,y=typeof a=="function"?a:f,T=`bp:${o(this)}`;function _(){for(let[P,R]of Object.entries(p))if(g.matchMedia(R).matches)return P;return Object.keys(p)[0]??""}if(!i.has(T)){y(_());let P=[];for(let R of Object.values(p)){let H=g.matchMedia(R),U=()=>y(_());H.addEventListener("change",U),P.push({mql:H,handler:U})}i.set(T,{mqls:P})}},usePopupPosition:function(a){let f=o(this),p={top:0,left:0,refresh:()=>{}};if(!f)return p;let y={pos:p,getEl:a.el,isOpen:a.isOpen,compute:a.compute,panel:a.panel,margin:a.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,he(_,y.panel?.(),y.margin))},p},useHoverCapable:function(){return typeof window<"u"&&!!window.matchMedia?.("(hover: hover)").matches},useStableRef:function(a,f){return y=>{y?a(y):f?.()}},useVisualViewport:function(){let a=o(this),f={height:g.viewportHeight(),offsetTop:0,keyboardOpen:!1},p=()=>{n.ui&&n.ui.dirty(a?[a]: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),a){let T=x(_=>{_===a&&(b?.removeEventListener?(b.removeEventListener("resize",y),b.removeEventListener("scroll",y)):g.removeEventListener("resize",y),T())})}return f},usePopup:function(a){let f=o(this),p=this.useHoverCapable(),y=()=>typeof a.trigger=="function"?a.trigger():a.trigger,b=a.open!==void 0,T=()=>!!a.disabled?.(),_=()=>b?typeof a.open=="function"?!!a.open():!!a.open:a.isOpen(),P=N=>{T()||(b?a.onOpenChange?.(N):a.setOpen(N))},R=()=>{let N=a.placement;return typeof N=="function"?N():N??"bottom"},H=null,U=!1,L=n.ui.usePopupPosition({el:a.el,isOpen:()=>_(),compute:N=>{if(a.position){let A=a.position();return{top:A.y,left:A.x}}return Qe(N,R(),a.gap??6,a.center!==!1)},panel:()=>H,margin:a.margin??8}),k=N=>{if(a.closeOnOutside===!1||!_())return;let A=N.target;if(!(A instanceof Node))return;let K=a.el();K&&K.contains(A)||H&&H.contains(A)||P(!1)},M=N=>{a.closeOnEscape!==!1&&(N.key!=="Escape"||!_()||P(!1))};if(g.addEventListener("mousedown",k),g.addEventListener("keydown",M),f){let N=x(A=>{A===f&&(g.removeEventListener("mousedown",k),g.removeEventListener("keydown",M),N())})}let E={},V=N=>typeof N=="function"?N():N??0,I=()=>V(a.openDelay),Y=()=>V(a.closeDelay),J,z,xn=()=>{clearTimeout(J),clearTimeout(z),J=void 0,z=void 0},_n=N=>{if(T())return;let A=N.currentTarget,K=N.relatedTarget;A.contains(K)||(clearTimeout(z),z=void 0,J=setTimeout(()=>{J=void 0,P(!0)},I()))},Pn=N=>{if(T())return;let A=N.currentTarget,K=N.relatedTarget;A.contains(K)||(clearTimeout(J),J=void 0,z=setTimeout(()=>{z=void 0,P(!1)},Y()))},Nn=()=>{T()||(clearTimeout(z),z=void 0,J=setTimeout(()=>{J=void 0,P(!0)},I()))},kn=()=>{T()||(clearTimeout(J),J=void 0,z=setTimeout(()=>{z=void 0,P(!1)},Y()))},ie=()=>y()==="hover";if(E.onMouseOver=N=>{ie()&&_n(N)},E.onMouseOut=N=>{ie()&&Pn(N)},E.onClick=()=>{ie()?p||P(!_()):y()==="click"&&P(!0)},E.onFocus=()=>{ie()&&Nn()},E.onBlur=()=>{ie()&&kn()},y()==="longpress"){let N,A=0,K=0,X=()=>{clearTimeout(N),N=void 0};E.onPointerDown=$=>{T()||(A=$.clientX??0,K=$.clientY??0,X(),N=setTimeout(()=>{N=void 0,a.onTrigger?.({clientX:A,clientY:K}),P(!0)},a.longPressDuration??500))},E.onPointerUp=X,E.onPointerLeave=X,E.onPointerMove=$=>{let Se=Math.abs(($.clientX??0)-A),Me=Math.abs(($.clientY??0)-K);(Se>10||Me>10)&&X()},E.onContextMenu=$=>{$.preventDefault(),a.onTrigger?.({clientX:$.clientX??0,clientY:$.clientY??0}),P(!0)}}if(E.onKeyDown=N=>{N.key==="Escape"&&a.closeOnEscape!==!1&&P(!1)},f){let N=x(A=>{A===f&&(xn(),N())})}let Sn=N=>{if(N){H=N;let A=()=>L.refresh();N.addEventListener("animationend",A,{once:!0})}else H=null},Ne=null,ke=null,Mn=N=>{Sn(N),ke&&ke(N)};return{get open(){return _()},setOpen:P,wrapProps:E,portal:(N,A="popover")=>{if(T())return null;if(!_())return U=!1,Ne=null,null;let X=a.el();(!U||X!==Ne)&&(X?L.refresh():queueMicrotask(()=>{_()&&L.refresh()}),U=!0,Ne=X);let $=N.props??{};ke=$.ref??null;let Se=["wf-popup",$.class].filter(Boolean).join(" "),Me={...$.style??{},position:"fixed",top:`${L.top}px`,left:`${L.left}px`,maxWidth:a.width!==void 0?`min(${a.width}px, calc(100vw - 32px))`:"calc(100vw - 32px)"},Rn={...N,props:{...$,class:Se,style:Me,ref:Mn}};return De(Rn,A)},refresh:()=>L.refresh()}},useLongPress:function(a){let{onLongPress:f,duration:p=500}=a,y,b=0,T=0,_=null,P=()=>{clearTimeout(y),y=void 0};return{onPointerDown:R=>{b=R.clientX??0,T=R.clientY??0,_=R,P(),y=setTimeout(()=>{y=void 0,_&&f(_)},p)},onPointerUp:P,onPointerLeave:P,onPointerMove:R=>{let H=Math.abs((R.clientX??0)-b),U=Math.abs((R.clientY??0)-T);(H>10||U>10)&&P()},onContextMenu:R=>{R.preventDefault(),f(R)}}},useInView:function(a){let f=o(this),p={isIn:!1,ready:!1,observe:P,refresh:R,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 a.rootMargin=="function"?a.rootMargin():a.rootMargin,L=typeof a.threshold=="function"?a.threshold():a.threshold;b=new IntersectionObserver(k=>{let M=k[k.length-1];if(!M)return;let E=M.isIntersecting,V=E!==p.isIn,I=!p.ready;p.isIn=E,p.ready=!0,a.onChange?.(M,E),(V||I)&&T()},{root:a.root?a.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 R(){_()}function H(){b?.disconnect(),b=null}return p},useScrollPosition:function(a){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:a.getScroller??(()=>window)};return f?(u.set(f,y),d(),p.refresh(),p):(p.refresh(),p)},useAsync:function(a){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(()=>a()).then(_=>{y===T&&(p.data=_,p.loading=!1)}).catch(_=>{y===T&&(p.error=_,p.loading=!1)})};return b(),p.reload=b,p},useControlled:function(a){let f=o(this),p=a.value!==void 0;if(p&&!a.onChange&&a.name&&(Te.has(a.name)||(Te.add(a.name),console.warn(`[weifuwu/${a.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&&!ue.has(f)){ue.set(f,a.value);let b=x(T=>{T===f&&(ue.delete(f),b())})}let y=b=>{if(p){a.onChange?.(b);return}f&&ue.set(f,b),n.ui&&(f?n.ui.dirty([f]):n.ui.render())};return{value:p?a.value:f?ue.get(f):a.value,setValue:y,controlled:p}},useControlledInput:function(a){let f=o(this),p=this.useControlled({value:a.value,onChange:a.onChange,name:a.name});if(f&&!Ee.has(f)){Ee.set(f,{keyword:"",selectedLabel:""});let T=x(_=>{_===f&&(Ee.delete(f),T())})}let y=f?Ee.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(a){let f=o(this);if(f&&!de.has(f)){de.set(f,!1);let _=x(P=>{P===f&&(de.delete(f),_())})}let p=a.open!==void 0;p&&!a.onOpenChange&&a.name&&!Te.has(a.name)&&(Te.add(a.name),console.warn(`[weifuwu/${a.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?!!a.open:f?de.get(f)??!1:!1,b=()=>{f?n.ui?.dirty([f]):n.ui?.render()},T=_=>{if(p){a.onOpenChange?.(_);return}f&&de.set(f,_),b()};return{get open(){return y()},setOpen:T,triggerProps:{onClick:()=>T(!0),onFocus:()=>{a.openOnFocus&&T(!0)}}}},usePresence:function(a){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(a){let f=o(this),p,y=null,b=this.usePresence(a);return{get phase(){return b.phase},rootRef:P=>{P?(sn(),y&&(p=Ie(y)),b.ref(P)):(an(),p?.(),b.ref(null))},panelRef:P=>{y=P,P&&!p&&(p=Ie(P))},sync:P=>b.sync(P)}},useGlobalKey:function(a){let f=o(this);if(typeof window>"u")return()=>{};if(g.addEventListener("keydown",a),f){let p=x(y=>{y===f&&(g.removeEventListener("keydown",a),p())})}return()=>g.removeEventListener("keydown",a)},useDrag:function(a){let f=0,p=0,y=!1,b=P=>{y&&a.onMove(P,{x:P.clientX-f,y:P.clientY-p})},T=P=>{y&&(y=!1,g.removeEventListener("pointermove",b),g.removeEventListener("pointerup",T),a.onEnd?.(P))};return{onPointerDown:P=>{y||(P.preventDefault(),y=!0,f=P.clientX,p=P.clientY,g.addEventListener("pointermove",b),g.addEventListener("pointerup",T),a.onStart?.(P))}}},useDragDrop:function(a){let f={};a.onDrop&&(f.onDrop=y=>{y.preventDefault(),a.onDrop(y)}),a.onDragOver&&(f.onDragOver=y=>{y.preventDefault(),a.onDragOver(y)}),a.onDragLeave&&(f.onDragLeave=y=>a.onDragLeave(y));let p={draggable:!0};if(a.onDragStart){let y=a.onDragStart;p.onDragStart=b=>{typeof document<"u"&&document.body.classList.add("wf-dragging"),y(b)}}if(a.onDragEnd){let y=a.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(a,f){let p=null,y=()=>{a(),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(a,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=a,R={value:y?a:0,reset:()=>{}},H=()=>{n.ui&&(p?n.ui.dirty([p]):n.ui.render())},U=L=>{if(P=L,y){R.value=L,H();return}if(L===R.value)return;_&&cancelAnimationFrame(_);let k=R.value,M=performance.now(),E=V=>{let I=Math.min(1,(V-M)/b);R.value=Math.round(k+(L-k)*T(I)),I<1?(_=requestAnimationFrame(E),H()):(_=void 0,H())};_=requestAnimationFrame(E)};return R.reset=L=>{L===P&&_||U(L)},queueMicrotask(()=>U(a)),R},selfId:function(a){if(typeof a!="string"||!a)throw new Error(`[weifuwu] selfId requires a non-empty string, got ${typeof a}`);if(v.idRegistry.has(a))throw new Error(`[weifuwu] Duplicate component ID: "${a}". Each component must have a unique custom ID.`);let f=this._selfVNode;f&&(f._customId=a,v.idRegistry.set(a,f))}}}var yn=new WeakMap;function Bn(e){let n=yn.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 })")),yn.set(e,n)}function Z(e,n,t,o,r){if(q()){let l=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;W("patchValue","old="+l+" new="+d)}if(t==null){if(o==null)return null;let l=F(o,r);return l==null?null:(n&&n.parentNode?n.parentNode.insertBefore(l,n):e.appendChild(l),l)}if(o==null)return n?(O(t,D(r)),n.remove()):O(t,D(r)),null;let c=hn(t),i=hn(o);if(c!==i){O(t,D(r));let l=F(o,r);return l==null?null:(n?.parentNode&&n.parentNode.replaceChild(l,n),l)}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 l=s.type;u._render&&u.type===s.type&&(s._render=u._render,s._id=u._id,s._id&&D(r).idRegistry.set(s._id,s)),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=Yn(u.props,s.props),h=!m._dirtySet?.has(u._id),g=s._ctxVersion===m._ctxVersion,v=l?.name??"anon";if(q()){let f=l?.name??"anon";W("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=qe(l,s.props,s,d)}catch(f){let p=r.ui?._errorHandler;p?(p(f),x=null):(console.error(`[weifuwu] Component render error in <${l?.name||"anonymous"}> (id: ${u._id??"?"}, phase: update)`,f),x=null)}let S=u._child;s._child=x;let a=Z(e,n,S,x,d);return a&&!s._refNode?s._refNode=a:a||(s._refNode=null),a}if(s.type===G){let l=u._childNodes,d=wn(e,u,s,r,l);return s._childNodes=d,n}if(typeof s.type=="string"){if(n&&n.nodeType===1){let l=u.props?.ref,d=s.props?.ref;l!==d&&(typeof d=="function"&&d(n),typeof l=="function"&&typeof d=="function"&&Bn(n)),je(n,u.props,s.props),wn(n,u,s,r)}else if(n){O(t,D(r));let l=F(o,r);return l==null?null:(n.parentNode?.replaceChild(l,n),l)}else{let l=t.el??t._refNode;O(t,D(r)),l&&l.parentNode&&l.remove();let d=F(o,r);return d==null?null:(e.appendChild(d),d)}return n}if(s.type===B)return pe(u,s,r),null;if(Array.isArray(o)){let l=Array.isArray(t)?t:[];xe(l,o);let d=Array.from(e.childNodes),m=n?d.indexOf(n):-1,w=m>=0?ce(d.slice(m),l):ce(d,l);return _e(e,l,o,r,w,n),n}return n}var gn=new Map;function Kn(e){let n=gn.get(e);return n||(n=`fn:${e.name||"anon"}`,gn.set(e,n)),n}function hn(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"?Kn(n.type):n.type===G?"fragment":n.type===B?"portal":typeof n.type=="string"?"tag:"+n.type:"unknown"}function je(e,n,t){q()&&W("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",vn(u)):e.className=vn(u);else if(i==="style"&&typeof u=="object"&&u!==null){let l=e.style,d=u;for(let m of Object.keys(d)){let w=d[m];w==null?m.startsWith("--")?l.removeProperty(m):l[m]="":m.startsWith("--")?l.setProperty(m,String(w)):l[m]=typeof w=="number"?w+"px":String(w)}}else if(i.startsWith("on")&&typeof u=="function"){let l=i.slice(2).toLowerCase();typeof s=="function"&&e.removeEventListener(l,s),e.addEventListener(l,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 vn(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 We(e){if(!(e==null||typeof e!="object"))return Array.isArray(e)?void 0:e.key}function xe(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 ce(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 wn(e,n,t,o,r){q()&&W("patchChildren","old="+n.props?.children?.length+" new="+t.props?.children?.length);let c=fe(n.props?.children),i=fe(t.props?.children);xe(c,i);let s=r??Array.from(e.childNodes),u=ce(s,c),l=_e(e,c,i,o,u,r?.[0]??null),d=[];for(let m of l)m&&m.length>0&&d.push(...m);return d}function fe(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 bn(e){return e==null?[]:e instanceof DocumentFragment?Array.from(e.childNodes):[e]}function _e(e,n,t,o,r=[],c=null){if(q()&&W("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,D(o));for(let S of r[g]??[])S.remove()}}else if(v==null){let S=F(x,o);if(S!=null){let a=null;for(let f=g+1;f<r.length;f++){let p=r[f]?.[0];if(p&&p.parentNode===e){a=p;break}}a?e.insertBefore(S,a):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")&&We(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=We(n[h]);g!==void 0&&s.set(g,{vnode:n[h],nodes:r[h]??[],index:u++})}let l=t.map(h=>We(h)),d=new Set(l);for(let h of[...s.keys()])if(!d.has(h)){let g=s.get(h);O(g.vnode,D(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=l[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)pe(x.vnode,v,o),m[h]=[];else{let a=Z(e,null,x.vnode,v,o);m[h]=bn(a);for(let p of m[h])e.insertBefore(p,C);C=m[h][m[h].length-1]?.nextSibling??null}else if(S)re(v,o),m[h]=[];else{let a=F(v,o);m[h]=bn(a);for(let p of m[h])e.insertBefore(p,C);C=m[h][m[h].length-1]?.nextSibling??null}}return m}function Gn(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 Yn(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(!Gn(e[o],n[o]))return!1}else if(e[o]!==n[o])return!1}return!0}var ne=j(),Fe="http://www.w3.org/2000/svg",$e=new Set(["svg","path","circle","line","rect","text","g","polyline","polygon","ellipse","defs","use","clipPath","mask","linearGradient","radialGradient","stop","tspan"]);function F(e,n){let t=n.browser??ne;if(q()){let s=e!=null&&typeof e=="object"?e.type?.name??String(e.type).slice(0,20):typeof e;W("renderValue","type="+s,{depth:un()})}if(e==null||typeof e=="boolean")return q()&&Ce(),null;if(typeof e=="string"||typeof e=="number")return q()&&Ce(),t.createTextNode(String(e));if(Array.isArray(e)){let s=Xn(e,n);return q()&&Ce(),s}let o=e;if(o.type===B)return re(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 l of u){let d=F(l,n);d!=null&&s.appendChild(d)}return o._childNodes=Array.from(s.childNodes),s}if(typeof o.type=="function")return zn(o.type,o.props,o,n);let r=o.type,c=$e.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"||Cn(c,s,u);if("value"in(o.props??{})&&c instanceof HTMLSelectElement?i=o.props.value:"value"in(o.props??{})&&Cn(c,"value",o.props.value),"innerHTML"in(o.props??{}))c.innerHTML=String(o.props.innerHTML??"");else{let s=Be(o.props?.children);for(let u of s){let l=F(u,n);if(l!=null&&(c.appendChild(l),u&&typeof u=="object"&&typeof u.type=="function")){let d=u;d._parentNode||(d._parentNode=c,d._refNode=l)}}}return i!==void 0&&(c.value=String(i)),typeof o.props?.ref=="function"&&Ae(o.props.ref,c,"mount",r),c}function Jn(e){let n=e.ui;n&&typeof n.render=="function"&&n.render(["_wf_root"])}function qe(e,n,t,o){if(q()){let u=e?.name??(typeof e=="function"?"fn":typeof e);W("mountComponent",u+" 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??ne,i;if(ee(e)){if(i=ze(D(o),e),!i)return Le(D(o),e,o).promise.then(()=>Jn(o),()=>{}),null}else i=e;o.ui?.setMounting?.(!0);let s;try{s=i(n,o)}finally{o.ui?.endMounting?.()}if(typeof s!="function")throw new Error(`Component ${e.name||"anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`);return t._render=s,s(n)}function zn(e,n,t,o){let r=o.browser??ne;if(!t._id){let l=D(o);t._id=ye(l),l.idRegistry.set(t._id,t)}let c=Object.create(o);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=qe(e,n,t,c)}catch(l){let d=o.ui?._errorHandler;d?(d(l),s=null):(console.error(`[weifuwu] Component render error in <${e.name||"anonymous"}> (id: ${t._id??"?"}, phase: mount)`,l),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=F(s,c);return t._refNode||(t._refNode=u),u}function Xn(e,n){let o=(n.browser??ne).createDocumentFragment();for(let r of e){let c=F(r,n);c!=null&&o.appendChild(c)}return o}function Qn(){let e=ne,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 re(e,n){let t=n.browser??ne,o=Qn(),r=t.createElement("div");r.style.pointerEvents="auto",o.appendChild(r),e._remoteEl=r;let c=fe(e.props?.children);e._child=c;for(let i of c){let s=F(i,n);s!=null&&r.appendChild(s)}}function pe(e,n,t){let o=t.browser??ne,r=e?._remoteEl;if(n._remoteEl=r,!r){re(n,t);return}let c=fe(n.props?.children),i=e._child||[];n._child=c,xe(i,c);let s=ce(Array.from(r.childNodes),i);_e(r,i,c,t,s,s[0]?.[0]??null)}function Be(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 Cn(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 Zn(e,n,t){e.innerHTML="";let o=F(n,t);o instanceof Node&&e.appendChild(o)}function et(e){O(e,ae())}function Ke(e){e.node=e.node?e.node.nextSibling:null}function nt(e,n){e.node&&e.node.parentNode?e.node.parentNode.insertBefore(n,e.node):e.parent.appendChild(n)}function tt(e,n){e.node&&e.node.parentNode?(e.node.parentNode.replaceChild(n,e.node),Ke(e)):e.parent.appendChild(n)}async function me(e,n,t){let o=n.browser??j();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),Ke(t),t.node;let l=o.createTextNode(u);return nt(t,l),l}if(Array.isArray(e)){let u=null;for(let l of e){let d=await me(l,n,t);d!=null&&!u&&(u=d)}return u}let r=e;if(r.type===B||r.type===G){let u=r.props?.children,l=u==null?[]:Array.isArray(u)?u:[u],d=null;for(let m of l){let w=await me(m,n,t);w!=null&&!d&&(d=w)}return d}if(typeof r.type=="function")return ot(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,Ke(t)):(s=$e.has(c)?o.createElementNS(Fe,c):o.createElement(c),tt(t,s)),r.el=s,je(s,null,i),!("innerHTML"in i)){let u={parent:s,node:s.firstChild},l=Be(i.children);for(let d of l){let m=await me(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 ot(e,n,t){if(!e._id){let u=D(n);e._id=ye(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;ee(c)?u=await Je(D(n),c,o):u=c;let l=u(e.props??{},o);if(typeof l!="function")throw new Error(`Component ${c.name||"anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`);e._render=l,i=l(e.props??{})}catch(u){let l=n.ui?._errorHandler;l?(l(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 me(i,o,t);return e._refNode||(e._refNode=s),s}async function Ge(e,n,t){let o={parent:e,node:e.firstChild};for(await me(n,t,o);o.node;){let r=o.node;o.node=r.nextSibling,r.parentNode?.removeChild(r)}}function rt(e,n){let t=j(),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=ae(),s=new Set,u=0,l=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:{}},x=new Map,S=globalThis.__DATA__??window.__DATA__;if(S&&typeof S=="object")for(let[k,M]of Object.entries(S))x.set(k,{value:M});v.data={async get(k,M){let E=x.get(k);if(E&&"value"in E)return E.value;if(E?.promise)return E.promise;if(!M)return;let V=Promise.resolve().then(()=>M()).then(I=>(x.set(k,{value:I}),I));return x.set(k,{promise:V}),V},set(k,M){x.set(k,{value:M})},has(k){return x.has(k)}};let a=!1;function f(){s.size>0&&!a&&(a=!0,queueMicrotask(()=>{a=!1;let k=[...s];s.clear(),k.length>0&&(W("flushDirty","ids="+JSON.stringify(k)),p(k))}))}function p(k){if(!m){m=!0;for(let M of k){let E=i.idRegistry.get(M);if(!E||!E._render)continue;W("renderByIds-start",M+" render="+String(E._render.name).slice(0,30)),v.ui._dirtySet?.delete(M);let V=E._child,I=E._render(E.props);if(E._child=I,V&&V._placement==="remote"||I&&I._placement==="remote"){V&&I?pe(V,I,v):I?re(I,v):V&&O(V,i);continue}if(!E._parentNode&&E._refNode){let Y=E._refNode.parentNode;Y&&(E._parentNode=Y)}if(E._parentNode){let Y=Z(E._parentNode,E._refNode??null,V,I,v);Y&&Y!==E._refNode?E._refNode=Y:Y||(E._refNode=null)}W("renderByIds-done",M)}m=!1,f()}}let y=null;function b(){return y||(y=Ze(k=>v.ui.render(k))),y}v.browser=t,v.__registry=i,v.ui=mn({ctx:v,renderByIds:p,getSelfId:k=>k?._selfId??v.ui?._selfId,dirtyBatch:s,dirtySet:l,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}),ge(i,k=>{for(let M of[...d.keys()])if(M.startsWith(`media:${k}:`)||M===`bp:${k}`){let E=d.get(M);E?.mql&&E.handler&&E.mql.removeEventListener("change",E.handler),E?.mqls?.forEach(({mql:V,handler:I})=>V.removeEventListener("change",I)),d.delete(M)}b().cleanupTrackers(k)}),v.__rerender=()=>R(),v.app={navigate:k=>{e.mode==="hash"?t.setHash("#"+k):t.navigate(k),R()}};let T=null,_=!1,P=!1;function R(){P||(P=!0,queueMicrotask(()=>{P=!1,H()}))}async function H(){if(!_){W("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(()=>{_||R()});v.__state=E;let V=v.ui.$;v.ui.$=function(){return this&&this._selfVNode?V.call(this):E}}let M=await e.execute(window.location,v,k);if(T==null){if(M){let E=c&&r.firstElementChild?(Ge(r,M,v),r.firstChild):F(M,v);E&&E.parentNode!==r&&r.appendChild(E)}}else Z(r,r.firstChild,T,M,v);T=M}catch(k){if(console.error("[ui-dom] render error:",k),T==null){let M=t.createElement("div");M.className="ui-dom-error",M.textContent=`\u6E32\u67D3\u9519\u8BEF: ${k?.message??String(k)}`,r.appendChild(M)}}finally{_=!1}}}let U=()=>R();t.addEventListener("popstate",U);let L=()=>R();return e.mode==="hash"&&t.addEventListener("hashchange",L),R(),{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 st(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 se(e,n){return Object.assign(Object.create(e),n)}function it(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,l){let d=n.baseURL+s,m={method:i,headers:{...n.headers,...l?.headers}},w=e?.token?.();w&&!m.headers.Authorization&&(m.headers.Authorization=`Bearer ${w}`);let C=r>0,h=!!l?.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&&l.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 a=S.headers.get("content-length");if(S.status===204||a==="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=>se(i,{api:{get:(u,l)=>c("GET",u,void 0,l),post:(u,l,d)=>c("POST",u,l,d),put:(u,l,d)=>c("PUT",u,l,d),patch:(u,l,d)=>c("PATCH",u,l,d),delete:(u,l)=>c("DELETE",u,void 0,l)}})}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 at(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 lt(e){let n=at(e);return n?.exp?n.exp*1e3-3e4<Date.now():!0}function ut(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),l={token:s,user:u?JSON.parse(u):null,get isLoggedIn(){return this.token!==null},login(d,m,w){l.token=d,l.user=m,n.setItem(t,d),n.setItem(o,JSON.stringify(m)),w&&n.setItem(r,w)},logout(){l.token=null,l.user=null,n.removeItem(t),n.removeItem(o),n.removeItem(r)},setUser(d){l.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 l.logout(),!1;let w=await m.json();return l.token=w.token,n.setItem(t,w.token),w.refreshToken&&n.setItem(r,w.refreshToken),!0}catch{return!1}}};return s&&lt(s)&&l.refresh().catch(()=>{}),se(i,{auth:l})}}function dt(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,l=0,d=null,m=null,w=null,C=!1,h={isConnected:!1,onMessage:a=>(s.add(a),()=>{s.delete(a)}),send:a=>{u?.readyState===WebSocket.OPEN&&u.send(JSON.stringify(a))},_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,l=0,v()},u.onmessage=a=>{try{let f=JSON.parse(a.data);for(let p of s)p(f)}catch{}x()},u.onclose=()=>{h.isConnected=!1,S(),!C&&l<o&&(l++,d=setTimeout(g,t*Math.min(l,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(),se(i,{ws:h})}}function Pe(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}var ct=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]);function ft(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 pt(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 Tn(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 te(e,n){if(e==null||typeof e=="boolean")return"";if(typeof e=="string"||typeof e=="number")return Pe(String(e));if(Array.isArray(e)){let l="";for(let d of e)l+=await te(d,n);return l}let t=e;if(t.type===B||t.type===G)return te(t.props?.children,n);if(typeof t.type=="function"){let l;if(ee(t.type)){if(l=await t.type(n),typeof l!="function")throw new Error(`asyncComponent factory <${t.type.name||"anonymous"}> must return a Component (initProps, ctx) => (props) => VNode.`)}else l=t.type;let d=Object.create(n),m=l(t.props??{},d);if(typeof m!="function")throw new Error(`Component ${t.type.name||"anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`);return te(m(t.props??{}),d)}let o=t.type,r=t.props??{},c=[],i;for(let[l,d]of Object.entries(r))if(!(l==="children"||l==="key")&&l!=="ref"&&!(l.startsWith("on")&&typeof d=="function")){if(l==="innerHTML"){i=String(d??"");continue}if(l==="class"||l==="className"){let m=ft(d);m&&c.push(` class="${Pe(m)}"`);continue}if(l==="style"&&d&&typeof d=="object"){c.push(` style="${Pe(pt(d))}"`);continue}if(d===!0){c.push(` ${l}`);continue}d===!1||d==null||c.push(` ${l}="${Pe(String(d))}"`)}let s=c.join("");if(ct.has(o))return`<${o}${s}>`;if(i!==void 0)return`<${o}${s}>${i}</${o}>`;let u=await te(r.children,n);return`<${o}${s}>${u}</${o}>`}async function mt(e,n,t,o={}){let r=o.data??new Map,c=Tn(t,r);return await te({type:e,props:n??{},key:void 0},c)}function En(e){return`<script>window.__DATA__=${JSON.stringify(Object.fromEntries(e)).replace(/</g,"\\u003c")};<\/script>`}async function yt(e,n){let t=new Map,r=Tn({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),l=await te(u,r),d=En(t),m=i.title??n.title??"",w=n.rootId??"root",C=`<!DOCTYPE html>
3
+ `);o=i.pop()??"";for(let s of i){let l="message",u="";for(let d of s.split(`
4
+ `))d.startsWith("event: ")?l=d.slice(7):d.startsWith("data: ")&&(u+=d.slice(6));if(u)try{yield{name:l,data:JSON.parse(u)}}catch{}}}}finally{n.releaseLock()}}function jn(e,n,t){t&&(e.length>=1e3&&e.shift(),e.push(n))}function qn(e){return e===401||e===403?"auth_failed":e===429?"rate_limited":e>=500?"provider_error":"invalid_request"}function Fn(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`trace-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function $n(e){return e.map(n=>({role:n.role,content:n.content}))}function De(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`msg-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function mn(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 b=e.messages[e.messages.length-1];return b&&b.role==="assistant"&&b.status==="streaming"?b:void 0}function c(b,g,h){let w=r();switch(b){case"wf:token":w&&(w.content+=g.text);break;case"wf:tool_call":{w&&(w.toolCalls||(w.toolCalls=[]),w.toolCalls.push({call:g,status:"running"}));break}case"wf:tool_progress":{let x=g,S=w?.toolCalls?.find(a=>a.call.id===x.toolCallId);S&&(S.progress=x);break}case"wf:tool_result":{let x=g,S=w?.toolCalls?.find(a=>a.call.id===x.id);S&&(S.result=x,S.status=x.ok?"ok":"error");break}case"wf:approval_request":w&&(w.approval=g);break;case"wf:usage":w&&(w.usage=g);break;case"wf:step":e.step=g;break;case"wf:done":w&&(w.status="done",w.approval=void 0),e.streaming=!1,e.step=null;break;case"wf:error":w&&(w.status="error",w.error=g,w.approval=void 0),e.error=g,e.streaming=!1,e.step=null;break;default:h?.(b,g);break}}function i(){let b=t.body?t.body(e.messages):{messages:$n(e.messages)};o=n(t.url,b,{onToken:h=>c("wf:token",{text:h}),onToolCall:h=>c("wf:tool_call",h),onToolProgress:h=>c("wf:tool_progress",h),onToolResult:h=>c("wf:tool_result",h),onApproval:h=>c("wf:approval_request",h),onUsage:h=>c("wf:usage",h),onStep:h=>c("wf:step",h),onDone:h=>c("wf:done",h),onError:h=>c("wf:error",h),onEvent:(h,w)=>c(h,w,t.onEvent)},{signal:t.signal,headers:t.headers}),e.streaming=!0;let g=r();g&&o?.traceId&&(g.id=o.traceId)}function s(){if(e.streaming)return;let b=String(e.input??"").trim();b&&(e.input="",e.error=null,e.usage=null,e.step=null,e.messages.push({id:De(),role:"user",content:b,status:"done"},{id:De(),role:"assistant",content:"",status:"streaming",toolCalls:[]}),i())}function l(){o?.abort(),e.streaming=!1,e.step=null;let b=e.messages[e.messages.length-1];b&&b.role==="assistant"&&b.status==="streaming"&&(!b.content&&(!b.toolCalls||b.toolCalls.length===0)?e.messages.pop():b.status="done")}function u(){if(e.streaming)return;let b=-1;for(let g=e.messages.length-1;g>=0;g--)if(e.messages[g].role==="user"){b=g;break}b!==-1&&(e.messages.splice(b+1),e.error=null,e.usage=null,e.step=null,e.messages.push({id:De(),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 p(b,g){let h=e.messages[e.messages.length-1],w=h?.role==="assistant"?h.approval:void 0;if(w&&(h.approval=void 0,!!t.approveUrl))try{await fetch(t.approveUrl,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify({id:w.id,decision:b,note:g}),signal:t.signal})}catch(x){if(t.signal?.aborted)return;e.error={code:"provider_error",message:x instanceof Error?x.message:String(x)}}}function v(){o?.abort(),o=null}return{send:s,stop:l,retry:u,clear:d,approve:p,dispose:v}}var yn="__wfAsyncComponent";function Bn(e){let n=(async(t,o)=>e(o));return n[yn]=!0,n}function ne(e){return typeof e=="function"&&e?.[yn]===!0}var G=Symbol("Fragment"),B=Symbol("Portal"),ue=(e,n)=>{let t=n._suspense;return()=>t?.fallback??null},We=(e,n)=>t=>t.children;function je(e,n,t){return{type:e,props:gn(n),key:t??void 0}}var Kn=je;function Gn(e,n,t){return je(e,n,t)}function de(e,n,...t){let o=gn(n??{});return t.length>0&&(o.children=t.length===1?t[0]:t),{type:e,props:o,key:n?.key??void 0}}function gn(e){if(!e)return{};let n={};for(let t of Object.keys(e))t!=="key"&&(n[t]=e[t]);return n}function qe(e,n){return{type:B,props:{children:e,portalKey:n},key:n??void 0,_placement:"remote"}}var xe=new Set,ce=new Map,_e=new Map,fe=new Map;function hn(e){let{ctx:n,renderByIds:t,getSelfId:o,dirtyBatch:r,dirtySet:c,mediaRegistry:i,popupTrackers:s,scrollTrackers:l,schedulePopupRecompute:u,ensurePopupListeners:d,isRendering:p,isMounting:v,setMounting:b,endMounting:g}=e,h=n.browser??j(),w=e.registry??D(n),x=a=>ve(w,a);return{_selfId:"_wf_root",_ctxVersion:0,_dirtySet:c,setMounting:b,endMounting:g,bumpCtxVersion:function(){this._ctxVersion++},render:function(a){if(p()){if(v())return;this._pendingRender||(this._pendingRender=!0,queueMicrotask(()=>{this._pendingRender=!1,this.render(a)}));return}if(!a||a.length===0){let f=o(this);if(f)a=[f];else return}t(a)},dirty:function(a){let f=this._selfId??"",m=this._debugDirty=(this._debugDirty??0)+1;if(W("dirty","self="+String(f).slice(0,20)+" ids="+JSON.stringify(a)+" n="+m+" mounting="+v()+" rendering="+p(),{throttle:200}),m<=3&&q()&&console.trace("[ui-debug]","dirty-trace",String(f).slice(0,20)),!v()){if(p()){this._pendingDirty||(this._pendingDirty=!0,queueMicrotask(()=>{this._pendingDirty=!1,this.dirty(a)}));return}if(!a||a.length===0){let y=o(this);if(y)a=[y];else return}for(let y of a)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 a=this;if(!Object.prototype.hasOwnProperty.call(a,"_$cache")){let f=Q(()=>{let m=a._selfVNode?._id??o(a);m&&n.ui.dirty([m])});a._$cache=f}return a._$cache},useChat:function(a){let f=this.$(),m=mn(f,pn,a);Object.assign(f,{send:m.send,stop:m.stop,retry:m.retry,clear:m.clear,approve:m.approve,dispose:m.dispose});let y=o(this);if(y){let C=x(T=>{T===y&&(m.dispose(),C())})}return f},useMedia:function(a,f){let y=`media:${o(this)}:${a}`;if(!i.has(y)){let C=h.matchMedia(a);f(C.matches);let T=_=>f(_.matches);C.addEventListener("change",T),i.set(y,{mql:C,handler:T})}},useBreakpoint:function(a,f){let m=typeof a=="function"?{mobile:"(max-width: 639px)",tablet:"(min-width: 640px) and (max-width: 1023px)",desktop:"(min-width: 1024px)"}:a,y=typeof a=="function"?a:f,T=`bp:${o(this)}`;function _(){for(let[P,M]of Object.entries(m))if(h.matchMedia(M).matches)return P;return Object.keys(m)[0]??""}if(!i.has(T)){y(_());let P=[];for(let M of Object.values(m)){let H=h.matchMedia(M),U=()=>y(_());H.addEventListener("change",U),P.push({mql:H,handler:U})}i.set(T,{mqls:P})}},usePopupPosition:function(a){let f=o(this),m={top:0,left:0,refresh:()=>{}};if(!f)return m;let y={pos:m,getEl:a.el,isOpen:a.isOpen,compute:a.compute,panel:a.panel,margin:a.margin??8};return s.set(f,y),d(),m.refresh=()=>{let C=y.getEl();if(!C)return;let T=C.getBoundingClientRect();if(T.width===0&&T.height===0)return;let _=y.compute(T);Object.assign(m,we(_,y.panel?.(),y.margin))},m},useHoverCapable:function(){return typeof window<"u"&&!!window.matchMedia?.("(hover: hover)").matches},useStableRef:function(a,f){return y=>{y?a(y):f?.()}},useVisualViewport:function(){let a=o(this),f={height:h.viewportHeight(),offsetTop:0,keyboardOpen:!1},m=()=>{n.ui&&n.ui.dirty(a?[a]:void 0)},y=()=>{let T=h.visualViewport();f.height=T?.height??h.viewportHeight(),f.offsetTop=T?.offsetTop??0,f.keyboardOpen=f.height<h.viewportHeight()*.9,m()},C=h.visualViewport();if(C?.addEventListener?(C.addEventListener("resize",y),C.addEventListener("scroll",y)):h.addEventListener("resize",y),a){let T=x(_=>{_===a&&(C?.removeEventListener?(C.removeEventListener("resize",y),C.removeEventListener("scroll",y)):h.removeEventListener("resize",y),T())})}return f},usePopup:function(a){let f=o(this),m=this.useHoverCapable(),y=()=>typeof a.trigger=="function"?a.trigger():a.trigger,C=a.open!==void 0,T=()=>!!a.disabled?.(),_=()=>C?typeof a.open=="function"?!!a.open():!!a.open:a.isOpen(),P=N=>{T()||(C?a.onOpenChange?.(N):a.setOpen(N))},M=()=>{let N=a.placement;return typeof N=="function"?N():N??"bottom"},H=null,U=!1,L=n.ui.usePopupPosition({el:a.el,isOpen:()=>_(),compute:N=>{if(a.position){let A=a.position();return{top:A.y,left:A.x}}return nn(N,M(),a.gap??6,a.center!==!1)},panel:()=>H,margin:a.margin??8}),k=N=>{if(a.closeOnOutside===!1||!_())return;let A=N.target;if(!(A instanceof Node))return;let K=a.el();K&&K.contains(A)||H&&H.contains(A)||P(!1)},R=N=>{a.closeOnEscape!==!1&&(N.key!=="Escape"||!_()||P(!1))};if(h.addEventListener("mousedown",k),h.addEventListener("keydown",R),f){let N=x(A=>{A===f&&(h.removeEventListener("mousedown",k),h.removeEventListener("keydown",R),N())})}let E={},V=N=>typeof N=="function"?N():N??0,I=()=>V(a.openDelay),Y=()=>V(a.closeDelay),J,z,kn=()=>{clearTimeout(J),clearTimeout(z),J=void 0,z=void 0},Sn=N=>{if(T())return;let A=N.currentTarget,K=N.relatedTarget;A.contains(K)||(clearTimeout(z),z=void 0,J=setTimeout(()=>{J=void 0,P(!0)},I()))},Rn=N=>{if(T())return;let A=N.currentTarget,K=N.relatedTarget;A.contains(K)||(clearTimeout(J),J=void 0,z=setTimeout(()=>{z=void 0,P(!1)},Y()))},Mn=()=>{T()||(clearTimeout(z),z=void 0,J=setTimeout(()=>{J=void 0,P(!0)},I()))},Ln=()=>{T()||(clearTimeout(J),J=void 0,z=setTimeout(()=>{z=void 0,P(!1)},Y()))},ie=()=>y()==="hover";if(E.onMouseOver=N=>{ie()&&Sn(N)},E.onMouseOut=N=>{ie()&&Rn(N)},E.onClick=()=>{ie()?m||P(!_()):y()==="click"&&P(!0)},E.onFocus=()=>{ie()&&Mn()},E.onBlur=()=>{ie()&&Ln()},y()==="longpress"){let N,A=0,K=0,X=()=>{clearTimeout(N),N=void 0};E.onPointerDown=$=>{T()||(A=$.clientX??0,K=$.clientY??0,X(),N=setTimeout(()=>{N=void 0,a.onTrigger?.({clientX:A,clientY:K}),P(!0)},a.longPressDuration??500))},E.onPointerUp=X,E.onPointerLeave=X,E.onPointerMove=$=>{let Me=Math.abs(($.clientX??0)-A),Le=Math.abs(($.clientY??0)-K);(Me>10||Le>10)&&X()},E.onContextMenu=$=>{$.preventDefault(),a.onTrigger?.({clientX:$.clientX??0,clientY:$.clientY??0}),P(!0)}}if(E.onKeyDown=N=>{N.key==="Escape"&&a.closeOnEscape!==!1&&P(!1)},f){let N=x(A=>{A===f&&(kn(),N())})}let An=N=>{if(N){H=N;let A=()=>L.refresh();N.addEventListener("animationend",A,{once:!0})}else H=null},Se=null,Re=null,Vn=N=>{An(N),Re&&Re(N)};return{get open(){return _()},setOpen:P,wrapProps:E,portal:(N,A="popover")=>{if(T())return null;if(!_())return U=!1,Se=null,null;let X=a.el();(!U||X!==Se)&&(X?L.refresh():queueMicrotask(()=>{_()&&L.refresh()}),U=!0,Se=X);let $=N.props??{};Re=$.ref??null;let Me=["wf-popup",$.class].filter(Boolean).join(" "),Le={...$.style??{},position:"fixed",top:`${L.top}px`,left:`${L.left}px`,maxWidth:a.width!==void 0?`min(${a.width}px, calc(100vw - 32px))`:"calc(100vw - 32px)"},In={...N,props:{...$,class:Me,style:Le,ref:Vn}};return qe(In,A)},refresh:()=>L.refresh()}},useLongPress:function(a){let{onLongPress:f,duration:m=500}=a,y,C=0,T=0,_=null,P=()=>{clearTimeout(y),y=void 0};return{onPointerDown:M=>{C=M.clientX??0,T=M.clientY??0,_=M,P(),y=setTimeout(()=>{y=void 0,_&&f(_)},m)},onPointerUp:P,onPointerLeave:P,onPointerMove:M=>{let H=Math.abs((M.clientX??0)-C),U=Math.abs((M.clientY??0)-T);(H>10||U>10)&&P()},onContextMenu:M=>{M.preventDefault(),f(M)}}},useInView:function(a){let f=o(this),m={isIn:!1,ready:!1,observe:P,refresh:M,disconnect:H},y=null,C=null,T=()=>{n.ui&&n.ui.dirty(f?[f]:void 0)};function _(){if(C?.disconnect(),C=null,!y)return;let U=typeof a.rootMargin=="function"?a.rootMargin():a.rootMargin,L=typeof a.threshold=="function"?a.threshold():a.threshold;C=new IntersectionObserver(k=>{let R=k[k.length-1];if(!R)return;let E=R.isIntersecting,V=E!==m.isIn,I=!m.ready;m.isIn=E,m.ready=!0,a.onChange?.(R,E),(V||I)&&T()},{root:a.root?a.root():null,rootMargin:U??"0px",threshold:L??0}),C.observe(y)}function P(U){y=U,U?_():(C?.disconnect(),C=null,m.isIn=!1)}function M(){_()}function H(){C?.disconnect(),C=null}return m},useScrollPosition:function(a){let f=o(this),m={y:0,refresh(){let C=y.getScroller();m.y=C instanceof Window?h.scrollingElement()?.scrollTop??h.scrollTop():C.scrollTop??0}},y={handle:m,getScroller:a.getScroller??(()=>window)};return f?(l.set(f,y),d(),m.refresh(),m):(m.refresh(),m)},useAsync:function(a){let f=o(this),m=Q(()=>{n.ui&&n.ui.dirty(f?[f]:void 0)});m.loading=!0;let y=0,C=()=>{let T=++y;m.loading=!0,m.error=null,Promise.resolve().then(()=>a()).then(_=>{y===T&&(m.data=_,m.loading=!1)}).catch(_=>{y===T&&(m.error=_,m.loading=!1)})};return C(),m.reload=C,m},useControlled:function(a){let f=o(this),m=a.value!==void 0;if(m&&!a.onChange&&a.name&&(xe.has(a.name)||(xe.add(a.name),console.warn(`[weifuwu/${a.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)}`))),!m&&f&&!ce.has(f)){ce.set(f,a.value);let C=x(T=>{T===f&&(ce.delete(f),C())})}let y=C=>{if(m){a.onChange?.(C);return}f&&ce.set(f,C),n.ui&&(f?n.ui.dirty([f]):n.ui.render())};return{value:m?a.value:f?ce.get(f):a.value,setValue:y,controlled:m}},useControlledInput:function(a){let f=o(this),m=this.useControlled({value:a.value,onChange:a.onChange,name:a.name});if(f&&!_e.has(f)){_e.set(f,{keyword:"",selectedLabel:""});let T=x(_=>{_===f&&(_e.delete(f),T())})}let y=f?_e.get(f):{keyword:"",selectedLabel:""},C=()=>{f?n.ui?.dirty([f]):n.ui?.render()};return{...m,get keyword(){return y.keyword},setKeyword(T){y.keyword=T,C()},get selectedLabel(){return y.selectedLabel},setSelectedLabel(T){y.selectedLabel=T,C()}}},useOpen:function(a){let f=o(this);if(f&&!fe.has(f)){fe.set(f,!1);let _=x(P=>{P===f&&(fe.delete(f),_())})}let m=a.open!==void 0;m&&!a.onOpenChange&&a.name&&!xe.has(a.name)&&(xe.add(a.name),console.warn(`[weifuwu/${a.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=()=>m?!!a.open:f?fe.get(f)??!1:!1,C=()=>{f?n.ui?.dirty([f]):n.ui?.render()},T=_=>{if(m){a.onOpenChange?.(_);return}f&&fe.set(f,_),C()};return{get open(){return y()},setOpen:T,triggerProps:{onClick:()=>T(!0),onFocus:()=>{a.openOnFocus&&T(!0)}}}},usePresence:function(a){let f=o(this),m="closed",y,C=()=>{m="closed",n.ui&&(f?n.ui.dirty([f]):n.ui.render())};return{get phase(){return m},ref:_=>{_?y||(y=()=>{m==="exit"&&C()},_.addEventListener("animationend",y)):y=void 0},sync:_=>(_?m="open":m==="open"&&(m="exit"),m)}},useDialog:function(a){let f=o(this),m,y=null,C=this.usePresence(a);return{get phase(){return C.phase},rootRef:P=>{P?(un(),y&&(m=He(y)),C.ref(P)):(dn(),m?.(),C.ref(null))},panelRef:P=>{y=P,P&&!m&&(m=He(P))},sync:P=>C.sync(P)}},useGlobalKey:function(a){let f=o(this);if(typeof window>"u")return()=>{};if(h.addEventListener("keydown",a),f){let m=x(y=>{y===f&&(h.removeEventListener("keydown",a),m())})}return()=>h.removeEventListener("keydown",a)},useDrag:function(a){let f=0,m=0,y=!1,C=P=>{y&&a.onMove(P,{x:P.clientX-f,y:P.clientY-m})},T=P=>{y&&(y=!1,h.removeEventListener("pointermove",C),h.removeEventListener("pointerup",T),a.onEnd?.(P))};return{onPointerDown:P=>{y||(P.preventDefault(),y=!0,f=P.clientX,m=P.clientY,h.addEventListener("pointermove",C),h.addEventListener("pointerup",T),a.onStart?.(P))}}},useDragDrop:function(a){let f={};a.onDrop&&(f.onDrop=y=>{y.preventDefault(),a.onDrop(y)}),a.onDragOver&&(f.onDragOver=y=>{y.preventDefault(),a.onDragOver(y)}),a.onDragLeave&&(f.onDragLeave=y=>a.onDragLeave(y));let m={draggable:!0};if(a.onDragStart){let y=a.onDragStart;m.onDragStart=C=>{typeof document<"u"&&document.body.classList.add("wf-dragging"),y(C)}}if(a.onDragEnd){let y=a.onDragEnd;m.onDragEnd=C=>{typeof document<"u"&&document.body.classList.remove("wf-dragging"),y(C)}}return{dropProps:f,dragProps:m}},useReducedMotion:function(){return typeof window<"u"&&!!window.matchMedia?.("(prefers-reduced-motion: reduce)").matches},useAnimationEnd:function(a,f){let m=null,y=()=>{a(),f?.once&&m&&m.removeEventListener("animationend",y)};return T=>{T?(m=T,T.addEventListener("animationend",y)):m&&(m.removeEventListener("animationend",y),m=null)}},useTween:function(a,f){let m=o(this),y=this.useReducedMotion(),C=f?.duration??400,T=f?.ease==="linear"?L=>L:L=>1-Math.pow(1-L,3),_,P=a,M={value:y?a:0,reset:()=>{}},H=()=>{n.ui&&(m?n.ui.dirty([m]):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=V=>{let I=Math.min(1,(V-R)/C);M.value=Math.round(k+(L-k)*T(I)),I<1?(_=requestAnimationFrame(E),H()):(_=void 0,H())};_=requestAnimationFrame(E)};return M.reset=L=>{L===P&&_||U(L)},queueMicrotask(()=>U(a)),M},selfId:function(a){if(typeof a!="string"||!a)throw new Error(`[weifuwu] selfId requires a non-empty string, got ${typeof a}`);if(w.idRegistry.has(a))throw new Error(`[weifuwu] Duplicate component ID: "${a}". Each component must have a unique custom ID.`);let f=this._selfVNode;f&&(f._customId=a,w.idRegistry.set(a,f))}}}var vn=new WeakMap;function Yn(e){let n=vn.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 })")),vn.set(e,n)}function Z(e,n,t,o,r){if(q()){let u=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;W("patchValue","old="+u+" new="+d)}if(t==null){if(o==null)return null;let u=F(o,r);return u==null?null:(n&&n.parentNode?n.parentNode.insertBefore(u,n):e.appendChild(u),u)}if(o==null)return n?(O(t,D(r)),n.remove()):O(t,D(r)),null;let c=bn(t),i=bn(o);if(c!==i){O(t,D(r));let u=F(o,r);return u==null?null:(n?.parentNode&&n.parentNode.replaceChild(u,n),u)}if(i==="text")return n&&n.textContent!==String(o)&&(n.textContent=String(o)),n;let s=o,l=t;if(typeof s.type=="function"){let u=s.type;l.type===s.type&&(l._render||l._asyncDef)&&(l._render&&(s._render=l._render),s._id=l._id,s._id&&D(r).idRegistry.set(s._id,s)),l.type===s.type&&l._asyncDef&&(s._asyncDef=l._asyncDef),s._parentNode=e,n&&(s._refNode=n);let d=Object.create(r);d.ui=Object.create(r.ui);let p=d.ui;p._selfId=s._id,p._selfVNode=s,s._ctxVersion=l._ctxVersion??p._ctxVersion??0;let v=l._render&&l.type===s.type,b=Xn(l.props,s.props),g=!p._dirtySet?.has(l._id),h=s._ctxVersion===p._ctxVersion,w=u?.name??"anon";if(q()){let f=u?.name??"anon";W("tri-state-skip",f+" type="+v+" props="+b+" dirty="+g+" ver="+h)}if(v&&b&&g&&h)return s._child=l._child,n;p._dirtySet?.delete(l._id);let x;try{typeof s._render=="function"?x=s._render(s.props):x=Be(u,s.props,s,d)}catch(f){let m=r.ui?._errorHandler;m?(m(f),x=null):(console.error(`[weifuwu] Component render error in <${u?.name||"anonymous"}> (id: ${l._id??"?"}, phase: update)`,f),x=null)}let S=l._child;s._child=x;let a=Z(e,n,S,x,d);return a&&!s._refNode?s._refNode=a:a||(s._refNode=null),a}if(s.type===G){let u=l._childNodes,d=Tn(e,l,s,r,u);return s._childNodes=d,n}if(typeof s.type=="string"){if(n&&n.nodeType===1){let u=l.props?.ref,d=s.props?.ref;u!==d&&(typeof d=="function"&&d(n),typeof u=="function"&&typeof d=="function"&&Yn(n)),$e(n,l.props,s.props),Tn(n,l,s,r)}else if(n){O(t,D(r));let u=F(o,r);return u==null?null:(n.parentNode?.replaceChild(u,n),u)}else{let u=t.el??t._refNode;O(t,D(r)),u&&u.parentNode&&u.remove();let d=F(o,r);return d==null?null:(e.appendChild(d),d)}return n}if(s.type===B)return ye(l,s,r),null;if(Array.isArray(o)){let u=Array.isArray(t)?t:[];Pe(u,o);let d=Array.from(e.childNodes),p=n?d.indexOf(n):-1,v=p>=0?pe(d.slice(p),u):pe(d,u);return Ne(e,u,o,r,v,n),n}return n}var wn=new Map;function Jn(e){let n=wn.get(e);return n||(n=`fn:${e.name||"anon"}`,wn.set(e,n)),n}function bn(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"?Jn(n.type):n.type===G?"fragment":n.type===B?"portal":typeof n.type=="string"?"tag:"+n.type:"unknown"}function $e(e,n,t){q()&&W("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],l=t?.[i];if(i==="innerHTML")l!==s&&(e.innerHTML=String(l??""));else if(l!==s)if(i==="class"||i==="className")e instanceof SVGElement?e.setAttribute("class",Cn(l)):e.className=Cn(l);else if(i==="style"&&typeof l=="object"&&l!==null){let u=e.style,d=l;for(let p of Object.keys(d)){let v=d[p];v==null?p.startsWith("--")?u.removeProperty(p):u[p]="":p.startsWith("--")?u.setProperty(p,String(v)):u[p]=typeof v=="number"?v+"px":String(v)}}else if(i.startsWith("on")&&typeof l=="function"){let u=i.slice(2).toLowerCase();typeof s=="function"&&e.removeEventListener(u,s),e.addEventListener(u,l)}else i==="draggable"?e.setAttribute("draggable",l?"true":"false"):i==="value"&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)?e.value=String(l??""):l===!0?e.setAttribute(i,""):l!=null&&l!==!1?e.setAttribute(i,String(l)):i==="value"&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)?e.value="":e.removeAttribute(i)}}function Cn(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 Fe(e){if(!(e==null||typeof e!="object"))return Array.isArray(e)?void 0:e.key}function Pe(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 pe(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 Tn(e,n,t,o,r){q()&&W("patchChildren","old="+n.props?.children?.length+" new="+t.props?.children?.length);let c=me(n.props?.children),i=me(t.props?.children);Pe(c,i);let s=r??Array.from(e.childNodes),l=pe(s,c),u=Ne(e,c,i,o,l,r?.[0]??null),d=[];for(let p of u)p&&p.length>0&&d.push(...p);return d}function me(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 En(e){return e==null?[]:e instanceof DocumentFragment?Array.from(e.childNodes):[e]}function Ne(e,n,t,o,r=[],c=null){if(q()&&W("patchKeyedChildren","old="+n.length+" new="+t.length),!t.some(g=>g&&typeof g=="object"&&!Array.isArray(g)&&g.key!==void 0&&g._placement!=="remote")){let g=Math.max(n.length,t.length);for(let h=0;h<g;h++){let w=h<n.length?n[h]:null,x=h<t.length?t[h]:null;if(x==null){if(w!=null){O(w,D(o));for(let S of r[h]??[])S.remove()}}else if(w==null){let S=F(x,o);if(S!=null){let a=null;for(let f=h+1;f<r.length;f++){let m=r[f]?.[0];if(m&&m.parentNode===e){a=m;break}}a?e.insertBefore(S,a):e.appendChild(S)}}else{let S=r[h]?.[0]??null;Z(e,S,w,x,o)}}return[]}for(let g=0;g<n.length;g++){let h=n[g];if(!(h==null||typeof h=="boolean")&&Fe(h)===void 0)for(let w of r[g]??[])w.remove()}let s=new Map,l=0;for(let g=0;g<n.length;g++){let h=Fe(n[g]);h!==void 0&&s.set(h,{vnode:n[g],nodes:r[g]??[],index:l++})}let u=t.map(g=>Fe(g)),d=new Set(u);for(let g of[...s.keys()])if(!d.has(g)){let h=s.get(g);O(h.vnode,D(o));for(let w of h.nodes)w?.remove();s.delete(g)}let p=new Array(t.length).fill(null),v=-1,b=c&&c.parentNode===e?c:e.firstChild;for(let g=0;g<t.length;g++){let h=u[g],w=t[g],x=h!==void 0?s.get(h):void 0,S=w&&typeof w=="object"&&w._placement==="remote";if(x)if(x.nodes.length>0){if(x.index<v)for(let f of x.nodes)e.insertBefore(f,b);v=Math.max(v,x.index),Z(e,x.nodes[0],x.vnode,w,o),p[g]=w._childNodes??x.nodes.filter(f=>f.parentNode===e),b=p[g][p[g].length-1]?.nextSibling??null}else if(S)ye(x.vnode,w,o),p[g]=[];else{let a=Z(e,null,x.vnode,w,o);p[g]=En(a);for(let m of p[g])e.insertBefore(m,b);b=p[g][p[g].length-1]?.nextSibling??null}else if(S)re(w,o),p[g]=[];else{let a=F(w,o);p[g]=En(a);for(let m of p[g])e.insertBefore(m,b);b=p[g][p[g].length-1]?.nextSibling??null}}return p}function zn(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 Xn(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(!zn(e[o],n[o]))return!1}else if(e[o]!==n[o])return!1}return!0}var te=j(),Ke="http://www.w3.org/2000/svg",Ge=new Set(["svg","path","circle","line","rect","text","g","polyline","polygon","ellipse","defs","use","clipPath","mask","linearGradient","radialGradient","stop","tspan"]);function F(e,n){let t=n.browser??te;if(q()){let s=e!=null&&typeof e=="object"?e.type?.name??String(e.type).slice(0,20):typeof e;W("renderValue","type="+s,{depth:fn()})}if(e==null||typeof e=="boolean")return q()&&Ee(),null;if(typeof e=="string"||typeof e=="number")return q()&&Ee(),t.createTextNode(String(e));if(Array.isArray(e)){let s=Zn(e,n);return q()&&Ee(),s}let o=e;if(o.type===B)return re(o,n),null;if(o.type===G){let s=t.createDocumentFragment(),l=o.props?.children==null?[]:Array.isArray(o.props.children)?o.props.children:[o.props.children];for(let u of l){let d=F(u,n);d!=null&&s.appendChild(d)}return o._childNodes=Array.from(s.childNodes),s}if(typeof o.type=="function")return Qn(o.type,o.props,o,n);let r=o.type,c=Ge.has(r)?t.createElementNS(Ke,r):t.createElement(r);if(!c)return null;o.el=c;let i;for(let[s,l]of Object.entries(o.props??{}))s==="children"||s==="key"||s==="value"||s==="innerHTML"||_n(c,s,l);if("value"in(o.props??{})&&c instanceof HTMLSelectElement?i=o.props.value:"value"in(o.props??{})&&_n(c,"value",o.props.value),"innerHTML"in(o.props??{}))c.innerHTML=String(o.props.innerHTML??"");else{let s=Ye(o.props?.children);for(let l of s){let u=F(l,n);if(u!=null&&(c.appendChild(u),l&&typeof l=="object"&&typeof l.type=="function")){let d=l;d._parentNode||(d._parentNode=c,d._refNode=u)}}}return i!==void 0&&(c.value=String(i)),typeof o.props?.ref=="function"&&Ie(o.props.ref,c,"mount",r),c}function xn(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 Be(e,n,t,o){if(q()){let l=e?.name??(typeof e=="function"?"fn":typeof e);W("mountComponent",l+" 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??te,i;if(ne(e)){if(i=Ze(D(o),e),!i)return Ve(D(o),e,o).promise.then(()=>xn(o),()=>{}),de(ue,{})}else{let l=t._asyncDef;if(l instanceof Promise)return de(ue,{});if(typeof l=="function")return t._render=l,l(n);o.ui?.setMounting?.(!0);let u;try{u=e(n,o)}finally{o.ui?.endMounting?.()}if(u instanceof Promise){let p=u;return t._asyncDef=p,p.then(v=>{if(typeof v!="function")throw new Error(`Component ${e.name||"anonymous"} async factory must return a render function. (props) => VNode pattern.`);t._asyncDef=v,xn(o)},()=>{}),de(ue,{})}if(typeof u!="function")throw new Error(`Component ${e.name||"anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`);let d=u;return t._render=d,d(n)}o.ui?.setMounting?.(!0);let s;try{s=i(n,o)}finally{o.ui?.endMounting?.()}if(typeof s!="function")throw new Error(`Component ${e.name||"anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`);return t._render=s,s(n)}function Qn(e,n,t,o){let r=o.browser??te;if(!t._id){let u=D(o);t._id=he(u),u.idRegistry.set(t._id,t)}let c=Object.create(o);t.type===We&&(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=Be(e,n,t,c)}catch(u){let d=o.ui?._errorHandler;d?(d(u),s=null):(console.error(`[weifuwu] Component render error in <${e.name||"anonymous"}> (id: ${t._id??"?"}, phase: mount)`,u),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 l=F(s,c);return t._refNode||(t._refNode=l),l}function Zn(e,n){let o=(n.browser??te).createDocumentFragment();for(let r of e){let c=F(r,n);c!=null&&o.appendChild(c)}return o}function et(){let e=te,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 re(e,n){let t=n.browser??te,o=et(),r=t.createElement("div");r.style.pointerEvents="auto",o.appendChild(r),e._remoteEl=r;let c=me(e.props?.children);e._child=c;for(let i of c){let s=F(i,n);s!=null&&r.appendChild(s)}}function ye(e,n,t){let o=t.browser??te,r=e?._remoteEl;if(n._remoteEl=r,!r){re(n,t);return}let c=me(n.props?.children),i=e._child||[];n._child=c,Pe(i,c);let s=pe(Array.from(r.childNodes),i);Ne(r,i,c,t,s,s[0]?.[0]??null)}function Ye(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 _n(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 nt(e,n,t){e.innerHTML="";let o=F(n,t);o instanceof Node&&e.appendChild(o)}function tt(e){O(e,ae())}function Je(e){e.node=e.node?e.node.nextSibling:null}function ot(e,n){e.node&&e.node.parentNode?e.node.parentNode.insertBefore(n,e.node):e.parent.appendChild(n)}function rt(e,n){e.node&&e.node.parentNode?(e.node.parentNode.replaceChild(n,e.node),Je(e)):e.parent.appendChild(n)}async function ge(e,n,t){let o=n.browser??j();if(e==null||typeof e=="boolean")return null;if(typeof e=="string"||typeof e=="number"){let l=String(e);if(t.node&&t.node.nodeType===3)return t.node.textContent!==l&&(t.node.textContent=l),Je(t),t.node;let u=o.createTextNode(l);return ot(t,u),u}if(Array.isArray(e)){let l=null;for(let u of e){let d=await ge(u,n,t);d!=null&&!l&&(l=d)}return l}let r=e;if(r.type===B||r.type===G){let l=r.props?.children,u=l==null?[]:Array.isArray(l)?l:[l],d=null;for(let p of u){let v=await ge(p,n,t);v!=null&&!d&&(d=v)}return d}if(typeof r.type=="function")return st(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,Je(t)):(s=Ge.has(c)?o.createElementNS(Ke,c):o.createElement(c),rt(t,s)),r.el=s,$e(s,null,i),!("innerHTML"in i)){let l={parent:s,node:s.firstChild},u=Ye(i.children);for(let d of u){let p=await ge(d,n,l);if(p!=null&&p.parentNode!==s&&s.appendChild(p),d&&typeof d=="object"&&typeof d.type=="function"){let v=d;v._parentNode||(v._parentNode=s,v._refNode=p)}}for(;l.node;){let d=l.node;l.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 st(e,n,t){if(!e._id){let l=D(n);e._id=he(l),l.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 l;if(ne(c)?l=(await Qe(D(n),c,o))(e.props??{},o):(l=c(e.props??{},o),l instanceof Promise&&(l=await l)),typeof l!="function")throw new Error(`Component ${c.name||"anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`);e._render=l,i=l(e.props??{})}catch(l){let u=n.ui?._errorHandler;u?(u(l),i=null):(console.error(`[weifuwu] Component hydration error in <${c.name||"anonymous"}> (id: ${e._id??"?"})`,l),i=null)}if(i==null)return e._child=null,null;e._child=i;let s=await ge(i,o,t);return e._refNode||(e._refNode=s),s}async function ze(e,n,t){let o={parent:e,node:e.firstChild};for(await ge(n,t,o);o.node;){let r=o.node;o.node=r.nextSibling,r.parentNode?.removeChild(r)}}function it(e,n){let t=j(),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=ae(),s=new Set,l=0,u=new Set,d=new Map,p=!1,v=!1,b=[];function g(k){b.push(v),v=k}function h(){v=b.pop()??!1}let w={params:{},query:{}};w.__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});w.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 V=Promise.resolve().then(()=>R()).then(I=>(x.set(k,{value:I}),I));return x.set(k,{promise:V}),V},set(k,R){x.set(k,{value:R})},has(k){return x.has(k)}};let a=!1;function f(){s.size>0&&!a&&(a=!0,queueMicrotask(()=>{a=!1;let k=[...s];s.clear(),k.length>0&&(W("flushDirty","ids="+JSON.stringify(k)),m(k))}))}function m(k){if(!p){p=!0;for(let R of k){let E=i.idRegistry.get(R);if(!E||!E._render)continue;W("renderByIds-start",R+" render="+String(E._render.name).slice(0,30)),w.ui._dirtySet?.delete(R);let V=E._child,I=E._render(E.props);if(E._child=I,V&&V._placement==="remote"||I&&I._placement==="remote"){V&&I?ye(V,I,w):I?re(I,w):V&&O(V,i);continue}if(!E._parentNode&&E._refNode){let Y=E._refNode.parentNode;Y&&(E._parentNode=Y)}if(E._parentNode){let Y=Z(E._parentNode,E._refNode??null,V,I,w);Y&&Y!==E._refNode?E._refNode=Y:Y||(E._refNode=null)}W("renderByIds-done",R)}p=!1,f()}}let y=null;function C(){return y||(y=tn(k=>w.ui.render(k))),y}w.browser=t,w.__registry=i,w.ui=hn({ctx:w,renderByIds:m,getSelfId:k=>k?._selfId??w.ui?._selfId,dirtyBatch:s,dirtySet:u,mediaRegistry:d,popupTrackers:C().popupTrackers,scrollTrackers:C().scrollTrackers,schedulePopupRecompute:C().schedulePopupRecompute,ensurePopupListeners:C().ensurePopupListeners,destroyPopupListeners:C().destroyPopupListeners,isRendering:()=>p,isMounting:()=>v,setMounting:g,endMounting:h,registry:i}),ve(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:V,handler:I})=>V.removeEventListener("change",I)),d.delete(R)}C().cleanupTrackers(k)}),w.__rerender=()=>M(),w.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(!_){W("doRender","path="+e.getPath()),_=!0;try{let k=e.getPath();if(w.route={path:k,params:w.params,query:w.query},!w.__state){let E=Q(()=>{_||M()});w.__state=E;let V=w.ui.$;w.ui.$=function(){return this&&this._selfVNode?V.call(this):E}}let R=await e.execute(window.location,w,k);if(T==null){if(R){let E=c&&r.firstElementChild?(ze(r,R,w),r.firstChild):F(R,w);E&&E.parentNode!==r&&r.appendChild(E)}}else{let E=Z(r,r.firstChild,T,R,w);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 w},close(){t.removeEventListener("popstate",U),e.mode==="hash"&&t.removeEventListener("hashchange",L),T&&O(T,i),C().destroy(),i.idRegistry.clear(),r.innerHTML="",T=null}}}function at(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 se(e,n){return Object.assign(Object.create(e),n)}function lt(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,l,u){let d=n.baseURL+s,p={method:i,headers:{...n.headers,...u?.headers}},v=e?.token?.();v&&!p.headers.Authorization&&(p.headers.Authorization=`Bearer ${v}`);let b=r>0,g=!!u?.signal,h=null,w=null;(b||g)&&(h=new AbortController,p.signal=h.signal,b&&(w=setTimeout(()=>h.abort(new Error("Request timed out")),r)),g&&u.signal.addEventListener("abort",()=>h.abort())),l!==void 0&&i!=="GET"&&i!=="HEAD"&&(p.body=JSON.stringify(l));let x={url:d,init:p};t&&(x=t(x));try{let S=await fetch(x.url,x.init);if(o)return o(S);if(!S.ok){let m=await S.text().catch(()=>"");throw new Xe(S.status,m||S.statusText)}let a=S.headers.get("content-length");if(S.status===204||a==="0")return;let f=(S.headers.get("content-type")||"").toLowerCase();return f.includes("application/json")||f.includes("json")?S.json():S.text()}finally{w&&clearTimeout(w)}}return i=>se(i,{api:{get:(l,u)=>c("GET",l,void 0,u),post:(l,u,d)=>c("POST",l,u,d),put:(l,u,d)=>c("PUT",l,u,d),patch:(l,u,d)=>c("PATCH",l,u,d),delete:(l,u)=>c("DELETE",l,void 0,u)}})}var Xe=class extends Error{status;body;constructor(n,t){super(`API Error ${n}: ${t}`),this.name="ApiError",this.status=n,this.body=t}};function ut(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 dt(e){let n=ut(e);return n?.exp?n.exp*1e3-3e4<Date.now():!0}function ct(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),l=n.getItem(o),u={token:s,user:l?JSON.parse(l):null,get isLoggedIn(){return this.token!==null},login(d,p,v){u.token=d,u.user=p,n.setItem(t,d),n.setItem(o,JSON.stringify(p)),v&&n.setItem(r,v)},logout(){u.token=null,u.user=null,n.removeItem(t),n.removeItem(o),n.removeItem(r)},setUser(d){u.user=d,n.setItem(o,JSON.stringify(d))},async refresh(){let d=n.getItem(r);if(!d)return!1;try{let p=await fetch(c,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:d})});if(!p.ok)return u.logout(),!1;let v=await p.json();return u.token=v.token,n.setItem(t,v.token),v.refreshToken&&n.setItem(r,v.refreshToken),!0}catch{return!1}}};return s&&dt(s)&&u.refresh().catch(()=>{}),se(i,{auth:u})}}function ft(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,l=null,u=0,d=null,p=null,v=null,b=!1,g={isConnected:!1,onMessage:a=>(s.add(a),()=>{s.delete(a)}),send:a=>{l?.readyState===WebSocket.OPEN&&l.send(JSON.stringify(a))},_connect:h,close:()=>{b=!0,S(),l?.close(),l=null,g.isConnected=!1}};async function h(){if(!b)try{l=new WebSocket(n),l.onopen=()=>{g.isConnected=!0,u=0,w()},l.onmessage=a=>{try{let f=JSON.parse(a.data);for(let m of s)m(f)}catch{}x()},l.onclose=()=>{g.isConnected=!1,S(),!b&&u<o&&(u++,d=setTimeout(h,t*Math.min(u,5)))},l.onerror=()=>{l?.close()}}catch{b||(d=setTimeout(h,t))}}function w(){r<=0||(p=setInterval(()=>{l?.readyState===WebSocket.OPEN&&l.send(JSON.stringify({type:"ping"})),v=setTimeout(()=>{l?.close()},c)},r))}function x(){clearTimeout(v)}function S(){clearInterval(p),clearTimeout(v),clearTimeout(d)}return h(),se(i,{ws:g})}}function ke(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}var pt=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]);function mt(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 yt(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 Pn(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:l=>{s.value=l}};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 l=await s();return n.set(i,l),l},set(i,s){n.set(i,s)},has(i){return n.has(i)}},c}async function ee(e,n){if(e==null||typeof e=="boolean")return"";if(typeof e=="string"||typeof e=="number")return ke(String(e));if(Array.isArray(e)){let u="";for(let d of e)u+=await ee(d,n);return u}let t=e;if(t.type===B||t.type===G)return ee(t.props?.children,n);if(typeof t.type=="function"){let u=t.type;if(ne(t.type)){let v=await t.type({},n);if(typeof v!="function")throw new Error(`asyncComponent factory <${t.type.name||"anonymous"}> must return a Component (initProps, ctx) => (props) => VNode.`);let b=Object.create(n),g=v(t.props??{},b);if(typeof g!="function")throw new Error(`Component ${u.name||"anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`);return ee(g(t.props??{}),b)}let d=Object.create(n),p;try{p=u(t.props??{},d)}catch(v){throw v}if(p instanceof Promise&&(p=await p),typeof p!="function")throw new Error(`Component ${u.name||"anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`);return ee(p(t.props??{}),d)}let o=t.type,r=t.props??{},c=[],i;for(let[u,d]of Object.entries(r))if(!(u==="children"||u==="key")&&u!=="ref"&&!(u.startsWith("on")&&typeof d=="function")){if(u==="innerHTML"){i=String(d??"");continue}if(u==="class"||u==="className"){let p=mt(d);p&&c.push(` class="${ke(p)}"`);continue}if(u==="style"&&d&&typeof d=="object"){c.push(` style="${ke(yt(d))}"`);continue}if(d===!0){c.push(` ${u}`);continue}d===!1||d==null||c.push(` ${u}="${ke(String(d))}"`)}let s=c.join("");if(pt.has(o))return`<${o}${s}>`;if(i!==void 0)return`<${o}${s}>${i}</${o}>`;let l=await ee(r.children,n);return`<${o}${s}>${l}</${o}>`}async function gt(e,n,t,o={}){let r=o.data??new Map,c=Pn(t,r);return await ee({type:e,props:n??{},key:void 0},c)}function Nn(e){return`<script>window.__DATA__=${JSON.stringify(Object.fromEntries(e)).replace(/</g,"\\u003c")};<\/script>`}async function ht(e,n){let t=new Map,r=Pn({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}`),l=await e.execute(s,r,c),u=await ee(l,r),d=Nn(t),p=i.title??n.title??"",v=n.rootId??"root",b=`<!DOCTYPE html>
7
7
  <html lang="${n.lang??"zh-CN"}">
8
8
  <head>
9
9
  <meta charset="UTF-8">
10
10
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
11
- ${m?`<title>${m}</title>`:""}
11
+ ${p?`<title>${p}</title>`:""}
12
12
  </head>
13
13
  <body>
14
- <div id="${w}">${l}</div>
14
+ <div id="${v}">${u}</div>
15
15
  ${d}
16
16
  <script src="/app.js"><\/script>
17
17
  </body>
18
- </html>`;return{html:l,dataScript:d,page:C}}export{G as Fragment,B as Portal,Re as UIRouter,st as animateOut,it as api,jn as asyncComponent,ut as auth,et as callRefCleanup,j as createClientBrowser,De as createPortal,Q as createReactiveState,$n as h,Ge as hydrateVNode,ee as isAsyncComponent,Oe as jsx,Fn as jsxDEV,qn as jsxs,Zn as mountVNode,Z as patchValue,En as serializeData,yt as ssrPage,mt as ssrToString,rt as uiServe,dt as ws};
18
+ </html>`;return{html:u,dataScript:d,page:b}}export{G as Fragment,ue as Placeholder,B as Portal,We as Suspense,Ae as UIRouter,at as animateOut,lt as api,Bn as asyncComponent,ct as auth,tt as callRefCleanup,j as createClientBrowser,qe as createPortal,Q as createReactiveState,de as h,ze as hydrateVNode,ne as isAsyncComponent,je as jsx,Gn as jsxDEV,Kn as jsxs,nt as mountVNode,Z as patchValue,Nn as serializeData,ht as ssrPage,gt as ssrToString,it as uiServe,ft as ws};
@@ -1 +1 @@
1
- var r=Symbol("Fragment");function o(e,t,n){return{type:e,props:i(t),key:n??void 0}}var s=o;function p(e,t,n){return o(e,t,n)}function i(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,p as jsxDEV,s as jsxs};
1
+ var r=Symbol("Fragment");function o(e,t,n){return{type:e,props:p(t),key:n??void 0}}var s=o;function i(e,t,n){return o(e,t,n)}function p(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,i as jsxDEV,s as jsxs};
@@ -21,7 +21,11 @@ export declare function renderValue(v: VNodeChild, ctx: WfuiContext): Node | nul
21
21
  * resolved 记录已解析的定义(同步快速路径用)。
22
22
  * (缓存本体在 registry.ts,本文件仅保留依赖 render 的调度函数)
23
23
  */
24
- /** 占位完成后整树重渲染(async 工厂已解析,diff 收敛到目标位置) */
24
+ /**
25
+ * 占位完成后整树重渲染(async 工厂已解析,diff 收敛到目标位置)。
26
+ * 优先走 serve 的调度(重新执行 handler → 新树 → diff 传递 _asyncDef);
27
+ * 无 serve 注入(SSR/独立渲染)时回退 ui.render(['_wf_root'])。
28
+ */
25
29
  export declare function scheduleFullReRender(ctx: WfuiContext): void;
26
30
  /**
27
31
  * 同步 mount 组件(async 工厂占位策略):
@@ -34,6 +34,8 @@ export interface VNode {
34
34
  _parentNode?: Node;
35
35
  /** 组件输出的第一个 DOM 节点 */
36
36
  _refNode?: Node | null;
37
+ /** 原生 async 组件缓存(vnode 级按实例):in-flight Promise → resolved renderFn(diff 传递继承) */
38
+ _asyncDef?: ((props: Record<string, unknown>) => VNode | null) | Promise<((props: Record<string, unknown>) => VNode | null)> | null;
37
39
  /** Fragment 展开后的多个直属 DOM 节点范围(diff 对齐用,见 diff.ts) */
38
40
  _childNodes?: Node[];
39
41
  /** 组件 mount/render 时的 ctx 版本号(供三态 skip 判定) */
@@ -45,37 +47,48 @@ export interface VNode {
45
47
  */
46
48
  export type Component<P = {}, C extends object = {}> = (initProps: P, ctx: WfuiContext & C) => ((props: P) => VNode | null) | null;
47
49
  /**
48
- * 异步组件工厂(形态 C):async (ctx) => (initProps, ctx) => (props) => VNode
50
+ * 异步组件(统一签名——与 Component 同参,唯一差别是 async):
51
+ * async (initProps, ctx) => Promise<renderFn | null>
49
52
  *
50
- * 工厂层(async,只执行一次并缓存):
51
- * - 数据声明:const data = await ctx.data.get(key, fetcher)
52
- * - 代码分割:const { default: def } = await import('./view.tsx')
53
- * - 异步初始化:模块加载、共享资源
53
+ * 渲染器统一判别「返回值 instanceof Promise」:
54
+ * 客户端:占位 resolve 后整树重渲染(vnode _asyncDef 按实例缓存)
55
+ * SSR:直接 await(无占位)
54
56
  *
55
- * 返回标准的 Component——mount/render 保持同步,异步只发生在工厂边界。
56
- * 服务端遍历器与客户端渲染器都 await 工厂;更新路径(_render 缓存)不碰工厂。
57
- *
58
- * 必须用 asyncComponent() 包装以标记(渲染器据此区分调用约定):
59
- * Component → Comp(initProps, ctx)
60
- * AsyncComponent → await Comp(ctx) → Component
57
+ * asyncComponent() 是兼容包装(工厂签名 (ctx),WeakMap 全局一次——代码分割场景)。
61
58
  */
62
- export type AsyncComponent<C extends object = {}, P = {}> = (ctx: WfuiContext & C) => Promise<Component<P, C>>;
59
+ export type AsyncComponent<C extends object = {}, P = {}> = (initProps: P, ctx: WfuiContext & C) => Promise<Component<P, C> | null>;
63
60
  /**
64
- * 包装异步组件工厂。
61
+ * 兼容包装:async 工厂(旧签名 (ctx),WeakMap 全局一次——代码分割/昂贵一次性资源)。
62
+ * 统一为原生 async 组件签名 (initProps, ctx) => Promise<Component>,渲染器原生处理。
65
63
  *
66
64
  * ```tsx
67
65
  * const UserProfile = asyncComponent(async (ctx) => {
68
- * const user = await ctx.data.get(`/api/user/${ctx.params.id}`)
69
- * return (initProps, ctx) => (props) => h('div', {}, user.name)
66
+ * const { default: def } = await import('./view.tsx')
67
+ * return def
70
68
  * })
71
69
  * ```
72
70
  */
73
- export declare function asyncComponent<C extends object = {}, P = {}>(factory: AsyncComponent<C, P>): AsyncComponent<C, P>;
71
+ export declare function asyncComponent<C extends object = {}, P = {}>(factory: (ctx: WfuiContext & C) => Promise<Component<P, C>>): AsyncComponent<C, P>;
74
72
  /** 判定一个组件类型是否为 async 工厂(asyncComponent 包装过) */
75
73
  export declare function isAsyncComponent(type: any): type is AsyncComponent;
76
74
  export declare const Fragment: unique symbol;
77
75
  /** Portal — 将子 VNode 渲染到 document.body 下的独立容器 */
78
76
  export declare const Portal: unique symbol;
77
+ /**
78
+ * 占位显示策略组件(原生 async 组件未 resolve 时的占位 vnode)。
79
+ * 渲染时查 ctx 原型链上最近的 Suspense 边界:有 → fallback;无 → null(向后兼容)。
80
+ */
81
+ export declare const Placeholder: Component;
82
+ /**
83
+ * Suspense 边界(可选):子树内 async 组件占位时显示 fallback。
84
+ * 渲染器对 type === Suspense 的组件在 childCtx 挂 _suspense(Object.create 继承 → 子树可见)。
85
+ * 语义:占位处局部显示 fallback(非 React 整树回滚);无边界时占位为 null。
86
+ *
87
+ * ```tsx
88
+ * h(Suspense, { fallback: h(Spinner) }, h(UserProfile, {}))
89
+ * ```
90
+ */
91
+ export declare const Suspense: Component;
79
92
  /** JSX 类型声明 — 使 TypeScript 理解自定义 JSX 运行时 */
80
93
  export declare function jsx(type: VNodeType, props: Record<string, any> | null, key?: string | null): VNode;
81
94
  export declare const jsxs: typeof jsx;
@@ -124,20 +124,21 @@ const ChatPanel: Component = (_init, ctx) => {
124
124
 
125
125
  ## 5. 异步组件(数据声明在工厂层)
126
126
 
127
+ 组件 = 函数,async 组件 = async 函数——**不需要包装**,签名与同步组件一致:
128
+
127
129
  ```tsx
128
- import { asyncComponent } from 'weifuwu/client'
129
-
130
- const UserCard = asyncComponent(async (ctx) => {
131
- const user = await ctx.data.get(`/api/user/${ctx.route.params.id}`) // 工厂层取数(SSR 序列化进 HTML)
132
- return (_init, ctx) => {
133
- const $ = ctx.ui.$()
134
- $.liked = false
135
- return (props) => h('div', {}, user.name, h('button', { onClick: () => $.liked = !$.liked }))
136
- }
137
- })
130
+ const UserCard = async (initProps, ctx) => {
131
+ const user = await ctx.data.get(`/api/user/${initProps.userId}`) // 三场景:SSR→__DATA__ / hydration 种子 / SPA fetch
132
+ const $ = ctx.ui.$()
133
+ $.liked = false
134
+ return (props) => h('div', {}, user.name, h('button', { onClick: () => $.liked = !$.liked }))
135
+ }
138
136
  ```
139
137
 
140
- - 工厂只执行一次(WeakMap 缓存);客户端首次渲染占位 → resolve 后整树补全;服务端直接 await(无占位)
138
+ - 渲染器按「返回值是 Promise」判别:客户端未 resolve 占位(`Placeholder`),resolve 后整树补全;SSR 直接 await(无占位)
139
+ - 工厂按实例执行;**数据必须走 ctx.data**(缓存+并发合并,重复执行零成本);禁止副作用裸写工厂
140
+ - 占位显示:无边界 → null;`<Suspense fallback={...}>` → 占位处显示 fallback(可选)
141
+ - 代码分割/昂贵一次性资源:`asyncComponent(async (ctx) => { const { default: def } = await import('./view'); return def })`(WeakMap 全局一次,兼容保留)
141
142
  - **个性化数据不进 ctx.data**(SSR 会序列化给所有客户端)——留在客户端 `$` + fetch
142
143
 
143
144
  ## 6. 类型纪律(编译期防线)
@@ -145,7 +145,7 @@ uiServe(app, { root: '#root', hydrate: true })
145
145
  ```
146
146
 
147
147
  - SSR 时 `ctx.data.get` 写入 dataStore → `__DATA__` 脚本;hydrate 从种子同步命中
148
- - renderSsr:组件两阶段 + asyncComponent await(数据 per-request)/ Portal 内联 / 事件剥离
148
+ - renderSsr:组件两阶段 + async 组件 await(数据 per-request)/ Portal 内联 / 事件剥离
149
149
  - SSR 确定性:ui 19 原语 shim 全 no-op(不启动监听/会话);渲染期非确定性由开发者规避
150
150
 
151
151
  ## ctx 注入
package/docs/frontend.md CHANGED
@@ -754,25 +754,21 @@ const UserProfile: Component = (initProps, ctx) => {
754
754
  }
755
755
  ```
756
756
 
757
- ### asyncComponent 工厂(async 组件)— 同步式数据声明
757
+ ### async 组件(原生——无需 asyncComponent 包装)
758
758
 
759
- `async (ctx) => (initProps, ctx) => (props) => VNode` — 工厂层(async,只执行一次并缓存)声明数据/加载代码,mount/render 保持同步。数据经闭包注入组件,渲染无 loading 分支:
759
+ 组件 = 函数,async 组件 = async 函数:签名与同步组件一致 `(initProps, ctx) => renderFn`,渲染器按「返回值是 Promise」原生判别。数据经闭包注入,渲染无 loading 分支:
760
760
 
761
761
  ```tsx
762
- import { asyncComponent } from 'weifuwu/client'
763
-
764
- const UserProfile = asyncComponent(async (ctx) => {
765
- const user = await ctx.data.get(`/api/user/${ctx.params.id}`)
766
- return (_init, ctx) => {
767
- const $ = ctx.ui.$()
768
- $.liked = false // 客户端状态(交互后变化)
769
- return (props) =>
770
- h('div', {},
771
- h('p', {}, user.name), // 服务端状态(闭包,SSR 进 HTML)
772
- h('button', { onClick: () => $.liked = !$.liked }, $.liked ? '❤️' : '🤍'),
773
- )
774
- }
775
- })
762
+ const UserProfile = async (initProps, ctx) => {
763
+ const user = await ctx.data.get(`/api/user/${initProps.userId}`) // 三场景:SSR→__DATA__ / hydration 种子 / SPA fetch
764
+ const $ = ctx.ui.$()
765
+ $.liked = false // 客户端状态(交互后变化)
766
+ return (props) =>
767
+ h('div', {},
768
+ h('p', {}, user.name), // 服务端状态(闭包,SSR 进 HTML)
769
+ h('button', { onClick: () => $.liked = !$.liked }, $.liked ? '❤️' : '🤍'),
770
+ )
771
+ }
776
772
  ```
777
773
 
778
774
  - **客户端**:首次渲染占位 → 工厂 resolve 后整树重渲染补全(SPA);数据经 `ctx.data` 缓存(hydration 时从 `__DATA__` 同步命中,不重跑请求)
package/docs/realtime.md CHANGED
@@ -93,17 +93,17 @@ app.get('/style.css', (req, ctx) => ctx.ui.css('weifuwu/components/style.css'))
93
93
 
94
94
  ### ctx.ui.ssr — SSR 渲染组件 → HTML
95
95
 
96
- 将组件(含 async 工厂组件)在服务端渲染为完整 HTML 片段,数据经 `ctx.data` 预取并序列化进 `window.__DATA__`(客户端 hydration 时同步命中,不重跑请求):
96
+ 将组件(含 async 组件)在服务端渲染为完整 HTML 片段,数据经 `ctx.data` 预取并序列化进 `window.__DATA__`(客户端 hydration 时同步命中,不重跑请求):
97
97
 
98
98
  ```ts
99
- const BlogPage = asyncComponent(async (ctx) => {
99
+ const BlogPage = async (initProps, ctx) => {
100
100
  const post = await ctx.data.get(`/api/posts/${ctx.params.slug}`, fetchPost)
101
- return (_init, ctx) => () =>
101
+ return () =>
102
102
  h('article', {},
103
103
  h('h1', {}, post.title),
104
104
  h('div', { innerHTML: post.body }),
105
105
  )
106
- })
106
+ }
107
107
 
108
108
  app.get('/blog/:slug', async (req, ctx) => {
109
109
  const data = new Map()
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "weifuwu",
3
3
  "type": "module",
4
- "version": "0.73.1",
4
+ "version": "0.74.0",
5
5
  "description": "AI SaaS framework — (req, ctx) => Response",
6
6
  "exports": {
7
7
  ".": {