@almadar/std 13.1.0 → 13.1.2

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.
@@ -119,7 +119,7 @@
119
119
  "name": "Refetch Query",
120
120
  "payloadSchema": [
121
121
  {
122
- "name": "query",
122
+ "name": "searchTerm",
123
123
  "type": "string",
124
124
  "required": true
125
125
  }
@@ -140,22 +140,6 @@
140
140
  "required": true
141
141
  }
142
142
  ]
143
- },
144
- {
145
- "key": "REFETCH_PAGE",
146
- "name": "Refetch Page",
147
- "payloadSchema": [
148
- {
149
- "name": "page",
150
- "type": "number",
151
- "required": true
152
- },
153
- {
154
- "name": "pageSize",
155
- "type": "number",
156
- "required": true
157
- }
158
- ]
159
143
  }
160
144
  ],
161
145
  "transitions": [
@@ -196,10 +180,10 @@
196
180
  "type": "stack",
197
181
  "children": [
198
182
  {
199
- "fields": "@config.fields",
200
- "entity": "@payload.data",
201
183
  "pageSize": "@config.pageSize",
202
- "type": "data-grid"
184
+ "fields": "@config.fields",
185
+ "type": "data-grid",
186
+ "entity": "@entity"
203
187
  }
204
188
  ],
205
189
  "direction": "vertical"
@@ -218,8 +202,8 @@
218
202
  {
219
203
  "type": "typography",
220
204
  "content": "@payload.error",
221
- "color": "error",
222
- "variant": "caption"
205
+ "variant": "caption",
206
+ "color": "error"
223
207
  }
224
208
  ]
225
209
  ]
@@ -234,8 +218,8 @@
234
218
  "BrowseItem",
235
219
  {
236
220
  "emit": {
237
- "success": "BrowseItemLoaded",
238
- "failure": "BrowseItemLoadFailed"
221
+ "failure": "BrowseItemLoadFailed",
222
+ "success": "BrowseItemLoaded"
239
223
  }
240
224
  }
241
225
  ],
@@ -251,41 +235,41 @@
251
235
  },
252
236
  {
253
237
  "from": "browsing",
254
- "to": "loading",
238
+ "to": "browsing",
255
239
  "event": "REFETCH_QUERY",
256
240
  "effects": [
257
241
  [
258
242
  "fetch",
259
243
  "BrowseItem",
260
244
  {
261
- "filter": [
262
- "str/includes",
263
- [
264
- "object/get",
265
- "@entity",
266
- "name"
267
- ],
268
- "@payload.query"
269
- ],
270
245
  "emit": {
271
246
  "success": "BrowseItemLoaded",
272
247
  "failure": "BrowseItemLoadFailed"
273
- }
274
- }
275
- ],
276
- [
277
- "render-ui",
278
- "main",
279
- {
280
- "size": "sm",
281
- "type": "spinner"
248
+ },
249
+ "filter": [
250
+ "or",
251
+ [
252
+ "=",
253
+ "@payload.searchTerm",
254
+ ""
255
+ ],
256
+ [
257
+ "str/includes",
258
+ [
259
+ "object/get",
260
+ "@entity",
261
+ "name"
262
+ ],
263
+ "@payload.searchTerm"
264
+ ]
265
+ ]
282
266
  }
283
267
  ]
284
268
  ]
285
269
  },
286
270
  {
287
271
  "from": "browsing",
288
- "to": "loading",
272
+ "to": "browsing",
289
273
  "event": "REFETCH_FILTER",
290
274
  "effects": [
291
275
  [
@@ -293,51 +277,49 @@
293
277
  "BrowseItem",
294
278
  {
295
279
  "filter": [
296
- "=",
280
+ "or",
297
281
  [
298
- "object/get",
299
- "@entity",
300
- "@payload.field"
282
+ "=",
283
+ "@payload.value",
284
+ ""
301
285
  ],
302
- "@payload.value"
286
+ [
287
+ "=",
288
+ [
289
+ "object/get",
290
+ "@entity",
291
+ "@payload.field"
292
+ ],
293
+ "@payload.value"
294
+ ]
303
295
  ],
304
296
  "emit": {
305
- "success": "BrowseItemLoaded",
306
- "failure": "BrowseItemLoadFailed"
297
+ "failure": "BrowseItemLoadFailed",
298
+ "success": "BrowseItemLoaded"
307
299
  }
308
300
  }
309
- ],
310
- [
311
- "render-ui",
312
- "main",
313
- {
314
- "size": "sm",
315
- "type": "spinner"
316
- }
317
301
  ]
318
302
  ]
319
303
  },
