@almadar/std 1.0.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 (78) hide show
  1. package/LICENSE +72 -0
  2. package/dist/behaviors/action-affinity.d.ts +88 -0
  3. package/dist/behaviors/action-affinity.js +290 -0
  4. package/dist/behaviors/action-affinity.js.map +1 -0
  5. package/dist/behaviors/async.d.ts +20 -0
  6. package/dist/behaviors/async.js +542 -0
  7. package/dist/behaviors/async.js.map +1 -0
  8. package/dist/behaviors/data-management.d.ts +40 -0
  9. package/dist/behaviors/data-management.js +495 -0
  10. package/dist/behaviors/data-management.js.map +1 -0
  11. package/dist/behaviors/feedback.d.ts +18 -0
  12. package/dist/behaviors/feedback.js +307 -0
  13. package/dist/behaviors/feedback.js.map +1 -0
  14. package/dist/behaviors/game-core.d.ts +40 -0
  15. package/dist/behaviors/game-core.js +443 -0
  16. package/dist/behaviors/game-core.js.map +1 -0
  17. package/dist/behaviors/game-entity.d.ts +39 -0
  18. package/dist/behaviors/game-entity.js +643 -0
  19. package/dist/behaviors/game-entity.js.map +1 -0
  20. package/dist/behaviors/game-ui.d.ts +29 -0
  21. package/dist/behaviors/game-ui.js +493 -0
  22. package/dist/behaviors/game-ui.js.map +1 -0
  23. package/dist/behaviors/index.d.ts +11 -0
  24. package/dist/behaviors/index.js +4539 -0
  25. package/dist/behaviors/index.js.map +1 -0
  26. package/dist/behaviors/registry.d.ts +103 -0
  27. package/dist/behaviors/registry.js +4166 -0
  28. package/dist/behaviors/registry.js.map +1 -0
  29. package/dist/behaviors/types.d.ts +179 -0
  30. package/dist/behaviors/types.js +111 -0
  31. package/dist/behaviors/types.js.map +1 -0
  32. package/dist/behaviors/ui-interaction.d.ts +36 -0
  33. package/dist/behaviors/ui-interaction.js +1104 -0
  34. package/dist/behaviors/ui-interaction.js.map +1 -0
  35. package/dist/index.d.ts +195 -0
  36. package/dist/index.js +8209 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/modules/array.d.ts +28 -0
  39. package/dist/modules/array.js +556 -0
  40. package/dist/modules/array.js.map +1 -0
  41. package/dist/modules/async.d.ts +22 -0
  42. package/dist/modules/async.js +112 -0
  43. package/dist/modules/async.js.map +1 -0
  44. package/dist/modules/format.d.ts +21 -0
  45. package/dist/modules/format.js +129 -0
  46. package/dist/modules/format.js.map +1 -0
  47. package/dist/modules/index.d.ts +12 -0
  48. package/dist/modules/index.js +3131 -0
  49. package/dist/modules/index.js.map +1 -0
  50. package/dist/modules/math.d.ts +22 -0
  51. package/dist/modules/math.js +215 -0
  52. package/dist/modules/math.js.map +1 -0
  53. package/dist/modules/nn.d.ts +23 -0
  54. package/dist/modules/nn.js +189 -0
  55. package/dist/modules/nn.js.map +1 -0
  56. package/dist/modules/object.d.ts +22 -0
  57. package/dist/modules/object.js +257 -0
  58. package/dist/modules/object.js.map +1 -0
  59. package/dist/modules/str.d.ts +21 -0
  60. package/dist/modules/str.js +344 -0
  61. package/dist/modules/str.js.map +1 -0
  62. package/dist/modules/tensor.d.ts +23 -0
  63. package/dist/modules/tensor.js +427 -0
  64. package/dist/modules/tensor.js.map +1 -0
  65. package/dist/modules/time.d.ts +24 -0
  66. package/dist/modules/time.js +323 -0
  67. package/dist/modules/time.js.map +1 -0
  68. package/dist/modules/train.d.ts +23 -0
  69. package/dist/modules/train.js +308 -0
  70. package/dist/modules/train.js.map +1 -0
  71. package/dist/modules/validate.d.ts +23 -0
  72. package/dist/modules/validate.js +301 -0
  73. package/dist/modules/validate.js.map +1 -0
  74. package/dist/registry.d.ts +140 -0
  75. package/dist/registry.js +3240 -0
  76. package/dist/registry.js.map +1 -0
  77. package/dist/types-I95R8_FN.d.ts +91 -0
  78. package/package.json +59 -0
