@almadar/std 16.192.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 (283) 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 +8 -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 +319 -0
  16. package/behaviors/lolo/ui/core/atoms/std-tag-taxonomy.lolo +27 -17
  17. package/behaviors/lolo/ui/core/atoms/std-thread.lolo +91 -28
  18. package/behaviors/lolo/ui/core/atoms/std-tree.lolo +106 -14
  19. package/behaviors/lolo/ui/core/atoms/ui-avatar.lolo +2 -2
  20. package/behaviors/lolo/ui/core/atoms/ui-badge.lolo +1 -1
  21. package/behaviors/lolo/ui/core/atoms/ui-box.lolo +2 -2
  22. package/behaviors/lolo/ui/core/atoms/ui-button.lolo +1 -1
  23. package/behaviors/lolo/ui/core/atoms/ui-card.lolo +1 -1
  24. package/behaviors/lolo/ui/core/atoms/ui-checkbox.lolo +1 -1
  25. package/behaviors/lolo/ui/core/atoms/ui-day-cell.lolo +1 -1
  26. package/behaviors/lolo/ui/core/atoms/ui-filter-pill.lolo +4 -4
  27. package/behaviors/lolo/ui/core/atoms/ui-flip-container.lolo +1 -1
  28. package/behaviors/lolo/ui/core/atoms/ui-hstack.lolo +1 -1
  29. package/behaviors/lolo/ui/core/atoms/ui-infinite-scroll-sentinel.lolo +1 -1
  30. package/behaviors/lolo/ui/core/atoms/ui-input.lolo +3 -3
  31. package/behaviors/lolo/ui/core/atoms/ui-overlay.lolo +1 -1
  32. package/behaviors/lolo/ui/core/atoms/ui-radio.lolo +1 -1
  33. package/behaviors/lolo/ui/core/atoms/ui-range-slider.lolo +2 -2
  34. package/behaviors/lolo/ui/core/atoms/ui-select.lolo +3 -3
  35. package/behaviors/lolo/ui/core/atoms/ui-stack.lolo +1 -1
  36. package/behaviors/lolo/ui/core/atoms/ui-switch.lolo +1 -1
  37. package/behaviors/lolo/ui/core/atoms/ui-text-highlight.lolo +5 -5
  38. package/behaviors/lolo/ui/core/atoms/ui-textarea.lolo +2 -2
  39. package/behaviors/lolo/ui/core/atoms/ui-time-slot-cell.lolo +1 -1
  40. package/behaviors/lolo/ui/core/atoms/ui-typewriter-text.lolo +1 -1
  41. package/behaviors/lolo/ui/core/atoms/ui-vstack.lolo +1 -1
  42. package/behaviors/lolo/ui/core/molecules/ui-accordion.lolo +2 -2
  43. package/behaviors/lolo/ui/core/molecules/ui-alert.lolo +3 -3
  44. package/behaviors/lolo/ui/core/molecules/ui-branching-logic-builder.lolo +2 -2
  45. package/behaviors/lolo/ui/core/molecules/ui-breadcrumb.lolo +2 -2
  46. package/behaviors/lolo/ui/core/molecules/ui-calendar-grid.lolo +6 -6
  47. package/behaviors/lolo/ui/core/molecules/ui-carousel.lolo +1 -1
  48. package/behaviors/lolo/ui/core/molecules/ui-code-block.lolo +1 -1
  49. package/behaviors/lolo/ui/core/molecules/ui-confirm-dialog.lolo +2 -2
  50. package/behaviors/lolo/ui/core/molecules/ui-data-grid.lolo +3 -3
  51. package/behaviors/lolo/ui/core/molecules/ui-data-list.lolo +7 -7
  52. package/behaviors/lolo/ui/core/molecules/ui-date-range-picker.lolo +2 -2
  53. package/behaviors/lolo/ui/core/molecules/ui-date-range-selector.lolo +1 -1
  54. package/behaviors/lolo/ui/core/molecules/ui-document-details.lolo +2 -2
  55. package/behaviors/lolo/ui/core/molecules/ui-document-panel.lolo +5 -5
  56. package/behaviors/lolo/ui/core/molecules/ui-drawer.lolo +2 -2
  57. package/behaviors/lolo/ui/core/molecules/ui-emoji-picker.lolo +1 -1
  58. package/behaviors/lolo/ui/core/molecules/ui-empty-state.lolo +2 -2
  59. package/behaviors/lolo/ui/core/molecules/ui-error-state.lolo +2 -2
  60. package/behaviors/lolo/ui/core/molecules/ui-file-tree.lolo +27 -2
  61. package/behaviors/lolo/ui/core/molecules/ui-filter-group.lolo +4 -4
  62. package/behaviors/lolo/ui/core/molecules/ui-flip-card.lolo +1 -1
  63. package/behaviors/lolo/ui/core/molecules/ui-floating-action-button.lolo +2 -2
  64. package/behaviors/lolo/ui/core/molecules/ui-form-section-header.lolo +1 -1
  65. package/behaviors/lolo/ui/core/molecules/ui-graph-canvas.lolo +5 -5
  66. package/behaviors/lolo/ui/core/molecules/ui-graph-view.lolo +2 -2
  67. package/behaviors/lolo/ui/core/molecules/ui-header.lolo +4 -4
  68. package/behaviors/lolo/ui/core/molecules/ui-import-preview-tree.lolo +2 -2
  69. package/behaviors/lolo/ui/core/molecules/ui-import-source-picker.lolo +1 -1
  70. package/behaviors/lolo/ui/core/molecules/ui-input-group.lolo +3 -3
  71. package/behaviors/lolo/ui/core/molecules/ui-lightbox.lolo +2 -2
  72. package/behaviors/lolo/ui/core/molecules/ui-likert-scale.lolo +2 -2
  73. package/behaviors/lolo/ui/core/molecules/ui-map-view.lolo +4 -4
  74. package/behaviors/lolo/ui/core/molecules/ui-matrix-question.lolo +2 -2
  75. package/behaviors/lolo/ui/core/molecules/ui-modal.lolo +3 -3
  76. package/behaviors/lolo/ui/core/molecules/ui-notification.lolo +4 -4
  77. package/behaviors/lolo/ui/core/molecules/ui-number-stepper.lolo +2 -2
  78. package/behaviors/lolo/ui/core/molecules/ui-option-constraint-group.lolo +2 -2
  79. package/behaviors/lolo/ui/core/molecules/ui-orbital-visualization.lolo +1 -1
  80. package/behaviors/lolo/ui/core/molecules/ui-page-header.lolo +2 -2
  81. package/behaviors/lolo/ui/core/molecules/ui-pagination.lolo +4 -4
  82. package/behaviors/lolo/ui/core/molecules/ui-popover.lolo +1 -1
  83. package/behaviors/lolo/ui/core/molecules/ui-positioned-canvas.lolo +4 -4
  84. package/behaviors/lolo/ui/core/molecules/ui-progress-dots.lolo +1 -1
  85. package/behaviors/lolo/ui/core/molecules/ui-pull-to-refresh.lolo +1 -1
  86. package/behaviors/lolo/ui/core/molecules/ui-qr-scanner.lolo +2 -2
  87. package/behaviors/lolo/ui/core/molecules/ui-relation-select.lolo +1 -1
  88. package/behaviors/lolo/ui/core/molecules/ui-repeatable-form-section.lolo +3 -3
  89. package/behaviors/lolo/ui/core/molecules/ui-reply-tree.lolo +8 -8
  90. package/behaviors/lolo/ui/core/molecules/ui-rich-text-editor.lolo +2 -2
  91. package/behaviors/lolo/ui/core/molecules/ui-search-input.lolo +2 -2
  92. package/behaviors/lolo/ui/core/molecules/ui-side-panel.lolo +2 -2
  93. package/behaviors/lolo/ui/core/molecules/ui-sidebar.lolo +3 -3
  94. package/behaviors/lolo/ui/core/molecules/ui-signature-pad.lolo +3 -3
  95. package/behaviors/lolo/ui/core/molecules/ui-sortable-list.lolo +1 -1
  96. package/behaviors/lolo/ui/core/molecules/ui-star-rating.lolo +2 -2
  97. package/behaviors/lolo/ui/core/molecules/ui-swipeable-row.lolo +2 -2
  98. package/behaviors/lolo/ui/core/molecules/ui-table-view.lolo +4 -4
  99. package/behaviors/lolo/ui/core/molecules/ui-tabs.lolo +2 -2
  100. package/behaviors/lolo/ui/core/molecules/ui-tag-input.lolo +3 -3
  101. package/behaviors/lolo/ui/core/molecules/ui-upload-drop-zone.lolo +1 -1
  102. package/behaviors/lolo/ui/core/molecules/ui-version-diff.lolo +6 -6
  103. package/behaviors/lolo/ui/core/molecules/ui-violation-alert.lolo +2 -2
  104. package/behaviors/lolo/ui/core/molecules/ui-vote-stack.lolo +2 -2
  105. package/behaviors/lolo/ui/core/molecules/ui-wizard-container.lolo +5 -5
  106. package/behaviors/lolo/ui/core/molecules/ui-wizard-navigation.lolo +6 -6
  107. package/behaviors/lolo/ui/core/molecules/ui-wizard-progress.lolo +2 -2
  108. package/behaviors/lolo/ui/core/organisms/ui-detail-panel.lolo +1 -1
  109. package/behaviors/lolo/ui/core/organisms/ui-entity-cards.lolo +1 -1
  110. package/behaviors/lolo/ui/core/organisms/ui-form-section.lolo +3 -3
  111. package/behaviors/lolo/ui/core/organisms/ui-form.lolo +3 -3
  112. package/behaviors/lolo/ui/core/organisms/ui-media-gallery.lolo +1 -1
  113. package/behaviors/lolo/ui/core/organisms/ui-subagent-trace-panel.lolo +1 -1
  114. package/behaviors/lolo/ui/core/organisms/ui-tabbed-container.lolo +1 -1
  115. package/behaviors/lolo/ui/core/organisms/ui-timeline.lolo +1 -1
  116. package/behaviors/lolo/ui/core/templates/ui-counter-template.lolo +6 -6
  117. package/behaviors/lolo/ui/core/templates/ui-dashboard-layout.lolo +11 -6
  118. package/behaviors/lolo/ui/game/atoms/ui-canvas-2d.lolo +4 -4
  119. package/behaviors/lolo/ui/game/atoms/ui-canvas.lolo +5 -5
  120. package/behaviors/lolo/ui/game/atoms/ui-choice-button.lolo +2 -2
  121. package/behaviors/lolo/ui/game/atoms/ui-control-button.lolo +4 -4
  122. package/behaviors/lolo/ui/game/atoms/ui-control-grid.lolo +4 -4
  123. package/behaviors/lolo/ui/game/atoms/ui-game-menu.lolo +1 -1
  124. package/behaviors/lolo/ui/game/atoms/ui-sequence-bar.lolo +4 -4
  125. package/behaviors/lolo/ui/game/atoms/ui-state-graph.lolo +1 -1
  126. package/behaviors/lolo/ui/game/atoms/ui-trait-slot.lolo +7 -7
  127. package/behaviors/lolo/ui/game/organisms/std-tactics-board-2d.lolo +1 -1
  128. package/behaviors/lolo/ui/learning/atoms/ui-algo-graph-canvas.lolo +2 -2
  129. package/behaviors/lolo/ui/learning/atoms/ui-algorithm-canvas.lolo +1 -1
  130. package/behaviors/lolo/ui/learning/atoms/ui-biology-canvas.lolo +1 -1
  131. package/behaviors/lolo/ui/learning/atoms/ui-chemistry-canvas.lolo +1 -1
  132. package/behaviors/lolo/ui/learning/atoms/ui-learning-canvas.lolo +2 -2
  133. package/behaviors/lolo/ui/learning/atoms/ui-math-canvas.lolo +1 -1
  134. package/behaviors/lolo/ui/learning/atoms/ui-physics-canvas.lolo +1 -1
  135. package/behaviors/registry/infra/atoms/std-approval-gate.orb +37 -9
  136. package/behaviors/registry/ui/core/atoms/std-app-layout.orb +12 -2
  137. package/behaviors/registry/ui/core/atoms/std-browse.orb +2 -1
  138. package/behaviors/registry/ui/core/atoms/std-calendar.orb +1 -1
  139. package/behaviors/registry/ui/core/atoms/std-date-range.orb +2 -1
  140. package/behaviors/registry/ui/core/atoms/std-detail-layout.orb +3 -3
  141. package/behaviors/registry/ui/core/atoms/std-filter.orb +2 -1
  142. package/behaviors/registry/ui/core/atoms/std-geosearch.orb +2 -1
  143. package/behaviors/registry/ui/core/atoms/std-graphs.orb +1 -1
  144. package/behaviors/registry/ui/core/atoms/std-modal.orb +5 -1
  145. package/behaviors/registry/ui/core/atoms/std-pagination.orb +2 -1
  146. package/behaviors/registry/ui/core/atoms/std-record-detail.orb +38 -2
  147. package/behaviors/registry/ui/core/atoms/std-scatter.orb +1 -1
  148. package/behaviors/registry/ui/core/atoms/std-search.orb +2 -1
  149. package/behaviors/registry/ui/core/atoms/std-tag-strip.orb +1381 -0
  150. package/behaviors/registry/ui/core/atoms/std-tag-taxonomy.orb +34 -18
  151. package/behaviors/registry/ui/core/atoms/std-thread.orb +296 -109
  152. package/behaviors/registry/ui/core/atoms/std-tree.orb +447 -68
  153. package/behaviors/registry/ui/core/atoms/ui-avatar.orb +2 -2
  154. package/behaviors/registry/ui/core/atoms/ui-badge.orb +1 -1
  155. package/behaviors/registry/ui/core/atoms/ui-box.orb +2 -2
  156. package/behaviors/registry/ui/core/atoms/ui-button.orb +1 -1
  157. package/behaviors/registry/ui/core/atoms/ui-card.orb +1 -1
  158. package/behaviors/registry/ui/core/atoms/ui-checkbox.orb +1 -1
  159. package/behaviors/registry/ui/core/atoms/ui-day-cell.orb +1 -1
  160. package/behaviors/registry/ui/core/atoms/ui-filter-pill.orb +5 -4
  161. package/behaviors/registry/ui/core/atoms/ui-flip-container.orb +1 -1
  162. package/behaviors/registry/ui/core/atoms/ui-hstack.orb +1 -1
  163. package/behaviors/registry/ui/core/atoms/ui-infinite-scroll-sentinel.orb +1 -1
  164. package/behaviors/registry/ui/core/atoms/ui-input.orb +3 -3
  165. package/behaviors/registry/ui/core/atoms/ui-overlay.orb +1 -1
  166. package/behaviors/registry/ui/core/atoms/ui-radio.orb +1 -1
  167. package/behaviors/registry/ui/core/atoms/ui-range-slider.orb +2 -2
  168. package/behaviors/registry/ui/core/atoms/ui-select.orb +3 -3
  169. package/behaviors/registry/ui/core/atoms/ui-stack.orb +1 -1
  170. package/behaviors/registry/ui/core/atoms/ui-switch.orb +1 -1
  171. package/behaviors/registry/ui/core/atoms/ui-text-highlight.orb +5 -5
  172. package/behaviors/registry/ui/core/atoms/ui-textarea.orb +2 -2
  173. package/behaviors/registry/ui/core/atoms/ui-time-slot-cell.orb +1 -1
  174. package/behaviors/registry/ui/core/atoms/ui-typewriter-text.orb +1 -1
  175. package/behaviors/registry/ui/core/atoms/ui-vstack.orb +1 -1
  176. package/behaviors/registry/ui/core/molecules/ui-accordion.orb +2 -2
  177. package/behaviors/registry/ui/core/molecules/ui-alert.orb +3 -3
  178. package/behaviors/registry/ui/core/molecules/ui-branching-logic-builder.orb +2 -2
  179. package/behaviors/registry/ui/core/molecules/ui-breadcrumb.orb +2 -2
  180. package/behaviors/registry/ui/core/molecules/ui-calendar-grid.orb +6 -6
  181. package/behaviors/registry/ui/core/molecules/ui-carousel.orb +1 -1
  182. package/behaviors/registry/ui/core/molecules/ui-code-block.orb +1 -1
  183. package/behaviors/registry/ui/core/molecules/ui-confirm-dialog.orb +2 -2
  184. package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +3 -3
  185. package/behaviors/registry/ui/core/molecules/ui-data-list.orb +7 -7
  186. package/behaviors/registry/ui/core/molecules/ui-date-range-picker.orb +2 -2
  187. package/behaviors/registry/ui/core/molecules/ui-date-range-selector.orb +1 -1
  188. package/behaviors/registry/ui/core/molecules/ui-document-details.orb +2 -2
  189. package/behaviors/registry/ui/core/molecules/ui-document-panel.orb +5 -5
  190. package/behaviors/registry/ui/core/molecules/ui-drawer.orb +3 -2
  191. package/behaviors/registry/ui/core/molecules/ui-emoji-picker.orb +1 -1
  192. package/behaviors/registry/ui/core/molecules/ui-empty-state.orb +2 -2
  193. package/behaviors/registry/ui/core/molecules/ui-error-state.orb +2 -2
  194. package/behaviors/registry/ui/core/molecules/ui-file-tree.orb +42 -1
  195. package/behaviors/registry/ui/core/molecules/ui-filter-group.orb +4 -4
  196. package/behaviors/registry/ui/core/molecules/ui-flip-card.orb +1 -1
  197. package/behaviors/registry/ui/core/molecules/ui-floating-action-button.orb +2 -2
  198. package/behaviors/registry/ui/core/molecules/ui-form-section-header.orb +1 -1
  199. package/behaviors/registry/ui/core/molecules/ui-graph-canvas.orb +5 -5
  200. package/behaviors/registry/ui/core/molecules/ui-graph-view.orb +2 -2
  201. package/behaviors/registry/ui/core/molecules/ui-header.orb +4 -4
  202. package/behaviors/registry/ui/core/molecules/ui-import-preview-tree.orb +2 -2
  203. package/behaviors/registry/ui/core/molecules/ui-import-source-picker.orb +1 -1
  204. package/behaviors/registry/ui/core/molecules/ui-input-group.orb +3 -3
  205. package/behaviors/registry/ui/core/molecules/ui-lightbox.orb +2 -2
  206. package/behaviors/registry/ui/core/molecules/ui-likert-scale.orb +2 -2
  207. package/behaviors/registry/ui/core/molecules/ui-map-view.orb +4 -4
  208. package/behaviors/registry/ui/core/molecules/ui-matrix-question.orb +2 -2
  209. package/behaviors/registry/ui/core/molecules/ui-modal.orb +4 -3
  210. package/behaviors/registry/ui/core/molecules/ui-notification.orb +4 -4
  211. package/behaviors/registry/ui/core/molecules/ui-number-stepper.orb +2 -2
  212. package/behaviors/registry/ui/core/molecules/ui-option-constraint-group.orb +2 -2
  213. package/behaviors/registry/ui/core/molecules/ui-orbital-visualization.orb +1 -1
  214. package/behaviors/registry/ui/core/molecules/ui-page-header.orb +2 -2
  215. package/behaviors/registry/ui/core/molecules/ui-pagination.orb +5 -4
  216. package/behaviors/registry/ui/core/molecules/ui-popover.orb +1 -1
  217. package/behaviors/registry/ui/core/molecules/ui-positioned-canvas.orb +4 -4
  218. package/behaviors/registry/ui/core/molecules/ui-progress-dots.orb +1 -1
  219. package/behaviors/registry/ui/core/molecules/ui-pull-to-refresh.orb +1 -1
  220. package/behaviors/registry/ui/core/molecules/ui-qr-scanner.orb +2 -2
  221. package/behaviors/registry/ui/core/molecules/ui-relation-select.orb +1 -1
  222. package/behaviors/registry/ui/core/molecules/ui-repeatable-form-section.orb +3 -3
  223. package/behaviors/registry/ui/core/molecules/ui-reply-tree.orb +8 -8
  224. package/behaviors/registry/ui/core/molecules/ui-rich-text-editor.orb +3 -2
  225. package/behaviors/registry/ui/core/molecules/ui-search-input.orb +2 -2
  226. package/behaviors/registry/ui/core/molecules/ui-side-panel.orb +3 -2
  227. package/behaviors/registry/ui/core/molecules/ui-sidebar.orb +3 -3
  228. package/behaviors/registry/ui/core/molecules/ui-signature-pad.orb +3 -3
  229. package/behaviors/registry/ui/core/molecules/ui-sortable-list.orb +1 -1
  230. package/behaviors/registry/ui/core/molecules/ui-star-rating.orb +2 -2
  231. package/behaviors/registry/ui/core/molecules/ui-swipeable-row.orb +2 -2
  232. package/behaviors/registry/ui/core/molecules/ui-table-view.orb +4 -4
  233. package/behaviors/registry/ui/core/molecules/ui-tabs.orb +2 -2
  234. package/behaviors/registry/ui/core/molecules/ui-tag-input.orb +3 -3
  235. package/behaviors/registry/ui/core/molecules/ui-upload-drop-zone.orb +1 -1
  236. package/behaviors/registry/ui/core/molecules/ui-version-diff.orb +6 -6
  237. package/behaviors/registry/ui/core/molecules/ui-violation-alert.orb +2 -2
  238. package/behaviors/registry/ui/core/molecules/ui-vote-stack.orb +2 -2
  239. package/behaviors/registry/ui/core/molecules/ui-wizard-container.orb +5 -5
  240. package/behaviors/registry/ui/core/molecules/ui-wizard-navigation.orb +6 -6
  241. package/behaviors/registry/ui/core/molecules/ui-wizard-progress.orb +2 -2
  242. package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +1 -1
  243. package/behaviors/registry/ui/core/organisms/ui-entity-cards.orb +1 -1
  244. package/behaviors/registry/ui/core/organisms/ui-form-section.orb +3 -3
  245. package/behaviors/registry/ui/core/organisms/ui-form.orb +3 -3
  246. package/behaviors/registry/ui/core/organisms/ui-media-gallery.orb +1 -1
  247. package/behaviors/registry/ui/core/organisms/ui-subagent-trace-panel.orb +1 -1
  248. package/behaviors/registry/ui/core/organisms/ui-tabbed-container.orb +1 -1
  249. package/behaviors/registry/ui/core/organisms/ui-timeline.orb +1 -1
  250. package/behaviors/registry/ui/core/templates/ui-counter-template.orb +6 -6
  251. package/behaviors/registry/ui/core/templates/ui-dashboard-layout.orb +13 -6
  252. package/behaviors/registry/ui/game/atoms/ui-canvas-2d.orb +4 -4
  253. package/behaviors/registry/ui/game/atoms/ui-canvas.orb +5 -5
  254. package/behaviors/registry/ui/game/atoms/ui-choice-button.orb +2 -2
  255. package/behaviors/registry/ui/game/atoms/ui-control-button.orb +4 -4
  256. package/behaviors/registry/ui/game/atoms/ui-control-grid.orb +4 -4
  257. package/behaviors/registry/ui/game/atoms/ui-game-menu.orb +1 -1
  258. package/behaviors/registry/ui/game/atoms/ui-sequence-bar.orb +4 -4
  259. package/behaviors/registry/ui/game/atoms/ui-state-graph.orb +1 -1
  260. package/behaviors/registry/ui/game/atoms/ui-trait-slot.orb +8 -7
  261. package/behaviors/registry/ui/game/organisms/std-tactics-board-2d.orb +7 -13
  262. package/behaviors/registry/ui/learning/atoms/ui-algo-graph-canvas.orb +2 -2
  263. package/behaviors/registry/ui/learning/atoms/ui-algorithm-canvas.orb +1 -1
  264. package/behaviors/registry/ui/learning/atoms/ui-biology-canvas.orb +1 -1
  265. package/behaviors/registry/ui/learning/atoms/ui-chemistry-canvas.orb +1 -1
  266. package/behaviors/registry/ui/learning/atoms/ui-learning-canvas.orb +2 -2
  267. package/behaviors/registry/ui/learning/atoms/ui-math-canvas.orb +1 -1
  268. package/behaviors/registry/ui/learning/atoms/ui-physics-canvas.orb +1 -1
  269. package/dist/behaviors/exports-reader.js +2587 -1923
  270. package/dist/behaviors/functions/index.d.ts +183 -16
  271. package/dist/behaviors/functions/index.js +2585 -1924
  272. package/dist/behaviors/index.d.ts +1 -1
  273. package/dist/behaviors/index.js +2588 -1924
  274. package/dist/behaviors/query.js +2587 -1923
  275. package/dist/behaviors-embeddings.hash.json +3 -3
  276. package/dist/behaviors-embeddings.json +15 -7
  277. package/dist/behaviors-registry.json +597 -14
  278. package/dist/index.d.ts +1 -1
  279. package/dist/index.js +2588 -1924
  280. package/dist/knob-embeddings.hash.json +3 -3
  281. package/dist/knob-embeddings.json +1 -1
  282. package/dist/registry/factory-signatures.json +1 -1
  283. 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."