320
304
  {
321
305
  "from": "browsing",
322
- "to": "loading",
323
- "event": "REFETCH_PAGE",
306
+ "to": "browsing",
307
+ "event": "BrowseItemLoaded",
324
308
  "effects": [
325
- [
326
- "fetch",
327
- "BrowseItem",
328
- {
329
- "emit": {
330
- "success": "BrowseItemLoaded",
331
- "failure": "BrowseItemLoadFailed"
332
- }
333
- }
334
- ],
335
309
  [
336
310
  "render-ui",
337
311
  "main",
338
312
  {
339
- "type": "spinner",
340
- "size": "sm"
313
+ "children": [
314
+ {
315
+ "type": "data-grid",
316
+ "entity": "@entity",
317
+ "fields": "@config.fields",
318
+ "pageSize": "@config.pageSize"
319
+ }
320
+ ],
321
+ "direction": "vertical",
322
+ "type": "stack"
341
323
  }
342
324
  ]
343
325
  ]
@@ -352,8 +334,8 @@
352
334
  "BrowseItem",
353
335
  {
354
336
  "emit": {
355
- "failure": "BrowseItemLoadFailed",
356
- "success": "BrowseItemLoaded"
337
+ "success": "BrowseItemLoaded",
338
+ "failure": "BrowseItemLoadFailed"
357
339
  }
358
340
  }
359
341
  ],
@@ -361,8 +343,8 @@
361
343
  "render-ui",
362
344
  "main",
363
345
  {
364
- "size": "sm",
365
- "type": "spinner"
346
+ "type": "spinner",
347
+ "size": "sm"
366
348
  }
367
349
  ]
368
350
  ]
@@ -97,9 +97,9 @@
97
97
  "render-ui",
98
98
  "main",
99
99
  {
100
+ "type": "filter-group",
100
101
  "filters": "@config.filters",
101
- "entity": "FilterTarget",
102
- "type": "filter-group"
102
+ "entity": "FilterTarget"
103
103
  }
104
104
  ]
105
105
  ]
@@ -145,13 +145,21 @@
145
145
  "@entity.value",
146
146
  ""
147
147
  ],
148
+ [
149
+ "emit",
150
+ "FILTER",
151
+ {
152
+ "value": "",
153
+ "field": ""
154
+ }
155
+ ],
148
156
  [
149
157
  "render-ui",
150
158
  "main",
151
159
  {
152
- "entity": "FilterTarget",
160
+ "filters": "@config.filters",
153
161
  "type": "filter-group",
154
- "filters": "@config.filters"
162
+ "entity": "FilterTarget"
155
163
  }
156
164
  ]
157
165
  ]
@@ -159,13 +167,13 @@
159
167
  ]
160
168
  },
161
169
  "config": {
162
- "event": {
163
- "type": "string",
164
- "default": "FILTER"
165
- },
166
170
  "filters": {
167
171
  "type": "[object]",
168
172
  "default": []
173
+ },
174
+ "event": {
175
+ "type": "string",
176
+ "default": "FILTER"
169
177
  }
170
178
  },
171
179
  "scope": "instance"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "std-pagination",
3
3
  "version": "1.0.0",
4
- "description": "std-pagination as a Function — single primitive: pagination control.\nThe atom's own PagedItem entity is the UI-state container every PAGE\ntransition persists currentPage / pageSize. Visual reflection of\n@entity.currentPage on the pagination control needs pattern-registry +\nUI component support for a `currentPage` binding-prop (gap #21.G.3 +\n#21.H follow-ups).",
4
+ "description": "std-pagination as a Function — single primitive: pagination control.\nThe Pagination UI component emits `{page}` for page changes; the atom's\nPAGE event payload matches that shape. ITEMS_LOADED accepts an upstream\ndata-loaded event payload `{data : [object]}` and derives totalPages =\nceil(len(data) / pageSize). Molecules wire e.g.\n`FilteredItemBrowse.BrowseItemLoaded -> ITEMS_LOADED` to keep the\npagination control in lockstep with the data hub. The PagedItem entity\npersists currentPage and the derived totalPages so reads from\n@entity.totalPages reflect the latest row count.",
5
5
  "orbitals": [
6
6
  {
7
7
  "name": "PagedItemOrbital",
@@ -16,11 +16,13 @@
16
16
  },
17
17
  {
18
18
  "name": "currentPage",
19
- "type": "number"
19
+ "type": "number",
20
+ "default": 1.0
20
21
  },
21
22
  {
22
- "name": "pageSize",
23
- "type": "number"
23
+ "name": "totalPages",
24
+ "type": "number",
25
+ "default": 1.0
24
26
  }
25
27
  ]
