dev-process-kit 0.0.2-beta.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +22 -9
  2. package/dist/chunks/shared-B2K3LoOU.js +1016 -0
  3. package/dist/chunks/shared-BqW3KAJ4.js +613 -0
  4. package/dist/chunks/shared-Byv6cc0r.js +2779 -0
  5. package/dist/chunks/{shared-CmM4cgd6.js → shared-CKG_SQh5.js} +1 -1
  6. package/dist/chunks/shared-CPAT0Cgk.js +29 -0
  7. package/dist/chunks/shared-CwbzACTe.js +1874 -0
  8. package/dist/chunks/shared-DBDgdVsd.js +1 -0
  9. package/dist/chunks/shared-DMlMTd3c.js +1018 -0
  10. package/dist/chunks/shared-DaoPCw6-.js +556 -0
  11. package/dist/chunks/shared-DqB_TR20.js +1599 -0
  12. package/dist/chunks/shared-DsVxrO_3.js +609 -0
  13. package/dist/chunks/shared-iQIywbRc.js +676 -0
  14. package/dist/chunks/shared-xrCdgpNS.js +1 -0
  15. package/dist/components.js +1 -1
  16. package/dist/index.js +1 -1
  17. package/dist/templates/event-storming.js +1 -1
  18. package/dist/templates/example-mapping.js +1 -1
  19. package/dist/templates/grill.js +1 -1
  20. package/dist/templates/plain.js +1 -1
  21. package/dist/templates/prototype.js +1 -1
  22. package/dist/templates/slides.js +1 -0
  23. package/dist/templates/task-board.js +1 -0
  24. package/dist/templates/usm.js +1 -1
  25. package/package.json +4 -2
  26. package/dist/chunks/shared-5C6fORCL.js +0 -1404
  27. package/dist/chunks/shared-B1lFGiYZ.js +0 -1
  28. package/dist/chunks/shared-BEjjbZ0X.js +0 -2543
  29. package/dist/chunks/shared-BFAVBf4I.js +0 -1
  30. package/dist/chunks/shared-BybvAQye.js +0 -579
  31. package/dist/chunks/shared-DKxAm7wL.js +0 -27
  32. package/dist/chunks/shared-DgusMFKr.js +0 -1
  33. package/dist/chunks/shared-Dx0MEuAf.js +0 -921
  34. package/dist/chunks/shared-RclF4vSf.js +0 -692
  35. package/dist/chunks/shared-ao1beBgL.js +0 -544
  36. package/dist/chunks/shared-eiZoh1aF.js +0 -521
