scrum-skills 0.2.3 → 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/.agents/skills/scrum-planning/references/schema.md +3 -2
- package/README.md +17 -8
- package/assets/board/200.html +1 -1
- package/assets/board/404.html +1 -1
- package/assets/board/_nuxt/{C9Eg7sGC.js → -8mcJ5uq.js} +1 -1
- package/assets/board/_nuxt/{DA0S9GHd.js → 9qnowzZi.js} +1 -1
- package/assets/board/_nuxt/{BQSM1Ln0.js → BPTrRhcw.js} +1 -1
- package/assets/board/_nuxt/{B7foC6AH.js → BSov4ehT.js} +1 -1
- package/assets/board/_nuxt/{D8NAsEfE.js → Bb3Limos.js} +1 -1
- package/assets/board/_nuxt/Bi9Axj3V.js +1 -0
- package/assets/board/_nuxt/{C9lP5soO.js → BkjUg7GC.js} +1 -1
- package/assets/board/_nuxt/Bu400pfa.js +1 -0
- package/assets/board/_nuxt/{DiYBussm.js → BuuAjxsV.js} +1 -1
- package/assets/board/_nuxt/{DEBhVwtl.js → C9StZL3D.js} +1 -1
- package/assets/board/_nuxt/{B5u1XkK4.js → CBhhj6QT.js} +1 -1
- package/assets/board/_nuxt/{ADHYAojV.js → CD0uJuyA.js} +1 -1
- package/assets/board/_nuxt/{C3ssq3NT.js → CHZ_IHOa.js} +1 -1
- package/assets/board/_nuxt/{DVC07Kf9.js → CUnX_QKi.js} +1 -1
- package/assets/board/_nuxt/{BJ0EVa07.js → CdvimHoq.js} +1 -1
- package/assets/board/_nuxt/{DhkiugsE.js → ChJuu-Ky.js} +1 -1
- package/assets/board/_nuxt/{DwNOEVN_.js → CjRYYbsC.js} +1 -1
- package/assets/board/_nuxt/Co0ISufR.js +95 -0
- package/assets/board/_nuxt/CuJUHLl8.js +1 -0
- package/assets/board/_nuxt/{BKgQBiDB.js → CvFE1CeN.js} +1 -1
- package/assets/board/_nuxt/{CAJYxF-h.js → CyAQx5wv.js} +1 -1
- package/assets/board/_nuxt/{CviJuCa4.js → D3YCAmfu.js} +1 -1
- package/assets/board/_nuxt/{joIhBaO-.js → D8Bpf7sE.js} +1 -1
- package/assets/board/_nuxt/DDA06Sqv.js +1 -0
- package/assets/board/_nuxt/DFuirznt.js +1 -0
- package/assets/board/_nuxt/{4FVXNzN-.js → DG3IySrP.js} +1 -1
- package/assets/board/_nuxt/{BXQZAVYz.js → DLkAKotw.js} +1 -1
- package/assets/board/_nuxt/DNMF9lr0.js +1 -0
- package/assets/board/_nuxt/{DQRn5Z3H.js → DaqxYsbV.js} +1 -1
- package/assets/board/_nuxt/{jCMbKsJ3.js → DhhR1iR4.js} +1 -1
- package/assets/board/_nuxt/{CL3OrPP7.js → DmKZi-Wo.js} +1 -1
- package/assets/board/_nuxt/{DcWIG384.js → DsNkyZPc.js} +1 -1
- package/assets/board/_nuxt/{BCXs9rBJ.js → DwcwzwSx.js} +1 -1
- package/assets/board/_nuxt/Dzd1U0TD.js +1 -0
- package/assets/board/_nuxt/{BuVRe79A.js → HrhQecsY.js} +1 -1
- package/assets/board/_nuxt/{Db4IStii.js → KhBLkIKl.js} +1 -1
- package/assets/board/_nuxt/{bXQUY80V.js → MTucdeiW.js} +1 -1
- package/assets/board/_nuxt/{CZPwmwA5.js → RJtjdZeG.js} +1 -1
- package/assets/board/_nuxt/Vo4wMbnS.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/{CPfeOlrH.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/{-_kK9OzO.js → l05SqxhY.js} +1 -1
- package/assets/board/_nuxt/milestones.z-UuT44X.css +1 -0
- package/assets/board/_nuxt/{GzmVZqnA.js → oIa7syc0.js} +1 -1
- package/assets/board/_nuxt/pages.YYGvroeE.css +1 -0
- package/assets/board/_nuxt/{BannxgAO.js → qDn8FnYE.js} +1 -1
- package/assets/board/_nuxt/uGmbQYdY.js +1 -0
- 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 +33 -10
- package/package.json +1 -1
- package/templates/AGENTS.md +1 -1
- package/tools/ai.mjs +24 -2
- package/tools/projects.mjs +46 -11
- package/tools/serve.mjs +1 -1
- package/tools/validate.mjs +21 -7
- package/assets/board/_nuxt/BpR5gMZX.js +0 -95
- package/assets/board/_nuxt/BvaAl29K.js +0 -13
- package/assets/board/_nuxt/CDL4GvLz.js +0 -1
- package/assets/board/_nuxt/CTOFhZkc.js +0 -1
- package/assets/board/_nuxt/CZc2Mypg.js +0 -1
- package/assets/board/_nuxt/Cw7Z2eHM.js +0 -1
- package/assets/board/_nuxt/DWxQkuvT.js +0 -1
- package/assets/board/_nuxt/Dpzighda.js +0 -1
- package/assets/board/_nuxt/DttMo5b5.js +0 -1
- package/assets/board/_nuxt/FCuSfyjP.js +0 -1
- package/assets/board/_nuxt/builds/meta/24603984-d514-4dff-badc-898a1fd5e770.json +0 -1
- package/assets/board/_nuxt/entry.ChOvfapw.css +0 -2
- package/assets/board/_nuxt/milestones.CVvAMKg4.css +0 -1
- package/assets/board/_nuxt/pages.DSSttn9g.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,E as t,On as n,T as r,Zn as i,_ as a,b as o,bt as s,er as c,g as l,k as u,mt as d,o as f,qt as p,tr as m,y as h}from"./DZo3dYLJ.js";import{t as ee}from"./BJW3UkS7.js";import{t as te}from"./
|
|
1
|
+
import{D as e,E as t,On as n,T as r,Zn as i,_ as a,b as o,bt as s,er as c,g as l,k as u,mt as d,o as f,qt as p,tr as m,y as h}from"./DZo3dYLJ.js";import{t as ee}from"./BJW3UkS7.js";import{t as te}from"./CjRYYbsC.js";import{a as g,i as _,r as ne}from"#entry";var re={class:`kpis`},ie={class:`kpi tint-lilac`},ae={class:`v`},oe={class:`kpi`},se={class:`v`},ce={class:`kpi`},le={class:`v`},ue={class:`kpi tint-mint`},de={class:`v`},fe={class:`kpi`},pe={class:`v mono`},me={class:`card gantt`},he={class:`ticks`},ge={class:`track`},_e={class:`label`},ve={class:`lane`},ye={class:`grid-lines`},v=[`title`],y={class:`track-hd`},b={class:`tag tag-neutral mono`},x={class:`dim`},S={class:`grow-row`},C={class:`label`},w={class:`tag tag-ghost`},T={class:`lane`},E={class:`grid-lines`},D={class:`label`},O=[`title`],k=[`title`],A={class:`pts mono dim`},j={class:`lane`},M={class:`grid-lines`},N={class:`track last`},P={class:`label`},be={class:`dim pts mono`},xe={class:`tag tag-neutral`},Se={class:`lane`},Ce={class:`grid-lines`},we={class:`extra`},Te={key:0,class:`card`},Ee={class:`card-hd`},De={class:`h2`},Oe={class:`tag tag-neutral`},ke={class:`card-bd`},F={class:`list`},Ae={class:`dep-txt`},je={class:`dep-txt dim`},Me={key:1,class:`card`},Ne={class:`card-hd`},Pe={class:`h2`},Fe={class:`tag tag-error`},Ie={class:`card-bd`},Le={class:`list`},Re={class:`dep-txt`},ze={class:`dim`},I=_(u({__name:`gantt`,setup(u){let{sprints:_,stories:I,milestones:L,storyById:R,actualRange:z,progress:B,addDays:Be,diffDays:V,md:H,now:U,MS_COLOR:Ve,MS_LABEL:He,KIND_LABEL:Ue,KIND_ICON:We,STATE_LABEL:Ge,STATE_DOT:W,dependencyPairs:G,blockedStories:K}=g(),Ke=l(()=>_.value.map(e=>({id:e.id,name:e.name,start:e.start,end:e.end,rows:(e.stories??[]).map(e=>R.value.get(e)).filter(Boolean).map(e=>({...e,actual:z(e),prog:B(e)}))}))),q=l(()=>I.value.filter(e=>e.schedule)),qe=l(()=>I.value.filter(e=>!e.schedule)),J=l(()=>[..._.value.map(e=>e.start),...q.value.map(e=>e.schedule.start),...L.value.map(e=>e.due)].sort()[0]??U),Je=l(()=>{let e=[..._.value.map(e=>e.end),...q.value.map(e=>e.schedule.end),...L.value.map(e=>e.due)].sort();return e[e.length-1]??U}),Y=l(()=>Math.max(1,V(J.value,Je.value)+1)),X=e=>V(J.value,e)/Y.value*100,Z=(e,t)=>({left:`${X(e)}%`,width:`${Math.max(1.1,(V(e,t)+1)/Y.value*100)}%`}),Q=l(()=>{let e=Y.value>90?14:Y.value>45?7:4,t=[];for(let n=0;n<=Y.value;n+=e)t.push({date:Be(J.value,n),x:n/Y.value*100});return t}),$=l(()=>X(U));return(l,u)=>{let g=ne,z=te,B=ee;return d(),o(`div`,null,[a(`div`,re,[a(`div`,ie,[e(g,{tone:`lilac`,size:`sm`}),u[1]||=a(`p`,{class:`k`},`迭代窗口`,-1),a(`p`,ae,[t(m(n(_).length),1),u[0]||=a(`small`,null,`个`,-1)])]),a(`div`,oe,[u[3]||=a(`p`,{class:`k`},`里程碑`,-1),a(`p`,se,[t(m(n(L).length),1),u[2]||=a(`small`,null,`个`,-1)])]),a(`div`,ce,[u[4]||=a(`p`,{class:`k`},`已排期故事`,-1),a(`p`,le,[t(m(n(q).length),1),a(`small`,null,`/ `+m(n(I).length),1)])]),a(`div`,ue,[e(g,{tone:`mint`,size:`sm`}),u[6]||=a(`p`,{class:`k`},`时间跨度`,-1),a(`p`,de,[t(m(n(Y)),1),u[5]||=a(`small`,null,`天`,-1)])]),a(`div`,fe,[u[7]||=a(`p`,{class:`k`},`今天`,-1),a(`p`,pe,m(n(U)),1)])]),a(`div`,me,[u[11]||=r(`<div class="gantt-hd" data-v-db59b624><h2 class="h2" data-v-db59b624>时间轴</h2><div class="legend" data-v-db59b624><span class="lg" data-v-db59b624><i class="sw plan" data-v-db59b624></i>计划</span><span class="lg" data-v-db59b624><i class="sw real" data-v-db59b624></i>实际</span><span class="lg" data-v-db59b624><i class="sw ms" data-v-db59b624></i>里程碑</span><span class="lg" data-v-db59b624><i class="sw mvp" data-v-db59b624></i>MVP 节点</span><span class="lg" data-v-db59b624><i class="sw today" data-v-db59b624></i>今天</span></div></div>`,1),a(`div`,he,[(d(!0),o(f,null,s(n(Q),e=>(d(),o(`div`,{key:e.date,class:`tick`,style:c({left:e.x+`%`})},[a(`span`,null,m(n(H)(e.date)),1)],4))),128)),a(`div`,{class:`today-line`,style:c({left:n($)+`%`})},null,4),a(`div`,{class:`today-flag`,style:c({left:n($)+`%`})},`今天 `+m(n(H)(n(U))),5)]),a(`section`,ge,[u[8]||=a(`header`,{class:`track-hd`},`里程碑`,-1),(d(!0),o(f,null,s(n(L),r=>(d(),o(`div`,{key:r.id,class:`grow-row`},[a(`div`,_e,[a(`span`,{class:i([`tag`,r.kind===`mvp`?`tag-mint`:`tag-primary`])},[e(z,{name:n(We)[r.kind],class:`size-3`},null,8,[`name`]),t(m(n(Ue)[r.kind]),1)],2),e(B,{to:`/milestones`,class:`lbl-txt`},{default:p(()=>[t(m(r.title),1)]),_:2},1024),a(`span`,{class:i([`tag`,`tag-${n(Ve)[r.status]}`])},m(n(He)[r.status]),3)]),a(`div`,ve,[a(`div`,ye,[(d(!0),o(f,null,s(n(Q),e=>(d(),o(`span`,{key:e.date,style:c({left:e.x+`%`})},null,4))),128))]),a(`span`,{class:i([`diamond`,{mvp:r.kind===`mvp`}]),style:c({left:X(r.due)+`%`}),title:`${r.id} · ${r.due} · ${r.criteria}`},null,14,v)])]))),128))]),(d(!0),o(f,null,s(n(Ke),r=>(d(),o(`section`,{key:r.id,class:`track`},[a(`header`,y,[a(`span`,b,m(r.id),1),t(` `+m(r.name)+` `,1),a(`span`,x,m(n(H)(r.start))+` ~ `+m(n(H)(r.end)),1)]),a(`div`,S,[a(`div`,C,[a(`span`,w,[e(z,{name:`i-lucide-calendar-range`,class:`size-3`}),u[9]||=t(`迭代窗口`,-1)])]),a(`div`,T,[a(`div`,E,[(d(!0),o(f,null,s(n(Q),e=>(d(),o(`span`,{key:e.date,style:c({left:e.x+`%`})},null,4))),128))]),a(`div`,{class:`band`,style:c(Z(r.start,r.end))},null,4)])]),(d(!0),o(f,null,s(r.rows,r=>(d(),o(`div`,{key:r.id,class:`grow-row`},[a(`div`,D,[a(`i`,{class:`sdot`,style:c({background:n(W)[r.status]})},null,4),e(B,{to:`/story/${r.id}`,class:`lbl-txt`},{default:p(()=>[t(m(r.title),1)]),_:2},1032,[`to`]),r.dependsOn?.length?(d(),o(`span`,{key:0,class:`tag tag-secondary`,title:`依赖:${r.dependsOn.join(`、`)}`},m(r.dependsOn.length),9,O)):h(``,!0),r.blocked?(d(),o(`span`,{key:1,class:`tag tag-error`,title:`阻塞:${r.blocked.reason}(自 ${r.blocked.since})`},`!`,8,k)):h(``,!0),a(`span`,A,m(r.points)+` 点 · `+m(r.prog.done)+`/`+m(r.prog.total),1)]),a(`div`,j,[a(`div`,M,[(d(!0),o(f,null,s(n(Q),e=>(d(),o(`span`,{key:e.date,style:c({left:e.x+`%`})},null,4))),128))]),r.schedule?(d(),o(`div`,{key:0,class:`plan`,style:c(Z(r.schedule.start,r.schedule.end))},null,4)):h(``,!0),r.actual?(d(),o(`div`,{key:1,class:`real`,style:c(Z(r.actual.start,r.actual.end))},null,4)):h(``,!0)])]))),128))]))),128)),a(`section`,N,[u[10]||=a(`header`,{class:`track-hd`},`未排期(backlog)`,-1),(d(!0),o(f,null,s(n(qe),r=>(d(),o(`div`,{key:r.id,class:`grow-row`},[a(`div`,P,[a(`i`,{class:`sdot`,style:c({background:n(W)[r.status]})},null,4),e(B,{to:`/story/${r.id}`,class:`lbl-txt`},{default:p(()=>[t(m(r.title),1)]),_:2},1032,[`to`]),a(`span`,be,m(r.points)+` 点`,1),a(`span`,xe,m(n(Ge)[r.status]),1)]),a(`div`,Se,[a(`div`,Ce,[(d(!0),o(f,null,s(n(Q),e=>(d(),o(`span`,{key:e.date,style:c({left:e.x+`%`})},null,4))),128))])])]))),128))])]),a(`div`,we,[n(G).length?(d(),o(`div`,Te,[a(`div`,Ee,[a(`h2`,De,[e(z,{name:`i-lucide-git-branch`,class:`size-3.5`}),u[12]||=t(`依赖链`,-1)]),a(`span`,Oe,m(n(G).length),1)]),a(`div`,ke,[a(`ul`,F,[(d(!0),o(f,null,s(n(G),r=>(d(),o(`li`,{key:`${r.from}-${r.to}`},[e(B,{to:`/story/${r.to}`,class:`mono link`},{default:p(()=>[t(m(r.to),1)]),_:2},1032,[`to`]),a(`span`,Ae,m(n(R).get(r.to)?.title),1),e(z,{name:`i-lucide-arrow-left`,class:`size-3 dim`}),u[13]||=a(`span`,{class:`dim`},`依赖`,-1),e(B,{to:`/story/${r.from}`,class:`mono link`},{default:p(()=>[t(m(r.from),1)]),_:2},1032,[`to`]),a(`span`,je,m(n(R).get(r.from)?.title),1)]))),128))])])])):h(``,!0),n(K).length?(d(),o(`div`,Me,[a(`div`,Ne,[a(`h2`,Pe,[e(z,{name:`i-lucide-octagon-alert`,class:`size-3.5`}),u[14]||=t(`阻塞中`,-1)]),a(`span`,Fe,m(n(K).length),1)]),a(`div`,Ie,[a(`ul`,Le,[(d(!0),o(f,null,s(n(K),n=>(d(),o(`li`,{key:n.id},[u[15]||=a(`span`,{class:`tag tag-error tag-dot`},`阻塞`,-1),e(B,{to:`/story/${n.id}`,class:`mono link`},{default:p(()=>[t(m(n.id),1)]),_:2},1032,[`to`]),a(`span`,Re,m(n.title),1),a(`span`,ze,`· `+m(n.blocked.reason)+`(自 `+m(n.blocked.since)+`)`,1)]))),128))])])])):h(``,!0)])])}}}),[[`__scopeId`,`data-v-db59b624`]]);export{I as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.tl-wrap[data-v-fb35a72e]{border-radius:var(--r-xl);overflow:hidden}.tl-hd[data-v-fb35a72e]{padding:12px 16px}.tip[data-v-fb35a72e]{font-size:11px}.legend[data-v-fb35a72e]{color:var(--ink-3);flex-wrap:wrap;gap:11px;margin-left:auto;font-size:10.5px;display:flex}.legend[data-v-fb35a72e],.lg[data-v-fb35a72e]{align-items:center}.lg[data-v-fb35a72e]{gap:4px;display:inline-flex}.sw[data-v-fb35a72e]{border:1px solid var(--line-2);border-radius:4px;width:11px;height:11px}.sw.mint[data-v-fb35a72e]{background:var(--grad-mint);border-color:var(--mint-line)}.sw.lilac[data-v-fb35a72e]{background:var(--grad-lilac);border-color:#dbcdfb}.sw.white[data-v-fb35a72e]{background:#fff}.dot[data-v-fb35a72e]{border-radius:999px;width:7px;height:7px}.dot.ok[data-v-fb35a72e]{background:#6aa844}.dot.risk[data-v-fb35a72e]{background:#e0a33a}.dot.plan[data-v-fb35a72e]{background:#fff;border:1.5px solid #c9c8c2}.sep[data-v-fb35a72e]{background:var(--line-2);width:1px;height:11px}.timeline[data-v-fb35a72e]{padding:14px 16px 18px}.tl-item[data-v-fb35a72e]{grid-template-columns:56px 26px minmax(0,1fr);align-items:start;display:grid}.when[data-v-fb35a72e]{text-align:right;padding:13px 10px 0 0}.when-date[data-v-fb35a72e]{letter-spacing:-.01em;color:var(--ink);font-size:12.2px;font-weight:660}.when-year[data-v-fb35a72e]{color:var(--ink-4);font-size:9.6px}.axis[data-v-fb35a72e]{justify-content:center;align-self:stretch;align-items:flex-start;padding-top:15px;display:flex;position:relative}.axis[data-v-fb35a72e]:before{content:"";background:#d8d5cb;width:2px;margin-left:-1px;position:absolute;top:21px;bottom:-12px;left:50%}.tl-item:last-child .axis[data-v-fb35a72e]:before{display:none}.dot-lg[data-v-fb35a72e]{z-index:1;color:#fff;background:#c9c8c2;border:2px solid #fff;border-radius:999px;place-items:center;width:13px;height:13px;display:grid;position:relative;box-shadow:0 0 0 1.5px #dedcd5}.dot-lg.ok[data-v-fb35a72e]{background:#6aa844;box-shadow:0 0 0 3px #6aa84429}.dot-lg.risk[data-v-fb35a72e]{background:#e0a33a;box-shadow:0 0 0 3px #e0a33a2e}.dot-lg.plan[data-v-fb35a72e]{background:#fff;box-shadow:0 0 0 1.5px #d6d4cd}.dot-lg.miss[data-v-fb35a72e]{background:var(--rose);box-shadow:0 0 0 3px #cf475929}.node[data-v-fb35a72e]{border-radius:var(--r-lg);border:1px solid var(--line);box-shadow:var(--shadow-1);background:#fff;margin-bottom:10px;padding:13px 15px 12px;transition:transform .16s,box-shadow .16s,border-color .16s}.node[data-v-fb35a72e]:hover{transform:translateY(-1px);box-shadow:0 14px 30px -20px #17181b59}.node-mint[data-v-fb35a72e]{border-color:var(--mint-line);background:radial-gradient(115% 150% at 0 0,#ffffffe6,#fff0 46%),radial-gradient(95% 130% at 104% 108%,#b8de76f2,#b8de7600 62%),linear-gradient(150deg,#edfcd7,#d7f3a8)}.node-lilac[data-v-fb35a72e]{background:radial-gradient(115% 150% at 0 0,#ffffffeb,#fff0 46%),radial-gradient(95% 130% at 104% 108%,#c6b2faf2,#c6b2fa00 62%),linear-gradient(150deg,#f5f0ff,#e0d3fc);border-color:#dbcdfb}.node-ink[data-v-fb35a72e]{background:radial-gradient(120% 160% at 100% 0,#f5f1ff,#f5f1ff00 52%),linear-gradient(150deg,#fff,#fbfaf6)}.node-top[data-v-fb35a72e]{flex-wrap:wrap;align-items:center;gap:5px;margin-bottom:7px;display:flex}.days[data-v-fb35a72e]{color:var(--ink-2);white-space:nowrap;background:#ffffffc7;border:1px solid #17181b12;border-radius:999px;margin-left:auto;padding:2px 8px;font-size:10.4px;font-weight:650}.days.soon[data-v-fb35a72e]{color:#8d6210;background:#fdf1d7;border-color:#f2dfae}.days.over[data-v-fb35a72e]{color:#a5382f;background:#fdeae7;border-color:#f6d2cb}.node-title[data-v-fb35a72e]{letter-spacing:-.015em;align-items:center;gap:6px;font-size:14.6px;font-weight:660;line-height:1.35;display:flex}.criteria[data-v-fb35a72e]{margin-top:5px;font-size:12px;line-height:1.55}.criteria[data-v-fb35a72e],.nums[data-v-fb35a72e]{color:var(--ink-2)}.nums[data-v-fb35a72e]{align-items:center;gap:5px;margin:10px 0 5px;font-size:11.4px;display:flex}.mpct[data-v-fb35a72e],.nums b[data-v-fb35a72e]{font-weight:660}.mpct[data-v-fb35a72e]{color:var(--ink);margin-left:auto}.bar.mint[data-v-fb35a72e]{background:#46521f24}.mss[data-v-fb35a72e]{border-top:1px dashed #17181b1f;gap:1px;margin:10px 0 0;padding:9px 0 0;list-style:none;display:grid}.srow[data-v-fb35a72e]{border-radius:8px;align-items:center;gap:6px;margin:0 -6px;padding:4px 6px;font-size:11.8px;transition:background .14s;display:flex}.srow[data-v-fb35a72e]:hover{background:#ffffffb8}.srow:hover .st-title[data-v-fb35a72e]{color:var(--violet-ink)}.sdot[data-v-fb35a72e]{border-radius:999px;flex:none;width:6px;height:6px}.st-id[data-v-fb35a72e]{color:var(--ink-4);font-size:10px}.st-title[data-v-fb35a72e]{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.st-pts[data-v-fb35a72e],.st-state[data-v-fb35a72e]{white-space:nowrap;font-size:10.2px}.node-lilac .dim[data-v-fb35a72e],.node-mint .dim[data-v-fb35a72e]{color:#2226128c}.tl-today[data-v-fb35a72e]{grid-template-columns:56px 26px minmax(0,1fr);align-items:center;padding:2px 0;display:grid}.today-when[data-v-fb35a72e]{text-align:right;letter-spacing:.04em;color:var(--rose);padding-right:10px;font-size:10.8px;font-weight:700}.today-axis[data-v-fb35a72e]{justify-content:center;align-self:stretch;display:flex;position:relative}.today-axis[data-v-fb35a72e]:before{content:"";background:#cf475947;width:2px;margin-left:-1px;position:absolute;top:0;bottom:0;left:50%}.today-axis i[data-v-fb35a72e]{z-index:1;background:var(--rose);border-radius:999px;align-self:center;width:9px;height:9px;position:relative;box-shadow:0 0 0 3px #cf475929}.today-line[data-v-fb35a72e]{border-top:1px dashed #cf475959;align-self:center;height:0}@media (width<=760px){.tl-item[data-v-fb35a72e],.tl-today[data-v-fb35a72e]{grid-template-columns:44px 22px minmax(0,1fr)}.when-date[data-v-fb35a72e]{font-size:11px}.legend[data-v-fb35a72e],.st-state[data-v-fb35a72e]{display:none}}
|
|
@@ -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"./
|
|
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 @@
|
|
|
1
|
+
import{D as e,E as t,On as n,T as r,Zn as i,_ as a,b as o,bt as s,er as c,g as l,k as u,mt as d,o as f,qt as ee,tr as p,v as te,y as m}from"./DZo3dYLJ.js";import{t as ne}from"./BJW3UkS7.js";import{t as re}from"./CjRYYbsC.js";import{a as h,i as g,r as _}from"#entry";var v={class:`kpis`},ie={class:`kpi tint-mint`},ae={class:`v`},oe={class:`kpi tint-lilac`},se={class:`v`},ce={class:`kpi`},y={class:`v`},b={class:`kpi`},x={class:`v`},S={class:`kpi`},C={class:`v`},w={class:`card tl-wrap`},T={class:`card-hd tl-hd`},E={class:`h2`},D={class:`timeline`},O={key:0,class:`tl-today`},k={class:`tl-item`},A={class:`when`},j={class:`when-date mono`},M={class:`when-year`},N={class:`axis`},P={class:`node-top`},F={class:`tag tag-ghost`},I={key:0,class:`tag tag-neutral mono`},L={class:`node-title`},R={class:`criteria`},z={class:`nums`},B={class:`dim`},V={class:`mpct`},le={class:`mss`},H={class:`st-id mono`},U={class:`st-title`},W={class:`st-state dim`},ue={class:`st-pts dim`},de={key:0,class:`tl-today`},G=g(u({__name:`milestones`,setup(u){let{milestones:g,milestoneProgress:G,now:K,md:fe,MS_LABEL:pe,MS_COLOR:me,KIND_LABEL:he,KIND_ICON:ge,STATE_DOT:_e,STATE_LABEL:ve,diffDays:q}=h(),J=l(()=>[...g.value].sort((e,t)=>e.due<t.due?-1:+(e.due>t.due))),Y=e=>q(K,e),X=e=>{let t=G(e);return t.total?Math.round(t.done/t.total*100):0},Z=e=>e===`mvp`?`mint`:e===`release`?`lilac`:`ink`,ye=e=>({reached:`ok`,"at-risk":`risk`,planned:`plan`,missed:`miss`})[e]??`plan`,be=[`日`,`一`,`二`,`三`,`四`,`五`,`六`],xe=e=>`周${be[new Date(`${e}T00:00:00Z`).getUTCDay()]}`,Se=e=>{let t=Y(e);return t>0?`还剩 ${t} 天`:t===0?`今天到期`:`已过 ${-t} 天`},Q=l(()=>{let e=J.value.findIndex(e=>e.due>=K);return e<0?J.value.length:e}),$=l(()=>({mvp:g.value.filter(e=>e.kind===`mvp`).length,release:g.value.filter(e=>e.kind===`release`).length,checkpoint:g.value.filter(e=>e.kind===`checkpoint`).length,risk:g.value.filter(e=>e.status===`at-risk`||e.status===`missed`).length,reached:g.value.filter(e=>e.status===`reached`).length}));return(l,u)=>{let h=_,K=re,q=ne;return d(),o(`div`,null,[a(`div`,v,[a(`div`,ie,[e(h,{tone:`mint`,size:`sm`}),u[1]||=a(`p`,{class:`k`},`MVP 节点`,-1),a(`p`,ae,[t(p(n($).mvp),1),u[0]||=a(`small`,null,`个`,-1)])]),a(`div`,oe,[e(h,{tone:`lilac`,size:`sm`}),u[3]||=a(`p`,{class:`k`},`发布节点`,-1),a(`p`,se,[t(p(n($).release),1),u[2]||=a(`small`,null,`个`,-1)])]),a(`div`,ce,[u[5]||=a(`p`,{class:`k`},`检查点`,-1),a(`p`,y,[t(p(n($).checkpoint),1),u[4]||=a(`small`,null,`个`,-1)])]),a(`div`,b,[u[6]||=a(`p`,{class:`k`},`已达成`,-1),a(`p`,x,[t(p(n($).reached),1),a(`small`,null,`/ `+p(n(g).length),1)])]),a(`div`,S,[u[8]||=a(`p`,{class:`k`},`有风险 / 错过`,-1),a(`p`,C,[t(p(n($).risk),1),u[7]||=a(`small`,null,`个`,-1)])])]),a(`div`,w,[a(`div`,T,[a(`h2`,E,[e(K,{name:`i-lucide-git-commit-vertical`,class:`size-3.5`}),u[9]||=t(`时间线`,-1)]),u[10]||=r(`<span class="dim tip" data-v-fb35a72e>按到期日从早到晚 · 节点达成口径是「挂的故事全部完成」</span><div class="legend" data-v-fb35a72e><span class="lg" data-v-fb35a72e><i class="sw mint" data-v-fb35a72e></i>MVP</span><span class="lg" data-v-fb35a72e><i class="sw lilac" data-v-fb35a72e></i>发布</span><span class="lg" data-v-fb35a72e><i class="sw white" data-v-fb35a72e></i>检查点</span><i class="sep" data-v-fb35a72e></i><span class="lg" data-v-fb35a72e><i class="dot ok" data-v-fb35a72e></i>已达成</span><span class="lg" data-v-fb35a72e><i class="dot risk" data-v-fb35a72e></i>有风险</span><span class="lg" data-v-fb35a72e><i class="dot plan" data-v-fb35a72e></i>计划中</span></div>`,2)]),a(`div`,D,[(d(!0),o(f,null,s(n(J),(r,l)=>(d(),o(f,{key:r.id},[l===n(Q)?(d(),o(`div`,O,[...u[11]||=[a(`span`,{class:`today-when`},`今天`,-1),a(`span`,{class:`today-axis`},[a(`i`)],-1),a(`span`,{class:`today-line`},null,-1)]])):m(``,!0),a(`article`,k,[a(`div`,A,[a(`p`,j,p(n(fe)(r.due)),1),a(`p`,M,p(xe(r.due)),1)]),a(`div`,N,[a(`span`,{class:i([`dot-lg`,ye(r.status)])},[r.status===`reached`?(d(),te(K,{key:0,name:`i-lucide-check`,class:`size-2.5`})):m(``,!0)],2)]),a(`div`,{class:i([`node`,`node-${Z(r.kind)}`])},[e(h,{tone:Z(r.kind),size:`xl`,min:3,max:5},null,8,[`tone`]),a(`div`,P,[a(`span`,F,p(r.id),1),a(`span`,{class:i([`tag`,`tag-${n(me)[r.status]}`])},p(n(pe)[r.status]),3),a(`span`,{class:i([`tag`,r.kind===`mvp`?`tag-mint`:r.kind===`release`?`tag-primary`:`tag-neutral`])},[e(K,{name:n(ge)[r.kind],class:`size-3`},null,8,[`name`]),t(p(n(he)[r.kind]),1)],2),r.sprintId?(d(),o(`span`,I,p(r.sprintId),1)):m(``,!0),a(`span`,{class:i([`days`,{over:Y(r.due)<0,soon:Y(r.due)>=0&&Y(r.due)<=7}])},p(Se(r.due)),3)]),a(`h3`,L,p(r.title),1),a(`p`,R,p(r.criteria),1),a(`div`,z,[a(`span`,null,[a(`b`,null,p(n(G)(r).done)+`/`+p(n(G)(r).total),1),u[12]||=t(` 个故事`,-1)]),n(G)(r).cancelled?(d(),o(f,{key:0},[u[13]||=a(`span`,{class:`dim`},`·`,-1),a(`span`,B,p(n(G)(r).cancelled)+` 个已取消`,1)],64)):m(``,!0),u[14]||=a(`span`,{class:`dim`},`·`,-1),a(`span`,null,p(n(G)(r).points)+` 点`,1),a(`span`,V,p(X(r))+`%`,1)]),a(`div`,{class:i([`bar`,r.kind===`checkpoint`?``:Z(r.kind)])},[a(`i`,{style:c({width:X(r)+`%`})},null,4)],2),a(`ul`,le,[(d(!0),o(f,null,s(n(G)(r).list,t=>(d(),o(`li`,{key:t.id},[e(q,{to:`/story/${t.id}`,class:`srow`},{default:ee(()=>[a(`i`,{class:`sdot`,style:c({background:n(_e)[t.status]})},null,4),a(`span`,H,p(t.id),1),a(`span`,U,p(t.title),1),a(`span`,W,p(n(ve)[t.status]),1),a(`span`,ue,p(t.points),1)]),_:2},1032,[`to`])]))),128))])],2)])],64))),128)),n(Q)===n(J).length?(d(),o(`div`,de,[...u[15]||=[a(`span`,{class:`today-when`},`今天`,-1),a(`span`,{class:`today-axis`},[a(`i`)],-1),a(`span`,{class:`today-line`},null,-1)]])):m(``,!0)])])])}}}),[[`__scopeId`,`data-v-fb35a72e`]]);export{G 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
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* scrum-skills validate [dir] 校验敏捷数据(默认当前目录)
|
|
13
13
|
*/
|
|
14
14
|
import { cpSync, mkdirSync, existsSync, writeFileSync, readFileSync, readdirSync, statSync } from 'node:fs';
|
|
15
|
-
import { join, resolve, dirname } from 'node:path';
|
|
15
|
+
import { join, resolve, dirname, basename } from 'node:path';
|
|
16
16
|
import { spawnSync } from 'node:child_process';
|
|
17
17
|
import { fileURLToPath } from 'node:url';
|
|
18
18
|
|
|
@@ -31,6 +31,20 @@ scsk 是 scrum-skills 的等价简写,如: scsk serve`;
|
|
|
31
31
|
const [cmd, ...args] = process.argv.slice(2);
|
|
32
32
|
const fail = msg => { console.error(`✘ ${msg}`); process.exit(1); };
|
|
33
33
|
|
|
34
|
+
/**
|
|
35
|
+
* 备份一个即将被覆盖的文件,返回备份路径。
|
|
36
|
+
* 名字带时间戳:老做法固定叫 `*.bak`,第二次 update 就把上一次的备份顶掉了,
|
|
37
|
+
* 而 AGENTS.md 几乎一定会被本地改过,备份互相覆盖等于没备份。
|
|
38
|
+
*/
|
|
39
|
+
function backupFile(file) {
|
|
40
|
+
const d = new Date();
|
|
41
|
+
const pad = n => String(n).padStart(2, '0');
|
|
42
|
+
const stamp = `${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}-${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`;
|
|
43
|
+
let target = `${file}.${stamp}.bak`;
|
|
44
|
+
for (let i = 2; existsSync(target); i += 1) target = `${file}.${stamp}-${i}.bak`;
|
|
45
|
+
cpSync(file, target);
|
|
46
|
+
return target;
|
|
47
|
+
}
|
|
34
48
|
function init() {
|
|
35
49
|
const force = args.includes('--force');
|
|
36
50
|
const dir = resolve(args.find(a => !a.startsWith('--')) || process.cwd());
|
|
@@ -38,9 +52,9 @@ function init() {
|
|
|
38
52
|
|
|
39
53
|
const agentsMd = join(dir, 'AGENTS.md');
|
|
40
54
|
if (existsSync(agentsMd) && !force)
|
|
41
|
-
fail(`目标目录已有 AGENTS.md。确认覆盖请加 --force
|
|
42
|
-
const backed = existsSync(agentsMd);
|
|
43
|
-
if (backed)
|
|
55
|
+
fail(`目标目录已有 AGENTS.md。确认覆盖请加 --force(旧文件会先备份成 AGENTS.md.<时间戳>.bak)`);
|
|
56
|
+
const backed = existsSync(agentsMd) ? backupFile(agentsMd) : null;
|
|
57
|
+
if (backed) console.log(`· 已把现有 AGENTS.md 备份为 ${basename(backed)}`);
|
|
44
58
|
|
|
45
59
|
cpSync(join(PKG_ROOT, '.agents'), join(dir, '.agents'), { recursive: true, force: true });
|
|
46
60
|
writeFileSync(agentsMd, readFileSync(join(PKG_ROOT, 'templates/AGENTS.md'), 'utf8'));
|
|
@@ -65,7 +79,7 @@ function init() {
|
|
|
65
79
|
|
|
66
80
|
console.log(`✔ 已初始化到 ${dir}
|
|
67
81
|
- .agents/skills/ 四个敏捷 skill(planning / sprint / tdd / report)
|
|
68
|
-
- AGENTS.md agent 入口纪律文件${backed ?
|
|
82
|
+
- AGENTS.md agent 入口纪律文件${backed ? `(旧文件已备份为 ${basename(backed)})` : ''}
|
|
69
83
|
- tools/validate.mjs 数据校验脚本
|
|
70
84
|
- agile/ 三文件结构${created.length ? `(新建 ${created.join('、')})` : '(已存在,未覆盖)'}
|
|
71
85
|
|
|
@@ -104,6 +118,8 @@ function update() {
|
|
|
104
118
|
fail(`${dir} 未初始化(找不到 .agents/ 与 AGENTS.md)。请先运行: scrum-skills init`);
|
|
105
119
|
|
|
106
120
|
const added = [], changed = [], same = [];
|
|
121
|
+
// 相对路径 → 备份文件名,覆盖完统一提示怎么把本地改动捞回来
|
|
122
|
+
const backups = [];
|
|
107
123
|
for (const { rel, src } of frameworkFiles()) {
|
|
108
124
|
const dest = join(dir, rel);
|
|
109
125
|
const srcText = readFileSync(src, 'utf8');
|
|
@@ -114,19 +130,26 @@ function update() {
|
|
|
114
130
|
if (readFileSync(dest, 'utf8') === srcText) { same.push(rel); continue; }
|
|
115
131
|
changed.push(rel);
|
|
116
132
|
if (!dryRun) {
|
|
117
|
-
|
|
133
|
+
const bak = backupFile(dest); // 覆盖前备份,本地自定义不丢
|
|
134
|
+
backups.push({ rel, bak: basename(bak) });
|
|
118
135
|
writeFileSync(dest, srcText);
|
|
119
136
|
}
|
|
120
137
|
}
|
|
121
138
|
|
|
122
139
|
const verb = dryRun ? '(dry-run,未写入)' : '';
|
|
140
|
+
const bakLines = backups.map(b => ` - ${b.rel} 的旧版本 → ${b.bak}`).join('\n');
|
|
123
141
|
console.log(`✔ skill 框架文件更新完成${verb} — ${dir}
|
|
124
142
|
- 新增 ${added.length} 个${added.length ? `: ${added.join(', ')}` : ''}
|
|
125
|
-
- 更新 ${changed.length}
|
|
143
|
+
- 更新 ${changed.length} 个${changed.length ? `: ${changed.join(', ')}` : ''}
|
|
126
144
|
- 未变 ${same.length} 个
|
|
127
|
-
- agile/
|
|
128
|
-
|
|
129
|
-
${
|
|
145
|
+
- agile/ 数据目录未做任何改动${bakLines ? `\n - 覆盖前已备份${bakLines.replace(/^ {2}/gm, '\n ')}` : ''}
|
|
146
|
+
|
|
147
|
+
${backups.length
|
|
148
|
+
? `提示: 框架文件是整篇覆盖的,你在这几个文件里的本地改动都在上面的备份里。
|
|
149
|
+
让 agent 助手(CodeBuddy / Claude Code 等)合并回来即可,直接说:
|
|
150
|
+
「对比 ${backups[0].rel} 与 ${backups[0].bak},把我的本地改动合并回来」${backups.length > 1 ? `\n (其余 ${backups.length - 1} 个文件同理,备份文件名见上方)` : ''}
|
|
151
|
+
确认合并无误后再删掉备份。AGENTS.md 是 agent 的入口纪律文件,先合并它、再让它去改别的文件最稳。`
|
|
152
|
+
: '已是最新,无需操作。'}`);
|
|
130
153
|
}
|
|
131
154
|
|
|
132
155
|
function runTool(script, needPort) {
|
package/package.json
CHANGED
package/templates/AGENTS.md
CHANGED
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
|
|
33
33
|
## 状态机(摘要)
|
|
34
34
|
|
|
35
|
-
- story: `draft → ready → in-progress → review → done`
|
|
35
|
+
- story: `draft → ready → in-progress → review → done`;不做就走 `cancelled`(已取消,终态,不要求验收与任务全 done)
|
|
36
36
|
- task: `todo → red → green → refactored → done`(只能前进;task 状态编码了 TDD 阶段)
|
|
37
37
|
- 详细规则与硬约束见 `.agents/skills/scrum-planning/references/schema.md`。
|
|
38
38
|
|