scrum-skills 0.2.4 → 0.2.5

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.
Files changed (45) hide show
  1. package/README.md +2 -2
  2. package/assets/board/200.html +1 -1
  3. package/assets/board/404.html +1 -1
  4. package/assets/board/_nuxt/{BNKWWG8o.js → -8mcJ5uq.js} +1 -1
  5. package/assets/board/_nuxt/{Bu60uYgs.js → 9qnowzZi.js} +1 -1
  6. package/assets/board/_nuxt/Bi9Axj3V.js +1 -0
  7. package/assets/board/_nuxt/{CNbS93H9.js → BkjUg7GC.js} +1 -1
  8. package/assets/board/_nuxt/Bu400pfa.js +1 -0
  9. package/assets/board/_nuxt/{obNw9aRV.js → CBhhj6QT.js} +1 -1
  10. package/assets/board/_nuxt/{D1Yxjnz9.js → CdvimHoq.js} +1 -1
  11. package/assets/board/_nuxt/Co0ISufR.js +95 -0
  12. package/assets/board/_nuxt/DDA06Sqv.js +1 -0
  13. package/assets/board/_nuxt/DFuirznt.js +1 -0
  14. package/assets/board/_nuxt/{DrbU50Zd.js → DG3IySrP.js} +1 -1
  15. package/assets/board/_nuxt/DNMF9lr0.js +1 -0
  16. package/assets/board/_nuxt/Dzd1U0TD.js +1 -0
  17. package/assets/board/_nuxt/Y5b2rXjB.js +1 -0
  18. package/assets/board/_nuxt/builds/latest.json +1 -1
  19. package/assets/board/_nuxt/builds/meta/a2ba436a-230e-43f9-884e-0a5d37f5ba22.json +1 -0
  20. package/assets/board/_nuxt/{Bh7eUS6e.js → d-5IhxZm.js} +1 -1
  21. package/assets/board/_nuxt/entry.CTKz4ouw.css +2 -0
  22. package/assets/board/_nuxt/gRdnZpJw.js +1 -0
  23. package/assets/board/_nuxt/{DJUwhJ8T.js → oIa7syc0.js} +1 -1
  24. package/assets/board/_nuxt/pages.YYGvroeE.css +1 -0
  25. package/assets/board/_nuxt/{0VBLkWnu.js → qDn8FnYE.js} +1 -1
  26. package/assets/board/_nuxt/z9IMa9Iy.js +13 -0
  27. package/assets/board/burndown/index.html +1 -1
  28. package/assets/board/epics/index.html +1 -1
  29. package/assets/board/gantt/index.html +1 -1
  30. package/assets/board/index.html +1 -1
  31. package/assets/board/milestones/index.html +1 -1
  32. package/bin/scrum-skills.mjs +1 -1
  33. package/package.json +41 -40
  34. package/tools/projects.mjs +46 -11
  35. package/tools/serve.mjs +1 -1
  36. package/assets/board/_nuxt/BTxVIV74.js +0 -1
  37. package/assets/board/_nuxt/C-GYjxwr.js +0 -13
  38. package/assets/board/_nuxt/CDL4GvLz.js +0 -1
  39. package/assets/board/_nuxt/CeiBZIn1.js +0 -95
  40. package/assets/board/_nuxt/Cfk_R787.js +0 -1
  41. package/assets/board/_nuxt/RM4VQc4e.js +0 -1
  42. package/assets/board/_nuxt/builds/meta/ecbff4a6-6538-49b0-9844-64f03ebd103a.json +0 -1
  43. package/assets/board/_nuxt/entry.nk2xQ-sa.css +0 -2
  44. package/assets/board/_nuxt/fFGyRlCx.js +0 -1
  45. package/assets/board/_nuxt/pages.Bi6nErnd.css +0 -1
