@mindlogic-ai/logician-ui 3.1.0 → 3.2.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (376) hide show
  1. package/dist/components/Icon/_constants/iconList.d.ts +1 -1
  2. package/dist/components/Icon/_constants/iconList.d.ts.map +1 -1
  3. package/dist/components/Icon/_constants/iconList.js +18 -0
  4. package/dist/components/Icon/_constants/iconList.js.map +1 -1
  5. package/dist/components/Icon/_constants/iconList.mjs +20 -2
  6. package/dist/components/Icon/_constants/iconList.mjs.map +1 -1
  7. package/dist/components/Icon/index.d.ts +2 -1
  8. package/dist/components/Icon/index.d.ts.map +1 -1
  9. package/dist/components/Icon/index.js +20 -1
  10. package/dist/components/Icon/index.js.map +1 -1
  11. package/dist/components/Icon/index.mjs +4 -2
  12. package/dist/components/Icon/index.mjs.map +1 -1
  13. package/dist/components/Workflow/Workflow.d.ts +3 -0
  14. package/dist/components/Workflow/Workflow.d.ts.map +1 -0
  15. package/dist/components/Workflow/Workflow.js +109 -0
  16. package/dist/components/Workflow/Workflow.js.map +1 -0
  17. package/dist/components/Workflow/Workflow.mjs +107 -0
  18. package/dist/components/Workflow/Workflow.mjs.map +1 -0
  19. package/dist/components/Workflow/Workflow.translations.json.js +164 -0
  20. package/dist/components/Workflow/Workflow.translations.json.js.map +1 -0
  21. package/dist/components/Workflow/Workflow.translations.json.mjs +138 -0
  22. package/dist/components/Workflow/Workflow.translations.json.mjs.map +1 -0
  23. package/dist/components/Workflow/Workflow.types.d.ts +435 -0
  24. package/dist/components/Workflow/Workflow.types.d.ts.map +1 -0
  25. package/dist/components/Workflow/Workflow.types.js +19 -0
  26. package/dist/components/Workflow/Workflow.types.js.map +1 -0
  27. package/dist/components/Workflow/Workflow.types.mjs +16 -0
  28. package/dist/components/Workflow/Workflow.types.mjs.map +1 -0
  29. package/dist/components/Workflow/WorkflowContext/WorkflowContext.d.ts +10 -0
  30. package/dist/components/Workflow/WorkflowContext/WorkflowContext.d.ts.map +1 -0
  31. package/dist/components/Workflow/WorkflowContext/WorkflowContext.js +163 -0
  32. package/dist/components/Workflow/WorkflowContext/WorkflowContext.js.map +1 -0
  33. package/dist/components/Workflow/WorkflowContext/WorkflowContext.mjs +159 -0
  34. package/dist/components/Workflow/WorkflowContext/WorkflowContext.mjs.map +1 -0
  35. package/dist/components/Workflow/WorkflowContext/WorkflowContext.types.d.ts +117 -0
  36. package/dist/components/Workflow/WorkflowContext/WorkflowContext.types.d.ts.map +1 -0
  37. package/dist/components/Workflow/WorkflowContext/index.d.ts +3 -0
  38. package/dist/components/Workflow/WorkflowContext/index.d.ts.map +1 -0
  39. package/dist/components/Workflow/canvas/Canvas/BranchLabelBadge.d.ts +19 -0
  40. package/dist/components/Workflow/canvas/Canvas/BranchLabelBadge.d.ts.map +1 -0
  41. package/dist/components/Workflow/canvas/Canvas/BranchLabelBadge.js +44 -0
  42. package/dist/components/Workflow/canvas/Canvas/BranchLabelBadge.js.map +1 -0
  43. package/dist/components/Workflow/canvas/Canvas/BranchLabelBadge.mjs +42 -0
  44. package/dist/components/Workflow/canvas/Canvas/BranchLabelBadge.mjs.map +1 -0
  45. package/dist/components/Workflow/canvas/Canvas/Canvas.d.ts +10 -0
  46. package/dist/components/Workflow/canvas/Canvas/Canvas.d.ts.map +1 -0
  47. package/dist/components/Workflow/canvas/Canvas/Canvas.js +531 -0
  48. package/dist/components/Workflow/canvas/Canvas/Canvas.js.map +1 -0
  49. package/dist/components/Workflow/canvas/Canvas/Canvas.mjs +529 -0
  50. package/dist/components/Workflow/canvas/Canvas/Canvas.mjs.map +1 -0
  51. package/dist/components/Workflow/canvas/Canvas/Canvas.styles.d.ts +53 -0
  52. package/dist/components/Workflow/canvas/Canvas/Canvas.styles.d.ts.map +1 -0
  53. package/dist/components/Workflow/canvas/Canvas/Canvas.styles.js +96 -0
  54. package/dist/components/Workflow/canvas/Canvas/Canvas.styles.js.map +1 -0
  55. package/dist/components/Workflow/canvas/Canvas/Canvas.styles.mjs +93 -0
  56. package/dist/components/Workflow/canvas/Canvas/Canvas.styles.mjs.map +1 -0
  57. package/dist/components/Workflow/canvas/Canvas/CanvasControls.d.ts +27 -0
  58. package/dist/components/Workflow/canvas/Canvas/CanvasControls.d.ts.map +1 -0
  59. package/dist/components/Workflow/canvas/Canvas/CanvasControls.js +70 -0
  60. package/dist/components/Workflow/canvas/Canvas/CanvasControls.js.map +1 -0
  61. package/dist/components/Workflow/canvas/Canvas/CanvasControls.mjs +68 -0
  62. package/dist/components/Workflow/canvas/Canvas/CanvasControls.mjs.map +1 -0
  63. package/dist/components/Workflow/canvas/Canvas/LabeledEdge.d.ts +10 -0
  64. package/dist/components/Workflow/canvas/Canvas/LabeledEdge.d.ts.map +1 -0
  65. package/dist/components/Workflow/canvas/Canvas/LabeledEdge.js +106 -0
  66. package/dist/components/Workflow/canvas/Canvas/LabeledEdge.js.map +1 -0
  67. package/dist/components/Workflow/canvas/Canvas/LabeledEdge.mjs +104 -0
  68. package/dist/components/Workflow/canvas/Canvas/LabeledEdge.mjs.map +1 -0
  69. package/dist/components/Workflow/canvas/Canvas/edgeLabelVariant.d.ts +13 -0
  70. package/dist/components/Workflow/canvas/Canvas/edgeLabelVariant.d.ts.map +1 -0
  71. package/dist/components/Workflow/canvas/Canvas/edgeLabelVariant.js +18 -0
  72. package/dist/components/Workflow/canvas/Canvas/edgeLabelVariant.js.map +1 -0
  73. package/dist/components/Workflow/canvas/Canvas/edgeLabelVariant.mjs +16 -0
  74. package/dist/components/Workflow/canvas/Canvas/edgeLabelVariant.mjs.map +1 -0
  75. package/dist/components/Workflow/canvas/Canvas/index.d.ts +2 -0
  76. package/dist/components/Workflow/canvas/Canvas/index.d.ts.map +1 -0
  77. package/dist/components/Workflow/canvas/CollapsibleSection/CollapsibleSection.d.ts +30 -0
  78. package/dist/components/Workflow/canvas/CollapsibleSection/CollapsibleSection.d.ts.map +1 -0
  79. package/dist/components/Workflow/canvas/CollapsibleSection/CollapsibleSection.js +34 -0
  80. package/dist/components/Workflow/canvas/CollapsibleSection/CollapsibleSection.js.map +1 -0
  81. package/dist/components/Workflow/canvas/CollapsibleSection/CollapsibleSection.mjs +32 -0
  82. package/dist/components/Workflow/canvas/CollapsibleSection/CollapsibleSection.mjs.map +1 -0
  83. package/dist/components/Workflow/canvas/CollapsibleSection/index.d.ts +2 -0
  84. package/dist/components/Workflow/canvas/CollapsibleSection/index.d.ts.map +1 -0
  85. package/dist/components/Workflow/canvas/DrawerShell/DrawerHeader.d.ts +37 -0
  86. package/dist/components/Workflow/canvas/DrawerShell/DrawerHeader.d.ts.map +1 -0
  87. package/dist/components/Workflow/canvas/DrawerShell/DrawerHeader.js +33 -0
  88. package/dist/components/Workflow/canvas/DrawerShell/DrawerHeader.js.map +1 -0
  89. package/dist/components/Workflow/canvas/DrawerShell/DrawerHeader.mjs +31 -0
  90. package/dist/components/Workflow/canvas/DrawerShell/DrawerHeader.mjs.map +1 -0
  91. package/dist/components/Workflow/canvas/DrawerShell/DrawerIssues.d.ts +16 -0
  92. package/dist/components/Workflow/canvas/DrawerShell/DrawerIssues.d.ts.map +1 -0
  93. package/dist/components/Workflow/canvas/DrawerShell/DrawerIssues.js +54 -0
  94. package/dist/components/Workflow/canvas/DrawerShell/DrawerIssues.js.map +1 -0
  95. package/dist/components/Workflow/canvas/DrawerShell/DrawerIssues.mjs +52 -0
  96. package/dist/components/Workflow/canvas/DrawerShell/DrawerIssues.mjs.map +1 -0
  97. package/dist/components/Workflow/canvas/DrawerShell/DrawerShell.d.ts +27 -0
  98. package/dist/components/Workflow/canvas/DrawerShell/DrawerShell.d.ts.map +1 -0
  99. package/dist/components/Workflow/canvas/DrawerShell/DrawerShell.js +178 -0
  100. package/dist/components/Workflow/canvas/DrawerShell/DrawerShell.js.map +1 -0
  101. package/dist/components/Workflow/canvas/DrawerShell/DrawerShell.mjs +176 -0
  102. package/dist/components/Workflow/canvas/DrawerShell/DrawerShell.mjs.map +1 -0
  103. package/dist/components/Workflow/canvas/DrawerShell/index.d.ts +3 -0
  104. package/dist/components/Workflow/canvas/DrawerShell/index.d.ts.map +1 -0
  105. package/dist/components/Workflow/canvas/EdgeInspector/BuiltInEdgeInspector.d.ts +12 -0
  106. package/dist/components/Workflow/canvas/EdgeInspector/BuiltInEdgeInspector.d.ts.map +1 -0
  107. package/dist/components/Workflow/canvas/EdgeInspector/BuiltInEdgeInspector.js +68 -0
  108. package/dist/components/Workflow/canvas/EdgeInspector/BuiltInEdgeInspector.js.map +1 -0
  109. package/dist/components/Workflow/canvas/EdgeInspector/BuiltInEdgeInspector.mjs +66 -0
  110. package/dist/components/Workflow/canvas/EdgeInspector/BuiltInEdgeInspector.mjs.map +1 -0
  111. package/dist/components/Workflow/canvas/EdgeInspector/endpointTitle.d.ts +19 -0
  112. package/dist/components/Workflow/canvas/EdgeInspector/endpointTitle.d.ts.map +1 -0
  113. package/dist/components/Workflow/canvas/EdgeInspector/endpointTitle.js +35 -0
  114. package/dist/components/Workflow/canvas/EdgeInspector/endpointTitle.js.map +1 -0
  115. package/dist/components/Workflow/canvas/EdgeInspector/endpointTitle.mjs +32 -0
  116. package/dist/components/Workflow/canvas/EdgeInspector/endpointTitle.mjs.map +1 -0
  117. package/dist/components/Workflow/canvas/EdgeInspector/index.d.ts +3 -0
  118. package/dist/components/Workflow/canvas/EdgeInspector/index.d.ts.map +1 -0
  119. package/dist/components/Workflow/canvas/FieldWrapper/FieldWrapper.d.ts +54 -0
  120. package/dist/components/Workflow/canvas/FieldWrapper/FieldWrapper.d.ts.map +1 -0
  121. package/dist/components/Workflow/canvas/FieldWrapper/FieldWrapper.js +56 -0
  122. package/dist/components/Workflow/canvas/FieldWrapper/FieldWrapper.js.map +1 -0
  123. package/dist/components/Workflow/canvas/FieldWrapper/FieldWrapper.mjs +54 -0
  124. package/dist/components/Workflow/canvas/FieldWrapper/FieldWrapper.mjs.map +1 -0
  125. package/dist/components/Workflow/canvas/FieldWrapper/index.d.ts +3 -0
  126. package/dist/components/Workflow/canvas/FieldWrapper/index.d.ts.map +1 -0
  127. package/dist/components/Workflow/canvas/FloatingCard/FloatingCard.d.ts +16 -0
  128. package/dist/components/Workflow/canvas/FloatingCard/FloatingCard.d.ts.map +1 -0
  129. package/dist/components/Workflow/canvas/FloatingCard/FloatingCard.js +25 -0
  130. package/dist/components/Workflow/canvas/FloatingCard/FloatingCard.js.map +1 -0
  131. package/dist/components/Workflow/canvas/FloatingCard/FloatingCard.mjs +22 -0
  132. package/dist/components/Workflow/canvas/FloatingCard/FloatingCard.mjs.map +1 -0
  133. package/dist/components/Workflow/canvas/FloatingCard/index.d.ts +2 -0
  134. package/dist/components/Workflow/canvas/FloatingCard/index.d.ts.map +1 -0
  135. package/dist/components/Workflow/canvas/GenericNode/GenericNode.d.ts +14 -0
  136. package/dist/components/Workflow/canvas/GenericNode/GenericNode.d.ts.map +1 -0
  137. package/dist/components/Workflow/canvas/GenericNode/GenericNode.js +61 -0
  138. package/dist/components/Workflow/canvas/GenericNode/GenericNode.js.map +1 -0
  139. package/dist/components/Workflow/canvas/GenericNode/GenericNode.mjs +59 -0
  140. package/dist/components/Workflow/canvas/GenericNode/GenericNode.mjs.map +1 -0
  141. package/dist/components/Workflow/canvas/GenericNode/GenericNode.types.d.ts +11 -0
  142. package/dist/components/Workflow/canvas/GenericNode/GenericNode.types.d.ts.map +1 -0
  143. package/dist/components/Workflow/canvas/GenericNode/index.d.ts +3 -0
  144. package/dist/components/Workflow/canvas/GenericNode/index.d.ts.map +1 -0
  145. package/dist/components/Workflow/canvas/GraphErrorBanner/GraphErrorBanner.d.ts +15 -0
  146. package/dist/components/Workflow/canvas/GraphErrorBanner/GraphErrorBanner.d.ts.map +1 -0
  147. package/dist/components/Workflow/canvas/GraphErrorBanner/GraphErrorBanner.js +145 -0
  148. package/dist/components/Workflow/canvas/GraphErrorBanner/GraphErrorBanner.js.map +1 -0
  149. package/dist/components/Workflow/canvas/GraphErrorBanner/GraphErrorBanner.mjs +143 -0
  150. package/dist/components/Workflow/canvas/GraphErrorBanner/GraphErrorBanner.mjs.map +1 -0
  151. package/dist/components/Workflow/canvas/GraphErrorBanner/index.d.ts +2 -0
  152. package/dist/components/Workflow/canvas/GraphErrorBanner/index.d.ts.map +1 -0
  153. package/dist/components/Workflow/canvas/IconTile/IconTile.d.ts +10 -0
  154. package/dist/components/Workflow/canvas/IconTile/IconTile.d.ts.map +1 -0
  155. package/dist/components/Workflow/canvas/IconTile/IconTile.js +21 -0
  156. package/dist/components/Workflow/canvas/IconTile/IconTile.js.map +1 -0
  157. package/dist/components/Workflow/canvas/IconTile/IconTile.mjs +19 -0
  158. package/dist/components/Workflow/canvas/IconTile/IconTile.mjs.map +1 -0
  159. package/dist/components/Workflow/canvas/IconTile/IconTile.styles.d.ts +18 -0
  160. package/dist/components/Workflow/canvas/IconTile/IconTile.styles.d.ts.map +1 -0
  161. package/dist/components/Workflow/canvas/IconTile/IconTile.styles.js +40 -0
  162. package/dist/components/Workflow/canvas/IconTile/IconTile.styles.js.map +1 -0
  163. package/dist/components/Workflow/canvas/IconTile/IconTile.styles.mjs +37 -0
  164. package/dist/components/Workflow/canvas/IconTile/IconTile.styles.mjs.map +1 -0
  165. package/dist/components/Workflow/canvas/IconTile/IconTile.types.d.ts +15 -0
  166. package/dist/components/Workflow/canvas/IconTile/IconTile.types.d.ts.map +1 -0
  167. package/dist/components/Workflow/canvas/IconTile/index.d.ts +4 -0
  168. package/dist/components/Workflow/canvas/IconTile/index.d.ts.map +1 -0
  169. package/dist/components/Workflow/canvas/IssueList/IssueList.d.ts +24 -0
  170. package/dist/components/Workflow/canvas/IssueList/IssueList.d.ts.map +1 -0
  171. package/dist/components/Workflow/canvas/IssueList/IssueList.js +34 -0
  172. package/dist/components/Workflow/canvas/IssueList/IssueList.js.map +1 -0
  173. package/dist/components/Workflow/canvas/IssueList/IssueList.mjs +32 -0
  174. package/dist/components/Workflow/canvas/IssueList/IssueList.mjs.map +1 -0
  175. package/dist/components/Workflow/canvas/IssueList/index.d.ts +2 -0
  176. package/dist/components/Workflow/canvas/IssueList/index.d.ts.map +1 -0
  177. package/dist/components/Workflow/canvas/NodePalette/NodePalette.d.ts +9 -0
  178. package/dist/components/Workflow/canvas/NodePalette/NodePalette.d.ts.map +1 -0
  179. package/dist/components/Workflow/canvas/NodePalette/NodePalette.js +94 -0
  180. package/dist/components/Workflow/canvas/NodePalette/NodePalette.js.map +1 -0
  181. package/dist/components/Workflow/canvas/NodePalette/NodePalette.mjs +92 -0
  182. package/dist/components/Workflow/canvas/NodePalette/NodePalette.mjs.map +1 -0
  183. package/dist/components/Workflow/canvas/NodePalette/NodePalette.styles.d.ts +7 -0
  184. package/dist/components/Workflow/canvas/NodePalette/NodePalette.styles.d.ts.map +1 -0
  185. package/dist/components/Workflow/canvas/NodePalette/NodePalette.styles.js +13 -0
  186. package/dist/components/Workflow/canvas/NodePalette/NodePalette.styles.js.map +1 -0
  187. package/dist/components/Workflow/canvas/NodePalette/NodePalette.styles.mjs +10 -0
  188. package/dist/components/Workflow/canvas/NodePalette/NodePalette.styles.mjs.map +1 -0
  189. package/dist/components/Workflow/canvas/NodePalette/NodePaletteToggle.d.ts +10 -0
  190. package/dist/components/Workflow/canvas/NodePalette/NodePaletteToggle.d.ts.map +1 -0
  191. package/dist/components/Workflow/canvas/NodePalette/NodePaletteToggle.js +28 -0
  192. package/dist/components/Workflow/canvas/NodePalette/NodePaletteToggle.js.map +1 -0
  193. package/dist/components/Workflow/canvas/NodePalette/NodePaletteToggle.mjs +26 -0
  194. package/dist/components/Workflow/canvas/NodePalette/NodePaletteToggle.mjs.map +1 -0
  195. package/dist/components/Workflow/canvas/NodePalette/index.d.ts +4 -0
  196. package/dist/components/Workflow/canvas/NodePalette/index.d.ts.map +1 -0
  197. package/dist/components/Workflow/canvas/NodeShell/NodeShell.d.ts +3 -0
  198. package/dist/components/Workflow/canvas/NodeShell/NodeShell.d.ts.map +1 -0
  199. package/dist/components/Workflow/canvas/NodeShell/NodeShell.js +137 -0
  200. package/dist/components/Workflow/canvas/NodeShell/NodeShell.js.map +1 -0
  201. package/dist/components/Workflow/canvas/NodeShell/NodeShell.mjs +135 -0
  202. package/dist/components/Workflow/canvas/NodeShell/NodeShell.mjs.map +1 -0
  203. package/dist/components/Workflow/canvas/NodeShell/NodeShell.styles.d.ts +66 -0
  204. package/dist/components/Workflow/canvas/NodeShell/NodeShell.styles.d.ts.map +1 -0
  205. package/dist/components/Workflow/canvas/NodeShell/NodeShell.styles.js +87 -0
  206. package/dist/components/Workflow/canvas/NodeShell/NodeShell.styles.js.map +1 -0
  207. package/dist/components/Workflow/canvas/NodeShell/NodeShell.styles.mjs +77 -0
  208. package/dist/components/Workflow/canvas/NodeShell/NodeShell.styles.mjs.map +1 -0
  209. package/dist/components/Workflow/canvas/NodeShell/NodeShell.types.d.ts +35 -0
  210. package/dist/components/Workflow/canvas/NodeShell/NodeShell.types.d.ts.map +1 -0
  211. package/dist/components/Workflow/canvas/NodeShell/index.d.ts +4 -0
  212. package/dist/components/Workflow/canvas/NodeShell/index.d.ts.map +1 -0
  213. package/dist/components/Workflow/canvas/SeverityDot/SeverityDot.d.ts +15 -0
  214. package/dist/components/Workflow/canvas/SeverityDot/SeverityDot.d.ts.map +1 -0
  215. package/dist/components/Workflow/canvas/SeverityDot/SeverityDot.js +14 -0
  216. package/dist/components/Workflow/canvas/SeverityDot/SeverityDot.js.map +1 -0
  217. package/dist/components/Workflow/canvas/SeverityDot/SeverityDot.mjs +12 -0
  218. package/dist/components/Workflow/canvas/SeverityDot/SeverityDot.mjs.map +1 -0
  219. package/dist/components/Workflow/canvas/SeverityDot/index.d.ts +2 -0
  220. package/dist/components/Workflow/canvas/SeverityDot/index.d.ts.map +1 -0
  221. package/dist/components/Workflow/canvas/issueSeverity.d.ts +23 -0
  222. package/dist/components/Workflow/canvas/issueSeverity.d.ts.map +1 -0
  223. package/dist/components/Workflow/canvas/issueSeverity.js +51 -0
  224. package/dist/components/Workflow/canvas/issueSeverity.js.map +1 -0
  225. package/dist/components/Workflow/canvas/issueSeverity.mjs +47 -0
  226. package/dist/components/Workflow/canvas/issueSeverity.mjs.map +1 -0
  227. package/dist/components/Workflow/canvas/useFieldFocusRequest.d.ts +14 -0
  228. package/dist/components/Workflow/canvas/useFieldFocusRequest.d.ts.map +1 -0
  229. package/dist/components/Workflow/canvas/useFieldFocusRequest.js +48 -0
  230. package/dist/components/Workflow/canvas/useFieldFocusRequest.js.map +1 -0
  231. package/dist/components/Workflow/canvas/useFieldFocusRequest.mjs +46 -0
  232. package/dist/components/Workflow/canvas/useFieldFocusRequest.mjs.map +1 -0
  233. package/dist/components/Workflow/canvas/workflowLabelProps.d.ts +12 -0
  234. package/dist/components/Workflow/canvas/workflowLabelProps.d.ts.map +1 -0
  235. package/dist/components/Workflow/canvas/workflowLabelProps.js +17 -0
  236. package/dist/components/Workflow/canvas/workflowLabelProps.js.map +1 -0
  237. package/dist/components/Workflow/canvas/workflowLabelProps.mjs +15 -0
  238. package/dist/components/Workflow/canvas/workflowLabelProps.mjs.map +1 -0
  239. package/dist/components/Workflow/connectionRules.d.ts +59 -0
  240. package/dist/components/Workflow/connectionRules.d.ts.map +1 -0
  241. package/dist/components/Workflow/connectionRules.js +150 -0
  242. package/dist/components/Workflow/connectionRules.js.map +1 -0
  243. package/dist/components/Workflow/connectionRules.mjs +145 -0
  244. package/dist/components/Workflow/connectionRules.mjs.map +1 -0
  245. package/dist/components/Workflow/createNode.d.ts +27 -0
  246. package/dist/components/Workflow/createNode.d.ts.map +1 -0
  247. package/dist/components/Workflow/createNode.js +66 -0
  248. package/dist/components/Workflow/createNode.js.map +1 -0
  249. package/dist/components/Workflow/createNode.mjs +62 -0
  250. package/dist/components/Workflow/createNode.mjs.map +1 -0
  251. package/dist/components/Workflow/graphHistory.d.ts +23 -0
  252. package/dist/components/Workflow/graphHistory.d.ts.map +1 -0
  253. package/dist/components/Workflow/graphHistory.js +73 -0
  254. package/dist/components/Workflow/graphHistory.js.map +1 -0
  255. package/dist/components/Workflow/graphHistory.mjs +70 -0
  256. package/dist/components/Workflow/graphHistory.mjs.map +1 -0
  257. package/dist/components/Workflow/graphObserver.d.ts +13 -0
  258. package/dist/components/Workflow/graphObserver.d.ts.map +1 -0
  259. package/dist/components/Workflow/graphObserver.js +11 -0
  260. package/dist/components/Workflow/graphObserver.js.map +1 -0
  261. package/dist/components/Workflow/graphObserver.mjs +8 -0
  262. package/dist/components/Workflow/graphObserver.mjs.map +1 -0
  263. package/dist/components/Workflow/graphReducer.d.ts +75 -0
  264. package/dist/components/Workflow/graphReducer.d.ts.map +1 -0
  265. package/dist/components/Workflow/graphReducer.js +122 -0
  266. package/dist/components/Workflow/graphReducer.js.map +1 -0
  267. package/dist/components/Workflow/graphReducer.mjs +119 -0
  268. package/dist/components/Workflow/graphReducer.mjs.map +1 -0
  269. package/dist/components/Workflow/index.d.ts +22 -0
  270. package/dist/components/Workflow/index.d.ts.map +1 -0
  271. package/dist/components/Workflow/layout/autoLayout.d.ts +49 -0
  272. package/dist/components/Workflow/layout/autoLayout.d.ts.map +1 -0
  273. package/dist/components/Workflow/layout/autoLayout.js +149 -0
  274. package/dist/components/Workflow/layout/autoLayout.js.map +1 -0
  275. package/dist/components/Workflow/layout/autoLayout.mjs +146 -0
  276. package/dist/components/Workflow/layout/autoLayout.mjs.map +1 -0
  277. package/dist/components/Workflow/stories/toyNodeTypes.d.ts +40 -0
  278. package/dist/components/Workflow/stories/toyNodeTypes.d.ts.map +1 -0
  279. package/dist/components/Workflow/useWorkflowIssueMessage.d.ts +15 -0
  280. package/dist/components/Workflow/useWorkflowIssueMessage.d.ts.map +1 -0
  281. package/dist/components/Workflow/useWorkflowIssueMessage.js +45 -0
  282. package/dist/components/Workflow/useWorkflowIssueMessage.js.map +1 -0
  283. package/dist/components/Workflow/useWorkflowIssueMessage.mjs +43 -0
  284. package/dist/components/Workflow/useWorkflowIssueMessage.mjs.map +1 -0
  285. package/dist/components/Workflow/useWorkflowKeyboard.d.ts +10 -0
  286. package/dist/components/Workflow/useWorkflowKeyboard.d.ts.map +1 -0
  287. package/dist/components/Workflow/useWorkflowKeyboard.js +116 -0
  288. package/dist/components/Workflow/useWorkflowKeyboard.js.map +1 -0
  289. package/dist/components/Workflow/useWorkflowKeyboard.mjs +114 -0
  290. package/dist/components/Workflow/useWorkflowKeyboard.mjs.map +1 -0
  291. package/dist/icons.js +17 -0
  292. package/dist/icons.js.map +1 -1
  293. package/dist/icons.mjs +1 -1
  294. package/dist/index.d.ts +1 -0
  295. package/dist/index.d.ts.map +1 -1
  296. package/dist/index.js +38 -0
  297. package/dist/index.js.map +1 -1
  298. package/dist/index.mjs +14 -0
  299. package/dist/index.mjs.map +1 -1
  300. package/dist/test-support/setup.d.ts +5 -0
  301. package/dist/test-support/setup.d.ts.map +1 -0
  302. package/package.json +10 -2
  303. package/src/components/Icon/_constants/iconList.ts +35 -0
  304. package/src/components/Icon/index.tsx +20 -0
  305. package/src/components/Workflow/README.md +362 -0
  306. package/src/components/Workflow/Workflow.translations.json +112 -0
  307. package/src/components/Workflow/Workflow.tsx +189 -0
  308. package/src/components/Workflow/Workflow.types.ts +496 -0
  309. package/src/components/Workflow/WorkflowContext/WorkflowContext.tsx +215 -0
  310. package/src/components/Workflow/WorkflowContext/WorkflowContext.types.ts +122 -0
  311. package/src/components/Workflow/WorkflowContext/index.ts +10 -0
  312. package/src/components/Workflow/WorkflowContext/workflowSelection.test.tsx +93 -0
  313. package/src/components/Workflow/canvas/Canvas/BranchLabelBadge.tsx +69 -0
  314. package/src/components/Workflow/canvas/Canvas/Canvas.styles.ts +91 -0
  315. package/src/components/Workflow/canvas/Canvas/Canvas.tsx +773 -0
  316. package/src/components/Workflow/canvas/Canvas/CanvasControls.tsx +178 -0
  317. package/src/components/Workflow/canvas/Canvas/LabeledEdge.tsx +198 -0
  318. package/src/components/Workflow/canvas/Canvas/edgeLabelVariant.test.ts +26 -0
  319. package/src/components/Workflow/canvas/Canvas/edgeLabelVariant.ts +23 -0
  320. package/src/components/Workflow/canvas/Canvas/index.ts +1 -0
  321. package/src/components/Workflow/canvas/CollapsibleSection/CollapsibleSection.tsx +96 -0
  322. package/src/components/Workflow/canvas/CollapsibleSection/index.ts +4 -0
  323. package/src/components/Workflow/canvas/DrawerShell/DrawerHeader.tsx +104 -0
  324. package/src/components/Workflow/canvas/DrawerShell/DrawerIssues.tsx +115 -0
  325. package/src/components/Workflow/canvas/DrawerShell/DrawerShell.tsx +408 -0
  326. package/src/components/Workflow/canvas/DrawerShell/index.ts +2 -0
  327. package/src/components/Workflow/canvas/EdgeInspector/BuiltInEdgeInspector.tsx +135 -0
  328. package/src/components/Workflow/canvas/EdgeInspector/endpointTitle.ts +38 -0
  329. package/src/components/Workflow/canvas/EdgeInspector/index.ts +2 -0
  330. package/src/components/Workflow/canvas/FieldWrapper/FieldWrapper.tsx +118 -0
  331. package/src/components/Workflow/canvas/FieldWrapper/index.ts +6 -0
  332. package/src/components/Workflow/canvas/FloatingCard/FloatingCard.tsx +37 -0
  333. package/src/components/Workflow/canvas/FloatingCard/index.ts +1 -0
  334. package/src/components/Workflow/canvas/GenericNode/GenericNode.tsx +114 -0
  335. package/src/components/Workflow/canvas/GenericNode/GenericNode.types.ts +10 -0
  336. package/src/components/Workflow/canvas/GenericNode/index.ts +5 -0
  337. package/src/components/Workflow/canvas/GraphErrorBanner/GraphErrorBanner.tsx +284 -0
  338. package/src/components/Workflow/canvas/GraphErrorBanner/index.ts +1 -0
  339. package/src/components/Workflow/canvas/IconTile/IconTile.styles.ts +40 -0
  340. package/src/components/Workflow/canvas/IconTile/IconTile.tsx +36 -0
  341. package/src/components/Workflow/canvas/IconTile/IconTile.types.ts +13 -0
  342. package/src/components/Workflow/canvas/IconTile/index.ts +7 -0
  343. package/src/components/Workflow/canvas/IssueList/IssueList.tsx +84 -0
  344. package/src/components/Workflow/canvas/IssueList/index.ts +1 -0
  345. package/src/components/Workflow/canvas/NodePalette/NodePalette.styles.ts +7 -0
  346. package/src/components/Workflow/canvas/NodePalette/NodePalette.tsx +180 -0
  347. package/src/components/Workflow/canvas/NodePalette/NodePaletteToggle.tsx +39 -0
  348. package/src/components/Workflow/canvas/NodePalette/index.ts +3 -0
  349. package/src/components/Workflow/canvas/NodeShell/NodeShell.styles.ts +84 -0
  350. package/src/components/Workflow/canvas/NodeShell/NodeShell.tsx +321 -0
  351. package/src/components/Workflow/canvas/NodeShell/NodeShell.types.ts +45 -0
  352. package/src/components/Workflow/canvas/NodeShell/index.ts +8 -0
  353. package/src/components/Workflow/canvas/SeverityDot/SeverityDot.tsx +33 -0
  354. package/src/components/Workflow/canvas/SeverityDot/index.ts +1 -0
  355. package/src/components/Workflow/canvas/issueSeverity.ts +48 -0
  356. package/src/components/Workflow/canvas/useFieldFocusRequest.ts +54 -0
  357. package/src/components/Workflow/canvas/workflowLabelProps.ts +11 -0
  358. package/src/components/Workflow/connectionRules.test.ts +326 -0
  359. package/src/components/Workflow/connectionRules.ts +190 -0
  360. package/src/components/Workflow/createNode.test.ts +61 -0
  361. package/src/components/Workflow/createNode.ts +67 -0
  362. package/src/components/Workflow/graphHistory.test.ts +178 -0
  363. package/src/components/Workflow/graphHistory.ts +91 -0
  364. package/src/components/Workflow/graphObserver.ts +21 -0
  365. package/src/components/Workflow/graphReducer.test.ts +314 -0
  366. package/src/components/Workflow/graphReducer.ts +196 -0
  367. package/src/components/Workflow/index.ts +74 -0
  368. package/src/components/Workflow/layout/autoLayout.test.ts +170 -0
  369. package/src/components/Workflow/layout/autoLayout.ts +200 -0
  370. package/src/components/Workflow/stories/Workflow.stories.tsx +111 -0
  371. package/src/components/Workflow/stories/toyNodeTypes.tsx +146 -0
  372. package/src/components/Workflow/useWorkflowIssueMessage.test.ts +101 -0
  373. package/src/components/Workflow/useWorkflowIssueMessage.ts +49 -0
  374. package/src/components/Workflow/useWorkflowKeyboard.ts +126 -0
  375. package/src/index.ts +1 -0
  376. package/src/test-support/setup.ts +11 -0
