@marktoflow/gui 2.0.1 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -3
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/client/App.tsx.html +2230 -0
- package/coverage/client/components/Accessibility/LiveRegion.tsx.html +166 -0
- package/coverage/client/components/Accessibility/SkipNav.tsx.html +106 -0
- package/coverage/client/components/Accessibility/index.html +131 -0
- package/coverage/client/components/Admin/AuditViewer.tsx.html +214 -0
- package/coverage/client/components/Admin/EnvironmentSwitcher.tsx.html +187 -0
- package/coverage/client/components/Admin/RoleManager.tsx.html +250 -0
- package/coverage/client/components/Admin/SecretsVault.tsx.html +241 -0
- package/coverage/client/components/Admin/index.html +161 -0
- package/coverage/client/components/Canvas/AlignmentTools.tsx.html +694 -0
- package/coverage/client/components/Canvas/Canvas.tsx.html +1513 -0
- package/coverage/client/components/Canvas/DataPreviewBadge.tsx.html +307 -0
- package/coverage/client/components/Canvas/ExecutionInputDialog.tsx.html +769 -0
- package/coverage/client/components/Canvas/ExecutionOverlay.tsx.html +2938 -0
- package/coverage/client/components/Canvas/ForEachNode.tsx.html +568 -0
- package/coverage/client/components/Canvas/GroupNode.tsx.html +421 -0
- package/coverage/client/components/Canvas/IfElseNode.tsx.html +508 -0
- package/coverage/client/components/Canvas/InlineEditor.tsx.html +472 -0
- package/coverage/client/components/Canvas/NodeContextMenu.tsx.html +661 -0
- package/coverage/client/components/Canvas/NodeTooltip.tsx.html +316 -0
- package/coverage/client/components/Canvas/OutputNode.tsx.html +418 -0
- package/coverage/client/components/Canvas/ParallelNode.tsx.html +556 -0
- package/coverage/client/components/Canvas/StepNode.tsx.html +463 -0
- package/coverage/client/components/Canvas/StickyNoteNode.tsx.html +442 -0
- package/coverage/client/components/Canvas/SubWorkflowNode.tsx.html +508 -0
- package/coverage/client/components/Canvas/SwitchNode.tsx.html +640 -0
- package/coverage/client/components/Canvas/Toolbar.tsx.html +1030 -0
- package/coverage/client/components/Canvas/TransformNode.tsx.html +667 -0
- package/coverage/client/components/Canvas/TriggerNode.tsx.html +469 -0
- package/coverage/client/components/Canvas/TryCatchNode.tsx.html +577 -0
- package/coverage/client/components/Canvas/WhileNode.tsx.html +595 -0
- package/coverage/client/components/Canvas/index.html +446 -0
- package/coverage/client/components/Canvas/index.ts.html +157 -0
- package/coverage/client/components/Collaboration/ActivityFeed.tsx.html +253 -0
- package/coverage/client/components/Collaboration/CommentThread.tsx.html +397 -0
- package/coverage/client/components/Collaboration/LockIndicator.tsx.html +172 -0
- package/coverage/client/components/Collaboration/PresenceIndicator.tsx.html +214 -0
- package/coverage/client/components/Collaboration/index.html +161 -0
- package/coverage/client/components/CommandPalette/CommandItem.tsx.html +313 -0
- package/coverage/client/components/CommandPalette/CommandPalette.tsx.html +685 -0
- package/coverage/client/components/CommandPalette/index.html +131 -0
- package/coverage/client/components/Debug/VariableInspector.tsx.html +529 -0
- package/coverage/client/components/Debug/index.html +116 -0
- package/coverage/client/components/Editor/InputsEditor.tsx.html +1459 -0
- package/coverage/client/components/Editor/NewStepWizard.tsx.html +1117 -0
- package/coverage/client/components/Editor/StepEditor.tsx.html +1681 -0
- package/coverage/client/components/Editor/YamlEditor.tsx.html +565 -0
- package/coverage/client/components/Editor/index.html +161 -0
- package/coverage/client/components/Execution/TimelineView.tsx.html +397 -0
- package/coverage/client/components/Execution/index.html +116 -0
- package/coverage/client/components/Onboarding/OnboardingTour.tsx.html +265 -0
- package/coverage/client/components/Onboarding/index.html +116 -0
- package/coverage/client/components/Panels/PropertiesPanel.tsx.html +2035 -0
- package/coverage/client/components/Panels/ValidationPanel.tsx.html +856 -0
- package/coverage/client/components/Panels/index.html +131 -0
- package/coverage/client/components/Prompt/ChangePreview.tsx.html +928 -0
- package/coverage/client/components/Prompt/PromptHistoryPanel.tsx.html +712 -0
- package/coverage/client/components/Prompt/PromptInput.tsx.html +415 -0
- package/coverage/client/components/Prompt/index.html +146 -0
- package/coverage/client/components/Settings/ProviderSwitcher.tsx.html +1306 -0
- package/coverage/client/components/Settings/SettingsPanel.tsx.html +355 -0
- package/coverage/client/components/Settings/controls/SettingNumber.tsx.html +211 -0
- package/coverage/client/components/Settings/controls/SettingSelect.tsx.html +196 -0
- package/coverage/client/components/Settings/controls/SettingToggle.tsx.html +199 -0
- package/coverage/client/components/Settings/controls/index.html +146 -0
- package/coverage/client/components/Settings/index.html +131 -0
- package/coverage/client/components/Settings/sections/AISettings.tsx.html +154 -0
- package/coverage/client/components/Settings/sections/CanvasSettings.tsx.html +220 -0
- package/coverage/client/components/Settings/sections/EditorSettings.tsx.html +208 -0
- package/coverage/client/components/Settings/sections/ExecutionSettings.tsx.html +172 -0
- package/coverage/client/components/Settings/sections/GeneralSettings.tsx.html +151 -0
- package/coverage/client/components/Settings/sections/NotificationSettings.tsx.html +190 -0
- package/coverage/client/components/Settings/sections/index.html +191 -0
- package/coverage/client/components/Sidebar/ImportDialog.tsx.html +856 -0
- package/coverage/client/components/Sidebar/NewWorkflowDialog.tsx.html +694 -0
- package/coverage/client/components/Sidebar/Sidebar.tsx.html +1456 -0
- package/coverage/client/components/Sidebar/index.html +146 -0
- package/coverage/client/components/Templates/TemplateCard.tsx.html +181 -0
- package/coverage/client/components/Templates/TemplateGallery.tsx.html +307 -0
- package/coverage/client/components/Templates/index.html +131 -0
- package/coverage/client/components/Versions/DiffViewer.tsx.html +220 -0
- package/coverage/client/components/Versions/VersionHistory.tsx.html +352 -0
- package/coverage/client/components/Versions/index.html +131 -0
- package/coverage/client/components/common/Breadcrumb.tsx.html +205 -0
- package/coverage/client/components/common/Button.tsx.html +289 -0
- package/coverage/client/components/common/ContextMenu.tsx.html +691 -0
- package/coverage/client/components/common/KeyboardShortcuts.tsx.html +541 -0
- package/coverage/client/components/common/Modal.tsx.html +364 -0
- package/coverage/client/components/common/Tabs.tsx.html +256 -0
- package/coverage/client/components/common/ThemeToggle.tsx.html +301 -0
- package/coverage/client/components/common/index.html +206 -0
- package/coverage/client/components/index.html +116 -0
- package/coverage/client/components/index.ts.html +181 -0
- package/coverage/client/hooks/index.html +176 -0
- package/coverage/client/hooks/index.ts.html +97 -0
- package/coverage/client/hooks/useAIPrompt.ts.html +409 -0
- package/coverage/client/hooks/useCanvas.ts.html +739 -0
- package/coverage/client/hooks/useWebSocket.ts.html +580 -0
- package/coverage/client/hooks/useWorkflow.ts.html +502 -0
- package/coverage/client/index.html +131 -0
- package/coverage/client/main.tsx.html +115 -0
- package/coverage/client/stores/agentStore.ts.html +421 -0
- package/coverage/client/stores/canvasStore.ts.html +1129 -0
- package/coverage/client/stores/collaborationStore.ts.html +544 -0
- package/coverage/client/stores/commandStore.ts.html +610 -0
- package/coverage/client/stores/editorStore.ts.html +484 -0
- package/coverage/client/stores/executionStore.ts.html +1594 -0
- package/coverage/client/stores/governanceStore.ts.html +493 -0
- package/coverage/client/stores/index.html +341 -0
- package/coverage/client/stores/index.ts.html +112 -0
- package/coverage/client/stores/layoutStore.ts.html +439 -0
- package/coverage/client/stores/navigationStore.ts.html +232 -0
- package/coverage/client/stores/onboardingStore.ts.html +247 -0
- package/coverage/client/stores/promptStore.ts.html +430 -0
- package/coverage/client/stores/settingsStore.ts.html +472 -0
- package/coverage/client/stores/themeStore.ts.html +271 -0
- package/coverage/client/stores/versionStore.ts.html +340 -0
- package/coverage/client/stores/workflowStore.ts.html +739 -0
- package/coverage/client/utils/applyDagreLayout.ts.html +286 -0
- package/coverage/client/utils/cn.ts.html +112 -0
- package/coverage/client/utils/index.html +206 -0
- package/coverage/client/utils/index.ts.html +97 -0
- package/coverage/client/utils/platform.ts.html +223 -0
- package/coverage/client/utils/serviceIcons.tsx.html +376 -0
- package/coverage/client/utils/stepValidation.ts.html +550 -0
- package/coverage/client/utils/workflowToGraph.ts.html +1624 -0
- package/coverage/coverage-final.json +107 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +461 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/shared/constants.ts.html +655 -0
- package/coverage/shared/index.html +146 -0
- package/coverage/shared/settings.ts.html +406 -0
- package/coverage/shared/types.ts.html +622 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/dist/client/assets/{index-DQeR1ew6.css → index-DipWdkNl.css} +1 -1
- package/dist/client/assets/{index-LbIVPHbD.js → index-DtX_BPDj.js} +20 -20
- package/dist/client/assets/{index-LbIVPHbD.js.map → index-DtX_BPDj.js.map} +1 -1
- package/dist/client/index.html +3 -3
- package/dist/server/routes/form.js +27 -1
- package/dist/server/routes/form.js.map +1 -1
- package/dist/server/services/AIService.js +16 -6
- package/dist/server/services/AIService.js.map +1 -1
- package/dist/server/services/agents/{claude-code-provider.js → claude-agent-provider.js} +11 -11
- package/dist/server/services/agents/claude-agent-provider.js.map +1 -0
- package/dist/server/services/agents/claude-provider.js +4 -5
- package/dist/server/services/agents/claude-provider.js.map +1 -1
- package/dist/server/services/agents/codex-provider.js +5 -6
- package/dist/server/services/agents/codex-provider.js.map +1 -1
- package/dist/server/services/agents/copilot-provider.js +35 -8
- package/dist/server/services/agents/copilot-provider.js.map +1 -1
- package/dist/server/services/agents/openai-provider.js +244 -0
- package/dist/server/services/agents/openai-provider.js.map +1 -0
- package/dist/server/services/agents/opencode-provider.js +258 -0
- package/dist/server/services/agents/opencode-provider.js.map +1 -0
- package/dist/server/services/agents/registry.js +17 -22
- package/dist/server/services/agents/registry.js.map +1 -1
- package/index.html +1 -1
- package/package.json +3 -3
- package/client.log +0 -0
- package/dist/server/services/agents/claude-code-provider.js.map +0 -1
- package/server.log +0 -0
|
@@ -0,0 +1,694 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for client/components/Canvas/AlignmentTools.tsx</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../../../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../../../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../../../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../../../index.html">All files</a> / <a href="index.html">client/components/Canvas</a> AlignmentTools.tsx</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">0% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>0/159</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">0% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>0/1</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">0% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>0/1</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">0% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>0/159</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line low'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a></td><td class="line-coverage quiet"><span class="cline-any cline-no"> </span>
|
|
270
|
+
<span class="cline-any cline-neutral"> </span>
|
|
271
|
+
<span class="cline-any cline-neutral"> </span>
|
|
272
|
+
<span class="cline-any cline-neutral"> </span>
|
|
273
|
+
<span class="cline-any cline-neutral"> </span>
|
|
274
|
+
<span class="cline-any cline-neutral"> </span>
|
|
275
|
+
<span class="cline-any cline-neutral"> </span>
|
|
276
|
+
<span class="cline-any cline-neutral"> </span>
|
|
277
|
+
<span class="cline-any cline-neutral"> </span>
|
|
278
|
+
<span class="cline-any cline-neutral"> </span>
|
|
279
|
+
<span class="cline-any cline-neutral"> </span>
|
|
280
|
+
<span class="cline-any cline-neutral"> </span>
|
|
281
|
+
<span class="cline-any cline-neutral"> </span>
|
|
282
|
+
<span class="cline-any cline-neutral"> </span>
|
|
283
|
+
<span class="cline-any cline-neutral"> </span>
|
|
284
|
+
<span class="cline-any cline-neutral"> </span>
|
|
285
|
+
<span class="cline-any cline-neutral"> </span>
|
|
286
|
+
<span class="cline-any cline-neutral"> </span>
|
|
287
|
+
<span class="cline-any cline-neutral"> </span>
|
|
288
|
+
<span class="cline-any cline-no"> </span>
|
|
289
|
+
<span class="cline-any cline-no"> </span>
|
|
290
|
+
<span class="cline-any cline-no"> </span>
|
|
291
|
+
<span class="cline-any cline-no"> </span>
|
|
292
|
+
<span class="cline-any cline-neutral"> </span>
|
|
293
|
+
<span class="cline-any cline-no"> </span>
|
|
294
|
+
<span class="cline-any cline-no"> </span>
|
|
295
|
+
<span class="cline-any cline-no"> </span>
|
|
296
|
+
<span class="cline-any cline-no"> </span>
|
|
297
|
+
<span class="cline-any cline-neutral"> </span>
|
|
298
|
+
<span class="cline-any cline-no"> </span>
|
|
299
|
+
<span class="cline-any cline-no"> </span>
|
|
300
|
+
<span class="cline-any cline-neutral"> </span>
|
|
301
|
+
<span class="cline-any cline-no"> </span>
|
|
302
|
+
<span class="cline-any cline-no"> </span>
|
|
303
|
+
<span class="cline-any cline-neutral"> </span>
|
|
304
|
+
<span class="cline-any cline-no"> </span>
|
|
305
|
+
<span class="cline-any cline-no"> </span>
|
|
306
|
+
<span class="cline-any cline-no"> </span>
|
|
307
|
+
<span class="cline-any cline-neutral"> </span>
|
|
308
|
+
<span class="cline-any cline-no"> </span>
|
|
309
|
+
<span class="cline-any cline-no"> </span>
|
|
310
|
+
<span class="cline-any cline-no"> </span>
|
|
311
|
+
<span class="cline-any cline-no"> </span>
|
|
312
|
+
<span class="cline-any cline-no"> </span>
|
|
313
|
+
<span class="cline-any cline-no"> </span>
|
|
314
|
+
<span class="cline-any cline-no"> </span>
|
|
315
|
+
<span class="cline-any cline-no"> </span>
|
|
316
|
+
<span class="cline-any cline-no"> </span>
|
|
317
|
+
<span class="cline-any cline-no"> </span>
|
|
318
|
+
<span class="cline-any cline-no"> </span>
|
|
319
|
+
<span class="cline-any cline-no"> </span>
|
|
320
|
+
<span class="cline-any cline-no"> </span>
|
|
321
|
+
<span class="cline-any cline-no"> </span>
|
|
322
|
+
<span class="cline-any cline-no"> </span>
|
|
323
|
+
<span class="cline-any cline-no"> </span>
|
|
324
|
+
<span class="cline-any cline-no"> </span>
|
|
325
|
+
<span class="cline-any cline-no"> </span>
|
|
326
|
+
<span class="cline-any cline-no"> </span>
|
|
327
|
+
<span class="cline-any cline-no"> </span>
|
|
328
|
+
<span class="cline-any cline-neutral"> </span>
|
|
329
|
+
<span class="cline-any cline-no"> </span>
|
|
330
|
+
<span class="cline-any cline-no"> </span>
|
|
331
|
+
<span class="cline-any cline-neutral"> </span>
|
|
332
|
+
<span class="cline-any cline-no"> </span>
|
|
333
|
+
<span class="cline-any cline-no"> </span>
|
|
334
|
+
<span class="cline-any cline-no"> </span>
|
|
335
|
+
<span class="cline-any cline-no"> </span>
|
|
336
|
+
<span class="cline-any cline-neutral"> </span>
|
|
337
|
+
<span class="cline-any cline-no"> </span>
|
|
338
|
+
<span class="cline-any cline-no"> </span>
|
|
339
|
+
<span class="cline-any cline-no"> </span>
|
|
340
|
+
<span class="cline-any cline-no"> </span>
|
|
341
|
+
<span class="cline-any cline-neutral"> </span>
|
|
342
|
+
<span class="cline-any cline-no"> </span>
|
|
343
|
+
<span class="cline-any cline-no"> </span>
|
|
344
|
+
<span class="cline-any cline-no"> </span>
|
|
345
|
+
<span class="cline-any cline-no"> </span>
|
|
346
|
+
<span class="cline-any cline-neutral"> </span>
|
|
347
|
+
<span class="cline-any cline-no"> </span>
|
|
348
|
+
<span class="cline-any cline-no"> </span>
|
|
349
|
+
<span class="cline-any cline-neutral"> </span>
|
|
350
|
+
<span class="cline-any cline-no"> </span>
|
|
351
|
+
<span class="cline-any cline-no"> </span>
|
|
352
|
+
<span class="cline-any cline-no"> </span>
|
|
353
|
+
<span class="cline-any cline-no"> </span>
|
|
354
|
+
<span class="cline-any cline-neutral"> </span>
|
|
355
|
+
<span class="cline-any cline-no"> </span>
|
|
356
|
+
<span class="cline-any cline-neutral"> </span>
|
|
357
|
+
<span class="cline-any cline-no"> </span>
|
|
358
|
+
<span class="cline-any cline-no"> </span>
|
|
359
|
+
<span class="cline-any cline-no"> </span>
|
|
360
|
+
<span class="cline-any cline-no"> </span>
|
|
361
|
+
<span class="cline-any cline-no"> </span>
|
|
362
|
+
<span class="cline-any cline-no"> </span>
|
|
363
|
+
<span class="cline-any cline-no"> </span>
|
|
364
|
+
<span class="cline-any cline-no"> </span>
|
|
365
|
+
<span class="cline-any cline-no"> </span>
|
|
366
|
+
<span class="cline-any cline-no"> </span>
|
|
367
|
+
<span class="cline-any cline-neutral"> </span>
|
|
368
|
+
<span class="cline-any cline-no"> </span>
|
|
369
|
+
<span class="cline-any cline-no"> </span>
|
|
370
|
+
<span class="cline-any cline-no"> </span>
|
|
371
|
+
<span class="cline-any cline-no"> </span>
|
|
372
|
+
<span class="cline-any cline-no"> </span>
|
|
373
|
+
<span class="cline-any cline-neutral"> </span>
|
|
374
|
+
<span class="cline-any cline-no"> </span>
|
|
375
|
+
<span class="cline-any cline-no"> </span>
|
|
376
|
+
<span class="cline-any cline-no"> </span>
|
|
377
|
+
<span class="cline-any cline-no"> </span>
|
|
378
|
+
<span class="cline-any cline-neutral"> </span>
|
|
379
|
+
<span class="cline-any cline-no"> </span>
|
|
380
|
+
<span class="cline-any cline-no"> </span>
|
|
381
|
+
<span class="cline-any cline-no"> </span>
|
|
382
|
+
<span class="cline-any cline-no"> </span>
|
|
383
|
+
<span class="cline-any cline-no"> </span>
|
|
384
|
+
<span class="cline-any cline-no"> </span>
|
|
385
|
+
<span class="cline-any cline-no"> </span>
|
|
386
|
+
<span class="cline-any cline-no"> </span>
|
|
387
|
+
<span class="cline-any cline-no"> </span>
|
|
388
|
+
<span class="cline-any cline-no"> </span>
|
|
389
|
+
<span class="cline-any cline-no"> </span>
|
|
390
|
+
<span class="cline-any cline-no"> </span>
|
|
391
|
+
<span class="cline-any cline-no"> </span>
|
|
392
|
+
<span class="cline-any cline-no"> </span>
|
|
393
|
+
<span class="cline-any cline-no"> </span>
|
|
394
|
+
<span class="cline-any cline-no"> </span>
|
|
395
|
+
<span class="cline-any cline-no"> </span>
|
|
396
|
+
<span class="cline-any cline-no"> </span>
|
|
397
|
+
<span class="cline-any cline-no"> </span>
|
|
398
|
+
<span class="cline-any cline-no"> </span>
|
|
399
|
+
<span class="cline-any cline-no"> </span>
|
|
400
|
+
<span class="cline-any cline-no"> </span>
|
|
401
|
+
<span class="cline-any cline-no"> </span>
|
|
402
|
+
<span class="cline-any cline-no"> </span>
|
|
403
|
+
<span class="cline-any cline-no"> </span>
|
|
404
|
+
<span class="cline-any cline-no"> </span>
|
|
405
|
+
<span class="cline-any cline-no"> </span>
|
|
406
|
+
<span class="cline-any cline-no"> </span>
|
|
407
|
+
<span class="cline-any cline-no"> </span>
|
|
408
|
+
<span class="cline-any cline-no"> </span>
|
|
409
|
+
<span class="cline-any cline-no"> </span>
|
|
410
|
+
<span class="cline-any cline-no"> </span>
|
|
411
|
+
<span class="cline-any cline-no"> </span>
|
|
412
|
+
<span class="cline-any cline-no"> </span>
|
|
413
|
+
<span class="cline-any cline-no"> </span>
|
|
414
|
+
<span class="cline-any cline-no"> </span>
|
|
415
|
+
<span class="cline-any cline-no"> </span>
|
|
416
|
+
<span class="cline-any cline-no"> </span>
|
|
417
|
+
<span class="cline-any cline-no"> </span>
|
|
418
|
+
<span class="cline-any cline-no"> </span>
|
|
419
|
+
<span class="cline-any cline-no"> </span>
|
|
420
|
+
<span class="cline-any cline-no"> </span>
|
|
421
|
+
<span class="cline-any cline-no"> </span>
|
|
422
|
+
<span class="cline-any cline-no"> </span>
|
|
423
|
+
<span class="cline-any cline-no"> </span>
|
|
424
|
+
<span class="cline-any cline-no"> </span>
|
|
425
|
+
<span class="cline-any cline-no"> </span>
|
|
426
|
+
<span class="cline-any cline-no"> </span>
|
|
427
|
+
<span class="cline-any cline-no"> </span>
|
|
428
|
+
<span class="cline-any cline-no"> </span>
|
|
429
|
+
<span class="cline-any cline-no"> </span>
|
|
430
|
+
<span class="cline-any cline-no"> </span>
|
|
431
|
+
<span class="cline-any cline-no"> </span>
|
|
432
|
+
<span class="cline-any cline-neutral"> </span>
|
|
433
|
+
<span class="cline-any cline-no"> </span>
|
|
434
|
+
<span class="cline-any cline-neutral"> </span>
|
|
435
|
+
<span class="cline-any cline-no"> </span>
|
|
436
|
+
<span class="cline-any cline-no"> </span>
|
|
437
|
+
<span class="cline-any cline-no"> </span>
|
|
438
|
+
<span class="cline-any cline-no"> </span>
|
|
439
|
+
<span class="cline-any cline-no"> </span>
|
|
440
|
+
<span class="cline-any cline-no"> </span>
|
|
441
|
+
<span class="cline-any cline-neutral"> </span>
|
|
442
|
+
<span class="cline-any cline-neutral"> </span>
|
|
443
|
+
<span class="cline-any cline-neutral"> </span>
|
|
444
|
+
<span class="cline-any cline-neutral"> </span>
|
|
445
|
+
<span class="cline-any cline-no"> </span>
|
|
446
|
+
<span class="cline-any cline-no"> </span>
|
|
447
|
+
<span class="cline-any cline-no"> </span>
|
|
448
|
+
<span class="cline-any cline-no"> </span>
|
|
449
|
+
<span class="cline-any cline-no"> </span>
|
|
450
|
+
<span class="cline-any cline-no"> </span>
|
|
451
|
+
<span class="cline-any cline-no"> </span>
|
|
452
|
+
<span class="cline-any cline-neutral"> </span>
|
|
453
|
+
<span class="cline-any cline-no"> </span>
|
|
454
|
+
<span class="cline-any cline-no"> </span>
|
|
455
|
+
<span class="cline-any cline-neutral"> </span>
|
|
456
|
+
<span class="cline-any cline-no"> </span>
|
|
457
|
+
<span class="cline-any cline-neutral"> </span>
|
|
458
|
+
<span class="cline-any cline-no"> </span>
|
|
459
|
+
<span class="cline-any cline-no"> </span>
|
|
460
|
+
<span class="cline-any cline-no"> </span>
|
|
461
|
+
<span class="cline-any cline-no"> </span>
|
|
462
|
+
<span class="cline-any cline-no"> </span>
|
|
463
|
+
<span class="cline-any cline-no"> </span>
|
|
464
|
+
<span class="cline-any cline-no"> </span>
|
|
465
|
+
<span class="cline-any cline-no"> </span>
|
|
466
|
+
<span class="cline-any cline-no"> </span>
|
|
467
|
+
<span class="cline-any cline-no"> </span>
|
|
468
|
+
<span class="cline-any cline-no"> </span>
|
|
469
|
+
<span class="cline-any cline-no"> </span>
|
|
470
|
+
<span class="cline-any cline-neutral"> </span>
|
|
471
|
+
<span class="cline-any cline-no"> </span>
|
|
472
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" >import { memo, useCallback } from 'react';</span></span></span>
|
|
473
|
+
import {
|
|
474
|
+
AlignStartVertical,
|
|
475
|
+
AlignCenterVertical,
|
|
476
|
+
AlignEndVertical,
|
|
477
|
+
AlignStartHorizontal,
|
|
478
|
+
AlignCenterHorizontal,
|
|
479
|
+
AlignEndHorizontal,
|
|
480
|
+
GripHorizontal,
|
|
481
|
+
GripVertical,
|
|
482
|
+
} from 'lucide-react';
|
|
483
|
+
import { useCanvasStore } from '../../stores/canvasStore';
|
|
484
|
+
import type { Node } from '@xyflow/react';
|
|
485
|
+
import { cn } from '../../utils/cn';
|
|
486
|
+
|
|
487
|
+
interface AlignmentToolsProps {
|
|
488
|
+
className?: string;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
<span class="cstat-no" title="statement not covered" >function AlignmentToolsComponent({ className }: AlignmentToolsProps) {</span>
|
|
492
|
+
<span class="cstat-no" title="statement not covered" > const { nodes, setNodes, saveCheckpoint } = useCanvasStore();</span>
|
|
493
|
+
<span class="cstat-no" title="statement not covered" > const selectedNodes = nodes.filter((n) => n.selected);</span>
|
|
494
|
+
<span class="cstat-no" title="statement not covered" > const hasSelection = selectedNodes.length >= 2;</span>
|
|
495
|
+
|
|
496
|
+
<span class="cstat-no" title="statement not covered" > const alignNodes = useCallback(</span>
|
|
497
|
+
<span class="cstat-no" title="statement not covered" > (alignment: 'left' | 'center-h' | 'right' | 'top' | 'center-v' | 'bottom') => {</span>
|
|
498
|
+
<span class="cstat-no" title="statement not covered" > if (selectedNodes.length < 2) return;</span>
|
|
499
|
+
<span class="cstat-no" title="statement not covered" > saveCheckpoint();</span>
|
|
500
|
+
|
|
501
|
+
<span class="cstat-no" title="statement not covered" > const selectedIds = new Set(selectedNodes.map((n) => n.id));</span>
|
|
502
|
+
<span class="cstat-no" title="statement not covered" > const bounds = getSelectionBounds(selectedNodes);</span>
|
|
503
|
+
|
|
504
|
+
<span class="cstat-no" title="statement not covered" > const updatedNodes = nodes.map((node) => {</span>
|
|
505
|
+
<span class="cstat-no" title="statement not covered" > if (!selectedIds.has(node.id)) return node;</span>
|
|
506
|
+
|
|
507
|
+
<span class="cstat-no" title="statement not covered" > let newPosition = { ...node.position };</span>
|
|
508
|
+
<span class="cstat-no" title="statement not covered" > const width = node.measured?.width || node.width || 200;</span>
|
|
509
|
+
<span class="cstat-no" title="statement not covered" > const height = node.measured?.height || node.height || 80;</span>
|
|
510
|
+
|
|
511
|
+
<span class="cstat-no" title="statement not covered" > switch (alignment) {</span>
|
|
512
|
+
<span class="cstat-no" title="statement not covered" > case 'left':</span>
|
|
513
|
+
<span class="cstat-no" title="statement not covered" > newPosition.x = bounds.minX;</span>
|
|
514
|
+
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
515
|
+
<span class="cstat-no" title="statement not covered" > case 'center-h':</span>
|
|
516
|
+
<span class="cstat-no" title="statement not covered" > newPosition.x = bounds.minX + (bounds.maxX - bounds.minX) / 2 - width / 2;</span>
|
|
517
|
+
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
518
|
+
<span class="cstat-no" title="statement not covered" > case 'right':</span>
|
|
519
|
+
<span class="cstat-no" title="statement not covered" > newPosition.x = bounds.maxX - width;</span>
|
|
520
|
+
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
521
|
+
<span class="cstat-no" title="statement not covered" > case 'top':</span>
|
|
522
|
+
<span class="cstat-no" title="statement not covered" > newPosition.y = bounds.minY;</span>
|
|
523
|
+
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
524
|
+
<span class="cstat-no" title="statement not covered" > case 'center-v':</span>
|
|
525
|
+
<span class="cstat-no" title="statement not covered" > newPosition.y = bounds.minY + (bounds.maxY - bounds.minY) / 2 - height / 2;</span>
|
|
526
|
+
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
527
|
+
<span class="cstat-no" title="statement not covered" > case 'bottom':</span>
|
|
528
|
+
<span class="cstat-no" title="statement not covered" > newPosition.y = bounds.maxY - height;</span>
|
|
529
|
+
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
530
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
531
|
+
|
|
532
|
+
<span class="cstat-no" title="statement not covered" > return { ...node, position: newPosition };</span>
|
|
533
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
534
|
+
|
|
535
|
+
<span class="cstat-no" title="statement not covered" > setNodes(updatedNodes);</span>
|
|
536
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
537
|
+
<span class="cstat-no" title="statement not covered" > [nodes, selectedNodes, setNodes, saveCheckpoint]</span>
|
|
538
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
539
|
+
|
|
540
|
+
<span class="cstat-no" title="statement not covered" > const distributeNodes = useCallback(</span>
|
|
541
|
+
<span class="cstat-no" title="statement not covered" > (direction: 'horizontal' | 'vertical') => {</span>
|
|
542
|
+
<span class="cstat-no" title="statement not covered" > if (selectedNodes.length < 3) return;</span>
|
|
543
|
+
<span class="cstat-no" title="statement not covered" > saveCheckpoint();</span>
|
|
544
|
+
|
|
545
|
+
<span class="cstat-no" title="statement not covered" > const selectedIds = new Set(selectedNodes.map((n) => n.id));</span>
|
|
546
|
+
<span class="cstat-no" title="statement not covered" > const sorted = [...selectedNodes].sort((a, b) =></span>
|
|
547
|
+
<span class="cstat-no" title="statement not covered" > direction === 'horizontal' ? a.position.x - b.position.x : a.position.y - b.position.y</span>
|
|
548
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
549
|
+
|
|
550
|
+
<span class="cstat-no" title="statement not covered" > const first = sorted[0];</span>
|
|
551
|
+
<span class="cstat-no" title="statement not covered" > const last = sorted[sorted.length - 1];</span>
|
|
552
|
+
|
|
553
|
+
<span class="cstat-no" title="statement not covered" > const totalSpace =</span>
|
|
554
|
+
<span class="cstat-no" title="statement not covered" > direction === 'horizontal'</span>
|
|
555
|
+
<span class="cstat-no" title="statement not covered" > ? last.position.x - first.position.x</span>
|
|
556
|
+
<span class="cstat-no" title="statement not covered" > : last.position.y - first.position.y;</span>
|
|
557
|
+
|
|
558
|
+
<span class="cstat-no" title="statement not covered" > const gap = totalSpace / (sorted.length - 1);</span>
|
|
559
|
+
|
|
560
|
+
<span class="cstat-no" title="statement not covered" > const positionMap = new Map<string, { x: number; y: number }>();</span>
|
|
561
|
+
<span class="cstat-no" title="statement not covered" > sorted.forEach((node, index) => {</span>
|
|
562
|
+
<span class="cstat-no" title="statement not covered" > const pos = { ...node.position };</span>
|
|
563
|
+
<span class="cstat-no" title="statement not covered" > if (direction === 'horizontal') {</span>
|
|
564
|
+
<span class="cstat-no" title="statement not covered" > pos.x = first.position.x + gap * index;</span>
|
|
565
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
566
|
+
<span class="cstat-no" title="statement not covered" > pos.y = first.position.y + gap * index;</span>
|
|
567
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
568
|
+
<span class="cstat-no" title="statement not covered" > positionMap.set(node.id, pos);</span>
|
|
569
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
570
|
+
|
|
571
|
+
<span class="cstat-no" title="statement not covered" > const updatedNodes = nodes.map((node) => {</span>
|
|
572
|
+
<span class="cstat-no" title="statement not covered" > if (!selectedIds.has(node.id)) return node;</span>
|
|
573
|
+
<span class="cstat-no" title="statement not covered" > const newPos = positionMap.get(node.id);</span>
|
|
574
|
+
<span class="cstat-no" title="statement not covered" > return newPos ? { ...node, position: newPos } : node;</span>
|
|
575
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
576
|
+
|
|
577
|
+
<span class="cstat-no" title="statement not covered" > setNodes(updatedNodes);</span>
|
|
578
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
579
|
+
<span class="cstat-no" title="statement not covered" > [nodes, selectedNodes, setNodes, saveCheckpoint]</span>
|
|
580
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
581
|
+
|
|
582
|
+
<span class="cstat-no" title="statement not covered" > return (</span>
|
|
583
|
+
<span class="cstat-no" title="statement not covered" > <div className={cn('flex items-center gap-0.5', className)}></span>
|
|
584
|
+
<span class="cstat-no" title="statement not covered" > <AlignButton</span>
|
|
585
|
+
<span class="cstat-no" title="statement not covered" > icon={<AlignStartVertical className="w-4 h-4" />}</span>
|
|
586
|
+
<span class="cstat-no" title="statement not covered" > label="Align Left"</span>
|
|
587
|
+
<span class="cstat-no" title="statement not covered" > onClick={() => alignNodes('left')}</span>
|
|
588
|
+
<span class="cstat-no" title="statement not covered" > disabled={!hasSelection}</span>
|
|
589
|
+
<span class="cstat-no" title="statement not covered" > /></span>
|
|
590
|
+
<span class="cstat-no" title="statement not covered" > <AlignButton</span>
|
|
591
|
+
<span class="cstat-no" title="statement not covered" > icon={<AlignCenterVertical className="w-4 h-4" />}</span>
|
|
592
|
+
<span class="cstat-no" title="statement not covered" > label="Align Center Horizontally"</span>
|
|
593
|
+
<span class="cstat-no" title="statement not covered" > onClick={() => alignNodes('center-h')}</span>
|
|
594
|
+
<span class="cstat-no" title="statement not covered" > disabled={!hasSelection}</span>
|
|
595
|
+
<span class="cstat-no" title="statement not covered" > /></span>
|
|
596
|
+
<span class="cstat-no" title="statement not covered" > <AlignButton</span>
|
|
597
|
+
<span class="cstat-no" title="statement not covered" > icon={<AlignEndVertical className="w-4 h-4" />}</span>
|
|
598
|
+
<span class="cstat-no" title="statement not covered" > label="Align Right"</span>
|
|
599
|
+
<span class="cstat-no" title="statement not covered" > onClick={() => alignNodes('right')}</span>
|
|
600
|
+
<span class="cstat-no" title="statement not covered" > disabled={!hasSelection}</span>
|
|
601
|
+
<span class="cstat-no" title="statement not covered" > /></span>
|
|
602
|
+
<span class="cstat-no" title="statement not covered" > <div className="w-px h-5 bg-border-default mx-0.5" /></span>
|
|
603
|
+
<span class="cstat-no" title="statement not covered" > <AlignButton</span>
|
|
604
|
+
<span class="cstat-no" title="statement not covered" > icon={<AlignStartHorizontal className="w-4 h-4" />}</span>
|
|
605
|
+
<span class="cstat-no" title="statement not covered" > label="Align Top"</span>
|
|
606
|
+
<span class="cstat-no" title="statement not covered" > onClick={() => alignNodes('top')}</span>
|
|
607
|
+
<span class="cstat-no" title="statement not covered" > disabled={!hasSelection}</span>
|
|
608
|
+
<span class="cstat-no" title="statement not covered" > /></span>
|
|
609
|
+
<span class="cstat-no" title="statement not covered" > <AlignButton</span>
|
|
610
|
+
<span class="cstat-no" title="statement not covered" > icon={<AlignCenterHorizontal className="w-4 h-4" />}</span>
|
|
611
|
+
<span class="cstat-no" title="statement not covered" > label="Align Center Vertically"</span>
|
|
612
|
+
<span class="cstat-no" title="statement not covered" > onClick={() => alignNodes('center-v')}</span>
|
|
613
|
+
<span class="cstat-no" title="statement not covered" > disabled={!hasSelection}</span>
|
|
614
|
+
<span class="cstat-no" title="statement not covered" > /></span>
|
|
615
|
+
<span class="cstat-no" title="statement not covered" > <AlignButton</span>
|
|
616
|
+
<span class="cstat-no" title="statement not covered" > icon={<AlignEndHorizontal className="w-4 h-4" />}</span>
|
|
617
|
+
<span class="cstat-no" title="statement not covered" > label="Align Bottom"</span>
|
|
618
|
+
<span class="cstat-no" title="statement not covered" > onClick={() => alignNodes('bottom')}</span>
|
|
619
|
+
<span class="cstat-no" title="statement not covered" > disabled={!hasSelection}</span>
|
|
620
|
+
<span class="cstat-no" title="statement not covered" > /></span>
|
|
621
|
+
<span class="cstat-no" title="statement not covered" > <div className="w-px h-5 bg-border-default mx-0.5" /></span>
|
|
622
|
+
<span class="cstat-no" title="statement not covered" > <AlignButton</span>
|
|
623
|
+
<span class="cstat-no" title="statement not covered" > icon={<GripHorizontal className="w-4 h-4" />}</span>
|
|
624
|
+
<span class="cstat-no" title="statement not covered" > label="Distribute Horizontally"</span>
|
|
625
|
+
<span class="cstat-no" title="statement not covered" > onClick={() => distributeNodes('horizontal')}</span>
|
|
626
|
+
<span class="cstat-no" title="statement not covered" > disabled={selectedNodes.length < 3}</span>
|
|
627
|
+
<span class="cstat-no" title="statement not covered" > /></span>
|
|
628
|
+
<span class="cstat-no" title="statement not covered" > <AlignButton</span>
|
|
629
|
+
<span class="cstat-no" title="statement not covered" > icon={<GripVertical className="w-4 h-4" />}</span>
|
|
630
|
+
<span class="cstat-no" title="statement not covered" > label="Distribute Vertically"</span>
|
|
631
|
+
<span class="cstat-no" title="statement not covered" > onClick={() => distributeNodes('vertical')}</span>
|
|
632
|
+
<span class="cstat-no" title="statement not covered" > disabled={selectedNodes.length < 3}</span>
|
|
633
|
+
<span class="cstat-no" title="statement not covered" > /></span>
|
|
634
|
+
<span class="cstat-no" title="statement not covered" > </div></span>
|
|
635
|
+
);
|
|
636
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
637
|
+
|
|
638
|
+
<span class="cstat-no" title="statement not covered" >function AlignButton({</span>
|
|
639
|
+
<span class="cstat-no" title="statement not covered" > icon,</span>
|
|
640
|
+
<span class="cstat-no" title="statement not covered" > label,</span>
|
|
641
|
+
<span class="cstat-no" title="statement not covered" > onClick,</span>
|
|
642
|
+
<span class="cstat-no" title="statement not covered" > disabled,</span>
|
|
643
|
+
<span class="cstat-no" title="statement not covered" >}: {</span>
|
|
644
|
+
icon: React.ReactNode;
|
|
645
|
+
label: string;
|
|
646
|
+
onClick: () => void;
|
|
647
|
+
disabled: boolean;
|
|
648
|
+
<span class="cstat-no" title="statement not covered" >}) {</span>
|
|
649
|
+
<span class="cstat-no" title="statement not covered" > return (</span>
|
|
650
|
+
<span class="cstat-no" title="statement not covered" > <button</span>
|
|
651
|
+
<span class="cstat-no" title="statement not covered" > onClick={onClick}</span>
|
|
652
|
+
<span class="cstat-no" title="statement not covered" > disabled={disabled}</span>
|
|
653
|
+
<span class="cstat-no" title="statement not covered" > className="p-1.5 rounded text-text-secondary hover:text-text-primary hover:bg-bg-hover transition-colors disabled:opacity-30 disabled:cursor-not-allowed"</span>
|
|
654
|
+
<span class="cstat-no" title="statement not covered" > title={label}</span>
|
|
655
|
+
>
|
|
656
|
+
<span class="cstat-no" title="statement not covered" > {icon}</span>
|
|
657
|
+
<span class="cstat-no" title="statement not covered" > </button></span>
|
|
658
|
+
);
|
|
659
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
660
|
+
|
|
661
|
+
<span class="cstat-no" title="statement not covered" >function getSelectionBounds(nodes: Node[]) {</span>
|
|
662
|
+
<span class="cstat-no" title="statement not covered" > let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;</span>
|
|
663
|
+
<span class="cstat-no" title="statement not covered" > for (const node of nodes) {</span>
|
|
664
|
+
<span class="cstat-no" title="statement not covered" > const w = node.measured?.width || node.width || 200;</span>
|
|
665
|
+
<span class="cstat-no" title="statement not covered" > const h = node.measured?.height || node.height || 80;</span>
|
|
666
|
+
<span class="cstat-no" title="statement not covered" > minX = Math.min(minX, node.position.x);</span>
|
|
667
|
+
<span class="cstat-no" title="statement not covered" > minY = Math.min(minY, node.position.y);</span>
|
|
668
|
+
<span class="cstat-no" title="statement not covered" > maxX = Math.max(maxX, node.position.x + w);</span>
|
|
669
|
+
<span class="cstat-no" title="statement not covered" > maxY = Math.max(maxY, node.position.y + h);</span>
|
|
670
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
671
|
+
<span class="cstat-no" title="statement not covered" > return { minX, minY, maxX, maxY };</span>
|
|
672
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
673
|
+
|
|
674
|
+
<span class="cstat-no" title="statement not covered" >export const AlignmentTools = memo(AlignmentToolsComponent);</span>
|
|
675
|
+
</pre></td></tr></table></pre>
|
|
676
|
+
|
|
677
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
678
|
+
</div><!-- /wrapper -->
|
|
679
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
680
|
+
Code coverage generated by
|
|
681
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
682
|
+
at 2026-02-09T21:07:24.535Z
|
|
683
|
+
</div>
|
|
684
|
+
<script src="../../../prettify.js"></script>
|
|
685
|
+
<script>
|
|
686
|
+
window.onload = function () {
|
|
687
|
+
prettyPrint();
|
|
688
|
+
};
|
|
689
|
+
</script>
|
|
690
|
+
<script src="../../../sorter.js"></script>
|
|
691
|
+
<script src="../../../block-navigation.js"></script>
|
|
692
|
+
</body>
|
|
693
|
+
</html>
|
|
694
|
+
|