@almadar/std 16.9.2 → 16.10.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 (36) hide show
  1. package/behaviors/registry/core/atoms/std-calendar.orb +121 -58
  2. package/behaviors/registry/core-variations/atoms/std-board-kanban-classic.orb +58 -58
  3. package/behaviors/registry/core-variations/atoms/std-board-swim-lanes.orb +58 -58
  4. package/behaviors/registry/core-variations/atoms/std-board-timeline-roadmap.orb +94 -88
  5. package/behaviors/registry/core-variations/atoms/std-browse-dense.orb +54 -61
  6. package/behaviors/registry/core-variations/atoms/std-browse-feed.orb +52 -51
  7. package/behaviors/registry/core-variations/atoms/std-browse-gallery.orb +53 -53
  8. package/behaviors/registry/core-variations/atoms/std-browse-triage.orb +66 -86
  9. package/behaviors/registry/core-variations/atoms/std-calendar-agenda-list.orb +56 -50
  10. package/behaviors/registry/core-variations/atoms/std-calendar-week-timeline.orb +37 -31
  11. package/behaviors/registry/core-variations/atoms/std-thread-chat-bubbles.orb +57 -45
  12. package/dist/behaviors/behaviors-registry.json +8 -3
  13. package/dist/behaviors/registry/core/atoms/std-calendar.orb +121 -58
  14. package/dist/behaviors/registry/core-variations/atoms/std-board-kanban-classic.orb +58 -58
  15. package/dist/behaviors/registry/core-variations/atoms/std-board-swim-lanes.orb +58 -58
  16. package/dist/behaviors/registry/core-variations/atoms/std-board-timeline-roadmap.orb +94 -88
  17. package/dist/behaviors/registry/core-variations/atoms/std-browse-dense.orb +54 -61
  18. package/dist/behaviors/registry/core-variations/atoms/std-browse-feed.orb +52 -51
  19. package/dist/behaviors/registry/core-variations/atoms/std-browse-gallery.orb +53 -53
  20. package/dist/behaviors/registry/core-variations/atoms/std-browse-triage.orb +66 -86
  21. package/dist/behaviors/registry/core-variations/atoms/std-calendar-agenda-list.orb +56 -50
  22. package/dist/behaviors/registry/core-variations/atoms/std-calendar-week-timeline.orb +37 -31
  23. package/dist/behaviors/registry/core-variations/atoms/std-thread-chat-bubbles.orb +57 -45
  24. package/dist/behaviors-registry.json +8 -3
  25. package/dist/registry/core/atoms/std-calendar.orb +121 -58
  26. package/dist/registry/core-variations/atoms/std-board-kanban-classic.orb +58 -58
  27. package/dist/registry/core-variations/atoms/std-board-swim-lanes.orb +58 -58
  28. package/dist/registry/core-variations/atoms/std-board-timeline-roadmap.orb +94 -88
  29. package/dist/registry/core-variations/atoms/std-browse-dense.orb +54 -61
  30. package/dist/registry/core-variations/atoms/std-browse-feed.orb +52 -51
  31. package/dist/registry/core-variations/atoms/std-browse-gallery.orb +53 -53
  32. package/dist/registry/core-variations/atoms/std-browse-triage.orb +66 -86
  33. package/dist/registry/core-variations/atoms/std-calendar-agenda-list.orb +56 -50
  34. package/dist/registry/core-variations/atoms/std-calendar-week-timeline.orb +37 -31
  35. package/dist/registry/core-variations/atoms/std-thread-chat-bubbles.orb +57 -45
  36. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "std-thread-chat-bubbles",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Chat-bubbles thread — iMessage/WhatsApp DM style: two-party back-and-forth with sender-vs-receiver bubble alignment and tint.",
5
5
  "orbitals": [
6
6
  {
@@ -33,7 +33,11 @@
33
33
  {
34
34
  "name": "authorId",
35
35
  "type": "string",
36
- "required": true
36
+ "default": "them",
37
+ "values": [
38
+ "me",
39
+ "them"
40
+ ]
37
41
  },
38
42
  {
39
43
  "name": "authorName",
@@ -62,6 +66,14 @@
62
66
  "name": "replyCount",
63
67
  "type": "number",
64
68
  "default": 0.0
69
+ },
70
+ {
71
+ "name": "replies",
72
+ "type": "relation",
73
+ "relation": {
74
+ "entity": "ChatBubblesPost",
75
+ "cardinality": "many"
76
+ }
65
77
  }
66
78
  ]
67
79
  },