@@ -0,0 +1,4539 @@
1
+ // behaviors/types.ts
2
+ var BEHAVIOR_CATEGORIES = [
3
+ "ui-interaction",
4
+ // User interface state management
5
+ "data-management",
6
+ // Data operations and state
7
+ "async",
8
+ // Asynchronous workflows
9
+ "feedback",
10
+ // User feedback and confirmations
11
+ "game-core",
12
+ // Game loop and systems
13
+ "game-entity",
14
+ // Game entity behaviors
15
+ "game-ui"
16
+ // Game interface
17
+ ];
18
+ function isBehaviorCategory(value) {
19
+ return BEHAVIOR_CATEGORIES.includes(value);
20
+ }
21
+ function isGameBehaviorCategory(category) {
22
+ return category.startsWith("game-");
23
+ }
24
+ function getBehaviorMetadata(behavior) {
25
+ const sm = behavior.stateMachine;
26
+ const states = (sm?.states || []).map(
27
+ (s) => typeof s === "string" ? s : s.name
28
+ );
29
+ const events = (sm?.events || []).map(
30
+ (e) => typeof e === "string" ? e : e.key
31
+ );
32
+ return {
33
+ name: behavior.name,
34
+ category: behavior.category,
35
+ description: behavior.description || "",
36
+ suggestedFor: behavior.suggestedFor || [],
37
+ states,
38
+ events,
39
+ tickCount: behavior.ticks?.length || 0,
40
+ transitionCount: sm?.transitions?.length || 0,
41
+ hasDataEntities: (behavior.dataEntities?.length || 0) > 0
42
+ };
43
+ }
44
+ function validateBehaviorStructure(behavior) {
45
+ const errors = [];
46
+ if (!behavior.name) {
47
+ errors.push("Behavior must have a name");
48
+ }
49
+ if (!behavior.name.startsWith("std/")) {
50
+ errors.push(`Behavior name should start with 'std/' (got: ${behavior.name})`);
51
+ }
52
+ if (!behavior.category) {
53
+ errors.push("Behavior must have a category");
54
+ }
55
+ if (!isBehaviorCategory(behavior.category)) {
56
+ errors.push(`Invalid category: ${behavior.category}`);
57
+ }
58
+ const sm = behavior.stateMachine;
59
+ if (sm) {
60
+ if (!sm.states || sm.states.length === 0) {
61
+ errors.push("State machine must have at least one state");
62
+ }
63
+ if (!sm.initial) {
64
+ errors.push("State machine must have an initial state");
65
+ }
66
+ }
67
+ return errors;
68
+ }
69
+ function validateBehaviorEvents(behavior) {
70
+ const errors = [];
71
+ const sm = behavior.stateMachine;
72
+ if (!sm) return errors;
73
+ const declaredEvents = new Set(
74
+ (sm.events || []).map((e) => typeof e === "string" ? e : e.key)
75
+ );
76
+ const transitionEvents = new Set(
77
+ (sm.transitions || []).map((t) => t.event)
78
+ );
79
+ for (const event of transitionEvents) {
80
+ if (event && !declaredEvents.has(event)) {
81
+ errors.push(`Transition uses undeclared event: ${event}`);
82
+ }
83
+ }
84
+ return errors;
85
+ }
86
+ function validateBehaviorStates(behavior) {
87
+ const errors = [];
88
+ const sm = behavior.stateMachine;
89
+ if (!sm) return errors;
90
+ const declaredStates = new Set(
91
+ (sm.states || []).map((s) => typeof s === "string" ? s : s.name)
92
+ );
93
+ for (const t of sm.transitions || []) {
94
+ if (t.from && t.from !== "*") {
95
+ const fromStates = Array.isArray(t.from) ? t.from : [t.from];
96
+ for (const state of fromStates) {
97
+ if (!declaredStates.has(state)) {
98
+ errors.push(`Transition from undeclared state: ${state}`);
99
+ }
100
+ }
101
+ }
102
+ if (t.to && !declaredStates.has(t.to)) {
103
+ errors.push(`Transition to undeclared state: ${t.to}`);
104
+ }
105
+ }
106
+ return errors;
107
+ }
108
+
109
+ // behaviors/action-affinity.ts
110
+ var ACTION_AFFINITY = {
111
+ // Display components - view data and trigger navigation/editing
112
+ "entity-table": {
113
+ valid: ["VIEW", "EDIT", "DELETE", "SELECT", "SORT", "PAGE"],
114
+ invalid: ["SAVE", "CANCEL", "SUBMIT", "CREATE", "CLOSE"]
115
+ },
116
+ "entity-list": {
117
+ valid: ["VIEW", "EDIT", "DELETE", "SELECT"],
118
+ invalid: ["SAVE", "CANCEL", "SUBMIT", "CREATE", "CLOSE"]
119
+ },
120
+ "entity-cards": {
121
+ valid: ["VIEW", "EDIT", "DELETE", "SELECT"],
122
+ invalid: ["SAVE", "CANCEL", "SUBMIT", "CREATE", "CLOSE"]
123
+ },
124
+ "card-grid": {
125
+ valid: ["VIEW", "EDIT", "DELETE", "SELECT"],
126
+ invalid: ["SAVE", "CANCEL", "SUBMIT", "CREATE", "CLOSE"]
127
+ },
128
+ // Header components - page-level actions
129
+ "page-header": {
130
+ valid: ["CREATE", "REFRESH", "EXPORT", "IMPORT", "BACK", "FILTER"],
131
+ invalid: ["SAVE", "VIEW", "EDIT", "DELETE", "SUBMIT"]
132
+ },
133
+ // Form components - data entry and submission
134
+ "form": {
135
+ valid: ["SAVE", "CANCEL", "SUBMIT", "CLOSE", "RESET", "FIELD_CHANGE", "FIELD_BLUR"],
136
+ invalid: ["VIEW", "DELETE", "CREATE", "SELECT", "EDIT"]
137
+ },
138
+ "form-section": {
139
+ valid: ["FIELD_CHANGE", "FIELD_BLUR"],
140
+ invalid: ["SAVE", "VIEW", "DELETE", "CREATE", "SELECT", "EDIT"]
141
+ },
142
+ "form-actions": {
143
+ valid: ["SAVE", "CANCEL", "SUBMIT", "RESET"],
144
+ invalid: ["VIEW", "DELETE", "CREATE", "SELECT", "EDIT"]
145
+ },
146
+ // Detail components - view single entity with edit/delete options
147
+ "detail-panel": {
148
+ valid: ["EDIT", "DELETE", "CLOSE", "BACK"],
149
+ invalid: ["SAVE", "CREATE", "SELECT", "SUBMIT"]
150
+ },
151
+ "entity-detail": {
152
+ valid: ["EDIT", "DELETE", "CLOSE", "BACK"],
153
+ invalid: ["SAVE", "CREATE", "SELECT", "SUBMIT"]
154
+ },
155
+ // Container components - open/close states
156
+ "modal": {
157
+ valid: ["CLOSE", "CONFIRM", "CANCEL"],
158
+ invalid: ["VIEW", "CREATE", "EDIT", "DELETE"]
159
+ },
160
+ "modal-container": {
161
+ valid: ["CLOSE", "CONFIRM", "CANCEL"],
162
+ invalid: ["VIEW", "CREATE", "EDIT", "DELETE"]
163
+ },
164
+ "drawer": {
165
+ valid: ["CLOSE"],
166
+ invalid: ["VIEW", "CREATE", "DELETE"]
167
+ },
168
+ // Navigation components
169
+ "tabs": {
170
+ valid: ["SELECT_TAB"],
171
+ invalid: ["SAVE", "CREATE", "DELETE", "VIEW", "EDIT"]
172
+ },
173
+ "tab-bar": {
174
+ valid: ["SELECT_TAB"],
175
+ invalid: ["SAVE", "CREATE", "DELETE", "VIEW", "EDIT"]
176
+ },
177
+ "wizard-navigation": {
178
+ valid: ["NEXT", "PREV", "GO_TO", "COMPLETE"],
179
+ invalid: ["SAVE", "CREATE", "DELETE", "VIEW", "EDIT"]
180
+ },
181
+ "wizard-progress": {
182
+ valid: ["GO_TO"],
183
+ invalid: ["SAVE", "CREATE", "DELETE", "VIEW", "EDIT", "NEXT", "PREV"]
184
+ },
185
+ // Filter components
186
+ "filter-group": {
187
+ valid: ["SET_FILTER", "CLEAR_FILTER", "CLEAR_ALL"],
188
+ invalid: ["SAVE", "CREATE", "DELETE", "VIEW", "EDIT"]
189
+ },
190
+ "search-bar": {
191
+ valid: ["SEARCH", "CLEAR_SEARCH"],
192
+ invalid: ["SAVE", "CREATE", "DELETE", "VIEW", "EDIT"]
193
+ },
194
+ "search-input": {
195
+ valid: ["SEARCH", "CLEAR_SEARCH"],
196
+ invalid: ["SAVE", "CREATE", "DELETE", "VIEW", "EDIT"]
197
+ },
198
+ // Pagination components
199
+ "pagination": {
200
+ valid: ["NEXT_PAGE", "PREV_PAGE", "GO_TO_PAGE", "SET_PAGE_SIZE"],
201
+ invalid: ["SAVE", "CREATE", "DELETE", "VIEW", "EDIT"]
202
+ },
203
+ // Confirmation components
204
+ "confirm-dialog": {
205
+ valid: ["CONFIRM", "CANCEL"],
206
+ invalid: ["VIEW", "CREATE", "EDIT", "DELETE", "SAVE"]
207
+ },
208
+ // Empty/Loading states - no actions
209
+ "empty-state": {
210
+ valid: ["CREATE"],
211
+ // Often has a "Create first item" CTA
212
+ invalid: ["SAVE", "VIEW", "EDIT", "DELETE", "CANCEL"]
213
+ },
214
+ "loading-state": {
215
+ valid: [],
216
+ invalid: ["SAVE", "VIEW", "EDIT", "DELETE", "CREATE", "CANCEL"]
217
+ },
218
+ // Stats/Dashboard - view only
219
+ "stats": {
220
+ valid: [],
221
+ invalid: ["SAVE", "VIEW", "EDIT", "DELETE", "CREATE", "CANCEL"]
222
+ },
223
+ // Game components
224
+ "game-canvas": {
225
+ valid: ["INPUT", "PAUSE", "UNPAUSE"],
226
+ invalid: ["SAVE", "CREATE", "DELETE"]
227
+ },
228
+ "game-hud": {
229
+ valid: ["PAUSE"],
230
+ invalid: ["SAVE", "CREATE", "DELETE", "VIEW", "EDIT"]
231
+ },
232
+ "game-controls": {
233
+ valid: ["INPUT", "ACTION"],
234
+ invalid: ["SAVE", "CREATE", "DELETE", "VIEW", "EDIT"]
235
+ },
236
+ "game-menu": {
237
+ valid: ["START", "OPTIONS", "QUIT", "SELECT"],
238
+ invalid: ["SAVE", "CREATE", "DELETE", "VIEW", "EDIT"]
239
+ },
240
+ "game-pause-overlay": {
241
+ valid: ["RESUME", "QUIT", "OPTIONS"],
242
+ invalid: ["SAVE", "CREATE", "DELETE", "VIEW", "EDIT"]
243
+ },
244
+ "game-over-screen": {
245
+ valid: ["RETRY", "QUIT", "MAIN_MENU"],
246
+ invalid: ["SAVE", "CREATE", "DELETE", "VIEW", "EDIT"]
247
+ }
248
+ };
249
+ var UI_EVENTS = {
250
+ VIEW: {
251
+ event: "VIEW",
252
+ emittedBy: ["entity-table", "entity-list", "entity-cards", "card-grid"],
253
+ payload: { row: "object", entity: "string" },
254
+ description: "View item detail"
255
+ },
256
+ EDIT: {
257
+ event: "EDIT",
258
+ emittedBy: ["entity-table", "entity-list", "entity-cards", "detail-panel"],
259
+ payload: { row: "object", entity: "string" },
260
+ description: "Edit item"
261
+ },
262
+ DELETE: {
263
+ event: "DELETE",
264
+ emittedBy: ["entity-table", "entity-list", "entity-cards", "detail-panel"],
265
+ payload: { row: "object", entity: "string" },
266
+ description: "Delete item"
267
+ },
268
+ CREATE: {
269
+ event: "CREATE",
270
+ emittedBy: ["page-header", "empty-state"],
271
+ payload: { entity: "string" },
272
+ description: "Create new item"
273
+ },
274
+ SAVE: {
275
+ event: "SAVE",
276
+ emittedBy: ["form", "form-actions"],
277
+ payload: { data: "object", entity: "string" },
278
+ description: "Save form data"
279
+ },
280
+ CANCEL: {
281
+ event: "CANCEL",
282
+ emittedBy: ["form", "form-actions", "modal", "confirm-dialog"],
283
+ payload: {},
284
+ description: "Cancel form/modal"
285
+ },
286
+ CLOSE: {
287
+ event: "CLOSE",
288
+ emittedBy: ["modal", "drawer", "detail-panel"],
289
+ payload: {},
290
+ description: "Close modal/drawer"
291
+ },
292
+ SELECT: {
293
+ event: "SELECT",
294
+ emittedBy: ["entity-table", "entity-list", "entity-cards"],
295
+ payload: { selectedIds: "string[]" },
296
+ description: "Selection change"
297
+ },
298
+ SEARCH: {
299
+ event: "SEARCH",
300
+ emittedBy: ["search-bar", "search-input"],
301
+ payload: { searchTerm: "string" },
302
+ description: "Search filter"
303
+ },
304
+ CONFIRM: {
305
+ event: "CONFIRM",
306
+ emittedBy: ["modal", "confirm-dialog"],
307
+ payload: {},
308
+ description: "Confirm action"
309
+ },
310
+ SELECT_TAB: {
311
+ event: "SELECT_TAB",
312
+ emittedBy: ["tabs", "tab-bar"],
313
+ payload: { tabId: "string" },
314
+ description: "Tab selection"
315
+ },
316
+ NEXT: {
317
+ event: "NEXT",
318
+ emittedBy: ["wizard-navigation"],
319
+ payload: {},
320
+ description: "Wizard next step"
321
+ },
322
+ PREV: {
323
+ event: "PREV",
324
+ emittedBy: ["wizard-navigation"],
325
+ payload: {},
326
+ description: "Wizard previous step"
327
+ }
328
+ };
329
+ function isActionValidForComponent(action, component) {
330
+ const affinity = ACTION_AFFINITY[component];
331
+ if (!affinity) {
332
+ return true;
333
+ }
334
+ return affinity.valid.includes(action) || !affinity.invalid.includes(action);
335
+ }
336
+ function isActionInvalidForComponent(action, component) {
337
+ const affinity = ACTION_AFFINITY[component];
338
+ if (!affinity) {
339
+ return false;
340
+ }
341
+ return affinity.invalid.includes(action);
342
+ }
343
+ function getValidActionsForComponent(component) {
344
+ const affinity = ACTION_AFFINITY[component];
345
+ return affinity?.valid ?? [];
346
+ }
347
+ function getInvalidActionsForComponent(component) {
348
+ const affinity = ACTION_AFFINITY[component];
349
+ return affinity?.invalid ?? [];
350
+ }
351
+ function getComponentsForEvent(event) {
352
+ return UI_EVENTS[event]?.emittedBy ?? [];
353
+ }
354
+ function validateActionsForComponent(actions, component) {
355
+ const errors = [];
356
+ const affinity = ACTION_AFFINITY[component];
357
+ if (!affinity) {
358
+ return errors;
359
+ }
360
+ for (const action of actions) {
361
+ if (action.event && affinity.invalid.includes(action.event)) {
362
+ errors.push(
363
+ `Action "${action.event}" is not valid on "${component}". Valid actions: ${affinity.valid.join(", ")}`
364
+ );
365
+ }
366
+ }
367
+ return errors;
368
+ }
369
+ function getAllKnownComponents() {
370
+ return Object.keys(ACTION_AFFINITY);
371
+ }
372
+ function getComponentsByCategory() {
373
+ return {
374
+ display: ["entity-table", "entity-list", "entity-cards", "card-grid"],
375
+ header: ["page-header"],
376
+ form: ["form", "form-section", "form-actions"],
377
+ detail: ["detail-panel", "entity-detail"],
378
+ container: ["modal", "modal-container", "drawer"],
379
+ navigation: ["tabs", "tab-bar", "wizard-navigation", "wizard-progress"],
380
+ filter: ["filter-group", "search-bar", "search-input"],
381
+ pagination: ["pagination"],
382
+ confirmation: ["confirm-dialog"],
383
+ state: ["empty-state", "loading-state"],
384
+ dashboard: ["stats"],
385
+ game: [
386
+ "game-canvas",
387
+ "game-hud",
388
+ "game-controls",
389
+ "game-menu",
390
+ "game-pause-overlay",
391
+ "game-over-screen"
392
+ ]
393
+ };
394
+ }
395
+
396
+ // behaviors/ui-interaction.ts
397
+ var LIST_BEHAVIOR = {
398
+ name: "std/List",
399
+ category: "ui-interaction",
400
+ description: "Entity list management with CRUD operations",
401
+ suggestedFor: [
402
+ "Entity listing pages",
403
+ "Admin panels",
404
+ "Data management screens",
405
+ "Table views with inline actions"
406
+ ],
407
+ dataEntities: [
408
+ {
409
+ name: "ListState",
410
+ runtime: true,
411
+ singleton: true,
412
+ fields: [
413
+ { name: "selectedId", type: "string", default: null }
414
+ ]
415
+ }
416
+ ],
417
+ stateMachine: {
418
+ initial: "Browsing",
419
+ states: [
420
+ { name: "Browsing", isInitial: true },
421
+ { name: "Creating" },
422
+ { name: "Viewing" },
423
+ { name: "Editing" },
424
+ { name: "Deleting" }
425
+ ],
426
+ events: [
427
+ { key: "INIT" },
428
+ { key: "CREATE" },
429
+ { key: "VIEW" },
430
+ { key: "EDIT" },
431
+ { key: "DELETE" },
432
+ { key: "CONFIRM_DELETE" },
433
+ { key: "CANCEL" },
434
+ { key: "SAVE" }
435
+ ],
436
+ transitions: [
437
+ // INIT: Self-loop on Browsing that renders the list UI
438
+ {
439
+ from: "Browsing",
440
+ to: "Browsing",
441
+ event: "INIT",
442
+ effects: [
443
+ ["render-ui", "main", {
444
+ type: "page-header",
445
+ title: "@config.title",
446
+ actions: [{ label: "Create", event: "CREATE", variant: "primary" }]
447
+ }],
448
+ ["render-ui", "main", {
449
+ type: "entity-table",
450
+ entity: "@config.entity",
451
+ columns: "@config.columns",
452
+ itemActions: [
453
+ { label: "View", event: "VIEW", placement: "row" },
454
+ { label: "Edit", event: "EDIT", placement: "row" },
455
+ { label: "Delete", event: "DELETE", variant: "danger", placement: "row" }
456
+ ]
457
+ }]
458
+ ]
459
+ },
460
+ {
461
+ from: "Browsing",
462
+ to: "Creating",
463
+ event: "CREATE",
464
+ effects: [
465
+ ["render-ui", "modal", {
466
+ type: "form-section",
467
+ entity: "@config.entity",
468
+ mode: "create",
469
+ submitEvent: "SAVE",
470
+ cancelEvent: "CANCEL"
471
+ }]
472
+ ]
473
+ },
474
+ {
475
+ from: "Browsing",
476
+ to: "Viewing",
477
+ event: "VIEW",
478
+ effects: [
479
+ ["set", "@entity.selectedId", "@payload.id"],
480
+ ["render-ui", "drawer", {
481
+ type: "entity-detail",
482
+ entity: "@config.entity",
483
+ id: "@payload.id",
484
+ actions: [
485
+ { label: "Edit", event: "EDIT" },
486
+ { label: "Close", event: "CANCEL" }
487
+ ]
488
+ }]
489
+ ]
490
+ },
491
+ {
492
+ from: "Browsing",
493
+ to: "Editing",
494
+ event: "EDIT",
495
+ effects: [
496
+ ["set", "@entity.selectedId", "@payload.id"],
497
+ ["render-ui", "drawer", {
498
+ type: "form-section",
499
+ entity: "@config.entity",
500
+ id: "@payload.id",
501
+ mode: "edit",
502
+ submitEvent: "SAVE",
503
+ cancelEvent: "CANCEL"
504
+ }]
505
+ ]
506
+ },
507
+ {
508
+ from: "Viewing",
509
+ to: "Editing",
510
+ event: "EDIT",
511
+ effects: [
512
+ ["render-ui", "drawer", {
513
+ type: "form-section",
514
+ entity: "@config.entity",
515
+ id: "@entity.selectedId",
516
+ mode: "edit",
517
+ submitEvent: "SAVE",
518
+ cancelEvent: "CANCEL"
519
+ }]
520
+ ]
521
+ },
522
+ {
523
+ from: "Browsing",
524
+ to: "Deleting",
525
+ event: "DELETE",
526
+ effects: [
527
+ ["set", "@entity.selectedId", "@payload.id"],
528
+ ["render-ui", "modal", {
529
+ type: "confirmation",
530
+ title: "Delete Confirmation",
531
+ message: "Are you sure you want to delete this item?",
532
+ confirmLabel: "Delete",
533
+ confirmVariant: "danger"
534
+ }]
535
+ ]
536
+ },
537
+ {
538
+ from: "Creating",
539
+ to: "Browsing",
540
+ event: "SAVE",
541
+ effects: [
542
+ ["persist", "create", "@config.entity", "@payload.data"],
543
+ ["render-ui", "modal", null],
544
+ ["notify", { type: "success", message: "Created successfully" }],
545
+ ["emit", "INIT"]
546
+ ]
547
+ },
548
+ {
549
+ from: "Editing",
550
+ to: "Browsing",
551
+ event: "SAVE",
552
+ effects: [
553
+ ["persist", "update", "@config.entity", "@payload.data"],
554
+ ["render-ui", "drawer", null],
555
+ ["notify", { type: "success", message: "Updated successfully" }],
556
+ ["emit", "INIT"]
557
+ ]
558
+ },
559
+ {
560
+ from: "Deleting",
561
+ to: "Browsing",
562
+ event: "CONFIRM_DELETE",
563
+ effects: [
564
+ ["persist", "delete", "@config.entity", "@entity.selectedId"],
565
+ ["render-ui", "modal", null],
566
+ ["notify", { type: "success", message: "Deleted successfully" }],
567
+ ["emit", "INIT"]
568
+ ]
569
+ },
570
+ {
571
+ from: "Creating",
572
+ to: "Browsing",
573
+ event: "CANCEL",
574
+ effects: [
575
+ ["render-ui", "modal", null]
576
+ ]
577
+ },
578
+ {
579
+ from: "Viewing",
580
+ to: "Browsing",
581
+ event: "CANCEL",
582
+ effects: [
583
+ ["render-ui", "drawer", null]
584
+ ]
585
+ },
586
+ {
587
+ from: "Editing",
588
+ to: "Browsing",
589
+ event: "CANCEL",
590
+ effects: [
591
+ ["render-ui", "drawer", null]
592
+ ]
593
+ },
594
+ {
595
+ from: "Deleting",
596
+ to: "Browsing",
597
+ event: "CANCEL",
598
+ effects: [
599
+ ["render-ui", "modal", null]
600
+ ]
601
+ }
602
+ ]
603
+ },
604
+ configSchema: {
605
+ required: [
606
+ { name: "entity", type: "entity", description: "Entity type to list" },
607
+ { name: "columns", type: "array", description: "Fields to display as columns" }
608
+ ],
609
+ optional: [
610
+ { name: "title", type: "string", description: "Page title", default: "" },
611
+ { name: "display", type: "string", description: "Display mode", default: "table", enum: ["table", "cards", "list"] },
612
+ { name: "actions", type: "action[]", description: "Available actions", default: ["view", "edit", "delete"] },
613
+ { name: "createInModal", type: "boolean", description: "Show create form in modal", default: true },
614
+ { name: "editInDrawer", type: "boolean", description: "Show edit form in drawer", default: true }
615
+ ]
616
+ }
617
+ };
618
+ var DETAIL_BEHAVIOR = {
619
+ name: "std/Detail",
620
+ category: "ui-interaction",
621
+ description: "Single entity view with edit/delete capabilities",
622
+ suggestedFor: [
623
+ "Entity detail pages",
624
+ "Profile views",
625
+ "Settings pages",
626
+ "Single record screens"
627
+ ],
628
+ dataEntities: [
629
+ {
630
+ name: "DetailState",
631
+ runtime: true,
632
+ fields: [
633
+ { name: "entityId", type: "string", default: null },
634
+ { name: "isLoading", type: "boolean", default: false },
635
+ { name: "hasChanges", type: "boolean", default: false }
636
+ ]
637
+ }
638
+ ],
639
+ stateMachine: {
640
+ initial: "Viewing",
641
+ states: [
642
+ { name: "Viewing", isInitial: true },
643
+ { name: "Editing" },
644
+ { name: "Deleting" }
645
+ ],
646
+ events: [
647
+ { key: "INIT" },
648
+ { key: "EDIT" },
649
+ { key: "SAVE" },
650
+ { key: "CANCEL" },
651
+ { key: "DELETE" },
652
+ { key: "CONFIRM_DELETE" }
653
+ ],
654
+ transitions: [
655
+ // INIT: Self-loop on Viewing
656
+ {
657
+ from: "Viewing",
658
+ to: "Viewing",
659
+ event: "INIT",
660
+ effects: [
661
+ ["render-ui", "main", {
662
+ type: "page-header",
663
+ title: "@entity.name",
664
+ actions: [
665
+ { label: "Edit", event: "EDIT" },
666
+ { label: "Delete", event: "DELETE", variant: "danger" }
667
+ ]
668
+ }],
669
+ ["render-ui", "main", {
670
+ type: "entity-detail",
671
+ entity: "@config.entity",
672
+ fieldNames: "@config.fields"
673
+ }]
674
+ ]
675
+ },
676
+ {
677
+ from: "Viewing",
678
+ to: "Editing",
679
+ event: "EDIT",
680
+ effects: [
681
+ ["render-ui", "main", {
682
+ type: "form-section",
683
+ entity: "@config.entity",
684
+ mode: "edit",
685
+ fields: "@config.fields",
686
+ submitEvent: "SAVE",
687
+ cancelEvent: "CANCEL"
688
+ }]
689
+ ]
690
+ },
691
+ {
692
+ from: "Editing",
693
+ to: "Viewing",
694
+ event: "SAVE",
695
+ effects: [
696
+ ["persist", "update", "@config.entity", "@payload.data"],
697
+ ["notify", { type: "success", message: "Updated successfully" }],
698
+ ["emit", "INIT"]
699
+ ]
700
+ },
701
+ {
702
+ from: "Editing",
703
+ to: "Viewing",
704
+ event: "CANCEL",
705
+ effects: [
706
+ ["emit", "INIT"]
707
+ ]
708
+ },
709
+ {
710
+ from: "Viewing",
711
+ to: "Deleting",
712
+ event: "DELETE",
713
+ effects: [
714
+ ["render-ui", "modal", {
715
+ type: "confirmation",
716
+ title: "Delete Confirmation",
717
+ message: "Are you sure you want to delete this item?"
718
+ }]
719
+ ]
720
+ },
721
+ {
722
+ from: "Deleting",
723
+ to: "Viewing",
724
+ event: "CONFIRM_DELETE",
725
+ effects: [
726
+ ["persist", "delete", "@config.entity", "@entity.id"],
727
+ ["navigate", "@config.returnUrl"]
728
+ ]
729
+ },
730
+ {
731
+ from: "Deleting",
732
+ to: "Viewing",
733
+ event: "CANCEL",
734
+ effects: [
735
+ ["render-ui", "modal", null]
736
+ ]
737
+ }
738
+ ]
739
+ },
740
+ configSchema: {
741
+ required: [
742
+ { name: "entity", type: "entity", description: "Entity type" },
743
+ { name: "fields", type: "array", description: "Fields to display" }
744
+ ],
745
+ optional: [
746
+ { name: "layout", type: "string", description: "Layout mode", default: "two-column", enum: ["single-column", "two-column", "grid"] },
747
+ { name: "allowEdit", type: "boolean", description: "Allow editing", default: true },
748
+ { name: "allowDelete", type: "boolean", description: "Allow deletion", default: true }
749
+ ]
750
+ }
751
+ };
752
+ var FORM_BEHAVIOR = {
753
+ name: "std/Form",
754
+ category: "ui-interaction",
755
+ description: "Form state management with validation and submission",
756
+ suggestedFor: [
757
+ "Create/edit forms",
758
+ "Settings forms",
759
+ "Multi-field input",
760
+ "Validated data entry"
761
+ ],
762
+ dataEntities: [
763
+ {
764
+ name: "FormState",
765
+ runtime: true,
766
+ fields: [
767
+ { name: "values", type: "object", default: {} },
768
+ { name: "errors", type: "object", default: {} },
769
+ { name: "touched", type: "object", default: {} },
770
+ { name: "isDirty", type: "boolean", default: false },
771
+ { name: "isSubmitting", type: "boolean", default: false }
772
+ ]
773
+ }
774
+ ],
775
+ stateMachine: {
776
+ initial: "Idle",
777
+ states: [
778
+ { name: "Idle", isInitial: true },
779
+ { name: "Editing" },
780
+ { name: "Validating" },
781
+ { name: "Submitting" },
782
+ { name: "Success" },
783
+ { name: "Error" }
784
+ ],
785
+ events: [
786
+ { key: "INIT" },
787
+ { key: "FIELD_CHANGE" },
788
+ { key: "FIELD_BLUR" },
789
+ { key: "SUBMIT" },
790
+ { key: "VALIDATION_PASSED" },
791
+ { key: "VALIDATION_FAILED" },
792
+ { key: "SUBMIT_SUCCESS" },
793
+ { key: "SUBMIT_ERROR" },
794
+ { key: "RESET" }
795
+ ],
796
+ transitions: [
797
+ // INIT: Self-loop on Idle → Editing
798
+ {
799
+ from: "Idle",
800
+ to: "Editing",
801
+ event: "INIT",
802
+ effects: [
803
+ ["render-ui", "main", {
804
+ type: "form-section",
805
+ entity: "@config.entity",
806
+ fields: "@config.fields",
807
+ values: "@entity.values",
808
+ errors: "@entity.errors",
809
+ submitEvent: "SUBMIT",
810
+ cancelEvent: "@config.cancelEvent"
811
+ }]
812
+ ]
813
+ },
814
+ {
815
+ from: "Editing",
816
+ to: "Editing",
817
+ event: "FIELD_CHANGE",
818
+ effects: [
819
+ ["set", "@entity.values", ["object/set", "@entity.values", "@payload.field", "@payload.value"]],
820
+ ["set", "@entity.isDirty", true]
821
+ ]
822
+ },
823
+ {
824
+ from: "Editing",
825
+ to: "Editing",
826
+ event: "FIELD_BLUR",
827
+ effects: [
828
+ ["set", "@entity.touched", ["object/set", "@entity.touched", "@payload.field", true]]
829
+ ]
830
+ },
831
+ {
832
+ from: "Editing",
833
+ to: "Validating",
834
+ event: "SUBMIT",
835
+ effects: [
836
+ [
837
+ "let",
838
+ [["result", ["validate/check", "@entity.values", "@config.validation"]]],
839
+ [
840
+ "if",
841
+ "@result.valid",
842
+ ["emit", "VALIDATION_PASSED"],
843
+ [
844
+ "do",
845
+ ["set", "@entity.errors", "@result.errors"],
846
+ ["emit", "VALIDATION_FAILED"]
847
+ ]
848
+ ]
849
+ ]
850
+ ]
851
+ },
852
+ {
853
+ from: "Validating",
854
+ to: "Submitting",
855
+ event: "VALIDATION_PASSED",
856
+ effects: [
857
+ ["set", "@entity.isSubmitting", true],
858
+ [
859
+ "if",
860
+ ["=", "@config.mode", "create"],
861
+ ["persist", "create", "@config.entity", "@entity.values"],
862
+ ["persist", "update", "@config.entity", "@entity.values"]
863
+ ]
864
+ ]
865
+ },
866
+ {
867
+ from: "Validating",
868
+ to: "Editing",
869
+ event: "VALIDATION_FAILED",
870
+ effects: [
871
+ ["notify", { type: "error", message: "Please fix the validation errors" }]
872
+ ]
873
+ },
874
+ {
875
+ from: "Submitting",
876
+ to: "Success",
877
+ event: "SUBMIT_SUCCESS",
878
+ effects: [
879
+ ["set", "@entity.isSubmitting", false],
880
+ ["notify", { type: "success", message: "Saved successfully" }],
881
+ ["emit", "@config.submitEvent", { data: "@entity.values" }]
882
+ ]
883
+ },
884
+ {
885
+ from: "Submitting",
886
+ to: "Error",
887
+ event: "SUBMIT_ERROR",
888
+ effects: [
889
+ ["set", "@entity.isSubmitting", false],
890
+ ["set", "@entity.errors", { _form: "@payload.error" }],
891
+ ["notify", { type: "error", message: "@payload.error" }]
892
+ ]
893
+ },
894
+ {
895
+ from: "Editing",
896
+ to: "Idle",
897
+ event: "RESET",
898
+ effects: [
899
+ ["set", "@entity.values", {}],
900
+ ["set", "@entity.errors", {}],
901
+ ["set", "@entity.touched", {}],
902
+ ["set", "@entity.isDirty", false]
903
+ ]
904
+ },
905
+ {
906
+ from: "Error",
907
+ to: "Idle",
908
+ event: "RESET",
909
+ effects: [
910
+ ["set", "@entity.values", {}],
911
+ ["set", "@entity.errors", {}],
912
+ ["set", "@entity.touched", {}],
913
+ ["set", "@entity.isDirty", false]
914
+ ]
915
+ }
916
+ ]
917
+ },
918
+ configSchema: {
919
+ required: [
920
+ { name: "entity", type: "entity", description: "Entity type" },
921
+ { name: "fields", type: "array", description: "Form fields" }
922
+ ],
923
+ optional: [
924
+ { name: "mode", type: "string", description: "Form mode", default: "create", enum: ["create", "edit"] },
925
+ { name: "validation", type: "object", description: "Validation rules", default: {} },
926
+ { name: "submitEvent", type: "event", description: "Event to emit on successful submit", default: "SAVE" },
927
+ { name: "cancelEvent", type: "event", description: "Event to emit on cancel", default: "CANCEL" }
928
+ ]
929
+ }
930
+ };
931
+ var MODAL_BEHAVIOR = {
932
+ name: "std/Modal",
933
+ category: "ui-interaction",
934
+ description: "Modal dialog with open/close state management",
935
+ suggestedFor: [
936
+ "Confirmation dialogs",
937
+ "Create forms",
938
+ "Detail views",
939
+ "Any overlay content"
940
+ ],
941
+ dataEntities: [
942
+ {
943
+ name: "ModalState",
944
+ runtime: true,
945
+ fields: [
946
+ { name: "content", type: "object", default: null }
947
+ ]
948
+ }
949
+ ],
950
+ stateMachine: {
951
+ initial: "Closed",
952
+ states: [
953
+ { name: "Closed", isInitial: true },
954
+ { name: "Open" }
955
+ ],
956
+ events: [
957
+ { key: "OPEN" },
958
+ { key: "CLOSE" },
959
+ { key: "CONFIRM" }
960
+ ],
961
+ transitions: [
962
+ {
963
+ from: "Closed",
964
+ to: "Open",
965
+ event: "OPEN",
966
+ effects: [
967
+ ["set", "@entity.content", "@payload.content"],
968
+ ["render-ui", "modal", {
969
+ type: "@payload.type",
970
+ onClose: "CLOSE"
971
+ }]
972
+ ]
973
+ },
974
+ {
975
+ from: "Open",
976
+ to: "Closed",
977
+ event: "CLOSE",
978
+ effects: [
979
+ ["render-ui", "modal", null]
980
+ ]
981
+ },
982
+ {
983
+ from: "Open",
984
+ to: "Closed",
985
+ event: "CONFIRM",
986
+ effects: [
987
+ ["render-ui", "modal", null]
988
+ ]
989
+ }
990
+ ]
991
+ },
992
+ configSchema: {
993
+ required: [],
994
+ optional: [
995
+ { name: "size", type: "string", description: "Modal size", default: "md", enum: ["sm", "md", "lg", "xl", "full"] },
996
+ { name: "closeOnOverlay", type: "boolean", description: "Close on overlay click", default: true },
997
+ { name: "closeOnEscape", type: "boolean", description: "Close on escape key", default: true }
998
+ ]
999
+ }
1000
+ };
1001
+ var DRAWER_BEHAVIOR = {
1002
+ name: "std/Drawer",
1003
+ category: "ui-interaction",
1004
+ description: "Side drawer panel for detail views and forms",
1005
+ suggestedFor: [
1006
+ "Detail panels",
1007
+ "Edit forms",
1008
+ "Property panels",
1009
+ "Side navigation"
1010
+ ],
1011
+ dataEntities: [
1012
+ {
1013
+ name: "DrawerState",
1014
+ runtime: true,
1015
+ fields: [
1016
+ { name: "content", type: "object", default: null }
1017
+ ]
1018
+ }
1019
+ ],
1020
+ stateMachine: {
1021
+ initial: "Closed",
1022
+ states: [
1023
+ { name: "Closed", isInitial: true },
1024
+ { name: "Open" }
1025
+ ],
1026
+ events: [
1027
+ { key: "OPEN" },
1028
+ { key: "CLOSE" }
1029
+ ],
1030
+ transitions: [
1031
+ {
1032
+ from: "Closed",
1033
+ to: "Open",
1034
+ event: "OPEN",
1035
+ effects: [
1036
+ ["set", "@entity.content", "@payload.content"],
1037
+ ["render-ui", "drawer", {
1038
+ type: "@payload.type",
1039
+ onClose: "CLOSE"
1040
+ }]
1041
+ ]
1042
+ },
1043
+ {
1044
+ from: "Open",
1045
+ to: "Closed",
1046
+ event: "CLOSE",
1047
+ effects: [
1048
+ ["render-ui", "drawer", null]
1049
+ ]
1050
+ }
1051
+ ]
1052
+ },
1053
+ configSchema: {
1054
+ required: [],
1055
+ optional: [
1056
+ { name: "position", type: "string", description: "Drawer position", default: "right", enum: ["left", "right"] },
1057
+ { name: "size", type: "string", description: "Drawer size", default: "md", enum: ["sm", "md", "lg"] },
1058
+ { name: "overlay", type: "boolean", description: "Show overlay", default: true }
1059
+ ]
1060
+ }
1061
+ };
1062
+ var TABS_BEHAVIOR = {
1063
+ name: "std/Tabs",
1064
+ category: "ui-interaction",
1065
+ description: "Tabbed navigation within a page",
1066
+ suggestedFor: [
1067
+ "Multi-view pages",
1068
+ "Settings with sections",
1069
+ "Dashboard tabs",
1070
+ "Profile sections"
1071
+ ],
1072
+ dataEntities: [
1073
+ {
1074
+ name: "TabsState",
1075
+ runtime: true,
1076
+ singleton: true,
1077
+ fields: [
1078
+ { name: "activeTab", type: "string", default: null }
1079
+ ]
1080
+ }
1081
+ ],
1082
+ stateMachine: {
1083
+ initial: "Active",
1084
+ states: [
1085
+ { name: "Active", isInitial: true }
1086
+ ],
1087
+ events: [
1088
+ { key: "INIT" },
1089
+ { key: "SELECT_TAB" }
1090
+ ],
1091
+ transitions: [
1092
+ // INIT: Self-loop on Active
1093
+ {
1094
+ from: "Active",
1095
+ to: "Active",
1096
+ event: "INIT",
1097
+ effects: [
1098
+ ["set", "@entity.activeTab", "@config.defaultTab"],
1099
+ ["render-ui", "main", {
1100
+ type: "filter-group",
1101
+ filterType: "tabs",
1102
+ tabs: "@config.tabs",
1103
+ active: "@entity.activeTab",
1104
+ onSelect: "SELECT_TAB"
1105
+ }]
1106
+ ]
1107
+ },
1108
+ {
1109
+ from: "Active",
1110
+ to: "Active",
1111
+ event: "SELECT_TAB",
1112
+ effects: [
1113
+ ["set", "@entity.activeTab", "@payload.tabId"]
1114
+ ]
1115
+ }
1116
+ ]
1117
+ },
1118
+ configSchema: {
1119
+ required: [
1120
+ { name: "tabs", type: "array", description: "Tab definitions with id, label, content" }
1121
+ ],
1122
+ optional: [
1123
+ { name: "defaultTab", type: "string", description: "Default active tab ID" }
1124
+ ]
1125
+ }
1126
+ };
1127
+ var WIZARD_BEHAVIOR = {
1128
+ name: "std/Wizard",
1129
+ category: "ui-interaction",
1130
+ description: "Multi-step wizard flow - each step is a state",
1131
+ suggestedFor: [
1132
+ "Onboarding flows",
1133
+ "Multi-step forms",
1134
+ "Setup wizards",
1135
+ "Checkout flows"
1136
+ ],
1137
+ dataEntities: [
1138
+ {
1139
+ name: "WizardState",
1140
+ runtime: true,
1141
+ singleton: true,
1142
+ fields: [
1143
+ { name: "stepData", type: "object", default: {} }
1144
+ ]
1145
+ }
1146
+ ],
1147
+ // IMPORTANT: Each wizard step is a STATE, not a number index
1148
+ // This is the correct pattern for wizards
1149
+ stateMachine: {
1150
+ initial: "Step1",
1151
+ states: [
1152
+ { name: "Step1", isInitial: true },
1153
+ { name: "Step2" },
1154
+ { name: "Step3" },
1155
+ { name: "Complete" }
1156
+ ],
1157
+ events: [
1158
+ { key: "INIT" },
1159
+ { key: "NEXT" },
1160
+ { key: "PREV" },
1161
+ { key: "COMPLETE" }
1162
+ ],
1163
+ transitions: [
1164
+ // INIT on Step1: Self-loop that renders step 1
1165
+ {
1166
+ from: "Step1",
1167
+ to: "Step1",
1168
+ event: "INIT",
1169
+ effects: [
1170
+ ["render-ui", "main", {
1171
+ type: "wizard-progress",
1172
+ steps: ["Step 1", "Step 2", "Step 3"],
1173
+ current: 0
1174
+ }],
1175
+ ["render-ui", "main", {
1176
+ type: "form-section",
1177
+ entity: "@config.entity",
1178
+ fields: "@config.step1Fields",
1179
+ submitEvent: "NEXT"
1180
+ }]
1181
+ ]
1182
+ },
1183
+ // Step1 → Step2
1184
+ {
1185
+ from: "Step1",
1186
+ to: "Step2",
1187
+ event: "NEXT",
1188
+ effects: [
1189
+ ["set", "@entity.stepData.step1", "@payload"],
1190
+ ["render-ui", "main", {
1191
+ type: "wizard-progress",
1192
+ steps: ["Step 1", "Step 2", "Step 3"],
1193
+ current: 1
1194
+ }],
1195
+ ["render-ui", "main", {
1196
+ type: "form-section",
1197
+ entity: "@config.entity",
1198
+ fields: "@config.step2Fields",
1199
+ submitEvent: "NEXT",
1200
+ cancelEvent: "PREV"
1201
+ }]
1202
+ ]
1203
+ },
1204
+ // Step2 → Step1 (back)
1205
+ {
1206
+ from: "Step2",
1207
+ to: "Step1",
1208
+ event: "PREV",
1209
+ effects: [
1210
+ ["emit", "INIT"]
1211
+ ]
1212
+ },
1213
+ // Step2 → Step3
1214
+ {
1215
+ from: "Step2",
1216
+ to: "Step3",
1217
+ event: "NEXT",
1218
+ effects: [
1219
+ ["set", "@entity.stepData.step2", "@payload"],
1220
+ ["render-ui", "main", {
1221
+ type: "wizard-progress",
1222
+ steps: ["Step 1", "Step 2", "Step 3"],
1223
+ current: 2
1224
+ }],
1225
+ ["render-ui", "main", {
1226
+ type: "entity-detail",
1227
+ entity: "@config.entity",
1228
+ fieldNames: ["step1", "step2"],
1229
+ title: "Review"
1230
+ }],
1231
+ ["render-ui", "main", {
1232
+ type: "form-section",
1233
+ submitLabel: "Complete",
1234
+ cancelLabel: "Back",
1235
+ submitEvent: "COMPLETE",
1236
+ cancelEvent: "PREV"
1237
+ }]
1238
+ ]
1239
+ },
1240
+ // Step3 → Step2 (back)
1241
+ {
1242
+ from: "Step3",
1243
+ to: "Step2",
1244
+ event: "PREV",
1245
+ effects: [
1246
+ ["render-ui", "main", {
1247
+ type: "wizard-progress",
1248
+ steps: ["Step 1", "Step 2", "Step 3"],
1249
+ current: 1
1250
+ }],
1251
+ ["render-ui", "main", {
1252
+ type: "form-section",
1253
+ entity: "@config.entity",
1254
+ fields: "@config.step2Fields",
1255
+ submitEvent: "NEXT",
1256
+ cancelEvent: "PREV"
1257
+ }]
1258
+ ]
1259
+ },
1260
+ // Step3 → Complete
1261
+ {
1262
+ from: "Step3",
1263
+ to: "Complete",
1264
+ event: "COMPLETE",
1265
+ effects: [
1266
+ ["persist", "create", "@config.entity", "@entity.stepData"],
1267
+ ["notify", { type: "success", message: "Wizard completed!" }],
1268
+ ["navigate", "@config.completionUrl"]
1269
+ ]
1270
+ }
1271
+ ]
1272
+ },
1273
+ configSchema: {
1274
+ required: [
1275
+ { name: "entity", type: "entity", description: "Entity to create" },
1276
+ { name: "step1Fields", type: "array", description: "Fields for step 1" },
1277
+ { name: "step2Fields", type: "array", description: "Fields for step 2" }
1278
+ ],
1279
+ optional: [
1280
+ { name: "completionUrl", type: "string", description: "URL to navigate on completion", default: "/" }
1281
+ ]
1282
+ }
1283
+ };
1284
+ var MASTER_DETAIL_BEHAVIOR = {
1285
+ name: "std/MasterDetail",
1286
+ category: "ui-interaction",
1287
+ description: "Master-detail layout with synchronized list and detail views",
1288
+ suggestedFor: [
1289
+ "Email clients",
1290
+ "File managers",
1291
+ "Two-panel layouts",
1292
+ "List-detail views"
1293
+ ],
1294
+ dataEntities: [
1295
+ {
1296
+ name: "MasterDetailState",
1297
+ runtime: true,
1298
+ singleton: true,
1299
+ fields: [
1300
+ { name: "selectedId", type: "string", default: null }
1301
+ ]
1302
+ }
1303
+ ],
1304
+ stateMachine: {
1305
+ initial: "NoSelection",
1306
+ states: [
1307
+ { name: "NoSelection", isInitial: true },
1308
+ { name: "Selected" }
1309
+ ],
1310
+ events: [
1311
+ { key: "INIT" },
1312
+ { key: "SELECT" },
1313
+ { key: "DESELECT" }
1314
+ ],
1315
+ transitions: [
1316
+ // INIT: Self-loop on NoSelection
1317
+ {
1318
+ from: "NoSelection",
1319
+ to: "NoSelection",
1320
+ event: "INIT",
1321
+ effects: [
1322
+ ["render-ui", "main", {
1323
+ type: "master-detail",
1324
+ entity: "@config.entity",
1325
+ masterColumns: "@config.masterColumns",
1326
+ onSelect: "SELECT",
1327
+ selected: "@entity.selectedId"
1328
+ }],
1329
+ ["render-ui", "main", {
1330
+ type: "empty-state",
1331
+ message: "Select an item to view details"
1332
+ }]
1333
+ ]
1334
+ },
1335
+ {
1336
+ from: "NoSelection",
1337
+ to: "Selected",
1338
+ event: "SELECT",
1339
+ effects: [
1340
+ ["set", "@entity.selectedId", "@payload.id"],
1341
+ ["render-ui", "main", {
1342
+ type: "entity-detail",
1343
+ entity: "@config.entity",
1344
+ id: "@payload.id",
1345
+ fieldNames: "@config.detailFields"
1346
+ }]
1347
+ ]
1348
+ },
1349
+ {
1350
+ from: "Selected",
1351
+ to: "Selected",
1352
+ event: "SELECT",
1353
+ effects: [
1354
+ ["set", "@entity.selectedId", "@payload.id"],
1355
+ ["render-ui", "main", {
1356
+ type: "entity-detail",
1357
+ entity: "@config.entity",
1358
+ id: "@payload.id",
1359
+ fieldNames: "@config.detailFields"
1360
+ }]
1361
+ ]
1362
+ },
1363
+ {
1364
+ from: "Selected",
1365
+ to: "NoSelection",
1366
+ event: "DESELECT",
1367
+ effects: [
1368
+ ["set", "@entity.selectedId", null],
1369
+ ["render-ui", "main", {
1370
+ type: "empty-state",
1371
+ message: "Select an item to view details"
1372
+ }]
1373
+ ]
1374
+ }
1375
+ ]
1376
+ },
1377
+ configSchema: {
1378
+ required: [
1379
+ { name: "entity", type: "entity", description: "Entity type" },
1380
+ { name: "masterColumns", type: "array", description: "Columns for master list" },
1381
+ { name: "detailFields", type: "array", description: "Fields for detail panel" }
1382
+ ],
1383
+ optional: [
1384
+ { name: "masterWidth", type: "string", description: "Master panel width", default: "350px" }
1385
+ ]
1386
+ }
1387
+ };
1388
+ var FILTER_BEHAVIOR = {
1389
+ name: "std/Filter",
1390
+ category: "ui-interaction",
1391
+ description: "Filter and search management for lists",
1392
+ suggestedFor: [
1393
+ "Filtered lists",
1394
+ "Search interfaces",
1395
+ "Faceted navigation",
1396
+ "Advanced filtering"
1397
+ ],
1398
+ dataEntities: [
1399
+ {
1400
+ name: "FilterState",
1401
+ runtime: true,
1402
+ singleton: true,
1403
+ fields: [
1404
+ { name: "filters", type: "object", default: {} },
1405
+ { name: "searchTerm", type: "string", default: "" }
1406
+ ]
1407
+ }
1408
+ ],
1409
+ stateMachine: {
1410
+ initial: "Idle",
1411
+ states: [
1412
+ { name: "Idle", isInitial: true },
1413
+ { name: "Filtering" }
1414
+ ],
1415
+ events: [
1416
+ { key: "INIT" },
1417
+ { key: "SET_FILTER" },
1418
+ { key: "CLEAR_FILTERS" },
1419
+ { key: "SEARCH" }
1420
+ ],
1421
+ transitions: [
1422
+ // INIT: Self-loop
1423
+ {
1424
+ from: "Idle",
1425
+ to: "Idle",
1426
+ event: "INIT",
1427
+ effects: [
1428
+ ["render-ui", "main", {
1429
+ type: "filter-group",
1430
+ filters: "@config.filters",
1431
+ values: "@entity.filters",
1432
+ onFilterChange: "SET_FILTER",
1433
+ onClear: "CLEAR_FILTERS"
1434
+ }]
1435
+ ]
1436
+ },
1437
+ {
1438
+ from: "Idle",
1439
+ to: "Filtering",
1440
+ event: "SET_FILTER",
1441
+ effects: [
1442
+ ["set", "@entity.filters", ["object/set", "@entity.filters", "@payload.field", "@payload.value"]],
1443
+ ["emit", "FILTER_CHANGED", "@entity.filters"]
1444
+ ]
1445
+ },
1446
+ {
1447
+ from: "Filtering",
1448
+ to: "Idle",
1449
+ event: "SET_FILTER",
1450
+ effects: [
1451
+ ["set", "@entity.filters", ["object/set", "@entity.filters", "@payload.field", "@payload.value"]],
1452
+ ["emit", "FILTER_CHANGED", "@entity.filters"]
1453
+ ]
1454
+ },
1455
+ {
1456
+ from: "Filtering",
1457
+ to: "Idle",
1458
+ event: "CLEAR_FILTERS",
1459
+ effects: [
1460
+ ["set", "@entity.filters", {}],
1461
+ ["set", "@entity.searchTerm", ""],
1462
+ ["emit", "FILTER_CHANGED", {}]
1463
+ ]
1464
+ },
1465
+ {
1466
+ from: "Idle",
1467
+ to: "Filtering",
1468
+ event: "SEARCH",
1469
+ effects: [
1470
+ ["set", "@entity.searchTerm", "@payload.term"],
1471
+ ["emit", "SEARCH_CHANGED", "@payload.term"]
1472
+ ]
1473
+ }
1474
+ ]
1475
+ },
1476
+ configSchema: {
1477
+ required: [
1478
+ { name: "filters", type: "array", description: "Filter definitions" }
1479
+ ],
1480
+ optional: [
1481
+ { name: "searchable", type: "boolean", description: "Enable search", default: true }
1482
+ ]
1483
+ }
1484
+ };
1485
+ var UI_INTERACTION_BEHAVIORS = [
1486
+ LIST_BEHAVIOR,
1487
+ DETAIL_BEHAVIOR,
1488
+ FORM_BEHAVIOR,
1489
+ MODAL_BEHAVIOR,
1490
+ DRAWER_BEHAVIOR,
1491
+ TABS_BEHAVIOR,
1492
+ WIZARD_BEHAVIOR,
1493
+ MASTER_DETAIL_BEHAVIOR,
1494
+ FILTER_BEHAVIOR
1495
+ ];
1496
+
1497
+ // behaviors/data-management.ts
1498
+ var PAGINATION_BEHAVIOR = {
1499
+ name: "std/Pagination",
1500
+ category: "data-management",
1501
+ description: "Page-based navigation for large data sets",
1502
+ suggestedFor: [
1503
+ "Large lists",
1504
+ "Table pagination",
1505
+ "Infinite scroll alternative",
1506
+ "Data-heavy views"
1507
+ ],
1508
+ dataEntities: [
1509
+ {
1510
+ name: "PaginationState",
1511
+ runtime: true,
1512
+ singleton: true,
1513
+ fields: [
1514
+ { name: "page", type: "number", default: 1 },
1515
+ { name: "pageSize", type: "number", default: 20 },
1516
+ { name: "totalItems", type: "number", default: 0 }
1517
+ ]
1518
+ }
1519
+ ],
1520
+ stateMachine: {
1521
+ initial: "Active",
1522
+ states: [
1523
+ { name: "Active", isInitial: true }
1524
+ ],
1525
+ events: [
1526
+ { key: "INIT" },
1527
+ { key: "NEXT_PAGE" },
1528
+ { key: "PREV_PAGE" },
1529
+ { key: "GO_TO_PAGE" },
1530
+ { key: "SET_PAGE_SIZE" }
1531
+ ],
1532
+ transitions: [
1533
+ {
1534
+ from: "*",
1535
+ event: "INIT",
1536
+ effects: [
1537
+ ["set", "@entity.page", 1],
1538
+ ["set", "@entity.pageSize", "@config.defaultPageSize"]
1539
+ ]
1540
+ },
1541
+ {
1542
+ event: "NEXT_PAGE",
1543
+ guard: ["<", "@entity.page", ["math/ceil", ["/", "@entity.totalItems", "@entity.pageSize"]]],
1544
+ effects: [
1545
+ ["set", "@entity.page", ["+", "@entity.page", 1]]
1546
+ ]
1547
+ },
1548
+ {
1549
+ event: "PREV_PAGE",
1550
+ guard: [">", "@entity.page", 1],
1551
+ effects: [
1552
+ ["set", "@entity.page", ["-", "@entity.page", 1]]
1553
+ ]
1554
+ },
1555
+ {
1556
+ event: "GO_TO_PAGE",
1557
+ guard: [
1558
+ "and",
1559
+ [">=", "@payload.page", 1],
1560
+ ["<=", "@payload.page", ["math/ceil", ["/", "@entity.totalItems", "@entity.pageSize"]]]
1561
+ ],
1562
+ effects: [
1563
+ ["set", "@entity.page", "@payload.page"]
1564
+ ]
1565
+ },
1566
+ {
1567
+ event: "SET_PAGE_SIZE",
1568
+ effects: [
1569
+ ["set", "@entity.pageSize", "@payload.size"],
1570
+ ["set", "@entity.page", 1]
1571
+ ]
1572
+ }
1573
+ ]
1574
+ },
1575
+ configSchema: {
1576
+ required: [],
1577
+ optional: [
1578
+ { name: "defaultPageSize", type: "number", description: "Default items per page", default: 20 },
1579
+ { name: "pageSizeOptions", type: "array", description: "Available page sizes", default: [10, 20, 50, 100] }
1580
+ ]
1581
+ }
1582
+ };
1583
+ var SELECTION_BEHAVIOR = {
1584
+ name: "std/Selection",
1585
+ category: "data-management",
1586
+ description: "Single or multi-selection management",
1587
+ suggestedFor: [
1588
+ "Multi-select lists",
1589
+ "Bulk operations",
1590
+ "Item picking",
1591
+ "Checkboxes in tables"
1592
+ ],
1593
+ dataEntities: [
1594
+ {
1595
+ name: "SelectionState",
1596
+ runtime: true,
1597
+ singleton: true,
1598
+ fields: [
1599
+ { name: "selected", type: "array", default: [] },
1600
+ { name: "lastSelected", type: "string", default: null }
1601
+ ]
1602
+ }
1603
+ ],
1604
+ stateMachine: {
1605
+ initial: "Active",
1606
+ states: [
1607
+ { name: "Active", isInitial: true }
1608
+ ],
1609
+ events: [
1610
+ { key: "INIT" },
1611
+ { key: "SELECT" },
1612
+ { key: "DESELECT" },
1613
+ { key: "TOGGLE" },
1614
+ { key: "SELECT_ALL" },
1615
+ { key: "CLEAR" }
1616
+ ],
1617
+ transitions: [
1618
+ {
1619
+ from: "*",
1620
+ event: "INIT",
1621
+ effects: [
1622
+ ["set", "@entity.selected", []],
1623
+ ["set", "@entity.lastSelected", null]
1624
+ ]
1625
+ },
1626
+ {
1627
+ event: "SELECT",
1628
+ effects: [
1629
+ [
1630
+ "if",
1631
+ ["=", "@config.mode", "single"],
1632
+ [
1633
+ "do",
1634
+ ["set", "@entity.selected", ["@payload.id"]],
1635
+ ["set", "@entity.lastSelected", "@payload.id"]
1636
+ ],
1637
+ [
1638
+ "if",
1639
+ [
1640
+ "or",
1641
+ ["not", "@config.maxSelection"],
1642
+ ["<", ["array/len", "@entity.selected"], "@config.maxSelection"]
1643
+ ],
1644
+ [
1645
+ "do",
1646
+ ["set", "@entity.selected", ["array/append", "@entity.selected", "@payload.id"]],
1647
+ ["set", "@entity.lastSelected", "@payload.id"]
1648
+ ],
1649
+ ["notify", { type: "warning", message: "Maximum selection reached" }]
1650
+ ]
1651
+ ]
1652
+ ]
1653
+ },
1654
+ {
1655
+ event: "DESELECT",
1656
+ effects: [
1657
+ ["set", "@entity.selected", ["array/filter", "@entity.selected", ["fn", "id", ["!=", "@id", "@payload.id"]]]]
1658
+ ]
1659
+ },
1660
+ {
1661
+ event: "TOGGLE",
1662
+ effects: [
1663
+ [
1664
+ "if",
1665
+ ["array/includes", "@entity.selected", "@payload.id"],
1666
+ ["set", "@entity.selected", ["array/filter", "@entity.selected", ["fn", "id", ["!=", "@id", "@payload.id"]]]],
1667
+ [
1668
+ "if",
1669
+ ["or", ["=", "@config.mode", "single"], [
1670
+ "or",
1671
+ ["not", "@config.maxSelection"],
1672
+ ["<", ["array/len", "@entity.selected"], "@config.maxSelection"]
1673
+ ]],
1674
+ [
1675
+ "set",
1676
+ "@entity.selected",
1677
+ [
1678
+ "if",
1679
+ ["=", "@config.mode", "single"],
1680
+ ["@payload.id"],
1681
+ ["array/append", "@entity.selected", "@payload.id"]
1682
+ ]
1683
+ ],
1684
+ ["notify", { type: "warning", message: "Maximum selection reached" }]
1685
+ ]
1686
+ ]
1687
+ ]
1688
+ },
1689
+ {
1690
+ event: "SELECT_ALL",
1691
+ guard: ["=", "@config.mode", "multi"],
1692
+ effects: [
1693
+ ["set", "@entity.selected", "@payload.ids"]
1694
+ ]
1695
+ },
1696
+ {
1697
+ event: "CLEAR",
1698
+ effects: [
1699
+ ["set", "@entity.selected", []],
1700
+ ["set", "@entity.lastSelected", null]
1701
+ ]
1702
+ }
1703
+ ]
1704
+ },
1705
+ configSchema: {
1706
+ required: [],
1707
+ optional: [
1708
+ { name: "mode", type: "string", description: "Selection mode", default: "single", enum: ["single", "multi"] },
1709
+ { name: "maxSelection", type: "number", description: "Maximum selections (multi mode)", default: null }
1710
+ ]
1711
+ }
1712
+ };
1713
+ var SORT_BEHAVIOR = {
1714
+ name: "std/Sort",
1715
+ category: "data-management",
1716
+ description: "Sorting by field with direction toggle",
1717
+ suggestedFor: [
1718
+ "Sortable tables",
1719
+ "List ordering",
1720
+ "Column headers"
1721
+ ],
1722
+ dataEntities: [
1723
+ {
1724
+ name: "SortState",
1725
+ runtime: true,
1726
+ singleton: true,
1727
+ fields: [
1728
+ { name: "sortField", type: "string", default: null },
1729
+ { name: "sortDirection", type: "string", default: "asc" }
1730
+ ]
1731
+ }
1732
+ ],
1733
+ stateMachine: {
1734
+ initial: "Active",
1735
+ states: [
1736
+ { name: "Active", isInitial: true }
1737
+ ],
1738
+ events: [
1739
+ { key: "INIT" },
1740
+ { key: "SORT" },
1741
+ { key: "TOGGLE_DIRECTION" },
1742
+ { key: "CLEAR_SORT" }
1743
+ ],
1744
+ transitions: [
1745
+ {
1746
+ from: "*",
1747
+ event: "INIT",
1748
+ effects: [
1749
+ ["set", "@entity.sortField", "@config.defaultField"],
1750
+ ["set", "@entity.sortDirection", "@config.defaultDirection"]
1751
+ ]
1752
+ },
1753
+ {
1754
+ event: "SORT",
1755
+ effects: [
1756
+ [
1757
+ "if",
1758
+ ["=", "@entity.sortField", "@payload.field"],
1759
+ ["set", "@entity.sortDirection", ["if", ["=", "@entity.sortDirection", "asc"], "desc", "asc"]],
1760
+ [
1761
+ "do",
1762
+ ["set", "@entity.sortField", "@payload.field"],
1763
+ ["set", "@entity.sortDirection", "asc"]
1764
+ ]
1765
+ ]
1766
+ ]
1767
+ },
1768
+ {
1769
+ event: "TOGGLE_DIRECTION",
1770
+ guard: ["!=", "@entity.sortField", null],
1771
+ effects: [
1772
+ ["set", "@entity.sortDirection", ["if", ["=", "@entity.sortDirection", "asc"], "desc", "asc"]]
1773
+ ]
1774
+ },
1775
+ {
1776
+ event: "CLEAR_SORT",
1777
+ effects: [
1778
+ ["set", "@entity.sortField", null],
1779
+ ["set", "@entity.sortDirection", "asc"]
1780
+ ]
1781
+ }
1782
+ ]
1783
+ },
1784
+ configSchema: {
1785
+ required: [],
1786
+ optional: [
1787
+ { name: "defaultField", type: "string", description: "Default sort field" },
1788
+ { name: "defaultDirection", type: "string", description: "Default direction", default: "asc", enum: ["asc", "desc"] }
1789
+ ]
1790
+ }
1791
+ };
1792
+ var FILTER_BEHAVIOR2 = {
1793
+ name: "std/Filter",
1794
+ category: "data-management",
1795
+ description: "Query Singleton pattern for explicit filtering - use with entity-table query prop",
1796
+ suggestedFor: [
1797
+ "Filterable lists",
1798
+ "Advanced search",
1799
+ "Filter panels",
1800
+ "Faceted search",
1801
+ "Entity tables with filters"
1802
+ ],
1803
+ dataEntities: [
1804
+ {
1805
+ name: "QueryState",
1806
+ runtime: true,
1807
+ singleton: true,
1808
+ fields: [
1809
+ { name: "status", type: "string", default: null, description: "Filter by status field" },
1810
+ { name: "priority", type: "string", default: null, description: "Filter by priority field" },
1811
+ { name: "search", type: "string", default: "", description: "Search term" },
1812
+ { name: "sortBy", type: "string", default: "createdAt", description: "Sort field" },
1813
+ { name: "sortOrder", type: "string", default: "desc", description: "Sort direction: asc or desc" }
1814
+ ]
1815
+ }
1816
+ ],
1817
+ stateMachine: {
1818
+ initial: "Active",
1819
+ states: [
1820
+ { name: "Active", isInitial: true }
1821
+ ],
1822
+ events: [
1823
+ { key: "INIT" },
1824
+ { key: "FILTER" },
1825
+ { key: "SEARCH" },
1826
+ { key: "SORT" },
1827
+ { key: "CLEAR_FILTERS" }
1828
+ ],
1829
+ transitions: [
1830
+ {
1831
+ from: "*",
1832
+ event: "INIT",
1833
+ effects: [
1834
+ // Render filter UI with query reference
1835
+ ["render-ui", "sidebar", {
1836
+ type: "filter-group",
1837
+ query: "@QueryState",
1838
+ filters: "@config.filters"
1839
+ }],
1840
+ // Render entity table with query reference
1841
+ ["render-ui", "main", {
1842
+ type: "entity-table",
1843
+ entity: "@config.entity",
1844
+ query: "@QueryState",
1845
+ columns: "@config.columns"
1846
+ }]
1847
+ ]
1848
+ },
1849
+ {
1850
+ event: "FILTER",
1851
+ effects: [
1852
+ ["set", "@QueryState.status", "@payload.status"],
1853
+ ["set", "@QueryState.priority", "@payload.priority"]
1854
+ ]
1855
+ },
1856
+ {
1857
+ event: "SEARCH",
1858
+ effects: [
1859
+ ["set", "@QueryState.search", "@payload.searchTerm"]
1860
+ ]
1861
+ },
1862
+ {
1863
+ event: "SORT",
1864
+ effects: [
1865
+ ["set", "@QueryState.sortBy", "@payload.field"],
1866
+ ["set", "@QueryState.sortOrder", "@payload.order"]
1867
+ ]
1868
+ },
1869
+ {
1870
+ event: "CLEAR_FILTERS",
1871
+ effects: [
1872
+ ["set", "@QueryState.status", null],
1873
+ ["set", "@QueryState.priority", null],
1874
+ ["set", "@QueryState.search", ""]
1875
+ ]
1876
+ }
1877
+ ]
1878
+ },
1879
+ configSchema: {
1880
+ required: [
1881
+ { name: "entity", type: "string", description: "Entity to filter" }
1882
+ ],
1883
+ optional: [
1884
+ { name: "filters", type: "array", description: "Filter field definitions", default: [] },
1885
+ { name: "columns", type: "array", description: "Table columns to display", default: [] }
1886
+ ]
1887
+ }
1888
+ };
1889
+ var SEARCH_BEHAVIOR = {
1890
+ name: "std/Search",
1891
+ category: "data-management",
1892
+ description: "Search with debounce - updates QueryState.search field",
1893
+ suggestedFor: [
1894
+ "Search inputs",
1895
+ "Quick filters",
1896
+ "Global search",
1897
+ "Type-ahead"
1898
+ ],
1899
+ dataEntities: [
1900
+ {
1901
+ name: "SearchState",
1902
+ runtime: true,
1903
+ singleton: true,
1904
+ fields: [
1905
+ { name: "search", type: "string", default: "" },
1906
+ { name: "isSearching", type: "boolean", default: false }
1907
+ ]
1908
+ }
1909
+ ],
1910
+ stateMachine: {
1911
+ initial: "Idle",
1912
+ states: [
1913
+ { name: "Idle", isInitial: true },
1914
+ { name: "Searching" }
1915
+ ],
1916
+ events: [
1917
+ { key: "INIT" },
1918
+ { key: "SEARCH" },
1919
+ { key: "CLEAR_SEARCH" },
1920
+ { key: "SEARCH_COMPLETE" }
1921
+ ],
1922
+ transitions: [
1923
+ {
1924
+ from: "*",
1925
+ event: "INIT",
1926
+ effects: [
1927
+ ["set", "@entity.search", ""],
1928
+ ["set", "@entity.isSearching", false],
1929
+ ["render-ui", "main", {
1930
+ type: "search-bar",
1931
+ query: "@SearchState",
1932
+ placeholder: "@config.placeholder"
1933
+ }]
1934
+ ]
1935
+ },
1936
+ {
1937
+ from: "Idle",
1938
+ to: "Searching",
1939
+ event: "SEARCH",
1940
+ guard: [">=", ["str/len", "@payload.term"], "@config.minLength"],
1941
+ effects: [
1942
+ ["set", "@entity.search", "@payload.term"],
1943
+ ["set", "@entity.isSearching", true],
1944
+ ["async/debounce", "@config.debounceMs", ["emit", "SEARCH_COMPLETE"]]
1945
+ ]
1946
+ },
1947
+ {
1948
+ from: "Idle",
1949
+ event: "SEARCH",
1950
+ guard: ["<", ["str/len", "@payload.term"], "@config.minLength"],
1951
+ effects: [
1952
+ ["set", "@entity.search", "@payload.term"]
1953
+ ]
1954
+ },
1955
+ {
1956
+ from: "Searching",
1957
+ to: "Idle",
1958
+ event: "SEARCH_COMPLETE",
1959
+ effects: [
1960
+ ["set", "@entity.isSearching", false]
1961
+ ]
1962
+ },
1963
+ {
1964
+ event: "CLEAR_SEARCH",
1965
+ effects: [
1966
+ ["set", "@entity.search", ""],
1967
+ ["set", "@entity.isSearching", false]
1968
+ ]
1969
+ }
1970
+ ]
1971
+ },
1972
+ configSchema: {
1973
+ required: [],
1974
+ optional: [
1975
+ { name: "debounceMs", type: "number", description: "Debounce delay in ms", default: 300 },
1976
+ { name: "minLength", type: "number", description: "Minimum search length", default: 1 },
1977
+ { name: "placeholder", type: "string", description: "Input placeholder", default: "Search..." }
1978
+ ]
1979
+ }
1980
+ };
1981
+ var DATA_MANAGEMENT_BEHAVIORS = [
1982
+ PAGINATION_BEHAVIOR,
1983
+ SELECTION_BEHAVIOR,
1984
+ SORT_BEHAVIOR,
1985
+ FILTER_BEHAVIOR2,
1986
+ SEARCH_BEHAVIOR
1987
+ ];
1988
+
1989
+ // behaviors/async.ts
1990
+ var LOADING_BEHAVIOR = {
1991
+ name: "std/Loading",
1992
+ category: "async",
1993
+ description: "Loading state management with success/error handling",
1994
+ suggestedFor: [
1995
+ "Async data loading",
1996
+ "API calls",
1997
+ "Resource fetching",
1998
+ "Initial page load"
1999
+ ],
2000
+ dataEntities: [
2001
+ {
2002
+ name: "LoadingState",
2003
+ runtime: true,
2004
+ singleton: true,
2005
+ fields: [
2006
+ { name: "isLoading", type: "boolean", default: false },
2007
+ { name: "error", type: "object", default: null },
2008
+ { name: "data", type: "object", default: null },
2009
+ { name: "startTime", type: "number", default: null }
2010
+ ]
2011
+ }
2012
+ ],
2013
+ stateMachine: {
2014
+ initial: "Idle",
2015
+ states: [
2016
+ { name: "Idle", isInitial: true },
2017
+ { name: "Loading" },
2018
+ { name: "Success" },
2019
+ { name: "Error" }
2020
+ ],
2021
+ events: [
2022
+ { key: "START" },
2023
+ { key: "SUCCESS" },
2024
+ { key: "ERROR" },
2025
+ { key: "RETRY" },
2026
+ { key: "RESET" }
2027
+ ],
2028
+ transitions: [
2029
+ {
2030
+ from: "Idle",
2031
+ to: "Loading",
2032
+ event: "START",
2033
+ effects: [
2034
+ ["set", "@entity.isLoading", true],
2035
+ ["set", "@entity.error", null],
2036
+ ["set", "@entity.startTime", ["time/now"]],
2037
+ ["render", "content", "loading-state", {}]
2038
+ ]
2039
+ },
2040
+ {
2041
+ from: "Loading",
2042
+ to: "Success",
2043
+ event: "SUCCESS",
2044
+ effects: [
2045
+ ["set", "@entity.isLoading", false],
2046
+ ["set", "@entity.data", "@payload.data"]
2047
+ ]
2048
+ },
2049
+ {
2050
+ from: "Loading",
2051
+ to: "Error",
2052
+ event: "ERROR",
2053
+ effects: [
2054
+ ["set", "@entity.isLoading", false],
2055
+ ["set", "@entity.error", "@payload.error"],
2056
+ ["render", "content", "error-state", {
2057
+ error: "@entity.error",
2058
+ onRetry: "RETRY"
2059
+ }]
2060
+ ]
2061
+ },
2062
+ {
2063
+ from: "Error",
2064
+ to: "Loading",
2065
+ event: "RETRY",
2066
+ effects: [
2067
+ ["set", "@entity.isLoading", true],
2068
+ ["set", "@entity.error", null],
2069
+ ["set", "@entity.startTime", ["time/now"]],
2070
+ ["render", "content", "loading-state", {}]
2071
+ ]
2072
+ },
2073
+ {
2074
+ from: ["Success", "Error"],
2075
+ to: "Idle",
2076
+ event: "RESET",
2077
+ effects: [
2078
+ ["set", "@entity.isLoading", false],
2079
+ ["set", "@entity.error", null],
2080
+ ["set", "@entity.data", null]
2081
+ ]
2082
+ }
2083
+ ]
2084
+ },
2085
+ configSchema: {
2086
+ required: [],
2087
+ optional: [
2088
+ { name: "showLoadingAfterMs", type: "number", description: "Delay before showing loading", default: 200 },
2089
+ { name: "minLoadingMs", type: "number", description: "Minimum loading display time", default: 500 }
2090
+ ]
2091
+ }
2092
+ };
2093
+ var FETCH_BEHAVIOR = {
2094
+ name: "std/Fetch",
2095
+ category: "async",
2096
+ description: "Data fetching with caching and refresh capabilities",
2097
+ suggestedFor: [
2098
+ "API data fetching",
2099
+ "Entity loading",
2100
+ "Remote data",
2101
+ "Cached queries"
2102
+ ],
2103
+ dataEntities: [
2104
+ {
2105
+ name: "FetchState",
2106
+ runtime: true,
2107
+ singleton: true,
2108
+ fields: [
2109
+ { name: "data", type: "object", default: null },
2110
+ { name: "error", type: "object", default: null },
2111
+ { name: "isFetching", type: "boolean", default: false },
2112
+ { name: "lastFetchedAt", type: "number", default: null }
2113
+ ]
2114
+ }
2115
+ ],
2116
+ stateMachine: {
2117
+ initial: "Idle",
2118
+ states: [
2119
+ { name: "Idle", isInitial: true },
2120
+ { name: "Fetching" },
2121
+ { name: "Stale" },
2122
+ { name: "Fresh" },
2123
+ { name: "Error" }
2124
+ ],
2125
+ events: [
2126
+ { key: "FETCH" },
2127
+ { key: "FETCH_SUCCESS" },
2128
+ { key: "FETCH_ERROR" },
2129
+ { key: "REFRESH" },
2130
+ { key: "INVALIDATE" }
2131
+ ],
2132
+ transitions: [
2133
+ {
2134
+ from: ["Idle", "Stale"],
2135
+ to: "Fetching",
2136
+ event: "FETCH",
2137
+ effects: [
2138
+ ["set", "@entity.isFetching", true],
2139
+ ["set", "@entity.error", null]
2140
+ ]
2141
+ },
2142
+ {
2143
+ from: "Fetching",
2144
+ to: "Fresh",
2145
+ event: "FETCH_SUCCESS",
2146
+ effects: [
2147
+ ["set", "@entity.isFetching", false],
2148
+ ["set", "@entity.data", "@payload.data"],
2149
+ ["set", "@entity.lastFetchedAt", ["time/now"]]
2150
+ ]
2151
+ },
2152
+ {
2153
+ from: "Fetching",
2154
+ to: "Error",
2155
+ event: "FETCH_ERROR",
2156
+ effects: [
2157
+ ["set", "@entity.isFetching", false],
2158
+ ["set", "@entity.error", "@payload.error"]
2159
+ ]
2160
+ },
2161
+ {
2162
+ from: "Fresh",
2163
+ to: "Stale",
2164
+ event: "INVALIDATE",
2165
+ effects: [
2166
+ ["set", "@entity.lastFetchedAt", null]
2167
+ ]
2168
+ },
2169
+ {
2170
+ from: ["Fresh", "Stale", "Error"],
2171
+ to: "Fetching",
2172
+ event: "REFRESH",
2173
+ effects: [
2174
+ ["set", "@entity.isFetching", true],
2175
+ ["set", "@entity.error", null]
2176
+ ]
2177
+ }
2178
+ ]
2179
+ },
2180
+ configSchema: {
2181
+ required: [
2182
+ { name: "entity", type: "entity", description: "Entity type to fetch" }
2183
+ ],
2184
+ optional: [
2185
+ { name: "staleTimeMs", type: "number", description: "Time until data is stale", default: 6e4 },
2186
+ { name: "cacheKey", type: "string", description: "Cache key for deduplication" }
2187
+ ]
2188
+ }
2189
+ };
2190
+ var SUBMIT_BEHAVIOR = {
2191
+ name: "std/Submit",
2192
+ category: "async",
2193
+ description: "Async submission with retry capabilities",
2194
+ suggestedFor: [
2195
+ "Form submission",
2196
+ "Data saving",
2197
+ "API mutations",
2198
+ "Actions with confirmation"
2199
+ ],
2200
+ dataEntities: [
2201
+ {
2202
+ name: "SubmitState",
2203
+ runtime: true,
2204
+ singleton: true,
2205
+ fields: [
2206
+ { name: "isSubmitting", type: "boolean", default: false },
2207
+ { name: "error", type: "object", default: null },
2208
+ { name: "lastSubmittedData", type: "object", default: null }
2209
+ ]
2210
+ }
2211
+ ],
2212
+ stateMachine: {
2213
+ initial: "Idle",
2214
+ states: [
2215
+ { name: "Idle", isInitial: true },
2216
+ { name: "Submitting" },
2217
+ { name: "Success" },
2218
+ { name: "Error" }
2219
+ ],
2220
+ events: [
2221
+ { key: "SUBMIT" },
2222
+ { key: "SUBMIT_SUCCESS" },
2223
+ { key: "SUBMIT_ERROR" },
2224
+ { key: "RETRY" },
2225
+ { key: "RESET" }
2226
+ ],
2227
+ transitions: [
2228
+ {
2229
+ from: "Idle",
2230
+ to: "Submitting",
2231
+ event: "SUBMIT",
2232
+ effects: [
2233
+ ["set", "@entity.isSubmitting", true],
2234
+ ["set", "@entity.error", null],
2235
+ ["set", "@entity.lastSubmittedData", "@payload.data"]
2236
+ ]
2237
+ },
2238
+ {
2239
+ from: "Submitting",
2240
+ to: "Success",
2241
+ event: "SUBMIT_SUCCESS",
2242
+ effects: [
2243
+ ["set", "@entity.isSubmitting", false],
2244
+ ["notify", { type: "success", message: "@config.successMessage" }],
2245
+ ["when", "@config.resetOnSuccess", ["emit", "RESET"]]
2246
+ ]
2247
+ },
2248
+ {
2249
+ from: "Submitting",
2250
+ to: "Error",
2251
+ event: "SUBMIT_ERROR",
2252
+ effects: [
2253
+ ["set", "@entity.isSubmitting", false],
2254
+ ["set", "@entity.error", "@payload.error"],
2255
+ ["notify", { type: "error", message: "@config.errorMessage" }]
2256
+ ]
2257
+ },
2258
+ {
2259
+ from: "Error",
2260
+ to: "Submitting",
2261
+ event: "RETRY",
2262
+ effects: [
2263
+ ["set", "@entity.isSubmitting", true],
2264
+ ["set", "@entity.error", null]
2265
+ ]
2266
+ },
2267
+ {
2268
+ from: ["Success", "Error"],
2269
+ to: "Idle",
2270
+ event: "RESET",
2271
+ effects: [
2272
+ ["set", "@entity.isSubmitting", false],
2273
+ ["set", "@entity.error", null],
2274
+ ["set", "@entity.lastSubmittedData", null]
2275
+ ]
2276
+ }
2277
+ ]
2278
+ },
2279
+ configSchema: {
2280
+ required: [],
2281
+ optional: [
2282
+ { name: "successMessage", type: "string", description: "Success notification", default: "Saved successfully" },
2283
+ { name: "errorMessage", type: "string", description: "Error notification", default: "Failed to save" },
2284
+ { name: "resetOnSuccess", type: "boolean", description: "Reset to idle on success", default: false }
2285
+ ]
2286
+ }
2287
+ };
2288
+ var RETRY_BEHAVIOR = {
2289
+ name: "std/Retry",
2290
+ category: "async",
2291
+ description: "Automatic retry with exponential backoff",
2292
+ suggestedFor: [
2293
+ "Network requests",
2294
+ "Unreliable operations",
2295
+ "Transient failures",
2296
+ "Recovery logic"
2297
+ ],
2298
+ dataEntities: [
2299
+ {
2300
+ name: "RetryState",
2301
+ runtime: true,
2302
+ singleton: true,
2303
+ fields: [
2304
+ { name: "attempt", type: "number", default: 0 },
2305
+ { name: "error", type: "object", default: null },
2306
+ { name: "nextRetryAt", type: "number", default: null }
2307
+ ]
2308
+ }
2309
+ ],
2310
+ stateMachine: {
2311
+ initial: "Idle",
2312
+ states: [
2313
+ { name: "Idle", isInitial: true },
2314
+ { name: "Attempting" },
2315
+ { name: "Waiting" },
2316
+ { name: "Success" },
2317
+ { name: "Failed" }
2318
+ ],
2319
+ events: [
2320
+ { key: "START" },
2321
+ { key: "ATTEMPT_SUCCESS" },
2322
+ { key: "ATTEMPT_ERROR" },
2323
+ { key: "RETRY_TICK" },
2324
+ { key: "GIVE_UP" },
2325
+ { key: "RESET" }
2326
+ ],
2327
+ transitions: [
2328
+ {
2329
+ from: "Idle",
2330
+ to: "Attempting",
2331
+ event: "START",
2332
+ effects: [
2333
+ ["set", "@entity.attempt", 1],
2334
+ ["set", "@entity.error", null]
2335
+ ]
2336
+ },
2337
+ {
2338
+ from: "Attempting",
2339
+ to: "Success",
2340
+ event: "ATTEMPT_SUCCESS",
2341
+ effects: []
2342
+ },
2343
+ {
2344
+ from: "Attempting",
2345
+ to: "Waiting",
2346
+ event: "ATTEMPT_ERROR",
2347
+ guard: ["<", "@entity.attempt", "@config.maxAttempts"],
2348
+ effects: [
2349
+ ["set", "@entity.error", "@payload.error"],
2350
+ [
2351
+ "let",
2352
+ [["delay", [
2353
+ "math/min",
2354
+ ["*", "@config.initialDelayMs", ["math/pow", "@config.backoffMultiplier", "@entity.attempt"]],
2355
+ "@config.maxDelayMs"
2356
+ ]]],
2357
+ ["set", "@entity.nextRetryAt", ["+", ["time/now"], "@delay"]],
2358
+ ["async/delay", "@delay", ["emit", "RETRY_TICK"]]
2359
+ ]
2360
+ ]
2361
+ },
2362
+ {
2363
+ from: "Attempting",
2364
+ to: "Failed",
2365
+ event: "ATTEMPT_ERROR",
2366
+ guard: [">=", "@entity.attempt", "@config.maxAttempts"],
2367
+ effects: [
2368
+ ["set", "@entity.error", "@payload.error"],
2369
+ ["notify", { type: "error", message: "All retry attempts failed" }]
2370
+ ]
2371
+ },
2372
+ {
2373
+ from: "Waiting",
2374
+ to: "Attempting",
2375
+ event: "RETRY_TICK",
2376
+ effects: [
2377
+ ["set", "@entity.attempt", ["+", "@entity.attempt", 1]]
2378
+ ]
2379
+ },
2380
+ {
2381
+ from: "Waiting",
2382
+ to: "Failed",
2383
+ event: "GIVE_UP",
2384
+ effects: [
2385
+ ["notify", { type: "warning", message: "Retry cancelled" }]
2386
+ ]
2387
+ },
2388
+ {
2389
+ from: ["Success", "Failed"],
2390
+ to: "Idle",
2391
+ event: "RESET",
2392
+ effects: [
2393
+ ["set", "@entity.attempt", 0],
2394
+ ["set", "@entity.error", null],
2395
+ ["set", "@entity.nextRetryAt", null]
2396
+ ]
2397
+ }
2398
+ ]
2399
+ },
2400
+ configSchema: {
2401
+ required: [],
2402
+ optional: [
2403
+ { name: "maxAttempts", type: "number", description: "Maximum retry attempts", default: 3 },
2404
+ { name: "initialDelayMs", type: "number", description: "Initial retry delay", default: 1e3 },
2405
+ { name: "maxDelayMs", type: "number", description: "Maximum retry delay", default: 3e4 },
2406
+ { name: "backoffMultiplier", type: "number", description: "Backoff multiplier", default: 2 }
2407
+ ]
2408
+ }
2409
+ };
2410
+ var POLL_BEHAVIOR = {
2411
+ name: "std/Poll",
2412
+ category: "async",
2413
+ description: "Periodic polling with start/stop control",
2414
+ suggestedFor: [
2415
+ "Real-time updates",
2416
+ "Status checking",
2417
+ "Live data",
2418
+ "Notification polling"
2419
+ ],
2420
+ dataEntities: [
2421
+ {
2422
+ name: "PollState",
2423
+ runtime: true,
2424
+ singleton: true,
2425
+ fields: [
2426
+ { name: "isPolling", type: "boolean", default: false },
2427
+ { name: "pollCount", type: "number", default: 0 },
2428
+ { name: "lastPollAt", type: "number", default: null },
2429
+ { name: "error", type: "object", default: null }
2430
+ ]
2431
+ }
2432
+ ],
2433
+ stateMachine: {
2434
+ initial: "Stopped",
2435
+ states: [
2436
+ { name: "Stopped", isInitial: true },
2437
+ { name: "Polling" },
2438
+ { name: "Paused" }
2439
+ ],
2440
+ events: [
2441
+ { key: "START" },
2442
+ { key: "STOP" },
2443
+ { key: "PAUSE" },
2444
+ { key: "RESUME" },
2445
+ { key: "POLL_TICK" },
2446
+ { key: "POLL_SUCCESS" },
2447
+ { key: "POLL_ERROR" }
2448
+ ],
2449
+ transitions: [
2450
+ {
2451
+ from: "Stopped",
2452
+ to: "Polling",
2453
+ event: "START",
2454
+ effects: [
2455
+ ["set", "@entity.isPolling", true],
2456
+ ["set", "@entity.pollCount", 0],
2457
+ ["async/interval", "@config.intervalMs", ["emit", "POLL_TICK"]]
2458
+ ]
2459
+ },
2460
+ {
2461
+ from: "Polling",
2462
+ event: "POLL_TICK",
2463
+ guard: ["or", ["=", "@config.maxPolls", null], ["<", "@entity.pollCount", "@config.maxPolls"]],
2464
+ effects: [
2465
+ ["set", "@entity.lastPollAt", ["time/now"]]
2466
+ ]
2467
+ },
2468
+ {
2469
+ from: "Polling",
2470
+ event: "POLL_SUCCESS",
2471
+ effects: [
2472
+ ["set", "@entity.pollCount", ["+", "@entity.pollCount", 1]],
2473
+ ["set", "@entity.error", null]
2474
+ ]
2475
+ },
2476
+ {
2477
+ from: "Polling",
2478
+ event: "POLL_ERROR",
2479
+ effects: [
2480
+ ["set", "@entity.error", "@payload.error"],
2481
+ ["when", "@config.stopOnError", ["emit", "STOP"]]
2482
+ ]
2483
+ },
2484
+ {
2485
+ from: "Polling",
2486
+ to: "Paused",
2487
+ event: "PAUSE",
2488
+ effects: [
2489
+ ["set", "@entity.isPolling", false]
2490
+ ]
2491
+ },
2492
+ {
2493
+ from: "Paused",
2494
+ to: "Polling",
2495
+ event: "RESUME",
2496
+ effects: [
2497
+ ["set", "@entity.isPolling", true],
2498
+ ["async/interval", "@config.intervalMs", ["emit", "POLL_TICK"]]
2499
+ ]
2500
+ },
2501
+ {
2502
+ from: ["Polling", "Paused"],
2503
+ to: "Stopped",
2504
+ event: "STOP",
2505
+ effects: [
2506
+ ["set", "@entity.isPolling", false]
2507
+ ]
2508
+ }
2509
+ ]
2510
+ },
2511
+ configSchema: {
2512
+ required: [],
2513
+ optional: [
2514
+ { name: "intervalMs", type: "number", description: "Poll interval in ms", default: 5e3 },
2515
+ { name: "stopOnError", type: "boolean", description: "Stop polling on error", default: false },
2516
+ { name: "maxPolls", type: "number", description: "Maximum poll count (null = infinite)", default: null }
2517
+ ]
2518
+ }
2519
+ };
2520
+ var ASYNC_BEHAVIORS = [
2521
+ LOADING_BEHAVIOR,
2522
+ FETCH_BEHAVIOR,
2523
+ SUBMIT_BEHAVIOR,
2524
+ RETRY_BEHAVIOR,
2525
+ POLL_BEHAVIOR
2526
+ ];
2527
+
2528
+ // behaviors/feedback.ts
2529
+ var NOTIFICATION_BEHAVIOR = {
2530
+ name: "std/Notification",
2531
+ category: "feedback",
2532
+ description: "Toast notification with auto-dismiss",
2533
+ suggestedFor: [
2534
+ "Success messages",
2535
+ "Error alerts",
2536
+ "Status updates",
2537
+ "User feedback"
2538
+ ],
2539
+ dataEntities: [
2540
+ {
2541
+ name: "NotificationState",
2542
+ runtime: true,
2543
+ singleton: true,
2544
+ fields: [
2545
+ { name: "notifications", type: "array", default: [] },
2546
+ { name: "currentId", type: "number", default: 0 }
2547
+ ]
2548
+ }
2549
+ ],
2550
+ stateMachine: {
2551
+ initial: "Hidden",
2552
+ states: [
2553
+ { name: "Hidden", isInitial: true },
2554
+ { name: "Visible" },
2555
+ { name: "Dismissing" }
2556
+ ],
2557
+ events: [
2558
+ { key: "SHOW" },
2559
+ { key: "HIDE" },
2560
+ { key: "DISMISS" },
2561
+ { key: "AUTO_DISMISS" }
2562
+ ],
2563
+ transitions: [
2564
+ {
2565
+ from: "*",
2566
+ event: "SHOW",
2567
+ effects: [
2568
+ [
2569
+ "let",
2570
+ [["id", ["+", "@entity.currentId", 1]]],
2571
+ [
2572
+ "do",
2573
+ ["set", "@entity.currentId", "@id"],
2574
+ [
2575
+ "set",
2576
+ "@entity.notifications",
2577
+ ["array/append", "@entity.notifications", {
2578
+ id: "@id",
2579
+ type: "@payload.type",
2580
+ message: "@payload.message",
2581
+ title: "@payload.title"
2582
+ }]
2583
+ ],
2584
+ [
2585
+ "when",
2586
+ [">", "@config.autoDismissMs", 0],
2587
+ ["async/delay", "@config.autoDismissMs", ["emit", "AUTO_DISMISS", { id: "@id" }]]
2588
+ ]
2589
+ ]
2590
+ ]
2591
+ ]
2592
+ },
2593
+ {
2594
+ event: "DISMISS",
2595
+ effects: [
2596
+ [
2597
+ "set",
2598
+ "@entity.notifications",
2599
+ ["array/filter", "@entity.notifications", ["fn", "n", ["!=", "@n.id", "@payload.id"]]]
2600
+ ]
2601
+ ]
2602
+ },
2603
+ {
2604
+ event: "AUTO_DISMISS",
2605
+ effects: [
2606
+ [
2607
+ "set",
2608
+ "@entity.notifications",
2609
+ ["array/filter", "@entity.notifications", ["fn", "n", ["!=", "@n.id", "@payload.id"]]]
2610
+ ]
2611
+ ]
2612
+ },
2613
+ {
2614
+ event: "HIDE",
2615
+ effects: [
2616
+ ["set", "@entity.notifications", []]
2617
+ ]
2618
+ }
2619
+ ]
2620
+ },
2621
+ configSchema: {
2622
+ required: [],
2623
+ optional: [
2624
+ { name: "autoDismissMs", type: "number", description: "Auto dismiss delay (0 = no auto)", default: 5e3 },
2625
+ { name: "position", type: "string", description: "Toast position", default: "top-right", enum: ["top-left", "top-center", "top-right", "bottom-left", "bottom-center", "bottom-right"] },
2626
+ { name: "maxVisible", type: "number", description: "Maximum visible notifications", default: 5 }
2627
+ ]
2628
+ }
2629
+ };
2630
+ var CONFIRMATION_BEHAVIOR = {
2631
+ name: "std/Confirmation",
2632
+ category: "feedback",
2633
+ description: "Confirmation dialog with confirm/cancel actions",
2634
+ suggestedFor: [
2635
+ "Delete confirmation",
2636
+ "Destructive actions",
2637
+ "Important decisions",
2638
+ "Exit warnings"
2639
+ ],
2640
+ dataEntities: [
2641
+ {
2642
+ name: "ConfirmationState",
2643
+ runtime: true,
2644
+ singleton: true,
2645
+ fields: [
2646
+ { name: "title", type: "string", default: "" },
2647
+ { name: "message", type: "string", default: "" },
2648
+ { name: "pendingAction", type: "object", default: null }
2649
+ ]
2650
+ }
2651
+ ],
2652
+ stateMachine: {
2653
+ initial: "Closed",
2654
+ states: [
2655
+ { name: "Closed", isInitial: true },
2656
+ { name: "Open" }
2657
+ ],
2658
+ events: [
2659
+ { key: "REQUEST" },
2660
+ { key: "CONFIRM" },
2661
+ { key: "CANCEL" }
2662
+ ],
2663
+ transitions: [
2664
+ {
2665
+ from: "Closed",
2666
+ to: "Open",
2667
+ event: "REQUEST",
2668
+ effects: [
2669
+ ["set", "@entity.title", "@payload.title"],
2670
+ ["set", "@entity.message", "@payload.message"],
2671
+ ["set", "@entity.pendingAction", "@payload.onConfirm"],
2672
+ ["render-ui", "modal", {
2673
+ type: "confirmation",
2674
+ title: "@entity.title",
2675
+ message: "@entity.message",
2676
+ confirmLabel: "@config.confirmLabel",
2677
+ cancelLabel: "@config.cancelLabel",
2678
+ confirmVariant: "@config.confirmVariant"
2679
+ }]
2680
+ ]
2681
+ },
2682
+ {
2683
+ from: "Open",
2684
+ to: "Closed",
2685
+ event: "CONFIRM",
2686
+ effects: [
2687
+ ["render-ui", "modal", null],
2688
+ ["when", "@entity.pendingAction", ["emit", "@entity.pendingAction.event", "@entity.pendingAction.payload"]],
2689
+ ["set", "@entity.pendingAction", null]
2690
+ ]
2691
+ },
2692
+ {
2693
+ from: "Open",
2694
+ to: "Closed",
2695
+ event: "CANCEL",
2696
+ effects: [
2697
+ ["render-ui", "modal", null],
2698
+ ["set", "@entity.pendingAction", null]
2699
+ ]
2700
+ }
2701
+ ]
2702
+ },
2703
+ configSchema: {
2704
+ required: [],
2705
+ optional: [
2706
+ { name: "confirmLabel", type: "string", description: "Confirm button label", default: "Confirm" },
2707
+ { name: "cancelLabel", type: "string", description: "Cancel button label", default: "Cancel" },
2708
+ { name: "confirmVariant", type: "string", description: "Confirm button variant", default: "primary", enum: ["primary", "danger", "warning"] }
2709
+ ]
2710
+ }
2711
+ };
2712
+ var UNDO_BEHAVIOR = {
2713
+ name: "std/Undo",
2714
+ category: "feedback",
2715
+ description: "Undo/redo stack for reversible actions",
2716
+ suggestedFor: [
2717
+ "Document editing",
2718
+ "Form changes",
2719
+ "Canvas operations",
2720
+ "Reversible actions"
2721
+ ],
2722
+ dataEntities: [
2723
+ {
2724
+ name: "UndoState",
2725
+ runtime: true,
2726
+ singleton: true,
2727
+ fields: [
2728
+ { name: "undoStack", type: "array", default: [] },
2729
+ { name: "redoStack", type: "array", default: [] }
2730
+ ]
2731
+ }
2732
+ ],
2733
+ stateMachine: {
2734
+ initial: "Ready",
2735
+ states: [
2736
+ { name: "Ready", isInitial: true }
2737
+ ],
2738
+ events: [
2739
+ { key: "PUSH" },
2740
+ { key: "UNDO" },
2741
+ { key: "REDO" },
2742
+ { key: "CLEAR" }
2743
+ ],
2744
+ transitions: [
2745
+ {
2746
+ event: "PUSH",
2747
+ effects: [
2748
+ [
2749
+ "set",
2750
+ "@entity.undoStack",
2751
+ [
2752
+ "array/slice",
2753
+ ["array/prepend", "@entity.undoStack", {
2754
+ action: "@payload.action",
2755
+ data: "@payload.data",
2756
+ reverseAction: "@payload.reverseAction",
2757
+ reverseData: "@payload.reverseData",
2758
+ description: "@payload.description"
2759
+ }],
2760
+ 0,
2761
+ "@config.maxHistory"
2762
+ ]
2763
+ ],
2764
+ ["set", "@entity.redoStack", []],
2765
+ [
2766
+ "when",
2767
+ "@config.showToast",
2768
+ ["emit", "NOTIFY", {
2769
+ type: "info",
2770
+ message: ["str/concat", "@payload.description", " - Click to undo"],
2771
+ action: { label: "Undo", event: "UNDO" }
2772
+ }]
2773
+ ]
2774
+ ]
2775
+ },
2776
+ {
2777
+ event: "UNDO",
2778
+ guard: [">", ["array/len", "@entity.undoStack"], 0],
2779
+ effects: [
2780
+ [
2781
+ "let",
2782
+ [["action", ["array/first", "@entity.undoStack"]]],
2783
+ [
2784
+ "do",
2785
+ ["set", "@entity.undoStack", ["array/slice", "@entity.undoStack", 1]],
2786
+ ["set", "@entity.redoStack", ["array/prepend", "@entity.redoStack", "@action"]],
2787
+ ["emit", "@action.reverseAction", "@action.reverseData"]
2788
+ ]
2789
+ ]
2790
+ ]
2791
+ },
2792
+ {
2793
+ event: "REDO",
2794
+ guard: [">", ["array/len", "@entity.redoStack"], 0],
2795
+ effects: [
2796
+ [
2797
+ "let",
2798
+ [["action", ["array/first", "@entity.redoStack"]]],
2799
+ [
2800
+ "do",
2801
+ ["set", "@entity.redoStack", ["array/slice", "@entity.redoStack", 1]],
2802
+ ["set", "@entity.undoStack", ["array/prepend", "@entity.undoStack", "@action"]],
2803
+ ["emit", "@action.action", "@action.data"]
2804
+ ]
2805
+ ]
2806
+ ]
2807
+ },
2808
+ {
2809
+ event: "CLEAR",
2810
+ effects: [
2811
+ ["set", "@entity.undoStack", []],
2812
+ ["set", "@entity.redoStack", []]
2813
+ ]
2814
+ }
2815
+ ]
2816
+ },
2817
+ configSchema: {
2818
+ required: [],
2819
+ optional: [
2820
+ { name: "maxHistory", type: "number", description: "Maximum undo history", default: 50 },
2821
+ { name: "showToast", type: "boolean", description: "Show undo toast", default: true },
2822
+ { name: "toastDurationMs", type: "number", description: "Toast display duration", default: 5e3 }
2823
+ ]
2824
+ }
2825
+ };
2826
+ var FEEDBACK_BEHAVIORS = [
2827
+ NOTIFICATION_BEHAVIOR,
2828
+ CONFIRMATION_BEHAVIOR,
2829
+ UNDO_BEHAVIOR
2830
+ ];
2831
+
2832
+ // behaviors/game-core.ts
2833
+ var GAME_LOOP_BEHAVIOR = {
2834
+ name: "std/GameLoop",
2835
+ category: "game-core",
2836
+ description: "Master game loop coordinator running at 60fps",
2837
+ suggestedFor: [
2838
+ "All real-time games",
2839
+ "Platformers",
2840
+ "Action games",
2841
+ "Endless runners"
2842
+ ],
2843
+ dataEntities: [
2844
+ {
2845
+ name: "GameLoopState",
2846
+ runtime: true,
2847
+ singleton: true,
2848
+ fields: [
2849
+ { name: "frameCount", type: "number", default: 0 },
2850
+ { name: "deltaTime", type: "number", default: 16 },
2851
+ { name: "elapsedTime", type: "number", default: 0 }
2852
+ ]
2853
+ }
2854
+ ],
2855
+ stateMachine: {
2856
+ initial: "Stopped",
2857
+ states: [
2858
+ { name: "Stopped", isInitial: true },
2859
+ { name: "Running" },
2860
+ { name: "Paused" }
2861
+ ],
2862
+ events: [
2863
+ { key: "START" },
2864
+ { key: "STOP" },
2865
+ { key: "PAUSE" },
2866
+ { key: "RESUME" },
2867
+ { key: "TICK" }
2868
+ ],
2869
+ transitions: [
2870
+ {
2871
+ from: "Stopped",
2872
+ to: "Running",
2873
+ event: "START",
2874
+ effects: [
2875
+ ["set", "@entity.frameCount", 0],
2876
+ ["set", "@entity.elapsedTime", 0]
2877
+ ]
2878
+ },
2879
+ {
2880
+ from: "Running",
2881
+ to: "Paused",
2882
+ event: "PAUSE",
2883
+ effects: []
2884
+ },
2885
+ {
2886
+ from: "Paused",
2887
+ to: "Running",
2888
+ event: "RESUME",
2889
+ effects: []
2890
+ },
2891
+ {
2892
+ from: ["Running", "Paused"],
2893
+ to: "Stopped",
2894
+ event: "STOP",
2895
+ effects: []
2896
+ }
2897
+ ]
2898
+ },
2899
+ ticks: [
2900
+ {
2901
+ name: "GameTick",
2902
+ interval: "frame",
2903
+ guard: ["=", "@state", "Running"],
2904
+ effects: [
2905
+ ["set", "@entity.frameCount", ["+", "@entity.frameCount", 1]],
2906
+ ["set", "@entity.elapsedTime", ["+", "@entity.elapsedTime", "@entity.deltaTime"]],
2907
+ ["emit", "GAME_TICK", { frame: "@entity.frameCount", delta: "@entity.deltaTime" }]
2908
+ ]
2909
+ }
2910
+ ],
2911
+ configSchema: {
2912
+ required: [],
2913
+ optional: [
2914
+ { name: "targetFps", type: "number", description: "Target frames per second", default: 60 },
2915
+ { name: "fixedTimestep", type: "boolean", description: "Use fixed timestep", default: true }
2916
+ ]
2917
+ }
2918
+ };
2919
+ var PHYSICS_2D_BEHAVIOR = {
2920
+ name: "std/Physics2D",
2921
+ category: "game-core",
2922
+ description: "2D physics with gravity, velocity, and friction",
2923
+ suggestedFor: [
2924
+ "Platformer characters",
2925
+ "Falling objects",
2926
+ "Projectiles",
2927
+ "Any entity affected by gravity"
2928
+ ],
2929
+ requiredFields: [
2930
+ { name: "x", type: "number", description: "Entity X position" },
2931
+ { name: "y", type: "number", description: "Entity Y position" }
2932
+ ],
2933
+ dataEntities: [
2934
+ {
2935
+ name: "Physics2DState",
2936
+ runtime: true,
2937
+ fields: [
2938
+ { name: "vx", type: "number", default: 0 },
2939
+ { name: "vy", type: "number", default: 0 },
2940
+ { name: "isGrounded", type: "boolean", default: false }
2941
+ ]
2942
+ }
2943
+ ],
2944
+ stateMachine: {
2945
+ initial: "Active",
2946
+ states: [
2947
+ { name: "Active", isInitial: true },
2948
+ { name: "Frozen" }
2949
+ ],
2950
+ events: [
2951
+ { key: "INIT" },
2952
+ { key: "APPLY_FORCE" },
2953
+ { key: "GROUND_HIT" },
2954
+ { key: "FREEZE" },
2955
+ { key: "UNFREEZE" }
2956
+ ],
2957
+ transitions: [
2958
+ {
2959
+ from: "*",
2960
+ event: "INIT",
2961
+ effects: [
2962
+ ["set", "@entity.vx", 0],
2963
+ ["set", "@entity.vy", 0],
2964
+ ["set", "@entity.isGrounded", false]
2965
+ ]
2966
+ },
2967
+ {
2968
+ from: "Active",
2969
+ event: "APPLY_FORCE",
2970
+ effects: [
2971
+ ["set", "@entity.vx", ["+", "@entity.vx", "@payload.fx"]],
2972
+ ["set", "@entity.vy", ["+", "@entity.vy", "@payload.fy"]]
2973
+ ]
2974
+ },
2975
+ {
2976
+ from: "Active",
2977
+ event: "GROUND_HIT",
2978
+ effects: [
2979
+ ["set", "@entity.isGrounded", true],
2980
+ ["set", "@entity.vy", 0],
2981
+ ["set", "@entity.vx", ["*", "@entity.vx", "@config.friction"]]
2982
+ ]
2983
+ },
2984
+ {
2985
+ from: "Active",
2986
+ to: "Frozen",
2987
+ event: "FREEZE",
2988
+ effects: []
2989
+ },
2990
+ {
2991
+ from: "Frozen",
2992
+ to: "Active",
2993
+ event: "UNFREEZE",
2994
+ effects: []
2995
+ }
2996
+ ]
2997
+ },
2998
+ ticks: [
2999
+ {
3000
+ name: "ApplyGravity",
3001
+ interval: "frame",
3002
+ guard: ["and", ["=", "@state", "Active"], ["not", "@entity.isGrounded"]],
3003
+ effects: [
3004
+ ["set", "@entity.vy", ["math/min", "@config.maxVelocityY", ["+", "@entity.vy", "@config.gravity"]]]
3005
+ ]
3006
+ },
3007
+ {
3008
+ name: "ApplyVelocity",
3009
+ interval: "frame",
3010
+ guard: ["=", "@state", "Active"],
3011
+ effects: [
3012
+ ["set", "@entity.vx", ["*", "@entity.vx", "@config.airResistance"]],
3013
+ ["set", "@entity.x", ["+", "@entity.x", "@entity.vx"]],
3014
+ ["set", "@entity.y", ["+", "@entity.y", "@entity.vy"]]
3015
+ ]
3016
+ }
3017
+ ],
3018
+ configSchema: {
3019
+ required: [],
3020
+ optional: [
3021
+ { name: "gravity", type: "number", description: "Gravity acceleration (pixels/frame\xB2)", default: 0.5 },
3022
+ { name: "maxVelocityY", type: "number", description: "Terminal velocity", default: 15 },
3023
+ { name: "friction", type: "number", description: "Ground friction (0-1)", default: 0.8 },
3024
+ { name: "airResistance", type: "number", description: "Air resistance (0-1)", default: 0.99 }
3025
+ ]
3026
+ }
3027
+ };
3028
+ var INPUT_BEHAVIOR = {
3029
+ name: "std/Input",
3030
+ category: "game-core",
3031
+ description: "Unified keyboard and touch input state management",
3032
+ suggestedFor: [
3033
+ "All interactive games",
3034
+ "Player controls",
3035
+ "Menu navigation"
3036
+ ],
3037
+ dataEntities: [
3038
+ {
3039
+ name: "InputState",
3040
+ runtime: true,
3041
+ singleton: true,
3042
+ fields: [
3043
+ { name: "left", type: "boolean", default: false },
3044
+ { name: "right", type: "boolean", default: false },
3045
+ { name: "up", type: "boolean", default: false },
3046
+ { name: "down", type: "boolean", default: false },
3047
+ { name: "jump", type: "boolean", default: false },
3048
+ { name: "action", type: "boolean", default: false },
3049
+ { name: "pause", type: "boolean", default: false }
3050
+ ]
3051
+ }
3052
+ ],
3053
+ stateMachine: {
3054
+ initial: "Ready",
3055
+ states: [
3056
+ { name: "Ready", isInitial: true }
3057
+ ],
3058
+ events: [
3059
+ { key: "KEY_DOWN" },
3060
+ { key: "KEY_UP" },
3061
+ { key: "TOUCH_START" },
3062
+ { key: "TOUCH_END" },
3063
+ { key: "RESET" }
3064
+ ],
3065
+ transitions: [
3066
+ {
3067
+ event: "KEY_DOWN",
3068
+ effects: [
3069
+ [
3070
+ "if",
3071
+ ["or", ["=", "@payload.key", "ArrowLeft"], ["=", "@payload.key", "a"]],
3072
+ ["set", "@entity.left", true]
3073
+ ],
3074
+ [
3075
+ "if",
3076
+ ["or", ["=", "@payload.key", "ArrowRight"], ["=", "@payload.key", "d"]],
3077
+ ["set", "@entity.right", true]
3078
+ ],
3079
+ [
3080
+ "if",
3081
+ ["or", ["=", "@payload.key", "ArrowUp"], ["=", "@payload.key", "w"]],
3082
+ ["set", "@entity.up", true]
3083
+ ],
3084
+ [
3085
+ "if",
3086
+ ["or", ["=", "@payload.key", "ArrowDown"], ["=", "@payload.key", "s"]],
3087
+ ["set", "@entity.down", true]
3088
+ ],
3089
+ [
3090
+ "if",
3091
+ ["=", "@payload.key", " "],
3092
+ ["set", "@entity.jump", true]
3093
+ ],
3094
+ [
3095
+ "if",
3096
+ ["or", ["=", "@payload.key", "Enter"], ["=", "@payload.key", "e"]],
3097
+ ["set", "@entity.action", true]
3098
+ ],
3099
+ [
3100
+ "if",
3101
+ ["or", ["=", "@payload.key", "Escape"], ["=", "@payload.key", "p"]],
3102
+ ["set", "@entity.pause", true]
3103
+ ]
3104
+ ]
3105
+ },
3106
+ {
3107
+ event: "KEY_UP",
3108
+ effects: [
3109
+ [
3110
+ "if",
3111
+ ["or", ["=", "@payload.key", "ArrowLeft"], ["=", "@payload.key", "a"]],
3112
+ ["set", "@entity.left", false]
3113
+ ],
3114
+ [
3115
+ "if",
3116
+ ["or", ["=", "@payload.key", "ArrowRight"], ["=", "@payload.key", "d"]],
3117
+ ["set", "@entity.right", false]
3118
+ ],
3119
+ [
3120
+ "if",
3121
+ ["or", ["=", "@payload.key", "ArrowUp"], ["=", "@payload.key", "w"]],
3122
+ ["set", "@entity.up", false]
3123
+ ],
3124
+ [
3125
+ "if",
3126
+ ["or", ["=", "@payload.key", "ArrowDown"], ["=", "@payload.key", "s"]],
3127
+ ["set", "@entity.down", false]
3128
+ ],
3129
+ [
3130
+ "if",
3131
+ ["=", "@payload.key", " "],
3132
+ ["set", "@entity.jump", false]
3133
+ ],
3134
+ [
3135
+ "if",
3136
+ ["or", ["=", "@payload.key", "Enter"], ["=", "@payload.key", "e"]],
3137
+ ["set", "@entity.action", false]
3138
+ ],
3139
+ [
3140
+ "if",
3141
+ ["or", ["=", "@payload.key", "Escape"], ["=", "@payload.key", "p"]],
3142
+ ["set", "@entity.pause", false]
3143
+ ]
3144
+ ]
3145
+ },
3146
+ {
3147
+ event: "RESET",
3148
+ effects: [
3149
+ ["set", "@entity.left", false],
3150
+ ["set", "@entity.right", false],
3151
+ ["set", "@entity.up", false],
3152
+ ["set", "@entity.down", false],
3153
+ ["set", "@entity.jump", false],
3154
+ ["set", "@entity.action", false],
3155
+ ["set", "@entity.pause", false]
3156
+ ]
3157
+ }
3158
+ ]
3159
+ },
3160
+ configSchema: {
3161
+ required: [],
3162
+ optional: [
3163
+ { name: "keyMap", type: "object", description: "Key to action mapping", default: {} }
3164
+ ]
3165
+ }
3166
+ };
3167
+ var COLLISION_BEHAVIOR = {
3168
+ name: "std/Collision",
3169
+ category: "game-core",
3170
+ description: "Collision detection and response configuration",
3171
+ suggestedFor: [
3172
+ "Solid platforms",
3173
+ "Trigger zones",
3174
+ "Collectibles",
3175
+ "Hazards"
3176
+ ],
3177
+ dataEntities: [
3178
+ {
3179
+ name: "CollisionState",
3180
+ runtime: true,
3181
+ fields: [
3182
+ { name: "isColliding", type: "boolean", default: false },
3183
+ { name: "collidingWith", type: "array", default: [] }
3184
+ ]
3185
+ }
3186
+ ],
3187
+ stateMachine: {
3188
+ initial: "Active",
3189
+ states: [
3190
+ { name: "Active", isInitial: true },
3191
+ { name: "Disabled" }
3192
+ ],
3193
+ events: [
3194
+ { key: "COLLISION" },
3195
+ { key: "TRIGGER_ENTER" },
3196
+ { key: "TRIGGER_EXIT" },
3197
+ { key: "ENABLE" },
3198
+ { key: "DISABLE" }
3199
+ ],
3200
+ transitions: [
3201
+ {
3202
+ from: "Active",
3203
+ event: "COLLISION",
3204
+ effects: [
3205
+ ["set", "@entity.isColliding", true],
3206
+ ["set", "@entity.collidingWith", ["array/append", "@entity.collidingWith", "@payload.entityId"]],
3207
+ [
3208
+ "if",
3209
+ "@config.onCollision",
3210
+ ["emit", "@config.onCollision", { entityId: "@payload.entityId", side: "@payload.side" }]
3211
+ ]
3212
+ ]
3213
+ },
3214
+ {
3215
+ from: "Active",
3216
+ event: "TRIGGER_ENTER",
3217
+ effects: [
3218
+ [
3219
+ "if",
3220
+ "@config.onTrigger",
3221
+ ["emit", "@config.onTrigger", { entityId: "@payload.entityId", action: "enter" }]
3222
+ ]
3223
+ ]
3224
+ },
3225
+ {
3226
+ from: "Active",
3227
+ event: "TRIGGER_EXIT",
3228
+ effects: [
3229
+ ["set", "@entity.collidingWith", ["array/filter", "@entity.collidingWith", ["fn", "id", ["!=", "@id", "@payload.entityId"]]]],
3230
+ [
3231
+ "if",
3232
+ ["=", ["array/len", "@entity.collidingWith"], 0],
3233
+ ["set", "@entity.isColliding", false]
3234
+ ]
3235
+ ]
3236
+ },
3237
+ {
3238
+ from: "Active",
3239
+ to: "Disabled",
3240
+ event: "DISABLE",
3241
+ effects: [
3242
+ ["set", "@entity.isColliding", false],
3243
+ ["set", "@entity.collidingWith", []]
3244
+ ]
3245
+ },
3246
+ {
3247
+ from: "Disabled",
3248
+ to: "Active",
3249
+ event: "ENABLE",
3250
+ effects: []
3251
+ }
3252
+ ]
3253
+ },
3254
+ configSchema: {
3255
+ required: [],
3256
+ optional: [
3257
+ { name: "type", type: "string", description: "Collision type", default: "solid", enum: ["solid", "trigger"] },
3258
+ { name: "layer", type: "string", description: "Collision layer", default: "default" },
3259
+ { name: "collidesWith", type: "array", description: "Layers to collide with", default: ["default"] },
3260
+ { name: "onCollision", type: "event", description: "Event to emit on collision" },
3261
+ { name: "onTrigger", type: "event", description: "Event to emit on trigger" }
3262
+ ]
3263
+ }
3264
+ };
3265
+ var GAME_CORE_BEHAVIORS = [
3266
+ GAME_LOOP_BEHAVIOR,
3267
+ PHYSICS_2D_BEHAVIOR,
3268
+ INPUT_BEHAVIOR,
3269
+ COLLISION_BEHAVIOR
3270
+ ];
3271
+
3272
+ // behaviors/game-entity.ts
3273
+ var HEALTH_BEHAVIOR = {
3274
+ name: "std/Health",
3275
+ category: "game-entity",
3276
+ description: "Entity health with damage, healing, invulnerability, and death",
3277
+ suggestedFor: [
3278
+ "Player characters",
3279
+ "Enemies",
3280
+ "Destructible objects",
3281
+ "Bosses"
3282
+ ],
3283
+ dataEntities: [
3284
+ {
3285
+ name: "HealthState",
3286
+ runtime: true,
3287
+ fields: [
3288
+ { name: "currentHealth", type: "number", default: 100 },
3289
+ { name: "maxHealth", type: "number", default: 100 },
3290
+ { name: "isInvulnerable", type: "boolean", default: false },
3291
+ { name: "lastDamageTime", type: "number", default: 0 }
3292
+ ]
3293
+ }
3294
+ ],
3295
+ stateMachine: {
3296
+ initial: "Alive",
3297
+ states: [
3298
+ { name: "Alive", isInitial: true },
3299
+ { name: "Damaged" },
3300
+ { name: "Invulnerable" },
3301
+ { name: "Dead" }
3302
+ ],
3303
+ events: [
3304
+ { key: "INIT" },
3305
+ { key: "DAMAGE" },
3306
+ { key: "HEAL" },
3307
+ { key: "DIE" },
3308
+ { key: "RESPAWN" },
3309
+ { key: "INVULNERABILITY_END" }
3310
+ ],
3311
+ transitions: [
3312
+ {
3313
+ from: "*",
3314
+ to: "Alive",
3315
+ event: "INIT",
3316
+ effects: [
3317
+ ["set", "@entity.currentHealth", "@config.maxHealth"],
3318
+ ["set", "@entity.maxHealth", "@config.maxHealth"],
3319
+ ["set", "@entity.isInvulnerable", false],
3320
+ ["render", "hud.health", "health-bar", {
3321
+ current: "@entity.currentHealth",
3322
+ max: "@entity.maxHealth"
3323
+ }]
3324
+ ]
3325
+ },
3326
+ {
3327
+ from: "Alive",
3328
+ to: "Damaged",
3329
+ event: "DAMAGE",
3330
+ guard: ["not", "@entity.isInvulnerable"],
3331
+ effects: [
3332
+ ["set", "@entity.currentHealth", ["math/max", 0, ["-", "@entity.currentHealth", "@payload.amount"]]],
3333
+ ["set", "@entity.lastDamageTime", "@now"],
3334
+ [
3335
+ "if",
3336
+ ["<=", "@entity.currentHealth", 0],
3337
+ ["emit", "DIE"],
3338
+ [
3339
+ "do",
3340
+ ["set", "@entity.isInvulnerable", true],
3341
+ ["render", "entity.flash", "damage-flash", {}]
3342
+ ]
3343
+ ]
3344
+ ]
3345
+ },
3346
+ {
3347
+ from: ["Damaged", "Invulnerable"],
3348
+ to: "Alive",
3349
+ event: "INVULNERABILITY_END",
3350
+ effects: [
3351
+ ["set", "@entity.isInvulnerable", false]
3352
+ ]
3353
+ },
3354
+ {
3355
+ from: ["Alive", "Damaged", "Invulnerable"],
3356
+ event: "HEAL",
3357
+ effects: [
3358
+ ["set", "@entity.currentHealth", ["math/min", "@entity.maxHealth", ["+", "@entity.currentHealth", "@payload.amount"]]],
3359
+ ["render", "entity.effect", "heal-effect", {}]
3360
+ ]
3361
+ },
3362
+ {
3363
+ from: ["Alive", "Damaged", "Invulnerable"],
3364
+ to: "Dead",
3365
+ event: "DIE",
3366
+ effects: [
3367
+ ["set", "@entity.currentHealth", 0],
3368
+ ["emit", "@config.onDeath", { entityId: "@entity.id" }],
3369
+ ["render", "entity.sprite", "death-animation", {}]
3370
+ ]
3371
+ },
3372
+ {
3373
+ from: "Dead",
3374
+ to: "Alive",
3375
+ event: "RESPAWN",
3376
+ effects: [
3377
+ ["emit", "INIT"]
3378
+ ]
3379
+ }
3380
+ ]
3381
+ },
3382
+ ticks: [
3383
+ {
3384
+ name: "InvulnerabilityTimer",
3385
+ interval: "frame",
3386
+ guard: ["and", "@entity.isInvulnerable", [">", ["-", "@now", "@entity.lastDamageTime"], "@config.invulnerabilityTime"]],
3387
+ effects: [
3388
+ ["emit", "INVULNERABILITY_END"]
3389
+ ]
3390
+ }
3391
+ ],
3392
+ configSchema: {
3393
+ required: [
3394
+ { name: "maxHealth", type: "number", description: "Maximum health points" }
3395
+ ],
3396
+ optional: [
3397
+ { name: "invulnerabilityTime", type: "number", description: "Invulnerability duration after damage (ms)", default: 500 },
3398
+ { name: "onDeath", type: "event", description: "Event to emit on death", default: "ENTITY_DIED" },
3399
+ { name: "showHealthBar", type: "boolean", description: "Render health bar", default: true }
3400
+ ]
3401
+ }
3402
+ };
3403
+ var SCORE_BEHAVIOR = {
3404
+ name: "std/Score",
3405
+ category: "game-entity",
3406
+ description: "Score tracking with points, combos, and multipliers",
3407
+ suggestedFor: [
3408
+ "Arcade games",
3409
+ "Puzzle games",
3410
+ "Platformers with collectibles",
3411
+ "Competitive games"
3412
+ ],
3413
+ dataEntities: [
3414
+ {
3415
+ name: "ScoreState",
3416
+ runtime: true,
3417
+ singleton: true,
3418
+ fields: [
3419
+ { name: "currentScore", type: "number", default: 0 },
3420
+ { name: "highScore", type: "number", default: 0 },
3421
+ { name: "comboCount", type: "number", default: 0 },
3422
+ { name: "multiplier", type: "number", default: 1 },
3423
+ { name: "lastScoreTime", type: "number", default: 0 }
3424
+ ]
3425
+ }
3426
+ ],
3427
+ stateMachine: {
3428
+ initial: "Active",
3429
+ states: [
3430
+ { name: "Active", isInitial: true }
3431
+ ],
3432
+ events: [
3433
+ { key: "INIT" },
3434
+ { key: "ADD_POINTS" },
3435
+ { key: "COMBO_HIT" },
3436
+ { key: "COMBO_BREAK" },
3437
+ { key: "RESET" },
3438
+ { key: "SAVE_HIGH_SCORE" }
3439
+ ],
3440
+ transitions: [
3441
+ {
3442
+ from: "*",
3443
+ event: "INIT",
3444
+ effects: [
3445
+ ["set", "@entity.currentScore", 0],
3446
+ ["set", "@entity.comboCount", 0],
3447
+ ["set", "@entity.multiplier", 1],
3448
+ ["render", "hud.score", "score-display", {
3449
+ score: "@entity.currentScore",
3450
+ highScore: "@entity.highScore",
3451
+ combo: "@entity.comboCount",
3452
+ multiplier: "@entity.multiplier"
3453
+ }]
3454
+ ]
3455
+ },
3456
+ {
3457
+ event: "ADD_POINTS",
3458
+ effects: [
3459
+ ["set", "@entity.currentScore", ["+", "@entity.currentScore", ["*", "@payload.points", "@entity.multiplier"]]],
3460
+ ["set", "@entity.lastScoreTime", "@now"],
3461
+ ["render", "entity.effect", "score-popup", {
3462
+ points: ["*", "@payload.points", "@entity.multiplier"],
3463
+ position: "@payload.position"
3464
+ }]
3465
+ ]
3466
+ },
3467
+ {
3468
+ event: "COMBO_HIT",
3469
+ effects: [
3470
+ ["set", "@entity.comboCount", ["+", "@entity.comboCount", 1]],
3471
+ ["set", "@entity.multiplier", ["math/min", "@config.maxMultiplier", ["+", 1, ["/", "@entity.comboCount", 5]]]],
3472
+ ["set", "@entity.lastScoreTime", "@now"]
3473
+ ]
3474
+ },
3475
+ {
3476
+ event: "COMBO_BREAK",
3477
+ effects: [
3478
+ ["set", "@entity.comboCount", 0],
3479
+ ["set", "@entity.multiplier", 1]
3480
+ ]
3481
+ },
3482
+ {
3483
+ event: "RESET",
3484
+ effects: [
3485
+ [
3486
+ "if",
3487
+ [">", "@entity.currentScore", "@entity.highScore"],
3488
+ ["set", "@entity.highScore", "@entity.currentScore"]
3489
+ ],
3490
+ ["emit", "INIT"]
3491
+ ]
3492
+ },
3493
+ {
3494
+ event: "SAVE_HIGH_SCORE",
3495
+ guard: [">", "@entity.currentScore", "@entity.highScore"],
3496
+ effects: [
3497
+ ["set", "@entity.highScore", "@entity.currentScore"],
3498
+ ["persist", "save", "HighScore", { score: "@entity.highScore" }]
3499
+ ]
3500
+ }
3501
+ ]
3502
+ },
3503
+ ticks: [
3504
+ {
3505
+ name: "ComboTimeout",
3506
+ interval: "frame",
3507
+ guard: ["and", [">", "@entity.comboCount", 0], [">", ["-", "@now", "@entity.lastScoreTime"], "@config.comboTimeWindow"]],
3508
+ effects: [
3509
+ ["emit", "COMBO_BREAK"]
3510
+ ]
3511
+ }
3512
+ ],
3513
+ configSchema: {
3514
+ required: [],
3515
+ optional: [
3516
+ { name: "comboTimeWindow", type: "number", description: "Time window for combos (ms)", default: 2e3 },
3517
+ { name: "maxMultiplier", type: "number", description: "Maximum combo multiplier", default: 10 },
3518
+ { name: "persistHighScore", type: "boolean", description: "Save high score to storage", default: true }
3519
+ ]
3520
+ }
3521
+ };
3522
+ var MOVEMENT_BEHAVIOR = {
3523
+ name: "std/Movement",
3524
+ category: "game-entity",
3525
+ description: "Entity movement with speed and direction",
3526
+ suggestedFor: [
3527
+ "Player characters",
3528
+ "NPCs",
3529
+ "Enemies",
3530
+ "Moving platforms"
3531
+ ],
3532
+ requiredFields: [
3533
+ { name: "x", type: "number", description: "Entity X position" },
3534
+ { name: "y", type: "number", description: "Entity Y position" }
3535
+ ],
3536
+ dataEntities: [
3537
+ {
3538
+ name: "MovementState",
3539
+ runtime: true,
3540
+ fields: [
3541
+ { name: "direction", type: "number", default: 0 },
3542
+ { name: "facingRight", type: "boolean", default: true },
3543
+ { name: "canJump", type: "boolean", default: true }
3544
+ ]
3545
+ }
3546
+ ],
3547
+ stateMachine: {
3548
+ initial: "Idle",
3549
+ states: [
3550
+ { name: "Idle", isInitial: true },
3551
+ { name: "Moving" },
3552
+ { name: "Jumping" },
3553
+ { name: "Falling" }
3554
+ ],
3555
+ events: [
3556
+ { key: "MOVE" },
3557
+ { key: "STOP" },
3558
+ { key: "JUMP" },
3559
+ { key: "LAND" }
3560
+ ],
3561
+ transitions: [
3562
+ {
3563
+ from: "Idle",
3564
+ to: "Moving",
3565
+ event: "MOVE",
3566
+ effects: [
3567
+ ["set", "@entity.direction", "@payload.direction"],
3568
+ [
3569
+ "if",
3570
+ [">", "@payload.direction", 0],
3571
+ ["set", "@entity.facingRight", true]
3572
+ ],
3573
+ [
3574
+ "if",
3575
+ ["<", "@payload.direction", 0],
3576
+ ["set", "@entity.facingRight", false]
3577
+ ]
3578
+ ]
3579
+ },
3580
+ {
3581
+ from: "Moving",
3582
+ event: "MOVE",
3583
+ effects: [
3584
+ ["set", "@entity.direction", "@payload.direction"],
3585
+ [
3586
+ "if",
3587
+ [">", "@payload.direction", 0],
3588
+ ["set", "@entity.facingRight", true]
3589
+ ],
3590
+ [
3591
+ "if",
3592
+ ["<", "@payload.direction", 0],
3593
+ ["set", "@entity.facingRight", false]
3594
+ ]
3595
+ ]
3596
+ },
3597
+ {
3598
+ from: "Moving",
3599
+ to: "Idle",
3600
+ event: "STOP",
3601
+ effects: [
3602
+ ["set", "@entity.direction", 0]
3603
+ ]
3604
+ },
3605
+ {
3606
+ from: ["Idle", "Moving"],
3607
+ to: "Jumping",
3608
+ event: "JUMP",
3609
+ guard: "@entity.canJump",
3610
+ effects: [
3611
+ ["set", "@entity.canJump", false],
3612
+ ["emit", "APPLY_FORCE", { fx: 0, fy: "@config.jumpForce" }]
3613
+ ]
3614
+ },
3615
+ {
3616
+ from: ["Jumping", "Falling"],
3617
+ to: "Idle",
3618
+ event: "LAND",
3619
+ effects: [
3620
+ ["set", "@entity.canJump", true],
3621
+ [
3622
+ "if",
3623
+ ["!=", "@entity.direction", 0],
3624
+ ["emit", "MOVE", { direction: "@entity.direction" }]
3625
+ ]
3626
+ ]
3627
+ }
3628
+ ]
3629
+ },
3630
+ ticks: [
3631
+ {
3632
+ name: "ApplyMovement",
3633
+ interval: "frame",
3634
+ guard: ["!=", "@entity.direction", 0],
3635
+ effects: [
3636
+ ["set", "@entity.x", ["+", "@entity.x", ["*", "@entity.direction", "@config.moveSpeed"]]]
3637
+ ]
3638
+ }
3639
+ ],
3640
+ configSchema: {
3641
+ required: [],
3642
+ optional: [
3643
+ { name: "moveSpeed", type: "number", description: "Movement speed (pixels/frame)", default: 5 },
3644
+ { name: "jumpForce", type: "number", description: "Jump velocity", default: -12 },
3645
+ { name: "acceleration", type: "number", description: "Acceleration rate", default: 0.5 },
3646
+ { name: "deceleration", type: "number", description: "Deceleration rate", default: 0.3 }
3647
+ ]
3648
+ }
3649
+ };
3650
+ var COMBAT_BEHAVIOR = {
3651
+ name: "std/Combat",
3652
+ category: "game-entity",
3653
+ description: "Combat system with attacks, cooldowns, and hitboxes",
3654
+ suggestedFor: [
3655
+ "Fighting games",
3656
+ "Action RPGs",
3657
+ "Beat-em-ups",
3658
+ "Boss encounters"
3659
+ ],
3660
+ dataEntities: [
3661
+ {
3662
+ name: "CombatState",
3663
+ runtime: true,
3664
+ fields: [
3665
+ { name: "isAttacking", type: "boolean", default: false },
3666
+ { name: "attackStartTime", type: "number", default: 0 },
3667
+ { name: "hitEntities", type: "array", default: [] }
3668
+ ]
3669
+ }
3670
+ ],
3671
+ stateMachine: {
3672
+ initial: "Ready",
3673
+ states: [
3674
+ { name: "Ready", isInitial: true },
3675
+ { name: "Attacking" },
3676
+ { name: "Cooldown" }
3677
+ ],
3678
+ events: [
3679
+ { key: "ATTACK" },
3680
+ { key: "ATTACK_END" },
3681
+ { key: "HIT_CONNECT" },
3682
+ { key: "COOLDOWN_END" }
3683
+ ],
3684
+ transitions: [
3685
+ {
3686
+ from: "Ready",
3687
+ to: "Attacking",
3688
+ event: "ATTACK",
3689
+ effects: [
3690
+ ["set", "@entity.isAttacking", true],
3691
+ ["set", "@entity.attackStartTime", "@now"],
3692
+ ["set", "@entity.hitEntities", []],
3693
+ ["render", "entity.sprite", "attack-animation", {}],
3694
+ ["render", "entity.hitbox", "hitbox", {
3695
+ active: true,
3696
+ offset: "@config.hitboxOffset",
3697
+ size: "@config.hitboxSize"
3698
+ }]
3699
+ ]
3700
+ },
3701
+ {
3702
+ from: "Attacking",
3703
+ event: "HIT_CONNECT",
3704
+ guard: ["not", ["array/includes", "@entity.hitEntities", "@payload.entityId"]],
3705
+ effects: [
3706
+ ["set", "@entity.hitEntities", ["array/append", "@entity.hitEntities", "@payload.entityId"]],
3707
+ ["emit", "DAMAGE", { target: "@payload.entityId", amount: "@config.attackDamage" }],
3708
+ ["render", "effect.impact", "hit-effect", { position: "@payload.position" }]
3709
+ ]
3710
+ },
3711
+ {
3712
+ from: "Attacking",
3713
+ to: "Cooldown",
3714
+ event: "ATTACK_END",
3715
+ effects: [
3716
+ ["set", "@entity.isAttacking", false],
3717
+ ["render", "entity.hitbox", null]
3718
+ ]
3719
+ },
3720
+ {
3721
+ from: "Cooldown",
3722
+ to: "Ready",
3723
+ event: "COOLDOWN_END",
3724
+ effects: []
3725
+ }
3726
+ ]
3727
+ },
3728
+ ticks: [
3729
+ {
3730
+ name: "AttackDuration",
3731
+ interval: "frame",
3732
+ guard: ["and", "@entity.isAttacking", [">", ["-", "@now", "@entity.attackStartTime"], "@config.attackDuration"]],
3733
+ effects: [
3734
+ ["emit", "ATTACK_END"]
3735
+ ]
3736
+ },
3737
+ {
3738
+ name: "CooldownTimer",
3739
+ interval: "frame",
3740
+ guard: ["and", ["=", "@state", "Cooldown"], [">", ["-", "@now", "@entity.attackStartTime"], ["+", "@config.attackDuration", "@config.cooldownDuration"]]],
3741
+ effects: [
3742
+ ["emit", "COOLDOWN_END"]
3743
+ ]
3744
+ }
3745
+ ],
3746
+ configSchema: {
3747
+ required: [],
3748
+ optional: [
3749
+ { name: "attackDamage", type: "number", description: "Damage per attack", default: 10 },
3750
+ { name: "attackDuration", type: "number", description: "Attack animation duration (ms)", default: 200 },
3751
+ { name: "cooldownDuration", type: "number", description: "Cooldown between attacks (ms)", default: 300 },
3752
+ { name: "hitboxOffset", type: "object", description: "Hitbox offset from entity", default: { x: 20, y: 0 } },
3753
+ { name: "hitboxSize", type: "object", description: "Hitbox dimensions", default: { width: 30, height: 40 } }
3754
+ ]
3755
+ }
3756
+ };
3757
+ var INVENTORY_BEHAVIOR = {
3758
+ name: "std/Inventory",
3759
+ category: "game-entity",
3760
+ description: "Item collection, storage, and usage",
3761
+ suggestedFor: [
3762
+ "RPGs",
3763
+ "Adventure games",
3764
+ "Survival games",
3765
+ "Collectible-based games"
3766
+ ],
3767
+ dataEntities: [
3768
+ {
3769
+ name: "InventoryState",
3770
+ runtime: true,
3771
+ fields: [
3772
+ { name: "items", type: "array", default: [] },
3773
+ { name: "selectedSlot", type: "number", default: 0 },
3774
+ { name: "isOpen", type: "boolean", default: false },
3775
+ { name: "equipped", type: "object", default: {} }
3776
+ ]
3777
+ }
3778
+ ],
3779
+ stateMachine: {
3780
+ initial: "Empty",
3781
+ states: [
3782
+ { name: "Empty", isInitial: true },
3783
+ { name: "HasItems" },
3784
+ { name: "Full" }
3785
+ ],
3786
+ events: [
3787
+ { key: "COLLECT" },
3788
+ { key: "USE" },
3789
+ { key: "DROP" },
3790
+ { key: "EQUIP" },
3791
+ { key: "UNEQUIP" },
3792
+ { key: "OPEN" },
3793
+ { key: "CLOSE" },
3794
+ { key: "INVENTORY_EMPTY" }
3795
+ ],
3796
+ transitions: [
3797
+ {
3798
+ from: ["Empty", "HasItems"],
3799
+ to: "HasItems",
3800
+ event: "COLLECT",
3801
+ guard: ["<", ["array/len", "@entity.items"], "@config.maxSlots"],
3802
+ effects: [
3803
+ ["set", "@entity.items", ["array/append", "@entity.items", "@payload.item"]],
3804
+ ["render", "effect.collect", "collect-effect", { item: "@payload.item" }],
3805
+ ["notify", { type: "info", message: ["str/concat", "Collected ", "@payload.item.name"] }]
3806
+ ]
3807
+ },
3808
+ {
3809
+ from: "HasItems",
3810
+ event: "USE",
3811
+ effects: [
3812
+ [
3813
+ "let",
3814
+ [["item", ["array/nth", "@entity.items", "@payload.slot"]]],
3815
+ [
3816
+ "if",
3817
+ "@item.onUse",
3818
+ ["emit", "@item.onUse", { item: "@item" }]
3819
+ ],
3820
+ [
3821
+ "if",
3822
+ "@item.consumable",
3823
+ ["set", "@entity.items", ["array/filter", "@entity.items", ["fn", "i", "idx", ["!=", "@idx", "@payload.slot"]]]]
3824
+ ]
3825
+ ],
3826
+ [
3827
+ "if",
3828
+ ["=", ["array/len", "@entity.items"], 0],
3829
+ ["emit", "INVENTORY_EMPTY"]
3830
+ ]
3831
+ ]
3832
+ },
3833
+ {
3834
+ from: "HasItems",
3835
+ event: "DROP",
3836
+ effects: [
3837
+ [
3838
+ "let",
3839
+ [["item", ["array/nth", "@entity.items", "@payload.slot"]]],
3840
+ ["set", "@entity.items", ["array/filter", "@entity.items", ["fn", "i", "idx", ["!=", "@idx", "@payload.slot"]]]],
3841
+ ["emit", "ITEM_DROPPED", { item: "@item", position: { x: "@entity.x", y: "@entity.y" } }]
3842
+ ],
3843
+ [
3844
+ "if",
3845
+ ["=", ["array/len", "@entity.items"], 0],
3846
+ ["emit", "INVENTORY_EMPTY"]
3847
+ ]
3848
+ ]
3849
+ },
3850
+ {
3851
+ from: "HasItems",
3852
+ to: "Empty",
3853
+ event: "INVENTORY_EMPTY",
3854
+ effects: []
3855
+ },
3856
+ {
3857
+ event: "EQUIP",
3858
+ effects: [
3859
+ ["set", "@entity.equipped", ["object/set", "@entity.equipped", "@payload.slot", "@payload.item"]],
3860
+ ["emit", "STATS_UPDATED", { equipped: "@entity.equipped" }]
3861
+ ]
3862
+ },
3863
+ {
3864
+ event: "UNEQUIP",
3865
+ effects: [
3866
+ ["set", "@entity.equipped", ["object/remove", "@entity.equipped", "@payload.slot"]],
3867
+ ["emit", "STATS_UPDATED", { equipped: "@entity.equipped" }]
3868
+ ]
3869
+ },
3870
+ {
3871
+ event: "OPEN",
3872
+ effects: [
3873
+ ["set", "@entity.isOpen", true],
3874
+ ["render", "overlay.inventory", "inventory-panel", {
3875
+ items: "@entity.items",
3876
+ selectedSlot: "@entity.selectedSlot",
3877
+ equipped: "@entity.equipped",
3878
+ maxSlots: "@config.maxSlots",
3879
+ onUse: "USE",
3880
+ onDrop: "DROP",
3881
+ onEquip: "EQUIP",
3882
+ onClose: "CLOSE"
3883
+ }]
3884
+ ]
3885
+ },
3886
+ {
3887
+ event: "CLOSE",
3888
+ effects: [
3889
+ ["set", "@entity.isOpen", false],
3890
+ ["render", "overlay.inventory", null]
3891
+ ]
3892
+ }
3893
+ ]
3894
+ },
3895
+ configSchema: {
3896
+ required: [],
3897
+ optional: [
3898
+ { name: "maxSlots", type: "number", description: "Maximum inventory slots", default: 20 },
3899
+ { name: "stackable", type: "boolean", description: "Allow item stacking", default: true },
3900
+ { name: "maxStack", type: "number", description: "Maximum stack size", default: 99 }
3901
+ ]
3902
+ }
3903
+ };
3904
+ var GAME_ENTITY_BEHAVIORS = [
3905
+ HEALTH_BEHAVIOR,
3906
+ SCORE_BEHAVIOR,
3907
+ MOVEMENT_BEHAVIOR,
3908
+ COMBAT_BEHAVIOR,
3909
+ INVENTORY_BEHAVIOR
3910
+ ];
3911
+
3912
+ // behaviors/game-ui.ts
3913
+ var GAME_FLOW_BEHAVIOR = {
3914
+ name: "std/GameFlow",
3915
+ category: "game-ui",
3916
+ description: "Master game flow: menu, play, pause, game over, victory",
3917
+ suggestedFor: [
3918
+ "All games",
3919
+ "Game state management",
3920
+ "Menu systems",
3921
+ "Win/lose conditions"
3922
+ ],
3923
+ dataEntities: [
3924
+ {
3925
+ name: "GameFlowState",
3926
+ runtime: true,
3927
+ singleton: true,
3928
+ fields: [
3929
+ { name: "playTime", type: "number", default: 0 },
3930
+ { name: "attempts", type: "number", default: 0 },
3931
+ { name: "lastState", type: "string", default: "Menu" }
3932
+ ]
3933
+ }
3934
+ ],
3935
+ stateMachine: {
3936
+ initial: "Menu",
3937
+ states: [
3938
+ { name: "Menu", isInitial: true },
3939
+ { name: "Playing" },
3940
+ { name: "Paused" },
3941
+ { name: "GameOver" },
3942
+ { name: "Victory" }
3943
+ ],
3944
+ events: [
3945
+ { key: "START" },
3946
+ { key: "PAUSE" },
3947
+ { key: "RESUME" },
3948
+ { key: "GAME_OVER" },
3949
+ { key: "VICTORY" },
3950
+ { key: "RESTART" },
3951
+ { key: "QUIT" }
3952
+ ],
3953
+ transitions: [
3954
+ {
3955
+ from: "*",
3956
+ to: "Menu",
3957
+ event: "QUIT",
3958
+ effects: [
3959
+ ["emit", "STOP"],
3960
+ ["render", "screen", "game-menu", {
3961
+ title: "@config.title",
3962
+ onStart: "START"
3963
+ }]
3964
+ ]
3965
+ },
3966
+ {
3967
+ from: "Menu",
3968
+ to: "Playing",
3969
+ event: "START",
3970
+ effects: [
3971
+ ["set", "@entity.attempts", ["+", "@entity.attempts", 1]],
3972
+ ["set", "@entity.playTime", 0],
3973
+ ["emit", "GAME_LOOP_START"],
3974
+ ["render", "screen", null],
3975
+ ["render", "canvas", "game-canvas", {}]
3976
+ ]
3977
+ },
3978
+ {
3979
+ from: "Playing",
3980
+ to: "Paused",
3981
+ event: "PAUSE",
3982
+ guard: "@config.allowPause",
3983
+ effects: [
3984
+ ["set", "@entity.lastState", "Playing"],
3985
+ ["emit", "GAME_LOOP_PAUSE"],
3986
+ ["render", "overlay", "game-pause-overlay", {
3987
+ onResume: "RESUME",
3988
+ onQuit: "QUIT",
3989
+ playTime: "@entity.playTime"
3990
+ }]
3991
+ ]
3992
+ },
3993
+ {
3994
+ from: "Paused",
3995
+ to: "Playing",
3996
+ event: "RESUME",
3997
+ effects: [
3998
+ ["emit", "GAME_LOOP_RESUME"],
3999
+ ["render", "overlay", null]
4000
+ ]
4001
+ },
4002
+ {
4003
+ from: "Playing",
4004
+ to: "GameOver",
4005
+ event: "GAME_OVER",
4006
+ effects: [
4007
+ ["emit", "STOP"],
4008
+ ["render", "overlay", "game-over-screen", {
4009
+ victory: false,
4010
+ playTime: "@entity.playTime",
4011
+ attempts: "@entity.attempts",
4012
+ onRestart: "RESTART",
4013
+ onQuit: "QUIT"
4014
+ }]
4015
+ ]
4016
+ },
4017
+ {
4018
+ from: "Playing",
4019
+ to: "Victory",
4020
+ event: "VICTORY",
4021
+ effects: [
4022
+ ["emit", "STOP"],
4023
+ ["render", "overlay", "game-over-screen", {
4024
+ victory: true,
4025
+ playTime: "@entity.playTime",
4026
+ attempts: "@entity.attempts",
4027
+ onRestart: "RESTART",
4028
+ onQuit: "QUIT"
4029
+ }]
4030
+ ]
4031
+ },
4032
+ {
4033
+ from: ["GameOver", "Victory"],
4034
+ to: "Playing",
4035
+ event: "RESTART",
4036
+ effects: [
4037
+ ["render", "overlay", null],
4038
+ ["emit", "GAME_RESET"],
4039
+ ["emit", "START"]
4040
+ ]
4041
+ }
4042
+ ]
4043
+ },
4044
+ configSchema: {
4045
+ required: [],
4046
+ optional: [
4047
+ { name: "title", type: "string", description: "Game title", default: "Game" },
4048
+ { name: "showMenu", type: "boolean", description: "Show main menu", default: true },
4049
+ { name: "allowPause", type: "boolean", description: "Allow pausing", default: true }
4050
+ ]
4051
+ }
4052
+ };
4053
+ var DIALOGUE_BEHAVIOR = {
4054
+ name: "std/Dialogue",
4055
+ category: "game-ui",
4056
+ description: "NPC dialogue system with branching conversations",
4057
+ suggestedFor: [
4058
+ "RPGs",
4059
+ "Adventure games",
4060
+ "Story-driven games",
4061
+ "NPC interactions"
4062
+ ],
4063
+ dataEntities: [
4064
+ {
4065
+ name: "DialogueState",
4066
+ runtime: true,
4067
+ fields: [
4068
+ { name: "dialogueTree", type: "array", default: [] },
4069
+ { name: "currentNode", type: "number", default: 0 },
4070
+ { name: "displayedText", type: "string", default: "" },
4071
+ { name: "isTyping", type: "boolean", default: false },
4072
+ { name: "speaker", type: "string", default: "" },
4073
+ { name: "typeIndex", type: "number", default: 0 },
4074
+ { name: "lastTypeTime", type: "number", default: 0 }
4075
+ ]
4076
+ }
4077
+ ],
4078
+ stateMachine: {
4079
+ initial: "Hidden",
4080
+ states: [
4081
+ { name: "Hidden", isInitial: true },
4082
+ { name: "Typing" },
4083
+ { name: "Showing" },
4084
+ { name: "Choice" }
4085
+ ],
4086
+ events: [
4087
+ { key: "SHOW" },
4088
+ { key: "NEXT" },
4089
+ { key: "SELECT_CHOICE" },
4090
+ { key: "SKIP" },
4091
+ { key: "CLOSE" },
4092
+ { key: "TYPE_CHAR" },
4093
+ { key: "TYPE_COMPLETE" }
4094
+ ],
4095
+ transitions: [
4096
+ {
4097
+ from: "Hidden",
4098
+ to: "Typing",
4099
+ event: "SHOW",
4100
+ effects: [
4101
+ ["set", "@entity.dialogueTree", "@payload.dialogue"],
4102
+ ["set", "@entity.currentNode", 0],
4103
+ ["set", "@entity.isTyping", true],
4104
+ ["set", "@entity.displayedText", ""],
4105
+ ["set", "@entity.typeIndex", 0],
4106
+ ["set", "@entity.lastTypeTime", "@now"],
4107
+ ["emit", "GAME_PAUSE"],
4108
+ ["render", "overlay.dialogue", "dialogue-box", {
4109
+ speaker: "@entity.speaker",
4110
+ text: "@entity.displayedText",
4111
+ isTyping: "@entity.isTyping",
4112
+ onNext: "NEXT",
4113
+ onSkip: "SKIP"
4114
+ }]
4115
+ ]
4116
+ },
4117
+ {
4118
+ from: "Typing",
4119
+ event: "TYPE_CHAR",
4120
+ effects: [
4121
+ [
4122
+ "let",
4123
+ [["currentDialogue", ["array/nth", "@entity.dialogueTree", "@entity.currentNode"]]],
4124
+ [
4125
+ "do",
4126
+ ["set", "@entity.typeIndex", ["+", "@entity.typeIndex", 1]],
4127
+ ["set", "@entity.displayedText", ["str/slice", "@currentDialogue.text", 0, "@entity.typeIndex"]],
4128
+ ["set", "@entity.lastTypeTime", "@now"]
4129
+ ]
4130
+ ]
4131
+ ]
4132
+ },
4133
+ {
4134
+ from: "Typing",
4135
+ to: "Showing",
4136
+ event: "TYPE_COMPLETE",
4137
+ effects: [
4138
+ ["set", "@entity.isTyping", false]
4139
+ ]
4140
+ },
4141
+ {
4142
+ from: "Typing",
4143
+ to: "Showing",
4144
+ event: "SKIP",
4145
+ effects: [
4146
+ [
4147
+ "let",
4148
+ [["currentDialogue", ["array/nth", "@entity.dialogueTree", "@entity.currentNode"]]],
4149
+ [
4150
+ "do",
4151
+ ["set", "@entity.isTyping", false],
4152
+ ["set", "@entity.displayedText", "@currentDialogue.text"]
4153
+ ]
4154
+ ]
4155
+ ]
4156
+ },
4157
+ {
4158
+ from: "Showing",
4159
+ event: "NEXT",
4160
+ guard: ["not", ["object/get", ["array/nth", "@entity.dialogueTree", "@entity.currentNode"], "choices"]],
4161
+ effects: [
4162
+ [
4163
+ "if",
4164
+ [">=", "@entity.currentNode", ["-", ["array/len", "@entity.dialogueTree"], 1]],
4165
+ ["emit", "CLOSE"],
4166
+ [
4167
+ "do",
4168
+ ["set", "@entity.currentNode", ["+", "@entity.currentNode", 1]],
4169
+ ["set", "@entity.isTyping", true],
4170
+ ["set", "@entity.displayedText", ""],
4171
+ ["set", "@entity.typeIndex", 0]
4172
+ ]
4173
+ ]
4174
+ ]
4175
+ },
4176
+ {
4177
+ from: "Showing",
4178
+ to: "Choice",
4179
+ event: "NEXT",
4180
+ guard: ["object/get", ["array/nth", "@entity.dialogueTree", "@entity.currentNode"], "choices"],
4181
+ effects: [
4182
+ [
4183
+ "let",
4184
+ [["currentDialogue", ["array/nth", "@entity.dialogueTree", "@entity.currentNode"]]],
4185
+ ["render", "overlay.dialogue", "dialogue-box", {
4186
+ choices: "@currentDialogue.choices",
4187
+ onSelect: "SELECT_CHOICE"
4188
+ }]
4189
+ ]
4190
+ ]
4191
+ },
4192
+ {
4193
+ from: "Choice",
4194
+ to: "Typing",
4195
+ event: "SELECT_CHOICE",
4196
+ effects: [
4197
+ [
4198
+ "let",
4199
+ [["currentDialogue", ["array/nth", "@entity.dialogueTree", "@entity.currentNode"]]],
4200
+ [
4201
+ "let",
4202
+ [["choice", ["array/nth", "@currentDialogue.choices", "@payload.index"]]],
4203
+ [
4204
+ "do",
4205
+ [
4206
+ "if",
4207
+ "@choice.nextNode",
4208
+ ["set", "@entity.currentNode", "@choice.nextNode"],
4209
+ ["set", "@entity.currentNode", ["+", "@entity.currentNode", 1]]
4210
+ ],
4211
+ [
4212
+ "if",
4213
+ "@choice.effect",
4214
+ ["emit", "@choice.effect"]
4215
+ ]
4216
+ ]
4217
+ ]
4218
+ ],
4219
+ ["set", "@entity.isTyping", true],
4220
+ ["set", "@entity.displayedText", ""],
4221
+ ["set", "@entity.typeIndex", 0]
4222
+ ]
4223
+ },
4224
+ {
4225
+ from: ["Typing", "Showing", "Choice"],
4226
+ to: "Hidden",
4227
+ event: "CLOSE",
4228
+ effects: [
4229
+ ["set", "@entity.dialogueTree", []],
4230
+ ["set", "@entity.currentNode", 0],
4231
+ ["emit", "GAME_RESUME"],
4232
+ ["render", "overlay.dialogue", null]
4233
+ ]
4234
+ }
4235
+ ]
4236
+ },
4237
+ ticks: [
4238
+ {
4239
+ name: "TypewriterEffect",
4240
+ interval: "frame",
4241
+ guard: ["and", "@entity.isTyping", [">", ["-", "@now", "@entity.lastTypeTime"], ["/", 1e3, "@config.typingSpeed"]]],
4242
+ effects: [
4243
+ [
4244
+ "let",
4245
+ [["currentDialogue", ["array/nth", "@entity.dialogueTree", "@entity.currentNode"]]],
4246
+ [
4247
+ "if",
4248
+ ["<", "@entity.typeIndex", ["str/len", "@currentDialogue.text"]],
4249
+ ["emit", "TYPE_CHAR"],
4250
+ ["emit", "TYPE_COMPLETE"]
4251
+ ]
4252
+ ]
4253
+ ]
4254
+ }
4255
+ ],
4256
+ configSchema: {
4257
+ required: [],
4258
+ optional: [
4259
+ { name: "typingSpeed", type: "number", description: "Characters per second", default: 30 },
4260
+ { name: "autoAdvance", type: "boolean", description: "Auto-advance after typing", default: false },
4261
+ { name: "autoAdvanceDelay", type: "number", description: "Delay before auto-advance (ms)", default: 2e3 },
4262
+ { name: "showPortrait", type: "boolean", description: "Show speaker portrait", default: true }
4263
+ ]
4264
+ }
4265
+ };
4266
+ var LEVEL_PROGRESS_BEHAVIOR = {
4267
+ name: "std/LevelProgress",
4268
+ category: "game-ui",
4269
+ description: "Level progression with unlock, selection, and completion tracking",
4270
+ suggestedFor: [
4271
+ "Level-based games",
4272
+ "Puzzle games",
4273
+ "Platformers with levels",
4274
+ "Mobile games"
4275
+ ],
4276
+ dataEntities: [
4277
+ {
4278
+ name: "LevelProgressState",
4279
+ runtime: true,
4280
+ singleton: true,
4281
+ fields: [
4282
+ { name: "currentLevel", type: "number", default: 0 },
4283
+ { name: "unlockedLevels", type: "array", default: [0] },
4284
+ { name: "levelStars", type: "object", default: {} },
4285
+ { name: "totalStars", type: "number", default: 0 }
4286
+ ]
4287
+ }
4288
+ ],
4289
+ stateMachine: {
4290
+ initial: "Browsing",
4291
+ states: [
4292
+ { name: "Browsing", isInitial: true },
4293
+ { name: "LevelLoading" },
4294
+ { name: "InLevel" }
4295
+ ],
4296
+ events: [
4297
+ { key: "INIT" },
4298
+ { key: "SELECT_LEVEL" },
4299
+ { key: "LEVEL_LOADED" },
4300
+ { key: "COMPLETE_LEVEL" },
4301
+ { key: "UNLOCK_LEVEL" },
4302
+ { key: "BACK_TO_SELECT" }
4303
+ ],
4304
+ transitions: [
4305
+ {
4306
+ from: "*",
4307
+ to: "Browsing",
4308
+ event: "INIT",
4309
+ effects: [
4310
+ ["render", "screen", "level-select", {
4311
+ levels: "@config.levels",
4312
+ unlockedLevels: "@entity.unlockedLevels",
4313
+ levelStars: "@entity.levelStars",
4314
+ starsPerLevel: "@config.starsPerLevel",
4315
+ totalStars: "@entity.totalStars",
4316
+ onSelect: "SELECT_LEVEL"
4317
+ }]
4318
+ ]
4319
+ },
4320
+ {
4321
+ from: "Browsing",
4322
+ to: "LevelLoading",
4323
+ event: "SELECT_LEVEL",
4324
+ guard: ["array/includes", "@entity.unlockedLevels", "@payload.levelIndex"],
4325
+ effects: [
4326
+ ["set", "@entity.currentLevel", "@payload.levelIndex"],
4327
+ ["render", "screen", "loading-screen", {
4328
+ level: ["array/nth", "@config.levels", "@payload.levelIndex"]
4329
+ }],
4330
+ ["emit", "LOAD_LEVEL", { levelData: ["array/nth", "@config.levels", "@payload.levelIndex"] }]
4331
+ ]
4332
+ },
4333
+ {
4334
+ from: "LevelLoading",
4335
+ to: "InLevel",
4336
+ event: "LEVEL_LOADED",
4337
+ effects: [
4338
+ ["render", "screen", null],
4339
+ ["emit", "START"]
4340
+ ]
4341
+ },
4342
+ {
4343
+ from: "InLevel",
4344
+ event: "COMPLETE_LEVEL",
4345
+ effects: [
4346
+ ["set", "@entity.levelStars", [
4347
+ "object/set",
4348
+ "@entity.levelStars",
4349
+ ["str/toString", "@entity.currentLevel"],
4350
+ ["math/max", "@payload.stars", ["object/get", "@entity.levelStars", ["str/toString", "@entity.currentLevel"], 0]]
4351
+ ]],
4352
+ ["set", "@entity.totalStars", ["array/reduce", ["object/values", "@entity.levelStars"], ["fn", "sum", "v", ["+", "@sum", "@v"]], 0]],
4353
+ [
4354
+ "if",
4355
+ ["and", "@config.unlockNext", ["<", "@entity.currentLevel", ["-", ["array/len", "@config.levels"], 1]]],
4356
+ ["emit", "UNLOCK_LEVEL", { levelIndex: ["+", "@entity.currentLevel", 1] }]
4357
+ ],
4358
+ [
4359
+ "if",
4360
+ "@config.persistProgress",
4361
+ ["persist", "save", "LevelProgress", {
4362
+ unlockedLevels: "@entity.unlockedLevels",
4363
+ levelStars: "@entity.levelStars"
4364
+ }]
4365
+ ]
4366
+ ]
4367
+ },
4368
+ {
4369
+ event: "UNLOCK_LEVEL",
4370
+ guard: ["not", ["array/includes", "@entity.unlockedLevels", "@payload.levelIndex"]],
4371
+ effects: [
4372
+ ["set", "@entity.unlockedLevels", ["array/append", "@entity.unlockedLevels", "@payload.levelIndex"]]
4373
+ ]
4374
+ },
4375
+ {
4376
+ from: "InLevel",
4377
+ to: "Browsing",
4378
+ event: "BACK_TO_SELECT",
4379
+ effects: [
4380
+ ["emit", "INIT"]
4381
+ ]
4382
+ }
4383
+ ]
4384
+ },
4385
+ configSchema: {
4386
+ required: [
4387
+ { name: "levels", type: "array", description: "Level definitions" }
4388
+ ],
4389
+ optional: [
4390
+ { name: "starsPerLevel", type: "number", description: "Max stars per level", default: 3 },
4391
+ { name: "unlockNext", type: "boolean", description: "Auto-unlock next level on complete", default: true },
4392
+ { name: "persistProgress", type: "boolean", description: "Save progress to storage", default: true }
4393
+ ]
4394
+ }
4395
+ };
4396
+ var GAME_UI_BEHAVIORS = [
4397
+ GAME_FLOW_BEHAVIOR,
4398
+ DIALOGUE_BEHAVIOR,
4399
+ LEVEL_PROGRESS_BEHAVIOR
4400
+ ];
4401
+
4402
+ // behaviors/registry.ts
4403
+ var STANDARD_BEHAVIORS = [
4404
+ ...UI_INTERACTION_BEHAVIORS,
4405
+ ...DATA_MANAGEMENT_BEHAVIORS,
4406
+ ...ASYNC_BEHAVIORS,
4407
+ ...FEEDBACK_BEHAVIORS,
4408
+ ...GAME_CORE_BEHAVIORS,
4409
+ ...GAME_ENTITY_BEHAVIORS,
4410
+ ...GAME_UI_BEHAVIORS
4411
+ ];
4412
+ var BEHAVIOR_REGISTRY = STANDARD_BEHAVIORS.reduce(
4413
+ (acc, behavior) => {
4414
+ acc[behavior.name] = behavior;
4415
+ return acc;
4416
+ },
4417
+ {}
4418
+ );
4419
+ var BEHAVIORS_BY_CATEGORY = {
4420
+ "ui-interaction": UI_INTERACTION_BEHAVIORS,
4421
+ "data-management": DATA_MANAGEMENT_BEHAVIORS,
4422
+ "async": ASYNC_BEHAVIORS,
4423
+ "feedback": FEEDBACK_BEHAVIORS,
4424
+ "game-core": GAME_CORE_BEHAVIORS,
4425
+ "game-entity": GAME_ENTITY_BEHAVIORS,
4426
+ "game-ui": GAME_UI_BEHAVIORS
4427
+ };
4428
+ function getBehavior(name) {
4429
+ return BEHAVIOR_REGISTRY[name];
4430
+ }
4431
+ function isKnownBehavior(name) {
4432
+ return name in BEHAVIOR_REGISTRY;
4433
+ }
4434
+ function getBehaviorsByCategory(category) {
4435
+ return BEHAVIORS_BY_CATEGORY[category] ?? [];
4436
+ }
4437
+ function getAllBehaviorNames() {
4438
+ return Object.keys(BEHAVIOR_REGISTRY);
4439
+ }
4440
+ function getAllBehaviors() {
4441
+ return STANDARD_BEHAVIORS;
4442
+ }
4443
+ function getAllBehaviorMetadata() {
4444
+ return STANDARD_BEHAVIORS.map(getBehaviorMetadata);
4445
+ }
4446
+ function findBehaviorsForUseCase(useCase) {
4447
+ const lowerUseCase = useCase.toLowerCase();
4448
+ return STANDARD_BEHAVIORS.filter(
4449
+ (behavior) => behavior.suggestedFor?.some(
4450
+ (suggestion) => suggestion.toLowerCase().includes(lowerUseCase) || lowerUseCase.includes(suggestion.toLowerCase())
4451
+ ) ?? false
4452
+ );
4453
+ }
4454
+ function getBehaviorsForEvent(event) {
4455
+ return STANDARD_BEHAVIORS.filter((behavior) => {
4456
+ const events = behavior.stateMachine?.events || [];
4457
+ return events.some((e) => (typeof e === "string" ? e : e.key) === event);
4458
+ });
4459
+ }
4460
+ function getBehaviorsWithState(state) {
4461
+ return STANDARD_BEHAVIORS.filter((behavior) => {
4462
+ const states = behavior.stateMachine?.states || [];
4463
+ return states.some((s) => (typeof s === "string" ? s : s.name) === state);
4464
+ });
4465
+ }
4466
+ function validateBehaviorReference(name) {
4467
+ if (!name.startsWith("std/")) {
4468
+ return `Behavior name must start with 'std/': ${name}`;
4469
+ }
4470
+ if (!isKnownBehavior(name)) {
4471
+ const suggestions = findSimilarBehaviors(name);
4472
+ if (suggestions.length > 0) {
4473
+ return `Unknown behavior '${name}'. Did you mean: ${suggestions.join(", ")}?`;
4474
+ }
4475
+ return `Unknown behavior: ${name}`;
4476
+ }
4477
+ return null;
4478
+ }
4479
+ function findSimilarBehaviors(name) {
4480
+ const normalizedInput = name.toLowerCase().replace("std/", "");
4481
+ return getAllBehaviorNames().filter((behaviorName) => {
4482
+ const normalizedBehavior = behaviorName.toLowerCase().replace("std/", "");
4483
+ return normalizedBehavior.includes(normalizedInput) || normalizedInput.includes(normalizedBehavior) || levenshteinDistance(normalizedInput, normalizedBehavior) <= 3;
4484
+ });
4485
+ }
4486
+ function levenshteinDistance(a, b) {
4487
+ if (a.length === 0) return b.length;
4488
+ if (b.length === 0) return a.length;
4489
+ const matrix = [];
4490
+ for (let i = 0; i <= b.length; i++) {
4491
+ matrix[i] = [i];
4492
+ }
4493
+ for (let j = 0; j <= a.length; j++) {
4494
+ matrix[0][j] = j;
4495
+ }
4496
+ for (let i = 1; i <= b.length; i++) {
4497
+ for (let j = 1; j <= a.length; j++) {
4498
+ if (b.charAt(i - 1) === a.charAt(j - 1)) {
4499
+ matrix[i][j] = matrix[i - 1][j - 1];
4500
+ } else {
4501
+ matrix[i][j] = Math.min(
4502
+ matrix[i - 1][j - 1] + 1,
4503
+ matrix[i][j - 1] + 1,
4504
+ matrix[i - 1][j] + 1
4505
+ );
4506
+ }
4507
+ }
4508
+ }
4509
+ return matrix[b.length][a.length];
4510
+ }
4511
+ function getBehaviorLibraryStats() {
4512
+ const byCategory = {};
4513
+ let totalStates = 0;
4514
+ let totalEvents = 0;
4515
+ let totalTransitions = 0;
4516
+ let totalTicks = 0;
4517
+ for (const behavior of STANDARD_BEHAVIORS) {
4518
+ byCategory[behavior.category] = (byCategory[behavior.category] ?? 0) + 1;
4519
+ const sm = behavior.stateMachine;
4520
+ if (sm) {
4521
+ totalStates += (sm.states || []).length;
4522
+ totalEvents += (sm.events || []).length;
4523
+ totalTransitions += (sm.transitions || []).length;
4524
+ }
4525
+ totalTicks += (behavior.ticks || []).length;
4526
+ }
4527
+ return {
4528
+ totalBehaviors: STANDARD_BEHAVIORS.length,
4529
+ byCategory,
4530
+ totalStates,
4531
+ totalEvents,
4532
+ totalTransitions,
4533
+ totalTicks
4534
+ };
4535
+ }
4536
+
4537
+ export { ACTION_AFFINITY, ASYNC_BEHAVIORS, BEHAVIORS_BY_CATEGORY, BEHAVIOR_CATEGORIES, BEHAVIOR_REGISTRY, COLLISION_BEHAVIOR, COMBAT_BEHAVIOR, CONFIRMATION_BEHAVIOR, DATA_MANAGEMENT_BEHAVIORS, DETAIL_BEHAVIOR, DIALOGUE_BEHAVIOR, DRAWER_BEHAVIOR, FEEDBACK_BEHAVIORS, FETCH_BEHAVIOR, FILTER_BEHAVIOR2 as FILTER_BEHAVIOR, FORM_BEHAVIOR, GAME_CORE_BEHAVIORS, GAME_ENTITY_BEHAVIORS, GAME_FLOW_BEHAVIOR, GAME_LOOP_BEHAVIOR, GAME_UI_BEHAVIORS, HEALTH_BEHAVIOR, INPUT_BEHAVIOR, INVENTORY_BEHAVIOR, LEVEL_PROGRESS_BEHAVIOR, LIST_BEHAVIOR, LOADING_BEHAVIOR, MASTER_DETAIL_BEHAVIOR, MODAL_BEHAVIOR, MOVEMENT_BEHAVIOR, NOTIFICATION_BEHAVIOR, PAGINATION_BEHAVIOR, PHYSICS_2D_BEHAVIOR, POLL_BEHAVIOR, RETRY_BEHAVIOR, SCORE_BEHAVIOR, SEARCH_BEHAVIOR, SELECTION_BEHAVIOR, SORT_BEHAVIOR, STANDARD_BEHAVIORS, SUBMIT_BEHAVIOR, TABS_BEHAVIOR, UI_EVENTS, UI_INTERACTION_BEHAVIORS, UNDO_BEHAVIOR, WIZARD_BEHAVIOR, findBehaviorsForUseCase, getAllBehaviorMetadata, getAllBehaviorNames, getAllBehaviors, getAllKnownComponents, getBehavior, getBehaviorLibraryStats, getBehaviorMetadata, getBehaviorsByCategory, getBehaviorsForEvent, getBehaviorsWithState, getComponentsByCategory, getComponentsForEvent, getInvalidActionsForComponent, getValidActionsForComponent, isActionInvalidForComponent, isActionValidForComponent, isBehaviorCategory, isGameBehaviorCategory, isKnownBehavior, validateActionsForComponent, validateBehaviorEvents, validateBehaviorReference, validateBehaviorStates, validateBehaviorStructure };
4538
+ //# sourceMappingURL=index.js.map
4539
+ //# sourceMappingURL=index.js.map