@almadar/std 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/behaviors/async.d.ts +8 -8
  2. package/dist/behaviors/async.js +548 -500
  3. package/dist/behaviors/async.js.map +1 -1
  4. package/dist/behaviors/data-management.d.ts +11 -19
  5. package/dist/behaviors/data-management.js +468 -449
  6. package/dist/behaviors/data-management.js.map +1 -1
  7. package/dist/behaviors/feedback.d.ts +6 -6
  8. package/dist/behaviors/feedback.js +312 -278
  9. package/dist/behaviors/feedback.js.map +1 -1
  10. package/dist/behaviors/game-core.d.ts +11 -12
  11. package/dist/behaviors/game-core.js +357 -406
  12. package/dist/behaviors/game-core.js.map +1 -1
  13. package/dist/behaviors/game-entity.d.ts +13 -14
  14. package/dist/behaviors/game-entity.js +622 -592
  15. package/dist/behaviors/game-entity.js.map +1 -1
  16. package/dist/behaviors/game-ui.d.ts +9 -10
  17. package/dist/behaviors/game-ui.js +522 -459
  18. package/dist/behaviors/game-ui.js.map +1 -1
  19. package/dist/behaviors/index.d.ts +3 -3
  20. package/dist/behaviors/index.js +3876 -3843
  21. package/dist/behaviors/index.js.map +1 -1
  22. package/dist/behaviors/registry.d.ts +14 -24
  23. package/dist/behaviors/registry.js +3868 -3803
  24. package/dist/behaviors/registry.js.map +1 -1
  25. package/dist/behaviors/types.d.ts +14 -138
  26. package/dist/behaviors/types.js +10 -47
  27. package/dist/behaviors/types.js.map +1 -1
  28. package/dist/behaviors/ui-interaction.d.ts +13 -20
  29. package/dist/behaviors/ui-interaction.js +961 -1043
  30. package/dist/behaviors/ui-interaction.js.map +1 -1
  31. package/dist/index.d.ts +44 -11
  32. package/dist/index.js +3913 -3870
  33. package/dist/index.js.map +1 -1
  34. package/dist/modules/index.js +11 -0
  35. package/dist/modules/index.js.map +1 -1
  36. package/dist/modules/str.js +11 -0
  37. package/dist/modules/str.js.map +1 -1
  38. package/dist/registry.js +11 -0
  39. package/dist/registry.js.map +1 -1
  40. package/package.json +3 -2
@@ -1,486 +1,505 @@
1
1
  // behaviors/data-management.ts
