@almadar/std 16.252.0 → 16.254.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 (453) hide show
  1. package/behaviors/lolo/agent/atoms/std-agent-pool.lolo +355 -0
  2. package/behaviors/lolo/agent/atoms/std-agent-suggestions.lolo +16 -2
  3. package/behaviors/lolo/agent/evals/eval-agent-builder.lolo +152 -0
  4. package/behaviors/lolo/agent/organisms/std-agent-builder.lolo +320 -26
  5. package/behaviors/lolo/ui/learning/atoms/std-learn-generate.lolo +6 -4
  6. package/behaviors/lolo-behavior-contracts.json +1 -1
  7. package/behaviors/registry/agent/atoms/std-agent-context.orb +1 -1
  8. package/behaviors/registry/agent/atoms/std-agent-fix-loop.orb +1 -1
  9. package/behaviors/registry/agent/atoms/std-agent-planner.orb +1 -1
  10. package/behaviors/registry/agent/atoms/std-agent-pool.orb +1 -0
  11. package/behaviors/registry/agent/atoms/std-agent-proposal.orb +1 -1
  12. package/behaviors/registry/agent/atoms/std-agent-session.orb +1 -1
  13. package/behaviors/registry/agent/atoms/std-agent-suggestions.orb +1 -1
  14. package/behaviors/registry/agent/atoms/std-agent-tool-call.orb +1 -1
  15. package/behaviors/registry/agent/atoms/std-agent-tool-loop.orb +1 -1
  16. package/behaviors/registry/agent/atoms/std-agent-trace.orb +1 -1
  17. package/behaviors/registry/agent/evals/eval-agent-builder.orb +1 -0
  18. package/behaviors/registry/agent/organisms/std-agent-assistant.orb +1 -1
  19. package/behaviors/registry/agent/organisms/std-agent-builder.orb +1 -1
  20. package/behaviors/registry/infra/atoms/std-analytics.orb +1 -1
  21. package/behaviors/registry/infra/atoms/std-approval-gate.orb +1 -1
  22. package/behaviors/registry/infra/atoms/std-cache-aside.orb +1 -1
  23. package/behaviors/registry/infra/atoms/std-calendar-sync.orb +1 -1
  24. package/behaviors/registry/infra/atoms/std-cascade-on-delete.orb +1 -1
  25. package/behaviors/registry/infra/atoms/std-circuit-breaker.orb +1 -1
  26. package/behaviors/registry/infra/atoms/std-data-erasure.orb +1 -1
  27. package/behaviors/registry/infra/atoms/std-data-import.orb +1 -1
  28. package/behaviors/registry/infra/atoms/std-global-search.orb +1 -1
  29. package/behaviors/registry/infra/atoms/std-knowledge-loop.orb +1 -1
  30. package/behaviors/registry/infra/atoms/std-lifecycle.orb +1 -1
  31. package/behaviors/registry/infra/atoms/std-migration-job.orb +1 -1
  32. package/behaviors/registry/infra/atoms/std-mod-queue.orb +1 -1
  33. package/behaviors/registry/infra/atoms/std-notification-center.orb +1 -1
  34. package/behaviors/registry/infra/atoms/std-notification-preferences.orb +1 -1
  35. package/behaviors/registry/infra/atoms/std-notify-on-event.orb +1 -1
  36. package/behaviors/registry/infra/atoms/std-page-search.orb +1 -1
  37. package/behaviors/registry/infra/atoms/std-page-watch.orb +1 -1
  38. package/behaviors/registry/infra/atoms/std-permission-matrix.orb +1 -1
  39. package/behaviors/registry/infra/atoms/std-rate-limiter.orb +1 -1
  40. package/behaviors/registry/infra/atoms/std-reminder-scheduler.orb +1 -1
  41. package/behaviors/registry/infra/atoms/std-review-cycle.orb +1 -1
  42. package/behaviors/registry/infra/atoms/std-row-access-control.orb +1 -1
  43. package/behaviors/registry/infra/atoms/std-status-lifecycle.orb +1 -1
  44. package/behaviors/registry/infra/organisms/std-status-lifecycle-control.orb +1 -1
  45. package/behaviors/registry/ml/atoms/std-data-collector.orb +1 -1
  46. package/behaviors/registry/ml/atoms/std-graph-builder.orb +1 -1
  47. package/behaviors/registry/ml/atoms/std-ml-classify.orb +1 -1
  48. package/behaviors/registry/ml/atoms/std-ml-infer.orb +1 -1
  49. package/behaviors/registry/ml/atoms/std-ml-lookup.orb +1 -1
  50. package/behaviors/registry/ml/atoms/std-ml-posterior.orb +1 -1
  51. package/behaviors/registry/ml/atoms/std-ml-similarity.orb +1 -1
  52. package/behaviors/registry/ml/atoms/std-tokenizer.orb +1 -1
  53. package/behaviors/registry/ml/atoms/std-weight-validator.orb +1 -1
  54. package/behaviors/registry/ml/organisms/std-escalating-decision.orb +1 -1
  55. package/behaviors/registry/ml/organisms/std-knowledge-tracing.orb +1 -1
  56. package/behaviors/registry/ui/avl/atoms/std-avl-cosmic-zoom.orb +1 -1
  57. package/behaviors/registry/ui/avl/atoms/ui-avl-glyph.orb +1 -1
  58. package/behaviors/registry/ui/avl/atoms/ui-avl-state-machine.orb +1 -1
  59. package/behaviors/registry/ui/avl/atoms/ui-avl-transition-detail.orb +1 -1
  60. package/behaviors/registry/ui/avl/atoms/ui-avl-transition-explainer.orb +1 -1
  61. package/behaviors/registry/ui/avl/atoms/ui-behavior-view.orb +1 -1
  62. package/behaviors/registry/ui/avl/atoms/ui-module-card.orb +1 -1
  63. package/behaviors/registry/ui/avl/organisms/ui-flow-canvas.orb +1 -1
  64. package/behaviors/registry/ui/avl/organisms/ui-layers-panel.orb +1 -1
  65. package/behaviors/registry/ui/avl/organisms/ui-orb-inspector.orb +1 -1
  66. package/behaviors/registry/ui/core/atoms/std-app-layout.orb +1 -1
  67. package/behaviors/registry/ui/core/atoms/std-app-search.orb +1 -1
  68. package/behaviors/registry/ui/core/atoms/std-behavior-catalog.orb +1 -1
  69. package/behaviors/registry/ui/core/atoms/std-behavior-tour.orb +1 -1
  70. package/behaviors/registry/ui/core/atoms/std-billable-hour.orb +1 -1
  71. package/behaviors/registry/ui/core/atoms/std-board.orb +1 -1
  72. package/behaviors/registry/ui/core/atoms/std-book-reader.orb +1 -1
  73. package/behaviors/registry/ui/core/atoms/std-browse.orb +1 -1
  74. package/behaviors/registry/ui/core/atoms/std-calendar.orb +1 -1
  75. package/behaviors/registry/ui/core/atoms/std-card-grid.orb +1 -1
  76. package/behaviors/registry/ui/core/atoms/std-confirmation.orb +1 -1
  77. package/behaviors/registry/ui/core/atoms/std-dashboard-grid-embedded.orb +1 -1
  78. package/behaviors/registry/ui/core/atoms/std-date-range.orb +1 -1
  79. package/behaviors/registry/ui/core/atoms/std-doc-page.orb +1 -1
  80. package/behaviors/registry/ui/core/atoms/std-esign-flow.orb +1 -1
  81. package/behaviors/registry/ui/core/atoms/std-esign-request.orb +1 -1
  82. package/behaviors/registry/ui/core/atoms/std-event-log.orb +1 -1
  83. package/behaviors/registry/ui/core/atoms/std-export.orb +1 -1
  84. package/behaviors/registry/ui/core/atoms/std-file-store.orb +1 -1
  85. package/behaviors/registry/ui/core/atoms/std-filter.orb +1 -1
  86. package/behaviors/registry/ui/core/atoms/std-form-advanced.orb +1 -1
  87. package/behaviors/registry/ui/core/atoms/std-gallery.orb +1 -1
  88. package/behaviors/registry/ui/core/atoms/std-gantt-schedule.orb +1 -1
  89. package/behaviors/registry/ui/core/atoms/std-graphs.orb +1 -1
  90. package/behaviors/registry/ui/core/atoms/std-hero.orb +1 -1
  91. package/behaviors/registry/ui/core/atoms/std-home.orb +1 -1
  92. package/behaviors/registry/ui/core/atoms/std-image-upload-multi.orb +1 -1
  93. package/behaviors/registry/ui/core/atoms/std-import.orb +1 -1
  94. package/behaviors/registry/ui/core/atoms/std-language-picker.orb +1 -1
  95. package/behaviors/registry/ui/core/atoms/std-media-section.orb +1 -1
  96. package/behaviors/registry/ui/core/atoms/std-modal-editor.orb +1 -1
  97. package/behaviors/registry/ui/core/atoms/std-modal.orb +1 -1
  98. package/behaviors/registry/ui/core/atoms/std-multi-party-flow.orb +1 -1
  99. package/behaviors/registry/ui/core/atoms/std-notification-panel.orb +1 -1
  100. package/behaviors/registry/ui/core/atoms/std-panel-launcher.orb +1 -1
  101. package/behaviors/registry/ui/core/atoms/std-pricing.orb +1 -1
  102. package/behaviors/registry/ui/core/atoms/std-proof.orb +1 -1
  103. package/behaviors/registry/ui/core/atoms/std-prose.orb +1 -1
  104. package/behaviors/registry/ui/core/atoms/std-rating-review.orb +1 -1
  105. package/behaviors/registry/ui/core/atoms/std-record-detail.orb +1 -1
  106. package/behaviors/registry/ui/core/atoms/std-recurrence.orb +1 -1
  107. package/behaviors/registry/ui/core/atoms/std-related.orb +1 -1
  108. package/behaviors/registry/ui/core/atoms/std-role-gate.orb +1 -1
  109. package/behaviors/registry/ui/core/atoms/std-saved-search.orb +1 -1
  110. package/behaviors/registry/ui/core/atoms/std-scatter.orb +1 -1
  111. package/behaviors/registry/ui/core/atoms/std-scoped-list.orb +1 -1
  112. package/behaviors/registry/ui/core/atoms/std-selection.orb +1 -1
  113. package/behaviors/registry/ui/core/atoms/std-site-footer.orb +1 -1
  114. package/behaviors/registry/ui/core/atoms/std-site-header.orb +1 -1
  115. package/behaviors/registry/ui/core/atoms/std-slide-deck.orb +1 -1
  116. package/behaviors/registry/ui/core/atoms/std-stat-band.orb +1 -1
  117. package/behaviors/registry/ui/core/atoms/std-stats.orb +1 -1
  118. package/behaviors/registry/ui/core/atoms/std-step-flow.orb +1 -1
  119. package/behaviors/registry/ui/core/atoms/std-steps.orb +1 -1
  120. package/behaviors/registry/ui/core/atoms/std-tabs.orb +1 -1
  121. package/behaviors/registry/ui/core/atoms/std-tag-strip.orb +1 -1
  122. package/behaviors/registry/ui/core/atoms/std-tag-taxonomy.orb +1 -1
  123. package/behaviors/registry/ui/core/atoms/std-thread.orb +1 -1
  124. package/behaviors/registry/ui/core/atoms/std-tree.orb +1 -1
  125. package/behaviors/registry/ui/core/atoms/std-version-history.orb +1 -1
  126. package/behaviors/registry/ui/core/atoms/std-wizard.orb +1 -1
  127. package/behaviors/registry/ui/core/atoms/std-workspace-layout.orb +1 -1
  128. package/behaviors/registry/ui/core/atoms/ui-animated-graphic.orb +1 -1
  129. package/behaviors/registry/ui/core/atoms/ui-animated-reveal.orb +1 -1
  130. package/behaviors/registry/ui/core/atoms/ui-aside.orb +1 -1
  131. package/behaviors/registry/ui/core/atoms/ui-atlas-image.orb +1 -1
  132. package/behaviors/registry/ui/core/atoms/ui-atlas-panel.orb +1 -1
  133. package/behaviors/registry/ui/core/atoms/ui-avatar.orb +1 -1
  134. package/behaviors/registry/ui/core/atoms/ui-badge.orb +1 -1
  135. package/behaviors/registry/ui/core/atoms/ui-box.orb +1 -1
  136. package/behaviors/registry/ui/core/atoms/ui-button.orb +1 -1
  137. package/behaviors/registry/ui/core/atoms/ui-card.orb +1 -1
  138. package/behaviors/registry/ui/core/atoms/ui-center.orb +1 -1
  139. package/behaviors/registry/ui/core/atoms/ui-checkbox.orb +1 -1
  140. package/behaviors/registry/ui/core/atoms/ui-conditional-wrapper.orb +1 -1
  141. package/behaviors/registry/ui/core/atoms/ui-confetti-effect.orb +1 -1
  142. package/behaviors/registry/ui/core/atoms/ui-day-cell.orb +1 -1
  143. package/behaviors/registry/ui/core/atoms/ui-dialog.orb +1 -1
  144. package/behaviors/registry/ui/core/atoms/ui-divider.orb +1 -1
  145. package/behaviors/registry/ui/core/atoms/ui-filter-pill.orb +1 -1
  146. package/behaviors/registry/ui/core/atoms/ui-flip-container.orb +1 -1
  147. package/behaviors/registry/ui/core/atoms/ui-game-icon.orb +1 -1
  148. package/behaviors/registry/ui/core/atoms/ui-hstack.orb +1 -1
  149. package/behaviors/registry/ui/core/atoms/ui-icon.orb +1 -1
  150. package/behaviors/registry/ui/core/atoms/ui-image.orb +1 -1
  151. package/behaviors/registry/ui/core/atoms/ui-infinite-scroll-sentinel.orb +1 -1
  152. package/behaviors/registry/ui/core/atoms/ui-input.orb +1 -1
  153. package/behaviors/registry/ui/core/atoms/ui-label.orb +1 -1
  154. package/behaviors/registry/ui/core/atoms/ui-law-reference-tooltip.orb +1 -1
  155. package/behaviors/registry/ui/core/atoms/ui-overlay.orb +1 -1
  156. package/behaviors/registry/ui/core/atoms/ui-pattern-tile.orb +1 -1
  157. package/behaviors/registry/ui/core/atoms/ui-presence.orb +1 -1
  158. package/behaviors/registry/ui/core/atoms/ui-progress-bar.orb +1 -1
  159. package/behaviors/registry/ui/core/atoms/ui-radio.orb +1 -1
  160. package/behaviors/registry/ui/core/atoms/ui-range-slider.orb +1 -1
  161. package/behaviors/registry/ui/core/atoms/ui-section-header.orb +1 -1
  162. package/behaviors/registry/ui/core/atoms/ui-select.orb +1 -1
  163. package/behaviors/registry/ui/core/atoms/ui-spacer.orb +1 -1
  164. package/behaviors/registry/ui/core/atoms/ui-sparkline.orb +1 -1
  165. package/behaviors/registry/ui/core/atoms/ui-spinner.orb +1 -1
  166. package/behaviors/registry/ui/core/atoms/ui-stack.orb +1 -1
  167. package/behaviors/registry/ui/core/atoms/ui-status-dot.orb +1 -1
  168. package/behaviors/registry/ui/core/atoms/ui-svg-branch.orb +1 -1
  169. package/behaviors/registry/ui/core/atoms/ui-svg-connection.orb +1 -1
  170. package/behaviors/registry/ui/core/atoms/ui-svg-flow.orb +1 -1
  171. package/behaviors/registry/ui/core/atoms/ui-svg-grid.orb +1 -1
  172. package/behaviors/registry/ui/core/atoms/ui-svg-lobe.orb +1 -1
  173. package/behaviors/registry/ui/core/atoms/ui-svg-mesh.orb +1 -1
  174. package/behaviors/registry/ui/core/atoms/ui-svg-morph.orb +1 -1
  175. package/behaviors/registry/ui/core/atoms/ui-svg-node.orb +1 -1
  176. package/behaviors/registry/ui/core/atoms/ui-svg-pulse.orb +1 -1
  177. package/behaviors/registry/ui/core/atoms/ui-svg-ring.orb +1 -1
  178. package/behaviors/registry/ui/core/atoms/ui-svg-shield.orb +1 -1
  179. package/behaviors/registry/ui/core/atoms/ui-svg-stack.orb +1 -1
  180. package/behaviors/registry/ui/core/atoms/ui-switch.orb +1 -1
  181. package/behaviors/registry/ui/core/atoms/ui-text-highlight.orb +1 -1
  182. package/behaviors/registry/ui/core/atoms/ui-textarea.orb +1 -1
  183. package/behaviors/registry/ui/core/atoms/ui-theme-toggle.orb +1 -1
  184. package/behaviors/registry/ui/core/atoms/ui-time-slot-cell.orb +1 -1
  185. package/behaviors/registry/ui/core/atoms/ui-trend-indicator.orb +1 -1
  186. package/behaviors/registry/ui/core/atoms/ui-typewriter-text.orb +1 -1
  187. package/behaviors/registry/ui/core/atoms/ui-typography.orb +1 -1
  188. package/behaviors/registry/ui/core/atoms/ui-video-embed.orb +1 -1
  189. package/behaviors/registry/ui/core/atoms/ui-vstack.orb +1 -1
  190. package/behaviors/registry/ui/core/molecules/std-stat-rows.orb +1 -1
  191. package/behaviors/registry/ui/core/molecules/ui-accordion.orb +1 -1
  192. package/behaviors/registry/ui/core/molecules/ui-activation-block.orb +1 -1
  193. package/behaviors/registry/ui/core/molecules/ui-activity-rail.orb +1 -1
  194. package/behaviors/registry/ui/core/molecules/ui-agent-activity-feed.orb +1 -1
  195. package/behaviors/registry/ui/core/molecules/ui-agent-activity-row.orb +1 -1
  196. package/behaviors/registry/ui/core/molecules/ui-agent-chat-feed.orb +1 -1
  197. package/behaviors/registry/ui/core/molecules/ui-alert.orb +1 -1
  198. package/behaviors/registry/ui/core/molecules/ui-animated-counter.orb +1 -1
  199. package/behaviors/registry/ui/core/molecules/ui-bloom-quiz-block.orb +1 -1
  200. package/behaviors/registry/ui/core/molecules/ui-branching-logic-builder.orb +1 -1
  201. package/behaviors/registry/ui/core/molecules/ui-breadcrumb.orb +1 -1
  202. package/behaviors/registry/ui/core/molecules/ui-calendar-grid.orb +1 -1
  203. package/behaviors/registry/ui/core/molecules/ui-carousel.orb +1 -1
  204. package/behaviors/registry/ui/core/molecules/ui-change-list.orb +1 -1
  205. package/behaviors/registry/ui/core/molecules/ui-chart-legend.orb +1 -1
  206. package/behaviors/registry/ui/core/molecules/ui-chart.orb +1 -1
  207. package/behaviors/registry/ui/core/molecules/ui-code-block.orb +1 -1
  208. package/behaviors/registry/ui/core/molecules/ui-command-palette.orb +1 -1
  209. package/behaviors/registry/ui/core/molecules/ui-commit-row.orb +1 -1
  210. package/behaviors/registry/ui/core/molecules/ui-confirm-dialog.orb +1 -1
  211. package/behaviors/registry/ui/core/molecules/ui-connection-block.orb +1 -1
  212. package/behaviors/registry/ui/core/molecules/ui-container.orb +1 -1
  213. package/behaviors/registry/ui/core/molecules/ui-content-renderer.orb +1 -1
  214. package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +1 -1
  215. package/behaviors/registry/ui/core/molecules/ui-data-list.orb +1 -1
  216. package/behaviors/registry/ui/core/molecules/ui-date-range-picker.orb +1 -1
  217. package/behaviors/registry/ui/core/molecules/ui-date-range-selector.orb +1 -1
  218. package/behaviors/registry/ui/core/molecules/ui-doc-breadcrumb.orb +1 -1
  219. package/behaviors/registry/ui/core/molecules/ui-doc-pagination.orb +1 -1
  220. package/behaviors/registry/ui/core/molecules/ui-doc-search.orb +1 -1
  221. package/behaviors/registry/ui/core/molecules/ui-doc-sidebar.orb +1 -1
  222. package/behaviors/registry/ui/core/molecules/ui-doc-toc.orb +1 -1
  223. package/behaviors/registry/ui/core/molecules/ui-document-details.orb +1 -1
  224. package/behaviors/registry/ui/core/molecules/ui-document-panel.orb +1 -1
  225. package/behaviors/registry/ui/core/molecules/ui-document-viewer.orb +1 -1
  226. package/behaviors/registry/ui/core/molecules/ui-drawer.orb +1 -1
  227. package/behaviors/registry/ui/core/molecules/ui-edge-decoration.orb +1 -1
  228. package/behaviors/registry/ui/core/molecules/ui-emoji-picker.orb +1 -1
  229. package/behaviors/registry/ui/core/molecules/ui-empty-state.orb +1 -1
  230. package/behaviors/registry/ui/core/molecules/ui-error-boundary.orb +1 -1
  231. package/behaviors/registry/ui/core/molecules/ui-error-state.orb +1 -1
  232. package/behaviors/registry/ui/core/molecules/ui-feature-card.orb +1 -1
  233. package/behaviors/registry/ui/core/molecules/ui-feature-grid.orb +1 -1
  234. package/behaviors/registry/ui/core/molecules/ui-file-tree.orb +1 -1
  235. package/behaviors/registry/ui/core/molecules/ui-filter-group.orb +1 -1
  236. package/behaviors/registry/ui/core/molecules/ui-flex.orb +1 -1
  237. package/behaviors/registry/ui/core/molecules/ui-flip-card.orb +1 -1
  238. package/behaviors/registry/ui/core/molecules/ui-floating-action-button.orb +1 -1
  239. package/behaviors/registry/ui/core/molecules/ui-floating-toolbar.orb +1 -1
  240. package/behaviors/registry/ui/core/molecules/ui-form-actions.orb +1 -1
  241. package/behaviors/registry/ui/core/molecules/ui-form-field.orb +1 -1
  242. package/behaviors/registry/ui/core/molecules/ui-form-layout.orb +1 -1
  243. package/behaviors/registry/ui/core/molecules/ui-form-section-header.orb +1 -1
  244. package/behaviors/registry/ui/core/molecules/ui-fx-overlay.orb +1 -1
  245. package/behaviors/registry/ui/core/molecules/ui-gantt.orb +1 -1
  246. package/behaviors/registry/ui/core/molecules/ui-geometric-pattern.orb +1 -1
  247. package/behaviors/registry/ui/core/molecules/ui-gradient-divider.orb +1 -1
  248. package/behaviors/registry/ui/core/molecules/ui-graph-canvas.orb +1 -1
  249. package/behaviors/registry/ui/core/molecules/ui-graph-view.orb +1 -1
  250. package/behaviors/registry/ui/core/molecules/ui-grid.orb +1 -1
  251. package/behaviors/registry/ui/core/molecules/ui-header.orb +1 -1
  252. package/behaviors/registry/ui/core/molecules/ui-icon-button.orb +1 -1
  253. package/behaviors/registry/ui/core/molecules/ui-import-preview-tree.orb +1 -1
  254. package/behaviors/registry/ui/core/molecules/ui-import-progress.orb +1 -1
  255. package/behaviors/registry/ui/core/molecules/ui-import-source-picker.orb +1 -1
  256. package/behaviors/registry/ui/core/molecules/ui-input-group.orb +1 -1
  257. package/behaviors/registry/ui/core/molecules/ui-jazari-state-machine.orb +1 -1
  258. package/behaviors/registry/ui/core/molecules/ui-lightbox.orb +1 -1
  259. package/behaviors/registry/ui/core/molecules/ui-likert-scale.orb +1 -1
  260. package/behaviors/registry/ui/core/molecules/ui-line-chart.orb +1 -1
  261. package/behaviors/registry/ui/core/molecules/ui-loading-state.orb +1 -1
  262. package/behaviors/registry/ui/core/molecules/ui-map-view.orb +1 -1
  263. package/behaviors/registry/ui/core/molecules/ui-markdown-content.orb +1 -1
  264. package/behaviors/registry/ui/core/molecules/ui-matrix-question.orb +1 -1
  265. package/behaviors/registry/ui/core/molecules/ui-menu.orb +1 -1
  266. package/behaviors/registry/ui/core/molecules/ui-meter.orb +1 -1
  267. package/behaviors/registry/ui/core/molecules/ui-modal.orb +1 -1
  268. package/behaviors/registry/ui/core/molecules/ui-navigation.orb +1 -1
  269. package/behaviors/registry/ui/core/molecules/ui-notification.orb +1 -1
  270. package/behaviors/registry/ui/core/molecules/ui-number-stepper.orb +1 -1
  271. package/behaviors/registry/ui/core/molecules/ui-option-constraint-group.orb +1 -1
  272. package/behaviors/registry/ui/core/molecules/ui-orbital-visualization.orb +1 -1
  273. package/behaviors/registry/ui/core/molecules/ui-page-header.orb +1 -1
  274. package/behaviors/registry/ui/core/molecules/ui-page-transition.orb +1 -1
  275. package/behaviors/registry/ui/core/molecules/ui-pagination.orb +1 -1
  276. package/behaviors/registry/ui/core/molecules/ui-popover.orb +1 -1
  277. package/behaviors/registry/ui/core/molecules/ui-positioned-canvas.orb +1 -1
  278. package/behaviors/registry/ui/core/molecules/ui-progress-dots.orb +1 -1
  279. package/behaviors/registry/ui/core/molecules/ui-pull-to-refresh.orb +1 -1
  280. package/behaviors/registry/ui/core/molecules/ui-qr-scanner.orb +1 -1
  281. package/behaviors/registry/ui/core/molecules/ui-quiz-block.orb +1 -1
  282. package/behaviors/registry/ui/core/molecules/ui-reflection-block.orb +1 -1
  283. package/behaviors/registry/ui/core/molecules/ui-relation-select.orb +1 -1
  284. package/behaviors/registry/ui/core/molecules/ui-repeatable-form-section.orb +1 -1
  285. package/behaviors/registry/ui/core/molecules/ui-reply-tree.orb +1 -1
  286. package/behaviors/registry/ui/core/molecules/ui-rich-text-editor.orb +1 -1
  287. package/behaviors/registry/ui/core/molecules/ui-scaled-diagram.orb +1 -1
  288. package/behaviors/registry/ui/core/molecules/ui-search-input.orb +1 -1
  289. package/behaviors/registry/ui/core/molecules/ui-section.orb +1 -1
  290. package/behaviors/registry/ui/core/molecules/ui-side-panel.orb +1 -1
  291. package/behaviors/registry/ui/core/molecules/ui-sidebar.orb +1 -1
  292. package/behaviors/registry/ui/core/molecules/ui-signature-pad.orb +1 -1
  293. package/behaviors/registry/ui/core/molecules/ui-simple-grid.orb +1 -1
  294. package/behaviors/registry/ui/core/molecules/ui-skeleton.orb +1 -1
  295. package/behaviors/registry/ui/core/molecules/ui-social-proof.orb +1 -1
  296. package/behaviors/registry/ui/core/molecules/ui-sortable-list.orb +1 -1
  297. package/behaviors/registry/ui/core/molecules/ui-split.orb +1 -1
  298. package/behaviors/registry/ui/core/molecules/ui-star-rating.orb +1 -1
  299. package/behaviors/registry/ui/core/molecules/ui-stat-display.orb +1 -1
  300. package/behaviors/registry/ui/core/molecules/ui-swipeable-row.orb +1 -1
  301. package/behaviors/registry/ui/core/molecules/ui-table-view.orb +1 -1
  302. package/behaviors/registry/ui/core/molecules/ui-tabs.orb +1 -1
  303. package/behaviors/registry/ui/core/molecules/ui-tag-input.orb +1 -1
  304. package/behaviors/registry/ui/core/molecules/ui-tooltip.orb +1 -1
  305. package/behaviors/registry/ui/core/molecules/ui-top-nav-item.orb +1 -1
  306. package/behaviors/registry/ui/core/molecules/ui-upload-drop-zone.orb +1 -1
  307. package/behaviors/registry/ui/core/molecules/ui-version-diff.orb +1 -1
  308. package/behaviors/registry/ui/core/molecules/ui-violation-alert.orb +1 -1
  309. package/behaviors/registry/ui/core/molecules/ui-vote-stack.orb +1 -1
  310. package/behaviors/registry/ui/core/molecules/ui-wizard-container.orb +1 -1
  311. package/behaviors/registry/ui/core/molecules/ui-wizard-navigation.orb +1 -1
  312. package/behaviors/registry/ui/core/molecules/ui-wizard-progress.orb +1 -1
  313. package/behaviors/registry/ui/core/organisms/ui-chat-bar.orb +1 -1
  314. package/behaviors/registry/ui/core/organisms/ui-code-runner-panel.orb +1 -1
  315. package/behaviors/registry/ui/core/organisms/ui-dashboard-grid.orb +1 -1
  316. package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +1 -1
  317. package/behaviors/registry/ui/core/organisms/ui-dock-layout.orb +1 -1
  318. package/behaviors/registry/ui/core/organisms/ui-drawer-slot.orb +1 -1
  319. package/behaviors/registry/ui/core/organisms/ui-form-section.orb +1 -1
  320. package/behaviors/registry/ui/core/organisms/ui-form.orb +1 -1
  321. package/behaviors/registry/ui/core/organisms/ui-master-detail-layout.orb +1 -1
  322. package/behaviors/registry/ui/core/organisms/ui-media-gallery.orb +1 -1
  323. package/behaviors/registry/ui/core/organisms/ui-modal-slot.orb +1 -1
  324. package/behaviors/registry/ui/core/organisms/ui-runtime-debugger.orb +1 -1
  325. package/behaviors/registry/ui/core/organisms/ui-segment-renderer.orb +1 -1
  326. package/behaviors/registry/ui/core/organisms/ui-split-pane.orb +1 -1
  327. package/behaviors/registry/ui/core/organisms/ui-stat-card.orb +1 -1
  328. package/behaviors/registry/ui/core/organisms/ui-state-machine-view.orb +1 -1
  329. package/behaviors/registry/ui/core/organisms/ui-subagent-trace-panel.orb +1 -1
  330. package/behaviors/registry/ui/core/organisms/ui-tabbed-container.orb +1 -1
  331. package/behaviors/registry/ui/core/organisms/ui-timeline.orb +1 -1
  332. package/behaviors/registry/ui/core/organisms/ui-toast-slot.orb +1 -1
  333. package/behaviors/registry/ui/core/templates/ui-auth-layout.orb +1 -1
  334. package/behaviors/registry/ui/core/templates/ui-counter-template.orb +1 -1
  335. package/behaviors/registry/ui/core/templates/ui-dashboard-layout.orb +1 -1
  336. package/behaviors/registry/ui/core/templates/ui-generic-app-template.orb +1 -1
  337. package/behaviors/registry/ui/game/atoms/std-arcade-play.orb +1 -1
  338. package/behaviors/registry/ui/game/atoms/std-area-fill.orb +1 -1
  339. package/behaviors/registry/ui/game/atoms/std-audio-cue.orb +1 -1
  340. package/behaviors/registry/ui/game/atoms/std-camera-rig.orb +1 -1
  341. package/behaviors/registry/ui/game/atoms/std-chase-ai.orb +1 -1
  342. package/behaviors/registry/ui/game/atoms/std-choice-gate.orb +1 -1
  343. package/behaviors/registry/ui/game/atoms/std-coef-pad.orb +1 -1
  344. package/behaviors/registry/ui/game/atoms/std-curve-fog.orb +1 -1
  345. package/behaviors/registry/ui/game/atoms/std-dungeon-combat.orb +1 -1
  346. package/behaviors/registry/ui/game/atoms/std-fx-narrative.orb +1 -1
  347. package/behaviors/registry/ui/game/atoms/std-fx-particles.orb +1 -1
  348. package/behaviors/registry/ui/game/atoms/std-fx-trail.orb +1 -1
  349. package/behaviors/registry/ui/game/atoms/std-gate-lock.orb +1 -1
  350. package/behaviors/registry/ui/game/atoms/std-gather.orb +1 -1
  351. package/behaviors/registry/ui/game/atoms/std-gold.orb +1 -1
  352. package/behaviors/registry/ui/game/atoms/std-grid-tactics.orb +1 -1
  353. package/behaviors/registry/ui/game/atoms/std-hero-nav.orb +1 -1
  354. package/behaviors/registry/ui/game/atoms/std-lives.orb +1 -1
  355. package/behaviors/registry/ui/game/atoms/std-loop-lock.orb +1 -1
  356. package/behaviors/registry/ui/game/atoms/std-market-flow.orb +1 -1
  357. package/behaviors/registry/ui/game/atoms/std-motion-body.orb +1 -1
  358. package/behaviors/registry/ui/game/atoms/std-objective-reach.orb +1 -1
  359. package/behaviors/registry/ui/game/atoms/std-pad-lock.orb +1 -1
  360. package/behaviors/registry/ui/game/atoms/std-patience.orb +1 -1
  361. package/behaviors/registry/ui/game/atoms/std-patrol-hazard.orb +1 -1
  362. package/behaviors/registry/ui/game/atoms/std-pickup.orb +1 -1
  363. package/behaviors/registry/ui/game/atoms/std-platformer-body.orb +1 -1
  364. package/behaviors/registry/ui/game/atoms/std-production.orb +1 -1
  365. package/behaviors/registry/ui/game/atoms/std-score.orb +1 -1
  366. package/behaviors/registry/ui/game/atoms/std-tutorial-autodemo.orb +1 -1
  367. package/behaviors/registry/ui/game/atoms/std-tutorial-overlay.orb +1 -1
  368. package/behaviors/registry/ui/game/atoms/std-velocity-gate.orb +1 -1
  369. package/behaviors/registry/ui/game/atoms/std-xp.orb +1 -1
  370. package/behaviors/registry/ui/game/atoms/std-zone-card.orb +1 -1
  371. package/behaviors/registry/ui/game/atoms/ui-action-palette.orb +1 -1
  372. package/behaviors/registry/ui/game/atoms/ui-action-tile.orb +1 -1
  373. package/behaviors/registry/ui/game/atoms/ui-canvas-2d.orb +1 -1
  374. package/behaviors/registry/ui/game/atoms/ui-canvas.orb +1 -1
  375. package/behaviors/registry/ui/game/atoms/ui-choice-button.orb +1 -1
  376. package/behaviors/registry/ui/game/atoms/ui-control-button.orb +1 -1
  377. package/behaviors/registry/ui/game/atoms/ui-control-grid.orb +1 -1
  378. package/behaviors/registry/ui/game/atoms/ui-dialogue-bubble.orb +1 -1
  379. package/behaviors/registry/ui/game/atoms/ui-draw-fx-layer.orb +1 -1
  380. package/behaviors/registry/ui/game/atoms/ui-draw-group.orb +1 -1
  381. package/behaviors/registry/ui/game/atoms/ui-draw-mesh.orb +1 -1
  382. package/behaviors/registry/ui/game/atoms/ui-draw-shape-layer.orb +1 -1
  383. package/behaviors/registry/ui/game/atoms/ui-draw-shape.orb +1 -1
  384. package/behaviors/registry/ui/game/atoms/ui-draw-skinned-mesh.orb +1 -1
  385. package/behaviors/registry/ui/game/atoms/ui-draw-sprite-layer.orb +1 -1
  386. package/behaviors/registry/ui/game/atoms/ui-draw-sprite.orb +1 -1
  387. package/behaviors/registry/ui/game/atoms/ui-draw-text-layer.orb +1 -1
  388. package/behaviors/registry/ui/game/atoms/ui-draw-text.orb +1 -1
  389. package/behaviors/registry/ui/game/atoms/ui-game-audio-cue.orb +1 -1
  390. package/behaviors/registry/ui/game/atoms/ui-game-audio-toggle.orb +1 -1
  391. package/behaviors/registry/ui/game/atoms/ui-game-hud.orb +1 -1
  392. package/behaviors/registry/ui/game/atoms/ui-game-menu.orb +1 -1
  393. package/behaviors/registry/ui/game/atoms/ui-health-bar.orb +1 -1
  394. package/behaviors/registry/ui/game/atoms/ui-score-display.orb +1 -1
  395. package/behaviors/registry/ui/game/atoms/ui-sequence-bar.orb +1 -1
  396. package/behaviors/registry/ui/game/atoms/ui-stat-badge.orb +1 -1
  397. package/behaviors/registry/ui/game/atoms/ui-state-graph.orb +1 -1
  398. package/behaviors/registry/ui/game/atoms/ui-state-json-view.orb +1 -1
  399. package/behaviors/registry/ui/game/atoms/ui-timer-display.orb +1 -1
  400. package/behaviors/registry/ui/game/atoms/ui-trait-slot.orb +1 -1
  401. package/behaviors/registry/ui/game/organisms/std-arcade-board-3d.orb +1 -1
  402. package/behaviors/registry/ui/game/organisms/std-crew-board-2d.orb +1 -1
  403. package/behaviors/registry/ui/game/organisms/std-dungeon-board-2d.orb +1 -1
  404. package/behaviors/registry/ui/game/organisms/std-market-board-3d.orb +1 -1
  405. package/behaviors/registry/ui/game/organisms/std-objective-board-3d.orb +1 -1
  406. package/behaviors/registry/ui/game/organisms/std-platformer-board-2d.orb +1 -1
  407. package/behaviors/registry/ui/game/organisms/std-platformer-puzzle.orb +1 -1
  408. package/behaviors/registry/ui/game/organisms/std-survival-board-3d.orb +1 -1
  409. package/behaviors/registry/ui/game/organisms/std-tactics-board-2d.orb +1 -1
  410. package/behaviors/registry/ui/game/organisms/std-tactics-board-3d.orb +1 -1
  411. package/behaviors/registry/ui/game/organisms/std-worldmap-board-2d.orb +1 -1
  412. package/behaviors/registry/ui/game/templates/ui-game-shell.orb +1 -1
  413. package/behaviors/registry/ui/learning/atoms/std-learn-arrangement.orb +1 -1
  414. package/behaviors/registry/ui/learning/atoms/std-learn-classify.orb +1 -1
  415. package/behaviors/registry/ui/learning/atoms/std-learn-compare.orb +1 -1
  416. package/behaviors/registry/ui/learning/atoms/std-learn-coupled-sim.orb +1 -1
  417. package/behaviors/registry/ui/learning/atoms/std-learn-derivation.orb +1 -1
  418. package/behaviors/registry/ui/learning/atoms/std-learn-diagram.orb +1 -1
  419. package/behaviors/registry/ui/learning/atoms/std-learn-doser.orb +1 -1
  420. package/behaviors/registry/ui/learning/atoms/std-learn-estimate.orb +1 -1
  421. package/behaviors/registry/ui/learning/atoms/std-learn-fx-cues.orb +1 -1
  422. package/behaviors/registry/ui/learning/atoms/std-learn-generate.orb +1 -1
  423. package/behaviors/registry/ui/learning/atoms/std-learn-goal-seek.orb +1 -1
  424. package/behaviors/registry/ui/learning/atoms/std-learn-grid-sim.orb +1 -1
  425. package/behaviors/registry/ui/learning/atoms/std-learn-hotspot.orb +1 -1
  426. package/behaviors/registry/ui/learning/atoms/std-learn-live-sim.orb +1 -1
  427. package/behaviors/registry/ui/learning/atoms/std-learn-measure.orb +1 -1
  428. package/behaviors/registry/ui/learning/atoms/std-learn-param-explorer.orb +1 -1
  429. package/behaviors/registry/ui/learning/atoms/std-learn-perturb.orb +1 -1
  430. package/behaviors/registry/ui/learning/atoms/std-learn-predict.orb +1 -1
  431. package/behaviors/registry/ui/learning/atoms/std-learn-sample-accumulator.orb +1 -1
  432. package/behaviors/registry/ui/learning/atoms/std-learn-sandbox.orb +1 -1
  433. package/behaviors/registry/ui/learning/atoms/std-learn-scatter-fit.orb +1 -1
  434. package/behaviors/registry/ui/learning/atoms/std-learn-scenario.orb +1 -1
  435. package/behaviors/registry/ui/learning/atoms/std-learn-sim-3d.orb +1 -1
  436. package/behaviors/registry/ui/learning/atoms/std-learn-slope-probe.orb +1 -1
  437. package/behaviors/registry/ui/learning/atoms/std-learn-speed-drill.orb +1 -1
  438. package/behaviors/registry/ui/learning/atoms/std-learn-stepper.orb +1 -1
  439. package/behaviors/registry/ui/learning/atoms/std-learn-tour-3d.orb +1 -1
  440. package/behaviors/registry/ui/learning/atoms/std-learn-trace-player.orb +1 -1
  441. package/behaviors/registry/ui/learning/atoms/std-learn-transport.orb +1 -1
  442. package/behaviors/registry/ui/learning/atoms/std-learn-tree.orb +1 -1
  443. package/behaviors/registry/ui/learning/atoms/ui-algo-graph-canvas.orb +1 -1
  444. package/behaviors/registry/ui/learning/atoms/ui-algorithm-canvas.orb +1 -1
  445. package/behaviors/registry/ui/learning/atoms/ui-biology-canvas.orb +1 -1
  446. package/behaviors/registry/ui/learning/atoms/ui-chemistry-canvas.orb +1 -1
  447. package/behaviors/registry/ui/learning/atoms/ui-learning-canvas.orb +1 -1
  448. package/behaviors/registry/ui/learning/atoms/ui-math-canvas.orb +1 -1
  449. package/behaviors/registry/ui/learning/atoms/ui-physics-canvas.orb +1 -1
  450. package/dist/behaviors-embeddings.hash.json +2 -2
  451. package/dist/behaviors-embeddings.json +1 -1
  452. package/dist/knob-embeddings.hash.json +2 -2
  453. package/package.json +2 -2