@@ -72,122 +84,122 @@
72
84
  "linkedEntity": "ChatBubblesPost",
73
85
  "config": {
74
86
  "bodyContent": {
87
+ "className": "max-w-2xl mx-auto px-card-md py-section h-full",
75
88
  "direction": "vertical",
89
+ "type": "stack",
76
90
  "children": [
77
91
  {
78
92
  "direction": "horizontal",
79
93
  "align": "center",
94
+ "gap": "sm",
80
95
  "type": "stack",
81
96
  "className": "pb-md border-b border-[var(--color-border)]",
82
- "gap": "sm",
83
97
  "children": [
84
98
  {
85
- "name": "Alex Rivera",
86
99
  "type": "avatar",
100
+ "name": "Alex Rivera",
87
101
  "size": "md"
88
102
  },
89
103
  {
90
- "direction": "vertical",
91
- "className": "flex-1",
92
- "type": "stack",
93
104
  "gap": "xs",
105
+ "className": "flex-1",
94
106
  "children": [
95
107
  {
96
- "content": "Alex Rivera",
97
- "variant": "body",
108
+ "type": "typography",
98
109
  "weight": "medium",
99
- "type": "typography"
110
+ "content": "Alex Rivera",
111
+ "variant": "body"
100
112
  },
101
113
  {
102
- "content": "Active now",
103
114
  "variant": "caption",
115
+ "content": "Active now",
104
116
  "color": "muted",
105
117
  "type": "typography"
106
118
  }
107
- ]
119
+ ],
120
+ "direction": "vertical",
121
+ "type": "stack"
108
122
  }
109
123
  ]
110
124
  },
111
125
  {
112
126
  "variant": "message",
113
- "senderField": "authorId",
114
- "currentUser": "me",
115
- "type": "data-list",
127
+ "entity": "@payload.data",
128
+ "className": "flex-1 overflow-y-auto py-md",
116
129
  "renderItem": [
117
130
  "fn",
118
131
  "item",
119
132
  {
120
- "type": "stack",
121
- "gap": "sm",
122
- "direction": "horizontal",
123
133
  "align": "end",
134
+ "gap": "sm",
135
+ "type": "stack",
124
136
  "className": "@item.isMe ? 'w-full flex-row-reverse' : 'w-full flex-row'",
125
137
  "children": [
126
138
  {
127
- "className": "@item.isMe ? 'invisible' : 'visible'",
128
139
  "size": "sm",
129
- "type": "avatar",
130
- "name": "@item.authorName"
140
+ "className": "@item.isMe ? 'invisible' : 'visible'",
141
+ "name": "@item.authorName",
142
+ "type": "avatar"
131
143
  },
132
144
  {
133
- "className": "@item.isMe ? 'max-w-[70%] items-end' : 'max-w-[70%] items-start'",
134
145
  "type": "stack",
135
146
  "direction": "vertical",
136
- "gap": "xs",
137
147
  "children": [
138
148
  {
149
+ "type": "card",
150
+ "padding": "sm",
139
151
  "children": {
140
- "content": "@item.content",
152
+ "variant": "body",
141
153
  "type": "typography",
142
- "variant": "body"
154
+ "content": "@item.content"
143
155
  },
144
156
  "look": "@item.isMe ? 'filled' : 'flat-bordered'",
145
- "type": "card",
146
- "padding": "sm",
147
157
  "className": "@item.isMe ? 'rounded-lg rounded-br-sm bg-[var(--color-primary)] text-[var(--color-primary-foreground)] shadow-sm' : 'rounded-lg rounded-bl-sm bg-[var(--color-muted)] text-[var(--color-foreground)] shadow-sm'"
148
158
  },
149
159
  {
150
160
  "variant": "caption",
151
161
  "type": "typography",
152
- "color": "muted",
153
- "content": "@item.createdAt"
162
+ "content": "@item.createdAt",
163
+ "color": "muted"
154
164
  }
155
- ]
165
+ ],
166
+ "className": "@item.isMe ? 'max-w-[70%] items-end' : 'max-w-[70%] items-start'",
167
+ "gap": "xs"
156
168
  }
157
- ]
169
+ ],
170
+ "direction": "horizontal"
158
171
  }
159
172
  ],
173
+ "senderField": "authorId",
174
+ "type": "data-list",
175
+ "gap": "sm",
160
176
  "fields": [],
161
- "entity": "@payload.data",
162
- "className": "flex-1 overflow-y-auto py-md",
163
- "gap": "sm"
177
+ "currentUser": "me"
164
178
  },