26
28
  },
@@ -37,11 +39,6 @@
37
39
  "name": "page",
38
40
  "type": "number",
39
41
  "required": true
40
- },
41
- {
42
- "name": "pageSize",
43
- "type": "number",
44
- "required": true
45
42
  }
46
43
  ]
47
44
  }
@@ -66,11 +63,16 @@
66
63
  "name": "page",
67
64
  "type": "number",
68
65
  "required": true
69
- },
66
+ }
67
+ ]
68
+ },
69
+ {
70
+ "key": "ITEMS_LOADED",
71
+ "name": "Items Loaded",
72
+ "payloadSchema": [
70
73
  {
71
- "name": "pageSize",
72
- "type": "number",
73
- "required": true
74
+ "name": "data",
75
+ "type": "[object]"
74
76
  }
75
77
  ]
76
78
  }
@@ -85,10 +87,10 @@
85
87
  "render-ui",
86
88
  "main",
87
89
  {
88
- "type": "pagination",
90
+ "totalPages": "@entity.totalPages",
89
91
  "currentPage": 1.0,
92
+ "type": "pagination",
90
93
  "onPageChange": "@config.event",
91
- "totalPages": "@config.totalPages",
92
94
  "showPageSize": false
93
95
  }
94
96
  ]
@@ -104,20 +106,48 @@
104
106
  "@entity.currentPage",
105
107
  "@payload.page"
106
108
  ],
109
+ [
110
+ "render-ui",
111
+ "main",
112
+ {
113
+ "totalPages": "@entity.totalPages",
114
+ "onPageChange": "@config.event",
115
+ "type": "pagination",
116
+ "currentPage": 1.0,
117
+ "showPageSize": false
118
+ }
119
+ ]
120
+ ]
121
+ },
122
+ {
123
+ "from": "idle",
124
+ "to": "idle",
125
+ "event": "ITEMS_LOADED",
126
+ "effects": [
107
127
  [
108
128
  "set",
109
- "@entity.pageSize",
110
- "@payload.pageSize"
129
+ "@entity.totalPages",
130
+ [
131
+ "math/ceil",
132
+ [
133
+ "/",
134
+ [
135
+ "array/len",
136
+ "@payload.data"
137
+ ],
138
+ "@config.pageSize"
139
+ ]
140
+ ]
111
141
  ],
112
142
  [
113
143
  "render-ui",
114
144
  "main",
115
145
  {
146
+ "showPageSize": false,
116
147
  "type": "pagination",
117
- "totalPages": "@config.totalPages",
118
- "onPageChange": "@config.event",
119
148
  "currentPage": 1.0,
120
- "showPageSize": false
149
+ "totalPages": "@entity.totalPages",
150
+ "onPageChange": "@config.event"
121
151
  }
122
152
  ]
123
153
  ]
@@ -132,10 +162,6 @@
132
162
  "pageSize": {
133
163
  "type": "number",
134
164
  "default": 10.0
135
- },
136
- "totalPages": {
137
- "type": "number",
138
- "default": 1.0
139
165
  }
140
166
  },
141
167
  "scope": "instance"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "std-search",
3
3
  "version": "1.0.0",
4
- "description": "std-search as a Function — single primitive: search-input. The atom's\nown SearchResult entity is the UI-state container — every SEARCH\ntransition persists @payload.query into @entity.query. Cross-trait\nlisteners subscribe to UI:Orbital.Trait.SEARCH for routing to data\natoms. Visual reflection of @entity.query on the input (search-input\n`value` prop) is a follow-up that needs pattern registry + UI\ncomponent support.",
4
+ "description": "std-search as a Function — single primitive: search-input. The atom's\nown SearchResult entity is the UI-state container — SEARCH persists\n@payload.searchTerm (matching the SearchInput component's emit shape)\ninto @entity.searchTerm. Cross-trait listeners route the same payload\nfield to data atoms (Browse REFETCH_QUERY).",
5
5
  "orbitals": [
6
6
  {
7
7
  "name": "SearchResultOrbital",
@@ -15,7 +15,7 @@
15
15
  "required": true
16
16
  },
17
17
  {
18
- "name": "query",
18
+ "name": "searchTerm",
19
19
  "type": "string"
20
20
  }
21
21
  ]
@@ -30,7 +30,7 @@
30
30
  "event": "SEARCH",