2
2
  var PAGINATION_BEHAVIOR = {
3
- name: "std/Pagination",
4
- category: "data-management",
3
+ name: "std-pagination",
4
+ version: "1.0.0",
5
5
  description: "Page-based navigation for large data sets",
6
- suggestedFor: [
7
- "Large lists",
8
- "Table pagination",
9
- "Infinite scroll alternative",
10
- "Data-heavy views"
11
- ],
12
- dataEntities: [
6
+ orbitals: [
13
7
  {
14
- name: "PaginationState",
15
- runtime: true,
16
- singleton: true,
17
- fields: [
18
- { name: "page", type: "number", default: 1 },
19
- { name: "pageSize", type: "number", default: 20 },
20
- { name: "totalItems", type: "number", default: 0 }
21
- ]
22
- }
23
- ],
24
- stateMachine: {
25
- initial: "Active",
26
- states: [
27
- { name: "Active", isInitial: true }
28
- ],
29
- events: [
30
- { key: "INIT" },
31
- { key: "NEXT_PAGE" },
32
- { key: "PREV_PAGE" },
33
- { key: "GO_TO_PAGE" },
34
- { key: "SET_PAGE_SIZE" }
35
- ],
36
- transitions: [
37
- {
38
- from: "*",
39
- event: "INIT",
40
- effects: [
41
- ["set", "@entity.page", 1],
42
- ["set", "@entity.pageSize", "@config.defaultPageSize"]
43
- ]
44
- },
45
- {
46
- event: "NEXT_PAGE",
47
- guard: ["<", "@entity.page", ["math/ceil", ["/", "@entity.totalItems", "@entity.pageSize"]]],
48
- effects: [
49
- ["set", "@entity.page", ["+", "@entity.page", 1]]
50
- ]
51
- },
52
- {
53
- event: "PREV_PAGE",
54
- guard: [">", "@entity.page", 1],
55
- effects: [
56
- ["set", "@entity.page", ["-", "@entity.page", 1]]
8
+ name: "PaginationOrbital",
9
+ entity: {
10
+ name: "PaginationState",
11
+ persistence: "runtime",
12
+ fields: [
13
+ { name: "id", type: "string", required: true },
14
+ { name: "page", type: "number", default: 1 },
15
+ { name: "pageSize", type: "number", default: 20 },
16
+ { name: "totalItems", type: "number", default: 0 },
17
+ { name: "defaultPageSize", type: "number", default: 20 }
57
18
  ]
58
19
  },
59
- {
60
- event: "GO_TO_PAGE",
61
- guard: [
62
- "and",
63
- [">=", "@payload.page", 1],
64
- ["<=", "@payload.page", ["math/ceil", ["/", "@entity.totalItems", "@entity.pageSize"]]]
65
- ],
66
- effects: [
67
- ["set", "@entity.page", "@payload.page"]
68
- ]
69
- },
70
- {
71
- event: "SET_PAGE_SIZE",
72
- effects: [
73
- ["set", "@entity.pageSize", "@payload.size"],
74
- ["set", "@entity.page", 1]
75
- ]
76
- }
77
- ]
78
- },
79
- configSchema: {
80
- required: [],
81
- optional: [
82
- { name: "defaultPageSize", type: "number", description: "Default items per page", default: 20 },
83
- { name: "pageSizeOptions", type: "array", description: "Available page sizes", default: [10, 20, 50, 100] }
84
- ]
85
- }
20
+ traits: [
21
+ {
22
+ name: "Pagination",
23
+ linkedEntity: "PaginationState",
24
+ category: "interaction",
25
+ stateMachine: {
26
+ states: [{ name: "Active", isInitial: true }],
27
+ events: [
28
+ { key: "INIT", name: "Initialize" },
29
+ { key: "NEXT_PAGE", name: "Next Page" },
30
+ { key: "PREV_PAGE", name: "Previous Page" },
31
+ { key: "GO_TO_PAGE", name: "Go to Page" },
32
+ { key: "SET_PAGE_SIZE", name: "Set Page Size" }
33
+ ],
34
+ transitions: [
35
+ {
36
+ from: "Active",
37
+ to: "Active",
38
+ event: "INIT",
39
+ effects: [
40
+ ["set", "@entity.page", 1],
41
+ ["set", "@entity.pageSize", "@entity.defaultPageSize"]
42
+ ]
43
+ },
44
+ {
45
+ from: "Active",
46
+ to: "Active",
47
+ event: "NEXT_PAGE",
48
+ guard: ["<", "@entity.page", ["math/ceil", ["/", "@entity.totalItems", "@entity.pageSize"]]],
49
+ effects: [["set", "@entity.page", ["+", "@entity.page", 1]]]
50
+ },
51
+ {
52
+ from: "Active",
53
+ to: "Active",
54
+ event: "PREV_PAGE",
55
+ guard: [">", "@entity.page", 1],
56
+ effects: [["set", "@entity.page", ["-", "@entity.page", 1]]]
57
+ },
58
+ {
59
+ from: "Active",
60
+ to: "Active",
61
+ event: "GO_TO_PAGE",
62
+ guard: [
63
+ "and",
64
+ [">=", "@payload.page", 1],
65
+ ["<=", "@payload.page", ["math/ceil", ["/", "@entity.totalItems", "@entity.pageSize"]]]
66
+ ],
67
+ effects: [["set", "@entity.page", "@payload.page"]]
68
+ },
69
+ {
70
+ from: "Active",
71
+ to: "Active",
72
+ event: "SET_PAGE_SIZE",
73
+ effects: [
74
+ ["set", "@entity.pageSize", "@payload.size"],
75
+ ["set", "@entity.page", 1]
76
+ ]
77
+ }
78
+ ]
79
+ }
80
+ }
81
+ ],
82
+ pages: []
83
+ }
84
+ ]
86
85
  };
87
86
  var SELECTION_BEHAVIOR = {
88
- name: "std/Selection",
89
- category: "data-management",
87
+ name: "std-selection",
88
+ version: "1.0.0",
90
89
  description: "Single or multi-selection management",
91
- suggestedFor: [
92
- "Multi-select lists",
93
- "Bulk operations",
94
- "Item picking",
95
- "Checkboxes in tables"
96
- ],
97
- dataEntities: [
90
+ orbitals: [
98
91
  {
99
- name: "SelectionState",
100
- runtime: true,
101
- singleton: true,
102
- fields: [
103
- { name: "selected", type: "array", default: [] },
104
- { name: "lastSelected", type: "string", default: null }
105
- ]
106
- }
107
- ],
108
- stateMachine: {
109
- initial: "Active",
110
- states: [
111
- { name: "Active", isInitial: true }
112
- ],
113
- events: [
114
- { key: "INIT" },
115
- { key: "SELECT" },
116
- { key: "DESELECT" },
117
- { key: "TOGGLE" },
118
- { key: "SELECT_ALL" },
119
- { key: "CLEAR" }
120
- ],
121
- transitions: [
122
- {
123
- from: "*",
124
- event: "INIT",
125
- effects: [
126
- ["set", "@entity.selected", []],
127
- ["set", "@entity.lastSelected", null]
92
+ name: "SelectionOrbital",
93
+ entity: {
94
+ name: "SelectionState",
95
+ persistence: "runtime",
96
+ fields: [
97
+ { name: "id", type: "string", required: true },
98
+ { name: "selected", type: "array", default: [] },
99
+ { name: "lastSelected", type: "string", default: null },
100
+ { name: "mode", type: "string", default: "multi" },
101
+ { name: "maxSelection", type: "number", default: null }
128
102
  ]
129
103
  },
130
- {
131
- event: "SELECT",
132
- effects: [
133
- [
134
- "if",
135
- ["=", "@config.mode", "single"],
136
- [
137
- "do",
138
- ["set", "@entity.selected", ["@payload.id"]],
139
- ["set", "@entity.lastSelected", "@payload.id"]
104
+ traits: [
105
+ {
106
+ name: "Selection",
107
+ linkedEntity: "SelectionState",
108
+ category: "interaction",
109
+ stateMachine: {
110
+ states: [{ name: "Active", isInitial: true }],
111
+ events: [
112
+ { key: "INIT", name: "Initialize" },
113
+ { key: "SELECT", name: "Select" },
114
+ { key: "DESELECT", name: "Deselect" },
115
+ { key: "TOGGLE", name: "Toggle" },
116
+ { key: "SELECT_ALL", name: "Select All" },
117
+ { key: "CLEAR", name: "Clear" }
140
118
  ],
141
- [
142
- "if",
143
- [
144
- "or",
145
- ["not", "@config.maxSelection"],
146
- ["<", ["array/len", "@entity.selected"], "@config.maxSelection"]
147
- ],
148
- [
149
- "do",
150
- ["set", "@entity.selected", ["array/append", "@entity.selected", "@payload.id"]],
151
- ["set", "@entity.lastSelected", "@payload.id"]
152
- ],
153
- ["notify", { type: "warning", message: "Maximum selection reached" }]
154
- ]
155
- ]
156
- ]
157
- },
158
- {
159
- event: "DESELECT",
160
- effects: [
161
- ["set", "@entity.selected", ["array/filter", "@entity.selected", ["fn", "id", ["!=", "@id", "@payload.id"]]]]
162
- ]
163
- },
164
- {
165
- event: "TOGGLE",
166
- effects: [
167
- [
168
- "if",
169
- ["array/includes", "@entity.selected", "@payload.id"],
170
- ["set", "@entity.selected", ["array/filter", "@entity.selected", ["fn", "id", ["!=", "@id", "@payload.id"]]]],
171
- [
172
- "if",
173
- ["or", ["=", "@config.mode", "single"], [
174
- "or",
175
- ["not", "@config.maxSelection"],
176
- ["<", ["array/len", "@entity.selected"], "@config.maxSelection"]
177
- ]],
178
- [
179
- "set",
180
- "@entity.selected",
181
- [
182
- "if",
183
- ["=", "@config.mode", "single"],
184
- ["@payload.id"],
185
- ["array/append", "@entity.selected", "@payload.id"]
119
+ transitions: [
120
+ {
121
+ from: "Active",
122
+ to: "Active",
123
+ event: "INIT",
124
+ effects: [
125
+ ["set", "@entity.selected", []],
126
+ ["set", "@entity.lastSelected", null]
127
+ ]
128
+ },
129
+ {
130
+ from: "Active",
131
+ to: "Active",
132
+ event: "SELECT",
133
+ effects: [
134
+ [
135
+ "if",
136
+ ["=", "@entity.mode", "single"],
137
+ [
138
+ "do",
139
+ ["set", "@entity.selected", ["@payload.id"]],
140
+ ["set", "@entity.lastSelected", "@payload.id"]
141
+ ],
142
+ [
143
+ "if",
144
+ [
145
+ "or",
146
+ ["not", "@entity.maxSelection"],
147
+ ["<", ["array/len", "@entity.selected"], "@entity.maxSelection"]
148
+ ],
149
+ [
150
+ "do",
151
+ ["set", "@entity.selected", ["array/append", "@entity.selected", "@payload.id"]],
152
+ ["set", "@entity.lastSelected", "@payload.id"]
153
+ ],
154
+ ["notify", "in_app", "Maximum selection reached"]
155
+ ]
156
+ ]
157
+ ]
158
+ },
159
+ {
160
+ from: "Active",
161
+ to: "Active",
162
+ event: "DESELECT",
163
+ effects: [
164
+ ["set", "@entity.selected", ["array/filter", "@entity.selected", ["fn", "id", ["!=", "@id", "@payload.id"]]]]
165
+ ]
166
+ },
167
+ {
168
+ from: "Active",
169
+ to: "Active",
170
+ event: "TOGGLE",
171
+ effects: [
172
+ [
173
+ "if",
174
+ ["array/includes", "@entity.selected", "@payload.id"],
175
+ ["set", "@entity.selected", ["array/filter", "@entity.selected", ["fn", "id", ["!=", "@id", "@payload.id"]]]],
176
+ [
177
+ "if",
178
+ ["or", ["=", "@entity.mode", "single"], [
179
+ "or",
180
+ ["not", "@entity.maxSelection"],
181
+ ["<", ["array/len", "@entity.selected"], "@entity.maxSelection"]
182
+ ]],
183
+ [
184
+ "set",
185
+ "@entity.selected",
186
+ [
187
+ "if",
188
+ ["=", "@entity.mode", "single"],
189
+ ["@payload.id"],
190
+ ["array/append", "@entity.selected", "@payload.id"]
191
+ ]
192
+ ],
193
+ ["notify", "in_app", "Maximum selection reached"]
194
+ ]
195
+ ]
196
+ ]
197
+ },
198
+ {
199
+ from: "Active",
200
+ to: "Active",
201
+ event: "SELECT_ALL",
202
+ guard: ["=", "@entity.mode", "multi"],
203
+ effects: [["set", "@entity.selected", "@payload.ids"]]
204
+ },
205
+ {
206
+ from: "Active",
207
+ to: "Active",
208
+ event: "CLEAR",
209
+ effects: [
210
+ ["set", "@entity.selected", []],
211
+ ["set", "@entity.lastSelected", null]
186
212
  ]
187
- ],
188
- ["notify", { type: "warning", message: "Maximum selection reached" }]
213
+ }
189
214
  ]
190
- ]
191
- ]
192
- },
193
- {
194
- event: "SELECT_ALL",
195
- guard: ["=", "@config.mode", "multi"],
196
- effects: [
197
- ["set", "@entity.selected", "@payload.ids"]
198
- ]
199
- },
200
- {
201
- event: "CLEAR",
202
- effects: [
203
- ["set", "@entity.selected", []],
204
- ["set", "@entity.lastSelected", null]
205
- ]
206
- }
207
- ]
208
- },
209
- configSchema: {
210
- required: [],
211
- optional: [
212
- { name: "mode", type: "string", description: "Selection mode", default: "single", enum: ["single", "multi"] },
213
- { name: "maxSelection", type: "number", description: "Maximum selections (multi mode)", default: null }
214
- ]
215
- }
215
+ }
216
+ }
217
+ ],
218
+ pages: []
219
+ }
220
+ ]
216
221
  };
217
222
  var SORT_BEHAVIOR = {
218
- name: "std/Sort",
219
- category: "data-management",
223
+ name: "std-sort",
224
+ version: "1.0.0",
220
225
  description: "Sorting by field with direction toggle",
221
- suggestedFor: [
222
- "Sortable tables",
223
- "List ordering",
224
- "Column headers"
225
- ],
226
- dataEntities: [
226
+ orbitals: [
227
227
  {
228
- name: "SortState",
229
- runtime: true,
230
- singleton: true,
231
- fields: [
232
- { name: "sortField", type: "string", default: null },
233
- { name: "sortDirection", type: "string", default: "asc" }
234
- ]
235
- }
236
- ],
237
- stateMachine: {
238
- initial: "Active",
239
- states: [
240
- { name: "Active", isInitial: true }
241
- ],
242
- events: [
243
- { key: "INIT" },
244
- { key: "SORT" },
245
- { key: "TOGGLE_DIRECTION" },
246
- { key: "CLEAR_SORT" }
247
- ],
248
- transitions: [
249
- {
250
- from: "*",
251
- event: "INIT",
252
- effects: [
253
- ["set", "@entity.sortField", "@config.defaultField"],
254
- ["set", "@entity.sortDirection", "@config.defaultDirection"]
228
+ name: "SortOrbital",
229
+ entity: {
230
+ name: "SortState",
231
+ persistence: "runtime",
232
+ fields: [
233
+ { name: "id", type: "string", required: true },
234
+ { name: "sortField", type: "string", default: null },
235
+ { name: "sortDirection", type: "string", default: "asc" },
236
+ { name: "defaultField", type: "string", default: null },
237
+ { name: "defaultDirection", type: "string", default: "asc" }
255
238
  ]
256
239
  },
257
- {
258
- event: "SORT",
259
- effects: [
260
- [
261
- "if",
262
- ["=", "@entity.sortField", "@payload.field"],
263
- ["set", "@entity.sortDirection", ["if", ["=", "@entity.sortDirection", "asc"], "desc", "asc"]],
264
- [
265
- "do",
266
- ["set", "@entity.sortField", "@payload.field"],
267
- ["set", "@entity.sortDirection", "asc"]
240
+ traits: [
241
+ {
242
+ name: "Sort",
243
+ linkedEntity: "SortState",
244
+ category: "interaction",
245
+ stateMachine: {
246
+ states: [{ name: "Active", isInitial: true }],
247
+ events: [
248
+ { key: "INIT", name: "Initialize" },
249
+ { key: "SORT", name: "Sort" },
250
+ { key: "TOGGLE_DIRECTION", name: "Toggle Direction" },
251
+ { key: "CLEAR_SORT", name: "Clear Sort" }
252
+ ],
253
+ transitions: [
254
+ {
255
+ from: "Active",
256
+ to: "Active",
257
+ event: "INIT",
258
+ effects: [
259
+ ["set", "@entity.sortField", "@entity.defaultField"],
260
+ ["set", "@entity.sortDirection", "@entity.defaultDirection"]
261
+ ]
262
+ },
263
+ {
264
+ from: "Active",
265
+ to: "Active",
266
+ event: "SORT",
267
+ effects: [
268
+ [
269
+ "if",
270
+ ["=", "@entity.sortField", "@payload.field"],
271
+ ["set", "@entity.sortDirection", ["if", ["=", "@entity.sortDirection", "asc"], "desc", "asc"]],
272
+ [
273
+ "do",
274
+ ["set", "@entity.sortField", "@payload.field"],
275
+ ["set", "@entity.sortDirection", "asc"]
276
+ ]
277
+ ]
278
+ ]
279
+ },
280
+ {
281
+ from: "Active",
282
+ to: "Active",
283
+ event: "TOGGLE_DIRECTION",
284
+ guard: ["!=", "@entity.sortField", null],
285
+ effects: [
286
+ ["set", "@entity.sortDirection", ["if", ["=", "@entity.sortDirection", "asc"], "desc", "asc"]]
287
+ ]
288
+ },
289
+ {
290
+ from: "Active",
291
+ to: "Active",
292
+ event: "CLEAR_SORT",
293
+ effects: [
294
+ ["set", "@entity.sortField", null],
295
+ ["set", "@entity.sortDirection", "asc"]
296
+ ]
297
+ }
268
298
  ]
269
- ]
270
- ]
271
- },
272
- {
273
- event: "TOGGLE_DIRECTION",
274
- guard: ["!=", "@entity.sortField", null],
275
- effects: [
276
- ["set", "@entity.sortDirection", ["if", ["=", "@entity.sortDirection", "asc"], "desc", "asc"]]
277
- ]
278
- },
279
- {
280
- event: "CLEAR_SORT",
281
- effects: [
282
- ["set", "@entity.sortField", null],
283
- ["set", "@entity.sortDirection", "asc"]
284
- ]
285
- }
286
- ]
287
- },
288
- configSchema: {
289
- required: [],
290
- optional: [
291
- { name: "defaultField", type: "string", description: "Default sort field" },
292
- { name: "defaultDirection", type: "string", description: "Default direction", default: "asc", enum: ["asc", "desc"] }
293
- ]
294
- }
299
+ }
300
+ }
301
+ ],
302
+ pages: []
303
+ }
304
+ ]
295
305
  };
296
306
  var FILTER_BEHAVIOR = {
297
- name: "std/Filter",
298
- category: "data-management",
307
+ name: "std-filter",
308
+ version: "1.0.0",
299
309
  description: "Query Singleton pattern for explicit filtering - use with entity-table query prop",
300
- suggestedFor: [
301
- "Filterable lists",
302
- "Advanced search",
303
- "Filter panels",
304
- "Faceted search",
305
- "Entity tables with filters"
306
- ],
307
- dataEntities: [
310
+ orbitals: [
308
311
  {
309
- name: "QueryState",
310
- runtime: true,
311
- singleton: true,
312
- fields: [
313
- { name: "status", type: "string", default: null, description: "Filter by status field" },
314
- { name: "priority", type: "string", default: null, description: "Filter by priority field" },
315
- { name: "search", type: "string", default: "", description: "Search term" },
316
- { name: "sortBy", type: "string", default: "createdAt", description: "Sort field" },
317
- { name: "sortOrder", type: "string", default: "desc", description: "Sort direction: asc or desc" }
318
- ]
319
- }
320
- ],
321
- stateMachine: {
322
- initial: "Active",
323
- states: [
324
- { name: "Active", isInitial: true }
325
- ],
326
- events: [
327
- { key: "INIT" },
328
- { key: "FILTER" },
329
- { key: "SEARCH" },
330
- { key: "SORT" },
331
- { key: "CLEAR_FILTERS" }
332
- ],
333
- transitions: [
334
- {
335
- from: "*",
336
- event: "INIT",
337
- effects: [
338
- // Render filter UI with query reference
339
- ["render-ui", "sidebar", {
340
- type: "filter-group",
341
- query: "@QueryState",
342
- filters: "@config.filters"
343
- }],
344
- // Render entity table with query reference
345
- ["render-ui", "main", {
346
- type: "entity-table",
347
- entity: "@config.entity",
348
- query: "@QueryState",
349
- columns: "@config.columns"
350
- }]
351
- ]
352
- },
353
- {
354
- event: "FILTER",
355
- effects: [
356
- ["set", "@QueryState.status", "@payload.status"],
357
- ["set", "@QueryState.priority", "@payload.priority"]
358
- ]
359
- },
360
- {
361
- event: "SEARCH",
362
- effects: [
363
- ["set", "@QueryState.search", "@payload.searchTerm"]
364
- ]
365
- },
366
- {
367
- event: "SORT",
368
- effects: [
369
- ["set", "@QueryState.sortBy", "@payload.field"],
370
- ["set", "@QueryState.sortOrder", "@payload.order"]
312
+ name: "FilterOrbital",
313
+ entity: {
314
+ name: "QueryState",
315
+ persistence: "runtime",
316
+ fields: [
317
+ { name: "id", type: "string", required: true },
318
+ { name: "status", type: "string", default: null },
319
+ { name: "priority", type: "string", default: null },
320
+ { name: "search", type: "string", default: "" },
321
+ { name: "sortBy", type: "string", default: "createdAt" },
322
+ { name: "sortOrder", type: "string", default: "desc" },
323
+ { name: "entityType", type: "string", default: "" },
324
+ { name: "filters", type: "array", default: [] },
325
+ { name: "columns", type: "array", default: [] }
371
326
  ]
372
327
  },
373
- {
374
- event: "CLEAR_FILTERS",
375
- effects: [
376
- ["set", "@QueryState.status", null],
377
- ["set", "@QueryState.priority", null],
378
- ["set", "@QueryState.search", ""]
379
- ]
380
- }
381
- ]
382
- },
383
- configSchema: {
384
- required: [
385
- { name: "entity", type: "string", description: "Entity to filter" }
386
- ],
387
- optional: [
388
- { name: "filters", type: "array", description: "Filter field definitions", default: [] },
389
- { name: "columns", type: "array", description: "Table columns to display", default: [] }
390
- ]
391
- }
328
+ traits: [
329
+ {
330
+ name: "Filter",
331
+ linkedEntity: "QueryState",
332
+ category: "interaction",
333
+ stateMachine: {
334
+ states: [{ name: "Active", isInitial: true }],
335
+ events: [
336
+ { key: "INIT", name: "Initialize" },
337
+ { key: "FILTER", name: "Filter" },
338
+ { key: "SEARCH", name: "Search" },
339
+ { key: "SORT", name: "Sort" },
340
+ { key: "CLEAR_FILTERS", name: "Clear Filters" }
341
+ ],
342
+ transitions: [
343
+ {
344
+ from: "Active",
345
+ to: "Active",
346
+ event: "INIT",
347
+ effects: [
348
+ ["render-ui", "sidebar", {
349
+ type: "filter-group",
350
+ entity: "@entity.entityType",
351
+ query: "@QueryState",
352
+ filters: "@entity.filters"
353
+ }],
354
+ ["render-ui", "main", {
355
+ type: "entity-table",
356
+ entity: "@entity.entityType",
357
+ query: "@QueryState",
358
+ columns: "@entity.columns"
359
+ }]
360
+ ]
361
+ },
362
+ {
363
+ from: "Active",
364
+ to: "Active",
365
+ event: "FILTER",
366
+ effects: [
367
+ ["set", "@QueryState.status", "@payload.status"],
368
+ ["set", "@QueryState.priority", "@payload.priority"]
369
+ ]
370
+ },
371
+ {
372
+ from: "Active",
373
+ to: "Active",
374
+ event: "SEARCH",
375
+ effects: [["set", "@QueryState.search", "@payload.searchTerm"]]
376
+ },
377
+ {
378
+ from: "Active",
379
+ to: "Active",
380
+ event: "SORT",
381
+ effects: [
382
+ ["set", "@QueryState.sortBy", "@payload.field"],
383
+ ["set", "@QueryState.sortOrder", "@payload.order"]
384
+ ]
385
+ },
386
+ {
387
+ from: "Active",
388
+ to: "Active",
389
+ event: "CLEAR_FILTERS",
390
+ effects: [
391
+ ["set", "@QueryState.status", null],
392
+ ["set", "@QueryState.priority", null],
393
+ ["set", "@QueryState.search", ""]
394
+ ]
395
+ }
396
+ ]
397
+ }
398
+ }
399
+ ],
400
+ pages: []
401
+ }
402
+ ]
392
403
  };
393
404
  var SEARCH_BEHAVIOR = {
394
- name: "std/Search",
395
- category: "data-management",
405
+ name: "std-search",
406
+ version: "1.0.0",
396
407
  description: "Search with debounce - updates QueryState.search field",
397
- suggestedFor: [
398
- "Search inputs",
399
- "Quick filters",
400
- "Global search",
401
- "Type-ahead"
402
- ],
403
- dataEntities: [
408
+ orbitals: [
404
409
  {
405
- name: "SearchState",
406
- runtime: true,
407
- singleton: true,
408
- fields: [
409
- { name: "search", type: "string", default: "" },
410
- { name: "isSearching", type: "boolean", default: false }
411
- ]
412
- }
413
- ],
414
- stateMachine: {
415
- initial: "Idle",
416
- states: [
417
- { name: "Idle", isInitial: true },
418
- { name: "Searching" }
419
- ],
420
- events: [
421
- { key: "INIT" },
422
- { key: "SEARCH" },
423
- { key: "CLEAR_SEARCH" },
424
- { key: "SEARCH_COMPLETE" }
425
- ],
426
- transitions: [
427
- {
428
- from: "*",
429
- event: "INIT",
430
- effects: [
431
- ["set", "@entity.search", ""],
432
- ["set", "@entity.isSearching", false],
433
- ["render-ui", "main", {
434
- type: "search-bar",
435
- query: "@SearchState",
436
- placeholder: "@config.placeholder"
437
- }]
438
- ]
439
- },
440
- {
441
- from: "Idle",
442
- to: "Searching",
443
- event: "SEARCH",
444
- guard: [">=", ["str/len", "@payload.term"], "@config.minLength"],
445
- effects: [
446
- ["set", "@entity.search", "@payload.term"],
447
- ["set", "@entity.isSearching", true],
448
- ["async/debounce", "@config.debounceMs", ["emit", "SEARCH_COMPLETE"]]
449
- ]
450
- },
451
- {
452
- from: "Idle",
453
- event: "SEARCH",
454
- guard: ["<", ["str/len", "@payload.term"], "@config.minLength"],
455
- effects: [
456
- ["set", "@entity.search", "@payload.term"]
457
- ]
458
- },
459
- {
460
- from: "Searching",
461
- to: "Idle",
462
- event: "SEARCH_COMPLETE",
463
- effects: [
464
- ["set", "@entity.isSearching", false]
410
+ name: "SearchOrbital",
411
+ entity: {
412
+ name: "SearchState",
413
+ persistence: "runtime",
414
+ fields: [
415
+ { name: "id", type: "string", required: true },
416
+ { name: "search", type: "string", default: "" },
417
+ { name: "isSearching", type: "boolean", default: false },
418
+ { name: "minLength", type: "number", default: 2 },
419
+ { name: "debounceMs", type: "number", default: 300 },
420
+ { name: "placeholder", type: "string", default: "Search..." }
465
421
  ]
466
422
  },
467
- {
468
- event: "CLEAR_SEARCH",
469
- effects: [
470
- ["set", "@entity.search", ""],
471
- ["set", "@entity.isSearching", false]
472
- ]
473
- }
474
- ]
475
- },
476
- configSchema: {
477
- required: [],
478
- optional: [
479
- { name: "debounceMs", type: "number", description: "Debounce delay in ms", default: 300 },
480
- { name: "minLength", type: "number", description: "Minimum search length", default: 1 },
481
- { name: "placeholder", type: "string", description: "Input placeholder", default: "Search..." }
482
- ]
483
- }
423
+ traits: [
424
+ {
425
+ name: "Search",
426
+ linkedEntity: "SearchState",
427
+ category: "interaction",
428
+ stateMachine: {
429
+ states: [
430
+ { name: "Idle", isInitial: true },
431
+ { name: "Searching" }
432
+ ],
433
+ events: [
434
+ { key: "INIT", name: "Initialize" },
435
+ { key: "SEARCH", name: "Search" },
436
+ { key: "CLEAR_SEARCH", name: "Clear Search" },
437
+ { key: "SEARCH_COMPLETE", name: "Search Complete" }
438
+ ],
439
+ transitions: [
440
+ {
441
+ from: "Idle",
442
+ to: "Idle",
443
+ event: "INIT",
444
+ effects: [
445
+ ["set", "@entity.search", ""],
446
+ ["set", "@entity.isSearching", false],
447
+ ["render-ui", "main", {
448
+ type: "search-input",
449
+ query: "@SearchState",
450
+ placeholder: "@entity.placeholder"
451
+ }]
452
+ ]
453
+ },
454
+ {
455
+ from: "Idle",
456
+ to: "Searching",
457
+ event: "SEARCH",
458
+ guard: [">=", ["str/len", "@payload.term"], "@entity.minLength"],
459
+ effects: [
460
+ ["set", "@entity.search", "@payload.term"],
461
+ ["set", "@entity.isSearching", true],
462
+ ["async/debounce", "@entity.debounceMs", ["emit", "SEARCH_COMPLETE"]]
463
+ ]
464
+ },
465
+ {
466
+ from: "Idle",
467
+ to: "Idle",
468
+ event: "SEARCH",
469
+ guard: ["<", ["str/len", "@payload.term"], "@entity.minLength"],
470
+ effects: [["set", "@entity.search", "@payload.term"]]
471
+ },
472
+ {
473
+ from: "Searching",
474
+ to: "Idle",
475
+ event: "SEARCH_COMPLETE",
476
+ effects: [["set", "@entity.isSearching", false]]
477
+ },
478
+ {
479
+ from: "Idle",
480
+ to: "Idle",
481
+ event: "CLEAR_SEARCH",
482
+ effects: [
483
+ ["set", "@entity.search", ""],
484
+ ["set", "@entity.isSearching", false]
485
+ ]
486
+ },
487
+ {
488
+ from: "Searching",
489
+ to: "Idle",
490
+ event: "CLEAR_SEARCH",
491
+ effects: [
492
+ ["set", "@entity.search", ""],
493
+ ["set", "@entity.isSearching", false]
494
+ ]
495
+ }
496
+ ]
497
+ }
498
+ }
499
+ ],
500
+ pages: []
501
+ }
502
+ ]
484
503
  };
485
504
  var DATA_MANAGEMENT_BEHAVIORS = [
486
505
  PAGINATION_BEHAVIOR,