@@ -0,0 +1,178 @@
1
+ 'use client';
2
+
3
+ import type { FitViewOptions } from '@xyflow/react';
4
+ import {
5
+ ControlButton,
6
+ Controls,
7
+ useReactFlow,
8
+ useStore,
9
+ useStoreApi,
10
+ } from '@xyflow/react';
11
+
12
+ import {
13
+ Minus,
14
+ Plus,
15
+ TbArrowBackUp,
16
+ TbArrowForwardUp,
17
+ TbLock,
18
+ TbLockOpen,
19
+ TbMaximize,
20
+ TbSitemap,
21
+ } from '@/components/Icon';
22
+ import { Tooltip } from '@/components/Tooltip';
23
+
24
+ import { useWorkflow, useWorkflowTranslate } from '../../WorkflowContext';
25
+
26
+ // Rendered height of the palette toggle the controls tuck under in edit mode;
27
+ // update if the toggle resizes. Combined with the palette's own top gutter
28
+ // (spacing-4) it forms the clearance the controls drop by so they sit just
29
+ // below the toggle instead of overlapping it.
30
+ const PALETTE_TOGGLE_HEIGHT_PX = 52;
31
+ // Edit-mode top offset: clear the palette toggle (its gutter + height). Read-only
32
+ // preview has no chrome, so the controls sit at the plain corner inset instead.
33
+ const TOP_LEFT_OVERLAY_CLEARANCE = `calc(var(--chakra-spacing-4) + ${PALETTE_TOGGLE_HEIGHT_PX}px)`;
34
+ // Corner inset (spacing-3) for the controls when no chrome sits above them.
35
+ const CORNER_INSET = 'var(--chakra-spacing-3)';
36
+
37
+ type CanvasControlsProps = {
38
+ /** Read-only preview hides the authoring-only lock and auto-arrange actions. */
39
+ readOnly: boolean;
40
+ /** Tidy the graph left-to-right — owned by the canvas, which has the node
41
+ measurements the layout needs. */
42
+ onAutoArrange: () => void;
43
+ /** Shared fit-view framing so the manual button settles the view the same way
44
+ the initial mount and re-fits do. */
45
+ fitViewOptions: FitViewOptions;
46
+ /** Whether the top-left corner already holds overlay chrome (palette toggle or
47
+ error banner). When it does, the controls tuck below it; otherwise they sit
48
+ tight in the corner so they never float under an empty gap. */
49
+ topLeftChromePresent: boolean;
50
+ };
51
+
52
+ /**
53
+ * The top-left canvas controls. We render every button ourselves — React
54
+ * Flow's built-in zoom / fit / interactivity buttons are suppressed — so each
55
+ * carries a localized {@link Tooltip} instead of React Flow's hardcoded English
56
+ * `title`. We dock the cluster into the top-left overlay corner (rather than
57
+ * React Flow's default bottom-left) so it doesn't read as orphaned mid-canvas —
58
+ * most noticeably when the version-history inspector docks on the left.
59
+ * Placement "right" keeps the tooltip on-canvas.
60
+ */
61
+ export function CanvasControls({
62
+ readOnly,
63
+ onAutoArrange,
64
+ fitViewOptions,
65
+ topLeftChromePresent,
66
+ }: CanvasControlsProps) {
67
+ const { zoomIn, zoomOut, fitView } = useReactFlow();
68
+ // Context undo/redo route through the Workflow wrapper that also asks the
69
+ // host to persist a position-only revert — same path the keyboard shortcuts
70
+ // take, so a button-driven undo of an auto-arrange sticks across reloads.
71
+ const { undo, redo, canUndo, canRedo } = useWorkflow();
72
+ const translate = useWorkflowTranslate();
73
+ const t = (key: string) => translate(key) as string;
74
+
75
+ // Mirror React Flow's built-in interactivity lock so our custom buttons drive
76
+ // the same store state the default lock button would. "Interactive" means
77
+ // nodes can be dragged, connected, and selected; the lock flips all three.
78
+ const isInteractive = useStore(
79
+ (s) => s.nodesDraggable || s.nodesConnectable || s.elementsSelectable
80
+ );
81
+ const store = useStoreApi();
82
+ const onToggleInteractivity = () =>
83
+ store.setState({
84
+ nodesDraggable: !isInteractive,
85
+ nodesConnectable: !isInteractive,
86
+ elementsSelectable: !isInteractive,
87
+ });
88
+
89
+ const zoomInLabel = t('workflow_zoom_in');
90
+ const zoomOutLabel = t('workflow_zoom_out');
91
+ const fitViewLabel = t('workflow_fit_view');
92
+ const undoLabel = t('workflow_undo');
93
+ const redoLabel = t('workflow_redo');
94
+ const autoArrangeLabel = t('workflow_auto_arrange');
95
+ // The tooltip names the action a click performs: an interactive canvas locks,
96
+ // a locked canvas unlocks.
97
+ const interactivityLabel = isInteractive
98
+ ? t('workflow_lock_canvas')
99
+ : t('workflow_unlock_canvas');
100
+
101
+ return (
102
+ <Controls
103
+ showZoom={false}
104
+ showFitView={false}
105
+ showInteractive={false}
106
+ // Dock into the top-left overlay corner. When the corner already holds
107
+ // chrome (the palette toggle or the error banner) the cluster tucks below
108
+ // it; otherwise it sits at the corner so it never floats under an empty gap.
109
+ position="top-left"
110
+ style={{
111
+ top: topLeftChromePresent ? TOP_LEFT_OVERLAY_CLEARANCE : CORNER_INSET,
112
+ left: CORNER_INSET,
113
+ margin: 0,
114
+ }}
115
+ >
116
+ <Tooltip content={zoomInLabel} placement="right">
117
+ <ControlButton onClick={() => zoomIn()} aria-label={zoomInLabel}>
118
+ <Plus />
119
+ </ControlButton>
120
+ </Tooltip>
121
+ <Tooltip content={zoomOutLabel} placement="right">
122
+ <ControlButton onClick={() => zoomOut()} aria-label={zoomOutLabel}>
123
+ <Minus />
124
+ </ControlButton>
125
+ </Tooltip>
126
+ <Tooltip content={fitViewLabel} placement="right">
127
+ <ControlButton
128
+ onClick={() => fitView(fitViewOptions)}
129
+ aria-label={fitViewLabel}
130
+ >
131
+ <TbMaximize />
132
+ </ControlButton>
133
+ </Tooltip>
134
+ {/* Undo/redo, the interactivity lock and auto-arrange are authoring
135
+ controls — meaningless in the read-only preview, so all are hidden
136
+ there. */}
137
+ {readOnly ? null : (
138
+ <Tooltip content={undoLabel} placement="right">
139
+ <ControlButton
140
+ onClick={undo}
141
+ disabled={!canUndo}
142
+ aria-label={undoLabel}
143
+ >
144
+ <TbArrowBackUp />
145
+ </ControlButton>
146
+ </Tooltip>
147
+ )}
148
+ {readOnly ? null : (
149
+ <Tooltip content={redoLabel} placement="right">
150
+ <ControlButton
151
+ onClick={redo}
152
+ disabled={!canRedo}
153
+ aria-label={redoLabel}
154
+ >
155
+ <TbArrowForwardUp />
156
+ </ControlButton>
157
+ </Tooltip>
158
+ )}
159
+ {readOnly ? null : (
160
+ <Tooltip content={interactivityLabel} placement="right">
161
+ <ControlButton
162
+ onClick={onToggleInteractivity}
163
+ aria-label={interactivityLabel}
164
+ >
165
+ {isInteractive ? <TbLockOpen /> : <TbLock />}
166
+ </ControlButton>
167
+ </Tooltip>
168
+ )}
169
+ {readOnly ? null : (
170
+ <Tooltip content={autoArrangeLabel} placement="right">
171
+ <ControlButton onClick={onAutoArrange} aria-label={autoArrangeLabel}>
172
+ <TbSitemap />
173
+ </ControlButton>
174
+ </Tooltip>
175
+ )}
176
+ </Controls>
177
+ );
178
+ }
@@ -0,0 +1,198 @@
1
+ 'use client';
2
+
3
+ import {
4
+ type MouseEvent,
5
+ useCallback,
6
+ useEffect,
7
+ useMemo,
8
+ useRef,
9
+ useState,
10
+ } from 'react';
11
+ import { Box } from '@chakra-ui/react';
12
+ import {
13
+ BaseEdge,
14
+ EdgeLabelRenderer,
15
+ type EdgeProps,
16
+ getSmoothStepPath,
17
+ } from '@xyflow/react';
18
+
19
+ import { TbX } from '@/components/Icon';
20
+ import { IconButton } from '@/components/IconButton';
21
+
22
+ import { useWorkflow, useWorkflowTranslate } from '../../WorkflowContext';
23
+ import { findPort } from '../EdgeInspector';
24
+ import { BranchLabelBadge } from './BranchLabelBadge';
25
+ import { getEdgeLabelVariant } from './edgeLabelVariant';
26
+
27
+ // Grace period on pointer-leave so moving from the SVG edge to the portaled
28
+ // label (or the delete button beside it) doesn't flicker the affordance off in
29
+ // the gap between layers.
30
+ const HOVER_LEAVE_GRACE_MS = 80;
31
+
32
+ /**
33
+ * Edge with a logician-ui `Badge` label that rides the connection midpoint.
34
+ * Clicking the label selects the edge (opens its inspector); hovering the edge
35
+ * reveals a delete button BESIDE the label (not replacing it), so the label
36
+ * stays clickable. Labels use `EdgeLabelRenderer` rather than React Flow's SVG
37
+ * `labelStyle` so they inherit the design system's Badge styling.
38
+ */
39
+ export function LabeledEdge({
40
+ id,
41
+ source,
42
+ sourceHandleId,
43
+ sourceX,
44
+ sourceY,
45
+ targetX,
46
+ targetY,
47
+ sourcePosition,
48
+ targetPosition,
49
+ label,
50
+ markerEnd,
51
+ style,
52
+ }: EdgeProps) {
53
+ const {
54
+ graph,
55
+ getNodeType,
56
+ dispatch,
57
+ readOnly,
58
+ editor: { selectedEdgeId },
59
+ setSelectedNodeId,
60
+ setSelectedEdgeId,
61
+ setDrawerTarget,
62
+ revealInspector,
63
+ } = useWorkflow();
64
+ const translate = useWorkflowTranslate();
65
+
66
+ const [hovered, setHovered] = useState(false);
67
+ const leaveTimer = useRef<ReturnType<typeof setTimeout> | undefined>(
68
+ undefined
69
+ );
70
+ const onEnter = useCallback(() => {
71
+ if (leaveTimer.current) clearTimeout(leaveTimer.current);
72
+ setHovered(true);
73
+ }, []);
74
+ const onLeave = useCallback(() => {
75
+ leaveTimer.current = setTimeout(
76
+ () => setHovered(false),
77
+ HOVER_LEAVE_GRACE_MS
78
+ );
79
+ }, []);
80
+ useEffect(
81
+ () => () => {
82
+ if (leaveTimer.current) clearTimeout(leaveTimer.current);
83
+ },
84
+ []
85
+ );
86
+
87
+ // Clicking the label selects the edge and opens its inspector — mirrors the
88
+ // canvas `onEdgeClick` so the label is just another way in. Routes through
89
+ // revealInspector so a label click in test mode also restores the parked
90
+ // inspector (the badge stops propagation, so it never reaches onEdgeClick).
91
+ const onSelect = useCallback(
92
+ (e: MouseEvent) => {
93
+ e.stopPropagation();
94
+ setSelectedNodeId(null);
95
+ setSelectedEdgeId(id);
96
+ revealInspector({ type: 'edge', id });
97
+ },
98
+ [id, setSelectedNodeId, setSelectedEdgeId, revealInspector]
99
+ );
100
+
101
+ const onDelete = useCallback(
102
+ (e: MouseEvent) => {
103
+ // Don't let the click fall through to edge/pane selection handlers.
104
+ e.stopPropagation();
105
+ dispatch({ type: 'deleteEdge', id });
106
+ // Mirror the keyboard-delete cleanup so the inspector doesn't linger on a
107
+ // now-removed edge.
108
+ if (selectedEdgeId === id) {
109
+ setSelectedEdgeId(null);
110
+ setDrawerTarget(null);
111
+ }
112
+ },
113
+ [dispatch, id, selectedEdgeId, setSelectedEdgeId, setDrawerTarget]
114
+ );
115
+
116
+ const [edgePath, labelX, labelY] = getSmoothStepPath({
117
+ sourceX,
118
+ sourceY,
119
+ sourcePosition,
120
+ targetX,
121
+ targetY,
122
+ targetPosition,
123
+ });
124
+
125
+ // The label's text: an explicit edge label wins; otherwise fall back to the
126
+ // source handle's label, so semantic exits (Pass / Fail / branch / Else) ride
127
+ // on the wire without the author having to name every edge.
128
+ const variant = getEdgeLabelVariant(sourceHandleId);
129
+ // Resolve the source handle's label once (not per render): React Flow
130
+ // re-renders edges constantly during pan/zoom, and `handles()` rebuilds its
131
+ // outputs array each call.
132
+ const handleLabel = useMemo(() => {
133
+ const sourceNode = graph.nodes.find((n) => n.id === source);
134
+ return findPort(
135
+ sourceNode,
136
+ sourceNode ? getNodeType(sourceNode.kind) : undefined,
137
+ 'outputs',
138
+ sourceHandleId ?? undefined
139
+ )?.label;
140
+ }, [graph.nodes, source, sourceHandleId, getNodeType]);
141
+ const displayLabel = label ?? handleLabel;
142
+
143
+ // Delete shows only while the name badge itself is hovered (when editable) —
144
+ // not anywhere on the wire — so it's a deliberate, low-noise affordance. The
145
+ // edge inspector's delete button (see DrawerShell) covers labelless edges and
146
+ // anyone who'd rather delete from the sidebar.
147
+ const showDelete = hovered && !readOnly && Boolean(displayLabel);
148
+ const wrapperTransform = `translate(-50%, -50%) translate(${labelX}px, ${labelY}px)`;
149
+
150
+ return (
151
+ <>
152
+ <BaseEdge id={id} path={edgePath} markerEnd={markerEnd} style={style} />
153
+ {showDelete || displayLabel ? (
154
+ <EdgeLabelRenderer>
155
+ {/* The anchor is centered on the edge midpoint and wraps the badge;
156
+ hovering it (the badge) is what reveals delete. Delete is
157
+ positioned absolutely to the badge's right (out of the centered
158
+ flow) so revealing it doesn't shift the badge. */}
159
+ <Box
160
+ position="absolute"
161
+ transform={wrapperTransform}
162
+ pointerEvents="all"
163
+ display="inline-flex"
164
+ onMouseEnter={onEnter}
165
+ onMouseLeave={onLeave}
166
+ >
167
+ {displayLabel ? (
168
+ <BranchLabelBadge variant={variant} onClick={onSelect}>
169
+ {displayLabel}
170
+ </BranchLabelBadge>
171
+ ) : null}
172
+ {showDelete ? (
173
+ <Box
174
+ position="absolute"
175
+ left="100%"
176
+ top="50%"
177
+ transform="translateY(-50%)"
178
+ pl={1}
179
+ >
180
+ <IconButton
181
+ aria-label={translate('workflow_edge_delete') as string}
182
+ onClick={onDelete}
183
+ size="xs"
184
+ variant="outline"
185
+ colorPalette="danger"
186
+ bg="bg.surface"
187
+ borderRadius="full"
188
+ >
189
+ <TbX boxSize="xs" />
190
+ </IconButton>
191
+ </Box>
192
+ ) : null}
193
+ </Box>
194
+ </EdgeLabelRenderer>
195
+ ) : null}
196
+ </>
197
+ );
198
+ }
@@ -0,0 +1,26 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import { getEdgeLabelVariant } from './edgeLabelVariant';
4
+
5
+ describe('getEdgeLabelVariant', () => {
6
+ it('maps guardrail exits to semantic pass/fail', () => {
7
+ expect(getEdgeLabelVariant('pass')).toBe('pass');
8
+ expect(getEdgeLabelVariant('fail')).toBe('fail');
9
+ });
10
+
11
+ it('maps the if-else fallback to else (dashed)', () => {
12
+ expect(getEdgeLabelVariant('else')).toBe('else');
13
+ });
14
+
15
+ it('maps if-else branches and classify categories to neutral keys', () => {
16
+ expect(getEdgeLabelVariant('branch_0')).toBe('key');
17
+ expect(getEdgeLabelVariant('branch_12')).toBe('key');
18
+ expect(getEdgeLabelVariant('cat_refund')).toBe('key');
19
+ });
20
+
21
+ it('falls back to default for plain/unknown handles', () => {
22
+ expect(getEdgeLabelVariant('out')).toBe('default');
23
+ expect(getEdgeLabelVariant(undefined)).toBe('default');
24
+ expect(getEdgeLabelVariant(null)).toBe('default');
25
+ });
26
+ });
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Pill variant for an edge label, derived from the SOURCE handle it leaves.
3
+ *
4
+ * Guardrail has two exits — `pass` / `fail` — a binary safety outcome, so they
5
+ * read as semantic green / red. Every routing exit — If-Else branches, the
6
+ * If-Else `else` fallback, and Classify categories (`branch_*` / `cat_*` /
7
+ * `else`) — plus any free-text label reads as a neutral badge, so the branch
8
+ * names all look alike. `else` stays its own variant in case it ever needs
9
+ * distinguishing, but currently renders neutral like the other keys.
10
+ */
11
+ export type EdgeLabelVariant = 'pass' | 'fail' | 'else' | 'key' | 'default';
12
+
13
+ export const getEdgeLabelVariant = (
14
+ sourceHandle?: string | null
15
+ ): EdgeLabelVariant => {
16
+ if (sourceHandle === 'pass') return 'pass';
17
+ if (sourceHandle === 'fail') return 'fail';
18
+ if (sourceHandle === 'else') return 'else';
19
+ if (sourceHandle?.startsWith('branch_') || sourceHandle?.startsWith('cat_')) {
20
+ return 'key';
21
+ }
22
+ return 'default';
23
+ };
@@ -0,0 +1 @@
1
+ export { Canvas } from './Canvas';
@@ -0,0 +1,96 @@
1
+ 'use client';
2
+
3
+ import { ReactNode, useId, useState } from 'react';
4
+ import { Box, HStack, Stack, type StackProps } from '@chakra-ui/react';
5
+
6
+ import { TbAlertCircle, TbChevronDown, TbChevronUp } from '@/components/Icon';
7
+ import { Subtext } from '@/components/Typography';
8
+
9
+ export type CollapsibleSectionProps = StackProps & {
10
+ label: string;
11
+ /** Optional initial expanded state. Defaults to true. */
12
+ defaultExpanded?: boolean;
13
+ /**
14
+ * When the section is collapsed AND `hasError` is true, the chevron is
15
+ * replaced by a danger-tinted alert glyph so users don't miss errors
16
+ * hidden behind a collapsed header.
17
+ */
18
+ hasError?: boolean;
19
+ /**
20
+ * Slot for a trailing icon-button in the header row (e.g. an info
21
+ * popover trigger). Click handler on the action is responsible for
22
+ * stopping propagation; otherwise the section also toggles.
23
+ */
24
+ headerAction?: ReactNode;
25
+ children: ReactNode;
26
+ };
27
+
28
+ /**
29
+ * Vertical accordion section used in the node drawer. Each section header
30
+ * is the entire toggle target — the chevron is decorative. Collapse state
31
+ * is session-only per mounted instance; switching to a different node
32
+ * remounts and resets to defaults. The component is style-agnostic about
33
+ * dividers — parents control border/spacing via the spread Stack props
34
+ * (e.g. a `_notFirst` selector on the wrapping Stack).
35
+ */
36
+ export function CollapsibleSection({
37
+ label,
38
+ defaultExpanded = true,
39
+ hasError = false,
40
+ headerAction,
41
+ children,
42
+ ...rest
43
+ }: CollapsibleSectionProps) {
44
+ const [expanded, setExpanded] = useState(defaultExpanded);
45
+ const contentId = useId();
46
+ const showErrorGlyph = !expanded && hasError;
47
+
48
+ return (
49
+ <Stack gap={0} {...rest}>
50
+ <Box
51
+ as="button"
52
+ aria-expanded={expanded}
53
+ aria-controls={contentId}
54
+ onClick={() => setExpanded((e) => !e)}
55
+ display="flex"
56
+ justifyContent="space-between"
57
+ alignItems="center"
58
+ w="100%"
59
+ gap={2}
60
+ px={3.5}
61
+ py={3.5}
62
+ cursor="pointer"
63
+ bg="transparent"
64
+ border="none"
65
+ textAlign="left"
66
+ _hover={{ bg: 'slate.50' }}
67
+ >
68
+ <Subtext
69
+ fontWeight="bold"
70
+ color="slate.900"
71
+ textTransform="uppercase"
72
+ letterSpacing="wider"
73
+ >
74
+ {label}
75
+ </Subtext>
76
+ <HStack gap={1.5} onClick={(e) => e.stopPropagation()}>
77
+ {headerAction}
78
+ <Box color="slate.900" display="flex" alignItems="center">
79
+ {showErrorGlyph ? (
80
+ <TbAlertCircle boxSize="xs" color="danger.main" />
81
+ ) : expanded ? (
82
+ <TbChevronUp boxSize="xs" />
83
+ ) : (
84
+ <TbChevronDown boxSize="xs" />
85
+ )}
86
+ </Box>
87
+ </HStack>
88
+ </Box>
89
+ {expanded ? (
90
+ <Box id={contentId} px={3.5} pb={4} pt={1}>
91
+ {children}
92
+ </Box>
93
+ ) : null}
94
+ </Stack>
95
+ );
96
+ }
@@ -0,0 +1,4 @@
1
+ export {
2
+ CollapsibleSection,
3
+ type CollapsibleSectionProps,
4
+ } from './CollapsibleSection';
@@ -0,0 +1,104 @@
1
+ 'use client';
2
+
3
+ import { type ReactNode } from 'react';
4
+ import { HStack } from '@chakra-ui/react';
5
+
6
+ import { RxDotsHorizontal, TbX } from '@/components/Icon';
7
+ import { IconButton } from '@/components/IconButton';
8
+ import { Menu } from '@/components/Menu';
9
+ import { Subtext, Text } from '@/components/Typography';
10
+
11
+ import { useWorkflowTranslate } from '../../WorkflowContext';
12
+
13
+ interface DrawerHeaderProps {
14
+ /**
15
+ * Title text shown semibold on the left. Node drawers render an icon
16
+ * cluster ahead of it via `icon`; edge drawers render only the text.
17
+ */
18
+ title: string;
19
+ /**
20
+ * Muted text trailing the title. Node drawers pass the node-type label here
21
+ * when the title is an instance name (e.g. "고객 응대 · Agent") so the kind
22
+ * stays identifiable next to author-chosen names.
23
+ */
24
+ subtitle?: string;
25
+ /** Optional leading icon cluster (node drawers pass the node-type icon). */
26
+ icon?: ReactNode;
27
+ /**
28
+ * Clamp the title to a single line (edge connection titles can be long).
29
+ * Node labels are short and render unclamped.
30
+ */
31
+ lineClampTitle?: boolean;
32
+ /**
33
+ * Overflow-menu contents (pre-built `Menu.Item` nodes from the caller).
34
+ * When omitted, no overflow menu renders at all — this preserves the
35
+ * pinned-node behavior of showing only the close button.
36
+ */
37
+ menuItems?: ReactNode;
38
+ /** Close button handler. */
39
+ onClose: () => void;
40
+ }
41
+
42
+ /**
43
+ * Shared inspector-drawer header: a fixed-height bar with a left title cluster
44
+ * and a right action cluster (optional overflow `Menu` + a close button). Stays
45
+ * domain-free — each drawer passes its own title bits and `Menu.Item`s.
46
+ */
47
+ export function DrawerHeader({
48
+ title,
49
+ subtitle,
50
+ icon,
51
+ lineClampTitle,
52
+ menuItems,
53
+ onClose,
54
+ }: DrawerHeaderProps) {
55
+ const translate = useWorkflowTranslate();
56
+ return (
57
+ <HStack
58
+ justify="space-between"
59
+ align="center"
60
+ px={4}
61
+ py={3}
62
+ borderBottom="1px solid"
63
+ borderColor="slate.200"
64
+ >
65
+ <HStack gap={2} minW={0} flex="1">
66
+ {icon}
67
+ <Text fontWeight="semibold" lineClamp={lineClampTitle ? 1 : undefined}>
68
+ {title}
69
+ </Text>
70
+ {subtitle ? (
71
+ <Subtext color="slate.700" flexShrink={0}>
72
+ {subtitle}
73
+ </Subtext>
74
+ ) : null}
75
+ </HStack>
76
+ <HStack gap={0.5}>
77
+ {menuItems ? (
78
+ <Menu>
79
+ <Menu.Trigger asChild>
80
+ <IconButton
81
+ aria-label={translate('workflow_node_overflow_label') as string}
82
+ size="xs"
83
+ variant="ghost"
84
+ colorPalette="neutral"
85
+ >
86
+ <RxDotsHorizontal boxSize="xs" />
87
+ </IconButton>
88
+ </Menu.Trigger>
89
+ <Menu.List zIndex="popover">{menuItems}</Menu.List>
90
+ </Menu>
91
+ ) : null}
92
+ <IconButton
93
+ aria-label={translate('workflow_node_close') as string}
94
+ size="xs"
95
+ variant="ghost"
96
+ colorPalette="neutral"
97
+ onClick={onClose}
98
+ >
99
+ <TbX boxSize="xs" aria-hidden />
100
+ </IconButton>
101
+ </HStack>
102
+ </HStack>
103
+ );
104
+ }