31
31
  "payloadSchema": [
32
32
  {
33
- "name": "query",
33
+ "name": "searchTerm",
34
34
  "type": "string",
35
35
  "required": true
36
36
  }
@@ -54,7 +54,7 @@
54
54
  "name": "Search",
55
55
  "payloadSchema": [
56
56
  {
57
- "name": "query",
57
+ "name": "searchTerm",
58
58
  "type": "string",
59
59
  "required": true
60
60
  }
@@ -85,8 +85,8 @@
85
85
  "effects": [
86
86
  [
87
87
  "set",
88
- "@entity.query",
89
- "@payload.query"
88
+ "@entity.searchTerm",
89
+ "@payload.searchTerm"
90
90
  ],
91
91
  [
92
92
  "render-ui",
@@ -68,14 +68,14 @@
68
68
  "config": {
69
69
  "filters": [
70
70
  {
71
- "label": "Status",
71
+ "filterType": "select",
72
+ "field": "status",
72
73
  "options": [
73
74
  "active",
74
75
  "inactive",
75
76
  "pending"
76
77
  ],
77
- "field": "status",
78
- "filterType": "select"
78
+ "label": "Status"
79
79
  }
80
80
  ],
81
81
  "event": "FILTER"
@@ -88,19 +88,19 @@
88
88
  "config": {
89
89
  "fields": [
90
90
  {
91
- "variant": "h4",
91
+ "name": "name",
92
92
  "label": "Name",
93
- "name": "name"
93
+ "variant": "h4"
94
94
  },
95
95
  {
96
+ "name": "description",
96
97
  "label": "Description",
97
- "variant": "caption",
98
- "name": "description"
98
+ "variant": "caption"
99
99
  },
100
100
  {
101
+ "name": "status",
101
102
  "label": "Status",
102
- "variant": "badge",
103
- "name": "status"
103
+ "variant": "badge"
104
104
  }
105
105
  ]
106
106
  },
@@ -120,14 +120,6 @@
120
120
  "kind": "trait",
121
121
  "trait": "FilteredItemFilter"
122
122
  }
123
- },
124
- {
125
- "event": "PAGE",
126
- "triggers": "REFETCH_PAGE",
127
- "source": {
128
- "kind": "trait",
129
- "trait": "FilteredItemPagination"
130
- }
131
123
  }
132
124
  ]
133
125
  },
@@ -135,10 +127,19 @@
135
127
  "ref": "Pagination.traits.PagedItemPagination",
136
128
  "name": "FilteredItemPagination",
137
129
  "config": {
138
- "totalPages": 10.0,
139
- "pageSize": 10.0,
140
- "event": "PAGE"
141
- }
130
+ "event": "PAGE",
131
+ "pageSize": 10.0
132
+ },
133
+ "listens": [
134
+ {
135
+ "event": "BrowseItemLoaded",
136
+ "triggers": "ITEMS_LOADED",
137
+ "source": {
138
+ "kind": "trait",
139
+ "trait": "FilteredItemBrowse"
140
+ }
141
+ }
142
+ ]
142
143
  },
143
144
  {
144
145
  "name": "FilteredListLayout",
@@ -227,26 +228,25 @@
227
228
  "render-ui",
228
229
  "main",
229
230
  {
230
- "type": "stack",
231
231
  "gap": "md",
232
232
  "className": "max-w-5xl mx-auto w-full",
233
233
  "children": [
234
234
  {
235
- "type": "stack",
236
235
  "direction": "horizontal",
237
236
  "align": "center",
238
237
  "gap": "sm",
239
238
  "children": [
240
239
  {
241
- "name": "list",
242
- "type": "icon"
240
+ "type": "icon",
241
+ "name": "list"
243
242
  },
244
243
  {
245
- "variant": "h2",
246
244
  "type": "typography",
247
- "content": "Filtered List"
245
+ "content": "Filtered List",
246
+ "variant": "h2"
248
247
  }
249
- ]
248
+ ],
249
+ "type": "stack"
250
250
  },
251
251
  {
252
252
  "type": "divider"
@@ -257,13 +257,14 @@
257
257
  "@trait.FilteredItemSearch",
258
258
  "@trait.FilteredItemFilter"
259
259
  ],
260
- "type": "stack",
261
- "gap": "sm"
260
+ "gap": "sm",
261
+ "type": "stack"
262
262
  },
263
263
  "@trait.FilteredItemBrowse",
264
264
  "@trait.FilteredItemPagination"
265
265
  ],
266
- "direction": "vertical"
266
+ "direction": "vertical",
267
+ "type": "stack"
267
268
  }
268
269
  ]
269
270
  ]
@@ -119,7 +119,7 @@
119
119
  "name": "Refetch Query",
