@awesome-flow/ecs 0.3.0 → 0.4.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.
package/dist/index.js CHANGED
@@ -35,80 +35,22 @@ var EcsFlowRepository = class {
35
35
  }
36
36
  };
37
37
 
38
- // src/flow/flow-ecs-state.tsx
39
- import { useEffect as useEffect7, useContext as useContext10, useState as useState3 } from "react";
40
-
41
- // src/flow/flow-ecs-auto-layout.tsx
42
- import { FlowContext } from "@awesome-flow/core/abstract";
43
- import Dagre from "@dagrejs/dagre";
44
- import { useReactFlow } from "@xyflow/react";
45
- import { useCallback, useContext, useEffect, useMemo } from "react";
46
- import { Fragment, jsx } from "react/jsx-runtime";
47
- function FlowEcsAutoLayout(props) {
48
- const { getNodes, getEdges } = useReactFlow();
49
- const context = useContext(FlowContext);
50
- const setNodes = context.useFlowStore((state) => state.setNodes);
51
- const graph = useMemo(() => new Dagre.graphlib.Graph().setDefaultEdgeLabel(() => ({})), []);
52
- const getLayoutElements = useCallback(
53
- (nodes, edges, options) => {
54
- graph.setGraph(options);
55
- edges.forEach((edge) => graph.setEdge(edge.source, edge.target));
56
- nodes.forEach((node) => {
57
- if (node.measured) {
58
- graph.setNode(node.id, {
59
- width: node.measured.width,
60
- height: node.measured.height
61
- });
62
- }
63
- });
64
- Dagre.layout(graph);
65
- return {
66
- nodes: nodes.map((node) => {
67
- const graphNode = graph.node(node.id);
68
- if (graphNode) {
69
- return { ...node, position: { x: graphNode.x, y: graphNode.y } };
70
- }
71
- return node;
72
- }),
73
- edges
74
- };
75
- },
76
- [graph]
77
- );
78
- useEffect(() => {
79
- if (props.needsLayout) {
80
- const storeNodes = getNodes();
81
- if (storeNodes?.length) {
82
- const edges = getEdges();
83
- const layout = getLayoutElements(storeNodes, edges, {
84
- rankdir: "LR"
85
- });
86
- setNodes(layout.nodes);
87
- }
88
- }
89
- }, [props.needsLayout]);
90
- useEffect(() => {
91
- if (props.needsLayout) {
92
- props.setNeedsLayout(false);
93
- }
94
- });
95
- return /* @__PURE__ */ jsx(Fragment, {});
96
- }
97
- var flow_ecs_auto_layout_default = FlowEcsAutoLayout;
98
-
99
- // src/flow/flow-ecs-entities.tsx
100
- import { FlowContext as FlowContext4 } from "@awesome-flow/core/abstract";
101
- import { useContext as useContext8, useEffect as useEffect5, useState as useState2 } from "react";
38
+ // src/abstract/handle-types.ts
39
+ var EcsHandleDataType = /* @__PURE__ */ ((EcsHandleDataType2) => {
40
+ EcsHandleDataType2["proxy"] = "proxy";
41
+ EcsHandleDataType2["module"] = "module";
42
+ return EcsHandleDataType2;
43
+ })(EcsHandleDataType || {});
102
44
 
103
45
  // src/nodes/node-systems-module.tsx
104
46
  import { NodeContainer } from "@awesome-flow/core/layout";
105
- import { useContext as useContext2 } from "react";
47
+ import { useContext } from "react";
106
48
  import { Badge as Badge3 } from "@mantine/core";
107
49
 
108
50
  // src/layout/systems-module-layout.tsx
109
51
  import { SystemType } from "@awesome-ecs/abstract/systems";
110
52
  import { Accordion as Accordion2, Text } from "@mantine/core";
111
- import { useMemo as useMemo3 } from "react";
53
+ import { useMemo as useMemo2 } from "react";
112
54
 
113
55
  // src/components/pipeline-middleware-list.tsx
114
56
  import { Accordion, Badge as Badge2, Stack } from "@mantine/core";
@@ -118,9 +60,9 @@ import { Badge } from "@mantine/core";
118
60
  import { memo as memo2 } from "react";