165
179
  {
180
+ "type": "stack",
166
181
  "direction": "horizontal",
182
+ "align": "center",
167
183
  "gap": "sm",
168
184
  "className": "mt-md border-t border-[var(--color-border)] pt-md",
169
185
  "children": [
170
186
  {
171
- "type": "input",
172
- "placeholder": "Message…",
187
+ "inputType": "text",
173
188
  "action": "EDIT_REPLY",
174
- "inputType": "text"
189
+ "placeholder": "Message…",
190
+ "type": "input"
175
191
  },
176
192
  {
177
193
  "action": "SUBMIT_REPLY",
178
194
  "icon": "send",
195
+ "type": "button",
179
196
  "label": "Send",
180
- "variant": "primary",
181
- "type": "button"
197
+ "variant": "primary"
182
198
  }
183
- ],
184
- "type": "stack",
185
- "align": "center"
199
+ ]
186
200
  }
187
201
  ],
188
- "type": "stack",
189
- "gap": "none",
190
- "className": "max-w-2xl mx-auto px-card-md py-section h-full"
202
+ "gap": "none"
191
203
  }
192
204
  }
193
205
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "$generated": "2026-05-28T18:56:30.228Z",
2
+ "$generated": "2026-05-29T01:27:31.633Z",
3
3
  "$source": "tools/almadar-pattern-sync/behaviors",
4
4
  "$package": "@almadar/std",
5
5
  "totalBehaviors": 92,
@@ -5211,7 +5211,7 @@
5211
5211
  },
5212
5212
  {
5213
5213
  "name": "date",
5214
- "type": "string",
5214
+ "type": "datetime",
5215
5215
  "default": ""
5216
5216
  },
5217
5217
  {
@@ -5223,6 +5223,11 @@
5223
5223
  "name": "duration",
5224
5224
  "type": "number",
5225
5225
  "default": 60
5226
+ },
5227
+ {
5228
+ "name": "selectedRange",
5229
+ "type": "string",
5230
+ "default": "month"
5226
5231
  }
5227
5232
  ]
5228
5233
  },
@@ -9472,7 +9477,7 @@
9472
9477
  "topic": "core",
9473
9478
  "family": "core",
9474
9479
  "layer": "UI Patterns",
9475
- "description": "std-notify-on-event — event-driven notification dispatcher. Listens for the generic `EventOccurred` sentinel (rename via traitOverrides.events to the real event, e.g. ContactSaved). Resolves recipient from `recipients` (first entry; fan-out is a future extension) or falls back to `@user.id`. Skips dispatch when the recipient is in `suppressionList`. Emits in-app `notify` when `notifyChannel` is `\"in-app\"`, or persists a `NotificationRecord` row for out-of-band delivery when channel is `\"email\"` or `\"sms\"`.",
9480
+ "description": "std-notify-on-event — cross-orbital wiring atom. Subscribes to events from another orbital (e.g. CheckoutOrbital emits OrderPlaced, OrderRecordOrbital reacts via this atom) and dispatches a notification. Use when one orbital needs to react to or be notified about events that happen in another orbital — the wiring goes through this atom's `EventOccurred` listener which the molecule renames via traitOverrides.events to the upstream event name. Resolves recipient from `recipients` (first entry; multi-recipient fan-out is a future extension) or falls back to `@user.id`. Skips dispatch when the recipient is in `suppressionList`. Emits in-app `notify` when `notifyChannel` is `\"in-app\"`, or persists a `NotificationRecord` row for out-of-band delivery when channel is `\"email\"` or `\"sms\"`.",
9476
9481
  "defaultOrbitalName": "NotifyOnEventOrbital",
9477
9482
  "statePattern": "idle",
9478
9483
  "complexity": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "std-calendar",
3
- "version": "1.1.0",
3
+ "version": "1.3.0",
4
4
  "description": "std-calendar as a Function — owns the fetch + SELECT_DAY state machine; default bodyContent renders the month-grid + upcoming-events tree. Layer 3 variants override bodyContent to deliver agenda, week-timeline, etc. while inheriting the same trait, state machine, emits, and listens.",