120
120
  "payloadSchema": [
121
121
  {
122
- "name": "query",
122
+ "name": "searchTerm",
123
123
  "type": "string",
124
124
  "required": true
125
125
  }
@@ -140,22 +140,6 @@
140
140
  "required": true
141
141
  }
142
142
  ]
143
- },
144
- {
145
- "key": "REFETCH_PAGE",
146
- "name": "Refetch Page",
147
- "payloadSchema": [
148
- {
149
- "name": "page",
150
- "type": "number",
151
- "required": true
152
- },
153
- {
154
- "name": "pageSize",
155
- "type": "number",
156
- "required": true
157
- }
158
- ]
159
143
  }
160
144
  ],
161
145
  "transitions": [
@@ -196,10 +180,10 @@
196
180
  "type": "stack",
197
181
  "children": [
198
182
  {
199
- "fields": "@config.fields",
200
- "entity": "@payload.data",
201
183
  "pageSize": "@config.pageSize",
202
- "type": "data-grid"
184
+ "fields": "@config.fields",
185
+ "type": "data-grid",
186
+ "entity": "@entity"
203
187
  }
204
188
  ],
205
189
  "direction": "vertical"
@@ -218,8 +202,8 @@
218
202
  {
219
203
  "type": "typography",
220
204
  "content": "@payload.error",
221
- "color": "error",
222
- "variant": "caption"
205
+ "variant": "caption",
206
+ "color": "error"
223
207
  }
224
208
  ]
225
209
  ]
@@ -234,8 +218,8 @@
234
218
  "BrowseItem",
235
219
  {
236
220
  "emit": {
237
- "success": "BrowseItemLoaded",
238
- "failure": "BrowseItemLoadFailed"
221
+ "failure": "BrowseItemLoadFailed",
222
+ "success": "BrowseItemLoaded"
239
223
  }
240
224
  }
241
225
  ],
@@ -251,41 +235,41 @@
251
235
  },
252
236
  {
253
237
  "from": "browsing",
254
- "to": "loading",
238
+ "to": "browsing",
255
239
  "event": "REFETCH_QUERY",
256
240
  "effects": [
257
241
  [
258
242
  "fetch",
259
243
  "BrowseItem",
260
244
  {
261
- "filter": [
262
- "str/includes",
263
- [
264
- "object/get",
265
- "@entity",
266
- "name"
267
- ],
268
- "@payload.query"
269
- ],
270
245
  "emit": {
271
246
  "success": "BrowseItemLoaded",
272
247
  "failure": "BrowseItemLoadFailed"
273
- }
274
- }
275
- ],
276
- [
277
- "render-ui",
278
- "main",
279
- {
280
- "size": "sm",
281
- "type": "spinner"
248
+ },
249
+ "filter": [
250
+ "or",
251
+ [
252
+ "=",
253
+ "@payload.searchTerm",
254
+ ""
255
+ ],
256
+ [
257
+ "str/includes",
258
+ [
259
+ "object/get",
260
+ "@entity",
261
+ "name"
262
+ ],
263
+ "@payload.searchTerm"
264
+ ]
265
+ ]
282
266
  }
283
267
  ]
284
268
  ]
285
269
  },
286
270
  {
287
271
  "from": "browsing",
288
- "to": "loading",
272
+ "to": "browsing",
289
273
  "event": "REFETCH_FILTER",
290
274
  "effects": [
291
275
  [
@@ -293,51 +277,49 @@
293
277
  "BrowseItem",
294
278
  {
295
279
  "filter": [
296
- "=",
280
+ "or",
297
281
  [
298
- "object/get",
299
- "@entity",
300
- "@payload.field"
282
+ "=",
283
+ "@payload.value",
284
+ ""
301
285
  ],
302
- "@payload.value"
286
+ [
287
+ "=",
288
+ [
289
+ "object/get",
290
+ "@entity",
291
+ "@payload.field"
292
+ ],
293
+ "@payload.value"
294
+ ]
303
295
  ],
304
296
  "emit": {
305
- "success": "BrowseItemLoaded",
306
- "failure": "BrowseItemLoadFailed"
297
+ "failure": "BrowseItemLoadFailed",
298
+ "success": "BrowseItemLoaded"
307
299
  }
308
300
  }
309
- ],
310
- [
311
- "render-ui",
312
- "main",
313
- {
314
- "size": "sm",
315
- "type": "spinner"
316
- }
317
301
  ]
318
302
  ]
319
303
  },