119
61
 
120
62
  // src/components/formatter-camel-case.tsx
121
- import { memo, useMemo as useMemo2 } from "react";
63
+ import { memo, useMemo } from "react";
122
64
  function CamelCaseFormatter(props) {
123
- const value = useMemo2(
65
+ const value = useMemo(
124
66
  () => props.value?.toString().replace(/([a-z])([A-Z])/g, "$1 $2"),
125
67
  [props.value]
126
68
  );
@@ -129,16 +71,16 @@ function CamelCaseFormatter(props) {
129
71
  var formatter_camel_case_default = memo(CamelCaseFormatter);
130
72
 
131
73
  // src/components/badge-list.tsx
132
- import { jsx as jsx2 } from "react/jsx-runtime";
74
+ import { jsx } from "react/jsx-runtime";
133
75
  function BadgeList(props) {
134
76
  return props.items.map((value, i) => {
135
- return /* @__PURE__ */ jsx2(Badge, { ...props.badge || [], children: /* @__PURE__ */ jsx2(formatter_camel_case_default, { value }) }, i);
77
+ return /* @__PURE__ */ jsx(Badge, { ...props.badge || [], children: /* @__PURE__ */ jsx(formatter_camel_case_default, { value }) }, i);
136
78
  });
137
79
  }
138
80
  var badge_list_default = memo2(BadgeList);
139
81
 
140
82
  // src/components/pipeline-middleware-list.tsx
141
- import { jsx as jsx3, jsxs } from "react/jsx-runtime";
83
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
142
84
  function PipelineMiddlewareList(props) {
143
85
  let middleware = [];
144
86
  if (props.pipeline) {
@@ -148,54 +90,54 @@ function PipelineMiddlewareList(props) {
148
90
  return m.name || m.constructor.name;
149
91
  });
150
92
  return /* @__PURE__ */ jsxs(Accordion.Item, { value: props.label, children: [
151
- /* @__PURE__ */ jsx3(Accordion.Control, { children: /* @__PURE__ */ jsx3(Badge2, { fullWidth: true, variant: "light", rightSection: components.length, children: props.label }) }),
152
- /* @__PURE__ */ jsx3(Accordion.Panel, { children: /* @__PURE__ */ jsx3(Stack, { children: /* @__PURE__ */ jsx3(badge_list_default, { items: components, badge: { variant: "outline" } }) }) })
93
+ /* @__PURE__ */ jsx2(Accordion.Control, { children: /* @__PURE__ */ jsx2(Badge2, { fullWidth: true, variant: "light", rightSection: components.length, children: props.label }) }),
94
+ /* @__PURE__ */ jsx2(Accordion.Panel, { children: /* @__PURE__ */ jsx2(Stack, { children: /* @__PURE__ */ jsx2(badge_list_default, { items: components, badge: { variant: "outline" } }) }) })
153
95
  ] }, props.label);
154
96
  }
155
97
  var pipeline_middleware_list_default = PipelineMiddlewareList;
156
98
 
157
99
  // src/layout/systems-module-layout.tsx
158
- import { Fragment as Fragment2, jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
100
+ import { Fragment, jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
159
101
  function SystemsModuleLayout(props) {
160
102
  const { module } = props;
161
103
  const runtimeContext = module["runtimeContext"];
162
104
  const { systemContext } = runtimeContext;
163
- const { status } = useMemo3(() => {
105
+ const { status } = useMemo2(() => {
164
106
  return systemContext.runtime;
165
107
  }, [systemContext.runtime.status]);
166
108
  const init = runtimeContext.systemPipelines.get(SystemType.initialize);
167
109
  const update = runtimeContext.systemPipelines.get(SystemType.update);
168
110
  const render = runtimeContext.systemPipelines.get(SystemType.render);
169
111
  const sync = runtimeContext.systemPipelines.get(SystemType.sync);
170
- return /* @__PURE__ */ jsxs2(Fragment2, { children: [
112
+ return /* @__PURE__ */ jsxs2(Fragment, { children: [
171
113
  /* @__PURE__ */ jsxs2(Text, { children: [
172
114
  "Status: ",
173
115
  status
174
116
  ] }),
175
117
  /* @__PURE__ */ jsxs2(Accordion2, { children: [
176
- init && /* @__PURE__ */ jsx4(pipeline_middleware_list_default, { pipeline: init, label: "Initialize" }),
177
- update && /* @__PURE__ */ jsx4(pipeline_middleware_list_default, { pipeline: update, label: "Update" }),
178
- render && /* @__PURE__ */ jsx4(pipeline_middleware_list_default, { pipeline: render, label: "Render" }),
179
- sync && /* @__PURE__ */ jsx4(pipeline_middleware_list_default, { pipeline: sync, label: "Sync" })
118
+ init && /* @__PURE__ */ jsx3(pipeline_middleware_list_default, { pipeline: init, label: "Initialize" }),
119
+ update && /* @__PURE__ */ jsx3(pipeline_middleware_list_default, { pipeline: update, label: "Update" }),
120
+ render && /* @__PURE__ */ jsx3(pipeline_middleware_list_default, { pipeline: render, label: "Render" }),
121
+ sync && /* @__PURE__ */ jsx3(pipeline_middleware_list_default, { pipeline: sync, label: "Sync" })
180
122
  ] })
181
123
  ] });
182
124
  }
183
125
  var systems_module_layout_default = SystemsModuleLayout;
184
126
 
185
127
  // src/nodes/node-systems-module.tsx
186
- import { jsx as jsx5 } from "react/jsx-runtime";
128
+ import { jsx as jsx4 } from "react/jsx-runtime";
187
129
  function SystemsModuleNode({ id, data, selected, type }) {
188
- const { systemsModuleRepository } = useContext2(EcsFlowContext);
130
+ const { systemsModuleRepository } = useContext(EcsFlowContext);
189
131
  const module = systemsModuleRepository.get(data.entityType);
190
- return /* @__PURE__ */ jsx5(
132
+ return /* @__PURE__ */ jsx4(
191
133
  NodeContainer,
192
134
  {
193
135
  id,
194
136
  selected,
195
137
  data,
196
- title: /* @__PURE__ */ jsx5(Badge3, { fullWidth: true, color: "indigo", variant: "transparent", children: /* @__PURE__ */ jsx5(formatter_camel_case_default, { value: data.entityType }) }),
138
+ title: /* @__PURE__ */ jsx4(Badge3, { fullWidth: true, color: "indigo", variant: "transparent", children: /* @__PURE__ */ jsx4(formatter_camel_case_default, { value: data.entityType }) }),
197
139
  type,
198
- children: /* @__PURE__ */ jsx5(systems_module_layout_default, { type: data.entityType, module })
140
+ children: /* @__PURE__ */ jsx4(systems_module_layout_default, { type: data.entityType, module })
199
141
  }
200
142
  );
201
143
  }
@@ -204,7 +146,7 @@ var node_systems_module_default = SystemsModuleNode;
204
146
  // src/nodes/node-entity.tsx
205
147
  import { NodeContainer as NodeContainer2 } from "@awesome-flow/core/layout";
206
148
  import { Badge as Badge9 } from "@mantine/core";
207
- import { useContext as useContext5, useMemo as useMemo6 } from "react";
149
+ import { useContext as useContext4, useMemo as useMemo5 } from "react";
208
150
 
209
151
  // src/layout/entity-layout.tsx
210
152
  import { Accordion as Accordion6, Badge as Badge8, Divider, Group } from "@mantine/core";
@@ -215,43 +157,43 @@ import { memo as memo5 } from "react";
215
157
 
216
158
  // src/components/entity-component-inspector.tsx
217
159
  import { Box, Button, Collapse } from "@mantine/core";
218
- import { memo as memo4, useMemo as useMemo5 } from "react";
160
+ import { memo as memo4, useMemo as useMemo4 } from "react";
219
161
  import { useDisclosure } from "@mantine/hooks";
220
162
 
221
163
  // src/components/object-inspector.tsx
222
164
  import { useComputedColorScheme } from "@mantine/core";
223
- import { memo as memo3, useMemo as useMemo4 } from "react";
165
+ import { memo as memo3, useMemo as useMemo3 } from "react";
224
166
  import { Inspector } from "react-inspector";
225
- import { jsx as jsx6 } from "react/jsx-runtime";
167
+ import { jsx as jsx5 } from "react/jsx-runtime";
226
168
  function ObjectInspector(props) {
227
169
  const colorScheme = useComputedColorScheme();
228
- const theme = useMemo4(
170
+ const theme = useMemo3(
229
171
  () => colorScheme === "dark" ? "chromeDark" : "chromeLight",
230
172
  [colorScheme]
231
173
  );
232
- return /* @__PURE__ */ jsx6(Inspector, { table: false, theme, data: props.data });
174
+ return /* @__PURE__ */ jsx5(Inspector, { table: false, theme, data: props.data });
233
175
  }
234
176
  var object_inspector_default = memo3(ObjectInspector);
235
177
 
236
178
  // src/components/entity-component-inspector.tsx
237
- import { jsx as jsx7, jsxs as jsxs3 } from "react/jsx-runtime";
179
+ import { jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
238
180
  function EntityComponentInspector(props) {
239
181
  const [opened, { toggle }] = useDisclosure(false);
240
- const buttonColor = useMemo5(() => opened ? "light" : "indigo", [opened]);
182
+ const buttonColor = useMemo4(() => opened ? "light" : "indigo", [opened]);
241
183
  return /* @__PURE__ */ jsxs3(Box, { children: [
242
- /* @__PURE__ */ jsx7(Button, { variant: "outline", size: "xs", onClick: toggle, color: buttonColor, fullWidth: true, children: props.component.componentType }),
243
- /* @__PURE__ */ jsx7(Collapse, { in: opened, children: opened && /* @__PURE__ */ jsx7(object_inspector_default, { data: props.component }) })
184
+ /* @__PURE__ */ jsx6(Button, { variant: "outline", size: "xs", onClick: toggle, color: buttonColor, fullWidth: true, children: props.component.componentType }),
185
+ /* @__PURE__ */ jsx6(Collapse, { in: opened, children: opened && /* @__PURE__ */ jsx6(object_inspector_default, { data: props.component }) })
244
186
  ] });
245
187
  }
246
188
  var entity_component_inspector_default = memo4(EntityComponentInspector);
247
189
 
248
190
  // src/components/entity-component-list.tsx
249
- import { jsx as jsx8, jsxs as jsxs4 } from "react/jsx-runtime";
191
+ import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
250
192
  function EntityComponentList(props) {
251
193
  const components = Array.from(props.entity.components.values());
252
194
  return /* @__PURE__ */ jsxs4(Accordion3.Item, { value: "components", children: [
253
- /* @__PURE__ */ jsx8(Accordion3.Control, { children: /* @__PURE__ */ jsx8(Badge4, { fullWidth: true, variant: "light", rightSection: components.length, children: "Components" }) }),
254
- /* @__PURE__ */ jsx8(Accordion3.Panel, { children: /* @__PURE__ */ jsx8(Stack2, { children: components.map((c, i) => /* @__PURE__ */ jsx8(entity_component_inspector_default, { component: c }, i)) }) })
195
+ /* @__PURE__ */ jsx7(Accordion3.Control, { children: /* @__PURE__ */ jsx7(Badge4, { fullWidth: true, variant: "light", rightSection: components.length, children: "Components" }) }),
196
+ /* @__PURE__ */ jsx7(Accordion3.Panel, { children: /* @__PURE__ */ jsx7(Stack2, { children: components.map((c, i) => /* @__PURE__ */ jsx7(entity_component_inspector_default, { component: c }, i)) }) })
255
197
  ] }, "components");
256
198
  }
257
199
  var entity_component_list_default = memo5(EntityComponentList);
@@ -259,41 +201,41 @@ var entity_component_list_default = memo5(EntityComponentList);
259
201
  // src/components/entity-proxy-list.tsx
260
202
  import { Accordion as Accordion4, Badge as Badge5, Stack as Stack3 } from "@mantine/core";
261
203
  import { memo as memo6 } from "react";
262
- import { jsx as jsx9, jsxs as jsxs5 } from "react/jsx-runtime";
204
+ import { jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
263
205
  function EntityProxyList(props) {
264
206
  const proxies = Array.from(props.entity.proxies.values()).map((c) => c.values());
265
207
  const items = proxies.map((p) => Array.from(p).map((k) => EcsIdGenerator.entityProxy(k))).flat();
266
208
  return /* @__PURE__ */ jsxs5(Accordion4.Item, { value: "proxies", children: [
267
- /* @__PURE__ */ jsx9(Accordion4.Control, { children: /* @__PURE__ */ jsx9(Badge5, { fullWidth: true, variant: "light", rightSection: items.length, children: "Proxies" }) }),
268
- /* @__PURE__ */ jsx9(Accordion4.Panel, { children: /* @__PURE__ */ jsx9(Stack3, { children: /* @__PURE__ */ jsx9(badge_list_default, { items, badge: { variant: "outline" } }) }) })
209
+ /* @__PURE__ */ jsx8(Accordion4.Control, { children: /* @__PURE__ */ jsx8(Badge5, { fullWidth: true, variant: "light", rightSection: items.length, children: "Proxies" }) }),
210
+ /* @__PURE__ */ jsx8(Accordion4.Panel, { children: /* @__PURE__ */ jsx8(Stack3, { children: /* @__PURE__ */ jsx8(badge_list_default, { items, badge: { variant: "outline" } }) }) })
269
211
  ] }, "proxies");
270
212
  }
271
213
  var entity_proxy_list_default = memo6(EntityProxyList);
272
214
 
273
215
  // src/components/entity-subscription-list.tsx
274
216
  import { Accordion as Accordion5, Badge as Badge6, Stack as Stack4 } from "@mantine/core";
275
- import { memo as memo7, useContext as useContext3 } from "react";
276
- import { jsx as jsx10, jsxs as jsxs6 } from "react/jsx-runtime";
217
+ import { memo as memo7, useContext as useContext2 } from "react";
218
+ import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
277
219
  function EntitySubscriptionList(props) {
278
- const { entityEventsManager } = useContext3(EcsFlowContext);
220
+ const { entityEventsManager } = useContext2(EcsFlowContext);
279
221
  const subscriptions = entityEventsManager.getSubscriptionsForEntity(props.entity.myProxy);
280
222
  return /* @__PURE__ */ jsxs6(Accordion5.Item, { value: "subscriptions", children: [
281
- /* @__PURE__ */ jsx10(Accordion5.Control, { children: /* @__PURE__ */ jsx10(Badge6, { fullWidth: true, variant: "light", rightSection: subscriptions.length, children: "Events" }) }),
282
- /* @__PURE__ */ jsx10(Accordion5.Panel, { children: /* @__PURE__ */ jsx10(Stack4, { children: /* @__PURE__ */ jsx10(badge_list_default, { items: subscriptions, badge: { variant: "outline" } }) }) })
223
+ /* @__PURE__ */ jsx9(Accordion5.Control, { children: /* @__PURE__ */ jsx9(Badge6, { fullWidth: true, variant: "light", rightSection: subscriptions.length, children: "Events" }) }),
224
+ /* @__PURE__ */ jsx9(Accordion5.Panel, { children: /* @__PURE__ */ jsx9(Stack4, { children: /* @__PURE__ */ jsx9(badge_list_default, { items: subscriptions, badge: { variant: "outline" } }) }) })
283
225
  ] }, "subscriptions");
284
226
  }
285
227
  var entity_subscription_list_default = memo7(EntitySubscriptionList);
286
228
 
287
229
  // src/components/entity-update-counter.tsx
288
230
  import { Badge as Badge7 } from "@mantine/core";
289
- import { memo as memo8, useContext as useContext4, useEffect as useEffect2, useState } from "react";
290
- import { Fragment as Fragment3, jsx as jsx11, jsxs as jsxs7 } from "react/jsx-runtime";
231
+ import { memo as memo8, useContext as useContext3, useEffect, useState } from "react";
232
+ import { Fragment as Fragment2, jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
291
233
  function EntityUpdateCounter(props) {
292
234
  const [, setRefresh] = useState(0);
293
- const { entityUpdateCounter } = useContext4(EcsFlowContext);
235
+ const { entityUpdateCounter } = useContext3(EcsFlowContext);
294
236
  const updates = entityUpdateCounter.getUpdateCount(props.entityUid) || 0;
295
237
  const removes = entityUpdateCounter.getRemoveCount(props.entityUid) || 0;
296
- useEffect2(() => {
238
+ useEffect(() => {
297
239
  const interval = setInterval(() => {
298
240
  setRefresh((refresh) => refresh + 1);
299
241
  }, 1e3);
@@ -302,129 +244,104 @@ function EntityUpdateCounter(props) {
302
244
  clearInterval(interval);
303
245
  };
304
246
  }, []);
305
- return /* @__PURE__ */ jsxs7(Fragment3, { children: [
306
- /* @__PURE__ */ jsx11(Badge7, { variant: "light", children: updates }),
307
- /* @__PURE__ */ jsx11(Badge7, { variant: "light", color: "orange", children: removes })
247
+ return /* @__PURE__ */ jsxs7(Fragment2, { children: [
248
+ /* @__PURE__ */ jsx10(Badge7, { variant: "light", children: updates }),
249
+ /* @__PURE__ */ jsx10(Badge7, { variant: "light", color: "orange", children: removes })
308
250
  ] });
309
251
  }
310
252
  var entity_update_counter_default = memo8(EntityUpdateCounter);
311
253
 
312
254
  // src/layout/entity-layout.tsx
313
- import { Fragment as Fragment4, jsx as jsx12, jsxs as jsxs8 } from "react/jsx-runtime";
255
+ import { Fragment as Fragment3, jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
314
256
  function EntityLayout({ entity }) {
315
- return /* @__PURE__ */ jsxs8(Fragment4, { children: [
257
+ return /* @__PURE__ */ jsxs8(Fragment3, { children: [
316
258
  /* @__PURE__ */ jsxs8(Group, { children: [
317
- /* @__PURE__ */ jsx12(Badge8, { variant: "outline", color: "orange", children: entity.myProxy.entityUid }),
318
- /* @__PURE__ */ jsx12(entity_update_counter_default, { entityUid: entity.myProxy.entityUid })
259
+ /* @__PURE__ */ jsx11(Badge8, { variant: "outline", color: "orange", children: entity.myProxy.entityUid }),
260
+ /* @__PURE__ */ jsx11(entity_update_counter_default, { entityUid: entity.myProxy.entityUid })
319
261
  ] }),
320
- /* @__PURE__ */ jsx12(Divider, { my: 5 }),
262
+ /* @__PURE__ */ jsx11(Divider, { my: 5 }),
321
263
  /* @__PURE__ */ jsxs8(Accordion6, { children: [
322
- /* @__PURE__ */ jsx12(entity_component_list_default, { entity }),
323
- /* @__PURE__ */ jsx12(entity_proxy_list_default, { entity }),
324
- /* @__PURE__ */ jsx12(entity_subscription_list_default, { entity })
264
+ /* @__PURE__ */ jsx11(entity_component_list_default, { entity }),
265
+ /* @__PURE__ */ jsx11(entity_proxy_list_default, { entity }),
266
+ /* @__PURE__ */ jsx11(entity_subscription_list_default, { entity })
325
267
  ] })
326
268
  ] });
327
269
  }
328
270
  var entity_layout_default = EntityLayout;
329
271
 
330
272
  // src/nodes/node-entity.tsx
331
- import { jsx as jsx13 } from "react/jsx-runtime";
273
+ import { jsx as jsx12 } from "react/jsx-runtime";
332
274
  function EntityNode({ id, data, selected, type }) {
333
- const { entityRepository } = useContext5(EcsFlowContext);
334
- const entity = useMemo6(() => entityRepository.get(data.entity), [data.entity]);
335
- return /* @__PURE__ */ jsx13(
275
+ const { entityRepository } = useContext4(EcsFlowContext);
276
+ const entity = useMemo5(() => entityRepository.get(data.entity), [data.entity]);
277
+ return /* @__PURE__ */ jsx12(
336
278
  NodeContainer2,
337
279
  {
338
280
  id,
339
281
  selected,
340
282
  data,
341
- title: /* @__PURE__ */ jsx13(Badge9, { fullWidth: true, variant: "transparent", children: /* @__PURE__ */ jsx13(formatter_camel_case_default, { value: entity.myProxy.entityType }) }),
283
+ title: /* @__PURE__ */ jsx12(Badge9, { fullWidth: true, variant: "transparent", children: /* @__PURE__ */ jsx12(formatter_camel_case_default, { value: entity.myProxy.entityType }) }),
342
284
  type,
343
- children: /* @__PURE__ */ jsx13(entity_layout_default, { entity })
285
+ children: /* @__PURE__ */ jsx12(entity_layout_default, { entity })
344
286
  }
345
287
  );
346
288
  }
347
289
  var node_entity_default = EntityNode;
348
290
 
349
291
  // src/templates/template-entity-node.ts
350
- import { IDGenerator } from "@awesome-flow/core/utils";
351
292
  import { Position } from "@xyflow/react";
352
293
 
353
- // src/abstract/handle-types.ts
354
- var EcsHandleDataType = /* @__PURE__ */ ((EcsHandleDataType2) => {
355
- EcsHandleDataType2[EcsHandleDataType2["proxy"] = 1] = "proxy";
356
- EcsHandleDataType2[EcsHandleDataType2["module"] = 2] = "module";
357
- return EcsHandleDataType2;
358
- })(EcsHandleDataType || {});
294
+ // src/abstract/templates.ts
295
+ var EcsTemplateGroup = /* @__PURE__ */ ((EcsTemplateGroup2) => {
296
+ EcsTemplateGroup2["ecs"] = "ECS";
297
+ return EcsTemplateGroup2;
298
+ })(EcsTemplateGroup || {});
359
299
 
360
300
  // src/templates/template-entity-node.ts
361
301
  var EntityNodeTemplate = class {
362
- create() {
363
- const data = {
302
+ template = {
303
+ type: "entity-node" /* entity */,
304
+ group: "ECS" /* ecs */,
305
+ data: {
364
306
  title: "Entity",
365
307
  entity: null
366
- };
367
- return {
368
- id: IDGenerator.template(),
369
- removable: false,
370
- type: "entity-node" /* entity */,
371
- data,
372
- handles: [
373
- {
374
- dataType: 1 /* proxy */,
375
- position: Position.Left,
376
- connection: "target",
377
- disabled: true
378
- },
379
- {
380
- dataType: 1 /* proxy */,
381
- position: Position.Right,
382
- connection: "source",
383
- disabled: true
384
- }
385
- ]
386
- };
387
- }
388
- isHandleAllowed() {
389
- return false;
390
- }
391
- getHandleAllowedDataType() {
392
- return 1 /* proxy */;
393
- }
308
+ },
309
+ handles: [
310
+ {
311
+ dataType: "proxy" /* proxy */,
312
+ position: Position.Left,
313
+ connection: "target",
314
+ disabled: true
315
+ },
316
+ {
317
+ dataType: "proxy" /* proxy */,
318
+ position: Position.Right,
319
+ connection: "source",
320
+ disabled: true
321
+ }
322
+ ]
323
+ };
394
324
  };
395
325
 
396
326
  // src/templates/template-systems-module.ts
397
- import { IDGenerator as IDGenerator2 } from "@awesome-flow/core/utils";
398
327
  import { Position as Position2 } from "@xyflow/react";
399
328
  var SystemsModuleNodeTemplate = class {
400
- create() {
401
- const data = {
329
+ template = {
330
+ type: "systems-module-node" /* systemsModule */,
331
+ group: "ECS" /* ecs */,
332
+ data: {
402
333
  title: "Systems Module",
403
- entityType: null,
404
- handles: null,
405
- templateId: null
406
- };
407
- return {
408
- id: IDGenerator2.template(),
409
- removable: false,
410
- type: "systems-module-node" /* systemsModule */,
411
- data,
412
- handles: [
413
- {
414
- dataType: 2 /* module */,
415
- position: Position2.Left,
416
- connection: "target",
417
- disabled: true
418
- }
419
- ]
420
- };
421
- }
422
- isHandleAllowed() {
423
- return false;
424
- }
425
- getHandleAllowedDataType() {
426
- return 2 /* module */;
427
- }
334
+ entityType: null
335
+ },
336
+ handles: [
337
+ {
338
+ dataType: "module" /* module */,
339
+ position: Position2.Left,
340
+ connection: "target",
341
+ disabled: true
342
+ }
343
+ ]
344
+ };
428
345
  };
429
346
 
430
347
  // src/abstract/node-types.ts
@@ -442,6 +359,71 @@ var ecsNodeTemplates = {
442
359
  ["systems-module-node" /* systemsModule */]: new SystemsModuleNodeTemplate()
443
360
  };
444
361
 
362
+ // src/flow/flow-ecs-state.tsx
363
+ import { useEffect as useEffect7, useContext as useContext10, useState as useState3 } from "react";
364
+
365
+ // src/flow/flow-ecs-auto-layout.tsx
366
+ import { FlowContext } from "@awesome-flow/core/abstract";
367
+ import Dagre from "@dagrejs/dagre";
368
+ import { useReactFlow } from "@xyflow/react";
369
+ import { useCallback, useContext as useContext5, useEffect as useEffect2, useMemo as useMemo6 } from "react";
370
+ import { Fragment as Fragment4, jsx as jsx13 } from "react/jsx-runtime";
371
+ function FlowEcsAutoLayout(props) {
372
+ const { getNodes, getEdges } = useReactFlow();
373
+ const context = useContext5(FlowContext);
374
+ const setNodes = context.useFlowStore((state) => state.setNodes);
375
+ const graph = useMemo6(() => new Dagre.graphlib.Graph().setDefaultEdgeLabel(() => ({})), []);
376
+ const getLayoutElements = useCallback(
377
+ (nodes, edges, options) => {
378
+ graph.setGraph(options);
379
+ edges.forEach((edge) => graph.setEdge(edge.source, edge.target));
380
+ nodes.forEach((node) => {
381
+ if (node.measured) {
382
+ graph.setNode(node.id, {
383
+ width: node.measured.width,
384
+ height: node.measured.height
385
+ });
386
+ }
387
+ });
388
+ Dagre.layout(graph);
389
+ return {
390
+ nodes: nodes.map((node) => {
391
+ const graphNode = graph.node(node.id);
392
+ if (graphNode) {
393
+ return { ...node, position: { x: graphNode.x, y: graphNode.y } };
394
+ }
395
+ return node;
396
+ }),
397
+ edges
398
+ };
399
+ },
400
+ [graph]
401
+ );
402
+ useEffect2(() => {
403
+ if (props.needsLayout) {
404
+ const storeNodes = getNodes();
405
+ if (storeNodes?.length) {
406
+ const edges = getEdges();
407
+ const layout = getLayoutElements(storeNodes, edges, {
408
+ rankdir: "LR"
409
+ });
410
+ setNodes(layout.nodes);
411
+ }
412
+ }
413
+ }, [props.needsLayout]);
414
+ useEffect2(() => {
415
+ if (props.needsLayout) {
416
+ props.setNeedsLayout(false);
417
+ }
418
+ });
419
+ return /* @__PURE__ */ jsx13(Fragment4, {});
420
+ }
421
+ var flow_ecs_auto_layout_default = FlowEcsAutoLayout;
422
+
423
+ // src/flow/flow-ecs-entities.tsx
424
+ import { FlowContext as FlowContext4 } from "@awesome-flow/core/abstract";
425
+ import { useContext as useContext8, useEffect as useEffect5, useState as useState2 } from "react";
426
+
445
427
  // src/flow/flow-ecs-edge-proxies.tsx
446
428
  import { useContext as useContext6, useEffect as useEffect3 } from "react";
447
429
  import { FlowContext as FlowContext2 } from "@awesome-flow/core/abstract";
@@ -592,6 +574,7 @@ export {
592
574
  EcsFlowRepository,
593
575
  EcsHandleDataType,
594
576
  EcsNodeType,
577
+ EcsTemplateGroup,
595
578
  node_entity_default as EntityNode,
596
579
  EntityNodeTemplate,
597
580
  flow_ecs_state_default as FlowEcsState,