PageSourceSearch

https://app.backstagebaton.com/app/assets/PlaybooksPage-B-FGgXE5.js

js backstagebaton.com collected 2026-10-07 08:51:30 UTC 19,589 bytes, 1 lines download raw bytes

1import{h as We,c as Ue,a as Ye,r as l,t as pe,j as e,B as c,p as se,E as M}from"./index-_aijvlUq.js";import{u as ye,p as f,b as ve,c as xe,d as Ge,i as Je,t as Ke}from"./taskAssignee-CaFK9K9z.js";import{u as je}from"./useDragReorder-BPTlhWx5.js";import{P as Qe}from"./PageHeader-DCofr6qo.js";import{I as j}from"./Input-ysTyZFq5.js";import{a as Xe}from"./Skeleton-B3Wj6cNd.js";import{C as ae}from"./ConfirmDialog-CODvETNM.js";import{E as Ze}from"./EmptyState-CPGKooqj.js";import"./helpRequests-Bol7uyz2.js";import"./helpWanted-C0itiuLN.js";const te={name:"",description:"",isDefault:!1},ge={name:"",description:"",position:0},fe={label:"",description:"",stage:"",stageId:"",defaultAssigneeRole:"",tMinusDays:0,position:0,requiresConfirmation:!1,needsVolunteers:!1,volunteerSpots:"",volunteerHoursEach:""};function be(h){if(!h?.volunteerSpots)return null;const p=Number(h.volunteerSpots),d=h.volunteerHoursEach==null?null:Number(h.volunteerHoursEach);return`${p} volunteer${p===1?"":"s"}${d?` · about ${d} hour${d===1?"":"s"} each`:""}`}const es=()=>Object.fromEntries(ke.filter(h=>h.value).map(h=>[h.value,h.label])),ke=[{value:"",label:"Unassigned"},{value:"president",label:"President"},{value:"vice_president",label:"Vice President"},{value:"music_director",label:"Music Director"},{value:"band_manager",label:"Band Manager"},{value:"treasurer",label:"Treasurer"},{value:"secretary",label:"Secretary"},{value:"marketing_director",label:"Marketing / Communications"},{value:"assistant_conductor",label:"Assistant Conductor"},{value:"membership_coordinator",label:"Membership Coordinator"},{value:"fundraising_coordinator",label:"Fundraising Coordinator"},{value:"equipment_manager",label:"Equipment Manager"},{value:"librarian",label:"Librarian"},{value:"section_leader",label:"Section Leader"},{value:"member",label:"Member"}];function ss({templates:h,stageId:p,playbookId:d,canManage:S,onEdit:b,onReorderDone:P,showError:E}){const q=ye(),y=je({items:h,onReorder(u){P(p,u),f.reorderTemplates(d,p,u.map(x=>x.id)).catch(x=>E(x?.message||M))}});return e.jsx("ul",{className:"divide-y divide-gray-100",children:h.map((u,x)=>e.jsxs("li",{...S?y.getRowProps(x):{},draggable:S&&!y.tapMode,onDragStart:()=>y.handleDragStart(x),onDragOver:k=>y.handleDragOver(k,x),onDrop:k=>y.handleDrop(k,x),onDragEnd:y.handleDragEnd,className:`px-4 py-2.5 flex items-center gap-3 transition-colors ${y.dragOverIndex===x?"bg-band-50":""}`,children:[S&&e.jsx("div",{...y.getHandleProps(x),className:"shrink-0 text-gray-300 cursor-grab touch-none p-1 -m-1",title:"Drag to reorder",children:e.jsxs("svg",{className:"h-4 w-4",fill:"currentColor",viewBox:"0 0 20 20",children:[e.jsx("circle",{cx:"7",cy:"5",r:"1.5"}),e.jsx("circle",{cx:"7",cy:"10",r:"1.5"}),e.jsx("circle",{cx:"7",cy:"15",r:"1.5"}),e.jsx("circle",{cx:"13",cy:"5",r:"1.5"}),e.jsx("circle",{cx:"13",cy:"10",r:"1.5"}),e.jsx("circle",{cx:"13",cy:"15",r:"1.5"})]})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm text-gray-800",children:u.label}),e.jsxs("div",{className:"flex flex-wrap gap-3 mt-0.5 text-xs text-gray-400",children:[u.defaultAssigneeRole&&e.jsx("span",{className:"inline-flex items-center px-1.5 py-0.5 rounded bg-blue-50 text-blue-600 text-xs",children:ve(u.defaultAssigneeRole,es(),q)}),u.tMinusDays!==0&&e.jsxs("span",{children:[u.tMinusDays," days before"]}),u.requiresConfirmation&&e.jsx("span",{className:"text-amber-500",children:"Requires confirmation"}),be(u)&&e.jsxs("span",{className:"text-teal-700","data-testid":`tpl-volunteers-${u.id}`,children:["Needs ",be(u)]})]})]}),S&&e.jsx(c,{variant:"ghost",size:"sm",onClick:()=>b(u),children:"Edit"})]},u.id))})}function ms(){const{currentOrg:h}=We(),{showSuccess:p,showError:d}=Ue(),{canFully:S}=Ye(),b=S("performance:create"),P=ye(),E=S("performance:delete"),[q,y]=l.useState(()=>localStorage.getItem("playbooks_intro_dismissed")==="true");function u(){localStorage.setItem("playbooks_intro_dismissed","true"),y(!0)}const[x,k]=l.useState([]),[Ne,re]=l.useState(!0),[V,B]=l.useState(!1),[g,$]=l.useState(null),[D,W]=l.useState(te),[ne,le]=l.useState(!1),[Se,R]=l.useState(!1),[i,oe]=l.useState(null),[T,L]=l.useState(null),[De,ie]=l.useState(!1),[we,U]=l.useState(!1),[w,Y]=l.useState(null),[A,O]=l.useState(ge),[Ce,ce]=l.useState(!1),[Ee,_]=l.useState(!1),[Te,G]=l.useState(!1),[C,J]=l.useState(null),[m,v]=l.useState(fe),[Pe,K]=l.useState(null),[Re,de]=l.useState(!1),[Le,I]=l.useState(!1),Q=l.useRef(null),z=l.useRef(null);l.useEffect(()=>{h&&Ae()},[h]),l.useEffect(()=>{if(!i){L(null);return}F(i)},[i]);async function Ae(){re(!0);try{const s=await f.list();k(s)}catch{d(pe("playbooks"))}finally{re(!1)}}async function F(s){ie(!0);try{const a=await f.getById(s);L(a)}catch{d(pe("playbook details"))}finally{ie(!1)}}function X(s,a){W(r=>({...r,[s]:a}))}function ue(){$(null),W(te),z.current=null,B(!0),requestAnimationFrame(()=>Q.current?.scrollIntoView({behavior:"smooth",block:"start"}))}function Fe(s){$(s);const a={name:s.name,description:s.description??"",isDefault:s.isDefault};W(a),z.current=a,B(!0),requestAnimationFrame(()=>Q.current?.scrollIntoView({behavior:"smooth",block:"start"}))}function H(){B(!1),$(null)}const me=!g||!z.current||Object.keys(te).some(s=>D[s]!==z.current[s]);async function he(s){if(s.preventDefault(),!!D.name.trim()){le(!0);try{if(g){const a=await f.update(g.id,D);k(r=>r.map(n=>n.id===g.id?a:n)),p("Playbook updated")}else{const a=await f.create(D);k(r=>[...r,a].sort((n,t)=>n.name.localeCompare(t.name))),p("Playbook created")}H()}catch(a){d(a.message||M)}finally{le(!1)}}}async function Me(){try{await f.remove(g.id),k(s=>s.filter(a=>a.id!==g.id)),i===g.id&&oe(null),R(!1),H(),p("Playbook deleted")}catch(s){R(!1),d(s.message||se)}}const N=je({items:T?.stages??[],onReorder(s){L(a=>a&&{...a,stages:s}),f.reorderStages(i,s.map(a=>a.id)).then(a=>L(a)).catch(a=>d(a?.message||M))}});function Oe(){Y(null);const s=T?.stages?.length??0;O({...ge,position:s}),U(!0)}function _e(s){Y(s),O({name:s.name,description:s.description??"",position:s.position}),U(!0)}function Z(){U(!1),Y(null)}async function Ie(s){if(s.preventDefault(),!(!A.name.trim()||!i)){ce(!0);try{w?(await f.updateStage(i,w.id,A),p("Phase updated")):(await f.addStage(i,A),p("Phase added")),Z(),await F(i)}catch(a){d(a.message||M)}finally{ce(!1)}}}async function ze(){try{await f.removeStage(i,w.id),_(!1),Z(),await F(i),p("Phase deleted")}catch(s){_(!1),d(s.message||se)}}function He(s,a){L(r=>r&&{...r,stages:r.stages.map(n=>n.id===s?{...n,templates:a}:n)})}function qe(s){J(null),K(s);const a=T?.stages?.find(n=>n.id===s),r=a?.templates?.length??0;v({...fe,stageId:s,stage:a?.name??"",position:r}),G(!0)}function Ve(s){J(s),K(s.stageId),v({label:s.label,description:s.description??"",stage:s.stage??"",stageId:s.stageId??"",defaultAssigneeRole:s.defaultAssigneeRole??"",tMinusDays:s.tMinusDays??0,position:s.position??0,requiresConfirmation:s.requiresConfirmation??!1,needsVolunteers:!!s.volunteerSpots,volunteerSpots:s.volunteerSpots??"",volunteerHoursEach:s.volunteerHoursEach==null?"":Number(s.volunteerHoursEach)}),G(!0)}function ee(){G(!1),J(null),K(null)}async function Be(s){if(s.preventDefault(),!m.label.trim()||!i)return;de(!0);const{needsVolunteers:a,...r}=m,n=a?parseInt(m.volunteerSpots,10):NaN,t={...r,volunteerSpots:Number.isFinite(n)&&n>0?n:null,volunteerHoursEach:Number.isFinite(n)&&n>0&&Number(m.volunteerHoursEach)>0?Number(m.volunteerHoursEach):null};try{C?(await f.updateTemplate(i,C.id,t),p(t.volunteerSpots?"Task updated. Upcoming concerts with this task now ask for volunteers.":"Task updated")):(await f.addTemplate(i,t),p("Task added")),ee(),await F(i)}catch(o){d(o.message||M)}finally{de(!1)}}async function $e(){try{await f.removeTemplate(i,C.id),I(!1),ee(),await F(i),p("Task deleted")}catch(s){I(!1),d(s.message||se)}}return e.jsxs("div",{className:"px-4 md:px-0",children:[e.jsx(ae,{isOpen:Se,onClose:()=>R(!1),onConfirm:Me,title:"Delete Playbook",message:`Delete "${g?.name}"? All phases and tasks will be removed. This cannot be undone.`,confirmLabel:"Delete"}),e.jsx(ae,{isOpen:Ee,onClose:()=>_(!1),onConfirm:ze,title:"Delete Phase",message:`Delete "${w?.name}"? All tasks in this phase will be removed.`,confirmLabel:"Delete"}),e.jsx(ae,{isOpen:Le,onClose:()=>I(!1),onConfirm:$e,title:"Delete Task",message:`Delete "${C?.label}"?`,confirmLabel:"Delete"}),e.jsx(Qe,{title:"Playbooks",breadcrumbs:[{label:"Home",to:"/"},{label:"Settings"},{label:"Playbooks"}],actions:b&&!V?e.jsx(c,{onClick:ue,children:"New playbook"}):null}),!q&&e.jsxs("div",{className:"mb-4 rounded-xl border border-blue-200 bg-blue-50 px-5 py-4 flex items-start gap-3",children:[e.jsx("svg",{className:"h-5 w-5 text-blue-500 shrink-0 mt-0.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm font-medium text-blue-800",children:"What are Playbooks?"}),e.jsx("p",{className:"text-sm text-blue-700 mt-1",children:'Playbooks are reusable checklists that help you prepare for performances. Each playbook contains phases (e.g. "Pre-Production", "Week Of", "Day Of") with tasks assigned to specific roles. When you apply a playbook to a performance, the tasks are automatically created with due dates based on how many days before the performance each task is due.'})]}),e.jsx("button",{type:"button",onClick:u,className:"shrink-0 p-1 rounded hover:bg-blue-100 text-blue-400 hover:text-blue-600 transition-colors","aria-label":"Dismiss",children:e.jsx("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})})})]}),V&&e.jsxs("div",{ref:Q,className:"bg-white rounded-xl border border-gray-200 p-6 mb-4",children:[e.jsx("h3",{className:"text-sm font-semibold text-gray-500 uppercase tracking-wide mb-4",children:g?"Edit Playbook":"New Playbook"}),e.jsxs("div",{className:"flex gap-2 pt-2 mb-4",children:[e.jsx(c,{onClick:he,isLoading:ne,disabled:!me,size:"sm",children:g?"Save changes":"Create"}),e.jsx(c,{variant:"secondary",size:"sm",onClick:H,children:"Cancel"}),g&&E&&e.jsx(c,{variant:"danger",size:"sm",className:"ml-auto",onClick:()=>R(!0),children:"Delete"})]}),e.jsxs("form",{onSubmit:he,className:"space-y-3",children:[e.jsx(j,{label:"Name",placeholder:"Standard Concert",value:D.name,onChange:s=>X("name",s.target.value),required:!0}),e.jsx(j,{label:"Description",placeholder:"Tasks for a typical concert performance",value:D.description,onChange:s=>X("description",s.target.value)}),e.jsxs("label",{className:"flex items-center gap-2 text-sm text-gray-700",children:[e.jsx("input",{type:"checkbox",checked:D.isDefault,onCh
1ange:s=>X("isDefault",s.target.checked),className:"rounded border-gray-300"}),"Default playbook for new performances"]}),e.jsxs("div",{className:"flex gap-2 pt-2",children:[e.jsx(c,{type:"submit",isLoading:ne,disabled:!me,size:"sm",children:g?"Save changes":"Create"}),e.jsx(c,{type:"button",variant:"secondary",size:"sm",onClick:H,children:"Cancel"}),g&&E&&e.jsx(c,{type:"button",variant:"danger",size:"sm",className:"ml-auto",onClick:()=>R(!0),children:"Delete"})]})]})]}),!V&&(Ne?e.jsx("div",{className:"space-y-2",children:Array.from({length:3}).map((s,a)=>e.jsx(Xe,{lines:2},a))}):x.length===0?e.jsx(Ze,{card:!0,title:"No playbooks yet.",description:"Create your first playbook to build a reusable checklist for your performances.",action:b?e.jsx(c,{onClick:ue,children:"Create first playbook"}):null}):e.jsx("div",{className:"space-y-2",children:x.map(s=>{const a=i===s.id;return e.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 overflow-hidden",children:[e.jsxs("div",{className:"px-5 py-4 flex items-start gap-4",children:[e.jsxs("button",{type:"button",className:"flex-1 min-w-0 text-left",onClick:()=>oe(a?null:s.id),children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("p",{className:"font-medium text-gray-900",children:s.name}),e.jsx("svg",{className:`h-4 w-4 text-gray-400 shrink-0 transition-transform duration-200 ${a?"rotate-180":""}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})]}),s.description&&e.jsx("p",{className:"text-xs text-gray-400 mt-0.5",children:s.description})]}),e.jsxs("div",{className:"flex items-center gap-2 shrink-0 pt-0.5",children:[s.isDefault&&e.jsx("span",{className:"inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium bg-green-100 text-green-700",children:"Default"}),!s.isActive&&e.jsx("span",{className:"inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium bg-gray-100 text-gray-500",children:"Inactive"}),b&&e.jsx(c,{variant:"ghost",size:"sm",onClick:r=>{r.stopPropagation(),Fe(s)},children:"Edit"})]})]}),a&&e.jsx("div",{className:"border-t border-gray-100 px-5 py-4",children:De?e.jsx("p",{className:"text-sm text-gray-400",children:"Loading..."}):T?e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("p",{className:"text-xs font-semibold text-gray-500 uppercase tracking-wide",children:"Phases"}),b&&e.jsx(c,{variant:"ghost",size:"sm",onClick:Oe,children:"New phase"})]}),we&&e.jsxs("div",{className:"bg-gray-50 rounded-lg border border-gray-200 p-4",children:[e.jsx("h4",{className:"text-xs font-semibold text-gray-500 uppercase tracking-wide mb-3",children:w?"Edit Phase":"New Phase"}),e.jsxs("form",{onSubmit:Ie,className:"space-y-2",children:[e.jsx(j,{label:"Phase Name",placeholder:"Pre-Production",value:A.name,onChange:r=>O(n=>({...n,name:r.target.value})),required:!0}),e.jsx(j,{label:"Description",placeholder:"Optional description",value:A.description,onChange:r=>O(n=>({...n,description:r.target.value}))}),e.jsxs("div",{className:"flex gap-2 pt-1",children:[e.jsx(c,{type:"submit",isLoading:Ce,size:"sm",children:w?"Save changes":"Create"}),e.jsx(c,{type:"button",variant:"secondary",size:"sm",onClick:Z,children:"Cancel"}),w&&E&&e.jsx(c,{type:"button",variant:"danger",size:"sm",className:"ml-auto",onClick:()=>_(!0),children:"Delete"})]})]})]}),T.stages.length===0?e.jsx("p",{className:"text-sm text-gray-400",children:"No phases defined yet. Add a phase to start organizing your tasks."}):T.stages.map((r,n)=>e.jsxs("div",{...b?N.getRowProps(n):{},draggable:b&&!N.tapMode,onDragStart:()=>N.handleDragStart(n),onDragOver:t=>N.handleDragOver(t,n),onDrop:t=>N.handleDrop(t,n),onDragEnd:N.handleDragEnd,className:`border rounded-lg transition-colors ${N.dragOverIndex===n?"border-band-400 bg-band-50":"border-gray-200"}`,children:[e.jsxs("div",{className:"px-4 py-3 bg-gray-50 rounded-t-lg flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[b&&e.jsx("div",{...N.getHandleProps(n),className:"shrink-0 text-gray-300 cursor-grab touch-none p-1 -m-1",title:"Drag to reorder",children:e.jsxs("svg",{className:"h-4 w-4",fill:"
1currentColor",viewBox:"0 0 20 20",children:[e.jsx("circle",{cx:"7",cy:"5",r:"1.5"}),e.jsx("circle",{cx:"7",cy:"10",r:"1.5"}),e.jsx("circle",{cx:"7",cy:"15",r:"1.5"}),e.jsx("circle",{cx:"13",cy:"5",r:"1.5"}),e.jsx("circle",{cx:"13",cy:"10",r:"1.5"}),e.jsx("circle",{cx:"13",cy:"15",r:"1.5"})]})}),e.jsxs("div",{children:[e.jsxs("span",{className:"text-xs font-medium text-gray-400 mr-2",children:["Phase ",n+1]}),e.jsx("span",{className:"text-sm font-medium text-gray-800",children:r.name}),r.description&&e.jsx("p",{className:"text-xs text-gray-400 mt-0.5",children:r.description})]})]}),e.jsx("div",{className:"flex items-center gap-1",children:b&&e.jsxs(e.Fragment,{children:[e.jsx(c,{variant:"ghost",size:"sm",onClick:()=>qe(r.id),children:"Add task"}),e.jsx(c,{variant:"ghost",size:"sm",onClick:()=>_e(r),children:"Edit"})]})})]}),Te&&Pe===r.id&&e.jsxs("div",{className:"px-4 py-3 bg-blue-50 border-t border-blue-100",children:[e.jsx("h4",{className:"text-xs font-semibold text-gray-500 uppercase tracking-wide mb-3",children:C?"Edit Task":"New Task"}),e.jsxs("form",{onSubmit:Be,className:"space-y-2",children:[e.jsx(j,{label:"Task Label",placeholder:"Book venue",value:m.label,onChange:t=>v(o=>({...o,label:t.target.value})),required:!0}),e.jsx(j,{label:"Description",placeholder:"Optional details",value:m.description,onChange:t=>v(o=>({...o,description:t.target.value}))}),e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Assigned Role"}),e.jsxs("select",{className:"w-full rounded-lg border border-gray-300 px-3 py-2 text-sm",value:m.defaultAssigneeRole,onChange:t=>v(o=>({...o,defaultAssigneeRole:t.target.value,...Ge(o.defaultAssigneeRole,t.target.value)&&!o.needsVolunteers?{needsVolunteers:!0,volunteerSpots:o.volunteerSpots||1}:{}})),children:[ke.map(t=>e.jsx("option",{value:t.value,children:t.label},t.value)),P.length>0&&e.jsx("optgroup",{label:"Teams",children:P.map(t=>e.jsx("option",{value:xe(t.id),children:ve(xe(t.id),{},P)},t.id))})]}),Je(m.defaultAssigneeRole)&&e.jsx("p",{className:"text-xs text-gray-500 mt-1","aria-live":"polite",children:Ke(m.needsVolunteers)})]}),e.jsxs("div",{children:[e.jsx(j,{label:"Days Before Performance",type:"number",value:m.tMinusDays,onChange:t=>v(o=>({...o,tMinusDays:parseInt(t.target.value)||0}))}),e.jsx("p",{className:"text-xs text-gray-400 mt-1",children:"Enter how many days before the performance this task is due. Use 0 for the day of the performance."})]})]}),e.jsxs("label",{className:"flex items-center gap-2 text-sm text-gray-700",children:[e.jsx("input",{type:"checkbox",checked:m.requiresConfirmation,onChange:t=>v(o=>({...o,requiresConfirmation:t.target.checked})),className:"rounded border-gray-300"}),"Requires confirmation"]}),e.jsxs("label",{className:"flex items-center gap-2 text-sm text-gray-700",children:[e.jsx("input",{type:"checkbox",checked:m.needsVolunteers,onChange:t=>v(o=>({...o,needsVolunteers:t.target.checked,volunteerSpots:t.target.checked&&!o.volunteerSpots?2:o.volunteerSpots})),className:"rounded border-gray-300"}),"Needs volunteers"]}),m.needsVolunteers&&e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[e.jsx(j,{label:"How many people",type:"number",min:1,max:200,value:m.volunteerSpots,onChange:t=>v(o=>({...o,volunteerSpots:t.target.value}))}),e.jsx(j,{label:"About how many hours each",type:"number",min:.5,step:.5,value:m.volunteerHoursEach,onChange:t=>v(o=>({...o,volunteerHoursEach:t.target.value}))}),e.jsx("p",{className:"col-span-2 text-xs text-gray-500",children:"Every concert that uses this playbook asks members to help with this task, with a Sign up button."})]}),e.jsxs("div",{className:"flex gap-2 pt-1",children:[e.jsx(c,{type:"submit",isLoading:Re,size:"sm",children:C?"Save changes":"Create"}),e.jsx(c,{type:"button",variant:"secondary",size:"sm",onClick:ee,children:"Cancel"}),C&&E&&e.jsx(c,{type:"button",variant:"danger",size:"sm",className:"ml-auto",onClick:()=>I(!0),children:"Delete"})]})]})]}),r.templates.length>0&&e.jsx(ss,{templates:r.templates,stageId:r.id,playbookId:i,canManage:b,onEdit:Ve,onReorderDone:He,showError:d}),r.templates.length===0&&e.jsx("p",{className:"px-4 py-3 text-xs text-gray-400",children:"No tasks in this phase yet. Add a task to get started."})]},r.id))]}):e.jsx("p",{className:"text-sm text-gray-400",children:"No data"})})]},s.id)})}))]})}export{ms as PlaybooksPage};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.