320
304
  {
321
305
  "from": "browsing",
322
- "to": "loading",
323
- "event": "REFETCH_PAGE",
306
+ "to": "browsing",
307
+ "event": "BrowseItemLoaded",
324
308
  "effects": [
325
- [
326
- "fetch",
327
- "BrowseItem",
328
- {
329
- "emit": {
330
- "success": "BrowseItemLoaded",
331
- "failure": "BrowseItemLoadFailed"
332
- }
333
- }
334
- ],
335
309
  [
336
310
  "render-ui",
337
311
  "main",
338
312
  {
339
- "type": "spinner",
340
- "size": "sm"
313
+ "children": [
314
+ {
315
+ "type": "data-grid",
316
+ "entity": "@entity",
317
+ "fields": "@config.fields",
318
+ "pageSize": "@config.pageSize"
319
+ }
320
+ ],
321
+ "direction": "vertical",
322
+ "type": "stack"
341
323
  }
342
324
  ]
343
325
  ]
@@ -352,8 +334,8 @@
352
334
  "BrowseItem",
353
335
  {
354
336
  "emit": {
355
- "failure": "BrowseItemLoadFailed",
356
- "success": "BrowseItemLoaded"
337
+ "success": "BrowseItemLoaded",
338
+ "failure": "BrowseItemLoadFailed"
357
339
  }
358
340
  }
359
341
  ],
@@ -361,8 +343,8 @@
361
343
  "render-ui",
362
344
  "main",
363
345
  {
364
- "size": "sm",
365
- "type": "spinner"
346
+ "type": "spinner",
347
+ "size": "sm"
366
348
  }
367
349
  ]
368
350
  ]
@@ -97,9 +97,9 @@
97
97
  "render-ui",
98
98
  "main",
99
99
  {
100
+ "type": "filter-group",
100
101
  "filters": "@config.filters",
101
- "entity": "FilterTarget",
102
- "type": "filter-group"
102
+ "entity": "FilterTarget"
103
103
  }
104
104
  ]
105
105
  ]
@@ -145,13 +145,21 @@
145
145
  "@entity.value",
146
146
  ""
147
147
  ],
148
+ [
149
+ "emit",
150
+ "FILTER",
151
+ {
152
+ "value": "",
153
+ "field": ""
154
+ }
155
+ ],
148
156
  [
149
157
  "render-ui",
150
158
  "main",
151
159
  {
152
- "entity": "FilterTarget",
160
+ "filters": "@config.filters",
153
161
  "type": "filter-group",
154
- "filters": "@config.filters"
162
+ "entity": "FilterTarget"
155
163
  }
156
164
  ]
157
165
  ]
@@ -159,13 +167,13 @@
159
167
  ]
160
168
  },
161
169
  "config": {
162
- "event": {
163
- "type": "string",
164
- "default": "FILTER"
165
- },
166
170
  "filters": {
167
171
  "type": "[object]",
168
172
  "default": []
173
+ },
174
+ "event": {
175
+ "type": "string",
176
+ "default": "FILTER"
169
177
  }
170
178
  },
171
179
  "scope": "instance"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "std-pagination",
3
3
  "version": "1.0.0",
4
- "description": "std-pagination as a Function — single primitive: pagination control.\nThe atom's own PagedItem entity is the UI-state container every PAGE\ntransition persists currentPage / pageSize. Visual reflection of\n@entity.currentPage on the pagination control needs pattern-registry +\nUI component support for a `currentPage` binding-prop (gap #21.G.3 +\n#21.H follow-ups).",
4
+ "description": "std-pagination as a Function — single primitive: pagination control.\nThe Pagination UI component emits `{page}` for page changes; the atom's\nPAGE event payload matches that shape. ITEMS_LOADED accepts an upstream\ndata-loaded event payload `{data : [object]}` and derives totalPages =\nceil(len(data) / pageSize). Molecules wire e.g.\n`FilteredItemBrowse.BrowseItemLoaded -> ITEMS_LOADED` to keep the\npagination control in lockstep with the data hub. The PagedItem entity\npersists currentPage and the derived totalPages so reads from\n@entity.totalPages reflect the latest row count.",
5
5
  "orbitals": [
6
6
  {
7
7
  "name": "PagedItemOrbital",
@@ -16,11 +16,13 @@
16
16
  },
17
17
  {
18
18
  "name": "currentPage",
19
- "type": "number"
19
+ "type": "number",
20
+ "default": 1.0
20
21
  },
21
22
  {
22
- "name": "pageSize",
23
- "type": "number"
23
+ "name": "totalPages",
24
+ "type": "number",
25
+ "default": 1.0
24
26
  }
25
27
  ]