@@ -0,0 +1 @@
1
+ import{D as e,E as t,On as n,Zn as r,_ as i,b as a,bt as o,er as s,g as c,k as l,mt as u,o as d,qt as f,tr as p,un as m,v as h,vn as g,y as _}from"./DZo3dYLJ.js";import{C as v,w as y}from"./51OWHj8c.js";import{t as ee}from"./BJW3UkS7.js";import{t as te}from"./DFuirznt.js";import{t as ne}from"./CjRYYbsC.js";import{E as b,a as x,i as S,n as re,r as ie}from"#entry";var ae={class:`stats`},oe={class:`stat stat-mint`},se={class:`stat-top`},ce={class:`stat-label`},le={class:`stat-pill`},ue={class:`stat-value`},de={class:`stat-sub`},fe={class:`stat-delta`},pe={class:`split`},me={class:`spark`},he=[`title`],ge={class:`stat`},_e={class:`stat-top`},ve={class:`stat-label`},ye={class:`stat-pill`},be={class:`stat-value`},xe={class:`stat-sub`},Se={class:`stat-rows`},Ce={class:`stat-row`},we={class:`v`},Te={class:`stat-row`},Ee={class:`v`},De={class:`stat-row`},Oe={class:`v`},ke={class:`stat-row`},Ae={class:`v`},je={class:`stat-foot`},Me={class:`row`},Ne={class:`bar`},Pe={class:`stat stat-lilac`},Fe={class:`stat-top`},Ie={class:`stat-label`},Le={class:`stat-value`},Re={class:`unit`},ze={class:`stat-sub`},Be={class:`stat-rows`},Ve={class:`stat-row`},He={class:`v`},Ue={class:`stat-row`},We={class:`v`},Ge={class:`stat-row`},Ke={class:`v`},qe={class:`stat-row`},Je={class:`v`},Ye={class:`stat-foot`},Xe={class:`row`},Ze={class:`bar lilac`},Qe={class:`stat stat-ink`},$e={class:`stat-top`},et={class:`stat-label`},tt={class:`stat-value`},nt={class:`stat-rows`},rt={class:`stat-row`},it={class:`v`},at={class:`stat-row`},ot={class:`v`},st={class:`stat-row`},ct={class:`v`},lt={class:`stat-row`},ut={class:`v`},dt={class:`stat-foot`},ft={class:`row`},pt={class:`bar on-dark`},mt={class:`card tb`},ht={class:`tb-l`},gt={class:`tb-r`},_t={class:`mono`},vt={class:`mono`},yt={key:0,class:`card act-error`},bt={class:`act-error-txt`},xt={class:`card board`},St={class:`lanes`},Ct=[`title`,`onClick`],wt={class:`stub-name`},Tt={class:`stub-ct`},Et={class:`stub-pts`},Dt={class:`lane-hd`},Ot={class:`lane-ct`},kt={class:`lane-pts`},At=[`aria-expanded`,`title`,`onClick`],jt={class:`lane-bd`},Mt={class:`sc-id mono`},Nt={class:`sc-c-pts`},Pt=[`title`],Ft={class:`sc-top`},It={class:`sc-id mono`},Lt={class:`dim sc-wsjf`},Rt=[`title`],zt={class:`sc-title`},Bt={class:`sc-meta`},Vt={class:`sc-tags`},Ht={class:`tag tag-ghost`},Ut={key:0,class:`tag tag-neutral mono`},Wt=[`title`],Gt=[`title`],Kt={class:`bar slim sc-bar`},qt={class:`sc-ask`},Jt=[`aria-label`,`onClick`,`onKeydown`],Yt=[`aria-label`,`onClick`,`onKeydown`],Xt=[`aria-label`,`onClick`,`onKeydown`],Zt=[`aria-label`,`onClick`,`onKeydown`],Qt={key:0,class:`lane-empty`},C=`board.foldedLanes.v1`,w=S(l({__name:`index`,setup(l){let{stories:S,epics:w,states:T,progress:E,milestoneOfStory:D,pointsOf:O,milestones:$t,refresh:en,STATE_LABEL:k,STATE_SHORT:tn,STATE_DOT:A,TYPE_LABEL:nn,TYPE_COLOR:rn,TYPE_ICON:an,PRIORITY_COLOR:on,SCOPE_LABEL:sn,wsjf:j,blockedStories:cn}=x(),M=g(`all`),N=g(`all`),P=g(`rank`),ln=c(()=>[{label:`全部史诗`,value:`all`,icon:`i-lucide-layers`},...w.value.map(e=>({label:`${e.id} ${e.title}`,value:e.id,icon:`i-lucide-layer-group`}))]),un=c(()=>[{label:`全部里程碑`,value:`all`,icon:`i-lucide-flag`},...$t.value.map(e=>({label:`${e.id} ${e.title}`,value:e.id,icon:e.kind===`mvp`?`i-lucide-star`:`i-lucide-map-pin`}))]),dn=[{label:`默认顺序`,value:`rank`,icon:`i-lucide-list-ordered`},{label:`按优先级 P0 → P3`,value:`priority`,icon:`i-lucide-alert-circle`},{label:`按 WSJF 价值/点数`,value:`wsjf`,icon:`i-lucide-scale`},{label:`按点数`,value:`points`,icon:`i-lucide-signal`}],fn={P0:0,P1:1,P2:2,P3:3},F=[`done`,`cancelled`],I=[`done`,`cancelled`],L=g((()=>{try{if(typeof localStorage>`u`)return[...I];let e=localStorage.getItem(C);if(!e)return[...I];let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>F.includes(e)):[...I]}catch{return[...I]}})()),pn=e=>F.includes(e),R=e=>L.value.includes(e),mn=e=>F.includes(e),z=e=>{if(pn(e)){L.value=R(e)?L.value.filter(t=>t!==e):[...L.value,e];try{localStorage.setItem(C,JSON.stringify(L.value))}catch{}}},B=c(()=>{let e=S.value.filter(e=>!(M.value!==`all`&&e.epicId!==M.value||N.value!==`all`&&!D(e.id).some(e=>e.id===N.value)));return P.value===`priority`?[...e].sort((e,t)=>(fn[e.priority]??9)-(fn[t.priority]??9)||j(t)-j(e)):P.value===`wsjf`?[...e].sort((e,t)=>j(t)-j(e)):P.value===`points`?[...e].sort((e,t)=>t.points-e.points):e}),V=e=>B.value.filter(t=>t.status===e),H=e=>O(V(e).map(e=>e.id)),U=c(()=>{let e=B.value,t=e.filter(e=>e.status===`done`),n=e.filter(e=>e.status===`in-progress`||e.status===`review`),r=e.filter(e=>e.status===`ready`||e.status===`draft`),i=e.filter(e=>e.status===`cancelled`),a=e.filter(e=>e.status!==`cancelled`),o=e.flatMap(e=>e.tasks??[]),s=e=>o.filter(t=>t.status===e).length;return{count:e.length,points:e.reduce((e,t)=>e+t.points,0),liveCount:a.length,livePoints:a.reduce((e,t)=>e+t.points,0),donePoints:t.reduce((e,t)=>e+t.points,0),done:t.length,running:n.length,idle:r.length,cancelled:i.length,cancelledPoints:i.reduce((e,t)=>e+t.points,0),tasks:o.length,tasksDone:s(`done`),taskRed:s(`red`),taskGreen:s(`green`),taskRefactor:s(`refactored`),taskTodo:s(`todo`),bugs:e.filter(e=>e.type===`bug`).length,debt:e.filter(e=>e.type===`debt`).length,scope:e.filter(e=>e.scopeChange).length}}),W=c(()=>U.value.livePoints?Math.round(U.value.donePoints/U.value.livePoints*100):0),hn=c(()=>U.value.liveCount?Math.round(U.value.livePoints/U.value.liveCount*10)/10:0),G=c(()=>U.value.tasks?Math.round(U.value.tasksDone/U.value.tasks*100):0),gn=c(()=>cn.value.length+U.value.bugs),_n=c(()=>Math.max(1,...T.map(e=>V(e).length))),vn=e=>8+Math.round(V(e).length/_n.value*34),K=[`draft`,`ready`,`in-progress`,`review`,`done`],yn=e=>K[K.indexOf(e)+1]??null,bn=e=>K.indexOf(e)>0?K[K.indexOf(e)-1]:null,q=e=>(e.tasks??[]).filter(e=>e.status!==`done`).length,xn=e=>{let t=yn(e.status);return t?!(t===`done`&&q(e)>0):!1},Sn=e=>{let t=yn(e.status);return t?t===`done`&&q(e)?`还有 ${q(e)} 个任务没完成,先做完再收尾`:`推进到「${k[t]}」`:`已经是最后一个状态`},Cn=e=>bn(e.status)!==null,J={content:`bg-[#1b1526]! text-white! ring-0 shadow-lg`},Y=g(``),X=g(``),Z=g(``),Q=g(``);async function $(e,t){if(!X.value&&(t!==`next`||xn(e))&&(t!==`prev`||Cn(e))){X.value=e.id,Q.value=``;try{Y.value||=(await b(`/api/projects`)).token,await b(`/api/agile/story-status`,{method:`POST`,headers:{"x-project-token":Y.value},body:{id:e.id,action:t}}),Z.value=``,await en()}catch(t){Q.value=`${e.id}:${t?.data?.error??t?.message??`改状态失败`}`}finally{X.value=``}}}let wn=c(()=>{if(M.value===`all`)return`全部史诗`;let e=w.value.find(e=>e.id===M.value);return e?e.title.slice(0,6):`全部史诗`}),Tn=e=>D(e).filter(e=>e.kind===`mvp`);return(c,l)=>{let g=ie,b=ne,x=te,S=re,C=ee;return u(),a(`div`,null,[i(`div`,ae,[i(`article`,oe,[e(g,{tone:`mint`}),i(`div`,se,[i(`span`,ce,[e(b,{name:`i-lucide-gauge`,class:`size-3.5`}),l[7]||=t(`看板完成度`,-1)]),i(`span`,le,p(n(wn)),1)]),i(`div`,ue,[t(p(n(W)),1),l[8]||=i(`span`,{class:`unit`},`%`,-1)]),i(`div`,de,[i(`span`,fe,[e(b,{name:`i-lucide-check`,class:`size-3`}),t(p(n(U).donePoints)+` 点`,1)]),t(` 已交付 · 共 `+p(n(U).livePoints)+` 点 `,1)]),i(`div`,pe,[i(`div`,null,[l[9]||=i(`span`,{class:`k`},`完成故事`,-1),i(`b`,null,[t(p(n(U).done),1),i(`small`,null,`/`+p(n(U).liveCount),1)])]),i(`div`,null,[l[11]||=i(`span`,{class:`k`},`剩余点`,-1),i(`b`,null,[t(p(n(U).livePoints-n(U).donePoints),1),l[10]||=i(`small`,null,`点`,-1)])])]),i(`div`,me,[(u(!0),a(d,null,o(n(T),e=>(u(),a(`div`,{key:e,class:`spark-col`,title:`${n(k)[e]}:${V(e).length} 个`},[i(`div`,{class:r([`spark-bar`,{done:e===`done`,cancel:e===`cancelled`}]),style:s({height:vn(e)+`px`})},null,6),i(`span`,null,p(n(tn)[e]),1)],8,he))),128))])]),i(`article`,ge,[e(g,{tone:`green`}),i(`div`,_e,[i(`span`,ve,[e(b,{name:`i-lucide-book-open`,class:`size-3.5`}),l[12]||=t(`故事`,-1)]),i(`span`,ye,p(Math.round(n(hn)))+` 点/个`,1)]),i(`div`,be,[t(p(n(U).count),1),l[13]||=i(`span`,{class:`unit`},`个`,-1)]),i(`div`,xe,`共 `+p(n(U).livePoints)+` 点 · 任务 `+p(n(U).tasks)+` 个`,1),i(`div`,Se,[i(`div`,Ce,[l[14]||=i(`span`,{class:`k`},[i(`i`,{class:`dot`,style:{background:`#6aa844`}}),t(`已完成`)],-1),i(`span`,we,p(n(U).done),1)]),i(`div`,Te,[l[15]||=i(`span`,{class:`k`},[i(`i`,{class:`dot`,style:{background:`#3f7fd4`}}),t(`进行中`)],-1),i(`span`,Ee,p(n(U).running),1)]),i(`div`,De,[l[16]||=i(`span`,{class:`k`},[i(`i`,{class:`dot`,style:{background:`#b6bac1`}}),t(`未开始`)],-1),i(`span`,Oe,p(n(U).idle),1)]),i(`div`,ke,[l[17]||=i(`span`,{class:`k`},[i(`i`,{class:`dot`,style:{background:`#cf4759`}}),t(`已取消`)],-1),i(`span`,Ae,p(n(U).cancelled)+p(n(U).cancelledPoints?` · ${n(U).cancelledPoints} 点`:``),1)])]),i(`div`,je,[i(`div`,Me,[i(`span`,null,`任务完成 `+p(n(U).tasksDone)+`/`+p(n(U).tasks),1),i(`span`,null,p(n(G))+`%`,1)]),i(`div`,Ne,[i(`i`,{style:s({width:n(G)+`%`})},null,4)])])]),i(`article`,Pe,[e(g,{tone:`lilac`}),i(`div`,Fe,[i(`span`,Ie,[e(b,{name:`i-lucide-list-checks`,class:`size-3.5`}),l[18]||=t(`TDD 任务`,-1)]),l[19]||=i(`span`,{class:`stat-pill`},`红 → 绿 → 重构`,-1)]),i(`div`,Le,[t(p(n(U).tasksDone),1),i(`span`,Re,`/ `+p(n(U).tasks)+` 项`,1)]),i(`div`,ze,`已完成任务占 `+p(n(G))+`%`,1),i(`div`,Be,[i(`div`,Ve,[l[20]||=i(`span`,{class:`k`},[i(`i`,{class:`dot`,style:{background:`#cf4759`}}),t(`红(测试失败)`)],-1),i(`span`,He,p(n(U).taskRed),1)]),i(`div`,Ue,[l[21]||=i(`span`,{class:`k`},[i(`i`,{class:`dot`,style:{background:`#6aa844`}}),t(`绿(测试通过)`)],-1),i(`span`,We,p(n(U).taskGreen),1)]),i(`div`,Ge,[l[22]||=i(`span`,{class:`k`},[i(`i`,{class:`dot`,style:{background:`#6d4ff0`}}),t(`已重构`)],-1),i(`span`,Ke,p(n(U).taskRefactor),1)]),i(`div`,qe,[l[23]||=i(`span`,{class:`k`},[i(`i`,{class:`dot`,style:{background:`#b6bac1`}}),t(`待办`)],-1),i(`span`,Je,p(n(U).taskTodo),1)])]),i(`div`,Ye,[i(`div`,Xe,[i(`span`,null,`已完成 `+p(n(U).tasksDone)+`/`+p(n(U).tasks),1),i(`span`,null,p(n(G))+`%`,1)]),i(`div`,Ze,[i(`i`,{style:s({width:n(G)+`%`})},null,4)])])]),i(`article`,Qe,[e(g,{tone:`ink`}),i(`div`,$e,[i(`span`,et,[e(b,{name:`i-lucide-shield-alert`,class:`size-3.5`}),l[24]||=t(`风险面`,-1)]),l[25]||=i(`span`,{class:`stat-pill`},`需处理`,-1)]),i(`div`,tt,[t(p(n(gn)),1),l[26]||=i(`span`,{class:`unit`},`项`,-1)]),l[32]||=i(`div`,{class:`stat-sub`},`阻塞故事与缺陷合计`,-1),i(`div`,nt,[i(`div`,rt,[l[27]||=i(`span`,{class:`k`},`阻塞故事`,-1),i(`span`,it,p(n(cn).length),1)]),i(`div`,at,[l[28]||=i(`span`,{class:`k`},`缺陷`,-1),i(`span`,ot,p(n(U).bugs),1)]),i(`div`,st,[l[29]||=i(`span`,{class:`k`},`技术债`,-1),i(`span`,ct,p(n(U).debt),1)]),i(`div`,lt,[l[30]||=i(`span`,{class:`k`},`范围变更`,-1),i(`span`,ut,p(n(U).scope),1)])]),i(`div`,dt,[i(`div`,ft,[l[31]||=i(`span`,null,`完成度`,-1),i(`span`,null,p(n(W))+`%`,1)]),i(`div`,pt,[i(`i`,{style:s({width:n(W)+`%`})},null,4)])])])]),i(`div`,mt,[i(`div`,ht,[l[33]||=i(`span`,{class:`lbl`},`筛选`,-1),e(x,{modelValue:n(M),"onUpdate:modelValue":l[0]||=e=>m(M)?M.value=e:null,items:n(ln),icon:`i-lucide-layers`,"aria-label":`按史诗筛选`},null,8,[`modelValue`,`items`]),e(x,{modelValue:n(N),"onUpdate:modelValue":l[1]||=e=>m(N)?N.value=e:null,items:n(un),icon:`i-lucide-flag`,"aria-label":`按里程碑筛选`},null,8,[`modelValue`,`items`]),e(x,{modelValue:n(P),"onUpdate:modelValue":l[2]||=e=>m(P)?P.value=e:null,items:dn,icon:`i-lucide-arrow-up-down`,"aria-label":`排序方式`},null,8,[`modelValue`])]),i(`div`,gt,[i(`span`,_t,p(n(B).length),1),l[34]||=t(` 个故事 `,-1),l[35]||=i(`i`,{class:`sep`},null,-1),i(`span`,vt,p(n(O)(n(B).map(e=>e.id))),1),l[36]||=t(` 点 `,-1)])]),n(Q)?(u(),a(`div`,yt,[e(b,{name:`i-lucide-circle-alert`,class:`size-4`}),i(`span`,bt,p(n(Q)),1),i(`button`,{class:`btn btn-sm`,onClick:l[3]||=e=>Q.value=``},`知道了`)])):_(``,!0),i(`div`,xt,[i(`div`,St,[(u(!0),a(d,null,o(n(T),c=>(u(),a(`section`,{key:c,class:r([`lane`,{folded:R(c)}])},[R(c)?(u(),a(`button`,{key:0,class:`lane-stub`,title:`展开${n(k)[c]}:${V(c).length} 个 · ${H(c)} 点`,onClick:e=>z(c)},[i(`i`,{class:`lane-dot`,style:s({background:n(A)[c]})},null,4),i(`span`,wt,p(n(k)[c]),1),i(`span`,Tt,p(V(c).length),1),i(`span`,Et,p(H(c))+` 点`,1),e(b,{name:`i-lucide-chevrons-right`,class:`stub-ic`})],8,Ct)):(u(),a(d,{key:1},[i(`header`,Dt,[i(`i`,{class:`lane-dot`,style:s({background:n(A)[c]})},null,4),i(`b`,null,p(n(k)[c]),1),i(`span`,Ot,p(V(c).length),1),i(`span`,kt,p(H(c))+` 点`,1),pn(c)?(u(),a(`button`,{key:0,class:`lane-fold`,"aria-expanded":!R(c),title:`收起${n(k)[c]}`,onClick:e=>z(c)},[e(b,{name:`i-lucide-chevron-left`,class:`size-3`})],8,At)):_(``,!0)]),i(`div`,jt,[(u(!0),a(d,null,o(V(c),m=>(u(),h(C,{key:m.id,to:`/story/${m.id}`,class:r([`scard`,{"scard-compact":mn(c)}])},{default:f(()=>[mn(c)?(u(),a(d,{key:0},[i(`span`,Mt,p(m.id),1),i(`span`,Nt,p(m.points)+` 点`,1),i(`span`,{class:`sc-c-title`,title:m.title},p(m.title),9,Pt)],64)):(u(),a(d,{key:1},[i(`div`,Ft,[i(`span`,It,p(m.id),1),i(`span`,{class:r([`tag`,`tag-${n(on)[m.priority]}`])},p(m.priority),3),i(`span`,Lt,`WSJF `+p(n(j)(m)),1),m.blocked?(u(),a(`span`,{key:0,class:`tag tag-error tag-dot`,title:`阻塞中:${m.blocked.reason}(自 ${m.blocked.since})`},`阻塞`,8,Rt)):_(``,!0)]),i(`p`,zt,p(m.title),1),i(`div`,Bt,[i(`span`,null,p(m.points)+` 点`,1),l[37]||=i(`span`,{class:`dim`},`·`,-1),i(`span`,null,`任务 `+p(n(E)(m).done)+`/`+p(n(E)(m).total),1)]),i(`div`,Vt,[i(`span`,{class:r([`tag`,`tag-${n(rn)[m.type]}`])},[e(b,{name:n(an)[m.type],class:`size-3`},null,8,[`name`]),t(p(n(nn)[m.type]),1)],2),i(`span`,Ht,p(m.epicId),1),m.sprintId?(u(),a(`span`,Ut,p(m.sprintId),1)):_(``,!0),(u(!0),a(d,null,o(Tn(m.id),e=>(u(),a(`span`,{key:e.id,class:`tag tag-mint`,title:`${e.id} ${e.title} · ${e.criteria}`},`MVP`,8,Wt))),128)),m.scopeChange?(u(),a(`span`,{key:1,class:`tag tag-info`,title:`${n(sn)[m.scopeChange.kind]}(${m.scopeChange.at}):${m.scopeChange.reason}`},p(n(sn)[m.scopeChange.kind]),9,Gt)):_(``,!0)]),i(`div`,Kt,[i(`i`,{style:s({width:n(E)(m).pct+`%`})},null,4)]),i(`div`,{class:`sc-actions`,style:{backdropFilter:`blur(10px) saturate(125%)`},onMouseleave:l[6]||=e=>Z.value=``},[n(Z)===m.id?(u(),a(d,{key:0},[i(`span`,qt,`取消 `+p(m.id)+`?`,1),i(`span`,{class:`sc-act danger`,role:`button`,tabindex:`0`,"data-act":`cancel-confirm`,"aria-label":`确认取消 ${m.id}`,onClick:y(e=>$(m,`cancel`),[`stop`,`prevent`]),onKeydown:v(y(e=>$(m,`cancel`),[`prevent`]),[`enter`])},`确认`,40,Jt),i(`span`,{class:`sc-act`,role:`button`,tabindex:`0`,"data-act":`cancel-abort`,onClick:l[4]||=y(e=>Z.value=``,[`stop`,`prevent`]),onKeydown:l[5]||=v(y(e=>Z.value=``,[`prevent`]),[`enter`])},`返回`,32)],64)):(u(),a(d,{key:1},[Cn(m)?(u(),h(S,{key:0,text:`退回「${n(k)[bn(m.status)??``]}」`,"delay-duration":150,ui:J},{default:f(()=>[i(`span`,{class:`sc-act`,role:`button`,tabindex:`0`,"data-act":`prev`,"aria-label":`退回 ${m.id}`,onClick:y(e=>$(m,`prev`),[`stop`,`prevent`]),onKeydown:v(y(e=>$(m,`prev`),[`prevent`]),[`enter`])},[e(b,{name:`i-lucide-arrow-left`,class:`size-3.5`})],40,Yt)]),_:2},1032,[`text`])):_(``,!0),e(S,{text:Sn(m),"delay-duration":150,ui:J},{default:f(()=>[i(`span`,{class:r([`sc-act`,{off:!xn(m)}]),role:`button`,tabindex:`0`,"data-act":`next`,"aria-label":`推进 ${m.id}`,onClick:y(e=>$(m,`next`),[`stop`,`prevent`]),onKeydown:v(y(e=>$(m,`next`),[`prevent`]),[`enter`])},[e(b,{name:`i-lucide-arrow-right`,class:`size-3.5`})],42,Xt)]),_:2},1032,[`text`]),e(S,{text:`标记 ${m.id} 已取消`,"delay-duration":150,ui:J},{default:f(()=>[i(`span`,{class:`sc-act danger`,role:`button`,tabindex:`0`,"data-act":`cancel`,"aria-label":`取消 ${m.id}`,onClick:y(e=>Z.value=m.id,[`stop`,`prevent`]),onKeydown:v(y(e=>Z.value=m.id,[`prevent`]),[`enter`])},[e(b,{name:`i-lucide-x`,class:`size-3.5`})],40,Zt)]),_:2},1032,[`text`])],64))],32)],64))]),_:2},1032,[`to`,`class`]))),128)),V(c).length?_(``,!0):(u(),a(`p`,Qt,`暂无故事`))])],64))],2))),128))])])])}}}),[[`__scopeId`,`data-v-1e047e51`]]);export{w as default};
@@ -1 +1 @@
1
- import{D as e,Ht as t,On as n,Tn as r,Wt as i,ct as a,er as o,et as s,g as c,it as l,k as u,mt as d,qt as f,v as p,vn as m,xn as h,xt as g,y as _}from"./DZo3dYLJ.js";import{C as v,w as y}from"./51OWHj8c.js";import{t as b}from"./CsyY7ot8.js";import{h as x}from"./Baq-Hrpf.js";import{c as S,f as C,p as w}from"./Vo4wMbnS.js";import{t as T}from"./CK9_veoz.js";import{t as E}from"./B43-KCi6.js";import{t as D}from"./D3YCAmfu.js";import{t as O}from"./C9StZL3D.js";import{t as k}from"./D1Yxjnz9.js";import{C as A}from"#entry";var[j,M]=x(`TabsRoot`),N=u({__name:`TabsRoot`,props:{defaultValue:{type:null,required:!1},orientation:{type:String,required:!1,default:`horizontal`},dir:{type:String,required:!1},activationMode:{type:String,required:!1,default:`automatic`},modelValue:{type:null,required:!1},unmountOnHide:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:[`update:modelValue`],setup(e,{emit:t}){let i=e,a=t,{orientation:o,unmountOnHide:s,dir:c}=r(i),l=E(c);D();let u=w(i,`modelValue`,a,{defaultValue:i.defaultValue,passive:i.modelValue===void 0}),_=m(),v=h(new Set);return M({modelValue:u,changeModelValue:e=>{u.value=e},orientation:o,dir:l,unmountOnHide:s,activationMode:i.activationMode,baseId:b(void 0,`reka-tabs`),tabsList:_,contentIds:v,registerContent:e=>{v.value=new Set([...v.value,e])},unregisterContent:e=>{let t=new Set(v.value);t.delete(e),v.value=t}}),(t,r)=>(d(),p(n(T),{dir:n(l),"data-orientation":n(o),"as-child":e.asChild,as:e.as},{default:f(()=>[g(t.$slots,`default`,{modelValue:n(u)})]),_:3},8,[`dir`,`data-orientation`,`as-child`,`as`]))}});function P(e,t){return`${e}-trigger-${t}`}function F(e,t){return`${e}-content-${t}`}var I=u({__name:`TabsContent`,props:{value:{type:[String,Number],required:!0},forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(t){let r=t,{forwardRef:i}=D(),s=j(),u=c(()=>P(s.baseId,r.value)),h=c(()=>F(s.baseId,r.value)),v=c(()=>r.value===s.modelValue.value),y=m(v.value);return a(()=>{s.registerContent(r.value),requestAnimationFrame(()=>{y.value=!1})}),l(()=>{s.unregisterContent(r.value)}),(r,a)=>(d(),p(n(O),{present:t.forceMount||v.value,"force-mount":``},{default:f(({present:a})=>[e(n(T),{id:h.value,ref:n(i),"as-child":t.asChild,as:t.as,role:`tabpanel`,"data-state":v.value?`active`:`inactive`,"data-orientation":n(s).orientation.value,"aria-labelledby":u.value,hidden:!a,tabindex:`0`,style:o({animationDuration:y.value?`0s`:void 0})},{default:f(()=>[!n(s).unmountOnHide.value||a?g(r.$slots,`default`,{},void 0,void 0,0):_(`v-if`,!0)]),_:2},1032,[`id`,`as-child`,`as`,`data-state`,`data-orientation`,`aria-labelledby`,`hidden`,`style`])]),_:3},8,[`present`]))}}),L=u({__name:`TabsIndicator`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e,{expose:r}){let a=e,o=j();r({updateIndicatorStyle:v}),D();let l=S(),u=m({size:null,thickness:null,position:null}),h=m([]);t(()=>[o.modelValue.value,o?.dir.value],()=>{v()},{immediate:!0,flush:`post`}),i(()=>{h.value=Array.from(o.tabsList.value?.querySelectorAll(`[role="tab"]`)||[])}),C(c(()=>[o.tabsList.value,...h.value]),v);function v(){let e=o.tabsList.value?.querySelector(`[role="tab"][data-state="active"]`);e&&(o.orientation.value===`horizontal`?u.value={size:e.offsetWidth,thickness:e.offsetHeight,position:e.offsetLeft}:u.value={size:e.offsetHeight,thickness:e.offsetWidth,position:e.offsetTop})}return(e,t)=>n(l)&&typeof u.value.size==`number`?(d(),p(n(T),s({key:0},a,{style:{"--reka-tabs-indicator-size":`${u.value.size}px`,"--reka-tabs-indicator-thickness":`${u.value.thickness}px`,"--reka-tabs-indicator-position":`${u.value.position}px`}}),{default:f(()=>[g(e.$slots,`default`)]),_:3},16,[`style`])):_(`v-if`,!0)}}),R=u({__name:`TabsList`,props:{loop:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(t){let{loop:i}=r(t),{forwardRef:a,currentElement:o}=D(),s=j();return s.tabsList=o,(r,o)=>(d(),p(n(A),{"as-child":``,orientation:n(s).orientation.value,dir:n(s).dir.value,loop:n(i)},{default:f(()=>[e(n(T),{ref:n(a),role:`tablist`,"as-child":t.asChild,as:t.as,"aria-orientation":n(s).orientation.value},{default:f(()=>[g(r.$slots,`default`)]),_:3},8,[`as-child`,`as`,`aria-orientation`])]),_:3},8,[`orientation`,`dir`,`loop`]))}}),z=u({__name:`TabsTrigger`,props:{value:{type:[String,Number],required:!0},disabled:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`button`}},setup(t){let r=t,{forwardRef:i}=D(),a=j(),o=c(()=>P(a.baseId,r.value)),s=c(()=>a.contentIds.value.has(r.value)?F(a.baseId,r.value):void 0),l=c(()=>r.value===a.modelValue.value);return(r,c)=>(d(),p(n(k),{"as-child":``,focusable:!t.disabled,active:l.value},{default:f(()=>[e(n(T),{id:o.value,ref:n(i),role:`tab`,type:t.as===`button`?`button`:void 0,as:t.as,"as-child":t.asChild,"aria-selected":l.value?`true`:`false`,"aria-controls":s.value,"data-state":l.value?`active`:`inactive`,disabled:t.disabled,"data-disabled":t.disabled?``:void 0,"data-orientation":n(a).orientation.value,onMousedown:c[0]||=y(e=>{e.defaultPrevented||(!t.disabled&&e.ctrlKey===!1?n(a).changeModelValue(t.value):e.preventDefault())},[`left`]),onKeydown:c[1]||=v(e=>{e.defaultPrevented||n(a).changeModelValue(t.value)},[`enter`,`space`]),onFocus:c[2]||=()=>{let e=n(a).activationMode!==`manual`;!l.value&&!t.disabled&&e&&n(a).changeModelValue(t.value)}},{default:f(()=>[g(r.$slots,`default`)]),_:3},8,[`id`,`type`,`as`,`as-child`,`aria-selected`,`aria-controls`,`data-state`,`disabled`,`data-disabled`,`data-orientation`])]),_:3},8,[`focusable`,`active`]))}});export{N as a,I as i,R as n,L as r,z as t};
1
+ import{D as e,Ht as t,On as n,Tn as r,Wt as i,ct as a,er as o,et as s,g as c,it as l,k as u,mt as d,qt as f,v as p,vn as m,xn as h,xt as g,y as _}from"./DZo3dYLJ.js";import{C as v,w as y}from"./51OWHj8c.js";import{t as b}from"./CsyY7ot8.js";import{h as x}from"./Baq-Hrpf.js";import{c as S,f as C,p as w}from"./Vo4wMbnS.js";import{t as T}from"./CK9_veoz.js";import{t as E}from"./B43-KCi6.js";import{t as D}from"./D3YCAmfu.js";import{t as O}from"./C9StZL3D.js";import{t as k}from"./CdvimHoq.js";import{y as A}from"#entry";var[j,M]=x(`TabsRoot`),N=u({__name:`TabsRoot`,props:{defaultValue:{type:null,required:!1},orientation:{type:String,required:!1,default:`horizontal`},dir:{type:String,required:!1},activationMode:{type:String,required:!1,default:`automatic`},modelValue:{type:null,required:!1},unmountOnHide:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:[`update:modelValue`],setup(e,{emit:t}){let i=e,a=t,{orientation:o,unmountOnHide:s,dir:c}=r(i),l=E(c);D();let u=w(i,`modelValue`,a,{defaultValue:i.defaultValue,passive:i.modelValue===void 0}),_=m(),v=h(new Set);return M({modelValue:u,changeModelValue:e=>{u.value=e},orientation:o,dir:l,unmountOnHide:s,activationMode:i.activationMode,baseId:b(void 0,`reka-tabs`),tabsList:_,contentIds:v,registerContent:e=>{v.value=new Set([...v.value,e])},unregisterContent:e=>{let t=new Set(v.value);t.delete(e),v.value=t}}),(t,r)=>(d(),p(n(T),{dir:n(l),"data-orientation":n(o),"as-child":e.asChild,as:e.as},{default:f(()=>[g(t.$slots,`default`,{modelValue:n(u)})]),_:3},8,[`dir`,`data-orientation`,`as-child`,`as`]))}});function P(e,t){return`${e}-trigger-${t}`}function F(e,t){return`${e}-content-${t}`}var I=u({__name:`TabsContent`,props:{value:{type:[String,Number],required:!0},forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(t){let r=t,{forwardRef:i}=D(),s=j(),u=c(()=>P(s.baseId,r.value)),h=c(()=>F(s.baseId,r.value)),v=c(()=>r.value===s.modelValue.value),y=m(v.value);return a(()=>{s.registerContent(r.value),requestAnimationFrame(()=>{y.value=!1})}),l(()=>{s.unregisterContent(r.value)}),(r,a)=>(d(),p(n(O),{present:t.forceMount||v.value,"force-mount":``},{default:f(({present:a})=>[e(n(T),{id:h.value,ref:n(i),"as-child":t.asChild,as:t.as,role:`tabpanel`,"data-state":v.value?`active`:`inactive`,"data-orientation":n(s).orientation.value,"aria-labelledby":u.value,hidden:!a,tabindex:`0`,style:o({animationDuration:y.value?`0s`:void 0})},{default:f(()=>[!n(s).unmountOnHide.value||a?g(r.$slots,`default`,{},void 0,void 0,0):_(`v-if`,!0)]),_:2},1032,[`id`,`as-child`,`as`,`data-state`,`data-orientation`,`aria-labelledby`,`hidden`,`style`])]),_:3},8,[`present`]))}}),L=u({__name:`TabsIndicator`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e,{expose:r}){let a=e,o=j();r({updateIndicatorStyle:v}),D();let l=S(),u=m({size:null,thickness:null,position:null}),h=m([]);t(()=>[o.modelValue.value,o?.dir.value],()=>{v()},{immediate:!0,flush:`post`}),i(()=>{h.value=Array.from(o.tabsList.value?.querySelectorAll(`[role="tab"]`)||[])}),C(c(()=>[o.tabsList.value,...h.value]),v);function v(){let e=o.tabsList.value?.querySelector(`[role="tab"][data-state="active"]`);e&&(o.orientation.value===`horizontal`?u.value={size:e.offsetWidth,thickness:e.offsetHeight,position:e.offsetLeft}:u.value={size:e.offsetHeight,thickness:e.offsetWidth,position:e.offsetTop})}return(e,t)=>n(l)&&typeof u.value.size==`number`?(d(),p(n(T),s({key:0},a,{style:{"--reka-tabs-indicator-size":`${u.value.size}px`,"--reka-tabs-indicator-thickness":`${u.value.thickness}px`,"--reka-tabs-indicator-position":`${u.value.position}px`}}),{default:f(()=>[g(e.$slots,`default`)]),_:3},16,[`style`])):_(`v-if`,!0)}}),R=u({__name:`TabsList`,props:{loop:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(t){let{loop:i}=r(t),{forwardRef:a,currentElement:o}=D(),s=j();return s.tabsList=o,(r,o)=>(d(),p(n(A),{"as-child":``,orientation:n(s).orientation.value,dir:n(s).dir.value,loop:n(i)},{default:f(()=>[e(n(T),{ref:n(a),role:`tablist`,"as-child":t.asChild,as:t.as,"aria-orientation":n(s).orientation.value},{default:f(()=>[g(r.$slots,`default`)]),_:3},8,[`as-child`,`as`,`aria-orientation`])]),_:3},8,[`orientation`,`dir`,`loop`]))}}),z=u({__name:`TabsTrigger`,props:{value:{type:[String,Number],required:!0},disabled:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`button`}},setup(t){let r=t,{forwardRef:i}=D(),a=j(),o=c(()=>P(a.baseId,r.value)),s=c(()=>a.contentIds.value.has(r.value)?F(a.baseId,r.value):void 0),l=c(()=>r.value===a.modelValue.value);return(r,c)=>(d(),p(n(k),{"as-child":``,focusable:!t.disabled,active:l.value},{default:f(()=>[e(n(T),{id:o.value,ref:n(i),role:`tab`,type:t.as===`button`?`button`:void 0,as:t.as,"as-child":t.asChild,"aria-selected":l.value?`true`:`false`,"aria-controls":s.value,"data-state":l.value?`active`:`inactive`,disabled:t.disabled,"data-disabled":t.disabled?``:void 0,"data-orientation":n(a).orientation.value,onMousedown:c[0]||=y(e=>{e.defaultPrevented||(!t.disabled&&e.ctrlKey===!1?n(a).changeModelValue(t.value):e.preventDefault())},[`left`]),onKeydown:c[1]||=v(e=>{e.defaultPrevented||n(a).changeModelValue(t.value)},[`enter`,`space`]),onFocus:c[2]||=()=>{let e=n(a).activationMode!==`manual`;!l.value&&!t.disabled&&e&&n(a).changeModelValue(t.value)}},{default:f(()=>[g(r.$slots,`default`)]),_:3},8,[`id`,`type`,`as`,`as-child`,`aria-selected`,`aria-controls`,`data-state`,`disabled`,`data-disabled`,`data-orientation`])]),_:3},8,[`focusable`,`active`]))}});export{N as a,I as i,R as n,L as r,z as t};
@@ -0,0 +1 @@
1
+ .split[data-v-1e047e51]{grid-template-columns:1fr 1fr;gap:10px;margin-top:auto;padding-top:12px;display:grid}.split>div[data-v-1e047e51]{gap:1px;min-width:0;display:grid}.split>div+div[data-v-1e047e51]{border-left:1px solid #17181b1a;padding-left:10px}.split .k[data-v-1e047e51]{letter-spacing:.08em;text-transform:uppercase;color:#6b6f78;font-size:9.4px;font-weight:650}.split b[data-v-1e047e51]{letter-spacing:-.025em;color:#2b3312;font-size:14.5px;font-weight:660}.split b small[data-v-1e047e51]{letter-spacing:0;color:#6b6f78;margin-left:1px;font-size:10px;font-weight:600}.dot[data-v-1e047e51]{border-radius:999px;flex:none;width:6px;height:6px;display:inline-block}.tb[data-v-1e047e51]{border-radius:var(--r-md);justify-content:space-between;gap:12px;margin-bottom:12px;padding:10px 12px 10px 16px}.tb[data-v-1e047e51],.tb-l[data-v-1e047e51]{flex-wrap:wrap;align-items:center;display:flex}.tb-l[data-v-1e047e51]{gap:8px}.tb-l[data-v-1e047e51] .skin-select{max-width:212px}.tb-r[data-v-1e047e51]{color:var(--ink-3);align-items:center;gap:6px;font-size:11.6px;display:flex}.tb-r .mono[data-v-1e047e51]{color:var(--ink);font-weight:660}.sep[data-v-1e047e51]{background:var(--line-2);width:1px;height:12px;margin:0 3px}.board[data-v-1e047e51]{border-radius:var(--r-xl);padding:12px}.lanes[data-v-1e047e51]{gap:10px;padding-bottom:2px;display:flex}.lane[data-v-1e047e51]{flex-direction:column;flex:1 1 0;min-width:0;display:flex}.lane.folded[data-v-1e047e51]{flex:0 0 46px}.lane-stub[data-v-1e047e51]{border-radius:var(--r-md);background:var(--sunken-2);border:1px dashed var(--line-2);cursor:pointer;flex-direction:column;flex:1;align-items:center;gap:7px;min-height:120px;padding:11px 4px 9px;transition:background .14s,border-color .14s;display:flex}.lane-stub[data-v-1e047e51]:hover{background:#fff;border-color:#ded4fb}.stub-name[data-v-1e047e51]{writing-mode:vertical-rl;letter-spacing:.12em;color:var(--ink-2);font-size:11.6px;font-weight:650}.stub-ct[data-v-1e047e51]{border:1px solid var(--line);min-width:16px;height:16px;color:var(--ink-3);background:#fff;border-radius:999px;place-items:center;padding:0 4px;font-size:9.6px;font-weight:700;display:grid}.stub-pts[data-v-1e047e51]{writing-mode:vertical-rl;letter-spacing:.06em;font-size:9.6px}.lane-fold[data-v-1e047e51],.stub-ic[data-v-1e047e51],.stub-pts[data-v-1e047e51]{color:var(--ink-4)}.stub-ic[data-v-1e047e51]{width:11px;height:11px}.lane-fold[data-v-1e047e51]{border-radius:6px;place-items:center;width:18px;height:18px;margin-left:2px;transition:background .14s,color .14s;display:grid}.lane-fold[data-v-1e047e51]:hover{color:var(--ink-2);background:#f1f0eb}.lane-hd[data-v-1e047e51]{align-items:center;gap:6px;padding:0 4px 9px;display:flex}.lane-dot[data-v-1e047e51]{border-radius:999px;width:6px;height:6px}.lane-hd b[data-v-1e047e51]{letter-spacing:-.01em;font-size:12.2px;font-weight:650}.lane-ct[data-v-1e047e51]{color:var(--ink-3);background:#f1f0eb;border-radius:999px;padding:0 5px;font-size:10px;font-weight:650}.lane-pts[data-v-1e047e51]{color:var(--ink-4);margin-left:auto;font-size:10.4px}.lane-bd[data-v-1e047e51]{border-radius:var(--r-md);background:var(--sunken-2);border:1px solid #f1f0ec;flex:1;grid-template-columns:minmax(0,1fr);align-content:start;gap:8px;min-height:120px;padding:8px;display:grid}.scard[data-v-1e047e51]{border:1px solid var(--line);background:#fff;border-radius:13px;min-width:0;padding:9px 10px 8px;transition:transform .16s,box-shadow .16s,border-color .16s;display:block;position:relative;box-shadow:0 1px 2px #17181b08}.scard[data-v-1e047e51]:hover{border-color:#ded4fb;transform:translateY(-1.5px);box-shadow:0 12px 24px -16px #6d4ff080}.sc-actions[data-v-1e047e51]{z-index:2;opacity:0;visibility:hidden;background:linear-gradient(#ffffff3d,#ffffff85 54%,#ffffffc7);border-radius:0 0 12px 12px;justify-content:flex-end;align-items:center;gap:2px;height:32px;padding:0 5px;transition:transform .16s,opacity .16s,visibility .16s;display:flex;position:absolute;bottom:0;left:0;right:0;transform:translateY(100%);-webkit-mask-image:linear-gradient(#0000,#000 22%);mask-image:linear-gradient(#0000,#000 22%)}.scard:focus-within .sc-actions[data-v-1e047e51],.scard:hover .sc-actions[data-v-1e047e51]{opacity:1;visibility:visible;transform:translateY(0)}.sc-act[data-v-1e047e51]{min-width:22px;height:22px;color:var(--ink-2);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:7px;place-items:center;padding:0 5px;font-size:10.4px;font-weight:650;transition:background .14s,color .14s;display:grid}.sc-act[data-v-1e047e51]:hover{color:var(--ink);background:#17181b14}.sc-act.danger[data-v-1e047e51]:hover{color:#fff;background:#e5484de6}.sc-act.off[data-v-1e047e51]{opacity:.45;cursor:not-allowed}.sc-act.off[data-v-1e047e51]:hover{color:var(--ink-2);background:0 0}.sc-ask[data-v-1e047e51]{color:var(--ink-2);margin-right:auto;font-size:10.2px;font-weight:640}.act-error[data-v-1e047e51]{border-radius:var(--r-md);background:var(--peach);color:#a5382f;border-color:#f2d3cf;align-items:center;gap:8px;margin-bottom:12px;padding:9px 12px;font-size:11.8px;display:flex}.act-error-txt[data-v-1e047e51]{flex:1;min-width:0}.scard-compact[data-v-1e047e51]{border-radius:10px;flex-wrap:wrap;align-items:center;gap:1px 6px;padding:5px 8px;display:flex}.scard-compact[data-v-1e047e51]:hover{transform:none}.scard-compact .sc-id[data-v-1e047e51]{margin-right:0}.sc-c-title[data-v-1e047e51]{white-space:nowrap;text-overflow:ellipsis;min-width:0;color:var(--ink-2);flex:1 0 100%;font-size:11.4px;font-weight:560;line-height:1.4;overflow:hidden}.sc-c-pts[data-v-1e047e51]{color:var(--ink-4);flex:none;margin-left:auto;font-size:9.6px;font-weight:660}.sc-top[data-v-1e047e51]{flex-wrap:wrap;align-items:center;gap:4px;display:flex}.sc-id[data-v-1e047e51]{color:var(--ink-4);margin-right:2px;font-size:10px}.sc-wsjf[data-v-1e047e51]{white-space:nowrap;margin-left:auto;font-size:9.6px}.sc-title[data-v-1e047e51]{letter-spacing:-.005em;-webkit-line-clamp:3;-webkit-box-orient:vertical;margin:7px 0 5px;font-size:12.5px;font-weight:620;line-height:1.42;display:-webkit-box;overflow:hidden}.sc-meta[data-v-1e047e51]{color:var(--ink-3);margin-bottom:7px;font-size:10.4px}.sc-meta[data-v-1e047e51],.sc-tags[data-v-1e047e51]{flex-wrap:wrap;align-items:center;gap:4px;display:flex}.sc-tags[data-v-1e047e51]{margin-bottom:8px}.sc-bar[data-v-1e047e51]{margin-top:1px}.lane-empty[data-v-1e047e51]{text-align:center;color:var(--ink-4);padding:14px 6px;font-size:10.6px}@media (width<=1180px){.lanes[data-v-1e047e51]{overflow-x:auto}.lane[data-v-1e047e51]{flex:1 0 178px}}
@@ -1 +1 @@
1
- import{D as e,E as t,On as n,T as r,Ut as ee,Yt as te,Zn as i,_ as a,b as o,bt as s,er as ne,g as c,k as l,mt as u,o as d,qt as re,tr as f,un as ie,vn as p,y as m}from"./DZo3dYLJ.js";import{S as ae}from"./51OWHj8c.js";import{t as oe}from"./BJW3UkS7.js";import{t as se}from"./fFGyRlCx.js";import{t as ce}from"./CjRYYbsC.js";import{a as h,i as g,r as le}from"#entry";var ue={class:`kpis`},de={class:`kpi tint-lilac`},fe={class:`v`},pe={class:`kpi`},me={class:`v`},he={class:`kpi`},ge={class:`kpi tint-mint`},_e={class:`v`},ve={class:`kpi`},ye={class:`v`},be={key:0,class:`card panel`},xe={class:`panel-hd`},Se={class:`ph-l`},_={class:`sp-name`},v={class:`sub mono`},y={class:`goal`},b={class:`chart-wrap`},x=[`viewBox`],S=[`y1`,`x2`,`y2`],C=[`x`,`y`],w=[`d`],T=[`d`],E=[`points`],D=[`cx`,`cy`],O=[`x1`,`y1`,`x2`,`y2`],k=[`x`,`y`],A=[`x`,`y`],j=[`x1`,`y1`,`x2`,`y2`],Ce=[`cx`,`cy`],we={class:`cells`},Te={class:`cd mono`},Ee={class:`ca`},De={class:`ci dim`},Oe={key:0,class:`scope`},ke={class:`h3`},Ae={class:`tag tag-info`},je={class:`dim`},Me={key:1,class:`callout soft`},Ne={class:`card`},Pe={class:`card-hd`},Fe={class:`tag tag-neutral`},Ie={class:`card-bd`},Le={class:`tbl`},Re=[`onClick`],ze={class:`mono`},Be={class:`mono dim`},Ve={class:`r`},He={class:`r mono`},Ue=980,We=300,M=42,N=g(l({__name:`burndown`,setup(l){let{sprints:g,burndown:N,sprintCommit:P,md:F,now:I,sprintById:L,storyById:Ge,SCOPE_LABEL:R}=h(),z=p(``),Ke=c(()=>[...g.value].reverse().map(e=>({label:`${e.id} · ${e.name}`,value:e.id,icon:`i-lucide-calendar-range`}))),B=c(()=>L.value.get(z.value)??g.value[g.value.length-1]),V=c(()=>B.value?N(B.value):{total:0,days:[]});ee(()=>{z.value&&!L.value.has(z.value)&&(z.value=``),!z.value&&g.value.length&&(z.value=g.value[g.value.length-1].id)});let H=c(()=>V.value.days.length||1),U=c(()=>V.value.total||1),W=e=>M+e*896/(H.value-1||1),G=e=>258-e*216/U.value,K=e=>V.value.days.map((t,n)=>`${W(n)},${G(t[e])}`).join(` `),qe=c(()=>{let e=V.value.days.map((e,t)=>`${W(t)},${G(e.actual)}`).join(` `),t=V.value.days.length-1;return`M${W(0)},${G(0)} L${e.replaceAll(` `,` L`)} L${W(t)},${G(0)} Z`}),q=c(()=>V.value.days.findIndex(e=>e.date===I)),J=c(()=>V.value.days.find(e=>e.date===I)??V.value.days[V.value.days.length-1]),Y=c(()=>J.value?.actual??0),X=c(()=>J.value?.ideal??0),Z=c(()=>Math.round((Y.value-X.value)*10)/10),Q=c(()=>{let e=B.value;return e?(e.stories??[]).map(e=>Ge.value.get(e)).filter(Boolean).filter(t=>t.scopeChange&&t.scopeChange.at>=e.start&&t.scopeChange.at<=e.end).map(e=>({id:e.id,title:e.title,at:e.scopeChange.at,kind:e.scopeChange.kind,reason:e.scopeChange.reason,points:e.points,idx:V.value.days.findIndex(t=>t.date===e.scopeChange.at)})).filter(e=>e.idx>=0):[]}),Je=c(()=>new Set(Q.value.map(e=>e.at))),$=c(()=>[...g.value].reverse().map(e=>{let t=e.start<=I&&e.end>=I;return{id:e.id,name:e.name,period:`${F(e.start)} ~ ${F(e.end)}`,stories:(e.stories??[]).length,commit:P(e),capacity:e.capacity,status:t?`进行中`:e.end<I?`已结束`:`未开始`,tone:t?`tag-primary`:e.end<I?`tag-neutral`:`tag-info`}}));return(ee,c)=>{let l=le,p=se,h=ce,g=oe;return u(),o(`div`,null,[a(`div`,ue,[a(`div`,de,[e(l,{tone:`lilac`,size:`sm`}),c[1]||=a(`p`,{class:`k`},`剩余故事点`,-1),a(`p`,fe,[t(f(n(Y)),1),a(`small`,null,`/ `+f(n(V).total),1)])]),a(`div`,pe,[c[3]||=a(`p`,{class:`k`},`理想剩余(今天)`,-1),a(`p`,me,[t(f(n(X)),1),c[2]||=a(`small`,null,`点`,-1)])]),a(`div`,he,[c[5]||=a(`p`,{class:`k`},`偏差`,-1),a(`p`,{class:i([`v`,{bad:n(Z)>0,good:n(Z)<=0}])},[t(f(n(Z)>0?`+`+n(Z):n(Z)),1),c[4]||=a(`small`,null,`点`,-1)],2)]),a(`div`,ge,[e(l,{tone:`mint`,size:`sm`}),c[6]||=a(`p`,{class:`k`},`承诺 / 容量`,-1),a(`p`,_e,[t(f(n(B)?n(P)(n(B)):0),1),a(`small`,null,`/ `+f(n(B)?.capacity??0),1)])]),a(`div`,ve,[c[8]||=a(`p`,{class:`k`},`范围变更`,-1),a(`p`,ye,[t(f(n(Q).length),1),c[7]||=a(`small`,null,`次`,-1)])])]),n(B)?(u(),o(`div`,be,[a(`div`,xe,[a(`div`,Se,[a(`h2`,_,f(n(B).name),1),a(`p`,v,f(n(B).id)+` · `+f(n(F)(n(B).start))+` ~ `+f(n(F)(n(B).end)),1),a(`p`,y,f(n(B).goal),1)]),e(p,{modelValue:n(z),"onUpdate:modelValue":c[0]||=e=>ie(z)?z.value=e:null,items:n(Ke),icon:`i-lucide-calendar-range`,"aria-label":`选择迭代`,class:`bd-select`},null,8,[`modelValue`,`items`])]),a(`div`,b,[c[10]||=r(`<div class="chart-legend" data-v-4ef34f2c><span class="lg" data-v-4ef34f2c><i class="sw actual" data-v-4ef34f2c></i>实际剩余</span><span class="lg" data-v-4ef34f2c><i class="sw ideal" data-v-4ef34f2c></i>理想线</span><span class="lg" data-v-4ef34f2c><i class="sw scope" data-v-4ef34f2c></i>范围变更</span></div>`,1),(u(),o(`svg`,{viewBox:`0 0 ${Ue} ${We}`,class:`chart`,role:`img`},[c[9]||=r(`<defs data-v-4ef34f2c><linearGradient id="bd-line" x1="0" y1="0" x2="1" y2="0" data-v-4ef34f2c><stop offset="0%" stop-color="#8a63f7" data-v-4ef34f2c></stop><stop offset="100%" stop-color="#c3aefb" data-v-4ef34f2c></stop></linearGradient><linearGradient id="bd-area" x1="0" y1="0" x2="0" y2="1" data-v-4ef34f2c><stop offset="0%" stop-color="#8a63f7" stop-opacity="0.16" data-v-4ef34f2c></stop><stop offset="100%" stop-color="#8a63f7" stop-opacity="0" data-v-4ef34f2c></stop></linearGradient></defs>`,1),a(`g`,null,[(u(),o(d,null,s([0,.25,.5,.75,1],e=>a(`line`,{key:`grid`+e,x1:M,y1:G(n(U)*e),x2:938,y2:G(n(U)*e),stroke:`#f1f0ea`,"stroke-width":`1`},null,8,S)),64)),(u(),o(d,null,s([0,.25,.5,.75,1],e=>a(`text`,{key:`gl`+e,x:32,y:G(n(U)*e)+3.5,"text-anchor":`end`,"font-size":`9.5`,fill:`#b0b4ba`},f(Math.round(n(U)*e)),9,C)),64))]),a(`path`,{d:n(qe),fill:`url(#bd-area)`},null,8,w),a(`path`,{d:`M${W(0)},${G(n(U))} L${W(n(H)-1)},${G(0)}`,stroke:`#cdc9d8`,"stroke-width":`1.4`,"stroke-dasharray":`5 5`,fill:`none`},null,8,T),a(`polyline`,{points:K(`actual`),stroke:`url(#bd-line)`,"stroke-width":`2.6`,fill:`none`,"stroke-linejoin":`round`,"stroke-linecap":`round`},null,8,E),(u(!0),o(d,null,s(n(V).days,(e,t)=>(u(),o(`circle`,{key:e.date,cx:W(t),cy:G(e.actual),r:`3`,fill:`#fff`,stroke:`#8a63f7`,"stroke-width":`1.8`},null,8,D))),128)),n(q)>=0?(u(),o(`line`,{key:0,x1:W(n(q)),y1:34,x2:W(n(q)),y2:G(0),stroke:`#cf4759`,"stroke-dasharray":`3 3`,"stroke-width":`1.2`,opacity:`0.7`},null,8,O)):m(``,!0),n(q)>=0?(u(),o(`text`,{key:1,x:W(n(q)),y:28,"text-anchor":`middle`,"font-size":`9.5`,fill:`#a5382f`},`今天`,8,k)):m(``,!0),(u(!0),o(d,null,s(n(V).days,(e,t)=>te((u(),o(`text`,{key:`t`+e.date,x:W(t),y:286,"text-anchor":`middle`,"font-size":`9.5`,fill:`#b0b4ba`},f(n(F)(e.date)),9,A)),[[ae,t%Math.ceil(n(H)/10)===0]])),128)),(u(!0),o(d,null,s(n(Q),e=>(u(),o(`g`,{key:e.at+e.id},[a(`title`,null,f(e.id)+` `+f(e.title)+`:`+f(n(R)[e.kind])+`(`+f(e.at)+`,`+f(e.points)+` 点)—— `+f(e.reason),1),a(`line`,{x1:W(e.idx),y1:36,x2:W(e.idx),y2:G(0),stroke:`#3f7fd4`,"stroke-dasharray":`4 3`,"stroke-width":`1.2`,opacity:`0.8`},null,8,j),a(`circle`,{cx:W(e.idx),cy:34,r:`3`,fill:`#3f7fd4`},null,8,Ce)]))),128))],8,x))]),a(`div`,we,[(u(!0),o(d,null,s(n(V).days,e=>(u(),o(`div`,{key:`row`+e.date,class:i([`cell`,{today:e.date===n(I),future:e.date>n(I),scope:n(Je).has(e.date)}])},[a(`span`,Te,f(n(F)(e.date)),1),a(`span`,Ee,f(e.actual),1),a(`span`,De,f(e.ideal),1),a(`i`,{class:`underline`,style:ne({width:(n(U)?e.actual/n(U)*100:0)+`%`})},null,4)],2))),128))]),c[12]||=a(`p`,{class:`foot dim`},`每格:日期 / 实际剩余 / 理想剩余`,-1),n(Q).length?(u(),o(`div`,Oe,[a(`p`,ke,[e(h,{name:`i-lucide-git-branch`,class:`size-3`}),t(`本迭代范围变更(`+f(n(Q).length)+`)`,1)]),a(`ul`,null,[(u(!0),o(d,null,s(n(Q),r=>(u(),o(`li`,{key:r.id},[a(`span`,Ae,f(n(R)[r.kind]),1),e(g,{to:`/story/${r.id}`,class:`mono link`},{default:re(()=>[t(f(r.id),1)]),_:2},1032,[`to`]),a(`span`,null,f(r.title),1),a(`span`,je,`· `+f(r.at)+` · `+f(r.points)+` 点 · `+f(r.reason),1)]))),128))]),c[11]||=a(`p`,{class:`foot dim`},`竖线标出的那几天,实际剩余没有按理想线下滑,是插了活而不是团队拖。`,-1)])):m(``,!0)])):(u(),o(`div`,Me,[e(h,{name:`i-lucide-info`,class:`size-4`}),c[13]||=t(`还没有迭代数据。 `,-1)])),a(`div`,Ne,[a(`div`,Pe,[c[14]||=a(`h2`,{class:`h2`},`迭代对照`,-1),a(`span`,Fe,f(n($).length),1),c[15]||=a(`span`,{class:`dim tip`},`点一行切换上面的燃尽图`,-1)]),a(`div`,Ie,[a(`table`,Le,[c[16]||=a(`thead`,null,[a(`tr`,null,[a(`th`,null,`迭代`),a(`th`,null,`名称`),a(`th`,null,`周期`),a(`th`,{class:`r`},`故事`),a(`th`,{class:`r`},`承诺 / 容量`),a(`th`,null,`状态`)])],-1),a(`tbody`,null,[(u(!0),o(d,null,s(n($),e=>(u(),o(`tr`,{key:e.id,class:i({on:e.id===n(z)}),onClick:t=>z.value=e.id},[a(`td`,ze,f(e.id),1),a(`td`,null,f(e.name),1),a(`td`,Be,f(e.period),1),a(`td`,Ve,f(e.stories),1),a(`td`,He,f(e.commit)+`/`+f(e.capacity),1),a(`td`,null,[a(`span`,{class:i([`tag`,e.tone])},f(e.status),3)])],10,Re))),128))])])])])])}}}),[[`__scopeId`,`data-v-4ef34f2c`]]);export{N as default};
1
+ import{D as e,E as t,On as n,T as r,Ut as ee,Yt as te,Zn as i,_ as a,b as o,bt as s,er as ne,g as c,k as l,mt as u,o as d,qt as re,tr as f,un as ie,vn as p,y as m}from"./DZo3dYLJ.js";import{S as ae}from"./51OWHj8c.js";import{t as oe}from"./BJW3UkS7.js";import{t as se}from"./DFuirznt.js";import{t as ce}from"./CjRYYbsC.js";import{a as h,i as g,r as le}from"#entry";var ue={class:`kpis`},de={class:`kpi tint-lilac`},fe={class:`v`},pe={class:`kpi`},me={class:`v`},he={class:`kpi`},ge={class:`kpi tint-mint`},_e={class:`v`},ve={class:`kpi`},ye={class:`v`},be={key:0,class:`card panel`},xe={class:`panel-hd`},Se={class:`ph-l`},_={class:`sp-name`},v={class:`sub mono`},y={class:`goal`},b={class:`chart-wrap`},x=[`viewBox`],S=[`y1`,`x2`,`y2`],C=[`x`,`y`],w=[`d`],T=[`d`],E=[`points`],D=[`cx`,`cy`],O=[`x1`,`y1`,`x2`,`y2`],k=[`x`,`y`],A=[`x`,`y`],j=[`x1`,`y1`,`x2`,`y2`],Ce=[`cx`,`cy`],we={class:`cells`},Te={class:`cd mono`},Ee={class:`ca`},De={class:`ci dim`},Oe={key:0,class:`scope`},ke={class:`h3`},Ae={class:`tag tag-info`},je={class:`dim`},Me={key:1,class:`callout soft`},Ne={class:`card`},Pe={class:`card-hd`},Fe={class:`tag tag-neutral`},Ie={class:`card-bd`},Le={class:`tbl`},Re=[`onClick`],ze={class:`mono`},Be={class:`mono dim`},Ve={class:`r`},He={class:`r mono`},Ue=980,We=300,M=42,N=g(l({__name:`burndown`,setup(l){let{sprints:g,burndown:N,sprintCommit:P,md:F,now:I,sprintById:L,storyById:Ge,SCOPE_LABEL:R}=h(),z=p(``),Ke=c(()=>[...g.value].reverse().map(e=>({label:`${e.id} · ${e.name}`,value:e.id,icon:`i-lucide-calendar-range`}))),B=c(()=>L.value.get(z.value)??g.value[g.value.length-1]),V=c(()=>B.value?N(B.value):{total:0,days:[]});ee(()=>{z.value&&!L.value.has(z.value)&&(z.value=``),!z.value&&g.value.length&&(z.value=g.value[g.value.length-1].id)});let H=c(()=>V.value.days.length||1),U=c(()=>V.value.total||1),W=e=>M+e*896/(H.value-1||1),G=e=>258-e*216/U.value,K=e=>V.value.days.map((t,n)=>`${W(n)},${G(t[e])}`).join(` `),qe=c(()=>{let e=V.value.days.map((e,t)=>`${W(t)},${G(e.actual)}`).join(` `),t=V.value.days.length-1;return`M${W(0)},${G(0)} L${e.replaceAll(` `,` L`)} L${W(t)},${G(0)} Z`}),q=c(()=>V.value.days.findIndex(e=>e.date===I)),J=c(()=>V.value.days.find(e=>e.date===I)??V.value.days[V.value.days.length-1]),Y=c(()=>J.value?.actual??0),X=c(()=>J.value?.ideal??0),Z=c(()=>Math.round((Y.value-X.value)*10)/10),Q=c(()=>{let e=B.value;return e?(e.stories??[]).map(e=>Ge.value.get(e)).filter(Boolean).filter(t=>t.scopeChange&&t.scopeChange.at>=e.start&&t.scopeChange.at<=e.end).map(e=>({id:e.id,title:e.title,at:e.scopeChange.at,kind:e.scopeChange.kind,reason:e.scopeChange.reason,points:e.points,idx:V.value.days.findIndex(t=>t.date===e.scopeChange.at)})).filter(e=>e.idx>=0):[]}),Je=c(()=>new Set(Q.value.map(e=>e.at))),$=c(()=>[...g.value].reverse().map(e=>{let t=e.start<=I&&e.end>=I;return{id:e.id,name:e.name,period:`${F(e.start)} ~ ${F(e.end)}`,stories:(e.stories??[]).length,commit:P(e),capacity:e.capacity,status:t?`进行中`:e.end<I?`已结束`:`未开始`,tone:t?`tag-primary`:e.end<I?`tag-neutral`:`tag-info`}}));return(ee,c)=>{let l=le,p=se,h=ce,g=oe;return u(),o(`div`,null,[a(`div`,ue,[a(`div`,de,[e(l,{tone:`lilac`,size:`sm`}),c[1]||=a(`p`,{class:`k`},`剩余故事点`,-1),a(`p`,fe,[t(f(n(Y)),1),a(`small`,null,`/ `+f(n(V).total),1)])]),a(`div`,pe,[c[3]||=a(`p`,{class:`k`},`理想剩余(今天)`,-1),a(`p`,me,[t(f(n(X)),1),c[2]||=a(`small`,null,`点`,-1)])]),a(`div`,he,[c[5]||=a(`p`,{class:`k`},`偏差`,-1),a(`p`,{class:i([`v`,{bad:n(Z)>0,good:n(Z)<=0}])},[t(f(n(Z)>0?`+`+n(Z):n(Z)),1),c[4]||=a(`small`,null,`点`,-1)],2)]),a(`div`,ge,[e(l,{tone:`mint`,size:`sm`}),c[6]||=a(`p`,{class:`k`},`承诺 / 容量`,-1),a(`p`,_e,[t(f(n(B)?n(P)(n(B)):0),1),a(`small`,null,`/ `+f(n(B)?.capacity??0),1)])]),a(`div`,ve,[c[8]||=a(`p`,{class:`k`},`范围变更`,-1),a(`p`,ye,[t(f(n(Q).length),1),c[7]||=a(`small`,null,`次`,-1)])])]),n(B)?(u(),o(`div`,be,[a(`div`,xe,[a(`div`,Se,[a(`h2`,_,f(n(B).name),1),a(`p`,v,f(n(B).id)+` · `+f(n(F)(n(B).start))+` ~ `+f(n(F)(n(B).end)),1),a(`p`,y,f(n(B).goal),1)]),e(p,{modelValue:n(z),"onUpdate:modelValue":c[0]||=e=>ie(z)?z.value=e:null,items:n(Ke),icon:`i-lucide-calendar-range`,"aria-label":`选择迭代`,class:`bd-select`},null,8,[`modelValue`,`items`])]),a(`div`,b,[c[10]||=r(`<div class="chart-legend" data-v-4ef34f2c><span class="lg" data-v-4ef34f2c><i class="sw actual" data-v-4ef34f2c></i>实际剩余</span><span class="lg" data-v-4ef34f2c><i class="sw ideal" data-v-4ef34f2c></i>理想线</span><span class="lg" data-v-4ef34f2c><i class="sw scope" data-v-4ef34f2c></i>范围变更</span></div>`,1),(u(),o(`svg`,{viewBox:`0 0 ${Ue} ${We}`,class:`chart`,role:`img`},[c[9]||=r(`<defs data-v-4ef34f2c><linearGradient id="bd-line" x1="0" y1="0" x2="1" y2="0" data-v-4ef34f2c><stop offset="0%" stop-color="#8a63f7" data-v-4ef34f2c></stop><stop offset="100%" stop-color="#c3aefb" data-v-4ef34f2c></stop></linearGradient><linearGradient id="bd-area" x1="0" y1="0" x2="0" y2="1" data-v-4ef34f2c><stop offset="0%" stop-color="#8a63f7" stop-opacity="0.16" data-v-4ef34f2c></stop><stop offset="100%" stop-color="#8a63f7" stop-opacity="0" data-v-4ef34f2c></stop></linearGradient></defs>`,1),a(`g`,null,[(u(),o(d,null,s([0,.25,.5,.75,1],e=>a(`line`,{key:`grid`+e,x1:M,y1:G(n(U)*e),x2:938,y2:G(n(U)*e),stroke:`#f1f0ea`,"stroke-width":`1`},null,8,S)),64)),(u(),o(d,null,s([0,.25,.5,.75,1],e=>a(`text`,{key:`gl`+e,x:32,y:G(n(U)*e)+3.5,"text-anchor":`end`,"font-size":`9.5`,fill:`#b0b4ba`},f(Math.round(n(U)*e)),9,C)),64))]),a(`path`,{d:n(qe),fill:`url(#bd-area)`},null,8,w),a(`path`,{d:`M${W(0)},${G(n(U))} L${W(n(H)-1)},${G(0)}`,stroke:`#cdc9d8`,"stroke-width":`1.4`,"stroke-dasharray":`5 5`,fill:`none`},null,8,T),a(`polyline`,{points:K(`actual`),stroke:`url(#bd-line)`,"stroke-width":`2.6`,fill:`none`,"stroke-linejoin":`round`,"stroke-linecap":`round`},null,8,E),(u(!0),o(d,null,s(n(V).days,(e,t)=>(u(),o(`circle`,{key:e.date,cx:W(t),cy:G(e.actual),r:`3`,fill:`#fff`,stroke:`#8a63f7`,"stroke-width":`1.8`},null,8,D))),128)),n(q)>=0?(u(),o(`line`,{key:0,x1:W(n(q)),y1:34,x2:W(n(q)),y2:G(0),stroke:`#cf4759`,"stroke-dasharray":`3 3`,"stroke-width":`1.2`,opacity:`0.7`},null,8,O)):m(``,!0),n(q)>=0?(u(),o(`text`,{key:1,x:W(n(q)),y:28,"text-anchor":`middle`,"font-size":`9.5`,fill:`#a5382f`},`今天`,8,k)):m(``,!0),(u(!0),o(d,null,s(n(V).days,(e,t)=>te((u(),o(`text`,{key:`t`+e.date,x:W(t),y:286,"text-anchor":`middle`,"font-size":`9.5`,fill:`#b0b4ba`},f(n(F)(e.date)),9,A)),[[ae,t%Math.ceil(n(H)/10)===0]])),128)),(u(!0),o(d,null,s(n(Q),e=>(u(),o(`g`,{key:e.at+e.id},[a(`title`,null,f(e.id)+` `+f(e.title)+`:`+f(n(R)[e.kind])+`(`+f(e.at)+`,`+f(e.points)+` 点)—— `+f(e.reason),1),a(`line`,{x1:W(e.idx),y1:36,x2:W(e.idx),y2:G(0),stroke:`#3f7fd4`,"stroke-dasharray":`4 3`,"stroke-width":`1.2`,opacity:`0.8`},null,8,j),a(`circle`,{cx:W(e.idx),cy:34,r:`3`,fill:`#3f7fd4`},null,8,Ce)]))),128))],8,x))]),a(`div`,we,[(u(!0),o(d,null,s(n(V).days,e=>(u(),o(`div`,{key:`row`+e.date,class:i([`cell`,{today:e.date===n(I),future:e.date>n(I),scope:n(Je).has(e.date)}])},[a(`span`,Te,f(n(F)(e.date)),1),a(`span`,Ee,f(e.actual),1),a(`span`,De,f(e.ideal),1),a(`i`,{class:`underline`,style:ne({width:(n(U)?e.actual/n(U)*100:0)+`%`})},null,4)],2))),128))]),c[12]||=a(`p`,{class:`foot dim`},`每格:日期 / 实际剩余 / 理想剩余`,-1),n(Q).length?(u(),o(`div`,Oe,[a(`p`,ke,[e(h,{name:`i-lucide-git-branch`,class:`size-3`}),t(`本迭代范围变更(`+f(n(Q).length)+`)`,1)]),a(`ul`,null,[(u(!0),o(d,null,s(n(Q),r=>(u(),o(`li`,{key:r.id},[a(`span`,Ae,f(n(R)[r.kind]),1),e(g,{to:`/story/${r.id}`,class:`mono link`},{default:re(()=>[t(f(r.id),1)]),_:2},1032,[`to`]),a(`span`,null,f(r.title),1),a(`span`,je,`· `+f(r.at)+` · `+f(r.points)+` 点 · `+f(r.reason),1)]))),128))]),c[11]||=a(`p`,{class:`foot dim`},`竖线标出的那几天,实际剩余没有按理想线下滑,是插了活而不是团队拖。`,-1)])):m(``,!0)])):(u(),o(`div`,Me,[e(h,{name:`i-lucide-info`,class:`size-4`}),c[13]||=t(`还没有迭代数据。 `,-1)])),a(`div`,Ne,[a(`div`,Pe,[c[14]||=a(`h2`,{class:`h2`},`迭代对照`,-1),a(`span`,Fe,f(n($).length),1),c[15]||=a(`span`,{class:`dim tip`},`点一行切换上面的燃尽图`,-1)]),a(`div`,Ie,[a(`table`,Le,[c[16]||=a(`thead`,null,[a(`tr`,null,[a(`th`,null,`迭代`),a(`th`,null,`名称`),a(`th`,null,`周期`),a(`th`,{class:`r`},`故事`),a(`th`,{class:`r`},`承诺 / 容量`),a(`th`,null,`状态`)])],-1),a(`tbody`,null,[(u(!0),o(d,null,s(n($),e=>(u(),o(`tr`,{key:e.id,class:i({on:e.id===n(z)}),onClick:t=>z.value=e.id},[a(`td`,ze,f(e.id),1),a(`td`,null,f(e.name),1),a(`td`,Be,f(e.period),1),a(`td`,Ve,f(e.stories),1),a(`td`,He,f(e.commit)+`/`+f(e.capacity),1),a(`td`,null,[a(`span`,{class:i([`tag`,e.tone])},f(e.status),3)])],10,Re))),128))])])])])])}}}),[[`__scopeId`,`data-v-4ef34f2c`]]);export{N as default};
@@ -0,0 +1,13 @@
1
+ import{$n as e,D as t,E as n,Ht as r,Lt as i,On as a,Rt as o,Ut as s,Zn as c,_ as l,b as u,bt as d,ct as f,er as p,et as m,ft as h,g,gn as _,k as v,mt as y,o as b,pn as x,qt as S,tr as C,tt as w,u as T,v as E,vn as D,wn as O,wt as k,xn as A,xt as j,y as M}from"./DZo3dYLJ.js";import{w as N}from"./51OWHj8c.js";import{r as P}from"./oXSDGTSr.js";import{h as F,n as I,t as L}from"./Baq-Hrpf.js";import{r as ee,t as R}from"./DLkAKotw.js";import{t as z}from"./DHihWhf5.js";import{S as B,m as V,s as te}from"./CuJUHLl8.js";import{d as ne,f as re,p as H,r as ie}from"./Vo4wMbnS.js";import{t as U}from"./CK9_veoz.js";import{t as W}from"./BuOKDFiJ.js";import{t as G}from"./D3YCAmfu.js";import{t as K}from"./C9StZL3D.js";import{t as q}from"./Bi9Axj3V.js";import{t as J}from"./CjRYYbsC.js";import{n as Y}from"./D8Bpf7sE.js";import{t as X}from"./DNMF9lr0.js";import{_ as ae,c as Z,g as Q,h as oe,m as se,p as ce,v as le}from"#entry";var $=100,[ue,de]=F(`ProgressRoot`),fe=e=>typeof e==`number`;function pe(e,t){return z(e)||fe(e)&&!Number.isNaN(e)&&e<=t&&e>=0?e:(console.error(`Invalid prop \`value\` of value \`${e}\` supplied to \`ProgressRoot\`. The \`value\` prop must be:
2
+ - a positive number
3
+ - less than the value passed to \`max\` (or ${$} if no \`max\` prop is set)
4
+ - \`null\` or \`undefined\` if the progress is indeterminate.
5
+
6
+ Defaulting to \`null\`.`),null)}function me(e){return fe(e)&&!Number.isNaN(e)&&e>0?e:(console.error(`Invalid prop \`max\` of value \`${e}\` supplied to \`ProgressRoot\`. Only numbers greater than 0 are valid max values. Defaulting to \`${$}\`.`),$)}var he=v({__name:`ProgressRoot`,props:{modelValue:{type:[Number,null],required:!1},max:{type:Number,required:!1,default:$},getValueLabel:{type:Function,required:!1,default:(e,t)=>fe(e)?`${Math.round(e/t*$)}%`:void 0},getValueText:{type:Function,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:[`update:modelValue`,`update:max`],setup(e,{emit:t}){let n=e,i=t;G();let o=H(n,`modelValue`,i,{passive:n.modelValue===void 0}),s=H(n,`max`,i,{passive:n.max===void 0});r(()=>o.value,async e=>{let t=pe(e,n.max);t!==e&&(await w(),o.value=t)},{immediate:!0}),r(()=>n.max,e=>{let t=me(n.max);t!==e&&(s.value=t)},{immediate:!0});let c=g(()=>z(o.value)?`indeterminate`:o.value===s.value?`complete`:`loading`);return de({modelValue:o,max:s,progressState:c}),(t,n)=>(y(),E(a(U),{"as-child":e.asChild,as:e.as,"aria-valuemax":a(s),"aria-valuemin":0,"aria-valuenow":fe(a(o))?a(o):void 0,"aria-valuetext":e.getValueText?.(a(o),a(s)),"aria-label":e.getValueLabel(a(o),a(s)),role:`progressbar`,"data-state":c.value,"data-value":a(o)??void 0,"data-max":a(s)},{default:S(()=>[j(t.$slots,`default`,{modelValue:a(o)})]),_:3},8,[`as-child`,`as`,`aria-valuemax`,`aria-valuenow`,`aria-valuetext`,`aria-label`,`data-state`,`data-value`,`data-max`]))}}),ge=v({__name:`ProgressIndicator`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){let t=e,n=ue();return G(),(e,r)=>(y(),E(a(U),m(t,{"data-state":a(n).progressState.value,"data-value":a(n).modelValue?.value??void 0,"data-max":a(n).max.value}),{default:S(()=>[j(e.$slots,`default`)]),_:3},16,[`data-state`,`data-value`,`data-max`]))}}),_e=v({__name:`ToastAnnounceExclude`,props:{altText:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){return(t,n)=>(y(),E(a(U),{as:e.as,"as-child":e.asChild,"data-reka-toast-announce-exclude":``,"data-reka-toast-announce-alt":e.altText||void 0},{default:S(()=>[j(t.$slots,`default`)]),_:3},8,[`as`,`as-child`,`data-reka-toast-announce-alt`]))}}),ve=v({__name:`ToastAnnounce`,setup(e){let t=le(),r=B(1e3),i=D(!1),o=0,s=0;return te&&(o=requestAnimationFrame(()=>{s=requestAnimationFrame(()=>{i.value=!0})}),x(()=>{cancelAnimationFrame(o),cancelAnimationFrame(s)})),(e,o)=>a(r)||i.value?(y(),E(a(q),{key:0,feature:`fully-hidden`},{default:S(()=>[n(C(a(t).label.value)+` `,1),j(e.$slots,`default`)]),_:3})):M(`v-if`,!0)}}),[ye,be]=F(`ToastPositioner`),[xe,Se]=F(`ToastRoot`),Ce=v({inheritAttrs:!1,__name:`ToastRootImpl`,props:{type:{type:String,required:!1},open:{type:Boolean,required:!1,default:!1},duration:{type:Number,required:!1},toast:{type:Object,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`li`}},emits:[`close`,`escapeKeyDown`,`pause`,`resume`,`swipeStart`,`swipeMove`,`swipeCancel`,`swipeEnd`],setup(e,{emit:i}){let o=e,c=i,{forwardRef:l,currentElement:p}=G(),{CollectionItem:v}=R(),x=le(),w=D(null),k=D(null),P=g(()=>typeof o.duration==`number`?o.duration:x.duration.value),F=D(0),I=D(P.value),L=D(0),z=D(P.value),B=ne(()=>{let e=Date.now()-F.value;z.value=Math.max(I.value-e,0)},{fpsLimit:60});function V(e){e<=0||e===1/0||te&&(window.clearTimeout(L.value),F.value=Date.now(),L.value=window.setTimeout(H,e))}function H(e){let t=e?.pointerType===``;p.value?.contains(ee())&&t&&x.viewport.value?.focus(),t&&(x.isClosePausedRef.value=!1),c(`close`)}let W=ye(null),K=A(null);r([p,()=>o.toast?.updateKey],([e])=>{K.value=e?oe(e):null},{flush:`post`,immediate:!0});let q=_({seq:0,height:0,open:o.open}),J=g(()=>x.getToastStack(q));function Y(){let e=p.value;if(!e)return;let t=e.style.height;e.style.height=`auto`,q.height=e.offsetHeight,e.style.height=t}if(re(p,Y),r(()=>o.toast?.updateKey,Y,{flush:`post`}),r(()=>o.open,(e,t)=>{q.open=e,e&&!t&&x.reopenToast(q)}),o.type&&![`foreground`,`background`].includes(o.type))throw Error("Invalid prop `type` supplied to `Toast`. Expected `foreground | background`.");s(e=>{let t=x.viewport.value;if(t){let n=()=>{V(I.value),B.resume(),c(`resume`)},r=()=>{let e=Date.now()-F.value;I.value-=e,window.clearTimeout(L.value),B.pause(),c(`pause`)};t.addEventListener(ce,r),t.addEventListener(se,n),e(()=>{t.removeEventListener(ce,r),t.removeEventListener(se,n)})}});let X=g(()=>o.toast?x.toastStore.getRestartKey(o.toast.id):0);r([()=>o.open,P,X],()=>{I.value=P.value,o.open&&!x.isClosePausedRef.value&&V(P.value)},{immediate:!0}),ie(`Escape`,e=>{c(`escapeKeyDown`,e),e.defaultPrevented||(x.isFocusedToastEscapeKeyDownRef.value=!0,H())});let Z;return f(()=>{x.onToastAdd(),Z=x.registerToast(q),Y()}),h(()=>{x.onToastRemove(),Z?.()}),Se({onClose:H,toast:O(o,`toast`)}),(r,i)=>(y(),u(b,null,[K.value?(y(),E(ve,{key:e.toast?.updateKey??0,role:`alert`,"aria-live":e.type===`foreground`?`assertive`:`polite`},{default:S(()=>[M(`
7
+ Render each chunk as its own text node so screen readers get the
8
+ natural pause break between nodes (see comment in utils.ts).
9
+ Interpolating the array directly with \`{{ announceTextContent }}\`
10
+ would route through Vue's \`toDisplayString\`, which JSON-stringifies
11
+ arrays — the live region would then announce literal \`[\`, quotes
12
+ and commas instead of the toast title and description.
13
+ `),(y(!0),u(b,null,d(K.value,(e,t)=>(y(),u(b,{key:t},[n(C(e),1)],64))),128))]),_:1},8,[`aria-live`])):M(`v-if`,!0),a(x).viewport.value||a(W)?(y(),E(T,{key:1,to:a(x).viewport.value??`body`,disabled:!!a(W)},[t(a(v),null,{default:S(()=>[t(a(U),m({ref:a(l),tabindex:`0`},r.$attrs,{as:e.as,"as-child":e.asChild,"data-state":e.open?`open`:`closed`,"data-swipe-direction":a(x).swipeDirection.value,"data-status":e.toast?.status,"data-expanded":a(x).expanded.value?``:void 0,"data-limited":J.value.limited?``:void 0,inert:J.value.limited||void 0,style:{...a(x).disableSwipe.value?void 0:{userSelect:`none`,touchAction:`none`},"--reka-toast-index":J.value.index,"--reka-toast-offset-y":`${J.value.offsetY}px`,"--reka-toast-height":q.height?`${q.height}px`:void 0},onPointerdown:i[0]||=N(e=>{a(x).disableSwipe.value||(w.value={x:e.clientX,y:e.clientY})},[`left`]),onPointermove:i[1]||=e=>{if(a(x).disableSwipe.value||!w.value)return;let t=e.clientX-w.value.x,n=e.clientY-w.value.y,r=!!k.value,i=[`left`,`right`].includes(a(x).swipeDirection.value),o=[`left`,`up`].includes(a(x).swipeDirection.value)?Math.min:Math.max,s=i?o(0,t):0,l=i?0:o(0,n),u=e.pointerType===`touch`?10:2,d={x:s,y:l},f={originalEvent:e,delta:d};r?(k.value=d,a(Q)(a(`toast.swipeMove`),e=>c(`swipeMove`,e),f)):a(ae)(d,a(x).swipeDirection.value,u)?(k.value=d,a(Q)(a(`toast.swipeStart`),e=>c(`swipeStart`,e),f),e.target.setPointerCapture(e.pointerId)):(Math.abs(t)>u||Math.abs(n)>u)&&(w.value=null)},onPointerup:i[2]||=e=>{if(a(x).disableSwipe.value)return;let t=k.value,n=e.target;if(n.hasPointerCapture(e.pointerId)&&n.releasePointerCapture(e.pointerId),k.value=null,w.value=null,t){let n=e.currentTarget,r={originalEvent:e,delta:t};a(ae)(t,a(x).swipeDirection.value,a(x).swipeThreshold.value)?a(Q)(a(`toast.swipeEnd`),e=>c(`swipeEnd`,e),r):a(Q)(a(`toast.swipeCancel`),e=>c(`swipeCancel`,e),r),n?.addEventListener(`click`,e=>e.preventDefault(),{once:!0})}}}),{default:S(()=>[j(r.$slots,`default`,{remaining:z.value,duration:P.value})]),_:3},16,[`as`,`as-child`,`data-state`,`data-swipe-direction`,`data-status`,`data-expanded`,`data-limited`,`inert`,`style`])]),_:3})],8,[`to`,`disabled`])):M(`v-if`,!0)],64))}}),we=v({__name:`ToastAction`,props:{altText:{type:String,required:!1},closeOnClick:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`button`}},setup(e){let r=e,o=xe(),{forwardRef:s}=G(),c=i(),l=g(()=>o.toast.value?.actionProps),u=g(()=>!!c.default||!o.toast.value||!!l.value),d=g(()=>r.altText??l.value?.altText);if(u.value&&!d.value)throw Error("Missing prop `altText` expected on `ToastAction`");function f(e){l.value?.onClick?.(e),(l.value?.closeOnClick??r.closeOnClick)&&o.onClose(e)}return(r,i)=>u.value&&d.value?(y(),E(_e,{key:0,"alt-text":d.value,"as-child":``},{default:S(()=>[t(a(U),{ref:a(s),as:e.as,"as-child":e.asChild,type:e.as===`button`?`button`:void 0,onClick:f},{default:S(()=>[j(r.$slots,`default`,{},()=>[n(C(l.value?.label),1)])]),_:3},8,[`as`,`as-child`,`type`])]),_:3},8,[`alt-text`])):M(`v-if`,!0)}}),Te=v({__name:`ToastClose`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`button`}},setup(e){let n=e,r=xe(),{forwardRef:i}=G();return(o,s)=>(y(),E(_e,{"as-child":``},{default:S(()=>[t(a(U),m(n,{ref:a(i),type:e.as===`button`?`button`:void 0,onClick:a(r).onClose}),{default:S(()=>[j(o.$slots,`default`)]),_:3},16,[`type`,`onClick`])]),_:3}))}}),Ee=v({__name:`ToastDescription`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(t){let r=t;G();let i=xe(null);return(t,o)=>t.$slots.default||!a(i)?.toast.value||a(i).toast.value.description?(y(),E(a(U),e(m({key:0},r)),{default:S(()=>[j(t.$slots,`default`,{},()=>[n(C(a(i)?.toast.value?.description),1)])]),_:3},16)):M(`v-if`,!0)}}),De=v({__name:`ToastRoot`,props:{defaultOpen:{type:Boolean,required:!1,default:!0},forceMount:{type:Boolean,required:!1},type:{type:String,required:!1,default:`foreground`},open:{type:Boolean,required:!1,default:void 0},duration:{type:Number,required:!1},toast:{type:Object,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`li`}},emits:[`escapeKeyDown`,`pause`,`resume`,`swipeStart`,`swipeMove`,`swipeCancel`,`swipeEnd`,`update:open`],setup(e,{emit:n}){let i=e,o=n,{forwardRef:s}=G(),c=H(i,`open`,o,{defaultValue:i.defaultOpen,passive:i.open===void 0}),l=le(),u=g(()=>i.toast?i.toast.open:c.value),d=g(()=>i.toast?.type??i.type),f=g(()=>i.toast?.status===`loading`?1/0:i.toast?.duration??i.duration);function p(){i.toast?(l.toastStore.close(i.toast.id),o(`update:open`,!1)):c.value=!1}let h=D(!1);return r([()=>i.toast,h],([e,t])=>{e&&!e.open&&!t&&l.toastStore.remove(e.id)},{immediate:!0}),(n,r)=>(y(),E(a(K),{present:e.forceMount||u.value},{default:S(()=>[t(Ce,m({ref:a(s),open:u.value,type:d.value,as:e.as,"as-child":e.asChild,duration:f.value,toast:e.toast},n.$attrs,{onVnodeMounted:r[0]||=e=>h.value=!0,onVnodeUnmounted:r[1]||=e=>h.value=!1,onClose:p,onPause:r[2]||=e=>o(`pause`),onResume:r[3]||=e=>o(`resume`),onEscapeKeyDown:r[4]||=e=>o(`escapeKeyDown`,e),onSwipeStart:r[5]||=e=>{o(`swipeStart`,e),e.defaultPrevented||e.currentTarget.setAttribute(`data-swipe`,`start`)},onSwipeMove:r[6]||=e=>{if(o(`swipeMove`,e),!e.defaultPrevented){let{x:t,y:n}=e.detail.delta,r=e.currentTarget;r.setAttribute(`data-swipe`,`move`),r.style.setProperty(`--reka-toast-swipe-move-x`,`${t}px`),r.style.setProperty(`--reka-toast-swipe-move-y`,`${n}px`)}},onSwipeCancel:r[7]||=e=>{if(o(`swipeCancel`,e),!e.defaultPrevented){let t=e.currentTarget;t.setAttribute(`data-swipe`,`cancel`),t.style.removeProperty(`--reka-toast-swipe-move-x`),t.style.removeProperty(`--reka-toast-swipe-move-y`),t.style.removeProperty(`--reka-toast-swipe-end-x`),t.style.removeProperty(`--reka-toast-swipe-end-y`)}},onSwipeEnd:r[8]||=e=>{if(o(`swipeEnd`,e),!e.defaultPrevented){let{x:t,y:n}=e.detail.delta,r=e.currentTarget;r.setAttribute(`data-swipe`,`end`),r.style.removeProperty(`--reka-toast-swipe-move-x`),r.style.removeProperty(`--reka-toast-swipe-move-y`),r.style.setProperty(`--reka-toast-swipe-end-x`,`${t}px`),r.style.setProperty(`--reka-toast-swipe-end-y`,`${n}px`),p()}}}),{default:S(({remaining:e,duration:t})=>[j(n.$slots,`default`,{remaining:e,duration:t,open:u.value})]),_:3},16,[`open`,`type`,`as`,`as-child`,`duration`,`toast`])]),_:3},8,[`present`]))}}),Oe=v({__name:`ToastTitle`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(t){let r=t;G();let i=xe(null);return(t,o)=>t.$slots.default||!a(i)?.toast.value||a(i).toast.value.title?(y(),E(a(U),e(m({key:0},r)),{default:S(()=>[j(t.$slots,`default`,{},()=>[n(C(a(i)?.toast.value?.title),1)])]),_:3},16)):M(`v-if`,!0)}}),ke={slots:{root:`gap-2`,base:`relative overflow-hidden rounded-full bg-accented`,indicator:`rounded-full size-full transition-transform duration-200 ease-out motion-reduce:transition-none motion-reduce:data-[state=indeterminate]:animate-pulse`,status:`flex text-dimmed duration-200 ease-out motion-reduce:transition-none`,steps:`grid items-end`,step:`truncate text-end row-start-1 col-start-1 transition-opacity ease-out`},variants:{animation:{carousel:``,"carousel-inverse":``,swing:``,elastic:``},color:{primary:{indicator:`bg-primary`,steps:`text-primary`},secondary:{indicator:`bg-secondary`,steps:`text-secondary`},success:{indicator:`bg-success`,steps:`text-success`},info:{indicator:`bg-info`,steps:`text-info`},warning:{indicator:`bg-warning`,steps:`text-warning`},error:{indicator:`bg-error`,steps:`text-error`},neutral:{indicator:`bg-inverted`,steps:`text-highlighted`}},size:{"2xs":{status:`text-xs`,steps:`text-xs`},xs:{status:`text-xs`,steps:`text-xs`},sm:{status:`text-sm`,steps:`text-sm`},md:{status:`text-sm`,steps:`text-sm`},lg:{status:`text-sm`,steps:`text-sm`},xl:{status:`text-base`,steps:`text-base`},"2xl":{status:`text-base`,steps:`text-base`}},step:{active:{step:`opacity-100`},first:{step:`opacity-100 text-muted`},other:{step:`opacity-0`},last:{step:``}},orientation:{horizontal:{root:`w-full flex flex-col`,base:`w-full`,status:`flex-row items-center justify-end w-(--percent) min-w-fit transition-[width]`},vertical:{root:`h-full flex flex-row-reverse`,base:`h-full`,status:`flex-col justify-end h-(--percent) min-h-fit transition-[height]`}},inverted:{true:{status:`self-end`}}},compoundVariants:[{inverted:!0,orientation:`horizontal`,class:{step:`text-start`,status:`flex-row-reverse`}},{inverted:!0,orientation:`vertical`,class:{steps:`items-start`,status:`flex-col-reverse`}},{orientation:`horizontal`,size:`2xs`,class:`h-px`},{orientation:`horizontal`,size:`xs`,class:`h-0.5`},{orientation:`horizontal`,size:`sm`,class:`h-1`},{orientation:`horizontal`,size:`md`,class:`h-2`},{orientation:`horizontal`,size:`lg`,class:`h-3`},{orientation:`horizontal`,size:`xl`,class:`h-4`},{orientation:`horizontal`,size:`2xl`,class:`h-5`},{orientation:`vertical`,size:`2xs`,class:`w-px`},{orientation:`vertical`,size:`xs`,class:`w-0.5`},{orientation:`vertical`,size:`sm`,class:`w-1`},{orientation:`vertical`,size:`md`,class:`w-2`},{orientation:`vertical`,size:`lg`,class:`w-3`},{orientation:`vertical`,size:`xl`,class:`w-4`},{orientation:`vertical`,size:`2xl`,class:`w-5`},{orientation:`horizontal`,animation:`carousel`,class:{indicator:`motion-safe:data-[state=indeterminate]:animate-[carousel_2s_linear_infinite] motion-safe:data-[state=indeterminate]:rtl:animate-[carousel-rtl_2s_linear_infinite]`}},{orientation:`vertical`,animation:`carousel`,class:{indicator:`motion-safe:data-[state=indeterminate]:animate-[carousel-vertical_2s_linear_infinite]`}},{orientation:`horizontal`,animation:`carousel-inverse`,class:{indicator:`motion-safe:data-[state=indeterminate]:animate-[carousel-inverse_2s_linear_infinite] motion-safe:data-[state=indeterminate]:rtl:animate-[carousel-inverse-rtl_2s_linear_infinite]`}},{orientation:`vertical`,animation:`carousel-inverse`,class:{indicator:`motion-safe:data-[state=indeterminate]:animate-[carousel-inverse-vertical_2s_linear_infinite]`}},{orientation:`horizontal`,animation:`swing`,class:{indicator:`motion-safe:data-[state=indeterminate]:animate-[swing_2s_var(--ease-in-out)_infinite]`}},{orientation:`vertical`,animation:`swing`,class:{indicator:`motion-safe:data-[state=indeterminate]:animate-[swing-vertical_2s_var(--ease-in-out)_infinite]`}},{orientation:`horizontal`,animation:`elastic`,class:{indicator:`relative motion-safe:data-[state=indeterminate]:animate-[elastic_2s_var(--ease-in-out)_infinite]`}},{orientation:`vertical`,animation:`elastic`,class:{indicator:`relative motion-safe:data-[state=indeterminate]:animate-[elastic-vertical_2s_var(--ease-in-out)_infinite]`}}],defaultVariants:{animation:`carousel`,color:`primary`,size:`md`}},Ae={__name:`UProgress`,props:{as:{type:null,required:!1},max:{type:[Number,Array],required:!1},status:{type:Boolean,required:!1},inverted:{type:Boolean,required:!1,default:!1},size:{type:null,required:!1},color:{type:null,required:!1},orientation:{type:null,required:!1,default:`horizontal`},animation:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},getValueLabel:{type:Function,required:!1},getValueText:{type:Function,required:!1},modelValue:{type:[Number,null],required:!1,default:null}},emits:[`update:modelValue`,`update:max`],setup(e,{emit:r}){let o=e,s=r,l=i(),f=I(`progress`,o),{dir:h}=Z(),_=P(),v=W(V(f,`getValueLabel`,`getValueText`,`modelValue`),s),x=g(()=>v.value.modelValue===null),w=g(()=>Array.isArray(f.max)),T=g(()=>{if(!x.value&&f.max)return Array.isArray(f.max)?f.max.length-1:Number(f.max)}),D=g(()=>{if(!x.value)switch(!0){case v.value.modelValue<0:return 0;case v.value.modelValue>(T.value??100):return 100;default:return Math.round(v.value.modelValue/(T.value??100)*100)}}),O=g(()=>{if(D.value!==void 0)return f.orientation===`vertical`?{transform:`translateY(${f.inverted?``:`-`}${100-D.value}%)`}:h.value===`rtl`?{transform:`translateX(${f.inverted?`-`:``}${100-D.value}%)`}:{transform:`translateX(${f.inverted?``:`-`}${100-D.value}%)`}}),k=g(()=>({"--percent":`${Math.max(D.value??0,0)}%`}));function A(e){return e===Number(f.modelValue)}function N(e){return e===0}function F(e){return e===T.value}function ee(e){return e=Number(e),A(e)&&!N(e)?`active`:N(e)&&A(e)?`first`:F(e)&&A(e)?`last`:`other`}let R=g(()=>L({extend:ke,..._.ui?.progress||{}})({animation:f.animation,size:f.size,color:f.color,orientation:f.orientation,inverted:f.inverted})),z=g(()=>Object.keys({...ke.variants?.color,..._.ui?.progress?.variants?.color})),B=g(()=>f.color&&!z.value.includes(f.color)?f.color:void 0);return(e,r)=>(y(),E(a(U),{as:a(f).as,"data-orientation":a(f).orientation,"data-slot":`root`,class:c(R.value.root({class:[a(f).ui?.root,a(f).class]}))},{default:S(()=>[!x.value&&(a(f).status||l.status)?(y(),u(`div`,{key:0,"data-slot":`status`,class:c(R.value.status({class:a(f).ui?.status})),style:p(k.value)},[j(e.$slots,`status`,{percent:D.value},()=>[n(C(D.value)+`% `,1)])],6)):M(``,!0),t(a(he),m(a(v),{max:T.value,"data-slot":`base`,class:R.value.base({class:a(f).ui?.base}),style:{transform:`translateZ(0)`}}),{default:S(()=>[t(a(ge),{"data-slot":`indicator`,class:c(R.value.indicator({class:a(f).ui?.indicator})),style:p([O.value,B.value?{backgroundColor:B.value}:void 0])},null,8,[`class`,`style`])]),_:1},16,[`max`,`class`]),w.value?(y(),u(`div`,{key:1,"data-slot":`steps`,class:c(R.value.steps({class:a(f).ui?.steps})),style:p(B.value?{color:B.value}:void 0)},[(y(!0),u(b,null,d(a(f).max,(t,r)=>(y(),u(`div`,{key:r,"data-slot":`step`,class:c(R.value.step({class:a(f).ui?.step,step:ee(r)}))},[j(e.$slots,`step-${r}`,{step:t},()=>[n(C(t),1)])],2))),128))],6)):M(``,!0)]),_:3},8,[`as`,`data-orientation`,`class`]))}},je={slots:{root:`relative group overflow-hidden bg-default shadow-lg rounded-lg ring ring-default p-4 flex gap-2.5`,wrapper:`w-0 flex-1 flex flex-col`,title:`text-sm font-medium text-highlighted`,description:`text-sm text-muted`,icon:`shrink-0 size-5`,avatar:`shrink-0`,avatarSize:`2xl`,actions:`flex gap-1.5 shrink-0`,progress:`absolute inset-x-0 bottom-0`,close:`p-0`},variants:{color:{primary:{root:`outline-primary/25 focus-visible:outline-3 focus-visible:ring-primary`,icon:`text-primary`},secondary:{root:`outline-secondary/25 focus-visible:outline-3 focus-visible:ring-secondary`,icon:`text-secondary`},success:{root:`outline-success/25 focus-visible:outline-3 focus-visible:ring-success`,icon:`text-success`},info:{root:`outline-info/25 focus-visible:outline-3 focus-visible:ring-info`,icon:`text-info`},warning:{root:`outline-warning/25 focus-visible:outline-3 focus-visible:ring-warning`,icon:`text-warning`},error:{root:`outline-error/25 focus-visible:outline-3 focus-visible:ring-error`,icon:`text-error`},neutral:{root:`outline-inverted/25 focus-visible:outline-3 focus-visible:ring-inverted`,icon:`text-highlighted`}},orientation:{horizontal:{root:`items-center`,actions:`items-center`},vertical:{root:`items-start`,actions:`items-start mt-2.5`}},title:{true:{description:`mt-1`}}},defaultVariants:{color:`primary`}},Me={__name:`UToast`,props:{as:{type:null,required:!1},title:{type:[String,Object,Function],required:!1},description:{type:[String,Object,Function],required:!1},icon:{type:null,required:!1},avatar:{type:Object,required:!1},color:{type:null,required:!1},orientation:{type:null,required:!1,default:`vertical`},close:{type:[Boolean,Object],required:!1,default:!0},closeIcon:{type:null,required:!1},actions:{type:Array,required:!1},duration:{type:Number,required:!1},progress:{type:[Boolean,Object],required:!1,default:!0},class:{type:null,required:!1},ui:{type:Object,required:!1},defaultOpen:{type:Boolean,required:!1},open:{type:Boolean,required:!1},type:{type:String,required:!1}},emits:[`escapeKeyDown`,`pause`,`resume`,`swipeStart`,`swipeMove`,`swipeCancel`,`swipeEnd`,`update:open`],setup(e,{expose:r,emit:s}){let p=e,h=s,_=i(),v=I(`toast`,p),{t:x}=Z(),w=P(),T=W(V(v,`as`,`defaultOpen`,`open`,`duration`,`type`),h),O=g(()=>L({extend:je,...w.ui?.toast||{}})({color:v.color,orientation:v.orientation,title:!!v.title||!!_.title})),A=o(`rootRef`),F=D(0);return f(()=>{A.value?.$el?.getBoundingClientRect&&(F.value=A.value.$el.getBoundingClientRect().height)}),r({height:F}),(e,r)=>(y(),E(a(De),m({ref_key:`rootRef`,ref:A},a(T),{"data-orientation":a(v).orientation,"data-slot":`root`,class:O.value.root({class:[a(v).ui?.root,a(v).class]}),style:{"--height":F.value}}),{default:S(({remaining:i,duration:o,open:s})=>[j(e.$slots,`leading`,{ui:O.value},()=>[a(v).avatar?(y(),E(Y,m({key:0,size:a(v).ui?.avatarSize||O.value.avatarSize()},a(v).avatar,{"data-slot":`avatar`,class:O.value.avatar({class:a(v).ui?.avatar})}),null,16,[`size`,`class`])):a(v).icon?(y(),E(J,{key:1,name:a(v).icon,"data-slot":`icon`,class:c(O.value.icon({class:a(v).ui?.icon}))},null,8,[`name`,`class`])):M(``,!0)]),l(`div`,{"data-slot":`wrapper`,class:c(O.value.wrapper({class:a(v).ui?.wrapper}))},[a(v).title||_.title?(y(),E(a(Oe),{key:0,"data-slot":`title`,class:c(O.value.title({class:a(v).ui?.title}))},{default:S(()=>[j(e.$slots,`title`,{},()=>[typeof a(v).title==`function`?(y(),E(k(a(v).title()),{key:0})):typeof a(v).title==`object`?(y(),E(k(a(v).title),{key:1})):(y(),u(b,{key:2},[n(C(a(v).title),1)],64))])]),_:3},8,[`class`])):M(``,!0),a(v).description||_.description?(y(),E(a(Ee),{key:1,"data-slot":`description`,class:c(O.value.description({class:a(v).ui?.description}))},{default:S(()=>[j(e.$slots,`description`,{},()=>[typeof a(v).description==`function`?(y(),E(k(a(v).description()),{key:0})):typeof a(v).description==`object`?(y(),E(k(a(v).description),{key:1})):(y(),u(b,{key:2},[n(C(a(v).description),1)],64))])]),_:3},8,[`class`])):M(``,!0),a(v).orientation===`vertical`&&(a(v).actions?.length||_.actions)?(y(),u(`div`,{key:2,"data-slot":`actions`,class:c(O.value.actions({class:a(v).ui?.actions}))},[j(e.$slots,`actions`,{},()=>[(y(!0),u(b,null,d(a(v).actions,({closeOnClick:e,...n},i)=>(y(),E(a(we),{key:i,"alt-text":n.label||`Action`,"close-on-click":e,"as-child":``,onClick:r[0]||=N(()=>{},[`stop`])},{default:S(()=>[t(X,m({size:`xs`,color:a(v).color},{ref_for:!0},n),null,16,[`color`])]),_:2},1032,[`alt-text`,`close-on-click`]))),128))])],2)):M(``,!0)],2),a(v).orientation===`horizontal`&&(a(v).actions?.length||_.actions)||a(v).close?(y(),u(`div`,{key:0,"data-slot":`actions`,class:c(O.value.actions({class:a(v).ui?.actions,orientation:`horizontal`}))},[a(v).orientation===`horizontal`&&(a(v).actions?.length||_.actions)?j(e.$slots,`actions`,{},()=>[(y(!0),u(b,null,d(a(v).actions,({closeOnClick:e,...n},i)=>(y(),E(a(we),{key:i,"alt-text":n.label||`Action`,"close-on-click":e,"as-child":``,onClick:r[1]||=N(()=>{},[`stop`])},{default:S(()=>[t(X,m({size:`xs`,color:a(v).color},{ref_for:!0},n),null,16,[`color`])]),_:2},1032,[`alt-text`,`close-on-click`]))),128))],void 0,0):M(``,!0),a(v).close||_.close?(y(),E(a(Te),{key:1,"as-child":``},{default:S(()=>[j(e.$slots,`close`,{ui:O.value},()=>[a(v).close?(y(),E(X,m({key:0,icon:a(v).closeIcon||a(w).ui.icons.close,color:`neutral`,variant:`link`,"aria-label":a(x)(`toast.close`)},typeof a(v).close==`object`?a(v).close:{},{"data-slot":`close`,class:O.value.close({class:a(v).ui?.close}),onClick:r[2]||=N(()=>{},[`stop`])}),null,16,[`icon`,`aria-label`,`class`])):M(``,!0)])]),_:3})):M(``,!0)],2)):M(``,!0),a(v).progress&&s&&i>0&&o?(y(),E(Ae,m({key:1,"model-value":i/o*100,color:a(v).color},typeof a(v).progress==`object`?a(v).progress:{},{size:`sm`,"data-slot":`progress`,class:O.value.progress({class:a(v).ui?.progress})}),null,16,[`model-value`,`color`,`class`])):M(``,!0)]),_:3},16,[`data-orientation`,`class`,`style`]))}};export{Me as default};
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>敏捷看板</title><script type="importmap">{"imports":{"#entry":"/_nuxt/CeiBZIn1.js"}}</script><link rel="stylesheet" href="/_nuxt/entry.nk2xQ-sa.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CeiBZIn1.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DK3Fl9T5.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/u88eXCXy.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DZo3dYLJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/51OWHj8c.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CsyY7ot8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Baq-Hrpf.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DSaWoFHS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/oXSDGTSr.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuBpFHLu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DsF2J4jZ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BJW3UkS7.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/HrhQecsY.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DLkAKotw.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Vo4wMbnS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CuJUHLl8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CK9_veoz.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bb3Limos.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B43-KCi6.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuOKDFiJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D3YCAmfu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B_SlFcWp.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/C9StZL3D.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BPTrRhcw.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CjRYYbsC.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/ChJuu-Ky.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D8Bpf7sE.js"><script type="module" src="/_nuxt/CeiBZIn1.js" crossorigin></script><link rel="prefetch" as="script" crossorigin href="/_nuxt/C-GYjxwr.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/DHihWhf5.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-404.BFmXOnCT.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/CoPhTDCT.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.BZ-DdjQ6.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/3G_ZLrk2.js"></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/",buildId:"ecbff4a6-6538-49b0-9844-64f03ebd103a",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1792999430299,false]</script></body></html>
1
+ <!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>敏捷看板</title><script type="importmap">{"imports":{"#entry":"/_nuxt/Co0ISufR.js"}}</script><link rel="stylesheet" href="/_nuxt/entry.CTKz4ouw.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Co0ISufR.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DK3Fl9T5.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/u88eXCXy.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DZo3dYLJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/51OWHj8c.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CsyY7ot8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Baq-Hrpf.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DSaWoFHS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/oXSDGTSr.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuBpFHLu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DsF2J4jZ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BJW3UkS7.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/HrhQecsY.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DLkAKotw.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Vo4wMbnS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CuJUHLl8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CK9_veoz.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bb3Limos.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DDA06Sqv.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B43-KCi6.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuOKDFiJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D3YCAmfu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B_SlFcWp.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bi9Axj3V.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CjRYYbsC.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D8Bpf7sE.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DNMF9lr0.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/ChJuu-Ky.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/C9StZL3D.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BPTrRhcw.js"><script type="module" src="/_nuxt/Co0ISufR.js" crossorigin></script><link rel="prefetch" as="script" crossorigin href="/_nuxt/z9IMa9Iy.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/DHihWhf5.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-404.BFmXOnCT.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/CoPhTDCT.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.BZ-DdjQ6.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/3G_ZLrk2.js"></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/",buildId:"a2ba436a-230e-43f9-884e-0a5d37f5ba22",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1793080428200,false]</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>敏捷看板</title><script type="importmap">{"imports":{"#entry":"/_nuxt/CeiBZIn1.js"}}</script><link rel="stylesheet" href="/_nuxt/entry.nk2xQ-sa.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CeiBZIn1.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DK3Fl9T5.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/u88eXCXy.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DZo3dYLJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/51OWHj8c.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CsyY7ot8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Baq-Hrpf.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DSaWoFHS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/oXSDGTSr.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuBpFHLu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DsF2J4jZ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BJW3UkS7.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/HrhQecsY.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DLkAKotw.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Vo4wMbnS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CuJUHLl8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CK9_veoz.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bb3Limos.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B43-KCi6.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuOKDFiJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D3YCAmfu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B_SlFcWp.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/C9StZL3D.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BPTrRhcw.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CjRYYbsC.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/ChJuu-Ky.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D8Bpf7sE.js"><script type="module" src="/_nuxt/CeiBZIn1.js" crossorigin></script><link rel="prefetch" as="script" crossorigin href="/_nuxt/C-GYjxwr.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/DHihWhf5.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-404.BFmXOnCT.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/CoPhTDCT.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.BZ-DdjQ6.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/3G_ZLrk2.js"></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/",buildId:"ecbff4a6-6538-49b0-9844-64f03ebd103a",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1792999430300,false]</script></body></html>
1
+ <!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>敏捷看板</title><script type="importmap">{"imports":{"#entry":"/_nuxt/Co0ISufR.js"}}</script><link rel="stylesheet" href="/_nuxt/entry.CTKz4ouw.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Co0ISufR.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DK3Fl9T5.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/u88eXCXy.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DZo3dYLJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/51OWHj8c.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CsyY7ot8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Baq-Hrpf.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DSaWoFHS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/oXSDGTSr.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuBpFHLu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DsF2J4jZ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BJW3UkS7.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/HrhQecsY.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DLkAKotw.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Vo4wMbnS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CuJUHLl8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CK9_veoz.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bb3Limos.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DDA06Sqv.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B43-KCi6.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuOKDFiJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D3YCAmfu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B_SlFcWp.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bi9Axj3V.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CjRYYbsC.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D8Bpf7sE.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DNMF9lr0.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/ChJuu-Ky.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/C9StZL3D.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BPTrRhcw.js"><script type="module" src="/_nuxt/Co0ISufR.js" crossorigin></script><link rel="prefetch" as="script" crossorigin href="/_nuxt/z9IMa9Iy.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/DHihWhf5.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-404.BFmXOnCT.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/CoPhTDCT.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.BZ-DdjQ6.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/3G_ZLrk2.js"></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/",buildId:"a2ba436a-230e-43f9-884e-0a5d37f5ba22",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1793080428201,false]</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>敏捷看板</title><script type="importmap">{"imports":{"#entry":"/_nuxt/CeiBZIn1.js"}}</script><link rel="stylesheet" href="/_nuxt/entry.nk2xQ-sa.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CeiBZIn1.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DK3Fl9T5.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/u88eXCXy.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DZo3dYLJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/51OWHj8c.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CsyY7ot8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Baq-Hrpf.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DSaWoFHS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/oXSDGTSr.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuBpFHLu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DsF2J4jZ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BJW3UkS7.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/HrhQecsY.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DLkAKotw.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Vo4wMbnS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CuJUHLl8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CK9_veoz.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bb3Limos.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B43-KCi6.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuOKDFiJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D3YCAmfu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B_SlFcWp.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/C9StZL3D.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BPTrRhcw.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CjRYYbsC.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/ChJuu-Ky.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D8Bpf7sE.js"><script type="module" src="/_nuxt/CeiBZIn1.js" crossorigin></script><link rel="prefetch" as="script" crossorigin href="/_nuxt/C-GYjxwr.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/DHihWhf5.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-404.BFmXOnCT.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/CoPhTDCT.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.BZ-DdjQ6.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/3G_ZLrk2.js"></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/",buildId:"ecbff4a6-6538-49b0-9844-64f03ebd103a",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1792999430300,false]</script></body></html>
1
+ <!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>敏捷看板</title><script type="importmap">{"imports":{"#entry":"/_nuxt/Co0ISufR.js"}}</script><link rel="stylesheet" href="/_nuxt/entry.CTKz4ouw.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Co0ISufR.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DK3Fl9T5.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/u88eXCXy.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DZo3dYLJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/51OWHj8c.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CsyY7ot8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Baq-Hrpf.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DSaWoFHS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/oXSDGTSr.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuBpFHLu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DsF2J4jZ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BJW3UkS7.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/HrhQecsY.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DLkAKotw.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Vo4wMbnS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CuJUHLl8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CK9_veoz.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bb3Limos.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DDA06Sqv.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B43-KCi6.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuOKDFiJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D3YCAmfu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B_SlFcWp.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bi9Axj3V.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CjRYYbsC.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D8Bpf7sE.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DNMF9lr0.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/ChJuu-Ky.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/C9StZL3D.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BPTrRhcw.js"><script type="module" src="/_nuxt/Co0ISufR.js" crossorigin></script><link rel="prefetch" as="script" crossorigin href="/_nuxt/z9IMa9Iy.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/DHihWhf5.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-404.BFmXOnCT.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/CoPhTDCT.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.BZ-DdjQ6.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/3G_ZLrk2.js"></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/",buildId:"a2ba436a-230e-43f9-884e-0a5d37f5ba22",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1793080428201,false]</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>敏捷看板</title><script type="importmap">{"imports":{"#entry":"/_nuxt/CeiBZIn1.js"}}</script><link rel="stylesheet" href="/_nuxt/entry.nk2xQ-sa.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CeiBZIn1.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DK3Fl9T5.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/u88eXCXy.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DZo3dYLJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/51OWHj8c.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CsyY7ot8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Baq-Hrpf.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DSaWoFHS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/oXSDGTSr.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuBpFHLu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DsF2J4jZ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BJW3UkS7.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/HrhQecsY.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DLkAKotw.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Vo4wMbnS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CuJUHLl8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CK9_veoz.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bb3Limos.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B43-KCi6.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuOKDFiJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D3YCAmfu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B_SlFcWp.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/C9StZL3D.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BPTrRhcw.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CjRYYbsC.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/ChJuu-Ky.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D8Bpf7sE.js"><script type="module" src="/_nuxt/CeiBZIn1.js" crossorigin></script><link rel="prefetch" as="script" crossorigin href="/_nuxt/C-GYjxwr.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/DHihWhf5.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-404.BFmXOnCT.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/CoPhTDCT.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.BZ-DdjQ6.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/3G_ZLrk2.js"></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/",buildId:"ecbff4a6-6538-49b0-9844-64f03ebd103a",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1792999430301,false]</script></body></html>
1
+ <!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>敏捷看板</title><script type="importmap">{"imports":{"#entry":"/_nuxt/Co0ISufR.js"}}</script><link rel="stylesheet" href="/_nuxt/entry.CTKz4ouw.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Co0ISufR.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DK3Fl9T5.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/u88eXCXy.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DZo3dYLJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/51OWHj8c.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CsyY7ot8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Baq-Hrpf.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DSaWoFHS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/oXSDGTSr.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuBpFHLu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DsF2J4jZ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BJW3UkS7.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/HrhQecsY.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DLkAKotw.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Vo4wMbnS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CuJUHLl8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CK9_veoz.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bb3Limos.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DDA06Sqv.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B43-KCi6.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuOKDFiJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D3YCAmfu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B_SlFcWp.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bi9Axj3V.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CjRYYbsC.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D8Bpf7sE.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DNMF9lr0.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/ChJuu-Ky.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/C9StZL3D.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BPTrRhcw.js"><script type="module" src="/_nuxt/Co0ISufR.js" crossorigin></script><link rel="prefetch" as="script" crossorigin href="/_nuxt/z9IMa9Iy.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/DHihWhf5.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-404.BFmXOnCT.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/CoPhTDCT.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.BZ-DdjQ6.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/3G_ZLrk2.js"></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/",buildId:"a2ba436a-230e-43f9-884e-0a5d37f5ba22",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1793080428202,false]</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>敏捷看板</title><script type="importmap">{"imports":{"#entry":"/_nuxt/CeiBZIn1.js"}}</script><link rel="stylesheet" href="/_nuxt/entry.nk2xQ-sa.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CeiBZIn1.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DK3Fl9T5.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/u88eXCXy.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DZo3dYLJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/51OWHj8c.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CsyY7ot8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Baq-Hrpf.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DSaWoFHS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/oXSDGTSr.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuBpFHLu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DsF2J4jZ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BJW3UkS7.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/HrhQecsY.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DLkAKotw.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Vo4wMbnS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CuJUHLl8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CK9_veoz.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bb3Limos.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B43-KCi6.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuOKDFiJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D3YCAmfu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B_SlFcWp.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/C9StZL3D.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BPTrRhcw.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CjRYYbsC.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/ChJuu-Ky.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D8Bpf7sE.js"><script type="module" src="/_nuxt/CeiBZIn1.js" crossorigin></script><link rel="prefetch" as="script" crossorigin href="/_nuxt/C-GYjxwr.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/DHihWhf5.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-404.BFmXOnCT.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/CoPhTDCT.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.BZ-DdjQ6.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/3G_ZLrk2.js"></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/",buildId:"ecbff4a6-6538-49b0-9844-64f03ebd103a",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1792999430300,false]</script></body></html>
1
+ <!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>敏捷看板</title><script type="importmap">{"imports":{"#entry":"/_nuxt/Co0ISufR.js"}}</script><link rel="stylesheet" href="/_nuxt/entry.CTKz4ouw.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Co0ISufR.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DK3Fl9T5.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/u88eXCXy.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DZo3dYLJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/51OWHj8c.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CsyY7ot8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Baq-Hrpf.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DSaWoFHS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/oXSDGTSr.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuBpFHLu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DsF2J4jZ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BJW3UkS7.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/HrhQecsY.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DLkAKotw.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Vo4wMbnS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CuJUHLl8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CK9_veoz.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bb3Limos.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DDA06Sqv.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B43-KCi6.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuOKDFiJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D3YCAmfu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B_SlFcWp.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bi9Axj3V.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CjRYYbsC.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D8Bpf7sE.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DNMF9lr0.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/ChJuu-Ky.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/C9StZL3D.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BPTrRhcw.js"><script type="module" src="/_nuxt/Co0ISufR.js" crossorigin></script><link rel="prefetch" as="script" crossorigin href="/_nuxt/z9IMa9Iy.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/DHihWhf5.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-404.BFmXOnCT.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/CoPhTDCT.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.BZ-DdjQ6.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/3G_ZLrk2.js"></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/",buildId:"a2ba436a-230e-43f9-884e-0a5d37f5ba22",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1793080428201,false]</script></body></html>
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env node
2
2
  /**
3
3
  * scrum-skills CLI(零依赖,node >= 18)
4
4
  * 命令:
package/package.json CHANGED
@@ -1,40 +1,41 @@
1
- {
2
- "name": "scrum-skills",
3
- "version": "0.2.4",
4
- "description": "结构化敏捷开发管理 skills + CLI:AI 对话产出结构化敏捷数据,TDD 驱动实施,Nuxt 看板可视化",
5
- "type": "module",
6
- "keywords": [
7
- "agile",
8
- "scrum",
9
- "sprint",
10
- "tdd",
11
- "kanban",
12
- "gantt",
13
- "burndown",
14
- "skills",
15
- "cli"
16
- ],
17
- "bin": {
18
- "scrum-skills": "./bin/scrum-skills.mjs",
19
- "scsk": "./bin/scrum-skills.mjs"
20
- },
21
- "files": [
22
- "bin/",
23
- "tools/",
24
- "templates/",
25
- ".agents/",
26
- "assets/",
27
- "docs/"
28
- ],
29
- "engines": {
30
- "node": ">=18"
31
- },
32
- "license": "MIT",
33
- "scripts": {
34
- "validate": "node tools/validate.mjs",
35
- "serve": "node tools/serve.mjs",
36
- "test": "node --test",
37
- "dev": "pnpm --dir apps/board run dev",
38
- "build": "node scripts/build-board.mjs"
39
- }
40
- }
1
+ {
2
+ "name": "scrum-skills",
3
+ "version": "0.2.5",
4
+ "description": "结构化敏捷开发管理 skills + CLI:AI 对话产出结构化敏捷数据,TDD 驱动实施,Nuxt 看板可视化",
5
+ "type": "module",
6
+ "keywords": [
7
+ "agile",
8
+ "scrum",
9
+ "sprint",
10
+ "tdd",
11
+ "kanban",
12
+ "gantt",
13
+ "burndown",
14
+ "skills",
15
+ "cli"
16
+ ],
17
+ "bin": {
18
+ "scrum-skills": "./bin/scrum-skills.mjs",
19
+ "scsk": "./bin/scrum-skills.mjs"
20
+ },
21
+ "scripts": {
22
+ "validate": "node tools/validate.mjs",
23
+ "serve": "node tools/serve.mjs",
24
+ "test": "node --test",
25
+ "dev": "pnpm --dir apps/board run dev",
26
+ "build": "node scripts/build-board.mjs",
27
+ "prepublishOnly": "node scripts/build-board.mjs"
28
+ },
29
+ "files": [
30
+ "bin/",
31
+ "tools/",
32
+ "templates/",
33
+ ".agents/",
34
+ "assets/",
35
+ "docs/"
36
+ ],
37
+ "engines": {
38
+ "node": ">=18"
39
+ },
40
+ "license": "MIT"
41
+ }
@@ -5,6 +5,7 @@ import { execFile, execFileSync } from 'node:child_process';
5
5
  import { promisify } from 'node:util';
6
6
  import { randomBytes } from 'node:crypto';
7
7
  import { fileURLToPath } from 'node:url';
8
+ import { createAgileTools } from './agile-tools.mjs';
8
9
 
9
10
  const exec = promisify(execFile);
10
11
  const validator = fileURLToPath(new URL('./validate.mjs', import.meta.url));
@@ -58,6 +59,24 @@ try {
58
59
  }
59
60
  }
60
61
 
62
+ /**
63
+ * 故事状态单向车道。看板卡片的「下一步 / 退回」就按这条线走,
64
+ * done 是终点、cancelled 是另一条终点,两者都不许再动。
65
+ */
66
+ export const STORY_FLOW = ['draft', 'ready', 'in-progress', 'review', 'done'];
67
+
68
+ const ACTION_LABEL = { next: '推进到下一状态', prev: '退回上一状态', cancel: '标记为已取消' };
69
+
70
+ /** 按动作算出目标状态;算不出来(已是终点 / 动作不认识)返回 null */
71
+ export function statusAfter(from, action) {
72
+ if (action === 'cancel') return ['draft', 'ready', 'in-progress', 'review'].includes(from) ? 'cancelled' : null;
73
+ if (!STORY_FLOW.includes(from)) return null;
74
+ const i = STORY_FLOW.indexOf(from);
75
+ if (action === 'next') return STORY_FLOW[i + 1] ?? null;
76
+ if (action === 'prev') return STORY_FLOW[i - 1] ?? null;
77
+ return null;
78
+ }
79
+
61
80
  function snapshot(root) {
62
81
  const read = file => JSON.parse(readFileSync(join(root, 'agile', file + '.json'), 'utf8'));
63
82
  return { backlog: read('backlog'), sprints: read('sprints'), journal: read('journal'), meta: { root, servedAt: new Date().toISOString() } };
@@ -78,18 +97,12 @@ export function createProjects({ root, store = defaultStore, pick = pickDirector
78
97
  const saved = JSON.parse(readFileSync(store, 'utf8'));
79
98
  if (Array.isArray(saved.recent)) recent = saved.recent.filter(x => typeof x === 'string').slice(0, 10);
80
99
  } catch {}
100
+ // 启动目录优先:从哪个目录起服务,看板就打开哪个目录。
101
+ // 最近列表只是「切回上次那个项目」的入口,不许顶替启动目录——
102
+ // 否则在 A 项目里 serve,会悄悄打开上一次的 B 项目数据(JSON 看着像是 A 的,其实全错)。
81
103
  const initial = realpathSync(root);
82
104
  let current = initial;
83
- for (const candidate of [...recent, initial]) {
84
- try {
85
- const path = realpathSync(candidate);
86
- validate(path);
87
- snapshot(path);
88
- current = path;
89
- break;
90
- } catch {}
91
- }
92
- recent = [...new Set([current, ...recent, initial])].slice(0, 10);
105
+ recent = [...new Set([current, ...recent])].slice(0, 10);
93
106
  let selecting = false;
94
107
  const list = () => ({ recent: [...recent], root: current, token });
95
108
  const read = (path = current) => {
@@ -115,7 +128,25 @@ export function createProjects({ root, store = defaultStore, pick = pickDirector
115
128
  return selected ? await open(selected) : null;
116
129
  } finally { selecting = false; }
117
130
  };
118
- return { list, read, open, select };
131
+ // 写盘复用 AI 助手那套「文本补丁 + 写后校验 + 失败回滚」,
132
+ // 不另写一份:改一个状态只差一行字符,校验不过自动还原。
133
+ const tools = createAgileTools({ root: () => current });
134
+ const setStoryStatus = ({ id, action } = {}) => {
135
+ if (!id) throw new Error('缺少故事 id');
136
+ const { backlog } = snapshot(current);
137
+ const story = (backlog.stories ?? []).find(s => s.id === id);
138
+ if (!story) throw new Error(`找不到故事 ${id}`);
139
+ const from = story.status;
140
+ const to = statusAfter(from, action);
141
+ if (!to) throw new Error(`${id} 当前是 ${from},没法${ACTION_LABEL[action] ?? `执行 ${action}`}`);
142
+ const patches = [{ path: `stories.${id}.status`, value: to }];
143
+ // 取消一条还被阻塞的故事:阻塞标记要一起摘掉。
144
+ // 校验器不许「已取消却还标着 blocked」,不摘会整条改动作废。
145
+ if (to === 'cancelled' && story.blocked) patches.push({ op: 'remove', path: `stories.${id}.blocked` });
146
+ tools.patch({ file: 'backlog', patches, reason: `看板卡片操作:${from} → ${to}` });
147
+ return { id, from, to };
148
+ };
149
+ return { list, read, open, select, setStoryStatus };
119
150
  }
120
151
 
121
152
  export async function handleProjectApi(projects, { method, path, headers, body }) {
@@ -130,6 +161,10 @@ export async function handleProjectApi(projects, { method, path, headers, body }
130
161
  if (method === 'GET' && url.pathname === '/api/agile') return { status: 200, body: projects.read(url.searchParams.get('root') || undefined) };
131
162
  if (method !== 'POST') return { status: 405, body: { error: '不支持的请求方法。' } };
132
163
  if (headers['x-project-token'] !== projects.list().token) return denied();
164
+ // 看板卡片的退回 / 下一步 / 取消:改的是当前打开项目的 backlog.json
165
+ if (url.pathname === '/api/agile/story-status') {
166
+ return { status: 200, body: projects.setStoryStatus({ id: body?.id, action: body?.action }) };
167
+ }
133
168
  if (url.pathname === '/api/projects/select') return { status: 200, body: await projects.select() };
134
169
  if (url.pathname === '/api/projects/open') {
135
170
  if (!projects.list().recent.includes(body?.root)) throw new Error('该项目不在最近列表中,请选择文件夹。');
package/tools/serve.mjs CHANGED
@@ -112,7 +112,7 @@ const server = createServer(async (req, res) => {
112
112
  return;
113
113
  }
114
114
 
115
- if (pathname === '/api/agile' || pathname.startsWith('/api/projects')) {
115
+ if (pathname.startsWith('/api/agile') || pathname.startsWith('/api/projects')) {
116
116
  try {
117
117
  let text = '';
118
118
  for await (const chunk of req) {
@@ -1 +0,0 @@
1
- import{D as e,E as t,On as n,Zn as r,_ as i,b as a,bt as o,er as s,g as c,k as l,mt as u,o as d,qt as ee,tr as f,un as p,v as te,vn as m,y as h}from"./DZo3dYLJ.js";import{t as ne}from"./BJW3UkS7.js";import{t as re}from"./fFGyRlCx.js";import{t as ie}from"./CjRYYbsC.js";import{a as g,i as _,r as ae}from"#entry";var oe={class:`stats`},se={class:`stat stat-mint`},ce={class:`stat-top`},le={class:`stat-label`},ue={class:`stat-pill`},de={class:`stat-value`},fe={class:`stat-sub`},pe={class:`stat-delta`},me={class:`split`},he={class:`spark`},ge=[`title`],_e={class:`stat`},ve={class:`stat-top`},ye={class:`stat-label`},v={class:`stat-pill`},y={class:`stat-value`},b={class:`stat-sub`},x={class:`stat-rows`},S={class:`stat-row`},C={class:`v`},w={class:`stat-row`},T={class:`v`},E={class:`stat-row`},D={class:`v`},O={class:`stat-row`},k={class:`v`},A={class:`stat-foot`},j={class:`row`},M={class:`bar`},N={class:`stat stat-lilac`},P={class:`stat-top`},be={class:`stat-label`},xe={class:`stat-value`},Se={class:`unit`},Ce={class:`stat-sub`},we={class:`stat-rows`},Te={class:`stat-row`},Ee={class:`v`},De={class:`stat-row`},Oe={class:`v`},ke={class:`stat-row`},Ae={class:`v`},je={class:`stat-row`},Me={class:`v`},Ne={class:`stat-foot`},Pe={class:`row`},Fe={class:`bar lilac`},Ie={class:`stat stat-ink`},Le={class:`stat-top`},Re={class:`stat-label`},ze={class:`stat-value`},Be={class:`stat-rows`},Ve={class:`stat-row`},He={class:`v`},Ue={class:`stat-row`},We={class:`v`},Ge={class:`stat-row`},Ke={class:`v`},qe={class:`stat-row`},Je={class:`v`},Ye={class:`stat-foot`},Xe={class:`row`},F={class:`bar on-dark`},Ze={class:`card tb`},Qe={class:`tb-l`},$e={class:`tb-r`},et={class:`mono`},tt={class:`mono`},nt={class:`card board`},rt={class:`lanes`},it={class:`lane-hd`},at={class:`lane-ct`},ot={class:`lane-pts`},st={class:`lane-bd`},ct={class:`sc-top`},lt={class:`sc-id mono`},ut={class:`dim sc-wsjf`},dt=[`title`],ft={class:`sc-title`},pt={class:`sc-meta`},mt={class:`sc-tags`},ht={class:`tag tag-ghost`},gt={key:0,class:`tag tag-neutral mono`},_t=[`title`],vt=[`title`],yt={class:`bar slim sc-bar`},bt={key:0,class:`lane-empty`},I=_(l({__name:`index`,setup(l){let{stories:_,epics:I,states:L,progress:R,milestoneOfStory:z,pointsOf:B,milestones:xt,STATE_LABEL:V,STATE_SHORT:St,STATE_DOT:Ct,TYPE_LABEL:wt,TYPE_COLOR:Tt,TYPE_ICON:Et,PRIORITY_COLOR:Dt,SCOPE_LABEL:H,wsjf:U,blockedStories:W}=g(),G=m(`all`),K=m(`all`),q=m(`rank`),Ot=c(()=>[{label:`全部史诗`,value:`all`,icon:`i-lucide-layers`},...I.value.map(e=>({label:`${e.id} ${e.title}`,value:e.id,icon:`i-lucide-layer-group`}))]),kt=c(()=>[{label:`全部里程碑`,value:`all`,icon:`i-lucide-flag`},...xt.value.map(e=>({label:`${e.id} ${e.title}`,value:e.id,icon:e.kind===`mvp`?`i-lucide-star`:`i-lucide-map-pin`}))]),At=[{label:`默认顺序`,value:`rank`,icon:`i-lucide-list-ordered`},{label:`按优先级 P0 → P3`,value:`priority`,icon:`i-lucide-alert-circle`},{label:`按 WSJF 价值/点数`,value:`wsjf`,icon:`i-lucide-scale`},{label:`按点数`,value:`points`,icon:`i-lucide-signal`}],J={P0:0,P1:1,P2:2,P3:3},Y=c(()=>{let e=_.value.filter(e=>!(G.value!==`all`&&e.epicId!==G.value||K.value!==`all`&&!z(e.id).some(e=>e.id===K.value)));return q.value===`priority`?[...e].sort((e,t)=>(J[e.priority]??9)-(J[t.priority]??9)||U(t)-U(e)):q.value===`wsjf`?[...e].sort((e,t)=>U(t)-U(e)):q.value===`points`?[...e].sort((e,t)=>t.points-e.points):e}),X=e=>Y.value.filter(t=>t.status===e),jt=e=>B(X(e).map(e=>e.id)),Z=c(()=>{let e=Y.value,t=e.filter(e=>e.status===`done`),n=e.filter(e=>e.status===`in-progress`||e.status===`review`),r=e.filter(e=>e.status===`ready`||e.status===`draft`),i=e.filter(e=>e.status===`cancelled`),a=e.filter(e=>e.status!==`cancelled`),o=e.flatMap(e=>e.tasks??[]),s=e=>o.filter(t=>t.status===e).length;return{count:e.length,points:e.reduce((e,t)=>e+t.points,0),liveCount:a.length,livePoints:a.reduce((e,t)=>e+t.points,0),donePoints:t.reduce((e,t)=>e+t.points,0),done:t.length,running:n.length,idle:r.length,cancelled:i.length,cancelledPoints:i.reduce((e,t)=>e+t.points,0),tasks:o.length,tasksDone:s(`done`),taskRed:s(`red`),taskGreen:s(`green`),taskRefactor:s(`refactored`),taskTodo:s(`todo`),bugs:e.filter(e=>e.type===`bug`).length,debt:e.filter(e=>e.type===`debt`).length,scope:e.filter(e=>e.scopeChange).length}}),Q=c(()=>Z.value.livePoints?Math.round(Z.value.donePoints/Z.value.livePoints*100):0),Mt=c(()=>Z.value.liveCount?Math.round(Z.value.livePoints/Z.value.liveCount*10)/10:0),$=c(()=>Z.value.tasks?Math.round(Z.value.tasksDone/Z.value.tasks*100):0),Nt=c(()=>W.value.length+Z.value.bugs),Pt=c(()=>Math.max(1,...L.map(e=>X(e).length))),Ft=e=>8+Math.round(X(e).length/Pt.value*34),It=c(()=>{if(G.value===`all`)return`全部史诗`;let e=I.value.find(e=>e.id===G.value);return e?e.title.slice(0,6):`全部史诗`}),Lt=e=>z(e).filter(e=>e.kind===`mvp`);return(c,l)=>{let m=ae,g=ie,_=re,I=ne;return u(),a(`div`,null,[i(`div`,oe,[i(`article`,se,[e(m,{tone:`mint`}),i(`div`,ce,[i(`span`,le,[e(g,{name:`i-lucide-gauge`,class:`size-3.5`}),l[3]||=t(`看板完成度`,-1)]),i(`span`,ue,f(n(It)),1)]),i(`div`,de,[t(f(n(Q)),1),l[4]||=i(`span`,{class:`unit`},`%`,-1)]),i(`div`,fe,[i(`span`,pe,[e(g,{name:`i-lucide-check`,class:`size-3`}),t(f(n(Z).donePoints)+` 点`,1)]),t(` 已交付 · 共 `+f(n(Z).livePoints)+` 点 `,1)]),i(`div`,me,[i(`div`,null,[l[5]||=i(`span`,{class:`k`},`完成故事`,-1),i(`b`,null,[t(f(n(Z).done),1),i(`small`,null,`/`+f(n(Z).liveCount),1)])]),i(`div`,null,[l[7]||=i(`span`,{class:`k`},`剩余点`,-1),i(`b`,null,[t(f(n(Z).livePoints-n(Z).donePoints),1),l[6]||=i(`small`,null,`点`,-1)])])]),i(`div`,he,[(u(!0),a(d,null,o(n(L),e=>(u(),a(`div`,{key:e,class:`spark-col`,title:`${n(V)[e]}:${X(e).length} 个`},[i(`div`,{class:r([`spark-bar`,{done:e===`done`,cancel:e===`cancelled`}]),style:s({height:Ft(e)+`px`})},null,6),i(`span`,null,f(n(St)[e]),1)],8,ge))),128))])]),i(`article`,_e,[e(m,{tone:`green`}),i(`div`,ve,[i(`span`,ye,[e(g,{name:`i-lucide-book-open`,class:`size-3.5`}),l[8]||=t(`故事`,-1)]),i(`span`,v,f(Math.round(n(Mt)))+` 点/个`,1)]),i(`div`,y,[t(f(n(Z).count),1),l[9]||=i(`span`,{class:`unit`},`个`,-1)]),i(`div`,b,`共 `+f(n(Z).livePoints)+` 点 · 任务 `+f(n(Z).tasks)+` 个`,1),i(`div`,x,[i(`div`,S,[l[10]||=i(`span`,{class:`k`},[i(`i`,{class:`dot`,style:{background:`#6aa844`}}),t(`已完成`)],-1),i(`span`,C,f(n(Z).done),1)]),i(`div`,w,[l[11]||=i(`span`,{class:`k`},[i(`i`,{class:`dot`,style:{background:`#3f7fd4`}}),t(`进行中`)],-1),i(`span`,T,f(n(Z).running),1)]),i(`div`,E,[l[12]||=i(`span`,{class:`k`},[i(`i`,{class:`dot`,style:{background:`#b6bac1`}}),t(`未开始`)],-1),i(`span`,D,f(n(Z).idle),1)]),i(`div`,O,[l[13]||=i(`span`,{class:`k`},[i(`i`,{class:`dot`,style:{background:`#cf4759`}}),t(`已取消`)],-1),i(`span`,k,f(n(Z).cancelled)+f(n(Z).cancelledPoints?` · ${n(Z).cancelledPoints} 点`:``),1)])]),i(`div`,A,[i(`div`,j,[i(`span`,null,`任务完成 `+f(n(Z).tasksDone)+`/`+f(n(Z).tasks),1),i(`span`,null,f(n($))+`%`,1)]),i(`div`,M,[i(`i`,{style:s({width:n($)+`%`})},null,4)])])]),i(`article`,N,[e(m,{tone:`lilac`}),i(`div`,P,[i(`span`,be,[e(g,{name:`i-lucide-list-checks`,class:`size-3.5`}),l[14]||=t(`TDD 任务`,-1)]),l[15]||=i(`span`,{class:`stat-pill`},`红 → 绿 → 重构`,-1)]),i(`div`,xe,[t(f(n(Z).tasksDone),1),i(`span`,Se,`/ `+f(n(Z).tasks)+` 项`,1)]),i(`div`,Ce,`已完成任务占 `+f(n($))+`%`,1),i(`div`,we,[i(`div`,Te,[l[16]||=i(`span`,{class:`k`},[i(`i`,{class:`dot`,style:{background:`#cf4759`}}),t(`红(测试失败)`)],-1),i(`span`,Ee,f(n(Z).taskRed),1)]),i(`div`,De,[l[17]||=i(`span`,{class:`k`},[i(`i`,{class:`dot`,style:{background:`#6aa844`}}),t(`绿(测试通过)`)],-1),i(`span`,Oe,f(n(Z).taskGreen),1)]),i(`div`,ke,[l[18]||=i(`span`,{class:`k`},[i(`i`,{class:`dot`,style:{background:`#6d4ff0`}}),t(`已重构`)],-1),i(`span`,Ae,f(n(Z).taskRefactor),1)]),i(`div`,je,[l[19]||=i(`span`,{class:`k`},[i(`i`,{class:`dot`,style:{background:`#b6bac1`}}),t(`待办`)],-1),i(`span`,Me,f(n(Z).taskTodo),1)])]),i(`div`,Ne,[i(`div`,Pe,[i(`span`,null,`已完成 `+f(n(Z).tasksDone)+`/`+f(n(Z).tasks),1),i(`span`,null,f(n($))+`%`,1)]),i(`div`,Fe,[i(`i`,{style:s({width:n($)+`%`})},null,4)])])]),i(`article`,Ie,[e(m,{tone:`ink`}),i(`div`,Le,[i(`span`,Re,[e(g,{name:`i-lucide-shield-alert`,class:`size-3.5`}),l[20]||=t(`风险面`,-1)]),l[21]||=i(`span`,{class:`stat-pill`},`需处理`,-1)]),i(`div`,ze,[t(f(n(Nt)),1),l[22]||=i(`span`,{class:`unit`},`项`,-1)]),l[28]||=i(`div`,{class:`stat-sub`},`阻塞故事与缺陷合计`,-1),i(`div`,Be,[i(`div`,Ve,[l[23]||=i(`span`,{class:`k`},`阻塞故事`,-1),i(`span`,He,f(n(W).length),1)]),i(`div`,Ue,[l[24]||=i(`span`,{class:`k`},`缺陷`,-1),i(`span`,We,f(n(Z).bugs),1)]),i(`div`,Ge,[l[25]||=i(`span`,{class:`k`},`技术债`,-1),i(`span`,Ke,f(n(Z).debt),1)]),i(`div`,qe,[l[26]||=i(`span`,{class:`k`},`范围变更`,-1),i(`span`,Je,f(n(Z).scope),1)])]),i(`div`,Ye,[i(`div`,Xe,[l[27]||=i(`span`,null,`完成度`,-1),i(`span`,null,f(n(Q))+`%`,1)]),i(`div`,F,[i(`i`,{style:s({width:n(Q)+`%`})},null,4)])])])]),i(`div`,Ze,[i(`div`,Qe,[l[29]||=i(`span`,{class:`lbl`},`筛选`,-1),e(_,{modelValue:n(G),"onUpdate:modelValue":l[0]||=e=>p(G)?G.value=e:null,items:n(Ot),icon:`i-lucide-layers`,"aria-label":`按史诗筛选`},null,8,[`modelValue`,`items`]),e(_,{modelValue:n(K),"onUpdate:modelValue":l[1]||=e=>p(K)?K.value=e:null,items:n(kt),icon:`i-lucide-flag`,"aria-label":`按里程碑筛选`},null,8,[`modelValue`,`items`]),e(_,{modelValue:n(q),"onUpdate:modelValue":l[2]||=e=>p(q)?q.value=e:null,items:At,icon:`i-lucide-arrow-up-down`,"aria-label":`排序方式`},null,8,[`modelValue`])]),i(`div`,$e,[i(`span`,et,f(n(Y).length),1),l[30]||=t(` 个故事 `,-1),l[31]||=i(`i`,{class:`sep`},null,-1),i(`span`,tt,f(n(B)(n(Y).map(e=>e.id))),1),l[32]||=t(` 点 `,-1)])]),i(`div`,nt,[i(`div`,rt,[(u(!0),a(d,null,o(n(L),c=>(u(),a(`section`,{key:c,class:`lane`},[i(`header`,it,[i(`i`,{class:`lane-dot`,style:s({background:n(Ct)[c]})},null,4),i(`b`,null,f(n(V)[c]),1),i(`span`,at,f(X(c).length),1),i(`span`,ot,f(jt(c))+` 点`,1)]),i(`div`,st,[(u(!0),a(d,null,o(X(c),c=>(u(),te(I,{key:c.id,to:`/story/${c.id}`,class:`scard`},{default:ee(()=>[i(`div`,ct,[i(`span`,lt,f(c.id),1),i(`span`,{class:r([`tag`,`tag-${n(Dt)[c.priority]}`])},f(c.priority),3),i(`span`,ut,`WSJF `+f(n(U)(c)),1),c.blocked?(u(),a(`span`,{key:0,class:`tag tag-error tag-dot`,title:`阻塞中:${c.blocked.reason}(自 ${c.blocked.since})`},`阻塞`,8,dt)):h(``,!0)]),i(`p`,ft,f(c.title),1),i(`div`,pt,[i(`span`,null,f(c.points)+` 点`,1),l[33]||=i(`span`,{class:`dim`},`·`,-1),i(`span`,null,`任务 `+f(n(R)(c).done)+`/`+f(n(R)(c).total),1)]),i(`div`,mt,[i(`span`,{class:r([`tag`,`tag-${n(Tt)[c.type]}`])},[e(g,{name:n(Et)[c.type],class:`size-3`},null,8,[`name`]),t(f(n(wt)[c.type]),1)],2),i(`span`,ht,f(c.epicId),1),c.sprintId?(u(),a(`span`,gt,f(c.sprintId),1)):h(``,!0),(u(!0),a(d,null,o(Lt(c.id),e=>(u(),a(`span`,{key:e.id,class:`tag tag-mint`,title:`${e.id} ${e.title} · ${e.criteria}`},`MVP`,8,_t))),128)),c.scopeChange?(u(),a(`span`,{key:1,class:`tag tag-info`,title:`${n(H)[c.scopeChange.kind]}(${c.scopeChange.at}):${c.scopeChange.reason}`},f(n(H)[c.scopeChange.kind]),9,vt)):h(``,!0)]),i(`div`,yt,[i(`i`,{style:s({width:n(R)(c).pct+`%`})},null,4)])]),_:2},1032,[`to`]))),128)),X(c).length?h(``,!0):(u(),a(`p`,bt,`暂无故事`))])]))),128))])])])}}}),[[`__scopeId`,`data-v-994b0e20`]]);export{I as default};