@almadar/std 16.193.0 → 16.194.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 (281) hide show
  1. package/behaviors/lolo/infra/atoms/std-approval-gate.lolo +9 -3
  2. package/behaviors/lolo/ui/core/atoms/std-app-layout.lolo +2 -2
  3. package/behaviors/lolo/ui/core/atoms/std-browse.lolo +1 -1
  4. package/behaviors/lolo/ui/core/atoms/std-calendar.lolo +1 -1
  5. package/behaviors/lolo/ui/core/atoms/std-date-range.lolo +1 -1
  6. package/behaviors/lolo/ui/core/atoms/std-detail-layout.lolo +3 -3
  7. package/behaviors/lolo/ui/core/atoms/std-filter.lolo +1 -1
  8. package/behaviors/lolo/ui/core/atoms/std-geosearch.lolo +1 -1
  9. package/behaviors/lolo/ui/core/atoms/std-graphs.lolo +1 -1
  10. package/behaviors/lolo/ui/core/atoms/std-modal.lolo +1 -1
  11. package/behaviors/lolo/ui/core/atoms/std-pagination.lolo +1 -1
  12. package/behaviors/lolo/ui/core/atoms/std-record-detail.lolo +13 -2
  13. package/behaviors/lolo/ui/core/atoms/std-scatter.lolo +1 -1
  14. package/behaviors/lolo/ui/core/atoms/std-search.lolo +1 -1
  15. package/behaviors/lolo/ui/core/atoms/std-tag-strip.lolo +8 -3
  16. package/behaviors/lolo/ui/core/atoms/std-thread.lolo +91 -28
  17. package/behaviors/lolo/ui/core/atoms/std-tree.lolo +2 -2
  18. package/behaviors/lolo/ui/core/atoms/ui-avatar.lolo +2 -2
  19. package/behaviors/lolo/ui/core/atoms/ui-badge.lolo +1 -1
  20. package/behaviors/lolo/ui/core/atoms/ui-box.lolo +2 -2
  21. package/behaviors/lolo/ui/core/atoms/ui-button.lolo +1 -1
  22. package/behaviors/lolo/ui/core/atoms/ui-card.lolo +1 -1
  23. package/behaviors/lolo/ui/core/atoms/ui-checkbox.lolo +1 -1
  24. package/behaviors/lolo/ui/core/atoms/ui-day-cell.lolo +1 -1
  25. package/behaviors/lolo/ui/core/atoms/ui-filter-pill.lolo +4 -4
  26. package/behaviors/lolo/ui/core/atoms/ui-flip-container.lolo +1 -1
  27. package/behaviors/lolo/ui/core/atoms/ui-hstack.lolo +1 -1
  28. package/behaviors/lolo/ui/core/atoms/ui-infinite-scroll-sentinel.lolo +1 -1
  29. package/behaviors/lolo/ui/core/atoms/ui-input.lolo +3 -3
  30. package/behaviors/lolo/ui/core/atoms/ui-overlay.lolo +1 -1
  31. package/behaviors/lolo/ui/core/atoms/ui-radio.lolo +1 -1
  32. package/behaviors/lolo/ui/core/atoms/ui-range-slider.lolo +2 -2
  33. package/behaviors/lolo/ui/core/atoms/ui-select.lolo +3 -3
  34. package/behaviors/lolo/ui/core/atoms/ui-stack.lolo +1 -1
  35. package/behaviors/lolo/ui/core/atoms/ui-switch.lolo +1 -1
  36. package/behaviors/lolo/ui/core/atoms/ui-text-highlight.lolo +5 -5
  37. package/behaviors/lolo/ui/core/atoms/ui-textarea.lolo +2 -2
  38. package/behaviors/lolo/ui/core/atoms/ui-time-slot-cell.lolo +1 -1
  39. package/behaviors/lolo/ui/core/atoms/ui-typewriter-text.lolo +1 -1
  40. package/behaviors/lolo/ui/core/atoms/ui-vstack.lolo +1 -1
  41. package/behaviors/lolo/ui/core/molecules/ui-accordion.lolo +2 -2
  42. package/behaviors/lolo/ui/core/molecules/ui-alert.lolo +3 -3
  43. package/behaviors/lolo/ui/core/molecules/ui-branching-logic-builder.lolo +2 -2
  44. package/behaviors/lolo/ui/core/molecules/ui-breadcrumb.lolo +2 -2
  45. package/behaviors/lolo/ui/core/molecules/ui-calendar-grid.lolo +6 -6
  46. package/behaviors/lolo/ui/core/molecules/ui-carousel.lolo +1 -1
  47. package/behaviors/lolo/ui/core/molecules/ui-code-block.lolo +1 -1
  48. package/behaviors/lolo/ui/core/molecules/ui-confirm-dialog.lolo +2 -2
  49. package/behaviors/lolo/ui/core/molecules/ui-data-grid.lolo +3 -3
  50. package/behaviors/lolo/ui/core/molecules/ui-data-list.lolo +7 -7
  51. package/behaviors/lolo/ui/core/molecules/ui-date-range-picker.lolo +2 -2
  52. package/behaviors/lolo/ui/core/molecules/ui-date-range-selector.lolo +1 -1
  53. package/behaviors/lolo/ui/core/molecules/ui-document-details.lolo +2 -2
  54. package/behaviors/lolo/ui/core/molecules/ui-document-panel.lolo +5 -5
  55. package/behaviors/lolo/ui/core/molecules/ui-drawer.lolo +2 -2
  56. package/behaviors/lolo/ui/core/molecules/ui-emoji-picker.lolo +1 -1
  57. package/behaviors/lolo/ui/core/molecules/ui-empty-state.lolo +2 -2
  58. package/behaviors/lolo/ui/core/molecules/ui-error-state.lolo +2 -2
  59. package/behaviors/lolo/ui/core/molecules/ui-file-tree.lolo +3 -3
  60. package/behaviors/lolo/ui/core/molecules/ui-filter-group.lolo +4 -4
  61. package/behaviors/lolo/ui/core/molecules/ui-flip-card.lolo +1 -1
  62. package/behaviors/lolo/ui/core/molecules/ui-floating-action-button.lolo +2 -2
  63. package/behaviors/lolo/ui/core/molecules/ui-form-section-header.lolo +1 -1
  64. package/behaviors/lolo/ui/core/molecules/ui-graph-canvas.lolo +5 -5
  65. package/behaviors/lolo/ui/core/molecules/ui-graph-view.lolo +2 -2
  66. package/behaviors/lolo/ui/core/molecules/ui-header.lolo +4 -4
  67. package/behaviors/lolo/ui/core/molecules/ui-import-preview-tree.lolo +2 -2
  68. package/behaviors/lolo/ui/core/molecules/ui-import-source-picker.lolo +1 -1
  69. package/behaviors/lolo/ui/core/molecules/ui-input-group.lolo +3 -3
  70. package/behaviors/lolo/ui/core/molecules/ui-lightbox.lolo +2 -2
  71. package/behaviors/lolo/ui/core/molecules/ui-likert-scale.lolo +2 -2
  72. package/behaviors/lolo/ui/core/molecules/ui-map-view.lolo +4 -4
  73. package/behaviors/lolo/ui/core/molecules/ui-matrix-question.lolo +2 -2
  74. package/behaviors/lolo/ui/core/molecules/ui-modal.lolo +3 -3
  75. package/behaviors/lolo/ui/core/molecules/ui-notification.lolo +4 -4
  76. package/behaviors/lolo/ui/core/molecules/ui-number-stepper.lolo +2 -2
  77. package/behaviors/lolo/ui/core/molecules/ui-option-constraint-group.lolo +2 -2
  78. package/behaviors/lolo/ui/core/molecules/ui-orbital-visualization.lolo +1 -1
  79. package/behaviors/lolo/ui/core/molecules/ui-page-header.lolo +2 -2
  80. package/behaviors/lolo/ui/core/molecules/ui-pagination.lolo +4 -4
  81. package/behaviors/lolo/ui/core/molecules/ui-popover.lolo +1 -1
  82. package/behaviors/lolo/ui/core/molecules/ui-positioned-canvas.lolo +4 -4
  83. package/behaviors/lolo/ui/core/molecules/ui-progress-dots.lolo +1 -1
  84. package/behaviors/lolo/ui/core/molecules/ui-pull-to-refresh.lolo +1 -1
  85. package/behaviors/lolo/ui/core/molecules/ui-qr-scanner.lolo +2 -2
  86. package/behaviors/lolo/ui/core/molecules/ui-relation-select.lolo +1 -1
  87. package/behaviors/lolo/ui/core/molecules/ui-repeatable-form-section.lolo +3 -3
  88. package/behaviors/lolo/ui/core/molecules/ui-reply-tree.lolo +8 -8
  89. package/behaviors/lolo/ui/core/molecules/ui-rich-text-editor.lolo +2 -2
  90. package/behaviors/lolo/ui/core/molecules/ui-search-input.lolo +2 -2
  91. package/behaviors/lolo/ui/core/molecules/ui-side-panel.lolo +2 -2
  92. package/behaviors/lolo/ui/core/molecules/ui-sidebar.lolo +3 -3
  93. package/behaviors/lolo/ui/core/molecules/ui-signature-pad.lolo +3 -3
  94. package/behaviors/lolo/ui/core/molecules/ui-sortable-list.lolo +1 -1
  95. package/behaviors/lolo/ui/core/molecules/ui-star-rating.lolo +2 -2
  96. package/behaviors/lolo/ui/core/molecules/ui-swipeable-row.lolo +2 -2
  97. package/behaviors/lolo/ui/core/molecules/ui-table-view.lolo +4 -4
  98. package/behaviors/lolo/ui/core/molecules/ui-tabs.lolo +2 -2
  99. package/behaviors/lolo/ui/core/molecules/ui-tag-input.lolo +3 -3
  100. package/behaviors/lolo/ui/core/molecules/ui-upload-drop-zone.lolo +1 -1
  101. package/behaviors/lolo/ui/core/molecules/ui-version-diff.lolo +6 -6
  102. package/behaviors/lolo/ui/core/molecules/ui-violation-alert.lolo +2 -2
  103. package/behaviors/lolo/ui/core/molecules/ui-vote-stack.lolo +2 -2
  104. package/behaviors/lolo/ui/core/molecules/ui-wizard-container.lolo +5 -5
  105. package/behaviors/lolo/ui/core/molecules/ui-wizard-navigation.lolo +6 -6
  106. package/behaviors/lolo/ui/core/molecules/ui-wizard-progress.lolo +2 -2
  107. package/behaviors/lolo/ui/core/organisms/ui-detail-panel.lolo +1 -1
  108. package/behaviors/lolo/ui/core/organisms/ui-entity-cards.lolo +1 -1
  109. package/behaviors/lolo/ui/core/organisms/ui-form-section.lolo +3 -3
  110. package/behaviors/lolo/ui/core/organisms/ui-form.lolo +3 -3
  111. package/behaviors/lolo/ui/core/organisms/ui-media-gallery.lolo +1 -1
  112. package/behaviors/lolo/ui/core/organisms/ui-subagent-trace-panel.lolo +1 -1
  113. package/behaviors/lolo/ui/core/organisms/ui-tabbed-container.lolo +1 -1
  114. package/behaviors/lolo/ui/core/organisms/ui-timeline.lolo +1 -1
  115. package/behaviors/lolo/ui/core/templates/ui-counter-template.lolo +6 -6
  116. package/behaviors/lolo/ui/core/templates/ui-dashboard-layout.lolo +6 -6
  117. package/behaviors/lolo/ui/game/atoms/ui-canvas-2d.lolo +4 -4
  118. package/behaviors/lolo/ui/game/atoms/ui-canvas.lolo +5 -5
  119. package/behaviors/lolo/ui/game/atoms/ui-choice-button.lolo +2 -2
  120. package/behaviors/lolo/ui/game/atoms/ui-control-button.lolo +4 -4
  121. package/behaviors/lolo/ui/game/atoms/ui-control-grid.lolo +4 -4
  122. package/behaviors/lolo/ui/game/atoms/ui-game-menu.lolo +1 -1
  123. package/behaviors/lolo/ui/game/atoms/ui-sequence-bar.lolo +4 -4
  124. package/behaviors/lolo/ui/game/atoms/ui-state-graph.lolo +1 -1
  125. package/behaviors/lolo/ui/game/atoms/ui-trait-slot.lolo +7 -7
  126. package/behaviors/lolo/ui/game/organisms/std-tactics-board-2d.lolo +1 -1
  127. package/behaviors/lolo/ui/learning/atoms/ui-algo-graph-canvas.lolo +2 -2
  128. package/behaviors/lolo/ui/learning/atoms/ui-algorithm-canvas.lolo +1 -1
  129. package/behaviors/lolo/ui/learning/atoms/ui-biology-canvas.lolo +1 -1
  130. package/behaviors/lolo/ui/learning/atoms/ui-chemistry-canvas.lolo +1 -1
  131. package/behaviors/lolo/ui/learning/atoms/ui-learning-canvas.lolo +2 -2
  132. package/behaviors/lolo/ui/learning/atoms/ui-math-canvas.lolo +1 -1
  133. package/behaviors/lolo/ui/learning/atoms/ui-physics-canvas.lolo +1 -1
  134. package/behaviors/registry/infra/atoms/std-approval-gate.orb +37 -9
  135. package/behaviors/registry/ui/core/atoms/std-app-layout.orb +4 -2
  136. package/behaviors/registry/ui/core/atoms/std-browse.orb +2 -1
  137. package/behaviors/registry/ui/core/atoms/std-calendar.orb +1 -1
  138. package/behaviors/registry/ui/core/atoms/std-date-range.orb +2 -1
  139. package/behaviors/registry/ui/core/atoms/std-detail-layout.orb +3 -3
  140. package/behaviors/registry/ui/core/atoms/std-filter.orb +2 -1
  141. package/behaviors/registry/ui/core/atoms/std-geosearch.orb +2 -1
  142. package/behaviors/registry/ui/core/atoms/std-graphs.orb +1 -1
  143. package/behaviors/registry/ui/core/atoms/std-modal.orb +5 -1
  144. package/behaviors/registry/ui/core/atoms/std-pagination.orb +2 -1
  145. package/behaviors/registry/ui/core/atoms/std-record-detail.orb +38 -2
  146. package/behaviors/registry/ui/core/atoms/std-scatter.orb +1 -1
  147. package/behaviors/registry/ui/core/atoms/std-search.orb +2 -1
  148. package/behaviors/registry/ui/core/atoms/std-tag-strip.orb +75 -54
  149. package/behaviors/registry/ui/core/atoms/std-thread.orb +296 -109
  150. package/behaviors/registry/ui/core/atoms/std-tree.orb +20 -2
  151. package/behaviors/registry/ui/core/atoms/ui-avatar.orb +2 -2
  152. package/behaviors/registry/ui/core/atoms/ui-badge.orb +1 -1
  153. package/behaviors/registry/ui/core/atoms/ui-box.orb +2 -2
  154. package/behaviors/registry/ui/core/atoms/ui-button.orb +1 -1
  155. package/behaviors/registry/ui/core/atoms/ui-card.orb +1 -1
  156. package/behaviors/registry/ui/core/atoms/ui-checkbox.orb +1 -1
  157. package/behaviors/registry/ui/core/atoms/ui-day-cell.orb +1 -1
  158. package/behaviors/registry/ui/core/atoms/ui-filter-pill.orb +5 -4
  159. package/behaviors/registry/ui/core/atoms/ui-flip-container.orb +1 -1
  160. package/behaviors/registry/ui/core/atoms/ui-hstack.orb +1 -1
  161. package/behaviors/registry/ui/core/atoms/ui-infinite-scroll-sentinel.orb +1 -1
  162. package/behaviors/registry/ui/core/atoms/ui-input.orb +3 -3
  163. package/behaviors/registry/ui/core/atoms/ui-overlay.orb +1 -1
  164. package/behaviors/registry/ui/core/atoms/ui-radio.orb +1 -1
  165. package/behaviors/registry/ui/core/atoms/ui-range-slider.orb +2 -2
  166. package/behaviors/registry/ui/core/atoms/ui-select.orb +3 -3
  167. package/behaviors/registry/ui/core/atoms/ui-stack.orb +1 -1
  168. package/behaviors/registry/ui/core/atoms/ui-switch.orb +1 -1
  169. package/behaviors/registry/ui/core/atoms/ui-text-highlight.orb +5 -5
  170. package/behaviors/registry/ui/core/atoms/ui-textarea.orb +2 -2
  171. package/behaviors/registry/ui/core/atoms/ui-time-slot-cell.orb +1 -1
  172. package/behaviors/registry/ui/core/atoms/ui-typewriter-text.orb +1 -1
  173. package/behaviors/registry/ui/core/atoms/ui-vstack.orb +1 -1
  174. package/behaviors/registry/ui/core/molecules/ui-accordion.orb +2 -2
  175. package/behaviors/registry/ui/core/molecules/ui-alert.orb +3 -3
  176. package/behaviors/registry/ui/core/molecules/ui-branching-logic-builder.orb +2 -2
  177. package/behaviors/registry/ui/core/molecules/ui-breadcrumb.orb +2 -2
  178. package/behaviors/registry/ui/core/molecules/ui-calendar-grid.orb +6 -6
  179. package/behaviors/registry/ui/core/molecules/ui-carousel.orb +1 -1
  180. package/behaviors/registry/ui/core/molecules/ui-code-block.orb +1 -1
  181. package/behaviors/registry/ui/core/molecules/ui-confirm-dialog.orb +2 -2
  182. package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +3 -3
  183. package/behaviors/registry/ui/core/molecules/ui-data-list.orb +7 -7
  184. package/behaviors/registry/ui/core/molecules/ui-date-range-picker.orb +2 -2
  185. package/behaviors/registry/ui/core/molecules/ui-date-range-selector.orb +1 -1
  186. package/behaviors/registry/ui/core/molecules/ui-document-details.orb +2 -2
  187. package/behaviors/registry/ui/core/molecules/ui-document-panel.orb +5 -5
  188. package/behaviors/registry/ui/core/molecules/ui-drawer.orb +3 -2
  189. package/behaviors/registry/ui/core/molecules/ui-emoji-picker.orb +1 -1
  190. package/behaviors/registry/ui/core/molecules/ui-empty-state.orb +2 -2
  191. package/behaviors/registry/ui/core/molecules/ui-error-state.orb +2 -2
  192. package/behaviors/registry/ui/core/molecules/ui-file-tree.orb +3 -3
  193. package/behaviors/registry/ui/core/molecules/ui-filter-group.orb +4 -4
  194. package/behaviors/registry/ui/core/molecules/ui-flip-card.orb +1 -1
  195. package/behaviors/registry/ui/core/molecules/ui-floating-action-button.orb +2 -2
  196. package/behaviors/registry/ui/core/molecules/ui-form-section-header.orb +1 -1
  197. package/behaviors/registry/ui/core/molecules/ui-graph-canvas.orb +5 -5
  198. package/behaviors/registry/ui/core/molecules/ui-graph-view.orb +2 -2
  199. package/behaviors/registry/ui/core/molecules/ui-header.orb +4 -4
  200. package/behaviors/registry/ui/core/molecules/ui-import-preview-tree.orb +2 -2
  201. package/behaviors/registry/ui/core/molecules/ui-import-source-picker.orb +1 -1
  202. package/behaviors/registry/ui/core/molecules/ui-input-group.orb +3 -3
  203. package/behaviors/registry/ui/core/molecules/ui-lightbox.orb +2 -2
  204. package/behaviors/registry/ui/core/molecules/ui-likert-scale.orb +2 -2
  205. package/behaviors/registry/ui/core/molecules/ui-map-view.orb +4 -4
  206. package/behaviors/registry/ui/core/molecules/ui-matrix-question.orb +2 -2
  207. package/behaviors/registry/ui/core/molecules/ui-modal.orb +4 -3
  208. package/behaviors/registry/ui/core/molecules/ui-notification.orb +4 -4
  209. package/behaviors/registry/ui/core/molecules/ui-number-stepper.orb +2 -2
  210. package/behaviors/registry/ui/core/molecules/ui-option-constraint-group.orb +2 -2
  211. package/behaviors/registry/ui/core/molecules/ui-orbital-visualization.orb +1 -1
  212. package/behaviors/registry/ui/core/molecules/ui-page-header.orb +2 -2
  213. package/behaviors/registry/ui/core/molecules/ui-pagination.orb +5 -4
  214. package/behaviors/registry/ui/core/molecules/ui-popover.orb +1 -1
  215. package/behaviors/registry/ui/core/molecules/ui-positioned-canvas.orb +4 -4
  216. package/behaviors/registry/ui/core/molecules/ui-progress-dots.orb +1 -1
  217. package/behaviors/registry/ui/core/molecules/ui-pull-to-refresh.orb +1 -1
  218. package/behaviors/registry/ui/core/molecules/ui-qr-scanner.orb +2 -2
  219. package/behaviors/registry/ui/core/molecules/ui-relation-select.orb +1 -1
  220. package/behaviors/registry/ui/core/molecules/ui-repeatable-form-section.orb +3 -3
  221. package/behaviors/registry/ui/core/molecules/ui-reply-tree.orb +8 -8
  222. package/behaviors/registry/ui/core/molecules/ui-rich-text-editor.orb +3 -2
  223. package/behaviors/registry/ui/core/molecules/ui-search-input.orb +2 -2
  224. package/behaviors/registry/ui/core/molecules/ui-side-panel.orb +3 -2
  225. package/behaviors/registry/ui/core/molecules/ui-sidebar.orb +3 -3
  226. package/behaviors/registry/ui/core/molecules/ui-signature-pad.orb +3 -3
  227. package/behaviors/registry/ui/core/molecules/ui-sortable-list.orb +1 -1
  228. package/behaviors/registry/ui/core/molecules/ui-star-rating.orb +2 -2
  229. package/behaviors/registry/ui/core/molecules/ui-swipeable-row.orb +2 -2
  230. package/behaviors/registry/ui/core/molecules/ui-table-view.orb +4 -4
  231. package/behaviors/registry/ui/core/molecules/ui-tabs.orb +2 -2
  232. package/behaviors/registry/ui/core/molecules/ui-tag-input.orb +3 -3
  233. package/behaviors/registry/ui/core/molecules/ui-upload-drop-zone.orb +1 -1
  234. package/behaviors/registry/ui/core/molecules/ui-version-diff.orb +6 -6
  235. package/behaviors/registry/ui/core/molecules/ui-violation-alert.orb +2 -2
  236. package/behaviors/registry/ui/core/molecules/ui-vote-stack.orb +2 -2
  237. package/behaviors/registry/ui/core/molecules/ui-wizard-container.orb +5 -5
  238. package/behaviors/registry/ui/core/molecules/ui-wizard-navigation.orb +6 -6
  239. package/behaviors/registry/ui/core/molecules/ui-wizard-progress.orb +2 -2
  240. package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +1 -1
  241. package/behaviors/registry/ui/core/organisms/ui-entity-cards.orb +1 -1
  242. package/behaviors/registry/ui/core/organisms/ui-form-section.orb +3 -3
  243. package/behaviors/registry/ui/core/organisms/ui-form.orb +3 -3
  244. package/behaviors/registry/ui/core/organisms/ui-media-gallery.orb +1 -1
  245. package/behaviors/registry/ui/core/organisms/ui-subagent-trace-panel.orb +1 -1
  246. package/behaviors/registry/ui/core/organisms/ui-tabbed-container.orb +1 -1
  247. package/behaviors/registry/ui/core/organisms/ui-timeline.orb +1 -1
  248. package/behaviors/registry/ui/core/templates/ui-counter-template.orb +6 -6
  249. package/behaviors/registry/ui/core/templates/ui-dashboard-layout.orb +6 -6
  250. package/behaviors/registry/ui/game/atoms/ui-canvas-2d.orb +4 -4
  251. package/behaviors/registry/ui/game/atoms/ui-canvas.orb +5 -5
  252. package/behaviors/registry/ui/game/atoms/ui-choice-button.orb +2 -2
  253. package/behaviors/registry/ui/game/atoms/ui-control-button.orb +4 -4
  254. package/behaviors/registry/ui/game/atoms/ui-control-grid.orb +4 -4
  255. package/behaviors/registry/ui/game/atoms/ui-game-menu.orb +1 -1
  256. package/behaviors/registry/ui/game/atoms/ui-sequence-bar.orb +4 -4
  257. package/behaviors/registry/ui/game/atoms/ui-state-graph.orb +1 -1
  258. package/behaviors/registry/ui/game/atoms/ui-trait-slot.orb +8 -7
  259. package/behaviors/registry/ui/game/organisms/std-tactics-board-2d.orb +7 -13
  260. package/behaviors/registry/ui/learning/atoms/ui-algo-graph-canvas.orb +2 -2
  261. package/behaviors/registry/ui/learning/atoms/ui-algorithm-canvas.orb +1 -1
  262. package/behaviors/registry/ui/learning/atoms/ui-biology-canvas.orb +1 -1
  263. package/behaviors/registry/ui/learning/atoms/ui-chemistry-canvas.orb +1 -1
  264. package/behaviors/registry/ui/learning/atoms/ui-learning-canvas.orb +2 -2
  265. package/behaviors/registry/ui/learning/atoms/ui-math-canvas.orb +1 -1
  266. package/behaviors/registry/ui/learning/atoms/ui-physics-canvas.orb +1 -1
  267. package/dist/behaviors/exports-reader.js +413 -144
  268. package/dist/behaviors/functions/index.d.ts +24 -14
  269. package/dist/behaviors/functions/index.js +413 -144
  270. package/dist/behaviors/index.d.ts +1 -1
  271. package/dist/behaviors/index.js +413 -144
  272. package/dist/behaviors/query.js +413 -144
  273. package/dist/behaviors-embeddings.hash.json +3 -3
  274. package/dist/behaviors-embeddings.json +5 -5
  275. package/dist/behaviors-registry.json +8 -7
  276. package/dist/index.d.ts +1 -1
  277. package/dist/index.js +413 -144
  278. package/dist/knob-embeddings.hash.json +3 -3
  279. package/dist/knob-embeddings.json +1 -1
  280. package/dist/registry/factory-signatures.json +1 -1
  281. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  app std-approval-gate "1.1.0"
