weifuwu 0.64.0 → 0.65.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 +11 -3
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.js +4 -3
- package/dist/client/locale/en_US.d.ts +2 -0
- package/dist/client/locale/zh_CN.d.ts +2 -0
- package/dist/client/types.d.ts +159 -0
- package/dist/components/ContextMenu/ContextMenu.d.ts +3 -1
- package/dist/components/InfiniteScroll/InfiniteScroll.d.ts +3 -1
- package/dist/components/Resizable/Resizable.d.ts +3 -1
- package/dist/components/index.js +12 -13
- package/dist/index.js +59 -0
- package/docs/components-map.md +153 -0
- package/docs/components.md +346 -1
- package/docs/custom-components.md +237 -0
- package/docs/environment.md +32 -8
- package/docs/frontend.md +93 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -30,7 +30,13 @@ npm install weifuwu # 一个依赖,完整应用栈
|
|
|
30
30
|
|
|
31
31
|
> ⚠️ **注意:前后端都有 `ctx.ui`,但用途完全不同**
|
|
32
32
|
> - **后端** `ctx.ui`(SSR/编译):`ctx.ui.html`(HTML 模板)、`ctx.ui.js`(TSX→JS 动态编译)、`ctx.ui.css`(CSS 编译)、`ctx.ui.ssr`(组件 SSR)、`ctx.ui.ssrData`(数据序列化)
|
|
33
|
-
> - **前端** `ctx.ui
|
|
33
|
+
> - **前端** `ctx.ui`(渲染引擎,26 方法):
|
|
34
|
+
> - 渲染:`$()`(响应式状态)/ `render()` / `dirty()` / `selfId()`(跨组件刷新)
|
|
35
|
+
> - 状态:`useControlled()`(受控/非受控)/ `useStableRef()`(稳定 ref)
|
|
36
|
+
> - 弹层:`usePopup()`(组合器)/ `useDialog()`(对话框)/ `usePopupPosition()`(定位)
|
|
37
|
+
> - 事件:`useInView()` / `useScrollPosition()` / `useMedia()` / `useBreakpoint()` / `useGlobalKey()` / `useDrag()` / `useDragDrop()` / `useHoverCapable()` / `useLongPress()` / `useVisualViewport()`
|
|
38
|
+
> - 动画:`useAnimationEnd()`(完成回调)/ `usePresence()`(显隐状态机)/ `useTween()`(数值补间)/ `useReducedMotion()`(偏好感知)
|
|
39
|
+
> - AI/数据:`useChat()`(AI 会话)/ `useAsync()`(异步取数)
|
|
34
40
|
> 后端的是「把页面和代码交给浏览器」,前端的是「在浏览器里驱动 UI」。
|
|
35
41
|
|
|
36
42
|
### 与主流方案的关系
|
|
@@ -44,7 +50,7 @@ npm install weifuwu # 一个依赖,完整应用栈
|
|
|
44
50
|
| 认证 / 消息 / 队列 | **随包内置、互相咬合** | 自选 + 自缝 | 自选 + 自缝 |
|
|
45
51
|
| 部署 | 一个 Node 进程 + PG + Redis | 各组件自理 | 平台绑定 |
|
|
46
52
|
|
|
47
|
-
> 定位不是「替代某个框架」,而是**包换包**:用 weifuwu 一个依赖替换你原本要缝合的整套栈。心智模型有借鉴(两阶段组件接近 React、中间件接近 Express),但每一层都是自研的确定性实现——组件模型见[核心概念](#核心概念),与 antd/Element Plus/shadcn 的对应见
|
|
53
|
+
> 定位不是「替代某个框架」,而是**包换包**:用 weifuwu 一个依赖替换你原本要缝合的整套栈。心智模型有借鉴(两阶段组件接近 React、中间件接近 Express),但每一层都是自研的确定性实现——组件模型见[核心概念](#核心概念),与 antd/Element Plus/shadcn 的对应见 [docs/components-map.md](docs/components-map.md)。
|
|
48
54
|
|
|
49
55
|
### 从这里开始
|
|
50
56
|
|
|
@@ -339,7 +345,7 @@ cd apps/agent-platform && npm run seed && npm run dev
|
|
|
339
345
|
| `weifuwu/client` | **ErrorBoundary** | 错误边界组件 | createApp |
|
|
340
346
|
| `weifuwu/client` | **lockScroll/trapFocus** | 滚动锁定 / 焦点陷阱工具 | — |
|
|
341
347
|
| `weifuwu/client` | **popup** | 弹层 fixed 定位工具(`computeFixedPos` / `computeFixedPosRect` / `clampToViewport`) | — |
|
|
342
|
-
| `weifuwu/client` |
|
|
348
|
+
| `weifuwu/client` | **事件原语** | `usePopup` / `useDialog` / `usePresence` / `useInView` / `useScrollPosition` / `useGlobalKey` / `useDrag` / `useDragDrop` / `useAnimationEnd` / `useTween` / `useReducedMotion`(浏览器事件/动画统一入口,见 [docs/mobile.md](docs/mobile.md)) | — |
|
|
343
349
|
| `weifuwu/components` | **92 个组件** | Button/Table/Modal/Confirm/Toast/... + `confirm()` / `toast()` 命令式中间件 | weifuwu/client |
|
|
344
350
|
| `weifuwu/layout` | **CSS 布局** | 70 个布局原语 + 141 个主题 Token(也支持 `weifuwu/layout/style.css`) | — |
|
|
345
351
|
|
|
@@ -495,6 +501,8 @@ README 只保留入门内容(设计理念 / 快速开始 / 核心概念 / 模
|
|
|
495
501
|
| [docs/examples.md](docs/examples.md) | 组合场景示例:登录表单 / 数据列表 + 搜索 / 消息提示 |
|
|
496
502
|
| [docs/environment.md](docs/environment.md) | 环境变量与开发命令 |
|
|
497
503
|
| [docs/mobile.md](docs/mobile.md) | 移动端开发指南:断点 / 44px 命中区 / usePopup / 手势 / safe-area |
|
|
504
|
+
| [docs/components-map.md](docs/components-map.md) | 组件速查:weifuwu ↔ antd / Element Plus / shadcn 对应 + 迁移路径 |
|
|
505
|
+
| [docs/custom-components.md](docs/custom-components.md) | 自定义组件开发指南:usePopup / useControlled / 动画 / AI 组件 / 类型纪律 |
|
|
498
506
|
| [design/](design/) | 设计与计划文档(组件地图 / AI 协议契约 / 移动端指南 / 数据库客户端计划 / 设计系统 / 各阶段计划) |
|
|
499
507
|
|
|
500
508
|
> `docs/` 用户文档随 npm 包发布(`files: ['dist/', 'README.md', 'docs/']`)——`node_modules/weifuwu/docs` 可离线查阅;`design/` 设计/计划文档仅仓库内。
|
package/dist/client/index.d.ts
CHANGED
|
@@ -40,6 +40,8 @@ export { ErrorBoundary } from './error-boundary.ts';
|
|
|
40
40
|
export type { ErrorBoundaryProps } from './error-boundary.ts';
|
|
41
41
|
export { i18n } from './i18n.ts';
|
|
42
42
|
export type { I18nOptions, I18nState, I18nInjected } from './i18n.ts';
|
|
43
|
+
export { createReactiveState } from './reactive.ts';
|
|
44
|
+
export type { ReactiveState } from './types.ts';
|
|
43
45
|
export { lockScroll, unlockScroll } from './scroll-lock.ts';
|
|
44
46
|
export { trapFocus } from './focus-trap.ts';
|
|
45
47
|
export { mountVNode, callRefCleanup, clearAsyncComponentCache } from './render.ts';
|
package/dist/client/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
var Se="__wfAsyncComponent";function rn(e){let n=e;return n[Se]=!0,n}function z(e){return typeof e=="function"&&e?.[Se]===!0}var j=Symbol("Fragment"),H=Symbol("Portal");function de(e,n,t){return{type:e,props:Re(n),key:t??void 0}}var sn=de;function an(e,n,t){return de(e,n,t)}function ln(e,n,...t){let o=Re(n??{});return t.length>0&&(o.children=t.length===1?t[0]:t),{type:e,props:o,key:n?.key??void 0}}function Re(e){if(!e)return{};let n={};for(let t of Object.keys(e))t!=="key"&&(n[t]=e[t]);return n}function pe(e,n){return{type:H,props:{children:e,portalKey:n},key:n??void 0,_placement:"remote"}}var un=0,R=new Map,ee=[];function B(e){ee.push(e)}var ne=new WeakMap;function G(){ne=new WeakMap}function me(e,n){let t=ne.get(e);if(t)return t;let o={promise:null};return o.promise=Promise.resolve().then(()=>e(n)).then(r=>{if(typeof r!="function")throw new Error(`asyncComponent factory <${e.name||"anonymous"}> must return a Component (initProps, ctx) => (props) => VNode.`);return o.resolved=r,r}),ne.set(e,o),o}async function Le(e,n){return me(e,n).promise}function Me(e){return ne.get(e)?.resolved}function cn(e){let n=e._child;if(n!=null)if(Array.isArray(n))for(let t of n)t&&typeof t=="object"&&S(t);else typeof n=="object"&&S(n)}function S(e){if(e==null||typeof e!="object")return;let n=e;if(n._id){if(n._customId&&R.delete(n._customId),R.delete(n._id),ee.length>0){for(let t of ee)t(n._id);if(n._customId)for(let t of ee)t(n._customId)}n._id=void 0,n._customId=void 0,n._render=void 0,n._parentNode=void 0,n._refNode=void 0}if(n._child!=null){if(Array.isArray(n._child))for(let t of n._child)t&&typeof t=="object"&&S(t);else S(n._child);n._child=void 0}if(n.props?.children&&typeof n.type=="string"){let t=Array.isArray(n.props.children)?n.props.children:[n.props.children];for(let o of t)o&&typeof o=="object"&&S(o)}typeof n.props?.ref=="function"&&n.props.ref(null),n._remoteEl&&(cn(n),n._remoteEl.remove(),n._remoteEl=void 0)}function J(){return`_wf_${un++}`}var We=new WeakMap;function fn(e){let n=We.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 })")),We.set(e,n)}function q(e,n,t,o,r){if(t==null){if(o==null)return null;let f=O(o,r);return f==null?null:(n&&n.parentNode?n.parentNode.insertBefore(f,n):e.appendChild(f),f)}if(o==null)return n?(S(t),n.remove()):S(t),null;let s=Ve(t),i=Ve(o);if(s!==i){S(t);let f=O(o,r);return f==null?null:(n?.parentNode&&n.parentNode.replaceChild(f,n),f)}if(i==="text")return n&&n.textContent!==String(o)&&(n.textContent=String(o)),n;let c=o,a=t;if(typeof c.type=="function"){let f=c.type;a._render&&(c._render=a._render,c._id=a._id,c._id&&R.set(c._id,c)),c._parentNode=e,c._refNode=n;let m=Object.create(r);if(m.ui=Object.create(r.ui),m.ui._selfId=c._id,m.ui._selfVNode=c,c._ctxVersion=a._ctxVersion??m.ui._ctxVersion??0,a._render&&mn(a.props,c.props)&&!m.ui._dirtySet?.has(a._id)&&c._ctxVersion===m.ui._ctxVersion)return c._child=a._child,n;m.ui._dirtySet?.delete(a._id);let y;try{typeof c._render=="function"?y=c._render(c.props):y=he(f,c.props,c,m)}catch(u){let d=r.ui?._errorHandler;d?(d(u),y=null):(console.error(`[weifuwu] Component render error in <${f?.name||"anonymous"}> (id: ${a._id??"?"}, phase: update)`,u),y=null)}let v=a._child;c._child=y;let l=q(e,n,v,y,m);return l||(c._refNode=null),l}if(c.type===j){let f=a._childNodes,m=He(e,a,c,r,f);return c._childNodes=m,n}if(typeof c.type=="string"){if(n&&n.nodeType===1){let f=a.props?.ref,m=c.props?.ref;f!==m&&(typeof m=="function"&&m(n),typeof f=="function"&&typeof m=="function"&&fn(n)),ge(n,a.props,c.props),He(n,a,c,r)}else if(n){S(t);let f=O(o,r);return f==null?null:(n.parentNode?.replaceChild(f,n),f)}return n}if(c.type===H)return X(a,c,r),null;if(Array.isArray(o)){let f=Array.isArray(t)?t:[];te(f,o);let m=Array.from(e.childNodes),y=n?m.indexOf(n):-1,v=y>=0?Y(m.slice(y),f):Y(m,f);return oe(e,f,o,r,v,n),n}return n}var Oe=new Map;function dn(e){let n=Oe.get(e);return n||(n=`fn:${e.name||"anon"}`,Oe.set(e,n)),n}function Ve(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"?dn(n.type):n.type===j?"fragment":n.type===H?"portal":typeof n.type=="string"?"tag:"+n.type:"unknown"}function ge(e,n,t){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"):[],s=new Set(r);for(let i of o)if(!s.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 c=n?.[i],a=t?.[i];if(i==="innerHTML")a!==c&&(e.innerHTML=String(a??""));else if(a!==c)if(i==="class"||i==="className")e instanceof SVGElement?e.setAttribute("class",Ie(a)):e.className=Ie(a);else if(i==="style"&&typeof a=="object"){let f=e.style;for(let m of Object.keys(a)){let y=a[m];y!=null&&(f[m]=typeof y=="number"?y+"px":String(y))}}else if(i.startsWith("on")&&typeof a=="function"){let f=i.slice(2).toLowerCase();typeof c=="function"&&e.removeEventListener(f,c),e.addEventListener(f,a)}else i==="value"&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)?e.value=String(a??""):a===!0?e.setAttribute(i,""):a!=null&&a!==!1?e.setAttribute(i,String(a)):i==="value"&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)?e.value="":e.removeAttribute(i)}}function Ie(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 ye(e){if(!(e==null||typeof e!="object"))return e.key}function te(e,n){if(!n.some(o=>o&&typeof o=="object"&&o.key!==void 0)){for(let o=0;o<n.length;o++){let r=n[o];r&&typeof r=="object"&&(r.key=o)}for(let o=0;o<e.length;o++){let r=e[o];r&&typeof r=="object"&&(r.key=o)}}}function Y(e,n){let t=[],o=0;for(let r of n){if(r==null||typeof r=="boolean"){t.push(null);continue}let s=r;if(s.type===H){t.push(null);continue}if(s.type===j){let i=s._childNodes;Array.isArray(i)&&i.length>0?(t.push(i.slice()),o+=i.length):(t.push(e[o]?[e[o]]:null),o+=1)}else typeof process<"u"&&process.env.DBG&&console.error("[map] idx=",o,"type=",s.type,"sourceLen=",e.length,"hit=",!!e[o]),t.push(e[o]?[e[o]]:null),o+=1}return t}function He(e,n,t,o,r){let s=Q(n.props?.children),i=Q(t.props?.children);te(s,i);let c=r??Array.from(e.childNodes),a=Y(c,s),f=oe(e,s,i,o,a,r?.[0]??null),m=[];for(let y of f)y&&y.length>0&&m.push(...y);return m}function Q(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 Ue(e){return e==null?[]:e instanceof DocumentFragment?Array.from(e.childNodes):[e]}function oe(e,n,t,o,r=[],s=null){if(!t.some(u=>u&&typeof u=="object"&&u.key!==void 0)){let u=Math.max(n.length,t.length);for(let d=0;d<u;d++){let p=d<n.length?n[d]:null,g=d<t.length?t[d]:null;if(g==null){if(p!=null){S(p);for(let h of r[d]??[])h.remove()}}else if(p==null){let h=O(g,o);h!=null&&e.appendChild(h)}else{let h=r[d]?.[0]??null;q(e,h,p,g,o)}}return[]}for(let u=0;u<n.length;u++){let d=n[u];if(!(d==null||typeof d=="boolean")&&ye(d)===void 0)for(let p of r[u]??[])p.remove()}let c=new Map,a=0;for(let u=0;u<n.length;u++){let d=ye(n[u]);d!==void 0&&c.set(d,{vnode:n[u],nodes:r[u]??[],index:a++})}let f=t.map(u=>ye(u)),m=new Set(f);for(let u of[...c.keys()])if(!m.has(u)){let d=c.get(u);S(d.vnode);for(let p of d.nodes)p?.remove();c.delete(u)}let y=new Array(t.length).fill(null),v=-1,l=s&&s.parentNode===e?s:e.firstChild;for(let u=0;u<t.length;u++){let d=f[u],p=t[u],g=d!==void 0?c.get(d):void 0,h=p&&typeof p=="object"&&p._placement==="remote";if(g)if(g.nodes.length>0){if(g.index<v)for(let x of g.nodes)e.insertBefore(x,l);v=Math.max(v,g.index),q(e,g.nodes[0],g.vnode,p,o),y[u]=p._childNodes??g.nodes.filter(x=>x.parentNode===e),l=y[u][y[u].length-1]?.nextSibling??null}else if(h)X(g.vnode,p,o),y[u]=[];else{let b=q(e,null,g.vnode,p,o);y[u]=Ue(b);for(let C of y[u])e.insertBefore(C,l);l=y[u][y[u].length-1]?.nextSibling??null}else if(h)K(p,o),y[u]=[];else{let b=O(p,o);y[u]=Ue(b);for(let C of y[u])e.insertBefore(C,l);l=y[u][y[u].length-1]?.nextSibling??null}}return y}function pn(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 mn(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(!pn(e[o],n[o]))return!1}else if(e[o]!==n[o])return!1}return!0}var Ce="http://www.w3.org/2000/svg",we=new Set(["svg","path","circle","line","rect","text","g","polyline","polygon","ellipse","defs","use","clipPath","mask","linearGradient","radialGradient","stop","tspan"]);function De(e,n){return O(e,n)}function O(e,n){if(e==null||typeof e=="boolean")return null;if(typeof e=="string"||typeof e=="number")return document.createTextNode(String(e));if(Array.isArray(e))return hn(e,n);let t=e;if(t.type===H)return K(t,n),null;if(t.type===j){let i=document.createDocumentFragment(),c=t.props?.children==null?[]:Array.isArray(t.props.children)?t.props.children:[t.props.children];for(let a of c){let f=O(a,n);f!=null&&i.appendChild(f)}return t._childNodes=Array.from(i.childNodes),i}if(typeof t.type=="function")return gn(t.type,t.props,t,n);let o=t.type,r=we.has(o)?document.createElementNS(Ce,o):document.createElement(o);t.el=r;let s;for(let[i,c]of Object.entries(t.props??{}))i==="children"||i==="key"||i==="value"||i==="innerHTML"||je(r,i,c);if("value"in(t.props??{})&&r instanceof HTMLSelectElement?s=t.props.value:"value"in(t.props??{})&&je(r,"value",t.props.value),"innerHTML"in(t.props??{}))r.innerHTML=String(t.props.innerHTML??"");else{let i=be(t.props?.children);for(let c of i){let a=O(c,n);if(a!=null&&(r.appendChild(a),c&&typeof c=="object"&&typeof c.type=="function")){let f=c;f._parentNode||(f._parentNode=r,f._refNode=a)}}}return s!==void 0&&(r.value=String(s)),typeof t.props?.ref=="function"&&t.props.ref(r),r}function yn(e){let n=e.ui;n&&typeof n.render=="function"&&n.render(["_wf_root"])}function he(e,n,t,o){let r;if(z(e)){if(r=Me(e),!r)return me(e,o).promise.then(()=>yn(o),()=>{}),null}else r=e;let s=r(n,o);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 gn(e,n,t,o){o.ui=o.ui??{},t._id||(t._id=J(),R.set(t._id,t));let r=Object.create(o);r.ui=Object.create(o.ui),r.ui._selfId=t._id,r.ui._selfVNode=t,t._ctxVersion=r.ui._ctxVersion??0;let s;try{s=he(e,n,t,r)}catch(c){let a=o.ui?._errorHandler;a?(a(c),s=null):(console.error(`[weifuwu] Component render error in <${e.name||"anonymous"}> (id: ${t._id??"?"}, phase: mount)`,c),s=null)}if(s==null)return t._child=null,null;t._child=s;let i=O(s,r);return t._refNode||(t._refNode=i),i}function hn(e,n){let t=document.createDocumentFragment();for(let o of e){let r=O(o,n);r!=null&&t.appendChild(r)}return t}function Cn(){let e=document.getElementById("__wf_portal");return e||(e=document.createElement("div"),e.id="__wf_portal",e.style.cssText="position:fixed;inset:0;pointer-events:none;z-index:9999",document.body.appendChild(e)),e}function K(e,n){let t=Cn(),o=document.createElement("div");o.style.pointerEvents="auto",t.appendChild(o),e._remoteEl=o;let r=Q(e.props?.children);e._child=r;for(let s of r){let i=O(s,n);i!=null&&o.appendChild(i)}}function X(e,n,t){let o=e?._remoteEl;if(n._remoteEl=o,!o){K(n,t);return}let r=Q(n.props?.children),s=e._child||[];n._child=r,te(s,r);let i=Y(Array.from(o.childNodes),s);oe(o,s,r,t,i,i[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 je(e,n,t){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 s=t[r];s!=null&&(o[r]=typeof s=="number"?s+"px":String(s))}}else n.startsWith("on")&&typeof t=="function"?e.addEventListener(n.slice(2).toLowerCase(),t):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 wn(e,n,t){e.innerHTML="";let o=O(n,t);o instanceof Node?e.appendChild(o):Array.isArray(o)&&o.forEach(r=>e.appendChild(r))}function xe(e){e.node=e.node?e.node.nextSibling:null}function bn(e,n){e.node&&e.node.parentNode?e.node.parentNode.insertBefore(n,e.node):e.parent.appendChild(n)}function xn(e,n){e.node&&e.node.parentNode?(e.node.parentNode.replaceChild(n,e.node),xe(e)):e.parent.appendChild(n)}async function Z(e,n,t){if(e==null||typeof e=="boolean")return null;if(typeof e=="string"||typeof e=="number"){let c=String(e);if(t.node&&t.node.nodeType===3)return t.node.textContent!==c&&(t.node.textContent=c),xe(t),t.node;let a=document.createTextNode(c);return bn(t,a),a}if(Array.isArray(e)){let c=null;for(let a of e){let f=await Z(a,n,t);f!=null&&!c&&(c=f)}return c}let o=e;if(o.type===H||o.type===j){let c=o.props?.children,a=c==null?[]:Array.isArray(c)?c:[c],f=null;for(let m of a){let y=await Z(m,n,t);y!=null&&!f&&(f=y)}return f}if(typeof o.type=="function")return vn(o,n,t);let r=o.type,s=o.props??{},i;if(t.node&&t.node.nodeType===1&&t.node.tagName.toLowerCase()===r.toLowerCase()?(i=t.node,xe(t)):(i=we.has(r)?document.createElementNS(Ce,r):document.createElement(r),xn(t,i)),o.el=i,ge(i,null,s),!("innerHTML"in s)){let c={parent:i,node:i.firstChild},a=be(s.children);for(let f of a){let m=await Z(f,n,c);if(m!=null&&m.parentNode!==i&&i.appendChild(m),f&&typeof f=="object"&&typeof f.type=="function"){let y=f;y._parentNode||(y._parentNode=i,y._refNode=m)}}for(;c.node;){let f=c.node;c.node=f.nextSibling,f.parentNode?.removeChild(f)}}return"value"in s&&i instanceof HTMLSelectElement&&(i.value=String(s.value??"")),typeof s.ref=="function"&&s.ref(i),i}async function vn(e,n,t){n.ui=n.ui??{},e._id||(e._id=J(),R.set(e._id,e));let o=Object.create(n);o.ui=Object.create(n.ui),o.ui._selfId=e._id,o.ui._selfVNode=e,e._ctxVersion=o.ui._ctxVersion??0;let r=e.type,s;try{let c;z(r)?c=await Le(r,o):c=r;let a=c(e.props??{},o);if(typeof a!="function")throw new Error(`Component ${r.name||"anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`);e._render=a,s=a(e.props??{})}catch(c){let a=n.ui?._errorHandler;a?(a(c),s=null):(console.error(`[weifuwu] Component hydration error in <${r.name||"anonymous"}> (id: ${e._id??"?"})`,c),s=null)}if(s==null)return e._child=null,null;e._child=s;let i=await Z(s,o,t);return e._refNode||(e._refNode=i),i}async function ve(e,n,t){let o={parent:e,node:e.firstChild};for(await Z(n,t,o);o.node;){let r=o.node;o.node=r.nextSibling,r.parentNode?.removeChild(r)}}function Te(e){let n=new WeakMap,t=new Set,o=s=>{if(s===null||typeof s!="object")return s;if(n.has(s))return n.get(s);let i=new Proxy(s,{set(c,a,f){if(Reflect.get(c,a)===f)return!0;Reflect.set(c,a,f),e();for(let y of t)y();return!0},get(c,a){let f=Reflect.get(c,a);return typeof f=="object"&&f!==null?o(f):f},deleteProperty(c,a){if(Reflect.has(c,a)){Reflect.deleteProperty(c,a),e();for(let f of t)f()}return!0}});return n.set(s,i),i},r=o({});return Object.defineProperty(r,"__watch",{value:s=>(t.add(s),()=>{t.delete(s)}),writable:!1,enumerable:!1}),r}function Pe(e,n,t){let o=new AbortController,r=t?.signal;r&&(r.aborted?o.abort():r.addEventListener("abort",()=>o.abort(),{once:!0}));let s=t?.traceId??An(),i=t?.record!==!1,c=[],a=(async()=>{let f;try{f=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json","X-Trace-Id":s,Accept:"text/event-stream",...t?.headers},body:JSON.stringify(n),signal:o.signal})}catch(m){if(o.signal.aborted)return;t?.onError?.({code:"provider_error",message:m instanceof Error?m.message:String(m)});return}if(!f.ok){t?.onError?.({code:En(f.status),message:`HTTP ${f.status} ${f.statusText}`});return}try{for await(let{name:m,data:y}of Pn(f.body)){if(o.signal.aborted)return;_n(c,{name:m,data:y},i),Tn(m,y,t??{})}}catch(m){if(o.signal.aborted)return;t?.onError?.({code:"provider_error",message:m instanceof Error?m.message:String(m)})}})();return{abort:()=>o.abort(),done:a,traceId:s,events:c}}function Tn(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*Pn(e){let n=e.getReader(),t=new TextDecoder,o="";try{for(;;){let{done:r,value:s}=await n.read();if(r)break;o+=t.decode(s,{stream:!0});let i=o.split(`
|
|
1
|
+
var Oe="__wfAsyncComponent";function cn(e){let n=e;return n[Oe]=!0,n}function z(e){return typeof e=="function"&&e?.[Oe]===!0}var D=Symbol("Fragment"),H=Symbol("Portal");function ye(e,n,t){return{type:e,props:We(n),key:t??void 0}}var fn=ye;function dn(e,n,t){return ye(e,n,t)}function pn(e,n,...t){let o=We(n??{});return t.length>0&&(o.children=t.length===1?t[0]:t),{type:e,props:o,key:n?.key??void 0}}function We(e){if(!e)return{};let n={};for(let t of Object.keys(e))t!=="key"&&(n[t]=e[t]);return n}function ge(e,n){return{type:H,props:{children:e,portalKey:n},key:n??void 0,_placement:"remote"}}var mn=0,L=new Map,ne=[];function F(e){ne.push(e)}var te=new WeakMap;function Y(){te=new WeakMap}function he(e,n){let t=te.get(e);if(t)return t;let o={promise:null};return o.promise=Promise.resolve().then(()=>e(n)).then(s=>{if(typeof s!="function")throw new Error(`asyncComponent factory <${e.name||"anonymous"}> must return a Component (initProps, ctx) => (props) => VNode.`);return o.resolved=s,s}),te.set(e,o),o}async function Ve(e,n){return he(e,n).promise}function Ie(e){return te.get(e)?.resolved}function yn(e){let n=e._child;if(n!=null)if(Array.isArray(n))for(let t of n)t&&typeof t=="object"&&N(t);else typeof n=="object"&&N(n)}function N(e){if(e==null||typeof e!="object")return;let n=e;if(n._id){if(n._customId&&L.delete(n._customId),L.delete(n._id),ne.length>0){for(let t of ne)t(n._id);if(n._customId)for(let t of ne)t(n._customId)}n._id=void 0,n._customId=void 0,n._render=void 0,n._parentNode=void 0,n._refNode=void 0}if(n._child!=null){if(Array.isArray(n._child))for(let t of n._child)t&&typeof t=="object"&&N(t);else N(n._child);n._child=void 0}if(n.props?.children&&typeof n.type=="string"){let t=Array.isArray(n.props.children)?n.props.children:[n.props.children];for(let o of t)o&&typeof o=="object"&&N(o)}typeof n.props?.ref=="function"&&n.props.ref(null),n._remoteEl&&(yn(n),n._remoteEl.remove(),n._remoteEl=void 0)}function G(){return`_wf_${mn++}`}var He=new WeakMap;function gn(e){let n=He.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 })")),He.set(e,n)}function $(e,n,t,o,s){if(t==null){if(o==null)return null;let d=V(o,s);return d==null?null:(n&&n.parentNode?n.parentNode.insertBefore(d,n):e.appendChild(d),d)}if(o==null)return n?(N(t),n.remove()):N(t),null;let l=De(t),u=De(o);if(l!==u){N(t);let d=V(o,s);return d==null?null:(n?.parentNode&&n.parentNode.replaceChild(d,n),d)}if(u==="text")return n&&n.textContent!==String(o)&&(n.textContent=String(o)),n;let f=o,c=t;if(typeof f.type=="function"){let d=f.type;c._render&&(f._render=c._render,f._id=c._id,f._id&&L.set(f._id,f)),f._parentNode=e,f._refNode=n;let y=Object.create(s);if(y.ui=Object.create(s.ui),y.ui._selfId=f._id,y.ui._selfVNode=f,f._ctxVersion=c._ctxVersion??y.ui._ctxVersion??0,c._render&&wn(c.props,f.props)&&!y.ui._dirtySet?.has(c._id)&&f._ctxVersion===y.ui._ctxVersion)return f._child=c._child,n;y.ui._dirtySet?.delete(c._id);let g;try{typeof f._render=="function"?g=f._render(f.props):g=be(d,f.props,f,y)}catch(i){let a=s.ui?._errorHandler;a?(a(i),g=null):(console.error(`[weifuwu] Component render error in <${d?.name||"anonymous"}> (id: ${c._id??"?"}, phase: update)`,i),g=null)}let E=c._child;f._child=g;let r=$(e,n,E,g,y);return r||(f._refNode=null),r}if(f.type===D){let d=c._childNodes,y=Fe(e,c,f,s,d);return f._childNodes=y,n}if(typeof f.type=="string"){if(n&&n.nodeType===1){let d=c.props?.ref,y=f.props?.ref;d!==y&&(typeof y=="function"&&y(n),typeof d=="function"&&typeof y=="function"&&gn(n)),we(n,c.props,f.props),Fe(n,c,f,s)}else if(n){N(t);let d=V(o,s);return d==null?null:(n.parentNode?.replaceChild(d,n),d)}return n}if(f.type===H)return Q(c,f,s),null;if(Array.isArray(o)){let d=Array.isArray(t)?t:[];oe(d,o);let y=Array.from(e.childNodes),g=n?y.indexOf(n):-1,E=g>=0?X(y.slice(g),d):X(y,d);return re(e,d,o,s,E,n),n}return n}var Ue=new Map;function hn(e){let n=Ue.get(e);return n||(n=`fn:${e.name||"anon"}`,Ue.set(e,n)),n}function De(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"?hn(n.type):n.type===D?"fragment":n.type===H?"portal":typeof n.type=="string"?"tag:"+n.type:"unknown"}function we(e,n,t){let o=n?Object.keys(n).filter(u=>u!=="children"&&u!=="key"&&u!=="innerHTML"):[],s=t?Object.keys(t).filter(u=>u!=="children"&&u!=="key"&&u!=="innerHTML"):[],l=new Set(s);for(let u of o)if(!l.has(u)){if(u==="ref")continue;u.startsWith("on")&&typeof n[u]=="function"?e.removeEventListener(u.slice(2).toLowerCase(),n[u]):u==="value"&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)?e.value="":e.removeAttribute(u==="className"?"class":u)}for(let u of s){if(u==="ref")continue;let f=n?.[u],c=t?.[u];if(u==="innerHTML")c!==f&&(e.innerHTML=String(c??""));else if(c!==f)if(u==="class"||u==="className")e instanceof SVGElement?e.setAttribute("class",je(c)):e.className=je(c);else if(u==="style"&&typeof c=="object"){let d=e.style;for(let y of Object.keys(c)){let g=c[y];g!=null&&(d[y]=typeof g=="number"?g+"px":String(g))}}else if(u.startsWith("on")&&typeof c=="function"){let d=u.slice(2).toLowerCase();typeof f=="function"&&e.removeEventListener(d,f),e.addEventListener(d,c)}else u==="value"&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)?e.value=String(c??""):c===!0?e.setAttribute(u,""):c!=null&&c!==!1?e.setAttribute(u,String(c)):u==="value"&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)?e.value="":e.removeAttribute(u)}}function je(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 ve(e){if(!(e==null||typeof e!="object"))return e.key}function oe(e,n){if(!n.some(o=>o&&typeof o=="object"&&o.key!==void 0)){for(let o=0;o<n.length;o++){let s=n[o];s&&typeof s=="object"&&(s.key=o)}for(let o=0;o<e.length;o++){let s=e[o];s&&typeof s=="object"&&(s.key=o)}}}function X(e,n){let t=[],o=0;for(let s of n){if(s==null||typeof s=="boolean"){t.push(null);continue}let l=s;if(l.type===H){t.push(null);continue}if(l.type===D){let u=l._childNodes;Array.isArray(u)&&u.length>0?(t.push(u.slice()),o+=u.length):(t.push(e[o]?[e[o]]:null),o+=1)}else typeof process<"u"&&process.env.DBG&&console.error("[map] idx=",o,"type=",l.type,"sourceLen=",e.length,"hit=",!!e[o]),t.push(e[o]?[e[o]]:null),o+=1}return t}function Fe(e,n,t,o,s){let l=J(n.props?.children),u=J(t.props?.children);oe(l,u);let f=s??Array.from(e.childNodes),c=X(f,l),d=re(e,l,u,o,c,s?.[0]??null),y=[];for(let g of d)g&&g.length>0&&y.push(...g);return y}function J(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 qe(e){return e==null?[]:e instanceof DocumentFragment?Array.from(e.childNodes):[e]}function re(e,n,t,o,s=[],l=null){if(!t.some(i=>i&&typeof i=="object"&&i.key!==void 0)){let i=Math.max(n.length,t.length);for(let a=0;a<i;a++){let p=a<n.length?n[a]:null,m=a<t.length?t[a]:null;if(m==null){if(p!=null){N(p);for(let h of s[a]??[])h.remove()}}else if(p==null){let h=V(m,o);h!=null&&e.appendChild(h)}else{let h=s[a]?.[0]??null;$(e,h,p,m,o)}}return[]}for(let i=0;i<n.length;i++){let a=n[i];if(!(a==null||typeof a=="boolean")&&ve(a)===void 0)for(let p of s[i]??[])p.remove()}let f=new Map,c=0;for(let i=0;i<n.length;i++){let a=ve(n[i]);a!==void 0&&f.set(a,{vnode:n[i],nodes:s[i]??[],index:c++})}let d=t.map(i=>ve(i)),y=new Set(d);for(let i of[...f.keys()])if(!y.has(i)){let a=f.get(i);N(a.vnode);for(let p of a.nodes)p?.remove();f.delete(i)}let g=new Array(t.length).fill(null),E=-1,r=l&&l.parentNode===e?l:e.firstChild;for(let i=0;i<t.length;i++){let a=d[i],p=t[i],m=a!==void 0?f.get(a):void 0,h=p&&typeof p=="object"&&p._placement==="remote";if(m)if(m.nodes.length>0){if(m.index<E)for(let v of m.nodes)e.insertBefore(v,r);E=Math.max(E,m.index),$(e,m.nodes[0],m.vnode,p,o),g[i]=p._childNodes??m.nodes.filter(v=>v.parentNode===e),r=g[i][g[i].length-1]?.nextSibling??null}else if(h)Q(m.vnode,p,o),g[i]=[];else{let w=$(e,null,m.vnode,p,o);g[i]=qe(w);for(let b of g[i])e.insertBefore(b,r);r=g[i][g[i].length-1]?.nextSibling??null}else if(h)B(p,o),g[i]=[];else{let w=V(p,o);g[i]=qe(w);for(let b of g[i])e.insertBefore(b,r);r=g[i][g[i].length-1]?.nextSibling??null}}return g}function vn(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 wn(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(!vn(e[o],n[o]))return!1}else if(e[o]!==n[o])return!1}return!0}var Ce="http://www.w3.org/2000/svg",xe=new Set(["svg","path","circle","line","rect","text","g","polyline","polygon","ellipse","defs","use","clipPath","mask","linearGradient","radialGradient","stop","tspan"]);function Ke(e,n){return V(e,n)}function V(e,n){if(e==null||typeof e=="boolean")return null;if(typeof e=="string"||typeof e=="number")return document.createTextNode(String(e));if(Array.isArray(e))return xn(e,n);let t=e;if(t.type===H)return B(t,n),null;if(t.type===D){let u=document.createDocumentFragment(),f=t.props?.children==null?[]:Array.isArray(t.props.children)?t.props.children:[t.props.children];for(let c of f){let d=V(c,n);d!=null&&u.appendChild(d)}return t._childNodes=Array.from(u.childNodes),u}if(typeof t.type=="function")return Cn(t.type,t.props,t,n);let o=t.type,s=xe.has(o)?document.createElementNS(Ce,o):document.createElement(o);t.el=s;let l;for(let[u,f]of Object.entries(t.props??{}))u==="children"||u==="key"||u==="value"||u==="innerHTML"||$e(s,u,f);if("value"in(t.props??{})&&s instanceof HTMLSelectElement?l=t.props.value:"value"in(t.props??{})&&$e(s,"value",t.props.value),"innerHTML"in(t.props??{}))s.innerHTML=String(t.props.innerHTML??"");else{let u=Te(t.props?.children);for(let f of u){let c=V(f,n);if(c!=null&&(s.appendChild(c),f&&typeof f=="object"&&typeof f.type=="function")){let d=f;d._parentNode||(d._parentNode=s,d._refNode=c)}}}return l!==void 0&&(s.value=String(l)),typeof t.props?.ref=="function"&&t.props.ref(s),s}function bn(e){let n=e.ui;n&&typeof n.render=="function"&&n.render(["_wf_root"])}function be(e,n,t,o){let s;if(z(e)){if(s=Ie(e),!s)return he(e,o).promise.then(()=>bn(o),()=>{}),null}else s=e;let l=s(n,o);if(typeof l!="function")throw new Error(`Component ${e.name||"anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`);return t._render=l,l(n)}function Cn(e,n,t,o){o.ui=o.ui??{},t._id||(t._id=G(),L.set(t._id,t));let s=Object.create(o);s.ui=Object.create(o.ui),s.ui._selfId=t._id,s.ui._selfVNode=t,t._ctxVersion=s.ui._ctxVersion??0;let l;try{l=be(e,n,t,s)}catch(f){let c=o.ui?._errorHandler;c?(c(f),l=null):(console.error(`[weifuwu] Component render error in <${e.name||"anonymous"}> (id: ${t._id??"?"}, phase: mount)`,f),l=null)}if(l==null)return t._child=null,null;t._child=l;let u=V(l,s);return t._refNode||(t._refNode=u),u}function xn(e,n){let t=document.createDocumentFragment();for(let o of e){let s=V(o,n);s!=null&&t.appendChild(s)}return t}function Tn(){let e=document.getElementById("__wf_portal");return e||(e=document.createElement("div"),e.id="__wf_portal",e.style.cssText="position:fixed;inset:0;pointer-events:none;z-index:9999",document.body.appendChild(e)),e}function B(e,n){let t=Tn(),o=document.createElement("div");o.style.pointerEvents="auto",t.appendChild(o),e._remoteEl=o;let s=J(e.props?.children);e._child=s;for(let l of s){let u=V(l,n);u!=null&&o.appendChild(u)}}function Q(e,n,t){let o=e?._remoteEl;if(n._remoteEl=o,!o){B(n,t);return}let s=J(n.props?.children),l=e._child||[];n._child=s,oe(l,s);let u=X(Array.from(o.childNodes),l);re(o,l,s,t,u,u[0]?.[0]??null)}function Te(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 $e(e,n,t){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 s of Object.keys(t)){let l=t[s];l!=null&&(o[s]=typeof l=="number"?l+"px":String(l))}}else n.startsWith("on")&&typeof t=="function"?e.addEventListener(n.slice(2).toLowerCase(),t):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 En(e,n,t){e.innerHTML="";let o=V(n,t);o instanceof Node?e.appendChild(o):Array.isArray(o)&&o.forEach(s=>e.appendChild(s))}function Ee(e){e.node=e.node?e.node.nextSibling:null}function Pn(e,n){e.node&&e.node.parentNode?e.node.parentNode.insertBefore(n,e.node):e.parent.appendChild(n)}function An(e,n){e.node&&e.node.parentNode?(e.node.parentNode.replaceChild(n,e.node),Ee(e)):e.parent.appendChild(n)}async function Z(e,n,t){if(e==null||typeof e=="boolean")return null;if(typeof e=="string"||typeof e=="number"){let f=String(e);if(t.node&&t.node.nodeType===3)return t.node.textContent!==f&&(t.node.textContent=f),Ee(t),t.node;let c=document.createTextNode(f);return Pn(t,c),c}if(Array.isArray(e)){let f=null;for(let c of e){let d=await Z(c,n,t);d!=null&&!f&&(f=d)}return f}let o=e;if(o.type===H||o.type===D){let f=o.props?.children,c=f==null?[]:Array.isArray(f)?f:[f],d=null;for(let y of c){let g=await Z(y,n,t);g!=null&&!d&&(d=g)}return d}if(typeof o.type=="function")return _n(o,n,t);let s=o.type,l=o.props??{},u;if(t.node&&t.node.nodeType===1&&t.node.tagName.toLowerCase()===s.toLowerCase()?(u=t.node,Ee(t)):(u=xe.has(s)?document.createElementNS(Ce,s):document.createElement(s),An(t,u)),o.el=u,we(u,null,l),!("innerHTML"in l)){let f={parent:u,node:u.firstChild},c=Te(l.children);for(let d of c){let y=await Z(d,n,f);if(y!=null&&y.parentNode!==u&&u.appendChild(y),d&&typeof d=="object"&&typeof d.type=="function"){let g=d;g._parentNode||(g._parentNode=u,g._refNode=y)}}for(;f.node;){let d=f.node;f.node=d.nextSibling,d.parentNode?.removeChild(d)}}return"value"in l&&u instanceof HTMLSelectElement&&(u.value=String(l.value??"")),typeof l.ref=="function"&&l.ref(u),u}async function _n(e,n,t){n.ui=n.ui??{},e._id||(e._id=G(),L.set(e._id,e));let o=Object.create(n);o.ui=Object.create(n.ui),o.ui._selfId=e._id,o.ui._selfVNode=e,e._ctxVersion=o.ui._ctxVersion??0;let s=e.type,l;try{let f;z(s)?f=await Ve(s,o):f=s;let c=f(e.props??{},o);if(typeof c!="function")throw new Error(`Component ${s.name||"anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`);e._render=c,l=c(e.props??{})}catch(f){let c=n.ui?._errorHandler;c?(c(f),l=null):(console.error(`[weifuwu] Component hydration error in <${s.name||"anonymous"}> (id: ${e._id??"?"})`,f),l=null)}if(l==null)return e._child=null,null;e._child=l;let u=await Z(l,o,t);return e._refNode||(e._refNode=u),u}async function Pe(e,n,t){let o={parent:e,node:e.firstChild};for(await Z(n,t,o);o.node;){let s=o.node;o.node=s.nextSibling,s.parentNode?.removeChild(s)}}var se=0,Be="",ze="",Ye="",Ge="",ie=0;function Xe(){return typeof window<"u"&&typeof document<"u"}function Ae(){if(se++,se>1||!Xe())return;ie=window.scrollY;let e=document.body;Be=e.style.overflow,ze=e.style.position,Ye=e.style.top,Ge=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=`-${ie}px`,e.style.width="100%")}function _e(){if(se--,se>0||!Xe())return;let e=document.body;e.style.overflow=Be,e.style.position=ze,e.style.top=Ye,e.style.width=Ge,ie>0&&window.scrollTo(0,ie)}var Rn='a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';function ae(e){let n=e.querySelectorAll(Rn);if(n.length===0)return()=>{};let t=n[0],o=n[n.length-1],s=u=>{u.key==="Tab"&&(u.shiftKey&&document.activeElement===t?(u.preventDefault(),o.focus()):!u.shiftKey&&document.activeElement===o&&(u.preventDefault(),t.focus()))},l=document.activeElement;return queueMicrotask(()=>{t.focus()}),e.addEventListener("keydown",s),()=>{e.removeEventListener("keydown",s),l?.focus()}}function le(e){let n=new WeakMap,t=new Set,o=l=>{if(l===null||typeof l!="object")return l;if(n.has(l))return n.get(l);let u=new Proxy(l,{set(f,c,d){if(Reflect.get(f,c)===d)return!0;Reflect.set(f,c,d),e();for(let g of t)g();return!0},get(f,c){let d=Reflect.get(f,c);return typeof d=="object"&&d!==null?o(d):d},deleteProperty(f,c){if(Reflect.has(f,c)){Reflect.deleteProperty(f,c),e();for(let d of t)d()}return!0}});return n.set(l,u),u},s=o({});return Object.defineProperty(s,"__watch",{value:l=>(t.add(l),()=>{t.delete(l)}),writable:!1,enumerable:!1}),s}function Re(e,n,t){let o=new AbortController,s=t?.signal;s&&(s.aborted?o.abort():s.addEventListener("abort",()=>o.abort(),{once:!0}));let l=t?.traceId??Mn(),u=t?.record!==!1,f=[],c=(async()=>{let d;try{d=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json","X-Trace-Id":l,Accept:"text/event-stream",...t?.headers},body:JSON.stringify(n),signal:o.signal})}catch(y){if(o.signal.aborted)return;t?.onError?.({code:"provider_error",message:y instanceof Error?y.message:String(y)});return}if(!d.ok){t?.onError?.({code:Ln(d.status),message:`HTTP ${d.status} ${d.statusText}`});return}try{for await(let{name:y,data:g}of kn(d.body)){if(o.signal.aborted)return;Nn(f,{name:y,data:g},u),Sn(y,g,t??{})}}catch(y){if(o.signal.aborted)return;t?.onError?.({code:"provider_error",message:y instanceof Error?y.message:String(y)})}})();return{abort:()=>o.abort(),done:c,traceId:l,events:f}}function Sn(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*kn(e){let n=e.getReader(),t=new TextDecoder,o="";try{for(;;){let{done:s,value:l}=await n.read();if(s)break;o+=t.decode(l,{stream:!0});let u=o.split(`
|
|
2
2
|
|
|
3
|
-
`);o=
|
|
4
|
-
`))m.startsWith("event: ")?a=m.slice(7):m.startsWith("data: ")&&(f+=m.slice(6));if(f)try{yield{name:a,data:JSON.parse(f)}}catch{}}}}finally{n.releaseLock()}}function _n(e,n,t){t&&(e.length>=1e3&&e.shift(),e.push(n))}function En(e){return e===401||e===403?"auth_failed":e===429?"rate_limited":e>=500?"provider_error":"invalid_request"}function An(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`trace-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function qe(e){return e.map(n=>({role:n.role,content:n.content}))}function _e(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`msg-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function Fe(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 l=e.messages[e.messages.length-1];return l&&l.role==="assistant"&&l.status==="streaming"?l:void 0}function s(l,u,d){let p=r();switch(l){case"wf:token":p&&(p.content+=u.text);break;case"wf:tool_call":{p&&(p.toolCalls||(p.toolCalls=[]),p.toolCalls.push({call:u,status:"running"}));break}case"wf:tool_progress":{let g=u,h=p?.toolCalls?.find(b=>b.call.id===g.toolCallId);h&&(h.progress=g);break}case"wf:tool_result":{let g=u,h=p?.toolCalls?.find(b=>b.call.id===g.id);h&&(h.result=g,h.status=g.ok?"ok":"error");break}case"wf:approval_request":p&&(p.approval=u);break;case"wf:usage":p&&(p.usage=u);break;case"wf:step":e.step=u;break;case"wf:done":p&&(p.status="done",p.approval=void 0),e.streaming=!1,e.step=null;break;case"wf:error":p&&(p.status="error",p.error=u,p.approval=void 0),e.error=u,e.streaming=!1,e.step=null;break;default:d?.(l,u);break}}function i(){let l=t.body?t.body(e.messages):{messages:qe(e.messages)};o=n(t.url,l,{onToken:d=>s("wf:token",{text:d}),onToolCall:d=>s("wf:tool_call",d),onToolProgress:d=>s("wf:tool_progress",d),onToolResult:d=>s("wf:tool_result",d),onApproval:d=>s("wf:approval_request",d),onUsage:d=>s("wf:usage",d),onStep:d=>s("wf:step",d),onDone:d=>s("wf:done",d),onError:d=>s("wf:error",d),onEvent:(d,p)=>s(d,p,t.onEvent)},{signal:t.signal,headers:t.headers}),e.streaming=!0;let u=r();u&&o?.traceId&&(u.id=o.traceId)}function c(){if(e.streaming)return;let l=String(e.input??"").trim();l&&(e.input="",e.error=null,e.usage=null,e.step=null,e.messages.push({id:_e(),role:"user",content:l,status:"done"},{id:_e(),role:"assistant",content:"",status:"streaming",toolCalls:[]}),i())}function a(){o?.abort(),e.streaming=!1,e.step=null;let l=e.messages[e.messages.length-1];l&&l.role==="assistant"&&l.status==="streaming"&&(!l.content&&(!l.toolCalls||l.toolCalls.length===0)?e.messages.pop():l.status="done")}function f(){if(e.streaming)return;let l=-1;for(let u=e.messages.length-1;u>=0;u--)if(e.messages[u].role==="user"){l=u;break}l!==-1&&(e.messages.splice(l+1),e.error=null,e.usage=null,e.step=null,e.messages.push({id:_e(),role:"assistant",content:"",status:"streaming",toolCalls:[]}),i())}function m(){o?.abort(),e.messages=[],e.input="",e.streaming=!1,e.error=null,e.usage=null,e.step=null}async function y(l,u){let d=e.messages[e.messages.length-1],p=d?.role==="assistant"?d.approval:void 0;if(p&&(d.approval=void 0,!!t.approveUrl))try{await fetch(t.approveUrl,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify({id:p.id,decision:l,note:u}),signal:t.signal})}catch(g){if(t.signal?.aborted)return;e.error={code:"provider_error",message:g instanceof Error?g.message:String(g)}}}function v(){o?.abort(),o=null}return{send:c,stop:a,retry:f,clear:m,approve:y,dispose:v}}function re(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 kn(e,n="bottom",t=6,o=!0){return re(e.getBoundingClientRect(),n,t,o)}function se(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,s=Number.parseFloat(n.style.left)||o.left,i=e.top-r,c=e.left-s,a={top:o.top+i,bottom:o.bottom+i,left:o.left+c,right:o.right+c},f=window.innerWidth,m=window.innerHeight,y=e.top,v=e.left;return a.bottom>m-t&&(y=Math.max(t,y-(a.bottom-(m-t)))),a.top<t&&(y=Math.max(t,y+(t-a.top))),a.right>f-t&&(v=Math.max(t,v-(a.right-(f-t)))),a.left<t&&(v=Math.max(t,v+(t-a.left))),{top:y,left:v,width:e.width}}function $e(e){let{ctx:n,renderByIds:t,getSelfId:o,dirtyBatch:r,dirtySet:s,mediaRegistry:i,popupTrackers:c,scrollTrackers:a,schedulePopupRecompute:f,ensurePopupListeners:m,isRendering:y}=e;return{_selfId:"_wf_root",_ctxVersion:0,_dirtySet:s,bumpCtxVersion:function(){this._ctxVersion++},render:function(l){if(!l||l.length===0){let u=o(this);if(u)l=[u];else return}t(l)},dirty:function(l){if(!y()){if(!l||l.length===0){let u=o(this);if(u)l=[u];else return}for(let u of l)u&&(r.add(u),s.add(u));this._dirtyScheduled||(this._dirtyScheduled=!0,queueMicrotask(()=>{this._dirtyScheduled=!1;let u=[...r];r.clear(),u.length>0&&t(u)}))}},$:function(){let l=this;if(!l._$cache){let u=o(this);l._$cache=Te(()=>n.ui.dirty(u?[u]:void 0))}return l._$cache},useChat:function(l){let u=this.$(),d=Fe(u,Pe,l);return Object.assign(u,{send:d.send,stop:d.stop,retry:d.retry,clear:d.clear,approve:d.approve,dispose:d.dispose}),u},useMedia:function(l,u){let p=`media:${o(this)}:${l}`;if(!i.has(p)){let g=window.matchMedia(l);u(g.matches);let h=b=>u(b.matches);g.addEventListener("change",h),i.set(p,{mql:g,handler:h})}},useBreakpoint:function(l,u){let d=typeof l=="function"?{mobile:"(max-width: 639px)",tablet:"(min-width: 640px) and (max-width: 1023px)",desktop:"(min-width: 1024px)"}:l,p=typeof l=="function"?l:u,h=`bp:${o(this)}`;function b(){for(let[x,C]of Object.entries(d))if(window.matchMedia(C).matches)return x;return Object.keys(d)[0]??""}if(!i.has(h)){p(b());let x=[];for(let C of Object.values(d)){let P=window.matchMedia(C),w=()=>p(b());P.addEventListener("change",w),x.push({mql:P,handler:w})}i.set(h,{mqls:x})}},usePopupPosition:function(l){let u=o(this),d={top:0,left:0,refresh:()=>{}};if(!u)return d;let p={pos:d,getEl:l.el,isOpen:l.isOpen,compute:l.compute,panel:l.panel,margin:l.margin??8};return c.set(u,p),m(),d.refresh=()=>{let g=p.getEl();if(!g)return;let h=p.compute(g.getBoundingClientRect());Object.assign(d,se(h,p.panel?.(),p.margin))},d},useHoverCapable:function(){return typeof window<"u"&&!!window.matchMedia?.("(hover: hover)").matches},useVisualViewport:function(){let l=o(this),u={height:window.innerHeight,offsetTop:0,keyboardOpen:!1},d=()=>{n.ui&&n.ui.dirty(l?[l]:void 0)},p=()=>{let h=window.visualViewport;u.height=h?.height??window.innerHeight,u.offsetTop=h?.offsetTop??0,u.keyboardOpen=u.height<window.innerHeight*.9,d()},g=window.visualViewport;return g?.addEventListener?(g.addEventListener("resize",p),g.addEventListener("scroll",p)):window.addEventListener("resize",p),l&&B(h=>{h===l&&(g?.removeEventListener?(g.removeEventListener("resize",p),g.removeEventListener("scroll",p)):window.removeEventListener("resize",p))}),u},usePopup:function(l){let u=o(this),d=this.useHoverCapable(),p=()=>typeof l.trigger=="function"?l.trigger():l.trigger,g=l.open!==void 0,h=()=>!!l.disabled?.(),b=()=>g?typeof l.open=="function"?!!l.open():!!l.open:l.isOpen(),x=T=>{h()||(g?l.onOpenChange?.(T):l.setOpen(T))},C=()=>{let T=l.placement;return typeof T=="function"?T():T??"bottom"},P=null,w=!1,_=n.ui.usePopupPosition({el:l.el,isOpen:()=>b(),compute:T=>re(T,C(),l.gap??6,l.center!==!1),panel:()=>P,margin:l.margin??8}),A=T=>{if(l.closeOnOutside===!1||!b())return;let V=T.target;if(!(V instanceof Node))return;let $=l.el();$&&$.contains(V)||P&&P.contains(V)||x(!1)},N=T=>{l.closeOnEscape!==!1&&(T.key!=="Escape"||!b()||x(!1))};document.addEventListener("mousedown",A),document.addEventListener("keydown",N),u&&B(T=>{T===u&&(document.removeEventListener("mousedown",A),document.removeEventListener("keydown",N))});let k={},E=T=>typeof T=="function"?T():T??0,L=()=>E(l.openDelay),D=()=>E(l.closeDelay),M,W,en=()=>{clearTimeout(M),clearTimeout(W),M=void 0,W=void 0};if(p()==="hover")d?(k.onMouseEnter=()=>{h()||(clearTimeout(W),W=void 0,M=setTimeout(()=>{M=void 0,x(!0)},L()))},k.onMouseLeave=()=>{h()||(clearTimeout(M),M=void 0,W=setTimeout(()=>{W=void 0,x(!1)},D()))}):k.onClick=()=>x(!b()),k.onFocus=()=>{h()||(clearTimeout(W),W=void 0,M=setTimeout(()=>{M=void 0,x(!0)},L()))},k.onBlur=()=>{h()||(clearTimeout(M),M=void 0,W=setTimeout(()=>{W=void 0,x(!1)},D()))};else if(p()==="click")k.onClick=()=>x(!b());else if(p()==="longpress"){let T,V=0,$=0,U=()=>{clearTimeout(T),T=void 0};k.onPointerDown=I=>{h()||(V=I.clientX??0,$=I.clientY??0,U(),T=setTimeout(()=>{T=void 0,x(!0)},l.longPressDuration??500))},k.onPointerUp=U,k.onPointerLeave=U,k.onPointerMove=I=>{let ce=Math.abs((I.clientX??0)-V),fe=Math.abs((I.clientY??0)-$);(ce>10||fe>10)&&U()},k.onContextMenu=I=>{I.preventDefault(),x(!0)}}k.onKeyDown=T=>{T.key==="Escape"&&l.closeOnEscape!==!1&&x(!1)},u&&B(T=>{T===u&&en()});let nn=T=>{if(T){P=T;let V=()=>_.refresh();T.addEventListener("animationend",V,{once:!0})}else P=null},tn=(T,V="popover")=>{if(h())return null;if(!b())return w=!1,null;w||(_.refresh(),w=!0);let U=T.props??{},I=U.ref,ce=["wf-popup",U.class].filter(Boolean).join(" "),fe={...U.style??{},position:"fixed",top:`${_.top}px`,left:`${_.left}px`,maxWidth:l.width!==void 0?`min(${l.width}px, calc(100vw - 32px))`:"calc(100vw - 32px)"},on={...T,props:{...U,class:ce,style:fe,ref:Ne=>{nn(Ne),I&&I(Ne)}}};return pe(on,V)};return{open:b(),setOpen:x,wrapProps:k,portal:tn,refresh:()=>_.refresh()}},useLongPress:function(l){let{onLongPress:u,duration:d=500}=l,p,g=0,h=0,b=null,x=()=>{clearTimeout(p),p=void 0};return{onPointerDown:C=>{g=C.clientX??0,h=C.clientY??0,b=C,x(),p=setTimeout(()=>{p=void 0,u(b)},d)},onPointerUp:x,onPointerLeave:x,onPointerMove:C=>{let P=Math.abs((C.clientX??0)-g),w=Math.abs((C.clientY??0)-h);(P>10||w>10)&&x()},onContextMenu:C=>{C.preventDefault(),u(C)}}},useInView:function(l){let u=o(this),d={isIn:!1,ready:!1,observe:x,refresh:C,disconnect:P},p=null,g=null,h=()=>{n.ui&&n.ui.dirty(u?[u]:void 0)};function b(){if(g?.disconnect(),g=null,!p)return;let w=typeof l.rootMargin=="function"?l.rootMargin():l.rootMargin,_=typeof l.threshold=="function"?l.threshold():l.threshold;g=new IntersectionObserver(A=>{let N=A[A.length-1];if(!N)return;let k=N.isIntersecting,E=k!==d.isIn,L=!d.ready;d.isIn=k,d.ready=!0,l.onChange?.(N,k),(E||L)&&h()},{root:l.root?l.root():null,rootMargin:w??"0px",threshold:_??0}),g.observe(p)}function x(w){p=w,w?b():(g?.disconnect(),g=null,d.isIn=!1)}function C(){b()}function P(){g?.disconnect(),g=null}return d},useScrollPosition:function(l){let u=o(this),d={y:0,refresh(){let g=p.getScroller();d.y=g instanceof Window?document.scrollingElement?.scrollTop??g.scrollY??0:g.scrollTop??0}},p={handle:d,getScroller:l.getScroller??(()=>window)};return u?(a.set(u,p),m(),d.refresh(),d):(d.refresh(),d)},useAsync:function(l){let u=o(this),d=Te(()=>{n.ui&&n.ui.dirty(u?[u]:void 0)});d.loading=!0;let p=()=>{d.loading=!0,d.error=null,Promise.resolve().then(()=>l()).then(g=>{d.data=g,d.loading=!1}).catch(g=>{d.error=g,d.loading=!1})};return p(),d.reload=p,d},selfId:function(l){if(typeof l!="string"||!l)throw new Error(`[weifuwu] selfId requires a non-empty string, got ${typeof l}`);if(R.has(l))throw new Error(`[weifuwu] Duplicate component ID: "${l}". Each component must have a unique custom ID.`);let u=this._selfVNode;u&&(u._customId=l,R.set(l,u))}}}function Nn(){let e=[],n={},t=null,o=null,r=null,s=!1,i=new Set,c=!1,a=new Map;function f(C){let P=a.get(C);P&&(P.mql&&P.handler&&P.mql.removeEventListener("change",P.handler),P.mqls?.forEach(({mql:w,handler:_})=>w.removeEventListener("change",_)),a.delete(C))}let m=new Map,y=!1,v=0;function l(){y||(y=!0,window.addEventListener("scroll",p,{capture:!0,passive:!0}),window.addEventListener("resize",p))}function u(){y&&(window.removeEventListener("scroll",p,{capture:!0}),window.removeEventListener("resize",p),y=!1)}let d=new Map;function p(){v||(v=requestAnimationFrame(()=>{v=0;let C=[];for(let[P,w]of m){if(!w.isOpen())continue;let _=w.getEl();if(!_)continue;let A=w.compute(_.getBoundingClientRect());Object.assign(w.pos,se(A,w.panel?.(),w.margin)),C.push(P)}for(let[P,w]of d){let _=w.getScroller(),A=_ instanceof Window?document.scrollingElement?.scrollTop??_.scrollY??0:_.scrollTop??0;A!==w.handle.y&&(w.handle.y=A,C.push(P))}C.length>0&&n.ui.render(C)}))}function g(C){if(!s){s=!0;for(let P of C){let w=R.get(P);if(!w||!w._render)continue;n.ui._dirtySet?.delete(P);let _=w._child,A=w._render(w.props);if(w._child=A,_&&_._placement==="remote"||A&&A._placement==="remote"){_&&A?X(_,A,n):A?K(A,n):_&&S(_);continue}if(!w._parentNode&&w._refNode&&(w._parentNode=w._refNode.parentNode),w._parentNode){let N=q(w._parentNode,w._refNode??null,_,A,n);N&&N!==w._refNode?w._refNode=N:N||(w._refNode=null)}}s=!1,h()}}function h(){let C=n.ui;i.size>0&&!C._dirtyScheduled&&(C._dirtyScheduled=!0,queueMicrotask(()=>{C._dirtyScheduled=!1;let P=[...i];i.clear(),P.length>0&&g(P)}))}function b(C){return C?._selfId??n.ui?._selfId}let x={get ctx(){return n},use(C){return e.push(C),x},async mount(C,P,w){o=P;for(let E of e)n=await E(n);let _=typeof C=="string"?document.querySelector(C):C;if(!_)throw new Error(`mount target not found: ${C}`);t=_;let A=!!w?.hydrate;A||(t.innerHTML="");let N=new Map,k=globalThis.__DATA__;if(k&&typeof k=="object")for(let[E,L]of Object.entries(k))N.set(E,{value:L});if(n.data={async get(E,L){let D=N.get(E);if(D&&"value"in D)return D.value;if(D?.promise)return D.promise;if(!L)return;let M=Promise.resolve().then(()=>L()).then(W=>(N.set(E,{value:W}),W));return N.set(E,{promise:M}),M},set(E,L){N.set(E,{value:L})},has(E){return N.has(E)}},B(E=>{for(let L of[...a.keys()])(L.startsWith(`media:${E}:`)||L===`bp:${E}`)&&f(L);m.delete(E),d.delete(E)}),n.ui=$e({ctx:n,renderByIds:g,getSelfId:b,dirtyBatch:i,dirtySet:new Set,mediaRegistry:a,popupTrackers:m,scrollTrackers:d,schedulePopupRecompute:p,ensurePopupListeners:l,destroyPopupListeners:u,isRendering:()=>s}),s=!0,r=Sn(P,n),r._id="_wf_root",r._parentNode=t,r._refNode=A?t.firstChild:null,R.set("_wf_root",r),A)await ve(t,r,n);else{let E=De(r,n);E instanceof Node&&t.appendChild(E)}r._refNode=t.firstChild,s=!1,h()},destroy(){u(),m.clear(),d.clear();for(let C of[...a.keys()])f(C);R.clear(),t&&(t.innerHTML=""),t=null,n={}}};return x}function Sn(e,n){return{type:e,props:{},key:void 0}}function Rn(e,n){if(!n||n==="/")return e||"/";let t=e.endsWith("/")?e.slice(0,-1):e,o=n.startsWith("/")?n:"/"+n;return t+o}function Ln(e){let n=[],t=e.replace(/:(\w+)/g,(o,r)=>(n.push(r),"([^/]+)")).replace(/\*/g,".*");return{re:new RegExp(`^${t}$`),keys:n}}function Ee(e,n="",t=[]){let o=[];for(let r of e){let s=Rn(n,r.path),{re:i,keys:c}=Ln(s),a=[...t,r];o.push({re:i,keys:c,def:r,chain:a}),r.children&&o.push(...Ee(r.children,s,a))}return o}function Be(e,n){let t=null;for(let o of n)e.match(o.re)&&(!t||o.chain.length>t.chain.length)&&(t=o);return t}function Ke(e,n){let t={},o=e.match(n.re);if(o)for(let r=0;r<n.keys.length;r++)t[n.keys[r]]=decodeURIComponent(o[r+1]);return t}function Mn(e){let n=Ee(e.routes),t=e.mode||"history";function o(){return t==="hash"?window.location.hash.replace(/^#/,"")||"/":window.location.pathname}function r(s){let i=Be(s,n);if(i){let c=i.chain[i.chain.length-1];return{path:i.def.path,params:Ke(s,i),query:Object.fromEntries(new URLSearchParams(window.location.search)),chain:i.chain,title:c?.title??""}}return{path:s,params:{},query:Object.fromEntries(new URLSearchParams(window.location.search)),chain:e.notFound?[{component:e.notFound,title:"Not Found"}]:[],title:""}}return s=>{let i=r(o());s.route=i,i.title&&(document.title=i.title),s.app||(s.app={}),s.app.navigate=a=>{if(G(),t==="hash"){window.location.hash="#"+a;let f=r(a);s.route=f}else{window.history.pushState({},"",a);let f=r(a);s.route=f}s.route?.title&&(document.title=s.route.title),s.ui?.bumpCtxVersion?.(),s.ui?.render()};let c=()=>{G();let a=r(o());s.route=a,s.route?.title&&(document.title=s.route.title),s.ui?.bumpCtxVersion?.(),s.ui?.render()};return window.addEventListener("popstate",c),t==="hash"&&window.addEventListener("hashchange",c),s}}function Wn(e,n){let t=n.route?._rvDepth??0;return()=>{let o=n.route;if(!o?.chain?.length||t>=o.chain.length)return null;let r=o.chain[t],s=r.layout??r.component;return s?(r.layout&&(o._rvDepth=t+1),{type:s,props:{},key:void 0}):null}}function F(e,n){return Object.assign(Object.create(e),n)}function On(e={}){let n=e.url??"/ws",t=e.reconnectInterval??3e3,o=e.maxReconnect??10,r=e.pingInterval??3e4,s=e.pingTimeout??1e4;return i=>{let c=new Set,a=null,f=0,m=null,y=null,v=null,l=!1,u={isConnected:!1,onMessage:b=>(c.add(b),()=>{c.delete(b)}),send:b=>{a?.readyState===WebSocket.OPEN&&a.send(JSON.stringify(b))},_connect:d,close:()=>{l=!0,h(),a?.close(),a=null,u.isConnected=!1}};async function d(){if(!l)try{a=new WebSocket(n),a.onopen=()=>{u.isConnected=!0,f=0,p()},a.onmessage=b=>{try{let x=JSON.parse(b.data);for(let C of c)C(x)}catch{}g()},a.onclose=()=>{u.isConnected=!1,h(),!l&&f<o&&(f++,m=setTimeout(d,t*Math.min(f,5)))},a.onerror=()=>{a?.close()}}catch{l||(m=setTimeout(d,t))}}function p(){r<=0||(y=setInterval(()=>{a?.readyState===WebSocket.OPEN&&a.send(JSON.stringify({type:"ping"})),v=setTimeout(()=>{a?.close()},s)},r))}function g(){clearTimeout(v)}function h(){clearInterval(y),clearTimeout(v),clearTimeout(m)}return d(),F(i,{ws:u})}}function Vn(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 s(i,c,a,f){let m=n.baseURL+c,y={method:i,headers:{...n.headers,...f?.headers}},v=e?.token?.();v&&!y.headers.Authorization&&(y.headers.Authorization=`Bearer ${v}`);let l=r>0,u=!!f?.signal,d=null,p=null;(l||u)&&(d=new AbortController,y.signal=d.signal,l&&(p=setTimeout(()=>d.abort(new Error("Request timed out")),r)),u&&f.signal.addEventListener("abort",()=>d.abort())),a!==void 0&&i!=="GET"&&i!=="HEAD"&&(y.body=JSON.stringify(a));let g={url:m,init:y};t&&(g=t(g));try{let h=await fetch(g.url,g.init);if(o)return o(h);if(!h.ok){let C=await h.text().catch(()=>"");throw new ie(h.status,C||h.statusText)}let b=h.headers.get("content-length");if(h.status===204||b==="0")return;let x=(h.headers.get("content-type")||"").toLowerCase();return x.includes("application/json")||x.includes("json")?h.json():h.text()}finally{p&&clearTimeout(p)}}return i=>F(i,{api:{get:(a,f)=>s("GET",a,void 0,f),post:(a,f,m)=>s("POST",a,f,m),put:(a,f,m)=>s("PUT",a,f,m),patch:(a,f,m)=>s("PATCH",a,f,m),delete:(a,f)=>s("DELETE",a,void 0,f)}})}var ie=class extends Error{status;body;constructor(n,t){super(`API Error ${n}: ${t}`),this.name="ApiError",this.status=n,this.body=t}};function In(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 Hn(e){let n=In(e);return n?.exp?n.exp*1e3-3e4<Date.now():!0}function Un(e){let n=e?.storage??localStorage,t=e?.tokenKey??"weifuwu_token",o=e?.userKey??"weifuwu_user",r=e?.refreshTokenKey??"weifuwu_refresh",s=e?.refreshEndpoint??"/api/auth/refresh";return i=>{let c=n.getItem(t),a=n.getItem(o),f={token:c,user:a?JSON.parse(a):null,get isLoggedIn(){return this.token!==null},login(m,y,v){f.token=m,f.user=y,n.setItem(t,m),n.setItem(o,JSON.stringify(y)),v&&n.setItem(r,v)},logout(){f.token=null,f.user=null,n.removeItem(t),n.removeItem(o),n.removeItem(r)},setUser(m){f.user=m,n.setItem(o,JSON.stringify(m))},async refresh(){let m=n.getItem(r);if(!m)return!1;try{let y=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:m})});if(!y.ok)return f.logout(),!1;let v=await y.json();return f.token=v.token,n.setItem(t,v.token),v.refreshToken&&n.setItem(r,v.refreshToken),!0}catch{return!1}}};return c&&Hn(c)&&f.refresh().catch(()=>{}),F(i,{auth:f})}}function jn(e,n){let t=null;return o=>{if(t){let s=o.fallback;return typeof s=="function"?s({error:t}):s??null}n.ui._errorHandler=s=>{t=s,n.ui.render()};let r=o.children;try{return r??null}catch(s){t=s;let i=o.fallback;return typeof i=="function"?i({error:s}):i??null}}}var Ae={components:{Button:{loading:"\u52A0\u8F7D\u4E2D..."},FileUpload:{placeholder:"\u70B9\u51FB\u6216\u62D6\u62FD\u4E0A\u4F20\u6587\u4EF6",supportedFormats:"\u652F\u6301\u683C\u5F0F: ",maxSize:"\u6700\u5927 ",remove:"\u5220\u9664"},Pagination:{ariaLabel:"\u5206\u9875"},ProgressBar:{ariaLabel:"\u8FDB\u5EA6"},Switch:{ariaLabel:"\u5207\u6362"},Breadcrumb:{ariaLabel:"\u9762\u5305\u5C51"},Modal:{ariaLabel:"\u5F39\u7A97"},Confirm:{confirmText:"\u786E\u5B9A",cancelText:"\u53D6\u6D88"},Drawer:{ariaLabel:"\u4FA7\u8FB9\u9762\u677F"},DatePicker:{w0:"\u65E5",w1:"\u4E00",w2:"\u4E8C",w3:"\u4E09",w4:"\u56DB",w5:"\u4E94",w6:"\u516D",hour:"\u65F6",minute:"\u5206",time:"\u65F6\u95F4",confirm:"\u786E\u5B9A",cancel:"\u53D6\u6D88",placeholder:"\u9009\u62E9\u65E5\u671F"}}};var ke={components:{Button:{loading:"Loading..."},FileUpload:{placeholder:"Click or drag to upload",supportedFormats:"Supported formats: ",maxSize:"Max size: ",remove:"Remove"},Pagination:{ariaLabel:"Pagination"},ProgressBar:{ariaLabel:"Progress"},Switch:{ariaLabel:"Toggle"},Breadcrumb:{ariaLabel:"Breadcrumb"},Modal:{ariaLabel:"Dialog"},Confirm:{confirmText:"OK",cancelText:"Cancel"},Drawer:{ariaLabel:"Panel"},DatePicker:{w0:"Su",w1:"Mo",w2:"Tu",w3:"We",w4:"Th",w5:"Fr",w6:"Sa",hour:"Hour",minute:"Min",time:"Time",confirm:"OK",cancel:"Cancel",placeholder:"Pick a date"}}};var ae={"zh-CN":Ae,"en-US":ke};function ze(e){if(ae[e])return e;let n=e.split("-")[0];return Object.keys(ae).find(o=>o.startsWith(n))??"zh-CN"}function Dn(e={}){let{locale:n="zh-CN",messages:t={},components:o={}}=e,r=ze(n),s=ae[r],i=Ge(s,t,o),c={locale:r,t:(a,f)=>i.messages?.[a]??f??a,setLocale:()=>{},components:i.components};return a=>(a.i18n=c,c.setLocale=f=>{let m=ze(f),y=ae[m];y&&(i=Ge(y,t,o),c.locale=m,c.components=i.components,a?.ui?.bumpCtxVersion?.(),a?.ui?.render())},a)}function Ge(e,n,t){return{messages:{...e?.messages,...n},components:qn(e?.components??{},t)}}function qn(e,n){let t={...e};for(let o of Object.keys(n))typeof n[o]=="object"&&n[o]!==null&&typeof t[o]=="object"?t[o]={...t[o],...n[o]}:t[o]=n[o];return t}var le=0,Je="",Ye="",Qe="",Xe="",ue=0;function Ze(){return typeof window<"u"&&typeof document<"u"}function Fn(){if(le++,le>1||!Ze())return;ue=window.scrollY;let e=document.body;Je=e.style.overflow,Ye=e.style.position,Qe=e.style.top,Xe=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=`-${ue}px`,e.style.width="100%")}function $n(){if(le--,le>0||!Ze())return;let e=document.body;e.style.overflow=Je,e.style.position=Ye,e.style.top=Qe,e.style.width=Xe,ue>0&&window.scrollTo(0,ue)}var Bn='a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';function Kn(e){let n=e.querySelectorAll(Bn);if(n.length===0)return()=>{};let t=n[0],o=n[n.length-1],r=i=>{i.key==="Tab"&&(i.shiftKey&&document.activeElement===t?(i.preventDefault(),o.focus()):!i.shiftKey&&document.activeElement===o&&(i.preventDefault(),t.focus()))},s=document.activeElement;return queueMicrotask(()=>{t.focus()}),e.addEventListener("keydown",r),()=>{e.removeEventListener("keydown",r),s?.focus()}}function zn(e,n,t=400){let o=!1,r=()=>{o||(o=!0,e.removeEventListener("animationend",r),clearTimeout(s),n())};e.addEventListener("animationend",r);let s=setTimeout(r,t)}export{ie as ApiError,jn as ErrorBoundary,j as Fragment,H as Portal,Wn as RouteView,Pe as aiStream,zn as animateOut,Vn as api,rn as asyncComponent,Un as auth,S as callRefCleanup,G as clearAsyncComponentCache,kn as computeFixedPos,re as computeFixedPosRect,Nn as createApp,pe as createPortal,ke as enUS,F as extendCtx,ln as h,ve as hydrateVNode,Dn as i18n,z as isAsyncComponent,de as jsx,an as jsxDEV,sn as jsxs,Fn as lockScroll,wn as mountVNode,q as patchValue,Mn as router,qe as toChatMessages,Kn as trapFocus,$n as unlockScroll,On as ws,Ae as zhCN};
|
|
3
|
+
`);o=u.pop()??"";for(let f of u){let c="message",d="";for(let y of f.split(`
|
|
4
|
+
`))y.startsWith("event: ")?c=y.slice(7):y.startsWith("data: ")&&(d+=y.slice(6));if(d)try{yield{name:c,data:JSON.parse(d)}}catch{}}}}finally{n.releaseLock()}}function Nn(e,n,t){t&&(e.length>=1e3&&e.shift(),e.push(n))}function Ln(e){return e===401||e===403?"auth_failed":e===429?"rate_limited":e>=500?"provider_error":"invalid_request"}function Mn(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`trace-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function Je(e){return e.map(n=>({role:n.role,content:n.content}))}function Se(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`msg-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function Qe(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 s(){if(!e.streaming)return;let r=e.messages[e.messages.length-1];return r&&r.role==="assistant"&&r.status==="streaming"?r:void 0}function l(r,i,a){let p=s();switch(r){case"wf:token":p&&(p.content+=i.text);break;case"wf:tool_call":{p&&(p.toolCalls||(p.toolCalls=[]),p.toolCalls.push({call:i,status:"running"}));break}case"wf:tool_progress":{let m=i,h=p?.toolCalls?.find(w=>w.call.id===m.toolCallId);h&&(h.progress=m);break}case"wf:tool_result":{let m=i,h=p?.toolCalls?.find(w=>w.call.id===m.id);h&&(h.result=m,h.status=m.ok?"ok":"error");break}case"wf:approval_request":p&&(p.approval=i);break;case"wf:usage":p&&(p.usage=i);break;case"wf:step":e.step=i;break;case"wf:done":p&&(p.status="done",p.approval=void 0),e.streaming=!1,e.step=null;break;case"wf:error":p&&(p.status="error",p.error=i,p.approval=void 0),e.error=i,e.streaming=!1,e.step=null;break;default:a?.(r,i);break}}function u(){let r=t.body?t.body(e.messages):{messages:Je(e.messages)};o=n(t.url,r,{onToken:a=>l("wf:token",{text:a}),onToolCall:a=>l("wf:tool_call",a),onToolProgress:a=>l("wf:tool_progress",a),onToolResult:a=>l("wf:tool_result",a),onApproval:a=>l("wf:approval_request",a),onUsage:a=>l("wf:usage",a),onStep:a=>l("wf:step",a),onDone:a=>l("wf:done",a),onError:a=>l("wf:error",a),onEvent:(a,p)=>l(a,p,t.onEvent)},{signal:t.signal,headers:t.headers}),e.streaming=!0;let i=s();i&&o?.traceId&&(i.id=o.traceId)}function f(){if(e.streaming)return;let r=String(e.input??"").trim();r&&(e.input="",e.error=null,e.usage=null,e.step=null,e.messages.push({id:Se(),role:"user",content:r,status:"done"},{id:Se(),role:"assistant",content:"",status:"streaming",toolCalls:[]}),u())}function c(){o?.abort(),e.streaming=!1,e.step=null;let r=e.messages[e.messages.length-1];r&&r.role==="assistant"&&r.status==="streaming"&&(!r.content&&(!r.toolCalls||r.toolCalls.length===0)?e.messages.pop():r.status="done")}function d(){if(e.streaming)return;let r=-1;for(let i=e.messages.length-1;i>=0;i--)if(e.messages[i].role==="user"){r=i;break}r!==-1&&(e.messages.splice(r+1),e.error=null,e.usage=null,e.step=null,e.messages.push({id:Se(),role:"assistant",content:"",status:"streaming",toolCalls:[]}),u())}function y(){o?.abort(),e.messages=[],e.input="",e.streaming=!1,e.error=null,e.usage=null,e.step=null}async function g(r,i){let a=e.messages[e.messages.length-1],p=a?.role==="assistant"?a.approval:void 0;if(p&&(a.approval=void 0,!!t.approveUrl))try{await fetch(t.approveUrl,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify({id:p.id,decision:r,note:i}),signal:t.signal})}catch(m){if(t.signal?.aborted)return;e.error={code:"provider_error",message:m instanceof Error?m.message:String(m)}}}function E(){o?.abort(),o=null}return{send:f,stop:c,retry:d,clear:y,approve:g,dispose:E}}function ue(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 On(e,n="bottom",t=6,o=!0){return ue(e.getBoundingClientRect(),n,t,o)}function ce(e,n,t=8){if(!n)return e;let o=n.getBoundingClientRect();if(o.width===0&&o.height===0)return e;let s=Number.parseFloat(n.style.top)||o.top,l=Number.parseFloat(n.style.left)||o.left,u=e.top-s,f=e.left-l,c={top:o.top+u,bottom:o.bottom+u,left:o.left+f,right:o.right+f},d=window.innerWidth,y=window.innerHeight,g=e.top,E=e.left;return c.bottom>y-t&&(g=Math.max(t,g-(c.bottom-(y-t)))),c.top<t&&(g=Math.max(t,g+(t-c.top))),c.right>d-t&&(E=Math.max(t,E-(c.right-(d-t)))),c.left<t&&(E=Math.max(t,E+(t-c.left))),{top:g,left:E,width:e.width}}var Ze=new Set,ee=new Map;function en(e){let{ctx:n,renderByIds:t,getSelfId:o,dirtyBatch:s,dirtySet:l,mediaRegistry:u,popupTrackers:f,scrollTrackers:c,schedulePopupRecompute:d,ensurePopupListeners:y,isRendering:g}=e;return{_selfId:"_wf_root",_ctxVersion:0,_dirtySet:l,bumpCtxVersion:function(){this._ctxVersion++},render:function(r){if(!r||r.length===0){let i=o(this);if(i)r=[i];else return}t(r)},dirty:function(r){if(!g()){if(!r||r.length===0){let i=o(this);if(i)r=[i];else return}for(let i of r)i&&(s.add(i),l.add(i));this._dirtyScheduled||(this._dirtyScheduled=!0,queueMicrotask(()=>{this._dirtyScheduled=!1;let i=[...s];s.clear(),i.length>0&&t(i)}))}},$:function(){let r=this;if(!r._$cache){let i=o(this);r._$cache=le(()=>n.ui.dirty(i?[i]:void 0))}return r._$cache},useChat:function(r){let i=this.$(),a=Qe(i,Re,r);return Object.assign(i,{send:a.send,stop:a.stop,retry:a.retry,clear:a.clear,approve:a.approve,dispose:a.dispose}),i},useMedia:function(r,i){let p=`media:${o(this)}:${r}`;if(!u.has(p)){let m=window.matchMedia(r);i(m.matches);let h=w=>i(w.matches);m.addEventListener("change",h),u.set(p,{mql:m,handler:h})}},useBreakpoint:function(r,i){let a=typeof r=="function"?{mobile:"(max-width: 639px)",tablet:"(min-width: 640px) and (max-width: 1023px)",desktop:"(min-width: 1024px)"}:r,p=typeof r=="function"?r:i,h=`bp:${o(this)}`;function w(){for(let[v,b]of Object.entries(a))if(window.matchMedia(b).matches)return v;return Object.keys(a)[0]??""}if(!u.has(h)){p(w());let v=[];for(let b of Object.values(a)){let T=window.matchMedia(b),C=()=>p(w());T.addEventListener("change",C),v.push({mql:T,handler:C})}u.set(h,{mqls:v})}},usePopupPosition:function(r){let i=o(this),a={top:0,left:0,refresh:()=>{}};if(!i)return a;let p={pos:a,getEl:r.el,isOpen:r.isOpen,compute:r.compute,panel:r.panel,margin:r.margin??8};return f.set(i,p),y(),a.refresh=()=>{let m=p.getEl();if(!m)return;let h=p.compute(m.getBoundingClientRect());Object.assign(a,ce(h,p.panel?.(),p.margin))},a},useHoverCapable:function(){return typeof window<"u"&&!!window.matchMedia?.("(hover: hover)").matches},useStableRef:function(r,i){return p=>{p?r(p):i?.()}},useVisualViewport:function(){let r=o(this),i={height:window.innerHeight,offsetTop:0,keyboardOpen:!1},a=()=>{n.ui&&n.ui.dirty(r?[r]:void 0)},p=()=>{let h=window.visualViewport;i.height=h?.height??window.innerHeight,i.offsetTop=h?.offsetTop??0,i.keyboardOpen=i.height<window.innerHeight*.9,a()},m=window.visualViewport;return m?.addEventListener?(m.addEventListener("resize",p),m.addEventListener("scroll",p)):window.addEventListener("resize",p),r&&F(h=>{h===r&&(m?.removeEventListener?(m.removeEventListener("resize",p),m.removeEventListener("scroll",p)):window.removeEventListener("resize",p))}),i},usePopup:function(r){let i=o(this),a=this.useHoverCapable(),p=()=>typeof r.trigger=="function"?r.trigger():r.trigger,m=r.open!==void 0,h=()=>!!r.disabled?.(),w=()=>m?typeof r.open=="function"?!!r.open():!!r.open:r.isOpen(),v=P=>{h()||(m?r.onOpenChange?.(P):r.setOpen(P))},b=()=>{let P=r.placement;return typeof P=="function"?P():P??"bottom"},T=null,C=!1,x=n.ui.usePopupPosition({el:r.el,isOpen:()=>w(),compute:P=>{if(r.position){let M=r.position();return{top:M.y,left:M.x}}return ue(P,b(),r.gap??6,r.center!==!1)},panel:()=>T,margin:r.margin??8}),A=P=>{if(r.closeOnOutside===!1||!w())return;let M=P.target;if(!(M instanceof Node))return;let q=r.el();q&&q.contains(M)||T&&T.contains(M)||v(!1)},S=P=>{r.closeOnEscape!==!1&&(P.key!=="Escape"||!w()||v(!1))};document.addEventListener("mousedown",A),document.addEventListener("keydown",S),i&&F(P=>{P===i&&(document.removeEventListener("mousedown",A),document.removeEventListener("keydown",S))});let R={},_=P=>typeof P=="function"?P():P??0,k=()=>_(r.openDelay),j=()=>_(r.closeDelay),O,W,sn=()=>{clearTimeout(O),clearTimeout(W),O=void 0,W=void 0};if(p()==="hover")a?(R.onMouseEnter=()=>{h()||(clearTimeout(W),W=void 0,O=setTimeout(()=>{O=void 0,v(!0)},k()))},R.onMouseLeave=()=>{h()||(clearTimeout(O),O=void 0,W=setTimeout(()=>{W=void 0,v(!1)},j()))}):R.onClick=()=>v(!w()),R.onFocus=()=>{h()||(clearTimeout(W),W=void 0,O=setTimeout(()=>{O=void 0,v(!0)},k()))},R.onBlur=()=>{h()||(clearTimeout(O),O=void 0,W=setTimeout(()=>{W=void 0,v(!1)},j()))};else if(p()==="click")R.onClick=()=>v(!w());else if(p()==="longpress"){let P,M=0,q=0,U=()=>{clearTimeout(P),P=void 0};R.onPointerDown=I=>{h()||(M=I.clientX??0,q=I.clientY??0,U(),P=setTimeout(()=>{P=void 0,r.onTrigger?.({clientX:M,clientY:q}),v(!0)},r.longPressDuration??500))},R.onPointerUp=U,R.onPointerLeave=U,R.onPointerMove=I=>{let pe=Math.abs((I.clientX??0)-M),me=Math.abs((I.clientY??0)-q);(pe>10||me>10)&&U()},R.onContextMenu=I=>{I.preventDefault(),r.onTrigger?.({clientX:I.clientX??0,clientY:I.clientY??0}),v(!0)}}R.onKeyDown=P=>{P.key==="Escape"&&r.closeOnEscape!==!1&&v(!1)},i&&F(P=>{P===i&&sn()});let an=P=>{if(P){T=P;let M=()=>x.refresh();P.addEventListener("animationend",M,{once:!0})}else T=null},ln=(P,M="popover")=>{if(h())return null;if(!w())return C=!1,null;C||(x.refresh(),C=!0);let U=P.props??{},I=U.ref,pe=["wf-popup",U.class].filter(Boolean).join(" "),me={...U.style??{},position:"fixed",top:`${x.top}px`,left:`${x.left}px`,maxWidth:r.width!==void 0?`min(${r.width}px, calc(100vw - 32px))`:"calc(100vw - 32px)"},un={...P,props:{...U,class:pe,style:me,ref:Me=>{an(Me),I&&I(Me)}}};return ge(un,M)};return{open:w(),setOpen:v,wrapProps:R,portal:ln,refresh:()=>x.refresh()}},useLongPress:function(r){let{onLongPress:i,duration:a=500}=r,p,m=0,h=0,w=null,v=()=>{clearTimeout(p),p=void 0};return{onPointerDown:b=>{m=b.clientX??0,h=b.clientY??0,w=b,v(),p=setTimeout(()=>{p=void 0,i(w)},a)},onPointerUp:v,onPointerLeave:v,onPointerMove:b=>{let T=Math.abs((b.clientX??0)-m),C=Math.abs((b.clientY??0)-h);(T>10||C>10)&&v()},onContextMenu:b=>{b.preventDefault(),i(b)}}},useInView:function(r){let i=o(this),a={isIn:!1,ready:!1,observe:v,refresh:b,disconnect:T},p=null,m=null,h=()=>{n.ui&&n.ui.dirty(i?[i]:void 0)};function w(){if(m?.disconnect(),m=null,!p)return;let C=typeof r.rootMargin=="function"?r.rootMargin():r.rootMargin,x=typeof r.threshold=="function"?r.threshold():r.threshold;m=new IntersectionObserver(A=>{let S=A[A.length-1];if(!S)return;let R=S.isIntersecting,_=R!==a.isIn,k=!a.ready;a.isIn=R,a.ready=!0,r.onChange?.(S,R),(_||k)&&h()},{root:r.root?r.root():null,rootMargin:C??"0px",threshold:x??0}),m.observe(p)}function v(C){p=C,C?w():(m?.disconnect(),m=null,a.isIn=!1)}function b(){w()}function T(){m?.disconnect(),m=null}return a},useScrollPosition:function(r){let i=o(this),a={y:0,refresh(){let m=p.getScroller();a.y=m instanceof Window?document.scrollingElement?.scrollTop??m.scrollY??0:m.scrollTop??0}},p={handle:a,getScroller:r.getScroller??(()=>window)};return i?(c.set(i,p),y(),a.refresh(),a):(a.refresh(),a)},useAsync:function(r){let i=o(this),a=le(()=>{n.ui&&n.ui.dirty(i?[i]:void 0)});a.loading=!0;let p=0,m=()=>{let h=++p;a.loading=!0,a.error=null,Promise.resolve().then(()=>r()).then(w=>{p===h&&(a.data=w,a.loading=!1)}).catch(w=>{p===h&&(a.error=w,a.loading=!1)})};return m(),a.reload=m,a},useControlled:function(r){let i=o(this),a=r.value!==void 0;a&&!r.onChange&&r.name&&(Ze.has(r.name)||(Ze.add(r.name),console.warn(`[weifuwu/${r.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)}`))),!a&&i&&!ee.has(i)&&(ee.set(i,r.value),F(m=>{ee.delete(m)}));let p=m=>{if(a){r.onChange?.(m);return}i&&ee.set(i,m),n.ui&&(i?n.ui.dirty([i]):n.ui.render())};return{value:a?r.value:i?ee.get(i):r.value,setValue:p,controlled:a}},usePresence:function(r){let i=o(this),a="closed",p,m=()=>{a="closed",n.ui&&(i?n.ui.dirty([i]):n.ui.render())};return{get phase(){return a},ref:w=>{w?p||(p=()=>{a==="exit"&&m()},w.addEventListener("animationend",p)):(w?.removeEventListener("animationend",p),p=void 0)},sync:w=>(w?a="open":a==="open"&&(a="exit"),a)}},useDialog:function(r){let i=o(this),a,p=null,m=this.usePresence(r);return{get phase(){return m.phase},rootRef:v=>{v?(Ae(),p&&(a=ae(p)),m.ref(v)):(_e(),a?.(),m.ref(null))},panelRef:v=>{p=v,v&&!a&&(a=ae(v))},sync:v=>m.sync(v)}},useGlobalKey:function(r){let i=o(this);return typeof window>"u"?()=>{}:(window.addEventListener("keydown",r),i&&F(a=>{a===i&&window.removeEventListener("keydown",r)}),()=>window.removeEventListener("keydown",r))},useDrag:function(r){let i=0,a=0,p=!1,m=v=>{p&&r.onMove(v,{x:v.clientX-i,y:v.clientY-a})},h=v=>{p&&(p=!1,window.removeEventListener("pointermove",m),window.removeEventListener("pointerup",h),r.onEnd?.(v))};return{onPointerDown:v=>{p||(p=!0,i=v.clientX,a=v.clientY,window.addEventListener("pointermove",m),window.addEventListener("pointerup",h),r.onStart?.(v))}}},useDragDrop:function(r){let i={};return r.onDrop&&(i.onDrop=a=>{a.preventDefault(),r.onDrop(a)}),r.onDragOver&&(i.onDragOver=a=>{a.preventDefault(),r.onDragOver(a)}),r.onDragLeave&&(i.onDragLeave=a=>r.onDragLeave(a)),{dropProps:i}},useReducedMotion:function(){return typeof window<"u"&&!!window.matchMedia?.("(prefers-reduced-motion: reduce)").matches},useAnimationEnd:function(r,i){let a=null,p=()=>{r(),i?.once&&a&&a.removeEventListener("animationend",p)};return h=>{h?(a=h,h.addEventListener("animationend",p)):a&&(a.removeEventListener("animationend",p),a=null)}},useTween:function(r,i){let a=o(this),p=this.useReducedMotion(),m=i?.duration??400,h=i?.ease==="linear"?x=>x:x=>1-Math.pow(1-x,3),w,v=r,b={value:p?r:0,reset:()=>{}},T=()=>{n.ui&&(a?n.ui.dirty([a]):n.ui.render())},C=x=>{if(v=x,p){b.value=x,T();return}if(x===b.value)return;w&&cancelAnimationFrame(w);let A=b.value,S=performance.now(),R=_=>{let k=Math.min(1,(_-S)/m);b.value=Math.round(A+(x-A)*h(k)),k<1?(w=requestAnimationFrame(R),T()):(w=void 0,T())};w=requestAnimationFrame(R)};return b.reset=x=>{x===v&&w||C(x)},queueMicrotask(()=>C(r)),b},selfId:function(r){if(typeof r!="string"||!r)throw new Error(`[weifuwu] selfId requires a non-empty string, got ${typeof r}`);if(L.has(r))throw new Error(`[weifuwu] Duplicate component ID: "${r}". Each component must have a unique custom ID.`);let i=this._selfVNode;i&&(i._customId=r,L.set(r,i))}}}function Wn(){let e=[],n={},t=null,o=null,s=null,l=!1,u=new Set,f=!1,c=new Map;function d(b){let T=c.get(b);T&&(T.mql&&T.handler&&T.mql.removeEventListener("change",T.handler),T.mqls?.forEach(({mql:C,handler:x})=>C.removeEventListener("change",x)),c.delete(b))}let y=new Map,g=!1,E=0;function r(){g||(g=!0,window.addEventListener("scroll",p,{capture:!0,passive:!0}),window.addEventListener("resize",p))}function i(){g&&(window.removeEventListener("scroll",p,{capture:!0}),window.removeEventListener("resize",p),g=!1)}let a=new Map;function p(){E||(E=requestAnimationFrame(()=>{E=0;let b=[];for(let[T,C]of y){if(!C.isOpen())continue;let x=C.getEl();if(!x)continue;let A=C.compute(x.getBoundingClientRect());Object.assign(C.pos,ce(A,C.panel?.(),C.margin)),b.push(T)}for(let[T,C]of a){let x=C.getScroller(),A=x instanceof Window?document.scrollingElement?.scrollTop??x.scrollY??0:x.scrollTop??0;A!==C.handle.y&&(C.handle.y=A,b.push(T))}b.length>0&&n.ui.render(b)}))}function m(b){if(!l){l=!0;for(let T of b){let C=L.get(T);if(!C||!C._render)continue;n.ui._dirtySet?.delete(T);let x=C._child,A=C._render(C.props);if(C._child=A,x&&x._placement==="remote"||A&&A._placement==="remote"){x&&A?Q(x,A,n):A?B(A,n):x&&N(x);continue}if(!C._parentNode&&C._refNode&&(C._parentNode=C._refNode.parentNode),C._parentNode){let S=$(C._parentNode,C._refNode??null,x,A,n);S&&S!==C._refNode?C._refNode=S:S||(C._refNode=null)}}l=!1,h()}}function h(){let b=n.ui;u.size>0&&!b._dirtyScheduled&&(b._dirtyScheduled=!0,queueMicrotask(()=>{b._dirtyScheduled=!1;let T=[...u];u.clear(),T.length>0&&m(T)}))}function w(b){return b?._selfId??n.ui?._selfId}let v={get ctx(){return n},use(b){return e.push(b),v},async mount(b,T,C){o=T;for(let _ of e)n=await _(n);let x=typeof b=="string"?document.querySelector(b):b;if(!x)throw new Error(`mount target not found: ${b}`);t=x;let A=!!C?.hydrate;A||(t.innerHTML="");let S=new Map,R=globalThis.__DATA__;if(R&&typeof R=="object")for(let[_,k]of Object.entries(R))S.set(_,{value:k});if(n.data={async get(_,k){let j=S.get(_);if(j&&"value"in j)return j.value;if(j?.promise)return j.promise;if(!k)return;let O=Promise.resolve().then(()=>k()).then(W=>(S.set(_,{value:W}),W));return S.set(_,{promise:O}),O},set(_,k){S.set(_,{value:k})},has(_){return S.has(_)}},F(_=>{for(let k of[...c.keys()])(k.startsWith(`media:${_}:`)||k===`bp:${_}`)&&d(k);y.delete(_),a.delete(_)}),n.ui=en({ctx:n,renderByIds:m,getSelfId:w,dirtyBatch:u,dirtySet:new Set,mediaRegistry:c,popupTrackers:y,scrollTrackers:a,schedulePopupRecompute:p,ensurePopupListeners:r,destroyPopupListeners:i,isRendering:()=>l}),l=!0,s=Vn(T,n),s._id="_wf_root",s._parentNode=t,s._refNode=A?t.firstChild:null,L.set("_wf_root",s),A)await Pe(t,s,n);else{let _=Ke(s,n);_ instanceof Node&&t.appendChild(_)}s._refNode=t.firstChild,l=!1,h()},destroy(){i(),y.clear(),a.clear();for(let b of[...c.keys()])d(b);L.clear(),t&&(t.innerHTML=""),t=null,n={}}};return v}function Vn(e,n){return{type:e,props:{},key:void 0}}function In(e,n){if(!n||n==="/")return e||"/";let t=e.endsWith("/")?e.slice(0,-1):e,o=n.startsWith("/")?n:"/"+n;return t+o}function Hn(e){let n=[],t=e.replace(/:(\w+)/g,(o,s)=>(n.push(s),"([^/]+)")).replace(/\*/g,".*");return{re:new RegExp(`^${t}$`),keys:n}}function ke(e,n="",t=[]){let o=[];for(let s of e){let l=In(n,s.path),{re:u,keys:f}=Hn(l),c=[...t,s];o.push({re:u,keys:f,def:s,chain:c}),s.children&&o.push(...ke(s.children,l,c))}return o}function nn(e,n){let t=null;for(let o of n)e.match(o.re)&&(!t||o.chain.length>t.chain.length)&&(t=o);return t}function tn(e,n){let t={},o=e.match(n.re);if(o)for(let s=0;s<n.keys.length;s++)t[n.keys[s]]=decodeURIComponent(o[s+1]);return t}function Un(e){let n=ke(e.routes),t=e.mode||"history";function o(){return t==="hash"?window.location.hash.replace(/^#/,"")||"/":window.location.pathname}function s(l){let u=nn(l,n);if(u){let f=u.chain[u.chain.length-1];return{path:u.def.path,params:tn(l,u),query:Object.fromEntries(new URLSearchParams(window.location.search)),chain:u.chain,title:f?.title??""}}return{path:l,params:{},query:Object.fromEntries(new URLSearchParams(window.location.search)),chain:e.notFound?[{component:e.notFound,title:"Not Found"}]:[],title:""}}return l=>{let u=s(o());l.route=u,u.title&&(document.title=u.title),l.app||(l.app={}),l.app.navigate=c=>{if(Y(),t==="hash"){window.location.hash="#"+c;let d=s(c);l.route=d}else{window.history.pushState({},"",c);let d=s(c);l.route=d}l.route?.title&&(document.title=l.route.title),l.ui?.bumpCtxVersion?.(),l.ui?.render()};let f=()=>{Y();let c=s(o());l.route=c,l.route?.title&&(document.title=l.route.title),l.ui?.bumpCtxVersion?.(),l.ui?.render()};return window.addEventListener("popstate",f),t==="hash"&&window.addEventListener("hashchange",f),l}}function Dn(e,n){let t=n.route?._rvDepth??0;return()=>{let o=n.route;if(!o?.chain?.length||t>=o.chain.length)return null;let s=o.chain[t],l=s.layout??s.component;return l?(s.layout&&(o._rvDepth=t+1),{type:l,props:{},key:void 0}):null}}function K(e,n){return Object.assign(Object.create(e),n)}function jn(e={}){let n=e.url??"/ws",t=e.reconnectInterval??3e3,o=e.maxReconnect??10,s=e.pingInterval??3e4,l=e.pingTimeout??1e4;return u=>{let f=new Set,c=null,d=0,y=null,g=null,E=null,r=!1,i={isConnected:!1,onMessage:w=>(f.add(w),()=>{f.delete(w)}),send:w=>{c?.readyState===WebSocket.OPEN&&c.send(JSON.stringify(w))},_connect:a,close:()=>{r=!0,h(),c?.close(),c=null,i.isConnected=!1}};async function a(){if(!r)try{c=new WebSocket(n),c.onopen=()=>{i.isConnected=!0,d=0,p()},c.onmessage=w=>{try{let v=JSON.parse(w.data);for(let b of f)b(v)}catch{}m()},c.onclose=()=>{i.isConnected=!1,h(),!r&&d<o&&(d++,y=setTimeout(a,t*Math.min(d,5)))},c.onerror=()=>{c?.close()}}catch{r||(y=setTimeout(a,t))}}function p(){s<=0||(g=setInterval(()=>{c?.readyState===WebSocket.OPEN&&c.send(JSON.stringify({type:"ping"})),E=setTimeout(()=>{c?.close()},l)},s))}function m(){clearTimeout(E)}function h(){clearInterval(g),clearTimeout(E),clearTimeout(y)}return a(),K(u,{ws:i})}}function Fn(e){let n={baseURL:e?.baseURL??"",headers:{"Content-Type":"application/json",...e?.headers}},t=e?.onRequest,o=e?.onResponse,s=e?.timeout??0;async function l(u,f,c,d){let y=n.baseURL+f,g={method:u,headers:{...n.headers,...d?.headers}},E=e?.token?.();E&&!g.headers.Authorization&&(g.headers.Authorization=`Bearer ${E}`);let r=s>0,i=!!d?.signal,a=null,p=null;(r||i)&&(a=new AbortController,g.signal=a.signal,r&&(p=setTimeout(()=>a.abort(new Error("Request timed out")),s)),i&&d.signal.addEventListener("abort",()=>a.abort())),c!==void 0&&u!=="GET"&&u!=="HEAD"&&(g.body=JSON.stringify(c));let m={url:y,init:g};t&&(m=t(m));try{let h=await fetch(m.url,m.init);if(o)return o(h);if(!h.ok){let b=await h.text().catch(()=>"");throw new fe(h.status,b||h.statusText)}let w=h.headers.get("content-length");if(h.status===204||w==="0")return;let v=(h.headers.get("content-type")||"").toLowerCase();return v.includes("application/json")||v.includes("json")?h.json():h.text()}finally{p&&clearTimeout(p)}}return u=>K(u,{api:{get:(c,d)=>l("GET",c,void 0,d),post:(c,d,y)=>l("POST",c,d,y),put:(c,d,y)=>l("PUT",c,d,y),patch:(c,d,y)=>l("PATCH",c,d,y),delete:(c,d)=>l("DELETE",c,void 0,d)}})}var fe=class extends Error{status;body;constructor(n,t){super(`API Error ${n}: ${t}`),this.name="ApiError",this.status=n,this.body=t}};function qn(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 $n(e){let n=qn(e);return n?.exp?n.exp*1e3-3e4<Date.now():!0}function Kn(e){let n=e?.storage??localStorage,t=e?.tokenKey??"weifuwu_token",o=e?.userKey??"weifuwu_user",s=e?.refreshTokenKey??"weifuwu_refresh",l=e?.refreshEndpoint??"/api/auth/refresh";return u=>{let f=n.getItem(t),c=n.getItem(o),d={token:f,user:c?JSON.parse(c):null,get isLoggedIn(){return this.token!==null},login(y,g,E){d.token=y,d.user=g,n.setItem(t,y),n.setItem(o,JSON.stringify(g)),E&&n.setItem(s,E)},logout(){d.token=null,d.user=null,n.removeItem(t),n.removeItem(o),n.removeItem(s)},setUser(y){d.user=y,n.setItem(o,JSON.stringify(y))},async refresh(){let y=n.getItem(s);if(!y)return!1;try{let g=await fetch(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:y})});if(!g.ok)return d.logout(),!1;let E=await g.json();return d.token=E.token,n.setItem(t,E.token),E.refreshToken&&n.setItem(s,E.refreshToken),!0}catch{return!1}}};return f&&$n(f)&&d.refresh().catch(()=>{}),K(u,{auth:d})}}function Bn(e,n){let t=null;return o=>{if(t){let l=o.fallback;return typeof l=="function"?l({error:t}):l??null}n.ui._errorHandler=l=>{t=l,n.ui.render()};let s=o.children;try{return s??null}catch(l){t=l;let u=o.fallback;return typeof u=="function"?u({error:l}):u??null}}}var Ne={components:{Button:{loading:"\u52A0\u8F7D\u4E2D..."},FileUpload:{placeholder:"\u70B9\u51FB\u6216\u62D6\u62FD\u4E0A\u4F20\u6587\u4EF6",supportedFormats:"\u652F\u6301\u683C\u5F0F: ",maxSize:"\u6700\u5927 ",remove:"\u5220\u9664"},Pagination:{ariaLabel:"\u5206\u9875"},ProgressBar:{ariaLabel:"\u8FDB\u5EA6"},Switch:{ariaLabel:"\u5207\u6362"},Breadcrumb:{ariaLabel:"\u9762\u5305\u5C51"},Modal:{ariaLabel:"\u5F39\u7A97",closeAria:"\u5173\u95ED"},Confirm:{confirmText:"\u786E\u5B9A",cancelText:"\u53D6\u6D88"},Drawer:{ariaLabel:"\u4FA7\u8FB9\u9762\u677F",closeAria:"\u5173\u95ED"},DatePicker:{w0:"\u65E5",w1:"\u4E00",w2:"\u4E8C",w3:"\u4E09",w4:"\u56DB",w5:"\u4E94",w6:"\u516D",hour:"\u65F6",minute:"\u5206",time:"\u65F6\u95F4",confirm:"\u786E\u5B9A",cancel:"\u53D6\u6D88",placeholder:"\u9009\u62E9\u65E5\u671F"}}};var Le={components:{Button:{loading:"Loading..."},FileUpload:{placeholder:"Click or drag to upload",supportedFormats:"Supported formats: ",maxSize:"Max size: ",remove:"Remove"},Pagination:{ariaLabel:"Pagination"},ProgressBar:{ariaLabel:"Progress"},Switch:{ariaLabel:"Toggle"},Breadcrumb:{ariaLabel:"Breadcrumb"},Modal:{ariaLabel:"Dialog",closeAria:"Close"},Confirm:{confirmText:"OK",cancelText:"Cancel"},Drawer:{ariaLabel:"Panel",closeAria:"Close"},DatePicker:{w0:"Su",w1:"Mo",w2:"Tu",w3:"We",w4:"Th",w5:"Fr",w6:"Sa",hour:"Hour",minute:"Min",time:"Time",confirm:"OK",cancel:"Cancel",placeholder:"Pick a date"}}};var de={"zh-CN":Ne,"en-US":Le};function on(e){if(de[e])return e;let n=e.split("-")[0];return Object.keys(de).find(o=>o.startsWith(n))??"zh-CN"}function zn(e={}){let{locale:n="zh-CN",messages:t={},components:o={}}=e,s=on(n),l=de[s],u=rn(l,t,o),f={locale:s,t:(c,d)=>u.messages?.[c]??d??c,setLocale:()=>{},components:u.components};return c=>(c.i18n=f,f.setLocale=d=>{let y=on(d),g=de[y];g&&(u=rn(g,t,o),f.locale=y,f.components=u.components,c?.ui?.bumpCtxVersion?.(),c?.ui?.render())},c)}function rn(e,n,t){return{messages:{...e?.messages,...n},components:Yn(e?.components??{},t)}}function Yn(e,n){let t={...e};for(let o of Object.keys(n))typeof n[o]=="object"&&n[o]!==null&&typeof t[o]=="object"?t[o]={...t[o],...n[o]}:t[o]=n[o];return t}function Gn(e,n,t=400){let o=!1,s=()=>{o||(o=!0,e.removeEventListener("animationend",s),clearTimeout(l),n())};e.addEventListener("animationend",s);let l=setTimeout(s,t)}export{fe as ApiError,Bn as ErrorBoundary,D as Fragment,H as Portal,Dn as RouteView,Re as aiStream,Gn as animateOut,Fn as api,cn as asyncComponent,Kn as auth,N as callRefCleanup,Y as clearAsyncComponentCache,On as computeFixedPos,ue as computeFixedPosRect,Wn as createApp,ge as createPortal,le as createReactiveState,Le as enUS,K as extendCtx,pn as h,Pe as hydrateVNode,zn as i18n,z as isAsyncComponent,ye as jsx,dn as jsxDEV,fn as jsxs,Ae as lockScroll,En as mountVNode,$ as patchValue,Un as router,Je as toChatMessages,ae as trapFocus,_e as unlockScroll,jn as ws,Ne as zhCN};
|
|
@@ -26,6 +26,7 @@ export declare const enUS: {
|
|
|
26
26
|
};
|
|
27
27
|
Modal: {
|
|
28
28
|
ariaLabel: string;
|
|
29
|
+
closeAria: string;
|
|
29
30
|
};
|
|
30
31
|
Confirm: {
|
|
31
32
|
confirmText: string;
|
|
@@ -33,6 +34,7 @@ export declare const enUS: {
|
|
|
33
34
|
};
|
|
34
35
|
Drawer: {
|
|
35
36
|
ariaLabel: string;
|
|
37
|
+
closeAria: string;
|
|
36
38
|
};
|
|
37
39
|
DatePicker: {
|
|
38
40
|
w0: string;
|
|
@@ -26,6 +26,7 @@ export declare const zhCN: {
|
|
|
26
26
|
};
|
|
27
27
|
Modal: {
|
|
28
28
|
ariaLabel: string;
|
|
29
|
+
closeAria: string;
|
|
29
30
|
};
|
|
30
31
|
Confirm: {
|
|
31
32
|
confirmText: string;
|
|
@@ -33,6 +34,7 @@ export declare const zhCN: {
|
|
|
33
34
|
};
|
|
34
35
|
Drawer: {
|
|
35
36
|
ariaLabel: string;
|
|
37
|
+
closeAria: string;
|
|
36
38
|
};
|
|
37
39
|
DatePicker: {
|
|
38
40
|
w0: string;
|
package/dist/client/types.d.ts
CHANGED
|
@@ -21,6 +21,12 @@ export interface PopupPositionOptions {
|
|
|
21
21
|
/** 视口边缘安全边距(px,默认 8) */
|
|
22
22
|
margin?: number;
|
|
23
23
|
}
|
|
24
|
+
/** 响应式状态容器(createReactiveState 返回值)——深度 Proxy:任意层级赋值触发 dirty */
|
|
25
|
+
export interface ReactiveState {
|
|
26
|
+
/** 订阅状态变更(任意层级赋值/删除触发);返回退订函数 */
|
|
27
|
+
__watch: (cb: () => void) => () => void;
|
|
28
|
+
[key: string]: any;
|
|
29
|
+
}
|
|
24
30
|
/** 异步取数工具返回值 — ctx.ui.useAsync()(data/loading/error 响应式,reload 重跑) */
|
|
25
31
|
export interface UseAsyncHandle<T = any> {
|
|
26
32
|
data?: T;
|
|
@@ -44,6 +50,11 @@ export interface UsePopupOptions {
|
|
|
44
50
|
trigger: PopupTrigger | (() => PopupTrigger);
|
|
45
51
|
/** 弹出方向(支持 getter——动态读最新 props),默认 'bottom' */
|
|
46
52
|
placement?: Placement | (() => Placement);
|
|
53
|
+
/** 自由定位(支持 getter):提供则忽略 placement,直接用坐标(如右键菜单光标处) */
|
|
54
|
+
position?: () => {
|
|
55
|
+
x: number;
|
|
56
|
+
y: number;
|
|
57
|
+
};
|
|
47
58
|
/** 水平对齐:center=居中于触发元素(默认),start=左对齐(Menubar 面板用) */
|
|
48
59
|
center?: boolean;
|
|
49
60
|
/** 与触发元素间距(px,默认 6) */
|
|
@@ -68,6 +79,11 @@ export interface UsePopupOptions {
|
|
|
68
79
|
closeOnEscape?: boolean;
|
|
69
80
|
/** 长按触发时长(ms,仅 trigger='longpress',默认 500) */
|
|
70
81
|
longPressDuration?: number;
|
|
82
|
+
/** 打开触发回调(longpress 计时到/右键兼容时调用,携带光标坐标——右键菜单定位用) */
|
|
83
|
+
onTrigger?: (e: {
|
|
84
|
+
clientX: number;
|
|
85
|
+
clientY: number;
|
|
86
|
+
}) => void;
|
|
71
87
|
/** hover 打开延迟(ms 或 getter——动态读最新 props,仅 trigger='hover',默认 0) */
|
|
72
88
|
openDelay?: number | (() => number);
|
|
73
89
|
/** hover 关闭延迟(ms 或 getter,仅 trigger='hover',默认 0) */
|
|
@@ -195,6 +211,64 @@ export interface WfuiContext {
|
|
|
195
211
|
usePopup: (options: UsePopupOptions) => UsePopupHandle;
|
|
196
212
|
/** 当前设备是否支持 hover(matchMedia '(hover: hover)',mount 期一次判定) */
|
|
197
213
|
useHoverCapable: () => boolean;
|
|
214
|
+
/**
|
|
215
|
+
* 稳定 ref 引用(根治内联 ref 陷阱):mount 作用域持有,跨渲染引用恒等。
|
|
216
|
+
* ref-diff 在 ref 函数引用变化时调用旧 ref(null)——内联 ref 每次渲染都是新函数,
|
|
217
|
+
* 清理逻辑(退订/dispose)会反复触发而非仅在卸载时。
|
|
218
|
+
*
|
|
219
|
+
* ```tsx
|
|
220
|
+
* const listRef = ctx.ui.useStableRef(
|
|
221
|
+
* (el) => { instance = init(el) },
|
|
222
|
+
* () => { instance?.dispose() },
|
|
223
|
+
* )
|
|
224
|
+
* return () => h('div', { ref: listRef })
|
|
225
|
+
* ```
|
|
226
|
+
*/
|
|
227
|
+
useStableRef: (init: (el: HTMLElement | null) => void, cleanup?: () => void) => (el: any) => void;
|
|
228
|
+
/**
|
|
229
|
+
* 全局键盘监听(window keydown):mount 注册、组件卸载自动清理;返回退订函数。
|
|
230
|
+
* 覆盖 Command 全局快捷键 / Img preview Escape 等 document/window 级键盘场景。
|
|
231
|
+
*
|
|
232
|
+
* ```tsx
|
|
233
|
+
* ctx.ui.useGlobalKey((e) => { if (e.key === 'k' && (e.ctrlKey || e.metaKey)) toggle() })
|
|
234
|
+
* ```
|
|
235
|
+
*/
|
|
236
|
+
useGlobalKey: (handler: (e: KeyboardEvent) => void) => () => void;
|
|
237
|
+
/**
|
|
238
|
+
* 指针拖拽(pointerdown 捕获 → window pointermove/up,up 自动释放):
|
|
239
|
+
* 覆盖 Resizable 等拖拽场景。返回 props spread 到拖拽把手。
|
|
240
|
+
*
|
|
241
|
+
* ```tsx
|
|
242
|
+
* const drag = ctx.ui.useDrag({ onMove: (_e, d) => { setSize(startSize + d.x) } })
|
|
243
|
+
* return () => h('div', { class: 'handle', ...drag })
|
|
244
|
+
* ```
|
|
245
|
+
*/
|
|
246
|
+
useDrag: (options: {
|
|
247
|
+
onStart?: (e: PointerEvent) => void;
|
|
248
|
+
onMove: (e: PointerEvent, delta: {
|
|
249
|
+
x: number;
|
|
250
|
+
y: number;
|
|
251
|
+
}) => void;
|
|
252
|
+
onEnd?: (e: PointerEvent) => void;
|
|
253
|
+
}) => {
|
|
254
|
+
onPointerDown: (e: PointerEvent) => void;
|
|
255
|
+
};
|
|
256
|
+
/**
|
|
257
|
+
* 原生 DnD(drop/dragover/dragleave,dragover 自动 preventDefault):
|
|
258
|
+
* 覆盖 FileUpload 等拖放区。返回 dropProps spread 到容器(VNode props,渲染器绑定/清理)。
|
|
259
|
+
*
|
|
260
|
+
* ```tsx
|
|
261
|
+
* const { dropProps } = ctx.ui.useDragDrop({ onDrop: (e) => files(e.dataTransfer) })
|
|
262
|
+
* return () => h('div', { class: 'zone', ...dropProps })
|
|
263
|
+
* ```
|
|
264
|
+
*/
|
|
265
|
+
useDragDrop: (options: {
|
|
266
|
+
onDrop?: (e: DragEvent) => void;
|
|
267
|
+
onDragOver?: (e: DragEvent) => void;
|
|
268
|
+
onDragLeave?: (e: DragEvent) => void;
|
|
269
|
+
}) => {
|
|
270
|
+
dropProps: Record<string, any>;
|
|
271
|
+
};
|
|
198
272
|
/**
|
|
199
273
|
* 可视视口跟踪(visualViewport):键盘弹起/缩放时自动更新 + dirty。
|
|
200
274
|
* 无 visualViewport(桌面)降级 innerHeight。fixed 底部栏防键盘遮挡用。
|
|
@@ -238,6 +312,91 @@ export interface WfuiContext {
|
|
|
238
312
|
* data/loading/error 响应式;reload() 重跑;组件卸载后旧 Promise resolve 不再触发渲染。
|
|
239
313
|
*/
|
|
240
314
|
useAsync: <T = any>(fetcher: () => Promise<T>) => UseAsyncHandle<T>;
|
|
315
|
+
/**
|
|
316
|
+
* 受控/非受控状态统一(收敛组件库重复的受控判定 + 缺回调 warn):
|
|
317
|
+
* value !== undefined → 受控(setValue 只走 onChange,值由父组件回流);
|
|
318
|
+
* 否则 → 内部状态 + 自动 render。受控但缺 onChange 时 console.warn 一次(按 name 幂等)。
|
|
319
|
+
*
|
|
320
|
+
* ```tsx
|
|
321
|
+
* const ctrl = ctx.ui.useControlled({ value: props.value, onChange: props.onChange, name: 'Collapse' })
|
|
322
|
+
* const open = ctrl.value ?? false
|
|
323
|
+
* // 交互:ctrl.setValue(!open)
|
|
324
|
+
* ```
|
|
325
|
+
*/
|
|
326
|
+
useControlled: <T>(options: {
|
|
327
|
+
value?: T;
|
|
328
|
+
onChange?: (v: T) => void;
|
|
329
|
+
name?: string;
|
|
330
|
+
}) => {
|
|
331
|
+
value: T | undefined;
|
|
332
|
+
setValue: (v: T) => void;
|
|
333
|
+
controlled: boolean;
|
|
334
|
+
};
|
|
335
|
+
/**
|
|
336
|
+
* 全屏对话框组合器(收敛 Modal/Drawer 的退场状态机 + 滚动锁 + 焦点 trap):
|
|
337
|
+
* mount 创建,render 阶段 sync(open) 驱动状态机;组件只管布局。
|
|
338
|
+
*
|
|
339
|
+
* ```tsx
|
|
340
|
+
* const dialog = ctx.ui.useDialog({ name: 'Modal' })
|
|
341
|
+
* return (props) => {
|
|
342
|
+
* const phase = dialog.sync(props.open)
|
|
343
|
+
* if (phase === 'closed') return null
|
|
344
|
+
* return createPortal(h('div', {
|
|
345
|
+
* ref: dialog.rootRef,
|
|
346
|
+
* class: `wf-modal ${phase === 'exit' ? 'wf-modal--exit' : 'wf-modal--enter'}`,
|
|
347
|
+
* onKeyDown: (e) => { if (e.key === 'Escape') props.onClose?.() },
|
|
348
|
+
* }, [overlay, h('div', { class: 'wf-modal-content', ref: dialog.panelRef }, children)]), 'modal')
|
|
349
|
+
* }
|
|
350
|
+
* ```
|
|
351
|
+
* Escape 语义(危险操作差异)留在组件层——诚实裁剪。
|
|
352
|
+
*/
|
|
353
|
+
/** 通用显隐状态机(非 dialog 浮层/面板):open → exit → closed(animationend 延迟卸载)。
|
|
354
|
+
* useDialog 是其对话框特例(+ lockScroll/trapFocus)。mount 创建,render 阶段 sync(open)。 */
|
|
355
|
+
usePresence: (options?: {
|
|
356
|
+
name?: string;
|
|
357
|
+
}) => {
|
|
358
|
+
phase: 'closed' | 'open' | 'exit';
|
|
359
|
+
/** 挂到根元素(animationend 监听:exit 结束才真正卸载) */
|
|
360
|
+
ref: (el: any) => void;
|
|
361
|
+
/** render 阶段同步 open → 返回当前 phase */
|
|
362
|
+
sync: (open: boolean) => 'closed' | 'open' | 'exit';
|
|
363
|
+
};
|
|
364
|
+
useDialog: (options?: {
|
|
365
|
+
name?: string;
|
|
366
|
+
}) => {
|
|
367
|
+
phase: 'closed' | 'open' | 'exit';
|
|
368
|
+
/** 挂到 portal 根(lockScroll + animationend 退场监听) */
|
|
369
|
+
rootRef: (el: any) => void;
|
|
370
|
+
/** 挂到焦点 trap 目标(对话框面板) */
|
|
371
|
+
panelRef: (el: any) => void;
|
|
372
|
+
/** render 阶段同步 open → 返回当前 phase */
|
|
373
|
+
sync: (open: boolean) => 'closed' | 'open' | 'exit';
|
|
374
|
+
};
|
|
375
|
+
/** 响应式系统偏好(prefers-reduced-motion):JS 动画(rAF/tween)侧跳过用。
|
|
376
|
+
* CSS 动画已有 _base.css 全局降级(0.01ms)——此原语覆盖 JS 动画路径。 */
|
|
377
|
+
useReducedMotion: () => boolean;
|
|
378
|
+
/** 元素动画完成回调(animationend):stableRef 形态——ref 挂载绑定、卸载清理、引用恒定。
|
|
379
|
+
* `{ once: true }` 一次性(入场 settle);默认常驻(退场判断,回调读状态机 phase)。
|
|
380
|
+
* 唯一动画事件入口(组件内禁直接 addEventListener('animationend'))。
|
|
381
|
+
*
|
|
382
|
+
* ```tsx
|
|
383
|
+
* const settleRef = ctx.ui.useAnimationEnd(() => pos.refresh(), { once: true })
|
|
384
|
+
* return () => h('div', { class: 'wf-panel', ref: settleRef })
|
|
385
|
+
* ```
|
|
386
|
+
*/
|
|
387
|
+
useAnimationEnd: (cb: () => void, opts?: {
|
|
388
|
+
once?: boolean;
|
|
389
|
+
}) => (el: any) => void;
|
|
390
|
+
/** 数值补间(rAF + ease + reduced-motion 直落终值):count-up / 进度 / 指示器。
|
|
391
|
+
* 目标值变化自动补间;返回 `{ value }`(当前值,render 读)。 */
|
|
392
|
+
useTween: (target: number, opts?: {
|
|
393
|
+
duration?: number;
|
|
394
|
+
ease?: 'linear' | 'easeOutCubic';
|
|
395
|
+
}) => {
|
|
396
|
+
value: number;
|
|
397
|
+
/** 重设目标(幂等:同目标且动画运行中不重启——render 每帧调用安全) */
|
|
398
|
+
reset: (to: number) => void;
|
|
399
|
+
};
|
|
241
400
|
/** 注册组件实例的自定义语义 ID,同名冲突抛错 */
|
|
242
401
|
selfId: (name: string) => void;
|
|
243
402
|
/** 当前组件实例 ID(仅供内部使用,通过 ctx 扩展注入) */
|
|
@@ -13,5 +13,7 @@ export interface ContextMenuProps {
|
|
|
13
13
|
'aria-label'?: string;
|
|
14
14
|
className?: string;
|
|
15
15
|
}
|
|
16
|
-
/** 右键菜单(对应 shadcn ContextMenu):桌面右键 / 触屏长按 在光标处弹出,点外部/Escape
|
|
16
|
+
/** 右键菜单(对应 shadcn ContextMenu):桌面右键 / 触屏长按 在光标处弹出,点外部/Escape 关闭,方向键导航。
|
|
17
|
+
* 实现:ctx.ui.usePopup(longpress 触发 + 外部点击/Escape 关闭 + 自由定位光标处 + portal 视口 clamp)——
|
|
18
|
+
* 不再自建 document 监听;onTrigger 记录光标坐标,position getter 供定位。 */
|
|
17
19
|
export declare const ContextMenu: Component<ContextMenuProps>;
|
|
@@ -11,5 +11,7 @@ export interface InfiniteScrollProps {
|
|
|
11
11
|
endText?: string;
|
|
12
12
|
className?: string;
|
|
13
13
|
}
|
|
14
|
-
/** 无限滚动(对应 EP InfiniteScroll):底部哨兵进入视口 → 加载更多。
|
|
14
|
+
/** 无限滚动(对应 EP InfiniteScroll):底部哨兵进入视口 → 加载更多。
|
|
15
|
+
* 实现:ctx.ui.useInView(IO 封装——合成器线程评估,替代组件自建 IntersectionObserver)。
|
|
16
|
+
* onChange 在交叉状态变化时回调(IO 语义),与自建 IO 等价且不重复触发。 */
|
|
15
17
|
export declare const InfiniteScroll: Component<InfiniteScrollProps>;
|
|
@@ -14,5 +14,7 @@ export interface ResizableProps {
|
|
|
14
14
|
onResize?: (size: number) => void;
|
|
15
15
|
className?: string;
|
|
16
16
|
}
|
|
17
|
-
/** 可拖拽分割面板(对应 shadcn Resizable):两面板 + 拖拽手柄(pointer + 键盘方向键)。
|
|
17
|
+
/** 可拖拽分割面板(对应 shadcn Resizable):两面板 + 拖拽手柄(pointer + 键盘方向键)。
|
|
18
|
+
* 拖拽经 ctx.ui.useDrag(pointerdown 捕获 → window move delta / up 释放),不再自建 window 监听。
|
|
19
|
+
* 最新 props 经 propsRef 供 mount 期 useDrag 回调读取。 */
|
|
18
20
|
export declare const Resizable: Component<ResizableProps>;
|