@@ -41,6 +41,7 @@ orbital AppLayoutOrbital {
41
41
  notificationClickEvent: @config.notificationClickEvent
42
42
  notifications: @config.notifications
43
43
  searchEvent: @config.searchEvent
44
+ sidebarContent: @config.sidebarTrait
44
45
  topBarActions: @config.topBarActions
45
46
  type: @config.layoutPattern
46
47
  user: (if @config.viewerName { avatar: @config.viewerAvatar, email: @config.viewerEmail, name: @config.viewerName } null)
@@ -90,6 +91,11 @@ orbital AppLayoutOrbital {
90
91
  @label "Content trait"
91
92
  @description "Trait rendered inside the app layout content area"
92
93
  @tier "presentation"
94
+ sidebarTrait : trait
95
+ @label "Sidebar trait"
96
+ @description "Optional trait rendered in the sidebar between the nav links and the footer — the Notion/Confluence-style always-visible page tree; scrolls independently. Unset renders plain nav only."
97
+ @synonyms "sidebar tree, nav tree, page tree in sidebar, hierarchy rail"
98
+ @tier "presentation"
93
99
  appName : string = App
94
100
  @label "What should this app be called?"
95
101
  @description "Name shown in the top-left of the chrome header."
@@ -113,7 +119,7 @@ orbital AppLayoutOrbital {
113
119
  @description "Top-level navigation links shown on the left rail."
114
120
  @synonyms "nav links, menu items, sidebar sections, navigation entries, pages"
115
121
  @tier "presentation"
116
- searchEvent : string = SEARCH
122
+ searchEvent : event = SEARCH
117
123
  @label "Search event"
118
124
  @description "Event emitted when the user runs a global search"
119
125
  @tier "internal"
@@ -127,7 +133,7 @@ orbital AppLayoutOrbital {
127
133
  @description "Items shown in the notifications dropdown."
128
134
  @synonyms "alerts, messages, notices, notification items, bell items"
129
135
  @tier "presentation"
130
- notificationClickEvent : string = NOTIFY_CLICK
136
+ notificationClickEvent : event = NOTIFY_CLICK
131
137
  @label "Notification click event"
132
138
  @description "Event emitted when the user picks a notification"
133
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"
@@ -0,0 +1,319 @@
1
+ app std-tag-strip "1.0.0"
2
+ "std-tag-strip — inline tag editing ON the document surface: the record's tags render as removable chips with a type-to-add input (a typed name that matches an existing tag attaches it; an unknown name is created in the shared taxonomy first), plus one-click chips for every existing tag not yet attached. Emits TAGS_CHANGED { id, tagIds } — the host organism routes it into its persistor's update; the document's refetch re-scopes the strip. Binds any record carrying a tagIds relation array; the tag store is the shared `tags` collection (std-tag-taxonomy's)."
3
+ ;; @capabilities "inline tags, tag chips on a document, add tag from taxonomy, create tag by typing, remove tag chip, tag editing in place"
4
+ orbital TagStripOrbital {
5
+ type TagStripOptions = Event { data : [StripTag] } "The shared tag store loaded for the strip's display pass"
6
+
7
+ type TagStripAddOptions = Event { data : [StripTag] } "The shared tag store loaded to resolve a typed tag name on add"
8
+
9
+ type TagStripRemoveOptions = Event { data : [StripTag] } "The shared tag store loaded to resolve the remaining names on remove"
10
+
11
+ type TagStripTagCreated = Event { id : string, row : StripTag } "A typed tag name had no existing row; one was created in the shared taxonomy"
12
+
13
+ type TagStripLoadFailed = Event { error : string, code : string } "The tag store fetch or create failed"
14
+
15
+ entity StripTag [persistent: tags] {
16
+ id : string!
17
+ name : string! @description "The descriptive label for this tag." @synonyms "label, title"
18
+ parentId : StripTag @description "Reference to the parent tag in the hierarchy; empty marks a root." @synonyms "parent, ancestor"
19
+ createdAt : string = ""
20
+ pendingId : string = ""
21
+ docId : string @intrinsic @description "The open record's id, stashed at SHOW_TAG_STRIP so commits know which row to update." @synonyms "record id, scope id" = ""
22
+ docTagIds : [string] @intrinsic @description "The open record's current tag ids, stashed at SHOW_TAG_STRIP for membership tests." @synonyms "attached tags, current tags"
23
+ pendingTagName : string @intrinsic @description "The tag name typed or clicked on add, held across the resolve fetch." @synonyms "typed tag, adding tag" = ""
24
+ pendingNames : [string] @intrinsic @description "The chip names remaining after a remove, held across the resolve fetch." @synonyms "remaining tags, kept names"
25
+ }
26
+
27
+ trait TagStrip -> @rebindable StripTag [interaction, collection] {
28
+ initial: idle
29
+
30
+ state idle {
31
+ INIT -> idle
32
+ (fetch StripTag {
33
+ emit: { failure: TagStripLoadFailed, success: TagStripOptions }
34
+ })
35
+ ;; Pre-scope paint: the store is warm but no record is open yet.
36
+ TagStripOptions -> idle
37
+ TagStripLoadFailed -> idle
38
+ SHOW_TAG_STRIP -> loading
39
+ (set @entity.docId ?id)
40
+ (set @entity.docTagIds (array/map ?tagIds (fn t (str/default (object/get @t id) @t))))
41
+ (fetch StripTag {
42
+ emit: { failure: TagStripLoadFailed, success: TagStripOptions }
43
+ })
44
+ }
45
+
46
+ state loading {
47
+ SHOW_TAG_STRIP -> loading
48
+ (set @entity.docId ?id)
49
+ (set @entity.docTagIds (array/map ?tagIds (fn t (str/default (object/get @t id) @t))))
50
+ (fetch StripTag {
51
+ emit: { failure: TagStripLoadFailed, success: TagStripOptions }
52
+ })
53
+ TagStripOptions -> ready
54
+ (render-ui main {
55
+ children: [(if (or @config.readOnly ["=", @config.title, ""]) null {
56
+ color: muted
57
+ content: @config.title
58
+ type: typography
59
+ variant: caption
60
+ }), (if @config.readOnly null {
61
+ addEvent: ADD_TAG
62
+ helperText: @config.helperText
63
+ placeholder: @config.placeholder
64
+ removeEvent: REMOVE_TAG
65
+ type: tag-input
66
+ value: (array/map (array/filter ?data (fn t (array/includes @entity.docTagIds (object/get @t id)))) (fn t (object/get @t name)))
67
+ variant: secondary
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
+ children: (array/map (array/filter ?data (fn t (if (array/includes @entity.docTagIds (object/get @t id)) false true))) (fn t {
70
+ action: ADD_TAG
71
+ actionPayload: { tag: @t.name }
72
+ icon: tag
73
+ label: @t.name
74
+ size: sm
75
+ type: button
76
+ variant: ghost
77
+ }))
78
+ className: flex-wrap
79
+ direction: horizontal
80
+ gap: xs
81
+ type: stack
82
+ })]
83
+ direction: vertical
84
+ gap: xs
85
+ type: stack
86
+ })
87
+ TagStripLoadFailed -> idle
88
+ (render-ui main {
89
+ message: ?error
90
+ type: alert
91
+ variant: error
92
+ })
93
+ }
94
+
95
+ state ready {
96
+ SHOW_TAG_STRIP -> loading
97
+ (set @entity.docId ?id)
98
+ (set @entity.docTagIds (array/map ?tagIds (fn t (str/default (object/get @t id) @t))))
99
+ (fetch StripTag {
100
+ emit: { failure: TagStripLoadFailed, success: TagStripOptions }
101
+ })
102
+ ADD_TAG -> adding
103
+ (set @entity.pendingTagName ?tag)
104
+ (fetch StripTag {
105
+ emit: { failure: TagStripLoadFailed, success: TagStripAddOptions }
106
+ })
107
+ (render-ui main {
108
+ align: center
109
+ children: [{ size: sm, type: spinner }]
110
+ direction: horizontal
111
+ gap: xs
112
+ type: stack
113
+ })
114
+ REMOVE_TAG -> removing
115
+ (set @entity.pendingNames ?value)
116
+ (fetch StripTag {
117
+ emit: { failure: TagStripLoadFailed, success: TagStripRemoveOptions }
118
+ })
119
+ (render-ui main {
120
+ align: center
121
+ children: [{ size: sm, type: spinner }]
122
+ direction: horizontal
123
+ gap: xs
124
+ type: stack
125
+ })
126
+ TagStripTagCreated -> ready
127
+ }
128
+
129
+ state adding {
130
+ SHOW_TAG_STRIP -> loading
131
+ (set @entity.docId ?id)
132
+ (set @entity.docTagIds (array/map ?tagIds (fn t (str/default (object/get @t id) @t))))
133
+ (fetch StripTag {
134
+ emit: { failure: TagStripLoadFailed, success: TagStripOptions }
135
+ })
136
+ ;; The typed name matches an existing tag — attach its id.
137
+ TagStripAddOptions -> ready when (array/includes (array/map ?data (fn t (object/get @t name))) @entity.pendingTagName)
138
+ (emit TAGS_CHANGED {
139
+ id: @entity.docId
140
+ tagIds: (array/append @entity.docTagIds (object/get (array/first (array/filter ?data (fn t ["=", (object/get @t name), @entity.pendingTagName]))) id))
141
+ })
142
+ ;; Unknown name — create it in the shared taxonomy, then attach.
143
+ TagStripAddOptions -> creating
144
+ (persist create StripTag { name: @entity.pendingTagName } {
145
+ emit: { failure: TagStripLoadFailed, success: TagStripTagCreated }
146
+ })
147
+ TagStripLoadFailed -> idle
148
+ (render-ui main {
149
+ message: ?error
150
+ type: alert
151
+ variant: error
152
+ })
153
+ }
154
+
155
+ state creating {
156
+ SHOW_TAG_STRIP -> loading
157
+ (set @entity.docId ?id)
158
+ (set @entity.docTagIds (array/map ?tagIds (fn t (str/default (object/get @t id) @t))))
159
+ (fetch StripTag {
160
+ emit: { failure: TagStripLoadFailed, success: TagStripOptions }
161
+ })
162
+ TagStripTagCreated -> ready when ["!=", (str/default ?id ""), ""]
163
+ (emit TAGS_CHANGED {
164
+ id: @entity.docId
165
+ tagIds: (array/append @entity.docTagIds ?id)
166
+ })
167
+ TagStripLoadFailed -> idle
168
+ (render-ui main {
169
+ message: ?error
170
+ type: alert
171
+ variant: error
172
+ })
173
+ }
174
+
175
+ state removing {
176
+ SHOW_TAG_STRIP -> loading
177
+ (set @entity.docId ?id)
178
+ (set @entity.docTagIds (array/map ?tagIds (fn t (str/default (object/get @t id) @t))))
179
+ (fetch StripTag {
180
+ emit: { failure: TagStripLoadFailed, success: TagStripOptions }
181
+ })
182
+ ;; The remaining chip names map back to ids — every kept name exists
183
+ ;; by construction (chips only render attached, existing tags).
184
+ TagStripRemoveOptions -> ready
185
+ (emit TAGS_CHANGED {
186
+ id: @entity.docId
187
+ tagIds: (array/map (array/filter ?data (fn t (array/includes @entity.pendingNames (object/get @t name)))) (fn t (object/get @t id)))
188
+ })
189
+ TagStripLoadFailed -> idle
190
+ (render-ui main {
191
+ message: ?error
192
+ type: alert
193
+ variant: error
194
+ })
195
+ }
196
+
197
+ emits {
198
+ TAGS_CHANGED -> external {
199
+ id : string
200
+ tagIds : [string]
201
+ }
202
+ @description "The record's tag set changed (chip added or removed); the host routes this into its persistor's update so the write and the refetch stay the organism's."
203
+ @synonyms "tags updated, tag set changed, retagged"
204
+ @tier "domain"
205
+ ADD_TAG {
206
+ tag : string!
207
+ }
208
+ @description "A tag name was typed into the strip or an existing tag's suggestion chip was clicked."
209
+ @synonyms "attach tag, add label"
210
+ @tier "presentation"
211
+ REMOVE_TAG {
212
+ tag : string
213
+ value : [string]
214
+ }
215
+ @description "A chip's remove affordance was clicked; value carries the names that remain."
216
+ @synonyms "detach tag, remove label"
217
+ @tier "presentation"
218
+ TagStripOptions {
219
+ data : [StripTag]
220
+ }
221
+ @description "The shared tag store loaded for the display pass."
222
+ @tier "internal"
223
+ TagStripAddOptions {
224
+ data : [StripTag]
225
+ }
226
+ @description "The shared tag store loaded to resolve a typed name on add."
227
+ @tier "internal"
228
+ TagStripRemoveOptions {
229
+ data : [StripTag]
230
+ }
231
+ @description "The shared tag store loaded to resolve the remaining names on remove."
232
+ @tier "internal"
233
+ TagStripTagCreated {
234
+ id : string
235
+ row : StripTag
236
+ }
237
+ @description "A typed name had no existing tag; a fresh row was created in the shared taxonomy."
238
+ @tier "internal"
239
+ TagStripLoadFailed {
240
+ error : string
241
+ code : string
242
+ }
243
+ @description "The tag store fetch or create failed."
244
+ @tier "internal"
245
+ }
246
+
247
+ listens {
248
+ SHOW_TAG_STRIP {
249
+ id : string!
250
+ tagIds : [string]
251
+ }
252
+ @description "Scope the strip to the open record — routed from the document's load events; carries the record's id and current tag ids (hydrated tag rows are normalized to their ids at stash time, so include-hydrated fetches route straight through)."
253
+ @synonyms "load tags, scope tag strip, show tags"
254
+ @tier "domain"
255
+ ADD_TAG {
256
+ tag : string!
257
+ }
258
+ @description "Attach a tag by name — typed into the input or clicked from the existing-tag chips."
259
+ @synonyms "attach tag, add label"
260
+ @tier "presentation"
261
+ REMOVE_TAG {
262
+ tag : string
263
+ value : [string]
264
+ }
265
+ @description "Detach a chip; value carries the names that remain."
266
+ @synonyms "detach tag, remove label"
267
+ @tier "presentation"
268
+ TagStripOptions {
269
+ data : [StripTag]
270
+ }
271
+ @description "Display-pass fetch resolved."
272
+ @tier "internal"
273
+ TagStripAddOptions {
274
+ data : [StripTag]
275
+ }
276
+ @description "Add-resolve fetch resolved."
277
+ @tier "internal"
278
+ TagStripRemoveOptions {
279
+ data : [StripTag]
280
+ }
281
+ @description "Remove-resolve fetch resolved."
282
+ @tier "internal"
283
+ TagStripTagCreated {
284
+ id : string
285
+ row : StripTag
286
+ }
287
+ @description "The taxonomy row for a typed name persisted; attach its id."
288
+ @tier "internal"
289
+ TagStripLoadFailed {
290
+ error : string
291
+ code : string
292
+ }
293
+ @description "The tag store fetch or create failed."
294
+ @tier "internal"
295
+ }
296
+
297
+ config {
298
+ title : string = Tags
299
+ @label "Strip caption"
300
+ @description "Small caption above the chips; empty hides it"
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"
307
+ placeholder : string = "Add a tag…"
308
+ @label "Input placeholder"
309
+ @description "Placeholder in the type-to-add input"
310
+ @tier "presentation"
311
+ helperText : string = ""
312
+ @label "Helper text"
313
+ @description "Optional helper line under the input"
314
+ @tier "presentation"
315
+ }
316
+ }
317
+
318
+ page "/tagstrip/demo" as TagStripDemoPage -> TagStrip
319
+ }