2
- "std-approval-gate — generic approval gate / approver workflow. Use when a user voices that an action must be reviewed, approved, signed off, or authorized by a privileged role before it proceeds (admin approval, supervisor sign-off, manager approval, gatekeeper review, editor approval, senior editor approval, reviewer approval, publishing approval, draft approval, content review, submit drafts then editors review and approve or reject, needs approval before going live, requires sign-off before publish). Persists ApprovalRequest rows + surfaces the PENDING ones in a review queue showing what is being approved and who asked, with Approve / Deny actions — Deny captures a written reason. approverRoles is ENFORCED by the review transitions themselves: an APPROVE/DENY from a viewer whose role is not listed does not fire. On approval emits ApprovalGranted; on denial emits ApprovalDenied (with the reason). Hosts that replay the gated action MUST route a failed replay back via APPROVAL_REPLAY_FAILED so the request reopens instead of being silently consumed. Compose onto any orbital whose action you want to gate: the target orbital emits an external event, an ApprovalRequest row is created (stamp subjectLabel/subjectId/requestedBy so reviewers see what they are judging), and downstream effects wait on ApprovalGranted. Differs from std-mod-queue, which is content-moderation-specific."
2
+ "std-approval-gate — generic approval gate / approver workflow. Use when a user voices that an action must be reviewed, approved, signed off, or authorized by a privileged role before it proceeds (admin approval, supervisor sign-off, manager approval, gatekeeper review, editor approval, senior editor approval, reviewer approval, publishing approval, draft approval, content review, submit drafts then editors review and approve or reject, needs approval before going live, requires sign-off before publish). Persists ApprovalRequest rows + surfaces the PENDING ones in a review queue showing what is being approved and who asked, with Approve / Deny actions — Deny captures a written reason. approverRoles is ENFORCED by the review transitions themselves: an APPROVE/DENY from a viewer whose role is not listed does not fire. blockSelfApproval additionally stops a reviewer approving their own request (four-eyes) — DENY stays allowed as self-withdrawal. On approval emits ApprovalGranted; on denial emits ApprovalDenied (with the reason). Hosts that replay the gated action MUST route a failed replay back via APPROVAL_REPLAY_FAILED so the request reopens instead of being silently consumed. Compose onto any orbital whose action you want to gate: the target orbital emits an external event, an ApprovalRequest row is created (stamp subjectLabel/subjectId/requestedBy so reviewers see what they are judging), and downstream effects wait on ApprovalGranted. Differs from std-mod-queue, which is content-moderation-specific."
3
3
  orbital ApprovalGateOrbital {
4
4
  uses Spinner from "std/behaviors/ui-spinner"
5
5
  uses Typography from "std/behaviors/ui-typography"
@@ -227,8 +227,9 @@ orbital ApprovalGateOrbital {
227
227
  ;; The role guard IS the enforcement (both execution paths honor
228
228
  ;; transition guards, for the button and for a bus-delivered event
229
229
  ;; alike): empty approverRoles = ungated, otherwise the viewer's role
230
- ;; must be listed or the decision does not fire.
231
- APPROVE -> reviewing when (or ["=", (array/len @config.approverRoles), 0] (array/includes @config.approverRoles @user.role))
230
+ ;; must be listed or the decision does not fire. blockSelfApproval
231
+ ;; additionally blocks APPROVE when ?row.requestedBy is the viewer.
232
+ APPROVE -> reviewing when (and (or ["=", (array/len @config.approverRoles), 0] (array/includes @config.approverRoles @user.role)) (or ["=", @config.blockSelfApproval, false] ["!=", (object/get ?row requestedBy), @user.id]))
232
233
  (set @entity.id ?id)
233
234
  (set @entity.status approved)
234
235
  (set @entity.reviewer @user.id)
@@ -499,6 +500,11 @@ orbital ApprovalGateOrbital {
499
500
  @description "Roles eligible to decide. ENFORCED by the APPROVE/DENY transition guards: a viewer whose @user.role is not listed cannot fire a decision, from the button or from the bus. Empty = every signed-in viewer may decide (ungated)."
500
501
  @synonyms "approver, reviewer, authorized roles, sign-off roles, who approves"
501
502
  @tier "policy"
503
+ blockSelfApproval : boolean = false
504
+ @label "Block approving your own requests?"
505
+ @description "When on, a reviewer cannot APPROVE a request they submitted themselves (requestedBy = the viewer's id) — enforced by the APPROVE transition guard, from the button or from the bus. Requires hosts to stamp requestedBy at request creation. DENY stays allowed on your own request (denying your own request withdraws it). Off by default."
506
+ @synonyms "self approval, self-approval, four eyes, four-eyes, separation of duties, cannot approve own, no self sign-off, dual control"
507
+ @tier "policy"
502
508
  threshold : number = 0
503
509
  @label "Auto-approve below this value"
504
510
  @description "Requests whose gated value is below this threshold are auto-approved. v1.0 declarative only."
@@ -119,7 +119,7 @@ orbital AppLayoutOrbital {
119
119
  @description "Top-level navigation links shown on the left rail."
120
120
  @synonyms "nav links, menu items, sidebar sections, navigation entries, pages"
121
121
  @tier "presentation"
122
- searchEvent : string = SEARCH
122
+ searchEvent : event = SEARCH
123
123
  @label "Search event"
124
124
  @description "Event emitted when the user runs a global search"
125
125
  @tier "internal"
@@ -133,7 +133,7 @@ orbital AppLayoutOrbital {
133
133
  @description "Items shown in the notifications dropdown."
134
134
  @synonyms "alerts, messages, notices, notification items, bell items"
135
135
  @tier "presentation"
136
- notificationClickEvent : string = NOTIFY_CLICK
136
+ notificationClickEvent : event = NOTIFY_CLICK
137
137
  @label "Notification click event"
138
138
  @description "Event emitted when the user picks a notification"
139
139
  @tier "internal"
@@ -370,7 +370,7 @@ orbital BrowseItemOrbital {
370
370
  @description "Actions beyond this count collapse into a '⋯' overflow menu. Set 2–3 for dense tables."
371
371
  @synonyms "inline actions limit, overflow threshold, max buttons per row"
372
372
  @tier "presentation"
373
- itemClickEvent : string = VIEW
373
+ itemClickEvent : event = VIEW
374
374
  @label "Which event does clicking a row fire?"
375
375
  @description "Row-click channel. Retarget when two browse lists coexist in one orbital and their VIEW payloads differ, so each gets its own typed channel."
376
376
  @synonyms "row click event, item click, open event, select event"
@@ -234,7 +234,7 @@ orbital CalendarEventOrbital {
234
234
  @description "Row column holding the timestamp the calendar grid places each chip by. Rebound hosts point this at their own column (e.g. startTime, startsAt, dueAt); the chip's LABEL comes from titleBinding, not from here."
235
235
  @synonyms "start column, date column, when field, timestamp field"
236
236
  @tier "presentation"
237
- onEventClick : string = ""
237
+ onEventClick : event = ""
238
238
  @label "On Event Click"
239
239
  @description "Event emitted when a calendar chip is clicked: UI:{onEventClick} with { event } carrying the clicked row. Empty means chips are not clickable."
240
240
  @synonyms "open event, event click, select event, chip click"
@@ -78,7 +78,7 @@ orbital DateRangeOrbital {
78
78
  }
79
79
 
80
80
  config {
81
- event : string = DATE_RANGE_CHANGED
81
+ event : event = DATE_RANGE_CHANGED
82
82
  @label "Change event"
83
83
  @description "Event name emitted when the user picks a new range"
84
84
  @tier "internal"
@@ -18,9 +18,9 @@ orbital DetailLayoutOrbital {
18
18
  className: "w-full"
19
19
  children: [{
20
20
  type: stack
21
- direction: horizontal
22
- align: center
23
- gap: sm
21
+ direction: vertical
22
+ align: start
23
+ gap: xs
24
24
  className: "w-full border-b border-border pb-3"
25
25
  children: [{
26
26
  type: button
@@ -82,7 +82,7 @@ orbital FilterTargetOrbital {
82
82
  @description "Field, label, control type, and options for each filter input. numberrange renders a min/max slider pair (bounded by min/max/step) and emits one FILTER per side as `<field>_min` / `<field>_max`, mirroring daterange's `<field>_from` / `<field>_to` convention."
83
83
  @synonyms "numeric range, price range, min max, slider filter, range filter, threshold filter"
84
84
  @tier "presentation"
85
- event : string = FILTER
85
+ event : event = FILTER
86
86
  @label "Filter event"
87
87
  @description "Event emitted when the user changes a filter selection"
88
88
  @tier "internal"
@@ -112,7 +112,7 @@ orbital GeoSearchResultOrbital {
112
112
  @label "Default radius (km)"
113
113
  @description "Initial search radius around the chosen center"
114
114
  @tier "presentation"
115
- event : string = GEO_SEARCH
115
+ event : event = GEO_SEARCH
116
116
  @label "Search event"
117
117
  @description "Event emitted when the user runs a geo search"
118
118
  @tier "internal"
@@ -128,7 +128,7 @@ orbital GraphItemOrbital {
128
128
  @description "Keep only the first N points after sorting (0 = all)"
129
129
  @synonyms "user phrases: 'top 5' -> 5; 'top 10' -> 10; 'first 3' -> 3; 'all' / 'no limit' -> 0; 'show all' -> 0"
130
130
  @tier "presentation"
131
- drillEvent : string = ""
131
+ drillEvent : event = ""
132
132
  @label "Drill event"
133
133
  @description "Event emitted when a user clicks a chart point"
134
134
  @synonyms "click-through navigation event. user phrases: 'on click navigate to X' / 'drill into X' / 'when clicked open X' -> X event name"
@@ -154,7 +154,7 @@ orbital ModalRecordOrbital {
154
154
  @description "Per-field label/placeholder/hint overrides, keyed by field name. Types, options and required-ness stay entity-schema-driven (declare once on the entity); override only display copy the entity's @description doesn't fit."
155
155
  @synonyms "field labels, custom labels, help text overrides, placeholder text"
156
156
  @tier "presentation"
157
- mode : string = create
157
+ mode : "create" | "edit" = create
158
158
  @label "Is this for creating or editing?"
159
159
  @description "create = blank form; edit = pre-filled from the selected row."
160
160
  @synonyms "form mode, create or edit, new or update, add or modify"
@@ -97,7 +97,7 @@ orbital PagedItemOrbital {
97
97
  @label "Page size"
98
98
  @description "Rows per page used to derive total page count"
99
99
  @tier "presentation"
100
- event : string = PAGE
100
+ event : event = PAGE
101
101
  @label "Page-change event"
102
102
  @description "Event emitted when the user picks a new page"
103
103
  @tier "internal"
@@ -70,6 +70,12 @@ orbital RecordItemOrbital {
70
70
  include: @config.include
71
71
  })
72
72
  (render-ui main { rows: 4, type: skeleton })
73
+ ;; Event-opened overlay (openOn: event): stays blank until OPEN_VIEW,
74
+ ;; but renders the blank EXPLICITLY — an embedded @trait.X reference to
75
+ ;; a trait with no indexed content is flagged by the compiled client's
76
+ ;; render probe (trait_bindings_resolved).
77
+ INIT -> idle when ["=", @config.openOn, "event"]
78
+ (render-ui main null)
73
79
  ;; self-loops on the external emits so the validator sees in-atom
74
80
  ;; listeners — the real consumers are the composing organism's
75
81
  ;; persistor (CONTENT_SAVED, TITLE_COMMITTED) and its refetch /
@@ -535,6 +541,11 @@ orbital RecordItemOrbital {
535
541
  @label "Edit button label"
536
542
  @description "Label of the quiet button above the document body that starts an editing session (the body itself is also clickable)."
537
543
  @tier "presentation"
544
+ allowEdit : boolean = true
545
+ @label "Allow editing the document?"
546
+ @description "When false the document look is a pure read surface: no header Edit button, no click-to-edit body, no click-to-rename title. Hosts pass a role condition here so read-only viewers get the page without its authoring affordances; the entity's own access predicates stay the enforcement floor."
547
+ @synonyms "read only document, viewer mode, can edit, editing allowed"
548
+ @tier "policy"
538
549
  doneLabel : string = "Done"
539
550
  @label "Done button label"
540
551
  @description "Label of the button that ends the document editing session; work is already autosaved when it is pressed."
@@ -613,14 +624,14 @@ orbital RecordItemOrbital {
613
624
  actions: @config.actions
614
625
  coverImage: @entity.coverUrl
615
626
  icon: @entity.iconName
616
- editEvent: EDIT_CONTENT
627
+ editEvent: (if @config.allowEdit EDIT_CONTENT null)
617
628
  editLabel: @config.editLabel
618
629
  id: @entity.id
619
630
  maxInlineActions: @config.maxInlineActions
620
631
  placeholder: @config.placeholder
621
632
  subtitle: @entity.description
622
633
  title: @entity.name
623
- titleCommitEvent: TITLE_COMMITTED
634
+ titleCommitEvent: (if @config.allowEdit TITLE_COMMITTED null)
624
635
  type: document-panel
625
636
  value: @entity.content
626
637
  className: "w-full"
@@ -118,7 +118,7 @@ orbital ScatterItemOrbital {
118
118
  @label "Chart height"
119
119
  @description "Pixel height of the rendered scatter plot"
120
120
  @tier "presentation"
121
- drillEvent : string = ""
121
+ drillEvent : event = ""
122
122
  @label "Drill event"
123
123
  @description "Event emitted when the user clicks a data point"
124
124
  @tier "internal"
@@ -48,7 +48,7 @@ orbital SearchResultOrbital {
48
48
  @label "Placeholder text"
49
49
  @description "Hint text shown inside the empty search input"
50
50
  @tier "presentation"
51
- event : string = SEARCH
51
+ event : event = SEARCH
52
52
  @label "Search event"
53
53
  @description "Event emitted when the user submits a query"
54
54
  @tier "internal"
@@ -52,12 +52,12 @@ orbital TagStripOrbital {
52
52
  })
53
53
  TagStripOptions -> ready
54
54
  (render-ui main {
55
- children: [(if ["!=", @config.title, ""] {
55
+ children: [(if (or @config.readOnly ["=", @config.title, ""]) null {
56
56
  color: muted
57
57
  content: @config.title
58
58
  type: typography
59
59
  variant: caption
60
- } null), {
60
+ }), (if @config.readOnly null {
61
61
  addEvent: ADD_TAG
62
62
  helperText: @config.helperText
63
63
  placeholder: @config.placeholder
@@ -65,7 +65,7 @@ orbital TagStripOrbital {
65
65
  type: tag-input
66
66
  value: (array/map (array/filter ?data (fn t (array/includes @entity.docTagIds (object/get @t id)))) (fn t (object/get @t name)))
67
67
  variant: secondary
68
- }, (if ["=", (array/len (array/filter ?data (fn t (if (array/includes @entity.docTagIds (object/get @t id)) false true)))), 0] null {
68
+ }), (if (or @config.readOnly ["=", (array/len (array/filter ?data (fn t (if (array/includes @entity.docTagIds (object/get @t id)) false true)))), 0]) null {
69
69
  children: (array/map (array/filter ?data (fn t (if (array/includes @entity.docTagIds (object/get @t id)) false true))) (fn t {
70
70
  action: ADD_TAG
71
71
  actionPayload: { tag: @t.name }
@@ -299,6 +299,11 @@ orbital TagStripOrbital {
299
299
  @label "Strip caption"
300
300
  @description "Small caption above the chips; empty hides it"
301
301
  @tier "presentation"
302
+ readOnly : boolean = false
303
+ @label "Read-only?"
304
+ @description "When true the strip renders nothing — no add input, no remove, no suggestion chips. Hosts pass a role condition here so read-only viewers rely on the record's read-only rails (which keep showing the tags) instead of an editing surface."
305
+ @synonyms "read only tags, viewer mode, no tag editing, hide tag input"
306
+ @tier "policy"
302
307
  placeholder : string = "Add a tag…"
303
308
  @label "Input placeholder"
304
309
  @description "Placeholder in the type-to-add input"
@@ -1,5 +1,5 @@
1
1
  app std-thread "1.3.0"
2
- "std-thread — forum-style nested replies with collapse + flat-mode toggle. Owns ThreadPost (persistent). flat:true covers 1:1 linear inquiry threads; flat:false renders forum-style nested. INIT fetches, scoped by @config.threadRootId when set (blank = every root, the default). REPLY persists a child post under @payload.parentId, stamped with the real @user identity. A consumer that mounts this as page comments forwards its own document-opened signal to SET_THREAD_ROOT { rootId }, which stamps the frame and refetches filtered by the payload; the after-create and after-select refetch arms keep filtering by @config.threadRootId, so a mutation re-widens the panel until the consumer re-fires SET_THREAD_ROOT. Layer 3 variants override `bodyContent` to deliver chat-bubble, email-threaded, or linear-comments UX while inheriting the same trait, state machine, emits, and listens."
2
+ "std-thread — forum-style nested replies with collapse + flat-mode toggle. Owns ThreadPost (persistent). flat:true covers 1:1 linear inquiry threads; flat:false renders forum-style nested. INIT fetches, scoped by @config.threadRootId when set (blank = every root, the default). REPLY persists a child post under @payload.parentId, stamped with the real @user identity. A consumer that mounts this as page comments forwards its own document-opened signal to SET_THREAD_ROOT { rootId }, which stamps the frame and refetches filtered by the payload; the after-create and after-select refetch arms keep filtering by @config.threadRootId, so a mutation re-widens the panel until the consumer re-fires SET_THREAD_ROOT. Layer 3 variants override `bodyContent` to deliver chat-bubble, email-threaded, or linear-comments UX while inheriting the same trait, state machine, emits, and listens. A non-empty sectionTitle switches the default bodyContent into titled-comments mode: header + post list + a standalone composer button (without it an empty thread has no REPLY emitter at all — the affordance only existed per-row)."
3
3
  orbital ThreadPostOrbital {
4
4
  ;; Forward relation: array of child ThreadPost IDs whose parentId === this.id.
5
5
  ;; Lowers to `type: "relation", cardinality: "many"` (orbital-lolo lower.rs).
@@ -15,7 +15,15 @@ orbital ThreadPostOrbital {
15
15
 
16
16
  type ThreadPostLoadFailed = Event { error : string, code : string } "Fired when the thread-post collection fails to load"
17
17
 
18
- type ThreadPostCreated = Event { row : ThreadPost } "Fired after a new thread-post persists successfully"
18
+ ;; Bare entity alias, not { row: ThreadPost } — `persist create`'s success
19
+ ;; emit is the created row itself (flat), matching @almadar/runtime's
20
+ ;; EffectExecutor.ts (`successPayload = persisted ?? data`, emitted
21
+ ;; directly) AND orbital-core's executor.rs (`executed_with_value(effect,
22
+ ;; value)`), verified live 2026-08-30: a wrapped declaration validates and
23
+ ;; compiles clean but silently returns undefined for every `?row.<field>`
24
+ ;; access — no validator connects a persist-emit's declared shape to what
25
+ ;; the effect that fires it actually produces.
26
+ type ThreadPostCreated = Event ThreadPost "Fired after a new thread-post persists successfully"
19
27
 
20
28
  type ThreadPostCreateFailed = Event { error : string, code : string } "Fired when a new thread-post fails to persist"
21
29
 
@@ -97,7 +105,7 @@ orbital ThreadPostOrbital {
97
105
  type: typography
98
106
  variant: h4
99
107
  }, {
100
- action: EDIT_REPLY
108
+ onChange: EDIT_REPLY
101
109
  placeholder: "Your reply…"
102
110
  type: textarea
103
111
  }, {
@@ -121,19 +129,50 @@ orbital ThreadPostOrbital {
121
129
  gap: md
122
130
  type: stack
123
131
  })
132
+ ;; Scoped to the row just created, not @config.threadRootId — a runtime-
133
+ ;; scoped consumer (SET_THREAD_ROOT-driven, e.g. std-wiki's WikiComments)
134
+ ;; never sets config.threadRootId, so that filter was permanently blank/
135
+ ;; unfiltered here and every document's posts bled together on refetch.
136
+ ;; ?threadRootId is the FLAT field on ThreadPostCreated's payload (the
137
+ ;; row's own scope, per the create effect's fallback chain) — NOT
138
+ ;; ?row.threadRootId; ThreadPostCreated's payload is the created row
139
+ ;; itself (see the type alias above), no `row` wrapper exists.
124
140
  ThreadPostCreated -> browsing
141
+ (set @entity.content "")
142
+ (set @entity.parentId "")
125
143
  (fetch ThreadPost {
126
144
  emit: { failure: ThreadPostLoadFailed, success: ThreadPostLoaded }
127
- filter: (or ["=", @config.threadRootId, ""] ["=", (object/get @entity threadRootId), @config.threadRootId])
145
+ filter: (or ["=", ?threadRootId, ""] ["=", (object/get @entity threadRootId), ?threadRootId])
128
146
  include: (replies)
129
147
  })
148
+ ;; SELECT's payload IS { id, row } (caller-constructed, unlike the
149
+ ;; persist-auto-emitted ThreadPostCreated) — ?row.threadRootId is
150
+ ;; correct here.
130
151
  SELECT -> loading
131
152
  (set @entity.focusedRow ?row)
132
153
  (fetch ThreadPost {
133
154
  emit: { failure: ThreadPostLoadFailed, success: ThreadPostLoaded }
134
- filter: (or ["=", @config.threadRootId, ""] ["=", (object/get @entity threadRootId), @config.threadRootId])
155
+ filter: (or ["=", ?row.threadRootId, ""] ["=", (object/get @entity threadRootId), ?row.threadRootId])
135
156
  include: (replies)
136
157
  })
158
+ ;; Inline composers (bodyContent overrides with their own textarea +
159
+ ;; submit button) fire the composer triad while the trait sits in
160
+ ;; browsing — without these arms every such click is swallowed.
161
+ EDIT_REPLY -> browsing
162
+ (set @entity.content ?value)
163
+ SUBMIT_REPLY -> browsing when (not ["=", (str/default @entity.content ""), ""])
164
+ (persist create ThreadPost {
165
+ authorId: @user.id
166
+ authorName: @user.name
167
+ content: @entity.content
168
+ parentId: (str/default @entity.parentId "")
169
+ threadRootId: (str/default @entity.threadRootId (str/default @config.threadRootId root))
170
+ } {
171
+ emit: { failure: ThreadPostCreateFailed, success: ThreadPostCreated }
172
+ })
173
+ CANCEL_REPLY -> browsing
174
+ (set @entity.content "")
175
+ (set @entity.parentId "")
137
176
  ;; replying.SUBMIT_REPLY -> browsing lands here before the persist
138
177
  ;; resolves; a failure must be caught here too, not just replying's twin arm.
139
178
  ThreadPostCreateFailed -> browsing
@@ -163,19 +202,27 @@ orbital ThreadPostOrbital {
163
202
  state replying {
164
203
  EDIT_REPLY -> replying
165
204
  (set @entity.content ?value)
166
- SUBMIT_REPLY -> browsing
167
- (persist create ThreadPost (object/merge ?data { authorId: @user.id, authorName: @user.name }) {
205
+ SUBMIT_REPLY -> browsing when (not ["=", (str/default @entity.content ""), ""])
206
+ (persist create ThreadPost {
207
+ authorId: @user.id
208
+ authorName: @user.name
209
+ content: @entity.content
210
+ parentId: (str/default @entity.parentId "")
211
+ threadRootId: (str/default @entity.threadRootId (str/default @config.threadRootId root))
212
+ } {
168
213
  emit: { failure: ThreadPostCreateFailed, success: ThreadPostCreated }
169
214
  })
170
215
  CANCEL_REPLY -> browsing
171
216
  (set @entity.content "")
172
217
  (set @entity.parentId "")
218
+ ;; Scoped to the row just created (?threadRootId, flat) — see the twin
219
+ ;; arm in `browsing` for why.
173
220
  ThreadPostCreated -> browsing
174
221
  (set @entity.content "")
175
222
  (set @entity.parentId "")
176
223
  (fetch ThreadPost {
177
224
  emit: { failure: ThreadPostLoadFailed, success: ThreadPostLoaded }
178
- filter: (or ["=", @config.threadRootId, ""] ["=", (object/get @entity threadRootId), @config.threadRootId])
225
+ filter: (or ["=", ?threadRootId, ""] ["=", (object/get @entity threadRootId), ?threadRootId])
179
226
  include: (replies)
180
227
  })
181
228
  ThreadPostCreateFailed -> replying
@@ -234,10 +281,8 @@ orbital ThreadPostOrbital {
234
281
  @description "Indicates a reply has been modified."
235
282
  @synonyms "update, change, modify"
236
283
  @tier "presentation"
237
- SUBMIT_REPLY {
238
- data : @entity!
239
- }
240
- @description "Signals a new reply has been successfully submitted."
284
+ SUBMIT_REPLY
285
+ @description "Signals the composed draft should be persisted as a new post — the draft is read from the entity frame (@entity.content), so bare buttons can emit it."
241
286
  @synonyms "post, send, add, publish"
242
287
  @tier "domain"
243
288
  CANCEL_REPLY
@@ -257,10 +302,8 @@ orbital ThreadPostOrbital {
257
302
  @description "Indicates a failure to load a thread post."
258
303
  @synonyms "load error, fetch failed, retrieval failed"
259
304
  @tier "internal"
260
- ThreadPostCreated {
261
- row : ThreadPost
262
- }
263
- @description "A new post has been added to the thread."
305
+ ThreadPostCreated
306
+ @description "A new post has been added to the thread — payload is the created ThreadPost row itself (flat: ?id, ?threadRootId, ?authorId, ?content, …), not wrapped under a row field."
264
307
  @synonyms "new post, added, created"
265
308
  @tier "domain"
266
309
  ThreadPostCreateFailed {
@@ -294,10 +337,8 @@ orbital ThreadPostOrbital {
294
337
  @description "A reply is being modified."
295
338
  @synonyms "update, change, revise"
296
339
  @tier "presentation"
297
- SUBMIT_REPLY {
298
- data : @entity!
299
- }
300
- @description "A new reply has been submitted and is awaiting processing."
340
+ SUBMIT_REPLY
341
+ @description "A new reply has been submitted and is awaiting processing — the draft is read from the entity frame (@entity.content), no payload required."
301
342
  @synonyms "post, send, add, submit"
302
343
  @tier "domain"
303
344
  CANCEL_REPLY
@@ -317,10 +358,8 @@ orbital ThreadPostOrbital {
317
358
  @description "Indicates a failure to load a thread post."
318
359
  @synonyms "error, failure, load failed"
319
360
  @tier "internal"
320
- ThreadPostCreated {
321
- row : ThreadPost
322
- }
323
- @description "A new post has been added to the thread."
361
+ ThreadPostCreated
362
+ @description "A new post has been added to the thread — payload is the created ThreadPost row itself (flat: ?id, ?threadRootId, ?authorId, ?content, …), not wrapped under a row field."
324
363
  @synonyms "new post, added, created"
325
364
  @tier "domain"
326
365
  ThreadPostCreateFailed {
@@ -356,9 +395,15 @@ orbital ThreadPostOrbital {
356
395
  @label "recipientName"
357
396
  @description "Header/recipient label for chat-style threads."
358
397
  @tier "presentation"
359
- sectionTitle : string = Discussion
398
+ sectionTitle : string = ""
360
399
  @label "sectionTitle"
361
- @description "Section header for linear-comment threads."
400
+ @description "Section header rendered by the default bodyContent when non-empty, along with a standalone composer button — the only REPLY affordance an empty thread has. Blank (the default) keeps the bare post list for embedded threads that bring their own chrome (chat rails, custom comment sections)."
401
+ @synonyms "header, comments title, discussion title"
402
+ @tier "presentation"
403
+ composerLabel : string = "Add comment"
404
+ @label "composerLabel"
405
+ @description "Label of the standalone composer button rendered under the post list when sectionTitle is non-empty."
406
+ @synonyms "reply label, comment button, add comment"
362
407
  @tier "presentation"
363
408
  emailAuthorBinding : string = @item.authorName
364
409
  @label "emailAuthorBinding"
@@ -413,7 +458,15 @@ orbital ThreadPostOrbital {
413
458
  @description "Reply binding for the reply body."
414
459
  @tier "presentation"
415
460
  bodyContent : render-ui = {
416
- children: [{
461
+ children: [(if ["!=", @config.sectionTitle, ""] {
462
+ content: @config.sectionTitle
463
+ type: typography
464
+ variant: h4
465
+ } {
466
+ children: []
467
+ gap: none
468
+ type: stack
469
+ }), {
417
470
  entity: ?data
418
471
  fields: [{
419
472
  label: Author
@@ -437,7 +490,17 @@ orbital ThreadPostOrbital {
437
490
  look: @config.tableLook
438
491
  type: data-list
439
492
  variant: card
440
- }]
493
+ }, (if ["!=", @config.sectionTitle, ""] {
494
+ action: REPLY
495
+ icon: message-square
496
+ label: @config.composerLabel
497
+ type: button
498
+ variant: secondary
499
+ } {
500
+ children: []
501
+ gap: none
502
+ type: stack
503
+ })]
441
504
  direction: vertical
442
505
  gap: md
443
506
  type: stack
@@ -113,7 +113,7 @@ orbital TreeNodeOrbital {
113
113
  type: file-tree
114
114
  }]
115
115
  direction: vertical
116
- gap: md
116
+ gap: (if ["=", @config.look, "rail"] none md)
117
117
  type: stack
118
118
  })
119
119
  TreeNodeLoadFailed -> error
@@ -265,7 +265,7 @@ orbital TreeNodeOrbital {
265
265
  type: file-tree
266
266
  }]
267
267
  direction: vertical
268
- gap: md
268
+ gap: (if ["=", @config.look, "rail"] none md)
269
269
  type: stack
270
270
  })
271
271
  TreeNodeLoadFailed -> error
@@ -77,11 +77,11 @@ orbital AvatarOrbital {
77
77
  @label "Class Name"
78
78
  @description "Additional CSS classes"
79
79
  @tier "presentation"
80
- onClick : string = "CLICK"
80
+ onClick : event = "CLICK"
81
81
  @label "On Click"
82
82
  @description "Click handler"
83
83
  @tier "presentation"
84
- action : string = "ACTION"
84
+ action : event = "ACTION"
85
85
  @label "Action"
86
86
  @description "Declarative event name — emits UI:{action} via eventBus on click"
87
87
  @tier "presentation"
@@ -68,7 +68,7 @@ orbital BadgeOrbital {
68
68
  @label "Icon Asset"
69
69
  @description "Asset image rendered as the badge icon; takes precedence over icon when provided."
70
70
  @tier "presentation"
71
- onRemove : string = ""
71
+ onRemove : event = ""
72
72
  @label "On Remove"
73
73
  @description "When set, renders a small X button on the right of the badge that invokes this handler — turns the badge into a removable chip. Used by the TagInput molecule and other 'list of removable values' surfaces."
74
74
  @tier "presentation"
@@ -115,7 +115,7 @@ orbital BoxOrbital {
115
115
  @label "Position"
116
116
  @description "Position"
117
117
  @tier "presentation"
118
- action : string = "ACTION"
118
+ action : event = "ACTION"
119
119
  @label "Action"
120
120
  @description "Declarative event name — emits UI:{action} via eventBus on click"
121
121
  @tier "presentation"
@@ -123,7 +123,7 @@ orbital BoxOrbital {
123
123
  @label "Action Payload"
124
124
  @description "Payload to include with the action event"
125
125
  @tier "presentation"
126
- hoverEvent : string = "HOVER"
126
+ hoverEvent : event = "HOVER"
127
127
  @label "Hover Event"
128
128
  @description "Declarative hover event — emits UI:{hoverEvent} with { hovered: true/false } on mouseEnter/mouseLeave"
129
129
  @tier "presentation"
@@ -88,7 +88,7 @@ orbital ButtonOrbital {
88
88
  @label "Icon Asset"
89
89
  @description "Asset image rendered as the leading icon; takes precedence over icon/leftIcon when provided."
90
90
  @tier "presentation"
91
- action : string = "ACTION"
91
+ action : event = "ACTION"
92
92
  @label "Action"
93
93
  @description "Declarative event name — emits UI:{action} via eventBus on click"
94
94
  @tier "presentation"
@@ -66,7 +66,7 @@ orbital CardOrbital {
66
66
  @label "Children"
67
67
  @description "Card content"
68
68
  @tier "presentation"
69
- action : string = "ACTION"
69
+ action : event = "ACTION"
70
70
  @label "Action"
71
71
  @description "Declarative event key emitted on click for trait dispatch"
72
72
  @tier "presentation"
@@ -45,7 +45,7 @@ orbital CheckboxOrbital {
45
45
  @label "Label"
46
46
  @description "label prop"
47
47
  @tier "presentation"
48
- onChange : string = "CHANGE"
48
+ onChange : event = "CHANGE"
49
49
  @label "On Change"
50
50
  @description "onChange handler or declarative event key for trait dispatch"
51
51
  @tier "presentation"
@@ -36,7 +36,7 @@ orbital DayCellOrbital {
36
36
  @label "Is Today"
37
37
  @description "Whether this date is today"
38
38
  @tier "presentation"
39
- onClick : string = "CLICK"
39
+ onClick : event = "CLICK"
40
40
  @label "On Click"
41
41
  @description "Called when the day is clicked"
42
42
  @tier "presentation"
@@ -77,7 +77,7 @@ orbital FilterPillOrbital {
77
77
  @label "Icon"
78
78
  @description "Lucide icon component or canonical kebab-case icon name string"
79
79
  @tier "presentation"
80
- onRemove : string = ""
80
+ onRemove : event = ""
81
81
  @label "On Remove"
82
82
  @description "Called when the user clicks the remove (×) button"
83
83
  @tier "presentation"
@@ -85,15 +85,15 @@ orbital FilterPillOrbital {
85
85
  @label "Removable"
86
86
  @description "Disable the remove button (renders without × control)"
87
87
  @tier "presentation"
88
- onClick : string = "CLICK"
88
+ onClick : event = "CLICK"
89
89
  @label "On Click"
90
90
  @description "Click handler for the body of the pill (filter toggle)"
91
91
  @tier "presentation"
92
- clickEvent : string = "CLICK"
92
+ clickEvent : event = "CLICK"
93
93
  @label "Click Event"
94
94
  @description "Event name dispatched via event bus when the pill body is clicked. Payload: { label }"
95
95
  @tier "presentation"
96
- removeEvent : string = ""
96
+ removeEvent : event = ""
97
97
  @label "Remove Event"
98
98
  @description "Event name dispatched via event bus when the remove (×) button is clicked. Payload: { label }"
99
99
  @tier "presentation"
@@ -40,7 +40,7 @@ orbital FlipContainerOrbital {
40
40
  @label "Children"
41
41
  @description "The two face elements (front and back)"
42
42
  @tier "presentation"
43
- onClick : string = "CLICK"
43
+ onClick : event = "CLICK"
44
44
  @label "On Click"
45
45
  @description "Click handler on the outer wrapper"
46
46
  @tier "presentation"
@@ -82,7 +82,7 @@ orbital HstackOrbital {
82
82
  @label "Tab Index"
83
83
  @description "Tab index for focus management"
84
84
  @tier "presentation"
85
- action : string = "ACTION"
85
+ action : event = "ACTION"
86
86
  @label "Action"
87
87
  @description "Declarative event name — emits UI:{action} via eventBus on click"
88
88
  @tier "presentation"