26
28
  },
@@ -37,11 +39,6 @@
37
39
  "name": "page",
38
40
  "type": "number",
39
41
  "required": true
40
- },
41
- {
42
- "name": "pageSize",
43
- "type": "number",
44
- "required": true
45
42
  }
46
43
  ]
47
44
  }
@@ -66,11 +63,16 @@
66
63
  "name": "page",
67
64
  "type": "number",
68
65
  "required": true
69
- },
66
+ }
67
+ ]
68
+ },
69
+ {
70
+ "key": "ITEMS_LOADED",
71
+ "name": "Items Loaded",
72
+ "payloadSchema": [
70
73
  {
71
- "name": "pageSize",
72
- "type": "number",
73
- "required": true
74
+ "name": "data",
75
+ "type": "[object]"
74
76
  }
75
77
  ]
76
78
  }
@@ -85,10 +87,10 @@
85
87
  "render-ui",
86
88
  "main",
87
89
  {
88
- "type": "pagination",
90
+ "totalPages": "@entity.totalPages",
89
91
  "currentPage": 1.0,
92
+ "type": "pagination",
90
93
  "onPageChange": "@config.event",
91
- "totalPages": "@config.totalPages",
92
94
  "showPageSize": false
93
95
  }
94
96
  ]
@@ -104,20 +106,48 @@
104
106
  "@entity.currentPage",
105
107
  "@payload.page"
106
108
  ],
109
+ [
110
+ "render-ui",
111
+ "main",
112
+ {
113
+ "totalPages": "@entity.totalPages",
114
+ "onPageChange": "@config.event",
115
+ "type": "pagination",
116
+ "currentPage": 1.0,
117
+ "showPageSize": false
118
+ }
119
+ ]
120
+ ]
121
+ },
122
+ {
123
+ "from": "idle",
124
+ "to": "idle",
125
+ "event": "ITEMS_LOADED",
126
+ "effects": [
107
127
  [
108
128
  "set",
109
- "@entity.pageSize",
110
- "@payload.pageSize"
129
+ "@entity.totalPages",
130
+ [
131
+ "math/ceil",
132
+ [
133
+ "/",
134
+ [
135
+ "array/len",
136
+ "@payload.data"
137
+ ],
138
+ "@config.pageSize"
139
+ ]
140
+ ]
111
141
  ],
112
142
  [
113
143
  "render-ui",
114
144
  "main",
115
145
  {
146
+ "showPageSize": false,
116
147
  "type": "pagination",
117
- "totalPages": "@config.totalPages",
118
- "onPageChange": "@config.event",
119
148
  "currentPage": 1.0,
120
- "showPageSize": false
149
+ "totalPages": "@entity.totalPages",
150
+ "onPageChange": "@config.event"
121
151
  }
122
152
  ]
123
153
  ]
@@ -132,10 +162,6 @@
132
162
  "pageSize": {
133
163
  "type": "number",
134
164
  "default": 10.0
135
- },
136
- "totalPages": {
137
- "type": "number",
138
- "default": 1.0
139
165
  }
140
166
  },
141
167
  "scope": "instance"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "std-search",
3
3
  "version": "1.0.0",
4
- "description": "std-search as a Function — single primitive: search-input. The atom's\nown SearchResult entity is the UI-state container — every SEARCH\ntransition persists @payload.query into @entity.query. Cross-trait\nlisteners subscribe to UI:Orbital.Trait.SEARCH for routing to data\natoms. Visual reflection of @entity.query on the input (search-input\n`value` prop) is a follow-up that needs pattern registry + UI\ncomponent support.",
4
+ "description": "std-search as a Function — single primitive: search-input. The atom's\nown SearchResult entity is the UI-state container — SEARCH persists\n@payload.searchTerm (matching the SearchInput component's emit shape)\ninto @entity.searchTerm. Cross-trait listeners route the same payload\nfield to data atoms (Browse REFETCH_QUERY).",
5
5
  "orbitals": [
6
6
  {
7
7
  "name": "SearchResultOrbital",
@@ -15,7 +15,7 @@
15
15
  "required": true
16
16
  },
17
17
  {
18
- "name": "query",
18
+ "name": "searchTerm",
19
19
  "type": "string"
20
20
  }
21
21
  ]
@@ -30,7 +30,7 @@
30
30
  "event": "SEARCH",
