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.
- package/README.md +2 -2
- package/assets/board/200.html +1 -1
- package/assets/board/404.html +1 -1
- package/assets/board/_nuxt/{BNKWWG8o.js → -8mcJ5uq.js} +1 -1
- package/assets/board/_nuxt/{Bu60uYgs.js → 9qnowzZi.js} +1 -1
- package/assets/board/_nuxt/Bi9Axj3V.js +1 -0
- package/assets/board/_nuxt/{CNbS93H9.js → BkjUg7GC.js} +1 -1
- package/assets/board/_nuxt/Bu400pfa.js +1 -0
- package/assets/board/_nuxt/{obNw9aRV.js → CBhhj6QT.js} +1 -1
- package/assets/board/_nuxt/{D1Yxjnz9.js → CdvimHoq.js} +1 -1
- package/assets/board/_nuxt/Co0ISufR.js +95 -0
- package/assets/board/_nuxt/DDA06Sqv.js +1 -0
- package/assets/board/_nuxt/DFuirznt.js +1 -0
- package/assets/board/_nuxt/{DrbU50Zd.js → DG3IySrP.js} +1 -1
- package/assets/board/_nuxt/DNMF9lr0.js +1 -0
- package/assets/board/_nuxt/Dzd1U0TD.js +1 -0
- package/assets/board/_nuxt/Y5b2rXjB.js +1 -0
- package/assets/board/_nuxt/builds/latest.json +1 -1
- package/assets/board/_nuxt/builds/meta/a2ba436a-230e-43f9-884e-0a5d37f5ba22.json +1 -0
- package/assets/board/_nuxt/{Bh7eUS6e.js → d-5IhxZm.js} +1 -1
- package/assets/board/_nuxt/entry.CTKz4ouw.css +2 -0
- package/assets/board/_nuxt/gRdnZpJw.js +1 -0
- package/assets/board/_nuxt/{DJUwhJ8T.js → oIa7syc0.js} +1 -1
- package/assets/board/_nuxt/pages.YYGvroeE.css +1 -0
- package/assets/board/_nuxt/{0VBLkWnu.js → qDn8FnYE.js} +1 -1
- package/assets/board/_nuxt/z9IMa9Iy.js +13 -0
- package/assets/board/burndown/index.html +1 -1
- package/assets/board/epics/index.html +1 -1
- package/assets/board/gantt/index.html +1 -1
- package/assets/board/index.html +1 -1
- package/assets/board/milestones/index.html +1 -1
- package/bin/scrum-skills.mjs +1 -1
- package/package.json +41 -40
- package/tools/projects.mjs +46 -11
- package/tools/serve.mjs +1 -1
- package/assets/board/_nuxt/BTxVIV74.js +0 -1
- package/assets/board/_nuxt/C-GYjxwr.js +0 -13
- package/assets/board/_nuxt/CDL4GvLz.js +0 -1
- package/assets/board/_nuxt/CeiBZIn1.js +0 -95
- package/assets/board/_nuxt/Cfk_R787.js +0 -1
- package/assets/board/_nuxt/RM4VQc4e.js +0 -1
- package/assets/board/_nuxt/builds/meta/ecbff4a6-6538-49b0-9844-64f03ebd103a.json +0 -1
- package/assets/board/_nuxt/entry.nk2xQ-sa.css +0 -2
- package/assets/board/_nuxt/fFGyRlCx.js +0 -1
- 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"./
|
|
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"./
|
|
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/
|
|
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/
|
|
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/
|
|
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>
|
package/assets/board/index.html
CHANGED
|
@@ -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/
|
|
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/
|
|
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>
|
package/bin/scrum-skills.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1,40 +1,41 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "scrum-skills",
|
|
3
|
-
"version": "0.2.
|
|
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
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"tools/",
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
"
|
|
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
|
+
}
|
package/tools/projects.mjs
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
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};
|