5
5
  "orbitals": [
6
6
  {
@@ -39,7 +39,7 @@
39
39
  },
40
40
  {
41
41
  "name": "date",
42
- "type": "string",
42
+ "type": "datetime",
43
43
  "default": ""
44
44
  },
45
45
  {
@@ -51,6 +51,11 @@
51
51
  "name": "duration",
52
52
  "type": "number",
53
53
  "default": 60.0
54
+ },
55
+ {
56
+ "name": "selectedRange",
57
+ "type": "string",
58
+ "default": "month"
54
59
  }
55
60
  ]
56
61
  },
@@ -61,7 +66,8 @@
61
66
  "entityContract": {
62
67
  "requires": [],
63
68
  "provides": [
64
- "date"
69
+ "date",
70
+ "selectedRange"
65
71
  ]
66
72
  },
67
73
  "category": "interaction",
@@ -179,22 +185,22 @@
179
185
  "render-ui",
180
186
  "main",
181
187
  {
182
- "type": "stack",
183
- "className": "py-12",
184
188
  "direction": "vertical",
185
- "gap": "md",
186
189
  "children": [
187
190
  {
188
191
  "type": "spinner"
189
192
  },
190
193
  {
194
+ "type": "typography",
191
195
  "content": "Loading calendar…",
192
- "variant": "caption",
193
196
  "color": "muted",
194
- "type": "typography"
197
+ "variant": "caption"
195
198
  }
196
199
  ],
197
- "align": "center"
200
+ "align": "center",
201
+ "className": "py-12",
202
+ "type": "stack",
203
+ "gap": "md"
198
204
  }
199
205
  ]
200
206
  ]
@@ -220,16 +226,15 @@
220
226
  "render-ui",
221
227
  "main",
222
228
  {
229
+ "align": "center",
223
230
  "gap": "md",
224
231
  "type": "stack",
225
- "direction": "vertical",
226
232
  "className": "py-12",
227
- "align": "center",
228
233
  "children": [
229
234
  {
235
+ "type": "icon",
230
236
  "name": "alert-triangle",
231
- "color": "destructive",
232
- "type": "icon"
237
+ "color": "destructive"
233
238
  },
234
239
  {
235
240
  "content": "Failed to load",
@@ -237,19 +242,20 @@
237
242
  "type": "typography"
238
243
  },
239
244
  {
240
- "content": "@payload.error",
241
- "color": "muted",
245
+ "variant": "body",
242
246
  "type": "typography",
243
- "variant": "body"
247
+ "content": "@payload.error",
248
+ "color": "muted"
244
249
  },
245
250
  {
246
- "type": "button",
247
- "icon": "rotate-ccw",
251
+ "label": "Retry",
248
252
  "variant": "primary",
253
+ "icon": "rotate-ccw",
249
254
  "action": "INIT",
250
- "label": "Retry"
255
+ "type": "button"
251
256
  }
252
- ]
257
+ ],
258
+ "direction": "vertical"
253
259
  }
254
260
  ]
255
261
  ]
@@ -264,26 +270,82 @@
264
270
  "@entity.date",
265
271
  "@payload.value"
266
272
  ],
273
+ [
274
+ "set",
275
+ "@entity.selectedRange",
276
+ "@payload.value"
277
+ ],
267
278
  [
268
279
  "fetch",
269
280
  "CalendarEvent",
270
281
  {
271
- "filter": [
272
- "=",
273
- "@entity.date",
274
- "@payload.value"
275
- ],
276
282
  "emit": {
277
283
  "success": "CalendarEventLoaded",
278
284
  "failure": "CalendarEventLoadFailed"
279
- }
280
- }
281
- ],
282
- [
283
- "render-ui",
284
- "main",
285
- {
286
- "type": "spinner"
285
+ },
286
+ "filter": [
287
+ "time/isAfter",
288
+ [
289
+ "time/parse",
290
+ "@entity.date"
291
+ ],
292
+ [
293
+ "if",
294
+ [
295
+ "=",
296
+ "@payload.value",
297
+ "week"
298
+ ],
299
+ [
300
+ "time/subtract",
301
+ [
302
+ "time/now"
303
+ ],
304
+ 1.0,
305
+ "week"
306
+ ],
307
+ [
308
+ "if",
309
+ [
310
+ "=",
311
+ "@payload.value",
312
+ "3months"
313
+ ],
314
+ [
315
+ "time/subtract",
316
+ [
317
+ "time/now"
318
+ ],
319
+ 3.0,
320
+ "month"
321
+ ],
322
+ [
323
+ "if",
324
+ [
325
+ "=",
326
+ "@payload.value",
327
+ "year"
328
+ ],
329
+ [
330
+ "time/subtract",
331
+ [
332
+ "time/now"
333
+ ],
334
+ 1.0,
335
+ "year"
336
+ ],
337
+ [
338
+ "time/subtract",
339
+ [
340
+ "time/now"
341
+ ],
342
+ 1.0,
343
+ "month"
344
+ ]
345
+ ]
346
+ ]
347
+ ]
348
+ ]
287
349
  }