31
31
  "payloadSchema": [
32
32
  {
33
- "name": "query",
33
+ "name": "searchTerm",
34
34
  "type": "string",
35
35
  "required": true
36
36
  }
@@ -54,7 +54,7 @@
54
54
  "name": "Search",
55
55
  "payloadSchema": [
56
56
  {
57
- "name": "query",
57
+ "name": "searchTerm",
58
58
  "type": "string",
59
59
  "required": true
60
60
  }
@@ -85,8 +85,8 @@
85
85
  "effects": [
86
86
  [
87
87
  "set",
88
- "@entity.query",
89
- "@payload.query"
88
+ "@entity.searchTerm",
89
+ "@payload.searchTerm"
90
90
  ],
91
91
  [
92
92
  "render-ui",
@@ -68,14 +68,14 @@
68
68
  "config": {
69
69
  "filters": [
70
70
  {
71
- "label": "Status",
71
+ "filterType": "select",
72
+ "field": "status",
72
73
  "options": [
73
74
  "active",
74
75
  "inactive",
75
76
  "pending"
76
77
  ],
77
- "field": "status",
78
- "filterType": "select"
78
+ "label": "Status"
79
79
  }
80
80
  ],
81
81
  "event": "FILTER"
@@ -88,19 +88,19 @@
88
88
  "config": {
89
89
  "fields": [
90
90
  {
91
- "variant": "h4",
91
+ "name": "name",
92
92
  "label": "Name",
93
- "name": "name"
93
+ "variant": "h4"
94
94
  },
95
95
  {
96
+ "name": "description",
96
97
  "label": "Description",
97
- "variant": "caption",
98
- "name": "description"
98
+ "variant": "caption"
99
99
  },
100
100
  {
101
+ "name": "status",
101
102
  "label": "Status",
102
- "variant": "badge",
103
- "name": "status"
103
+ "variant": "badge"
104
104
  }
105
105
  ]
106
106
  },
@@ -120,14 +120,6 @@
120
120
  "kind": "trait",
121
121
  "trait": "FilteredItemFilter"
122
122
  }
123
- },
124
- {
125
- "event": "PAGE",
126
- "triggers": "REFETCH_PAGE",
127
- "source": {
128
- "kind": "trait",
129
- "trait": "FilteredItemPagination"
130
- }
131
123
  }
132
124
  ]
133
125
  },
@@ -135,10 +127,19 @@
135
127
  "ref": "Pagination.traits.PagedItemPagination",
136
128
  "name": "FilteredItemPagination",
137
129
  "config": {
138
- "totalPages": 10.0,
139
- "pageSize": 10.0,
140
- "event": "PAGE"
141
- }
130
+ "event": "PAGE",
131
+ "pageSize": 10.0
132
+ },
133
+ "listens": [
134
+ {
135
+ "event": "BrowseItemLoaded",
136
+ "triggers": "ITEMS_LOADED",
137
+ "source": {
138
+ "kind": "trait",
139
+ "trait": "FilteredItemBrowse"
140
+ }
141
+ }
142
+ ]
142
143
  },
143
144
  {
144
145
  "name": "FilteredListLayout",
@@ -227,26 +228,25 @@
227
228
  "render-ui",
228
229
  "main",
229
230
  {
230
- "type": "stack",
231
231
  "gap": "md",
232
232
  "className": "max-w-5xl mx-auto w-full",
233
233
  "children": [
234
234
  {
235
- "type": "stack",
236
235
  "direction": "horizontal",
237
236
  "align": "center",
238
237
  "gap": "sm",
239
238
  "children": [
240
239
  {
241
- "name": "list",
242
- "type": "icon"
240
+ "type": "icon",
241
+ "name": "list"
243
242
  },
244
243
  {
245
- "variant": "h2",
246
244
  "type": "typography",
247
- "content": "Filtered List"
245
+ "content": "Filtered List",
246
+ "variant": "h2"
248
247
  }
249
- ]
248
+ ],
249
+ "type": "stack"
250
250
  },
251
251
  {
252
252
  "type": "divider"
@@ -257,13 +257,14 @@
257
257
  "@trait.FilteredItemSearch",
258
258
  "@trait.FilteredItemFilter"
259
259
  ],
260
- "type": "stack",
261
- "gap": "sm"
260
+ "gap": "sm",
261
+ "type": "stack"
262
262
  },
263
263
  "@trait.FilteredItemBrowse",
264
264
  "@trait.FilteredItemPagination"
265
265
  ],
266
- "direction": "vertical"
266
+ "direction": "vertical",
267
+ "type": "stack"
267
268
  }
268
269
  ]
269
270
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/std",
3
- "version": "13.1.0",
3
+ "version": "13.1.2",
4
4
  "description": "Standard library operators for Almadar (math, string, array, etc.)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",