gik-components 0.2.1
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/LICENSE +21 -0
- package/README.md +373 -0
- package/dist/agent-facing-DjAMQ4Ju.d.ts +110 -0
- package/dist/agent-facing.d.ts +8 -0
- package/dist/agent-facing.js +2 -0
- package/dist/agent-facing.js.map +1 -0
- package/dist/chunk-2I33SAGT.js +2 -0
- package/dist/chunk-2I33SAGT.js.map +1 -0
- package/dist/chunk-2XVVN3LX.js +7 -0
- package/dist/chunk-2XVVN3LX.js.map +1 -0
- package/dist/chunk-4BIHH7HT.js +2 -0
- package/dist/chunk-4BIHH7HT.js.map +1 -0
- package/dist/chunk-6JMFZS2Y.js +2 -0
- package/dist/chunk-6JMFZS2Y.js.map +1 -0
- package/dist/chunk-6TBEAKS7.js +2 -0
- package/dist/chunk-6TBEAKS7.js.map +1 -0
- package/dist/chunk-DMIV5ZI5.js +2 -0
- package/dist/chunk-DMIV5ZI5.js.map +1 -0
- package/dist/chunk-DNHCWSHQ.js +2 -0
- package/dist/chunk-DNHCWSHQ.js.map +1 -0
- package/dist/chunk-GL7PGK3G.js +2 -0
- package/dist/chunk-GL7PGK3G.js.map +1 -0
- package/dist/chunk-H6T3CCU5.js +2 -0
- package/dist/chunk-H6T3CCU5.js.map +1 -0
- package/dist/chunk-OFWGYY7S.js +2 -0
- package/dist/chunk-OFWGYY7S.js.map +1 -0
- package/dist/chunk-UP2OAMPY.js +2 -0
- package/dist/chunk-UP2OAMPY.js.map +1 -0
- package/dist/chunk-VR5CS5LA.js +2 -0
- package/dist/chunk-VR5CS5LA.js.map +1 -0
- package/dist/chunk-XA6FE7ZK.js +6 -0
- package/dist/chunk-XA6FE7ZK.js.map +1 -0
- package/dist/component-authoring-internal-DfFqqPhw.d.ts +40 -0
- package/dist/fluent.d.ts +103 -0
- package/dist/fluent.js +2 -0
- package/dist/fluent.js.map +1 -0
- package/dist/index.d.ts +139 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/primitives.d.ts +440 -0
- package/dist/primitives.js +2 -0
- package/dist/primitives.js.map +1 -0
- package/dist/security.d.ts +39 -0
- package/dist/security.js +2 -0
- package/dist/security.js.map +1 -0
- package/dist/semantic.d.ts +147 -0
- package/dist/semantic.js +2 -0
- package/dist/semantic.js.map +1 -0
- package/dist/software.d.ts +44 -0
- package/dist/software.js +2 -0
- package/dist/software.js.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as K,b as U,c as _e,d as J,g as Q,j as O}from"./chunk-XA6FE7ZK.js";var rn=["date","time","timestamp"];function Te({hourFormat:e="24",showSeconds:t=!1,showTimeZone:n=!1}){return{hour:"numeric",minute:"2-digit",...t?{second:"2-digit"}:{},...n?{timeZoneName:"short"}:{},hourCycle:e==="12"?"h12":"h23"}}function Re(e,t){return{month:"short",day:"numeric",...e.getFullYear()===t.getFullYear()?{}:{year:"numeric"}}}function ge(e,t,n={}){let o=e instanceof Date?e:new Date(e);if(!Number.isFinite(o.getTime()))return String(e);let r=n.now??new Date;return t==="date"?new Intl.DateTimeFormat(n.locale,Re(o,r)).format(o):t==="time"?new Intl.DateTimeFormat(n.locale,Te(n)).format(o):new Intl.DateTimeFormat(n.locale,{...Re(o,r),...Te(n)}).format(o)}function an(e,t){return ge(e,"date",t)}function Ae(e,t){return ge(e,"time",t)}function Ee(e,t){return ge(e,"timestamp",t)}import it,{forwardRef as at,memo as st,useCallback as V,useEffect as L,useImperativeHandle as dt,useMemo as lt,useRef as S,useState as Me}from"react";import{BaseEdge as Ve,Background as ct,Controls as pt,getBezierPath as ut,MiniMap as mt,Position as E,ReactFlow as gt,useNodesState as ft,useUpdateNodeInternals as ht}from"@xyflow/react";import{Fragment as At,jsx as k,jsxs as B}from"react/jsx-runtime";var fe="__canvasFrame",$={edge:"var(--colorNeutralStrokeAccessible, var(--xy-edge-stroke-default, #616161))",accent:"var(--colorBrandStroke1, #0f6cbd)",backgroundDot:"var(--colorNeutralStroke2, #d1d1d1)"},yt={top:E.Top,bottom:E.Bottom,left:E.Left,right:E.Right},bt={gap:24,size:1.1,color:$.backgroundDot},vt={hideAttribution:!0},wt=.26,Nt=.46,kt=.68;function ee(e,t){if(e===t||typeof e=="function"&&typeof t=="function")return!0;if(typeof e!=typeof t||!e||!t||typeof e!="object"||Array.isArray(e)!==Array.isArray(t))return!1;let n=Object.keys(e),o=Object.keys(t);if(n.length!==o.length)return!1;for(let r of n)if(!Object.prototype.hasOwnProperty.call(t,r)||!ee(e[r],t[r]))return!1;return!0}var It=st(function({data:t}){let n=t.__node,o=t.__ports,r=t.__renderNode,l=t.__renderNodePort,u=ht(),m=r?r(n):null;L(()=>{let g=window.requestAnimationFrame(()=>u(n.id));return()=>window.cancelAnimationFrame(g)},[n.id,o,u]);let i=g=>{let y=o?.[g];if(!Array.isArray(y)||y.length===0)return null;let b=yt[g];return k("div",{className:`infinite-canvas-node__rail infinite-canvas-node__rail--${g}`,children:y.map((I,C)=>k(it.Fragment,{children:l?l(I,{side:g,position:b,node:n}):null},I?.id??`${g}:${C}`))})},a=Array.isArray(o?.left)&&o.left.length>0,c=Array.isArray(o?.right)&&o.right.length>0;return B("div",{className:"infinite-canvas-node",children:[i("top"),a||c?B("div",{className:"infinite-canvas-node__row",children:[i("left"),k("div",{className:"infinite-canvas-node__body",children:m}),i("right")]}):k("div",{className:"infinite-canvas-node__body",children:m}),i("bottom")]})}),Ct={[fe]:It};function Fe(e){return{v:1,viewport:e?.viewport??null,nodes:e?.nodes&&typeof e.nodes=="object"?e.nodes:{}}}function xt(e,t){return e?e instanceof Map?e.get(t)??null:e[t]??null:null}function z(e,t){return xt(t,e.id)}function Oe(e){return typeof e.token=="string"&&e.token.trim()?e.token.trim():typeof e.id=="string"&&e.id.trim()?e.id.trim():""}function _(e,t){return e[t]===!0}function Pt(e,t){let n=_(e,"selected")||_(t,"selected");return{selected:n,highlighted:_(e,"highlighted")||_(t,"highlighted")||n,dimmed:_(e,"dimmed")||_(t,"dimmed"),running:_(e,"running")||_(t,"running")||_(e,"animated")||_(t,"animated")}}function Dt(e,t){if(typeof e.label=="string"&&e.label.trim())return e.label;if(typeof t.label=="string"&&t.label.trim())return t.label}function St(e,t,n,o,r){let l=Math.abs(n-e),u=Math.abs(o-t);return l<180&&u<120?wt:l>520||u>320?r.highlighted||r.running?kt:.58:r.highlighted||r.running?.58:Nt}function _t({id:e,sourceX:t,sourceY:n,targetX:o,targetY:r,sourcePosition:l,targetPosition:u,markerEnd:m,className:i,data:a,style:c}){let g=i?.includes("is-highlighted"),y=i?.includes("is-dimmed"),b=!!a?.isRunning,I=St(t,n,o,r,{highlighted:!!g,dimmed:!!y,running:b,selected:!1}),[C,ne,oe]=ut({sourceX:t,sourceY:n,targetX:o,targetY:r,sourcePosition:l,targetPosition:u,curvature:I}),re=$.edge,ie=$.accent,ae=`color-mix(in srgb, ${$.edge} 32%, transparent)`,T=g?ie:y?ae:re,se=g?`color-mix(in srgb, ${$.accent} 78%, white)`:`color-mix(in srgb, ${$.accent} 58%, transparent)`,W=`${e}-plug`,q=`${e}-end-plug`,h=g?2.4:1.8,de=["infinite-canvas-edge-label",g?"is-highlighted":"",b?"is-running":""].filter(Boolean).join(" ");return B(At,{children:[B("defs",{children:[k("marker",{id:W,viewBox:"0 0 10 10",markerWidth:"6",markerHeight:"6",refX:"5",refY:"5",children:k("circle",{cx:"5",cy:"5",r:"3",fill:T})}),k("marker",{id:q,viewBox:"0 0 12 12",markerWidth:"8.5",markerHeight:"8.5",refX:"6",refY:"6",orient:"auto-start-reverse",children:k("circle",{cx:"6",cy:"6",r:"3.9",fill:T})})]}),B("g",{className:i,children:[k(Ve,{id:e,path:C,className:"infinite-canvas-edge__main",markerStart:`url(#${W})`,markerEnd:m??`url(#${q})`,style:{...c,stroke:T,strokeWidth:h,strokeLinecap:"round",strokeLinejoin:"round"}}),b?k(Ve,{id:`${e}-flow`,path:C,className:"infinite-canvas-edge__flow",style:{stroke:se,strokeWidth:h+.35}}):null,a?.label?k("text",{x:ne,y:oe,textAnchor:"middle",className:de,children:String(a.label)}):null]})]})}var Tt={leaderLine:_t};function Rt(e,t){let n=new Map;for(let r of e){let l=z(r,t);for(let u of["left","top"]){let m=l?.[u];if(Array.isArray(m))for(let i of m){let a=Oe(i);if(!a)continue;let c=n.get(a)??[];c.push({nodeId:r.id,port:i}),n.set(a,c)}}}let o=[];for(let r of e){let l=z(r,t);for(let u of["right","bottom"]){let m=l?.[u];if(Array.isArray(m))for(let i of m){let a=Oe(i),c=typeof i.id=="string"?i.id:"";if(!a||!c)continue;let g=n.get(a)??[];for(let{nodeId:y,port:b}of g){let I=typeof b.id=="string"?b.id:"";if(!I||r.id===y)continue;let C=Pt(i,b);o.push({id:`${r.id}::${y}::${c}::${I}::${a}`,source:r.id,target:y,sourceHandle:c,targetHandle:I,data:{token:a,label:Dt(i,b),isRunning:C.running},animated:C.running,className:["infinite-canvas-edge",C.selected?"selected":"",C.highlighted?"is-highlighted":"",C.dimmed?"is-dimmed":"",C.running?"is-running":""].filter(Boolean).join(" "),type:"leaderLine"})}}}}return o}function $e(e){let t=Array.isArray(e?.right)&&e.right.length>0?E.Right:Array.isArray(e?.bottom)&&e.bottom.length>0?E.Bottom:void 0,n=Array.isArray(e?.left)&&e.left.length>0?E.Left:Array.isArray(e?.top)&&e.top.length>0?E.Top:void 0;return{sourcePosition:t,targetPosition:n}}var Be=at(function({stateKey:t,canvasState:n,onCanvasStateCommit:o,getInitialNodePos:r,nodes:l=[],nodePorts:u,renderNode:m,renderNodePort:i,minZoom:a=.24,maxZoom:c=1.35,fitViewOptions:g,miniMap:y=!1,controls:b=!1,background:I=bt,overlay:C=null,panOnScroll:ne=!0,selectionOnDrag:oe=!0,proOptions:re=vt,className:ie,viewportClassName:ae,onViewportChange:T,onNodeClick:se,onEdgeClick:W},q){let[h,de]=Me(null),[R,Z,Ke]=ft([]),[Ue,we]=Me(!1),Je=lt(()=>Rt(l,u),[l,u]),Qe=S(Ct),le=S(n);le.current=n;let ce=S(u);ce.current=u;let H=S(l);H.current=l;let Ne=S(m);Ne.current=m;let ke=S(i);ke.current=i;let Ie=S(r);Ie.current=r;let Ce=S(o);Ce.current=o;let xe=S(R);xe.current=R;let M=S(Fe(n)),A=S(n?.viewport??null),pe=S(!1),X=V((s,p,x)=>{let P=M.current?.nodes?.[s.id];if(P&&Number.isFinite(P.x)&&Number.isFinite(P.y))return{position:{x:P.x,y:P.y},fromInitial:!1};let D=Ie.current?.(s,{index:p,nodeCount:H.current.length,nodes:H.current,placed:x});return D&&Number.isFinite(D.x)&&Number.isFinite(D.y)?{position:{x:D.x,y:D.y},fromInitial:!0}:{position:{x:0,y:0},fromInitial:!0}},[]),Pe=V(s=>({__node:s,__ports:z(s,ce.current),__renderNode:Ne.current,__renderNodePort:ke.current}),[]),De=V((s,p)=>{let x=s.width,P=z(s,ce.current),{sourcePosition:D,targetPosition:v}=$e(P);return{id:s.id,type:fe,position:p,draggable:s.draggable??!0,sourcePosition:D,targetPosition:v,style:Number.isFinite(x)?{width:x}:void 0,data:Pe(s)}},[Pe]),Se=V(()=>{let s={};for(let p of xe.current)s[p.id]={x:p.position.x,y:p.position.y};return{v:1,viewport:A.current??M.current?.viewport??null,nodes:s}},[]),F=V(()=>{let s=Se();ee(s,M.current)||(M.current=s,Ce.current?.(s))},[Se]);L(()=>{M.current=Fe(le.current),A.current=le.current?.viewport??null,pe.current=!1,we(!1);let s={},p=H.current.map((x,P)=>{let{position:D}=X(x,P,s);return s[x.id]=D,De(x,D)});Z(p)},[t,De,X,Z]),L(()=>{Z(s=>{let p=new Map(s.map(v=>[v.id,v])),x={},P=s.length!==l.length,D=l.map((v,nt)=>{let w=p.get(v.id),ue=w?w.position:X(v,nt,x).position;x[v.id]=ue;let me=v.width,Y=z(v,u),ot=w&&(w.data.__node===v||ee(w.data.__node,v)),rt=w&&(w.data.__ports===Y||ee(w.data.__ports,Y));return w&&w.position===ue&&w.style?.width===me&&w.draggable===(v.draggable??!0)&&ot&&rt&&w.data.__renderNode===m&&w.data.__renderNodePort===i?w:(P=!0,{...w??{},id:v.id,type:fe,position:ue,draggable:v.draggable??!0,...$e(Y),style:Number.isFinite(me)?{width:me}:void 0,data:{__node:v,__ports:Y,__renderNode:m,__renderNodePort:i}})});return P?D:s})},[l,u,m,i,X,Z]),L(()=>{if(R.length===0)return;let s=M.current?.nodes??{};R.some(p=>!s[p.id])&&F()},[R,F]),L(()=>{if(!h||R.length===0||pe.current)return;pe.current=!0;let s=M.current?.viewport??null,p=window.requestAnimationFrame(()=>{s?(h.setViewport?.(s,{duration:0}),A.current=s):(h.fitView?.({duration:0,padding:.18,minZoom:.35,maxZoom:1.08,...g}),A.current=h.getViewport?.()??null),T?.(A.current),we(!0)});return()=>window.cancelAnimationFrame(p)},[h,R.length,g,T]);let et=V(()=>{A.current=h?.getViewport?.()??A.current,T?.(A.current),F()},[F,h,T]),tt=V(()=>{let s=window.requestAnimationFrame(()=>F());return()=>window.cancelAnimationFrame(s)},[F]);return dt(q,()=>({fitView:s=>h?.fitView?.(s),setViewport:(s,p)=>h?.setViewport?.(s,p),setCenter:(s,p,x)=>h?.setCenter?.(s,p,x),getViewport:()=>h?.getViewport?.(),getNode:s=>h?.getNode?.(s),instance:h}),[h]),k("div",{className:ae,children:B(gt,{nodes:R,edges:Je,nodeTypes:Qe.current,edgeTypes:Tt,minZoom:a,maxZoom:c,proOptions:re,className:ie,style:Ue?void 0:{visibility:"hidden"},panOnScroll:ne,selectionOnDrag:oe,onInit:de,onMoveEnd:et,onNodesChange:Ke,onNodeDragStop:tt,onNodeClick:(s,p)=>se?.(p.id),onEdgeClick:(s,p)=>W?.(String(p.data?.token??p.id)),children:[C,y?k(mt,{pannable:!0,zoomable:!0,...typeof y=="object"?y:{}}):null,b?k(pt,{showInteractive:!1,...typeof b=="object"?b:{}}):null,I?k(ct,{...I}):null]})})});import{Card as Et,Text as he,makeStyles as Mt,mergeClasses as Ge,tokens as d}from"@fluentui/react-components";import{runDeclarativeValidators as Vt}from"@gik-ai/evaluators";import{Handle as Ft}from"@xyflow/react";import{jsx as G,jsxs as ye}from"react/jsx-runtime";var je=["standard","compact","minimal"],Le=["accent","danger","warning","success","neutral"],Ot={"--xy-edge-stroke":d.colorNeutralStrokeAccessible,"--xy-edge-stroke-selected":d.colorBrandStroke1,"--xy-connectionline-stroke":d.colorBrandStroke1,"--xy-background-color":d.colorNeutralBackground2,"--xy-background-pattern-color":d.colorNeutralStroke2,"--xy-minimap-background-color":d.colorNeutralBackground1,"--xy-minimap-mask-background-color":d.colorNeutralBackgroundAlpha2,"--xy-minimap-node-background-color":d.colorNeutralBackground3,"--xy-minimap-node-stroke-color":d.colorNeutralStroke1,"--xy-selection-background-color":d.colorBrandBackground2,"--xy-selection-border":`1px dotted ${d.colorBrandStroke1}`},te={type:"object",additionalProperties:!1,required:["id","token"],properties:{id:{type:"string",minLength:1},token:{type:"string",minLength:1},label:{type:"string"},selected:{type:"boolean"},highlighted:{type:"boolean"},dimmed:{type:"boolean"},running:{type:"boolean"}}},$t={type:["object","null"],additionalProperties:!1,properties:{top:{type:"array",items:te},bottom:{type:"array",items:te},left:{type:"array",items:te},right:{type:"array",items:te}}},Bt={$schema:"http://json-schema.org/draft-07/schema#",type:"object",additionalProperties:!1,required:["stateKey","nodes","nodePorts"],properties:{...Q,stateKey:{type:"string",minLength:1},nodes:{type:"array",items:{type:"object",additionalProperties:!1,required:["id","title"],properties:{id:{type:"string",minLength:1},title:{type:"string",minLength:1},detail:{type:"string"},eyebrow:{type:"string"},tone:{enum:Le},width:{type:"number",minimum:120,maximum:640},draggable:{type:"boolean"}}}},nodePorts:{type:"object",additionalProperties:$t},canvasState:{type:["object","null"],additionalProperties:!1,properties:{v:{type:"number"},viewport:{type:["object","null"],additionalProperties:!1,required:["x","y","zoom"],properties:{x:{type:"number"},y:{type:"number"},zoom:{type:"number"}}},nodes:{type:"object",additionalProperties:{type:"object",additionalProperties:!1,required:["x","y"],properties:{x:{type:"number"},y:{type:"number"}}}}}},variant:{enum:je},height:{type:["number","string"]},minZoom:{type:"number",exclusiveMinimum:0},maxZoom:{type:"number",exclusiveMinimum:0},miniMap:{type:"boolean"},controls:{type:"boolean"},background:{type:"boolean"},panOnScroll:{type:"boolean"},selectionOnDrag:{type:"boolean"},ariaLabel:{type:"string",minLength:1}}},Gt=Mt({root:{position:"relative",width:"100%",minWidth:0,minHeight:"20rem",overflow:"hidden",border:`${d.strokeWidthThin} solid ${d.colorNeutralStroke2}`,borderRadius:d.borderRadiusMedium,backgroundColor:d.colorNeutralBackground2,"& .react-flow__controls":{borderRadius:d.borderRadiusMedium,boxShadow:d.shadow4,overflow:"hidden"},"& .react-flow__controls-button":{color:d.colorNeutralForeground1,backgroundColor:d.colorNeutralBackground1,border:`1px solid ${d.colorNeutralStroke2}`,cursor:"pointer"},"& .react-flow__controls-button:hover":{backgroundColor:d.colorNeutralBackground1Hover},"& .infinite-canvas-node__row":{display:"flex",alignItems:"center"},"& .infinite-canvas-node__body":{flex:"1 1 auto",minWidth:0},"& .infinite-canvas-node__rail":{display:"flex",alignItems:"center",justifyContent:"center",gap:d.spacingHorizontalXS},"& .infinite-canvas-node__rail--left, & .infinite-canvas-node__rail--right":{flexDirection:"column"}},viewport:{width:"100%",height:"100%"},node:{width:"100%",minWidth:0,padding:d.spacingHorizontalL,borderTop:`4px solid ${d.colorNeutralStroke1}`,boxShadow:d.shadow4},compactNode:{padding:d.spacingHorizontalM},minimalNode:{padding:d.spacingHorizontalS,boxShadow:d.shadow2},accent:{borderTopColor:d.colorBrandBackground},danger:{borderTopColor:d.colorPaletteRedBackground3},warning:{borderTopColor:d.colorPaletteDarkOrangeBackground3},success:{borderTopColor:d.colorPaletteGreenBackground3},eyebrow:{display:"block",color:d.colorNeutralForeground3,fontSize:d.fontSizeBase100,fontWeight:d.fontWeightSemibold,textTransform:"uppercase"},title:{display:"block",marginTop:d.spacingVerticalXXS,overflowWrap:"anywhere"},detail:{display:"block",marginTop:d.spacingVerticalXS,color:d.colorNeutralForeground3,overflowWrap:"anywhere"},port:{width:"10px",height:"10px",border:`2px solid ${d.colorNeutralBackground1}`,borderRadius:"50%",backgroundColor:d.colorBrandBackground,boxShadow:`0 0 0 1px ${d.colorBrandBackground}`},leftPort:{transform:"translate(-100%, -50%)"},rightPort:{transform:"translate(100%, -50%)"},topPort:{transform:"translate(-50%, -100%)"},bottomPort:{transform:"translate(-50%, 100%)"},accessibleSummary:{position:"absolute",width:"1px",height:"1px",padding:0,margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",border:0}});function jt(e,t,n){return Ge(e.node,n==="compact"&&e.compactNode,n==="minimal"&&e.minimalNode,t==="accent"&&e.accent,t==="danger"&&e.danger,t==="warning"&&e.warning,t==="success"&&e.success)}var be=({node:e,emit:t})=>{let n=Gt(),o=Array.isArray(e.props.nodes)?e.props.nodes:[],r=e.props.nodePorts&&typeof e.props.nodePorts=="object"&&!Array.isArray(e.props.nodePorts)?e.props.nodePorts:{},l=je.includes(e.props.variant)?e.props.variant:"standard",u=typeof e.props.height=="number"||typeof e.props.height=="string"?e.props.height:"32rem",m=O(e,n.root);return ye("section",{...m,style:{...Ot,...m.style,height:u},"aria-label":typeof e.props.ariaLabel=="string"?e.props.ariaLabel:"Infinite canvas",children:[G("ul",{className:n.accessibleSummary,children:o.map(i=>ye("li",{children:[i.title,i.detail?`: ${i.detail}`:""]},i.id))}),G(Be,{stateKey:String(e.props.stateKey??e.id),canvasState:e.props.canvasState,nodes:o,nodePorts:r,minZoom:typeof e.props.minZoom=="number"?e.props.minZoom:void 0,maxZoom:typeof e.props.maxZoom=="number"?e.props.maxZoom:void 0,miniMap:e.props.miniMap===!0,controls:e.props.controls===!0,background:e.props.background===!1?!1:void 0,panOnScroll:e.props.panOnScroll!==!1,selectionOnDrag:e.props.selectionOnDrag!==!1,viewportClassName:n.viewport,getInitialNodePos:(i,a)=>({x:a.index%3*300,y:Math.floor(a.index/3)*210}),renderNode:i=>{let a=i;return ye(Et,{appearance:"outline",className:jt(n,a.tone,l),children:[a.eyebrow&&l!=="minimal"?G(he,{className:n.eyebrow,children:a.eyebrow}):null,G(he,{className:n.title,weight:"semibold",size:l==="standard"?400:300,children:a.title}),a.detail&&l==="standard"?G(he,{className:n.detail,size:200,children:a.detail}):null]})},renderNodePort:(i,a)=>{let c=a.side==="left"?n.leftPort:a.side==="right"?n.rightPort:a.side==="top"?n.topPort:n.bottomPort;return G(Ft,{id:String(i.id),type:a.side==="left"||a.side==="top"?"target":"source",position:a.position,className:Ge(n.port,c),title:typeof i.label=="string"?i.label:void 0})},onCanvasStateCommit:i=>{t("layout",{value:i})},onNodeClick:i=>{t("node",{id:i})},onEdgeClick:i=>{t("edge",{id:i})}})]})},ze={capability:"primitive:infinite-canvas",summary:"Renders declarative node cards on a persistent pan-and-zoom canvas and derives edges from matching node-port tokens.",dataProp:"nodes",events:["node","edge","layout"],eventContracts:{node:K("The user selects a canvas node.",{id:{type:"string"}}),edge:K("The user selects a derived canvas edge.",{id:{type:"string"}}),layout:K("The canvas commits its current viewport and node positions.",{value:{type:"object",additionalProperties:!0}})},semanticTokens:Le,defaultVariant:"standard",variants:[{value:"standard",summary:"Full node cards with eyebrow, title, and detail.",useWhen:["The graph is a primary exploratory surface","Node detail should remain visible"]},{value:"compact",summary:"Compact cards with eyebrow and title.",useWhen:["The graph contains many nodes","Labels matter more than prose detail"]},{value:"minimal",summary:"Small title-only cards.",useWhen:["Topology is the primary information","The canvas must accommodate a dense graph"]}],authoring:{useWhen:["Users need to pan, zoom, and reposition a node topology","Connections can be represented by matching source and target port tokens"],avoidWhen:["A static relationship list is sufficient","The data has no stable node identities"],rules:["Provide unique stable node ids","Declare input ports on left or top and output ports on right or bottom","Use one shared token for each intended source-target connection","Do not author an explicit edge array","Persist layout events back into canvasState when layout continuity is required"]}};function We(){return Bt}function bn(){return ze}function Lt(e){return Vt([{kind:"ajv-schema",schema:We(),message:"Invalid primitive:infinite-canvas props",code:"primitive-infinite-canvas-schema"},{kind:"jsonata",expr:"$count(data.nodes.id) = $count($distinct(data.nodes.id))",message:"Infinite canvas node ids must be unique",code:"infinite-canvas-unique-node-id"}],e)}function zt(){return J("primitive:infinite-canvas",{stateKey:"infinite-canvas-trial",variant:"standard",height:420,controls:!0,nodes:[{id:"source",title:"Source system",detail:"Observed identity provider",eyebrow:"Origin",tone:"neutral",width:240},{id:"target",title:"Protected resource",detail:"Accessed application",eyebrow:"Target",tone:"danger",width:240}],nodePorts:{source:{right:[{id:"access:source",token:"relationship:access",label:"accessed"}]},target:{left:[{id:"access:target",token:"relationship:access",label:"accessed"}]}}})}var qe=U({description:ze,version:"1.0.0",component:be,getSchema:We,validate:Lt,materializeTrial:zt});import{Text as ve,makeStyles as Wt,tokens as f}from"@fluentui/react-components";import{runDeclarativeValidators as qt}from"@gik-ai/evaluators";import{jsx as N,jsxs as j}from"react/jsx-runtime";var Zt=["diagram","canvas"],He=["accent","danger","warning","success","neutral"],Ht={$schema:"http://json-schema.org/draft-07/schema#",type:"object",additionalProperties:!1,required:["graph","spec"],properties:{...Q,graph:{type:"object",additionalProperties:!1,required:["nodes","edges"],properties:{nodes:{type:"array",items:{type:"object",additionalProperties:!1,required:["id","label"],properties:{id:{type:"string",minLength:1},label:{type:"string",minLength:1},detail:{type:"string"},category:{type:"string"},tone:{enum:He}}}},edges:{type:"array",items:{type:"object",additionalProperties:!1,required:["id","source","target"],properties:{id:{type:"string",minLength:1},source:{type:"string",minLength:1},target:{type:"string",minLength:1},label:{type:"string"},directed:{type:"boolean"}}}}}},variant:{enum:Zt},spec:{type:"object",additionalProperties:!1,properties:{title:{type:"string"},description:{type:"string"},emptyText:{type:"string"},layout:{enum:["radial","hierarchical"]},interaction:{type:"object",additionalProperties:!1,properties:{pan:{type:"boolean"},zoom:{type:"boolean"},selection:{type:"boolean"}}}}},stateKey:{type:"string",minLength:1},canvasState:{type:["object","null"]},height:{type:["number","string"]},miniMap:{type:"boolean"},controls:{type:"boolean"},background:{type:"boolean"}}},Xt=Wt({root:{display:"grid",gap:f.spacingVerticalM,minWidth:0},header:{display:"grid",gap:f.spacingVerticalXXS},description:{color:f.colorNeutralForeground3},diagram:{width:"100%",minHeight:"20rem",backgroundColor:f.colorNeutralBackground2,border:`${f.strokeWidthThin} solid ${f.colorNeutralStroke2}`,borderRadius:f.borderRadiusMedium}});function Ze(e){return e==="accent"?f.colorBrandBackground:e==="danger"?f.colorPaletteRedBackground3:e==="warning"?f.colorPaletteDarkOrangeBackground3:e==="success"?f.colorPaletteGreenBackground3:f.colorNeutralBackground4}function Yt(e){return e&&e!=="neutral"?f.colorNeutralForegroundOnBrand:f.colorNeutralForeground1}function Kt(e,t){if(t==="hierarchical"){let n=Math.max(1,Math.ceil(Math.sqrt(e.length)));return new Map(e.map((o,r)=>[o.id,{x:n===1?320:120+r%n*(400/(n-1)),y:80+Math.floor(r/n)*150}]))}return new Map(e.map((n,o)=>{let r=Math.PI*2*o/Math.max(1,e.length)-Math.PI/2,l=e.length<=3?105:135;return[n.id,{x:320+Math.cos(r)*l,y:180+Math.sin(r)*l}]}))}function Ut(e,t=26){return e.split(/\s+/).flatMap(o=>o.length<=t?[o]:o.match(new RegExp(`.{1,${t}}`,"g"))??[o]).reduce((o,r)=>{let l=o.at(-1);return!l||l.length+r.length+1>t?o.push(r):o[o.length-1]=`${l} ${r}`,o},[])}function Jt(e){let t=Object.fromEntries(e.nodes.map(o=>[o.id,{}])),n=new Set(e.nodes.map(o=>o.id));for(let o of e.edges){if(!n.has(o.source)||!n.has(o.target)||o.source===o.target)continue;let r=`edge:${o.id}`;t[o.source]={...t[o.source],right:[...t[o.source]?.right??[],{id:`${o.id}:source`,token:r,label:o.label??""}]},t[o.target]={...t[o.target],left:[...t[o.target]?.left??[],{id:`${o.id}:target`,token:r,label:o.label??""}]}}return{nodes:e.nodes.map(o=>({id:o.id,title:o.label,detail:o.detail,eyebrow:o.category,tone:o.tone,width:250})),nodePorts:t}}var Qt=({node:e,emit:t})=>{let n=Xt(),o=e.props.graph??{nodes:[],edges:[]},r=e.props.spec??{},l=e.props.variant??"diagram";if(!Array.isArray(o.nodes)||o.nodes.length===0)return N(ve,{...O(e),children:r.emptyText??"No graph data."});let u=r.title||r.description?j("header",{className:n.header,children:[r.title?N(ve,{weight:"semibold",size:500,children:r.title}):null,r.description?N(ve,{className:n.description,children:r.description}):null]}):null;if(l==="canvas"){let i=Jt(o);return j("section",{...O(e,n.root),children:[u,N(be,{node:_e(`${e.id}-canvas`,"primitive:infinite-canvas",{nodes:i.nodes,nodePorts:i.nodePorts,stateKey:String(e.props.stateKey??e.id),canvasState:e.props.canvasState??null,height:e.props.height??"34rem",variant:"standard",miniMap:e.props.miniMap??r.interaction?.zoom!==!1,controls:e.props.controls??r.interaction?.zoom!==!1,background:e.props.background??!0,panOnScroll:r.interaction?.pan!==!1,selectionOnDrag:r.interaction?.selection!==!1,ariaLabel:r.title??"Graph diagram"}),emit:t,children:void 0})]})}let m=Kt(o.nodes,r.layout??"radial");return j("section",{...O(e,n.root),children:[u,j("svg",{className:n.diagram,viewBox:"0 0 640 360",role:"img",children:[N("title",{children:r.title??"Graph diagram"}),N("desc",{children:r.description??`${o.nodes.length} nodes and ${o.edges.length} edges`}),N("defs",{children:N("marker",{id:`${e.id}-arrow`,markerWidth:"8",markerHeight:"8",refX:"7",refY:"4",orient:"auto",children:N("path",{d:"M0,0 L8,4 L0,8 Z",fill:f.colorNeutralStroke1})})}),o.edges.map(i=>{let a=m.get(i.source),c=m.get(i.target);return!a||!c?null:j("g",{children:[N("line",{x1:a.x,y1:a.y,x2:c.x,y2:c.y,stroke:f.colorNeutralStroke1,strokeWidth:"2",markerEnd:i.directed?`url(#${e.id}-arrow)`:void 0}),i.label?N("text",{x:(a.x+c.x)/2,y:(a.y+c.y)/2-6,textAnchor:"middle",fill:f.colorNeutralForeground3,fontSize:"11",children:i.label}):null]},i.id)}),o.nodes.map(i=>{let a=m.get(i.id),c=Ut(i.label),g=c.length>1,y=a.y-(c.length-1)*7;return j("g",{"aria-label":i.label,children:[N("title",{children:i.label}),g?N("rect",{x:a.x-105,y:a.y-42,width:"210",height:"84",rx:"8",fill:Ze(i.tone),stroke:f.colorNeutralStroke1}):N("circle",{cx:a.x,cy:a.y,r:"46",fill:Ze(i.tone),stroke:f.colorNeutralStroke1}),N("text",{x:a.x,y,textAnchor:"middle",dominantBaseline:"middle",fill:Yt(i.tone),fontSize:"13",children:c.map((b,I)=>N("tspan",{x:a.x,dy:I===0?0:14,children:b},`${i.id}-${I}`))})]},i.id)})]})]})},en={capability:"primitive:graph-diagram",summary:"Renders normalized nodes and edges as a static diagram or interactive canvas without assigning relationship meaning.",dataProp:"graph",events:["node","edge","layout"],eventContracts:qe.eventContracts,semanticTokens:He,defaultVariant:"diagram",variants:[{value:"diagram",summary:"Static node-edge diagram.",useWhen:["Topology should be inspected without canvas interaction"]},{value:"canvas",summary:"Interactive pan-and-zoom graph canvas.",useWhen:["Users need to explore or reposition a larger graph"]}],authoring:{useWhen:["A caller has already normalized records into nodes and edges"],avoidWhen:["Relationship meaning or domain validation has not yet been resolved"],rules:["Provide stable unique node and edge IDs","Reference only declared node IDs","Assign semantic meaning before lowering into this primitive"]}};function Xe(){return Ht}function tn(e){return qt([{kind:"ajv-schema",schema:Xe(),message:"Invalid primitive:graph-diagram props",code:"graph-diagram-schema"},{kind:"jsonata",expr:"$count(data.graph.nodes.id) = $count($distinct(data.graph.nodes.id)) and $count(data.graph.edges.id) = $count($distinct(data.graph.edges.id))",message:"Graph node and edge IDs must be unique",code:"graph-diagram-unique-id"},{kind:"jsonata",expr:"($ids := data.graph.nodes.id; $count(data.graph.edges[source in $ids and target in $ids]) = $count(data.graph.edges))",message:"Graph edges must reference declared node IDs",code:"graph-diagram-reference"}],e)}function nn(){return J("primitive:graph-diagram",{variant:"diagram",graph:{nodes:[{id:"source",label:"Source",tone:"accent"},{id:"target",label:"Target",tone:"neutral"}],edges:[{id:"connection",source:"source",target:"target",label:"connects",directed:!0}]},spec:{title:"Graph diagram",layout:"radial"}})}var Pn=U({description:en,version:"1.0.0",component:Qt,getSchema:Xe,validate:tn,materializeTrial:nn});var Ye=101;function Tn(e,t){return t.kind==="datetime"?typeof e=="string"?Date.parse(e):Number.NaN:typeof e=="number"?e:Number.NaN}function on(e,t){let n=e==null?"":String(e);return t.kind==="datetime"?Ee(n,{hourFormat:t.hourFormat,showSeconds:t.showSeconds,showTimeZone:t.showTimeZone}):t.displayPrefix?`${t.displayPrefix}${n}`:n}function Rn(e,t){return t.kind==="datetime"?Ae(e,{hourFormat:t.hourFormat,showSeconds:t.showSeconds,showTimeZone:t.showTimeZone}):on(e,t)}function An(e,t,n){if(n===void 0||n<=0||t<e)return[];let o=Math.floor((t-e)/n)+1;return Array.from({length:Math.min(Ye,o)},(r,l)=>e+l*n).filter(r=>r<=t)}function En(e,t,n){return n!==void 0&&n>0&&Math.floor((t-e)/n)+1>Ye}export{rn as a,ge as b,an as c,Ae as d,Ee as e,Ye as f,Tn as g,on as h,Rn as i,An as j,En as k,$ as l,Be as m,je as n,Le as o,be as p,We as q,bn as r,Lt as s,zt as t,qe as u,Zt as v,He as w,Jt as x,Qt as y,Xe as z,tn as A,nn as B,Pn as C};
|
|
2
|
+
//# sourceMappingURL=chunk-OFWGYY7S.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/dateTimeFormat.ts","../src/primitives/infinite-canvas/InfiniteCanvas.tsx","../src/primitives/infinite-canvas/InfiniteCanvasPrimitive.tsx","../src/primitives/graph-diagram/GraphDiagram.tsx","../src/shared/coordinateScale.ts"],"sourcesContent":["export const DATE_TIME_PRESENTATIONS = [\"date\", \"time\", \"timestamp\"] as const;\nexport type DateTimePresentation = typeof DATE_TIME_PRESENTATIONS[number];\n\nexport interface DateTimeFormatOptions {\n hourFormat?: \"24\" | \"12\";\n locale?: Intl.LocalesArgument;\n now?: Date;\n showSeconds?: boolean;\n showTimeZone?: boolean;\n}\n\nfunction timeOptions({ hourFormat = \"24\", showSeconds = false, showTimeZone = false }: DateTimeFormatOptions): Intl.DateTimeFormatOptions {\n return {\n hour: \"numeric\",\n minute: \"2-digit\",\n ...(showSeconds ? { second: \"2-digit\" as const } : {}),\n ...(showTimeZone ? { timeZoneName: \"short\" as const } : {}),\n hourCycle: hourFormat === \"12\" ? \"h12\" : \"h23\",\n };\n}\n\nfunction dateOptions(date: Date, now: Date): Intl.DateTimeFormatOptions {\n return {\n month: \"short\",\n day: \"numeric\",\n ...(date.getFullYear() === now.getFullYear() ? {} : { year: \"numeric\" as const }),\n };\n}\n\nexport function formatDateTime(value: string | number | Date, presentation: DateTimePresentation, options: DateTimeFormatOptions = {}): string {\n const date = value instanceof Date ? value : new Date(value);\n if (!Number.isFinite(date.getTime())) return String(value);\n const now = options.now ?? new Date();\n if (presentation === \"date\") return new Intl.DateTimeFormat(options.locale, dateOptions(date, now)).format(date);\n if (presentation === \"time\") return new Intl.DateTimeFormat(options.locale, timeOptions(options)).format(date);\n return new Intl.DateTimeFormat(options.locale, { ...dateOptions(date, now), ...timeOptions(options) }).format(date);\n}\n\nexport function formatDate(value: string | number | Date, options?: DateTimeFormatOptions): string {\n return formatDateTime(value, \"date\", options);\n}\n\nexport function formatTime(value: string | number | Date, options?: DateTimeFormatOptions): string {\n return formatDateTime(value, \"time\", options);\n}\n\nexport function formatTimestamp(value: string | number | Date, options?: DateTimeFormatOptions): string {\n return formatDateTime(value, \"timestamp\", options);\n}\n","import React, {\n forwardRef,\n memo,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n BaseEdge,\n Background,\n Controls,\n getBezierPath,\n MiniMap,\n Position,\n ReactFlow,\n useNodesState,\n useUpdateNodeInternals,\n type Edge,\n type FitViewOptions,\n type Node,\n type ProOptions,\n type ReactFlowInstance,\n type Viewport,\n type XYPosition,\n} from \"@xyflow/react\";\n\nconst CANVAS_FRAME_TYPE = \"__canvasFrame\";\nexport const INFINITE_CANVAS_THEME_COLORS = {\n edge: \"var(--colorNeutralStrokeAccessible, var(--xy-edge-stroke-default, #616161))\",\n accent: \"var(--colorBrandStroke1, #0f6cbd)\",\n backgroundDot: \"var(--colorNeutralStroke2, #d1d1d1)\",\n} as const;\n\nconst SIDE_POSITION = {\n top: Position.Top,\n bottom: Position.Bottom,\n left: Position.Left,\n right: Position.Right,\n} as const;\n\nconst DEFAULT_BACKGROUND = { gap: 24, size: 1.1, color: INFINITE_CANVAS_THEME_COLORS.backgroundDot };\nconst DEFAULT_PRO_OPTIONS: ProOptions = { hideAttribution: true };\nconst EDGE_CURVATURE_SUBTLE = 0.26;\nconst EDGE_CURVATURE_BASE = 0.46;\nconst EDGE_CURVATURE_DRAMATIC = 0.68;\n\ntype Side = keyof typeof SIDE_POSITION;\n\ninterface DerivedEdgeState {\n selected: boolean;\n highlighted: boolean;\n dimmed: boolean;\n running: boolean;\n}\n\ninterface InfiniteCanvasEdgeData extends Record<string, unknown> {\n token?: string;\n label?: string;\n isRunning?: boolean;\n}\n\nexport interface InfiniteCanvasPort {\n id?: string;\n token?: string;\n [key: string]: unknown;\n}\n\nexport interface InfiniteCanvasPorts {\n top?: InfiniteCanvasPort[];\n bottom?: InfiniteCanvasPort[];\n left?: InfiniteCanvasPort[];\n right?: InfiniteCanvasPort[];\n}\n\nexport type InfiniteCanvasPortMap =\n | Map<string, InfiniteCanvasPorts | null>\n | Record<string, InfiniteCanvasPorts | null | undefined>;\n\nexport interface InfiniteCanvasNodeDescriptor extends Record<string, unknown> {\n id: string;\n width?: number;\n draggable?: boolean;\n}\n\nexport interface InfiniteCanvasRef {\n fitView: (opts?: FitViewOptions) => void;\n setViewport: (viewport: Viewport, opts?: { duration?: number }) => void;\n setCenter: (x: number, y: number, opts?: { zoom?: number; duration?: number }) => void;\n getViewport: () => Viewport | undefined;\n getNode: (id: string) => Node | undefined;\n instance: unknown;\n}\n\ninterface InternalNodeData extends Record<string, unknown> {\n __node: InfiniteCanvasNodeDescriptor;\n __ports: InfiniteCanvasPorts | null;\n __renderNode?: (node: InfiniteCanvasNodeDescriptor) => React.ReactNode;\n __renderNodePort?: (port: InfiniteCanvasPort, context: {\n side: Side;\n position: Position;\n node: InfiniteCanvasNodeDescriptor;\n }) => React.ReactNode;\n}\n\nexport interface InfiniteCanvasProps {\n stateKey: string;\n canvasState?: {\n v?: number;\n viewport?: Viewport | null;\n nodes?: Record<string, { x: number; y: number }>;\n } | null;\n onCanvasStateCommit?: (blob: {\n v: number;\n viewport: Viewport | null;\n nodes: Record<string, { x: number; y: number }>;\n }) => void;\n getInitialNodePos?: (\n descriptor: InfiniteCanvasNodeDescriptor,\n context: {\n index: number;\n nodeCount: number;\n nodes: InfiniteCanvasNodeDescriptor[];\n placed: Record<string, XYPosition>;\n }\n ) => XYPosition | null | undefined;\n nodes?: InfiniteCanvasNodeDescriptor[];\n nodePorts?: InfiniteCanvasPortMap;\n renderNode?: (node: InfiniteCanvasNodeDescriptor) => React.ReactNode;\n renderNodePort?: (port: InfiniteCanvasPort, context: {\n side: Side;\n position: Position;\n node: InfiniteCanvasNodeDescriptor;\n }) => React.ReactNode;\n minZoom?: number;\n maxZoom?: number;\n fitViewOptions?: FitViewOptions;\n miniMap?: boolean | Record<string, unknown>;\n controls?: boolean | Record<string, unknown>;\n background?: false | Record<string, unknown>;\n overlay?: React.ReactNode;\n panOnScroll?: boolean;\n selectionOnDrag?: boolean;\n proOptions?: ProOptions;\n className?: string;\n viewportClassName?: string;\n onViewportChange?: (viewport: Viewport | null) => void;\n onNodeClick?: (nodeId: string) => void;\n onEdgeClick?: (edgeId: string) => void;\n}\n\nfunction deepEqualView(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a === \"function\" && typeof b === \"function\") return true;\n if (typeof a !== typeof b) return false;\n if (!a || !b || typeof a !== \"object\") return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n if (aKeys.length !== bKeys.length) return false;\n for (const key of aKeys) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false;\n if (!deepEqualView((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key])) return false;\n }\n return true;\n}\n\nconst CanvasFrameNode = memo(function CanvasFrameNode({ data }: { data: InternalNodeData }) {\n const node = data.__node;\n const ports = data.__ports;\n const renderNode = data.__renderNode;\n const renderNodePort = data.__renderNodePort;\n const updateNodeInternals = useUpdateNodeInternals();\n const body = renderNode ? renderNode(node) : null;\n\n useEffect(() => {\n const frame = window.requestAnimationFrame(() => updateNodeInternals(node.id));\n return () => window.cancelAnimationFrame(frame);\n }, [node.id, ports, updateNodeInternals]);\n\n const renderRail = (side: Side) => {\n const list = ports?.[side];\n if (!Array.isArray(list) || list.length === 0) return null;\n const position = SIDE_POSITION[side];\n return (\n <div className={`infinite-canvas-node__rail infinite-canvas-node__rail--${side}`}>\n {list.map((port, index) => (\n <React.Fragment key={port?.id ?? `${side}:${index}`}>\n {renderNodePort ? renderNodePort(port, { side, position, node }) : null}\n </React.Fragment>\n ))}\n </div>\n );\n };\n\n const hasLeft = Array.isArray(ports?.left) && ports.left.length > 0;\n const hasRight = Array.isArray(ports?.right) && ports.right.length > 0;\n\n return (\n <div className=\"infinite-canvas-node\">\n {renderRail(\"top\")}\n {hasLeft || hasRight ? (\n <div className=\"infinite-canvas-node__row\">\n {renderRail(\"left\")}\n <div className=\"infinite-canvas-node__body\">{body}</div>\n {renderRail(\"right\")}\n </div>\n ) : (\n <div className=\"infinite-canvas-node__body\">{body}</div>\n )}\n {renderRail(\"bottom\")}\n </div>\n );\n});\n\nconst NODE_TYPES = { [CANVAS_FRAME_TYPE]: CanvasFrameNode };\n\nfunction normalizeBlob(blob: InfiniteCanvasProps[\"canvasState\"]) {\n return {\n v: 1,\n viewport: blob?.viewport ?? null,\n nodes: blob?.nodes && typeof blob.nodes === \"object\" ? blob.nodes : {},\n };\n}\n\nfunction readPorts(nodePorts: InfiniteCanvasPortMap | undefined, id: string): InfiniteCanvasPorts | null {\n if (!nodePorts) return null;\n if (nodePorts instanceof Map) return nodePorts.get(id) ?? null;\n return nodePorts[id] ?? null;\n}\n\nfunction resolvePortsForDescriptor(\n descriptor: InfiniteCanvasNodeDescriptor,\n nodePorts: InfiniteCanvasPortMap | undefined,\n): InfiniteCanvasPorts | null {\n return readPorts(nodePorts, descriptor.id);\n}\n\nfunction readPortToken(port: InfiniteCanvasPort): string {\n if (typeof port.token === \"string\" && port.token.trim()) {\n return port.token.trim();\n }\n if (typeof port.id === \"string\" && port.id.trim()) {\n return port.id.trim();\n }\n return \"\";\n}\n\nfunction readOpaqueBoolean(port: InfiniteCanvasPort, key: string): boolean {\n return port[key] === true;\n}\n\nfunction mergeEdgeState(sourcePort: InfiniteCanvasPort, targetPort: InfiniteCanvasPort): DerivedEdgeState {\n const selected = readOpaqueBoolean(sourcePort, \"selected\") || readOpaqueBoolean(targetPort, \"selected\");\n return {\n selected,\n highlighted: readOpaqueBoolean(sourcePort, \"highlighted\") || readOpaqueBoolean(targetPort, \"highlighted\") || selected,\n dimmed: readOpaqueBoolean(sourcePort, \"dimmed\") || readOpaqueBoolean(targetPort, \"dimmed\"),\n running: readOpaqueBoolean(sourcePort, \"running\") || readOpaqueBoolean(targetPort, \"running\") || readOpaqueBoolean(sourcePort, \"animated\") || readOpaqueBoolean(targetPort, \"animated\"),\n };\n}\n\nfunction readEdgeLabel(sourcePort: InfiniteCanvasPort, targetPort: InfiniteCanvasPort): string | undefined {\n if (typeof sourcePort.label === \"string\" && sourcePort.label.trim()) {\n return sourcePort.label;\n }\n if (typeof targetPort.label === \"string\" && targetPort.label.trim()) {\n return targetPort.label;\n }\n return undefined;\n}\n\nfunction resolveLeaderCurve(sourceX: number, sourceY: number, targetX: number, targetY: number, state: DerivedEdgeState): number {\n const horizontalDistance = Math.abs(targetX - sourceX);\n const verticalDistance = Math.abs(targetY - sourceY);\n\n if (horizontalDistance < 180 && verticalDistance < 120) {\n return EDGE_CURVATURE_SUBTLE;\n }\n\n if (horizontalDistance > 520 || verticalDistance > 320) {\n return state.highlighted || state.running ? EDGE_CURVATURE_DRAMATIC : 0.58;\n }\n\n return state.highlighted || state.running ? 0.58 : EDGE_CURVATURE_BASE;\n}\n\nfunction LeaderLineEdge({\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n markerEnd,\n className,\n data,\n style,\n}: {\n id: string;\n sourceX: number;\n sourceY: number;\n targetX: number;\n targetY: number;\n sourcePosition: Position;\n targetPosition: Position;\n markerEnd?: string;\n className?: string;\n data?: InfiniteCanvasEdgeData;\n style?: React.CSSProperties;\n}) {\n const isHighlighted = className?.includes(\"is-highlighted\");\n const isDimmed = className?.includes(\"is-dimmed\");\n const isRunning = Boolean(data?.isRunning);\n const curvature = resolveLeaderCurve(\n sourceX,\n sourceY,\n targetX,\n targetY,\n { highlighted: Boolean(isHighlighted), dimmed: Boolean(isDimmed), running: isRunning, selected: false },\n );\n const [edgePath, labelX, labelY] = getBezierPath({\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n curvature,\n });\n const baseStrokeColor = INFINITE_CANVAS_THEME_COLORS.edge;\n const highlightStrokeColor = INFINITE_CANVAS_THEME_COLORS.accent;\n const dimStrokeColor = `color-mix(in srgb, ${INFINITE_CANVAS_THEME_COLORS.edge} 32%, transparent)`;\n const strokeColor = isHighlighted\n ? highlightStrokeColor\n : isDimmed\n ? dimStrokeColor\n : baseStrokeColor;\n const flowColor = isHighlighted\n ? `color-mix(in srgb, ${INFINITE_CANVAS_THEME_COLORS.accent} 78%, white)`\n : `color-mix(in srgb, ${INFINITE_CANVAS_THEME_COLORS.accent} 58%, transparent)`;\n const plugMarkerId = `${id}-plug`;\n const endPlugMarkerId = `${id}-end-plug`;\n const mainStrokeWidth = isHighlighted ? 2.4 : 1.8;\n const labelClassName = [\n \"infinite-canvas-edge-label\",\n isHighlighted ? \"is-highlighted\" : \"\",\n isRunning ? \"is-running\" : \"\",\n ].filter(Boolean).join(\" \");\n\n return (\n <>\n <defs>\n <marker\n id={plugMarkerId}\n viewBox=\"0 0 10 10\"\n markerWidth=\"6\"\n markerHeight=\"6\"\n refX=\"5\"\n refY=\"5\"\n >\n <circle cx=\"5\" cy=\"5\" r=\"3\" fill={strokeColor} />\n </marker>\n <marker\n id={endPlugMarkerId}\n viewBox=\"0 0 12 12\"\n markerWidth=\"8.5\"\n markerHeight=\"8.5\"\n refX=\"6\"\n refY=\"6\"\n orient=\"auto-start-reverse\"\n >\n <circle cx=\"6\" cy=\"6\" r=\"3.9\" fill={strokeColor} />\n </marker>\n </defs>\n <g className={className}>\n <BaseEdge\n id={id}\n path={edgePath}\n className=\"infinite-canvas-edge__main\"\n markerStart={`url(#${plugMarkerId})`}\n markerEnd={markerEnd ?? `url(#${endPlugMarkerId})`}\n style={{\n ...style,\n stroke: strokeColor,\n strokeWidth: mainStrokeWidth,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n }}\n />\n {isRunning ? (\n <BaseEdge\n id={`${id}-flow`}\n path={edgePath}\n className=\"infinite-canvas-edge__flow\"\n style={{\n stroke: flowColor,\n strokeWidth: mainStrokeWidth + 0.35,\n }}\n />\n ) : null}\n {data?.label ? (\n <text x={labelX} y={labelY} textAnchor=\"middle\" className={labelClassName}>\n {String(data.label)}\n </text>\n ) : null}\n </g>\n </>\n );\n}\n\nconst EDGE_TYPES = {\n leaderLine: LeaderLineEdge,\n};\n\nfunction deriveEdgesFromNodePorts(\n nodeDescriptors: InfiniteCanvasNodeDescriptor[],\n nodePorts: InfiniteCanvasPortMap | undefined,\n): Array<Edge<InfiniteCanvasEdgeData>> {\n const targetPortsByToken = new Map<string, Array<{\n nodeId: string;\n port: InfiniteCanvasPort;\n }>>();\n\n for (const descriptor of nodeDescriptors) {\n const ports = resolvePortsForDescriptor(descriptor, nodePorts);\n for (const side of [\"left\", \"top\"] as const) {\n const rail = ports?.[side];\n if (!Array.isArray(rail)) continue;\n for (const port of rail) {\n const token = readPortToken(port);\n if (!token) continue;\n const list = targetPortsByToken.get(token) ?? [];\n list.push({ nodeId: descriptor.id, port });\n targetPortsByToken.set(token, list);\n }\n }\n }\n\n const edges: Array<Edge<InfiniteCanvasEdgeData>> = [];\n for (const descriptor of nodeDescriptors) {\n const ports = resolvePortsForDescriptor(descriptor, nodePorts);\n for (const side of [\"right\", \"bottom\"] as const) {\n const rail = ports?.[side];\n if (!Array.isArray(rail)) continue;\n for (const sourcePort of rail) {\n const token = readPortToken(sourcePort);\n const sourcePortId = typeof sourcePort.id === \"string\" ? sourcePort.id : \"\";\n if (!token || !sourcePortId) continue;\n const targets = targetPortsByToken.get(token) ?? [];\n for (const { nodeId: targetNodeId, port: targetPort } of targets) {\n const targetPortId = typeof targetPort.id === \"string\" ? targetPort.id : \"\";\n if (!targetPortId || descriptor.id === targetNodeId) continue;\n const state = mergeEdgeState(sourcePort, targetPort);\n edges.push({\n id: `${descriptor.id}::${targetNodeId}::${sourcePortId}::${targetPortId}::${token}`,\n source: descriptor.id,\n target: targetNodeId,\n sourceHandle: sourcePortId,\n targetHandle: targetPortId,\n data: {\n token,\n label: readEdgeLabel(sourcePort, targetPort),\n isRunning: state.running,\n },\n animated: state.running,\n className: [\n \"infinite-canvas-edge\",\n state.selected ? \"selected\" : \"\",\n state.highlighted ? \"is-highlighted\" : \"\",\n state.dimmed ? \"is-dimmed\" : \"\",\n state.running ? \"is-running\" : \"\",\n ].filter(Boolean).join(\" \"),\n type: \"leaderLine\",\n });\n }\n }\n }\n }\n return edges;\n}\n\nfunction resolveNodeEndpoints(ports: InfiniteCanvasPorts | null | undefined) {\n const sourcePosition = Array.isArray(ports?.right) && ports.right.length > 0\n ? Position.Right\n : Array.isArray(ports?.bottom) && ports.bottom.length > 0\n ? Position.Bottom\n : undefined;\n const targetPosition = Array.isArray(ports?.left) && ports.left.length > 0\n ? Position.Left\n : Array.isArray(ports?.top) && ports.top.length > 0\n ? Position.Top\n : undefined;\n return { sourcePosition, targetPosition };\n}\n\nexport const InfiniteCanvas = forwardRef<InfiniteCanvasRef, InfiniteCanvasProps>(function InfiniteCanvas(\n {\n stateKey,\n canvasState,\n onCanvasStateCommit,\n getInitialNodePos,\n nodes: nodeDescriptors = [],\n nodePorts,\n renderNode,\n renderNodePort,\n minZoom = 0.24,\n maxZoom = 1.35,\n fitViewOptions,\n miniMap = false,\n controls = false,\n background = DEFAULT_BACKGROUND,\n overlay = null,\n panOnScroll = true,\n selectionOnDrag = true,\n proOptions = DEFAULT_PRO_OPTIONS,\n className,\n viewportClassName,\n onViewportChange,\n onNodeClick,\n onEdgeClick,\n },\n ref\n) {\n const [instance, setInstance] = useState<ReactFlowInstance<Node<InternalNodeData>, Edge<InfiniteCanvasEdgeData>> | null>(null);\n const [rfNodes, setRfNodes, onNodesChange] = useNodesState<Node<InternalNodeData>>([]);\n const [isReady, setIsReady] = useState(false);\n const graphEdges = useMemo(\n () => deriveEdgesFromNodePorts(nodeDescriptors, nodePorts),\n [nodeDescriptors, nodePorts],\n );\n const nodeTypesRef = useRef(NODE_TYPES);\n\n const canvasStateRef = useRef(canvasState);\n canvasStateRef.current = canvasState;\n const nodePortsRef = useRef(nodePorts);\n nodePortsRef.current = nodePorts;\n const nodeDescriptorsRef = useRef(nodeDescriptors);\n nodeDescriptorsRef.current = nodeDescriptors;\n const renderNodeRef = useRef(renderNode);\n renderNodeRef.current = renderNode;\n const renderNodePortRef = useRef(renderNodePort);\n renderNodePortRef.current = renderNodePort;\n const getInitialNodePosRef = useRef(getInitialNodePos);\n getInitialNodePosRef.current = getInitialNodePos;\n const onCommitRef = useRef(onCanvasStateCommit);\n onCommitRef.current = onCanvasStateCommit;\n const rfNodesRef = useRef(rfNodes);\n rfNodesRef.current = rfNodes;\n\n const committedBlobRef = useRef(normalizeBlob(canvasState));\n const viewportRef = useRef<Viewport | null>(canvasState?.viewport ?? null);\n const hasInitializedViewportRef = useRef(false);\n\n const resolvePlacement = useCallback((descriptor: InfiniteCanvasNodeDescriptor, index: number, placed: Record<string, XYPosition>) => {\n const seeded = committedBlobRef.current?.nodes?.[descriptor.id];\n if (seeded && Number.isFinite(seeded.x) && Number.isFinite(seeded.y)) {\n return { position: { x: seeded.x, y: seeded.y }, fromInitial: false };\n }\n const initial = getInitialNodePosRef.current?.(descriptor, {\n index,\n nodeCount: nodeDescriptorsRef.current.length,\n nodes: nodeDescriptorsRef.current,\n placed,\n });\n if (initial && Number.isFinite(initial.x) && Number.isFinite(initial.y)) {\n return { position: { x: initial.x, y: initial.y }, fromInitial: true };\n }\n return { position: { x: 0, y: 0 }, fromInitial: true };\n }, []);\n\n const buildData = useCallback((descriptor: InfiniteCanvasNodeDescriptor): InternalNodeData => ({\n __node: descriptor,\n __ports: resolvePortsForDescriptor(descriptor, nodePortsRef.current),\n __renderNode: renderNodeRef.current,\n __renderNodePort: renderNodePortRef.current,\n }), []);\n\n const makeNode = useCallback((descriptor: InfiniteCanvasNodeDescriptor, position: XYPosition): Node<InternalNodeData> => {\n const width = descriptor.width;\n const ports = resolvePortsForDescriptor(descriptor, nodePortsRef.current);\n const { sourcePosition, targetPosition } = resolveNodeEndpoints(ports);\n return {\n id: descriptor.id,\n type: CANVAS_FRAME_TYPE,\n position,\n draggable: descriptor.draggable ?? true,\n sourcePosition,\n targetPosition,\n style: Number.isFinite(width) ? { width } : undefined,\n data: buildData(descriptor),\n };\n }, [buildData]);\n\n const buildBlob = useCallback(() => {\n const nodesBlob: Record<string, { x: number; y: number }> = {};\n for (const node of rfNodesRef.current) {\n nodesBlob[node.id] = { x: node.position.x, y: node.position.y };\n }\n return {\n v: 1,\n viewport: viewportRef.current ?? committedBlobRef.current?.viewport ?? null,\n nodes: nodesBlob,\n };\n }, []);\n\n const commitGeometry = useCallback(() => {\n const blob = buildBlob();\n if (deepEqualView(blob, committedBlobRef.current)) return;\n committedBlobRef.current = blob;\n onCommitRef.current?.(blob);\n }, [buildBlob]);\n\n useEffect(() => {\n committedBlobRef.current = normalizeBlob(canvasStateRef.current);\n viewportRef.current = canvasStateRef.current?.viewport ?? null;\n hasInitializedViewportRef.current = false;\n setIsReady(false);\n\n const placed: Record<string, XYPosition> = {};\n const seeded = nodeDescriptorsRef.current.map((descriptor, index) => {\n const { position } = resolvePlacement(descriptor, index, placed);\n placed[descriptor.id] = position;\n return makeNode(descriptor, position);\n });\n setRfNodes(seeded);\n }, [stateKey, makeNode, resolvePlacement, setRfNodes]);\n\n useEffect(() => {\n setRfNodes((current) => {\n const currentById = new Map(current.map((node) => [node.id, node]));\n const placed: Record<string, XYPosition> = {};\n let changed = current.length !== nodeDescriptors.length;\n\n const next = nodeDescriptors.map((descriptor, index) => {\n const existing = currentById.get(descriptor.id);\n const position = existing\n ? existing.position\n : resolvePlacement(descriptor, index, placed).position;\n placed[descriptor.id] = position;\n\n const width = descriptor.width;\n const ports = resolvePortsForDescriptor(descriptor, nodePorts);\n const sameNodeData = existing && (existing.data.__node === descriptor || deepEqualView(existing.data.__node, descriptor));\n const samePorts = existing && (existing.data.__ports === ports || deepEqualView(existing.data.__ports, ports));\n\n if (\n existing\n && existing.position === position\n && existing.style?.width === width\n && existing.draggable === (descriptor.draggable ?? true)\n && sameNodeData\n && samePorts\n && existing.data.__renderNode === renderNode\n && existing.data.__renderNodePort === renderNodePort\n ) {\n return existing;\n }\n\n changed = true;\n return {\n ...(existing ?? {}),\n id: descriptor.id,\n type: CANVAS_FRAME_TYPE,\n position,\n draggable: descriptor.draggable ?? true,\n ...resolveNodeEndpoints(ports),\n style: Number.isFinite(width) ? { width } : undefined,\n data: {\n __node: descriptor,\n __ports: ports,\n __renderNode: renderNode,\n __renderNodePort: renderNodePort,\n },\n } as Node<InternalNodeData>;\n });\n\n return changed ? next : current;\n });\n }, [nodeDescriptors, nodePorts, renderNode, renderNodePort, resolvePlacement, setRfNodes]);\n\n useEffect(() => {\n if (rfNodes.length === 0) return;\n const committedNodes = committedBlobRef.current?.nodes ?? {};\n if (rfNodes.some((node) => !committedNodes[node.id])) {\n commitGeometry();\n }\n }, [rfNodes, commitGeometry]);\n\n useEffect(() => {\n if (!instance || rfNodes.length === 0 || hasInitializedViewportRef.current) {\n return undefined;\n }\n hasInitializedViewportRef.current = true;\n const seedViewport = committedBlobRef.current?.viewport ?? null;\n\n const frame = window.requestAnimationFrame(() => {\n if (seedViewport) {\n instance.setViewport?.(seedViewport, { duration: 0 });\n viewportRef.current = seedViewport;\n } else {\n instance.fitView?.({ duration: 0, padding: 0.18, minZoom: 0.35, maxZoom: 1.08, ...fitViewOptions });\n viewportRef.current = instance.getViewport?.() ?? null;\n }\n onViewportChange?.(viewportRef.current);\n setIsReady(true);\n });\n\n return () => window.cancelAnimationFrame(frame);\n }, [instance, rfNodes.length, fitViewOptions, onViewportChange]);\n\n const handleMoveEnd = useCallback(() => {\n viewportRef.current = instance?.getViewport?.() ?? viewportRef.current;\n onViewportChange?.(viewportRef.current);\n commitGeometry();\n }, [commitGeometry, instance, onViewportChange]);\n\n const handleNodeDragStop = useCallback(() => {\n const frame = window.requestAnimationFrame(() => commitGeometry());\n return () => window.cancelAnimationFrame(frame);\n }, [commitGeometry]);\n\n useImperativeHandle(ref, () => ({\n fitView: (opts) => (instance as { fitView?: (value?: unknown) => void } | null)?.fitView?.(opts),\n setViewport: (viewport, opts) => (instance as { setViewport?: (value: Viewport, options?: { duration?: number }) => void } | null)?.setViewport?.(viewport, opts),\n setCenter: (x, y, opts) => (instance as { setCenter?: (cx: number, cy: number, options?: { zoom?: number; duration?: number }) => void } | null)?.setCenter?.(x, y, opts),\n getViewport: () => (instance as { getViewport?: () => Viewport } | null)?.getViewport?.(),\n getNode: (id) => (instance as { getNode?: (nodeId: string) => Node | undefined } | null)?.getNode?.(id),\n instance,\n }), [instance]);\n\n return (\n <div className={viewportClassName}>\n <ReactFlow<Node<InternalNodeData>, Edge<InfiniteCanvasEdgeData>>\n nodes={rfNodes}\n edges={graphEdges}\n nodeTypes={nodeTypesRef.current}\n edgeTypes={EDGE_TYPES}\n minZoom={minZoom}\n maxZoom={maxZoom}\n proOptions={proOptions}\n className={className}\n style={isReady ? undefined : { visibility: \"hidden\" }}\n panOnScroll={panOnScroll}\n selectionOnDrag={selectionOnDrag}\n onInit={setInstance}\n onMoveEnd={handleMoveEnd}\n onNodesChange={onNodesChange}\n onNodeDragStop={handleNodeDragStop}\n onNodeClick={(_, node) => onNodeClick?.(node.id)}\n onEdgeClick={(_, edge) => onEdgeClick?.(String(edge.data?.token ?? edge.id))}\n >\n {overlay}\n {miniMap ? <MiniMap pannable zoomable {...(typeof miniMap === \"object\" ? miniMap : {})} /> : null}\n {controls ? <Controls showInteractive={false} {...(typeof controls === \"object\" ? controls : {})} /> : null}\n {background ? <Background {...background} /> : null}\n </ReactFlow>\n </div>\n );\n});\n\nexport default InfiniteCanvas;\n","import React from \"react\";\nimport { Card, Text, makeStyles, mergeClasses, tokens } from \"@fluentui/react-components\";\nimport type { Json } from \"@gik-ai/kernel\";\nimport { runDeclarativeValidators } from \"@gik-ai/evaluators\";\nimport type { ProjectionView } from \"@gik-ai/react\";\nimport { Handle } from \"@xyflow/react\";\nimport {\n InfiniteCanvas,\n type InfiniteCanvasNodeDescriptor,\n type InfiniteCanvasPort,\n type InfiniteCanvasPortMap,\n type InfiniteCanvasPorts,\n} from \"./InfiniteCanvas\";\nimport {\n defineComponent,\n eventContract,\n trialNode,\n type ComponentDescription,\n type ComponentValidationReport,\n} from \"../../shared/definition\";\nimport { componentRootProps, componentStylePropsSchema } from \"../../shared/component\";\n\nexport const INFINITE_CANVAS_VARIANTS = [\"standard\", \"compact\", \"minimal\"] as const;\nexport const INFINITE_CANVAS_SEMANTIC_TOKENS = [\"accent\", \"danger\", \"warning\", \"success\", \"neutral\"] as const;\n\ntype InfiniteCanvasVariant = typeof INFINITE_CANVAS_VARIANTS[number];\ntype InfiniteCanvasToken = typeof INFINITE_CANVAS_SEMANTIC_TOKENS[number];\n\nexport interface DeclarativeInfiniteCanvasNode extends InfiniteCanvasNodeDescriptor {\n title: string;\n detail?: string;\n eyebrow?: string;\n tone?: InfiniteCanvasToken;\n}\n\nconst canvasThemeVariables = {\n \"--xy-edge-stroke\": tokens.colorNeutralStrokeAccessible,\n \"--xy-edge-stroke-selected\": tokens.colorBrandStroke1,\n \"--xy-connectionline-stroke\": tokens.colorBrandStroke1,\n \"--xy-background-color\": tokens.colorNeutralBackground2,\n \"--xy-background-pattern-color\": tokens.colorNeutralStroke2,\n \"--xy-minimap-background-color\": tokens.colorNeutralBackground1,\n \"--xy-minimap-mask-background-color\": tokens.colorNeutralBackgroundAlpha2,\n \"--xy-minimap-node-background-color\": tokens.colorNeutralBackground3,\n \"--xy-minimap-node-stroke-color\": tokens.colorNeutralStroke1,\n \"--xy-selection-background-color\": tokens.colorBrandBackground2,\n \"--xy-selection-border\": `1px dotted ${tokens.colorBrandStroke1}`,\n} as React.CSSProperties;\n\nexport interface DeclarativeInfiniteCanvasModel {\n nodes: DeclarativeInfiniteCanvasNode[];\n nodePorts: Record<string, InfiniteCanvasPorts | null | undefined>;\n}\n\nconst portSchema = {\n type: \"object\",\n additionalProperties: false,\n required: [\"id\", \"token\"],\n properties: {\n id: { type: \"string\", minLength: 1 },\n token: { type: \"string\", minLength: 1 },\n label: { type: \"string\" },\n selected: { type: \"boolean\" },\n highlighted: { type: \"boolean\" },\n dimmed: { type: \"boolean\" },\n running: { type: \"boolean\" },\n },\n} as const;\n\nconst portsSchema = {\n type: [\"object\", \"null\"],\n additionalProperties: false,\n properties: {\n top: { type: \"array\", items: portSchema },\n bottom: { type: \"array\", items: portSchema },\n left: { type: \"array\", items: portSchema },\n right: { type: \"array\", items: portSchema },\n },\n} as const;\n\nconst schema = {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n additionalProperties: false,\n required: [\"stateKey\", \"nodes\", \"nodePorts\"],\n properties: {\n ...componentStylePropsSchema,\n stateKey: { type: \"string\", minLength: 1 },\n nodes: {\n type: \"array\",\n items: {\n type: \"object\",\n additionalProperties: false,\n required: [\"id\", \"title\"],\n properties: {\n id: { type: \"string\", minLength: 1 },\n title: { type: \"string\", minLength: 1 },\n detail: { type: \"string\" },\n eyebrow: { type: \"string\" },\n tone: { enum: INFINITE_CANVAS_SEMANTIC_TOKENS },\n width: { type: \"number\", minimum: 120, maximum: 640 },\n draggable: { type: \"boolean\" },\n },\n },\n },\n nodePorts: { type: \"object\", additionalProperties: portsSchema },\n canvasState: {\n type: [\"object\", \"null\"],\n additionalProperties: false,\n properties: {\n v: { type: \"number\" },\n viewport: {\n type: [\"object\", \"null\"],\n additionalProperties: false,\n required: [\"x\", \"y\", \"zoom\"],\n properties: { x: { type: \"number\" }, y: { type: \"number\" }, zoom: { type: \"number\" } },\n },\n nodes: {\n type: \"object\",\n additionalProperties: {\n type: \"object\",\n additionalProperties: false,\n required: [\"x\", \"y\"],\n properties: { x: { type: \"number\" }, y: { type: \"number\" } },\n },\n },\n },\n },\n variant: { enum: INFINITE_CANVAS_VARIANTS },\n height: { type: [\"number\", \"string\"] },\n minZoom: { type: \"number\", exclusiveMinimum: 0 },\n maxZoom: { type: \"number\", exclusiveMinimum: 0 },\n miniMap: { type: \"boolean\" },\n controls: { type: \"boolean\" },\n background: { type: \"boolean\" },\n panOnScroll: { type: \"boolean\" },\n selectionOnDrag: { type: \"boolean\" },\n ariaLabel: { type: \"string\", minLength: 1 },\n },\n} as const;\n\nconst useStyles = makeStyles({\n root: {\n position: \"relative\",\n width: \"100%\",\n minWidth: 0,\n minHeight: \"20rem\",\n overflow: \"hidden\",\n border: `${tokens.strokeWidthThin} solid ${tokens.colorNeutralStroke2}`,\n borderRadius: tokens.borderRadiusMedium,\n backgroundColor: tokens.colorNeutralBackground2,\n \"& .react-flow__controls\": { borderRadius: tokens.borderRadiusMedium, boxShadow: tokens.shadow4, overflow: \"hidden\" },\n \"& .react-flow__controls-button\": { color: tokens.colorNeutralForeground1, backgroundColor: tokens.colorNeutralBackground1, border: `1px solid ${tokens.colorNeutralStroke2}`, cursor: \"pointer\" },\n \"& .react-flow__controls-button:hover\": { backgroundColor: tokens.colorNeutralBackground1Hover },\n \"& .infinite-canvas-node__row\": { display: \"flex\", alignItems: \"center\" },\n \"& .infinite-canvas-node__body\": { flex: \"1 1 auto\", minWidth: 0 },\n \"& .infinite-canvas-node__rail\": { display: \"flex\", alignItems: \"center\", justifyContent: \"center\", gap: tokens.spacingHorizontalXS },\n \"& .infinite-canvas-node__rail--left, & .infinite-canvas-node__rail--right\": { flexDirection: \"column\" },\n },\n viewport: { width: \"100%\", height: \"100%\" },\n node: {\n width: \"100%\",\n minWidth: 0,\n padding: tokens.spacingHorizontalL,\n borderTop: `4px solid ${tokens.colorNeutralStroke1}`,\n boxShadow: tokens.shadow4,\n },\n compactNode: { padding: tokens.spacingHorizontalM },\n minimalNode: { padding: tokens.spacingHorizontalS, boxShadow: tokens.shadow2 },\n accent: { borderTopColor: tokens.colorBrandBackground },\n danger: { borderTopColor: tokens.colorPaletteRedBackground3 },\n warning: { borderTopColor: tokens.colorPaletteDarkOrangeBackground3 },\n success: { borderTopColor: tokens.colorPaletteGreenBackground3 },\n eyebrow: { display: \"block\", color: tokens.colorNeutralForeground3, fontSize: tokens.fontSizeBase100, fontWeight: tokens.fontWeightSemibold, textTransform: \"uppercase\" },\n title: { display: \"block\", marginTop: tokens.spacingVerticalXXS, overflowWrap: \"anywhere\" },\n detail: { display: \"block\", marginTop: tokens.spacingVerticalXS, color: tokens.colorNeutralForeground3, overflowWrap: \"anywhere\" },\n port: { width: \"10px\", height: \"10px\", border: `2px solid ${tokens.colorNeutralBackground1}`, borderRadius: \"50%\", backgroundColor: tokens.colorBrandBackground, boxShadow: `0 0 0 1px ${tokens.colorBrandBackground}` },\n leftPort: { transform: \"translate(-100%, -50%)\" },\n rightPort: { transform: \"translate(100%, -50%)\" },\n topPort: { transform: \"translate(-50%, -100%)\" },\n bottomPort: { transform: \"translate(-50%, 100%)\" },\n accessibleSummary: { position: \"absolute\", width: \"1px\", height: \"1px\", padding: 0, margin: \"-1px\", overflow: \"hidden\", clip: \"rect(0, 0, 0, 0)\", whiteSpace: \"nowrap\", border: 0 },\n});\n\nfunction nodeClass(styles: ReturnType<typeof useStyles>, tone: InfiniteCanvasToken | undefined, variant: InfiniteCanvasVariant): string {\n return mergeClasses(\n styles.node,\n variant === \"compact\" && styles.compactNode,\n variant === \"minimal\" && styles.minimalNode,\n tone === \"accent\" && styles.accent,\n tone === \"danger\" && styles.danger,\n tone === \"warning\" && styles.warning,\n tone === \"success\" && styles.success,\n );\n}\n\nexport const InfiniteCanvasPrimitive: ProjectionView = ({ node, emit }) => {\n const styles = useStyles();\n const descriptors = Array.isArray(node.props.nodes) ? node.props.nodes as unknown as DeclarativeInfiniteCanvasNode[] : [];\n const nodePorts = node.props.nodePorts && typeof node.props.nodePorts === \"object\" && !Array.isArray(node.props.nodePorts)\n ? node.props.nodePorts as unknown as InfiniteCanvasPortMap\n : {};\n const variant = INFINITE_CANVAS_VARIANTS.includes(node.props.variant as InfiniteCanvasVariant)\n ? node.props.variant as InfiniteCanvasVariant\n : \"standard\";\n const height = typeof node.props.height === \"number\" || typeof node.props.height === \"string\" ? node.props.height : \"32rem\";\n const root = componentRootProps(node, styles.root);\n return <section {...root} style={{ ...canvasThemeVariables, ...root.style, height }} aria-label={typeof node.props.ariaLabel === \"string\" ? node.props.ariaLabel : \"Infinite canvas\"}>\n <ul className={styles.accessibleSummary}>{descriptors.map((descriptor) => <li key={descriptor.id}>{descriptor.title}{descriptor.detail ? `: ${descriptor.detail}` : \"\"}</li>)}</ul>\n <InfiniteCanvas\n stateKey={String(node.props.stateKey ?? node.id)}\n canvasState={node.props.canvasState as never}\n nodes={descriptors}\n nodePorts={nodePorts}\n minZoom={typeof node.props.minZoom === \"number\" ? node.props.minZoom : undefined}\n maxZoom={typeof node.props.maxZoom === \"number\" ? node.props.maxZoom : undefined}\n miniMap={node.props.miniMap === true}\n controls={node.props.controls === true}\n background={node.props.background === false ? false : undefined}\n panOnScroll={node.props.panOnScroll !== false}\n selectionOnDrag={node.props.selectionOnDrag !== false}\n viewportClassName={styles.viewport}\n getInitialNodePos={(_, context) => ({ x: (context.index % 3) * 300, y: Math.floor(context.index / 3) * 210 })}\n renderNode={(descriptor) => {\n const item = descriptor as DeclarativeInfiniteCanvasNode;\n return <Card appearance=\"outline\" className={nodeClass(styles, item.tone, variant)}>\n {item.eyebrow && variant !== \"minimal\" ? <Text className={styles.eyebrow}>{item.eyebrow}</Text> : null}\n <Text className={styles.title} weight=\"semibold\" size={variant === \"standard\" ? 400 : 300}>{item.title}</Text>\n {item.detail && variant === \"standard\" ? <Text className={styles.detail} size={200}>{item.detail}</Text> : null}\n </Card>;\n }}\n renderNodePort={(port: InfiniteCanvasPort, context) => {\n const sideClass = context.side === \"left\"\n ? styles.leftPort\n : context.side === \"right\"\n ? styles.rightPort\n : context.side === \"top\"\n ? styles.topPort\n : styles.bottomPort;\n return <Handle id={String(port.id)} type={context.side === \"left\" || context.side === \"top\" ? \"target\" : \"source\"} position={context.position} className={mergeClasses(styles.port, sideClass)} title={typeof port.label === \"string\" ? port.label : undefined} />;\n }}\n onCanvasStateCommit={(value) => { void emit(\"layout\", { value: value as unknown as Json }); }}\n onNodeClick={(id) => { void emit(\"node\", { id }); }}\n onEdgeClick={(id) => { void emit(\"edge\", { id }); }}\n />\n </section>;\n};\n\nconst description: ComponentDescription = {\n capability: \"primitive:infinite-canvas\",\n summary: \"Renders declarative node cards on a persistent pan-and-zoom canvas and derives edges from matching node-port tokens.\",\n dataProp: \"nodes\",\n events: [\"node\", \"edge\", \"layout\"],\n eventContracts: {\n node: eventContract(\"The user selects a canvas node.\", { id: { type: \"string\" } }),\n edge: eventContract(\"The user selects a derived canvas edge.\", { id: { type: \"string\" } }),\n layout: eventContract(\"The canvas commits its current viewport and node positions.\", { value: { type: \"object\", additionalProperties: true } }),\n },\n semanticTokens: INFINITE_CANVAS_SEMANTIC_TOKENS,\n defaultVariant: \"standard\",\n variants: [\n { value: \"standard\", summary: \"Full node cards with eyebrow, title, and detail.\", useWhen: [\"The graph is a primary exploratory surface\", \"Node detail should remain visible\"] },\n { value: \"compact\", summary: \"Compact cards with eyebrow and title.\", useWhen: [\"The graph contains many nodes\", \"Labels matter more than prose detail\"] },\n { value: \"minimal\", summary: \"Small title-only cards.\", useWhen: [\"Topology is the primary information\", \"The canvas must accommodate a dense graph\"] },\n ],\n authoring: {\n useWhen: [\"Users need to pan, zoom, and reposition a node topology\", \"Connections can be represented by matching source and target port tokens\"],\n avoidWhen: [\"A static relationship list is sufficient\", \"The data has no stable node identities\"],\n rules: [\"Provide unique stable node ids\", \"Declare input ports on left or top and output ports on right or bottom\", \"Use one shared token for each intended source-target connection\", \"Do not author an explicit edge array\", \"Persist layout events back into canvasState when layout continuity is required\"],\n },\n};\n\nexport function getInfiniteCanvasSchema(): Record<string, unknown> { return schema as unknown as Record<string, unknown>; }\nexport function describeInfiniteCanvas(): ComponentDescription { return description; }\nexport function validateInfiniteCanvas(props: unknown): ComponentValidationReport {\n return runDeclarativeValidators([\n { kind: \"ajv-schema\", schema: getInfiniteCanvasSchema(), message: \"Invalid primitive:infinite-canvas props\", code: \"primitive-infinite-canvas-schema\" },\n { kind: \"jsonata\", expr: \"$count(data.nodes.id) = $count($distinct(data.nodes.id))\", message: \"Infinite canvas node ids must be unique\", code: \"infinite-canvas-unique-node-id\" },\n ], props as Json);\n}\nexport function materializeInfiniteCanvasTrial() {\n return trialNode(\"primitive:infinite-canvas\", {\n stateKey: \"infinite-canvas-trial\",\n variant: \"standard\",\n height: 420,\n controls: true,\n nodes: [\n { id: \"source\", title: \"Source system\", detail: \"Observed identity provider\", eyebrow: \"Origin\", tone: \"neutral\", width: 240 },\n { id: \"target\", title: \"Protected resource\", detail: \"Accessed application\", eyebrow: \"Target\", tone: \"danger\", width: 240 },\n ],\n nodePorts: {\n source: { right: [{ id: \"access:source\", token: \"relationship:access\", label: \"accessed\" }] },\n target: { left: [{ id: \"access:target\", token: \"relationship:access\", label: \"accessed\" }] },\n },\n });\n}\nexport const infiniteCanvasDefinition = defineComponent({ description, version: \"1.0.0\", component: InfiniteCanvasPrimitive, getSchema: getInfiniteCanvasSchema, validate: validateInfiniteCanvas, materializeTrial: materializeInfiniteCanvasTrial });\n","import React from \"react\";\nimport { Text, makeStyles, tokens } from \"@fluentui/react-components\";\nimport type { Json } from \"@gik-ai/kernel\";\nimport { runDeclarativeValidators } from \"@gik-ai/evaluators\";\nimport type { ProjectionView } from \"@gik-ai/react\";\n\nimport {\n InfiniteCanvasPrimitive,\n infiniteCanvasDefinition,\n type DeclarativeInfiniteCanvasModel,\n} from \"../infinite-canvas\";\nimport { componentRootProps, componentStylePropsSchema } from \"../../shared/component\";\nimport { componentNode, defineComponent, trialNode, type ComponentDescription, type ComponentValidationReport } from \"../../shared/definition\";\n\nexport const GRAPH_DIAGRAM_VARIANTS = [\"diagram\", \"canvas\"] as const;\nexport const GRAPH_DIAGRAM_TONES = [\"accent\", \"danger\", \"warning\", \"success\", \"neutral\"] as const;\n\ntype GraphDiagramVariant = typeof GRAPH_DIAGRAM_VARIANTS[number];\ntype GraphDiagramTone = typeof GRAPH_DIAGRAM_TONES[number];\n\nexport interface GraphDiagramNode {\n id: string;\n label: string;\n detail?: string;\n category?: string;\n tone?: GraphDiagramTone;\n}\n\nexport interface GraphDiagramEdge {\n id: string;\n source: string;\n target: string;\n label?: string;\n directed?: boolean;\n}\n\nexport interface GraphDiagramModel {\n nodes: GraphDiagramNode[];\n edges: GraphDiagramEdge[];\n}\n\ninterface GraphDiagramSpec {\n title?: string;\n description?: string;\n emptyText?: string;\n layout?: \"radial\" | \"hierarchical\";\n interaction?: { pan?: boolean; zoom?: boolean; selection?: boolean };\n}\n\nconst schema = {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n additionalProperties: false,\n required: [\"graph\", \"spec\"],\n properties: {\n ...componentStylePropsSchema,\n graph: {\n type: \"object\",\n additionalProperties: false,\n required: [\"nodes\", \"edges\"],\n properties: {\n nodes: { type: \"array\", items: { type: \"object\", additionalProperties: false, required: [\"id\", \"label\"], properties: {\n id: { type: \"string\", minLength: 1 }, label: { type: \"string\", minLength: 1 }, detail: { type: \"string\" }, category: { type: \"string\" }, tone: { enum: GRAPH_DIAGRAM_TONES },\n } } },\n edges: { type: \"array\", items: { type: \"object\", additionalProperties: false, required: [\"id\", \"source\", \"target\"], properties: {\n id: { type: \"string\", minLength: 1 }, source: { type: \"string\", minLength: 1 }, target: { type: \"string\", minLength: 1 }, label: { type: \"string\" }, directed: { type: \"boolean\" },\n } } },\n },\n },\n variant: { enum: GRAPH_DIAGRAM_VARIANTS },\n spec: { type: \"object\", additionalProperties: false, properties: {\n title: { type: \"string\" }, description: { type: \"string\" }, emptyText: { type: \"string\" }, layout: { enum: [\"radial\", \"hierarchical\"] },\n interaction: { type: \"object\", additionalProperties: false, properties: { pan: { type: \"boolean\" }, zoom: { type: \"boolean\" }, selection: { type: \"boolean\" } } },\n } },\n stateKey: { type: \"string\", minLength: 1 }, canvasState: { type: [\"object\", \"null\"] }, height: { type: [\"number\", \"string\"] }, miniMap: { type: \"boolean\" }, controls: { type: \"boolean\" }, background: { type: \"boolean\" },\n },\n} as const;\n\nconst useStyles = makeStyles({\n root: { display: \"grid\", gap: tokens.spacingVerticalM, minWidth: 0 },\n header: { display: \"grid\", gap: tokens.spacingVerticalXXS },\n description: { color: tokens.colorNeutralForeground3 },\n diagram: { width: \"100%\", minHeight: \"20rem\", backgroundColor: tokens.colorNeutralBackground2, border: `${tokens.strokeWidthThin} solid ${tokens.colorNeutralStroke2}`, borderRadius: tokens.borderRadiusMedium },\n});\n\nfunction toneFill(tone: GraphDiagramTone | undefined): string {\n if (tone === \"accent\") return tokens.colorBrandBackground;\n if (tone === \"danger\") return tokens.colorPaletteRedBackground3;\n if (tone === \"warning\") return tokens.colorPaletteDarkOrangeBackground3;\n if (tone === \"success\") return tokens.colorPaletteGreenBackground3;\n return tokens.colorNeutralBackground4;\n}\n\nfunction toneForeground(tone: GraphDiagramTone | undefined): string {\n return tone && tone !== \"neutral\" ? tokens.colorNeutralForegroundOnBrand : tokens.colorNeutralForeground1;\n}\n\nfunction positions(nodes: GraphDiagramNode[], layout: GraphDiagramSpec[\"layout\"]) {\n if (layout === \"hierarchical\") {\n const columns = Math.max(1, Math.ceil(Math.sqrt(nodes.length)));\n return new Map(nodes.map((node, index) => [node.id, { x: columns === 1 ? 320 : 120 + (index % columns) * (400 / (columns - 1)), y: 80 + Math.floor(index / columns) * 150 }]));\n }\n return new Map(nodes.map((node, index) => { const angle = (Math.PI * 2 * index) / Math.max(1, nodes.length) - Math.PI / 2; const radius = nodes.length <= 3 ? 105 : 135; return [node.id, { x: 320 + Math.cos(angle) * radius, y: 180 + Math.sin(angle) * radius }]; }));\n}\n\nfunction wrapLabel(label: string, maxLineLength = 26): string[] {\n const words = label.split(/\\s+/).flatMap((word) => word.length <= maxLineLength ? [word] : word.match(new RegExp(`.{1,${maxLineLength}}`, \"g\")) ?? [word]);\n return words.reduce<string[]>((lines, word) => {\n const current = lines.at(-1);\n if (!current || current.length + word.length + 1 > maxLineLength) lines.push(word);\n else lines[lines.length - 1] = `${current} ${word}`;\n return lines;\n }, []);\n}\n\nexport function buildGraphCanvasModel(graph: GraphDiagramModel): DeclarativeInfiniteCanvasModel {\n const nodePorts: DeclarativeInfiniteCanvasModel[\"nodePorts\"] = Object.fromEntries(graph.nodes.map((node) => [node.id, {}]));\n const ids = new Set(graph.nodes.map((node) => node.id));\n for (const edge of graph.edges) {\n if (!ids.has(edge.source) || !ids.has(edge.target) || edge.source === edge.target) continue;\n const token = `edge:${edge.id}`;\n nodePorts[edge.source] = { ...nodePorts[edge.source], right: [...(nodePorts[edge.source]?.right ?? []), { id: `${edge.id}:source`, token, label: edge.label ?? \"\" }] };\n nodePorts[edge.target] = { ...nodePorts[edge.target], left: [...(nodePorts[edge.target]?.left ?? []), { id: `${edge.id}:target`, token, label: edge.label ?? \"\" }] };\n }\n return { nodes: graph.nodes.map((node) => ({ id: node.id, title: node.label, detail: node.detail, eyebrow: node.category, tone: node.tone, width: 250 })), nodePorts };\n}\n\nexport const GraphDiagram: ProjectionView = ({ node, emit }) => {\n const styles = useStyles();\n const graph = (node.props.graph ?? { nodes: [], edges: [] }) as unknown as GraphDiagramModel;\n const spec = (node.props.spec ?? {}) as unknown as GraphDiagramSpec;\n const variant = (node.props.variant ?? \"diagram\") as GraphDiagramVariant;\n if (!Array.isArray(graph.nodes) || graph.nodes.length === 0) return <Text {...componentRootProps(node)}>{spec.emptyText ?? \"No graph data.\"}</Text>;\n const header = spec.title || spec.description ? <header className={styles.header}>{spec.title ? <Text weight=\"semibold\" size={500}>{spec.title}</Text> : null}{spec.description ? <Text className={styles.description}>{spec.description}</Text> : null}</header> : null;\n\n if (variant === \"canvas\") {\n const model = buildGraphCanvasModel(graph);\n return <section {...componentRootProps(node, styles.root)}>{header}<InfiniteCanvasPrimitive node={componentNode(`${node.id}-canvas`, \"primitive:infinite-canvas\", {\n nodes: model.nodes as unknown as Json, nodePorts: model.nodePorts as unknown as Json, stateKey: String(node.props.stateKey ?? node.id), canvasState: (node.props.canvasState ?? null) as Json,\n height: node.props.height ?? \"34rem\", variant: \"standard\", miniMap: node.props.miniMap ?? spec.interaction?.zoom !== false, controls: node.props.controls ?? spec.interaction?.zoom !== false, background: node.props.background ?? true, panOnScroll: spec.interaction?.pan !== false, selectionOnDrag: spec.interaction?.selection !== false,\n ariaLabel: spec.title ?? \"Graph diagram\",\n })} emit={emit} children={undefined} /></section>;\n }\n\n const byId = positions(graph.nodes, spec.layout ?? \"radial\");\n return <section {...componentRootProps(node, styles.root)}>{header}<svg className={styles.diagram} viewBox=\"0 0 640 360\" role=\"img\"><title>{spec.title ?? \"Graph diagram\"}</title><desc>{spec.description ?? `${graph.nodes.length} nodes and ${graph.edges.length} edges`}</desc>\n <defs><marker id={`${node.id}-arrow`} markerWidth=\"8\" markerHeight=\"8\" refX=\"7\" refY=\"4\" orient=\"auto\"><path d=\"M0,0 L8,4 L0,8 Z\" fill={tokens.colorNeutralStroke1} /></marker></defs>\n {graph.edges.map((edge) => { const source = byId.get(edge.source); const target = byId.get(edge.target); if (!source || !target) return null; return <g key={edge.id}><line x1={source.x} y1={source.y} x2={target.x} y2={target.y} stroke={tokens.colorNeutralStroke1} strokeWidth=\"2\" markerEnd={edge.directed ? `url(#${node.id}-arrow)` : undefined} />{edge.label ? <text x={(source.x + target.x) / 2} y={(source.y + target.y) / 2 - 6} textAnchor=\"middle\" fill={tokens.colorNeutralForeground3} fontSize=\"11\">{edge.label}</text> : null}</g>; })}\n {graph.nodes.map((item) => { const position = byId.get(item.id)!; const lines = wrapLabel(item.label); const longLabel = lines.length > 1; const textY = position.y - ((lines.length - 1) * 7); return <g key={item.id} aria-label={item.label}><title>{item.label}</title>{longLabel ? <rect x={position.x - 105} y={position.y - 42} width=\"210\" height=\"84\" rx=\"8\" fill={toneFill(item.tone)} stroke={tokens.colorNeutralStroke1} /> : <circle cx={position.x} cy={position.y} r=\"46\" fill={toneFill(item.tone)} stroke={tokens.colorNeutralStroke1} />}<text x={position.x} y={textY} textAnchor=\"middle\" dominantBaseline=\"middle\" fill={toneForeground(item.tone)} fontSize=\"13\">{lines.map((line, index) => <tspan x={position.x} dy={index === 0 ? 0 : 14} key={`${item.id}-${index}`}>{line}</tspan>)}</text></g>; })}\n </svg></section>;\n};\n\nconst description: ComponentDescription = {\n capability: \"primitive:graph-diagram\", summary: \"Renders normalized nodes and edges as a static diagram or interactive canvas without assigning relationship meaning.\", dataProp: \"graph\", events: [\"node\", \"edge\", \"layout\"], eventContracts: infiniteCanvasDefinition.eventContracts, semanticTokens: GRAPH_DIAGRAM_TONES, defaultVariant: \"diagram\",\n variants: [\n { value: \"diagram\", summary: \"Static node-edge diagram.\", useWhen: [\"Topology should be inspected without canvas interaction\"] },\n { value: \"canvas\", summary: \"Interactive pan-and-zoom graph canvas.\", useWhen: [\"Users need to explore or reposition a larger graph\"] },\n ],\n authoring: { useWhen: [\"A caller has already normalized records into nodes and edges\"], avoidWhen: [\"Relationship meaning or domain validation has not yet been resolved\"], rules: [\"Provide stable unique node and edge IDs\", \"Reference only declared node IDs\", \"Assign semantic meaning before lowering into this primitive\"] },\n};\n\nexport function getGraphDiagramSchema(): Record<string, unknown> { return schema as unknown as Record<string, unknown>; }\nexport function validateGraphDiagram(props: unknown): ComponentValidationReport { return runDeclarativeValidators([\n { kind: \"ajv-schema\", schema: getGraphDiagramSchema(), message: \"Invalid primitive:graph-diagram props\", code: \"graph-diagram-schema\" },\n { kind: \"jsonata\", expr: \"$count(data.graph.nodes.id) = $count($distinct(data.graph.nodes.id)) and $count(data.graph.edges.id) = $count($distinct(data.graph.edges.id))\", message: \"Graph node and edge IDs must be unique\", code: \"graph-diagram-unique-id\" },\n { kind: \"jsonata\", expr: \"($ids := data.graph.nodes.id; $count(data.graph.edges[source in $ids and target in $ids]) = $count(data.graph.edges))\", message: \"Graph edges must reference declared node IDs\", code: \"graph-diagram-reference\" },\n], props as Json); }\nexport function materializeGraphDiagramTrial() { return trialNode(\"primitive:graph-diagram\", { variant: \"diagram\", graph: { nodes: [{ id: \"source\", label: \"Source\", tone: \"accent\" }, { id: \"target\", label: \"Target\", tone: \"neutral\" }], edges: [{ id: \"connection\", source: \"source\", target: \"target\", label: \"connects\", directed: true }] }, spec: { title: \"Graph diagram\", layout: \"radial\" } }); }\nexport const graphDiagramDefinition = defineComponent({ description, version: \"1.0.0\", component: GraphDiagram, getSchema: getGraphDiagramSchema, validate: validateGraphDiagram, materializeTrial: materializeGraphDiagramTrial });","import { formatTime, formatTimestamp } from \"./dateTimeFormat\";\n\nexport const MAX_COORDINATE_TICKS = 101;\n\nexport interface CoordinateScale {\n kind: \"datetime\" | \"linear\";\n hourFormat?: \"24\" | \"12\";\n displayPrefix?: string;\n minimum?: number;\n maximum?: number;\n tickStep?: number;\n showSeconds?: boolean;\n showTimeZone?: boolean;\n}\n\nexport function parseCoordinate(value: unknown, scale: CoordinateScale): number {\n if (scale.kind === \"datetime\") return typeof value === \"string\" ? Date.parse(value) : Number.NaN;\n return typeof value === \"number\" ? value : Number.NaN;\n}\n\nexport function formatCoordinate(value: unknown, scale: CoordinateScale): string {\n const text = value == null ? \"\" : String(value);\n if (scale.kind === \"datetime\") {\n return formatTimestamp(text, {\n hourFormat: scale.hourFormat,\n showSeconds: scale.showSeconds,\n showTimeZone: scale.showTimeZone,\n });\n }\n return scale.displayPrefix ? `${scale.displayPrefix}${text}` : text;\n}\n\nexport function formatAxisCoordinate(value: number, scale: CoordinateScale): string {\n return scale.kind === \"datetime\"\n ? formatTime(value, {\n hourFormat: scale.hourFormat,\n showSeconds: scale.showSeconds,\n showTimeZone: scale.showTimeZone,\n })\n : formatCoordinate(value, scale);\n}\n\nexport function coordinateTicks(minimum: number, maximum: number, tickStep?: number): number[] {\n if (tickStep === undefined || tickStep <= 0 || maximum < minimum) return [];\n const count = Math.floor((maximum - minimum) / tickStep) + 1;\n return Array.from({ length: Math.min(MAX_COORDINATE_TICKS, count) }, (_, index) => minimum + index * tickStep)\n .filter((value) => value <= maximum);\n}\n\nexport function coordinateTickCountExceedsLimit(minimum: number, maximum: number, tickStep?: number): boolean {\n return tickStep !== undefined\n && tickStep > 0\n && Math.floor((maximum - minimum) / tickStep) + 1 > MAX_COORDINATE_TICKS;\n}\n"],"mappings":"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","names":["DATE_TIME_PRESENTATIONS","timeOptions","hourFormat","showSeconds","showTimeZone","dateOptions","date","now","formatDateTime","value","presentation","options","formatDate","formatTime","formatTimestamp","React","forwardRef","memo","useCallback","useEffect","useImperativeHandle","useMemo","useRef","useState","BaseEdge","Background","Controls","getBezierPath","MiniMap","Position","ReactFlow","useNodesState","useUpdateNodeInternals","Fragment","jsx","jsxs","CANVAS_FRAME_TYPE","INFINITE_CANVAS_THEME_COLORS","SIDE_POSITION","DEFAULT_BACKGROUND","DEFAULT_PRO_OPTIONS","EDGE_CURVATURE_SUBTLE","EDGE_CURVATURE_BASE","EDGE_CURVATURE_DRAMATIC","deepEqualView","a","b","aKeys","bKeys","key","CanvasFrameNode","data","node","ports","renderNode","renderNodePort","updateNodeInternals","body","frame","renderRail","side","list","position","port","index","hasLeft","hasRight","NODE_TYPES","normalizeBlob","blob","readPorts","nodePorts","id","resolvePortsForDescriptor","descriptor","readPortToken","readOpaqueBoolean","mergeEdgeState","sourcePort","targetPort","selected","readEdgeLabel","resolveLeaderCurve","sourceX","sourceY","targetX","targetY","state","horizontalDistance","verticalDistance","LeaderLineEdge","sourcePosition","targetPosition","markerEnd","className","style","isHighlighted","isDimmed","isRunning","curvature","edgePath","labelX","labelY","baseStrokeColor","highlightStrokeColor","dimStrokeColor","strokeColor","flowColor","plugMarkerId","endPlugMarkerId","mainStrokeWidth","labelClassName","EDGE_TYPES","deriveEdgesFromNodePorts","nodeDescriptors","targetPortsByToken","rail","token","edges","sourcePortId","targets","targetNodeId","targetPortId","resolveNodeEndpoints","InfiniteCanvas","stateKey","canvasState","onCanvasStateCommit","getInitialNodePos","minZoom","maxZoom","fitViewOptions","miniMap","controls","background","overlay","panOnScroll","selectionOnDrag","proOptions","viewportClassName","onViewportChange","onNodeClick","onEdgeClick","ref","instance","setInstance","rfNodes","setRfNodes","onNodesChange","isReady","setIsReady","graphEdges","nodeTypesRef","canvasStateRef","nodePortsRef","nodeDescriptorsRef","renderNodeRef","renderNodePortRef","getInitialNodePosRef","onCommitRef","rfNodesRef","committedBlobRef","viewportRef","hasInitializedViewportRef","resolvePlacement","placed","seeded","initial","buildData","makeNode","width","buildBlob","nodesBlob","commitGeometry","current","currentById","changed","next","existing","sameNodeData","samePorts","committedNodes","seedViewport","handleMoveEnd","handleNodeDragStop","opts","viewport","x","y","_","edge","Card","Text","makeStyles","mergeClasses","tokens","runDeclarativeValidators","Handle","jsx","jsxs","INFINITE_CANVAS_VARIANTS","INFINITE_CANVAS_SEMANTIC_TOKENS","canvasThemeVariables","tokens","portSchema","portsSchema","schema","componentStylePropsSchema","useStyles","makeStyles","nodeClass","styles","tone","variant","mergeClasses","InfiniteCanvasPrimitive","node","emit","descriptors","nodePorts","height","root","componentRootProps","descriptor","InfiniteCanvas","_","context","item","Card","Text","port","sideClass","Handle","value","id","description","eventContract","getInfiniteCanvasSchema","describeInfiniteCanvas","validateInfiniteCanvas","props","runDeclarativeValidators","materializeInfiniteCanvasTrial","trialNode","infiniteCanvasDefinition","defineComponent","Text","makeStyles","tokens","runDeclarativeValidators","jsx","jsxs","GRAPH_DIAGRAM_VARIANTS","GRAPH_DIAGRAM_TONES","schema","componentStylePropsSchema","useStyles","makeStyles","tokens","toneFill","tone","toneForeground","positions","nodes","layout","columns","node","index","angle","radius","wrapLabel","label","maxLineLength","word","lines","current","buildGraphCanvasModel","graph","nodePorts","ids","edge","token","GraphDiagram","emit","styles","spec","variant","Text","componentRootProps","header","model","InfiniteCanvasPrimitive","componentNode","byId","source","target","item","position","longLabel","textY","line","description","infiniteCanvasDefinition","getGraphDiagramSchema","validateGraphDiagram","props","runDeclarativeValidators","materializeGraphDiagramTrial","trialNode","graphDiagramDefinition","defineComponent","MAX_COORDINATE_TICKS","parseCoordinate","value","scale","formatCoordinate","text","formatTimestamp","formatAxisCoordinate","formatTime","coordinateTicks","minimum","maximum","tickStep","count","_","index","coordinateTickCountExceedsLimit"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as w,b as O,d as j,g as H,j as A,l as q,n as d}from"./chunk-XA6FE7ZK.js";import x from"react";import{Badge as _,Button as M,Card as J,Text as y,makeStyles as $,mergeClasses as L,tokens as i}from"@fluentui/react-components";import{runDeclarativeValidators as U}from"@gik-ai/evaluators";function C(o,n){return o.filter(t=>t.columnId===n)}function X(o,n,t,r){let e=o.find(a=>a.itemId===n);if(!e)return{placements:[...o]};let m=C(o,e.columnId).findIndex(a=>a.itemId===n),B=C(o,t).filter(a=>a.itemId!==n),u=Math.max(0,Math.min(r,B.length));if(e.columnId===t&&m===u)return{placements:[...o]};let g=new Map;for(let a of o){if(a.itemId===n)continue;let I=g.get(a.columnId)??[];I.push(a),g.set(a.columnId,I)}let k=g.get(t)??[];return k.splice(u,0,{itemId:n,columnId:t}),g.set(t,k),{placements:[...new Set([...o.map(a=>a.columnId),t])].flatMap(a=>g.get(a)??[]),move:{itemId:n,fromColumnId:e.columnId,toColumnId:t,fromIndex:m,toIndex:u}}}import{jsx as l,jsxs as b}from"react/jsx-runtime";var E=["standard","compact"],K={$schema:"http://json-schema.org/draft-07/schema#",type:"object",additionalProperties:!1,required:["items","spec"],properties:{...H,items:{type:"array",items:{type:"object"}},selectedId:{type:"string"},variant:{enum:E},spec:{type:"object",additionalProperties:!1,required:["columns","fields"],properties:{title:{type:"string"},description:{type:"string"},emptyText:{type:"string"},columns:{type:"array",minItems:1,items:{type:"object",additionalProperties:!1,required:["id","label"],properties:{id:{type:"string",minLength:1},label:{type:"string",minLength:1}}}},fields:{type:"object",additionalProperties:!1,required:["id","title","column"],properties:{id:{type:"string",minLength:1},title:{type:"string",minLength:1},column:{type:"string",minLength:1},detail:{type:"string",minLength:1},order:{type:"string",minLength:1}}},interaction:{type:"object",additionalProperties:!1,properties:{selection:{enum:["none","single"]},reorder:{type:"boolean"},moveBetweenColumns:{type:"boolean"}}}}}}},G=$({root:{display:"grid",gap:i.spacingVerticalL,minWidth:0},compactRoot:{gap:i.spacingVerticalM},header:{display:"grid",gap:i.spacingVerticalXXS},description:{color:i.colorNeutralForeground3},viewport:{overflowX:"auto",minWidth:0},columns:{display:"grid",gridAutoFlow:"column",gridAutoColumns:"minmax(15rem, 1fr)",gap:i.spacingHorizontalL,minWidth:"max-content",alignItems:"start"},compactColumns:{gridAutoColumns:"minmax(12rem, 1fr)",gap:i.spacingHorizontalM},column:{display:"grid",gap:i.spacingVerticalM,width:"100%",minWidth:0,padding:i.spacingHorizontalM,borderRadius:i.borderRadiusMedium,backgroundColor:i.colorNeutralBackground2},columnHeader:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:i.spacingHorizontalS},items:{display:"grid",gap:i.spacingVerticalS,minHeight:"3rem"},item:{display:"grid",gap:i.spacingVerticalS,minWidth:0,cursor:"default"},compactItem:{gap:i.spacingVerticalXXS},selectedItem:{outline:`${i.strokeWidthThick} solid ${i.colorBrandStroke1}`,outlineOffset:"1px"},detail:{color:i.colorNeutralForeground3},controls:{display:"flex",flexWrap:"wrap",gap:i.spacingHorizontalXS},empty:{color:i.colorNeutralForeground3}});function Q(o,n){let t=o.map(r=>({item:r,itemId:d(r,n.fields.id),columnId:d(r,n.fields.column)}));return n.fields.order&&t.sort((r,e)=>Number(d(r.item,n.fields.order))-Number(d(e.item,n.fields.order))),t.map(({itemId:r,columnId:e})=>({itemId:r,columnId:e}))}var Y=({node:o,emit:n})=>{let t=G(),r=q(o.props.items),e=o.props.spec??{},v=E.includes(o.props.variant)?o.props.variant:"standard",m=JSON.stringify([r,e.fields,e.columns]),B=x.useMemo(()=>e.fields&&e.columns?Q(r,e):[],[m]),[u,g]=x.useState(B),[k,V]=x.useState(typeof o.props.selectedId=="string"?o.props.selectedId:"");if(x.useEffect(()=>g(B),[B]),x.useEffect(()=>V(typeof o.props.selectedId=="string"?o.props.selectedId:""),[o.props.selectedId]),!e.fields||!e.columns||r.length===0)return l(y,{...A(o),children:e.emptyText??"No board items."});let a=new Map(r.map(c=>[d(c,e.fields.id),c])),I=e.interaction?.selection==="single",S=e.interaction?.reorder===!0,P=e.interaction?.moveBetweenColumns===!0,W=typeof o.props.selectedId=="string"?o.props.selectedId:k,N=(c,T,h)=>{let s=X(u,c,T,h);if(!s.move)return;let f=s.move.fromColumnId!==s.move.toColumnId;f&&!P||!f&&!S||(g(s.placements),n(f?"move":"reorder",{...s.move}))};return b("section",{...A(o,L(t.root,v==="compact"&&t.compactRoot)),children:[e.title||e.description?b("header",{className:t.header,children:[e.title?l(y,{weight:"semibold",size:500,children:e.title}):null,e.description?l(y,{className:t.description,children:e.description}):null]}):null,l("div",{className:t.viewport,children:l("div",{className:L(t.columns,v==="compact"&&t.compactColumns),children:e.columns.map((c,T)=>{let h=C(u,c.id);return b("section",{className:t.column,"aria-label":c.label,children:[b("div",{className:t.columnHeader,children:[l(y,{weight:"semibold",children:c.label}),l(_,{appearance:"outline",children:h.length})]}),l("div",{className:t.items,children:h.length===0?l(y,{className:t.empty,size:200,children:"No items"}):h.map((s,f)=>{let R=a.get(s.itemId);if(!R)return null;let z=e.columns[T-1],D=e.columns[T+1];return b(J,{className:L(t.item,v==="compact"&&t.compactItem,W===s.itemId&&t.selectedItem),appearance:"outline",tabIndex:I?0:void 0,"aria-selected":I?W===s.itemId:void 0,onClick:()=>{I&&(V(s.itemId),n("select",{itemId:s.itemId}))},onDoubleClick:()=>{n("activate",{itemId:s.itemId})},onKeyDown:p=>{p.key==="Enter"&&n("activate",{itemId:s.itemId})},children:[l(y,{weight:"semibold",children:d(R,e.fields.title)}),v==="standard"&&e.fields.detail&&d(R,e.fields.detail)?l(y,{className:t.detail,size:200,children:d(R,e.fields.detail)}):null,P||S?b("div",{className:t.controls,children:[S&&f>0?l(M,{appearance:"subtle",size:"small",onClick:p=>{p.stopPropagation(),N(s.itemId,c.id,f-1)},children:"Move up"}):null,S&&f<h.length-1?l(M,{appearance:"subtle",size:"small",onClick:p=>{p.stopPropagation(),N(s.itemId,c.id,f+1)},children:"Move down"}):null,P&&z?l(M,{appearance:"subtle",size:"small",onClick:p=>{p.stopPropagation(),N(s.itemId,z.id,C(u,z.id).length)},children:"Move left"}):null,P&&D?l(M,{appearance:"subtle",size:"small",onClick:p=>{p.stopPropagation(),N(s.itemId,D.id,C(u,D.id).length)},children:"Move right"}):null]}):null]},s.itemId)})})]},c.id)})})})]})},Z={capability:"primitive:collection-board",summary:"Arranges mapped records in declared columns and emits selection, activation, reorder, and cross-column move intents.",dataProp:"items",events:["select","activate","reorder","move"],eventContracts:{select:w("The selected board item changes.",{itemId:{type:"string"}}),activate:w("The user activates a board item.",{itemId:{type:"string"}}),reorder:w("An item moves within its current column.",{itemId:{type:"string"},fromColumnId:{type:"string"},toColumnId:{type:"string"},fromIndex:{type:"integer"},toIndex:{type:"integer"}}),move:w("An item moves to another column.",{itemId:{type:"string"},fromColumnId:{type:"string"},toColumnId:{type:"string"},fromIndex:{type:"integer"},toIndex:{type:"integer"}})},semanticTokens:[],defaultVariant:"standard",variants:[{value:"standard",summary:"Full board cards with titles, details, and enabled interaction controls.",useWhen:["The board is a primary work surface","Item detail should remain visible"]},{value:"compact",summary:"Dense title-only cards with the same interaction contract.",useWhen:["Many cards share the board","Column state matters more than item detail"]}],authoring:{useWhen:["Records occupy one of several declared columns","Users may select, reorder, or move records between columns"],avoidWhen:["Columns encode tabular fields rather than item groups","Workflow transition rules must be inferred by the component"],rules:["Provide stable unique item IDs","Declare every referenced column","Use interaction only for mechanics the host handles","Persist emitted move and reorder intents outside the component"]}};function F(){return K}function ee(o){let n=U([{kind:"ajv-schema",schema:F(),message:"Invalid primitive:collection-board props",code:"collection-board-schema"}],o);if(!n.ok)return n;let t=o,r=t.spec.columns.map(m=>m.id),e=t.items.map(m=>d(m,t.spec.fields.id));return(new Set(r).size!==r.length||new Set(e).size!==e.length||t.items.some(m=>!r.includes(d(m,t.spec.fields.column))))&&(n.ok=!1,n.errors.push({detail:"Collection board columns and item IDs must be unique, and every item must reference a declared column",code:"collection-board-references"})),n}function te(){return j("primitive:collection-board",{variant:"standard",items:[{id:"investigate",title:"Investigate sign-in",detail:"Review identity telemetry",column:"active",order:1},{id:"contain",title:"Contain account",detail:"Disable affected credentials",column:"planned",order:1}],spec:{title:"Response work",description:"Operational items grouped by current placement",columns:[{id:"planned",label:"Planned"},{id:"active",label:"Active"},{id:"complete",label:"Complete"}],fields:{id:"id",title:"title",detail:"detail",column:"column",order:"order"},interaction:{selection:"single",reorder:!0,moveBetweenColumns:!0}}})}var ce=O({description:Z,version:"1.0.0",component:Y,getSchema:F,validate:ee,materializeTrial:te});export{E as a,Y as b,F as c,ee as d,te as e,ce as f};
|
|
2
|
+
//# sourceMappingURL=chunk-UP2OAMPY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/primitives/collection-board/CollectionBoard.tsx","../src/shared/collectionBoard.ts"],"sourcesContent":["import React from \"react\";\nimport { Badge, Button, Card, Text, makeStyles, mergeClasses, tokens } from \"@fluentui/react-components\";\nimport type { Json } from \"@gik-ai/kernel\";\nimport { runDeclarativeValidators } from \"@gik-ai/evaluators\";\nimport type { ProjectionView } from \"@gik-ai/react\";\n\nimport {\n collectionBoardColumnItems,\n moveCollectionBoardItem,\n type CollectionBoardPlacement,\n} from \"../../shared/collectionBoard\";\nimport { componentRootProps, componentStylePropsSchema, records, textAt, type DataRecord } from \"../../shared/component\";\nimport { defineComponent, eventContract, trialNode, type ComponentDescription, type ComponentValidationReport } from \"../../shared/definition\";\n\nexport const COLLECTION_BOARD_VARIANTS = [\"standard\", \"compact\"] as const;\ntype CollectionBoardVariant = typeof COLLECTION_BOARD_VARIANTS[number];\n\ninterface CollectionBoardColumn {\n id: string;\n label: string;\n}\n\ninterface CollectionBoardSpec {\n title?: string;\n description?: string;\n emptyText?: string;\n columns: CollectionBoardColumn[];\n fields: {\n id: string;\n title: string;\n column: string;\n detail?: string;\n order?: string;\n };\n interaction?: {\n selection?: \"none\" | \"single\";\n reorder?: boolean;\n moveBetweenColumns?: boolean;\n };\n}\n\nconst schema = {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n additionalProperties: false,\n required: [\"items\", \"spec\"],\n properties: {\n ...componentStylePropsSchema,\n items: { type: \"array\", items: { type: \"object\" } },\n selectedId: { type: \"string\" },\n variant: { enum: COLLECTION_BOARD_VARIANTS },\n spec: {\n type: \"object\",\n additionalProperties: false,\n required: [\"columns\", \"fields\"],\n properties: {\n title: { type: \"string\" },\n description: { type: \"string\" },\n emptyText: { type: \"string\" },\n columns: {\n type: \"array\",\n minItems: 1,\n items: {\n type: \"object\",\n additionalProperties: false,\n required: [\"id\", \"label\"],\n properties: { id: { type: \"string\", minLength: 1 }, label: { type: \"string\", minLength: 1 } },\n },\n },\n fields: {\n type: \"object\",\n additionalProperties: false,\n required: [\"id\", \"title\", \"column\"],\n properties: {\n id: { type: \"string\", minLength: 1 },\n title: { type: \"string\", minLength: 1 },\n column: { type: \"string\", minLength: 1 },\n detail: { type: \"string\", minLength: 1 },\n order: { type: \"string\", minLength: 1 },\n },\n },\n interaction: {\n type: \"object\",\n additionalProperties: false,\n properties: {\n selection: { enum: [\"none\", \"single\"] },\n reorder: { type: \"boolean\" },\n moveBetweenColumns: { type: \"boolean\" },\n },\n },\n },\n },\n },\n} as const;\n\nconst useStyles = makeStyles({\n root: { display: \"grid\", gap: tokens.spacingVerticalL, minWidth: 0 },\n compactRoot: { gap: tokens.spacingVerticalM },\n header: { display: \"grid\", gap: tokens.spacingVerticalXXS },\n description: { color: tokens.colorNeutralForeground3 },\n viewport: { overflowX: \"auto\", minWidth: 0 },\n columns: { display: \"grid\", gridAutoFlow: \"column\", gridAutoColumns: \"minmax(15rem, 1fr)\", gap: tokens.spacingHorizontalL, minWidth: \"max-content\", alignItems: \"start\" },\n compactColumns: { gridAutoColumns: \"minmax(12rem, 1fr)\", gap: tokens.spacingHorizontalM },\n column: { display: \"grid\", gap: tokens.spacingVerticalM, width: \"100%\", minWidth: 0, padding: tokens.spacingHorizontalM, borderRadius: tokens.borderRadiusMedium, backgroundColor: tokens.colorNeutralBackground2 },\n columnHeader: { display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: tokens.spacingHorizontalS },\n items: { display: \"grid\", gap: tokens.spacingVerticalS, minHeight: \"3rem\" },\n item: { display: \"grid\", gap: tokens.spacingVerticalS, minWidth: 0, cursor: \"default\" },\n compactItem: { gap: tokens.spacingVerticalXXS },\n selectedItem: { outline: `${tokens.strokeWidthThick} solid ${tokens.colorBrandStroke1}`, outlineOffset: \"1px\" },\n detail: { color: tokens.colorNeutralForeground3 },\n controls: { display: \"flex\", flexWrap: \"wrap\", gap: tokens.spacingHorizontalXS },\n empty: { color: tokens.colorNeutralForeground3 },\n});\n\nfunction initialPlacements(items: DataRecord[], spec: CollectionBoardSpec): CollectionBoardPlacement[] {\n const placements = items.map((item) => ({ item, itemId: textAt(item, spec.fields.id), columnId: textAt(item, spec.fields.column) }));\n if (spec.fields.order) placements.sort((left, right) => Number(textAt(left.item, spec.fields.order)) - Number(textAt(right.item, spec.fields.order)));\n return placements.map(({ itemId, columnId }) => ({ itemId, columnId }));\n}\n\nexport const CollectionBoard: ProjectionView = ({ node, emit }) => {\n const styles = useStyles();\n const items = records(node.props.items);\n const spec = (node.props.spec ?? {}) as unknown as CollectionBoardSpec;\n const variant = COLLECTION_BOARD_VARIANTS.includes(node.props.variant as CollectionBoardVariant) ? node.props.variant as CollectionBoardVariant : \"standard\";\n const placementSignature = JSON.stringify([items, spec.fields, spec.columns]);\n const authoredPlacements = React.useMemo(() => spec.fields && spec.columns ? initialPlacements(items, spec) : [], [placementSignature]);\n const [placements, setPlacements] = React.useState(authoredPlacements);\n const [localSelectedId, setLocalSelectedId] = React.useState(typeof node.props.selectedId === \"string\" ? node.props.selectedId : \"\");\n React.useEffect(() => setPlacements(authoredPlacements), [authoredPlacements]);\n React.useEffect(() => setLocalSelectedId(typeof node.props.selectedId === \"string\" ? node.props.selectedId : \"\"), [node.props.selectedId]);\n\n if (!spec.fields || !spec.columns || items.length === 0) return <Text {...componentRootProps(node)}>{spec.emptyText ?? \"No board items.\"}</Text>;\n\n const byId = new Map(items.map((item) => [textAt(item, spec.fields.id), item]));\n const canSelect = spec.interaction?.selection === \"single\";\n const canReorder = spec.interaction?.reorder === true;\n const canMove = spec.interaction?.moveBetweenColumns === true;\n const selectedId = typeof node.props.selectedId === \"string\" ? node.props.selectedId : localSelectedId;\n\n const commitMove = (itemId: string, columnId: string, index: number) => {\n const result = moveCollectionBoardItem(placements, itemId, columnId, index);\n if (!result.move) return;\n const movedAcrossColumns = result.move.fromColumnId !== result.move.toColumnId;\n if ((movedAcrossColumns && !canMove) || (!movedAcrossColumns && !canReorder)) return;\n setPlacements(result.placements);\n void emit(movedAcrossColumns ? \"move\" : \"reorder\", { ...result.move });\n };\n\n return <section {...componentRootProps(node, mergeClasses(styles.root, variant === \"compact\" && styles.compactRoot))}>\n {spec.title || spec.description ? <header className={styles.header}>{spec.title ? <Text weight=\"semibold\" size={500}>{spec.title}</Text> : null}{spec.description ? <Text className={styles.description}>{spec.description}</Text> : null}</header> : null}\n <div className={styles.viewport}>\n <div className={mergeClasses(styles.columns, variant === \"compact\" && styles.compactColumns)}>\n {spec.columns.map((column, columnIndex) => {\n const members = collectionBoardColumnItems(placements, column.id);\n return <section className={styles.column} key={column.id} aria-label={column.label}>\n <div className={styles.columnHeader}><Text weight=\"semibold\">{column.label}</Text><Badge appearance=\"outline\">{members.length}</Badge></div>\n <div className={styles.items}>{members.length === 0 ? <Text className={styles.empty} size={200}>No items</Text> : members.map((placement, itemIndex) => {\n const item = byId.get(placement.itemId);\n if (!item) return null;\n const previousColumn = spec.columns[columnIndex - 1];\n const nextColumn = spec.columns[columnIndex + 1];\n return <Card\n className={mergeClasses(styles.item, variant === \"compact\" && styles.compactItem, selectedId === placement.itemId && styles.selectedItem)}\n appearance=\"outline\"\n key={placement.itemId}\n tabIndex={canSelect ? 0 : undefined}\n aria-selected={canSelect ? selectedId === placement.itemId : undefined}\n onClick={() => { if (canSelect) { setLocalSelectedId(placement.itemId); void emit(\"select\", { itemId: placement.itemId }); } }}\n onDoubleClick={() => void emit(\"activate\", { itemId: placement.itemId })}\n onKeyDown={(event) => { if (event.key === \"Enter\") void emit(\"activate\", { itemId: placement.itemId }); }}\n >\n <Text weight=\"semibold\">{textAt(item, spec.fields.title)}</Text>\n {variant === \"standard\" && spec.fields.detail && textAt(item, spec.fields.detail) ? <Text className={styles.detail} size={200}>{textAt(item, spec.fields.detail)}</Text> : null}\n {(canMove || canReorder) ? <div className={styles.controls}>\n {canReorder && itemIndex > 0 ? <Button appearance=\"subtle\" size=\"small\" onClick={(event) => { event.stopPropagation(); commitMove(placement.itemId, column.id, itemIndex - 1); }}>Move up</Button> : null}\n {canReorder && itemIndex < members.length - 1 ? <Button appearance=\"subtle\" size=\"small\" onClick={(event) => { event.stopPropagation(); commitMove(placement.itemId, column.id, itemIndex + 1); }}>Move down</Button> : null}\n {canMove && previousColumn ? <Button appearance=\"subtle\" size=\"small\" onClick={(event) => { event.stopPropagation(); commitMove(placement.itemId, previousColumn.id, collectionBoardColumnItems(placements, previousColumn.id).length); }}>Move left</Button> : null}\n {canMove && nextColumn ? <Button appearance=\"subtle\" size=\"small\" onClick={(event) => { event.stopPropagation(); commitMove(placement.itemId, nextColumn.id, collectionBoardColumnItems(placements, nextColumn.id).length); }}>Move right</Button> : null}\n </div> : null}\n </Card>;\n })}</div>\n </section>;\n })}\n </div>\n </div>\n </section>;\n};\n\nconst description: ComponentDescription = {\n capability: \"primitive:collection-board\",\n summary: \"Arranges mapped records in declared columns and emits selection, activation, reorder, and cross-column move intents.\",\n dataProp: \"items\",\n events: [\"select\", \"activate\", \"reorder\", \"move\"],\n eventContracts: {\n select: eventContract(\"The selected board item changes.\", { itemId: { type: \"string\" } }),\n activate: eventContract(\"The user activates a board item.\", { itemId: { type: \"string\" } }),\n reorder: eventContract(\"An item moves within its current column.\", { itemId: { type: \"string\" }, fromColumnId: { type: \"string\" }, toColumnId: { type: \"string\" }, fromIndex: { type: \"integer\" }, toIndex: { type: \"integer\" } }),\n move: eventContract(\"An item moves to another column.\", { itemId: { type: \"string\" }, fromColumnId: { type: \"string\" }, toColumnId: { type: \"string\" }, fromIndex: { type: \"integer\" }, toIndex: { type: \"integer\" } }),\n },\n semanticTokens: [],\n defaultVariant: \"standard\",\n variants: [\n { value: \"standard\", summary: \"Full board cards with titles, details, and enabled interaction controls.\", useWhen: [\"The board is a primary work surface\", \"Item detail should remain visible\"] },\n { value: \"compact\", summary: \"Dense title-only cards with the same interaction contract.\", useWhen: [\"Many cards share the board\", \"Column state matters more than item detail\"] },\n ],\n authoring: {\n useWhen: [\"Records occupy one of several declared columns\", \"Users may select, reorder, or move records between columns\"],\n avoidWhen: [\"Columns encode tabular fields rather than item groups\", \"Workflow transition rules must be inferred by the component\"],\n rules: [\"Provide stable unique item IDs\", \"Declare every referenced column\", \"Use interaction only for mechanics the host handles\", \"Persist emitted move and reorder intents outside the component\"],\n },\n};\n\nexport function getCollectionBoardSchema(): Record<string, unknown> { return schema as unknown as Record<string, unknown>; }\nexport function validateCollectionBoard(props: unknown): ComponentValidationReport {\n const report = runDeclarativeValidators([{ kind: \"ajv-schema\", schema: getCollectionBoardSchema(), message: \"Invalid primitive:collection-board props\", code: \"collection-board-schema\" }], props as Json);\n if (!report.ok) return report;\n const value = props as { items: DataRecord[]; spec: CollectionBoardSpec };\n const columnIds = value.spec.columns.map((column) => column.id);\n const itemIds = value.items.map((item) => textAt(item, value.spec.fields.id));\n const invalid = new Set(columnIds).size !== columnIds.length\n || new Set(itemIds).size !== itemIds.length\n || value.items.some((item) => !columnIds.includes(textAt(item, value.spec.fields.column)));\n if (invalid) {\n report.ok = false;\n report.errors.push({ detail: \"Collection board columns and item IDs must be unique, and every item must reference a declared column\", code: \"collection-board-references\" });\n }\n return report;\n}\nexport function materializeCollectionBoardTrial() {\n return trialNode(\"primitive:collection-board\", {\n variant: \"standard\",\n items: [\n { id: \"investigate\", title: \"Investigate sign-in\", detail: \"Review identity telemetry\", column: \"active\", order: 1 },\n { id: \"contain\", title: \"Contain account\", detail: \"Disable affected credentials\", column: \"planned\", order: 1 },\n ],\n spec: {\n title: \"Response work\",\n description: \"Operational items grouped by current placement\",\n columns: [{ id: \"planned\", label: \"Planned\" }, { id: \"active\", label: \"Active\" }, { id: \"complete\", label: \"Complete\" }],\n fields: { id: \"id\", title: \"title\", detail: \"detail\", column: \"column\", order: \"order\" },\n interaction: { selection: \"single\", reorder: true, moveBetweenColumns: true },\n },\n });\n}\nexport const collectionBoardDefinition = defineComponent({ description, version: \"1.0.0\", component: CollectionBoard, getSchema: getCollectionBoardSchema, validate: validateCollectionBoard, materializeTrial: materializeCollectionBoardTrial });\n","export interface CollectionBoardPlacement {\n itemId: string;\n columnId: string;\n}\n\nexport interface CollectionBoardMove {\n itemId: string;\n fromColumnId: string;\n toColumnId: string;\n fromIndex: number;\n toIndex: number;\n}\n\nexport function collectionBoardColumnItems(placements: readonly CollectionBoardPlacement[], columnId: string): CollectionBoardPlacement[] {\n return placements.filter((placement) => placement.columnId === columnId);\n}\n\nexport function moveCollectionBoardItem(\n placements: readonly CollectionBoardPlacement[],\n itemId: string,\n toColumnId: string,\n requestedIndex: number,\n): { placements: CollectionBoardPlacement[]; move?: CollectionBoardMove } {\n const current = placements.find((placement) => placement.itemId === itemId);\n if (!current) return { placements: [...placements] };\n\n const sourceItems = collectionBoardColumnItems(placements, current.columnId);\n const fromIndex = sourceItems.findIndex((placement) => placement.itemId === itemId);\n const targetItems = collectionBoardColumnItems(placements, toColumnId).filter((placement) => placement.itemId !== itemId);\n const toIndex = Math.max(0, Math.min(requestedIndex, targetItems.length));\n if (current.columnId === toColumnId && fromIndex === toIndex) return { placements: [...placements] };\n\n const byColumn = new Map<string, CollectionBoardPlacement[]>();\n for (const placement of placements) {\n if (placement.itemId === itemId) continue;\n const members = byColumn.get(placement.columnId) ?? [];\n members.push(placement);\n byColumn.set(placement.columnId, members);\n }\n const target = byColumn.get(toColumnId) ?? [];\n target.splice(toIndex, 0, { itemId, columnId: toColumnId });\n byColumn.set(toColumnId, target);\n\n const columnOrder = [...new Set([...placements.map((placement) => placement.columnId), toColumnId])];\n return {\n placements: columnOrder.flatMap((columnId) => byColumn.get(columnId) ?? []),\n move: { itemId, fromColumnId: current.columnId, toColumnId, fromIndex, toIndex },\n };\n}\n"],"mappings":"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","names":["React","Badge","Button","Card","Text","makeStyles","mergeClasses","tokens","runDeclarativeValidators","collectionBoardColumnItems","placements","columnId","placement","moveCollectionBoardItem","itemId","toColumnId","requestedIndex","current","fromIndex","targetItems","toIndex","byColumn","members","target","jsx","jsxs","COLLECTION_BOARD_VARIANTS","schema","componentStylePropsSchema","useStyles","makeStyles","tokens","initialPlacements","items","spec","placements","item","textAt","left","right","itemId","columnId","CollectionBoard","node","emit","styles","records","variant","placementSignature","authoredPlacements","React","setPlacements","localSelectedId","setLocalSelectedId","Text","componentRootProps","byId","canSelect","canReorder","canMove","selectedId","commitMove","index","result","moveCollectionBoardItem","movedAcrossColumns","mergeClasses","column","columnIndex","members","collectionBoardColumnItems","Badge","placement","itemIndex","previousColumn","nextColumn","Card","event","Button","description","eventContract","getCollectionBoardSchema","validateCollectionBoard","props","report","runDeclarativeValidators","value","columnIds","itemIds","materializeCollectionBoardTrial","trialNode","collectionBoardDefinition","defineComponent"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{y as R}from"./chunk-OFWGYY7S.js";import{b as v,c as T,d as S,g as N,j as F,k as $,l as x,n as t}from"./chunk-XA6FE7ZK.js";import{Badge as w,Card as j,Text as c,makeStyles as L,mergeClasses as M,tokens as o}from"@fluentui/react-components";import{runDeclarativeValidators as E}from"@gik-ai/evaluators";import{jsx as a,jsxs as l}from"react/jsx-runtime";var I=["central","related","risk","positive","neutral"],D=["network","matrix","relations","text"],W={$schema:"http://json-schema.org/draft-07/schema#",type:"object",additionalProperties:!1,required:["graph","spec"],properties:{...N,variant:{enum:D},graph:{type:"object",additionalProperties:!1,required:["entities","relationships"],properties:{entities:{type:"array",items:{type:"object"}},relationships:{type:"array",items:{type:"object"}}}},spec:{type:"object",additionalProperties:!1,required:["entityFields","relationshipFields"],properties:{title:{type:"string"},description:{type:"string"},emptyText:{type:"string"},density:{enum:["comfortable","compact"]},entityFields:{type:"object",additionalProperties:!1,required:["id","label"],properties:{id:{type:"string",minLength:1},label:{type:"string",minLength:1},detail:{type:"string",minLength:1},type:{type:"string",minLength:1},tone:{type:"string",minLength:1}}},relationshipFields:{type:"object",additionalProperties:!1,required:["id","source","target"],properties:{id:{type:"string",minLength:1},source:{type:"string",minLength:1},target:{type:"string",minLength:1},label:{type:"string",minLength:1}}},toneMap:{type:"object",additionalProperties:{enum:I}}}}}},_=L({root:{display:"grid",gap:o.spacingVerticalM,minWidth:0},header:{display:"grid",gap:o.spacingVerticalXXS},description:{color:o.colorNeutralForeground3},matrixWrap:{overflowX:"auto"},matrix:{width:"100%",borderCollapse:"collapse"},matrixCell:{minWidth:"7rem",padding:o.spacingVerticalS,textAlign:"left",border:`${o.strokeWidthThin} solid ${o.colorNeutralStroke2}`},relations:{display:"grid",gap:o.spacingVerticalS},relation:{display:"grid",gridTemplateColumns:"minmax(0, 1fr) auto minmax(0, 1fr)",alignItems:"center",gap:o.spacingHorizontalM},endpoint:{display:"grid",gap:o.spacingVerticalXXS,minWidth:0},target:{textAlign:"right"},relationLabel:{color:o.colorNeutralForeground3,textAlign:"center"},text:{display:"grid",gap:o.spacingVerticalXS}});function C(s){return s==="central"?"brand":s==="risk"?"danger":s==="positive"?"success":"informative"}var q=({node:s})=>{let n=_(),k=$(s.props.graph),m=x(k.entities),g=x(k.relationships),e=s.props.spec??{},h=s.props.variant??"network";if(!e.entityFields||!e.relationshipFields||m.length===0)return a(c,{...F(s),children:e.emptyText??"No relationships available."});let u=new Map(m.map(i=>[t(i,e.entityFields.id),i])),y=F(s,n.root),f=l("div",{className:n.header,children:[e.title?a(c,{weight:"semibold",size:500,children:e.title}):null,e.description?a(c,{className:n.description,children:e.description}):null]}),A=i=>{let r=u.get(t(i,e.relationshipFields.source)),d=u.get(t(i,e.relationshipFields.target));return r&&d?`${t(r,e.entityFields.label)} ${t(i,e.relationshipFields.label)||"relates to"} ${t(d,e.entityFields.label)}`:""};if(h==="text")return l("section",{...y,children:[f,a("div",{className:n.text,children:g.map(i=>a(c,{children:A(i)},t(i,e.relationshipFields.id)))})]});if(h==="matrix")return l("section",{...y,children:[f,a("div",{className:n.matrixWrap,children:l("table",{className:n.matrix,children:[a("thead",{children:l("tr",{children:[a("th",{className:n.matrixCell,children:"From / to"}),m.map(i=>a("th",{className:n.matrixCell,children:t(i,e.entityFields.label)},t(i,e.entityFields.id)))]})}),a("tbody",{children:m.map(i=>l("tr",{children:[a("th",{className:n.matrixCell,children:t(i,e.entityFields.label)}),m.map(r=>{let d=g.filter(p=>t(p,e.relationshipFields.source)===t(i,e.entityFields.id)&&t(p,e.relationshipFields.target)===t(r,e.entityFields.id));return a("td",{className:n.matrixCell,children:d.map(p=>t(p,e.relationshipFields.label)||"related").join(", ")},t(r,e.entityFields.id))})]},t(i,e.entityFields.id)))})]})})]});if(h==="relations")return l("section",{...y,children:[f,a("div",{className:n.relations,children:g.map(i=>{let r=u.get(t(i,e.relationshipFields.source)),d=u.get(t(i,e.relationshipFields.target));if(!r||!d)return null;let p=t(r,e.entityFields.tone),b=t(d,e.entityFields.tone);return l(j,{appearance:"outline",className:n.relation,children:[l("div",{className:n.endpoint,children:[a(c,{weight:"semibold",children:t(r,e.entityFields.label)}),p?a(w,{appearance:"tint",color:C(e.toneMap?.[p]),children:p}):null]}),a(c,{className:n.relationLabel,size:200,children:t(i,e.relationshipFields.label)||"related to"}),l("div",{className:M(n.endpoint,n.target),children:[a(c,{weight:"semibold",children:t(d,e.entityFields.label)}),b?a(w,{appearance:"tint",color:C(e.toneMap?.[b]),children:b}):null]})]},t(i,e.relationshipFields.id))})})]});let V={nodes:m.map(i=>{let r=e.toneMap?.[t(i,e.entityFields.tone)];return{id:t(i,e.entityFields.id),label:t(i,e.entityFields.label),detail:t(i,e.entityFields.detail)||void 0,category:t(i,e.entityFields.type)||void 0,tone:r==="central"?"accent":r==="risk"?"danger":r==="positive"?"success":"neutral"}}),edges:g.map(i=>({id:t(i,e.relationshipFields.id),source:t(i,e.relationshipFields.source),target:t(i,e.relationshipFields.target),label:t(i,e.relationshipFields.label)||void 0,directed:!0}))};return a(R,{node:T(`${s.id}-network`,"primitive:graph-diagram",{graph:V,variant:"diagram",spec:{...e.title?{title:e.title}:{},...e.description?{description:e.description}:{},...e.emptyText?{emptyText:e.emptyText}:{},layout:"radial"},...typeof s.props.className=="string"?{className:s.props.className}:{},...s.props.style?{style:s.props.style}:{}}),emit:()=>{},children:void 0})},O={capability:"semantic:relationship-set",summary:"Presents one authored entity and relationship set as a network, matrix, relation statements, or text.",dataProp:"graph",events:[],semanticTokens:I,defaultVariant:"network",variants:[{value:"network",summary:"Node-link topology projection.",useWhen:["Topology and connected structure are primary"]},{value:"matrix",summary:"Pairwise entity relationship matrix.",useWhen:["Dense pairwise inspection matters"]},{value:"relations",summary:"Readable source-predicate-target statements.",useWhen:["Precise relationship reading matters"]},{value:"text",summary:"Complete linear relationship statements.",useWhen:["Visual layout is unavailable or inappropriate"]}],authoring:{useWhen:["Explicit relationships connect stable entities"],avoidWhen:["Only grouped entities matter; use entity-set"],rules:["All variants consume the same entities and relationships","Reference only declared entity IDs","Matrix cells and network edges are derived without changing relationships","Put density in spec"]}};function P(){return W}function X(s){return E([{kind:"ajv-schema",schema:P(),message:"Invalid semantic:relationship-set props",code:"relationship-set-schema"},{kind:"jsonata",expr:"($field := data.spec.entityFields.id; $ids := data.graph.entities.$lookup($, $field); $count($ids) = $count($distinct($ids)))",message:"Relationship-set entity IDs must be unique",code:"relationship-set-unique-entity-id"},{kind:"jsonata",expr:"($entityField := data.spec.entityFields.id; $sourceField := data.spec.relationshipFields.source; $targetField := data.spec.relationshipFields.target; $ids := data.graph.entities.$lookup($, $entityField); $count(data.graph.relationships[$lookup($, $sourceField) in $ids and $lookup($, $targetField) in $ids]) = $count(data.graph.relationships))",message:"Relationships must reference declared entity IDs",code:"relationship-set-reference"}],s)}function z(){return S("semantic:relationship-set",{variant:"network",graph:{entities:[{id:"identity",label:"Admin identity",detail:"Affected principal",role:"focus"},{id:"device",label:"New device",detail:"Registered credential",role:"risk"},{id:"application",label:"Finance app",detail:"Accessed resource",role:"related"}],relationships:[{id:"registered",from:"identity",to:"device",relation:"registered"},{id:"accessed",from:"identity",to:"application",relation:"accessed"}]},spec:{title:"Incident relationships",description:"Entities linked by observed activity",density:"comfortable",entityFields:{id:"id",label:"label",detail:"detail",tone:"role"},relationshipFields:{id:"id",source:"from",target:"to",label:"relation"},toneMap:{focus:"central",risk:"risk",related:"related"}}})}var Q=v({description:O,version:"1.0.0",component:q,getSchema:P,validate:X,materializeTrial:z});export{I as a,D as b,q as c,P as d,X as e,z as f,Q as g};
|
|
2
|
+
//# sourceMappingURL=chunk-VR5CS5LA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/semantic/relationship-set/RelationshipSet.tsx"],"sourcesContent":["import React from \"react\";\nimport { Badge, Card, Text, makeStyles, mergeClasses, tokens } from \"@fluentui/react-components\";\nimport type { Json } from \"@gik-ai/kernel\";\nimport { runDeclarativeValidators } from \"@gik-ai/evaluators\";\nimport type { ProjectionView } from \"@gik-ai/react\";\n\nimport { GraphDiagram, type GraphDiagramModel } from \"../../primitives/graph-diagram\";\nimport { asRecord, componentRootProps, componentStylePropsSchema, records, textAt, type BadgeColor, type DataRecord } from \"../../shared/component\";\nimport { componentNode, defineComponent, trialNode, type ComponentDescription, type ComponentValidationReport } from \"../../shared/definition\";\n\nexport const RELATIONSHIP_SET_SEMANTIC_TOKENS = [\"central\", \"related\", \"risk\", \"positive\", \"neutral\"] as const;\nexport const RELATIONSHIP_SET_VARIANTS = [\"network\", \"matrix\", \"relations\", \"text\"] as const;\ntype RelationshipToken = typeof RELATIONSHIP_SET_SEMANTIC_TOKENS[number];\ntype RelationshipSetVariant = typeof RELATIONSHIP_SET_VARIANTS[number];\n\ninterface RelationshipSetSpec {\n title?: string;\n description?: string;\n emptyText?: string;\n density?: \"comfortable\" | \"compact\";\n entityFields: { id: string; label: string; detail?: string; type?: string; tone?: string };\n relationshipFields: { id: string; source: string; target: string; label?: string };\n toneMap?: Record<string, RelationshipToken>;\n}\n\nconst schema = {\n $schema: \"http://json-schema.org/draft-07/schema#\", type: \"object\", additionalProperties: false, required: [\"graph\", \"spec\"],\n properties: {\n ...componentStylePropsSchema, variant: { enum: RELATIONSHIP_SET_VARIANTS },\n graph: { type: \"object\", additionalProperties: false, required: [\"entities\", \"relationships\"], properties: { entities: { type: \"array\", items: { type: \"object\" } }, relationships: { type: \"array\", items: { type: \"object\" } } } },\n spec: { type: \"object\", additionalProperties: false, required: [\"entityFields\", \"relationshipFields\"], properties: {\n title: { type: \"string\" }, description: { type: \"string\" }, emptyText: { type: \"string\" }, density: { enum: [\"comfortable\", \"compact\"] },\n entityFields: { type: \"object\", additionalProperties: false, required: [\"id\", \"label\"], properties: { id: { type: \"string\", minLength: 1 }, label: { type: \"string\", minLength: 1 }, detail: { type: \"string\", minLength: 1 }, type: { type: \"string\", minLength: 1 }, tone: { type: \"string\", minLength: 1 } } },\n relationshipFields: { type: \"object\", additionalProperties: false, required: [\"id\", \"source\", \"target\"], properties: { id: { type: \"string\", minLength: 1 }, source: { type: \"string\", minLength: 1 }, target: { type: \"string\", minLength: 1 }, label: { type: \"string\", minLength: 1 } } },\n toneMap: { type: \"object\", additionalProperties: { enum: RELATIONSHIP_SET_SEMANTIC_TOKENS } },\n } },\n },\n} as const;\n\nconst useStyles = makeStyles({\n root: { display: \"grid\", gap: tokens.spacingVerticalM, minWidth: 0 },\n header: { display: \"grid\", gap: tokens.spacingVerticalXXS },\n description: { color: tokens.colorNeutralForeground3 },\n matrixWrap: { overflowX: \"auto\" },\n matrix: { width: \"100%\", borderCollapse: \"collapse\" },\n matrixCell: { minWidth: \"7rem\", padding: tokens.spacingVerticalS, textAlign: \"left\", border: `${tokens.strokeWidthThin} solid ${tokens.colorNeutralStroke2}` },\n relations: { display: \"grid\", gap: tokens.spacingVerticalS },\n relation: { display: \"grid\", gridTemplateColumns: \"minmax(0, 1fr) auto minmax(0, 1fr)\", alignItems: \"center\", gap: tokens.spacingHorizontalM },\n endpoint: { display: \"grid\", gap: tokens.spacingVerticalXXS, minWidth: 0 },\n target: { textAlign: \"right\" },\n relationLabel: { color: tokens.colorNeutralForeground3, textAlign: \"center\" },\n text: { display: \"grid\", gap: tokens.spacingVerticalXS },\n});\n\nfunction tokenColor(token: RelationshipToken | undefined): BadgeColor {\n if (token === \"central\") return \"brand\";\n if (token === \"risk\") return \"danger\";\n if (token === \"positive\") return \"success\";\n return \"informative\";\n}\n\nexport const RelationshipSet: ProjectionView = ({ node }) => {\n const styles = useStyles();\n const graph = asRecord(node.props.graph);\n const entities = records(graph.entities);\n const relationships = records(graph.relationships);\n const spec = (node.props.spec ?? {}) as unknown as RelationshipSetSpec;\n const variant = (node.props.variant ?? \"network\") as RelationshipSetVariant;\n if (!spec.entityFields || !spec.relationshipFields || entities.length === 0) return <Text {...componentRootProps(node)}>{spec.emptyText ?? \"No relationships available.\"}</Text>;\n const byId = new Map(entities.map((entity) => [textAt(entity, spec.entityFields.id), entity]));\n const root = componentRootProps(node, styles.root);\n const header = <div className={styles.header}>{spec.title ? <Text weight=\"semibold\" size={500}>{spec.title}</Text> : null}{spec.description ? <Text className={styles.description}>{spec.description}</Text> : null}</div>;\n const statement = (relationship: DataRecord) => { const source = byId.get(textAt(relationship, spec.relationshipFields.source)); const target = byId.get(textAt(relationship, spec.relationshipFields.target)); return source && target ? `${textAt(source, spec.entityFields.label)} ${textAt(relationship, spec.relationshipFields.label) || \"relates to\"} ${textAt(target, spec.entityFields.label)}` : \"\"; };\n\n if (variant === \"text\") return <section {...root}>{header}<div className={styles.text}>{relationships.map((relationship) => <Text key={textAt(relationship, spec.relationshipFields.id)}>{statement(relationship)}</Text>)}</div></section>;\n\n if (variant === \"matrix\") return <section {...root}>{header}<div className={styles.matrixWrap}><table className={styles.matrix}><thead><tr><th className={styles.matrixCell}>From / to</th>{entities.map((entity) => <th className={styles.matrixCell} key={textAt(entity, spec.entityFields.id)}>{textAt(entity, spec.entityFields.label)}</th>)}</tr></thead><tbody>{entities.map((source) => <tr key={textAt(source, spec.entityFields.id)}><th className={styles.matrixCell}>{textAt(source, spec.entityFields.label)}</th>{entities.map((target) => { const matches = relationships.filter((relationship) => textAt(relationship, spec.relationshipFields.source) === textAt(source, spec.entityFields.id) && textAt(relationship, spec.relationshipFields.target) === textAt(target, spec.entityFields.id)); return <td className={styles.matrixCell} key={textAt(target, spec.entityFields.id)}>{matches.map((relationship) => textAt(relationship, spec.relationshipFields.label) || \"related\").join(\", \")}</td>; })}</tr>)}</tbody></table></div></section>;\n\n if (variant === \"relations\") return <section {...root}>{header}<div className={styles.relations}>{relationships.map((relationship) => { const source = byId.get(textAt(relationship, spec.relationshipFields.source)); const target = byId.get(textAt(relationship, spec.relationshipFields.target)); if (!source || !target) return null; const sourceTone = textAt(source, spec.entityFields.tone); const targetTone = textAt(target, spec.entityFields.tone); return <Card appearance=\"outline\" className={styles.relation} key={textAt(relationship, spec.relationshipFields.id)}><div className={styles.endpoint}><Text weight=\"semibold\">{textAt(source, spec.entityFields.label)}</Text>{sourceTone ? <Badge appearance=\"tint\" color={tokenColor(spec.toneMap?.[sourceTone])}>{sourceTone}</Badge> : null}</div><Text className={styles.relationLabel} size={200}>{textAt(relationship, spec.relationshipFields.label) || \"related to\"}</Text><div className={mergeClasses(styles.endpoint, styles.target)}><Text weight=\"semibold\">{textAt(target, spec.entityFields.label)}</Text>{targetTone ? <Badge appearance=\"tint\" color={tokenColor(spec.toneMap?.[targetTone])}>{targetTone}</Badge> : null}</div></Card>; })}</div></section>;\n\n const graphModel: GraphDiagramModel = {\n nodes: entities.map((entity) => {\n const token = spec.toneMap?.[textAt(entity, spec.entityFields.tone)];\n return {\n id: textAt(entity, spec.entityFields.id),\n label: textAt(entity, spec.entityFields.label),\n detail: textAt(entity, spec.entityFields.detail) || undefined,\n category: textAt(entity, spec.entityFields.type) || undefined,\n tone: token === \"central\" ? \"accent\" : token === \"risk\" ? \"danger\" : token === \"positive\" ? \"success\" : \"neutral\",\n };\n }),\n edges: relationships.map((relationship) => ({\n id: textAt(relationship, spec.relationshipFields.id),\n source: textAt(relationship, spec.relationshipFields.source),\n target: textAt(relationship, spec.relationshipFields.target),\n label: textAt(relationship, spec.relationshipFields.label) || undefined,\n directed: true,\n })),\n };\n return <GraphDiagram node={componentNode(`${node.id}-network`, \"primitive:graph-diagram\", {\n graph: graphModel as unknown as Json,\n variant: \"diagram\",\n spec: {\n ...(spec.title ? { title: spec.title } : {}),\n ...(spec.description ? { description: spec.description } : {}),\n ...(spec.emptyText ? { emptyText: spec.emptyText } : {}),\n layout: \"radial\",\n },\n ...(typeof node.props.className === \"string\" ? { className: node.props.className } : {}),\n ...(node.props.style ? { style: node.props.style } : {}),\n })} emit={() => undefined} children={undefined} />;\n};\n\nconst description: ComponentDescription = {\n capability: \"semantic:relationship-set\", summary: \"Presents one authored entity and relationship set as a network, matrix, relation statements, or text.\", dataProp: \"graph\", events: [], semanticTokens: RELATIONSHIP_SET_SEMANTIC_TOKENS, defaultVariant: \"network\",\n variants: [\n { value: \"network\", summary: \"Node-link topology projection.\", useWhen: [\"Topology and connected structure are primary\"] },\n { value: \"matrix\", summary: \"Pairwise entity relationship matrix.\", useWhen: [\"Dense pairwise inspection matters\"] },\n { value: \"relations\", summary: \"Readable source-predicate-target statements.\", useWhen: [\"Precise relationship reading matters\"] },\n { value: \"text\", summary: \"Complete linear relationship statements.\", useWhen: [\"Visual layout is unavailable or inappropriate\"] },\n ],\n authoring: { useWhen: [\"Explicit relationships connect stable entities\"], avoidWhen: [\"Only grouped entities matter; use entity-set\"], rules: [\"All variants consume the same entities and relationships\", \"Reference only declared entity IDs\", \"Matrix cells and network edges are derived without changing relationships\", \"Put density in spec\"] },\n};\n\nexport function getRelationshipSetSchema(): Record<string, unknown> { return schema as unknown as Record<string, unknown>; }\nexport function validateRelationshipSet(props: unknown): ComponentValidationReport { return runDeclarativeValidators([\n { kind: \"ajv-schema\", schema: getRelationshipSetSchema(), message: \"Invalid semantic:relationship-set props\", code: \"relationship-set-schema\" },\n { kind: \"jsonata\", expr: \"($field := data.spec.entityFields.id; $ids := data.graph.entities.$lookup($, $field); $count($ids) = $count($distinct($ids)))\", message: \"Relationship-set entity IDs must be unique\", code: \"relationship-set-unique-entity-id\" },\n { kind: \"jsonata\", expr: \"($entityField := data.spec.entityFields.id; $sourceField := data.spec.relationshipFields.source; $targetField := data.spec.relationshipFields.target; $ids := data.graph.entities.$lookup($, $entityField); $count(data.graph.relationships[$lookup($, $sourceField) in $ids and $lookup($, $targetField) in $ids]) = $count(data.graph.relationships))\", message: \"Relationships must reference declared entity IDs\", code: \"relationship-set-reference\" },\n], props as Json); }\nexport function materializeRelationshipSetTrial() { return trialNode(\"semantic:relationship-set\", { variant: \"network\", graph: { entities: [{ id: \"identity\", label: \"Admin identity\", detail: \"Affected principal\", role: \"focus\" }, { id: \"device\", label: \"New device\", detail: \"Registered credential\", role: \"risk\" }, { id: \"application\", label: \"Finance app\", detail: \"Accessed resource\", role: \"related\" }], relationships: [{ id: \"registered\", from: \"identity\", to: \"device\", relation: \"registered\" }, { id: \"accessed\", from: \"identity\", to: \"application\", relation: \"accessed\" }] }, spec: { title: \"Incident relationships\", description: \"Entities linked by observed activity\", density: \"comfortable\", entityFields: { id: \"id\", label: \"label\", detail: \"detail\", tone: \"role\" }, relationshipFields: { id: \"id\", source: \"from\", target: \"to\", label: \"relation\" }, toneMap: { focus: \"central\", risk: \"risk\", related: \"related\" } } }); }\nexport const relationshipSetDefinition = defineComponent({ description, version: \"1.0.0\", component: RelationshipSet, getSchema: getRelationshipSetSchema, validate: validateRelationshipSet, materializeTrial: materializeRelationshipSetTrial });"],"mappings":"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","names":["Badge","Card","Text","makeStyles","mergeClasses","tokens","runDeclarativeValidators","jsx","jsxs","RELATIONSHIP_SET_SEMANTIC_TOKENS","RELATIONSHIP_SET_VARIANTS","schema","componentStylePropsSchema","useStyles","makeStyles","tokens","tokenColor","token","RelationshipSet","node","styles","graph","asRecord","entities","records","relationships","spec","variant","Text","componentRootProps","byId","entity","textAt","root","header","statement","relationship","source","target","matches","sourceTone","targetTone","Card","Badge","mergeClasses","graphModel","GraphDiagram","componentNode","description","getRelationshipSetSchema","validateRelationshipSet","props","runDeclarativeValidators","materializeRelationshipSetTrial","trialNode","relationshipSetDefinition","defineComponent"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
function T(t,e={},s=Object.keys(e)){return{summary:t,payloadSchema:{type:"object",additionalProperties:!1,...s.length>0?{required:s}:{},properties:e}}}function F({description:t,version:e,component:s,getSchema:a,validate:m,materializeTrial:d}){return{capability:t.capability,version:e,summary:t.summary,dataProp:t.dataProp,slots:t.slots,events:t.events,eventContracts:t.eventContracts??{},semanticTokens:t.semanticTokens,defaultVariant:t.defaultVariant,variants:t.variants,authoring:t.authoring,component:s,describe:()=>t,getSchema:a,validate:m,materializeTrial:d}}function A(t,e,s){return{id:t,capability:e,props:s,visible:!0,fallback:!1,children:[]}}function O(t,e){return A(`${t.replace(/[^A-Za-z0-9_-]/g,"-")}-trial`,t,e)}var w=new Set(["className","style","layout"]);function P(t){let e=t.properties;return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function j(t){let e=t.materializeTrial(),s=Object.fromEntries(Object.entries(e.props).filter(([a])=>a!==t.dataProp&&!w.has(a)));return{capability:t.capability,...Object.keys(s).length>0?{props:s}:{},...t.dataProp?{bindings:{[t.dataProp]:{from:"<state-path>"}}}:{}}}function x(t){let e={},s={};for(let a of Object.values(t)){let m=a.describe(),d=m.agentFacing,y=P(a.getSchema()),f={...a.dataProp&&y[a.dataProp]!==void 0?{[a.dataProp]:y[a.dataProp]}:{},...d?.detail?.dataProps??{}},C={...Object.fromEntries(Object.entries(y).filter(([u])=>u!==a.dataProp&&u!=="variant"&&!w.has(u))),...d?.detail?.props??{}},b=Object.fromEntries(m.variants.map(u=>[u.value,{summary:u.summary,useWhen:u.useWhen,...u.value===m.defaultVariant?{default:!0}:{}}]));e[a.capability]={for:d?.catalog?.for??m.authoring.useWhen,...(d?.catalog?.notFor??m.authoring.avoidWhen).length>0?{notFor:d?.catalog?.notFor??m.authoring.avoidWhen}:{},...d?.catalog?.interaction?{interaction:d.catalog.interaction}:{}},s[a.capability]={...Object.keys(f).length>0?{dataProps:f}:{},...Object.keys(C).length>0?{props:C}:{},...Object.keys(b).length>0?{variants:b}:{},...m.slots?.length?{slots:m.slots}:{},...m.events.length>0?{emits:a.eventContracts}:{},...(d?.detail?.constraints??m.authoring.rules).length>0?{constraints:d?.detail?.constraints??m.authoring.rules}:{},...d?.detail?.notes?.length?{notes:d.detail.notes}:{},example:d?.detail?.example??j(a)}}return{catalog:e,details:s}}var h=(t,e=[])=>({type:"object",properties:t,required:e,additionalProperties:!1});function z(t){let e=Object.entries(t.definitions),s=e.map(([,r])=>r.capability),a={list:`list${t.toolKind}Components`,describe:`describe${t.toolKind}Component`,validate:`validate${t.toolKind}ComponentProps`,preflight:`preflight${t.toolKind}Component`,materialize:`materialize${t.toolKind}ComponentTrial`},m=r=>e.find(([o,n])=>o===r||n.capability===r),d=r=>{let o=m(r);if(!o)throw new Error(`Unknown ${t.kind} component: ${r}. Available capabilities: ${s.join(", ")}`);return o[1]},y=r=>{if(r===void 0)return e;if(r.length===0)throw new Error(`At least one ${t.kind} component is required`);let o=new Map;for(let n of r){let c=m(n);if(!c)throw new Error(`Unknown ${t.kind} component: ${n}. Available capabilities: ${s.join(", ")}`);o.set(c[1].capability,c)}return[...o.values()]},f=r=>r.map(([o,n])=>({id:o,capability:n.capability,version:n.version,summary:n.summary,dataProp:n.dataProp,slots:n.slots??[],defaultVariant:n.defaultVariant,variants:n.variants.map(c=>c.value),events:n.events,eventContracts:n.eventContracts})),C=r=>{let o=d(r);return{...o.describe(),eventContracts:o.eventContracts,version:o.version,propsSchema:o.getSchema()}},b=(r,o)=>{let n=d(r),c=n.materializeTrial();o!==void 0&&(c.props.variant=o);let l=n.validate(c.props);if(!l.ok)throw new Error(l.errors.map(i=>i.detail).join("; "));return c},u=(r,o)=>{let n=d(r),c=typeof o=="object"&&o!==null?o:{};return{capability:n.capability,effectiveVariant:typeof c.variant=="string"?c.variant:n.defaultVariant,declaredEvents:n.events,eventContracts:n.eventContracts,...n.validate(o)}},R=r=>{let n=y(r).map(([,c])=>{let l=c.describe(),i=l.variants.map(p=>` - ${p.value}${p.value===l.defaultVariant?" (default)":""}: ${p.summary} Use when: ${p.useWhen.join("; ")}`).join(`
|
|
2
|
+
`),g=Object.entries(c.eventContracts).map(([p,v])=>` - ${p}: ${v.summary} Payload schema: ${JSON.stringify(v.payloadSchema)}`);return[`## ${l.capability}`,l.summary,`- Data prop: ${l.dataProp??"none"}`,`- Slots: ${l.slots?.join(", ")||"none"}`,`- Emitted events: ${l.events.length>0?l.events.join(", "):"none"}`,"- Event payload contracts:",...g.length>0?g:[" - none"],`- Semantic tokens: ${l.semanticTokens.join(", ")}`,"- Use when:",...l.authoring.useWhen.map(p=>` - ${p}`),"- Avoid when:",...l.authoring.avoidWhen.map(p=>` - ${p}`),"- Variants:",i,"- Authoring rules:",...l.authoring.rules.map(p=>` - ${p}`)].join(`
|
|
3
|
+
`)});return[`# GIK ${t.toolKind} Component Authoring`,"Use only the component contracts below. Their schemas are closed.",`Validate candidate props with ${a.validate} or ${a.preflight} before committing them.`,"Materialize a trial when mappings, tokens, variants, rendering, or event payload expectations change.","Components are declarative projection leaves. They may emit declared semantic events, but they do not execute runtime behavior directly.","Variants express stable presentation modes, not domain state, theme, or behavior. Omit variant when the default is appropriate.","These are pure ACX authoring operations, not live AX runtime verification.",...n].join(`
|
|
4
|
+
|
|
5
|
+
`)},k=r=>{let o=y(r),n=o.map(([,i])=>i.capability),c={type:"string",enum:n},l=i=>{let g=o.find(([p,v])=>p===i||v.capability===i);if(!g)throw new Error(`${t.toolKind} component ${i} is outside this agent kit. Allowed capabilities: ${n.join(", ")}`);return g[1]};return[{name:a.list,description:`List the ${t.kind} projection components assigned to this authoring context, including variants, emitted events, and event payload contracts.`,inputSchema:h({}),handler:()=>f(o),agentSafe:!0},{name:a.describe,description:`Describe one ${t.kind} component's schema, variants, tokens, events, and agent-facing authoring guidance before using it in a bundle.`,inputSchema:h({capability:c},["capability"]),handler:i=>{let g=l(String(i.capability));return{...g.describe(),eventContracts:g.eventContracts,version:g.version,propsSchema:g.getSchema()}},agentSafe:!0},{name:a.validate,description:`Preflight candidate props against a ${t.kind} component's closed schema and declarative validators.`,inputSchema:h({capability:c,props:{type:"object"}},["capability","props"]),handler:i=>l(String(i.capability)).validate(i.props),agentSafe:!0},{name:a.preflight,description:"Preflight candidate props and report validation, the effective variant, and declared events for bundle authoring.",inputSchema:h({capability:c,props:{type:"object"}},["capability","props"]),handler:i=>{let g=l(String(i.capability)),p=typeof i.props=="object"&&i.props!==null?i.props:{};return{capability:g.capability,effectiveVariant:typeof p.variant=="string"?p.variant:g.defaultVariant,declaredEvents:g.events,eventContracts:g.eventContracts,...g.validate(i.props)}},agentSafe:!0},{name:a.materialize,description:`Materialize a valid trial node for one ${t.kind} component and optionally select one of its declared variants.`,inputSchema:h({capability:c,variant:{type:"string"}},["capability"]),handler:i=>{let g=l(String(i.capability)),p=g.materializeTrial();i.variant!==void 0&&(p.props.variant=String(i.variant));let v=g.validate(p.props);if(!v.ok)throw new Error(v.errors.map(D=>D.detail).join("; "));return p},agentSafe:!0}]};return{agentFacingCatalog:()=>x(t.definitions),list:()=>f(e),describe:C,validate:(r,o)=>d(r).validate(o),materialize:b,preflight:u,instructions:R,createTools:k,getKit:r=>{let n=y(r).map(([,c])=>c.capability);return{capabilities:n,instructions:R(n),tools:k(n)}}}}import{mergeClasses as $}from"@fluentui/react-components";var V={className:{type:"string"},style:{type:"object",additionalProperties:{type:["string","number"]}}},M={layout:{type:"object",additionalProperties:!1,properties:{slots:{type:"array",items:{type:"object",additionalProperties:!1,required:["key","slot"],properties:{key:{type:"string",minLength:1},slot:{type:"string",minLength:1}}}}}}};function U(t){return{...t,properties:{...t.properties,...V}}}function G(t,...e){let s=typeof t.props.className=="string"?t.props.className:void 0,a=t.props.style&&typeof t.props.style=="object"&&!Array.isArray(t.props.style)?t.props.style:void 0;return{className:$(...e,s)||void 0,style:a}}function S(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}function I(t){return Array.isArray(t)?t.map(S):[]}function E(t,e){if(e)return e.split(".").reduce((s,a)=>S(s)[a],t)}function L(t,e){let s=E(t,e);return s==null?"":String(s)}export{T as a,F as b,A as c,O as d,x as e,z as f,V as g,M as h,U as i,G as j,S as k,I as l,E as m,L as n};
|
|
6
|
+
//# sourceMappingURL=chunk-XA6FE7ZK.js.map
|