288
350
  ]
289
351
  ]
@@ -332,36 +394,40 @@
332
394
  "bodyContent": {
333
395
  "type": "render-ui",
334
396
  "default": {
397
+ "type": "stack",
398
+ "direction": "vertical",
399
+ "gap": "lg",
335
400
  "children": [
336
401
  {
337
- "gap": "md",
402
+ "type": "stack",
403
+ "justify": "between",
404
+ "align": "center",
338
405
  "children": [
339
406
  {
340
407
  "gap": "sm",
408
+ "align": "center",
341
409
  "type": "stack",
342
410
  "direction": "horizontal",
343
- "align": "center",
344
411
  "children": [
345
412
  {
346
413
  "type": "icon",
347
414
  "name": "calendar"
348
415
  },
349
416
  {
350
- "content": "CalendarEvents Calendar",
417
+ "variant": "h2",
351
418
  "type": "typography",
352
- "variant": "h2"
419
+ "content": "CalendarEvents Calendar"
353
420
  }
354
421
  ]
355
422
  },
356
423
  {
424
+ "type": "date-range-selector",
357
425
  "onSelect": "SELECT_DAY",
358
- "type": "date-range-selector"
426
+ "selected": "@entity.selectedRange"
359
427
  }
360
428
  ],
361
- "type": "stack",
362
- "justify": "between",
363
- "align": "center",
364
- "direction": "horizontal"
429
+ "direction": "horizontal",
430
+ "gap": "md"
365
431
  },
366
432
  {
367
433
  "type": "divider"
@@ -373,50 +439,47 @@
373
439
  "type": "divider"
374
440
  },
375
441
  {
376
- "variant": "h4",
377
442
  "content": "Upcoming Events",
443
+ "variant": "h4",
378
444
  "type": "typography"
379
445
  },
380
446
  {
381
- "type": "data-list",
382
- "look": "@config.tableLook",
383
447
  "fields": [
384
448
  {
385
449
  "label": "Event",
386
450
  "name": "name",
387
- "variant": "h4",
388
- "icon": "calendar"
451
+ "icon": "calendar",
452
+ "variant": "h4"
389
453
  },
390
454
  {
391
455
  "label": "Time",
392
- "variant": "badge",
393
- "name": "time"
456
+ "name": "time",
457
+ "variant": "badge"
394
458
  },
395
459
  {
396
- "label": "Date",
397
460
  "name": "date",
398
461
  "variant": "caption",
462
+ "label": "Date",
399
463
  "format": "date"
400
464
  },
401
465
  {
402
- "variant": "badge",
403
466
  "name": "status",
404
- "label": "Status"
467
+ "label": "Status",
468
+ "variant": "badge"
405
469
  }
406
470
  ],
407
471
  "itemActions": [
408
472
  {
409
- "event": "SELECT_DAY",
410
473
  "icon": "eye",
411
- "label": "View"
474
+ "label": "View",
475
+ "event": "SELECT_DAY"
412
476
  }
413
477
  ],
478
+ "type": "data-list",
479
+ "look": "@config.tableLook",
414
480
  "entity": "@payload.data"
415
481
  }
416
- ],
417
- "gap": "lg",
418
- "direction": "vertical",
419
- "type": "stack"
482
+ ]
420
483
  },
421
484
  "label": "Body content tree",
422
485
  "description": "Render-ui SExpr rendered after events load. Default is the month-grid + upcoming-events list. Layer 3 variants override this with their own tree (agenda list, week timeline, etc.) to deliver entirely different calendar UX while inheriting the same trait, state machine, emits, and listens.",