@@ -1,921 +0,0 @@
1
- import{a7 as ae,a8 as F,a9 as et,aa as nt,ar as N,ab as b,as as R,ac as W,ad as S,ae as I,q as $,al as T,v as ot,aq as ft,P as de,f as ce,V as U,R as w,$ as gt,a4 as le,k as pe,_ as xt,a0 as M,a1 as v,A as he,K as me,i as ue,at as fe,a3 as B,a2 as bt,au as ge,T as vt,m as C}from"./shared-5C6fORCL.js";import{P as kt,r as xe,p as be,a as ve}from"./shared-DKxAm7wL.js";import{o as ke}from"./shared-DgusMFKr.js";import{c as Et}from"./shared-ml5h7U5L.js";function Ee(e,t){let n=0;for(let i=0;i<e.length;i++)n+=t(e[i],i);return n}const j=["actor","command","aggregate","event","policy","readmodel","external","hotspot"],ye=F({id:R,name:S(b(),I(1)),description:N(b())}),we=F({id:R,type:W(j),name:S(b(),I(1)),description:N(b()),contextId:N(b())}),$e=F({id:R,from:S(b(),I(1)),to:S(b(),I(1)),label:N(b()),kind:N(W(["member","flow"]))}),yt=F({title:N(b()),contexts:et(nt(ye),[]),elements:et(nt(we),[]),links:et(nt($e),[])}),wt=e=>{const t=ae(yt,e),n=new Set(t.elements.map(o=>o.id)),i=new Set(t.contexts.map(o=>o.id));for(const o of t.elements)if(o.contextId!==void 0&&!i.has(o.contextId))throw new Error(`unknown context "${o.contextId}" for note "${o.id}"`);for(const o of t.links){if(!n.has(o.from))throw new Error(`unknown note "${o.from}" in link "${o.id}"`);if(!n.has(o.to))throw new Error(`unknown note "${o.to}" in link "${o.id}"`)}return t},$t=()=>({contexts:[],elements:[],links:[]}),z=(e,t)=>{if(t!==void 0)return e.elements.find(n=>n.id===t)},Y=(e,t)=>{if(t!==void 0)return e.contexts.find(n=>n.id===t)},it=(e,t)=>{if(t!==void 0)return e.links.find(n=>n.id===t)},H=e=>e.elements.map(t=>t.id),y={SET_ELEMENT_NAME:$("SET_ELEMENT_NAME","element",T({name:S(b(),I(1))})),SET_ELEMENT_DESCRIPTION:$("SET_ELEMENT_DESCRIPTION","element",T({description:b()})),SET_ELEMENT_TYPE:$("SET_ELEMENT_TYPE","element",T({type:W(j)})),SET_ELEMENT_CONTEXT:$("SET_ELEMENT_CONTEXT","element",T({contextId:ft(b())})),MOVE_ELEMENT:$("MOVE_ELEMENT","element",T({after:ft(b())}),{mode:"sequence"}),ADD_ELEMENT:$("ADD_ELEMENT","page",T({id:R,type:W(j),name:S(b(),I(1)),description:N(b()),contextId:N(b())}),{dedupeKey:ot}),DELETE_ELEMENT:$("DELETE_ELEMENT","element",T({})),LINK_ELEMENTS:$("LINK_ELEMENTS","page",T({id:R,from:S(b(),I(1)),to:S(b(),I(1)),label:N(b()),kind:N(W(["member","flow"]))}),{dedupeKey:ot}),SET_LINK_LABEL:$("SET_LINK_LABEL","link",T({label:b()})),UNLINK_ELEMENTS:$("UNLINK_ELEMENTS","page",T({from:S(b(),I(1)),to:S(b(),I(1))}),{mode:"sequence"}),ADD_CONTEXT:$("ADD_CONTEXT","page",T({id:R,name:S(b(),I(1)),description:N(b())}),{dedupeKey:ot}),SET_CONTEXT_NAME:$("SET_CONTEXT_NAME","context",T({name:S(b(),I(1))})),DELETE_CONTEXT:$("DELETE_CONTEXT","context",T({}))},E={setElementName:(e,t)=>({type:"SET_ELEMENT_NAME",target:{type:"element",id:e},payload:{name:t}}),setElementDescription:(e,t)=>({type:"SET_ELEMENT_DESCRIPTION",target:{type:"element",id:e},payload:{description:t}}),setElementType:(e,t)=>({type:"SET_ELEMENT_TYPE",target:{type:"element",id:e},payload:{type:t}}),setElementContext:(e,t)=>({type:"SET_ELEMENT_CONTEXT",target:{type:"element",id:e},payload:{contextId:t}}),moveElement:(e,t)=>({type:"MOVE_ELEMENT",target:{type:"element",id:e},payload:{after:t}}),addElement:(e,t,n)=>({type:"ADD_ELEMENT",target:{type:"page",id:"event-storming"},payload:{id:e,type:t,name:n}}),deleteElement:e=>({type:"DELETE_ELEMENT",target:{type:"element",id:e},payload:{}}),linkElements:(e,t,n,i)=>({type:"LINK_ELEMENTS",target:{type:"page",id:"event-storming"},payload:{id:e,from:t,to:n,...i?.label===void 0?{}:{label:i.label},...i?.kind===void 0?{}:{kind:i.kind}}}),setLinkLabel:(e,t)=>({type:"SET_LINK_LABEL",target:{type:"link",id:e},payload:{label:t}}),unlinkElements:(e,t)=>({type:"UNLINK_ELEMENTS",target:{type:"page",id:"event-storming"},payload:{from:e,to:t}}),addContext:(e,t)=>({type:"ADD_CONTEXT",target:{type:"page",id:"event-storming"},payload:{id:e,name:t}}),setContextName:(e,t)=>({type:"SET_CONTEXT_NAME",target:{type:"context",id:e},payload:{name:t}}),deleteContext:e=>({type:"DELETE_CONTEXT",target:{type:"context",id:e},payload:{}})},Tt=(e,t)=>{const n=de(y,t);if(n===null)return null;const i=n.target.id;switch(n.type){case"SET_ELEMENT_NAME":return G(e,i,o=>({...o,name:n.payload.name}));case"SET_ELEMENT_DESCRIPTION":return G(e,i,o=>({...o,description:n.payload.description}));case"SET_ELEMENT_TYPE":return G(e,i,o=>({...o,type:n.payload.type}));case"SET_ELEMENT_CONTEXT":{const{contextId:o}=n.payload;return o!==null&&!e.contexts.some(s=>s.id===o)?null:G(e,i,s=>o===null?St(s):{...s,contextId:o})}case"MOVE_ELEMENT":{const{after:o}=n.payload,s=Te(e.elements,i,o);return s===null?null:{...e,elements:s}}case"ADD_ELEMENT":{const o=n.payload;if(e.elements.some(r=>r.id===o.id))return e;if(o.contextId!==void 0&&!e.contexts.some(r=>r.id===o.contextId))return null;const s={id:o.id,type:o.type,name:o.name,...o.description===void 0?{}:{description:o.description},...o.contextId===void 0?{}:{contextId:o.contextId}};return{...e,elements:[...e.elements,s]}}case"DELETE_ELEMENT":return e.elements.some(o=>o.id===i)?{...e,elements:e.elements.filter(o=>o.id!==i),links:e.links.filter(o=>o.from!==i&&o.to!==i)}:null;case"LINK_ELEMENTS":{const o=n.payload;return e.links.some(s=>s.id===o.id)?e:!e.elements.some(s=>s.id===o.from)||!e.elements.some(s=>s.id===o.to)?null:{...e,links:[...e.links,{id:o.id,from:o.from,to:o.to,...o.label===void 0?{}:{label:o.label},...o.kind===void 0?{}:{kind:o.kind}}]}}case"SET_LINK_LABEL":return e.links.some(o=>o.id===i)?{...e,links:e.links.map(o=>o.id===i?{...o,label:n.payload.label}:o)}:null;case"UNLINK_ELEMENTS":{const o=n.payload;return e.links.some(s=>s.from===o.from&&s.to===o.to)?{...e,links:e.links.filter(s=>!(s.from===o.from&&s.to===o.to))}:null}case"ADD_CONTEXT":{const o=n.payload;if(e.contexts.some(r=>r.id===o.id))return e;const s={id:o.id,name:o.name,...o.description===void 0?{}:{description:o.description}};return{...e,contexts:[...e.contexts,s]}}case"SET_CONTEXT_NAME":return e.contexts.some(o=>o.id===i)?{...e,contexts:e.contexts.map(o=>o.id===i?{...o,name:n.payload.name}:o)}:null;case"DELETE_CONTEXT":return e.contexts.some(o=>o.id===i)?{...e,contexts:e.contexts.filter(o=>o.id!==i),elements:e.elements.map(o=>o.contextId===i?St(o):o)}:null;default:return ce(n)}},St=e=>{const t={...e};return delete t.contextId,t},G=(e,t,n)=>e.elements.some(i=>i.id===t)?{...e,elements:e.elements.map(i=>i.id===t?n(i):i)}:null,Te=(e,t,n)=>{const i=e.findIndex(a=>a.id===t);if(i<0||n!==null&&!e.some(a=>a.id===n))return null;const o=e[i];if(o===void 0)return null;const r=[...e.filter(a=>a.id!==t)];return r.splice(n===null?0:r.findIndex(a=>a.id===n)+1,0,o),r},Se=new Set(["actor>command","command>aggregate","aggregate>event","command>event","policy>command","external>event"]),Z=(e,t)=>Se.has(`${e}>${t}`),Ie=(e,t,n)=>e.kind!==void 0?e.kind==="member":Z(t,n),Me=["readmodel","actor","policy","command","aggregate","external","event","hotspot"],_e=(e,t)=>{const n=new Map;for(const i of e.links){const o=t.get(i.from),s=t.get(i.to);if(o===void 0||s===void 0||o==="hotspot"==(s==="hotspot")||i.kind!==void 0&&i.kind!=="member")continue;const r=o==="hotspot"?i.from:i.to;n.has(r)||n.set(r,o==="hotspot"?i.to:i.from)}return n},Ne=(e,t,n)=>{const i=new Map(e.map(a=>[a.id,a.id])),o=a=>{let c=a;for(;i.get(c)!==c;)c=i.get(c)??c;let d=a;for(;d!==c;){const p=i.get(d)??c;i.set(d,c),d=p}return c};for(const a of t){if(!i.has(a.from)||!i.has(a.to))continue;const c=n.get(a.from),d=n.get(a.to);c===void 0||d===void 0||Ie(a,c,d)&&i.set(o(a.from),o(a.to))}const s=new Map,r=new Map;for(const a of e){const c=o(a.id);r.set(a.id,c);const d=s.get(c);d?d.push(a):s.set(c,[a])}return{groups:s,rootOf:r}},A=e=>{const t=new Map(e.elements.map(d=>[d.id,d.type])),n=_e(e,t),i=e.elements.filter(d=>!n.has(d.id)),{groups:o,rootOf:s}=Ne(i,e.links,t),r=new Map;for(const[d,p]of n){const m=z(e,d),f=s.get(p);if(m===void 0||f===void 0)continue;const l=r.get(f);l?l.push({note:m,targetId:p}):r.set(f,[{note:m,targetId:p}])}const a=new Map(Me.map((d,p)=>[d,p])),c=new Map(e.elements.map((d,p)=>[d.id,p]));return[...o].map(([d,p])=>{const m=[...p].sort((f,l)=>(a.get(f.type)??0)-(a.get(l.type)??0)||(c.get(f.id)??0)-(c.get(l.id)??0));return{id:p[0]?.id??"",notes:m,pins:r.get(d)??[],contextId:p.find(f=>f.contextId!==void 0)?.contextId}})},Le=e=>{const t=A(e).flatMap(i=>[...i.notes,...i.pins.map(o=>o.note)]),n=new Set(t.map(i=>i.id));return{...e,elements:[...t,...e.elements.filter(i=>!n.has(i.id))]}},It=(e,t)=>{const n=[...e.notes,...e.pins.map(r=>r.note)],i=n.find(r=>Z(t,r.type));if(i!==void 0)return{anchorId:i.id,incoming:!0};const o=n.find(r=>Z(r.type,t));if(o!==void 0)return{anchorId:o.id,incoming:!1};const s=n[0];return s===void 0?void 0:{anchorId:s.id,incoming:!0}},Mt=(e,t)=>{const n=new Map(t.flatMap(i=>i.notes.map(o=>[o.id,i.id])));return e.links.flatMap(i=>{const o=n.get(i.from),s=n.get(i.to);return o===void 0||s===void 0||o===s?[]:[{id:i.id,from:o,to:s,...i.label!==void 0?{label:i.label}:{}}]})},st=(e,t)=>`${e}\0${t}`,_t=(e,t,n)=>{const{widthOf:i,gapX:o,padX:s,maxWidth:r}=n,a=new Map;for(const h of t)a.set(st(h.from,h.to),h),a.set(st(h.to,h.from),h);const c=(h,g)=>h===void 0||g===void 0?void 0:a.get(st(h,g)),d=h=>Ee(h,g=>i(g))+o*Math.max(0,h.length-1)+s*2<=r,p=[];let m=[],f;const l=()=>{m.length!==0&&(p.push({sliceIds:m,...f===void 0?{}:{cutFrom:f}}),m=[],f=void 0)};for(const h of e.map(g=>g.id)){if(m.length>0&&!d([...m,h])){let g=m.length;for(;c(m[g-1],g===m.length?h:m[g])!==void 0&&(g-=1,g!==0););const x=g===0?[]:m.splice(g),k=g===0?c(m.at(-1),h):c(m.at(-1),x[0]);l(),m=x,f=k}m.push(h)}return l(),p},V=e=>[...e.notes].reverse().find(t=>t.type==="event")??e.notes.at(-1),Nt=(e,t)=>{const n=V(e),i=t.notes[0];if(!(n===void 0||i===void 0))return{from:n.id,to:i.id}},Oe={SET_ELEMENT_NAME:(e,t)=>({title:"\u8981\u7D20\u540D\u3092\u5909\u66F4",tone:"update",body:`"${z(t,e.target.id)?.name??"?"}\u201C \u2192 "${w(y.SET_ELEMENT_NAME,e).name}"`}),SET_ELEMENT_DESCRIPTION:e=>({title:"\u8981\u7D20\u306E\u8AAC\u660E\u3092\u66F4\u65B0",tone:"update",body:`\u2192 "${w(y.SET_ELEMENT_DESCRIPTION,e).description.slice(0,60)}"`}),SET_ELEMENT_TYPE:e=>({title:"\u8981\u7D20\u306E\u7A2E\u5225\u3092\u5909\u66F4",tone:"update",body:`\u2192 ${w(y.SET_ELEMENT_TYPE,e).type}`}),SET_ELEMENT_CONTEXT:e=>({title:"\u6240\u5C5E\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u3092\u5909\u66F4",tone:"move",body:`\u2192 ${w(y.SET_ELEMENT_CONTEXT,e).contextId??"\u672A\u6240\u5C5E"}`}),MOVE_ELEMENT:e=>({title:"\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u4F4D\u7F6E\u3092\u5909\u66F4",tone:"move",body:w(y.MOVE_ELEMENT,e).after===null?"\u2192 \u5148\u982D\u3078":`\u2192 "${w(y.MOVE_ELEMENT,e).after}" \u306E\u76F4\u5F8C\u3078`}),ADD_ELEMENT:e=>({title:"\u8981\u7D20\u3092\u8FFD\u52A0",tone:"create",body:`+ "${w(y.ADD_ELEMENT,e).name}"`}),DELETE_ELEMENT:(e,t)=>({title:"\u8981\u7D20\u3092\u524A\u9664",tone:"delete",body:`\u2212 "${z(t,e.target.id)?.name??e.target.id}"`}),LINK_ELEMENTS:e=>({title:"\u8981\u7D20\u3092\u9023\u7D50",tone:"create",body:`${w(y.LINK_ELEMENTS,e).from} \u2192 ${w(y.LINK_ELEMENTS,e).to}`}),SET_LINK_LABEL:e=>({title:"\u30EA\u30F3\u30AF\u540D\u3092\u5909\u66F4",tone:"update",body:`\u2192 "${w(y.SET_LINK_LABEL,e).label}"`}),UNLINK_ELEMENTS:e=>({title:"\u30EA\u30F3\u30AF\u3092\u524A\u9664",tone:"delete",body:`${w(y.UNLINK_ELEMENTS,e).from} \u2192 ${w(y.UNLINK_ELEMENTS,e).to}`}),ADD_CONTEXT:e=>({title:"\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u3092\u8FFD\u52A0",tone:"create",body:`+ "${w(y.ADD_CONTEXT,e).name}"`}),SET_CONTEXT_NAME:e=>({title:"\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u540D\u3092\u5909\u66F4",tone:"update",body:`\u2192 "${w(y.SET_CONTEXT_NAME,e).name}"`}),DELETE_CONTEXT:(e,t)=>({title:"\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u3092\u524A\u9664",tone:"delete",body:`\u2212 "${Y(t,e.target.id)?.name??e.target.id}"`})},Lt=(e,t,n)=>{const i=Oe[e.type],s=i?i(e,n??t):{title:e.type,tone:"meta"};return{title:s.title,targetLabel:Ct(t,e.target),tone:s.tone,...s.body===void 0?{}:{summary:s.body}}},Ot=e=>`${e.type} ${U(e.target)} ${JSON.stringify(e.payload)}`,Ct=(e,t)=>{switch(t.type){case"element":{const n=z(e,t.id);return n?`\u8981\u7D20 \xB7 ${n.name}`:`\u8981\u7D20 \xB7 ${t.id} (missing)`}case"context":{const n=Y(e,t.id);return n?`\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8 \xB7 ${n.name}`:`\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8 \xB7 ${t.id} (missing)`}case"link":{const n=it(e,t.id);return n?`\u30EA\u30F3\u30AF \xB7 ${n.from}\u2192${n.to}`:`\u30EA\u30F3\u30AF \xB7 ${t.id} (missing)`}case"page":return`\u30DA\u30FC\u30B8 \xB7 ${rt(e)}`;default:return`${t.type} \xB7 ${t.id}`}},Pt=e=>[...e.elements.map(t=>({value:U({type:"element",id:t.id}),label:t.name,group:"\u8981\u7D20"})),...e.contexts.map(t=>({value:U({type:"context",id:t.id}),label:t.name,group:"\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8"}))],Ce=(e,t)=>{const n=e.elements.find(i=>i.id===t.note);return n?{value:U({type:"element",id:n.id}),label:n.name,group:"\u8981\u7D20"}:null},rt=e=>e.title??"Event Storming",zt=(e,t)=>{const n={...t},i=z(e,t.note);t.note!==void 0&&!i&&delete n.note;const o=Y(e,t.context);return t.context!==void 0&&!o&&delete n.context,n},At=(e,t)=>{switch(t.type){case"element":return z(e,t.id)!==void 0;case"context":return Y(e,t.id)!==void 0;case"link":return it(e,t.id)!==void 0;case"page":return!0;default:return!1}},Dt={name:"event-storming",label:"Event Storming",parseBase:wt,emptyBase:$t,actions:y,apply:Tt,canonicalState:Le,hasTarget:At,describe:Lt,serialize:Ot,resolveNavigation:zt,commentTargets:(e,t)=>Pt(e),currentTarget:(e,t)=>Ce(e,t),title:rt},Pe={width:300,height:260},D={actor:"\u30A2\u30AF\u30BF\u30FC",command:"\u30B3\u30DE\u30F3\u30C9",aggregate:"\u96C6\u7D04",event:"\u30A4\u30D9\u30F3\u30C8",policy:"\u30DD\u30EA\u30B7\u30FC",readmodel:"\u30EA\u30FC\u30C9\u30E2\u30C7\u30EB",external:"\u5916\u90E8\u30B7\u30B9\u30C6\u30E0",hotspot:"\u30DB\u30C3\u30C8\u30B9\u30DD\u30C3\u30C8"},ze={event:{bg:"linear-gradient(178deg, #ffbc55, #f8a52e)",ink:"#402703"},command:{bg:"linear-gradient(178deg, #93c9f2, #74b4e8)",ink:"#0e2c4b"},aggregate:{bg:"linear-gradient(178deg, #fff3a6, #fdea7e)",ink:"#4a3a06"},actor:{bg:"linear-gradient(178deg, #ffdf63, #fdd23e)",ink:"#423204"},policy:{bg:"linear-gradient(178deg, #dcc2f7, #c9a6f0)",ink:"#32195c"},readmodel:{bg:"linear-gradient(178deg, #c0e788, #a8dc63)",ink:"#22380a"},external:{bg:"linear-gradient(178deg, #f9bcd3, #f4a0c0)",ink:"#4b1029"},hotspot:{bg:"linear-gradient(178deg, #d63550, #b81c33)",ink:"#ffffff"}},at=e=>{const{bg:t,ink:n}=ze[e];return`--es-note-bg:${t};--es-note-ink:${n}`},Ae=gt`
2
- :host {
3
- display: flex;
4
- flex-direction: column;
5
- /* Top-aligned: the name stays put when the editor takes its place. */
6
- justify-content: flex-start;
7
- position: relative;
8
- box-sizing: border-box;
9
- padding: 16px 9px 8px;
10
- border-radius: 3px;
11
- background: var(--es-note-bg, var(--dpk-paper-raised));
12
- color: var(--es-note-ink, var(--dpk-ink));
13
- box-shadow:
14
- 0 1px 2px rgba(30, 24, 10, 0.14),
15
- 0 5px 10px -4px rgba(30, 24, 10, 0.24);
16
- cursor: pointer;
17
- transform: rotate(var(--es-tilt, 0deg));
18
- transition:
19
- transform 180ms ease,
20
- box-shadow 180ms ease;
21
- overflow: visible;
22
- }
23
-
24
- :host(:hover) {
25
- transform: rotate(0deg) translateY(-2px);
26
- box-shadow:
27
- 0 2px 4px rgba(30, 24, 10, 0.16),
28
- 0 12px 22px -6px rgba(30, 24, 10, 0.3);
29
- z-index: 6;
30
- }
31
-
32
- :host([focused]) {
33
- outline: 2px solid var(--dpk-blue);
34
- outline-offset: 2px;
35
- transform: rotate(0deg);
36
- z-index: 5;
37
- }
38
-
39
- :host([data-mode='editing']),
40
- :host([data-mode='commenting']) {
41
- z-index: 7;
42
- transform: rotate(0deg);
43
- }
44
-
45
- /* --------------------------------------------------- sticky note palette */
46
-
47
- /* Small, faint, top-left: readable when looked for, quiet when not. */
48
- .note-type {
49
- position: absolute;
50
- top: 5px;
51
- left: 7px;
52
- font-family: var(--dpk-mono);
53
- font-size: 8px;
54
- font-weight: 600;
55
- letter-spacing: 0.12em;
56
- opacity: 0.5;
57
- }
58
-
59
- /* Pinned hotspots are small: the type label is off and the name is centered. */
60
- :host([compact]) {
61
- justify-content: center;
62
- padding: 7px 9px 8px;
63
- }
64
-
65
- :host([compact]) .note-type {
66
- display: none;
67
- }
68
-
69
- .note-name {
70
- flex: 1 1 auto;
71
- min-width: 0;
72
- min-height: 0;
73
- font-size: 13px;
74
- font-weight: 680;
75
- line-height: 1.32;
76
- letter-spacing: -0.01em;
77
- overflow-wrap: anywhere;
78
- }
79
-
80
- :host([compact]) .note-name {
81
- flex: 0 1 auto;
82
- font-size: 11.5px;
83
- line-height: 1.3;
84
- }
85
-
86
- /* Comments already left: a passive corner flag, readable without hover. */
87
- .note-flag {
88
- position: absolute;
89
- top: -7px;
90
- right: -7px;
91
- min-width: 17px;
92
- height: 17px;
93
- padding: 0 4px;
94
- border-radius: 999px;
95
- background: var(--dpk-accent);
96
- color: var(--dpk-accent-ink);
97
- font-family: var(--dpk-mono);
98
- font-size: 9.5px;
99
- font-weight: 650;
100
- line-height: 17px;
101
- text-align: center;
102
- box-shadow: 0 1px 4px rgba(217, 73, 32, 0.35);
103
- }
104
-
105
- /* A side rail of round buttons that fades in on hover, like the hotspot chip:
106
- nothing crosses the card's face, and it stays clear of the pins above. */
107
- .note-tools {
108
- position: absolute;
109
- top: 9px;
110
- right: -11px;
111
- z-index: 8;
112
- display: flex;
113
- flex-direction: column;
114
- gap: 3px;
115
- opacity: 0;
116
- pointer-events: none;
117
- transition: opacity 140ms ease;
118
- }
119
-
120
- /* Labelled, not a glyph: the hotspot affordance names itself on the card's
121
- top-right corner. It stays above the pins, which hang above that corner. */
122
- .note-hotspot {
123
- position: absolute;
124
- top: -9px;
125
- right: -4px;
126
- z-index: 9;
127
- padding: 2px 7px;
128
- border: 1px solid color-mix(in srgb, #e02c44 45%, transparent);
129
- border-radius: 999px;
130
- font-size: 9.5px;
131
- font-weight: 620;
132
- white-space: nowrap;
133
- color: var(--dpk-danger);
134
- background: color-mix(in srgb, var(--dpk-paper-raised) 94%, transparent);
135
- box-shadow: var(--dpk-shadow-xs);
136
- cursor: pointer;
137
- opacity: 0;
138
- pointer-events: none;
139
- transition: opacity 140ms ease;
140
- }
141
-
142
- :host(:hover) .note-hotspot,
143
- :host([data-mode='editing']) .note-hotspot,
144
- .note-hotspot:focus-visible {
145
- opacity: 1;
146
- pointer-events: auto;
147
- }
148
-
149
- .note-hotspot:hover {
150
- border-color: #e02c44;
151
- background: var(--dpk-danger-soft);
152
- }
153
-
154
- :host(:hover) .note-tools,
155
- :host([data-mode='commenting']) .note-tools,
156
- .note-tools:focus-within {
157
- opacity: 1;
158
- pointer-events: auto;
159
- }
160
-
161
- .note-tools .dpk-icon-btn {
162
- width: 22px;
163
- height: 22px;
164
- border: 1px solid var(--dpk-rule);
165
- border-radius: 50%;
166
- background: color-mix(in srgb, var(--dpk-paper-raised) 94%, transparent);
167
- backdrop-filter: blur(2px);
168
- box-shadow: var(--dpk-shadow-xs);
169
- }
170
- `;class De extends le{static{this.styles=[pe,Ae,xt]}static{this.properties={note:{attribute:!1},notes:{attribute:!1},mode:{type:String,reflect:!0,attribute:"data-mode"},focused:{type:Boolean,reflect:!0},compact:{type:Boolean,reflect:!0},onIntent:{attribute:!1}}}#t="";#d=new kt(this);constructor(){super(),this.note=null,this.notes=[],this.mode="view",this.focused=!1,this.compact=!1,this.onIntent=null,this.addEventListener("click",()=>this.#n({kind:"select"}))}updated(t){if(t.has("note")&&this.note&&(this.setAttribute("data-type",this.note.type),this.note.description===void 0?this.removeAttribute("title"):this.setAttribute("title",this.note.description)),t.has("mode")&&(this.mode!=="commenting"&&(this.#t=""),this.mode==="editing"&&this.renderRoot.querySelector("dpk-component-inline-edit")?.startEditing()),this.mode!=="commenting")return;const n=this.renderRoot.querySelector(".comment-pop"),i=this.renderRoot.querySelector('[data-role="comment"]');n&&i&&this.#d.open(n,i,Pe)}render(){const t=this.note;return t?v`
171
- <div class="note-type">${D[t.type]}</div>
172
- <dpk-component-inline-edit
173
- class="note-name"
174
- ?wrap=${!0}
175
- ?seamless=${!0}
176
- .value=${t.name}
177
- .label=${"\u4ED8\u7B8B\u540D"}
178
- @dpk-commit=${ke(n=>this.#n({kind:"rename",name:n}))}
179
- ></dpk-component-inline-edit>
180
- ${this.notes.length>0?v`<span class="note-flag">${this.notes.length}</span>`:M}
181
- ${t.type==="hotspot"?M:v`<button
182
- class="note-hotspot"
183
- type="button"
184
- data-role="hotspot"
185
- title="この付箋にホットスポットを立てる"
186
- @click=${this.#s(()=>({kind:"add-hotspot"}))}
187
- >
188
- + ホットスポット
189
- </button>`}
190
- <div class="note-tools">
191
- <button
192
- class="dpk-icon-btn"
193
- type="button"
194
- data-role="comment"
195
- aria-label="コメント"
196
- data-active=${String(this.mode==="commenting")}
197
- @click=${this.#s(()=>({kind:"toggle-comment"}))}
198
- >
199
- ${he()}
200
- </button>
201
- <button
202
- class="dpk-icon-btn"
203
- type="button"
204
- data-role="delete"
205
- aria-label="削除"
206
- @click=${this.#s(()=>({kind:"delete"}))}
207
- >
208
- ${me()}
209
- </button>
210
- </div>
211
- ${this.mode==="commenting"?this.#c():M}
212
- `:M}#c(){return xe(be(this.#t,this.notes.map(ue)),t=>{t.kind==="input"?(this.#t=t.body,this.requestUpdate()):this.#n(t)})}#s(t){return n=>{n.stopPropagation(),this.#n(t(n))}}#n(t){this.onIntent?.(t)}}const Xe=()=>{customElements.get("dpk-internal-event-storming-note")||customElements.define("dpk-internal-event-storming-note",De)},dt=.25,Xt=2,Rt=(e,t,n)=>({...e,panX:e.panX+t,panY:e.panY+n}),ct=(e,t,n,i)=>{const o=Et(e.zoom*i,dt,Xt),s=(t-e.panX)/e.zoom,r=(n-e.panY)/e.zoom;return{panX:t-s*o,panY:n-r*o,zoom:o}},Bt=(e,t,n)=>{const i=Math.max(1,t.width-n*2),o=Math.max(1,t.height-n*2),s=Math.max(dt,Math.min(1,i/Math.max(1,e.width),o/Math.max(1,e.height)));return{panX:(t.width-e.width*s)/2,panY:(t.height-e.height*s)/2,zoom:s}},Yt=(e,t,n,i)=>{const o=(s,r,a,c)=>{const d=a*e.zoom;return d<=c?(c-d)/2-r*e.zoom:Math.min(-r*e.zoom,Math.max(c-(r+a)*e.zoom,s))};return{zoom:e.zoom,panX:o(e.panX,-i,t.width+i*2,n.width),panY:o(e.panY,-i,t.height+i*2,n.height)}},Re=(e,t,n)=>t>=e.left&&t<=e.left+e.width&&n>=e.top&&n<=e.top+e.height,lt=(e,t,n)=>{for(let i=e.length-1;i>=0;i-=1){const o=e[i];if(o!==void 0&&Re(o.rect,t,n))return o.id}},Kt=(e,t)=>t<e.left+e.width/2?"before":"after",Wt=(e,t)=>e.filter(({rect:n})=>n.left<t.left+t.width&&t.left<n.left+n.width&&n.top<t.top+t.height&&t.top<n.top+n.height).map(({id:n})=>n),pt=(e,t,n,i)=>{const o=new Set(t);if(n.some(p=>o.has(p)))return[];const s=e.filter(p=>!o.has(p)),r=n.map(p=>s.indexOf(p)).filter(p=>p>=0);if(r.length===0)return[];const a=i==="before"?Math.min(...r):Math.max(...r)+1,c=[];let d=s[a-1]??null;for(const p of e)o.has(p)&&(c.push({id:p,after:d}),d=p);return c},Ht=(e,t,n,i)=>{const o=pt(e,t,n,i);if(o.length===0)return o;const s=[...e];for(const r of o){const a=s.indexOf(r.id),c=a<0?void 0:s[a];c!==void 0&&(s.splice(a,1),s.splice(r.after===null?0:s.indexOf(r.after)+1,0,c))}return fe(s,e)?[]:o},Vt=(e,t,n,i=4)=>{if(t.pointerId!==e.pointerId)return e;const{point:o}=t,s={pointerId:e.pointerId,start:e.start,current:o,moved:e.moved||Math.hypot(o.x-e.start.x,o.y-e.start.y)>i},r=lt(n,o.x,o.y);switch(e.kind){case"connect":return{...s,kind:"connect",fromSliceId:e.fromSliceId,...r!==void 0&&r!==e.fromSliceId?{targetSliceId:r}:{}};case"move-slice":{const a=n.find(c=>c.id===r)?.rect;return{...s,kind:"move-slice",sliceId:e.sliceId,...r!==void 0&&r!==e.sliceId&&a!==void 0?{drop:{sliceId:r,side:Kt(a,o.x)}}:{}}}case"select":return{...s,kind:"select"}}},L={kind:"idle"},qt=(e,t)=>e.kind==="editing"&&e.noteId===t?"editing":e.kind==="commenting"&&e.noteId===t?"commenting":"view",Ft=(e,t,n)=>{switch(n.kind){case"toggle-comment":return e.kind==="commenting"&&e.noteId===t?L:{kind:"commenting",noteId:t};case"comment":case"delete":case"dismiss":return L;case"select":case"add-hotspot":return e;case"rename":return e.kind==="editing"&&e.noteId===t?L:e}},q=132,Ut=96,ht=10,mt=24,J=12,P=Ut+J*2,Q=46,tt=16,jt=44,Gt=40,ut=16,Zt=13,K=8,Be=6,Jt=92,Qt=54,te=72,ee=Qt+4,Ye=e=>Math.max(jt,te+(e-1)*ee-J),Ke=["actor","command","aggregate","event","policy","readmodel","external"],ne=e=>mt*2+e*q+(e-1)*ht,We=e=>{if(e===void 0)return 0;const t=new Map;for(const n of e.pins)t.set(n.targetId,(t.get(n.targetId)??0)+1);return Math.max(0,...t.values())},He=(e,t,n)=>{const i=new Map(t.map(l=>[l.id,ne(l.notes.length)])),o=Mt(e,t),s=_t(t,o,{widthOf:l=>i.get(l)??0,gapX:Q,padX:tt,maxWidth:Math.max(n,ne(1))}),r=new Map,a=new Map,c=new Map,d=new Map(t.map(l=>[l.id,l]));let p=K;const m=s.map((l,h)=>{const g=l.cutFrom===void 0?void 0:a.get(l.cutFrom.from),x=g===void 0?0:Math.max(0,g-tt);let k=x+tt;const u=Ye(Math.max(1,...l.sliceIds.map(O=>We(d.get(O)))));for(const O of l.sliceIds)r.set(O,k-x),a.set(O,k),c.set(O,h),k+=(i.get(O)??0)+Q;const _=u+P+Gt,X={sliceIds:l.sliceIds,x,width:k-Q+tt-x,height:_,y:p,head:u,cutFrom:l.cutFrom};return p+=_+Be,X}),f=m.at(-1);return{slices:t,bands:m,xOf:r,absXOf:a,bandOf:c,widthOf:i,arrows:o,width:Math.max(0,...m.map(l=>l.x+l.width))+K*2,height:f===void 0?K*2:f.y+f.height+K}},Ve=e=>{const{context:t,maxRowWidth:n,viewport:i,handlers:o}=e,{state:s}=t,r=24*i.zoom,a=`background-size:${r}px ${r}px;background-position:${i.panX}px ${i.panY}px`;if(s.elements.length===0)return v`<div class="board-viewport board-viewport--empty" style=${a}>
213
- <div class="empty">
214
- <h2>付箋がまだありません</h2>
215
- <p>イベントストーミングを開始しましょう。ドメインイベントを時系列に貼るところから始めます。</p>
216
- <button class="dpk-btn dpk-btn--accent" type="button" @click=${()=>o.addFirst()}>
217
- + 最初のイベント
218
- </button>
219
- </div>
220
- </div>`;const c=A(s),d=He(s,c,n);return v`
221
- <div
222
- class="board-viewport${e.gesture!==void 0?" board-viewport--gesturing":""}"
223
- data-testid="es-viewport"
224
- tabindex="0"
225
- style=${a}
226
- @pointerdown=${o.viewportPointerDown}
227
- @pointermove=${o.viewportPointerMove}
228
- @pointerup=${o.viewportPointerUp}
229
- @pointercancel=${o.viewportPointerCancel}
230
- @pointerleave=${o.viewportPointerLeave}
231
- @wheel=${o.viewportWheel}
232
- @keydown=${o.keyDown}
233
- >
234
- <div
235
- class="board-content"
236
- style=${`transform:translate(${i.panX}px, ${i.panY}px) scale(${i.zoom})`}
237
- >
238
- <div class="wall" data-testid="es-wall" style=${`width:${d.width}px;height:${d.height}px`}>
239
- ${tn(e,d)}
240
- ${d.bands.map((p,m)=>Fe(e,d,p,m))}
241
- </div>
242
- </div>
243
- ${je(e.gesture)} ${Ge(s,c)} ${Ze(e)}
244
- ${Je(e)}
245
- </div>
246
- `},qe=(e,t)=>{const n=["slice"];e.selectedSliceIds.includes(t.id)&&n.push("slice--selected");const i=e.gesture;return i?.kind==="connect"&&i.moved&&(i.fromSliceId!==t.id&&n.push("slice--candidate"),i.targetSliceId===t.id&&n.push("slice--target")),i?.kind==="move-slice"&&i.moved&&(i.sliceId===t.id&&n.push("slice--lifted"),i.drop?.sliceId===t.id&&n.push(i.drop.side==="before"?"slice--insert-before":"slice--insert-after")),n.join(" ")},Fe=(e,t,n,i)=>{const{context:o,mode:s,gesture:r,hoverSliceId:a,handlers:c}=e,{navigation:d}=o,p=n.sliceIds.flatMap(l=>t.slices.filter(h=>h.id===l)),m=l=>({x:t.xOf.get(l.id)??0,y:n.head,w:t.widthOf.get(l.id)??0}),f=(l,h,g=!1)=>v`<dpk-internal-event-storming-note
247
- style=${h}
248
- .note=${l}
249
- .notes=${o.comments.filter(x=>x.target.type==="element"&&x.target.id===l.id)}
250
- .mode=${qt(s,l.id)}
251
- ?focused=${d.note===l.id}
252
- ?compact=${g}
253
- .onIntent=${x=>c.noteIntent(l.id,x)}
254
- ></dpk-internal-event-storming-note>`;return v`
255
- <section class="band" data-band=${i} style=${`left:${K+n.x}px;top:${n.y}px`}>
256
- <div class="band-canvas" style=${`width:${n.width}px;height:${n.height}px`}>
257
- ${Ue(e,t,i)}
258
- ${p.map(l=>{const{x:h,y:g,w:x}=m(l);return v`<div
259
- class=${qe(e,l)}
260
- data-slice-id=${l.id}
261
- style=${`left:${h}px;top:${g}px;width:${x}px;height:${P}px`}
262
- @pointerdown=${k=>c.slicePointerDown(l.id,k)}
263
- ></div>`})}
264
- ${bt(p.flatMap(l=>l.notes.map((h,g)=>({slice:l,note:h,slot:g}))),({note:l})=>l.id,({slice:l,note:h,slot:g})=>{const{x,y:k}=m(l),u=x+mt+g*(q+ht);return f(h,`${at(h.type)};position:absolute;left:${u}px;top:${k+J}px;width:${q}px;height:${Ut}px;--es-tilt:${on(h.id)}deg;z-index:2`)})}
265
- ${bt(p.flatMap(l=>{const h=m(l);return l.notes.flatMap((g,x)=>l.pins.filter(u=>u.targetId===g.id).map((u,_)=>({pin:u,slot:x,index:_,at:h})))}),({pin:l})=>l.note.id,({pin:l,slot:h,index:g,at:x})=>{const k=x.x+mt+h*(q+ht),u=x.y+J;return f(l.note,`${at(l.note.type)};position:absolute;left:${k+q-Jt-6-g*10}px;top:${u-te-g*ee}px;width:${Jt}px;height:${Qt}px;--es-tilt:-2.4deg;z-index:3`,!0)})}
266
- ${p.map(l=>{const{x:h,y:g,w:x}=m(l),k=a===l.id||r?.kind==="connect"&&r.fromSliceId===l.id;return v`<button
267
- class="slice-port${k?" slice-port--on":""}"
268
- type="button"
269
- style=${`left:${h+x-Zt}px;top:${g+P/2-Zt}px`}
270
- aria-label="続きを追加(種類を選んで追加 / ドラッグで他のスライスへ接続)"
271
- title="クリック: 続きの付箋を選んで追加 / ドラッグ: 他のスライスへ接続"
272
- @pointerdown=${u=>c.portPointerDown(l.id,u)}
273
- >
274
- →
275
- </button>`})}
276
- ${p.map(l=>{if(a!==l.id||r!==void 0)return M;const{x:h,y:g}=m(l),x=new Set(l.notes.map(u=>u.type)),k=Ke.filter(u=>!x.has(u));return v`<div
277
- class="slice-chips"
278
- style=${`left:${h}px;top:${g+P+6}px`}
279
- @pointerdown=${u=>u.stopPropagation()}
280
- >
281
- ${k.map(u=>v`<button class="slice-chip" type="button" @click=${()=>c.attachNote(l.id,u)}>
282
- + ${D[u]}
283
- </button>`)}
284
- </div>`})}
285
- </div>
286
- </section>
287
- `},Ue=(e,t,n)=>{const{context:i,handlers:o}=e,s=i.state.contexts.flatMap((r,a)=>{const d=t.slices.filter(u=>u.contextId===r.id).flatMap(u=>{const _=t.xOf.get(u.id),X=t.bandOf.get(u.id);return _===void 0||X===void 0?[]:[{x:_,band:X,width:t.widthOf.get(u.id)??0}]}),p=d.filter(u=>u.band===n);if(p.length===0)return[];const m=Math.min(...p.map(u=>u.x))-10,f=Math.max(...p.map(u=>u.x+u.width))+10,l=14,h=(t.bands[n]?.head??jt)+P+12,g=d.some(u=>u.band<n)?"\u2026 ":"",x=d.some(u=>u.band>n)?" \u2026":"",k=String(a%5);return[v`<div
288
- class="context-region"
289
- data-hue=${k}
290
- style=${`left:${m}px;top:${l}px;width:${f-m}px;height:${h-l}px`}
291
- title=${r.description??r.name}
292
- ></div>
293
- <div
294
- class="context-label"
295
- data-hue=${k}
296
- style=${`left:${m+10}px;top:${l}px`}
297
- @pointerdown=${u=>u.stopPropagation()}
298
- >
299
- <button
300
- class="context-label-name"
301
- type="button"
302
- title="クリックして名前を変更"
303
- @click=${u=>o.renameContext(r.id,{x:u.clientX,y:u.clientY})}
304
- >
305
- ${g}${r.name}${x}
306
- </button>
307
- <button
308
- class="context-label-x"
309
- type="button"
310
- aria-label=${`\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u300C${r.name}\u300D\u3092\u89E3\u4F53`}
311
- title="コンテキストを解体(付箋は残ります)"
312
- @click=${()=>o.dissolveContext(r.id)}
313
- >
314
- ✕
315
- </button>
316
- </div>`]});return s.length>0?v`${s}`:M},je=e=>{if(e===void 0||!e.moved)return M;if(e.kind==="connect")return v`<svg class="gesture-layer" aria-hidden="true">
317
- ${B`<path class="connect-line" d=${`M ${e.start.x} ${e.start.y} L ${e.current.x} ${e.current.y}`}></path>
318
- <circle class="connect-tip" cx=${e.current.x} cy=${e.current.y} r="5"></circle>`}
319
- </svg>`;if(e.kind==="select"){const t=Math.min(e.start.x,e.current.x),n=Math.min(e.start.y,e.current.y),i=Math.abs(e.current.x-e.start.x),o=Math.abs(e.current.y-e.start.y);return v`<div
320
- class="select-rect"
321
- style=${`left:${t}px;top:${n}px;width:${i}px;height:${o}px`}
322
- ></div>`}return M},Ge=(e,t)=>v`<div class="board-hud">
323
- <span>${e.elements.length} 付箋</span>
324
- <span>${t.length} スライス</span>
325
- <span>${e.contexts.length} コンテキスト</span>
326
- <span class="board-hint">ホイール: 移動 · ピンチ: ズーム · 背景ドラッグ: 範囲選択</span>
327
- </div>`,Ze=e=>{const{viewport:t,handlers:n}=e;return v`<div class="board-zoom" @pointerdown=${i=>i.stopPropagation()}>
328
- <button type="button" aria-label="縮小" @click=${()=>n.zoomStep(-1)}>−</button>
329
- <button type="button" class="board-zoom-pct" title="100% に戻す" @click=${()=>n.zoomReset()}>
330
- ${Math.round(t.zoom*100)}%
331
- </button>
332
- <button type="button" aria-label="拡大" @click=${()=>n.zoomStep(1)}>+</button>
333
- <button type="button" aria-label="全体を表示" title="全体を表示" @click=${()=>n.zoomFit()}>⛶</button>
334
- </div>`},Je=e=>{const{context:t,selectedSliceIds:n,selectedLinkIds:i,handlers:o}=e;if(i.length===0&&n.length===0)return M;const s=t.state.contexts;return i.length>0?v`<div class="board-selection" @pointerdown=${r=>r.stopPropagation()}>
335
- <span class="board-selection-count">${i.length} 本のリンクを選択中</span>
336
- <button class="dpk-btn dpk-btn--accent" type="button" @click=${()=>o.deleteSelection()}>
337
- リンクを削除
338
- </button>
339
- <span class="board-selection-hint">Delete でも削除できます</span>
340
- <button class="dpk-icon-btn" type="button" aria-label="選択解除" @click=${()=>o.clearSelection()}>
341
- ✕
342
- </button>
343
- </div>`:v`<div class="board-selection" @pointerdown=${r=>r.stopPropagation()}>
344
- <span class="board-selection-count">${n.length} スライスを選択中</span>
345
- <button
346
- class="dpk-btn dpk-btn--accent"
347
- type="button"
348
- @click=${r=>o.groupSelection({x:r.clientX,y:r.clientY})}
349
- >
350
- コンテキストにまとめる
351
- </button>
352
- ${s.length>0?v`<select
353
- class="dpk-select"
354
- aria-label="既存コンテキストへ追加"
355
- @change=${r=>{const a=ge(r.target,HTMLSelectElement);a!==null&&(a.value!==""&&o.assignSelection(a.value),a.value="")}}
356
- >
357
- <option value="" selected>既存へ追加…</option>
358
- ${s.map(r=>v`<option value=${r.id}>${r.name}</option>`)}
359
- </select>`:M}
360
- <button class="dpk-btn" type="button" @click=${()=>o.stripSelectionContext()}>コンテキスト解除</button>
361
- <button class="dpk-btn" type="button" @click=${()=>o.deleteSelection()}>削除</button>
362
- <button class="dpk-icon-btn" type="button" aria-label="選択解除" @click=${()=>o.clearSelection()}>
363
- ✕
364
- </button>
365
- </div>`},oe=(e,t,n,i)=>({d:`M ${e.x} ${e.y} C ${t.x} ${t.y}, ${n.x} ${n.y}, ${i.x} ${i.y}`,mid:{x:(e.x+3*t.x+3*n.x+i.x)/8,y:(e.y+3*t.y+3*n.y+i.y)/8}}),Qe=()=>B`<marker id="es-arrow" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
366
- <path d="M0,0 L8,4 L0,8 z"></path>
367
- </marker>`,tn=(e,t)=>{const n="url(#es-arrow)",i=[],o=a=>{const c=t.absXOf.get(a),d=t.bandOf.get(a),p=d===void 0?void 0:t.bands[d];if(!(c===void 0||d===void 0||p===void 0))return{x:K+c,y:p.y+p.head,w:t.widthOf.get(a)??0,band:d}},s=a=>{const c=t.bands[a];return c===void 0?0:c.y+c.height},r=(a,c,d,p)=>{i.push(B`<path class="link-hit" d=${c} @pointerdown=${l=>l.stopPropagation()} @click=${l=>e.handlers.linkClick(a.id,l.shiftKey||l.metaKey||l.ctrlKey)}></path>`);const m=e.selectedLinkIds.includes(a.id)?" is-selected":"";if(i.push(B`<path class="link-path${m}" d=${c} marker-end=${n}></path>`),a.label===void 0)return;const f={start:6,end:-6,middle:0}[p];i.push(B`<text class="link-label" x=${d.x+f} y=${d.y-6} text-anchor=${p}>${a.label}</text>`)};for(const a of t.arrows){const c=o(a.from),d=o(a.to);if(c===void 0||d===void 0)continue;if(c.band===d.band){const x=d.x>=c.x+c.w;if((x?d.x-(c.x+c.w):c.x-(d.x+d.w))<=Q+2){const _=c.y+P/2,X=x?c.x+c.w:c.x,O=x?d.x:d.x+d.w;r(a,`M ${X} ${_} L ${O} ${_}`,{x:(X+O)/2,y:_},"middle");continue}const u=en(c,d,s(c.band)-Gt/2);r(a,u.d,u.mid,"middle");continue}const p=c.y<d.y,m=c.x+ut,f=Et(m,d.x+ut,d.x+d.w-ut),l={x:m,y:p?c.y+P:c.y},h={x:f,y:p?d.y:d.y+P},g=p?(s(c.band)+(t.bands[d.band]?.y??0))/2:(s(d.band)+(t.bands[c.band]?.y??0))/2;r(a,nn([l,{x:l.x,y:g},{x:h.x,y:g},h]),{x:h.x-6,y:g},"end")}return B`<svg class="links-layer" width=${t.width} height=${t.height}>
368
- <defs>${Qe()}</defs>
369
- ${i}
370
- </svg>`},en=(e,t,n)=>{const i=e.y+P;if(t.x>=e.x+e.w){const r={x:e.x+e.w-18,y:i},a={x:t.x+18,y:i};return oe(r,{x:r.x+48,y:n},{x:a.x-48,y:n},a)}const o={x:e.x+18,y:i},s={x:t.x+t.w-18,y:i};return oe(o,{x:o.x-48,y:n},{x:s.x+48,y:n},s)},nn=(e,t=10)=>{let n=`M ${e[0]?.x??0} ${e[0]?.y??0}`;for(let o=1;o<e.length-1;o+=1){const s=e[o-1],r=e[o],a=e[o+1];if(s===void 0||r===void 0||a===void 0)continue;const c=Math.sign(r.x-s.x),d=Math.sign(r.y-s.y),p=Math.sign(a.x-r.x),m=Math.sign(a.y-r.y),f=Math.hypot(r.x-s.x,r.y-s.y),l=Math.hypot(a.x-r.x,a.y-r.y),h=Math.max(0,Math.min(t,f/2,l/2));n+=` L ${r.x-c*h} ${r.y-d*h} Q ${r.x} ${r.y} ${r.x+p*h} ${r.y+m*h}`}const i=e.at(-1);return i===void 0?n:`${n} L ${i.x} ${i.y}`},on=e=>{let t=0;for(const n of e)t=(t*31+n.charCodeAt(0))%997;return(t%17-8)*.09},sn=gt`
371
- /* The board owns the whole main area; the viewport clips, never the shell. */
372
- .dpk-main {
373
- overflow: hidden;
374
- }
375
-
376
- .dpk-main-body {
377
- flex: 1 1 auto;
378
- min-height: 0;
379
- display: flex;
380
- flex-direction: column;
381
- padding: 0;
382
- gap: 0;
383
- }
384
-
385
- /* ------------------------------------------------------------- viewport */
386
-
387
- /* An infinite pannable surface; the dot grid scrolls with the content
388
- (background-position/-size are set inline from the viewport state). */
389
- .board-viewport {
390
- position: relative;
391
- flex: 1 1 auto;
392
- min-height: 0;
393
- overflow: hidden;
394
- touch-action: none;
395
- background-color: var(--dpk-paper);
396
- background-image: radial-gradient(circle, var(--dpk-rule) 1px, transparent 1px);
397
- }
398
-
399
- .board-viewport--gesturing,
400
- .board-viewport--gesturing * {
401
- user-select: none;
402
- }
403
-
404
- .board-viewport--empty {
405
- display: grid;
406
- place-items: center;
407
- padding: 24px;
408
- }
409
-
410
- .board-viewport:focus-visible {
411
- outline: none;
412
- box-shadow: inset var(--dpk-focus);
413
- }
414
-
415
- .board-content {
416
- position: absolute;
417
- left: 0;
418
- top: 0;
419
- width: max-content;
420
- transform-origin: 0 0;
421
- will-change: transform;
422
- }
423
-
424
- /* The wall is a fixed-size canvas: bands and the arrow layer are placed inside
425
- it at explicit coordinates, so an arrow may span several bands. */
426
- .wall {
427
- position: relative;
428
- }
429
-
430
- .band {
431
- position: absolute;
432
- display: flex;
433
- align-items: flex-start;
434
- }
435
-
436
- .band-canvas {
437
- position: relative;
438
- flex: 0 0 auto;
439
- }
440
-
441
- /* ---------------------------------------------------------------- slices */
442
-
443
- /* One causal slice: its notes framed together, read left to right.
444
- The frame is also the drag handle for moving the whole slice. */
445
- .slice {
446
- position: absolute;
447
- z-index: 1;
448
- border: 1px solid var(--dpk-rule-strong);
449
- border-radius: 12px;
450
- background: color-mix(in srgb, var(--dpk-paper-raised) 78%, transparent);
451
- box-shadow: var(--dpk-shadow-xs);
452
- cursor: grab;
453
- }
454
-
455
- .slice--selected {
456
- border-color: var(--dpk-blue);
457
- box-shadow:
458
- 0 0 0 2px var(--dpk-blue-soft),
459
- var(--dpk-shadow-xs);
460
- }
461
-
462
- /* While a connection drag is out: everywhere it may land lights up dashed… */
463
- .slice--candidate {
464
- border: 1.5px dashed color-mix(in srgb, var(--dpk-blue) 55%, transparent);
465
- }
466
-
467
- /* …and the slice under the cursor confirms the landing. */
468
- .slice--target {
469
- border: 1.5px solid var(--dpk-blue);
470
- background: color-mix(in srgb, var(--dpk-blue-soft) 55%, transparent);
471
- box-shadow:
472
- 0 0 0 3px var(--dpk-blue-soft),
473
- var(--dpk-shadow-sm);
474
- }
475
-
476
- /* The slice being carried by a move drag. */
477
- .slice--lifted {
478
- opacity: 0.45;
479
- border-style: dashed;
480
- cursor: grabbing;
481
- }
482
-
483
- /* Insertion bar on the side of the drop target the slice will land on. */
484
- .slice--insert-before::before,
485
- .slice--insert-after::after {
486
- content: '';
487
- position: absolute;
488
- top: -6px;
489
- bottom: -6px;
490
- width: 3px;
491
- border-radius: 2px;
492
- background: var(--dpk-blue);
493
- }
494
-
495
- .slice--insert-before::before {
496
- left: -10px;
497
- }
498
-
499
- .slice--insert-after::after {
500
- right: -10px;
501
- }
502
-
503
- /* Connection port on a slice's right edge: click continues, drag connects.
504
- Shown only for the hovered slice (hover is hit-tested by the element,
505
- with padding, so it stays up while the cursor crosses over to it). */
506
- .slice-port {
507
- position: absolute;
508
- z-index: 5;
509
- width: 26px;
510
- height: 26px;
511
- border: 1px solid var(--dpk-rule-strong);
512
- border-radius: 50%;
513
- background: var(--dpk-paper-raised);
514
- color: var(--dpk-ink-soft);
515
- font-size: 13px;
516
- line-height: 1;
517
- box-shadow: var(--dpk-shadow-xs);
518
- cursor: crosshair;
519
- opacity: 0;
520
- pointer-events: none;
521
- transition:
522
- opacity 120ms ease,
523
- border-color 120ms ease;
524
- }
525
-
526
- .slice-port--on,
527
- .slice-port:focus-visible {
528
- opacity: 1;
529
- pointer-events: auto;
530
- }
531
-
532
- .slice-port:hover {
533
- border-color: var(--dpk-blue);
534
- color: var(--dpk-blue);
535
- }
536
-
537
- /* Add-note chips under the hovered slice: the roles it is still missing. */
538
- .slice-chips {
539
- position: absolute;
540
- z-index: 6;
541
- display: flex;
542
- gap: 4px;
543
- padding: 2px 0;
544
- }
545
-
546
- .slice-chip {
547
- border: 1px dashed var(--dpk-rule-strong);
548
- border-radius: 999px;
549
- padding: 3px 9px;
550
- font-size: 10.5px;
551
- font-weight: 620;
552
- white-space: nowrap;
553
- color: var(--dpk-ink-soft);
554
- background: color-mix(in srgb, var(--dpk-paper-raised) 88%, transparent);
555
- cursor: pointer;
556
- transition:
557
- border-color 120ms ease,
558
- color 120ms ease;
559
- }
560
-
561
- .slice-chip:hover {
562
- border-color: var(--dpk-blue);
563
- color: var(--dpk-blue);
564
- }
565
-
566
- /* ------------------------------------------------------ bounded contexts */
567
-
568
- .context-region[data-hue='0'],
569
- .context-label[data-hue='0'] {
570
- --ctx-rgb: 51, 102, 204;
571
- }
572
- .context-region[data-hue='1'],
573
- .context-label[data-hue='1'] {
574
- --ctx-rgb: 13, 148, 136;
575
- }
576
- .context-region[data-hue='2'],
577
- .context-label[data-hue='2'] {
578
- --ctx-rgb: 174, 110, 6;
579
- }
580
- .context-region[data-hue='3'],
581
- .context-label[data-hue='3'] {
582
- --ctx-rgb: 124, 58, 237;
583
- }
584
- .context-region[data-hue='4'],
585
- .context-label[data-hue='4'] {
586
- --ctx-rgb: 190, 50, 100;
587
- }
588
-
589
- .context-region {
590
- position: absolute;
591
- z-index: 0;
592
- border: 1.5px dashed rgba(var(--ctx-rgb), 0.33);
593
- border-radius: 10px;
594
- background: rgba(var(--ctx-rgb), 0.05);
595
- pointer-events: none;
596
- }
597
-
598
- /* The label rides the region's top edge and carries the rename/dissolve UI. */
599
- .context-label {
600
- position: absolute;
601
- z-index: 7;
602
- transform: translateY(-55%);
603
- display: flex;
604
- align-items: center;
605
- gap: 4px;
606
- }
607
-
608
- .context-label-name {
609
- border: none;
610
- border-radius: 999px;
611
- padding: 3px 10px;
612
- font-family: var(--dpk-mono);
613
- font-size: 9.5px;
614
- font-weight: 650;
615
- letter-spacing: 0.13em;
616
- text-transform: uppercase;
617
- white-space: nowrap;
618
- color: #fff;
619
- background: rgba(var(--ctx-rgb), 0.9);
620
- cursor: pointer;
621
- box-shadow: var(--dpk-shadow-xs);
622
- }
623
-
624
- .context-label-name:hover {
625
- background: rgba(var(--ctx-rgb), 1);
626
- }
627
-
628
- .context-label-x {
629
- width: 18px;
630
- height: 18px;
631
- border: none;
632
- border-radius: 50%;
633
- font-size: 9px;
634
- line-height: 1;
635
- color: rgba(var(--ctx-rgb), 0.9);
636
- background: color-mix(in srgb, var(--dpk-paper-raised) 92%, transparent);
637
- box-shadow: var(--dpk-shadow-xs);
638
- cursor: pointer;
639
- opacity: 0;
640
- transition: opacity 120ms ease;
641
- }
642
-
643
- .context-label:hover .context-label-x,
644
- .context-label-x:focus-visible {
645
- opacity: 1;
646
- }
647
-
648
- /* ---------------------------------------------------------------- arrows */
649
-
650
- .links-layer {
651
- position: absolute;
652
- inset: 0;
653
- /* Causality strokes are annotations drawn over the wall. */
654
- z-index: 4;
655
- pointer-events: none;
656
- overflow: visible;
657
- }
658
-
659
- /* Stroke must come from a stylesheet, not a presentation attribute:
660
- a var() inside stroke="..." is not substituted and the line stays invisible. */
661
- .link-path {
662
- fill: none;
663
- stroke: var(--dpk-ink-soft);
664
- stroke-width: 1.6;
665
- stroke-linecap: round;
666
- opacity: 0.6;
667
- }
668
-
669
- /* Invisible fat stroke on top of the line: a mistaken connection is easy to
670
- pick, and picking it never starts a wall gesture. */
671
- .link-hit {
672
- fill: none;
673
- stroke: transparent;
674
- stroke-width: 14;
675
- stroke-linecap: round;
676
- pointer-events: stroke;
677
- cursor: pointer;
678
- }
679
-
680
- .link-path.is-selected {
681
- stroke: var(--dpk-blue);
682
- stroke-width: 2.6;
683
- opacity: 1;
684
- }
685
-
686
- .link-label {
687
- font-family: var(--dpk-mono);
688
- font-size: 9px;
689
- letter-spacing: 0.06em;
690
- fill: var(--dpk-ink-soft);
691
- paint-order: stroke;
692
- stroke: var(--dpk-paper-raised);
693
- stroke-width: 3;
694
- stroke-linejoin: round;
695
- }
696
-
697
- .links-layer marker path {
698
- fill: var(--dpk-ink-soft);
699
- opacity: 0.75;
700
- }
701
-
702
- /* --------------------------------------------------------------- gesture */
703
-
704
- /* Overlays live in viewport space, above the transformed content. */
705
- .gesture-layer {
706
- position: absolute;
707
- inset: 0;
708
- z-index: 30;
709
- width: 100%;
710
- height: 100%;
711
- pointer-events: none;
712
- overflow: visible;
713
- }
714
-
715
- .connect-line {
716
- fill: none;
717
- stroke: var(--dpk-blue);
718
- stroke-width: 2;
719
- stroke-linecap: round;
720
- stroke-dasharray: 6 4;
721
- }
722
-
723
- .connect-tip {
724
- fill: var(--dpk-blue);
725
- }
726
-
727
- .select-rect {
728
- position: absolute;
729
- z-index: 30;
730
- border: 1px solid var(--dpk-blue);
731
- background: color-mix(in srgb, var(--dpk-blue-soft) 40%, transparent);
732
- pointer-events: none;
733
- }
734
-
735
- /* ------------------------------------------------------------ floating UI */
736
-
737
- .board-hud {
738
- position: absolute;
739
- left: 12px;
740
- bottom: 12px;
741
- z-index: 40;
742
- display: flex;
743
- gap: 12px;
744
- align-items: center;
745
- padding: 5px 12px;
746
- border: 1px solid var(--dpk-rule);
747
- border-radius: 999px;
748
- font-family: var(--dpk-mono);
749
- font-size: 10px;
750
- letter-spacing: 0.05em;
751
- color: var(--dpk-ink-faint);
752
- background: color-mix(in srgb, var(--dpk-paper-raised) 82%, transparent);
753
- backdrop-filter: blur(6px);
754
- pointer-events: none;
755
- }
756
-
757
- .board-hint {
758
- color: var(--dpk-ink-faint);
759
- opacity: 0.8;
760
- }
761
-
762
- .board-zoom {
763
- position: absolute;
764
- right: 12px;
765
- bottom: 12px;
766
- z-index: 40;
767
- display: flex;
768
- align-items: center;
769
- border: 1px solid var(--dpk-rule);
770
- border-radius: 8px;
771
- background: color-mix(in srgb, var(--dpk-paper-raised) 88%, transparent);
772
- backdrop-filter: blur(6px);
773
- box-shadow: var(--dpk-shadow-xs);
774
- overflow: hidden;
775
- }
776
-
777
- .board-zoom button {
778
- border: none;
779
- background: transparent;
780
- padding: 6px 10px;
781
- font-size: 12px;
782
- line-height: 1;
783
- color: var(--dpk-ink-soft);
784
- cursor: pointer;
785
- }
786
-
787
- .board-zoom button:hover {
788
- background: var(--dpk-blue-soft);
789
- color: var(--dpk-blue);
790
- }
791
-
792
- .board-zoom .board-zoom-pct {
793
- min-width: 48px;
794
- font-family: var(--dpk-mono);
795
- font-size: 10.5px;
796
- }
797
-
798
- .board-selection {
799
- position: absolute;
800
- left: 50%;
801
- bottom: 14px;
802
- transform: translateX(-50%);
803
- z-index: 45;
804
- display: flex;
805
- gap: 8px;
806
- align-items: center;
807
- padding: 8px 12px;
808
- border: 1px solid var(--dpk-rule-strong);
809
- border-radius: 10px;
810
- background: color-mix(in srgb, var(--dpk-paper-raised) 94%, transparent);
811
- backdrop-filter: blur(6px);
812
- box-shadow: var(--dpk-shadow);
813
- }
814
-
815
- .board-selection-count {
816
- font-family: var(--dpk-mono);
817
- font-size: 10.5px;
818
- color: var(--dpk-ink-soft);
819
- white-space: nowrap;
820
- }
821
-
822
- .board-selection-hint {
823
- font-size: 10.5px;
824
- color: var(--dpk-ink-faint);
825
- white-space: nowrap;
826
- }
827
-
828
- /* ----------------------------------------------------------------- empty */
829
-
830
- .empty {
831
- border: 1px dashed var(--dpk-rule-strong);
832
- border-radius: var(--dpk-radius-lg);
833
- padding: 28px 24px;
834
- background: var(--dpk-paper-raised);
835
- max-width: 560px;
836
- display: grid;
837
- gap: 10px;
838
- box-shadow: var(--dpk-shadow-sm);
839
- justify-items: start;
840
- }
841
-
842
- /* --------------------------------------------------------------- pickers */
843
-
844
- .context-pop {
845
- min-width: 220px;
846
- }
847
-
848
- /* -------------------------------------------------------- append picker */
849
-
850
- /* The palette travels in --es-note-bg/-ink, so a chip previews what it adds. */
851
- .append-menu {
852
- min-width: 220px;
853
- }
854
-
855
- .append-menu .type-options {
856
- display: grid;
857
- grid-template-columns: 1fr 1fr;
858
- gap: 4px;
859
- }
860
-
861
- .type-chip {
862
- border: 1px solid var(--dpk-rule-strong);
863
- border-radius: 4px;
864
- padding: 6px 8px;
865
- font-size: 11px;
866
- font-weight: 620;
867
- text-align: left;
868
- background: var(--es-note-bg, var(--dpk-paper-raised));
869
- color: var(--es-note-ink, var(--dpk-ink));
870
- cursor: pointer;
871
- transition: transform 120ms ease;
872
- }
873
-
874
- .type-chip:hover {
875
- transform: translateY(-1px);
876
- box-shadow: var(--dpk-shadow-sm);
877
- }
878
-
879
- .link-add .dpk-select {
880
- flex: 1 1 auto;
881
- min-width: 0;
882
- }
883
- `,rn={width:260,height:150},an={width:236,height:210},dn=64,cn=["event","command","aggregate","actor","policy","readmodel","external"],ln=1200,ie=5,pn={x:20,top:46,bottom:40};class se extends vt{constructor(){super(),this.definition=Dt,this.#d=new kt(this),this.mode=L,this.boardWidth=ln,this.viewport={panX:24,panY:16,zoom:1},this.gesture=void 0,this.hoverSliceId=void 0,this.selectedSliceIds=[],this.selectedLinkIds=[],this.naming=void 0}static{this.styles=[vt.styles,sn,xt]}static{this.properties={mode:{state:!0},boardWidth:{state:!0},viewport:{state:!0},gesture:{state:!0},hoverSliceId:{state:!0},selectedSliceIds:{state:!0},selectedLinkIds:{state:!0},naming:{state:!0}}}#t;#d;disconnectedCallback(){super.disconnectedCallback(),this.#t?.disconnect(),this.#t=void 0}firstUpdated(){typeof ResizeObserver>"u"||(this.#t=new ResizeObserver(t=>{const n=t[0]?.contentRect.width;n!==void 0&&n>0&&(this.boardWidth=n)}),this.#t.observe(this))}updated(){super.updated(),this.#l(this.viewport),this.mode.kind==="append"&&this.#c("#append-menu",this.mode.point,an),this.naming!==void 0&&this.#c("#context-pop",this.naming.point,rn,"#context-name")}#c(t,n,i,o){const s=this.renderRoot.querySelector(t);if(!s||s.matches(":popover-open")||(this.#d.open(s,ve(n.x,n.y),i),o===void 0))return;const r=this.renderRoot.querySelector(o);r?.focus(),r instanceof HTMLInputElement&&r.select()}#s(){return Math.max(hn,this.boardWidth-96)}renderRegions(t){return{main:this.#n(t)}}#n(t){return v`
884
- ${Ve({context:t,mode:this.mode,maxRowWidth:this.#s(),viewport:this.viewport,gesture:this.gesture,hoverSliceId:this.hoverSliceId,selectedSliceIds:this.selectedSliceIds,selectedLinkIds:this.selectedLinkIds,handlers:{noteIntent:(n,i)=>this.#T(n,i),addFirst:()=>this.#D(t),attachNote:(n,i)=>this.#L(t,n,i),viewportPointerDown:n=>this.#v(n),viewportPointerMove:n=>this.#k(n),viewportPointerUp:n=>this.#E(t,n),viewportPointerCancel:()=>this.gesture=void 0,viewportPointerLeave:()=>{this.gesture===void 0&&(this.hoverSliceId=void 0)},viewportWheel:n=>this.#y(n),portPointerDown:(n,i)=>this.#x(n,i),slicePointerDown:(n,i)=>this.#b(n,i),zoomStep:n=>this.#w(n),zoomFit:()=>this.#$(),zoomReset:()=>this.#h(1/this.viewport.zoom),groupSelection:n=>{this.selectedSliceIds.length>0&&(this.naming={kind:"create-context",sliceIds:this.selectedSliceIds,point:n})},assignSelection:n=>this.#f(t,n),stripSelectionContext:()=>this.#f(t,null),clearSelection:()=>{this.selectedSliceIds=[],this.selectedLinkIds=[]},linkClick:(n,i)=>this.#C(n,i),deleteSelection:()=>this.#u(t),keyDown:n=>this.#P(t,n),renameContext:(n,i)=>this.naming={kind:"rename-context",contextId:n,point:i},dissolveContext:n=>t.dispatch(E.deleteContext(n))}})}
885
- ${this.mode.kind==="append"?this.#A(t,this.mode.sliceId):M}
886
- ${this.naming!==void 0?this.#z(t,this.naming):M}
887
- `}#e(){return this.renderRoot.querySelector(".board-viewport")}#o(t){const n=this.#e()?.getBoundingClientRect();return n===void 0?{x:t.clientX,y:t.clientY}:{x:t.clientX-n.left,y:t.clientY-n.top}}#r(t){const n=this.#e();if(n===null)return[];const i=n.getBoundingClientRect();return[...this.renderRoot.querySelectorAll("[data-slice-id]")].map(o=>{const s=o.getBoundingClientRect();return{id:o.dataset.sliceId??"",rect:{left:s.left-i.left-(t?.x??0),top:s.top-i.top-(t?.top??0),width:s.width+(t?.x??0)*2,height:s.height+(t?.top??0)+(t?.bottom??0)}}})}#p(t,n){const i=this.#e();i!==null&&(i.setPointerCapture(t.pointerId),this.gesture=n)}#x(t,n){if(n.button!==0)return;n.stopPropagation(),n.preventDefault();const i=this.#o(n);this.#p(n,{kind:"connect",pointerId:n.pointerId,fromSliceId:t,start:i,current:i,moved:!1})}#b(t,n){if(n.button!==0)return;n.stopPropagation(),n.preventDefault();const i=this.#o(n);this.#p(n,{kind:"move-slice",pointerId:n.pointerId,sliceId:t,start:i,current:i,moved:!1})}#v(t){if(t.button!==0||this.gesture!==void 0)return;for(const i of t.composedPath()){if(i===t.currentTarget)break;if(i instanceof Element&&(i.tagName.toLowerCase()==="dpk-internal-event-storming-note"||i.matches("button, select, textarea, input, a")))return}const n=this.#o(t);(this.mode.kind==="editing"||this.mode.kind==="append")&&(this.mode=L),this.selectedLinkIds=[],this.#p(t,{kind:"select",pointerId:t.pointerId,start:n,current:n,moved:!1})}#k(t){const n=this.gesture,i=this.#o(t);if(n===void 0){const o=lt(this.#r(pn),i.x,i.y);o!==this.hoverSliceId&&(this.hoverSliceId=o);return}this.gesture=Vt(n,{pointerId:t.pointerId,point:i},this.#r(),ie)}#E(t,n){const i=this.gesture;if(i===void 0||n.pointerId!==i.pointerId)return;const o=Vt(i,{pointerId:n.pointerId,point:this.#o(n)},this.#r(),ie);if(this.gesture=void 0,o.kind==="connect"){o.moved?o.targetSliceId!==void 0&&this.#S(t,o.fromSliceId,o.targetSliceId):this.#M(o.fromSliceId);return}if(o.kind==="move-slice"){if(!o.moved){this.selectedSliceIds=this.selectedSliceIds.includes(o.sliceId)?this.selectedSliceIds.filter(r=>r!==o.sliceId):[...this.selectedSliceIds,o.sliceId];return}o.drop!==void 0&&this.#O(t,o.sliceId,o.drop.sliceId,o.drop.side);return}if(!o.moved){this.selectedSliceIds=[];return}const s={left:Math.min(o.start.x,o.current.x),top:Math.min(o.start.y,o.current.y),width:Math.abs(o.current.x-o.start.x),height:Math.abs(o.current.y-o.start.y)};this.selectedSliceIds=[...Wt(this.#r(),s)]}#y(t){t.preventDefault();const n=this.#o(t);this.#l(t.ctrlKey||t.metaKey?ct(this.viewport,n.x,n.y,Math.exp(-t.deltaY*.01)):Rt(this.viewport,-t.deltaX,-t.deltaY))}#h(t){const n=this.#e()?.getBoundingClientRect();this.#l(ct(this.viewport,(n?.width??0)/2,(n?.height??0)/2,t))}#w(t){this.#h(t===1?1.2:1/1.2)}#$(){const t=this.#e()?.getBoundingClientRect(),n=this.#m();t===void 0||n===void 0||this.#l(Bt(n,{width:t.width,height:t.height},48))}#m(){const t=this.renderRoot.querySelector(".wall");return t===null?void 0:{width:t.offsetWidth,height:t.offsetHeight}}#l(t){const n=this.#e()?.getBoundingClientRect(),i=this.#m(),o=n===void 0||i===void 0||i.width===0||n.width===0?t:Yt(t,i,{width:n.width,height:n.height},dn),s=this.viewport;o.panX===s.panX&&o.panY===s.panY&&o.zoom===s.zoom||(this.viewport=o)}#T(t,n){const i=this.context();switch(n.kind){case"select":i.navigate({note:t});break;case"rename":i.dispatch(E.setElementName(t,n.name));break;case"comment":i.dispatch({type:"comment",target:`element:${t}`,payload:{body:n.body}});break;case"delete":i.dispatch(E.deleteElement(t)),i.navigation.note===t&&i.navigate({note:null});break;case"add-hotspot":this.#N(i,t);break}this.mode=Ft(this.mode,t,n)}#a(t,n){return A(t).find(i=>i.id===n)}#i(t){return t===void 0?[]:[...t.notes,...t.pins.map(n=>n.note)].map(n=>n.id)}#S(t,n,i){if(n===i)return;const o=A(t.state),s=o.find(f=>f.id===n),r=o.find(f=>f.id===i),a=s&&r?Nt(s,r):void 0;if(s===void 0||r===void 0||a===void 0||t.state.links.some(f=>f.from===a.from&&f.to===a.to))return;const c=t.state.links.map(f=>f.id),d=t.state.elements.map(f=>f.id),p=V(s)?.id,m=p!==void 0&&o.indexOf(r)>o.indexOf(s)?Ht(d,this.#i(r),[p],"after"):[];t.dispatchBatch([E.linkElements(C(`link-${a.from}`,c),a.from,a.to,{kind:"flow"}),...m.map(f=>E.moveElement(f.id,f.after))])}#I(t){const n=this.#e(),i=this.#r().find(s=>s.id===t)?.rect;if(n===null||i===void 0)return;const o=n.getBoundingClientRect();return{x:o.left+i.left+i.width,y:o.top+i.top+i.height/2}}#M(t){const n=this.#I(t);n!==void 0&&(this.mode={kind:"append",sliceId:t,point:n})}#_(t,n,i){const o=this.#a(t.state,n),s=o?V(o):void 0;if(s===void 0){this.mode=L;return}const r=C(`new-${i}`,H(t.state)),a=t.state.links.map(d=>d.id);if(!t.dispatchBatch([E.addElement(r,i,D[i]),E.linkElements(C(`link-${s.id}`,a),s.id,r,{kind:"flow"})]).ok){this.mode=L;return}t.navigate({note:r}),this.mode={kind:"editing",noteId:r}}#N(t,n){const i=C("new-hotspot",H(t.state)),o=t.state.links.map(r=>r.id);t.dispatchBatch([E.addElement(i,"hotspot",D.hotspot),E.linkElements(C(`link-${i}`,o),i,n,{kind:"member"})]).ok&&(t.navigate({note:i}),this.mode={kind:"editing",noteId:i})}#L(t,n,i){const o=this.#a(t.state,n),s=o===void 0?void 0:It(o,i);if(s===void 0)return;const r=C(`new-${i}`,H(t.state)),[a,c]=s.incoming?[r,s.anchorId]:[s.anchorId,r],d=t.state.links.map(m=>m.id);t.dispatchBatch([E.addElement(r,i,D[i]),E.linkElements(C(`link-${a}`,d),a,c,{kind:"member"})]).ok&&(t.navigate({note:r}),this.mode={kind:"editing",noteId:r})}#O(t,n,i,o){const s=t.state,r=pt(s.elements.map(a=>a.id),this.#i(this.#a(s,n)),this.#i(this.#a(s,i)),o);t.dispatchBatch(r.map(a=>E.moveElement(a.id,a.after)))}#C(t,n){this.mode.kind==="editing"&&(this.mode=L),this.selectedSliceIds=[],this.selectedLinkIds=n?this.selectedLinkIds.includes(t)?this.selectedLinkIds.filter(i=>i!==t):[...this.selectedLinkIds,t]:[t],this.#e()?.focus()}#u(t){if(this.selectedLinkIds.length>0){const o=t.state.links.filter(s=>this.selectedLinkIds.includes(s.id));t.dispatchBatch(o.map(s=>E.unlinkElements(s.from,s.to))),this.selectedLinkIds=[];return}if(this.selectedSliceIds.length===0)return;const n=A(t.state),i=this.selectedSliceIds.flatMap(o=>this.#i(n.find(s=>s.id===o)));t.dispatchBatch(i.map(o=>E.deleteElement(o))),this.selectedSliceIds=[]}#P(t,n){if(n.target!==n.currentTarget)return;if(n.key==="Escape"){this.selectedSliceIds=[],this.selectedLinkIds=[];return}if(n.key!=="Delete"&&n.key!=="Backspace"||this.mode.kind!=="idle"||this.naming!==void 0)return;if(n.preventDefault(),this.selectedLinkIds.length>0||this.selectedSliceIds.length>0){this.#u(t);return}const i=t.navigation.note;i===void 0||z(t.state,i)===void 0||(t.dispatch(E.deleteElement(i)),t.navigate({note:null}))}#f(t,n){const i=A(t.state),o=this.selectedSliceIds.flatMap(r=>this.#i(i.find(a=>a.id===r)));t.dispatchBatch(o.map(r=>E.setElementContext(r,n))).ok&&(this.selectedSliceIds=[])}#g(t,n){const o=this.renderRoot.querySelector("#context-name")?.value.trim()??"";if(o==="")return;if(n.kind==="rename-context"){t.dispatch(E.setContextName(n.contextId,o)).ok&&(this.naming=void 0);return}const s=C("context",t.state.contexts.map(d=>d.id)),r=A(t.state),a=n.sliceIds.flatMap(d=>this.#i(r.find(p=>p.id===d)));t.dispatchBatch([E.addContext(s,o),...a.map(d=>E.setElementContext(d,s))]).ok&&(this.selectedSliceIds=[],this.naming=void 0)}#z(t,n){const i=n.kind==="rename-context"?Y(t.state,n.contextId)?.name??"":"";return v`<div id="context-pop" class="comment-pop context-pop" popover="manual">
888
- <span class="dpk-label">
889
- ${n.kind==="create-context"?"\u65B0\u3057\u3044\u5883\u754C\u3065\u3051\u3089\u308C\u305F\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8":"\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u540D\u3092\u5909\u66F4"}
890
- </span>
891
- <input
892
- id="context-name"
893
- class="dpk-input"
894
- type="text"
895
- placeholder="コンテキスト名"
896
- .value=${i}
897
- @keydown=${o=>{o.key==="Enter"&&this.#g(t,n),o.key==="Escape"&&(this.naming=void 0)}}
898
- />
899
- <div class="pop-actions">
900
- <button class="dpk-btn" type="button" @click=${()=>this.naming=void 0}>キャンセル</button>
901
- <button class="dpk-btn dpk-btn--accent" type="button" @click=${()=>this.#g(t,n)}>
902
- ${n.kind==="create-context"?"\u4F5C\u6210":"\u4FDD\u5B58"}
903
- </button>
904
- </div>
905
- </div>`}#A(t,n){const i=this.#a(t.state,n),o=i===void 0?void 0:V(i);return v`<div id="append-menu" class="comment-pop append-menu" popover="manual">
906
- <span class="dpk-label">${o===void 0?"\u7D9A\u304D\u306B\u8FFD\u52A0\u3059\u308B\u4ED8\u7B8B":`\u300C${o.name}\u300D\u306E\u7D9A\u304D\u306B\u8FFD\u52A0`}</span>
907
- <div class="type-options">
908
- ${cn.map(s=>v`<button
909
- class="type-chip"
910
- type="button"
911
- data-type=${s}
912
- style=${at(s)}
913
- @click=${()=>this.#_(t,n,s)}
914
- >
915
- ${D[s]}
916
- </button>`)}
917
- </div>
918
- <div class="pop-actions">
919
- <button class="dpk-btn" type="button" @click=${()=>this.mode=L}>キャンセル</button>
920
- </div>
921
- </div>`}#D(t){const n=C("new-event",H(t.state));if(!t.dispatch(E.addElement(n,"event",D.event)).ok){this.mode=L;return}t.navigate({note:n}),this.mode={kind:"editing",noteId:n}}}const hn=264,re=()=>{Xe(),customElements.get("dpk-template-event-storming")||customElements.define("dpk-template-event-storming",se)},mn=Object.freeze(Object.defineProperty({__proto__:null,DpkTemplateEventStorming:se,ES_IDLE:L,NOTE_TYPES:j,NOTE_TYPE_LABELS:D,ZOOM_MAX:Xt,ZOOM_MIN:dt,allNoteIds:H,applyEventStormingAction:Tt,attachAnchor:It,buildSlices:A,connectionEndpoints:Nt,constrainViewport:Yt,defineEventStormingElement:re,describeEventStormingAction:Lt,dropSide:Kt,emptyEventStormingBase:$t,eventStormingAction:E,eventStormingActions:y,eventStormingBaseSchema:yt,eventStormingCommentTargets:Pt,eventStormingDefinition:Dt,eventStormingHasTarget:At,eventStormingTargetLabel:Ct,eventStormingTitle:rt,findContext:Y,findLink:it,findNote:z,fitViewport:Bt,hitRect:lt,noteCardModeOf:qt,panBy:Rt,parseEventStormingBase:wt,planSliceBands:_t,rectsInBand:Wt,reduceNoteIntent:Ft,resolveEventStormingNavigation:zt,sameSlice:Z,serializeEventStormingAction:Ot,sliceArrows:Mt,sliceMovePlan:pt,sliceMoveSteps:Ht,sliceVoice:V,zoomAt:ct},Symbol.toStringTag,{value:"Module"}));export{re as d,mn as i};