@@ -1 +1 @@
1
- {"name":"std-tutorial-overlay","version":"1.0.0","description":"Tutorial modal with live-demo steps for game boards and learning shells: a paged overlay — title, a live previewTrait frame playing the mechanic via std-tutorial-autodemo (a bare game canvas, no shell chrome), one line of body copy, a step counter, and Back / Next / Skip — composed entirely from registered render types (stack + text + button + trait frame) into the overlay slot, so no new UI component is needed. autoShow opens it on INIT for first-time players; a board's help button re-opens it any time via SHOW (which rewinds to step one). DISMISS (or finishing the last step) marks the run done, clears the overlay, and emits TUTORIAL_DONE so the board can unpause or log. Steps are pure config — a board teaches a new mechanic by adding one { id, title, body, demoId } row plus a previewTrait binding. Corresponds to the design-sheet field(s): feedback, agency.","orbitals":[{"name":"TutorialOverlayOrbital","id":"orb_085MM211YGGZ85MSQP4W89Y5GJ","entity":{"name":"TutorialState","id":"ent_RC0QKPBQ4NVJAPR5XCY7PAN777","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"step","type":"number","default":0},{"name":"done","type":"boolean","default":false}],"shared":true},"traits":[{"name":"TutorialEmptyPreview","id":"trt_7ZRNNP8S6BCK5H7SWMT5WVK7F1","effectRow":[{"kind":"render-ui","resource":"overlay"}],"category":"interaction","linkedEntity":"TutorialState","linkedEntityId":"ent_RC0QKPBQ4NVJAPR5XCY7PAN777","entityRefIds":{"TutorialState":"ent_RC0QKPBQ4NVJAPR5XCY7PAN777"},"stateMachine":{"states":[{"name":"idle","isInitial":true}],"events":[{"key":"INIT","id":"evt_731AWVE8JZ49FXG6HR4TA84TYC","name":"Initialize"}],"transitions":[{"from":"idle","to":"idle","event":"INIT","eventId":"evt_731AWVE8JZ49FXG6HR4TA84TYC","effects":[["render-ui","overlay",null]]}]},"scope":"instance"},{"name":"TutorialOverlay","id":"trt_20MF6XNRMCWA6DA4388Z4T08RD","entityRebindable":true,"entityContract":{"requires":[],"provides":["done","step"]},"effectRow":[{"kind":"emit","resource":"TUTORIAL_DEMO_START"},{"kind":"emit","resource":"TUTORIAL_DEMO_STOP"},{"kind":"emit","resource":"TUTORIAL_DONE"},{"kind":"emit","resource":"TUT_AUTO"},{"kind":"render-ui","resource":"overlay"},{"kind":"set","resource":"@entity.done"},{"kind":"set","resource":"@entity.step"}],"category":"interaction","linkedEntity":"TutorialState","linkedEntityId":"ent_RC0QKPBQ4NVJAPR5XCY7PAN777","entityRefIds":{"TutorialState":"ent_RC0QKPBQ4NVJAPR5XCY7PAN777"},"traitEmbedIds":{"TutorialEmptyPreview":"trt_7ZRNNP8S6BCK5H7SWMT5WVK7F1"},"emits":[{"event":"TUT_AUTO","eventId":"evt_GDDAPJBQYYVZF9AN4C2HPSKSAZ","description":"Self-emitted on INIT when autoShow is on — opens step one. (A config-valued INIT guard would be constant-folded at compose time and misfire; the self-event keeps the decision in an effect.)","tier":"essential","scope":"external","payloadSchema":[{"name":"id","type":"string"}]},{"event":"TUT_NEXT","eventId":"evt_TE7R4RNCXJPES62AZE67CT414J","description":"Advance one step; on the last step it finishes the tutorial (marks done, clears the overlay, emits TUTORIAL_DONE).","tier":"essential","scope":"external","payloadSchema":[{"name":"id","type":"string"}]},{"event":"TUT_BACK","eventId":"evt_9T896GBWF7Y7KJDX8D0AVMDMT3","description":"Return one step (inert on the first).","tier":"essential","scope":"external","payloadSchema":[{"name":"id","type":"string"}]},{"event":"TUT_DISMISS","eventId":"evt_HY867DXMHWT8Y4FF2PRWKT53T3","description":"Skip/close the tutorial; marks done and clears the overlay.","tier":"essential","scope":"external","payloadSchema":[{"name":"id","type":"string"}]},{"event":"SHOW","eventId":"evt_1XBH8PA48J24956KS2VQZ16Q33","description":"Re-open the tutorial from step one — wire a board's help button here.","tier":"essential","scope":"external","payloadSchema":[{"name":"id","type":"string"}]},{"event":"TUTORIAL_DONE","eventId":"evt_A15T659SSMWWT9JY1RM0NKST6H","description":"The tutorial was finished or skipped; boards unpause or log completion.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true}]},{"event":"TUTORIAL_DEMO_START","eventId":"evt_KJ898NHRF4W7J29JM86XJXD889","description":"Emitted when a tutorial step carrying a demoId is shown; the composed std-tutorial-autodemo atom plays that scripted demo.","tier":"domain","scope":"external","payloadSchema":[{"name":"demoId","type":"string","required":true}]},{"event":"TUTORIAL_DEMO_STOP","eventId":"evt_4DMT9YE5QK2VSVM2QCZMXCDNGH","description":"Emitted when the tutorial leaves a demo step (next/back) or is dismissed/finished; the autodemo atom stops and releases control.","tier":"domain","scope":"external"}],"stateMachine":{"states":[{"name":"hidden","isInitial":true},{"name":"showing"}],"events":[{"key":"INIT","id":"evt_4QX6A3R5WW2YED1FFE0392DTN0","name":"Initialize"},{"key":"TUT_AUTO","id":"evt_GDDAPJBQYYVZF9AN4C2HPSKSAZ","name":"Tut Auto","description":"Self-emitted on INIT when autoShow is on — opens step one. (A config-valued INIT guard would be constant-folded at compose time and misfire; the self-event keeps the decision in an effect.)","tier":"essential","payloadSchema":[{"name":"id","type":"string"}]},{"key":"SHOW","id":"evt_1XBH8PA48J24956KS2VQZ16Q33","name":"Show","description":"Re-open the tutorial from step one — wire a board's help button here.","tier":"essential","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"TUT_NEXT","id":"evt_TE7R4RNCXJPES62AZE67CT414J","name":"Tut Next","description":"Advance one step; on the last step it finishes the tutorial (marks done, clears the overlay, emits TUTORIAL_DONE).","tier":"essential","payloadSchema":[{"name":"id","type":"string"}]},{"key":"TUT_BACK","id":"evt_9T896GBWF7Y7KJDX8D0AVMDMT3","name":"Tut Back","description":"Return one step (inert on the first).","tier":"essential","payloadSchema":[{"name":"id","type":"string"}]},{"key":"TUT_DISMISS","id":"evt_HY867DXMHWT8Y4FF2PRWKT53T3","name":"Tut Dismiss","description":"Skip/close the tutorial; marks done and clears the overlay.","tier":"essential","payloadSchema":[{"name":"id","type":"string"}]},{"key":"CLOSE","id":"evt_MK5VA67F9ZQMZK2KM8HDHNJNHF","name":"Close"},{"key":"TUTORIAL_DONE","id":"evt_A15T659SSMWWT9JY1RM0NKST6H","name":"Tutorial Done","description":"The tutorial was finished or skipped; boards unpause or log completion.","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true}]},{"key":"TUTORIAL_DEMO_START","id":"evt_KJ898NHRF4W7J29JM86XJXD889","name":"Tutorial Demo Start","description":"Emitted when a tutorial step carrying a demoId is shown; the composed std-tutorial-autodemo atom plays that scripted demo.","tier":"domain","payloadSchema":[{"name":"demoId","type":"string","required":true}]},{"key":"TUTORIAL_DEMO_STOP","id":"evt_4DMT9YE5QK2VSVM2QCZMXCDNGH","name":"Tutorial Demo Stop","description":"Emitted when the tutorial leaves a demo step (next/back) or is dismissed/finished; the autodemo atom stops and releases control.","tier":"domain"}],"transitions":[{"from":"hidden","to":"hidden","event":"INIT","eventId":"evt_4QX6A3R5WW2YED1FFE0392DTN0","effects":[["if","@config.autoShow",["emit","TUT_AUTO",{"id":"auto"}],["render-ui","overlay",null]]]},{"from":"hidden","to":"showing","event":"TUT_AUTO","eventId":"evt_GDDAPJBQYYVZF9AN4C2HPSKSAZ","guard":"@config.autoShow","effects":[["set","@entity.step",0],["render-ui","overlay",{"type":"stack","direction":"vertical","className":"bg-card text-card-foreground border border-border rounded-lg shadow-lg p-6 max-w-md mx-auto mt-16","children":[{"type":"typography","content":["object/get",["array/nth","@config.steps",0],"title"],"variant":"h4","weight":"bold"},"@config.previewTrait",{"type":"typography","content":["object/get",["array/nth","@config.steps",0],"body"],"variant":"body"},{"type":"typography","content":["str/concat","1 / ",["array/len","@config.steps"]],"variant":"caption","align":"center"},{"type":"stack","direction":"horizontal","justify":"center","className":"pt-2","children":[{"type":"button","label":["if",[">",["array/len","@config.steps"],1],"Next ▶","Got it"],"action":"TUT_NEXT","variant":"primary"},{"type":"button","label":"Skip","action":"TUT_DISMISS","variant":"secondary"}]}]}],["when",["!=",["object/get",["array/nth","@config.steps",0],"demoId",""],""],["do",["emit","TUTORIAL_DEMO_START",{"demoId":["object/get",["array/nth","@config.steps",0],"demoId",""]}]]]]},{"from":"hidden","to":"showing","event":"SHOW","eventId":"evt_1XBH8PA48J24956KS2VQZ16Q33","effects":[["set","@entity.step",0],["render-ui","overlay",{"type":"stack","direction":"vertical","className":"bg-card text-card-foreground border border-border rounded-lg shadow-lg p-6 max-w-md mx-auto mt-16","children":[{"type":"typography","content":["object/get",["array/nth","@config.steps",0],"title"],"variant":"h4","weight":"bold"},"@config.previewTrait",{"type":"typography","content":["object/get",["array/nth","@config.steps",0],"body"],"variant":"body"},{"type":"typography","content":["str/concat","1 / ",["array/len","@config.steps"]],"variant":"caption","align":"center"},{"type":"stack","direction":"horizontal","justify":"center","className":"pt-2","children":[{"type":"button","label":["if",[">",["array/len","@config.steps"],1],"Next ▶","Got it"],"action":"TUT_NEXT","variant":"primary"},{"type":"button","label":"Skip","action":"TUT_DISMISS","variant":"secondary"}]}]}],["when",["!=",["object/get",["array/nth","@config.steps",0],"demoId",""],""],["do",["emit","TUTORIAL_DEMO_START",{"demoId":["object/get",["array/nth","@config.steps",0],"demoId",""]}]]]]},{"from":"showing","to":"hidden","event":"INIT","eventId":"evt_4QX6A3R5WW2YED1FFE0392DTN0","effects":[["render-ui","overlay",null],["if","@config.autoShow",["emit","TUT_AUTO",{"id":"auto"}],["render-ui","overlay",null]]]},{"from":"showing","to":"showing","event":"TUT_NEXT","eventId":"evt_TE7R4RNCXJPES62AZE67CT414J","guard":["<",["+","@entity.step",1],["array/len","@config.steps"]],"effects":[["set","@entity.step",["+","@entity.step",1]],["render-ui","overlay",{"type":"stack","direction":"vertical","className":"bg-card text-card-foreground border border-border rounded-lg shadow-lg p-6 max-w-md mx-auto mt-16","children":[{"type":"typography","content":["object/get",["array/nth","@config.steps","@entity.step"],"title"],"variant":"h4","weight":"bold"},"@config.previewTrait",{"type":"typography","content":["object/get",["array/nth","@config.steps","@entity.step"],"body"],"variant":"body"},{"type":"typography","content":["str/concat",["+","@entity.step",1]," / ",["array/len","@config.steps"]],"variant":"caption","align":"center"},{"type":"stack","direction":"horizontal","justify":"center","className":"pt-2","children":[{"type":"button","label":"◀ Back","action":"TUT_BACK","variant":"secondary"},{"type":"button","label":["if",["<",["+","@entity.step",1],["array/len","@config.steps"]],"Next ▶","Got it"],"action":"TUT_NEXT","variant":"primary"},{"type":"button","label":"Skip","action":"TUT_DISMISS","variant":"secondary"}]}]}],["emit","TUTORIAL_DEMO_STOP",{}],["when",["!=",["object/get",["array/nth","@config.steps","@entity.step"],"demoId",""],""],["do",["emit","TUTORIAL_DEMO_START",{"demoId":["object/get",["array/nth","@config.steps","@entity.step"],"demoId",""]}]]]]},{"from":"showing","to":"hidden","event":"TUT_NEXT","eventId":"evt_TE7R4RNCXJPES62AZE67CT414J","guard":[">=",["+","@entity.step",1],["array/len","@config.steps"]],"effects":[["set","@entity.done",true],["render-ui","overlay",null],["emit","TUTORIAL_DEMO_STOP",{}],["emit","TUTORIAL_DONE",{"id":"tutorial"}]]},{"from":"showing","to":"showing","event":"TUT_BACK","eventId":"evt_9T896GBWF7Y7KJDX8D0AVMDMT3","guard":[">","@entity.step",0],"effects":[["set","@entity.step",["-","@entity.step",1]],["render-ui","overlay",{"type":"stack","direction":"vertical","className":"bg-card text-card-foreground border border-border rounded-lg shadow-lg p-6 max-w-md mx-auto mt-16","children":[{"type":"typography","content":["object/get",["array/nth","@config.steps","@entity.step"],"title"],"variant":"h4","weight":"bold"},"@config.previewTrait",{"type":"typography","content":["object/get",["array/nth","@config.steps","@entity.step"],"body"],"variant":"body"},{"type":"typography","content":["str/concat",["+","@entity.step",1]," / ",["array/len","@config.steps"]],"variant":"caption","align":"center"},{"type":"stack","direction":"horizontal","justify":"center","className":"pt-2","children":[{"type":"button","label":"◀ Back","action":"TUT_BACK","variant":"secondary"},{"type":"button","label":["if",["<",["+","@entity.step",1],["array/len","@config.steps"]],"Next ▶","Got it"],"action":"TUT_NEXT","variant":"primary"},{"type":"button","label":"Skip","action":"TUT_DISMISS","variant":"secondary"}]}]}],["emit","TUTORIAL_DEMO_STOP",{}],["when",["!=",["object/get",["array/nth","@config.steps","@entity.step"],"demoId",""],""],["do",["emit","TUTORIAL_DEMO_START",{"demoId":["object/get",["array/nth","@config.steps","@entity.step"],"demoId",""]}]]]]},{"from":"showing","to":"hidden","event":"TUT_DISMISS","eventId":"evt_HY867DXMHWT8Y4FF2PRWKT53T3","effects":[["set","@entity.done",true],["render-ui","overlay",null],["emit","TUTORIAL_DEMO_STOP",{}],["emit","TUTORIAL_DONE",{"id":"tutorial"}]]},{"from":"showing","to":"hidden","event":"CLOSE","eventId":"evt_MK5VA67F9ZQMZK2KM8HDHNJNHF","effects":[["set","@entity.done",true],["render-ui","overlay",null],["emit","TUTORIAL_DEMO_STOP",{}],["emit","TUTORIAL_DONE",{"id":"tutorial"}]]}]},"config":{"autoShow":{"type":"boolean","default":true,"label":"Auto Show","description":"When true the tutorial opens on INIT for this run; when false it stays hidden until SHOW.","tier":"domain"},"steps":{"type":"[TutorialStep]","default":[],"label":"Steps","description":"One row per tutorial page: title, one line of body copy, and an optional demoId that plays a scripted live demo (std-tutorial-autodemo) for the mechanic being taught.","tier":"presentation","items":{"type":"object","properties":{"demoId":{"name":"demoId","type":"string","required":false},"title":{"name":"title","type":"string","required":true},"id":{"name":"id","type":"string","required":true},"body":{"name":"body","type":"string","required":false}}}},"previewTrait":{"type":"trait","default":"@trait.TutorialEmptyPreview","label":"Preview trait","description":"Trait rendered in the media position of the modal — the live, demo-driven preview of the mechanic (a bare game canvas, no shell chrome). '@trait.TutorialEmptyPreview' leaves the slot blank. Override with '@trait.<TraitName>' to show a board's live frame.","tier":"presentation","refId":"trt_7ZRNNP8S6BCK5H7SWMT5WVK7F1"}},"scope":"instance"}],"pages":[{"name":"TutorialOverlayPage","id":"pag_YF62W6VNSWTWY9WJQQK5MFC0V8","path":"/tutorial-overlay","traits":[{"ref":"TutorialOverlay","refId":"trt_20MF6XNRMCWA6DA4388Z4T08RD"}]}],"types":{"TutorialStep":[{"name":"id","type":"string","required":true},{"name":"title","type":"string","required":true},{"name":"body","type":"string"},{"name":"demoId","type":"string"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_RC0QKPBQ4NVJAPR5XCY7PAN777":{"id":"ent_RC0QKPBQ4NVJAPR5XCY7PAN777","kind":"entity","bakedName":"TutorialState","curName":"TutorialState","renames":[],"owner":"workspace"},"evt_1XBH8PA48J24956KS2VQZ16Q33":{"id":"evt_1XBH8PA48J24956KS2VQZ16Q33","kind":"event","bakedName":"SHOW","curName":"SHOW","renames":[],"owner":"workspace","parent":"trt_20MF6XNRMCWA6DA4388Z4T08RD"},"evt_4DMT9YE5QK2VSVM2QCZMXCDNGH":{"id":"evt_4DMT9YE5QK2VSVM2QCZMXCDNGH","kind":"event","bakedName":"TUTORIAL_DEMO_STOP","curName":"TUTORIAL_DEMO_STOP","renames":[],"owner":"workspace","parent":"trt_20MF6XNRMCWA6DA4388Z4T08RD"},"evt_4QX6A3R5WW2YED1FFE0392DTN0":{"id":"evt_4QX6A3R5WW2YED1FFE0392DTN0","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_20MF6XNRMCWA6DA4388Z4T08RD"},"evt_731AWVE8JZ49FXG6HR4TA84TYC":{"id":"evt_731AWVE8JZ49FXG6HR4TA84TYC","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_7ZRNNP8S6BCK5H7SWMT5WVK7F1"},"evt_9T896GBWF7Y7KJDX8D0AVMDMT3":{"id":"evt_9T896GBWF7Y7KJDX8D0AVMDMT3","kind":"event","bakedName":"TUT_BACK","curName":"TUT_BACK","renames":[],"owner":"workspace","parent":"trt_20MF6XNRMCWA6DA4388Z4T08RD"},"evt_A15T659SSMWWT9JY1RM0NKST6H":{"id":"evt_A15T659SSMWWT9JY1RM0NKST6H","kind":"event","bakedName":"TUTORIAL_DONE","curName":"TUTORIAL_DONE","renames":[],"owner":"workspace","parent":"trt_20MF6XNRMCWA6DA4388Z4T08RD"},"evt_GDDAPJBQYYVZF9AN4C2HPSKSAZ":{"id":"evt_GDDAPJBQYYVZF9AN4C2HPSKSAZ","kind":"event","bakedName":"TUT_AUTO","curName":"TUT_AUTO","renames":[],"owner":"workspace","parent":"trt_20MF6XNRMCWA6DA4388Z4T08RD"},"evt_HY867DXMHWT8Y4FF2PRWKT53T3":{"id":"evt_HY867DXMHWT8Y4FF2PRWKT53T3","kind":"event","bakedName":"TUT_DISMISS","curName":"TUT_DISMISS","renames":[],"owner":"workspace","parent":"trt_20MF6XNRMCWA6DA4388Z4T08RD"},"evt_KJ898NHRF4W7J29JM86XJXD889":{"id":"evt_KJ898NHRF4W7J29JM86XJXD889","kind":"event","bakedName":"TUTORIAL_DEMO_START","curName":"TUTORIAL_DEMO_START","renames":[],"owner":"workspace","parent":"trt_20MF6XNRMCWA6DA4388Z4T08RD"},"evt_MK5VA67F9ZQMZK2KM8HDHNJNHF":{"id":"evt_MK5VA67F9ZQMZK2KM8HDHNJNHF","kind":"event","bakedName":"CLOSE","curName":"CLOSE","renames":[],"owner":"workspace","parent":"trt_20MF6XNRMCWA6DA4388Z4T08RD"},"evt_TE7R4RNCXJPES62AZE67CT414J":{"id":"evt_TE7R4RNCXJPES62AZE67CT414J","kind":"event","bakedName":"TUT_NEXT","curName":"TUT_NEXT","renames":[],"owner":"workspace","parent":"trt_20MF6XNRMCWA6DA4388Z4T08RD"},"orb_085MM211YGGZ85MSQP4W89Y5GJ":{"id":"orb_085MM211YGGZ85MSQP4W89Y5GJ","kind":"orbital","bakedName":"TutorialOverlayOrbital","curName":"TutorialOverlayOrbital","renames":[],"owner":"workspace"},"pag_YF62W6VNSWTWY9WJQQK5MFC0V8":{"id":"pag_YF62W6VNSWTWY9WJQQK5MFC0V8","kind":"page","bakedName":"TutorialOverlayPage","curName":"TutorialOverlayPage","renames":[],"owner":"workspace"},"trt_20MF6XNRMCWA6DA4388Z4T08RD":{"id":"trt_20MF6XNRMCWA6DA4388Z4T08RD","kind":"trait","bakedName":"TutorialOverlay","curName":"TutorialOverlay","renames":[],"owner":"workspace"},"trt_7ZRNNP8S6BCK5H7SWMT5WVK7F1":{"id":"trt_7ZRNNP8S6BCK5H7SWMT5WVK7F1","kind":"trait","bakedName":"TutorialEmptyPreview","curName":"TutorialEmptyPreview","renames":[],"owner":"workspace"}}}}
1
+ {"name":"std-tutorial-overlay","version":"1.0.0","description":"Tutorial modal with live-demo steps for game boards and learning shells: a paged overlay — title, a live previewTrait frame playing the mechanic via std-tutorial-autodemo (a bare game canvas, no shell chrome), one line of body copy, a step counter, and Back / Next / Skip — composed entirely from registered render types (stack + text + button + trait frame) into the overlay slot, so no new UI component is needed. autoShow opens it on INIT for first-time players; a board's help button re-opens it any time via SHOW (which rewinds to step one). DISMISS (or finishing the last step) marks the run done, clears the overlay, and emits TUTORIAL_DONE so the board can unpause or log. Steps are pure config — a board teaches a new mechanic by adding one { id, title, body, demoId } row plus a previewTrait binding. Corresponds to the design-sheet field(s): feedback, agency.","orbitals":[{"name":"TutorialOverlayOrbital","id":"orb_085MM211YGGZ85MSQP4W89Y5GJ","entity":{"name":"TutorialState","id":"ent_RC0QKPBQ4NVJAPR5XCY7PAN777","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"step","type":"number","default":0},{"name":"done","type":"boolean","default":false}],"shared":true},"traits":[{"name":"TutorialEmptyPreview","id":"trt_7ZRNNP8S6BCK5H7SWMT5WVK7F1","effectRow":[{"kind":"render-ui","resource":"overlay"}],"category":"interaction","linkedEntity":"TutorialState","linkedEntityId":"ent_RC0QKPBQ4NVJAPR5XCY7PAN777","entityRefIds":{"TutorialState":"ent_RC0QKPBQ4NVJAPR5XCY7PAN777"},"stateMachine":{"states":[{"name":"idle","isInitial":true}],"events":[{"key":"INIT","id":"evt_731AWVE8JZ49FXG6HR4TA84TYC","name":"Initialize"}],"transitions":[{"from":"idle","to":"idle","event":"INIT","eventId":"evt_731AWVE8JZ49FXG6HR4TA84TYC","effects":[["render-ui","overlay",null]]}]},"scope":"instance"},{"name":"TutorialOverlay","id":"trt_20MF6XNRMCWA6DA4388Z4T08RD","entityRebindable":true,"entityContract":{"requires":[],"provides":["done","step"]},"effectRow":[{"kind":"emit","resource":"TUTORIAL_DEMO_START"},{"kind":"emit","resource":"TUTORIAL_DEMO_STOP"},{"kind":"emit","resource":"TUTORIAL_DONE"},{"kind":"emit","resource":"TUT_AUTO"},{"kind":"render-ui","resource":"overlay"},{"kind":"set","resource":"@entity.done"},{"kind":"set","resource":"@entity.step"}],"category":"interaction","linkedEntity":"TutorialState","linkedEntityId":"ent_RC0QKPBQ4NVJAPR5XCY7PAN777","entityRefIds":{"TutorialState":"ent_RC0QKPBQ4NVJAPR5XCY7PAN777"},"traitEmbedIds":{"TutorialEmptyPreview":"trt_7ZRNNP8S6BCK5H7SWMT5WVK7F1"},"emits":[{"event":"TUT_AUTO","eventId":"evt_GDDAPJBQYYVZF9AN4C2HPSKSAZ","description":"Self-emitted on INIT when autoShow is on — opens step one. (A config-valued INIT guard would be constant-folded at compose time and misfire; the self-event keeps the decision in an effect.)","tier":"essential","scope":"external","payloadSchema":[{"name":"id","type":"string"}]},{"event":"TUT_NEXT","eventId":"evt_TE7R4RNCXJPES62AZE67CT414J","description":"Advance one step; on the last step it finishes the tutorial (marks done, clears the overlay, emits TUTORIAL_DONE).","tier":"essential","scope":"external","payloadSchema":[{"name":"id","type":"string"}]},{"event":"TUT_BACK","eventId":"evt_9T896GBWF7Y7KJDX8D0AVMDMT3","description":"Return one step (inert on the first).","tier":"essential","scope":"external","payloadSchema":[{"name":"id","type":"string"}]},{"event":"TUT_DISMISS","eventId":"evt_HY867DXMHWT8Y4FF2PRWKT53T3","description":"Skip/close the tutorial; marks done and clears the overlay.","tier":"essential","scope":"external","payloadSchema":[{"name":"id","type":"string"}]},{"event":"SHOW","eventId":"evt_1XBH8PA48J24956KS2VQZ16Q33","description":"Re-open the tutorial from step one — wire a board's help button here.","tier":"essential","scope":"external","payloadSchema":[{"name":"id","type":"string"}]},{"event":"TUTORIAL_DONE","eventId":"evt_A15T659SSMWWT9JY1RM0NKST6H","description":"The tutorial was finished or skipped; boards unpause or log completion.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true}]},{"event":"TUTORIAL_DEMO_START","eventId":"evt_KJ898NHRF4W7J29JM86XJXD889","description":"Emitted when a tutorial step carrying a demoId is shown; the composed std-tutorial-autodemo atom plays that scripted demo.","tier":"domain","scope":"external","payloadSchema":[{"name":"demoId","type":"string","required":true}]},{"event":"TUTORIAL_DEMO_STOP","eventId":"evt_4DMT9YE5QK2VSVM2QCZMXCDNGH","description":"Emitted when the tutorial leaves a demo step (next/back) or is dismissed/finished; the autodemo atom stops and releases control.","tier":"domain","scope":"external"}],"stateMachine":{"states":[{"name":"hidden","isInitial":true},{"name":"showing"}],"events":[{"key":"INIT","id":"evt_4QX6A3R5WW2YED1FFE0392DTN0","name":"Initialize"},{"key":"TUT_AUTO","id":"evt_GDDAPJBQYYVZF9AN4C2HPSKSAZ","name":"Tut Auto","description":"Self-emitted on INIT when autoShow is on — opens step one. (A config-valued INIT guard would be constant-folded at compose time and misfire; the self-event keeps the decision in an effect.)","tier":"essential","payloadSchema":[{"name":"id","type":"string"}]},{"key":"SHOW","id":"evt_1XBH8PA48J24956KS2VQZ16Q33","name":"Show","description":"Re-open the tutorial from step one — wire a board's help button here.","tier":"essential","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"TUT_NEXT","id":"evt_TE7R4RNCXJPES62AZE67CT414J","name":"Tut Next","description":"Advance one step; on the last step it finishes the tutorial (marks done, clears the overlay, emits TUTORIAL_DONE).","tier":"essential","payloadSchema":[{"name":"id","type":"string"}]},{"key":"TUT_BACK","id":"evt_9T896GBWF7Y7KJDX8D0AVMDMT3","name":"Tut Back","description":"Return one step (inert on the first).","tier":"essential","payloadSchema":[{"name":"id","type":"string"}]},{"key":"TUT_DISMISS","id":"evt_HY867DXMHWT8Y4FF2PRWKT53T3","name":"Tut Dismiss","description":"Skip/close the tutorial; marks done and clears the overlay.","tier":"essential","payloadSchema":[{"name":"id","type":"string"}]},{"key":"CLOSE","id":"evt_MK5VA67F9ZQMZK2KM8HDHNJNHF","name":"Close"},{"key":"TUTORIAL_DONE","id":"evt_A15T659SSMWWT9JY1RM0NKST6H","name":"Tutorial Done","description":"The tutorial was finished or skipped; boards unpause or log completion.","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true}]},{"key":"TUTORIAL_DEMO_START","id":"evt_KJ898NHRF4W7J29JM86XJXD889","name":"Tutorial Demo Start","description":"Emitted when a tutorial step carrying a demoId is shown; the composed std-tutorial-autodemo atom plays that scripted demo.","tier":"domain","payloadSchema":[{"name":"demoId","type":"string","required":true}]},{"key":"TUTORIAL_DEMO_STOP","id":"evt_4DMT9YE5QK2VSVM2QCZMXCDNGH","name":"Tutorial Demo Stop","description":"Emitted when the tutorial leaves a demo step (next/back) or is dismissed/finished; the autodemo atom stops and releases control.","tier":"domain"}],"transitions":[{"from":"hidden","to":"hidden","event":"INIT","eventId":"evt_4QX6A3R5WW2YED1FFE0392DTN0","effects":[["if","@config.autoShow",["emit","TUT_AUTO",{"id":"auto"}],["render-ui","overlay",null]]]},{"from":"hidden","to":"showing","event":"TUT_AUTO","eventId":"evt_GDDAPJBQYYVZF9AN4C2HPSKSAZ","guard":"@config.autoShow","effects":[["set","@entity.step",0],["render-ui","overlay",{"type":"stack","direction":"vertical","className":"bg-card text-card-foreground border border-border rounded-lg shadow-lg p-6 max-w-md mx-auto mt-16","children":[{"type":"typography","content":["object/get",["array/nth","@config.steps",0],"title"],"variant":"h4","weight":"bold"},"@config.previewTrait",{"type":"typography","content":["object/get",["array/nth","@config.steps",0],"body"],"variant":"body"},{"type":"typography","content":["str/concat","1 / ",["array/len","@config.steps"]],"variant":"caption","align":"center"},{"type":"stack","direction":"horizontal","justify":"center","className":"pt-2","children":[{"type":"button","label":["if",[">",["array/len","@config.steps"],1],"Next ▶","Got it"],"action":"TUT_NEXT","variant":"primary"},{"type":"button","label":"Skip","action":"TUT_DISMISS","variant":"secondary"}]}]}],["when",["!=",["object/get",["array/nth","@config.steps",0],"demoId",""],""],["do",["emit","TUTORIAL_DEMO_START",{"demoId":["object/get",["array/nth","@config.steps",0],"demoId",""]}]]]]},{"from":"hidden","to":"showing","event":"SHOW","eventId":"evt_1XBH8PA48J24956KS2VQZ16Q33","effects":[["set","@entity.step",0],["render-ui","overlay",{"type":"stack","direction":"vertical","className":"bg-card text-card-foreground border border-border rounded-lg shadow-lg p-6 max-w-md mx-auto mt-16","children":[{"type":"typography","content":["object/get",["array/nth","@config.steps",0],"title"],"variant":"h4","weight":"bold"},"@config.previewTrait",{"type":"typography","content":["object/get",["array/nth","@config.steps",0],"body"],"variant":"body"},{"type":"typography","content":["str/concat","1 / ",["array/len","@config.steps"]],"variant":"caption","align":"center"},{"type":"stack","direction":"horizontal","justify":"center","className":"pt-2","children":[{"type":"button","label":["if",[">",["array/len","@config.steps"],1],"Next ▶","Got it"],"action":"TUT_NEXT","variant":"primary"},{"type":"button","label":"Skip","action":"TUT_DISMISS","variant":"secondary"}]}]}],["when",["!=",["object/get",["array/nth","@config.steps",0],"demoId",""],""],["do",["emit","TUTORIAL_DEMO_START",{"demoId":["object/get",["array/nth","@config.steps",0],"demoId",""]}]]]]},{"from":"showing","to":"hidden","event":"INIT","eventId":"evt_4QX6A3R5WW2YED1FFE0392DTN0","effects":[["render-ui","overlay",null],["if","@config.autoShow",["emit","TUT_AUTO",{"id":"auto"}],["render-ui","overlay",null]]]},{"from":"showing","to":"showing","event":"TUT_NEXT","eventId":"evt_TE7R4RNCXJPES62AZE67CT414J","guard":["<",["+","@entity.step",1],["array/len","@config.steps"]],"effects":[["set","@entity.step",["+","@entity.step",1]],["render-ui","overlay",{"type":"stack","direction":"vertical","className":"bg-card text-card-foreground border border-border rounded-lg shadow-lg p-6 max-w-md mx-auto mt-16","children":[{"type":"typography","content":["object/get",["array/nth","@config.steps","@entity.step"],"title"],"variant":"h4","weight":"bold"},"@config.previewTrait",{"type":"typography","content":["object/get",["array/nth","@config.steps","@entity.step"],"body"],"variant":"body"},{"type":"typography","content":["str/concat",["+","@entity.step",1]," / ",["array/len","@config.steps"]],"variant":"caption","align":"center"},{"type":"stack","direction":"horizontal","justify":"center","className":"pt-2","children":[{"type":"button","label":"◀ Back","action":"TUT_BACK","variant":"secondary"},{"type":"button","label":["if",["<",["+","@entity.step",1],["array/len","@config.steps"]],"Next ▶","Got it"],"action":"TUT_NEXT","variant":"primary"},{"type":"button","label":"Skip","action":"TUT_DISMISS","variant":"secondary"}]}]}],["emit","TUTORIAL_DEMO_STOP",{}],["when",["!=",["object/get",["array/nth","@config.steps","@entity.step"],"demoId",""],""],["do",["emit","TUTORIAL_DEMO_START",{"demoId":["object/get",["array/nth","@config.steps","@entity.step"],"demoId",""]}]]]]},{"from":"showing","to":"hidden","event":"TUT_NEXT","eventId":"evt_TE7R4RNCXJPES62AZE67CT414J","guard":[">=",["+","@entity.step",1],["array/len","@config.steps"]],"effects":[["set","@entity.done",true],["render-ui","overlay",null],["emit","TUTORIAL_DEMO_STOP",{}],["emit","TUTORIAL_DONE",{"id":"tutorial"}]]},{"from":"showing","to":"showing","event":"TUT_BACK","eventId":"evt_9T896GBWF7Y7KJDX8D0AVMDMT3","guard":[">","@entity.step",0],"effects":[["set","@entity.step",["-","@entity.step",1]],["render-ui","overlay",{"type":"stack","direction":"vertical","className":"bg-card text-card-foreground border border-border rounded-lg shadow-lg p-6 max-w-md mx-auto mt-16","children":[{"type":"typography","content":["object/get",["array/nth","@config.steps","@entity.step"],"title"],"variant":"h4","weight":"bold"},"@config.previewTrait",{"type":"typography","content":["object/get",["array/nth","@config.steps","@entity.step"],"body"],"variant":"body"},{"type":"typography","content":["str/concat",["+","@entity.step",1]," / ",["array/len","@config.steps"]],"variant":"caption","align":"center"},{"type":"stack","direction":"horizontal","justify":"center","className":"pt-2","children":[{"type":"button","label":"◀ Back","action":"TUT_BACK","variant":"secondary"},{"type":"button","label":["if",["<",["+","@entity.step",1],["array/len","@config.steps"]],"Next ▶","Got it"],"action":"TUT_NEXT","variant":"primary"},{"type":"button","label":"Skip","action":"TUT_DISMISS","variant":"secondary"}]}]}],["emit","TUTORIAL_DEMO_STOP",{}],["when",["!=",["object/get",["array/nth","@config.steps","@entity.step"],"demoId",""],""],["do",["emit","TUTORIAL_DEMO_START",{"demoId":["object/get",["array/nth","@config.steps","@entity.step"],"demoId",""]}]]]]},{"from":"showing","to":"hidden","event":"TUT_DISMISS","eventId":"evt_HY867DXMHWT8Y4FF2PRWKT53T3","effects":[["set","@entity.done",true],["render-ui","overlay",null],["emit","TUTORIAL_DEMO_STOP",{}],["emit","TUTORIAL_DONE",{"id":"tutorial"}]]},{"from":"showing","to":"hidden","event":"CLOSE","eventId":"evt_MK5VA67F9ZQMZK2KM8HDHNJNHF","effects":[["set","@entity.done",true],["render-ui","overlay",null],["emit","TUTORIAL_DEMO_STOP",{}],["emit","TUTORIAL_DONE",{"id":"tutorial"}]]}]},"config":{"autoShow":{"type":"boolean","default":true,"label":"Auto Show","description":"When true the tutorial opens on INIT for this run; when false it stays hidden until SHOW.","tier":"domain"},"steps":{"type":"[TutorialStep]","default":[],"label":"Steps","description":"One row per tutorial page: title, one line of body copy, and an optional demoId that plays a scripted live demo (std-tutorial-autodemo) for the mechanic being taught.","tier":"presentation","items":{"type":"object","properties":{"demoId":{"name":"demoId","type":"string","required":false},"id":{"name":"id","type":"string","required":true},"body":{"name":"body","type":"string","required":false},"title":{"name":"title","type":"string","required":true}}}},"previewTrait":{"type":"trait","default":"@trait.TutorialEmptyPreview","label":"Preview trait","description":"Trait rendered in the media position of the modal — the live, demo-driven preview of the mechanic (a bare game canvas, no shell chrome). '@trait.TutorialEmptyPreview' leaves the slot blank. Override with '@trait.<TraitName>' to show a board's live frame.","tier":"presentation","refId":"trt_7ZRNNP8S6BCK5H7SWMT5WVK7F1"}},"scope":"instance"}],"pages":[{"name":"TutorialOverlayPage","id":"pag_YF62W6VNSWTWY9WJQQK5MFC0V8","path":"/tutorial-overlay","traits":[{"ref":"TutorialOverlay","refId":"trt_20MF6XNRMCWA6DA4388Z4T08RD"}]}],"types":{"TutorialStep":[{"name":"id","type":"string","required":true},{"name":"title","type":"string","required":true},{"name":"body","type":"string"},{"name":"demoId","type":"string"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_RC0QKPBQ4NVJAPR5XCY7PAN777":{"id":"ent_RC0QKPBQ4NVJAPR5XCY7PAN777","kind":"entity","bakedName":"TutorialState","curName":"TutorialState","renames":[],"owner":"workspace"},"evt_1XBH8PA48J24956KS2VQZ16Q33":{"id":"evt_1XBH8PA48J24956KS2VQZ16Q33","kind":"event","bakedName":"SHOW","curName":"SHOW","renames":[],"owner":"workspace","parent":"trt_20MF6XNRMCWA6DA4388Z4T08RD"},"evt_4DMT9YE5QK2VSVM2QCZMXCDNGH":{"id":"evt_4DMT9YE5QK2VSVM2QCZMXCDNGH","kind":"event","bakedName":"TUTORIAL_DEMO_STOP","curName":"TUTORIAL_DEMO_STOP","renames":[],"owner":"workspace","parent":"trt_20MF6XNRMCWA6DA4388Z4T08RD"},"evt_4QX6A3R5WW2YED1FFE0392DTN0":{"id":"evt_4QX6A3R5WW2YED1FFE0392DTN0","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_20MF6XNRMCWA6DA4388Z4T08RD"},"evt_731AWVE8JZ49FXG6HR4TA84TYC":{"id":"evt_731AWVE8JZ49FXG6HR4TA84TYC","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_7ZRNNP8S6BCK5H7SWMT5WVK7F1"},"evt_9T896GBWF7Y7KJDX8D0AVMDMT3":{"id":"evt_9T896GBWF7Y7KJDX8D0AVMDMT3","kind":"event","bakedName":"TUT_BACK","curName":"TUT_BACK","renames":[],"owner":"workspace","parent":"trt_20MF6XNRMCWA6DA4388Z4T08RD"},"evt_A15T659SSMWWT9JY1RM0NKST6H":{"id":"evt_A15T659SSMWWT9JY1RM0NKST6H","kind":"event","bakedName":"TUTORIAL_DONE","curName":"TUTORIAL_DONE","renames":[],"owner":"workspace","parent":"trt_20MF6XNRMCWA6DA4388Z4T08RD"},"evt_GDDAPJBQYYVZF9AN4C2HPSKSAZ":{"id":"evt_GDDAPJBQYYVZF9AN4C2HPSKSAZ","kind":"event","bakedName":"TUT_AUTO","curName":"TUT_AUTO","renames":[],"owner":"workspace","parent":"trt_20MF6XNRMCWA6DA4388Z4T08RD"},"evt_HY867DXMHWT8Y4FF2PRWKT53T3":{"id":"evt_HY867DXMHWT8Y4FF2PRWKT53T3","kind":"event","bakedName":"TUT_DISMISS","curName":"TUT_DISMISS","renames":[],"owner":"workspace","parent":"trt_20MF6XNRMCWA6DA4388Z4T08RD"},"evt_KJ898NHRF4W7J29JM86XJXD889":{"id":"evt_KJ898NHRF4W7J29JM86XJXD889","kind":"event","bakedName":"TUTORIAL_DEMO_START","curName":"TUTORIAL_DEMO_START","renames":[],"owner":"workspace","parent":"trt_20MF6XNRMCWA6DA4388Z4T08RD"},"evt_MK5VA67F9ZQMZK2KM8HDHNJNHF":{"id":"evt_MK5VA67F9ZQMZK2KM8HDHNJNHF","kind":"event","bakedName":"CLOSE","curName":"CLOSE","renames":[],"owner":"workspace","parent":"trt_20MF6XNRMCWA6DA4388Z4T08RD"},"evt_TE7R4RNCXJPES62AZE67CT414J":{"id":"evt_TE7R4RNCXJPES62AZE67CT414J","kind":"event","bakedName":"TUT_NEXT","curName":"TUT_NEXT","renames":[],"owner":"workspace","parent":"trt_20MF6XNRMCWA6DA4388Z4T08RD"},"orb_085MM211YGGZ85MSQP4W89Y5GJ":{"id":"orb_085MM211YGGZ85MSQP4W89Y5GJ","kind":"orbital","bakedName":"TutorialOverlayOrbital","curName":"TutorialOverlayOrbital","renames":[],"owner":"workspace"},"pag_YF62W6VNSWTWY9WJQQK5MFC0V8":{"id":"pag_YF62W6VNSWTWY9WJQQK5MFC0V8","kind":"page","bakedName":"TutorialOverlayPage","curName":"TutorialOverlayPage","renames":[],"owner":"workspace"},"trt_20MF6XNRMCWA6DA4388Z4T08RD":{"id":"trt_20MF6XNRMCWA6DA4388Z4T08RD","kind":"trait","bakedName":"TutorialOverlay","curName":"TutorialOverlay","renames":[],"owner":"workspace"},"trt_7ZRNNP8S6BCK5H7SWMT5WVK7F1":{"id":"trt_7ZRNNP8S6BCK5H7SWMT5WVK7F1","kind":"trait","bakedName":"TutorialEmptyPreview","curName":"TutorialEmptyPreview","renames":[],"owner":"workspace"}}}}
@@ -1 +1 @@
1
- {"name":"std-velocity-gate","version":"1.0.0","description":"Headless velocity-gate mechanic: gates that open only when the player crosses them inside a speed band, optionally in a required direction, optionally sustained for a dwell. Listens BODY_MOVED and, per closed gate, tests the player's rect (padded by reachMargin), their speed against [minSpeed, maxSpeed], and their horizontal direction against dir (0 = either). Instant gates (dwellMs 0) open on the first passing cross; dwell gates (dwellMs > 0) accumulate ~33ms per passing move and open once held reaches dwellMs — a failing move resets the hold. The first newly opened gate emits VELOCITY_GATE_OPENED (the shared entity carries the rest). Entering a closed INSTANT gate while NOT passing emits VELOCITY_GATE_DENIED once per approach — re-arming only after the player steps out — so the board can answer with a PLACE back and a hint fx; dwell gates never deny (a hot entry is fine — coming to rest inside is the point), a failed hold simply resets. RESTART re-closes every live gate (re-arming the live entity set, so SET_VGATES-injected gates survive respawns). SET_VGATES replaces the gate set at runtime for boards that import their gates. Renders nothing; boards draw the gate band/chest and read open/held from the shared entity (the render authority). Corresponds to the design-sheet field(s): challenge, mechanics.","orbitals":[{"name":"VelocityGateOrbital","id":"orb_A9XD83X8HXM8YJ10B41B6ZBQ6W","entity":{"name":"VelocityGateData","id":"ent_11F5ZSKXZ4YZJA56TRHE7JB2T9","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"gates","type":"array","default":[],"items":{"type":"object","properties":{"held":{"name":"held","type":"number","required":false},"height":{"name":"height","type":"number","required":true},"reported":{"name":"reported","type":"boolean","required":false},"hint":{"name":"hint","type":"string","required":false},"dir":{"name":"dir","type":"number","required":true},"open":{"name":"open","type":"boolean","required":false},"denied":{"name":"denied","type":"boolean","required":false},"width":{"name":"width","type":"number","required":true},"touching":{"name":"touching","type":"boolean","required":false},"maxSpeed":{"name":"maxSpeed","type":"number","required":true},"id":{"name":"id","type":"string","required":true},"y":{"name":"y","type":"number","required":true},"minSpeed":{"name":"minSpeed","type":"number","required":true},"x":{"name":"x","type":"number","required":true},"dwellMs":{"name":"dwellMs","type":"number","required":true}}}}],"shared":true},"traits":[{"name":"VelocityGate","id":"trt_WTJPF9AS23CH1M1M57GXTY30F9","entityRebindable":true,"entityContract":{"requires":[],"provides":["gates"]},"effectRow":[{"kind":"emit","resource":"VELOCITY_GATE_DENIED"},{"kind":"emit","resource":"VELOCITY_GATE_OPENED"},{"kind":"set","resource":"@entity.gates"}],"category":"lifecycle","linkedEntity":"VelocityGateData","linkedEntityId":"ent_11F5ZSKXZ4YZJA56TRHE7JB2T9","entityRefIds":{"VelocityGateData":"ent_11F5ZSKXZ4YZJA56TRHE7JB2T9"},"emits":[{"event":"VELOCITY_GATE_OPENED","eventId":"evt_RF817QV9HRMRW7CH192PGZW7RK","description":"A gate's speed band was satisfied (instantly, or held for its dwell) and it flipped open; boards layer treasure fx and rewards. When several gates open on one move, the first reports and the shared entity carries the rest.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"event":"VELOCITY_GATE_DENIED","eventId":"evt_DZWN69D22RH1CE3QBMYVXDZ691","description":"The player entered a closed gate outside its speed band or against its direction; fires once per approach and re-arms after they step out. Boards answer with a PLACE back plus a hint fx.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"speed","type":"number","required":true}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_0J8B29RTT7DD3SCGB2F4Y16D19","name":"Initialize"},{"key":"BODY_MOVED","id":"evt_E9DKKZ24VC2DPFHA1K9HV3BG8S","name":"Body Moved","payloadSchema":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"vx","type":"number","required":true},{"name":"vy","type":"number","required":true},{"name":"grounded","type":"boolean","required":true},{"name":"skating","type":"boolean","required":true},{"name":"speed","type":"number","required":true}],"listened":true},{"key":"SET_VGATES","id":"evt_5P651ZJFX87YMDMG8K1XN2AVN5","name":"Set Vgates","payloadSchema":[{"name":"gates","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"width","type":"number","required":true},{"name":"height","type":"number","required":true},{"name":"minSpeed","type":"number","required":true},{"name":"maxSpeed","type":"number","required":true},{"name":"dwellMs","type":"number","required":true},{"name":"dir","type":"number","required":true},{"name":"hint","type":"string"},{"name":"open","type":"boolean"},{"name":"touching","type":"boolean"},{"name":"denied","type":"boolean"},{"name":"held","type":"number"},{"name":"reported","type":"boolean"}]}],"listened":true},{"key":"RESTART","id":"evt_CM68XWRHDM8PT976J4B33K9DZD","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"VELOCITY_GATE_OPENED","id":"evt_RF817QV9HRMRW7CH192PGZW7RK","name":"Velocity Gate Opened","description":"A gate's speed band was satisfied (instantly, or held for its dwell) and it flipped open; boards layer treasure fx and rewards. When several gates open on one move, the first reports and the shared entity carries the rest.","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"key":"VELOCITY_GATE_DENIED","id":"evt_DZWN69D22RH1CE3QBMYVXDZ691","name":"Velocity Gate Denied","description":"The player entered a closed gate outside its speed band or against its direction; fires once per approach and re-arms after they step out. Boards answer with a PLACE back plus a hint fx.","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"speed","type":"number","required":true}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_0J8B29RTT7DD3SCGB2F4Y16D19","effects":[["set","@entity.gates",["array/map","@config.gates",["fn","g",["object/merge","@g",{"open":false,"touching":false,"denied":false,"held":0,"reported":false}]]]]]},{"from":"active","to":"active","event":"BODY_MOVED","eventId":"evt_E9DKKZ24VC2DPFHA1K9HV3BG8S","guard":"@config.running","effects":[["set","@entity.gates",["array/map","@entity.gates",["fn","g",["let",[["inside",["and",["==",["object/get","@g","open"],false],["and",[">=","@payload.x",["-",["object/get","@g","x"],"@config.reachMargin"]],["and",["<=","@payload.x",["+",["object/get","@g","x"],["object/get","@g","width"],"@config.reachMargin"]],["and",[">=","@payload.y",["-",["object/get","@g","y"],"@config.reachMargin"]],["<=","@payload.y",["+",["object/get","@g","y"],["object/get","@g","height"],"@config.reachMargin"]]]]]]]],["let",[["dirOk",["or",["==",["object/get","@g","dir"],0],["==",["math/sign","@payload.vx"],["object/get","@g","dir"]]]]],["let",[["pass",["and","@inside",["and",[">=","@payload.speed",["object/get","@g","minSpeed"]],["and",["<=","@payload.speed",["object/get","@g","maxSpeed"]],"@dirOk"]]]]],["let",[["held",["if","@pass",["+",["object/get","@g","held"],33],0]]],["let",[["openNow",["or",["object/get","@g","open"],["if",[">",["object/get","@g","dwellMs"],0],[">=","@held",["object/get","@g","dwellMs"]],"@pass"]]]],["object/merge","@g",{"touching":"@inside","held":"@held","open":"@openNow","denied":["and",["==",["object/get","@g","dwellMs"],0],["and","@inside",["and",["==","@pass",false],["==",["object/get","@g","touching"],false]]]]}]]]]]]]]],["let",[["newly",["array/filter","@entity.gates",["fn","g",["and",["==",["object/get","@g","open"],true],["==",["object/get","@g","reported"],false]]]]]],["if",[">",["array/len","@newly"],0],["do",["set","@entity.gates",["array/map","@entity.gates",["fn","g",["if",["==",["object/get","@g","id"],["object/get",["array/first","@newly"],"id"]],["object/merge","@g",{"reported":true}],"@g"]]]],["emit","VELOCITY_GATE_OPENED",{"id":["object/get",["array/first","@newly"],"id"],"x":["object/get",["array/first","@newly"],"x"],"y":["object/get",["array/first","@newly"],"y"]}]],null]],["let",[["denied",["array/filter","@entity.gates",["fn","g",["==",["object/get","@g","denied"],true]]]]],["if",[">",["array/len","@denied"],0],["emit","VELOCITY_GATE_DENIED",{"id":["object/get",["array/first","@denied"],"id"],"x":["object/get",["array/first","@denied"],"x"],"y":["object/get",["array/first","@denied"],"y"],"speed":"@payload.speed"}],null]]]},{"from":"active","to":"active","event":"SET_VGATES","eventId":"evt_5P651ZJFX87YMDMG8K1XN2AVN5","effects":[["set","@entity.gates",["array/map","@payload.gates",["fn","g",["object/merge","@g",{"open":false,"touching":false,"denied":false,"held":0,"reported":false}]]]]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_CM68XWRHDM8PT976J4B33K9DZD","effects":[["set","@entity.gates",["array/map","@entity.gates",["fn","g",["object/merge","@g",{"open":false,"touching":false,"denied":false,"held":0,"reported":false}]]]]]}]},"config":{"running":{"type":"boolean","default":true,"label":"Running","description":"When true, BODY_MOVED tests every gate's band and opens/denies; toggle to freeze every gate as-is.","tier":"domain"},"gates":{"type":"[VelocityGate]","default":[],"label":"Gates","description":"One row per velocity gate: id, min-corner rect (x, y, width, height in world units), the speed band [minSpeed, maxSpeed] that opens it, the hold required (dwellMs 0 = instant), the horizontal direction required (dir -1/0/+1), and an optional hint shown when denied. open/touching/denied/held/reported are stamped at runtime. Seeded onto the entity on INIT; the live set is entity.gates — SET_VGATES replaces it at runtime (boards that import gates), and RESTART re-arms the live set rather than re-reading config, so injected gates survive respawns.","tier":"domain","items":{"type":"object","properties":{"minSpeed":{"name":"minSpeed","type":"number","required":true},"held":{"name":"held","type":"number","required":false},"height":{"name":"height","type":"number","required":true},"open":{"name":"open","type":"boolean","required":false},"reported":{"name":"reported","type":"boolean","required":false},"id":{"name":"id","type":"string","required":true},"dir":{"name":"dir","type":"number","required":true},"x":{"name":"x","type":"number","required":true},"touching":{"name":"touching","type":"boolean","required":false},"hint":{"name":"hint","type":"string","required":false},"dwellMs":{"name":"dwellMs","type":"number","required":true},"denied":{"name":"denied","type":"boolean","required":false},"maxSpeed":{"name":"maxSpeed","type":"number","required":true},"y":{"name":"y","type":"number","required":true},"width":{"name":"width","type":"number","required":true}}}},"reachMargin":{"type":"number","default":0.6,"label":"Reach Margin","description":"Extra world units padded around a closed gate's rect when testing player contact (approximates the body's size).","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"VelocityGatePage","id":"pag_45AWVXGYE8F7465GAWSWXN4R54","path":"/velocity-gate","traits":[{"ref":"VelocityGate","refId":"trt_WTJPF9AS23CH1M1M57GXTY30F9"}]}],"types":{"VelocityGate":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"width","type":"number","required":true},{"name":"height","type":"number","required":true},{"name":"minSpeed","type":"number","required":true},{"name":"maxSpeed","type":"number","required":true},{"name":"dwellMs","type":"number","required":true},{"name":"dir","type":"number","required":true},{"name":"hint","type":"string"},{"name":"open","type":"boolean"},{"name":"touching","type":"boolean"},{"name":"denied","type":"boolean"},{"name":"held","type":"number"},{"name":"reported","type":"boolean"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_11F5ZSKXZ4YZJA56TRHE7JB2T9":{"id":"ent_11F5ZSKXZ4YZJA56TRHE7JB2T9","kind":"entity","bakedName":"VelocityGateData","curName":"VelocityGateData","renames":[],"owner":"workspace"},"evt_0J8B29RTT7DD3SCGB2F4Y16D19":{"id":"evt_0J8B29RTT7DD3SCGB2F4Y16D19","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_WTJPF9AS23CH1M1M57GXTY30F9"},"evt_5P651ZJFX87YMDMG8K1XN2AVN5":{"id":"evt_5P651ZJFX87YMDMG8K1XN2AVN5","kind":"event","bakedName":"SET_VGATES","curName":"SET_VGATES","renames":[],"owner":"workspace","parent":"trt_WTJPF9AS23CH1M1M57GXTY30F9"},"evt_CM68XWRHDM8PT976J4B33K9DZD":{"id":"evt_CM68XWRHDM8PT976J4B33K9DZD","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_WTJPF9AS23CH1M1M57GXTY30F9"},"evt_DZWN69D22RH1CE3QBMYVXDZ691":{"id":"evt_DZWN69D22RH1CE3QBMYVXDZ691","kind":"event","bakedName":"VELOCITY_GATE_DENIED","curName":"VELOCITY_GATE_DENIED","renames":[],"owner":"workspace","parent":"trt_WTJPF9AS23CH1M1M57GXTY30F9"},"evt_E9DKKZ24VC2DPFHA1K9HV3BG8S":{"id":"evt_E9DKKZ24VC2DPFHA1K9HV3BG8S","kind":"event","bakedName":"BODY_MOVED","curName":"BODY_MOVED","renames":[],"owner":"workspace","parent":"trt_WTJPF9AS23CH1M1M57GXTY30F9"},"evt_RF817QV9HRMRW7CH192PGZW7RK":{"id":"evt_RF817QV9HRMRW7CH192PGZW7RK","kind":"event","bakedName":"VELOCITY_GATE_OPENED","curName":"VELOCITY_GATE_OPENED","renames":[],"owner":"workspace","parent":"trt_WTJPF9AS23CH1M1M57GXTY30F9"},"orb_A9XD83X8HXM8YJ10B41B6ZBQ6W":{"id":"orb_A9XD83X8HXM8YJ10B41B6ZBQ6W","kind":"orbital","bakedName":"VelocityGateOrbital","curName":"VelocityGateOrbital","renames":[],"owner":"workspace"},"pag_45AWVXGYE8F7465GAWSWXN4R54":{"id":"pag_45AWVXGYE8F7465GAWSWXN4R54","kind":"page","bakedName":"VelocityGatePage","curName":"VelocityGatePage","renames":[],"owner":"workspace"},"trt_WTJPF9AS23CH1M1M57GXTY30F9":{"id":"trt_WTJPF9AS23CH1M1M57GXTY30F9","kind":"trait","bakedName":"VelocityGate","curName":"VelocityGate","renames":[],"owner":"workspace"}}}}
1
+ {"name":"std-velocity-gate","version":"1.0.0","description":"Headless velocity-gate mechanic: gates that open only when the player crosses them inside a speed band, optionally in a required direction, optionally sustained for a dwell. Listens BODY_MOVED and, per closed gate, tests the player's rect (padded by reachMargin), their speed against [minSpeed, maxSpeed], and their horizontal direction against dir (0 = either). Instant gates (dwellMs 0) open on the first passing cross; dwell gates (dwellMs > 0) accumulate ~33ms per passing move and open once held reaches dwellMs — a failing move resets the hold. The first newly opened gate emits VELOCITY_GATE_OPENED (the shared entity carries the rest). Entering a closed INSTANT gate while NOT passing emits VELOCITY_GATE_DENIED once per approach — re-arming only after the player steps out — so the board can answer with a PLACE back and a hint fx; dwell gates never deny (a hot entry is fine — coming to rest inside is the point), a failed hold simply resets. RESTART re-closes every live gate (re-arming the live entity set, so SET_VGATES-injected gates survive respawns). SET_VGATES replaces the gate set at runtime for boards that import their gates. Renders nothing; boards draw the gate band/chest and read open/held from the shared entity (the render authority). Corresponds to the design-sheet field(s): challenge, mechanics.","orbitals":[{"name":"VelocityGateOrbital","id":"orb_A9XD83X8HXM8YJ10B41B6ZBQ6W","entity":{"name":"VelocityGateData","id":"ent_11F5ZSKXZ4YZJA56TRHE7JB2T9","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"gates","type":"array","default":[],"items":{"type":"object","properties":{"denied":{"name":"denied","type":"boolean","required":false},"maxSpeed":{"name":"maxSpeed","type":"number","required":true},"minSpeed":{"name":"minSpeed","type":"number","required":true},"touching":{"name":"touching","type":"boolean","required":false},"hint":{"name":"hint","type":"string","required":false},"x":{"name":"x","type":"number","required":true},"open":{"name":"open","type":"boolean","required":false},"held":{"name":"held","type":"number","required":false},"width":{"name":"width","type":"number","required":true},"y":{"name":"y","type":"number","required":true},"dwellMs":{"name":"dwellMs","type":"number","required":true},"reported":{"name":"reported","type":"boolean","required":false},"dir":{"name":"dir","type":"number","required":true},"id":{"name":"id","type":"string","required":true},"height":{"name":"height","type":"number","required":true}}}}],"shared":true},"traits":[{"name":"VelocityGate","id":"trt_WTJPF9AS23CH1M1M57GXTY30F9","entityRebindable":true,"entityContract":{"requires":[],"provides":["gates"]},"effectRow":[{"kind":"emit","resource":"VELOCITY_GATE_DENIED"},{"kind":"emit","resource":"VELOCITY_GATE_OPENED"},{"kind":"set","resource":"@entity.gates"}],"category":"lifecycle","linkedEntity":"VelocityGateData","linkedEntityId":"ent_11F5ZSKXZ4YZJA56TRHE7JB2T9","entityRefIds":{"VelocityGateData":"ent_11F5ZSKXZ4YZJA56TRHE7JB2T9"},"emits":[{"event":"VELOCITY_GATE_OPENED","eventId":"evt_RF817QV9HRMRW7CH192PGZW7RK","description":"A gate's speed band was satisfied (instantly, or held for its dwell) and it flipped open; boards layer treasure fx and rewards. When several gates open on one move, the first reports and the shared entity carries the rest.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"event":"VELOCITY_GATE_DENIED","eventId":"evt_DZWN69D22RH1CE3QBMYVXDZ691","description":"The player entered a closed gate outside its speed band or against its direction; fires once per approach and re-arms after they step out. Boards answer with a PLACE back plus a hint fx.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"speed","type":"number","required":true}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_0J8B29RTT7DD3SCGB2F4Y16D19","name":"Initialize"},{"key":"BODY_MOVED","id":"evt_E9DKKZ24VC2DPFHA1K9HV3BG8S","name":"Body Moved","payloadSchema":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"vx","type":"number","required":true},{"name":"vy","type":"number","required":true},{"name":"grounded","type":"boolean","required":true},{"name":"skating","type":"boolean","required":true},{"name":"speed","type":"number","required":true}],"listened":true},{"key":"SET_VGATES","id":"evt_5P651ZJFX87YMDMG8K1XN2AVN5","name":"Set Vgates","payloadSchema":[{"name":"gates","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"width","type":"number","required":true},{"name":"height","type":"number","required":true},{"name":"minSpeed","type":"number","required":true},{"name":"maxSpeed","type":"number","required":true},{"name":"dwellMs","type":"number","required":true},{"name":"dir","type":"number","required":true},{"name":"hint","type":"string"},{"name":"open","type":"boolean"},{"name":"touching","type":"boolean"},{"name":"denied","type":"boolean"},{"name":"held","type":"number"},{"name":"reported","type":"boolean"}]}],"listened":true},{"key":"RESTART","id":"evt_CM68XWRHDM8PT976J4B33K9DZD","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"VELOCITY_GATE_OPENED","id":"evt_RF817QV9HRMRW7CH192PGZW7RK","name":"Velocity Gate Opened","description":"A gate's speed band was satisfied (instantly, or held for its dwell) and it flipped open; boards layer treasure fx and rewards. When several gates open on one move, the first reports and the shared entity carries the rest.","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"key":"VELOCITY_GATE_DENIED","id":"evt_DZWN69D22RH1CE3QBMYVXDZ691","name":"Velocity Gate Denied","description":"The player entered a closed gate outside its speed band or against its direction; fires once per approach and re-arms after they step out. Boards answer with a PLACE back plus a hint fx.","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"speed","type":"number","required":true}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_0J8B29RTT7DD3SCGB2F4Y16D19","effects":[["set","@entity.gates",["array/map","@config.gates",["fn","g",["object/merge","@g",{"open":false,"touching":false,"denied":false,"held":0,"reported":false}]]]]]},{"from":"active","to":"active","event":"BODY_MOVED","eventId":"evt_E9DKKZ24VC2DPFHA1K9HV3BG8S","guard":"@config.running","effects":[["set","@entity.gates",["array/map","@entity.gates",["fn","g",["let",[["inside",["and",["==",["object/get","@g","open"],false],["and",[">=","@payload.x",["-",["object/get","@g","x"],"@config.reachMargin"]],["and",["<=","@payload.x",["+",["object/get","@g","x"],["object/get","@g","width"],"@config.reachMargin"]],["and",[">=","@payload.y",["-",["object/get","@g","y"],"@config.reachMargin"]],["<=","@payload.y",["+",["object/get","@g","y"],["object/get","@g","height"],"@config.reachMargin"]]]]]]]],["let",[["dirOk",["or",["==",["object/get","@g","dir"],0],["==",["math/sign","@payload.vx"],["object/get","@g","dir"]]]]],["let",[["pass",["and","@inside",["and",[">=","@payload.speed",["object/get","@g","minSpeed"]],["and",["<=","@payload.speed",["object/get","@g","maxSpeed"]],"@dirOk"]]]]],["let",[["held",["if","@pass",["+",["object/get","@g","held"],33],0]]],["let",[["openNow",["or",["object/get","@g","open"],["if",[">",["object/get","@g","dwellMs"],0],[">=","@held",["object/get","@g","dwellMs"]],"@pass"]]]],["object/merge","@g",{"touching":"@inside","held":"@held","open":"@openNow","denied":["and",["==",["object/get","@g","dwellMs"],0],["and","@inside",["and",["==","@pass",false],["==",["object/get","@g","touching"],false]]]]}]]]]]]]]],["let",[["newly",["array/filter","@entity.gates",["fn","g",["and",["==",["object/get","@g","open"],true],["==",["object/get","@g","reported"],false]]]]]],["if",[">",["array/len","@newly"],0],["do",["set","@entity.gates",["array/map","@entity.gates",["fn","g",["if",["==",["object/get","@g","id"],["object/get",["array/first","@newly"],"id"]],["object/merge","@g",{"reported":true}],"@g"]]]],["emit","VELOCITY_GATE_OPENED",{"id":["object/get",["array/first","@newly"],"id"],"x":["object/get",["array/first","@newly"],"x"],"y":["object/get",["array/first","@newly"],"y"]}]],null]],["let",[["denied",["array/filter","@entity.gates",["fn","g",["==",["object/get","@g","denied"],true]]]]],["if",[">",["array/len","@denied"],0],["emit","VELOCITY_GATE_DENIED",{"id":["object/get",["array/first","@denied"],"id"],"x":["object/get",["array/first","@denied"],"x"],"y":["object/get",["array/first","@denied"],"y"],"speed":"@payload.speed"}],null]]]},{"from":"active","to":"active","event":"SET_VGATES","eventId":"evt_5P651ZJFX87YMDMG8K1XN2AVN5","effects":[["set","@entity.gates",["array/map","@payload.gates",["fn","g",["object/merge","@g",{"open":false,"touching":false,"denied":false,"held":0,"reported":false}]]]]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_CM68XWRHDM8PT976J4B33K9DZD","effects":[["set","@entity.gates",["array/map","@entity.gates",["fn","g",["object/merge","@g",{"open":false,"touching":false,"denied":false,"held":0,"reported":false}]]]]]}]},"config":{"gates":{"type":"[VelocityGate]","default":[],"label":"Gates","description":"One row per velocity gate: id, min-corner rect (x, y, width, height in world units), the speed band [minSpeed, maxSpeed] that opens it, the hold required (dwellMs 0 = instant), the horizontal direction required (dir -1/0/+1), and an optional hint shown when denied. open/touching/denied/held/reported are stamped at runtime. Seeded onto the entity on INIT; the live set is entity.gates — SET_VGATES replaces it at runtime (boards that import gates), and RESTART re-arms the live set rather than re-reading config, so injected gates survive respawns.","tier":"domain","items":{"type":"object","properties":{"width":{"name":"width","type":"number","required":true},"minSpeed":{"name":"minSpeed","type":"number","required":true},"dir":{"name":"dir","type":"number","required":true},"dwellMs":{"name":"dwellMs","type":"number","required":true},"height":{"name":"height","type":"number","required":true},"reported":{"name":"reported","type":"boolean","required":false},"denied":{"name":"denied","type":"boolean","required":false},"y":{"name":"y","type":"number","required":true},"hint":{"name":"hint","type":"string","required":false},"id":{"name":"id","type":"string","required":true},"x":{"name":"x","type":"number","required":true},"touching":{"name":"touching","type":"boolean","required":false},"maxSpeed":{"name":"maxSpeed","type":"number","required":true},"held":{"name":"held","type":"number","required":false},"open":{"name":"open","type":"boolean","required":false}}}},"reachMargin":{"type":"number","default":0.6,"label":"Reach Margin","description":"Extra world units padded around a closed gate's rect when testing player contact (approximates the body's size).","tier":"domain"},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, BODY_MOVED tests every gate's band and opens/denies; toggle to freeze every gate as-is.","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"VelocityGatePage","id":"pag_45AWVXGYE8F7465GAWSWXN4R54","path":"/velocity-gate","traits":[{"ref":"VelocityGate","refId":"trt_WTJPF9AS23CH1M1M57GXTY30F9"}]}],"types":{"VelocityGate":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"width","type":"number","required":true},{"name":"height","type":"number","required":true},{"name":"minSpeed","type":"number","required":true},{"name":"maxSpeed","type":"number","required":true},{"name":"dwellMs","type":"number","required":true},{"name":"dir","type":"number","required":true},{"name":"hint","type":"string"},{"name":"open","type":"boolean"},{"name":"touching","type":"boolean"},{"name":"denied","type":"boolean"},{"name":"held","type":"number"},{"name":"reported","type":"boolean"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_11F5ZSKXZ4YZJA56TRHE7JB2T9":{"id":"ent_11F5ZSKXZ4YZJA56TRHE7JB2T9","kind":"entity","bakedName":"VelocityGateData","curName":"VelocityGateData","renames":[],"owner":"workspace"},"evt_0J8B29RTT7DD3SCGB2F4Y16D19":{"id":"evt_0J8B29RTT7DD3SCGB2F4Y16D19","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_WTJPF9AS23CH1M1M57GXTY30F9"},"evt_5P651ZJFX87YMDMG8K1XN2AVN5":{"id":"evt_5P651ZJFX87YMDMG8K1XN2AVN5","kind":"event","bakedName":"SET_VGATES","curName":"SET_VGATES","renames":[],"owner":"workspace","parent":"trt_WTJPF9AS23CH1M1M57GXTY30F9"},"evt_CM68XWRHDM8PT976J4B33K9DZD":{"id":"evt_CM68XWRHDM8PT976J4B33K9DZD","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_WTJPF9AS23CH1M1M57GXTY30F9"},"evt_DZWN69D22RH1CE3QBMYVXDZ691":{"id":"evt_DZWN69D22RH1CE3QBMYVXDZ691","kind":"event","bakedName":"VELOCITY_GATE_DENIED","curName":"VELOCITY_GATE_DENIED","renames":[],"owner":"workspace","parent":"trt_WTJPF9AS23CH1M1M57GXTY30F9"},"evt_E9DKKZ24VC2DPFHA1K9HV3BG8S":{"id":"evt_E9DKKZ24VC2DPFHA1K9HV3BG8S","kind":"event","bakedName":"BODY_MOVED","curName":"BODY_MOVED","renames":[],"owner":"workspace","parent":"trt_WTJPF9AS23CH1M1M57GXTY30F9"},"evt_RF817QV9HRMRW7CH192PGZW7RK":{"id":"evt_RF817QV9HRMRW7CH192PGZW7RK","kind":"event","bakedName":"VELOCITY_GATE_OPENED","curName":"VELOCITY_GATE_OPENED","renames":[],"owner":"workspace","parent":"trt_WTJPF9AS23CH1M1M57GXTY30F9"},"orb_A9XD83X8HXM8YJ10B41B6ZBQ6W":{"id":"orb_A9XD83X8HXM8YJ10B41B6ZBQ6W","kind":"orbital","bakedName":"VelocityGateOrbital","curName":"VelocityGateOrbital","renames":[],"owner":"workspace"},"pag_45AWVXGYE8F7465GAWSWXN4R54":{"id":"pag_45AWVXGYE8F7465GAWSWXN4R54","kind":"page","bakedName":"VelocityGatePage","curName":"VelocityGatePage","renames":[],"owner":"workspace"},"trt_WTJPF9AS23CH1M1M57GXTY30F9":{"id":"trt_WTJPF9AS23CH1M1M57GXTY30F9","kind":"trait","bakedName":"VelocityGate","curName":"VelocityGate","renames":[],"owner":"workspace"}}}}
@@ -1 +1 @@
1
- {"name":"std-xp","version":"1.0.0","description":"Headless XP/progression mechanic: grants xp when the enemy survivor count drops (UNITS_CHANGED), and on reaching xpToNext levels up — raising the threshold and emitting a HEAL reward the grid-tactics authority applies. Owns only xp/xpToNext/level (+ kill baseline); never writes units.","orbitals":[{"name":"XpOrbital","id":"orb_RDPW5W3P2SV1CVP806E8VJRD4Y","entity":{"name":"XpState","id":"ent_9RNYSYRBNQ5TVHP5498YPE8Z2G","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"xp","type":"number","default":0},{"name":"xpToNext","type":"number","default":100},{"name":"level","type":"number","default":1},{"name":"xpBaseline","type":"number","default":0}],"shared":true},"traits":[{"name":"XpProgression","id":"trt_69XKX902FA17NFXTXAJS07ANY2","entityRebindable":true,"entityContract":{"requires":[],"provides":["level","xp","xpBaseline","xpToNext"]},"effectRow":[{"kind":"emit","resource":"HEAL"},{"kind":"set","resource":"@entity.level"},{"kind":"set","resource":"@entity.xp"},{"kind":"set","resource":"@entity.xpBaseline"},{"kind":"set","resource":"@entity.xpToNext"}],"category":"lifecycle","linkedEntity":"XpState","linkedEntityId":"ent_9RNYSYRBNQ5TVHP5498YPE8Z2G","entityRefIds":{"XpState":"ent_9RNYSYRBNQ5TVHP5498YPE8Z2G"},"emits":[{"event":"HEAL","eventId":"evt_7XKP4XV9EVMQDXH2HHPQPVS0WM","description":"Level-up heal reward applied by the grid-tactics authority (the sole units writer)","tier":"domain","scope":"external","payloadSchema":[{"name":"team","type":"string","required":true},{"name":"amount","type":"number","required":true}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_WH94PXZNX8TYMC7BH51TYK93G3","name":"Initialize"},{"key":"UNITS_CHANGED","id":"evt_51HVQC46DS36WXG9YFM9BDDF2B","name":"Units Changed","payloadSchema":[{"name":"playersAlive","type":"number"},{"name":"enemiesAlive","type":"number"}],"listened":true},{"key":"HEAL","id":"evt_7XKP4XV9EVMQDXH2HHPQPVS0WM","name":"Heal","description":"Level-up heal reward applied by the grid-tactics authority (the sole units writer)","tier":"domain","payloadSchema":[{"name":"team","type":"string","required":true},{"name":"amount","type":"number","required":true}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_WH94PXZNX8TYMC7BH51TYK93G3","effects":[["set","@entity.xp","@config.startXp"],["set","@entity.xpToNext","@config.baseXpToNext"],["set","@entity.level",1],["set","@entity.xpBaseline","@config.initialEnemies"]]},{"from":"active","to":"active","event":"UNITS_CHANGED","eventId":"evt_51HVQC46DS36WXG9YFM9BDDF2B","guard":"@config.running","effects":[["set","@entity.xp",["if",["<","@payload.enemiesAlive","@entity.xpBaseline"],["+","@entity.xp",["*",["-","@entity.xpBaseline","@payload.enemiesAlive"],"@config.xpPerKill"]],"@entity.xp"]],["set","@entity.xpBaseline","@payload.enemiesAlive"],["if",[">=","@entity.xp","@entity.xpToNext"],["emit","HEAL",{"team":"@config.healTeam","amount":"@config.levelUpHeal"}],null],["set","@entity.level",["if",[">=","@entity.xp","@entity.xpToNext"],["+","@entity.level",1],"@entity.level"]],["set","@entity.xpToNext",["if",[">=","@entity.xp","@entity.xpToNext"],["+","@entity.xpToNext","@config.xpToNextIncrement"],"@entity.xpToNext"]]]}]},"config":{"startXp":{"type":"number","default":0,"label":"Start XP","description":"XP set on INIT.","tier":"domain"},"baseXpToNext":{"type":"number","default":100,"label":"Base XP To Next","description":"XP threshold for the first level-up.","tier":"domain"},"healTeam":{"type":"string","default":"player","label":"Heal Team","description":"Team whose units are healed on level-up.","tier":"domain"},"xpToNextIncrement":{"type":"number","default":50,"label":"XP To Next Increment","description":"Amount the threshold rises by on each level-up.","tier":"domain"},"initialEnemies":{"type":"number","default":0,"label":"Initial Enemies","description":"Enemy count at start; the kill baseline so the first kill grants xp correctly.","tier":"domain"},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, enemy-count drops grant xp and trigger level-ups; toggle to freeze.","tier":"domain"},"xpPerKill":{"type":"number","default":25,"label":"XP Per Kill","description":"XP awarded for each enemy removed since the last signal.","tier":"domain"},"levelUpHeal":{"type":"number","default":2,"label":"Level-Up Heal","description":"Health restored to the healTeam's units on each level-up.","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"XpPage","id":"pag_X0ERXD5841M20ZQGHC3NFZZHKY","path":"/xp","traits":[{"ref":"XpProgression","refId":"trt_69XKX902FA17NFXTXAJS07ANY2"}]}]}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_9RNYSYRBNQ5TVHP5498YPE8Z2G":{"id":"ent_9RNYSYRBNQ5TVHP5498YPE8Z2G","kind":"entity","bakedName":"XpState","curName":"XpState","renames":[],"owner":"workspace"},"evt_51HVQC46DS36WXG9YFM9BDDF2B":{"id":"evt_51HVQC46DS36WXG9YFM9BDDF2B","kind":"event","bakedName":"UNITS_CHANGED","curName":"UNITS_CHANGED","renames":[],"owner":"workspace","parent":"trt_69XKX902FA17NFXTXAJS07ANY2"},"evt_7XKP4XV9EVMQDXH2HHPQPVS0WM":{"id":"evt_7XKP4XV9EVMQDXH2HHPQPVS0WM","kind":"event","bakedName":"HEAL","curName":"HEAL","renames":[],"owner":"workspace","parent":"trt_69XKX902FA17NFXTXAJS07ANY2"},"evt_WH94PXZNX8TYMC7BH51TYK93G3":{"id":"evt_WH94PXZNX8TYMC7BH51TYK93G3","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_69XKX902FA17NFXTXAJS07ANY2"},"orb_RDPW5W3P2SV1CVP806E8VJRD4Y":{"id":"orb_RDPW5W3P2SV1CVP806E8VJRD4Y","kind":"orbital","bakedName":"XpOrbital","curName":"XpOrbital","renames":[],"owner":"workspace"},"pag_X0ERXD5841M20ZQGHC3NFZZHKY":{"id":"pag_X0ERXD5841M20ZQGHC3NFZZHKY","kind":"page","bakedName":"XpPage","curName":"XpPage","renames":[],"owner":"workspace"},"trt_69XKX902FA17NFXTXAJS07ANY2":{"id":"trt_69XKX902FA17NFXTXAJS07ANY2","kind":"trait","bakedName":"XpProgression","curName":"XpProgression","renames":[],"owner":"workspace"}}}}
1
+ {"name":"std-xp","version":"1.0.0","description":"Headless XP/progression mechanic: grants xp when the enemy survivor count drops (UNITS_CHANGED), and on reaching xpToNext levels up — raising the threshold and emitting a HEAL reward the grid-tactics authority applies. Owns only xp/xpToNext/level (+ kill baseline); never writes units.","orbitals":[{"name":"XpOrbital","id":"orb_RDPW5W3P2SV1CVP806E8VJRD4Y","entity":{"name":"XpState","id":"ent_9RNYSYRBNQ5TVHP5498YPE8Z2G","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"xp","type":"number","default":0},{"name":"xpToNext","type":"number","default":100},{"name":"level","type":"number","default":1},{"name":"xpBaseline","type":"number","default":0}],"shared":true},"traits":[{"name":"XpProgression","id":"trt_69XKX902FA17NFXTXAJS07ANY2","entityRebindable":true,"entityContract":{"requires":[],"provides":["level","xp","xpBaseline","xpToNext"]},"effectRow":[{"kind":"emit","resource":"HEAL"},{"kind":"set","resource":"@entity.level"},{"kind":"set","resource":"@entity.xp"},{"kind":"set","resource":"@entity.xpBaseline"},{"kind":"set","resource":"@entity.xpToNext"}],"category":"lifecycle","linkedEntity":"XpState","linkedEntityId":"ent_9RNYSYRBNQ5TVHP5498YPE8Z2G","entityRefIds":{"XpState":"ent_9RNYSYRBNQ5TVHP5498YPE8Z2G"},"emits":[{"event":"HEAL","eventId":"evt_7XKP4XV9EVMQDXH2HHPQPVS0WM","description":"Level-up heal reward applied by the grid-tactics authority (the sole units writer)","tier":"domain","scope":"external","payloadSchema":[{"name":"team","type":"string","required":true},{"name":"amount","type":"number","required":true}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_WH94PXZNX8TYMC7BH51TYK93G3","name":"Initialize"},{"key":"UNITS_CHANGED","id":"evt_51HVQC46DS36WXG9YFM9BDDF2B","name":"Units Changed","payloadSchema":[{"name":"playersAlive","type":"number"},{"name":"enemiesAlive","type":"number"}],"listened":true},{"key":"HEAL","id":"evt_7XKP4XV9EVMQDXH2HHPQPVS0WM","name":"Heal","description":"Level-up heal reward applied by the grid-tactics authority (the sole units writer)","tier":"domain","payloadSchema":[{"name":"team","type":"string","required":true},{"name":"amount","type":"number","required":true}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_WH94PXZNX8TYMC7BH51TYK93G3","effects":[["set","@entity.xp","@config.startXp"],["set","@entity.xpToNext","@config.baseXpToNext"],["set","@entity.level",1],["set","@entity.xpBaseline","@config.initialEnemies"]]},{"from":"active","to":"active","event":"UNITS_CHANGED","eventId":"evt_51HVQC46DS36WXG9YFM9BDDF2B","guard":"@config.running","effects":[["set","@entity.xp",["if",["<","@payload.enemiesAlive","@entity.xpBaseline"],["+","@entity.xp",["*",["-","@entity.xpBaseline","@payload.enemiesAlive"],"@config.xpPerKill"]],"@entity.xp"]],["set","@entity.xpBaseline","@payload.enemiesAlive"],["if",[">=","@entity.xp","@entity.xpToNext"],["emit","HEAL",{"team":"@config.healTeam","amount":"@config.levelUpHeal"}],null],["set","@entity.level",["if",[">=","@entity.xp","@entity.xpToNext"],["+","@entity.level",1],"@entity.level"]],["set","@entity.xpToNext",["if",[">=","@entity.xp","@entity.xpToNext"],["+","@entity.xpToNext","@config.xpToNextIncrement"],"@entity.xpToNext"]]]}]},"config":{"xpPerKill":{"type":"number","default":25,"label":"XP Per Kill","description":"XP awarded for each enemy removed since the last signal.","tier":"domain"},"initialEnemies":{"type":"number","default":0,"label":"Initial Enemies","description":"Enemy count at start; the kill baseline so the first kill grants xp correctly.","tier":"domain"},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, enemy-count drops grant xp and trigger level-ups; toggle to freeze.","tier":"domain"},"baseXpToNext":{"type":"number","default":100,"label":"Base XP To Next","description":"XP threshold for the first level-up.","tier":"domain"},"healTeam":{"type":"string","default":"player","label":"Heal Team","description":"Team whose units are healed on level-up.","tier":"domain"},"levelUpHeal":{"type":"number","default":2,"label":"Level-Up Heal","description":"Health restored to the healTeam's units on each level-up.","tier":"domain"},"startXp":{"type":"number","default":0,"label":"Start XP","description":"XP set on INIT.","tier":"domain"},"xpToNextIncrement":{"type":"number","default":50,"label":"XP To Next Increment","description":"Amount the threshold rises by on each level-up.","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"XpPage","id":"pag_X0ERXD5841M20ZQGHC3NFZZHKY","path":"/xp","traits":[{"ref":"XpProgression","refId":"trt_69XKX902FA17NFXTXAJS07ANY2"}]}]}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_9RNYSYRBNQ5TVHP5498YPE8Z2G":{"id":"ent_9RNYSYRBNQ5TVHP5498YPE8Z2G","kind":"entity","bakedName":"XpState","curName":"XpState","renames":[],"owner":"workspace"},"evt_51HVQC46DS36WXG9YFM9BDDF2B":{"id":"evt_51HVQC46DS36WXG9YFM9BDDF2B","kind":"event","bakedName":"UNITS_CHANGED","curName":"UNITS_CHANGED","renames":[],"owner":"workspace","parent":"trt_69XKX902FA17NFXTXAJS07ANY2"},"evt_7XKP4XV9EVMQDXH2HHPQPVS0WM":{"id":"evt_7XKP4XV9EVMQDXH2HHPQPVS0WM","kind":"event","bakedName":"HEAL","curName":"HEAL","renames":[],"owner":"workspace","parent":"trt_69XKX902FA17NFXTXAJS07ANY2"},"evt_WH94PXZNX8TYMC7BH51TYK93G3":{"id":"evt_WH94PXZNX8TYMC7BH51TYK93G3","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_69XKX902FA17NFXTXAJS07ANY2"},"orb_RDPW5W3P2SV1CVP806E8VJRD4Y":{"id":"orb_RDPW5W3P2SV1CVP806E8VJRD4Y","kind":"orbital","bakedName":"XpOrbital","curName":"XpOrbital","renames":[],"owner":"workspace"},"pag_X0ERXD5841M20ZQGHC3NFZZHKY":{"id":"pag_X0ERXD5841M20ZQGHC3NFZZHKY","kind":"page","bakedName":"XpPage","curName":"XpPage","renames":[],"owner":"workspace"},"trt_69XKX902FA17NFXTXAJS07ANY2":{"id":"trt_69XKX902FA17NFXTXAJS07ANY2","kind":"trait","bakedName":"XpProgression","curName":"XpProgression","renames":[],"owner":"workspace"}}}}
@@ -1 +1 @@
1
- {"name":"std-zone-card","version":"1.0.0","description":"Headless zone-guidance mechanic for side-view boards: tracks which band of the world the player is in and holds up that zone's card — name, concept, objective — for a while after every crossing. Listens BODY_MOVED and, when the player's x crosses into a different config zone, stamps the shared entity (zoneId, card, enteredAt) and emits ZONE_CHANGED carrying the card fields; the card self-clears ttlTicks BODY_MOVED ticks later (a per-move tick counter on the entity, so pauses at speed zero still age it out) and boards clear it early via CARD_DISMISS (renamed to a board-scoped progress event) on any mechanic completion. RESTART clears the card and the clock. Renders nothing; boards draw the card from the shared entity (the render authority).","orbitals":[{"name":"ZoneCardOrbital","id":"orb_1YBGF4NVAMXNA5NZNAEBVF2QRR","entity":{"name":"ZoneCardData","id":"ent_VPWXWCR2KG19REHHFSW0Y4ZB97","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"zoneId","type":"string","default":""},{"name":"card","type":"object","properties":{"objective":{"name":"objective","type":"string","required":false},"name":{"name":"name","type":"string","required":true},"concept":{"name":"concept","type":"string","required":false}}},{"name":"enteredAt","type":"number","default":0},{"name":"ticks","type":"number","default":0}],"shared":true},"traits":[{"name":"ZoneCard","id":"trt_DX4CD19EKNQ9TNJV1X89FPM2W6","entityRebindable":true,"entityContract":{"requires":[],"provides":["card","enteredAt","ticks","zoneId"]},"effectRow":[{"kind":"emit","resource":"ZONE_CHANGED"},{"kind":"set","resource":"@entity.card"},{"kind":"set","resource":"@entity.enteredAt"},{"kind":"set","resource":"@entity.ticks"},{"kind":"set","resource":"@entity.zoneId"}],"category":"lifecycle","linkedEntity":"ZoneCardData","linkedEntityId":"ent_VPWXWCR2KG19REHHFSW0Y4ZB97","entityRefIds":{"ZoneCardData":"ent_VPWXWCR2KG19REHHFSW0Y4ZB97"},"emits":[{"event":"ZONE_CHANGED","eventId":"evt_QZQ236W0W70E3RAEW3878YHK75","description":"The player crossed into a different zone; carries the zone's card fields (name, concept, objective) so boards can swap banners/guides and hold the card up. Fires once per crossing.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"name","type":"string","required":true},{"name":"concept","type":"string"},{"name":"objective","type":"string"}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_F3V26CA1940MJ1K4F5X72T9N83","name":"Initialize"},{"key":"BODY_MOVED","id":"evt_25G04EXXXQYYVPZA12BTZK00HQ","name":"Body Moved","payloadSchema":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"vx","type":"number","required":true},{"name":"vy","type":"number","required":true},{"name":"grounded","type":"boolean","required":true},{"name":"skating","type":"boolean","required":true},{"name":"speed","type":"number","required":true}],"listened":true},{"key":"CARD_DISMISS","id":"evt_F5FZ9S2EE5772X2YTA5NNN1BZA","name":"Card Dismiss","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"RESTART","id":"evt_YJJDY04EGP78B9V9PDTK4Q51YJ","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"ZONE_CHANGED","id":"evt_QZQ236W0W70E3RAEW3878YHK75","name":"Zone Changed","description":"The player crossed into a different zone; carries the zone's card fields (name, concept, objective) so boards can swap banners/guides and hold the card up. Fires once per crossing.","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"name","type":"string","required":true},{"name":"concept","type":"string"},{"name":"objective","type":"string"}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_F3V26CA1940MJ1K4F5X72T9N83","effects":[["set","@entity.zoneId",""],["set","@entity.card",null],["set","@entity.enteredAt",0],["set","@entity.ticks",0]]},{"from":"active","to":"active","event":"BODY_MOVED","eventId":"evt_25G04EXXXQYYVPZA12BTZK00HQ","guard":"@config.running","effects":[["set","@entity.ticks",["+","@entity.ticks",1]],["let",[["zmatch",["array/filter","@config.zones",["fn","z",["and",[">=","@payload.x",["object/get","@z","x0"]],["<","@payload.x",["object/get","@z","x1"]]]]]]],["do",["if",["and",[">",["array/len","@zmatch"],0],["!=","@entity.zoneId",["object/get",["array/first","@zmatch"],"id"]]],["do",["set","@entity.zoneId",["object/get",["array/first","@zmatch"],"id"]],["set","@entity.card",{"name":["object/get",["array/first","@zmatch"],"name"],"concept":["object/get",["array/first","@zmatch"],"concept"],"objective":["object/get",["array/first","@zmatch"],"objective"]}],["set","@entity.enteredAt","@entity.ticks"],["emit","ZONE_CHANGED",{"id":["object/get",["array/first","@zmatch"],"id"],"name":["object/get",["array/first","@zmatch"],"name"],"concept":["object/get",["array/first","@zmatch"],"concept"],"objective":["object/get",["array/first","@zmatch"],"objective"]}]],null],["if",["and",["!=","@entity.card",null],[">",["-","@entity.ticks","@entity.enteredAt"],"@config.ttlTicks"]],["set","@entity.card",null],null]]]]},{"from":"active","to":"active","event":"CARD_DISMISS","eventId":"evt_F5FZ9S2EE5772X2YTA5NNN1BZA","effects":[["set","@entity.card",null]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_YJJDY04EGP78B9V9PDTK4Q51YJ","effects":[["set","@entity.zoneId",""],["set","@entity.card",null],["set","@entity.enteredAt",0],["set","@entity.ticks",0]]}]},"config":{"running":{"type":"boolean","default":true,"label":"Running","description":"When true, BODY_MOVED tracks the current zone and ages the card; toggle to freeze the card as-is.","tier":"domain"},"ttlTicks":{"type":"number","default":120,"label":"TTL Ticks","description":"BODY_MOVED ticks the card stays up after a zone crossing (≈ 4s at 30 moves/s) before it clears itself.","tier":"domain"},"zones":{"type":"[ZoneCardZone]","default":[],"label":"Zones","description":"One row per world band: id, display name, the one-line concept, the zone's objective text, and the x-range (x0..x1) the band covers.","tier":"domain","items":{"type":"object","properties":{"x1":{"name":"x1","type":"number","required":true},"concept":{"name":"concept","type":"string","required":false},"x0":{"name":"x0","type":"number","required":true},"id":{"name":"id","type":"string","required":true},"objective":{"name":"objective","type":"string","required":false},"name":{"name":"name","type":"string","required":true}}}}},"scope":"instance"}],"pages":[{"name":"ZoneCardPage","id":"pag_2GD5EPJ9KJ4SS4C1Y6N4F5R2VQ","path":"/zone-card","traits":[{"ref":"ZoneCard","refId":"trt_DX4CD19EKNQ9TNJV1X89FPM2W6"}]}],"types":{"ZoneCard":[{"name":"name","type":"string","required":true},{"name":"concept","type":"string"},{"name":"objective","type":"string"}],"ZoneCardZone":[{"name":"id","type":"string","required":true},{"name":"name","type":"string","required":true},{"name":"concept","type":"string"},{"name":"objective","type":"string"},{"name":"x0","type":"number","required":true},{"name":"x1","type":"number","required":true}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_VPWXWCR2KG19REHHFSW0Y4ZB97":{"id":"ent_VPWXWCR2KG19REHHFSW0Y4ZB97","kind":"entity","bakedName":"ZoneCardData","curName":"ZoneCardData","renames":[],"owner":"workspace"},"evt_25G04EXXXQYYVPZA12BTZK00HQ":{"id":"evt_25G04EXXXQYYVPZA12BTZK00HQ","kind":"event","bakedName":"BODY_MOVED","curName":"BODY_MOVED","renames":[],"owner":"workspace","parent":"trt_DX4CD19EKNQ9TNJV1X89FPM2W6"},"evt_F3V26CA1940MJ1K4F5X72T9N83":{"id":"evt_F3V26CA1940MJ1K4F5X72T9N83","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_DX4CD19EKNQ9TNJV1X89FPM2W6"},"evt_F5FZ9S2EE5772X2YTA5NNN1BZA":{"id":"evt_F5FZ9S2EE5772X2YTA5NNN1BZA","kind":"event","bakedName":"CARD_DISMISS","curName":"CARD_DISMISS","renames":[],"owner":"workspace","parent":"trt_DX4CD19EKNQ9TNJV1X89FPM2W6"},"evt_QZQ236W0W70E3RAEW3878YHK75":{"id":"evt_QZQ236W0W70E3RAEW3878YHK75","kind":"event","bakedName":"ZONE_CHANGED","curName":"ZONE_CHANGED","renames":[],"owner":"workspace","parent":"trt_DX4CD19EKNQ9TNJV1X89FPM2W6"},"evt_YJJDY04EGP78B9V9PDTK4Q51YJ":{"id":"evt_YJJDY04EGP78B9V9PDTK4Q51YJ","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_DX4CD19EKNQ9TNJV1X89FPM2W6"},"orb_1YBGF4NVAMXNA5NZNAEBVF2QRR":{"id":"orb_1YBGF4NVAMXNA5NZNAEBVF2QRR","kind":"orbital","bakedName":"ZoneCardOrbital","curName":"ZoneCardOrbital","renames":[],"owner":"workspace"},"pag_2GD5EPJ9KJ4SS4C1Y6N4F5R2VQ":{"id":"pag_2GD5EPJ9KJ4SS4C1Y6N4F5R2VQ","kind":"page","bakedName":"ZoneCardPage","curName":"ZoneCardPage","renames":[],"owner":"workspace"},"trt_DX4CD19EKNQ9TNJV1X89FPM2W6":{"id":"trt_DX4CD19EKNQ9TNJV1X89FPM2W6","kind":"trait","bakedName":"ZoneCard","curName":"ZoneCard","renames":[],"owner":"workspace"}}}}
1
+ {"name":"std-zone-card","version":"1.0.0","description":"Headless zone-guidance mechanic for side-view boards: tracks which band of the world the player is in and holds up that zone's card — name, concept, objective — for a while after every crossing. Listens BODY_MOVED and, when the player's x crosses into a different config zone, stamps the shared entity (zoneId, card, enteredAt) and emits ZONE_CHANGED carrying the card fields; the card self-clears ttlTicks BODY_MOVED ticks later (a per-move tick counter on the entity, so pauses at speed zero still age it out) and boards clear it early via CARD_DISMISS (renamed to a board-scoped progress event) on any mechanic completion. RESTART clears the card and the clock. Renders nothing; boards draw the card from the shared entity (the render authority).","orbitals":[{"name":"ZoneCardOrbital","id":"orb_1YBGF4NVAMXNA5NZNAEBVF2QRR","entity":{"name":"ZoneCardData","id":"ent_VPWXWCR2KG19REHHFSW0Y4ZB97","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"zoneId","type":"string","default":""},{"name":"card","type":"object","properties":{"name":{"name":"name","type":"string","required":true},"concept":{"name":"concept","type":"string","required":false},"objective":{"name":"objective","type":"string","required":false}}},{"name":"enteredAt","type":"number","default":0},{"name":"ticks","type":"number","default":0}],"shared":true},"traits":[{"name":"ZoneCard","id":"trt_DX4CD19EKNQ9TNJV1X89FPM2W6","entityRebindable":true,"entityContract":{"requires":[],"provides":["card","enteredAt","ticks","zoneId"]},"effectRow":[{"kind":"emit","resource":"ZONE_CHANGED"},{"kind":"set","resource":"@entity.card"},{"kind":"set","resource":"@entity.enteredAt"},{"kind":"set","resource":"@entity.ticks"},{"kind":"set","resource":"@entity.zoneId"}],"category":"lifecycle","linkedEntity":"ZoneCardData","linkedEntityId":"ent_VPWXWCR2KG19REHHFSW0Y4ZB97","entityRefIds":{"ZoneCardData":"ent_VPWXWCR2KG19REHHFSW0Y4ZB97"},"emits":[{"event":"ZONE_CHANGED","eventId":"evt_QZQ236W0W70E3RAEW3878YHK75","description":"The player crossed into a different zone; carries the zone's card fields (name, concept, objective) so boards can swap banners/guides and hold the card up. Fires once per crossing.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"name","type":"string","required":true},{"name":"concept","type":"string"},{"name":"objective","type":"string"}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_F3V26CA1940MJ1K4F5X72T9N83","name":"Initialize"},{"key":"BODY_MOVED","id":"evt_25G04EXXXQYYVPZA12BTZK00HQ","name":"Body Moved","payloadSchema":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"vx","type":"number","required":true},{"name":"vy","type":"number","required":true},{"name":"grounded","type":"boolean","required":true},{"name":"skating","type":"boolean","required":true},{"name":"speed","type":"number","required":true}],"listened":true},{"key":"CARD_DISMISS","id":"evt_F5FZ9S2EE5772X2YTA5NNN1BZA","name":"Card Dismiss","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"RESTART","id":"evt_YJJDY04EGP78B9V9PDTK4Q51YJ","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"ZONE_CHANGED","id":"evt_QZQ236W0W70E3RAEW3878YHK75","name":"Zone Changed","description":"The player crossed into a different zone; carries the zone's card fields (name, concept, objective) so boards can swap banners/guides and hold the card up. Fires once per crossing.","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"name","type":"string","required":true},{"name":"concept","type":"string"},{"name":"objective","type":"string"}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_F3V26CA1940MJ1K4F5X72T9N83","effects":[["set","@entity.zoneId",""],["set","@entity.card",null],["set","@entity.enteredAt",0],["set","@entity.ticks",0]]},{"from":"active","to":"active","event":"BODY_MOVED","eventId":"evt_25G04EXXXQYYVPZA12BTZK00HQ","guard":"@config.running","effects":[["set","@entity.ticks",["+","@entity.ticks",1]],["let",[["zmatch",["array/filter","@config.zones",["fn","z",["and",[">=","@payload.x",["object/get","@z","x0"]],["<","@payload.x",["object/get","@z","x1"]]]]]]],["do",["if",["and",[">",["array/len","@zmatch"],0],["!=","@entity.zoneId",["object/get",["array/first","@zmatch"],"id"]]],["do",["set","@entity.zoneId",["object/get",["array/first","@zmatch"],"id"]],["set","@entity.card",{"name":["object/get",["array/first","@zmatch"],"name"],"concept":["object/get",["array/first","@zmatch"],"concept"],"objective":["object/get",["array/first","@zmatch"],"objective"]}],["set","@entity.enteredAt","@entity.ticks"],["emit","ZONE_CHANGED",{"id":["object/get",["array/first","@zmatch"],"id"],"name":["object/get",["array/first","@zmatch"],"name"],"concept":["object/get",["array/first","@zmatch"],"concept"],"objective":["object/get",["array/first","@zmatch"],"objective"]}]],null],["if",["and",["!=","@entity.card",null],[">",["-","@entity.ticks","@entity.enteredAt"],"@config.ttlTicks"]],["set","@entity.card",null],null]]]]},{"from":"active","to":"active","event":"CARD_DISMISS","eventId":"evt_F5FZ9S2EE5772X2YTA5NNN1BZA","effects":[["set","@entity.card",null]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_YJJDY04EGP78B9V9PDTK4Q51YJ","effects":[["set","@entity.zoneId",""],["set","@entity.card",null],["set","@entity.enteredAt",0],["set","@entity.ticks",0]]}]},"config":{"running":{"type":"boolean","default":true,"label":"Running","description":"When true, BODY_MOVED tracks the current zone and ages the card; toggle to freeze the card as-is.","tier":"domain"},"ttlTicks":{"type":"number","default":120,"label":"TTL Ticks","description":"BODY_MOVED ticks the card stays up after a zone crossing (≈ 4s at 30 moves/s) before it clears itself.","tier":"domain"},"zones":{"type":"[ZoneCardZone]","default":[],"label":"Zones","description":"One row per world band: id, display name, the one-line concept, the zone's objective text, and the x-range (x0..x1) the band covers.","tier":"domain","items":{"type":"object","properties":{"x1":{"name":"x1","type":"number","required":true},"id":{"name":"id","type":"string","required":true},"name":{"name":"name","type":"string","required":true},"objective":{"name":"objective","type":"string","required":false},"x0":{"name":"x0","type":"number","required":true},"concept":{"name":"concept","type":"string","required":false}}}}},"scope":"instance"}],"pages":[{"name":"ZoneCardPage","id":"pag_2GD5EPJ9KJ4SS4C1Y6N4F5R2VQ","path":"/zone-card","traits":[{"ref":"ZoneCard","refId":"trt_DX4CD19EKNQ9TNJV1X89FPM2W6"}]}],"types":{"ZoneCard":[{"name":"name","type":"string","required":true},{"name":"concept","type":"string"},{"name":"objective","type":"string"}],"ZoneCardZone":[{"name":"id","type":"string","required":true},{"name":"name","type":"string","required":true},{"name":"concept","type":"string"},{"name":"objective","type":"string"},{"name":"x0","type":"number","required":true},{"name":"x1","type":"number","required":true}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_VPWXWCR2KG19REHHFSW0Y4ZB97":{"id":"ent_VPWXWCR2KG19REHHFSW0Y4ZB97","kind":"entity","bakedName":"ZoneCardData","curName":"ZoneCardData","renames":[],"owner":"workspace"},"evt_25G04EXXXQYYVPZA12BTZK00HQ":{"id":"evt_25G04EXXXQYYVPZA12BTZK00HQ","kind":"event","bakedName":"BODY_MOVED","curName":"BODY_MOVED","renames":[],"owner":"workspace","parent":"trt_DX4CD19EKNQ9TNJV1X89FPM2W6"},"evt_F3V26CA1940MJ1K4F5X72T9N83":{"id":"evt_F3V26CA1940MJ1K4F5X72T9N83","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_DX4CD19EKNQ9TNJV1X89FPM2W6"},"evt_F5FZ9S2EE5772X2YTA5NNN1BZA":{"id":"evt_F5FZ9S2EE5772X2YTA5NNN1BZA","kind":"event","bakedName":"CARD_DISMISS","curName":"CARD_DISMISS","renames":[],"owner":"workspace","parent":"trt_DX4CD19EKNQ9TNJV1X89FPM2W6"},"evt_QZQ236W0W70E3RAEW3878YHK75":{"id":"evt_QZQ236W0W70E3RAEW3878YHK75","kind":"event","bakedName":"ZONE_CHANGED","curName":"ZONE_CHANGED","renames":[],"owner":"workspace","parent":"trt_DX4CD19EKNQ9TNJV1X89FPM2W6"},"evt_YJJDY04EGP78B9V9PDTK4Q51YJ":{"id":"evt_YJJDY04EGP78B9V9PDTK4Q51YJ","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_DX4CD19EKNQ9TNJV1X89FPM2W6"},"orb_1YBGF4NVAMXNA5NZNAEBVF2QRR":{"id":"orb_1YBGF4NVAMXNA5NZNAEBVF2QRR","kind":"orbital","bakedName":"ZoneCardOrbital","curName":"ZoneCardOrbital","renames":[],"owner":"workspace"},"pag_2GD5EPJ9KJ4SS4C1Y6N4F5R2VQ":{"id":"pag_2GD5EPJ9KJ4SS4C1Y6N4F5R2VQ","kind":"page","bakedName":"ZoneCardPage","curName":"ZoneCardPage","renames":[],"owner":"workspace"},"trt_DX4CD19EKNQ9TNJV1X89FPM2W6":{"id":"trt_DX4CD19EKNQ9TNJV1X89FPM2W6","kind":"trait","bakedName":"ZoneCard","curName":"ZoneCard","renames":[],"owner":"workspace"}}}}
@@ -1 +1 @@
1
- {"name":"ui-action-palette","version":"1.0.0","description":"ActionPalette — UI factory (1:1 with the @almadar/ui action-palette pattern).","orbitals":[{"name":"ActionPaletteOrbital","id":"orb_GBSCY7ZGHNR8TQQBWEBJ9XMKKT","entity":{"name":"ActionPaletteItem","id":"ent_ZEZPXAZBNMNTTDK57J5X77ABVM","persistence":"runtime","fields":[{"name":"id","type":"string","required":true}]},"traits":[{"name":"ActionPaletteRender","id":"trt_BDFJRHJYNVFAXK1H6G6A5VAP01","entityRebindable":true,"entityContract":{"requires":[],"provides":[]},"effectRow":[{"kind":"render-ui","resource":"main"}],"category":"interaction","linkedEntity":"ActionPaletteItem","linkedEntityId":"ent_ZEZPXAZBNMNTTDK57J5X77ABVM","entityRefIds":{"ActionPaletteItem":"ent_ZEZPXAZBNMNTTDK57J5X77ABVM"},"stateMachine":{"states":[{"name":"idle","isInitial":true}],"events":[{"key":"INIT","id":"evt_76WZC19YF0Z7G9XSHJRJB3FFKS","name":"Initialize"}],"transitions":[{"from":"idle","to":"idle","event":"INIT","eventId":"evt_76WZC19YF0Z7G9XSHJRJB3FFKS","effects":[["render-ui","main",{"actions":"@config.actions","usedActionIds":"@config.usedActionIds","allowDuplicates":"@config.allowDuplicates","categoryColors":"@config.categoryColors","size":"@config.size","label":"@config.label","className":"@config.className","enter":"@config.enter","enterDelay":"@config.enterDelay","skeleton":"@config.skeleton","aria-label":"@config.ariaLabel","aria-labelledby":"@config.ariaLabelledby","aria-describedby":"@config.ariaDescribedby","aria-live":"@config.ariaLive","aria-current":"@config.ariaCurrent","aria-pressed":"@config.ariaPressed","aria-expanded":"@config.ariaExpanded","aria-selected":"@config.ariaSelected","aria-hidden":"@config.ariaHidden","aria-busy":"@config.ariaBusy","role":"@config.role","lang":"@config.lang","dir":"@config.dir","tabIndex":"@config.tabIndex","type":"action-palette"}]]}]},"config":{"ariaLabelledby":{"type":"string","label":"Aria-labelledby","description":"Id of the element whose text names this one.","synonyms":"aria-labelledby","tier":"presentation"},"label":{"type":"string","label":"Label","description":"Label above the palette","tier":"presentation"},"size":{"type":"string","default":"md","label":"Size","description":"Size variant","tier":"presentation","values":["sm","md","lg"]},"ariaLabel":{"type":"string","label":"Aria-label","description":"Accessible name read by screen readers when the visible text is missing or not descriptive (e.g. an icon-only control).","synonyms":"aria-label","tier":"presentation"},"role":{"type":"string","label":"Role","description":"WAI-ARIA role when the element's native semantics don't describe it.","tier":"presentation","values":["alert","alertdialog","application","article","banner","blockquote","button","caption","cell","checkbox","code","columnheader","combobox","complementary","contentinfo","definition","deletion","dialog","document","emphasis","feed","figure","form","generic","grid","gridcell","group","heading","img","insertion","link","list","listbox","listitem","log","main","marquee","math","menu","menubar","menuitem","menuitemcheckbox","menuitemradio","meter","navigation","none","note","option","paragraph","presentation","progressbar","radio","radiogroup","region","row","rowgroup","rowheader","scrollbar","search","searchbox","separator","slider","spinbutton","status","strong","subscript","superscript","switch","tab","table","tablist","tabpanel","term","textbox","time","timer","toolbar","tooltip","tree","treegrid","treeitem"]},"enter":{"type":"string","label":"Enter","description":"How this element animates in when it mounts (theme-styled); overrides the theme's default slot entry. `none` opts out.","tier":"presentation","values":["none","fade","rise","scale","slide"]},"allowDuplicates":{"type":"boolean","default":true,"label":"Allow Duplicates","description":"Whether each action can be used multiple times","tier":"presentation"},"lang":{"type":"string","label":"Lang","description":"Language of this element's content (BCP 47, e.g. ar, sl, en).","tier":"presentation"},"className":{"type":"string","label":"Class Name","description":"Additional CSS classes","tier":"presentation"},"ariaExpanded":{"type":"boolean","label":"Aria-expanded","description":"Whether the element it controls is expanded.","synonyms":"aria-expanded","tier":"presentation"},"ariaPressed":{"type":"string","label":"Aria-pressed","description":"Toggle-button state.","synonyms":"aria-pressed","tier":"presentation","values":["true","false","mixed"]},"categoryColors":{"type":"Map<string,ActionPaletteCategoryColorsValue>","default":{},"label":"Category Colors","description":"Category → color mapping","tier":"presentation","items":{"type":"object","properties":{"border":{"name":"border","type":"string","required":true},"bg":{"name":"bg","type":"string","required":true}}}},"ariaSelected":{"type":"boolean","label":"Aria-selected","description":"Whether this item is selected (tabs, options, grid cells).","synonyms":"aria-selected","tier":"presentation"},"ariaBusy":{"type":"boolean","label":"Aria-busy","description":"This region is updating; assistive technology waits before announcing it.","synonyms":"aria-busy","tier":"presentation"},"ariaCurrent":{"type":"string","label":"Aria-current","description":"Marks the current item in a set: the current page, step, location, date or time.","synonyms":"aria-current","tier":"presentation","values":["page","step","location","date","time","true","false"]},"actions":{"type":"[ActionPaletteActionsItem]","default":[{"id":"Id","name":"Name","category":"Category","description":"Description","iconEmoji":"Icon Emoji","iconUrl":{"url":"https://almadar-kflow-assets.web.app/shared/ui-battle-board/default/ui/star.png","role":"ui","category":"iconUrl","animations":["static"],"style":"pixel","dimension":"2d","aspect":"1:1","name":"iconUrl","thumbnailUrl":""},"stateMachine":{"name":"Name","states":["Item","Item 2"],"currentState":"Current State","transitions":[{"from":"From","to":"To","event":"Event","guardHint":"Guard Hint"},{"from":"From 2","to":"To 2","event":"Event 2","guardHint":"Guard Hint 2"}],"description":"Description"}},{"id":"Id 2","name":"Name 2","category":"Category 2","description":"Description 2","iconEmoji":"Icon Emoji 2","iconUrl":{"url":"https://almadar-kflow-assets.web.app/shared/ui-battle-board/default/ui/star.png","role":"ui","category":"iconUrl","animations":["static"],"style":"pixel","dimension":"2d","aspect":"1:1","name":"iconUrl","thumbnailUrl":""},"stateMachine":{"name":"Name 2","states":["Item","Item 2"],"currentState":"Current State 2","transitions":[{"from":"From","to":"To","event":"Event","guardHint":"Guard Hint"},{"from":"From 2","to":"To 2","event":"Event 2","guardHint":"Guard Hint 2"}],"description":"Description 2"}}],"label":"Actions","description":"Available actions","tier":"presentation","items":{"type":"object","properties":{"stateMachine":{"name":"stateMachine","type":"object","required":false,"properties":{"currentState":{"name":"currentState","type":"string","required":true},"transitions":{"name":"transitions","type":"array","required":true,"items":{"type":"object","properties":{"to":{"name":"to","type":"string","required":true},"guardHint":{"name":"guardHint","type":"string","required":false},"event":{"name":"event","type":"string","required":true},"from":{"name":"from","type":"string","required":true}}}},"name":{"name":"name","type":"string","required":true},"description":{"name":"description","type":"string","required":false},"states":{"name":"states","type":"array","required":true,"items":{"type":"string"}}}},"id":{"name":"id","type":"string","required":true},"iconEmoji":{"name":"iconEmoji","type":"string","required":false},"iconUrl":{"name":"iconUrl","type":"object","required":false,"properties":{"dimension":{"name":"dimension","type":"string","required":false,"values":["2d","3d"]},"sprite":{"name":"sprite","type":"string","required":false},"role":{"name":"role","type":"string","required":true},"category":{"name":"category","type":"string","required":true},"name":{"name":"name","type":"string","required":false},"aspect":{"name":"aspect","type":"string","required":false,"values":["1:1","16:9","5:7","8:1","4:1","5:3","1:2"]},"variant":{"name":"variant","type":"string","required":false},"atlas":{"name":"atlas","type":"string","required":false},"style":{"name":"style","type":"string","required":false,"values":["pixel","vector","hd","1-bit","isometric"]},"url":{"name":"url","type":"string","required":true},"animations":{"name":"animations","type":"array","required":false,"items":{"type":"string"}},"thumbnailUrl":{"name":"thumbnailUrl","type":"string","required":false}}},"category":{"name":"category","type":"string","required":true},"name":{"name":"name","type":"string","required":true},"description":{"name":"description","type":"string","required":false}}}},"usedActionIds":{"type":"[string]","default":[],"label":"Used Action Ids","description":"IDs of actions that are already used (shown as disabled)","tier":"presentation","items":{"type":"string"}},"tabIndex":{"type":"number","label":"Tab Index","description":"0 puts the element in the Tab order; -1 makes it focusable only programmatically.","tier":"presentation"},"ariaDescribedby":{"type":"string","label":"Aria-describedby","description":"Id of the element whose text describes this one (help text, error).","synonyms":"aria-describedby","tier":"presentation"},"dir":{"type":"string","label":"Dir","description":"Text direction of this element's content.","tier":"presentation","values":["ltr","rtl","auto"]},"ariaHidden":{"type":"boolean","label":"Aria-hidden","description":"Hide from assistive technology (decorative content only).","synonyms":"aria-hidden","tier":"presentation"},"ariaLive":{"type":"string","label":"Aria-live","description":"Announce changes to this region: polite waits for a pause, assertive interrupts.","synonyms":"aria-live","tier":"presentation","values":["off","polite","assertive"]},"enterDelay":{"type":"number","label":"Enter Delay","description":"Stagger step for the entry: waits this many `--motion-enter-stagger` steps before animating.","tier":"presentation"},"skeleton":{"type":"string","label":"Skeleton","description":"Skeleton shown while this element's server render is in flight: a shape (`table`, `list`, …), `{ variant, rows?, columns?, fields? }`, or `none`.","tier":"presentation","values":["header","table","list","grid","detail","stats","form","card","text","none"]}},"scope":"instance"}],"pages":[{"name":"ActionPalettePage","id":"pag_5YVSR1T7NN3TTM3Y8VPB0HPT58","path":"/action-palette","traits":[{"ref":"ActionPaletteRender","refId":"trt_BDFJRHJYNVFAXK1H6G6A5VAP01"}]}],"types":{"ActionPaletteActionsItem":[{"name":"id","type":"string","required":true},{"name":"name","type":"string","required":true},{"name":"category","type":"string","required":true},{"name":"description","type":"string"},{"name":"iconEmoji","type":"string"},{"name":"iconUrl","type":"object","properties":[{"name":"url","type":"asset","required":true},{"name":"role","type":"string","required":true},{"name":"category","type":"string","required":true},{"name":"animations","type":"[string]"},{"name":"style","type":"string","values":["pixel","vector","hd","1-bit","isometric"]},{"name":"variant","type":"string"},{"name":"dimension","type":"string","values":["2d","3d"]},{"name":"aspect","type":"string","values":["1:1","16:9","5:7","8:1","4:1","5:3","1:2"]},{"name":"atlas","type":"asset"},{"name":"sprite","type":"string"},{"name":"name","type":"string"},{"name":"thumbnailUrl","type":"string"}]},{"name":"stateMachine","type":"object","properties":[{"name":"name","type":"string","required":true},{"name":"states","type":"[string]","required":true},{"name":"currentState","type":"string","required":true},{"name":"transitions","type":"[object]","required":true,"properties":[{"name":"from","type":"string","required":true},{"name":"to","type":"string","required":true},{"name":"event","type":"string","required":true},{"name":"guardHint","type":"string"}]},{"name":"description","type":"string"}]}],"ActionPaletteActionsItemIconUrl":[{"name":"url","type":"asset","required":true},{"name":"role","type":"string","required":true},{"name":"category","type":"string","required":true},{"name":"animations","type":"[string]"},{"name":"style","type":"string","values":["pixel","vector","hd","1-bit","isometric"]},{"name":"variant","type":"string"},{"name":"dimension","type":"string","values":["2d","3d"]},{"name":"aspect","type":"string","values":["1:1","16:9","5:7","8:1","4:1","5:3","1:2"]},{"name":"atlas","type":"asset"},{"name":"sprite","type":"string"},{"name":"name","type":"string"},{"name":"thumbnailUrl","type":"string"}],"ActionPaletteActionsItemStateMachine":[{"name":"name","type":"string","required":true},{"name":"states","type":"[string]","required":true},{"name":"currentState","type":"string","required":true},{"name":"transitions","type":"[object]","required":true,"properties":[{"name":"from","type":"string","required":true},{"name":"to","type":"string","required":true},{"name":"event","type":"string","required":true},{"name":"guardHint","type":"string"}]},{"name":"description","type":"string"}],"ActionPaletteActionsItemStateMachineTransitionsItem":[{"name":"from","type":"string","required":true},{"name":"to","type":"string","required":true},{"name":"event","type":"string","required":true},{"name":"guardHint","type":"string"}],"ActionPaletteCategoryColorsValue":[{"name":"bg","type":"string","required":true},{"name":"border","type":"string","required":true}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_ZEZPXAZBNMNTTDK57J5X77ABVM":{"id":"ent_ZEZPXAZBNMNTTDK57J5X77ABVM","kind":"entity","bakedName":"ActionPaletteItem","curName":"ActionPaletteItem","renames":[],"owner":"workspace"},"evt_76WZC19YF0Z7G9XSHJRJB3FFKS":{"id":"evt_76WZC19YF0Z7G9XSHJRJB3FFKS","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_BDFJRHJYNVFAXK1H6G6A5VAP01"},"orb_GBSCY7ZGHNR8TQQBWEBJ9XMKKT":{"id":"orb_GBSCY7ZGHNR8TQQBWEBJ9XMKKT","kind":"orbital","bakedName":"ActionPaletteOrbital","curName":"ActionPaletteOrbital","renames":[],"owner":"workspace"},"pag_5YVSR1T7NN3TTM3Y8VPB0HPT58":{"id":"pag_5YVSR1T7NN3TTM3Y8VPB0HPT58","kind":"page","bakedName":"ActionPalettePage","curName":"ActionPalettePage","renames":[],"owner":"workspace"},"trt_BDFJRHJYNVFAXK1H6G6A5VAP01":{"id":"trt_BDFJRHJYNVFAXK1H6G6A5VAP01","kind":"trait","bakedName":"ActionPaletteRender","curName":"ActionPaletteRender","renames":[],"owner":"workspace"}}}}
1
+ {"name":"ui-action-palette","version":"1.0.0","description":"ActionPalette — UI factory (1:1 with the @almadar/ui action-palette pattern).","orbitals":[{"name":"ActionPaletteOrbital","id":"orb_GBSCY7ZGHNR8TQQBWEBJ9XMKKT","entity":{"name":"ActionPaletteItem","id":"ent_ZEZPXAZBNMNTTDK57J5X77ABVM","persistence":"runtime","fields":[{"name":"id","type":"string","required":true}]},"traits":[{"name":"ActionPaletteRender","id":"trt_BDFJRHJYNVFAXK1H6G6A5VAP01","entityRebindable":true,"entityContract":{"requires":[],"provides":[]},"effectRow":[{"kind":"render-ui","resource":"main"}],"category":"interaction","linkedEntity":"ActionPaletteItem","linkedEntityId":"ent_ZEZPXAZBNMNTTDK57J5X77ABVM","entityRefIds":{"ActionPaletteItem":"ent_ZEZPXAZBNMNTTDK57J5X77ABVM"},"stateMachine":{"states":[{"name":"idle","isInitial":true}],"events":[{"key":"INIT","id":"evt_76WZC19YF0Z7G9XSHJRJB3FFKS","name":"Initialize"}],"transitions":[{"from":"idle","to":"idle","event":"INIT","eventId":"evt_76WZC19YF0Z7G9XSHJRJB3FFKS","effects":[["render-ui","main",{"actions":"@config.actions","usedActionIds":"@config.usedActionIds","allowDuplicates":"@config.allowDuplicates","categoryColors":"@config.categoryColors","size":"@config.size","label":"@config.label","className":"@config.className","enter":"@config.enter","enterDelay":"@config.enterDelay","skeleton":"@config.skeleton","aria-label":"@config.ariaLabel","aria-labelledby":"@config.ariaLabelledby","aria-describedby":"@config.ariaDescribedby","aria-live":"@config.ariaLive","aria-current":"@config.ariaCurrent","aria-pressed":"@config.ariaPressed","aria-expanded":"@config.ariaExpanded","aria-selected":"@config.ariaSelected","aria-hidden":"@config.ariaHidden","aria-busy":"@config.ariaBusy","role":"@config.role","lang":"@config.lang","dir":"@config.dir","tabIndex":"@config.tabIndex","type":"action-palette"}]]}]},"config":{"ariaLabel":{"type":"string","label":"Aria-label","description":"Accessible name read by screen readers when the visible text is missing or not descriptive (e.g. an icon-only control).","synonyms":"aria-label","tier":"presentation"},"ariaExpanded":{"type":"boolean","label":"Aria-expanded","description":"Whether the element it controls is expanded.","synonyms":"aria-expanded","tier":"presentation"},"allowDuplicates":{"type":"boolean","default":true,"label":"Allow Duplicates","description":"Whether each action can be used multiple times","tier":"presentation"},"actions":{"type":"[ActionPaletteActionsItem]","default":[{"id":"Id","name":"Name","category":"Category","description":"Description","iconEmoji":"Icon Emoji","iconUrl":{"url":"https://almadar-kflow-assets.web.app/shared/ui-battle-board/default/ui/star.png","role":"ui","category":"iconUrl","animations":["static"],"style":"pixel","dimension":"2d","aspect":"1:1","name":"iconUrl","thumbnailUrl":""},"stateMachine":{"name":"Name","states":["Item","Item 2"],"currentState":"Current State","transitions":[{"from":"From","to":"To","event":"Event","guardHint":"Guard Hint"},{"from":"From 2","to":"To 2","event":"Event 2","guardHint":"Guard Hint 2"}],"description":"Description"}},{"id":"Id 2","name":"Name 2","category":"Category 2","description":"Description 2","iconEmoji":"Icon Emoji 2","iconUrl":{"url":"https://almadar-kflow-assets.web.app/shared/ui-battle-board/default/ui/star.png","role":"ui","category":"iconUrl","animations":["static"],"style":"pixel","dimension":"2d","aspect":"1:1","name":"iconUrl","thumbnailUrl":""},"stateMachine":{"name":"Name 2","states":["Item","Item 2"],"currentState":"Current State 2","transitions":[{"from":"From","to":"To","event":"Event","guardHint":"Guard Hint"},{"from":"From 2","to":"To 2","event":"Event 2","guardHint":"Guard Hint 2"}],"description":"Description 2"}}],"label":"Actions","description":"Available actions","tier":"presentation","items":{"type":"object","properties":{"description":{"name":"description","type":"string","required":false},"iconUrl":{"name":"iconUrl","type":"object","required":false,"properties":{"atlas":{"name":"atlas","type":"string","required":false},"sprite":{"name":"sprite","type":"string","required":false},"style":{"name":"style","type":"string","required":false,"values":["pixel","vector","hd","1-bit","isometric"]},"name":{"name":"name","type":"string","required":false},"animations":{"name":"animations","type":"array","required":false,"items":{"type":"string"}},"variant":{"name":"variant","type":"string","required":false},"category":{"name":"category","type":"string","required":true},"dimension":{"name":"dimension","type":"string","required":false,"values":["2d","3d"]},"thumbnailUrl":{"name":"thumbnailUrl","type":"string","required":false},"role":{"name":"role","type":"string","required":true},"aspect":{"name":"aspect","type":"string","required":false,"values":["1:1","16:9","5:7","8:1","4:1","5:3","1:2"]},"url":{"name":"url","type":"string","required":true}}},"category":{"name":"category","type":"string","required":true},"stateMachine":{"name":"stateMachine","type":"object","required":false,"properties":{"description":{"name":"description","type":"string","required":false},"currentState":{"name":"currentState","type":"string","required":true},"transitions":{"name":"transitions","type":"array","required":true,"items":{"type":"object","properties":{"from":{"name":"from","type":"string","required":true},"guardHint":{"name":"guardHint","type":"string","required":false},"to":{"name":"to","type":"string","required":true},"event":{"name":"event","type":"string","required":true}}}},"states":{"name":"states","type":"array","required":true,"items":{"type":"string"}},"name":{"name":"name","type":"string","required":true}}},"id":{"name":"id","type":"string","required":true},"iconEmoji":{"name":"iconEmoji","type":"string","required":false},"name":{"name":"name","type":"string","required":true}}}},"label":{"type":"string","label":"Label","description":"Label above the palette","tier":"presentation"},"ariaDescribedby":{"type":"string","label":"Aria-describedby","description":"Id of the element whose text describes this one (help text, error).","synonyms":"aria-describedby","tier":"presentation"},"ariaLive":{"type":"string","label":"Aria-live","description":"Announce changes to this region: polite waits for a pause, assertive interrupts.","synonyms":"aria-live","tier":"presentation","values":["off","polite","assertive"]},"tabIndex":{"type":"number","label":"Tab Index","description":"0 puts the element in the Tab order; -1 makes it focusable only programmatically.","tier":"presentation"},"dir":{"type":"string","label":"Dir","description":"Text direction of this element's content.","tier":"presentation","values":["ltr","rtl","auto"]},"categoryColors":{"type":"Map<string,ActionPaletteCategoryColorsValue>","default":{},"label":"Category Colors","description":"Category → color mapping","tier":"presentation","items":{"type":"object","properties":{"bg":{"name":"bg","type":"string","required":true},"border":{"name":"border","type":"string","required":true}}}},"ariaBusy":{"type":"boolean","label":"Aria-busy","description":"This region is updating; assistive technology waits before announcing it.","synonyms":"aria-busy","tier":"presentation"},"usedActionIds":{"type":"[string]","default":[],"label":"Used Action Ids","description":"IDs of actions that are already used (shown as disabled)","tier":"presentation","items":{"type":"string"}},"size":{"type":"string","default":"md","label":"Size","description":"Size variant","tier":"presentation","values":["sm","md","lg"]},"ariaHidden":{"type":"boolean","label":"Aria-hidden","description":"Hide from assistive technology (decorative content only).","synonyms":"aria-hidden","tier":"presentation"},"enterDelay":{"type":"number","label":"Enter Delay","description":"Stagger step for the entry: waits this many `--motion-enter-stagger` steps before animating.","tier":"presentation"},"ariaCurrent":{"type":"string","label":"Aria-current","description":"Marks the current item in a set: the current page, step, location, date or time.","synonyms":"aria-current","tier":"presentation","values":["page","step","location","date","time","true","false"]},"ariaSelected":{"type":"boolean","label":"Aria-selected","description":"Whether this item is selected (tabs, options, grid cells).","synonyms":"aria-selected","tier":"presentation"},"ariaLabelledby":{"type":"string","label":"Aria-labelledby","description":"Id of the element whose text names this one.","synonyms":"aria-labelledby","tier":"presentation"},"className":{"type":"string","label":"Class Name","description":"Additional CSS classes","tier":"presentation"},"role":{"type":"string","label":"Role","description":"WAI-ARIA role when the element's native semantics don't describe it.","tier":"presentation","values":["alert","alertdialog","application","article","banner","blockquote","button","caption","cell","checkbox","code","columnheader","combobox","complementary","contentinfo","definition","deletion","dialog","document","emphasis","feed","figure","form","generic","grid","gridcell","group","heading","img","insertion","link","list","listbox","listitem","log","main","marquee","math","menu","menubar","menuitem","menuitemcheckbox","menuitemradio","meter","navigation","none","note","option","paragraph","presentation","progressbar","radio","radiogroup","region","row","rowgroup","rowheader","scrollbar","search","searchbox","separator","slider","spinbutton","status","strong","subscript","superscript","switch","tab","table","tablist","tabpanel","term","textbox","time","timer","toolbar","tooltip","tree","treegrid","treeitem"]},"lang":{"type":"string","label":"Lang","description":"Language of this element's content (BCP 47, e.g. ar, sl, en).","tier":"presentation"},"ariaPressed":{"type":"string","label":"Aria-pressed","description":"Toggle-button state.","synonyms":"aria-pressed","tier":"presentation","values":["true","false","mixed"]},"skeleton":{"type":"string","label":"Skeleton","description":"Skeleton shown while this element's server render is in flight: a shape (`table`, `list`, …), `{ variant, rows?, columns?, fields? }`, or `none`.","tier":"presentation","values":["header","table","list","grid","detail","stats","form","card","text","none"]},"enter":{"type":"string","label":"Enter","description":"How this element animates in when it mounts (theme-styled); overrides the theme's default slot entry. `none` opts out.","tier":"presentation","values":["none","fade","rise","scale","slide"]}},"scope":"instance"}],"pages":[{"name":"ActionPalettePage","id":"pag_5YVSR1T7NN3TTM3Y8VPB0HPT58","path":"/action-palette","traits":[{"ref":"ActionPaletteRender","refId":"trt_BDFJRHJYNVFAXK1H6G6A5VAP01"}]}],"types":{"ActionPaletteActionsItem":[{"name":"id","type":"string","required":true},{"name":"name","type":"string","required":true},{"name":"category","type":"string","required":true},{"name":"description","type":"string"},{"name":"iconEmoji","type":"string"},{"name":"iconUrl","type":"object","properties":[{"name":"url","type":"asset","required":true},{"name":"role","type":"string","required":true},{"name":"category","type":"string","required":true},{"name":"animations","type":"[string]"},{"name":"style","type":"string","values":["pixel","vector","hd","1-bit","isometric"]},{"name":"variant","type":"string"},{"name":"dimension","type":"string","values":["2d","3d"]},{"name":"aspect","type":"string","values":["1:1","16:9","5:7","8:1","4:1","5:3","1:2"]},{"name":"atlas","type":"asset"},{"name":"sprite","type":"string"},{"name":"name","type":"string"},{"name":"thumbnailUrl","type":"string"}]},{"name":"stateMachine","type":"object","properties":[{"name":"name","type":"string","required":true},{"name":"states","type":"[string]","required":true},{"name":"currentState","type":"string","required":true},{"name":"transitions","type":"[object]","required":true,"properties":[{"name":"from","type":"string","required":true},{"name":"to","type":"string","required":true},{"name":"event","type":"string","required":true},{"name":"guardHint","type":"string"}]},{"name":"description","type":"string"}]}],"ActionPaletteActionsItemIconUrl":[{"name":"url","type":"asset","required":true},{"name":"role","type":"string","required":true},{"name":"category","type":"string","required":true},{"name":"animations","type":"[string]"},{"name":"style","type":"string","values":["pixel","vector","hd","1-bit","isometric"]},{"name":"variant","type":"string"},{"name":"dimension","type":"string","values":["2d","3d"]},{"name":"aspect","type":"string","values":["1:1","16:9","5:7","8:1","4:1","5:3","1:2"]},{"name":"atlas","type":"asset"},{"name":"sprite","type":"string"},{"name":"name","type":"string"},{"name":"thumbnailUrl","type":"string"}],"ActionPaletteActionsItemStateMachine":[{"name":"name","type":"string","required":true},{"name":"states","type":"[string]","required":true},{"name":"currentState","type":"string","required":true},{"name":"transitions","type":"[object]","required":true,"properties":[{"name":"from","type":"string","required":true},{"name":"to","type":"string","required":true},{"name":"event","type":"string","required":true},{"name":"guardHint","type":"string"}]},{"name":"description","type":"string"}],"ActionPaletteActionsItemStateMachineTransitionsItem":[{"name":"from","type":"string","required":true},{"name":"to","type":"string","required":true},{"name":"event","type":"string","required":true},{"name":"guardHint","type":"string"}],"ActionPaletteCategoryColorsValue":[{"name":"bg","type":"string","required":true},{"name":"border","type":"string","required":true}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_ZEZPXAZBNMNTTDK57J5X77ABVM":{"id":"ent_ZEZPXAZBNMNTTDK57J5X77ABVM","kind":"entity","bakedName":"ActionPaletteItem","curName":"ActionPaletteItem","renames":[],"owner":"workspace"},"evt_76WZC19YF0Z7G9XSHJRJB3FFKS":{"id":"evt_76WZC19YF0Z7G9XSHJRJB3FFKS","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_BDFJRHJYNVFAXK1H6G6A5VAP01"},"orb_GBSCY7ZGHNR8TQQBWEBJ9XMKKT":{"id":"orb_GBSCY7ZGHNR8TQQBWEBJ9XMKKT","kind":"orbital","bakedName":"ActionPaletteOrbital","curName":"ActionPaletteOrbital","renames":[],"owner":"workspace"},"pag_5YVSR1T7NN3TTM3Y8VPB0HPT58":{"id":"pag_5YVSR1T7NN3TTM3Y8VPB0HPT58","kind":"page","bakedName":"ActionPalettePage","curName":"ActionPalettePage","renames":[],"owner":"workspace"},"trt_BDFJRHJYNVFAXK1H6G6A5VAP01":{"id":"trt_BDFJRHJYNVFAXK1H6G6A5VAP01","kind":"trait","bakedName":"ActionPaletteRender","curName":"ActionPaletteRender","renames":[],"owner":"workspace"}}}}